jiazx0107@163.com
2023-05-17 620eab6cca2bc9ef9ea6d3067a0a5ba1deadbd1c
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
package com.ld.igds.temp.manager;
 
import com.ld.igds.common.CoreCommonService;
import com.ld.igds.common.CoreDeviceService;
import com.ld.igds.common.CoreSerService;
import com.ld.igds.common.dto.DepotSerData;
import com.ld.igds.constant.*;
import com.ld.igds.data.PageResponse;
import com.ld.igds.io.RemoteControlService;
import com.ld.igds.io.RemoteManager;
import com.ld.igds.io.constant.OrderRespEnum;
import com.ld.igds.io.request.DeviceControlRequest;
import com.ld.igds.io.request.ExeDevice;
import com.ld.igds.io.request.TempControlRequest;
import com.ld.igds.io.response.DeviceControlResponse;
import com.ld.igds.common.DepotStatusService;
import com.ld.igds.models.Depot;
import com.ld.igds.models.Device;
import com.ld.igds.models.DeviceSer;
import com.ld.igds.order.ExeOrderService;
import com.ld.igds.order.data.ExeRequest;
import com.ld.igds.temp.dto.TempParam;
import com.ld.igds.util.ContextUtil;
 
import lombok.extern.slf4j.Slf4j;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
 
/**
 * 温控控制层
 */
@Slf4j
@Component
public class TempControlManager {
 
    @Autowired
    private CoreCommonService coreCommonService;
    @Autowired
    private CoreDeviceService coreDeviceService;
    @Autowired
    private ExeOrderService exeOrderService;
    @Autowired
    private RemoteManager remoteManager;
    @Autowired
    private CoreSerService coreSerService;
 
    @Autowired
    private DepotStatusService authCheckService;
 
    private RemoteControlService remoteControlService;
 
    /**
     * 获取手动通风仓库的设备列表
     *
     * @param param
     * @return
     */
    public PageResponse<List<Device>> listDeviceManual(TempParam param) {
        List<String> depotIds;
        if (param.isOnlyCurDepot()) {
            depotIds = new ArrayList<>();
            depotIds.add(param.getDepotId());
        } else {
            // 根据仓库缓存获取相同建筑物下的仓库集合
            List<Depot> depotList = coreCommonService.getCacheCommonBuildingDepot(
                    param.getCompanyId(), param.getDepotId());
 
            // 获取ID信息
            depotIds = depotList.stream().map(Depot::getId).collect(Collectors.toList());
        }
 
        // 根据仓库多个ID获取仓库与分机的关系数据
        List<DepotSerData> depotSerDataList = coreCommonService.getCacheDepotSerByDepots(param.getCompanyId(), depotIds);
 
        if (null == depotSerDataList) {
            log.error("没有获取到当前仓库{}的相关分机,执行失败。", param.getDepotId());
            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(),
                    "没有获取到当前仓的分机信息,执行被拒绝!");
        }
 
        List<Device> listAll = new ArrayList<>();// 分机的所有设备
        List<Device> tempList;
        for (DepotSerData depotSerData : depotSerDataList) {
            tempList = coreDeviceService.getCacheDeviceBySerId(param.getCompanyId(), depotSerData.getSerId());
            listAll.addAll(tempList);
        }
 
        if (listAll.isEmpty()) {
            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(),
                    "当前仓库没有获取到设备配置信息,请联管理员!!");
        }
        //过滤只获取温控设备:05-空调
        List<Device> listResult = new ArrayList<>();
        for (Device item : listAll) {
            if (null == item.getType()) continue;
 
            if (param.isOnlyCurDepot() && !param.getDepotId().equals(item.getDepotId())) continue;
 
            if (item.getType().equals(DeviceType.TYPE_05.getCode()))
                listResult.add(item);
            if (item.getType().equals(DeviceType.TYPE_04.getCode()))
                listResult.add(item);
            //浅圆仓加上其他设备
            if (DepotType.TYPE_02.getCode().equals(param.getDepotType())) {
                if (item.getType().equals(DeviceType.TYPE_01.getCode()))
                    listResult.add(item);
                if (item.getType().equals(DeviceType.TYPE_02.getCode()))
                    listResult.add(item);
                if (item.getType().equals(DeviceType.TYPE_03.getCode()))
                    listResult.add(item);
                if (item.getType().equals(DeviceType.TYPE_07.getCode()))
                    listResult.add(item);
                if (item.getType().equals(DeviceType.TYPE_0B.getCode()))
                    listResult.add(item);
                if (item.getType().equals(DeviceType.TYPE_0C.getCode()))
                    listResult.add(item);
            }
        }
 
        if (listResult.isEmpty()) {
            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(),
                    "当前仓库没有获取到温控设备信息,请联系管理员!!");
        }
        return new PageResponse<>(RespCodeEnum.CODE_0000,
                listResult);
    }
 
    public DeviceControlResponse tempControl(TempParam param) {
        if (null == param.getCompanyId()) {
            param.setCompanyId(ContextUtil.getCompanyId());
        }
 
        List<ExeDevice> deviceList = param.getDeviceList();
 
        if (null == deviceList || deviceList.isEmpty()) {
            return new DeviceControlResponse(
                    OrderRespEnum.ORDER_ERROR.getCode(),
                    "没有获取到需要被执行的设备信息,请重新选择执行");
        }
 
        ExeDevice exeDevice = deviceList.get(0);
        if (DeviceType.TYPE_05.getCode().equals(exeDevice.getType())) {
            return tempControl2(param, exeDevice);
        } else {
 
            // 添加逻辑验证
            String msg = authCheckService.checkDepotStatus(param.getCompanyId(), param.getDepotId(), deviceList);
            if (null != msg) {
                return new DeviceControlResponse(
                        OrderRespEnum.ORDER_ERROR.getCode(), msg);
            }
 
            // 如果是单个设备
            if (deviceList.size() == 1) {
                return tempControl3(param);
            }
 
// 如果多个设备,需要对设备按分机进行分组
            Map<String, List<ExeDevice>> deviceMap = deviceList.stream().collect(Collectors.groupingBy(ExeDevice::getSerId));
 
            String temp = "";
            DeviceControlResponse tempResp;
            for (String key : deviceMap.keySet()) {
                param.setDeviceList(deviceMap.get(key));
                tempResp = tempControl3(param);
                if (OrderRespEnum.ORDER_ERROR.getCode().equals(tempResp.getCode())) {
                    temp += tempResp.getMsg();
                }
            }
 
            if ("".equals(temp)) {
                return new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS);
            }
 
            return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(),
                    "发送存在异常:" + temp);
        }
    }
 
    /**
     * 空调设备执行
     *
     * @param param
     * @param exeDevice
     * @return
     */
    private DeviceControlResponse tempControl2(TempParam param, ExeDevice exeDevice) {
 
        // 添加逻辑验证
        String msg = authCheckService.checkDepotStatus(param.getCompanyId(), param.getDepotId(), exeDevice);
        if (null != msg) {
            return new DeviceControlResponse(
                    OrderRespEnum.ORDER_ERROR.getCode(), msg);
        }
 
        // 获取分机信息
        DeviceSer deviceSer = coreSerService.getCacheSer(param.getCompanyId(), exeDevice.getSerId());
 
        if (!Constant.YN_Y.equals(deviceSer.getStatus())) {
            return new DeviceControlResponse(
                    OrderRespEnum.ORDER_ERROR.getCode(),
                    "当前设备所在控制柜【" + deviceSer.getName() + "】不在线,无法执行");
        }
 
        TempControlRequest request = new TempControlRequest();
        request.setDepotId(param.getDepotId());
        request.setCompanyId(param.getCompanyId());
        exeDevice.setTargetStatus(param.getTargetStatus());
        request.setExeDevice(exeDevice);
        request.setBizType(BizType.TEMPCONTROL.getCode());
        request.setIp(deviceSer.getIp());
        request.setPort(deviceSer.getPort());
        request.setSerId(exeDevice.getSerId());
        request.setSerName(deviceSer.getName());
        request.setTargetModel(param.getTargetModel());
        request.setTargetTemp(param.getTargetTemp());
        request.setControlModel(deviceSer.getControlModel());
        request.setDeptId(param.getDeptId());
        request.setDepotName(request.getDepotName() == null ? request.getDepotId() : request.getDepotName());
        request.setSerName(deviceSer.getName());
 
        remoteControlService = remoteManager.getRemoteControlService(deviceSer.getProtocol());
 
        if (null == remoteControlService) {
            return new DeviceControlResponse(
                    OrderRespEnum.ORDER_ERROR.getCode(), "系统没有"
                    + deviceSer.getProtocol() + "的协议实现,执行被拒绝!");
        }
 
        // 更新下设备信息到数据库中
        param.setId(exeDevice.getId());
 
        coreDeviceService.updateTempControlInfo(param);
 
        //添加操作记录
        exeOrderService.addControlCacheAndLog(new ExeRequest(request, true));
 
        return remoteControlService.tempControl(request);
    }
 
 
    /**
     * 非空调设备操作
     *
     * @param param
     * @return
     */
    public DeviceControlResponse tempControl3(TempParam param) {
        List<ExeDevice> deviceList = param.getDeviceList();
        String serId = deviceList.get(0).getSerId();
        // 获取分机信息
        DeviceSer deviceSer = coreSerService.getCacheSer(param.getCompanyId(), serId);
 
        if (Constant.YN_N.equals(deviceSer.getStatus())) {
            return new DeviceControlResponse(
                    OrderRespEnum.ORDER_ERROR.getCode(),
                    "当前设备所属控制柜[" + deviceSer.getName() + "]不在线,执行失败。");
        }
 
        DeviceControlRequest request = new DeviceControlRequest();
        request.setDepotId(param.getDepotId());
        request.setCompanyId(param.getCompanyId());
        request.setDeviceList(deviceList);
        request.setBizType(BizType.TEMPCONTROL.getCode());
        request.setIp(deviceSer.getIp());
        request.setPort(deviceSer.getPort());
        request.setSerId(serId);
        request.setControlModel(deviceSer.getControlModel());
        request.setRealNum(deviceList.size());
        request.setDeptId(param.getDeptId());
        request.setSerName(deviceSer.getName());
        request.setDepotName(request.getDepotName() == null ? request.getDepotId() : request.getDepotName());
 
        remoteControlService = remoteManager.getRemoteControlService(deviceSer.getProtocol());
 
        if (null == remoteControlService) {
            return new DeviceControlResponse(
                    OrderRespEnum.ORDER_ERROR.getCode(), "系统没有"
                    + deviceSer.getProtocol() + "的协议实现,执行被拒绝!");
        }
 
        DeviceControlResponse response = remoteControlService.deviceControl(request);
 
        if (OrderRespEnum.ORDER_SUCCESS.getCode().equals(response.getCode())) {
            exeOrderService.addControlCacheAndLog(new ExeRequest(request, true));
        }
 
        return response;
    }
 
    public DeviceControlResponse queryDeviceStatus(TempParam param) {
        if (null == param.getCompanyId()) {
            param.setCompanyId(ContextUtil.getCompanyId());
        }
        if (null == param.getDepotId()) {
            return new DeviceControlResponse(
                    OrderRespEnum.ORDER_ERROR.getCode(), "系统没有获取到仓库参数,执行被拒绝。");
        }
        // 根据仓库多个ID获取仓库与分机的关系数据
        List<String> depotIds = new ArrayList<String>();
        depotIds.add(param.getDepotId());
        List<DepotSerData> depotSerDataList = coreCommonService
                .getCacheDepotSerByDepots(param.getCompanyId(), depotIds);
 
        if (null == depotSerDataList) {
            return new DeviceControlResponse(
                    OrderRespEnum.ORDER_ERROR.getCode(),
                    "当前仓库没有匹配的控制柜信息,执行被拒绝。");
        }
 
        DeviceControlResponse response = new DeviceControlResponse(
                OrderRespEnum.ORDER_SUCCESS.getCode(), "命令发送成功!");
 
        DeviceSer deviceSer;
        DeviceControlRequest request;
        for (DepotSerData depotSerData : depotSerDataList) {
            deviceSer = coreSerService.getCacheSer(param.getCompanyId(),
                    depotSerData.getSerId());
 
            if (null == deviceSer) {
                log.info("根据仓库{}获取设备状态,分机编码{}的分机不存在,取消执行。", param.getDepotId(),
                        depotSerData.getSerId());
                continue;
            }
 
            request = new DeviceControlRequest();
            request.setDepotId(param.getDepotId());
            request.setCompanyId(param.getCompanyId());
            request.setBizType(BizType.TEMPCONTROL.getCode());
            request.setIp(deviceSer.getIp());
            request.setPort(deviceSer.getPort());
            request.setSerId(deviceSer.getId());
            request.setDeptId(param.getDeptId());
            request.setDepotName(request.getDepotName() == null ? request.getDepotId() : request.getDepotName());
            request.setSerName(deviceSer.getName());
 
            remoteControlService = remoteManager
                    .getRemoteControlService(deviceSer.getProtocol());
 
            if (null == remoteControlService) {
                return new DeviceControlResponse(
                        OrderRespEnum.ORDER_ERROR.getCode(), "系统没有"
                        + deviceSer.getProtocol() + "的协议实现,执行被拒绝!");
            }
 
            response = remoteControlService.queryStatus(request);
 
            //添加操作缓存日志
            exeOrderService.addControlCache(new ExeRequest(request));
        }
 
        return response;
    }
 
}