潘志宝
2025-01-24 a03a193ef81b1e70b0201284f3547c3dfcfc2bfe
提交 | 用户 | 时间
cf757d 1 package com.iailab.module.data.ind.collection.handler;
2
3 import com.alibaba.cloud.commons.lang.StringUtils;
4 import com.iailab.framework.common.constant.CommonConstant;
5 import com.iailab.module.data.common.enums.ItemTypeEnum;
6 import com.iailab.module.data.common.enums.JsErrorCode;
7 import com.iailab.module.data.common.utils.JavaScriptHandler;
8 import com.iailab.module.data.ind.item.entity.IndItemEntity;
9 import com.iailab.module.data.ind.item.service.IndItemCalService;
10 import com.iailab.module.data.ind.item.service.IndItemService;
11 import com.iailab.module.data.ind.item.vo.IndItemCalVO;
12 import com.iailab.module.data.ind.item.vo.IndItemValueVO;
13 import com.iailab.module.data.ind.value.service.IndItemValueService;
14 import lombok.extern.slf4j.Slf4j;
15 import org.springframework.beans.factory.annotation.Autowired;
16 import org.springframework.stereotype.Component;
a9f305 17 import org.springframework.util.CollectionUtils;
cf757d 18
149dd0 19 import javax.annotation.Resource;
cf757d 20 import java.math.BigDecimal;
21 import java.util.*;
22
23 /**
24  * @author PanZhibao
25  * @Description
26  * @createTime 2024年10月04日
27  */
28 @Slf4j
29 @Component
30 public class CalItemHandler {
31
149dd0 32     @Resource
cf757d 33     private JavaScriptHandler javaScriptHandler;
34
35     public static final String regex = "[+\\-\\*\\/\\(\\)\\&\\|\\>\\<]";
36
37     @Autowired
38     private IndItemCalService indItemCalService;
39
40     @Autowired
41     private AtomItemHandler atomItemHandler;
42
43     @Autowired
44     private DerItemHandler derItemHandler;
45
46     @Autowired
47     private IndItemService indItemService;
48
49     public List<IndItemValueVO> queryValue(String itemId) {
50         List<IndItemValueVO> result = new ArrayList<IndItemValueVO>();
51         try {
52             IndItemCalVO indItem = indItemCalService.getByItemId(itemId);
53             String expression = indItem.getExpression();
54             if (StringUtils.isBlank(expression)) {
55                 return result;
56             }
57             String[] arr = expression.split(regex);
58             int dataLength = 0;
59             List<List<IndItemValueVO>> valueMix = new ArrayList<>();
60             for (int i = 0; i < arr.length; i++) {
61                 String s = arr[i];
62                 if (StringUtils.isBlank(s)) {
63                     continue;
64                 }
65                 IndItemEntity subItem = indItemService.getInfoByNo(s);
66                 ItemTypeEnum itemType = ItemTypeEnum.getEumByCode(subItem.getItemType());
a9f305 67                 List<IndItemValueVO> vl = new ArrayList<>();
cf757d 68                 switch (itemType) {
69                     case ATOM:
a9f305 70                         vl = atomItemHandler.queryValue(subItem.getId());
cf757d 71                         break;
72                     case DER:
a9f305 73                         vl = derItemHandler.queryValue(subItem.getId());
cf757d 74                         break;
75                     default:
76                         break;
77                 }
a9f305 78                 if (!CollectionUtils.isEmpty(vl)) {
79                     vl.forEach(vi -> {
80                         vi.setItemNo(s);
81                     });
82                 }
83                 valueMix.add(vl);
cf757d 84             }
85             dataLength = valueMix.get(0).size();
86
87             for (int i = 0; i < dataLength; i++) {
88                 Map<String, IndItemValueVO> dataMap = new HashMap<>();
89                 for (int j = 0; j < valueMix.size(); j++) {
90                     IndItemValueVO valueDTO = valueMix.get(j).get(i);
91                     dataMap.put(valueDTO.getItemNo(), valueDTO);
92                 }
93                 IndItemValueVO itemValue = this.singleCompute(indItem, dataMap);
94                 result.add(itemValue);
95             }
96
97         } catch (Exception ex) {
98             ex.printStackTrace();
99         }
100         return result;
101     }
102
103     public List<IndItemValueVO> queryValue(String itemId, Date startTime, Date endTime) {
104         List<IndItemValueVO> result = new ArrayList<IndItemValueVO>();
105         try {
106             IndItemCalVO indItem = indItemCalService.getByItemId(itemId);
107             String expression = indItem.getExpression();
108             if (StringUtils.isBlank(expression)) {
109                 return result;
110             }
111             String[] arr = expression.split(regex);
112             int dataLength = 0;
113             List<List<IndItemValueVO>> valueMix = new ArrayList<>();
114             for (int i = 0; i < arr.length; i++) {
115                 String s = arr[i];
116                 if (StringUtils.isBlank(s)) {
117                     continue;
118                 }
119                 IndItemEntity subItem = indItemService.getInfoByNo(s);
120                 ItemTypeEnum itemType = ItemTypeEnum.getEumByCode(subItem.getItemType());
121                 switch (itemType) {
122                     case ATOM:
123                         valueMix.add(atomItemHandler.queryValue(subItem.getId()));
124                         break;
125                     case DER:
126                         valueMix.add(derItemHandler.queryValue(subItem.getId(), startTime, endTime));
127                         break;
128                     default:
129                         break;
130                 }
131             }
132             dataLength = valueMix.get(0).size();
133
134             for (int i = 0; i < dataLength; i++) {
135                 Map<String, IndItemValueVO> dataMap = new HashMap<>();
136                 for (int j = 0; j < valueMix.size(); j++) {
137                     IndItemValueVO valueDTO = valueMix.get(j).get(i);
138                     dataMap.put(valueDTO.getItemNo(), valueDTO);
139                 }
140                 IndItemValueVO itemValue = this.singleCompute(indItem, dataMap);
141                 result.add(itemValue);
142             }
143
144         } catch (Exception ex) {
145             ex.printStackTrace();
146         }
147         return result;
148     }
149
150     private IndItemValueVO singleCompute(IndItemCalVO dto, Map<String, IndItemValueVO> dataMap) {
151         IndItemValueVO resultDto = new IndItemValueVO();
152         String dataTime = "";
153         BigDecimal dataValue = CommonConstant.ZERO_VALUE;
154         String expression = dto.getExpression();
155         String[] arr = expression.split(regex);
156
157         for (int i = 0; i < arr.length; i++) {
158             String s = arr[i];
159             if (StringUtils.isNotBlank(s) && dataMap.containsKey(s)) {
160                 dataTime = dataMap.get(s).getDataTime();
161                 if (dataMap.get(s) == null || dataMap.get(s).getDataValue() == null) {
162                     resultDto.setDataTime(dataTime);
163                     return resultDto;
164                 }
165                 expression = expression.replace(s, dataMap.get(s).getDataValue().toString());
166             }
167         }
168         expression = expression.replace("&", "&&");
169         expression = expression.replace("|", "||");
170         expression = expression.replace("False", "false");
171         expression = expression.replace("True", "true");
172         log.info("ItemId=" + dto.getItemId() + ";expression=" + expression);
173         String result = javaScriptHandler.eval(expression);
174         log.info("result=" + result);
175         if (result == null) {
176             return null;
177         } else if (result.contains(JsErrorCode.Infinity.name()) ||
178                 result.contains(JsErrorCode.NaN.name())) {
179             log.info("计算异常,使用默认值");
180         } else {
181             dataValue = new BigDecimal(result);
182         }
183         resultDto.setDataTime(dataTime);
184         resultDto.setDataValue(dataValue);
185         return resultDto;
186     }
187 }