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