tangxu
2022-10-08 a36faf95b4bee06626f33a82448f93e364b29ec5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
using Microsoft.AspNetCore.Mvc;
using System.Net;
using System.Net.Http.Headers;
using Microsoft.Extensions.Hosting.Internal;
using Microsoft.AspNetCore.Http.Extensions;
using IStation.Untity;
using Furion.DynamicApiController;
using System.ComponentModel.DataAnnotations;
using Mapster;
using IStation.Calculation;
using IStation.Model;
using Microsoft.AspNetCore.Authorization;
using Furion.FriendlyException;
 
namespace IStation.Application
{
    /// <summary>
    /// MonitorGeneralHourRecord
    /// </summary>
    [Route("Run/MonitorGeneralHourRecord/Mgr")]
    [ApiDescriptionSettings("Run", Name = "监测常规时记录(管理)", Order = 930)]
    public class MonitorGeneralHourRecord_MgrController : IDynamicApiController
    {
 
        /// <summary>
        /// 重新分析某个日期区间(仅针对一个常规时分析测点的分析,会删除已有记录)
        /// </summary>
        [Route("AnalyAgainOfDayRange@V1.0")]
        [HttpPost]
        public AnalyAgainMonitorGeneralHourRecordOfDayRangeResultDto AnalyAgainOfDayRange([Required] AnalyAgainMonitorGeneralHourRecordOfDayRangeInput input)
        {
            var corpId = input.CorpID;
            var monitorId = input.MonitorPointID;
            var startDay = input.StartDay.Date;
            var endDay = input.EndDay.Date;
            var monitor = new Service.MonitorPoint().GetExSignalWithSignalTypeByID(corpId, monitorId);
            if (monitor == null)
            {
                throw Oops.Oh(ErrorCodes.D001, $"测点:{monitorId}");
            }
            if (monitor.CronType != Model.Monitor.eCronType.EachHour)
            {
                throw Oops.Oh(ErrorCodes.D002, $"测点:{monitorId}", "不是时测点");
            }
            if (monitor.SourceType != Model.Monitor.eSourceType.Analyse)
            {
                throw Oops.Oh(ErrorCodes.D002, $"测点:{monitorId}", "不是分析测点");
            }
            if (string.IsNullOrEmpty(monitor.SourceParas))
            {
                throw Oops.Oh(ErrorCodes.D002, $"测点:{monitorId}", "未配置分析参数");
            }
            var analyModel = Model.Monitor.AnalyseParameters.ToModel(monitor.SourceParas);
            if (analyModel == null)
            {
                throw Oops.Oh(ErrorCodes.D002, $"测点:{monitorId}", "分析参数配置错误");
            }
            if (string.IsNullOrEmpty(analyModel.FormulaType))
            {
                throw Oops.Oh(ErrorCodes.D002, $"测点:{monitorId}", "未配置公式类型");
            }
            if (string.IsNullOrEmpty(analyModel.FormulaParas))
            {
                throw Oops.Oh(ErrorCodes.D002, $"测点:{monitorId}", "未配置公式参数");
            }
 
            var getMonitorPoint = new Func<long, Model.MonitorPoint_Signal_SignalType>(x => {
                return new Service.MonitorPoint().GetExSignalWithSignalTypeByID(corpId, x);
            });
            var getLastRecord = new Func<long, long, Model.MonitorBasicRecord>((x, y) => {
                return new Service.MonitorHourRecord().GetBySignalIDOfHour(corpId, x, y, startDay.AddDays(-1),24);
            });
            var getRecordList = new Func<long, long,DateTime,DateTime, List<Model.MonitorBasicRecord>>((x, y,st,et) => {
                return new Service.MonitorRealRecord().GetBySignalIDOfTimeRange(corpId, x, y,st,et )?.Select(t => t as Model.MonitorBasicRecord).ToList();
            });
 
            List<Model.MonitorHourRecordPure> recordList = null;
            string msg = string.Empty;
            switch (analyModel.FormulaType)
            {
                case Model.Monitor.FormulaType.Statistics_Max://最大值统计
                    {
                        recordList = MonitorFormulaHistoryCalcuHelper.StatisticalHourMaxValue
                            (startDay, endDay, monitor, analyModel.FormulaParas, getMonitorPoint, getRecordList, getLastRecord, out msg);
                    }
                    break;
                case Model.Monitor.FormulaType.Statistics_Min://最小值统计
                    {
                        recordList = MonitorFormulaHistoryCalcuHelper.StatisticalHourMinValue
                            (startDay, endDay, monitor, analyModel.FormulaParas, getMonitorPoint, getRecordList, getLastRecord, out msg);
                    }
                    break;
                case Model.Monitor.FormulaType.Statistics_Avg://平均值统计
                    {
                        recordList = MonitorFormulaHistoryCalcuHelper.StatisticalHourAvgValue
                            (startDay, endDay, monitor, analyModel.FormulaParas, getMonitorPoint, getRecordList, getLastRecord, out msg);
                    }
                    break;
                case Model.Monitor.FormulaType.Statistics_Diff://差值统计
                    {
                        recordList = MonitorFormulaHistoryCalcuHelper.StatisticalHourDiffValue
                              (startDay, endDay, monitor, analyModel.FormulaParas, getMonitorPoint, getRecordList, getLastRecord, out msg);
                    }
                    break;
                case Model.Monitor.FormulaType.Statistics_Sum://和值统计
                    {
                        recordList = MonitorFormulaHistoryCalcuHelper.StatisticalHourSumValue
                               (startDay, endDay, monitor, analyModel.FormulaParas, getMonitorPoint, getRecordList, getLastRecord, out msg);
                    }
                    break;
                default: msg = $"不支持的公式类型:{analyModel.FormulaType}"; break;
            }
 
            if (recordList == null || recordList.Count < 1)
            {
                return new AnalyAgainMonitorGeneralHourRecordOfDayRangeResultDto(false, msg);
            }
            var bol = new Service.MonitorHourRecord().InsertsAgain(recordList);
            return new AnalyAgainMonitorGeneralHourRecordOfDayRangeResultDto(bol, msg);
        }
 
    }
}