package com.dy.pipIrrWechat.command; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.dy.common.multiDataSource.DataSourceContext; import com.dy.common.mw.protocol.Command; import com.dy.common.mw.protocol.p206V1.CodeV1; import com.dy.common.mw.protocol.p206V1.ProtocolConstantV206V1; import com.dy.common.mw.protocol.p206V1.downVos.Com97Vo; import com.dy.common.mw.protocol.p206V1.downVos.Com98Vo; import com.dy.common.mw.protocol.p206V1.downVos.ComA1Vo; import com.dy.common.mw.protocol.p206V2.ProtocolConstantV206V2; import com.dy.common.mw.protocol.p206V202404.CodeV202404; import com.dy.common.mw.protocol.p206V202404.ProtocolConstantV206V202404; import com.dy.common.mw.protocol.p206V202404.downVos.ComCd92_A2Vo; import com.dy.common.mw.protocol.p206V202404.downVos.ComCd93_A3Vo; import com.dy.common.util.IDLongGenerator; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrGlobal.command.ComSupport; import com.dy.pipIrrGlobal.command.dto.Param; import com.dy.pipIrrGlobal.daoIr.IrIntakeOperateMapper; import com.dy.pipIrrGlobal.daoPr.PrIntakeMapper; import com.dy.pipIrrGlobal.daoPr.PrIntakeVcMapper; import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper; import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper; import com.dy.pipIrrGlobal.daoRm.RmIrrigateProfileMapper; import com.dy.pipIrrGlobal.daoRm.RmOpenCloseValveLastMapper; import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper; import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper; import com.dy.pipIrrGlobal.pojoIr.IrIntakeOperate; import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory; import com.dy.pipIrrGlobal.pojoSe.SeClientCard; import com.dy.pipIrrGlobal.voRm.VoIrrigaterProfile; import com.dy.pipIrrGlobal.voRm.VoRtuAndVc; import com.dy.pipIrrGlobal.voRm.VoUnclosedValve; import com.dy.pipIrrGlobal.voSe.VoVirtualCard; import com.dy.pipIrrWechat.command.dto.AutomaticClose; import com.dy.pipIrrWechat.command.dto.ValveClose; import com.dy.pipIrrWechat.command.dto.ValveOpen; import com.dy.pipIrrWechat.result.WechatResultCode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; /** * @author ZhuBaoMin * @date 2024-05-30 16:13 * @LastEditTime 2024-05-30 16:13 * @Description */ @Slf4j @Service @RequiredArgsConstructor public class CommandSv extends ComSupport { private final RmCommandHistoryMapper rmCommandHistoryMapper; private final SeVirtualCardMapper seVirtualCardMapper; private final PrIntakeMapper prIntakeMapper; private final PrWaterPriceMapper prWaterPriceMapper; private final PrIntakeVcMapper prIntakeVcMapper; private final SeClientCardMapper seClientCardMapper; private final RmIrrigateProfileMapper rmIrrigateProfileMapper; private final RmOpenCloseValveLastMapper rmOpenCloseValveLastMapper; //private final PrCommonIntakesMapper prCommonIntakesMapper; private final IrIntakeOperateMapper irIntakeOperateMapper; @Value("${mw.rtuCallbackUrl_wx}") private String rtuCallbackUrl_wx; /** * pro_mw:属性 * tag从控制器中获取 * key_mw:url的key */ private Environment env = null; private String pro_mw = "mw"; private String key_mw = "comSendUrl"; @Autowired public CommandSv(RmCommandHistoryMapper rmCommandHistoryMapper,RmOpenCloseValveLastMapper rmOpenCloseValveLastMapper, SeVirtualCardMapper seVirtualCardMapper, PrIntakeMapper prIntakeMapper, PrWaterPriceMapper prWaterPriceMapper, PrIntakeVcMapper prIntakeVcMapper, SeClientCardMapper seClientCardMapper, RmIrrigateProfileMapper rmIrrigateProfileMapper, Environment env, IrIntakeOperateMapper irIntakeOperateMapper) { this.rmCommandHistoryMapper = rmCommandHistoryMapper; this.rmOpenCloseValveLastMapper = rmOpenCloseValveLastMapper; //this.prCommonIntakesMapper = prCommonIntakesMapper; this.seVirtualCardMapper = seVirtualCardMapper; this.prIntakeMapper = prIntakeMapper; this.prWaterPriceMapper = prWaterPriceMapper; this.prIntakeVcMapper = prIntakeVcMapper; this.seClientCardMapper = seClientCardMapper; this.rmIrrigateProfileMapper = rmIrrigateProfileMapper; this.env = env; this.irIntakeOperateMapper = irIntakeOperateMapper; } /** * 虚拟卡ID换虚拟卡对象 * @param vcId * @return */ public VoVirtualCard getVcById(Long vcId) { return seVirtualCardMapper.getVcById(vcId); } /** * 获取水价 * @return */ public Double getPrice() { return prWaterPriceMapper.getPrice(); } /** * 根据操作员ID获取未关阀记录(包含在线情况) * @param operator * @return */ public List getUnclosedValves(Long operator) { Command com = new Command() ; com.id = Command.defaultId; com.code = "LCD0001"; com.type = "innerCommand"; comSendUrl = env.getProperty(pro_mw + "." + DataSourceContext.get() + "." + key_mw); JSONObject response = (JSONObject) JSON.toJSON(sendCom2Mw(com)); JSONArray jsonArray = new JSONArray(); if(response != null && response.getString("code").equals("0001")) { JSONObject attachment = response.getJSONObject("content").getJSONObject("attachment"); if(attachment != null) { attachment.forEach((key, value) -> { JSONObject jsonObject = new JSONObject(); jsonObject.put("rtuAddr", key); jsonObject.put("isOnLine", value); jsonArray.add(jsonObject); }); } //System.out.println(jsonArray.toJSONString()); } /** * 获取未关阀的RTU地址和虚拟卡编号对数组 * 遍历数组获取最后命令日志ID集合 */ List rtus = rmCommandHistoryMapper.getUnclosedRtus(operator); String comIds = ""; if(rtus != null && rtus.size() > 0) { for (int i = 0; i < rtus.size(); i++) { Long comId = rmCommandHistoryMapper.getLastComId(rtus.get(i).getRtuAddr(), rtus.get(i).getVcNum()); if(comId > 0) { comIds = comIds + "\"" + comId + "\","; } } } if(comIds.length() > 0) { comIds = comIds.substring(0, comIds.length()-1); List res = rmCommandHistoryMapper.getUnclosedValves(jsonArray.toJSONString(), comIds); if(res != null) { return res; } } return new ArrayList<>(); } /** * 为指定(阀控器地址、水卡编号、无关阀记录)开关阀最新记录添加关阀时间,使之不在未关阀记录中显示 * @param rtuAddr * @param icCardNo * @return */ public Integer addClostTime(String rtuAddr, String icCardNo) { return rmOpenCloseValveLastMapper.addCloseTime(rtuAddr, icCardNo); } /** * 根据取水口ID获取与之绑定虚拟卡ID * @param intakeId * @return */ public Long getVcIdByIntakeId(Long intakeId) { return prIntakeVcMapper.getVcIdByIntakeId(intakeId); } /** * 根据水卡编号获取水卡对象,远程充值使用 * @param cardId * @return */ public SeClientCard geClientCardByCardId(Long cardId) { return seClientCardMapper.selectByPrimaryKey(cardId); } /** * 添加命令日志 * @param po 命令日志对象 * @return 字符串类型的主键 */ public Long insert(RmCommandHistory po) { rmCommandHistoryMapper.insert(po); return po.getComId(); } /** * 修改命令日志信息 * @param po 命令日志对象 * @return 影响记录数量 */ public Integer update(RmCommandHistory po) { return rmCommandHistoryMapper.updateByPrimaryKeySelective(po); } /** * 取水口名称换取水口ID,扫码开阀使用 * @param intakeName * @return */ public Long getIntakeIdByName(String intakeName) { return prIntakeMapper.getIntakeIdByName(intakeName); } /** * 根据配置类型获取配置值 * @param type * @return */ QueryResultVo> getIrrPro(Integer type) { QueryResultVo> rsVo = new QueryResultVo<>() ; rsVo.obj = rmIrrigateProfileMapper.getIrrPro(type); return rsVo ; } /** * 添加取水口操作记录,轮灌过程命令下发时使用 * @param po * @return */ public Long addIntakeOperate(IrIntakeOperate po) { irIntakeOperateMapper.insert(po); return po.getId(); } ///** // * 根据命令ID更新取水口操作记录 // * @param commandId // * @param commandResult // * @return // */ //public Integer updateByCommandId(Long commandId, Byte commandResult) { // return irIntakeOperateMapper.updateByCommandId(commandId, commandResult); //} /** * 定时关阀式计划开阀 * @param automaticClose * @return */ @Transactional(rollbackFor = Exception.class) public Map planedOpenTimedClose(AutomaticClose automaticClose, Long planId, Byte operatetype, Date startTime, Integer duration) { Long intakeId = automaticClose.getIntakeId(); Long vcId = automaticClose.getVcId(); Date plannedOpenTime = automaticClose.getPlannedOpenTime(); Integer minutes = automaticClose.getMinutes(); Long operator = automaticClose.getOperator(); Byte openType = automaticClose.getOpenType(); Long comId = new IDLongGenerator().generate(); // 如果是轮灌 if(openType != null && openType == 1) { IrIntakeOperate irIntakeOperate = new IrIntakeOperate(); irIntakeOperate.setPlanId(planId); irIntakeOperate.setOperateType(operatetype); irIntakeOperate.setCommandId(comId); irIntakeOperate.setIntakeId(intakeId); irIntakeOperate.setStartTime(startTime); irIntakeOperate.setDuration(duration); Long id = addIntakeOperate(irIntakeOperate); if(id == null) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", "添加取水口操作记录失败"); map.put("content", null); return map; } } Integer year = Integer.parseInt(String.format("%tY", plannedOpenTime)); Integer month = Integer.parseInt(String.format("%tm", plannedOpenTime)); Integer day = Integer.parseInt(String.format("%td", plannedOpenTime)); Integer hour = Integer.parseInt(String.format("%tH", plannedOpenTime)); Integer minute = Integer.parseInt(String.format("%tM", plannedOpenTime)); /** * 如果农户选择了虚拟卡,则使用该虚拟卡 * 如果农户未选择虚拟卡,则根据取水口ID获取与之绑定的虚拟卡 * 如果取水口没有与之绑定的虚拟卡,则提示农户选择一张虚拟卡 */ if(vcId == null) { vcId = getVcIdByIntakeId(intakeId); if(vcId == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")"); map.put("content", null); return map; } } // 虚拟卡ID换虚拟卡对象 VoVirtualCard vc = getVcById(vcId); if(vc == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")"); map.put("content", null); return map; } String vcNum = vc.getVcNum().toString(); Double moneyRemain = vc.getMoney(); if(moneyRemain < 100) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, "虚拟卡余额不足,请充值" + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", "虚拟卡余额不足,请充值"); map.put("content", null); return map; } // 获取水价 Double waterPrice = getPrice(); if(waterPrice == null) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.NO_WATER_PRICE.getMessage()); map.put("content", null); return map; } // 取水口ID换阀控器地址及通讯协议 JSONObject job_rtu = getRtu(intakeId, null); if(job_rtu == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.RTU_NOT_EXIST.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.RTU_NOT_EXIST.getMessage()); map.put("content", null); return map; } String rtuAddr = job_rtu.getString("rtuAddr"); String protocol = job_rtu.getString("protocol"); comSendUrl = env.getProperty(pro_mw + "." + DataSourceContext.get() + "." + key_mw); // 生成订单号 String orderNo = generateOrderNo(); if(orderNo == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.NO_ORDER_NUMBER.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.NO_ORDER_NUMBER.getMessage()); map.put("content", null); return map; } String commandCode = null; if(protocol.equals(ProtocolConstantV206V202404.protocolName)) { Map map = new HashMap<>(); map.put("success", true); map.put("msg", "开阀成功"); map.put("content", null); return map; } else if(protocol.equals(ProtocolConstantV206V1.protocolName) || protocol.equals(ProtocolConstantV206V2.protocolName)) { // 获取功能码 commandCode = CodeV1.cd_A1; // 创建视图 ComA1Vo param = new ComA1Vo(); param.setIcCardNo(vcNum); param.setMoneyRemain(moneyRemain); param.setWaterPrice(waterPrice); param.setMinutes(minutes); param.setYear(year); param.setMonth(month); param.setDay(day); param.setHour(hour); param.setMinute(minute); param.setOrderNo(orderNo); /** * 构造命令、发送命令并处理请求结果及执行结果 * 1 准备参数 * 2 调用公共方法 */ Param myParam = new Param(); myParam.setComId(comId); myParam.setComType((byte)1); myParam.setCommandCode(commandCode); myParam.setCommandName(CodeV1.getCodeName(commandCode)); myParam.setIntakeId(intakeId); myParam.setRtuAddr(rtuAddr); myParam.setProtocol(protocol); myParam.setVcId(vcId); myParam.setParam(param); myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx); myParam.setOperator(operator); myParam.setOpenType(openType); BaseResponse result = dealWithCommandResult(myParam); // 如果命令执行失败,则再次执行命令 if(!result.isSuccess()) { myParam.setComId(new IDLongGenerator().generate()); result = dealWithCommandResult(myParam); } Map map = new HashMap<>(); map.put("success", result.isSuccess()); map.put("msg", result.getMsg()); map.put("content", result.getContent()); return map; } else { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, "系统暂不支持该协议" + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", "系统暂不支持该协议"); map.put("content", null); return map; } } /** * 小程序远程开阀 * @param valve * @param planId * @param operatetype * @return */ public Map openWx(ValveOpen valve, Long planId, Byte operatetype) { Long intakeId = valve.getIntakeId(); String intakeName = valve.getIntakeName(); Long vcId = valve.getVcId(); Boolean forceOpen = valve.getForceOpen(); Long operator = valve.getOperator(); Byte openType = valve.getOpenType(); Long comId = new IDLongGenerator().generate(); // 如果是轮灌 if(openType != null && openType == 1) { IrIntakeOperate irIntakeOperate = new IrIntakeOperate(); irIntakeOperate.setPlanId(planId); irIntakeOperate.setOperateType(operatetype); irIntakeOperate.setCommandId(comId); irIntakeOperate.setIntakeId(intakeId); Long id = addIntakeOperate(irIntakeOperate); if(id == null) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", "添加取水口操作记录失败"); map.put("content", null); return map; } } if(intakeId == null && intakeName == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage() + "(" + intakeId + ")"); map.put("content", null); return map; //return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage()); } // intakeName换intakeId if(intakeId == null) { intakeId = getIntakeIdByName(intakeName); if(intakeId == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage() + "(" + intakeId + ")"); map.put("content", null); return map; //return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage()); } } /** * 如果农户选择了虚拟卡,则使用该虚拟卡 * 如果农户未选择虚拟卡,则根据取水口ID获取与之绑定的虚拟卡 * 如果取水口没有与之绑定的虚拟卡,则提示农户选择一张虚拟卡 */ if (vcId == null) { vcId = getVcIdByIntakeId(intakeId); if (vcId == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")"); map.put("content", null); return map; //return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage()); } } // 虚拟卡ID换虚拟卡对象 VoVirtualCard vc = getVcById(vcId); if (vc == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")"); map.put("content", null); return map; //return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage()); } // 虚拟卡状态为使用中,且不是强制开阀时提示 if (vc.getInUse() && !forceOpen) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getMessage() + "(" + intakeId + ")"); map.put("content", null); return map; //return BaseResponseUtils.buildCodeMsg(WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getCode(), WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getMessage()); } // 获取水价 Double waterPrice = getPrice(); if(waterPrice == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.NO_WATER_PRICE.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.NO_WATER_PRICE.getMessage() + "(" + intakeId + ")"); map.put("content", null); return map; //return BaseResponseUtils.buildErrorMsg(WechatResultCode.NO_WATER_PRICE.getMessage()); } // 取水口ID换阀控器地址及通讯协议 JSONObject job_rtu = getRtu(intakeId, null); if (job_rtu == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.RTU_NOT_EXIST.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.RTU_NOT_EXIST.getMessage() + "(" + intakeId + ")"); map.put("content", null); return map; //return BaseResponseUtils.buildErrorMsg(WechatResultCode.RTU_NOT_EXIST.getMessage()); } String rtuAddr = job_rtu.getString("rtuAddr"); String protocol = job_rtu.getString("protocol"); comSendUrl = env.getProperty(pro_mw + "." + DataSourceContext.get() + "." + key_mw); // 生成订单号 String orderNo = generateOrderNo(); if(orderNo == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.NO_ORDER_NUMBER.getMessage() + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.NO_ORDER_NUMBER.getMessage() + "(" + intakeId + ")"); map.put("content", null); return map; //return BaseResponseUtils.buildErrorMsg(WechatResultCode.NO_ORDER_NUMBER.getMessage()); } String commandCode = null; if (protocol.equals(ProtocolConstantV206V202404.protocolName)) { // 获取功能码 commandCode = CodeV202404.cd_A2; // 创建视图 ComCd92_A2Vo param = new ComCd92_A2Vo(); param.controllerType = controllerType; param.projectNo = projectNo; param.icCardNo = vc.getVcNum().toString(); param.waterRemain = 0.0; param.moneyRemain = vc.getMoney(); param.waterPrice = waterPrice; param.elePrice = 0.0; param.orderNo = orderNo; /** * 构造命令、发送命令并处理请求结果及执行结果 * 1 准备参数 * 2 调用公共方法 */ Param myParam = new Param(); myParam.setComId(comId); myParam.setComType((byte)1); myParam.setCommandCode(commandCode); myParam.setCommandName(CodeV202404.getCodeName(commandCode)); myParam.setIntakeId(intakeId); myParam.setRtuAddr(rtuAddr); myParam.setProtocol(protocol); myParam.setVcId(vcId); myParam.setParam(param); myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx); myParam.setOperator(operator); //BaseResponse result = dealWithCommandResult(myParam); BaseResponse result = dealWithCommandResult(myParam); // 如果命令执行失败,则再次执行命令 if(!result.isSuccess()) { myParam.setComId(new IDLongGenerator().generate()); result = dealWithCommandResult(myParam); } Map map = new HashMap<>(); map.put("success", result.isSuccess()); map.put("msg", result.getMsg()); map.put("content", result.getContent()); return map; } else if (protocol.equals(ProtocolConstantV206V1.protocolName) || protocol.equals(ProtocolConstantV206V2.protocolName)) { // 获取功能码 commandCode = CodeV1.cd_97; // 创建视图 Com97Vo param = new Com97Vo(); param.icCardNo = vc.getVcNum().toString(); param.moneyRemain = vc.getMoney(); param.waterPrice = waterPrice; param.orderNo = orderNo; /** * 构造命令、发送命令并处理请求结果及执行结果 * 1 准备参数 * 2 调用公共方法 */ Param myParam = new Param(); myParam.setComId(comId); myParam.setComType((byte)1); myParam.setCommandCode(commandCode); myParam.setCommandName(CodeV1.getCodeName(commandCode)); myParam.setIntakeId(intakeId); myParam.setRtuAddr(rtuAddr); myParam.setProtocol(protocol); myParam.setVcId(vcId); myParam.setParam(param); myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx); myParam.setOperator(operator); //return dealWithCommandResult(myParam); BaseResponse result = dealWithCommandResult(myParam); Map map = new HashMap<>(); map.put("success", result.isSuccess()); map.put("msg", result.getMsg()); map.put("content", result.getContent()); return map; } else { //return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议"); irIntakeOperateMapper.updateByCommandId(comId, (byte)2, "系统暂不支持该协议" + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", "系统暂不支持该协议"); map.put("content", null); return map; } } /** * 小程序远程关阀 * @param valve * @param planId * @param operatetype * @return */ @Transactional(rollbackFor = Exception.class) public Map closeWx(ValveClose valve, Long planId, Byte operatetype) { String rtuAddr = valve.getRtuAddr(); String vcNum = valve.getVcNum(); Long vcId = Optional.ofNullable(seVirtualCardMapper.getVcIdByNum(vcNum)).orElse(0L); String orderNo = valve.getOrderNo(); Long operator = valve.getOperator(); Byte openType = valve.getOpenType(); Long comId = new IDLongGenerator().generate(); // 阀控器地址换取水口ID和通讯协议 JSONObject job_rtu = getRtu(null, rtuAddr); if (job_rtu == null) { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.RTU_NOT_EXIST.getMessage()); Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.RTU_NOT_EXIST.getMessage()); map.put("content", null); return map; //return BaseResponseUtils.buildErrorMsg(WechatResultCode.RTU_NOT_EXIST.getMessage()); } Long intakeId = job_rtu.getLong("intakeId"); String protocol = job_rtu.getString("protocol"); // 如果是轮灌 if(openType != null && openType == 1) { IrIntakeOperate irIntakeOperate = new IrIntakeOperate(); irIntakeOperate.setPlanId(planId); irIntakeOperate.setOperateType(operatetype); irIntakeOperate.setCommandId(comId); irIntakeOperate.setIntakeId(intakeId); irIntakeOperate.setCommandResult((byte)1); Long id = addIntakeOperate(irIntakeOperate); if(id == null) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", "添加取水口操作记录失败"); map.put("content", null); return map; } } comSendUrl = env.getProperty(pro_mw + "." + DataSourceContext.get() + "." + key_mw); String commandCode = null; if (protocol.equals(ProtocolConstantV206V202404.protocolName)) { // 获取功能码 commandCode = CodeV202404.cd_A3; // 创建视图 ComCd93_A3Vo param = new ComCd93_A3Vo(); param.controllerType = controllerType; param.projectNo = projectNo; param.icCardNo = vcNum; param.orderNo = orderNo; /** * 构造命令、发送命令并处理请求结果及执行结果 * 1 准备参数 * 2 调用公共方法 */ Param myParam = new Param(); myParam.setComId(comId); myParam.setComType((byte)2); myParam.setCommandCode(commandCode); myParam.setCommandName(CodeV202404.getCodeName(commandCode)); myParam.setIntakeId(intakeId); myParam.setRtuAddr(rtuAddr); myParam.setProtocol(protocol); myParam.setVcId(vcId); myParam.setParam(param); myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx); myParam.setOperator(operator); //return dealWithCommandResult(myParam); BaseResponse result = dealWithCommandResult(myParam); Map map = new HashMap<>(); map.put("success", result.isSuccess()); map.put("msg", result.getMsg()); map.put("content", result.getContent()); return map; } else if (protocol.equals(ProtocolConstantV206V1.protocolName) || protocol.equals(ProtocolConstantV206V2.protocolName)) { // 获取功能码 commandCode = CodeV1.cd_98; // 创建视图 Com98Vo param = new Com98Vo(); param.icCardNo = vcNum; param.orderNo = orderNo; /** * 构造命令、发送命令并处理请求结果及执行结果 * 1 准备参数 * 2 调用公共方法 */ Param myParam = new Param(); myParam.setComId(comId); myParam.setComType((byte)2); myParam.setCommandCode(commandCode); myParam.setCommandName(CodeV1.getCodeName(commandCode)); myParam.setIntakeId(intakeId); myParam.setRtuAddr(rtuAddr); myParam.setProtocol(protocol); myParam.setVcId(vcId); myParam.setParam(param); myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx); myParam.setOperator(operator); //return dealWithCommandResult(myParam); BaseResponse result = dealWithCommandResult(myParam); // 如果命令执行失败,则再次执行命令 if(!result.isSuccess()) { myParam.setComId(new IDLongGenerator().generate()); result = dealWithCommandResult(myParam); } Map map = new HashMap<>(); map.put("success", result.isSuccess()); map.put("msg", result.getMsg()); map.put("content", result.getContent()); return map; } else { irIntakeOperateMapper.updateByCommandId(comId, (byte)2, "系统暂不支持该协议" + "(" + intakeId + ")"); Map map = new HashMap<>(); map.put("success", false); map.put("msg", "系统暂不支持该协议"); map.put("content", null); return map; //return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议"); } } }