diff --git a/Tiobon.Core.Api/Tiobon.Core.Model.xml b/Tiobon.Core.Api/Tiobon.Core.Model.xml
index 0bdd0484..fce35185 100644
--- a/Tiobon.Core.Api/Tiobon.Core.Model.xml
+++ b/Tiobon.Core.Api/Tiobon.Core.Model.xml
@@ -39568,6 +39568,26 @@
手动选修
+
+
+ 考试管理-学习完成标准
+
+
+
+
+ 学习完成+考试合格
+
+
+
+
+ 学习完成
+
+
+
+
+ 不学习但考试合格
+
+
培训规则种类
@@ -39643,6 +39663,21 @@
已完成
+
+
+ 培训记录-学习状态
+
+
+
+
+ 已完成
+
+
+
+
+ 未完成
+
+
考试记录-状态
diff --git a/Tiobon.Core.Api/appsettings.json b/Tiobon.Core.Api/appsettings.json
index b81d736c..50980a04 100644
--- a/Tiobon.Core.Api/appsettings.json
+++ b/Tiobon.Core.Api/appsettings.json
@@ -269,7 +269,7 @@
"Enabled": false
},
"QuartzNetJob": {
- "Enabled": false
+ "Enabled": true
},
"Consul": {
"Enabled": false
diff --git a/Tiobon.Core.Common/Helper/ExamHelper.cs b/Tiobon.Core.Common/Helper/ExamHelper.cs
index ddfe5655..dceb4da5 100644
--- a/Tiobon.Core.Common/Helper/ExamHelper.cs
+++ b/Tiobon.Core.Common/Helper/ExamHelper.cs
@@ -91,4 +91,41 @@ public class ExamHelper
record.Score = score ?? 0;
}
+
+ public static async Task MarkCompleteStatusAsync(ISqlSugarClient Db, Ghre_StudyRecord record)
+ {
+ if (record.ExamId != null)
+ {
+ if (await Db.Queryable().Where(x => x.Id == record.ExamId && x.StudyFinishedRule == DIC_EXAM_STUDY_FINISHED_RULE.STUDY_FINISHED).AnyAsync() || await Db.Queryable().Where(x => x.StudyRecordId == record.Id && x.IsPass == true).AnyAsync())
+ record.CompleteStatus = DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.FINISHED;
+ }
+ else
+ {
+ if (record.CourseSceneId.IsNotEmptyOrNull())
+ record.CompleteStatus = DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.FINISHED;
+ else if (record.CourseId != null)
+ {
+ var course = await Db.Queryable().Where(x => x.Id == record.CourseId).FirstAsync();
+ if (course != null)
+ {
+ if (course.ExamPaperId.IsNullOrEmpty())
+ course.ExamPaperId = "[]";
+ var examPaperIds = JsonHelper.JsonToObj>(course.ExamPaperId);
+
+ if (!examPaperIds.Any())
+ record.CompleteStatus = DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.FINISHED;
+ }
+ }
+ }
+
+ record.ReverseI1 = 0;
+ await Db.Updateable(record)
+ .UpdateColumns(it => new
+ {
+ it.ReverseI1,
+ it.CompleteStatus
+ }, true)
+ .ExecuteCommandAsync();
+ }
+
}
diff --git a/Tiobon.Core.IServices/Ghre/IGhre_StudyRecordServices.cs b/Tiobon.Core.IServices/Ghre/IGhre_StudyRecordServices.cs
index f6dfb5eb..f50cad2e 100644
--- a/Tiobon.Core.IServices/Ghre/IGhre_StudyRecordServices.cs
+++ b/Tiobon.Core.IServices/Ghre/IGhre_StudyRecordServices.cs
@@ -1,7 +1,5 @@
using Tiobon.Core.Common;
-using Tiobon.Core.IServices.BASE;
using Tiobon.Core.Model;
-using Tiobon.Core.Model.Models;
using Tiobon.Core.Model.ViewModels.Extend;
namespace Tiobon.Core.IServices;
@@ -32,4 +30,6 @@ public interface IGhre_StudyRecordServices : IBaseServices> QueryTeacherClassAnalysis(QueryBody filter);
Task IssueCredit();
+
+ Task MarkCompleteStatus();
}
\ No newline at end of file
diff --git a/Tiobon.Core.Services/Ghre/Ghre_ExamRecordServices.cs b/Tiobon.Core.Services/Ghre/Ghre_ExamRecordServices.cs
index 65c83a2f..860053d0 100644
--- a/Tiobon.Core.Services/Ghre/Ghre_ExamRecordServices.cs
+++ b/Tiobon.Core.Services/Ghre/Ghre_ExamRecordServices.cs
@@ -1315,15 +1315,8 @@ public class Ghre_ExamRecordServices : BaseServices().Where(x => x.Id == record.ExamId && (x.StudyFinishedRule == DIC_EXAM_STUDY_FINISHED_RULE.NO_STUDY_EXAM_PASS || x.StudyFinishedRule == DIC_EXAM_STUDY_FINISHED_RULE.EXAM_PASS)).FirstAsync();
- if (exam != null)
- {
- studyRecord.CompleteStatus = DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.FINISHED;
- await Db.Updateable(studyRecord).UpdateColumns(it => new { it.CompleteStatus }, true)
- .ExecuteCommandAsync();
- }
- }
+ await ExamHelper.MarkCompleteStatusAsync(Db, studyRecord);
+
#endregion
_logger.LogInformation($"【DealPass:{studyRecordId}】2");
diff --git a/Tiobon.Core.Services/Ghre/Ghre_StudyRecordServices.cs b/Tiobon.Core.Services/Ghre/Ghre_StudyRecordServices.cs
index 4b5d005f..98e01d9e 100644
--- a/Tiobon.Core.Services/Ghre/Ghre_StudyRecordServices.cs
+++ b/Tiobon.Core.Services/Ghre/Ghre_StudyRecordServices.cs
@@ -1811,18 +1811,7 @@ WHERE A.Id = '{id}'";
if (studyProgress == 100)
{
studyStatus = DIC_STUDY_RECORD_STUDY_STATUS.HAS_FINISH;
- if (completeStatus == DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.NO_FINISH)
-
- if (record.ExamId.IsNullOrEmpty())
- {
- if (record.CourseSceneId.IsNotEmptyOrNull() || (record.CourseId != null && await Db.Queryable().AnyAsync(x => x.Id == record.CourseId && x.ExamPaperId == null)))
- completeStatus = DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.FINISHED;
- }
- else
- {
- if (await Db.Queryable().AnyAsync(x => x.Id == record.ExamId && x.StudyFinishedRule == DIC_EXAM_STUDY_FINISHED_RULE.STUDY_FINISHED))
- completeStatus = DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.FINISHED;
- }
+ await ExamHelper.MarkCompleteStatusAsync(Db, record);
}
var studyProgress1 = studyProgress.ObjToInt();
@@ -1833,7 +1822,6 @@ WHERE A.Id = '{id}'";
StudyProgress = studyProgress1,
StudyStatus = studyStatus,
StandardDuration = mins,
- CompleteStatus = completeStatus,
ReverseI1 = 1
})
.Where(it => it.Id == studyRecordId)
@@ -2078,8 +2066,6 @@ ORDER BY {filter.orderBy}";
}
#endregion
-
-
#region 发放学分
///
/// 发放学分
@@ -2192,4 +2178,30 @@ ORDER BY {filter.orderBy}";
return ServiceResult.OprateSuccess("发放成功!");
}
#endregion
+
+ #region 自动刷新完成状态
+ ///
+ /// 自动刷新完成状态
+ ///
+ ///
+ public async Task MarkCompleteStatus()
+ {
+ var now = DateTime.Now;
+ //抓取当天提交考试的数据
+ var records = await Db.Queryable()
+ .Where(x => x.ReverseI1 == 1)
+ .ToListAsync();
+ _logger.LogInformation($"【自动刷新完成状态】查询到{records.Count}条考试数据");
+ if (!records.Any())
+ return ServiceResult.OprateSuccess("自动刷新完成状态!");
+
+
+ for (int i = 0; i < records.Count; i++)
+ {
+ await ExamHelper.MarkCompleteStatusAsync(Db, records[i]);
+ }
+
+ return ServiceResult.OprateSuccess("自动刷新完成状态!");
+ }
+ #endregion
}
\ No newline at end of file
diff --git a/Tiobon.Core.Tasks/QuartzNet/Jobs/Job_AutoMarkCompleteStatus_Quartz.cs b/Tiobon.Core.Tasks/QuartzNet/Jobs/Job_AutoMarkCompleteStatus_Quartz.cs
new file mode 100644
index 00000000..4752692b
--- /dev/null
+++ b/Tiobon.Core.Tasks/QuartzNet/Jobs/Job_AutoMarkCompleteStatus_Quartz.cs
@@ -0,0 +1,37 @@
+using Microsoft.Extensions.Logging;
+
+///
+/// 这里要注意下,命名空间和程序集是一样的,不然反射不到(任务类要去JobSetup添加注入)
+///
+namespace Tiobon.Core.Tasks;
+
+public class Job_AutoMarkCompleteStatus_Quartz : JobBase, IJob
+{
+ private readonly ILogger _logger;
+ private readonly IGhre_StudyRecordServices _services;
+
+ public Job_AutoMarkCompleteStatus_Quartz(ILogger logger,
+ ITasksQzServices tasksQzServices,
+ ITasksLogServices tasksLogServices,
+ IGhre_StudyRecordServices services)
+ : base(tasksQzServices, tasksLogServices)
+ {
+ _tasksQzServices = tasksQzServices;
+ _logger = logger;
+ _services = services;
+ }
+ public async Task Execute(IJobExecutionContext context)
+ {
+ // 可以直接获取 JobDetail 的值
+ var jobKey = context.JobDetail.Key;
+ var jobId = jobKey.Name;
+ var executeLog = await ExecuteJob(context, async () => await Run(context, jobId.ObjToInt()));
+
+ }
+ public async Task Run(IJobExecutionContext context, int jobid)
+ {
+ if (jobid > 0)
+ await _services.MarkCompleteStatus();
+
+ }
+}