From 816f72e9fcc12003c5c1066f4ccbca18e2dc0e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=BE=8E=E8=8D=A3?= <10755671+mei-rong-he@user.noreply.gitee.com> Date: Wed, 9 Sep 2026 16:41:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BE=A8=E8=AF=86=E7=BB=93=E6=9E=9C=E3=80=81?= =?UTF-8?q?=E8=AF=84=E4=BC=B0=E8=A1=A8=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/PF/PFApproveCallBackService.cs | 11 +- .../Api/RiskEvaluationController.cs | 236 +++++++++++++----- .../Api/RiskIdentifyResultController.cs | 128 ++++++++-- 3 files changed, 292 insertions(+), 83 deletions(-) diff --git a/APT.BaseData.Services/Services/PF/PFApproveCallBackService.cs b/APT.BaseData.Services/Services/PF/PFApproveCallBackService.cs index d143366..b4683d5 100644 --- a/APT.BaseData.Services/Services/PF/PFApproveCallBackService.cs +++ b/APT.BaseData.Services/Services/PF/PFApproveCallBackService.cs @@ -14151,6 +14151,9 @@ namespace APT.BaseData.Services.DomainServices if (summarys.Any()) { var librarys = this.GetEntities(t => t.ENABLE_STATUS == 0, new BaseFilter(entity.ORG_ID)); + //加载不过滤 ENABLE_STATUS 的完整企业库字典,确保通过 ENTERPRISE_LIBRARY_ID 直接关联时 + //即使企业库被禁用也能取到 LEC/SCORE 等原始数据 + var allLibraryDict = this.GetEntities(t => true, new BaseFilter(entity.ORG_ID)).ToDictionary(t => t.ID); var summaryIds = summarys.Select(t => t.ID).ToList(); var summaryDetails = this.GetEntities(t => summaryIds.Contains(t.RISK_IDENTIFY_RESULT_ID), new BaseFilter(entity.ORG_ID)); var summaryDetailIds = summaryDetails.Select(t => t.ID).ToList(); @@ -14195,7 +14198,13 @@ namespace APT.BaseData.Services.DomainServices { if (de != null) { - var departTemp = librarys.FirstOrDefault(t => t.PRODUCTION_UNIT_ID == de.PRODUCTION_UNIT_ID && t.AREA_ID == de.AREA_ID && t.RISK_NAME == de.RISK_NAME && t.RISK_DESCRIPTION == de.RISK_DESCRIPTION && t.TYPE_ID == de.TYPE_ID); + //优先用 ENTERPRISE_LIBRARY_ID 直接关联完整企业库字典(含禁用的),确保能取到 LEC + //找不到再回退到启用企业库的多字段匹配 + T_SK_ENTERPRISE_LIBRARY departTemp = null; + if (de.ENTERPRISE_LIBRARY_ID != null && allLibraryDict.TryGetValue(de.ENTERPRISE_LIBRARY_ID.Value, out var libById)) + departTemp = libById; + if (departTemp == null) + departTemp = librarys.FirstOrDefault(t => t.PRODUCTION_UNIT_ID == de.PRODUCTION_UNIT_ID && t.AREA_ID == de.AREA_ID && t.RISK_NAME == de.RISK_NAME && t.RISK_DESCRIPTION == de.RISK_DESCRIPTION && t.TYPE_ID == de.TYPE_ID); T_SK_RISK_EVALUATION_DETAIL detail = new T_SK_RISK_EVALUATION_DETAIL(); detail.ORG_ID = entity.ORG_ID; detail.RISK_EVALUATION_ID = result.ID; diff --git a/APT.MicroApi/APT.SK.WebApi/Controllers/Api/RiskEvaluationController.cs b/APT.MicroApi/APT.SK.WebApi/Controllers/Api/RiskEvaluationController.cs index b6704f4..4184c2b 100644 --- a/APT.MicroApi/APT.SK.WebApi/Controllers/Api/RiskEvaluationController.cs +++ b/APT.MicroApi/APT.SK.WebApi/Controllers/Api/RiskEvaluationController.cs @@ -126,6 +126,56 @@ namespace APT.SK.WebApi.Controllers.Api // deleteDetailIds.Add(t.ID); //}); } + //预加载部门、用户、岗位名称字典,用于汇总计算管控层级/部门/责任人/岗位 + var allDepartIds = new List(); + var allPostIds = new List(); + var allDirectUserIds = new List(); + if (details != null) + { + foreach (var d in details.Where(t => !t.IS_DELETED)) + { + if (d.Nav_DetailDeparts != null) + { + foreach (var dp in d.Nav_DetailDeparts.Where(t => !t.IS_DELETED)) + { + if (dp.DEPARTMENT_ID != null) allDepartIds.Add(dp.DEPARTMENT_ID.Value); + if (dp.USER_ID != null) allDirectUserIds.Add(dp.USER_ID.Value); + } + } + if (d.Nav_DetailPosts != null) + { + foreach (var pp in d.Nav_DetailPosts.Where(t => !t.IS_DELETED)) + { + if (pp.DEPARTMENT_ID != null) allDepartIds.Add(pp.DEPARTMENT_ID.Value); + if (pp.Nav_PostDetails != null) + allPostIds.AddRange(pp.Nav_PostDetails.Where(t => !t.IS_DELETED && t.POST_ID != null).Select(t => t.POST_ID.Value)); + } + } + } + } + allDepartIds = allDepartIds.Distinct().ToList(); + allPostIds = allPostIds.Distinct().ToList(); + //加载部门:NAME 和 USER_ID(负责人ID) + Dictionary departNameDict = new Dictionary(); + Dictionary departUserIdDict = new Dictionary(); + if (allDepartIds.Any()) + { + var departs = this.GetEntities(t => allDepartIds.Contains(t.ID), new BaseFilter(entity.ORG_ID)).ToList(); + departNameDict = departs.ToDictionary(t => t.ID, t => t.NAME); + departUserIdDict = departs.ToDictionary(t => t.ID, t => t.USER_ID); + } + //加载用户(部门负责人)姓名 + allDirectUserIds = allDirectUserIds.Distinct().ToList(); + var deptUserIds = departUserIdDict.Values.Where(v => v != null).Select(v => v.Value).Distinct().ToList(); + var allUserIds = allDirectUserIds.Union(deptUserIds).Distinct().ToList(); + Dictionary userNameDict = new Dictionary(); + if (allUserIds.Any()) + userNameDict = this.GetEntities(t => allUserIds.Contains(t.ID), new BaseFilter(entity.ORG_ID)).ToDictionary(t => t.ID, t => t.NAME); + //加载岗位名称 + Dictionary postNameDict = new Dictionary(); + if (allPostIds.Any()) + postNameDict = this.GetEntities(t => allPostIds.Contains(t.ID), new BaseFilter(entity.ORG_ID)).ToDictionary(t => t.ID, t => t.NAME); + if (details != null && details.Any()) { foreach (var item in details.Where(t => !t.IS_DELETED)) @@ -135,27 +185,24 @@ namespace APT.SK.WebApi.Controllers.Api de.ORG_ID = entity.ORG_ID; de.RISK_EVALUATION_ID = entity.ID; de.PRODUCTION_UNIT_ID = item.PRODUCTION_UNIT_ID; - de.AREA_ID = item.AREA_ID; - de.RISK_NAME = item.RISK_NAME; - de.RISK_DESCRIPTION = item.RISK_DESCRIPTION; - de.TYPE_ID = item.TYPE_ID; - de.ENABLE_STATUS = item.ENABLE_STATUS; - de.MARK = item.MARK; - de.EMERGENCY = item.EMERGENCY; + de.AREA_ID = item.AREA_ID; + de.RISK_NAME = item.RISK_NAME; + de.RISK_DESCRIPTION = item.RISK_DESCRIPTION; + de.TYPE_ID = item.TYPE_ID; + de.ENABLE_STATUS = item.ENABLE_STATUS; + de.MARK = item.MARK; + de.EMERGENCY = item.EMERGENCY; de.ENTERPRISE_LIBRARY_ID = item.ENTERPRISE_LIBRARY_ID; - de.SCOREL_ID = item.SCOREL_ID; - de.SCOREE_ID = item.SCOREE_ID; - de.SCOREC_ID = item.SCOREC_ID; - de.EVALUATE_SCORE = item.EVALUATE_SCORE; - de.EVALUATE_LEVEL = item.EVALUATE_LEVEL; - //de.MEASURE = item.MEASURE; - de.DEPARTMENT_TYPE = item.DEPARTMENT_TYPE; - de.IDENTIFY_DEPARTMENT = item.IDENTIFY_DEPARTMENT; - de.IDENTIFY_USER = item.IDENTIFY_USER; + de.SCOREL_ID = item.SCOREL_ID; + de.SCOREE_ID = item.SCOREE_ID; + de.SCOREC_ID = item.SCOREC_ID; + de.EVALUATE_SCORE = item.EVALUATE_SCORE; + de.EVALUATE_LEVEL = item.EVALUATE_LEVEL; if ((item.SCOREL_ID == null || item.SCOREE_ID == null || item.SCOREC_ID == null) && item.ENABLE_STATUS == SKEnableStatusEnum.Yes) { throw new Exception("第" + item.NUM + "行,LEC都不能为空"); } + //管控措施:保存子表记录,MEASURE 在子表全部保存后去重汇总 if (item.Nav_DetailMeasures != null && item.Nav_DetailMeasures.Any()) { foreach (var mm in item.Nav_DetailMeasures.Where(t => !t.IS_DELETED)) @@ -163,17 +210,24 @@ namespace APT.SK.WebApi.Controllers.Api T_SK_RISK_EVALUATION_DETAIL_MEASURE item2 = new T_SK_RISK_EVALUATION_DETAIL_MEASURE(); item2.ID = mm.ID == Guid.Empty ? Guid.NewGuid() : mm.ID; item2.ORG_ID = entity.ORG_ID; - item2.RISK_EVALUATION_DETAIL_ID = de.ID; + item2.RISK_EVALUATION_DETAIL_ID = de.ID; item2.NUM = mm.NUM; - item2.MEASURES_NAME = mm.MEASURES_NAME; - measureList.Add(item2); - var num = (item2.NUM == null || item2.NUM == 0) ? 1 : item2.NUM.Value; - var temp = num + "、" + item2.MEASURES_NAME + Environment.NewLine; - de.MEASURE = de.MEASURE + temp; + item2.MEASURES_NAME = mm.MEASURES_NAME; + measureList.Add(item2); + } + var distinctMes = item.Nav_DetailMeasures.Where(t => !t.IS_DELETED) + .Select(m => m.MEASURES_NAME ?? "") + .Where(m => !string.IsNullOrEmpty(m)) + .Distinct() + .ToList(); + var mi = 1; + foreach (var mes in distinctMes) + { + de.MEASURE = de.MEASURE + mi + "、" + mes + ";"; + mi++; } } - detailList.Add(de); - item.Nav_DetailMeasures = null; + //管控部门层级子表 if (item.Nav_DetailDeparts != null && item.Nav_DetailDeparts.Any()) { foreach (var mm in item.Nav_DetailDeparts.Where(t => !t.IS_DELETED)) @@ -181,13 +235,14 @@ namespace APT.SK.WebApi.Controllers.Api T_SK_RISK_EVALUATION_DETAIL_DEPART item2 = new T_SK_RISK_EVALUATION_DETAIL_DEPART(); item2.ID = mm.ID == Guid.Empty ? Guid.NewGuid() : mm.ID; item2.ORG_ID = entity.ORG_ID; - item2.RISK_EVALUATION_DETAIL_ID = de.ID; - item2.DEPARTMENT_TYPE = mm.DEPARTMENT_TYPE; + item2.RISK_EVALUATION_DETAIL_ID = de.ID; + item2.DEPARTMENT_TYPE = mm.DEPARTMENT_TYPE; item2.DEPARTMENT_ID = mm.DEPARTMENT_ID; + item2.USER_ID = mm.USER_ID; departList.Add(item2); } } - item.Nav_DetailDeparts = null; + //辨识岗位子表 if (item.Nav_DetailPosts != null && item.Nav_DetailPosts.Any()) { foreach (var mm in item.Nav_DetailPosts.Where(t => !t.IS_DELETED)) @@ -195,24 +250,85 @@ namespace APT.SK.WebApi.Controllers.Api T_SK_RISK_EVALUATION_DETAIL_POST item2 = new T_SK_RISK_EVALUATION_DETAIL_POST(); item2.ID = mm.ID == Guid.Empty ? Guid.NewGuid() : mm.ID; item2.ORG_ID = entity.ORG_ID; - item2.RISK_EVALUATION_DETAIL_ID = de.ID; + item2.RISK_EVALUATION_DETAIL_ID = de.ID; item2.DEPARTMENT_ID = mm.DEPARTMENT_ID; postList.Add(item2); - if (mm.Nav_PostDetails != null && mm.Nav_PostDetails.Any()) - { - foreach (var nn in mm.Nav_PostDetails.Where(t => !t.IS_DELETED).DistinctBy(t => t.POST_ID)) - { - T_SK_RISK_EVALUATION_DETAIL_POST_DETAIL item3 = new T_SK_RISK_EVALUATION_DETAIL_POST_DETAIL(); - item3.ID = nn.ID == Guid.Empty ? Guid.NewGuid() : nn.ID; - item3.ORG_ID = entity.ORG_ID; - item3.RISK_EVALUATION_DETAIL_POST_ID = item2.ID; - item3.POST_ID = nn.POST_ID; + if (mm.Nav_PostDetails != null && mm.Nav_PostDetails.Any()) + { + foreach (var nn in mm.Nav_PostDetails.Where(t => !t.IS_DELETED).DistinctBy(t => t.POST_ID)) + { + T_SK_RISK_EVALUATION_DETAIL_POST_DETAIL item3 = new T_SK_RISK_EVALUATION_DETAIL_POST_DETAIL(); + item3.ID = nn.ID == Guid.Empty ? Guid.NewGuid() : nn.ID; + item3.ORG_ID = entity.ORG_ID; + item3.RISK_EVALUATION_DETAIL_POST_ID = item2.ID; + item3.POST_ID = nn.POST_ID; postDetList.Add(item3); } } } } + //汇总计算管控层级/部门/责任人/辨识岗位(按 DEPARTMENT_TYPE 分组) + de.DEPARTMENT_TYPE = null; + de.IDENTIFY_DEPARTMENT = null; + de.IDENTIFY_USER = null; + de.IDENTIFY_POST = null; + if (item.Nav_DetailDeparts != null && item.Nav_DetailDeparts.Any()) + { + var departTypes = item.Nav_DetailDeparts.Where(t => !t.IS_DELETED) + .OrderBy(m => m.DEPARTMENT_TYPE) + .Select(t => t.DEPARTMENT_TYPE) + .Distinct() + .ToList(); + var j = 1; + foreach (var dt in departTypes) + { + var desc = dt.GetDescription(); + if (!string.IsNullOrEmpty(desc)) + { + de.DEPARTMENT_TYPE = de.DEPARTMENT_TYPE + j + "、" + desc + ";"; + //该层级下的管控部门名称(去重) + var deptNames = item.Nav_DetailDeparts.Where(t => !t.IS_DELETED && t.DEPARTMENT_TYPE == dt && t.DEPARTMENT_ID != null) + .Select(t => departNameDict.ContainsKey(t.DEPARTMENT_ID.Value) ? departNameDict[t.DEPARTMENT_ID.Value] : null) + .Where(n => !string.IsNullOrEmpty(n)) + .Distinct() + .ToList(); + foreach (var dn in deptNames) + de.IDENTIFY_DEPARTMENT = de.IDENTIFY_DEPARTMENT + j + "、" + dn + ";"; + //该层级下的管控责任人:取部门表的负责人 USER_ID + var userNamesForType = item.Nav_DetailDeparts.Where(t => !t.IS_DELETED && t.DEPARTMENT_TYPE == dt && t.DEPARTMENT_ID != null) + .Select(t => departUserIdDict.ContainsKey(t.DEPARTMENT_ID.Value) ? departUserIdDict[t.DEPARTMENT_ID.Value] : null) + .Where(uid => uid != null && userNameDict.ContainsKey(uid.Value)) + .Select(uid => userNameDict[uid.Value]) + .Where(n => !string.IsNullOrEmpty(n)) + .Distinct() + .ToList(); + foreach (var un in userNamesForType) + de.IDENTIFY_USER = de.IDENTIFY_USER + j + "、" + un + ";"; + //该层级下的辨识岗位:匹配 Nav_DetailPosts 中属于该层级管控部门的岗位(去重) + var typeDeptIds = item.Nav_DetailDeparts.Where(t => !t.IS_DELETED && t.DEPARTMENT_TYPE == dt && t.DEPARTMENT_ID != null) + .Select(t => t.DEPARTMENT_ID.Value) + .Distinct() + .ToList(); + if (item.Nav_DetailPosts != null && typeDeptIds.Any()) + { + var postNames = item.Nav_DetailPosts.Where(p => !p.IS_DELETED && p.DEPARTMENT_ID != null && typeDeptIds.Contains(p.DEPARTMENT_ID.Value)) + .SelectMany(p => p.Nav_PostDetails ?? new List()) + .Where(x => !x.IS_DELETED && x.POST_ID != null) + .Select(x => postNameDict.ContainsKey(x.POST_ID.Value) ? postNameDict[x.POST_ID.Value] : null) + .Where(n => !string.IsNullOrEmpty(n)) + .Distinct() + .ToList(); + foreach (var pn in postNames) + de.IDENTIFY_POST = de.IDENTIFY_POST + j + "、" + pn + ";"; + } + j++; + } + } + } + item.Nav_DetailMeasures = null; + item.Nav_DetailDeparts = null; item.Nav_DetailPosts = null; + detailList.Add(de); if (item.EVALUATE_LEVEL == SKEvaluateLevelEnum.重大风险) { if (!string.IsNullOrEmpty(item.DEPARTMENT_TYPE) && !item.DEPARTMENT_TYPE.Contains("公司级")) @@ -378,6 +494,11 @@ namespace APT.SK.WebApi.Controllers.Api detail.Nav_DetailDeparts = departTemps.OrderBy(t => t.DEPARTMENT_TYPE).ThenBy(m => m.Nav_Department.NUM).ToList(); var postTemps = posts.Where(t => t.RISK_EVALUATION_DETAIL_ID == detail.ID).ToList(); detail.Nav_DetailPosts = postTemps.OrderBy(t => t.DEPARTMENT_ID).ToList(); + //先清空汇总字段,避免叠加 FullUpdate 已持久化的值导致重复 + detail.DEPARTMENT_TYPE = null; + detail.IDENTIFY_DEPARTMENT = null; + detail.IDENTIFY_USER = null; + detail.IDENTIFY_POST = null; if (detail.Nav_DetailDeparts != null && detail.Nav_DetailDeparts.Any()) { var departTypes = detail.Nav_DetailDeparts.OrderBy(m => m.DEPARTMENT_TYPE).Select(t => t.DEPARTMENT_TYPE).Distinct().ToList(); @@ -386,27 +507,26 @@ namespace APT.SK.WebApi.Controllers.Api { if (!string.IsNullOrEmpty(p.GetDescription())) { - var temp = j + "、" + p.GetDescription() + ";"; - detail.DEPARTMENT_TYPE = detail.DEPARTMENT_TYPE + temp; - var dds = detail.Nav_DetailDeparts.Where(x => x.DEPARTMENT_TYPE == p).Select(t => t.Nav_Department?.NAME).Distinct().ToList(); - if (dds.Count() != 0) - { - var temp2 = j + "、" + string.Join(",", dds) + ";"; - detail.IDENTIFY_DEPARTMENT = detail.IDENTIFY_DEPARTMENT + temp2; - } - var uus = detail.Nav_DetailDeparts.Where(x => x.DEPARTMENT_TYPE == p).Select(t => t.Nav_Department?.Nav_User?.NAME).Distinct().ToList(); - if (uus.Count() != 0) - { - var temp3 = j + "、" + string.Join(",", uus) + ";"; - detail.IDENTIFY_USER = detail.IDENTIFY_USER + temp3; - } - var ddIds = detail.Nav_DetailDeparts.Where(x => x.DEPARTMENT_TYPE == p).Select(t => t.DEPARTMENT_ID).Distinct().ToList(); - var pps = detail.Nav_DetailPosts.Where(x => ddIds.Contains(x.DEPARTMENT_ID)).SelectMany(x => x.Nav_PostDetails).Select(t => t.Nav_Post?.NAME).Distinct().ToList(); - if (pps.Count() != 0) - { - var temp4 = j + "、" + string.Join(",", pps) + ";"; - detail.IDENTIFY_POST = detail.IDENTIFY_POST + temp4; - } + detail.DEPARTMENT_TYPE = detail.DEPARTMENT_TYPE + j + "、" + p.GetDescription() + ";"; + //管控部门(去重,逐个展示) + var dds = detail.Nav_DetailDeparts.Where(x => x.DEPARTMENT_TYPE == p).Select(t => t.Nav_Department?.NAME).Where(n => !string.IsNullOrEmpty(n)).Distinct().ToList(); + foreach (var dn in dds) + detail.IDENTIFY_DEPARTMENT = detail.IDENTIFY_DEPARTMENT + j + "、" + dn + ";"; + //管控责任人:取管控部门负责人(去重,逐个展示) + var uus = detail.Nav_DetailDeparts.Where(x => x.DEPARTMENT_TYPE == p).Select(t => t.Nav_Department?.Nav_User?.NAME).Where(n => !string.IsNullOrEmpty(n)).Distinct().ToList(); + foreach (var un in uus) + detail.IDENTIFY_USER = detail.IDENTIFY_USER + j + "、" + un + ";"; + //辨识岗位:取该层级管控部门对应的岗位(两表部门相同),去重逐个展示 + var ddIds = detail.Nav_DetailDeparts.Where(x => x.DEPARTMENT_TYPE == p && x.DEPARTMENT_ID != null).Select(t => t.DEPARTMENT_ID).Distinct().ToList(); + var pps = detail.Nav_DetailPosts.Where(x => !x.IS_DELETED && x.DEPARTMENT_ID != null && ddIds.Contains(x.DEPARTMENT_ID)) + .SelectMany(x => x.Nav_PostDetails ?? new List()) + .Where(x => !x.IS_DELETED) + .Select(t => t.Nav_Post?.NAME) + .Where(n => !string.IsNullOrEmpty(n)) + .Distinct() + .ToList(); + foreach (var pn in pps) + detail.IDENTIFY_POST = detail.IDENTIFY_POST + j + "、" + pn + ";"; j++; } } diff --git a/APT.MicroApi/APT.SK.WebApi/Controllers/Api/RiskIdentifyResultController.cs b/APT.MicroApi/APT.SK.WebApi/Controllers/Api/RiskIdentifyResultController.cs index 5d4614b..d467cf7 100644 --- a/APT.MicroApi/APT.SK.WebApi/Controllers/Api/RiskIdentifyResultController.cs +++ b/APT.MicroApi/APT.SK.WebApi/Controllers/Api/RiskIdentifyResultController.cs @@ -126,6 +126,35 @@ namespace APT.SK.WebApi.Controllers.Api //} } } + //预加载部门、岗位名称,用于汇总计算辨识层级、辨识部门、辨识岗位 + var allDepartIds = new List(); + var allPostIds = new List(); + if (details != null) + { + foreach (var d in details.Where(t => !t.IS_DELETED)) + { + if (d.Nav_DetailDeparts != null) + allDepartIds.AddRange(d.Nav_DetailDeparts.Where(t => !t.IS_DELETED && t.DEPARTMENT_ID != null).Select(t => t.DEPARTMENT_ID.Value)); + if (d.Nav_DetailPosts != null) + { + allDepartIds.AddRange(d.Nav_DetailPosts.Where(t => !t.IS_DELETED && t.DEPARTMENT_ID != null).Select(t => t.DEPARTMENT_ID.Value)); + foreach (var p in d.Nav_DetailPosts.Where(t => !t.IS_DELETED)) + { + if (p.Nav_ResultPostDets != null) + allPostIds.AddRange(p.Nav_ResultPostDets.Where(t => !t.IS_DELETED && t.POST_ID != null).Select(t => t.POST_ID.Value)); + } + } + } + } + allDepartIds = allDepartIds.Distinct().ToList(); + allPostIds = allPostIds.Distinct().ToList(); + Dictionary departNameDict = new Dictionary(); + if (allDepartIds.Any()) + departNameDict = this.GetEntities(t => allDepartIds.Contains(t.ID), new BaseFilter(entity.ORG_ID)).ToDictionary(t => t.ID, t => t.NAME); + Dictionary postNameDict = new Dictionary(); + if (allPostIds.Any()) + postNameDict = this.GetEntities(t => allPostIds.Contains(t.ID), new BaseFilter(entity.ORG_ID)).ToDictionary(t => t.ID, t => t.NAME); + if (details != null && details.Any()) { foreach (var item in details.Where(t => !t.IS_DELETED)) @@ -143,10 +172,7 @@ namespace APT.SK.WebApi.Controllers.Api de.MARK = item.MARK; de.EMERGENCY = item.EMERGENCY; de.ENTERPRISE_LIBRARY_ID = item.ENTERPRISE_LIBRARY_ID; - //de.MEASURE = item.MEASURE; - de.DEPARTMENT_TYPE = item.DEPARTMENT_TYPE; - de.IDENTIFY_DEPARTMENT = item.IDENTIFY_DEPARTMENT; - de.IDENTIFY_POST = item.IDENTIFY_POST; + //管控措施:从Nav_DetailMeasures汇总并去重 if (item.Nav_DetailMeasures != null && item.Nav_DetailMeasures.Any()) { foreach (var mm in item.Nav_DetailMeasures.Where(t => !t.IS_DELETED)) @@ -158,13 +184,21 @@ namespace APT.SK.WebApi.Controllers.Api item2.NUM = mm.NUM; item2.MEASURE = (mm.MEASURE ?? "").Replace("、", ",").Replace("\\", ",").Replace("/", ","); measureList.Add(item2); - var num = (item2.NUM == null || item2.NUM == 0) ? 1 : item2.NUM.Value; - var temp = num + "、" + item2.MEASURE + ";"; - de.MEASURE = de.MEASURE + temp; + } + var distinctMeasures = item.Nav_DetailMeasures.Where(t => !t.IS_DELETED) + .Select(m => (m.MEASURE ?? "").Replace("、", ",").Replace("\\", ",").Replace("/", ",")) + .Where(m => !string.IsNullOrEmpty(m)) + .Distinct() + .ToList(); + var mi = 1; + foreach (var mes in distinctMeasures) + { + de.MEASURE = de.MEASURE + mi + "、" + mes + ";"; + mi++; } } - detailList.Add(de); item.Nav_DetailMeasures = null; + //辨识部门明细 if (item.Nav_DetailDeparts != null && item.Nav_DetailDeparts.Any()) { foreach (var mm in item.Nav_DetailDeparts.Where(t => !t.IS_DELETED)) @@ -178,7 +212,7 @@ namespace APT.SK.WebApi.Controllers.Api departList.Add(item2); } } - item.Nav_DetailDeparts = null; + //辨识岗位明细 if (item.Nav_DetailPosts != null && item.Nav_DetailPosts.Any()) { foreach (var mm in item.Nav_DetailPosts.Where(t => !t.IS_DELETED)) @@ -187,7 +221,7 @@ namespace APT.SK.WebApi.Controllers.Api item2.ID = mm.ID == Guid.Empty ? Guid.NewGuid() : mm.ID; item2.ORG_ID = entity.ORG_ID; item2.RISK_IDENTIFY_RESULT_DETAIL_ID = de.ID; - item2.DEPARTMENT_TYPE = mm.DEPARTMENT_TYPE; + item2.DEPARTMENT_TYPE = mm.DEPARTMENT_TYPE; item2.DEPARTMENT_ID = mm.DEPARTMENT_ID; postList.Add(item2); if (mm.Nav_ResultPostDets != null && mm.Nav_ResultPostDets.Any()) @@ -204,6 +238,55 @@ namespace APT.SK.WebApi.Controllers.Api } } } + //汇总计算辨识层级、辨识部门、辨识岗位(按层级分组,组内部门、岗位分别展示) + de.DEPARTMENT_TYPE = null; + de.IDENTIFY_DEPARTMENT = null; + de.IDENTIFY_POST = null; + if (item.Nav_DetailDeparts != null && item.Nav_DetailDeparts.Any()) + { + var departTypes = item.Nav_DetailDeparts.Where(t => !t.IS_DELETED) + .OrderBy(m => m.DEPARTMENT_TYPE) + .Select(t => t.DEPARTMENT_TYPE) + .Distinct() + .ToList(); + var j = 1; + foreach (var dt in departTypes) + { + var desc = ((SKDepartmentTypeEnum)dt).GetDescription(); + if (!string.IsNullOrEmpty(desc)) + { + de.DEPARTMENT_TYPE = de.DEPARTMENT_TYPE + j + "、" + desc + ";"; + //该层级下的辨识部门(去重) + var deptNames = item.Nav_DetailDeparts.Where(t => !t.IS_DELETED && t.DEPARTMENT_TYPE == dt && t.DEPARTMENT_ID != null) + .Select(t => departNameDict.ContainsKey(t.DEPARTMENT_ID.Value) ? departNameDict[t.DEPARTMENT_ID.Value] : null) + .Where(n => !string.IsNullOrEmpty(n)) + .Distinct() + .ToList(); + foreach (var dn in deptNames) + { + de.IDENTIFY_DEPARTMENT = de.IDENTIFY_DEPARTMENT + j + "、" + dn + ";"; + } + //该层级下的辨识岗位(去重) + if (item.Nav_DetailPosts != null) + { + var postNames = item.Nav_DetailPosts.Where(t => !t.IS_DELETED && t.DEPARTMENT_TYPE == (SKDepartmentTypeEnum)dt) + .SelectMany(p => p.Nav_ResultPostDets ?? new List()) + .Where(x => x.POST_ID != null) + .Select(x => postNameDict.ContainsKey(x.POST_ID.Value) ? postNameDict[x.POST_ID.Value] : null) + .Where(n => !string.IsNullOrEmpty(n)) + .Distinct() + .ToList(); + foreach (var pn in postNames) + { + de.IDENTIFY_POST = de.IDENTIFY_POST + j + "、" + pn + ";"; + } + } + j++; + } + } + } + detailList.Add(de); + item.Nav_DetailDeparts = null; item.Nav_DetailPosts = null; } } @@ -333,6 +416,10 @@ namespace APT.SK.WebApi.Controllers.Api // var temp = (m.NUM == null || m.NUM == 0) ? "1" : m.NUM + "、" + m.MEASURE + ";"; // d.MEASURE = d.MEASURE + temp; //} + //先清空汇总字段,避免叠加 FullUpdate 已持久化的值导致重复 + d.DEPARTMENT_TYPE = null; + d.IDENTIFY_DEPARTMENT = null; + d.IDENTIFY_POST = null; if (d.Nav_DetailPosts != null && d.Nav_DetailPosts.Any()) { var departTypes = d.Nav_DetailPosts.OrderBy(m=>m.DEPARTMENT_TYPE).Select(t => t.DEPARTMENT_TYPE).Distinct().ToList(); @@ -341,20 +428,13 @@ namespace APT.SK.WebApi.Controllers.Api { if (!string.IsNullOrEmpty(p.GetDescription())) { - var temp = j + "、" + p.GetDescription() + ";"; - d.DEPARTMENT_TYPE = d.DEPARTMENT_TYPE + temp; - var departs = d.Nav_DetailPosts.Where(x => x.DEPARTMENT_TYPE == p).Select(t => t.Nav_Department?.NAME).Distinct().ToList(); - if (departs.Count() != 0) - { - var temp2 = j + "、" + string.Join(",", departs) + ";"; - d.IDENTIFY_DEPARTMENT = d.IDENTIFY_DEPARTMENT + temp2; - } - var posts = d.Nav_DetailPosts.Where(x => x.DEPARTMENT_TYPE == p).SelectMany(x => x.Nav_ResultPostDets).Select(t => t.Nav_Post?.NAME).Distinct().ToList(); - if (posts.Count() != 0) - { - var temp3 = j + "、" + string.Join(",", posts) + ";"; - d.IDENTIFY_POST = d.IDENTIFY_POST + temp3; - } + d.DEPARTMENT_TYPE = d.DEPARTMENT_TYPE + j + "、" + p.GetDescription() + ";"; + var departs = d.Nav_DetailPosts.Where(x => x.DEPARTMENT_TYPE == p).Select(t => t.Nav_Department?.NAME).Where(n => !string.IsNullOrEmpty(n)).Distinct().ToList(); + foreach (var dn in departs) + d.IDENTIFY_DEPARTMENT = d.IDENTIFY_DEPARTMENT + j + "、" + dn + ";"; + var posts = d.Nav_DetailPosts.Where(x => x.DEPARTMENT_TYPE == p).SelectMany(x => x.Nav_ResultPostDets ?? new List()).Where(x => !x.IS_DELETED).Select(t => t.Nav_Post?.NAME).Where(n => !string.IsNullOrEmpty(n)).Distinct().ToList(); + foreach (var pn in posts) + d.IDENTIFY_POST = d.IDENTIFY_POST + j + "、" + pn + ";"; j++; } }