using MongoDB.Driver.Linq; using static Tiobon.Core.Model.Consts; namespace Tiobon.Core.Services; /// /// 必选修规则 (服务) /// public class Ghre_StudyRuleServices : BaseServices, IGhre_StudyRuleServices { private readonly IBaseRepository _dal; private readonly IGhre_CourseServices _ghre_CourseServices; private readonly IGhre_CourseSceneServices _ghre_CourseSceneServices; private readonly IGhre_StudyRuleStaffServices _ghre_StudyRuleStaffServices; public Ghre_StudyRuleServices(ICaching caching, IGhre_CourseServices ghre_CourseServices, IGhre_CourseSceneServices ghre_CourseSceneServices, IGhre_StudyRuleStaffServices ghre_StudyRuleStaffServices, IBaseRepository dal) { this._dal = dal; base.BaseDal = dal; base._caching = caching; _ghre_CourseServices = ghre_CourseServices; _ghre_CourseSceneServices = ghre_CourseSceneServices; _ghre_StudyRuleStaffServices = ghre_StudyRuleStaffServices; } public override async Task> QueryFilterPage(QueryBody filter, string condition, bool? IsEnable = true) { if (string.IsNullOrWhiteSpace(filter.orderBy)) filter.orderBy = "CreateTime1 DESC"; if (filter.pageSize == 0) filter.pageSize = 10000; var countSql = @$" SELECT COUNT(1) FROM Ghre_StudyRule_v A"; var sql = @$" SELECT * FROM Ghre_StudyRule_v A"; string conditions = " WHERE 1=1 "; conditions += $" AND dbo.FUserDataBelongPriv ({App.User.ID}, A.DataBelongID, NULL) = 1"; if (IsEnable == true) conditions += " AND IsEnable = 1"; else if (IsEnable == false) conditions += " AND IsEnable = 0"; if (!string.IsNullOrWhiteSpace(condition)) conditions += " AND " + condition; if (filter.jsonParam != null) foreach (JProperty jProperty in filter.jsonParam.Properties()) { var name = jProperty.Name; var value = jProperty.Value.ToString(); if (name == "page" || name == "pageSize") continue; if (name == "StaffId") { var jsonParam = JsonHelper.JsonToObj(value); var ids1 = JsonHelper.JsonToObj>(jsonParam.columnValue.ToString()); if (ids1 is null) continue; string sql1 = $"SELECT DISTINCT B.Id from Ghre_StudyRuleStaff A join Ghre_StudyRule B ON A.StudyRuleId = B.ID WHERE B.IsEnable=1 AND A.StaffId IN ({string.Join(",", ids1.Select(id => "'" + id + "'"))})"; ids1 = await Db.Ado.SqlQueryAsync(sql1); switch (jsonParam.operationKey) { case "EqualAny":// conditions += $" AND Id IN ({string.Join(",", ids1.Select(id => "'" + id + "'"))})"; break; case "NotEqualAny":// conditions += $" AND Id NOT IN ({string.Join(",", ids1.Select(id => "'" + id + "'"))})"; break; default: break; } continue; } if (!string.IsNullOrWhiteSpace(value)) conditions = DealConditions(conditions, name, value); } sql += conditions; countSql += conditions; int total = await Db.Ado.GetIntAsync(countSql); sql = "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY " + filter.orderBy + ") NUM FROM (SELECT * FROM (" + sql + " "; sql += ") A ) B ) C"; sql += " WHERE NUM <= " + filter.pageNum * filter.pageSize + " AND NUM >" + (filter.pageNum - 1) * filter.pageSize; var entitys = await Db.Ado.SqlQueryAsync(sql); var ids = entitys.Select(x => x.Id).ToList(); var staffs = await _ghre_StudyRuleStaffServices.Query(x => x.StudyRuleId != null && ids.Contains(x.StudyRuleId.Value)); var zoneIds = new List(); var deptIds = new List(); var titleIds = new List(); var gradeIds = new List(); var jobIds = new List(); entitys.ForEach(async rule => { rule.StaffNames = string.Join(",", staffs.Where(o => o.StudyRuleId == rule.Id).Select(o => o.StaffName)); rule.DataBelongName = await GetDataBelongName(rule.DataBelongID); if (!rule.ZoneId.IsNull()) rule.ZoneIds = JsonHelper.JsonToObj>(rule.ZoneId); if (!rule.DeptId.IsNull()) rule.DeptIds = JsonHelper.JsonToObj>(rule.DeptId); if (!rule.TitleId.IsNull()) rule.TitleIds = JsonHelper.JsonToObj>(rule.TitleId); if (!rule.GradeId.IsNull()) rule.GradeIds = JsonHelper.JsonToObj>(rule.GradeId); if (!rule.JobId.IsNull()) rule.JobIds = JsonHelper.JsonToObj>(rule.JobId); if (rule.ZoneIds.Any()) zoneIds.AddRange(rule.ZoneIds); if (rule.DeptIds.Any()) deptIds.AddRange(rule.DeptIds); if (rule.TitleIds.Any()) titleIds.AddRange(rule.TitleIds); if (rule.GradeIds.Any()) gradeIds.AddRange(rule.GradeIds); if (rule.JobIds.Any()) jobIds.AddRange(rule.JobIds); }); if (zoneIds.Any()) { var zones = await Db.Queryable().Where(x => zoneIds.Contains(x.ZoneID)).ToListAsync(); entitys.ForEach(rule => { rule.ZoneName = string.Join(",", zones.Where(o => rule.ZoneIds.Contains(o.ZoneID)).Select(o => o.ZoneName)); }); } if (deptIds.Any()) { var depts = await Db.Queryable().Where(x => deptIds.Contains(x.DeptID)).ToListAsync(); entitys.ForEach(rule => { rule.DeptName = string.Join(",", depts.Where(o => rule.DeptIds.Contains(o.DeptID)).Select(o => o.DeptName)); }); } if (titleIds.Any()) { var titles = await Db.Queryable().Where(x => titleIds.Contains(x.TitleID)).ToListAsync(); entitys.ForEach(rule => { rule.TitleName = string.Join(",", titles.Where(o => rule.TitleIds.Contains(o.TitleID)).Select(o => o.TitleName)); }); } if (gradeIds.Any()) { var grades = await Db.Queryable().Where(x => gradeIds.Contains(x.GradeID)).ToListAsync(); entitys.ForEach(rule => { rule.GradeName = string.Join(",", grades.Where(o => rule.GradeIds.Contains(o.GradeID)).Select(o => o.GradeName)); }); } if (jobIds.Any()) { var jobs = await Db.Queryable().Where(x => jobIds.Contains(x.JobID)).ToListAsync(); entitys.ForEach(rule => { rule.JobName = string.Join(",", jobs.Where(o => rule.JobIds.Contains(o.JobID)).Select(o => o.JobName)); }); } return new ServicePageResult(filter.pageNum, total, filter.pageSize, entitys); } public override async Task Add(InsertGhre_StudyRuleInput entity) { if (!entity.ZoneIds.IsNull() && entity.ZoneIds.Any()) entity.ZoneId = JsonHelper.ObjToJson(entity.ZoneIds); if (!entity.DeptIds.IsNull() && entity.DeptIds.Any()) entity.DeptId = JsonHelper.ObjToJson(entity.DeptIds); if (!entity.TitleIds.IsNull() && entity.TitleIds.Any()) entity.TitleId = JsonHelper.ObjToJson(entity.TitleIds); if (!entity.GradeIds.IsNull() && entity.GradeIds.Any()) entity.GradeId = JsonHelper.ObjToJson(entity.GradeIds); if (!entity.JobIds.IsNull() && entity.JobIds.Any()) entity.JobId = JsonHelper.ObjToJson(entity.JobIds); var companyCode = await QueryCompanyCode(); if (companyCode != "Viavi") if (entity.TrainType == "NewStaff") { if (!entity.ZoneIds.Any() && !entity.DeptIds.Any() && !entity.TitleIds.Any() && !entity.GradeIds.Any() && !entity.JobIds.Any()) throw new Exception("厂区、部门、职称、职等、岗位,至少填写任一个才能保存!"); } var result = await base.Add(entity); if (entity.Staffs != null && entity.Staffs.Any()) { var insertStaffs = entity.Staffs.Select(x => new InsertGhre_StudyRuleStaffInput { StaffId = x, StudyRuleId = result }).ToList(); await _ghre_StudyRuleStaffServices.Add(insertStaffs); } string sql = @"UPDATE A SET A.StaffName = B.StaffName FROM Ghre_StudyRuleStaff A LEFT JOIN Ghra_Staff B ON A.StaffId = B.StaffID WHERE A.StaffName IS NULL"; await Db.Ado.ExecuteCommandAsync(sql); await Task.Factory.StartNew(async () => await GenerateStaffStudyRecord(Db, result)); return result; } public override async Task Update(long Id, EditGhre_StudyRuleInput entity) { if (!entity.ZoneIds.IsNull()) entity.ZoneId = JsonHelper.ObjToJson(entity.ZoneIds); if (!entity.DeptIds.IsNull()) entity.DeptId = JsonHelper.ObjToJson(entity.DeptIds); if (!entity.TitleIds.IsNull()) entity.TitleId = JsonHelper.ObjToJson(entity.TitleIds); if (!entity.GradeIds.IsNull()) entity.GradeId = JsonHelper.ObjToJson(entity.GradeIds); if (!entity.JobIds.IsNull()) entity.JobId = JsonHelper.ObjToJson(entity.JobIds); var companyCode = await QueryCompanyCode(); if (companyCode != "Viavi") if (entity.TrainType == "NewStaff") { if (!entity.ZoneIds.Any() && !entity.DeptIds.Any() && !entity.TitleIds.Any() && !entity.GradeIds.Any() && !entity.JobIds.Any()) throw new Exception("厂区、部门、职称、职等、岗位,至少填写任一个才能保存!"); } var result = await base.Update(Id, entity); await _ghre_StudyRuleStaffServices.Delete(x => x.StudyRuleId == Id); if (!entity.IsNull() && entity.Staffs.Any()) { var insertStaffs = entity.Staffs.Select(x => new InsertGhre_StudyRuleStaffInput { StaffId = x, StudyRuleId = Id }).ToList(); await _ghre_StudyRuleStaffServices.Add(insertStaffs); } string sql = @"UPDATE A SET A.StaffName = B.StaffName FROM Ghre_StudyRuleStaff A LEFT JOIN Ghra_Staff B ON A.StaffId = B.StaffID WHERE A.StaffName IS NULL"; await Db.Ado.ExecuteCommandAsync(sql); await Task.Factory.StartNew(async () => await GenerateStaffStudyRecord(Db, Id)); return result; } public override async Task> QueryForm(QueryForm body) { var result = await base.QueryForm(body); if (result.result.DT_TableDataT1.Any()) { var staffs = await _ghre_StudyRuleStaffServices.Query(x => x.StudyRuleId != null && x.StudyRuleId == result.result.DT_TableDataT1[0].Id); var DT_TableDataT1 = result.result.DT_TableDataT1; DT_TableDataT1.ForEach(rule => { rule.Staffs = staffs.Where(x => x.StaffId != null).Select(x => x.StaffId.Value).ToList(); if (!rule.ZoneId.IsNull()) rule.ZoneIds = JsonHelper.JsonToObj>(rule.ZoneId); if (!rule.DeptId.IsNull()) rule.DeptIds = JsonHelper.JsonToObj>(rule.DeptId); if (!rule.TitleId.IsNull()) rule.TitleIds = JsonHelper.JsonToObj>(rule.TitleId); if (!rule.GradeId.IsNull()) rule.GradeIds = JsonHelper.JsonToObj>(rule.GradeId); if (!rule.JobId.IsNull()) rule.JobIds = JsonHelper.JsonToObj>(rule.JobId); }); result.result.DT_TableDataT1 = DT_TableDataT1; } return result; } public async Task GenerateStaffStudyRecord(ISqlSugarClient Db, long ruleId) { try { //await Db.Ado.BeginTranAsync(); var rule = await Db.Queryable().FirstAsync(x => x.Id == ruleId); var ZoneIds = new List(); var DeptIds = new List(); var TitleIds = new List(); var GradeIds = new List(); var JobIds = new List(); if (!rule.ZoneId.IsNull()) ZoneIds = JsonHelper.JsonToObj>(rule.ZoneId); if (!rule.DeptId.IsNull()) DeptIds = JsonHelper.JsonToObj>(rule.DeptId); if (!rule.TitleId.IsNull()) TitleIds = JsonHelper.JsonToObj>(rule.TitleId); if (!rule.GradeId.IsNull()) GradeIds = JsonHelper.JsonToObj>(rule.GradeId); if (!rule.JobId.IsNull()) JobIds = JsonHelper.JsonToObj>(rule.JobId); await Db.Deleteable().Where(x => x.StudyRuleId == ruleId && x.BeginTime == null).ExecuteCommandAsync(); await Db.Deleteable().Where(x => x.StudyRuleId == ruleId).ExecuteCommandAsync(); #region 处理部门是否含下阶 var deptIds = new List(); if (rule.IsDeptLower == true && DeptIds.Any()) { var depts = new List(); depts = await GetDeptList(depts); foreach (var dept in DeptIds) { var items = await GetDeptList(depts, dept); deptIds.AddRange(items.Select(x => x.DeptID).ToList()); } deptIds = deptIds.Distinct().ToList(); if (deptIds.Any()) DeptIds.AddRange(deptIds); } #endregion var ruleStaffs = await Db.Queryable().Where(x => x.StudyRuleId == ruleId).ToListAsync(); await Db.Updateable().Where(x => x.StudyRuleId == ruleId && x.IsEnable == 1) .SetColumns(it => new Ghre_StudyRuleResult() { IsEnable = 0 }) .ExecuteCommandAsync(); var ruleStaffIds = ruleStaffs.Select(x => x.StaffId).ToList(); #region 抓取新入职员工 int month = 3; var inStaffIds = new List(); if (rule.TrainType == "NewStaff") { var config = await Db.Queryable().Where(x => x.ConfigCode == "New_Staff_Month").FirstAsync(); if (config != null) { try { month = Convert.ToInt32(config.ConfigValue); } catch (Exception) { } var dateTime = DateTime.Now.AddMonths(-month); inStaffIds = await Db.Queryable() .Where(x => x.OutDate == null || (x.OutDate != null && x.Indate != null && x.Indate.Value.Date >= dateTime.Date && x.Indate.Value.Date <= DateTime.Now.Date)) .Select(x => x.StaffID).ToListAsync(); } } #endregion var staffs = await Db.Queryable() .WhereIF(inStaffIds.Any(), x => inStaffIds.Contains(x.StaffID)) .Where(x => x.OutDate == null || (x.OutDate != null && x.Indate != null && x.Indate.Value.Date <= DateTime.Now.Date && x.Indate.Value.Date >= DateTime.Now.Date)) .WhereIF(ZoneIds.Any(), x => ZoneIds.Contains(x.ZoneID)) .WhereIF(DeptIds.Any(), x => DeptIds.Contains(x.DeptID)) .WhereIF(TitleIds.Any(), x => TitleIds.Contains(x.TitleID)) .WhereIF(GradeIds.Any(), x => GradeIds.Contains(x.GradeID)) .WhereIF(JobIds.Any(), x => JobIds.Contains(x.JobID)) .WhereIF(!ruleStaffIds.IsNull() && ruleStaffIds.Any(), x => ruleStaffIds.Contains(x.StaffID)) .WhereIF(rule.DataBelongID.IsNotEmptyOrNull(), x => x.DataBelongID == rule.DataBelongID) .ToListAsync(); if (staffs.Any()) { var courseTime = Db.GetDate(); var snap = await Db.Queryable().FirstAsync(x => x.CourseId == rule.CourseId); if (staffs.Any()) { var inserts = new List(); var insertExamStaffs = new List(); var insertResults = new List(); //var exam = await Db.Queryable() // .WhereIF(rule.CourseId != null, x => x.CourseId == rule.CourseId) // .WhereIF(rule.CourseSceneId != null, x => x.CourseSceneId == rule.CourseSceneId) // .FirstAsync(x => x.Status == Consts.DicExamStatus.RELEASED); var exam = await Db.Queryable() .Where(x => x.Status == DIC_EXAM_STATUS.RELEASED && ((x.DateType == DicExamDateType.EXAM_DATE && x.BeginTime.Value.Date <= DateTime.Now.Date && x.EndTime.Value.Date >= DateTime.Now.Date) || x.DateType == Consts.DicExamDateType.AFTER_HOW_LONG)) .WhereIF(!rule.CourseId.IsNull(), x => x.CourseId == rule.CourseId) .WhereIF(!rule.CourseSceneId.IsNull(), x => x.CourseSceneId == rule.CourseSceneId) .FirstAsync(); for (int i = 0; i < staffs.Count; i++) { var staff = staffs[i]; var record = await Db.Queryable() .Where(x => x.StudyRuleId != null && x.StaffId == staff.StaffID) .WhereIF(!string.IsNullOrWhiteSpace(rule.Year), x => x.Year == rule.Year) .WhereIF(rule.CourseId != null, x => x.CourseId == rule.CourseId) .WhereIF(rule.CourseSceneId != null, x => x.CourseSceneId == rule.CourseSceneId) //.AS("Ghre_StudyRecord_V") .ClearFilter().FirstAsync(); if (record is null) { inserts.Add(new Ghre_StudyRecord() { StaffId = staff.StaffID, ExamId = exam?.Id, CourseSnapId = snap?.Id, CourseId = rule.CourseId, CourseSceneId = rule.CourseSceneId, StudyRuleId = ruleId, JoinTime = courseTime, CourseBeginTime = courseTime.Date, CourseEndTime = courseTime.Date.AddMonths((rule.DeadlineMonth ?? snap?.ValidityPeriod) ?? 1), CourseType = rule.RuleType, CourseStatus = Consts.DIC_STUDY_RECORD_COURSE_STATUS_IN, StudyStatus = Consts.DIC_STUDY_RECORD_STUDY_STATUS.NO_JOIN, Year = rule.Year, PlanId = rule.PlanId, StudyProgress = 0 }); insertResults.Add(new Ghre_StudyRuleResult() { StaffId = staff.StaffID, StudyRuleId = ruleId, Status = "SUCCESS", RemarkSz = inStaffIds.Where(o => o == staff.StaffID).Any() ? $"生成成功,{month}月内入职员工!" : "生成成功!" }); if (exam != null) if (!await Db.Queryable().AnyAsync(x => x.ExamId == exam.Id && x.StaffId == staff.StaffID)) insertExamStaffs.Add(new Ghre_ExamStaff() { ExamId = exam.Id, StudyRuleId = ruleId, StaffId = staff.StaffID, Source = "StudyRule" + rule.RuleType }); } else { if (record.StudyRuleId == ruleId) { insertResults.Add(new Ghre_StudyRuleResult() { StaffId = staff.StaffID, StudyRuleId = ruleId, Status = "SUCCESS", RemarkSz = "生成成功!" }); } else insertResults.Add(new Ghre_StudyRuleResult() { StaffId = staff.StaffID, StudyRuleId = ruleId, Status = "FAIL", RemarkSz = "生成失败,该课程学习记录已被存在!" }); } } if (inserts.Any()) await Db.Insertable(inserts).ExecuteReturnSnowflakeIdListAsync(); if (insertResults.Any()) await Db.Insertable(insertResults).ExecuteReturnSnowflakeIdListAsync(); if (insertExamStaffs.Any()) await Db.Insertable(insertExamStaffs).ExecuteReturnSnowflakeIdListAsync(); rule.Result = "数据生成成功"; } else rule.Result = "未匹配到相关关人员数据!"; await Db.Updateable().Where(x => x.Id == ruleId) .SetColumns(it => new Ghre_StudyRule() { Result = rule.Result })//类只能在表达示里面不能提取 .ExecuteCommandAsync(); } #region 处理异动后人员转选修 var staffIds = staffs.Select(x => x.StaffID).ToList(); var recordIds = await Db.Queryable() .Where(x => x.StudyRuleId == ruleId && !staffIds.Contains(x.StaffId.Value) && x.StudyStatus != DIC_STUDY_RECORD_STUDY_STATUS.HAS_FINISH && x.Reverse9 != "异动转入选修") .Select(x => x.Id).ToListAsync(); if (recordIds.Any()) await Db.Updateable() .Where(x => recordIds.Contains(x.Id)) .SetColumns(it => new Ghre_StudyRecord() { CourseType = "Elective", Reverse9 = "异动转入选修" }) .ExecuteCommandAsync(); #endregion //await Db.Ado.CommitTranAsync(); string sql = @"UPDATE A SET A.StaffName = B.StaffName, a.StaffNo = B.StaffNo FROM Ghre_StudyRuleResult A LEFT JOIN Ghra_Staff B ON A.StaffId = B.StaffID WHERE A.StaffName IS NULL"; await Db.Ado.ExecuteCommandAsync(sql); } catch (Exception E) { //await Db.Ado.RollbackTranAsync(); await Db.Updateable().Where(x => x.Id == ruleId) .SetColumns(it => new Ghre_StudyRule() { Result = E.Message }) .ExecuteCommandAsync(); } return true; } public async Task StaffIn() { var rules = await Db.Queryable().Where(x => x.TrainType != DIC_TRAINING_STUDY_RULE_TRAIN_TYPE.Year && x.TrainType != DIC_TRAINING_STUDY_RULE_TRAIN_TYPE.Orientation).ToListAsync(); for (int j = 0; j < rules.Count; j++) { await GenerateStaffStudyRecord(Db, rules[j].Id); } } public async Task StaffIn2() { var dt = Db.GetDate(); var depts = new List(); depts = await GetDeptList(depts); var rules = await Db.Queryable().Where(x => x.TrainType != DIC_TRAINING_STUDY_RULE_TRAIN_TYPE.PreWork && x.TrainType != DIC_TRAINING_STUDY_RULE_TRAIN_TYPE.Orientation).ToListAsync(); for (int j = 0; j < rules.Count; j++) { var rule = rules[j]; var ruleId = rule.Id; var ZoneIds = new List(); var DeptIds = new List(); var TitleIds = new List(); var GradeIds = new List(); var JobIds = new List(); if (!rule.ZoneId.IsNull()) ZoneIds = JsonHelper.JsonToObj>(rule.ZoneId); if (!rule.DeptId.IsNull()) DeptIds = JsonHelper.JsonToObj>(rule.DeptId); if (!rule.TitleId.IsNull()) TitleIds = JsonHelper.JsonToObj>(rule.TitleId); if (!rule.GradeId.IsNull()) GradeIds = JsonHelper.JsonToObj>(rule.GradeId); if (!rule.JobId.IsNull()) JobIds = JsonHelper.JsonToObj>(rule.JobId); #region 处理部门是否含下阶 var deptIds = new List(); if (rule.IsDeptLower == true && DeptIds.Any()) { foreach (var dept in DeptIds) { var items = await GetDeptList(depts, dept); deptIds.AddRange(items.Select(x => x.DeptID).ToList()); } deptIds = deptIds.Distinct().ToList(); if (deptIds.Any()) DeptIds.AddRange(deptIds); } #endregion var staffs = await Db.Queryable() .Where(x => x.Indate != null && x.Indate.Value.Date == dt.Date) .WhereIF(ZoneIds.Any(), x => ZoneIds.Contains(x.ZoneID)) .WhereIF(DeptIds.Any(), x => DeptIds.Contains(x.DeptID)) .WhereIF(TitleIds.Any(), x => TitleIds.Contains(x.TitleID)) .WhereIF(GradeIds.Any(), x => GradeIds.Contains(x.GradeID)) .WhereIF(JobIds.Any(), x => JobIds.Contains(x.JobID)) .Select(x => new { x.StaffID, x.StaffEname, x.Indate, x.OutDate }) .ToListAsync(); if (!staffs.IsNull()) { if (staffs.Any()) { var snap = await Db.Queryable().FirstAsync(x => x.CourseId == rule.CourseId); var inserts = new List(); var insertExamStaffs = new List(); var insertResults = new List(); //var exam = await Db.Queryable() // .WhereIF(rule.CourseId != null, x => x.CourseId == rule.CourseId) // .WhereIF(rule.CourseSceneId != null, x => x.CourseSceneId == rule.CourseSceneId) // .FirstAsync(x => x.Status == Consts.DicExamStatus.RELEASED); var exam = await Db.Queryable() .Where(x => x.Status == Consts.DIC_EXAM_STATUS.RELEASED && ((x.DateType == Consts.DicExamDateType.EXAM_DATE && x.BeginTime.Value.Date <= DateTime.Now.Date && x.EndTime.Value.Date >= DateTime.Now.Date) || x.DateType == Consts.DicExamDateType.AFTER_HOW_LONG)) .WhereIF(!rule.CourseId.IsNull(), x => x.CourseId == rule.CourseId) .WhereIF(!rule.CourseSceneId.IsNull(), x => x.CourseSceneId == rule.CourseSceneId) .FirstAsync(); for (int i = 0; i < staffs.Count; i++) { var staff = staffs[i]; var record = await Db.Queryable() .Where(x => x.StudyRuleId != ruleId && x.StaffId == staff.StaffID) .WhereIF(!string.IsNullOrWhiteSpace(rule.Year), x => x.Year == rule.Year) .WhereIF(rule.CourseId != null, x => x.CourseId == rule.CourseId) .WhereIF(rule.CourseSceneId != null, x => x.CourseSceneId == rule.CourseSceneId) //.AS("Ghre_StudyRecord_V") .FirstAsync(); if (record is null) { inserts.Add(new Ghre_StudyRecord() { StaffId = staff.StaffID, ExamId = exam?.Id, CourseSnapId = snap?.Id, CourseId = rule.CourseId, CourseSceneId = rule.CourseSceneId, StudyRuleId = ruleId, JoinTime = dt, CourseBeginTime = dt.Date, CourseEndTime = dt.Date.AddMonths((rule.DeadlineMonth ?? snap?.ValidityPeriod) ?? 1), CourseType = rule.RuleType, CourseStatus = Consts.DIC_STUDY_RECORD_COURSE_STATUS_IN, StudyStatus = Consts.DIC_STUDY_RECORD_STUDY_STATUS.NO_JOIN, Year = rule.Year }); insertResults.Add(new Ghre_StudyRuleResult() { StaffId = staff.StaffID, StudyRuleId = ruleId, Status = "SUCCESS", RemarkSz = "生成成功" }); if (exam != null) if (!await Db.Queryable().AnyAsync(x => x.ExamId == exam.Id && x.StaffId == staff.StaffID)) insertExamStaffs.Add(new Ghre_ExamStaff() { ExamId = exam.Id, StudyRuleId = ruleId, StaffId = staff.StaffID, Source = "StudyRule" + rule.RuleType }); } else insertResults.Add(new Ghre_StudyRuleResult() { StaffId = staff.StaffID, StudyRuleId = ruleId, Status = "FAIL", RemarkSz = "生成失败,该课程学习记录已被其他规则生成!" }); } if (inserts.Any()) await Db.Insertable(inserts).ExecuteReturnSnowflakeIdListAsync(); if (insertResults.Any()) await Db.Insertable(insertResults).ExecuteReturnSnowflakeIdListAsync(); if (insertExamStaffs.Any()) await Db.Insertable(insertExamStaffs).ExecuteReturnSnowflakeIdListAsync(); } } } } #region 删除 // /// 删除指定ID的数据 /// /// 主键ID /// public override async Task DeleteById1(object id) { var companyCode = await QueryCompanyCode(); if (companyCode != "Viavi") { if (await Db.Queryable().AnyAsync(x => x.StudyRuleId == id.ObjToLong() && x.StudyStatus != Consts.DIC_STUDY_RECORD_STUDY_STATUS.NO_JOIN)) throw new Exception($"有学员已经学习,暂不可作废!"); } await Db.Updateable() .SetColumns(it => new Ghre_StudyRecord() { IsEnable = 0, UpdateTime = DateTime.Now, UpdateBy = App.User.ID }) .Where(it => it.StudyRuleId == id.ObjToLong()) .ExecuteCommandAsync(); return await base.DeleteById1(id); } /// /// 删除指定ID集合的数据(批量删除) /// /// 主键ID集合 /// public override async Task DeleteByIds1(long[] ids) { foreach (var id in ids) { if (await Db.Queryable().AnyAsync(x => x.StudyRuleId == id.ObjToLong() && x.StudyStatus != Consts.DIC_STUDY_RECORD_STUDY_STATUS.NO_JOIN)) throw new Exception($"有学员已经学习,暂不可作废!"); } return await base.DeleteByIds1(ids); } #endregion }