鞍钢鲅鱼圈能源管控系统后端代码
dengzedong
昨天 226ab2258901ba3be9506a1870efea282ac59d14
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
package com.iailab.module.ansteel.job.task;
 
import com.iailab.framework.common.util.date.DateUtils;
import com.iailab.module.ansteel.coking.entity.*;
import com.iailab.module.ansteel.coking.service.*;
import com.iailab.module.ansteel.common.enums.ProcessConfDataTypeEnum;
import com.iailab.module.data.api.ind.IndItemApi;
import com.iailab.module.data.api.ind.dto.ApiIndItemValueDTO;
import com.iailab.module.data.api.point.DataPointApi;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
 
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
 
/**
 * @description: 主图主工序指标
 * @author: dzd
 * @date: 2025/4/27 13:56
 **/
@Slf4j
@Component("runCokingMainTask")
public class RunCokingMainTask implements ITask{
    private Logger logger = LoggerFactory.getLogger(getClass());
 
    @Resource
    private CokingProcessConfService cokingProcessConfService;
    @Resource
    private DataPointApi dataPointApi;
    @Resource
    private IndItemApi indItemApi;
    @Resource
    private CokingProcessMainService cokingProcessMainService;
 
    @Override
    public void run(String processTypes) {
        logger.info("runCokingMainTask,参数为:{}", processTypes);
        try {
 
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.MILLISECOND, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.add(Calendar.DAY_OF_YEAR, -1);
            String clock = DateUtils.format(calendar.getTime(), DateUtils.FORMAT_YEAR_MONTH_DAY);
 
            // 清理旧数据
            cokingProcessMainService.deleteByClock(clock);
 
            String[] split = processTypes.split(",");
            for (String processType : split) {
                CokingProcessConfEntity queryParams = new CokingProcessConfEntity();
                queryParams.setIndType(processType);
                List<CokingProcessConfEntity> list = cokingProcessConfService.list(queryParams);
                if (CollectionUtils.isEmpty(list)) {
                    logger.info("ConfList is Empty");
                    continue;
                }
 
                if (CollectionUtils.isEmpty(list)) {
                    continue;
                }
                List<CokingProcessMainEntity> processMainEntities = new ArrayList<>(list.size());
                for (CokingProcessConfEntity conf : list) {
                    if (StringUtils.isBlank(conf.getDataType())) {
                        logger.info("DataType is Empty");
                        continue;
                    }
                    if (StringUtils.isBlank(conf.getPointNo())) {
                        logger.info("PointNo is Empty");
                        continue;
                    }
                    CokingProcessMainEntity processMainEntity = new CokingProcessMainEntity();
                    processMainEntity.setId(UUID.randomUUID().toString());
                    processMainEntity.setCategory("day");
                    processMainEntity.setClock(clock);
                    processMainEntity.setInfoType(conf.getInfoType());
                    processMainEntity.setIndCode(conf.getIndCode());
                    processMainEntity.setIndName(conf.getIndName());
                    processMainEntity.setSort(conf.getSort());
                    // 日实际值
                    Double value = getConfValue(conf.getDataType(),conf.getPointNo());
                    processMainEntity.setRealValue(value == null ? BigDecimal.ZERO : BigDecimal.valueOf(value));
 
                    // 基准值、理论值 来源模型下发结果
                    Double standValue = getConfValue("DATAPOINT",conf.getExt1());
                    processMainEntity.setStandValue(standValue == null ? BigDecimal.ZERO : BigDecimal.valueOf(standValue));
                    Double theoryValue = getConfValue("DATAPOINT",conf.getExt2());
                    processMainEntity.setTheoryValue(theoryValue == null ? BigDecimal.ZERO : BigDecimal.valueOf(theoryValue));
 
                    // 计算 月累计
                    calendar.add(Calendar.DAY_OF_YEAR, -29);
                    String clock_30 = DateUtils.format(calendar.getTime(), DateUtils.FORMAT_YEAR_MONTH_DAY);
                    List<CokingProcessMainEntity> historyList_30 = cokingProcessMainService.historyList(clock_30, clock, "day",conf.getIndCode());
                    historyList_30.add(processMainEntity);
                    double monthValue = historyList_30.stream().mapToDouble(e -> e.getRealValue().doubleValue()).sum();
                    processMainEntity.setMonthValue(BigDecimal.valueOf(monthValue));
 
                    // 计算 历史平均
                    calendar.add(Calendar.DAY_OF_YEAR, -60);
                    String clock_90 = DateUtils.format(calendar.getTime(), DateUtils.FORMAT_YEAR_MONTH_DAY);
                    List<CokingProcessMainEntity> historyList_90 = cokingProcessMainService.historyList(clock_90, clock, "day",conf.getIndCode());
                    historyList_90.add(processMainEntity);
                    double avgValue = historyList_90.stream().mapToDouble(e -> e.getRealValue().doubleValue()).average().orElse(0.0);
                    processMainEntity.setAvgValue(BigDecimal.valueOf(avgValue));
                    // 历史最优
                    double baseValue = 0.0;
                    if (Double.valueOf(conf.getExt3()) > 0.0) {
                        baseValue = historyList_90.stream().mapToDouble(e -> e.getRealValue().doubleValue()).max().orElse(0.0);
                    }else {
                        baseValue = historyList_90.stream().mapToDouble(e -> e.getRealValue().doubleValue()).min().orElse(0.0);
                    }
                    processMainEntity.setBaseValue(BigDecimal.valueOf(baseValue));
 
 
                    processMainEntities.add(processMainEntity);
                }
                // 计算吨焦产煤气,吨焦产蒸汽,吨焦耗煤气
                Map<String, CokingProcessMainEntity> resultCodeMap = processMainEntities.stream().collect(Collectors.toMap(CokingProcessMainEntity::getIndCode, Function.identity(), (e1, e2) -> e1));
                // 有焦炭产量
                if (resultCodeMap.containsKey("main_jcmq")) {
                    // 焦炭产量
                    BigDecimal jtcl = resultCodeMap.get("main_jcmq").getRealValue();
                    if (jtcl != null && !jtcl.equals(BigDecimal.ZERO)) {
                        processMainEntities.forEach(e -> {
                            // 吨焦产煤气
                            if (e.getIndCode().equals("main_jcmq") && resultCodeMap.containsKey("main_jlmqfs")) {
                                // 焦炉煤气发生
                                BigDecimal mainJlmqfs = resultCodeMap.get("main_jlmqfs").getRealValue();
                                e.setRealValue(mainJlmqfs.divide(jtcl,2,BigDecimal.ROUND_HALF_UP));
                            }
                            // 吨焦产蒸汽
                            if (e.getIndCode().equals("main_djczq") && resultCodeMap.containsKey("main_gxjzqcs")) {
                                // 干熄焦蒸汽产生
                                BigDecimal mainGxjzqcs = resultCodeMap.get("main_gxjzqcs").getRealValue();
                                e.setRealValue(mainGxjzqcs.divide(jtcl,2,BigDecimal.ROUND_HALF_UP));
 
 
                                e.setRealValue(e.getAvgValue());
                                e.setAvgValue(e.getAvgValue().divide(jtcl,2,BigDecimal.ROUND_HALF_UP));
                            }
                            // 吨焦耗煤气
                            if (e.getIndCode().equals("main_djhmq") && resultCodeMap.containsKey("main_glmqxh") && resultCodeMap.containsKey("main_jlmqxh")) {
                                // 高炉煤气消耗
                                BigDecimal mainGlmqxh = resultCodeMap.get("main_glmqxh").getRealValue();
                                // 焦炉煤气消耗
                                BigDecimal mainJlmqxh = resultCodeMap.get("main_jlmqxh").getRealValue();
                                e.setRealValue(mainGlmqxh.add(mainJlmqxh).divide(jtcl,2,BigDecimal.ROUND_HALF_UP));
                            }
                        });
                    }
                }
                cokingProcessMainService.save(processMainEntities);
            }
        } catch (Exception ex) {
            logger.error("runCokingMainTask运行异常",ex);
        }
        logger.info("runCokingMainTask运行完成");
    }
 
    private Double getConfValue(String dataType, String pointNo) {
        Double value = null;
        switch (ProcessConfDataTypeEnum.getEumByCode(dataType)) {
            case DATAPOINT:
                List<String> points = new ArrayList<>();
                points.add(pointNo);
                Map<String, Object> pointsRealValue = dataPointApi.queryPointsRealValue(points);
                if (pointsRealValue.containsKey(pointNo)) {
                    value = Double.valueOf(pointsRealValue.get(pointNo).toString());
                }
                break;
            case IND:
                List<ApiIndItemValueDTO> indValues = indItemApi.queryIndItemDefaultValue(pointNo);
                if (!CollectionUtils.isEmpty(indValues)) {
                    value = Double.valueOf(indValues.get(0).getDataValue().toString());
                }
                break;
            case MODEL:
                break;
            default:
                break;
 
        }
        return value;
    }
}