using APT.BaseData.Domain.Entities; using APT.BaseData.Domain.Entities.FM; using APT.BaseData.Domain.Entities.OP; using APT.BaseData.Domain.Enums; using APT.BaseData.Domain.IServices.FM; using APT.BaseData.Domain.IServices.OP; using APT.BaseData.Services.Services.FM; using APT.Infrastructure.Api; using APT.Infrastructure.Core; using APT.Migrations; using APT.MS.Domain.Entities.BI; using APT.MS.Domain.Entities.BS; using APT.MS.Domain.Entities.FO; using APT.MS.Domain.Entities.HM; using APT.MS.Domain.Entities.SC.BI; using APT.MS.Domain.Entities.SE; using APT.MS.Domain.Enums; using APT.Utility; using InfluxData.Net.InfluxDb.Enums; using log4net.Core; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.SqlClient; using NPOI.SS.Formula.Functions; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Linq; using static Google.Protobuf.WireFormat; using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database; using static NPOI.HSSF.Util.HSSFColor; namespace APT.SC.WebApi.Controllers.Api.BI { /// /// 看板 /// [Route("api/BI/BIKanBanController")] public class BIKanBanController : APTApiController { IOPTenantDBConnService OPTenantDBConnService { get; set; } public BIKanBanController(IOPTenantDBConnService opTenantDBConnService) { OPTenantDBConnService = opTenantDBConnService; } #region 属性定义 /// /// 返回所有 /// public class ReturnAll { //风险等级占比 public List riskTypeRate { get; set; } //当日工作票排名前三 public List jobTodayTop3 { get; set; } //隐患整改率 public HiddenRectify hiddenRectify { get; set; } //各事项排名前三 public List taskTop3 { get; set; } //作业现场完成情况统计 public List jobFinishRate { get; set; } //各公司安全检查统计 public List safeCheckSum { get; set; } public List listSETrainSum { get; set; } } /// /// 风险等级占比 /// public class RiskTypeRate { public string riskType { get; set; } public int count { get; set; } public string rate { get; set; } } /// /// 当日工作票排名前三 /// public class JobTodayTop3 { public int totalQty { get; set; } public int num { get; set; } public string company { get; set; } public List details { get; set; } } public class JobTodayDetail { public string company { get; set; } public string jobName { get; set; } public int qty { get; set; } } /// /// 隐患整改率 /// public class HiddenRectify { public int qty { get; set; } public int ontimeQty { get; set; } public int delayQty { get; set; } public string rate { get; set; } } /// /// 各事项排名前三 /// public class TaskTopTemp { public int totalQty { get; set; } public int qty { get; set; } public string company { get; set; } public string type { get; set; } } public class TaskTop3 { public int totalQty { get; set; } public string company { get; set; } public List details { get; set; } } public class TaskTopDetail { public string name { get; set; } public int qty { get; set; } } /// /// 作业现场完成情况统计 /// public class JobFinishRate { public string name { get; set; } public int qty { get; set; } public int finishQty { get; set; } public string rate { get; set; } } /// /// 各公司安全检查统计 /// public class SafeCheckSum { public string company { get; set; } public int qty { get; set; } public int num { get; set; } } /// /// 培训教育学时获取 /// public class SETRAIN { /// /// 公司名称 /// public string CN { get; set; } /// /// /// public Guid ORG_ID { get; set; } /// /// 培训时长 /// public decimal TRAIN_HOUR { get; set; } /// /// 开始时间 /// public DateTime START_TIME { get; set; } } public class SETRAINSHOW { /// /// 公司名称 /// public string CN { get; set; } /// /// /// public Guid ORG_ID { get; set; } /// /// 当前年月 /// public DateTime dtNowYM { get; set; } /// /// 当前年月-1 /// public DateTime dtNowYM_1 { get; set; } public DateTime dtNowYM_2 { get; set; } public DateTime dtNowYM_3 { get; set; } public DateTime dtNowYM_4 { get; set; } public DateTime dtNowYM_5 { get; set; } /// /// 当前月 培训时长总和 /// public decimal SUM_TRAIN_HOUR { get; set; } /// /// 当前月-1 培训时长总和 /// public decimal SUM_TRAIN_HOUR_1 { get; set; } /// /// 当前月-2 培训时长总和 /// public decimal SUM_TRAIN_HOUR_2 { get; set; } /// /// 当前月-3 培训时长总和 /// public decimal SUM_TRAIN_HOUR_3 { get; set; } /// /// 当前月-4 培训时长总和 /// public decimal SUM_TRAIN_HOUR_4 { get; set; } /// /// 当前月-5 培训时长总和 /// public decimal SUM_TRAIN_HOUR_5 { get; set; } } #endregion /// /// 返回看板所有接口 /// /// 分页过滤实体 /// [HttpPost, Route("ReturnAllData")] public ReturnAll ReturnAllData([FromBody] KeywordFilter filter) { ReturnAll result = new ReturnAll(); var ListAllORG = GetEntities(e => !e.IS_DELETED && e.CODE != "003", null, null).OrderBy(e => e.TENANT_CODE).ToList(); string strConn = OPTenantDBConnService.GetConnByORGID(filter.OrgId.Value);//获取数据库链接 List listVNAME = new List() { "vhome_Train_Hour" };//, "vhome_risk_type_data" DataSet ds = new DataSet(); GETDBDATA(strConn, listVNAME, ref ds);//获取视图 数据 listVNAME 与 ds.Tables 一一对应 //培训教育 对应统计 result.listSETrainSum = GetTrainInfo(ds.Tables[0], ListAllORG); string connhead = ConfigurationManager.ConnectionStrings["head"];//删除吧 TPM是没有相对于配置 //风险等级占比 result.riskTypeRate = RiskTypeRateData(strConn); //当日工作票排名前三 result.jobTodayTop3 = JobTodayTopData(connhead, filter.OrgId.Value); //隐患整改率 result.hiddenRectify = HiddenRectifyData(connhead); //各事项排名前三 result.taskTop3 = TaskTopData(connhead); //作业现场完成情况统计 result.jobFinishRate = jobFinishRateData(connhead); //各公司安全检查统计 result.safeCheckSum = safeCheckSumData(connhead); return result; } /// /// 获取视图数据 /// /// /// /// 数据集 /// private void GETDBDATA(string conn, List listVNAME, ref DataSet ds) { List result = new List(); //DataTable Table = new DataTable(); ds = new DataSet(); using (SqlConnection connection = new SqlConnection(conn)) { try { connection.Open(); string sql = string.Empty; foreach (var item in listVNAME) { sql += string.Format(" select * from {0} ", item); } using (SqlCommand Com = new SqlCommand(sql, connection)) { SqlDataAdapter DataADP = new SqlDataAdapter(Com); DataADP.Fill(ds); } connection.Close(); } catch (Exception ex) { if (!string.IsNullOrEmpty(ex.StackTrace)) throw new Exception("错误日志:[StackTrace]" + ex.StackTrace); else throw new Exception("【" + HttpContext.Request.Path + "】错误日志:[Message]" + ex.Message); } } } #region 子方法 /// /// 风险等级占比 /// /// 分页过滤实体 public List RiskTypeRateData(string connhead) { List result = new List(); DataTable Table = new DataTable(); using (SqlConnection connection = new SqlConnection(connhead)) { try { connection.Open(); string sql = "select * from vhome_risk_type_data "; //if (dt != DateTime.Now.Date) //{ // sql += " and crdate>='" + dt + "'"; //} //sql += " order by crdate desc"; using (SqlCommand Com = new SqlCommand(sql, connection)) { SqlDataAdapter Data = new SqlDataAdapter(Com); Data.Fill(Table); } connection.Close(); if (Table != null && Table.Rows.Count > 0) { foreach (DataRow item in Table.Rows) { result.Add(new RiskTypeRate() { riskType = item["风险类别"] != null ? item["风险类别"].ToString() : null, count = int.Parse(item["数量"].ToString()) != 0 ? int.Parse(item["数量"].ToString()) : 0, rate = item["占比"] != null ? item["占比"].ToString() : "0" }); } } } 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 result; } /// /// 当日工作票排名前三 /// /// 参数 /// public List JobTodayTopData(string connhead, Guid orgId) { List result = new List(); var details = new List(); DataTable Table = new DataTable(); DataTable Table2 = new DataTable(); using (SqlConnection connection = new SqlConnection(connhead)) { try { connection.Open(); string sql = "select * from vhome_jobtop3_today "; //if (dt != DateTime.Now.Date) //{ // sql += " and crdate>='" + dt + "'"; //} //sql += " order by crdate desc"; using (SqlCommand Com = new SqlCommand(sql, connection)) { SqlDataAdapter Data = new SqlDataAdapter(Com); Data.Fill(Table); } string sql2 = "select * from vhome_jobdata_today_group "; //if (dt != DateTime.Now.Date) //{ // sql += " and crdate>='" + dt + "'"; //} //sql += " order by crdate desc"; using (SqlCommand Com = new SqlCommand(sql, connection)) { SqlDataAdapter Data = new SqlDataAdapter(Com); Data.Fill(Table2); } connection.Close(); if (Table != null && Table.Rows.Count > 0) { foreach (DataRow item in Table.Rows) { var JobTodayTop3 = new JobTodayTop3(); JobTodayTop3.totalQty = int.Parse(item["今日总数"].ToString()) != 0 ? int.Parse(item["今日总数"].ToString()) : 0; JobTodayTop3.num = int.Parse(item["排名"].ToString()) != 0 ? int.Parse(item["排名"].ToString()) : 0; JobTodayTop3.company = item["公司名称"] != null ? item["公司名称"].ToString() : ""; result.Add(JobTodayTop3); } } if (Table2 != null && Table2.Rows.Count > 0) { foreach (DataRow item2 in Table2.Rows) { var JobTodayDetail = new JobTodayDetail(); JobTodayDetail.qty = int.Parse(item2["cnt"].ToString()) != 0 ? int.Parse(item2["cnt"].ToString()) : 0; JobTodayDetail.jobName = item2["stepid"] != null ? item2["stepid"].ToString() : null; JobTodayDetail.company = item2["db_name"] != null ? item2["db_name"].ToString() : null; details.Add(JobTodayDetail); } } if (result != null && result.Any()) { var steps = this.GetEntities(t => !t.IS_DELETED, new BaseFilter(orgId)); foreach (var da in result) { var temps = details.Where(t => t.company == da.company).ToList(); if (temps.Any()) { var detailTemps = new List(); foreach (var de in temps) { var JobTodayDetail = new JobTodayDetail(); JobTodayDetail.qty = de.qty; JobTodayDetail.jobName = steps.FirstOrDefault(t => t.ID == Guid.Parse(de.jobName))?.NAME; JobTodayDetail.company = de.company; detailTemps.Add(JobTodayDetail); } da.details = detailTemps; } } } } 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 result; } /// /// 隐患整改率 /// /// 参数 /// public HiddenRectify HiddenRectifyData(string connhead) { HiddenRectify result = new HiddenRectify(); DataTable Table = new DataTable(); using (SqlConnection connection = new SqlConnection(connhead)) { try { connection.Open(); string sql = "select * from vhome_hidden_data_result "; //if (dt != DateTime.Now.Date) //{ // sql += " and crdate>='" + dt + "'"; //} //sql += " order by crdate desc"; using (SqlCommand Com = new SqlCommand(sql, connection)) { SqlDataAdapter Data = new SqlDataAdapter(Com); Data.Fill(Table); } connection.Close(); if (Table != null && Table.Rows.Count > 0) { result.qty = int.Parse(Table.Rows[0]["隐患数"].ToString()) != 0 ? int.Parse(Table.Rows[0]["隐患数"].ToString()) : 0; result.ontimeQty = int.Parse(Table.Rows[0]["按期整改数"].ToString()) != 0 ? int.Parse(Table.Rows[0]["按期整改数"].ToString()) : 0; result.delayQty = int.Parse(Table.Rows[0]["延期整改数"].ToString()) != 0 ? int.Parse(Table.Rows[0]["延期整改数"].ToString()) : 0; result.rate = Table.Rows[0]["整改率"] != null ? Table.Rows[0]["整改率"].ToString() : null; } } 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 result; } /// /// 各事项排名前三 /// /// 参数 /// public List TaskTopData(string connhead) { List result = new List(); var dataTemps = new List(); DataTable Table = new DataTable(); using (SqlConnection connection = new SqlConnection(connhead)) { try { connection.Open(); string sql = "select * from vhome_task_data_result "; //if (dt != DateTime.Now.Date) //{ // sql += " and crdate>='" + dt + "'"; //} //sql += " order by crdate desc"; using (SqlCommand Com = new SqlCommand(sql, connection)) { SqlDataAdapter Data = new SqlDataAdapter(Com); Data.Fill(Table); } connection.Close(); if (Table != null && Table.Rows.Count > 0) { foreach (DataRow item in Table.Rows) { var JobTodayTop3 = new TaskTopTemp(); JobTodayTop3.totalQty = int.Parse(item["待办总数"].ToString()) != 0 ? int.Parse(item["待办总数"].ToString()) : 0; JobTodayTop3.qty = int.Parse(item["数量"].ToString()) != 0 ? int.Parse(item["数量"].ToString()) : 0; JobTodayTop3.company = item["公司名称"] != null ? item["公司名称"].ToString() : ""; JobTodayTop3.type = item["类型"] != null ? item["类型"].ToString() : ""; dataTemps.Add(JobTodayTop3); } } if (dataTemps != null && dataTemps.Any()) { var dataGroup = dataTemps.GroupBy(t => new { t.company, t.totalQty }).ToList(); foreach (var da in dataGroup) { var TaskTop3 = new TaskTop3(); TaskTop3.company = da.Key.company; TaskTop3.totalQty = da.Key.totalQty; var temps = dataTemps.Where(t => t.company == da.Key.company).ToList(); if (temps.Any()) { var detailTemps = new List(); foreach (var de in temps) { var JobTodayDetail = new TaskTopDetail(); JobTodayDetail.qty = de.qty; JobTodayDetail.name = de.type; detailTemps.Add(JobTodayDetail); } TaskTop3.details = detailTemps; } result.Add(TaskTop3); } } } 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 result; } /// /// 作业现场完成情况统计 /// /// 参数 /// public List jobFinishRateData(string connhead) { List result = new List(); DataTable Table = new DataTable(); using (SqlConnection connection = new SqlConnection(connhead)) { try { connection.Open(); string sql = "select * from vhome_jobrecord_data "; //if (dt != DateTime.Now.Date) //{ // sql += " and crdate>='" + dt + "'"; //} //sql += " order by crdate desc"; using (SqlCommand Com = new SqlCommand(sql, connection)) { SqlDataAdapter Data = new SqlDataAdapter(Com); Data.Fill(Table); } connection.Close(); if (Table != null && Table.Rows.Count > 0) { foreach (DataRow item in Table.Rows) { result.Add(new JobFinishRate() { name = item["表单名称"] != null ? item["表单名称"].ToString() : null, qty = int.Parse(item["总数"].ToString()) != 0 ? int.Parse(item["总数"].ToString()) : 0, finishQty = int.Parse(item["完成数"].ToString()) != 0 ? int.Parse(item["完成数"].ToString()) : 0, rate = item["完成率"] != null ? item["完成率"].ToString() : null, }); } } } 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 result; } /// /// 各公司安全检查统计 /// /// 参数 /// public List safeCheckSumData(string connhead) { List result = new List(); DataTable Table = new DataTable(); using (SqlConnection connection = new SqlConnection(connhead)) { try { connection.Open(); string sql = "select * from vhome_check_total "; //if (dt != DateTime.Now.Date) //{ // sql += " and crdate>='" + dt + "'"; //} //sql += " order by crdate desc"; using (SqlCommand Com = new SqlCommand(sql, connection)) { SqlDataAdapter Data = new SqlDataAdapter(Com); Data.Fill(Table); } connection.Close(); if (Table != null && Table.Rows.Count > 0) { foreach (DataRow item in Table.Rows) { result.Add(new SafeCheckSum() { company = item["公司名称"] != null ? item["公司名称"].ToString() : null, qty = int.Parse(item["数量"].ToString()) != 0 ? int.Parse(item["数量"].ToString()) : 0, num = int.Parse(item["排名"].ToString()) != 0 ? int.Parse(item["排名"].ToString()) : 0, }); } } } 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 result; } /// /// 数据整理 培训教育 /// /// /// /// private List GetTrainInfo(DataTable dtTRAIN, List listORG) { List ListTRAIN = DataHelper.TableToList(dtTRAIN); List dtInfo = new List(); //所有公司 按月 倒推 6 个月的数据 List listDate = new List(); DateTime dtNowYM = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-01 00:00:00")); for (int i = 0; i < 6; i++) { listDate.Add(dtNowYM.AddMonths(-1 * i)); } foreach (var item in listORG) { SETRAINSHOW SUMCNPer = new SETRAINSHOW(); SUMCNPer.ORG_ID = item.ORG_ID.Value; SUMCNPer.CN = item.NAME; SUMCNPer.dtNowYM = dtNowYM; SUMCNPer.dtNowYM_1 = listDate[1]; SUMCNPer.dtNowYM_2 = listDate[2]; SUMCNPer.dtNowYM_3 = listDate[3]; SUMCNPer.dtNowYM_4 = listDate[4]; SUMCNPer.dtNowYM_5 = listDate[5]; SUMCNPer.SUM_TRAIN_HOUR = ListTRAIN.Where(e => e.ORG_ID == SUMCNPer.ORG_ID && e.START_TIME.Year == listDate[0].Year && e.START_TIME.Month == listDate[0].Month).Sum(e => e.TRAIN_HOUR); SUMCNPer.SUM_TRAIN_HOUR_1 = ListTRAIN.Where(e => e.ORG_ID == SUMCNPer.ORG_ID && e.START_TIME.Year == listDate[1].Year && e.START_TIME.Month == listDate[1].Month).Sum(e => e.TRAIN_HOUR); SUMCNPer.SUM_TRAIN_HOUR_2 = ListTRAIN.Where(e => e.ORG_ID == SUMCNPer.ORG_ID && e.START_TIME.Year == listDate[2].Year && e.START_TIME.Month == listDate[2].Month).Sum(e => e.TRAIN_HOUR); SUMCNPer.SUM_TRAIN_HOUR_3 = ListTRAIN.Where(e => e.ORG_ID == SUMCNPer.ORG_ID && e.START_TIME.Year == listDate[3].Year && e.START_TIME.Month == listDate[3].Month).Sum(e => e.TRAIN_HOUR); SUMCNPer.SUM_TRAIN_HOUR_4 = ListTRAIN.Where(e => e.ORG_ID == SUMCNPer.ORG_ID && e.START_TIME.Year == listDate[4].Year && e.START_TIME.Month == listDate[4].Month).Sum(e => e.TRAIN_HOUR); SUMCNPer.SUM_TRAIN_HOUR_5 = ListTRAIN.Where(e => e.ORG_ID == SUMCNPer.ORG_ID && e.START_TIME.Year == listDate[5].Year && e.START_TIME.Month == listDate[5].Month).Sum(e => e.TRAIN_HOUR); dtInfo.Add(SUMCNPer); } return dtInfo; } #endregion } }