package com.fzzy.igds.io.order; import com.fzzy.igds.constant.Constant; import com.fzzy.igds.constant.RedisConst; import com.fzzy.igds.domain.LogOperation; import com.fzzy.igds.request.ExeBaseRequest; import com.fzzy.igds.request.ReqStatus; import com.fzzy.igds.request.ThReqData; import com.fzzy.igds.service.LogOperationService; import com.fzzy.igds.utils.ContextUtil; import com.ruoyi.common.core.redis.RedisCache; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; /** * @Description 命令执行校验等信息接口 * @Author CZT * @Date 2025/12/9 10:19 */ @Service public class ExeOrderService { @Resource private RedisCache redisCache; @Resource private LogOperationService logService; /** * * @param baseRequest */ public void addCache(ExeBaseRequest baseRequest) { // 添加缓存 this.addReqCache(baseRequest); } /** * * @param request */ public void addLog(ExeBaseRequest request) { // 添加日志 this.addLogByExeReq(request); } /** * * @param baseRequest */ public void addLogAndCache(ExeBaseRequest baseRequest) { // 添加缓存 this.addReqCache(baseRequest); // 添加日志 this.addLogByExeReq(baseRequest); } /** * 存放温湿度命令缓存 * @param request */ public void addThCache(ExeBaseRequest request) { ThReqData reqData = (ThReqData) request.getReqData(); if (null == reqData) return; String key = this.buildExeOrderKey(request.getBizType(), request.getDeptId(), request.getSerId() + "_" + reqData.getThConf(), request.getRequestId()); redisCache.setCacheObject(key, request, 8 * 60, TimeUnit.MINUTES); } /** * * @param companyId * @param serId * @return */ public ExeBaseRequest getControlCache(String companyId, String serId) { String key = Constant.APP_NAME + ":" + companyId + ":DEVICE_CTRL:" + serId; return (ExeBaseRequest) redisCache.getCacheObject(key); } /** * * @param bizType * @param type * @param id * @return */ public List getInProgressOrderById(String bizType, String type, String id) { if (StringUtils.isEmpty(bizType)){ return null; } if (StringUtils.isEmpty(type)){ return null; } if (StringUtils.isEmpty(id)){ return null; } bizType = ":" + bizType; type = ":" + type + ":"; id = ":" + id + ":"; String pattern = Constant.APP_NAME + ":" + RedisConst.KEY_ORDER_PRE + bizType + type + "*"; Collection keys = redisCache.keys(pattern); if (null == keys || keys.isEmpty()) return null; List result = new ArrayList<>(); ExeBaseRequest exeRequest; for (String key : keys) { if (key.indexOf(id) > 0) { exeRequest = (ExeBaseRequest) redisCache.getCacheObject(key); if (null == exeRequest){ continue; } result.add(exeRequest); // if (ReqStatus.IN_PROGRESS.getCode().equals( // exeRequest.getStatus())) { // result.add(exeRequest); // } } } return result; } /** * * @param bizType * @param type * @param deptId * @param timout * @return */ public List getAllOrderByDeptId(String bizType,String type, String deptId, int timout) { if (StringUtils.isEmpty(bizType)) return null; if (StringUtils.isEmpty(deptId)) return null; bizType = ":" + bizType; type = ":" + type; String pattern = Constant.APP_NAME + ":" + RedisConst.KEY_ORDER_PRE + bizType + type + "*"; Collection keys = redisCache.keys(pattern); if (null == keys || keys.isEmpty()) return null; List result = new ArrayList<>(); ExeBaseRequest exeRequest; for (String key : keys) { exeRequest = redisCache.getCacheObject(key); if (null == exeRequest){ continue; } if(exeRequest.getDeptId().equals(deptId)){ if (ReqStatus.IN_PROGRESS.getCode().equals(exeRequest.getStatus()) && timout > 0) { if (System.currentTimeMillis() - exeRequest.getExeTime().getTime() > (timout * 1000)) { exeRequest.setExeMsg("等待超过" + timout + "秒后终端没有反馈"); exeRequest.setStatus(ReqStatus.TIMEOUT_ERROR.getCode()); } } result.add(exeRequest); } } return result; } /** * * @param request * @param isDel */ public void completeCache(ExeBaseRequest request, boolean isDel) { request.setStatus(ReqStatus.COMPLETE.getCode()); if (StringUtils.isNotEmpty(request.getErrorMsg())) { request.setStatus(ReqStatus.ANALYSIS_ERROR.getCode()); } if (isDel) { delReqCache(request); } else { addCache(request); } } /** * * @param companyId * @param bizType * @param deptId */ public void clean(String companyId, String bizType, String deptId) { if (StringUtils.isEmpty(bizType)) return; if (StringUtils.isEmpty(deptId)) return; String pattern = Constant.APP_NAME + ":" + RedisConst.KEY_ORDER_PRE + ":" + bizType + ":" + "*"; Collection keys = redisCache.keys(pattern); if (null == keys || keys.isEmpty()) return; for (String key : keys) { redisCache.deleteObject(key); } } /** * @param request */ public void addLogByExeReq(ExeBaseRequest request) { LogOperation log = new LogOperation(); log.setCompanyId(request.getCompanyId()); log.setOperateUser(ContextUtil.getLoginUserName()); log.setOperateTime(new Date()); log.setBizType(request.getBizType()); log.setDeptId(request.getDeptId()); log.setOperateInfo(request.getExeMsg()); if (StringUtils.isNotEmpty(request.getErrorMsg())) { log.setOperateInfo(request.getExeMsg() + "。" + request.getErrorMsg()); } logService.addLog(log); } /** * 注意:当前存放的是业务执行的命令信息,判断是否存放功能缓存,默认存放 * * @param request */ public void addReqCache(ExeBaseRequest request) { //添加业务缓存 String key = this.buildReqKeyByBiz(request.getBizType(),request.getDepotId(), request.getRequestId()); redisCache.setCacheObject(key, request, 60, TimeUnit.MINUTES); //添加功能缓存 if(request.isAddCacheTag()){ key = this.buildReqKeyByFun(request.getBizType(),request.getSerId(), request.getRequestId()); redisCache.setCacheObject(key, request, 60, TimeUnit.MINUTES); } } /** * 注意:当前存放的是业务执行的命令信息 * * @param request */ public void delReqCache(ExeBaseRequest request) { //删除业务缓存 String key = this.buildReqKeyByBiz(request.getBizType(), request.getDepotId(), request.getRequestId()); redisCache.deleteObject(key); //删除功能缓存 if(request.isAddCacheTag()){ key = this.buildReqKeyByFun(request.getBizType(),request.getSerId(), request.getRequestId()); redisCache.deleteObject(key); } } /** * 业务缓存key,生成规则:igds:ORDER:bizType:BIZ:serId:orderId * * @param bizType * @param depotId * @param orderId * @return */ private String buildReqKeyByBiz(String bizType, String depotId, String orderId) { if (StringUtils.isEmpty(bizType)) bizType = "sys"; if (StringUtils.isEmpty(orderId)) orderId = ContextUtil.getTimeId(10000, 99999); return Constant.APP_NAME + ":" +RedisConst.KEY_ORDER_PRE + ":" + bizType + ":BIZ:" + depotId + ":" + orderId; } /** * 功能缓存key,生成规则:igds:ORDER:bizType:FUN:serId:orderId * * @param bizType * @param serId * @param orderId * @return */ private String buildReqKeyByFun(String bizType, String serId, String orderId) { if (StringUtils.isEmpty(bizType)) bizType = "sys"; if (StringUtils.isEmpty(orderId)) orderId = ContextUtil.getTimeId(10000, 99999); return Constant.APP_NAME + ":" +RedisConst.KEY_ORDER_PRE + ":" + bizType + ":FUN:" + serId + ":" + orderId; } /** * 命令缓存生成规则:appName:KEY_KEY_ORDER:bizType:deptId:serId:orderId * * @param bizType 业务类型 * @param deptId 库区编码 * @param serId 分机编码 * @param orderId * @return */ private String buildExeOrderKey(String bizType, String deptId, String serId, String orderId) { if (StringUtils.isEmpty(bizType)) bizType = "sys"; if (StringUtils.isEmpty(deptId)) deptId = "01"; if (StringUtils.isEmpty(serId)) serId = "0001"; if (StringUtils.isEmpty(orderId)) orderId = "5000"; return Constant.APP_NAME + ":" + RedisConst.KEY_ORDER_PRE + ":" + bizType + ":" + deptId + ":" + serId + ":" + orderId; } }