using Mapster; using Microsoft.IdentityModel.Tokens; using Serilog; using static Tiobon.Core.Model.Consts; namespace Tiobon.Core.Services; /// /// 培训需求 (服务) /// public class Ghre_RequestServices : BaseServices, IGhre_RequestServices { private readonly IBaseRepository _dal; public Ghre_RequestServices(ICaching caching, IBaseRepository dal) { this._dal = dal; base.BaseDal = dal; base._caching = caching; } public override async Task> QueryFilterPage(QueryBody filter, string condition, bool? IsEnable = true) { var sql = @"UPDATE A SET A.CourseName = B.CourseName FROM Ghre_Request A JOIN Ghre_Course B ON A.CourseId = B.Id AND (A.CourseName ! = B.CourseName OR A.CourseName IS NULL)"; await Db.Ado.ExecuteCommandAsync(sql); var result = await base.QueryFilterPage(filter, condition, IsEnable); //var courseIds = result.result.DT_TableDataT1.Where(x => x.CourseId != null).Select(x => x.CourseId).Distinct().ToList(); //var courses = await Db.Queryable().Where(x => courseIds.Contains(x.Id)).ToListAsync(); var deptIds = result.result.DT_TableDataT1.Where(x => x.DeptId != null).Select(x => x.DeptId).Distinct().ToList(); var depts = await Db.Queryable().Where(x => deptIds.Contains(x.DeptID)).ToListAsync(); var sponsorIds = result.result.DT_TableDataT1.Where(x => x.SponsorId != null).Select(x => x.SponsorId).Distinct().ToList(); var userIds = result.result.DT_TableDataT1.Where(x => x.RefuseUserId != null).Select(x => x.RefuseUserId).Distinct().ToList(); userIds.AddRange(result.result.DT_TableDataT1.Where(x => x.AgreeUserId != null).Select(x => x.AgreeUserId).Distinct()); result.result.DT_TableDataT1.ForEach(x => { string trainStaffId = x.TrainStaffId; if (!string.IsNullOrWhiteSpace(trainStaffId)) { x.TrainStaffIds = JsonHelper.JsonToObj>(trainStaffId); var TrainStaffIds = JsonHelper.JsonToObj>(trainStaffId); sponsorIds.AddRange(TrainStaffIds); } }); sponsorIds = sponsorIds.Distinct().ToList(); var staffs = await Db.Queryable().Where(x => sponsorIds.Contains(x.StaffID)).ToListAsync(); var users = await Db.Queryable().Where(x => userIds.Contains(x.UserId)).ToListAsync(); result.result.DT_TableDataT1.ForEach(async x => { x.CourseSourceLabel = await GetParaLabel("TrainingRequestCourseSource", x.CourseSource); x.RequestSourceLabel = await GetParaLabel("TrainingRequestRequestSource", x.RequestSource); x.TrainClassLabel = await GetParaLabel("TrainingRequestTrainClass", x.TrainClass); x.TrainLevelLabel = await GetParaLabel("TrainingRequestTrainLevel", x.TrainLevel); x.InOrOutLabel = await GetParaLabel("CourseInOrOut", x.InOrOut); x.TeacherClassLabel = await GetParaLabel("TrainingTeacherType", x.InOrOut); //if (x.CourseId != null) // x.CourseName = courses.Where(o => x.CourseId == o.Id).FirstOrDefault()?.CourseName; if (x.DeptId != null) x.DeptName = depts.Where(o => x.DeptId == o.DeptID).FirstOrDefault()?.DeptName; if (x.SponsorId != null) x.SponsorName = staffs.Where(o => x.SponsorId == o.StaffID).FirstOrDefault()?.StaffName; if (x.TrainStaffIds.IsNotEmptyOrNull()) x.TrainStaffNames = string.Join("、", staffs.Where(o => x.TrainStaffIds.Contains(o.StaffID)).Select(o => o.StaffName)); if (x.AgreeUserId != null) x.AgreeUserName = users.Where(o => x.AgreeUserId == o.UserId).FirstOrDefault()?.UserName; if (x.RefuseUserId != null) x.RefuseUserName = users.Where(o => x.RefuseUserId == o.UserId).FirstOrDefault()?.UserName; if (x.WorkState.IsNotEmptyOrNull()) { if (x.WorkState == 0) x.WorkStateLabel = "审批中"; if (x.WorkState == 1) x.WorkStateLabel = "审批通过"; } if (x.RequestNum.IsNotEmptyOrNull() && x.RequestNum > 0) if (x.TrainDays.IsNotEmptyOrNull() && x.TrainDays > 0) { var TotalTrainDays = x.TrainDays * x.RequestNum; x.TotalTrainDays = StringHelper.TrimDecimalString(TotalTrainDays); } }); return result; } public override async Task Add(InsertGhre_RequestInput entity) { entity.SponsorId = GetStaffId(); if (entity.TrainStaffIds.IsNotEmptyOrNull()) entity.TrainStaffId = JsonHelper.ObjToJson(entity.TrainStaffIds); entity.RequestNo = await GenerateContinuousSequence("Ghre_Request", "RequestNo", "R"); var id = await base.Add(entity); var sql = $"SELECT ISNULL(MAX(id)+1,1) FROM Ghre_Request WHERE Id !='{id}'"; var id1 = await Db.Ado.GetLongAsync(sql); sql = $"UPDATE Ghre_Request SET Id={id1} WHERE Id ='{id}'"; await Db.Ado.ExecuteCommandAsync(sql); return id1; } public override async Task Update(long Id, EditGhre_RequestInput entity) { if (entity.TrainStaffIds.IsNotEmptyOrNull()) entity.TrainStaffId = JsonHelper.ObjToJson(entity.TrainStaffIds); else entity.TrainStaffId = null; return await base.Update(Id, entity, null, ["Status"]); } public async Task> InsertByStatus(InsertGhre_RequestInput 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; else return ServiceResult.OprateFailed("发布成功!"); return data; } public override async Task> QueryForm(QueryForm body) { var result = await base.QueryForm(body); string trainStaffId = result.result.DT_TableDataT1[0].TrainStaffId; if (!string.IsNullOrWhiteSpace(trainStaffId)) result.result.DT_TableDataT1[0].TrainStaffIds = JsonHelper.JsonToObj>(trainStaffId); else result.result.DT_TableDataT1[0].TrainStaffIds = new List(); return result; } public async Task UpdateStatus(InsertGhre_RequestInput 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("执行成功!"); //if (status == Consts.DIC_COURSE_STATUS.RELEASED) // return ServiceResult.OprateSuccess("发布成功!"); //else if (status == Consts.DIC_COURSE_STATUS.DRAFT) // return ServiceResult.OprateSuccess("已启用成功,请进入草稿箱查看!"); //else // return ServiceResult.OprateSuccess("停用成功!"); } public async Task> QueryGroup(QueryBody filter, string type) { if (string.IsNullOrWhiteSpace(filter.orderBy)) filter.orderBy = "DeptName ASC"; if (filter.pageSize == 0) filter.pageSize = 10000; string conditions = "WHERE 1=1 "; foreach (JProperty jProperty in filter.jsonParam.Properties()) { var name = jProperty.Name; var value = jProperty.Value.ToString(); if (name == "page" || name == "pageSize") continue; if (name == "YearMonth") { if (value != null) { var jsonParam = JsonHelper.JsonToObj(value); var ids1 = JsonHelper.JsonToObj>(jsonParam.columnValue.ToString()); conditions += $" AND {name}>= '{ids1[0]}-01'"; conditions += $" AND {name}<= '{ids1[1]}-01'"; } continue; } if (name == "Year") { if (value != null) { var jsonParam = JsonHelper.JsonToObj(value); var ids1 = JsonHelper.JsonToObj>(jsonParam.columnValue.ToString()); conditions += $" AND {name}>= '{ids1[0]}'"; conditions += $" AND {name}<= '{ids1[1]}'"; } continue; } if (!string.IsNullOrWhiteSpace(value)) conditions = DealConditions(conditions, name, value); } string sql = @$"SELECT * FROM (SELECT sum (RequestNum) RequestNum, sum (TotalBudget) TotalBudget, CourseName, YearMonth1 YearMonthLabel, DeptName, TrainClass, TrainLevel, InOrOut FROM (SELECT A.Id, A.CourseName, SUBSTRING (A.YearMonth, 1, 4) + '年' YearMonth1, -- CAST (A.YearMonth + '-01' AS DATE) YearMonthDate, CONVERT (INT, SUBSTRING (A.YearMonth, 1, 4)) Year, ISNULL (B.DeptName, D.DeptName) DeptName, ISNULL (B.DeptId, D.DeptId) DeptId, ISNULL (A.RequestNum, 1) RequestNum, A.TrainClass, A.CourseSource, A.RequestSource, TrainLevel, A.InOrOut, ISNULL (A.TotalBudget, 0) TotalBudget FROM Ghre_Request A LEFT JOIN Ghro_Dept B ON A.DeptId = B.DeptID LEFT JOIN Ghra_Staff C ON A.ApplicantId = C.StaffID LEFT JOIN Ghro_Dept D ON C.DeptID = D.DeptID WHERE A.IsEnable = 1) A {conditions} GROUP BY CourseName, YearMonth1, DeptName, TrainClass, TrainLevel, InOrOut) A ORDER BY {filter.orderBy}"; if (type == "Month") sql = @$"SELECT * FROM (SELECT sum (RequestNum) RequestNum, sum (TotalBudget) TotalBudget, CourseName, YearMonth1 YearMonthLabel, DeptName, TrainClass, TrainLevel, InOrOut FROM (SELECT A.Id, A.CourseName, SUBSTRING (A.YearMonth, 1, 4) + '年' + SUBSTRING (A.YearMonth, 6, 2) + '月' YearMonth1, CAST (A.YearMonth + '-01' AS DATE) YearMonth, ISNULL (B.DeptName, D.DeptName) DeptName, ISNULL (B.DeptId, D.DeptId) DeptId, ISNULL (A.RequestNum, 1) RequestNum, A.TrainClass, A.CourseSource, TrainLevel, A.RequestSource, A.InOrOut, ISNULL (A.TotalBudget, 0) TotalBudget FROM Ghre_Request A LEFT JOIN Ghro_Dept B ON A.DeptId = B.DeptID LEFT JOIN Ghra_Staff C ON A.ApplicantId = C.StaffID LEFT JOIN Ghro_Dept D ON C.DeptID = D.DeptID WHERE A.IsEnable = 1) A {conditions} GROUP BY CourseName, YearMonth1, DeptName, TrainClass, TrainLevel, InOrOut) A ORDER BY {filter.orderBy}"; var result = await Db.Ado.SqlQueryAsync(sql); result.ForEach(async x => { x.TrainClassLabel = await GetParaLabel("TrainingRequestTrainClass", x.TrainClass); x.TrainLevelLabel = await GetParaLabel("TrainingRequestTrainLevel", x.TrainLevel); x.InOrOutLabel = await GetParaLabel("CourseInOrOut", x.InOrOut); x.TeacherClassLabel = await GetParaLabel("TrainingTeacherType", x.InOrOut); }); //return ServiceResult>.OprateSuccess("查询成功", result); return new ServicePageResult(filter.pageNum, result.Count, filter.pageSize, result); } #region 牛尾培训需求同步 public async Task Ushio_Sync() { Log.Information($"【牛尾培训需求同步】开始同步"); try { string sql = @"SELECT *, TrainStaffId TrainStaffId1 FROM [120.26.205.42].[GhrUshio].[dbo].Ghrz_Ushio_TrainRequestApply_GHR50_V WHERE RequestNo NOT IN (SELECT RequestNo FROM Ghre_Request)"; var dt = await Db.Ado.GetDataTableAsync(sql); var list = Db.Utilities.DataTableToList(dt); Log.Information($"【牛尾培训需求同步】查询到待同步{list.Count}条数据"); for (int i = 0; i < list.Count; i++) { Log.Information($"【牛尾培训需求同步】同步队列{i + 1}/{list.Count}"); var insert = Mapper.Map(list[i]).ToANew(); if (await base.AnyAsync(x => x.RequestNo == insert.RequestNo)) continue; if (list[i].DeptNo.IsNotEmptyOrNull()) insert.DeptId = (await Db.Queryable().Where(x => x.DeptNo == list[i].DeptNo).FirstAsync())?.DeptID; if (list[i].SponsorNo.IsNotEmptyOrNull()) insert.SponsorId = (await Db.Queryable().Where(x => x.StaffNo == list[i].SponsorNo).FirstAsync())?.StaffID; if (list[i].TrainStaffId1.IsNotEmptyOrNull()) { var staffNos = list[i].TrainStaffId1.Split(',').ToList(); if (staffNos.Any()) { var staffIds = await Db.Queryable().Where(x => staffNos.Contains(x.StaffNo)).Select(x => x.StaffID).ToListAsync(); insert.TrainStaffId = JsonHelper.ObjToJson(staffIds); } } insert.WorkNo = insert.RequestNo; if (insert.CourseId == 0) insert.CourseId = null; #region 根据参数 处理数据默认状态 var config = await Db.Queryable().FirstAsync(x => x.ConfigCode == "ESS_Request_Apply_Status"); if (config != null) insert.Status = config.ConfigValue; #endregion await base.Add(insert); } } catch (Exception E) { Log.Information($"【牛尾培训需求同步】发生错误:{E.Message}"); Log.Information($"【牛尾培训需求同步】发生错误行:{E.StackTrace}"); } Log.Information($"【牛尾培训需求同步】结束同步"); } #endregion }