package com.ld.igds.view.manager; import com.ld.igds.common.CoreCommonService; import com.ld.igds.common.CoreSerService; import com.ld.igds.common.dto.THDto; import com.ld.igds.constant.BizType; import com.ld.igds.constant.Constant; import com.ld.igds.io.RemoteCommonService; import com.ld.igds.io.RemoteManager; import com.ld.igds.io.notify.NotifyWebInvoker; import com.ld.igds.io.constant.OrderRespEnum; import com.ld.igds.io.request.CheckThRequest; import com.ld.igds.io.response.BaseResponse; import com.ld.igds.models.DepotConf; import com.ld.igds.models.DeviceSer; import com.ld.igds.order.ExeOrderService; import com.ld.igds.order.data.ExeRequest; import com.ld.igds.th.CoreThService; 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.HashMap; import java.util.List; import java.util.Map; /** * 仓库温湿度管理 * * @author: andy.jia * @description: * @version: * @data:2020年2月17日 */ @Slf4j @Component public class TempManager { @Autowired private CoreCommonService commonService; @Autowired private CoreThService thService; @Autowired private CoreSerService serService; @Autowired private RemoteManager remoteManager; @Autowired private ExeOrderService exeOrderService; @Autowired private NotifyWebInvoker notifyWebInvoker; private RemoteCommonService remoteCommonService; /** * 系统定时检测 */ public void scheduledCheck(String companyId) { try { //获取所有的仓库配置信息 List list = commonService.getCacheDepotConf(companyId); //查看温湿度的配置,同时从当前列表中获取到对应的分机信息 CheckThRequest request; DeviceSer deviceSer; //避免重复 Map tempMap = new HashMap<>(); String key; for (DepotConf conf : list) { if (StringUtils.isEmpty(conf.getThSer())) continue; key = conf.getThSer() + "_" + conf.getThConf(); if (null != tempMap.get(key)) { continue; } tempMap.put(key, conf.getThSer()); deviceSer = serService.getCacheSer(companyId, conf.getThSer()); if (null == deviceSer) { log.warn("根据仓库参数的温湿度分机配置未获取到相应的分机……"); continue; } if (deviceSer.getStatus().equals(Constant.YN_N)) { log.warn("当前分机={},不在线,不执行温湿度度检测。", deviceSer.getName()); notifyWebInvoker.notifyWeb(deviceSer.getCompanyId(), OrderRespEnum.ORDER_ERROR, BizType.SYS, "分机=" + deviceSer.getName() + "不在线,不执行温湿度检测"); //每个设备间隔200毫秒 Thread.sleep(300); continue; } request = new CheckThRequest(); request.setCompanyId(companyId); request.setThConf(conf.getThConf()); request.setDepotId(conf.getDepotId()); request.setIp(deviceSer.getIp()); request.setPort(deviceSer.getPort()); request.setSerId(deviceSer.getId()); request.setDepotName(conf.getDepotName()); request.setSerName(deviceSer.getName()); request.setBizType(BizType.SYS.getCode()); // 避免重复发送命令和添加操作记录 ExeRequest exeRequest = new ExeRequest(request); exeRequest.setAddLogTag(false); exeRequest.setThConf(conf.getThConf()); exeOrderService.checkExecute(exeRequest); //开始调用命令执行 remoteCommonService = remoteManager.getRemoteCommonService(deviceSer.getProtocol()); if (null == remoteCommonService) { log.error("当前分机={}协议没有实现类", deviceSer.getName()); continue; } BaseResponse resp = remoteCommonService.checkTh(request); if (OrderRespEnum.ORDER_SUCCESS.getCode().equals(resp.getCode())) { exeOrderService.addThCache(exeRequest); } else { notifyWebInvoker.notifyWeb(request.getCompanyId(), OrderRespEnum.ORDER_ERROR, BizType.SYS, "粮情分机=" + deviceSer.getName() + "发送温湿度命令信息失败:" + resp.getMsg()); } //每个设备间隔200毫秒 Thread.sleep(200); } } catch (Exception e) { log.error("执行出错:{}", e.getMessage()); } } public THDto getCacheTH(String companyId, String tempSer, String thConf) { return thService.getCacheTH(companyId, tempSer, thConf); } /** * 分机上线时对分机进行一次温湿度采集 * @param companyId 分机组织编码 * @param serId 分机id */ public void checkThBySer(String companyId, String serId) { try { //获取所有的仓库配置信息 List list = commonService.getCacheDepotConf(companyId); //查看温湿度的配置,同时从当前列表中获取到对应的分机信息 CheckThRequest request; DeviceSer deviceSer; //避免重复 Map tempMap = new HashMap<>(); String key; for (DepotConf conf : list) { if (StringUtils.isEmpty(conf.getThSer())) { continue; } if (!serId.equals(conf.getThSer())) { continue; } key = conf.getThSer() + "_" + conf.getThConf(); if (null != tempMap.get(key)) { continue; } tempMap.put(key, conf.getThSer()); deviceSer = serService.getCacheSer(companyId, conf.getThSer()); if (null == deviceSer) { log.warn("根据仓库参数的温湿度分机配置未获取到相应的分机……"); continue; } if (deviceSer.getStatus().equals(Constant.YN_N)) { log.warn("当前分机={},不在线,不执行温湿度度检测。", deviceSer.getName()); notifyWebInvoker.notifyWeb(deviceSer.getCompanyId(), OrderRespEnum.ORDER_ERROR, BizType.SYS, "分机=" + deviceSer.getName() + "不在线,不执行温湿度检测"); //每个设备间隔200毫秒 Thread.sleep(300); continue; } request = new CheckThRequest(); request.setCompanyId(companyId); request.setThConf(conf.getThConf()); request.setDepotId(conf.getDepotId()); request.setIp(deviceSer.getIp()); request.setPort(deviceSer.getPort()); request.setSerId(deviceSer.getId()); request.setDepotName(conf.getDepotName()); request.setSerName(deviceSer.getName()); request.setBizType(BizType.SYS.getCode()); // 避免重复发送命令和添加操作记录 ExeRequest exeRequest = new ExeRequest(request); exeRequest.setAddLogTag(false); exeRequest.setThConf(conf.getThConf()); exeOrderService.checkExecute(exeRequest); //开始调用命令执行 remoteCommonService = remoteManager.getRemoteCommonService(deviceSer.getProtocol()); if (null == remoteCommonService) { log.error("当前分机={}协议没有实现类", deviceSer.getName()); continue; } BaseResponse resp = remoteCommonService.checkTh(request); if (OrderRespEnum.ORDER_SUCCESS.getCode().equals(resp.getCode())) { exeOrderService.addThCache(exeRequest); } else { notifyWebInvoker.notifyWeb(request.getCompanyId(), OrderRespEnum.ORDER_ERROR, BizType.SYS, "粮情分机=" + deviceSer.getName() + "发送温湿度命令信息失败:" + resp.getMsg()); } //每个设备间隔200毫秒 Thread.sleep(200); } } catch (Exception e) { log.error("执行出错:{}", e.getMessage()); } } }