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<List<Device>> listDevice(N2Param 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(),
|
"当前仓库没有获取到设备配置信息,请联管理员!!");
|
}
|
|
//过滤只获取气调设备:03-离心风机,04-环流风机,07-阀门,09-主阀门,0D-加压风机
|
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_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<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 (deviceList.size() == 1) {
|
return controlDevice2(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 = 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<ExeDevice> 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<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 {
|
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<List<N2AutoData>> listAuto(N2Param param) {
|
if (null == param.getCompanyId()) {
|
param.setCompanyId(ContextUtil.getCompanyId());
|
}
|
|
List<N2AutoData> 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<List<ExeDevice>> listAutoConf(N2Param param) {
|
if (null == param.getCompanyId()) {
|
param.setCompanyId(ContextUtil.getCompanyId());
|
}
|
if (null == param.getAutoId()) {
|
return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(),
|
"没有获取到当前仓的手动模式信息,执行被拒绝!");
|
}
|
List<ExeDevice> 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<String> 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<String> 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<String>(RespCodeEnum.CODE_1111.getCode(),
|
"没有获取到设备配置信息,执行失败!");
|
}
|
|
String msg = coreN2Service.updateAutoConf(param.getAutoId(),
|
param.getDeviceList());
|
|
return new PageResponse<String>(RespCodeEnum.CODE_0000.getCode(), msg);
|
}
|
|
public List<DicTrigger> listN2ModelTag() {
|
return coreN2Service.listN2ModelTag(Constant.YN_N);
|
}
|
|
public PageResponse<N2IntelTask> queryTaskStatus(N2Param param) {
|
List<N2IntelTask> 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);
|
}
|
}
|