using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using SqlSugar;
using Hh.Mes.Service.Repository;
using Hh.Mes.POJO.Entity;
using Hh.Mes.POJO.ApiEntity;
using Microsoft.AspNetCore.Mvc;
using NPOI.SS.Formula.Functions;
using System.Data.SqlTypes;
using System.Linq;
using Hh.Mes.Common.log;
using Hh.Mes.POJO.Response;
using Hh.Mes.Pojo.System;

namespace Hh.Mes.Service.ApiService
{
    public class DashboardService : RepositorySqlSugar<sys_user_online>
    {
        /// <summary>
        /// 故障报告
        /// </summary>
        /// <param name="yyyyMonth">日期</param>
        /// <param name="project">项目</param>
        /// <param name="equipmentType">设备类型</param>
        /// <returns></returns>
        public dynamic GetFaultReport(string yyyyMonth, string projectCode, string equipmentTypeCode)
        {
            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, monthEnd, SystemVariable.IotNotContainDevice);//月数据源查询条件

                //周一、周末
                var weekOne = month.AddDays(0 - (Convert.ToInt16(month.DayOfWeek) == 0 ? 7 : Convert.ToInt16(month.DayOfWeek)) + 1).ToString("yyyy-MM-dd 00:00:00");
                var weekend = month.AddDays(6 - (Convert.ToInt16(month.DayOfWeek) == 0 ? 7 : Convert.ToInt16(month.DayOfWeek)) + 1).ToString("yyyy-MM-dd 23:59:59");
                var sqlWhereWeek = string.Format(whereSql, weekOne, weekend, SystemVariable.IotNotContainDevice);

                var sql = GetSql(sqlWhereMonth, sqlWhereWeek, projectCode, equipmentTypeCode);
                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 = DateTime.Parse(weekOne).ToString("MM-dd") + "~" + DateTime.Parse(weekend).ToString("MM-dd");
                Tuple<DataSet, int, string, string> dss = new Tuple<DataSet, int, string, string>(ds, diffDay, monthStr, weekStr);

                //当天是否在本周内
                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],
                    listWeek = dss.Item1.Tables[1],
                    listAlarmSum40 = dss.Item1.Tables[2],

                    diffDay = dss.Item2,
                    monthStr = dss.Item3,
                    weekStr = dss.Item4,

                    weekDefault = dss.Item1.Tables[3],
                    properlyTarget = dss.Item1.Tables[4],
                    factoryTarget = dss.Item1.Tables[5],

                    isInterval = isInterval
                };
                return response;
            });

        }
        public string GetSql(string sqlWhereMonth, string sqlWhereWeek, string projectCode, string equipmentTypeCode)
        {
            var selectSql = "SELECT ProjectCode,projectName,sumTime=SUM(ErrorDuration) ";
            var sqlMonth = selectSql + "FROM #listMonth t";
            var sqlWeek = selectSql + "FROM #listWeek t";
            if (!string.IsNullOrEmpty(projectCode) && !string.IsNullOrEmpty(equipmentTypeCode))
            {
                var whereSql = $"WHERE t.projectCode='{projectCode}' and t.equipmentTypeCode='{equipmentTypeCode}'";
                sqlMonth += whereSql;
                sqlWeek += whereSql;
            }
            if (!string.IsNullOrEmpty(projectCode) && string.IsNullOrEmpty(equipmentTypeCode))
            {
                var whereSql = $"WHERE t.projectCode='{projectCode}'";
                sqlMonth += whereSql;
                sqlWeek += whereSql;
            }
            if (string.IsNullOrEmpty(projectCode) && !string.IsNullOrEmpty(equipmentTypeCode))
            {
                var whereSql = $"WHERE t.equipmentTypeCode='{equipmentTypeCode}'";
                sqlMonth += whereSql;
                sqlWeek += whereSql;
            }

            var groupBySql = " group by projectCode,projectName order by sumTime desc";
            sqlMonth += groupBySql;
            sqlWeek += groupBySql;

            var sql = @$"  -----------------本月公共数据源--------------------------------------------
                         IF OBJECT_ID('Tempdb..#listMonth') IS NOT NULL
                         DROP TABLE #listMonth;
                         SELECT * INTO #listMonth FROM (
                                     SELECT t1.CreateTime AS Created,
                                            t1.UpdateTime AS Updated,
                                            t1.ErrorDuration,
                                            t1.EquipmentCode,
                                            t1.AlarmMessage + t1.Remark AS Alarm,
                                            t1.EquipmentName,
                                            t1.EquipmentPropName,
                                            t1.EquipmentTypeCode,
                                            t1.ProjectCode,
                                            p.projectName AS ProjectName,
                                            t.name AS EquipmentTypeName
                                    FROM dbo.daq_equipment_alarm_record t1
                                        LEFT JOIN dbo.base_project p
                                            ON p.projectCode = t1.ProjectCode
                                        LEFT JOIN dbo.base_equipment_type t
                                            ON t.code = t1.EquipmentTypeCode
							       {sqlWhereMonth} AND t1.ErrorDuration>=60
                          )t;
                         ----------------<#listMonth 处理相同设备在同年月日时分数据>----------------
                        WITH CTE
                        AS (SELECT ROW_NUMBER() OVER (PARTITION BY e.EquipmentCode,
                                                                   SUBSTRING(CONVERT(VARCHAR(50), e.Created, 120), 1, 16),
                                                                   SUBSTRING(CONVERT(VARCHAR(50), e.updated, 120), 1, 16)
                                                      ORDER BY EquipmentCode
                                                     ) AS rownumber,
                                   *
                            FROM #listMonth e)
                        DELETE FROM CTE
                        WHERE rownumber > 1;

                         -----------------本周公共数据源  #listWeek--------------------------------------------
                        IF OBJECT_ID('Tempdb..#listWeek') IS NOT NULL
                        DROP TABLE #listWeek;
                        SELECT *
                        INTO #listWeek
                        FROM
                        (
                            SELECT t1.CreateTime AS created,
                                   t1.UpdateTime AS updated,
                                   t1.ErrorDuration,
                                   t1.EquipmentCode,
                                   t1.EquipmentName,
                                   t1.EquipmentPropName,
                                   t1.Id AS EquipmentAlarmId,
                                   t1.AlarmMessage + t1.Remark AS Alarm,
                                   t1.ProjectCode,
                                   t1.EquipmentTypeCode,
                                   t.name AS EquipmentTypeName,
                                   p.projectName AS ProjectName
                            FROM dbo.daq_equipment_alarm_record t1
                                LEFT JOIN dbo.base_equipment_type t
                                    ON t.code = t1.EquipmentTypeCode
                                LEFT JOIN dbo.base_project p
                                    ON p.projectCode = t1.ProjectCode
                           {sqlWhereWeek} AND t1.ErrorDuration>=60
                        ) t;
                        
                        ----------------listWeek 处理相同设备在同年月日时分数据>----------------
                        WITH CTE
                        AS (SELECT ROW_NUMBER() OVER (PARTITION BY e.EquipmentCode,
                                                                   SUBSTRING(CONVERT(VARCHAR(50), e.Created, 120), 1, 16),
                                                                   SUBSTRING(CONVERT(VARCHAR(50), e.updated, 120), 1, 16)
                                                      ORDER BY EquipmentCode
                                                     ) AS rownumber,
                                   *
                            FROM #listWeek e)
                        DELETE FROM CTE
                        WHERE rownumber > 1;
 
                        ----------------故障時間本月开始listMonth0 表格1-------------------------------
                        {sqlMonth} 
                        ----------------故障時間 月初、月末结束-------------------------------

                        ----------------故障時間本周开始listWeek1 表格1-------------------------------
                        {sqlWeek}
                         ----------------故障時間本周结束-------------------------------

                        --------------本周故障時間列表超過40分开始 (数据表ErrorDuration字段是记录以秒为单位,所以换算一下 40*60)----------------
                        SELECT t.*,
                               eh.HandleInfo,
                               eh.HandleUser,
                               eh.Reason
                        FROM #listweek t
                            LEFT JOIN bus_equipment_alarm_handle eh
                                ON eh.EquipmentAlarmRecordId = t.EquipmentAlarmId
                        WHERE t.ErrorDuration > 2400
                        ORDER BY t.ErrorDuration DESC;
                        -------------本周故障時間列表超過40分结束-------------------------------------

                       ---weekDefault  
                       SELECT dictValue FROM dbo.sys_dict_data WHERE dictLabel='weekDefault'

                       --妥善率目标 
                       select dictValue FROM dbo.sys_dict_data  WHERE dictLabel='properlyTarget'
                       
                       --仓库可设定 
                       select dictValue FROM dbo.sys_dict_data  WHERE dictLabel='factoryTarget'

                      ";
            return sql;
        }


        /// <summary>
        /// 本周每天故障数据
        /// </summary>
        /// <param name="startDay"></param>
        /// <param name="endDay"></param>
        /// <returns></returns>
        public dynamic GetEquipmentWeekDayFaultInfo(string startDay, string endDay, string projectCode)
        {
            var response = new ResponseNew();
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                DataSet ds;
                string startTime = startDay.TrimEnd() + " 00:00:00";
                string endTime = endDay.TrimEnd() + " 23:59:59";
                string sqlWhereWeek = @$" where  t1.CreateTime>='{startTime}' and t1.CreateTime<='{endTime}' and t1.EquipmentTypeCode not in ('{SystemVariable.IotNotContainDevice}')";
            
                //按故障内容汇总
                var sqlWeek = @"select name = t.ProjectName,  --项目
                                alarm = t.Alarm,                --故障内容
                                sumTime = sum(t.ErrorDuration) --故障:秒
                          from  #listWeekFaultInfo t 
                          where  
                               t.ProjectCode='{0}' and
                               t.created>='{1}' and t.created<='{2}' 
	                      group by t.ProjectName,t.Alarm";
                sqlWeek = string.Format(sqlWeek, projectCode, startTime, endTime);

                string sql = @$"    -----------------本周公共数据源--------------------------------------------
                        IF OBJECT_ID('Tempdb..#listWeekFaultInfo') IS NOT NULL
                        DROP TABLE #listWeekFaultInfo;
                        SELECT *
                        INTO #listWeekFaultInfo
                        FROM
                        (
                            SELECT t1.CreateTime AS created,
                                   t1.UpdateTime AS updated,
                                   t1.ErrorDuration,
                                   t1.EquipmentCode,
                                   t1.EquipmentName,
                                   t1.EquipmentPropName,
                                   t1.Id,
                                   t1.AlarmMessage + t1.Remark AS Alarm,
                                   t1.ProjectCode,
                                   t1.EquipmentTypeCode,
                                   t.name AS EquipmentTypeName,
                                   p.projectName AS ProjectName
                            FROM dbo.daq_equipment_alarm_record t1
                                LEFT JOIN dbo.base_equipment_type t
                                    ON t.code = t1.EquipmentTypeCode
                                LEFT JOIN dbo.base_project p
                                    ON p.projectCode = t1.ProjectCode
                           {sqlWhereWeek} AND t1.ErrorDuration>=60
                        ) t;
                        
                         ---------------- #listWeekFaultInfo处理相同设备在同年月日时分数据>----------------
                        WITH CTE
                        AS (SELECT ROW_NUMBER() OVER (PARTITION BY e.EquipmentCode,
                                                                   SUBSTRING(CONVERT(VARCHAR(50), e.Created, 120), 1, 16),
                                                                   SUBSTRING(CONVERT(VARCHAR(50), e.updated, 120), 1, 16)
                                                      ORDER BY EquipmentCode
                                                     ) AS rownumber,
                                   *
                            FROM #listWeekFaultInfo e)
                        DELETE FROM CTE
                        WHERE rownumber > 1;  
                      -------本周所选设备每天故障分柱状图数据来源
                      {sqlWeek}
                      
                      -----------本周每天设备故障详情-------------
                        SELECT t.Id,
                                t.ProjectName,
                                t.EquipmentTypeName,
                                t.EquipmentCode,
                                t.EquipmentName,
                                t.Alarm,
                                sumtime = t.ErrorDuration,
                                t.Created,
                                t.Updated,
                                h.Reason,
                                h.HandleInfo,
                                h.HandleUser
                        FROM #listWeekFaultInfo t
                            LEFT JOIN dbo.bus_equipment_alarm_handle h
                                ON h.EquipmentAlarmRecordId = t.Id
                        ORDER BY sumtime DESC;
                        DROP TABLE #listWeekFaultInfo; ";
                ds = Context.Ado.GetDataSetAll(sql);

                response.data = new
                {
                    top = ds.Tables[0],
                    table = ds.Tables[1],
                };
                response.count = ds.Tables[1].Rows.Count;
                return response;
            });
        }


        /// <summary>
        /// 故障統計分析
        /// </summary>
        /// <returns></returns>
        public dynamic FaultStatistics(string begin, string end, string projectCode, string equipmentTypeCode)
        {
            var response = new ResponseNew();
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var sql = @"   IF OBJECT_ID('tempdb..#equipmentTempAlarm') IS NOT NULL
                            DROP TABLE #equipmentTempAlarm;
                            WITH CTE
                            AS (SELECT ROW_NUMBER() OVER (PARTITION BY EquipmentCode,
                                                                       CONVERT(VARCHAR(16), t1.CreateTime, 120),
                                                                       CONVERT(VARCHAR(16), t1.UpdateTime, 120)
                                                          ORDER BY EquipmentCode
                                                         ) AS rownumber,
                                       t1.*,
                                       p.projectName,
                                       t.name AS equipmentTypeName
                                FROM dbo.daq_equipment_alarm_record t1
                                    LEFT JOIN dbo.base_project p
                                        ON p.projectCode = t1.ProjectCode
                                    LEFT JOIN dbo.base_equipment_type t
                                        ON t.code = t1.EquipmentTypeCode
                                WHERE 1 = 1 {0}
                                      AND t1.CreateTime >= '{1}'
                                      AND t1.CreateTime <= '{2}' 
                                      AND t1.EquipmentTypeCode not in ('{3}')
                                )
                            SELECT *
                            INTO #equipmentTempAlarm
                            FROM CTE;
                            DELETE FROM #equipmentTempAlarm
                            WHERE rownumber > 1;

                            SELECT *
                            FROM
                            (
                                SELECT t1.EquipmentCode,
                                       t1.EquipmentName,
                                       Alarm =  t1.AlarmMessage+','+ t1.Remark,
                                       AlarmStart = t1.CreateTime,
                                       AlarmEnd = t1.UpdateTime,
                                       sumTimeAlarm = (t1.ErrorDuration),
                                       t1.projectName,
                                       t1.equipmentTypeName,
                                       t2.HandleInfo,
                                       HandleUser = ISNULL(t2.HandleUser, ''),
                                       HandleTime = t2.CreateTime,
                                       Reason = t2.Reason
                                FROM #equipmentTempAlarm t1
                                    LEFT JOIN dbo.bus_equipment_alarm_handle t2
                                        ON t1.Id = t2.EquipmentAlarmRecordId
                            ";
                sql += " )tt where sumTimeAlarm >= 60 ";
                sql += "order by  tt.projectName,tt.EquipmentCode, tt.AlarmStart DESC ";

                var whereSql = "";
                if (!string.IsNullOrEmpty(projectCode) && !string.IsNullOrEmpty(equipmentTypeCode))
                {
                    whereSql = $"and t1.projectCode='{projectCode}' and t1.equipmentTypeCode='{equipmentTypeCode}'";
                }
                if (!string.IsNullOrEmpty(projectCode) && string.IsNullOrEmpty(equipmentTypeCode))
                {
                    whereSql = $"and t1.projectCode='{projectCode}'";
                }
                if (string.IsNullOrEmpty(projectCode) && !string.IsNullOrEmpty(equipmentTypeCode))
                {
                    whereSql = $"and t1.equipmentTypeCode='{equipmentTypeCode}'";
                }

                sql = string.Format(sql, whereSql, begin, end, SystemVariable.IotNotContainDevice);
                var dt = Context.Ado.GetDataTable(sql);

                response.data = dt;
                response.count = dt.Rows.Count;
                response.code = 200;
                return response;
            }, catchRetrunValue: "list");
        }



        /// <summary>
        /// 妥善率报表查询
        /// </summary>
        /// <param name="startTime"></param>
        /// <param name="endTime"></param>
        /// <param name="eqCode"></param>
        /// <param name="yearOrdaySelectVal">传年或者日</param>
        /// <param name="timeFlag">值有year、month、day</param>
        /// <returns></returns>
        public dynamic GetProperRate(string startTime, string endTime, string yearOrdaySelectVal, string timeFlag, string projectCode, string equipmentTypeCode)
        {
            var response = new ResponseNew();
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                if (timeFlag == "year")
                {
                    startTime = yearOrdaySelectVal + "-01-01";
                    endTime = yearOrdaySelectVal + "-12-31";
                }
                else if (timeFlag == "day")
                {
                    startTime = yearOrdaySelectVal;
                    endTime = yearOrdaySelectVal;
                }

                var whereSql = "";
                if (!string.IsNullOrEmpty(projectCode) && !string.IsNullOrEmpty(equipmentTypeCode))
                {
                    whereSql = $"and t1.projectCode='{projectCode}' and t1.equipmentTypeCode='{equipmentTypeCode}'";
                }
                if (!string.IsNullOrEmpty(projectCode) && string.IsNullOrEmpty(equipmentTypeCode))
                {
                    whereSql = $"and t1.projectCode='{projectCode}'";
                }
                if (string.IsNullOrEmpty(projectCode) && !string.IsNullOrEmpty(equipmentTypeCode))
                {
                    whereSql = $"and t1.equipmentTypeCode='{equipmentTypeCode}'";
                }

                var startDate = startTime + " 00:00:00";
                var endDate = endTime + " 23:59:59";
                var sqlWhere = $" where  t1.CreateTime>='{startDate}' and t1.CreateTime<='{endDate}' and t1.EquipmentTypeCode not in ('{SystemVariable.IotNotContainDevice}')";

                var sql = GetRateSql(sqlWhere, timeFlag, whereSql);
                var dt = Context.Ado.GetDataTable(sql);

                response.data = dt;
                response.count = dt.Rows.Count;
                return response;
            }, catchRetrunValue: "list");
        }

        public string GetRateSql(string sqlWhere, string timeFlag, string whereSql)
        {
            var sql = "";

            if (!string.IsNullOrEmpty(sql))
            {
                sql += " union all ";
            }
            if (timeFlag == "year")
            {
                sql += @"select CONVERT(varchar(7),created,120) as date,
                                sumTime = sum(ErrorDuration),
                                ProjectName
                            from  #tempdbRate t 
                            where  1=1 {0}
	                        group by CONVERT(varchar(7),created,120),
                                ProjectName";
            }
            else
            {
                sql += @"select CONVERT(varchar,created,23) as date,
                                sumTime = sum(ErrorDuration),
                                ProjectName
                            from  #tempdbRate t 
                            where  1=1 {0}
	                        group by CONVERT(varchar,created,23) ,
                                ProjectName";
            }
            sql = string.Format(sql, whereSql);

            var resSql = @$"     
                        -----------------数据源--------------------------------------------
                        IF OBJECT_ID('Tempdb..#tempdbRate') IS NOT NULL
                        DROP TABLE #tempdbRate;
                        SELECT *
                        INTO #tempdbRate
                        FROM
                        (
                            SELECT t1.CreateTime AS created,
                                   t1.UpdateTime AS updated,
                                   t1.ErrorDuration,
                                   t1.EquipmentCode,
                                   t1.EquipmentName,
                                   t1.EquipmentPropName,
                                   t1.Id AS EquipmentAlarmId,
                                   t1.AlarmMessage + t1.Remark AS Alarm,
                                   t1.ProjectCode,
                                   t1.EquipmentTypeCode,
                                   t.name AS EquipmentTypeName,
                                   p.projectName AS ProjectName
                            FROM dbo.daq_equipment_alarm_record t1
                                LEFT JOIN dbo.base_equipment_type t
                                    ON t.code = t1.EquipmentTypeCode
                                LEFT JOIN dbo.base_project p
                                    ON p.projectCode = t1.ProjectCode
                           {sqlWhere} AND t1.ErrorDuration>=60
                        ) t;
                        
                        ----------------listWeek 处理相同设备在同年月日时分数据>----------------
                        WITH CTE
                        AS (SELECT ROW_NUMBER() OVER (PARTITION BY e.EquipmentCode,
                                                                   SUBSTRING(CONVERT(VARCHAR(50), e.Created, 120), 1, 16),
                                                                   SUBSTRING(CONVERT(VARCHAR(50), e.updated, 120), 1, 16)
                                                      ORDER BY EquipmentCode
                                                     ) AS rownumber,
                                   *
                            FROM #tempdbRate e)
                        DELETE FROM CTE
                        WHERE rownumber > 1;
                         -----------------时间段故障总结--------------------------------------------
                        {sql}
                      ";
            return resSql;
        }


        /// <summary>
        /// 查询故障月份对比数据(只查三个月)
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="projectCode">项目</param>
        /// <param name="equipmentTypeCode">设备类型</param>
        /// <returns></returns>
        public dynamic GetFailureMonthCompare(int year, int month, string projectCode, string equipmentTypeCode)
        {
            var response = new ResponseNew();
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                if (string.IsNullOrEmpty(projectCode))
                {
                    response.code = 500;
                    response.status = false;
                    response.message = "请选择一个项目";
                    return response;
                }
                DateTime startTime = new DateTime(year, month, 1).AddMonths(-2);//所选日期近三月的第一天
                DateTime endTime = new DateTime(year, month, 1, 23, 59, 59).AddMonths(1).AddDays(-1);//得出最后一天
                var whereSql = "";
                if (!string.IsNullOrEmpty(projectCode) && !string.IsNullOrEmpty(equipmentTypeCode))
                {
                    whereSql = $"and t1.projectCode='{projectCode}' and t1.equipmentTypeCode='{equipmentTypeCode}'";
                }
                if (!string.IsNullOrEmpty(projectCode) && string.IsNullOrEmpty(equipmentTypeCode))
                {
                    whereSql = $"and t1.projectCode='{projectCode}'";
                }
                var sql = @"SELECT t1.AlarmMessage + t1.Remark AS Alarm,
                               SUM(t1.ErrorDuration) AS SumTime,
                               CONVERT(CHAR(7), t1.CreateTime, 120) AS YearMonth
                        FROM dbo.daq_equipment_alarm_record t1
                        WHERE t1.CreateTime >= '{0}'
                              AND t1.CreateTime <= '{1}'
                              AND t1.EquipmentTypeCode not in ('{2}')
                              {3}
                        GROUP BY CONVERT(CHAR(7), t1.CreateTime, 120),
                                 t1.AlarmMessage + t1.Remark
                        ORDER BY CONVERT(CHAR(7), t1.CreateTime, 120);";
                sql = string.Format(sql, startTime, endTime,SystemVariable.IotNotContainDevice, whereSql);
                DataTable dt = Context.Ado.GetDataTable(sql);
                //处理没有数据的赋值0
                var alarmDt = dt.AsEnumerable().GroupBy(x => x["Alarm"]).Distinct().Select(x => x.Key).ToList();
                for (int i = 0; i < 3; i++)
                {
                    DateTime t = new DateTime(year, month, 1).AddMonths(-i);
                    string currentTime = t.ToString("yyyy-MM");
                    foreach (string alarm in alarmDt)
                    {
                        var isHave = dt.AsEnumerable().Any(x => x["YearMonth"].ToString() == currentTime && x["Alarm"].ToString().TrimEnd() == alarm);
                        if (!isHave)
                        {
                            //DataRow newRow = dt.NewRow();
                            //newRow["Alarm"] = alarm;
                            //newRow["SumTime"] = 0;
                            //newRow["YearMonth"] = currentTime;
                            //dt.Rows.Add(newRow);
                            dt.Rows.Add(alarm, 0, currentTime);
                        }
                    }
                }

                response.code = 200;
                response.data = dt;
                response.count = dt.Rows.Count;
                return response;
            }, catchRetrunValue: "list");
        }
    }
}