package com.fzzy.sys.manager.grain; import com.fzzy.igds.constant.OrderRespEnum; import com.fzzy.igds.constant.RespCodeEnum; import com.fzzy.igds.data.*; import com.fzzy.igds.domain.Depot; import com.fzzy.igds.domain.DepotConf; import com.fzzy.igds.domain.DeviceSer; import com.fzzy.igds.domain.Grain; import com.fzzy.igds.io.manager.RemoteManager; import com.fzzy.igds.io.order.ExeOrderService; import com.fzzy.igds.io.service.RemoteGrainService; import com.fzzy.igds.request.ExeBaseRequest; import com.fzzy.igds.request.GrainReqData; import com.fzzy.igds.request.ReqStatus; import com.fzzy.igds.response.GrainResponse; import com.fzzy.igds.service.DepotConfService; import com.fzzy.igds.service.DepotService; import com.fzzy.igds.service.DeviceSerService; import com.fzzy.igds.service.GrainService; import com.fzzy.igds.utils.ContextUtil; import com.fzzy.igds.utils.DateUtil; import com.fzzy.igds.utils.GrainDataBuilder; import com.fzzy.igds.utils.GrainPrintBuilder; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.text.Collator; import java.util.*; /** * @Description * @Author CZT * @Date 2025/12/9 9:56 */ @Slf4j @Component public class GrainManager { @Resource private DepotService depotService; @Resource private DepotConfService depotConfService; @Resource private GrainService grainService; @Resource private DeviceSerService deviceSerService; @Resource private RemoteManager remoteManager; @Resource private ExeOrderService exeOrderService; @Resource private GrainExportBuilder grainExportBuilder; public PageResponse> queryListGrainData(GrainParam param) { if (StringUtils.isEmpty(param.getDepotId())) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "没有获取到仓库参数。"); } if (StringUtils.isEmpty(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } if (null != param.getCheckDate()) { param.setStart(DateUtil.getCurZero(param.getCheckDate())); param.setEnd(DateUtil.getNextZero(param.getCheckDate())); param.setCheckDate(null); } if (null != param.getCheckMonth()) { param.setStart(DateUtil.getMonthFirst(param.getCheckMonth())); param.setEnd(DateUtil.getNextMonthFirst(param.getCheckMonth())); param.setCheckMonth(null); } List list = grainService.listData(param); if (null == list || list.isEmpty()) { return null; } // 添加仓库信息 Depot depotData = depotService.getCacheDepot(param.getCompanyId(), param.getDepotId()); if (null == depotData) { log.error("未获取到仓库信息"); } List result = new ArrayList<>(); DepotConf depotConf; GrainData data; for (Grain grain : list) { depotConf = depotConfService.getCacheDepotConfByDepotId(grain.getCompanyId(), grain.getDepotId()); data = new GrainData(); BeanUtils.copyProperties(grain, data); GrainDataBuilder.updateGrainData(data, depotConf, depotData.getDepotType()); data.setDepotData(depotData); result.add(data); } for (GrainData grainData : result) { grainData.setDepotData(depotData); } return new PageResponse<>(RespCodeEnum.CODE_0000, result); } /** * 单仓采集 * * @param param * @return */ public GrainResponse checkSingle(GrainParam param) { if (StringUtils.isEmpty(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } if (StringUtils.isEmpty(param.getDeptId())) { param.setDeptId(ContextUtil.subDeptId(null)); } if (StringUtils.isEmpty(param.getDepotId())) { return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "没有获取到仓库参数,请重新选择仓库并执行!"); } try { // 缓存获仓库配置信息 DepotConf depotConf = depotConfService.getCacheDepotConfByDepotId(param.getCompanyId(), param.getDepotId()); if (null == depotConf) { return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "当前仓库没有配置粮情参数,执行被拒绝!"); } // 获取分机信息 DeviceSer deviceSer = deviceSerService.getCacheSer(param.getCompanyId(), depotConf.getGrainSer()); if (null == deviceSer) { return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "当前仓库没有配置粮情分机,执行被拒绝!"); } Depot depot = depotService.getCacheDepot(depotConf.getCompanyId(), depotConf.getDepotId()); //数据封装 ExeBaseRequest request = new ExeBaseRequest(); request.setDepotId(param.getDepotId()); request.setCompanyId(param.getCompanyId()); request.setBizType("grain"); request.setExeUser(ContextUtil.getLoginUserName()); request.setDepotName(depot.getName()); request.setDeptId(ContextUtil.subDeptId(null)); request.setProtocol(deviceSer.getProtocol()); request.setAddLogTag(true); request.setIp(deviceSer.getIp()); request.setPort(deviceSer.getPort()); request.setSerId(deviceSer.getId()); request.setSerName(deviceSer.getName()); request.setSn(deviceSer.getSn()); request.setExeMsg("粮情采集,仓库=" + request.getDepotName()); GrainReqData reqData = new GrainReqData(); reqData.setCableStart(depotConf.getCableStart()); reqData.setCableEnd(depotConf.getCableEnd()); reqData.setCableRule(depotConf.getCableRule()); // 新增温湿度信息 reqData.setThSerId(depotConf.getThSer()); reqData.setThConf(depotConf.getThConf()); //多仓并发标志 reqData.setIsMoreDepot(deviceSer.getIsMoreDepot()); request.setReqData(reqData); RemoteGrainService remoteGrainService = remoteManager.getRemoteGrainService(deviceSer.getProtocol()); if (null == remoteGrainService) { String msg = "系统没有" + request.getProtocol() + "的协议实现,执行被拒绝!"; request.setErrorMsg(msg); request.setStatus(ReqStatus.SEND_ERROR.getCode()); exeOrderService.addLogAndCache(request); return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), msg); } GrainResponse result = remoteGrainService.checkGrain(request); if (!OrderRespEnum.ORDER_SUCCESS.getCode().equals(result.getCode())) { String msg = request.getDepotName() + "请求失败:" + result.getMsg(); request.setErrorMsg(msg); request.setStatus(ReqStatus.SEND_ERROR.getCode()); } exeOrderService.addLogAndCache(request); return result; } catch (Exception e) { log.error("粮情执行异常:{}", e.getLocalizedMessage()); return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "系统异常:" + e.getMessage()); } } /** * 批量采集 * * @param param * @return */ public GrainResponse checkBatch(GrainParam param) { if (null == param.getDepotIds()) { return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "没有获取到仓库参数,请重新选择仓库并执行!"); } if (StringUtils.isEmpty(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } if (StringUtils.isEmpty(param.getDeptId())) { param.setDeptId(ContextUtil.subDeptId(null)); } try { String[] attr = param.getDepotIds().split(","); // 缓存获仓库配置信息 DepotConf depotConf; // 获取分机信息 DeviceSer deviceSer; ExeBaseRequest request; GrainReqData reqData; //执行发送命令 RemoteGrainService remoteGrainService; GrainResponse result; Depot depot; for (String depotId : attr) { param.setDepotId(depotId); //数据封装 request = new ExeBaseRequest(); request.setDepotId(param.getDepotId()); request.setCompanyId(param.getCompanyId()); request.setBizType("grain"); request.setExeUser(ContextUtil.getLoginUserName()); request.setDeptId(ContextUtil.subDeptId(null)); request.setAddLogTag(true); reqData = new GrainReqData(); depotConf = depotConfService.getCacheDepotConfByDepotId(param.getCompanyId(), param.getDepotId()); depot = depotService.getCacheDepot(depotConf.getCompanyId(), depotConf.getDepotId()); if (null == depotConf) { request.setErrorMsg("执行失败,没有获取粮情参数配置"); request.setReqData(reqData); request.setStatus(ReqStatus.SEND_ERROR.getCode()); exeOrderService.addLogAndCache(request); continue; } request.setDepotName(depot.getName()); deviceSer = deviceSerService.getCacheSer(param.getCompanyId(), depotConf.getGrainSer()); if (null == deviceSer) { request.setErrorMsg("执行失败,没有获取到分机信息"); request.setReqData(reqData); request.setStatus(ReqStatus.SEND_ERROR.getCode()); exeOrderService.addLogAndCache(request); continue; } request.setProtocol(deviceSer.getProtocol()); request.setIp(deviceSer.getIp()); request.setPort(deviceSer.getPort()); request.setSerId(deviceSer.getId()); request.setSerName(deviceSer.getName()); request.setSn(deviceSer.getSn()); request.setExeMsg("粮情采集,仓库=" + request.getDepotName()); reqData.setCableStart(depotConf.getCableStart()); reqData.setCableEnd(depotConf.getCableEnd()); reqData.setCableRule(depotConf.getCableRule()); // 新增温湿度信息 reqData.setThSerId(depotConf.getThSer()); reqData.setThConf(depotConf.getThConf()); //多仓并发 reqData.setIsMoreDepot(deviceSer.getIsMoreDepot()); request.setReqData(reqData); //执行命令 remoteGrainService = remoteManager.getRemoteGrainService(deviceSer.getProtocol()); if (null == remoteGrainService) { //发送异常 request.setErrorMsg("系统没有" + request.getProtocol() + "的协议实现,执行被拒绝!"); request.setStatus(ReqStatus.SEND_ERROR.getCode()); exeOrderService.addLogAndCache(request); continue; } result = remoteGrainService.checkGrain(request); if (!OrderRespEnum.ORDER_SUCCESS.getCode().equals(result.getCode())) { request.setErrorMsg(request.getDepotName() + "请求失败:" + result.getMsg()); request.setStatus(ReqStatus.SEND_ERROR.getCode()); } exeOrderService.addLogAndCache(request); Thread.sleep(200); } } catch (Exception e) { return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "后台执行异常:" + e.getMessage()); } return new GrainResponse(OrderRespEnum.ORDER_SUCCESS.getCode(), "批量执行粮情检测命令发送成功,请等待终端响应……"); } /** * * @param param * @return */ public PageResponse> pageListGrainData(GrainParam param) { if (StringUtils.isEmpty(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } if (StringUtils.isEmpty(param.getDepotId())) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "没有获取到仓库参数,执行失败!"); } param.setTagUpdate(false); List list = grainService.listData(param); DepotConf depotConf; GrainData data; Depot depotData; List result = new ArrayList<>(); for (Grain grain : list) { depotConf = depotConfService.getCacheDepotConfByDepotId(grain.getCompanyId(), grain.getDepotId()); data = new GrainData(); BeanUtils.copyProperties(grain, data); // 添加仓库信息 depotData = depotService.getCacheDepot(param.getCompanyId(), param.getDepotId()); GrainDataBuilder.updateGrainData(data, depotConf, depotData.getDepotType()); result.add(data); } if (null == result) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "当前条件下没有获取到粮情信息!!"); } return new PageResponse>(RespCodeEnum.CODE_0000, result); } /** * 根据参数获取当前打印需要的模板 * * @param param * @return */ public PageResponse buildPrintModel(GrainParam param) { if (null == param.getCompanyId()) { param.setCompanyId(ContextUtil.getCompanyId()); } if (StringUtils.isEmpty(param.getDepotType())) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "没有获取到当前仓库的仓库类型"); } if (StringUtils.isEmpty(param.getCableRule()) && StringUtils.isEmpty(param.getCableCir())) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "没有获取当前仓库的布线规则"); } PrintModeData result = GrainPrintBuilder.buildPrintModel(param); if (null == result) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "系统没有获取当前仓库的表单模板"); } if (StringUtils.isNotEmpty(result.getMsg())) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), result.getMsg()); } return new PageResponse<>(RespCodeEnum.CODE_0000, result); } /** * * @param param * @return */ public PageResponse> buildPrintModelAll(GrainParam param) { Map result = new HashMap<>(); List depotConfList = depotConfService.getCacheDepotConfList(param.getCompanyId()); PrintModeData modeData; String key; Depot cacheDepot; for (DepotConf conf : depotConfList) { cacheDepot = depotService.getCacheDepot(param.getCompanyId(), conf.getDepotId()); param.setCableRule(conf.getCableRule()); param.setDepotId(conf.getDepotId()); param.setCableCir(conf.getCableCir()); param.setDepotType(cacheDepot.getDepotType()); if (StringUtils.isNotEmpty(param.getCableCir())) { key = param.getDepotType() + "_" + param.getCableRule() + "_" + param.getCableCir(); } else { key = param.getDepotType() + "_" + param.getCableRule(); } if (null == result.get(key)) { modeData = GrainPrintBuilder.buildPrintModel(param); result.put(key, modeData); } } return new PageResponse<>(RespCodeEnum.CODE_0000, result); } /** * * @param param * @return */ public GrainResponse exportBatch(GrainParam param) { //根据条件获取需要打印的粮情信息 if (null != param.getCheckDate()) { param.setStart(DateUtil.getCurZero(param.getCheckDate())); param.setEnd(DateUtil.getNextZero(param.getCheckDate())); param.setCheckDate(null); } //获取已经粮情格式化完成的粮情数据 param.setTagUpdate(true); PageResponse> listPageResponse = this.pageListGrainData(param); List list = listPageResponse.getData(); if (null == list || list.isEmpty()) { return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "当前条件下没有查询到粮情检测记录,取消导出"); } //按照仓库编码从新排序 Collator sortChina = Collator.getInstance(Locale.CHINA); Collections.sort(list, (a, b) -> sortChina.compare(a.getDepotId(), b.getDepotId())); //获取缓存的仓库列表,用于获取仓库名称 List listDepot = depotService.getCacheDepotList(param.getCompanyId(), param.getDeptId()); //去除重复的粮情数据 LinkedHashMap dataMap = new LinkedHashMap<>(); for (GrainData data : list) { if (null != dataMap.get(data.getDepotId())) continue; dataMap.put(data.getDepotId(), data); } String fileName = grainExportBuilder.exportByMapData(dataMap, listDepot); if (fileName.startsWith("ERROR")) { return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "执行导出出现错误:" + fileName); } return new GrainResponse(OrderRespEnum.ORDER_SUCCESS.getCode(), fileName); } /** * * @param deptId * @return */ public List orderList(String deptId) { return exeOrderService.getAllOrderByDeptId("grain","BIZ", deptId, 2 * 60 * 8); } /** * * @param param * @return */ public PageResponse cleanOrderList(IgdsBaseParam param) { exeOrderService.clean(param.getCompanyId(), "grain", param.getDeptId()); return new PageResponse<>(RespCodeEnum.CODE_0000, "执行成功"); } }