潘志宝
2025-01-14 cb5066ddca3d7c8d0959b20715f0f46948e6753e
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
package com.iailab.module.data.api.point;
 
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.framework.common.util.date.DateUtils;
import com.iailab.framework.common.util.object.ConvertUtils;
import com.iailab.module.data.api.point.dto.*;
import com.iailab.module.data.influxdb.pojo.InfluxPointValuePOJO;
import com.iailab.module.data.influxdb.service.InfluxDBService;
import com.iailab.module.data.influxdb.service.impl.InfluxDBServiceImpl;
import com.iailab.module.data.point.collection.PointCollector;
import com.iailab.module.data.point.dto.DaMathPointDTO;
import com.iailab.module.data.point.dto.DaPointDTO;
import com.iailab.module.data.point.dto.DaPointWriteValueDTO;
import com.iailab.module.data.point.service.DaMathPointService;
import com.iailab.module.data.point.service.DaPointService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
 
/**
 * @author PanZhibao
 * @Description
 * @createTime 2024年09月02日
 */
@RestController // 提供 RESTful API 接口,给 Feign 调用
@Validated
public class DataPointApiImpl implements DataPointApi {
 
    @Autowired
    private DaPointService daPointService;
 
    @Autowired
    private PointCollector pointCollector;
 
    @Autowired
    private InfluxDBService influxDBService;
 
    @Autowired
    private DaMathPointService daMathPointService;
 
    @Override
    public ApiPointDTO getInfoById(String pointId) {
        return daPointService.getSimpleInfoById(pointId);
    }
 
    @Override
    public List<ApiPointDTO> getInfoByIds(Set<String> pointIds) {
        List<ApiPointDTO> result = new ArrayList<>(pointIds.size());
        for (String pointId : pointIds) {
            result.add(daPointService.getSimpleInfoById(pointId));
        }
        return result;
    }
 
    @Override
    public ApiPointDTO getInfoByNo(String pointNo) {
        return ConvertUtils.sourceToTarget(daPointService.getSimpleInfoByNo(pointNo), ApiPointDTO.class);
    }
 
    @Override
    public Map<String, Object> queryPointsRealValue(List<String> pointNos) {
        return pointCollector.getCurrentValue(pointNos);
    }
 
    @Override
    public Map<String, List<Map<String, Object>>> queryPointsHistoryValue(ApiPointsValueQueryDTO queryDto) {
        Map<String, List<Map<String, Object>>> data = new HashMap<>();
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MILLISECOND, 0);
        if (queryDto.getEnd() == null) {
            queryDto.setEnd(calendar.getTime());
        }
        if (queryDto.getStart() == null) {
            calendar.add(Calendar.HOUR_OF_DAY, -1);
            queryDto.setStart(calendar.getTime());
        }
 
        Map<String, Object> params = new HashMap<>(1);
        params.put("pointNos", queryDto.getPointNos());
        List<DaPointDTO> pointList = daPointService.list(params);
        if (CollectionUtils.isEmpty(pointList)) {
            return data;
        }
        List<InfluxPointValuePOJO> influxParams = pointList.stream().map(item -> {
            InfluxPointValuePOJO pojo = new InfluxPointValuePOJO();
            pojo.setPoint(item.getPointNo());
            pojo.setType(item.getDataType());
            return pojo;
        }).collect(Collectors.toList());
        data = influxDBService.queryPointsValues(influxParams, queryDto.getStart(), queryDto.getEnd());
        return data;
    }
 
    @Override
    public List<ApiPointValueDTO> queryPointHistoryValue(ApiPointValueQueryDTO queryDto) {
        DaPointDTO daPointDTO = daPointService.getByNo(queryDto.getPointNo());
        InfluxPointValuePOJO pojo = new InfluxPointValuePOJO();
        pojo.setPoint(queryDto.getPointNo());
        pojo.setType(daPointDTO.getDataType());
        Date startTime = queryDto.getStart();
        Date endTime = queryDto.getEnd();
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MILLISECOND, 0);
        if (endTime == null) {
            endTime = calendar.getTime();
        }
        if (startTime == null) {
            calendar.add(Calendar.HOUR_OF_DAY, -1);
            startTime = calendar.getTime();
        }
        List<Map<String, Object>> list = influxDBService.queryPointValues(pojo, startTime, endTime);
        List<ApiPointValueDTO> pointValueList = new ArrayList<>();
        for (int i = 0; list.size() - i >= 1; i++) {
            ApiPointValueDTO pointValue = new ApiPointValueDTO();
            pointValue.setV(Double.parseDouble(list.get(i).get(InfluxDBServiceImpl.VALUE).toString()));
            pointValue.setT(DateUtils.parse(list.get(i).get(InfluxDBServiceImpl.TIME).toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
            pointValueList.add(pointValue);
        }
        return pointValueList;
    }
 
    @Override
    public Boolean writePointRealValue(ApiPointValueWriteDTO writeDTO) {
        try {
            DaPointWriteValueDTO wr = new DaPointWriteValueDTO();
            wr.setPointNo(writeDTO.getPointNo());
            wr.setPointValue(writeDTO.getValue());
            pointCollector.setValue(wr);
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
    }
 
    @Override
    public PageResult<ApiPointDTO> getPageByNo(String pointNo) {
        DaPointDTO daPointDTO = daPointService.getSimpleInfoByNo(pointNo);
        DaMathPointDTO daMathPointDTO = daMathPointService.getByPoint(daPointDTO.getId());
        String[] pointNos = daMathPointDTO.getExpression().split("[-+]+");
        HashMap<Integer, String> map = new HashMap<>();
        IntStream.range(0, pointNos.length).forEach(i -> map.put(i, pointNos[i]));
        List<String> pointNosL = new ArrayList<>();
        for (String value : map.values()) {
            pointNosL.add(value);
        }
        PageResult<ApiPointDTO> pageResult = daPointService.getPointPage(map);
        Map<String, Object> CurrentValueMap = pointCollector.getCurrentValue(pointNosL);
        pageResult.getList().stream().map(item -> {
            item.setCurrentValue(CurrentValueMap.get(item.getPointNo()));
            return item;
        }).collect(Collectors.toList());
        return pageResult;
    }
}