package com.ld.igds.n2.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.*; import com.ld.igds.n2.dto.N2AutoData; import com.ld.igds.n2.dto.N2Param; import com.ld.igds.n2.service.CoreN2Service; import com.ld.igds.order.ExeOrderService; import com.ld.igds.order.data.ExeRequest; import com.ld.igds.util.ContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; 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 N2Manager { @Autowired private CoreCommonService coreCommonService; @Autowired private CoreDeviceService coreDeviceService; @Autowired private ExeOrderService exeOrderService; @Autowired private RemoteManager remoteManager; @Autowired private CoreSerService coreSerService; @Autowired private DepotStatusService depotCheckService; @Autowired private CoreN2Service coreN2Service; @Autowired private N2AutoManager n2ActionManager; /** * 获取气调设备 * * @param param * @return */ public PageResponse> listDevice(N2Param 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(), "当前仓库没有获取到设备配置信息,请联管理员!!"); } //过滤只获取气调设备:03-离心风机,04-环流风机,07-阀门,09-主阀门,0D-加压风机 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_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 (item.getType().equals(DeviceType.TYPE_09.getCode())) listResult.add(item); if (item.getType().equals(DeviceType.TYPE_0D.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_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); } /** * 设备操作接口管理 * * @param param * @return */ public DeviceControlResponse controlDevice(N2Param 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 (deviceList.size() == 1) { return controlDevice2(param); } Map> deviceMap = deviceList.stream().collect(Collectors.groupingBy(ExeDevice::getSerId)); 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); } private DeviceControlResponse controlDevice2(N2Param param) { List deviceList = param.getDeviceList(); if (null == deviceList || deviceList.isEmpty()) { return new DeviceControlResponse( OrderRespEnum.ORDER_ERROR.getCode(), "没有获取到需要被执行的设备信息,请重新选择执行"); } 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.N2.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 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(N2Param 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 { RemoteControlService remoteControlService; 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.N2.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 PageResponse> listAuto(N2Param param) { if (null == param.getCompanyId()) { param.setCompanyId(ContextUtil.getCompanyId()); } List list = coreN2Service.listAutoData(param); if (null == list || list.isEmpty()) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "根据条件没有获取到数据信息,请重试"); } return new PageResponse<>(RespCodeEnum.CODE_0000, list); } public PageResponse> listAutoConf(N2Param param) { if (null == param.getCompanyId()) { param.setCompanyId(ContextUtil.getCompanyId()); } if (null == param.getAutoId()) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "没有获取到当前仓的手动模式信息,执行被拒绝!"); } List list = coreN2Service.listAutoConfData(param); if (null == list || list.isEmpty()) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "根据条件没有获取到数据信息,请重试"); } return new PageResponse<>(RespCodeEnum.CODE_0000, list); } /** * 根据模式ID或者模式标签启动任务并执行 * * @param param * @return */ public DeviceControlResponse runAuto(N2Param param) { if (null == param.getCompanyId()) { param.setCompanyId(ContextUtil.getCompanyId()); } N2AutoData autoData = this.queryAutoData(param); if (null == autoData) { return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "系统未获取到当前动作配置信息,无法执行"); } return n2ActionManager.exeAuto(autoData, param); } /** * 业务逻辑有核心包处理 * * @param param * @return */ public DeviceControlResponse stopAuto(N2Param param) { if (null == param.getCompanyId()) { param.setCompanyId(ContextUtil.getCompanyId()); } N2AutoData autoData = this.queryAutoData(param); if (null == autoData) { return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "系统未获取到当前动作配置信息,无法执行"); } return n2ActionManager.exeAuto(autoData, param); } public N2AutoData queryAutoData(N2Param param) { if (StringUtils.isNotEmpty(param.getAutoId())) { return coreN2Service.queryAutoDataById(param); } if (StringUtils.isNotEmpty(param.getModeTag())) { return coreN2Service.queryAutoDataByModeTag(param); } return null; } public PageResponse updateAuto(N2AutoData data) { if (StringUtils.isEmpty(data.getCompanyId())) { data.setCompanyId(ContextUtil.getCompanyId()); } if (StringUtils.isEmpty(data.getDeptId())) { data.setDeptId(ContextUtil.subDeptId(null)); } String msg = coreN2Service.updateAuto(data); return new PageResponse<>(RespCodeEnum.CODE_0000.getCode(), msg); } /** * @param param * @return */ public PageResponse updateAutoConf(N2Param param) { if (StringUtils.isEmpty(param.getAutoId())) { return new PageResponse<>(RespCodeEnum.CODE_1111.getCode(), "没有获取需要被更新的手动模式参数,执行失败!"); } if (null == param.getDeviceList() || param.getDeviceList().isEmpty()) { return new PageResponse(RespCodeEnum.CODE_1111.getCode(), "没有获取到设备配置信息,执行失败!"); } String msg = coreN2Service.updateAutoConf(param.getAutoId(), param.getDeviceList()); return new PageResponse(RespCodeEnum.CODE_0000.getCode(), msg); } public List listN2ModelTag() { return coreN2Service.listN2ModelTag(Constant.YN_N); } public PageResponse queryTaskStatus(N2Param param) { List listTask = coreN2Service.listIntelTaskByCache(param); if (null == listTask) { return new PageResponse<>(RespCodeEnum.CODE_1008, null); } N2IntelTask task = listTask.get(0); if (null == task) { return new PageResponse<>(RespCodeEnum.CODE_0000, null); } return new PageResponse<>(RespCodeEnum.CODE_0000, task); } }