using NPOI.SS.UserModel; using NPOI.SS.Util; using static Tiobon.Core.Model.Consts; namespace Tiobon.Core.Services; /// /// 培训计划 (服务) /// public class Ghre_PlanServices : BaseServices, IGhre_PlanServices { private readonly IBaseRepository _dal; private readonly ICommonServices _commonServices; public Ghre_PlanServices(ICaching caching, IBaseRepository dal, ICommonServices commonServices) { this._dal = dal; base.BaseDal = dal; base._caching = caching; _commonServices = commonServices; } public override async Task> QueryFilterPage(QueryBody filter, string condition, bool? IsEnable = true) { var result = await base.QueryFilterPage(filter, condition, IsEnable); int? year = null; if (filter.jsonParam != null) foreach (JProperty jProperty in filter.jsonParam.Properties()) { var name = jProperty.Name; var value = jProperty.Value.ToString(); if (name == "Year") { var jsonParam = JsonHelper.JsonToObj(value); year = jsonParam.columnValue.ObjToInt(); } } var DT_TableDataT1 = result.result.DT_TableDataT1; var deptIds = DT_TableDataT1.Select(x => x.DeptId).Distinct().ToList(); var courseIds = DT_TableDataT1.Select(x => x.CourseId).Distinct().ToList(); var schoolIds = DT_TableDataT1.Select(x => x.SchoolId).Distinct().ToList(); var staffIds = new List(); for (int i = 0; i < DT_TableDataT1.Count; i++) { if (DT_TableDataT1[i].StaffIds.IsNotEmptyOrNull()) staffIds.AddRange(JsonHelper.JsonToObj>(DT_TableDataT1[i].StaffIds)); DT_TableDataT1[i].TrainCategory = await GetParaLabel("TrainingCategory", DT_TableDataT1[i].TrainCategory); if (DT_TableDataT1[i].Month.IsNotEmptyOrNull()) DT_TableDataT1[i].Months = JsonHelper.JsonToObj>(DT_TableDataT1[i].Month); //DT_TableDataT1[i].Month = await GetParaLabel("MonthSelect", DT_TableDataT1[i].Month); DT_TableDataT1[i].InOrOut = await GetParaLabel("CourseInOrOut", DT_TableDataT1[i].InOrOut); if (DT_TableDataT1[i].Months.Any()) DT_TableDataT1[i].Months.ForEach(x => { if (x.ObjToInt() == 1) DT_TableDataT1[i].M1 = "✔"; else if (x.ObjToInt() == 2) DT_TableDataT1[i].M2 = "✔"; else if (x.ObjToInt() == 3) DT_TableDataT1[i].M3 = "✔"; else if (x.ObjToInt() == 4) DT_TableDataT1[i].M4 = "✔"; else if (x.ObjToInt() == 5) DT_TableDataT1[i].M5 = "✔"; else if (x.ObjToInt() == 6) DT_TableDataT1[i].M6 = "✔"; else if (x.ObjToInt() == 7) DT_TableDataT1[i].M7 = "✔"; else if (x.ObjToInt() == 8) DT_TableDataT1[i].M8 = "✔"; else if (x.ObjToInt() == 9) DT_TableDataT1[i].M9 = "✔"; else if (x.ObjToInt() == 10) DT_TableDataT1[i].M10 = "✔"; else if (x.ObjToInt() == 11) DT_TableDataT1[i].M11 = "✔"; else if (x.ObjToInt() == 12) DT_TableDataT1[i].M12 = "✔"; }); } staffIds = staffIds.Distinct().ToList(); var staffs = await Db.Queryable().Where(x => staffIds.Contains(x.StaffID)).ToListAsync(); var depts = await Db.Queryable().Where(x => deptIds.Contains(x.DeptID)).ToListAsync(); var courses = await Db.Queryable().Where(x => courseIds.Contains(x.Id)).ToListAsync(); var schools = await Db.Queryable().Where(x => schoolIds.Contains(x.Id)).ToListAsync(); for (int i = 0; i < DT_TableDataT1.Count; i++) { if (DT_TableDataT1[i].StaffIds.IsNotEmptyOrNull()) { var staffIds1 = JsonHelper.JsonToObj>(DT_TableDataT1[i].StaffIds); if (staffIds1.Any()) DT_TableDataT1[i].StaffNames = string.Join("、", staffs.Where(x => staffIds1.Contains(x.StaffID)).Select(x => x.StaffName)); } if (DT_TableDataT1[i].CourseId.IsNotEmptyOrNull() && DT_TableDataT1[i].CourseName.IsNullOrEmpty()) DT_TableDataT1[i].CourseName = courses.Where(x => x.Id == DT_TableDataT1[i].CourseId).Select(x => x.CourseName).FirstOrDefault(); if (DT_TableDataT1[i].DeptId.IsNotEmptyOrNull()) { DT_TableDataT1[i].DeptName = depts.Where(x => x.DeptID == DT_TableDataT1[i].DeptId).Select(x => x.DeptName).FirstOrDefault(); DT_TableDataT1[i].DeptNo = depts.Where(x => x.DeptID == DT_TableDataT1[i].DeptId).Select(x => x.DeptNo).FirstOrDefault(); } if (DT_TableDataT1[i].SchoolId.IsNotEmptyOrNull()) DT_TableDataT1[i].SchoolName = schools.Where(x => x.Id == DT_TableDataT1[i].SchoolId).Select(x => x.SchoolName).FirstOrDefault(); if (DT_TableDataT1[i].TrainNum != null && DT_TableDataT1[i].TrainDays != null) DT_TableDataT1[i].TotalDays = DT_TableDataT1[i].TrainNum * DT_TableDataT1[i].TrainDays; DT_TableDataT1[i].BuiltInLabel = DT_TableDataT1[i].BuiltIn == 1 ? "是" : "否"; } ModuleParam param = new ModuleParam() { langId = filter.langId, menuName = filter.menuName }; var module = await _commonServices.GetModuleInfoAsync(param); result.result.JM_TableColumnT1 = module.Data.JM_TableColumnT1; var yearField = module.Data.JM_TableColumnT1.TableColumn.Where(x => x.field == "Year").SingleOrDefault(); if (year != yearField?.searchColumnDefaultValue.ObjToInt()) { result.result.JM_TableColumnT1.TableColumn?.ForEach(x => { if (x.GroupName == "计划年月") { int month = x.field.Replace("M", null).Replace("_F", null).ObjToInt(); x.label = year + "-" + (month < 10 ? "0" + month : month); if (month == 12) year++; } }); } return result; } public override async Task Add(InsertGhre_PlanInput entity) { if (entity.StaffId != null) entity.StaffIds = JsonHelper.ObjToJson(entity.StaffId.OrderBy(n => n).ToList()); if (entity.StaffId.IsNotEmptyOrNull() && entity.StaffId.Count > 0) entity.TrainNum = entity.StaffId.Count; if (entity.Months != null) entity.Month = JsonHelper.ObjToJson(entity.Months.OrderBy(n => n).ToList()); var result = await base.Add(entity); return result; } public override async Task Update(long Id, EditGhre_PlanInput editModel) { if (editModel.StaffId != null) editModel.StaffIds = JsonHelper.ObjToJson(editModel.StaffId); if (editModel.StaffId.IsNotEmptyOrNull() && editModel.StaffId.Count > 0) editModel.TrainNum = editModel.StaffId.Count; if (editModel.Months != null) editModel.Month = JsonHelper.ObjToJson(editModel.Months.OrderBy(n => n).ToList()); var result = await base.Update(Id, editModel, null, ["Status"]); return result; } public override async Task> QueryForm(QueryForm body) { var result = await base.QueryForm(body); string StaffIds = result.result.DT_TableDataT1[0].StaffIds; string Month = result.result.DT_TableDataT1[0].Month; if (!string.IsNullOrWhiteSpace(StaffIds)) result.result.DT_TableDataT1[0].StaffId = JsonConvert.DeserializeObject>(StaffIds); if (!string.IsNullOrWhiteSpace(Month)) result.result.DT_TableDataT1[0].Months = JsonConvert.DeserializeObject>(Month); if (result.result.DT_TableDataT1[0].TrainNum != null && result.result.DT_TableDataT1[0].TrainDays != null) result.result.DT_TableDataT1[0].TotalDays = result.result.DT_TableDataT1[0].TrainNum * result.result.DT_TableDataT1[0].TrainDays; return result; } public async Task> InsertByStatus(InsertGhre_PlanInput insertModel, string status) { if (insertModel.StaffId != null) insertModel.StaffIds = JsonHelper.ObjToJson(insertModel.StaffId); 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 async Task UpdateStatus(InsertGhre_PlanInput 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> QueryUshioPlan(QueryBody filter) { var result = await QueryFilterPage(filter, "", true); var inPlanIds = result.result.DT_TableDataT1.Where(x => x.InOrOut == "In").Select(x => x.Id).ToList(); var outPlanIds = result.result.DT_TableDataT1.Where(x => x.InOrOut == "Out").Select(x => x.Id).ToList(); int? year1 = null; if (filter.jsonParam != null) foreach (JProperty jProperty in filter.jsonParam.Properties()) { var name = jProperty.Name; var value = jProperty.Value.ToString(); if (name == "Year") { var jsonParam = JsonHelper.JsonToObj(value); year1 = jsonParam.columnValue.ObjToInt(); } } var studyRecordGroup1 = await Db.SqlQueryable("select * from Ghre_StudyRecord_V") .Where(m => inPlanIds.Contains(m.PlanId.Value) && m.PlanId != null && ( m.CourseType == "ManualInsert" || (m.BeginTime != null && m.EndTime != null && m.ExamId == null) || (m.BeginTime != null && m.EndTime != null && m.ExamId != null && m.IsRequireStudy == true && m.IsPass == true) )) .Select(q => new { q.Id, q.PlanId, ExamDate = q.ExamDate1 ?? q.EndTime }) .GroupBy(q => new { q.Id, q.PlanId, q.ExamDate }) .Select(m => new { m.PlanId, ExamDate = m.ExamDate.Value, Count = SqlFunc.AggregateCount(m.Id) }) .ToListAsync(); studyRecordGroup1 = studyRecordGroup1.Where(x => x.ExamDate.Year == year1).ToList(); var data = Mapper.Map(result.result.DT_TableDataT1).ToANew>(); for (int i = 0; i < data.Count; i++) { var d = data[i]; int year = d.Year.Value; if (d.InOrOut == "In") { d.M1_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 1).Sum(x => x.Count); d.M2_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 2).Sum(x => x.Count); d.M3_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 3).Sum(x => x.Count); d.M4_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 4).Sum(x => x.Count); d.M5_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 5).Sum(x => x.Count); d.M6_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 6).Sum(x => x.Count); d.M7_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 7).Sum(x => x.Count); d.M8_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 8).Sum(x => x.Count); d.M9_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 9).Sum(x => x.Count); d.M10_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 10).Sum(x => x.Count); d.M11_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 11).Sum(x => x.Count); d.M12_Count = studyRecordGroup1.Where(x => x.PlanId == d.Id && x.ExamDate.Year == year && x.ExamDate.Month == 12).Sum(x => x.Count); } else { if (await QueryCompanyCode() == "Ushio") { var sql = $"select CAST( TrainDays as int) TrainDays, CAST( BeginDate as datetime) BeginDate, CAST( EndDate as datetime) EndDate from [120.26.205.42].[GhrUshio].[dbo].Ushio_ExternalTrainApply where TrainNeeds like '%{d.Id}%' and TrainDays is not null and TrainDays !=''"; //var applys = await DbAccess.QueryListAsync(sql); var applys = await Db.Ado.SqlQueryAsync(sql); d.M1_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 1).Sum(x => x.TrainDays); d.M2_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 2).Sum(x => x.TrainDays); d.M3_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 3).Sum(x => x.TrainDays); d.M4_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 4).Sum(x => x.TrainDays); d.M5_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 5).Sum(x => x.TrainDays); d.M6_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 6).Sum(x => x.TrainDays); d.M7_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 7).Sum(x => x.TrainDays); d.M8_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 8).Sum(x => x.TrainDays); d.M9_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 9).Sum(x => x.TrainDays); d.M10_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 10).Sum(x => x.TrainDays); d.M11_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 11).Sum(x => x.TrainDays); d.M12_Count = applys.Where(x => x.BeginDate.Year == year && x.BeginDate.Month == 12).Sum(x => x.TrainDays); } } if (d.M1_Count > 0 && d.TrainNum > 0) d.M1_CompletionRate = d.M1_Count / d.TrainNum; if (d.M2_Count > 0 && d.TrainNum > 0) d.M2_CompletionRate = d.M2_Count / d.TrainNum; if (d.M3_Count > 0 && d.TrainNum > 0) d.M3_CompletionRate = d.M3_Count / d.TrainNum; if (d.M4_Count > 0 && d.TrainNum > 0) d.M4_CompletionRate = d.M4_Count / d.TrainNum; if (d.M5_Count > 0 && d.TrainNum > 0) d.M5_CompletionRate = d.M5_Count / d.TrainNum; if (d.M6_Count > 0 && d.TrainNum > 0) d.M6_CompletionRate = d.M6_Count / d.TrainNum; if (d.M7_Count > 0 && d.TrainNum > 0) d.M7_CompletionRate = d.M7_Count / d.TrainNum; if (d.M8_Count > 0 && d.TrainNum > 0) d.M8_CompletionRate = d.M8_Count / d.TrainNum; if (d.M9_Count > 0 && d.TrainNum > 0) d.M9_CompletionRate = d.M9_Count / d.TrainNum; if (d.M10_Count > 0 && d.TrainNum > 0) d.M10_CompletionRate = d.M10_Count / d.TrainNum; if (d.M11_Count > 0 && d.TrainNum > 0) d.M11_CompletionRate = d.M11_Count / d.TrainNum; if (d.M12_Count > 0 && d.TrainNum > 0) d.M12_CompletionRate = d.M12_Count / d.TrainNum; } ModuleParam param = new ModuleParam() { langId = filter.langId, menuName = filter.menuName }; var module = await _commonServices.GetModuleInfoAsync(param); var result1 = new ServicePageResult(filter.pageNum, result.result.DT_TablePageInfoT1.TotalCount, filter.pageSize, data); result1.result.JM_TableColumnT1 = module.Data.JM_TableColumnT1; var yearField = module.Data.JM_TableColumnT1.TableColumn.Where(x => x.field == "Year").SingleOrDefault(); if (year1 != yearField?.searchColumnDefaultValue.ObjToInt()) { result1.result.JM_TableColumnT1.TableColumn?.ForEach(x => { if (x.GroupName == "计划年月") { int month = x.field.Replace("M", null).Replace("_F", null).ObjToInt(); x.label = year1 + "-" + (month < 10 ? "0" + month : month); if (month == 12) year1++; } }); } return result1; } #region Excel导出 public async Task> ExportUshioPlan(QueryExport body) { 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 QueryUshioPlan(filter); var columns = data.result.JM_TableColumnT1.TableColumn; 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 = ToUshioDataTable(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, "培训计划【牛尾】", physicsPath + path); var result = new ExcelData(); result.filePath = "/Advanced" + path; result.fileName = body.exportSet.TitleName + ".xlsx"; return ServiceResult.OprateSuccess("导出成功", result); } public static DataTable ToUshioDataTable(List list, Dictionary fieldDescs = null, params string[] propertyName) { var (fields, colunms) = Sort(fieldDescs, null); List propertyNameList = new List(); if (propertyName != null) { propertyNameList.AddRange(propertyName); } DataTable result = new DataTable(); if (list.Count > 0) { PropertyInfo[] propertys = list[0].GetType().GetProperties(); for (int i = 0; i < fields.Count; i++) { foreach (PropertyInfo pi in propertys) { if (propertyNameList.Count == 0) { //if (DBNull.Value.Equals(pi.PropertyType)) //{ // // pi.PropertyType = DateTime; //} Type colType = pi.PropertyType; if (colType.IsGenericType && colType.GetGenericTypeDefinition() == typeof(Nullable<>)) { colType = colType.GetGenericArguments()[0]; } if (fields[i] == pi.Name) { if (fields[i].IndexOf("_Count") > 0) result.Columns.Add(colunms[i] + "_" + fields[i].Replace("_Count", ""), colType); else if (fields[i].IndexOf("_CompletionRate") > 0) result.Columns.Add(colunms[i] + "_" + fields[i].Replace("_CompletionRate", ""), colType); else result.Columns.Add(colunms[i], colType); } //result.Columns.Add(pi.Name, pi.PropertyType); } else { if (propertyNameList.Contains(pi.Name)) { if (fields[i] == pi.Name) result.Columns.Add(fields[i], pi.PropertyType); } } } } for (int i = 0; i < list.Count; i++) { ArrayList tempList = new ArrayList(); for (int j = 0; j < fields.Count; j++) { foreach (PropertyInfo pi in propertys) { if (fields[j] == pi.Name) { if (propertyNameList.Count == 0) { object obj = pi.GetValue(list[i], null); tempList.Add(obj); } else { if (propertyNameList.Contains(pi.Name)) { object obj = pi.GetValue(list[i], null); tempList.Add(obj); } } } } } object[] array = tempList.ToArray(); try { result.LoadDataRow(array, true); } catch (Exception E) { } } } return result; } #endregion public override async Task> DownloadExcel(string menuName) { var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot"; var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}ExcelTemplate{Path.DirectorySeparatorChar}"}"; if (!Directory.Exists(physicsPath + path)) Directory.CreateDirectory(physicsPath + path); Type entityType = typeof(Ghre_Course); var fileName = "F_TrainPlan.xlsx"; //physicsPath = physicsPath + path + fileName; IWorkbook hssfworkbook; ISheet sheet; using (FileStream file = new FileStream(physicsPath + path + fileName, FileMode.Open, FileAccess.Read)) { //hssfworkbook = new HSSFWorkbook(file); //hssfworkbook = new XSSFWorkbook(file); hssfworkbook = WorkbookFactory.Create(file); } ISheet sheet2 = hssfworkbook.CreateSheet("下拉数据"); var newFileName = Guid.NewGuid() + ".xlsx"; int listColIndex = 0; var items = await GetParaList("TrainingCategory"); //var depts = await Db.Queryable().Select(x => new //{ // x.DeptID, // x.DeptName //}).ToListAsync(); //var courses = await Db.Queryable().Select(x => new //{ // x.Id, // x.CourseName //}).ToListAsync(); var schools = await Db.Queryable().Select(x => new { x.Id, x.SchoolName }).ToListAsync(); int sheetIndex = hssfworkbook.GetSheetIndex("培训计划"); if (sheetIndex >= 0) { sheet = hssfworkbook.GetSheetAt(sheetIndex); //设置数据源的值 IDataValidationConstraint dvConstraint1 = sheet.GetDataValidationHelper().CreateExplicitListConstraint(items.Select(x => x.ParaDetailName).ToArray()); //设置编辑的区域 IDataValidation dataValidation1 = sheet.GetDataValidationHelper().CreateValidation(dvConstraint1, new CellRangeAddressList(1, 65535, 2, 2)); sheet.AddValidationData(dataValidation1); //dvConstraint1 = sheet.GetDataValidationHelper().CreateExplicitListConstraint(depts.Select(x => x.DeptName).ToArray()); ////设置编辑的区域 //dataValidation1 = sheet.GetDataValidationHelper().CreateValidation(dvConstraint1, new CellRangeAddressList(1, 65535, 1, 1)); //sheet.AddValidationData(dataValidation1); //dvConstraint1 = sheet.GetDataValidationHelper().CreateExplicitListConstraint(courses.Select(x => x.CourseName).ToArray()); ////设置编辑的区域 //dataValidation1 = sheet.GetDataValidationHelper().CreateValidation(dvConstraint1, new CellRangeAddressList(1, 65535, 3, 3)); //sheet.AddValidationData(dataValidation1); dvConstraint1 = sheet.GetDataValidationHelper().CreateExplicitListConstraint(schools.Select(x => x.SchoolName).ToArray()); //设置编辑的区域 dataValidation1 = sheet.GetDataValidationHelper().CreateValidation(dvConstraint1, new CellRangeAddressList(1, 65535, 5, 5)); sheet.AddValidationData(dataValidation1); } //string sql = @"select 'Course' field, Id id, CourseNo no, CourseName name from Ghre_Course where IsEnable=1 and Status='Released'"; //var dataSourceLists = await Db.Ado.SqlQueryAsync(sql); //if (dataSourceLists.Any()) //{ // var types = new List // { // "学习记录" // }; // types.ForEach(sheetName => // { // int sheetIndex = hssfworkbook.GetSheetIndex(sheetName); // if (sheetIndex >= 0) // { // sheet = hssfworkbook.GetSheetAt(sheetIndex); // SetCellDropdownList(sheet, 0, 0, dataSourceLists.Select(x => x.name).ToArray()); // } // }); MemoryStream ms; using (ms = new MemoryStream()) { hssfworkbook.Write(ms); ms.Flush(); hssfworkbook.Dispose(); //ms.Position = 0; //return ms; } using (FileStream fs = new FileStream(physicsPath + path + newFileName, FileMode.Create, FileAccess.Write)) { byte[] data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); } var physicsPath1 = physicsPath + path + newFileName; if (menuName == "F_TrainPlan_Temporary" || menuName == "F_UshioTrainPlan_Temporary") return ServiceResult.OprateSuccess("计划暂存_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now) + ".xlsx", physicsPath1); else return ServiceResult.OprateSuccess("计划维护_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now) + ".xlsx", physicsPath1); } #region Excel导入 public async Task<(List>, int)> ValidImportExcel(ISqlSugarClient Db, List columns, DataTable dt) { var CompanyCode = await QueryCompanyCode(); Type entityType = typeof(Ghre_Plan); 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(); 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 == "StaffId") { 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("StaffIds", JsonHelper.ObjToJson(ids)); } else if (x.field == "CourseId") { var ids = await Db.Queryable().Where(o => o.CourseNo == value || o.CourseName == value).Select(x => x.Id).FirstAsync(); dict.Add("CourseId", ids); } else if (x.field == "SchoolId") { var ids = await Db.Queryable().Where(o => o.SchoolNo == value || o.SchoolName == value).Select(x => x.Id).FirstAsync(); dict.Add("SchoolId", ids); } else if (x.field == "Months") { value = value.Replace(",", ","); value = value.Replace(";", ","); value = value.Replace(";", ","); var value1 = value.Split(',').ToList(); var value2 = new List(); value1.ForEach(x => { try { if (Convert.ToInt16(x) >= 1 && Convert.ToInt16(x) <= 12) value2.Add(Convert.ToInt16(x).ObjToString()); } catch (Exception) { } }); dict.Add("Month", JsonHelper.ObjToJson(value2)); } 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" || x.dataSource == "OrgTreeWithoutPriv") { string sql = @$"SELECT DeptID FROM Ghro_Dept WHERE DeptNo = '{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); } } } else dict.Add(x.field, null); } } 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); columns = columns.Where(x => x.label != "系统内置").ToList(); var (dictList, errorCount) = await ValidImportExcel(Db, columns, dt); Type entityType = typeof(Ghre_Plan); var properties = entityType.GetGenericProperties(); if (errorCount > 0) { NPOIHelper.ExportExcel(dt, null, "导入数据", FileHelper.GetPhysicsPath() + errorFileName); data.filePath = "/Advanced" + errorFileName; data.ErrorCount = errorCount; } else { dictList.ForEach(x => { if (menuName == "F_TrainPlan_Wait" || menuName == "F_UshioTrainPlan_Wait") x.Add("Status", "Wait"); else if (menuName == "F_TrainPlan_Temporary" || menuName == "F_UshioTrainPlan_Temporary") x.Add("Status", "Temporary"); }); await Db.Insertable(dictList).AS(entityType.GetEntityTableName()).ExecuteCommandAsync(); data.SuccessCount = dictList.Count; } return ServiceResult.OprateSuccess("导入成功!", data); } #endregion #region 培训计划达成率 public async Task> QueryCompletionRateBLT(QueryBody filter) { var data = new List(); int totalCount = 0; bool isFirst = true; DateTime? startTime = null, endTime = null; string seachType = string.Empty; int? deptId_40 = null, deptId_30 = null, deptId_20 = null; int? deptId = null; if (filter.jsonParam != null) foreach (JProperty jProperty in filter.jsonParam.Properties()) { isFirst = false; var name = jProperty.Name; var value = jProperty.Value.ToString(); if (name == "page" || name == "pageSize") continue; if (name == "Month") { var jsonParam = JsonConvert.DeserializeObject(value); var ids1 = JsonHelper.JsonToObj>(jsonParam.columnValue.ToString()); startTime = ids1[0]; endTime = ids1[1]; continue; } if (name == "SeachType") { var jsonParam = JsonConvert.DeserializeObject(value); seachType = jsonParam.columnValue.ToString(); continue; } if (name == "DeptId_40") { var jsonParam = JsonConvert.DeserializeObject(value); deptId_40 = jsonParam.columnValue.ObjToInt(); continue; } if (name == "DeptId_30") { var jsonParam = JsonConvert.DeserializeObject(value); deptId_30 = jsonParam.columnValue.ObjToInt(); continue; } if (name == "DeptId_20") { var jsonParam = JsonConvert.DeserializeObject(value); deptId_20 = jsonParam.columnValue.ObjToInt(); continue; } } if (isFirst) return new ServicePageResult(filter.pageNum, totalCount, filter.pageSize, data); filter.pageSize = 10000; if (startTime.IsNullOrEmpty()) throw new Exception("请先选择月份!"); if (seachType.IsNullOrEmpty()) throw new Exception("请先选择查询类别!"); if (!(deptId_40.IsNotEmptyOrNull() || deptId_30.IsNotEmptyOrNull() || deptId_20.IsNotEmptyOrNull())) throw new Exception("请先选择部门!"); var aaa = 0; if (deptId_40.IsNotEmptyOrNull()) { aaa++; deptId = deptId_40; } if (deptId_30.IsNotEmptyOrNull()) { aaa++; deptId = deptId_30; } if (deptId_20.IsNotEmptyOrNull()) { aaa++; deptId = deptId_20; } if (aaa > 1) throw new Exception("部门层架筛选条件不可组合使用!"); var deptName = await Db.Queryable().Where(x => x.DeptID == deptId).Select(x => x.DeptName).FirstAsync(); var deptName1 = await Db.Ado.GetStringAsync(@$"SELECT GHR30.dbo.[FO_DeptInfo] ( {deptId}, getdate (), 1, 'DeptFullPateName');"); if (seachType == "Month") { for (DateTime? dt = startTime; dt <= endTime; dt = dt.Value.AddMonths(1)) { string formatted = dt.Value.ToString("yyyy-MM"); int submitCount = 0; var courseCount = await Db.Queryable() .Where(x => x.Year == dt.Value.Year && x.DeptId == deptId && x.Month.Contains($"\"{dt.Value.Month}\"")) .CountAsync(); if (courseCount > 0) { var planIds = await Db.Queryable() .Where(x => x.Year == dt.Value.Year && x.DeptId == deptId && x.Month.Contains($"\"{dt.Value.Month}\"")) .Select(x => x.Id).ToListAsync(); for (int i = 0; i < planIds.Count; i++) { var submitCount1 = await Db.Queryable() .Where(x => x.PlanId != null && x.PlanId.Contains(planIds[i].ObjToString())).CountAsync(); submitCount = submitCount + submitCount1; } } data.Add(new CompletionRateBLT { Month = formatted, SubmitCount = submitCount, CourseCount = courseCount }); } } else { int submitCount = 0; var courseCount = 0; for (DateTime? dt = startTime; dt <= endTime; dt = dt.Value.AddMonths(1)) { string formatted = dt.Value.ToString("yyyy-MM"); var courseCount1 = await Db.Queryable() .Where(x => x.Year == dt.Value.Year && x.DeptId == deptId && x.Month.Contains($"\"{dt.Value.Month}\"")) .CountAsync(); courseCount = courseCount + courseCount1; if (courseCount > 0) { var planIds = await Db.Queryable() .Where(x => x.Year == dt.Value.Year && x.DeptId == deptId && x.Month.Contains($"\"{dt.Value.Month}\"")) .Select(x => x.Id).ToListAsync(); for (int i = 0; i < planIds.Count; i++) { var submitCount1 = await Db.Queryable() .Where(x => x.PlanId != null && x.PlanId.Contains(planIds[i].ObjToString())).CountAsync(); submitCount = submitCount + submitCount1; } } } data.Add(new CompletionRateBLT { Month = $"{startTime.Value.ToString("yyyy-MM")}~{endTime.Value.ToString("yyyy-MM")}", SubmitCount = submitCount, CourseCount = courseCount }); } for (int i = 0; i < data.Count; i++) { data[i].Id = i + 1; data[i].Id = i + 1; data[i].RowNo = i + 1; data[i].DeptName = deptName; data[i].DeptFullName = deptName1; if (data[i].CourseCount > 0 && data[i].SubmitCount > 0) data[i].CompletionRate = data[i].SubmitCount / data[i].CourseCount; data[i].CompletionRate1 = $"{data[i].CompletionRate}%"; //var examCount = await Db.Queryable() // .Where(x => x.StudyRecordId != null && studyRecordIds.Contains(x.StudyRecordId.Value)) // .CountAsync(); //var passCount = await Db.Queryable() // .Where(x => x.StudyRecordId != null && studyRecordIds.Contains(x.StudyRecordId.Value) && x.IsPass == true) // .CountAsync(); //if (passCount > 0 && examCount > 0) // data[i].PassPercent = passCount / examCount; } return new ServicePageResult(filter.pageNum, totalCount, filter.pageSize, data); } #endregion }