LargeScreenBoardService.cs 8.7 KB
using Hh.Mes.Common.DataTableTo;
using Hh.Mes.Common.log;
using Hh.Mes.Pojo.System;
using Hh.Mes.POJO.ApiEntity;
using Hh.Mes.POJO.Entity;
using Hh.Mes.POJO.EnumEntitys;
using Hh.Mes.POJO.Response;
using Hh.Mes.POJO.ViewModel.Equipment;
using Hh.Mes.POJO.WebEntity.configure;
using Hh.Mes.Service.Repository;
using Hh.Mes.Service.WebService.Equipment;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;

namespace Hh.Mes.Service
{
    public class LargeScreenBoardService : RepositorySqlSugar<sys_user>
    {

        #region 2号厂房看板IOT故障妥善率数据
        public dynamic GetProjectAlarmAndProperRate(string yyyyMonth)
        {
            var response = new ResponseNew();
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var month = Convert.ToDateTime(yyyyMonth);
                var whereSql = @" where  t1.CreateTime>='{0}' and t1.CreateTime<='{1}' and t1.EquipmentTypeCode not in ('{2}')";
                //月初、月末
                var monthStart = month.AddDays(1 - month.Day);
                var monthEnd = month.AddDays(1 - month.Day).Date.AddMonths(1).AddSeconds(-1);
                var sqlWhereMonth = string.Format(whereSql, monthStart.ToString("yyyy-MM-dd HH:mm:ss"), monthEnd.ToString("yyyy-MM-dd HH:mm:ss"), SystemVariable.LargetScreenBoardNotContainDevice);//月数据源查询条件

                ////周一、周末改为近七天,如果跨月不计算跨月的那几天
                ////计算前七天日期是否跨月,如果跨月,取当前月1号日期
                //// 计算前七天的日期
                //var sevenDaysAgo = month.AddDays(-6);
                //var weekOne = sevenDaysAgo;
                //// 判断是否跨月
                //if (sevenDaysAgo.Month != month.Month)
                //{
                //    // 如果跨月,取当前月1号日期
                //    DateTime firstDayOfCurrentMonth = new DateTime(month.Year, month.Month, 1);
                //    weekOne= firstDayOfCurrentMonth;
                //}
                //var weekend = month.ToString("yyyy-MM-dd 23:59:59");
                //var sqlWhereWeek = string.Format(whereSql, weekOne, weekend, SystemVariable.LargetScreenBoardNotContainDevice);

                var sql = GetSql(sqlWhereMonth);
                var ds = Context.Ado.GetDataSetAll(sql);

                var diffDay = DateTime.DaysInMonth(month.Year, month.Month);
                var monthStr = monthStart.ToString("MM-dd") + "~" + monthEnd.ToString("MM-dd");
                //var weekStr = weekOne.ToString("MM-dd") + "~" + DateTime.Parse(weekend).ToString("MM-dd");
                Tuple<DataSet, int, string> dss = new Tuple<DataSet, int, string>(ds, diffDay, monthStr);

                ////当天是否在本周内
                //var nowDay = DateTime.Now;
                //var selectDay = Convert.ToDateTime(yyyyMonth);
                //var startWeekDay = nowDay.AddDays(-(int)nowDay.DayOfWeek + 1).ToString("yyyy-MM-dd 00:00:00");//当前周的周一日期
                //var weekOnes = selectDay.AddDays(0 - (Convert.ToInt16(selectDay.DayOfWeek) == 0 ? 7 : Convert.ToInt16(selectDay.DayOfWeek)) + 1).ToString("yyyy-MM-dd 00:00:00");//当前所选周的周一日期
                //var isInterval = false;
                //if (startWeekDay == weekOnes) isInterval = true;

                response.data = new
                {
                    listMonth = dss.Item1.Tables[0],//每个项目月故障分
                    listMonthInfo = dss.Item1.Tables[1],//月故障数据明细
                    listMonthTopTen = dss.Item1.Tables[2],//前10
                     
                    diffDay = dss.Item2,
                    monthStr = dss.Item3,//月日期范围
                    properlyTarget = dss.Item1.Tables[3],
                    factoryTarget = dss.Item1.Tables[4],
                };
                return response;
            });
         }

        public string GetSql(string sqlWhereMonth)
        {
            var selectSql = "SELECT ProjectCode,projectName,sumTime=SUM(ErrorDuration) ";
            var sqlMonth = selectSql + "FROM #listMonth t";
            var groupBySql = " group by projectCode,projectName order by sumTime desc";
            sqlMonth += groupBySql;
            //只查询长沙、徐州、昆山三个项目的
            //var projectKeys = base.GetProjectInfoKeys(base.sysUserApiAccount);
            var projectKeys = new List<string>() { "16B7E641-A53E-404B-9237-33B8C19C7F55", "FA801C18-AB32-4ED9-B913-D5158883E800","A08FF98A-DFC5-4DFF-9ACF-74D7C2BDCF26"};
            var sql = @$"  -----------------本月公共数据源 ErrorDuration 已转化分)--------------------------------------------
                         IF OBJECT_ID('Tempdb..#listMonth') IS NOT NULL
                         DROP TABLE #listMonth;
                         SELECT * INTO #listMonth FROM (
                                     SELECT rownumber=ROW_NUMBER() OVER (PARTITION BY EquipmentCode, CONVERT(VARCHAR(16), t1.CreateTime, 120), CONVERT(VARCHAR(16), t1.UpdateTime, 120)
                                                      ORDER BY EquipmentCode), 
                                            t1.CreateTime AS Created,
                                            t1.UpdateTime AS Updated,
                                            ErrorDuration= CAST(t1.ErrorDuration/60.0 as DECIMAL(10, 2)) ,
                                            t1.EquipmentCode,
                                            t1.AlarmMessage + ';' + ISNULL(t1.Remark,'') AS Alarm,
                                            t1.EquipmentName,
                                            t1.EquipmentPropName,
                                            t1.EquipmentTypeCode,
                                            t1.ProjectCode,
                                            p.projectName AS ProjectName
                                    FROM dbo.daq_equipment_alarm_record t1 with(nolock)
                                    LEFT JOIN dbo.base_project p  ON p.projectCode = t1.ProjectCode
							       {sqlWhereMonth}
                                   and p.keys in('{string.Join("','", projectKeys)}') 
                          )t;
                         ----------------<#listMonth 处理相同设备在同年月日时分数据>----------------
                         DELETE FROM #listMonth   WHERE rownumber > 1 or ErrorDuration>60;
 
                        ----------------故障時間本月开始listMonth0 表格1---------------------------
                        {sqlMonth} 
                        ----------------故障時間 月初、月末结束------------------------------------

                        SELECT * FROM  #listmonth;

                        ----------------故障持续时间最长的10 表格2 Start--------------------------------
                        --按故障分,汇总持续分钟数
                        -- 基于 #listMonth 表进行查询和处理
                        WITH RankedAlarms AS (
                            SELECT 
                                -- 使用 ROW_NUMBER() 函数生成行号,并转换为字母标识
                                LetterIdentifier = CHAR(64 + ROW_NUMBER() OVER (ORDER BY SUM(ErrorDuration) DESC)),
                                Alarm,
                                -- 计算每种 Alarm 类型的持续时间总和
                                sumTime = SUM(ErrorDuration),
                                -- 计算每种 Alarm 类型的出现次数
                                [count] = COUNT(1)
                            FROM 
                                #listMonth
                            GROUP BY 
                                Alarm
                        )
                        --  RankedAlarms CTE 中选择数据并输出
                        SELECT 
                            top 10
                            LetterIdentifier,
                            Alarm,
                            sumTime,
                            [count]
                        FROM 
                            RankedAlarms
                        ORDER BY 
                            -- 按照持续时间总和降序排序
                            sumTime DESC;   
                        ----------------故障持续时间最长的10 表格2 End-----------------------------------


                       --妥善率目标 
                       select dictValue FROM dbo.sys_dict_data  WHERE dictLabel='properlyTarget'
                       
                       --仓库可设定 
                       select dictValue FROM dbo.sys_dict_data  WHERE dictLabel='factoryTarget'";
            return sql;
        }
        #endregion
    }
}