vince
2023-09-04 803697bd4f3ac5262e0acd69d6d7cc519ec45b2a
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
362
363
364
365
366
367
package com.ld.igds.verb.manager;
 
import com.ld.igds.common.CoreCommonService;
import com.ld.igds.common.CoreDeviceService;
import com.ld.igds.common.CoreSerService;
import com.ld.igds.common.DepotStatusService;
import com.ld.igds.common.dto.DepotSerData;
import com.ld.igds.constant.BizType;
import com.ld.igds.constant.DepotType;
import com.ld.igds.constant.DeviceType;
import com.ld.igds.constant.RespCodeEnum;
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.response.DeviceControlResponse;
import com.ld.igds.models.Depot;
import com.ld.igds.models.Device;
import com.ld.igds.models.DeviceSer;
import com.ld.igds.models.DicTrigger;
import com.ld.igds.order.ExeOrderService;
import com.ld.igds.order.data.ExeRequest;
import com.ld.igds.util.ContextUtil;
import com.ld.igds.verb.AreationModel;
import com.ld.igds.verb.dto.VerbParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
 
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
 
 
/**
 * 通风模块-业务管理模块
 */
@Slf4j
@Component
public class VerbManager {
 
    @Resource
    private CoreCommonService coreCommonService;
    @Resource
    private CoreDeviceService coreDeviceService;
    @Resource
    private ExeOrderService exeOrderService;
    @Resource
    private RemoteManager remoteManager;
    @Resource
    private CoreSerService coreSerService;
    @Resource
    private DepotStatusService depotCheckService;
 
    private RemoteControlService remoteControlService;
 
 
    /**
     * 获取手动通风仓库的设备列表
     *
     * @param param
     * @return
     */
    public PageResponse<List<Device>> listDeviceManual(VerbParam 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(),
                    "当前仓库没有获取到设备配置信息,请联管理员!!");
        }
 
        //过滤只获取通风设备:01-风窗,02-轴流窗,0B-通风口,0C-环流风机
        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_01.getCode()))
                listResult.add(item);
            if (item.getType().equals(DeviceType.TYPE_02.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 (item.getType().equals(DeviceType.TYPE_04.getCode()))
                listResult.add(item);
 
            //浅圆仓加上其他设备
            if (DepotType.TYPE_02.getCode().equals(param.getDepotType())) {
                if (item.getType().equals(DeviceType.TYPE_03.getCode()))
                    listResult.add(item);
                if (item.getType().equals(DeviceType.TYPE_04.getCode()))
                    listResult.add(item);
                if (item.getType().equals(DeviceType.TYPE_07.getCode()))
                    listResult.add(item);
            }
        }
 
        if (listResult.isEmpty()) {
            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(),
                    "当前仓库没有获取到通风设备信息,请联系管理员!!");
        }
 
        return new PageResponse<>(RespCodeEnum.CODE_0000,
                listResult);
    }
 
    /**
     * 支持多个分机的设备操作,也就是批量设备操作时候是多个分机执行
     *
     * @param param
     * @return
     */
    public DeviceControlResponse controlDevice(VerbParam 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(),
                    "没有获取到需要被执行的设备信息,请重新选择执行");
        }
        // 添加逻辑验证
        String msg = depotCheckService.checkDepotStatus(param.getCompanyId(), param.getDepotId(), deviceList);
        if (null != msg) {
            return new DeviceControlResponse(
                    OrderRespEnum.ORDER_ERROR.getCode(), msg);
        }
 
        if (!param.isBatchTag()) {
            return controlDevice2(param);
        }
 
        // 如果多个设备,需要对设备按分机进行分组
        Map<String, List<ExeDevice>> deviceMap = this.updateGroupExecute(param);
 
        String temp = "";
        DeviceControlResponse tempResp;
        for (String key : deviceMap.keySet()) {
            param.setDeviceList(deviceMap.get(key));
            tempResp = controlDevice2(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
     * @return
     */
    private Map<String, List<ExeDevice>> updateGroupExecute(VerbParam param) {
 
        Map<String, List<ExeDevice>> result = new HashMap<>();
 
        for (ExeDevice exeDevice : param.getDeviceList()) {
 
            //批量开启通风窗
            if (DeviceType.TYPE_02.getCode().equals(param.getDeviceType()) || DeviceType.TYPE_01.getCode().equals(param.getDeviceType())) {
 
                if (DeviceType.TYPE_02.getCode().equals(exeDevice.getType()) || DeviceType.TYPE_01.getCode().equals(exeDevice.getType())) {
                    exeDevice.setTargetStatus(param.getTargetStatus());
                    if (null == result.get(exeDevice.getSerId())) {
                        result.put(exeDevice.getSerId(), new ArrayList<>());
                    }
                    result.get(exeDevice.getSerId()).add(exeDevice);
                }
 
            }
 
 
            //批量开启通风口
            if (DeviceType.TYPE_0B.getCode().equals(param.getDeviceType()) || DeviceType.TYPE_0C.getCode().equals(param.getDeviceType())) {
 
                if (DeviceType.TYPE_0B.getCode().equals(exeDevice.getType()) || DeviceType.TYPE_0C.getCode().equals(exeDevice.getType())) {
 
                    exeDevice.setTargetStatus(param.getTargetStatus());
 
                    if (null == result.get(exeDevice.getSerId())) {
                        result.put(exeDevice.getSerId(), new ArrayList<>());
                    }
                    result.get(exeDevice.getSerId()).add(exeDevice);
                }
            }
        }
 
        return result;
    }
 
    /**
     * 单个分机设备操作接口管理
     *
     * @param param
     * @return
     */
    public DeviceControlResponse controlDevice2(VerbParam 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.AREATION.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;
    }
 
 
    /**
     * 根据页面所操作的设备,结合其所所属分机进行调整,当前方法可以避免不需要的分机状态查询
     *
     * @param param
     * @return
     */
    public DeviceControlResponse queryDeviceStatus(VerbParam param) {
        if (null == param.getCompanyId()) {
            param.setCompanyId(ContextUtil.getCompanyId());
        }
        if (null == param.getDepotId()) {
            return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "系统没有获取到仓库参数,执行被拒绝。");
        }
 
        if (null == param.getDeviceList() || param.getDeviceList().isEmpty()) {
            return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "没有需要更新的设备信息!!");
        }
 
//        2023-08-31暂时禁用,使用仓库编码获取仓库所有设备的分机信息
        //根据设备所属分机进行分组
//        Map<String, List<ExeDevice>> groupBy = param.getDeviceList().stream().collect(Collectors.groupingBy(ExeDevice::getSerId));
//        DeviceControlResponse response = new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS.getCode(), "命令发送成功!");
//        DeviceSer deviceSer;
//        DeviceControlRequest request;
//        try {
//            for (String serId : groupBy.keySet()) {
 
        Set<String> list = coreDeviceService.getCacheDeviceSerByDepotId(param.getCompanyId(), param.getDepotId());
        DeviceControlResponse response = new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS.getCode(), "命令发送成功!");
        DeviceSer deviceSer;
        DeviceControlRequest request;
 
        try {
             for (String serId : list) {
                deviceSer = coreSerService.getCacheSer(param.getCompanyId(), serId);
                if (null == deviceSer) {
                    log.info("根据仓库{}获取设备状态,分机编码{}的分机不存在,取消执行。", param.getDepotId(), serId);
                    continue;
                }
                request = new DeviceControlRequest();
                request.setDepotId(param.getDepotId());
                request.setCompanyId(param.getCompanyId());
                request.setBizType(BizType.AREATION.getCode());
                request.setIp(deviceSer.getIp());
                request.setPort(deviceSer.getPort());
                request.setSerId(deviceSer.getId());
                request.setControlModel(deviceSer.getControlModel());
                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() + "的协议实现,执行被拒绝!");
                }
                response = remoteControlService.queryStatus(request);
 
                //添加操作缓存日志
                exeOrderService.addControlCache(new ExeRequest(request));
 
                Thread.sleep(1000);
            }
 
        } catch (Exception e) {
            return new DeviceControlResponse(
                    OrderRespEnum.ORDER_ERROR.getCode(), param.getDepotId() + " 执行失败:" + e.getMessage());
        }
        return response;
    }
 
    public List<DicTrigger> listAreationModelTag() {
        List<DicTrigger> list = new ArrayList<>();
        list.add(new DicTrigger(AreationModel.MODEL_01.getCode(), AreationModel.MODEL_01.getMsg()));
        list.add(new DicTrigger(AreationModel.MODEL_02.getCode(), AreationModel.MODEL_02.getMsg()));
        list.add(new DicTrigger(AreationModel.MODEL_03.getCode(), AreationModel.MODEL_03.getMsg()));
        list.add(new DicTrigger(AreationModel.MODEL_04.getCode(), AreationModel.MODEL_04.getMsg()));
        list.add(new DicTrigger(AreationModel.MODEL_05.getCode(), AreationModel.MODEL_05.getMsg()));
 
        list.add(new DicTrigger(AreationModel.MODEL_99.getCode(), AreationModel.MODEL_99.getMsg()));
        return list;
    }
}