新增发放学分调度任务

master
xiaochanghai 2 months ago
parent b4b6053926
commit 66bf84cb31
  1. 7810
      Model/Tiobon.Web.pdm
  2. 30
      Tiobon.Core.Api/Tiobon.Core.Model.xml
  3. 2
      Tiobon.Core.IServices/Ghre/IGhre_StudyRecordServices.cs
  4. 10
      Tiobon.Core.Model/Base/Ghre/Ghre_CreditPoint.Dto.Base.cs
  5. 2
      Tiobon.Core.Model/Base/Ghre/Ghre_CreditRule.Dto.Base.cs
  6. 5
      Tiobon.Core.Model/Base/Ghre/Ghre_StudyRecord.Dto.Base.cs
  7. 10
      Tiobon.Core.Model/Models/Ghre/Ghre_CreditPoint.cs
  8. 5
      Tiobon.Core.Model/Models/Ghre/Ghre_StudyRecord.cs
  9. 2
      Tiobon.Core.Model/View/Ghre/Ghre_CreditRule.Dto.View.cs
  10. 8
      Tiobon.Core.Model/ViewModels/Extend/CreditRuleScoreRange.cs
  11. 38
      Tiobon.Core.Services/Ghre/Ghre_CreditRuleServices.cs
  12. 119
      Tiobon.Core.Services/Ghre/Ghre_StudyRecordServices.cs
  13. 37
      Tiobon.Core.Tasks/QuartzNet/Jobs/Job_AutoIssueCredit_Quartz.cs
  14. 30
      Tiobon.Core/Tiobon.Core.Model.xml

File diff suppressed because it is too large Load Diff

@ -3725,6 +3725,16 @@
预留字段12 预留字段12
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_CreditPointBase.CreditRuleId">
<summary>
学分规则ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_CreditPointBase.StudyRecordId">
<summary>
学习记录ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_CreditRuleBase"> <member name="T:Tiobon.Core.Model.Models.Ghre_CreditRuleBase">
<summary> <summary>
学分规则 (Dto.Base) 学分规则 (Dto.Base)
@ -7405,6 +7415,11 @@
培训计划ID 培训计划ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecordBase.IsIssueCredit">
<summary>
是否发放学分
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_StudyRecordDetailBase"> <member name="T:Tiobon.Core.Model.Models.Ghre_StudyRecordDetailBase">
<summary> <summary>
培训记录明细 (Dto.Base) 培训记录明细 (Dto.Base)
@ -20627,6 +20642,16 @@
预留字段12 预留字段12
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_CreditPoint.CreditRuleId">
<summary>
学分规则ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_CreditPoint.StudyRecordId">
<summary>
学习记录ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_CreditRule"> <member name="T:Tiobon.Core.Model.Models.Ghre_CreditRule">
<summary> <summary>
学分规则 (Model) 学分规则 (Model)
@ -24217,6 +24242,11 @@
培训计划ID 培训计划ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecord.IsIssueCredit">
<summary>
是否发放学分
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_StudyRecordDetail"> <member name="T:Tiobon.Core.Model.Models.Ghre_StudyRecordDetail">
<summary> <summary>
培训记录明细 (Model) 培训记录明细 (Model)

@ -30,4 +30,6 @@ public interface IGhre_StudyRecordServices : IBaseServices<Ghre_StudyRecord, Ghr
Task SyncToESS(); Task SyncToESS();
Task<ServicePageResult<TeacherClassAnalysis>> QueryTeacherClassAnalysis(QueryBody filter); Task<ServicePageResult<TeacherClassAnalysis>> QueryTeacherClassAnalysis(QueryBody filter);
Task<ServiceResult> IssueCredit();
} }

@ -133,4 +133,14 @@ public class Ghre_CreditPointBase
/// 预留字段12 /// 预留字段12
/// </summary> /// </summary>
public int? ReverseI2 { get; set; } public int? ReverseI2 { get; set; }
/// <summary>
/// 学分规则ID
/// </summary>
public long? CreditRuleId { get; set; }
/// <summary>
/// 学习记录ID
/// </summary>
public long? StudyRecordId { get; set; }
} }

@ -137,4 +137,6 @@ public class Ghre_CreditRuleBase
/// 预留字段12 /// 预留字段12
/// </summary> /// </summary>
public int? ReverseI2 { get; set; } public int? ReverseI2 { get; set; }
public List<CreditRuleScoreRange> ScoreRanges { get; set; }
} }

@ -229,4 +229,9 @@ public class Ghre_StudyRecordBase
/// 培训计划ID /// 培训计划ID
/// </summary> /// </summary>
public long? PlanId { get; set; } public long? PlanId { get; set; }
/// <summary>
/// 是否发放学分
/// </summary>
public bool? IsIssueCredit { get; set; }
} }

@ -134,4 +134,14 @@ public class Ghre_CreditPoint : BasePoco
/// 预留字段12 /// 预留字段12
/// </summary> /// </summary>
public int? ReverseI2 { get; set; } public int? ReverseI2 { get; set; }
/// <summary>
/// 学分规则ID
/// </summary>
public long? CreditRuleId { get; set; }
/// <summary>
/// 学习记录ID
/// </summary>
public long? StudyRecordId { get; set; }
} }

@ -230,4 +230,9 @@ public class Ghre_StudyRecord : BasePoco
/// 培训计划ID /// 培训计划ID
/// </summary> /// </summary>
public long? PlanId { get; set; } public long? PlanId { get; set; }
/// <summary>
/// 是否发放学分
/// </summary>
public bool? IsIssueCredit { get; set; }
} }

@ -31,4 +31,6 @@ public class Ghre_CreditRuleDto : Ghre_CreditRule
/// 修改信息 /// 修改信息
/// </summary> /// </summary>
public string UpdateDataInfo { get; set; } public string UpdateDataInfo { get; set; }
public List<CreditRuleScoreRange> ScoreRanges { get; set; }
} }

@ -0,0 +1,8 @@
namespace Tiobon.Core.Model;
public class CreditRuleScoreRange
{
public decimal StartScore { get; set; }
public decimal EndScore { get; set; }
public decimal Credit { get; set; }
}

@ -1,4 +1,7 @@
namespace Tiobon.Core.Services; using StackExchange.Profiling.Internal;
using Tiobon.Core.Common.DB.Dapper.Extensions;
namespace Tiobon.Core.Services;
/// <summary> /// <summary>
/// 学分规则 (服务) /// 学分规则 (服务)
@ -27,4 +30,37 @@ public class Ghre_CreditRuleServices : BaseServices<Ghre_CreditRule, Ghre_Credit
}); });
return data; return data;
} }
public override async Task<ServiceFormResult<Ghre_CreditRuleDto>> QueryForm(QueryForm body)
{
var result = await base.QueryForm(body);
var DT_TableDataT1 = result.result.DT_TableDataT1;
DT_TableDataT1.ForEach(t =>
{
if (!string.IsNullOrWhiteSpace(t.ScoreRange))
t.ScoreRanges = JsonHelper.JsonToObj<List<CreditRuleScoreRange>>(t.ScoreRange);
else
t.ScoreRanges = new List<CreditRuleScoreRange>();
});
result.result.DT_TableDataT1 = DT_TableDataT1;
return result;
}
public override async Task<long> Add(InsertGhre_CreditRuleInput entity)
{
if (entity.ScoreRanges != null && entity.ScoreRanges.Any())
entity.ScoreRange = JsonHelper.ObjToJson(entity.ScoreRanges);
return await base.Add(entity);
}
public override async Task<bool> Update(long Id, EditGhre_CreditRuleInput editModel)
{
var courseIds = new List<long>();
if (editModel.ScoreRanges != null && editModel.ScoreRanges.Any())
editModel.ScoreRange = JsonHelper.ObjToJson(editModel.ScoreRanges);
return await base.Update(Id, editModel);
}
} }

@ -1,10 +1,12 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens;
using MongoDB.Driver.Linq; using MongoDB.Driver.Linq;
using NPOI.HSSF.UserModel; using NPOI.HSSF.UserModel;
using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel; using NPOI.SS.UserModel;
using NPOI.SS.Util; using NPOI.SS.Util;
using NPOI.XSSF.UserModel; using NPOI.XSSF.UserModel;
using Tiobon.Core.Model.Models;
using static System.Runtime.InteropServices.JavaScript.JSType;
using static Tiobon.Core.DataAccess.ReportHelper; using static Tiobon.Core.DataAccess.ReportHelper;
using static Tiobon.Core.Model.Consts; using static Tiobon.Core.Model.Consts;
@ -2016,4 +2018,119 @@ ORDER BY {filter.orderBy}";
return true; return true;
} }
#endregion #endregion
#region 发放学分
/// <summary>
/// 发放学分
/// </summary>
/// <returns></returns>
public async Task<ServiceResult> IssueCredit()
{
var now = DateTime.Now;
//抓取当天提交考试的数据
var records = await Db.Queryable<Ghre_StudyRecord>()
.Where(x => x.StudyProgress == 100 && (x.IsIssueCredit == null || x.IsIssueCredit == false))
.Take(100)
.ToListAsync();
_logger.LogInformation($"【学分发放】查询到{records.Count}条考试数据");
if (!records.Any())
return ServiceResult.OprateSuccess("发放成功!");
var creditPoints = new List<Ghre_CreditPoint>();
for (int i = 0; i < records.Count; i++)
{
long? creditRuleId = null;
long? courseCreditPoints = 0;
var record = records[i];
if (record.CourseId.IsNotEmptyOrNull())
{
creditRuleId = await Db.Queryable<Ghre_Course>().Where(x => x.Id == record.CourseId).Select(x => x.CreditRuleId).FirstAsync();
courseCreditPoints = await Db.Queryable<Ghre_Course>().Where(x => x.Id == record.CourseId).Select(x => x.CreditPoints).FirstAsync();
}
else if (record.CourseSceneId.IsNotEmptyOrNull())
{
creditRuleId = await Db.Queryable<Ghre_CourseScene>().Where(x => x.Id == record.CourseId).Select(x => x.CreditRuleId).FirstAsync();
}
if (courseCreditPoints <= 0)
continue;
if (creditRuleId != null)
{
var creditRule = await Db.Queryable<Ghre_CreditRule>().Where(x => x.Id == record.CourseId).Select(x => new
{
x.RuleType,
x.ScoreRange,
x.StudyCompletedPercent,
x.ExamPassPercent
}).FirstAsync();
if (creditRule != null)
{
var creditPoint = new Ghre_CreditPoint()
{
StaffId = record.StaffId,
StudyRecordId = record.Id,
ExamId = record.ExamId,
CreditRuleId = creditRuleId,
Date = DateTime.Now
};
if (creditRule.RuleType == "StudyCompletedPercent")//学习完成
{
creditPoint.CreditPoints = ((courseCreditPoints * creditRule.StudyCompletedPercent) / 100).ObjToInt();
record.IsIssueCredit = true;
}
else if (creditRule.RuleType == "ExamPassPercent")//考试合格
{
if (record.ExamId != null)
{
if (await Db.Queryable<Ghre_ExamRecord>().Where(x => x.StudyRecordId == record.Id && x.IsPass == true && x.Status == "ExamEnd").AnyAsync())
creditPoint.CreditPoints = ((courseCreditPoints * creditRule.ExamPassPercent) / 100).ObjToInt();
}
}
else if (creditRule.RuleType == "ScoreRanges")//分数段
{
var scoreRanges = JsonHelper.JsonToObj<List<CreditRuleScoreRange>>(creditRule.ScoreRange);
if (record.ExamId != null)
{
var examRecord = await Db.Queryable<Ghre_ExamRecord>().Where(x => x.StudyRecordId == record.Id && x.ScoreStatus == "HasScore" && x.IsPass == true && x.Status == "ExamEnd").FirstAsync();
if (examRecord != null && examRecord.Score > 0)
{
var exam = await Db.Queryable<Ghre_Exam>().Where(x => x.Id == examRecord.ExamId).FirstAsync();
if (exam != null)
{
var examPaper = await Db.Queryable<Ghre_ExamPaper>().Where(x => x.Id == examRecord.ExamId).FirstAsync();
if (examPaper != null)
{
var percent = (examRecord.Score / examPaper.TotalScore) * 100;
percent = scoreRanges.Where(x => x.StartScore > percent && x.EndScore <= percent).Select(x => x.Credit).FirstOrDefault();
if (percent != null)
creditPoint.CreditPoints = ((courseCreditPoints * percent) / 100).ObjToInt();
}
}
}
}
}
if (creditPoint.CreditPoints > 0)
creditPoints.Add(creditPoint);
}
}
}
await Db.Insertable(creditPoints).ExecuteReturnSnowflakeIdListAsync();
await Db.Updateable(records)
.UpdateColumns(it => new { it.IsIssueCredit }, true)
.ExecuteCommandAsync();
return ServiceResult.OprateSuccess("发放成功!");
}
#endregion
} }

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

@ -3725,6 +3725,16 @@
预留字段12 预留字段12
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_CreditPointBase.CreditRuleId">
<summary>
学分规则ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_CreditPointBase.StudyRecordId">
<summary>
学习记录ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_CreditRuleBase"> <member name="T:Tiobon.Core.Model.Models.Ghre_CreditRuleBase">
<summary> <summary>
学分规则 (Dto.Base) 学分规则 (Dto.Base)
@ -7405,6 +7415,11 @@
培训计划ID 培训计划ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecordBase.IsIssueCredit">
<summary>
是否发放学分
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_StudyRecordDetailBase"> <member name="T:Tiobon.Core.Model.Models.Ghre_StudyRecordDetailBase">
<summary> <summary>
培训记录明细 (Dto.Base) 培训记录明细 (Dto.Base)
@ -20627,6 +20642,16 @@
预留字段12 预留字段12
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_CreditPoint.CreditRuleId">
<summary>
学分规则ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_CreditPoint.StudyRecordId">
<summary>
学习记录ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_CreditRule"> <member name="T:Tiobon.Core.Model.Models.Ghre_CreditRule">
<summary> <summary>
学分规则 (Model) 学分规则 (Model)
@ -24217,6 +24242,11 @@
培训计划ID 培训计划ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecord.IsIssueCredit">
<summary>
是否发放学分
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_StudyRecordDetail"> <member name="T:Tiobon.Core.Model.Models.Ghre_StudyRecordDetail">
<summary> <summary>
培训记录明细 (Model) 培训记录明细 (Model)

Loading…
Cancel
Save