1、课件添加 题目手动输入功能

2、视频与 附件 不能同时存在判断
3、课件明细 添加 ignore 字段传入后台
4、Getshow 方法修改显示 (配置也有修改)
This commit is contained in:
wyw 2026-03-26 11:30:06 +08:00
parent 5c7d2a5a0b
commit 52583d19b9
4 changed files with 246 additions and 19 deletions

View File

@ -10834,6 +10834,15 @@ builder.Property(t => t.FILENAME).HasMaxLength(200);
base.Configure(builder);
builder.HasOne(t => t.Nav_Cour).WithMany(t=>t.Nav_Detail).HasForeignKey(t => t.EDU_CARD_ID).OnDelete(DeleteBehavior.Restrict);
builder.HasOne(t => t.Nav_Test).WithMany().HasForeignKey(t => t.TEST_ID).OnDelete(DeleteBehavior.Restrict);
builder.Ignore(t => t.NAME);
builder.Ignore(t => t.TYPE);
builder.Ignore(t => t.OPTION_A);
builder.Ignore(t => t.OPTION_B);
builder.Ignore(t => t.OPTION_C);
builder.Ignore(t => t.OPTION_D);
builder.Ignore(t => t.OPTION_E);
builder.Ignore(t => t.ANSWER);
builder.Ignore(t => t.ANSWERSHOW);
}
}
#endregion

View File

@ -57,5 +57,79 @@ namespace APT.MS.Domain.Entities.SE
/// </summary>
[Description("试题")]
public T_SE_TEST Nav_Test { get; set; }
/// <summary>
/// 题目
/// </summary>
[Description("题目")]
[DataFieldIngore]
public string NAME { get; set; }
/// <summary>
/// 题型
/// </summary>
[Description("题型")]
[DataFieldIngore]
public SETestTypeEnum TYPE { get; set; }
/// <summary>
/// 选项A
/// </summary>
[Description("选项A")]
[DataFieldIngore]
public string OPTION_A { get; set; }
/// <summary>
/// 选项B
/// </summary>
[Description("选项B")]
[DataFieldIngore]
public string OPTION_B { get; set; }
/// <summary>
/// 选项C
/// </summary>
[Description("选项C")]
[DataFieldIngore]
public string OPTION_C { get; set; }
/// <summary>
/// 选项D
/// </summary>
[Description("选项D")]
[DataFieldIngore]
public string OPTION_D { get; set; }
/// <summary>
/// 选项E
/// </summary>
[Description("选项E")]
[DataFieldIngore]
public string OPTION_E { get; set; }
/// <summary>
/// 答案
/// 是非题 是 1 否 2
/// 单选题 A 1, B 2, C 4, D 8
/// 多选题 单选位或
/// </summary>
[Description("答案")]
[DataFieldIngore]
public int ANSWER { get; set; }
/// <summary>
/// 答案
/// 是非题 是 1 否 2
/// 单选题 A 1, B 2, C 4, D 8
/// 多选题 单选位或
/// </summary>
[Description("答案")]
[DataFieldIngore]
public string ANSWERSHOW { get; set; }
}
}

View File

@ -19,6 +19,69 @@ namespace APT.SE.WebApi.Controllers.Api
public partial class SECoursewearlibraryController : AuthorizeApiController<T_SE_COURSEWEARLIBRARY>
{
/// <summary>
/// 根据str答案 获取 答案 int
/// </summary>
/// <param name="TYPE"></param>
/// <param name="strAnswer"></param>
/// <returns></returns>
private int GetAnswer(SETestTypeEnum TYPE, string strAnswer)
{
int Answer = 0;
switch (TYPE)
{
case SETestTypeEnum.:
case SETestTypeEnum.:
{
switch (strAnswer)
{
case "是":
case "A":
case "a":
Answer = 1;
break;
case "否":
case "B":
case "b":
Answer = 2;
break;
case "C":
case "c":
Answer = 4;
break;
case "D":
case "d":
Answer = 8;
break;
default:
break;
}
}
break;
case SETestTypeEnum.:
if (strAnswer.IndexOf("A") > -1 || strAnswer.IndexOf("a") > -1)
{
Answer += 1;
}
if (strAnswer.IndexOf("B") > -1 || strAnswer.IndexOf("b") > -1)
{
Answer += 2;
}
if (strAnswer.IndexOf("C") > -1 || strAnswer.IndexOf("c") > -1)
{
Answer += 4;
}
if (strAnswer.IndexOf("D") > -1 || strAnswer.IndexOf("d") > -1)
{
Answer += 8;
}
break;
default:
break;
}
return Answer;
}
/// <summary>
/// 更新
@ -36,7 +99,6 @@ namespace APT.SE.WebApi.Controllers.Api
var Detail = entity.Nav_Detail;
entity.Nav_Detail = null;
if (Files != null && Files.Count() > 1)
{
throw new Exception("课件只能单一文件");
@ -54,15 +116,44 @@ namespace APT.SE.WebApi.Controllers.Api
List<T_SE_TEST> listT = new List<T_SE_TEST>();
List<T_SE_TEST_LIST_POST> listTPost = new List<T_SE_TEST_LIST_POST>();
List<T_SE_TEST_LIST_POINT> listTPoint = new List<T_SE_TEST_LIST_POINT>();
List<T_SE_TEST> listAdd = new List<T_SE_TEST>();
if (Detail == null || Detail.Count < 1)
{
throw new Exception("请添加题目!");
}
else
{
#region
foreach (var item in Detail)
{
if (item.IS_DELETED || item.ANSWER != 0)
continue;
item.TEST_ID = Guid.NewGuid();
listAdd.Add(new T_SE_TEST()
{
ID = item.TEST_ID,
ORG_ID = entity.ORG_ID,
ANSWER = GetAnswer(item.TYPE, item.ANSWERSHOW),
NAME = item.NAME,
TYPE = item.TYPE,
OPTION_A = item.OPTION_A,
OPTION_B = item.OPTION_B,
OPTION_C = item.OPTION_C,
OPTION_D = item.OPTION_D,
OPTION_E = item.OPTION_E,
CREATER_ID = APT.Infrastructure.Api.AppContext.CurrentSession.UserID,
CREATE_TIME = DateTime.Now
});
}
#endregion
decimal ScorePer = 0;
decimal sum = Detail.Where(e => !e.IS_DELETED).Sum(e => e.SCOREPER);
if (sum != 100)
var answer0 = Detail.FirstOrDefault(e => !e.IS_DELETED && e.ANSWER == 0);
if (sum != 100 || answer0 != null)
{
int dc = Detail.Where(e => !e.IS_DELETED).Count();
ScorePer = Math.Round(Convert.ToDecimal(100.0 / dc), 2);
@ -127,6 +218,8 @@ namespace APT.SE.WebApi.Controllers.Api
UnifiedCommit(() =>
{
UpdateEntityNoCommit(entity);
if (listAdd != null && listAdd.Any())
BantchSaveEntityNoCommit(listAdd);
if (Detail != null && Detail.Any())
BantchSaveEntityNoCommit(Detail);
if (Files != null && Files.Any())
@ -163,6 +256,16 @@ namespace APT.SE.WebApi.Controllers.Api
ANSWERSHOW = string.Empty;
GetAnswerShow(item.Nav_Test, ref ANSWERSHOW);
item.Nav_Test.ANSWERSHOW = ANSWERSHOW;
item.NAME = item.Nav_Test.NAME;
item.TYPE = item.Nav_Test.TYPE;
item.OPTION_A = item.Nav_Test.OPTION_A;
item.OPTION_B = item.Nav_Test.OPTION_B;
item.OPTION_C = item.Nav_Test.OPTION_C;
item.OPTION_D = item.Nav_Test.OPTION_D;
item.OPTION_E = item.Nav_Test.OPTION_E;
item.ANSWER = item.Nav_Test.ANSWER;
item.ANSWERSHOW = item.Nav_Test.ANSWERSHOW;
}
}
return result;
@ -179,7 +282,7 @@ namespace APT.SE.WebApi.Controllers.Api
try
{
if (Nav_Test != null && Nav_Test.ANSWER != 0 && ((int)Nav_Test.TYPE) != 0)
if (Nav_Test != null && Nav_Test.ANSWER != 0)// && ((int)Nav_Test.TYPE) != 0
{
switch (Nav_Test.ANSWER)
{
@ -192,12 +295,15 @@ namespace APT.SE.WebApi.Controllers.Api
case 2:
ANSWERSHOW = "B";
break;
case 3:
ANSWERSHOW = "AB";
break;
case 4:
ANSWERSHOW = "C";
break;
case 8:
ANSWERSHOW = "D";
break;
case 3:
ANSWERSHOW = "AB";
break;
case 5:
ANSWERSHOW = "AC";
break;
@ -207,9 +313,6 @@ namespace APT.SE.WebApi.Controllers.Api
case 7:
ANSWERSHOW = "ABC";
break;
case 8:
ANSWERSHOW = "D";
break;
case 9:
ANSWERSHOW = "AD";
break;
@ -688,7 +791,17 @@ namespace APT.SE.WebApi.Controllers.Api
NUM = i + 1,
TEST_ID = mainTable.ID,
Nav_Test = mainTable,
CREATE_TIME = mainTable.CREATE_TIME
CREATE_TIME = mainTable.CREATE_TIME,
NAME = mainTable.NAME,
TYPE = mainTable.TYPE,
OPTION_A = mainTable.OPTION_A,
OPTION_B = mainTable.OPTION_B,
OPTION_C = mainTable.OPTION_C,
OPTION_D = mainTable.OPTION_D,
OPTION_E = mainTable.OPTION_E,
ANSWER = mainTable.ANSWER,
ANSWERSHOW = mainTable.ANSWERSHOW,
});
}
}

View File

@ -351,6 +351,14 @@ namespace APT.SE.WebApi.Controllers.Api
List<string> listPointNameEmpty = new List<string>();
DateTime dtNow = DateTime.Now;
//数据库现有题目 去重判断
List<T_SE_TEST> listDataAllCheck = GetEntities<T_SE_TEST>(e => !e.IS_DELETED, null, null).ToList();
T_SE_TEST check = null;
List<string> listRepeatDataIndex = new List<string>();
List<string> listNameTypeError = new List<string>();
List<string> listRepeatExcelIndex = new List<string>();
List<string> listNameTypeEError = new List<string>();
for (int i = 0; i < rowAll; i++)
{
#region
@ -391,15 +399,15 @@ namespace APT.SE.WebApi.Controllers.Api
var testType = dtSource.Rows[i][1].ToString().Trim();
if (!string.IsNullOrEmpty(testType))
{
if (dtSource.Rows[i][1].ToString().Trim() == "是非题")
if (testType == "是非题")
{
mainTable.TYPE = SETestTypeEnum.;
}
else if (dtSource.Rows[i][1].ToString().Trim() == "单选题")
else if (testType == "单选题")
{
mainTable.TYPE = SETestTypeEnum.;
}
else if (dtSource.Rows[i][1].ToString().Trim() == "多选题")
else if (testType == "多选题")
{
mainTable.TYPE = SETestTypeEnum.;
}
@ -412,6 +420,21 @@ namespace APT.SE.WebApi.Controllers.Api
{
throw new Exception("题型不能为空!");
}
check = listDataAllCheck.FirstOrDefault(e => e.NAME == mainTable.NAME && e.TYPE == mainTable.TYPE);
if (check != null)
{
listRepeatDataIndex.Add((i + rowIndex).ToString());
listNameTypeError.Add(mainTable.NAME + "" + testType);
}
check = mainTables.FirstOrDefault(e => e.NAME == mainTable.NAME && e.TYPE == mainTable.TYPE);
if (check != null)
{
listRepeatExcelIndex.Add((i + rowIndex).ToString());
listNameTypeEError.Add(mainTable.NAME + "" + testType);
}
if (!string.IsNullOrEmpty(dtSource.Rows[i][2].ToString().Trim()))
{
mainTable.OPTION_A = (dtSource.Rows[i][2].ToString().Trim());
@ -437,11 +460,11 @@ namespace APT.SE.WebApi.Controllers.Api
{
if (mainTable.TYPE == SETestTypeEnum.)
{
if (strANSWER == "" || strANSWER == "A")
if (strANSWER == "A" || strANSWER == "是" || strANSWER == "a")
{
mainTable.ANSWER = 1;
}
else if (strANSWER == "否" || strANSWER == "B")
else if (strANSWER == "B" || strANSWER == "否" || strANSWER == "b")
{
mainTable.ANSWER = 2;
}
@ -454,8 +477,7 @@ namespace APT.SE.WebApi.Controllers.Api
listAnswerErrorIndex.Add((i + rowIndex).ToString());
}
}
if (mainTable.TYPE == SETestTypeEnum.)
else if (mainTable.TYPE == SETestTypeEnum.)
{
if (strANSWER == "A")
{
@ -482,7 +504,7 @@ namespace APT.SE.WebApi.Controllers.Api
listAnswerErrorIndex.Add((i + rowIndex).ToString());
}
}
if (mainTable.TYPE == SETestTypeEnum.)
else if (mainTable.TYPE == SETestTypeEnum.)
{
int answer = 0;
if (strANSWER.Contains("A"))
@ -598,7 +620,7 @@ namespace APT.SE.WebApi.Controllers.Api
#region
string strEmptyError = string.Empty;
if (listPostNameEmpty.Count > 0 || dicIndexEmpty.Count > 0 || listPointNameEmpty.Count > 0)
if (listPostNameEmpty.Count > 0 || dicIndexEmpty.Count > 0 || listPointNameEmpty.Count > 0 || listRepeatDataIndex.Count > 0 || listRepeatExcelIndex.Count > 0)
{
if (dicIndexEmpty.Count > 0)
{
@ -629,6 +651,15 @@ namespace APT.SE.WebApi.Controllers.Api
{
throw new Exception("答案有误,行:【" + string.Join(",", listAnswerErrorIndex) + "】值:" + string.Join(",", listAnswerError));
}
if (listRepeatDataIndex.Count > 0)
{
throw new Exception("与现有题库重复,行:【" + string.Join(",", listRepeatDataIndex) + "】值:" + string.Join(",", listNameTypeError));
}
if (listRepeatExcelIndex.Count > 0)
{
throw new Exception("Excel中题目重复【" + string.Join(",", listRepeatExcelIndex) + "】值:" + string.Join(",", listNameTypeEError));
}
}
if (strEmptyError != string.Empty)
throw new Exception(strEmptyError);