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(); + + } +}