using static Tiobon.Core.Model.Consts; namespace Tiobon.Core.Services; /// /// 培训讲师异动 (服务) /// public class Ghre_TeacherChangeServices : BaseServices, IGhre_TeacherChangeServices { private readonly IBaseRepository _dal; private IGhre_AttachmentServices _ghre_AttachmentServices; private IGhre_TeacherChangeAttachmentServices _ghre_TeacherChangeAttachmentServices; private IGhre_TeacherAttachmentServices _ghre_TeacherAttachmentServices; public Ghre_TeacherChangeServices(ICaching caching, IGhre_AttachmentServices ghre_AttachmentServices, IGhre_TeacherChangeAttachmentServices ghre_TeacherChangeAttachmentServices, IGhre_TeacherAttachmentServices ghre_TeacherAttachmentServices, IBaseRepository dal) { this._dal = dal; base.BaseDal = dal; base._caching = caching; _ghre_AttachmentServices = ghre_AttachmentServices; _ghre_TeacherChangeAttachmentServices = ghre_TeacherChangeAttachmentServices; _ghre_TeacherAttachmentServices = ghre_TeacherAttachmentServices; } 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 sql = @$"SELECT * FROM (SELECT A.*, ISNULL ((SELECT CASE WHEN {filter.langId} = 1 THEN UserName ELSE UserEname END FROM Ghrs_User B WHERE B.UserId = A.CreateBy), '') CreateDataInfo, ISNULL ((SELECT CASE WHEN {filter.langId} = 1 THEN UserName ELSE UserEname END FROM Ghrs_User B WHERE B.UserId = A.UpdateBy), '') UpdateDataInfo, ISNULL (A.UpdateTime, A.CreateTime) CreateTime1, ISNULL (C.SchoolName, D.DeptName) DeptOrSchoolName FROM Ghre_TeacherChange A LEFT JOIN Ghre_Teacher B ON A.TeacherId = B.Id LEFT JOIN Ghre_School C ON B.SchoolId = C.Id LEFT JOIN Ghro_Dept D ON B.DeptID = D.DeptID) A"; string conditions = " 1=1 "; 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 (!string.IsNullOrWhiteSpace(value)) conditions = DealConditions(condition, name, value); } if (IsEnable == true) sql += " WHERE IsEnable = 1"; else if (IsEnable == false) sql += " WHERE IsEnable = 0"; conditions += $" AND dbo.FUserDataBelongPriv ({App.User.ID}, DataBelongID, NULL) = 1"; if (!string.IsNullOrWhiteSpace(condition)) conditions += " AND " + condition; int total = 0; var data = Db.SqlQueryable(sql) .Where(conditions) .OrderBy(filter.orderBy) .ToPageList(filter.pageNum, filter.pageSize, ref total); var teacherIds = data.Where(x => x.TeacherId != null).Select(x => x.TeacherId).Distinct().ToList(); var teachers = await Db.Queryable().Where(x => teacherIds.Contains(x.Id)).Select(x => new { x.Id, x.SchoolId, x.DeptID, x.TeacherType, TeacherName = x.TeacherName + " (" + x.TeacherNo + ")" }).ToListAsync(); //var schoolIds = teachers.Where(x => x.SchoolId != null).Select(x => x.SchoolId.Value).Distinct().ToList(); //var deptIDs = teachers.Where(x => x.DeptID != null).Select(x => x.DeptID).Distinct().ToList(); //var depts = await Db.Queryable().Where(x => deptIDs.Contains(x.DeptID)).Select(x => new { x.DeptID, x.DeptName }).ToListAsync(); //var schools = await Db.Queryable().Where(x => schoolIds.Contains(x.Id)).Select(x => new { x.Id, x.SchoolName }).ToListAsync(); data.ForEach(async x => { var teacher = teachers.FirstOrDefault(o => o.Id == x.TeacherId); x.TeacherTypeLabel = await GetParaLabel("TrainingTeacherType", x.TeacherType); x.TeacherLevelLabel = await GetParaLabel("TrainingTeacherLevel", x.TeacherLevel); x.OriginTeacherLevelLabel = await GetParaLabel("TrainingTeacherLevel", x.OriginTeacherLevel); x.ChangeTypeLabel = await GetParaLabel("TrainingTeacherChangeType", x.ChangeType); x.OriginChangeTypeLabel = await GetParaLabel("TrainingTeacherChangeType", x.OriginChangeType); //x.DeptOrSchoolName = x.TeacherType == "Out" ? schools.FirstOrDefault(o => o.Id == teacher?.SchoolId)?.SchoolName : depts.FirstOrDefault(o => o.DeptID == teacher?.DeptID)?.DeptName; x.TeacherName = teacher?.TeacherName; x.OriginChangeDate1 = DateTimeHelper.ConvertToDayString(x.OriginChangeDate); x.ChangeDate1 = DateTimeHelper.ConvertToDayString(x.ChangeDate); x.DataBelongName = await GetDataBelongName(x.DataBelongID); }); return new ServicePageResult(filter.pageNum, total, filter.pageSize, data); } public override async Task> QueryForm(QueryForm body) { var data = await base.QueryForm(body); var entitys = data.result.DT_TableDataT1; var ids = entitys.Select(x => x.Id).ToList(); var teacherAttachments = await _ghre_TeacherChangeAttachmentServices.QueryDto(x => ids.Contains(x.TeacherChangeId.Value)); var ids1 = teacherAttachments.Select(x => x.Id.ToString()).ToList(); var attachments = await _ghre_AttachmentServices.QueryDto(x => ids1.Contains(x.TableName)); teacherAttachments.ForEach(x => { x.Attachments = attachments.Where(o => o.TableName == x.Id.ToString()).ToList(); }); entitys.ForEach(x => { x.TeacherAttachments = teacherAttachments.Where(o => o.TeacherChangeId == x.Id).ToList(); }); data.result.DT_TableDataT1 = entitys; return data; } public override async Task Add(InsertGhre_TeacherChangeInput entity) { #region 校验 当天是否能发起 if (await Db.Queryable().AnyAsync(x => x.TeacherId == entity.TeacherId && ((x.Status == "Wait") || (x.Status != "Wait" && x.WorkState != 2)))) throw new Exception("讲师当天只能发起一笔有效异动!"); #endregion var teacher = await Db.Queryable().FirstAsync(x => x.Id == entity.TeacherId); entity.SchoolId = teacher.SchoolId; entity.DeptID = teacher.DeptID; entity.SponsorId = GetStaffId(); var id = await base.Add(entity); var sql = $"SELECT ISNULL(MAX(id)+1,1) FROM Ghre_TeacherChange WHERE Id !='{id}'"; var id1 = await Db.Ado.GetLongAsync(sql); sql = $"UPDATE Ghre_TeacherChange SET Id={id1} WHERE Id ='{id}'"; await Db.Ado.ExecuteCommandAsync(sql); id = id1; if (entity.TeacherAttachments != null && entity.TeacherAttachments.Any()) { for (int i = 0; i < entity.TeacherAttachments.Count; i++) { var insert = entity.TeacherAttachments[i]; insert.TeacherChangeId = id; var teacherAttachmentId = await _ghre_TeacherChangeAttachmentServices.Add(insert); if (insert.Attachments != null && insert.Attachments.Any()) for (int j = 0; j < insert.Attachments.Count; j++) { await Db.Updateable() .SetColumns(it => new Ghre_Attachment() { TableName = teacherAttachmentId.ToString(), UpdateTime = DateTime.Now }) .Where(it => it.RelativePath == insert.Attachments[j].RelativePath) .ExecuteCommandAsync(); } } } return id; } public override async Task Update(long Id, EditGhre_TeacherChangeInput editModel) { if (editModel.TeacherType == "In") { editModel.SchoolId = null; var staff = await Db.Queryable().FirstAsync(x => x.StaffID == editModel.StaffId); if (staff != null) { editModel.TeacherNo = staff.StaffNo; editModel.TeacherName = staff.StaffName; } } else { editModel.DeptID = null; editModel.StaffId = null; } var result = await base.Update(Id, editModel, null, ["Status"]); await _ghre_TeacherChangeAttachmentServices.Delete(x => x.TeacherChangeId == Id); if (editModel.TeacherAttachments != null && editModel.TeacherAttachments.Any()) { for (int i = 0; i < editModel.TeacherAttachments.Count; i++) { var insert = editModel.TeacherAttachments[i]; insert.TeacherId = Id; var TeacherAttachmentId = await _ghre_TeacherChangeAttachmentServices.Add(Mapper.Map(insert).ToANew()); if (insert.Attachments != null && insert.Attachments.Any()) for (int j = 0; j < insert.Attachments.Count; j++) { await Db.Updateable() .SetColumns(it => new Ghre_Attachment() { TableName = TeacherAttachmentId.ToString(), UpdateTime = DateTime.Now }) .Where(it => it.RelativePath == insert.Attachments[j].RelativePath) .ExecuteCommandAsync(); } } } #region 状态是Wait 直接会写至主数据 var change = await base.QueryById(Id); if (change.Status == "Wait") { var teacher = Mapper.Map(editModel).ToANew(); teacher.Id = editModel.TeacherId.Value; await Db.Updateable(teacher).UpdateColumns(it => new { it.TeacherLevel, it.Price, it.SkillPoints }).ExecuteCommandAsync(); var teacherAttachmentIds = await Db.Queryable().Where(x => x.TeacherId == editModel.TeacherId).Select(x => x.Id).ToListAsync(); if (teacherAttachmentIds.Any()) await Db.Updateable() .SetColumns(it => new Ghre_TeacherAttachment() { IsEnable = 0 }) .Where(it => teacherAttachmentIds.Contains(it.Id)) .ExecuteCommandAsync(); if (editModel.TeacherAttachments != null && editModel.TeacherAttachments.Any()) { for (int i = 0; i < editModel.TeacherAttachments.Count; i++) { var insert = Mapper.Map(editModel.TeacherAttachments[i]).ToANew(); ; insert.TeacherId = teacher.Id; var teacherAttachmentId = await _ghre_TeacherAttachmentServices.Add(insert); if (editModel.TeacherAttachments[i].Attachments != null && editModel.TeacherAttachments[i].Attachments.Any()) for (int j = 0; j < editModel.TeacherAttachments[i].Attachments.Count; j++) { var attachment = await Db.Queryable().FirstAsync(x => x.RelativePath == insert.Attachments[j].RelativePath); attachment.TableName = teacherAttachmentId.ToString(); await Db.Insertable(attachment).ExecuteReturnSnowflakeIdAsync(); } } } } #endregion return result; } public async Task> InsertByStatus(InsertGhre_TeacherChangeInput insertModel, string status) { var data = ServiceResult.OprateSuccess("新增成功", 0); insertModel.Status = status; var id = await Add(insertModel); data.Success = id > 0; if (data.Success) { data.Data = id; #region 状态是Wait 直接会写至主数据 if (status == "Wait") { var teacher = Mapper.Map(insertModel).ToANew(); teacher.Id = insertModel.TeacherId.Value; await Db.Updateable(teacher).UpdateColumns(it => new { it.TeacherLevel, it.Price, it.SkillPoints }).ExecuteCommandAsync(); var teacherAttachmentIds = await Db.Queryable().Where(x => x.TeacherId == insertModel.TeacherId).Select(x => x.Id).ToListAsync(); if (teacherAttachmentIds.Any()) await Db.Updateable() .SetColumns(it => new Ghre_TeacherAttachment() { IsEnable = 0 }) .Where(it => teacherAttachmentIds.Contains(it.Id)) .ExecuteCommandAsync(); if (insertModel.TeacherAttachments != null && insertModel.TeacherAttachments.Any()) { for (int i = 0; i < insertModel.TeacherAttachments.Count; i++) { var insert = Mapper.Map(insertModel.TeacherAttachments[i]).ToANew(); ; insert.TeacherId = teacher.Id; var teacherAttachmentId = await _ghre_TeacherAttachmentServices.Add(insert); if (insertModel.TeacherAttachments[i].Attachments != null && insertModel.TeacherAttachments[i].Attachments.Any()) for (int j = 0; j < insertModel.TeacherAttachments[i].Attachments.Count; j++) { var attachment = await Db.Queryable().FirstAsync(x => x.RelativePath == insert.Attachments[j].RelativePath); attachment.TableName = teacherAttachmentId.ToString(); await Db.Insertable(attachment).ExecuteReturnSnowflakeIdAsync(); } } } } #endregion } else return ServiceResult.OprateFailed("发布成功!"); return data; } public async Task UpdateStatus(InsertGhre_TeacherChangeInput input, string status) { HttpRequest request = UserContext.Context.Request; var api = request.Path.ObjToString().TrimEnd('/').ToLower(); var ip = GetUserIp(UserContext.Context); var entities = new List(); foreach (var id in input.Ids) { if (!BaseDal.Any(id)) continue; var entity = await BaseDal.QueryById(id); switch (status) { case DIC_REQUEST_STATUS.Active: entity.AgreeReason = input.Reason; entity.AgreeTime = DateTime.Now; entity.AgreeUserId = App.User.ID; break; case DIC_REQUEST_STATUS.Temporary: entity.RefuseReason = input.Reason; entity.RefuseTime = DateTime.Now; entity.RefuseUserId = App.User.ID; break; } entity.UpdateIP = ip; entity.UpdateProg = api; entity.Status = status; entities.Add(entity); } var result = await BaseDal.Update(entities); return ServiceResult.OprateSuccess("执行成功!"); } public async Task> QueryLast(int teacherId) { var change = new Ghre_TeacherChangeDto(); var change1 = await Db.Queryable().OrderByDescending(x => x.CreateTime).FirstAsync(x => x.TeacherId == teacherId && (x.Status == "Active" || x.Status == "Wait")); if (change1 != null) { change = Mapper.Map(change1).ToANew(); change.OriginChangeDate = change.ChangeDate; change.OriginChangeType = change.ChangeType; change.OriginPrice = change.Price; change.OriginSkillPoints = change.SkillPoints; change.OriginTeacherLevel = change.TeacherLevel; change.ChangeDate = null; change.ChangeType = null; change.Price = null; change.SkillPoints = null; change.TeacherLevel = null; change.RemarkSz = null; change.DeptOrSchoolName = change.TeacherType == "Out" ? (await Db.Queryable().FirstAsync(o => o.Id == change.SchoolId))?.SchoolName : (await Db.Queryable().FirstAsync(o => o.DeptID == change.DeptID))?.DeptName; var teacherAttachments = await Db.Queryable().Where(x => x.TeacherChangeId == change.Id).ToListAsync(); change.TeacherAttachments = Mapper.Map(teacherAttachments).ToANew>(); var ids1 = teacherAttachments.Select(x => x.Id.ToString()).ToList(); var attachments = await _ghre_AttachmentServices.QueryDto(x => ids1.Contains(x.TableName)); change.TeacherAttachments.ForEach(x => { x.Attachments = attachments.Where(o => o.TableName == x.Id.ToString()).ToList(); }); } else { var teacher = await Db.Queryable().FirstAsync(x => x.Id == teacherId); if (teacher != null) { change.TeacherType = teacher.TeacherType; change.OriginTeacherLevel = teacher.TeacherLevel; change.OriginPrice = teacher.Price; change.OriginSkillPoints = teacher.SkillPoints; change.SchoolId = teacher.SchoolId; change.DeptID = teacher.DeptID; change.DeptOrSchoolName = change.OriginTeacherLevel == "Out" ? (await Db.Queryable().FirstAsync(o => o.Id == change.SchoolId))?.SchoolName : (await Db.Queryable().FirstAsync(o => o.DeptID == change.DeptID))?.DeptName; change.PhotoUrl = teacher.PhotoUrl; var teacherAttachments = await Db.Queryable().Where(x => x.TeacherId == teacher.Id).ToListAsync(); change.TeacherAttachments = Mapper.Map(teacherAttachments).ToANew>(); var ids1 = teacherAttachments.Select(x => x.Id.ToString()).ToList(); var attachments = await _ghre_AttachmentServices.QueryDto(x => ids1.Contains(x.TableName)); change.TeacherAttachments.ForEach(x => { x.Attachments = attachments.Where(o => o.TableName == x.Id.ToString()).ToList(); }); } } return ServiceResult.OprateSuccess("执行成功!", change); } }