员工在学习时长达到总数时需要实时判定学习完成状态

考试结束时需要实时判定学习完成状态
每天晚上自动刷新学习记录“已完成”的识别状态
master
xiaochanghai 2 months ago
parent 71e1f3ba93
commit 338406753e
  1. 35
      Tiobon.Core.Api/Tiobon.Core.Model.xml
  2. 2
      Tiobon.Core.Api/appsettings.json
  3. 37
      Tiobon.Core.Common/Helper/ExamHelper.cs
  4. 4
      Tiobon.Core.IServices/Ghre/IGhre_StudyRecordServices.cs
  5. 11
      Tiobon.Core.Services/Ghre/Ghre_ExamRecordServices.cs
  6. 42
      Tiobon.Core.Services/Ghre/Ghre_StudyRecordServices.cs
  7. 37
      Tiobon.Core.Tasks/QuartzNet/Jobs/Job_AutoMarkCompleteStatus_Quartz.cs

@ -39568,6 +39568,26 @@
手动选修
</summary>
</member>
<member name="T:Tiobon.Core.Model.Consts.DIC_EXAM_STUDY_FINISHED_RULE">
<summary>
考试管理-学习完成标准
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_EXAM_STUDY_FINISHED_RULE.EXAM_PASS">
<summary>
学习完成+考试合格
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_EXAM_STUDY_FINISHED_RULE.STUDY_FINISHED">
<summary>
学习完成
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_EXAM_STUDY_FINISHED_RULE.NO_STUDY_EXAM_PASS">
<summary>
不学习但考试合格
</summary>
</member>
<member name="T:Tiobon.Core.Model.Consts.DIC_TRAINING_STUDY_RULE_TRAIN_TYPE">
<summary>
培训规则种类
@ -39643,6 +39663,21 @@
已完成
</summary>
</member>
<member name="T:Tiobon.Core.Model.Consts.DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS">
<summary>
培训记录-学习状态
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.FINISHED">
<summary>
已完成
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.NO_FINISH">
<summary>
未完成
</summary>
</member>
<member name="T:Tiobon.Core.Model.Consts.DIC_EXAM_RECORD_STATUS">
<summary>
考试记录-状态

@ -269,7 +269,7 @@
"Enabled": false
},
"QuartzNetJob": {
"Enabled": false
"Enabled": true
},
"Consul": {
"Enabled": false

@ -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<Ghre_Exam>().Where(x => x.Id == record.ExamId && x.StudyFinishedRule == DIC_EXAM_STUDY_FINISHED_RULE.STUDY_FINISHED).AnyAsync() || await Db.Queryable<Ghre_ExamRecord>().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<Ghre_Course>().Where(x => x.Id == record.CourseId).FirstAsync();
if (course != null)
{
if (course.ExamPaperId.IsNullOrEmpty())
course.ExamPaperId = "[]";
var examPaperIds = JsonHelper.JsonToObj<List<long>>(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();
}
}

@ -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<Ghre_StudyRecord, Ghr
Task<ServicePageResult<TeacherClassAnalysis>> QueryTeacherClassAnalysis(QueryBody filter);
Task<ServiceResult> IssueCredit();
Task<ServiceResult> MarkCompleteStatus();
}

@ -1315,15 +1315,8 @@ public class Ghre_ExamRecordServices : BaseServices<Ghre_ExamRecord, Ghre_ExamRe
#region 处理学习完成状态
if (record.IsPass == true)
{
var exam = await Db.Queryable<Ghre_Exam>().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");

@ -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<Ghre_Course>().AnyAsync(x => x.Id == record.CourseId && x.ExamPaperId == null)))
completeStatus = DIC_STUDY_RECORD_STUDY_COMPLETE_STATUS.FINISHED;
}
else
{
if (await Db.Queryable<Ghre_Exam>().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 发放学分
/// <summary>
/// 发放学分
@ -2192,4 +2178,30 @@ ORDER BY {filter.orderBy}";
return ServiceResult.OprateSuccess("发放成功!");
}
#endregion
#region 自动刷新完成状态
/// <summary>
/// 自动刷新完成状态
/// </summary>
/// <returns></returns>
public async Task<ServiceResult> MarkCompleteStatus()
{
var now = DateTime.Now;
//抓取当天提交考试的数据
var records = await Db.Queryable<Ghre_StudyRecord>()
.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
}

@ -0,0 +1,37 @@
using Microsoft.Extensions.Logging;
/// <summary>
/// 这里要注意下,命名空间和程序集是一样的,不然反射不到(任务类要去JobSetup添加注入)
/// </summary>
namespace Tiobon.Core.Tasks;
public class Job_AutoMarkCompleteStatus_Quartz : JobBase, IJob
{
private readonly ILogger<Job_URL_Quartz> _logger;
private readonly IGhre_StudyRecordServices _services;
public Job_AutoMarkCompleteStatus_Quartz(ILogger<Job_URL_Quartz> 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();
}
}
Loading…
Cancel
Save