潘志宝
2025-02-24 b4b4596887770a34f80c31ab849068893094dab5
提交 | 用户 | 时间
3205a2 1 package com.iailab.module.data.point.service.impl;
D 2
3 import com.iailab.framework.common.service.impl.BaseServiceImpl;
4 import com.iailab.module.data.api.point.DataPointApiImpl;
5 import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
6 import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
7 import com.iailab.module.data.common.enums.ArcCalculateTypeEnum;
8 import com.iailab.module.data.point.dao.ArcPointDataDao;
9 import com.iailab.module.data.point.entity.ArcPointDataEntity;
10 import com.iailab.module.data.point.entity.ArcPointSettingEntity;
11 import com.iailab.module.data.point.service.ArcPointDataService;
12 import com.iailab.module.data.common.enums.ArcTypeEnum;
13 import com.iailab.module.data.point.service.ArcPointSettingService;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.stereotype.Service;
16
17 import java.math.BigDecimal;
18 import java.text.SimpleDateFormat;
5c2e16 19 import java.util.*;
3205a2 20
D 21
22 @Service
23 public class ArcPointDataServiceImpl extends BaseServiceImpl<ArcPointDataDao, ArcPointDataEntity> implements ArcPointDataService {
24
25     @Autowired
26     private ArcPointSettingService arcPointSettingService;
27
28     @Autowired
29     private DataPointApiImpl dataPointApi;
30
31     //根据归档类型进行归档
32     @Override
33     public void archiving(String type) {
5c2e16 34         Map<String, Object> params = new HashMap<String, Object>();
D 35         params.put("type", type);
3205a2 36         switch (ArcTypeEnum.getEumByCode(type)) {
D 37             case HOUR:
38                 //查询对应类型的归档设置列表
5c2e16 39                 List<ArcPointSettingEntity> arcHourList = arcPointSettingService.list(params);
3205a2 40                 //遍历列表
D 41                 arcHourList.forEach(item -> {
42                     log.debug("开始归档,point:"+item.getPoint());
43                     //获取开始时间
44                     Calendar calendar = Calendar.getInstance();
45                     calendar.add(Calendar.HOUR_OF_DAY, -1);
46                     Date startTime = calendar.getTime();
47                     //通过point编号查询数据
48                     ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
49                     queryDto.setPointNo(item.getPoint());
50                     queryDto.setStart(startTime);
51                     queryDto.setEnd(new Date());
52                     List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
53                     //判断根据计算类型计算
54                     BigDecimal value = calculate(item.getCalculate(), valueList);
55                     //归档
56                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH");
57                     String arcTime = dateFormat.format(startTime);
58                     ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity();
59                     arcPointDataEntity.setId(String.valueOf(new Date().getTime()));
60                     arcPointDataEntity.setArcTime(arcTime);
61                     arcPointDataEntity.setArcId(item.getId());
62                     arcPointDataEntity.setValue(String.valueOf(value));
63                     insert(arcPointDataEntity);
64                     log.debug("归档完成,point:"+item.getPoint());
65                 });
66                 break;
67             case SHIFT:
68                 //查询对应类型的归档设置列表
5c2e16 69                 List<ArcPointSettingEntity> arcShiftList = arcPointSettingService.list(params);
3205a2 70                 //遍历列表
D 71                 arcShiftList.forEach(item -> {
72                     log.debug("开始归档,point:"+item.getPoint());
73                     //获取开始时间
74                     Calendar calendar = Calendar.getInstance();
75                     calendar.add(Calendar.HOUR_OF_DAY, -12);
76                     Date startTime = calendar.getTime();
77                     //通过point编号查询数据
78                     ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
79                     queryDto.setPointNo(item.getPoint());
80                     queryDto.setStart(startTime);
81                     queryDto.setEnd(new Date());
82                     List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
83                     //判断根据计算类型计算
84                     BigDecimal value = calculate(item.getCalculate(), valueList);
85                     //归档
86                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH");
87                     String arcTime = dateFormat.format(startTime);
88                     ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity();
89                     arcPointDataEntity.setId(String.valueOf(new Date().getTime()));
90                     arcPointDataEntity.setArcTime(arcTime);
91                     arcPointDataEntity.setArcId(item.getId());
92                     arcPointDataEntity.setValue(String.valueOf(value));
93                     insert(arcPointDataEntity);
94                     log.debug("归档完成,point:"+item.getPoint());
95                 });
96                 break;
97             case DAY:
98                 //查询对应类型的归档设置列表
5c2e16 99                 List<ArcPointSettingEntity> arcDayList = arcPointSettingService.list(params);
3205a2 100                 //遍历列表
D 101                 arcDayList.forEach(item -> {
102                     log.debug("开始归档,point:"+item.getPoint());
103                     //获取开始时间
104                     Calendar calendar = Calendar.getInstance();
105                     calendar.add(Calendar.DAY_OF_MONTH, -1);
106                     Date startTime = calendar.getTime();
107                     //通过point编号查询数据
108                     ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
109                     queryDto.setPointNo(item.getPoint());
110                     queryDto.setStart(startTime);
111                     queryDto.setEnd(new Date());
112                     List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
113                     //判断根据计算类型计算
114                     BigDecimal value = calculate(item.getCalculate(), valueList);
115                     //归档
116                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
117                     String arcTime = dateFormat.format(startTime);
118                     ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity();
119                     arcPointDataEntity.setId(String.valueOf(new Date().getTime()));
120                     arcPointDataEntity.setArcTime(arcTime);
121                     arcPointDataEntity.setArcId(item.getId());
122                     arcPointDataEntity.setValue(String.valueOf(value));
123                     insert(arcPointDataEntity);
124                     log.debug("归档完成,point:"+item.getPoint());
125                 });
126                 break;
127             case MONTH:
128                 //查询对应类型的归档设置列表
5c2e16 129                 List<ArcPointSettingEntity> arcMonthList = arcPointSettingService.list(params);
3205a2 130                 //遍历列表
D 131                 arcMonthList.forEach(item -> {
132                     log.debug("开始归档,point:"+item.getPoint());
133                     //获取开始时间
134                     Calendar calendar = Calendar.getInstance();
135                     calendar.add(Calendar.MONTH, -1);
136                     Date startTime = calendar.getTime();
137                     //通过point编号查询数据
138                     ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
139                     queryDto.setPointNo(item.getPoint());
140                     queryDto.setStart(startTime);
141                     queryDto.setEnd(new Date());
142                     List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
143                     //判断根据计算类型计算
144                     BigDecimal value = calculate(item.getCalculate(), valueList);
145                     //归档
146                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
147                     String arcTime = dateFormat.format(startTime);
148                     ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity();
149                     arcPointDataEntity.setId(String.valueOf(new Date().getTime()));
150                     arcPointDataEntity.setArcTime(arcTime);
151                     arcPointDataEntity.setArcId(item.getId());
152                     arcPointDataEntity.setValue(String.valueOf(value));
153                     insert(arcPointDataEntity);
154                     log.debug("归档完成,point:"+item.getPoint());
155                 });
156                 break;
157             case YEAR:
158                 //查询对应类型的归档设置列表
5c2e16 159                 List<ArcPointSettingEntity> arcYearList = arcPointSettingService.list(params);
3205a2 160                 //遍历列表
D 161                 arcYearList.forEach(item -> {
162                     log.debug("开始归档,point:"+item.getPoint());
163                     //获取开始时间
164                     Calendar calendar = Calendar.getInstance();
165                     calendar.add(Calendar.YEAR, -1);
166                     Date startTime = calendar.getTime();
167                     //通过point编号查询数据
168                     ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
169                     queryDto.setPointNo(item.getPoint());
170                     queryDto.setStart(startTime);
171                     queryDto.setEnd(new Date());
172                     List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
173                     //判断根据计算类型计算
174                     BigDecimal value = calculate(item.getCalculate(), valueList);
175                     //归档
176                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
177                     String arcTime = dateFormat.format(startTime);
178                     ArcPointDataEntity arcPointDataEntity = new ArcPointDataEntity();
179                     arcPointDataEntity.setId(String.valueOf(new Date().getTime()));
180                     arcPointDataEntity.setArcTime(arcTime);
181                     arcPointDataEntity.setArcId(item.getId());
182                     arcPointDataEntity.setValue(String.valueOf(value));
183                     insert(arcPointDataEntity);
184                     log.debug("归档完成,point:"+item.getPoint());
185                 });
186                 break;
187
188         }
189     }
190
191     private BigDecimal calculate(String calculate, List<ApiPointValueDTO> valueList) {
192         log.debug("开始计算");
193         if (valueList == null || valueList.isEmpty()) {
194             throw new IllegalArgumentException("valueList 为空");
195         }
196
197         BigDecimal value = BigDecimal.ZERO;
198         ArcCalculateTypeEnum calculateType = ArcCalculateTypeEnum.getEumByCode(calculate);
199
200         switch (calculateType) {
201             case NONE:
202                 value = BigDecimal.valueOf(valueList.get(valueList.size() - 1).getV());
203                 break;
204             case SUM:
205                 for (ApiPointValueDTO dto : valueList) {
206                     value = value.add(BigDecimal.valueOf(dto.getV()));
207                 }
208                 break;
209             case DIFF:
210                 if (valueList.size() < 2) {
211                     throw new IllegalArgumentException("valueList size小于2");
212                 }
213                 BigDecimal prev = BigDecimal.valueOf(valueList.get(0).getV());
214                 for (int i = 1; i < valueList.size(); i++) {
215                     BigDecimal curr = BigDecimal.valueOf(valueList.get(i).getV());
216                     value = value.add(curr.subtract(prev));
217                     prev = curr;
218                 }
219                 break;
220             case AVG:
221                 for (ApiPointValueDTO dto : valueList) {
222                     value = value.add(BigDecimal.valueOf(dto.getV()));
223                 }
224                 value = value.divide(BigDecimal.valueOf(valueList.size()), 2, BigDecimal.ROUND_HALF_UP);
225                 break;
226             default:
227                 throw new IllegalArgumentException("没有对应计算方法");
228         }
229         return value;
230     }
231 }