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.*; 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 com.ld.igds.verb.service.CoreAreationService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 通风模块-业务管理模块 */ @Slf4j @Component public class VerbManager { @Autowired private CoreCommonService coreCommonService; @Autowired private CoreDeviceService coreDeviceService; @Autowired private ExeOrderService exeOrderService; @Autowired private RemoteManager remoteManager; @Autowired private CoreSerService coreSerService; @Autowired private CoreAreationService areationService; @Autowired private DepotStatusService depotCheckService; private RemoteControlService remoteControlService; /** * 获取手动通风仓库的设备列表 * * @param param * @return */ public PageResponse> listDeviceManual(VerbParam param) { List depotIds; if (param.isOnlyCurDepot()) { depotIds = new ArrayList<>(); depotIds.add(param.getDepotId()); } else { // 根据仓库缓存获取相同建筑物下的仓库集合 List depotList = coreCommonService.getCacheCommonBuildingDepot(param.getCompanyId(), param.getDepotId()); // 获取ID信息 depotIds = depotList.stream().map(Depot::getId).collect(Collectors.toList()); } // 根据仓库多个ID获取仓库与分机的关系数据 List depotSerDataList = coreCommonService.getCacheDepotSerByDepots(param.getCompanyId(), depotIds); if (null == depotSerDataList) { log.error("没有获取到当前仓库{}的相关分机,执行失败。", param.getDepotId()); return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "没有获取到当前仓的分机信息,执行被拒绝!"); } List listAll = new ArrayList<>();// 分机的所有设备 List 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 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 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> 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> updateGroupExecute(VerbParam param) { Map> 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 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(), "没有需要更新的设备信息!!"); } //根据设备所属分机进行分组 Map> 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()) { 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 listAreationModelTag() { List 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; } }