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); x.TrainCategory = await GetParaLabel("TrainingCategory", x.TrainCategory); //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"); if (entity.CourseSource != "Dept") entity.RequestNum = null; if (entity.RequestSource == "Dept") { if (await QueryCompanyCode() == "Ushio") { if (entity.TrainStaffIds.Any() && entity.TrainStaffIds.Count != entity.RequestNum) throw new Exception("培训对象数量须和需求人数保持一致!"); } else { if (entity.TrainStaffIds.Count != entity.RequestNum) throw new Exception("培训对象数量须和需求人数保持一致!"); } } else { entity.RequestNum = 1; entity.TrainStaffId = $"[{entity.ApplicantId}]"; } 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; if (entity.RequestSource == "Dept") { if (await QueryCompanyCode() == "Ushio") { if (entity.TrainStaffIds.Any() && entity.TrainStaffIds.Count != entity.RequestNum) throw new Exception("培训对象数量须和需求人数保持一致!"); } else { if (entity.TrainStaffIds.Count != entity.RequestNum) throw new Exception("培训对象数量须和需求人数保持一致!"); } } else { entity.RequestNum = 1; entity.TrainStaffId = $"[{entity.ApplicantId}]"; } 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 Excel导入 public async Task<(List>, int)> ValidImportExcel(ISqlSugarClient Db, List columns, DataTable dt) { var CompanyCode = await QueryCompanyCode(); Type entityType = typeof(Ghre_Request); var properties = entityType.GetGenericProperties(); int ErrorCount = 0; var dictList = new List>(); for (int i = 0; i < dt.Rows.Count; i++) { var dict = ReportHelper.GetDefaultDict(); var comments = new List(); for (int j = 0; j < columns.Count; j++) { var x = columns[j]; if (!dt.Columns.Contains(x.label)) comments.Add("未查询到【" + x.label + "】列!"); else { var value = dt.Rows[i][x.label].ToString(); var courseSource = dt.Rows[i]["课程来源"].ToString(); if (x.label == "需求来源" && value == "部门需求") { var RequestNum = dt.Rows[i]["需求人数"].ObjToInt(); var TrainStaffIds1 = dt.Rows[i]["培训对象"].ToString(); TrainStaffIds1 = TrainStaffIds1.Replace(",", ","); TrainStaffIds1 = TrainStaffIds1.Replace(";", ","); TrainStaffIds1 = TrainStaffIds1.Replace(";", ","); var value1 = value.Split(',').ToList(); if (CompanyCode == "Ushio") { if (value1.Any() && value1.Count != RequestNum) throw new Exception("培训对象数量须和需求人数保持一致!!"); } else { if (value1.Count != RequestNum) throw new Exception("培训对象数量须和需求人数保持一致!!"); } } if (x.label == "需求课程" || x.label == "新增课程") { if (x.label == "需求课程" && courseSource == "已有课程" && value.IsNullOrEmpty()) { comments.Add(x.label + "不能为空!"); dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a)); } else if (x.label == "新增课程" && courseSource == "新增课程" && value.IsNullOrEmpty()) { comments.Add(x.label + "不能为空!"); dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a)); } } else if (x.required == "true" && value.IsNullOrEmpty()) { comments.Add(x.label + "不能为空!"); dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a)); } if (x.dataSourceType.IsNullOrEmpty() && value.IsNotEmptyOrNull()) { if (x.dataType == "int" || x.dataType == "decimal") { try { Convert.ToDecimal(value); } catch (Exception) { comments.Add(x.label + "无效的数字类型!"); } } else if (x.dataType == "date") { try { Convert.ToDateTime(value); } catch (Exception) { comments.Add(x.label + "无效的日期类型!"); } } } if (value.IsNotEmptyOrNull()) { if (x.field == "TrainStaffIds") { value = value.Replace(",", ","); value = value.Replace(";", ","); value = value.Replace(";", ","); var value1 = value.Split(',').ToList(); var ids = await Db.Queryable().Where(o => value1.Contains(o.StaffName) || value1.Contains(o.StaffNo) || value1.Contains(o.StaffEname)).Select(x => x.StaffID).ToListAsync(); dict.Add("TrainStaffId", JsonHelper.ObjToJson(ids)); } else { if (x.elementType == "Switch") value = value == "是" ? "true" : "false"; if (x.dataSourceId.IsNotEmptyOrNull() && x.dataSourceType.IsNotEmptyOrNull() && !x.dataSource.StartsWith("OrgTreeWith") && !x.dataSource.StartsWith("StaffWith")) { if (x.dataSourceType == "CommonList") { var commonSql = await Db.Queryable().Where(o => o.ListCommonSqlId == x.dataSourceId).FirstAsync(); if (commonSql != null) { string sql = @$"SELECT [value] FROM ({commonSql.SelectSql}) A WHERE label = '{value}'"; sql = sql.Replace("{@LangID}", "1"); sql = sql.Replace("{@UserID}", App.User.ID.ObjToString()); sql = sql.Replace("{@KeyWords}", null); var id2 = await Db.Ado.GetLongAsync(sql); if (properties.Any(o => o.Name == x.field)) dict.Add(x.field, id2); } } else if (x.dataSourceType == "ParaDetailNo") { var sql = @$"SELECT ParaDetailNo FROM Ghrs_ParaDetail WHERE ParaMasterId IN (SELECT ParaMasterId FROM Ghrs_ParaMaster WHERE ParaMasterId = {x.dataSourceId.ObjToInt()}) AND IsEnable = 1 AND ParaDetailName = '{value}'"; var id2 = await Db.Ado.GetStringAsync(sql); if (properties.Any(o => o.Name == x.field)) dict.Add(x.field, id2); } } else if (x.dataSource == "OrgTreeWithPriv") { string sql = @$"SELECT DeptID FROM Ghro_Dept WHERE DeptName = '{value}' OR DeptNo = '{value}' OR DeptEname = '{value}'"; var id2 = await Db.Ado.GetLongAsync(sql); if (properties.Any(o => o.Name == x.field)) dict.Add(x.field, id2); } else if (x.dataSource == "StaffWithoutPriv") { string sql = @$"SELECT StaffID FROM Ghra_Staff WHERE StaffName = '{value}' OR StaffNo = '{value}' OR StaffEname = '{value}'"; var id2 = await Db.Ado.GetLongAsync(sql); if (properties.Any(o => o.Name == x.field)) dict.Add(x.field, id2); } else { if (properties.Any(o => o.Name == x.field)) dict.Add(x.field, value); } } } } } if (comments.Any()) { dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a)); ErrorCount++; continue; } else dictList.Add(dict); } return (dictList, ErrorCount); } public override async Task> ImportExcel(IFormFile file, string menuName = null, long? MasterId = null) { var data = new ExcelData(); var (path, filepath) = await ReportHelper.GetImportFilePath(file, menuName); var id1 = SnowFlakeSingle.instance.getID(); string errorFileName = path + SnowFlakeSingle.instance.getID() + FileHelper.GetPostfixStr(filepath); var dt = ReportHelper.ReadImportExcel(filepath); var columns = await QueryExportColumn(menuName); var (dictList, errorCount) = await ValidImportExcel(Db, columns, dt); Type entityType = typeof(Ghre_Request); var properties = entityType.GetGenericProperties(); if (errorCount > 0) { NPOIHelper.ExportExcel(dt, null, "导入数据", FileHelper.GetPhysicsPath() + errorFileName); data.filePath = "/Advanced" + errorFileName; data.ErrorCount = errorCount; } else { await Db.Insertable(dictList).AS(entityType.GetEntityTableName()).ExecuteCommandAsync(); data.SuccessCount = dictList.Count; } return ServiceResult.OprateSuccess("导入成功!", data); } #endregion #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 WHERE IsEnable = 1) AND EnableYN = 'Y'"; 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 var inserts = new List(); var yearMonths = list[i].YearMonth.Split(',').ToList(); if (yearMonths.Count > 1) { yearMonths.ForEach(x => { var insert1 = Mapper.Map(insert).ToANew(); insert1.YearMonth = x; inserts.Add(insert1); }); await base.Add(inserts); } else await base.Add(insert); } Log.Information($"【牛尾培训需求同步】查询到待同步{list.Count}条作废数据"); sql = @"SELECT *, TrainStaffId TrainStaffId1 FROM [120.26.205.42].[GhrUshio].[dbo].Ghrz_Ushio_TrainRequestApply_GHR50_V WHERE RequestNo IN (SELECT RequestNo FROM Ghre_Request WHERE IsEnable = 1) AND EnableYN = 'N'"; dt = await Db.Ado.GetDataTableAsync(sql); list = Db.Utilities.DataTableToList(dt); Log.Information($"【牛尾培训需求同步】查询到待同步{list.Count}条数据"); for (int i = 0; i < list.Count; i++) { Log.Information($"【牛尾培训需求同步】同步队列{i + 1}/{list.Count}"); await Db.Updateable() .SetColumns(it => new Ghre_Request() { IsEnable = 0 }) .Where(it => it.RequestNo == list[i].RequestNo) .ExecuteCommandAsync(); } #region 同步需求数据 sql = @"INSERT INTO [120.26.205.42].[GhrUshio].[dbo].Ghre_GHR50Request ( RequestID, RequestSource, DeptName, StaffName, YearMonth, CourseID, CourseName, TrainDays, RequestNum, IsEnable, CreateBy, CreateDate, CreateProg, DeptNo, StaffNo, LastUpdateDate,TrainStaffId,TrainClass,InOrOut) SELECT A.Id, A.RequestSource, c.DeptName, D.StaffName, A.YearMonth, A.CourseId, isnull (A.CourseName, e.CourseName) CourseName, A.TrainDays, A.RequestNum, A.IsEnable, A.CreateBy, A.CreateTime, '', c.DeptNo, d.StaffNo, isnull (A.UpdateTime, A.CreateTime), STUFF(( SELECT ',' + S.StaffNo FROM OPENJSON(A.TrainStaffId) WITH (TrainStaffId INT '$') AS JsonData INNER JOIN Ghra_Staff S ON JsonData.TrainStaffId = S.StaffID FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS StaffNames,A.TrainClass,A.InOrOut FROM Ghre_Request A LEFT JOIN [120.26.205.42].[GhrUshio].[dbo].Ghre_GHR50Request B ON B.RequestID = A.Id LEFT JOIN Ghro_Dept C ON a.DeptId = c.DeptID LEFT JOIN Ghra_Staff D ON a.ApplicantId = D.StaffID LEFT JOIN Ghre_Course E ON a.CourseId = E.Id WHERE A.TrainClass='Temporary' AND A.WorkNo IS NULL AND B.RequestID IS NULL; delete from [120.26.205.42].[GhrUshio].[dbo].Ghre_GHR50Plan; INSERT INTO [120.26.205.42].[GhrUshio].[dbo].Ghre_GHR50Plan (PlanID, IsEnable, CreateBy, CreateDate, LastUpdateDate, CreateProg, DeptNo, --部门编号 DeptName, --部门名称 TrainYear, --年份 TrainMonth, --计划实施月份 CourseID, --课程ID CourseName, --课程名称 TrainDays, --培训天数 TrainStaffId, --培训对象 工号拼接 TrainNum --培训人数 ) SELECT A.Id, 1, A.CreateBy, getdate(), getdate(), '', C.DeptNo, C.DeptName, A.[Year], A.Month, A.CourseId, ISNULL (E.CourseName, A.CourseName), A.TrainDays, STUFF(( SELECT ',' + S.StaffNo FROM OPENJSON(A.StaffIds) WITH (TrainStaffId INT '$') AS JsonData INNER JOIN Ghra_Staff S ON JsonData.TrainStaffId = S.StaffID FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS StaffNames, A.TrainNum FROM Ghre_Plan A LEFT JOIN [120.26.205.42].[GhrUshio].[dbo].Ghre_GHR50Plan B ON B.PlanID = A.Id LEFT JOIN Ghro_Dept C ON a.DeptId = c.DeptID LEFT JOIN Ghre_Course E ON a.CourseId = E.Id WHERE A.IsEnable = 1 and (A.Status ='Active' OR A.Status ='Wait') AND B.PlanID IS NULL; UPDATE A SET A.IsEnable = B.IsEnable,A.LastUpdateDate=isnull (B.UpdateTime, B.CreateTime) FROM [120.26.205.42].[GhrUshio].[dbo].Ghre_GHR50Request A JOIN Ghre_Request B ON a.RequestID = B.Id WHERE B.IsEnable ! = A.IsEnable OR isnull (B.UpdateTime, B.CreateTime) ! = A.LastUpdateDate; UPDATE A SET A.IsEnable = B.IsEnable,A.LastUpdateDate=isnull (B.UpdateTime, B.CreateTime) FROM [120.26.205.42].[GhrUshio].[dbo].Ghre_GHR50Plan A JOIN Ghre_Plan B ON a.PlanID = B.Id WHERE B.IsEnable ! = A.IsEnable OR isnull (B.UpdateTime, B.CreateTime) ! = A.LastUpdateDate"; await Db.Ado.ExecuteCommandAsync(sql); #endregion } catch (Exception E) { Log.Information($"【牛尾培训需求同步】发生错误:{E.Message}"); Log.Information($"【牛尾培训需求同步】发生错误行:{E.StackTrace}"); } Log.Information($"【牛尾培训需求同步】结束同步"); } #endregion #region Excel导出 public async Task> ExportGroupExcel(QueryExport body, string type) { QueryBody filter = new QueryBody(); filter.pageNum = 1; filter.pageSize = 1000000; filter.jsonParam = body.jsonParam; filter.langId = body.langId; filter.menuName = body.menuName; var condition = "1=1"; if (body.exportSet.SelectRowKeys != null && body.exportSet.SelectRowKeys.Any()) condition += $" AND Id IN({string.Join(",", body.exportSet.SelectRowKeys)})"; var data = await QueryGroup(filter, type); string sql = $@"SELECT * FROM Ghrs_PageSettingQuery WHERE IsEnable = 1 AND PageNo = '{body.menuName}' AND (defaultHidden = 'false' OR defaultHidden is null) ORDER BY SortNo ASC"; var columns = DbAccess.QueryList(sql); var fieldDescs = new Dictionary(); if (body.exportSet.ExFields.Any()) body.exportSet.ExFields.ForEach(x => { if (columns.Any(o => o.field == x)) fieldDescs.Add(x, columns.FirstOrDefault(o => o.field == x)?.label); }); else fieldDescs = columns.ToDictionary(item => item.field, item => item.label); var dt = ToDataTable(data.result.DT_TableDataT1, fieldDescs, null); // 获取所有列名 var dtColumns = dt.Columns; var id = SnowFlakeSingle.instance.getID(); var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot"; var path = $"{$"/files/export/{id}/"}"; if (!Directory.Exists(physicsPath + path)) Directory.CreateDirectory(physicsPath + path); path = path + body.exportSet.TitleName + ".xlsx"; NPOIHelper.ExportExcel(dt, body.exportSet.TitleName, type == "Year" ? "培训需求统计-年度" : "培训需求统计-月度", physicsPath + path); var result = new ExcelData(); result.filePath = "/Advanced" + path; result.fileName = body.exportSet.TitleName + ".xlsx"; return ServiceResult.OprateSuccess("导出成功", result); } public async Task> ExportExcel(QueryExport body, string status) { QueryBody filter = new QueryBody(); filter.pageNum = 1; filter.jsonParam = body.jsonParam; filter.pageSize = 1000000; filter.langId = body.langId; var condition = "1=1"; if (body.exportSet.SelectRowKeys != null && body.exportSet.SelectRowKeys.Any()) condition += $" AND Id IN({string.Join(",", body.exportSet.SelectRowKeys)})"; var data = new ServicePageResult(0, 0, filter.pageSize, null); if (status == "Active") data = await QueryFilterPage(filter, $"(Status ='Active' OR Status ='Wait' OR (WorkID IS NOT NULL AND WorkState IN (0,1)))"); else if (status == "Disable") data = await QueryFilterPage(filter, null, false); else data = await QueryFilterPage(filter, $"Status ='{status}' AND WorkID IS NULL"); string sql = $@"SELECT * FROM Ghrs_PageSettingQuery WHERE IsEnable = 1 AND PageNo = '{body.menuName}' AND (defaultHidden = 'false' OR defaultHidden is null) ORDER BY SortNo ASC"; var columns = DbAccess.QueryList(sql); var fieldDescs = new Dictionary(); if (body.exportSet.ExFields.Any()) body.exportSet.ExFields.ForEach(x => { if (columns.Any(o => o.field == x)) { var label = columns.FirstOrDefault(o => o.field == x)?.label; if (!fieldDescs.ContainsKey(x)) fieldDescs.Add(x, label); } }); else fieldDescs = columns.ToDictionary(item => item.field, item => item.label); var dt = ToDataTable(data.result.DT_TableDataT1, fieldDescs, null); // 获取所有列名 var dtColumns = dt.Columns; var id = SnowFlakeSingle.instance.getID(); var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot"; var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}export{Path.DirectorySeparatorChar}{id}{Path.DirectorySeparatorChar}"}"; if (!Directory.Exists(physicsPath + path)) Directory.CreateDirectory(physicsPath + path); path = path + body.exportSet.TitleName + ".xlsx"; NPOIHelper.ExportExcel(dt, body.exportSet.TitleName, "sheet1", physicsPath + path); var result = new ExcelData(); result.filePath = "/Advanced" + path; result.fileName = body.exportSet.TitleName + ".xlsx"; return ServiceResult.OprateSuccess("导出成功", result); } #endregion }