using APT.BaseData.Domain.Entities.FM; using APT.Infrastructure.Core; using Microsoft.AspNetCore.Mvc; using APT.Infrastructure.Api; using System.Collections.Generic; using System.Linq.Expressions; using System; using System.Linq; using APT.BaseData.Domain.ApiModel; using Ubiety.Dns.Core; using System.Security.AccessControl; using APT.MS.Domain.Entities.FO; using APT.BaseData.Domain.Entities; using APT.MS.Domain.Enums; using APT.MS.Domain.Entities.BI; using static APT.MS.Domain.Enums.BI.BIEnums; using NPOI.SS.Formula.Functions; using APT.PP.WebApi.Controllers.Api.PP; using APT.Utility; using Google.Protobuf.WellKnownTypes; using APT.MS.Domain.Entities.BS; using APT.BaseData.Domain.Enums; using APT.WebApi.Models; using APT.BaseData.Domain.IServices.FM; namespace APT.SC.WebApi.Controllers.Api.BI { /// /// 首页图表 /// [Route("api/PP/BIHome")] [TypeFilter(typeof(CustomActionFilterAttribute))] public class BIHomeController : AuthorizeApiController { IFMSyncLogDetailService SyncLogDetailService { get; set; } public BIHomeController(IFMSyncLogDetailService syncLogDetailService) { SyncLogDetailService = syncLogDetailService; } /// /// 首页安全检查相关 图表数据插入 /// /// [HttpPost, Route("InsertBIHomeSafe")] public JsonActionResult InsertBIHomeSafe([FromBody] KeywordFilter filter) { return SafeExecute(() => { try { DateTime CURR_TASK_START_TIME = DateTime.Now; DateTime dtNow = DateTime.Now; int caculateMonth = 6; if (!string.IsNullOrEmpty(filter.Parameter1)) { if (filter.Parameter1.Contains("|") && filter.Parameter1.Contains("caculateMonth")) { var param = filter.Parameter1.Split("|"); foreach (var item in param) { if (string.IsNullOrEmpty(item)) continue; if (item.Contains("caculateMonth")) { try { caculateMonth = int.Parse(item.Split("=", StringSplitOptions.RemoveEmptyEntries)[1]); //接收来自页面的参数 } catch { caculateMonth = 6; } } else { try { dtNow = Convert.ToDateTime(item); //接收来自页面的参数 } catch { dtNow = DateTime.Now; } } } } else { try { //接收来自页面的参数 dtNow = Convert.ToDateTime(filter.Parameter1); } catch { dtNow = DateTime.Now; } } } if (caculateMonth > 12) { //最多计算1年 return false; } var task = GetEntity(filter.Keyword); if (task != null) { task.CURR_TASK_START_TIME = CURR_TASK_START_TIME;//上次同步结束时间 task.UPDATE_SUCCES_TIME = DateTime.Now;//上次同步结束时间 task.SYNC_PARAM = "";//清空参数 } //计算 近6个月的数据 DateTime dtMin = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-01 00:00:00")).AddMonths(-1 * caculateMonth); // T_BI_HRISKCHANGE_PEC 各部门隐患整改率 // T_BI_HRISK_COUNT 各部门隐患数量 // T_BI_HRISK_TOP 高频隐患 List listChangePec = new List(); List listRiskCount = new List(); List listRiskTop = new List(); Expression> expression = e => !e.IS_DELETED; if (dtMin.Year == dtNow.Year) { expression = expression.And(e => e.YEAR == dtMin.Year && e.MONTH >= dtMin.Month); } else { expression = expression.And(e => e.YEAR >= dtMin.Year); } List listChangePecOld = GetEntities(expression, null, null).ToList(); #region 部门及下属组织 dicDepChi Dictionary> dicDepChi = new Dictionary>(); //所有组织 var listDepAll = GetEntities(e => !e.IS_DELETED, null, null).OrderBy(e => e.DEPARTMENT_TYPE); List listDep = new List();//部门级别的组织 foreach (var item in listDepAll) { //FMDepartmentType 部门=0, 车间=1, 班组=2, 公司=3 if (item.DEPARTMENT_TYPE == 0)//&& item.DEPARTMENT_STATUS == 1FMDepartmentStatus 职能部门 = 0, 生产部门 = 1, 安全部门 = 2, { listDep.Add(item); } } foreach (var item in listDep) { var dep1 = listDepAll.Where(e => e.PARENT_ID.HasValue && e.PARENT_ID == item.ID); List listItemVal = new List(); if (dep1 != null && dep1.Any()) { listItemVal = dep1.Select(e => e.ID).ToList(); var dep2 = listDepAll.Where(e => e.PARENT_ID.HasValue && listItemVal.Contains(e.PARENT_ID.Value)); if (dep2 != null && dep2.Any()) { listItemVal.AddRange(dep2.Select(e => e.ID).ToList()); } } listItemVal.Add(item.ID); dicDepChi.Add(item, listItemVal); } #endregion #region 部门隐患整改率 var sub = GetEntities(e => !e.IS_DELETED && e.DEPARTMENT_ID.HasValue && e.CREATE_TIME.HasValue && e.CREATE_TIME >= dtMin, null, null); DateTime dtSearchMin = dtMin; DateTime dtSearchMax = dtMin; for (int i = 0; i < caculateMonth; i++) { dtSearchMin = dtMin.AddMonths(i); dtSearchMax = dtMin.AddMonths(i + 1).AddSeconds(-1); foreach (var item in dicDepChi) { T_BI_HRISKCHANGE_PEC model = listChangePecOld.FirstOrDefault(e => e.YEAR == dtSearchMin.Year && e.MONTH == dtSearchMin.Month && e.DEPARTMENT_ID == item.Key.ID); if (model == null) { model = new T_BI_HRISKCHANGE_PEC(); model.ID = Guid.NewGuid(); model.ORG_ID = filter.OrgId; model.DEPARTMENT_ID = item.Key.ID; model.DEPARTMENT_NAME = item.Key.NAME; model.YEAR = dtSearchMin.Year; model.MONTH = dtSearchMin.Month; model.YEARMONTH = model.YEAR + "年" + (model.MONTH > 9 ? model.MONTH : ("0" + model.MONTH)) + "月"; if (item.Key.MineType.HasValue) { model.MINETYPE = (FMProductionUnit)item.Key.MineType; } try { model.DEPARTMENT_TYPE = (FMDepartmentType)item.Key.DEPARTMENT_TYPE; } catch { model.DEPARTMENT_TYPE = FMDepartmentType.部门; } } model.COUNT = 0; model.COUNT_DEL = 0; var SubMonth = sub.Where(e => dtSearchMin <= e.CREATE_TIME && e.CREATE_TIME <= dtSearchMax && item.Value.Contains(e.DEPARTMENT_ID.Value)); if (SubMonth != null && SubMonth.Any()) { model.COUNT = SubMonth.Count(); foreach (var itemSub in SubMonth) { //RiskContentState.OK if (itemSub.SUBMITFINISHTIME.HasValue) if (itemSub.RiskContentState == 60 || itemSub.RiskContentState == 80) { model.COUNT_DEL++; } } } listChangePec.Add(model); } } foreach (var item in listChangePec) { if (item.COUNT == 0 || item.COUNT_DEL == 0) { item.CHANGE_PERCENT = 0; item.CHANGE_PERCENT_SHOW = "100.00%";//没有需要整改的 } else { item.CHANGE_PERCENT = Math.Round(Convert.ToDecimal(100.0 * item.COUNT_DEL / item.COUNT), 2); item.CHANGE_PERCENT_SHOW = item.CHANGE_PERCENT + "%"; } } #endregion #region 各部门隐患数量 IEnumerable subDep = null; var sub2 = GetEntities(e => !e.IS_DELETED && e.DEPARTMENT_ID.HasValue && e.CREATE_TIME.HasValue && e.CREATE_TIME.Value.Year == dtNow.Year, null, null); var listRiskCountOld = GetEntities(e => e.YEAR == dtNow.Year && !e.IS_DELETED, null, null); foreach (var item in dicDepChi) { var riskCount = listRiskCountOld.FirstOrDefault(e => e.DEPARTMENT_ID.HasValue && !e.IS_DELETED && e.DEPARTMENT_ID.Value == item.Key.ID); if (riskCount == null) { riskCount = new T_BI_HRISK_COUNT(); riskCount.ID = Guid.NewGuid(); riskCount.ORG_ID = filter.OrgId; riskCount.YEAR = dtNow.Year; try { riskCount.MINETYPE = item.Key.MineType.HasValue ? ((FMProductionUnit)item.Key.MineType.Value) : null; } catch { } try { riskCount.DEPARTMENT_TYPE = FMDepartmentType.部门; } catch { } riskCount.DEPARTMENT_ID = item.Key.ID; riskCount.DEPARTMENT_NAME = item.Key.NAME; } riskCount.COUNT_CHANGE = 0; riskCount.COUNT_UNCHANGE = 0; subDep = sub2.Where(e => e.DEPARTMENT_ID.Value == item.Key.ID); if (subDep != null && subDep.Any()) { foreach (var itemSub in subDep) { if (itemSub.RiskContentState.HasValue && (itemSub.RiskContentState == 60 || itemSub.RiskContentState == 80)) { riskCount.COUNT_CHANGE++; } else { riskCount.COUNT_UNCHANGE++; } } } listRiskCount.Add(riskCount); } #endregion #region 高频隐患 (先删后加) List listTopID = new List(); var listRiskTopOld = GetEntities(e => e.YEAR == dtNow.Year && !e.IS_DELETED, null, null); if (listRiskTopOld != null && listRiskTopOld.Any()) { listTopID = listRiskTopOld.Select(e => e.ID).ToList(); } var listSubTop = GetEntities(e => !e.IS_DELETED && e.DEPARTMENT_ID.HasValue && e.CREATE_TIME.HasValue && e.CREATE_TIME.Value.Year == dtNow.Year && e.CHECKCONTENT != null, null, null); Dictionary dic = new Dictionary(); foreach (var item in listSubTop) { if (dic.ContainsKey(item.CHECKCONTENT)) { dic[item.CHECKCONTENT]++; } else { dic.Add(item.CHECKCONTENT, 1); } } foreach (var item in dic) { //全部先加 后面排序再删除 var riskTop = new T_BI_HRISK_TOP(); riskTop.ID = Guid.NewGuid(); riskTop.ORG_ID = filter.OrgId; riskTop.DEPARTMENT_TYPE = FMDepartmentType.公司; riskTop.DEPARTMENT_ID = Guid.Empty; riskTop.MAINID = Guid.Empty; riskTop.YEAR = dtNow.Year; riskTop.CHECKCONTENT = item.Key; riskTop.COUNT = item.Value; listRiskTop.Add(riskTop); } if (listRiskTop.Count > 8) { listRiskTop = listRiskTop.OrderByDescending(e => e.COUNT).ToList(); int count = listRiskTop.Count; for (int i = 8; i < count; i++) { listRiskTop.RemoveAt(i - 1); count--; i--; } } #endregion if (task != null) { task.TASK_END_TIME = DateTime.Now; } this.UnifiedCommit(() => { if (task != null) UpdateEntityNoCommit(task); if (listChangePec.Count > 0) BantchSaveEntityNoCommit(listChangePec); if (listRiskCount.Count > 0) BantchSaveEntityNoCommit(listRiskCount); if (listRiskTop.Count > 0) BantchSaveEntityNoCommit(listRiskTop); if (listTopID.Count > 0) BantchDeleteEntityNoCommit(listTopID); }); int Count = ((listChangePec != null && listChangePec.Any()) ? listChangePec.Count : 0) + ((listRiskCount != null && listRiskCount.Any()) ? listRiskCount.Count : 0) + ((listRiskTop != null && listRiskTop.Any()) ? listRiskTop.Count : 0) + ((listTopID != null && listTopID.Any()) ? listTopID.Count : 0); SyncLogDetailService.InsertSyncLogDetail(HttpContext.Items, HttpContext.TraceIdentifier, filter.OrgId, Count, filter.Parameter1, SyncLogType.BSCreateCheckPlanSet); } catch (Exception ex) { if (!string.IsNullOrEmpty(ex.StackTrace)) throw new Exception("错误日志:[StackTrace]" + ex.StackTrace); else throw new Exception("【" + HttpContext.Request.Path + "】错误日志:[Message]" + ex.Message); } return true; }); } } }