mh_jy_safe/APT.MicroApi/APT.PP.WebApi/Controllers/Api/BIHomeController.cs
2025-08-25 09:56:57 +08:00

380 lines
18 KiB
C#

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
{
/// <summary>
/// 首页图表
/// </summary>
[Route("api/PP/BIHome")]
[TypeFilter(typeof(CustomActionFilterAttribute))]
public class BIHomeController : AuthorizeApiController<T_BI_HRISK_COUNT>
{
IFMSyncLogDetailService SyncLogDetailService { get; set; }
public BIHomeController(IFMSyncLogDetailService syncLogDetailService)
{
SyncLogDetailService = syncLogDetailService;
}
/// <summary>
/// 首页安全检查相关 图表数据插入
/// </summary>
/// <returns></returns>
[HttpPost, Route("InsertBIHomeSafe")]
public JsonActionResult<bool> InsertBIHomeSafe([FromBody] KeywordFilter filter)
{
return SafeExecute<bool>(() =>
{
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<T_FM_SYNC_TASK>(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<T_BI_HRISKCHANGE_PEC> listChangePec = new List<T_BI_HRISKCHANGE_PEC>();
List<T_BI_HRISK_COUNT> listRiskCount = new List<T_BI_HRISK_COUNT>();
List<T_BI_HRISK_TOP> listRiskTop = new List<T_BI_HRISK_TOP>();
Expression<Func<T_BI_HRISKCHANGE_PEC, bool>> 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<T_BI_HRISKCHANGE_PEC> listChangePecOld = GetEntities<T_BI_HRISKCHANGE_PEC>(expression, null, null).ToList();
#region dicDepChi
Dictionary<T_FM_DEPARTMENT, List<Guid>> dicDepChi = new Dictionary<T_FM_DEPARTMENT, List<Guid>>();
//所有组织
var listDepAll = GetEntities<T_FM_DEPARTMENT>(e => !e.IS_DELETED, null, null).OrderBy(e => e.DEPARTMENT_TYPE);
List<T_FM_DEPARTMENT> listDep = new List<T_FM_DEPARTMENT>();//部门级别的组织
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<Guid> listItemVal = new List<Guid>();
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<T_BS_RISK_SUBMIT_CONTENT>(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<T_BS_RISK_SUBMIT_CONTENT> subDep = null;
var sub2 = GetEntities<T_BS_RISK_SUBMIT_CONTENT>(e => !e.IS_DELETED && e.DEPARTMENT_ID.HasValue && e.CREATE_TIME.HasValue && e.CREATE_TIME.Value.Year == dtNow.Year, null, null);
var listRiskCountOld = GetEntities<T_BI_HRISK_COUNT>(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<Guid> listTopID = new List<Guid>();
var listRiskTopOld = GetEntities<T_BI_HRISK_TOP>(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<T_BS_RISK_SUBMIT_CONTENT>(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<string, int> dic = new Dictionary<string, int>();
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<T_BI_HRISK_TOP>(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;
});
}
}
}