From c4271768e1c03ee83e2f7db4e22f072d9808e178 Mon Sep 17 00:00:00 2001 From: andy <1042025947@qq.com> Date: Sat, 6 Sep 2025 16:16:59 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4mq=E6=B6=88=E6=81=AF,=20=20?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=94=AF=E4=BB=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/dto/newer/req/MqttResponse.java | 2 +- .../dto/newer/state/OrderStatusData.java | 4 +- .../message/handle/MessageUtilService.java | 18 +- .../handle/MqttMessageHandleService.java | 3 + ...ventSwapCompleteExchangeProcessorImpl.java | 317 +++++++++--------- .../MqttStrategyEventExchangeProcessor.java | 2 +- ...questBatterySwapExchangeProcessorImpl.java | 9 +- .../processor/impl/OrderSwapProcessor.java | 34 +- .../hd/cloud/service/OrderDetailService.java | 3 + .../hd/cloud/service/OrderService.java | 4 + .../service/impl/OrderDetailServiceImpl.java | 17 +- .../cloud/service/impl/OrderServiceImpl.java | 177 +++++++++- .../wechat/service/impl/LoginServiceImpl.java | 4 +- .../processor/PayExchangeProcessor.java | 2 +- .../src/main/resources/application.yml | 3 +- 15 files changed, 401 insertions(+), 198 deletions(-) diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/req/MqttResponse.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/req/MqttResponse.java index 96d634b..75b6a73 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/req/MqttResponse.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/req/MqttResponse.java @@ -46,7 +46,7 @@ public class MqttResponse implements Serializable { return this; } - public MqttResponse success(T data){ + public MqttResponse success(T dataBody){ this.code=SUCCESS; this.msg="成功"; this.data=data; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatusData.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatusData.java index 787c41f..cd3788c 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatusData.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatusData.java @@ -18,7 +18,7 @@ public class OrderStatusData { private Integer soc; @Schema(description = "租借电池包仓位") - private Integer rentBatNo; + private String rentBatNo; @Schema(description = "租用电池包编码") private String rentBatCode; @@ -30,7 +30,7 @@ public class OrderStatusData { private String returnBatCode; @Schema(description = "归还电池包仓位") - private Integer returnBatNo; + private String returnBatNo; @Schema(description = "归还电池包SOC") private Integer returnBatSoc; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java index 55c97f2..2557a9d 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java @@ -80,7 +80,19 @@ public class MessageUtilService { public void publishRSAMessage(MessageTopic topic, String msg, String stationPublicKey) { RSA rsa = SecureUtil.rsa(null, stationPublicKey); String encrypt = rsa.encryptBase64(msg, KeyType.PublicKey); - publishMessage.publish(encrypt, topic.toString()); + + // 3. 发送MQTT消息 + try { + MqttMessage mqttMessage = publishMessage.publish(encrypt, topic.toString()); + try { + addMqttMessage(topic, mqttMessage.getId()+"", mqttMessage.getQos(), JSONUtil.parseObj(msg)); + } catch (Exception e) { + log.error("MQTT->>>>>>>>>>>>>记录mqtt消息 发送RSA加密消息 出现了错误{},topic:{}; data:{}; message:{}",e.getMessage(),JSONUtil.toJsonStr(topic),JSONUtil.toJsonStr(msg), JSONUtil.toJsonStr(mqttMessage)); + throw new RuntimeException("记录mqtt消息出现了错误"+e.getMessage()); + } + } catch (Exception e) { + log.error("MQTT->>>>>>>>>>>>>发送站端mqtt消息 发送RSA加密消息 出现异常{},topic:{}; data:{}",e.getMessage(),JSONUtil.toJsonStr(topic),JSONUtil.toJsonStr(msg)); + } } /** @@ -103,8 +115,8 @@ public class MessageUtilService { try { MqttMessage mqttMessage = publishMessage.publish(encrypt, topic.toString()); try { - dataBody.set("header", JSONUtil.toJsonStr(header)); - addMqttMessage(topic, mqttMessage.getId()+"", mqttMessage.getQos(), dataBody); + //dataBody.set("header", JSONUtil.toJsonStr(header)); + addMqttMessage(topic, mqttMessage.getId()+"", mqttMessage.getQos(), JSONUtil.parseObj(message)); } catch (Exception e) { log.error("MQTT->>>>>>>>>>>>>记录mqtt消息出现了错误{},topic:{}; header:{}, data:{}; message:{}",e.getMessage(),JSONUtil.toJsonStr(topic),JSONUtil.toJsonStr(header),JSONUtil.toJsonStr(dataBody), JSONUtil.toJsonStr(mqttMessage)); throw new RuntimeException("记录mqtt消息出现了错误"+e.getMessage()); diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MqttMessageHandleService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MqttMessageHandleService.java index 6ae0b6c..2520c70 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MqttMessageHandleService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MqttMessageHandleService.java @@ -52,6 +52,9 @@ public class MqttMessageHandleService { // 3.1.2 保存MQTT消息 MqttMessageHeader header = messageUtilService.addMqttMessage(topic, message.getId()+"", message.getQos(), jo); JSONObject dataBody = jo.getJSONObject("dataBody"); + if(dataBody == null){ + dataBody = jo.getJSONObject("data"); + } // 3.2 分类处理 // 3.2.1 state if (MqttMessageTypeEnum.STATE.getType().equals(topic.getMessageType())) { diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttEventSwapCompleteExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttEventSwapCompleteExchangeProcessorImpl.java index 4a45a77..901edda 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttEventSwapCompleteExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttEventSwapCompleteExchangeProcessorImpl.java @@ -2,8 +2,6 @@ package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.evotech.hd.cloud.mqtt.enums.EventFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; @@ -11,26 +9,11 @@ import com.evotech.hd.cloud.mqtt.message.dto.newer.confirm.SwapCompleteConfirm; import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse; import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData; -import com.evotech.hd.cloud.service.*; -import com.evotech.hd.cloud.service.rpc.WechatService; -import com.evotech.hd.cloud.utils.ParamServiceUtils; -import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent; -import com.evotech.hd.common.core.constant.HDConstant; -import com.evotech.hd.common.core.entity.cloud.BatteryStationDc; -import com.evotech.hd.common.core.entity.cloud.BatteryTrace; -import com.evotech.hd.common.core.entity.cloud.VehicleInfo; -import com.evotech.hd.common.core.entity.order.Order; -import com.evotech.hd.common.core.entity.order.OrderDetail; -import com.evotech.hd.common.core.enums.SwapBatteryStepEnum; +import com.evotech.hd.cloud.service.OrderService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ObjectUtils; -import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; -import java.math.BigDecimal; -import java.util.Date; - /** * 换电完成事件数据 * @@ -46,18 +29,18 @@ public class MqttEventSwapCompleteExchangeProcessorImpl implements MqttStrategyE @Resource OrderService orderService; - @Resource - OrderDetailService orderDetailService; - @Resource - private SwapOrderBasicFeeComponent orderBasicFeeComponent; - @Resource - private OrderSwapBatteryStepService orderSwapBatteryStepService; - @Resource - private VehicleService vehicleService; - @Resource - BatteryStationDcService batteryStationDcService; - @Resource - WechatService wechatService; +// @Resource +// OrderDetailService orderDetailService; +// @Resource +// private SwapOrderBasicFeeComponent orderBasicFeeComponent; +// @Resource +// private OrderSwapBatteryStepService orderSwapBatteryStepService; +// @Resource +// private VehicleService vehicleService; +// @Resource +// BatteryStationDcService batteryStationDcService; +// @Resource +// WechatService wechatService; @Override public boolean accept(String functionName) { @@ -73,7 +56,7 @@ public class MqttEventSwapCompleteExchangeProcessorImpl implements MqttStrategyE SwapCompleteConfirm swapRecordConfirm = new SwapCompleteConfirm(); try { // 订单状态更新处理 - handleOrderStatus(orderStatus, statusData); + orderService.handleOrderStatus(orderStatus, statusData); response.setCode(MqttResponse.PUBLIC_SUCCESS); swapRecordConfirm.setAckStatus(MqttResponse.PUBLIC_SUCCESS); swapRecordConfirm.setOrderNo(orderStatus.getOrderNo()); @@ -87,145 +70,147 @@ public class MqttEventSwapCompleteExchangeProcessorImpl implements MqttStrategyE swapRecordConfirm.setError(e.getMessage()); } response.setData(swapRecordConfirm); - sendAESMessage(topic, header, EventFunctionTypesEnum.FUN_ORDEREVENT, response); - } - - - /** - * 订单最终状态的更新 - * @param orderStatus - * @param statusData - */ - private void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData) { - - Order order = orderService.getOne(new LambdaQueryWrapper().eq(Order::getOrderNo, orderStatus.getOrderNo())); - if(ObjectUtils.isEmpty(order)){ - throw new RuntimeException("未找到订单信息"); - } - //更新订单状态 - order.setStatus(orderStatus.getStatus()); - orderService.updateById(order); - //修改订单状态及金额 - alterOrderStatus(order, statusData); - //记录电池信息 or 记录最后的换电步骤 - alterSwapBatteryStep(orderStatus, statusData, order); - } - - - /** - * 修改订单状态方法 - * @param order - * @param statusData - * @return - */ - private void alterOrderStatus(Order order, OrderStatusData statusData) { - if (order.getStatus() == 3 || order.getStatus() == 5) { - //如果订单是完成. 查询订单详情 - OrderDetail orderDetail = orderDetailService.getOne(new LambdaQueryWrapper().eq(OrderDetail::getOrderId, order.getPkId())); - orderDetail.setFeeType(ParamServiceUtils.getSettlementType()); - orderDetail.setOrderTimeEnd(new Date()); - orderDetail.setServiceTimeEnd(new Date()); - //copy属性 - BeanUtils.copyProperties(statusData, orderDetail); - orderDetail.setRentBatSoc(Double.valueOf(statusData.getRentBatSoc())); - orderDetail.setReturnBatSoc(Double.valueOf(statusData.getReturnBatSoc())); - switch (orderDetail.getFeeType()){ - case HDConstant.OrderConstant.FEE_TYPE_DL: - orderDetail.setElectricityQuantity(statusData.getElectAmount().doubleValue()); - break; - case HDConstant.OrderConstant.FEE_TYPE_ODO: -// orderDetail.setElectricityQuantity(new BigDecimal(statusData.getSoc()).doubleValue()); - break; - case HDConstant.OrderConstant.FEE_TYPE_SOC: - default: - orderDetail.setElectricityQuantity(new BigDecimal(statusData.getRentBatSoc()).subtract(new BigDecimal(statusData.getReturnBatSoc())).doubleValue()); - break; - } - //计算费用方式 - log.info("\r\n=====>>>订单状态更新处理订单状态开始结算:{},{}",order.getOrderNo(),order.getStatus() ); - //计算费用信息 - orderBasicFeeComponent.orderBasicFee(order, orderDetail); - //发送换电完成推送 - wechatService.sendGzhSwapOrderSuccessMessage(order); - orderService.calculateCost(order); + if(header != null){ + sendAESMessage(topic, header, EventFunctionTypesEnum.FUN_ORDEREVENT, response); } } - - /** - * 修改订单费用 - * @param order - * @param statusData - * @return - */ - private void alterSwapBatteryStep(SwapComplete orderStatus, OrderStatusData statusData, Order order) { - if (orderStatus.getStatus() == 3 || orderStatus.getStatus() == 5){ - //生成步骤 - orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(orderStatus.getOrderNo(), SwapBatteryStepEnum.COMPLETED.getKey(), orderStatus.getStatusTime()); - // 修改车上电池编码 - vehicleService.update(new UpdateWrapper() - .set("bat_code", statusData.getRentBatCode()) - .set("bat_soc", statusData.getRentBatSoc()) - .eq("plate_num", order.getPlateNum())); - //出租电池信息维护 - batteryStationDcService.update(new UpdateWrapper() - .set("status", HDConstant.DcConstant.STATUS_CZ) - .set("source_from", HDConstant.DcConstant.SOURCE_FROM_STATION) - .set("point_type", HDConstant.DcConstant.POINT_TYPE_CAR) - .set("point_code", order.getPlateNum()) - .set("point_name", order.getPlateNum()) - .set("dcc_no", 0) - .eq("bat_code", statusData.getRentBatCode())); - //归还电池信息维护 - batteryStationDcService.update(new UpdateWrapper() - .set("status", HDConstant.DcConstant.STATUS_CD) - .set("source_from", HDConstant.DcConstant.SOURCE_FROM_CAR) - .set("point_type", HDConstant.DcConstant.POINT_TYPE_STATION) - .set("point_code", order.getPlateNum()) - .set("point_name", order.getPlateNum()) - .set("soc", statusData.getReturnBatSoc()) - .set("dcc_no", statusData.getReturnBatNo()) - .eq("bat_code", statusData.getReturnBatCode())); - // 添加2块电池的溯源记录 - addBatteryTrace(orderStatus, statusData, order); - - } - } - - - - - - - /** - * 添加电池轨迹记录 - * - * @param orderStatus - * @param statusData - * @param osb - */ - private void addBatteryTrace(SwapComplete orderStatus, OrderStatusData statusData, Order osb) { - BatteryTrace bt1 = new BatteryTrace(); - bt1.setOrderNo(orderStatus.getOrderNo()); - bt1.setBatCode(statusData.getRentBatCode()); - bt1.setSoc(statusData.getRentBatSoc()); - bt1.setBeginTime(orderStatus.getStatusTime()); - bt1.setPointType(2); - bt1.setPointCode(osb.getPlateNum()); - bt1.setPointName(osb.getPlateNum()); - bt1.setCreater("SYS"); - BatteryTrace bt2 = new BatteryTrace(); - BeanUtils.copyProperties(bt1, bt2); - bt2.setBatCode(statusData.getReturnBatCode()); - bt2.setSoc(statusData.getRentBatSoc()); - bt2.setPointType(1); - bt2.setPointCode(osb.getStationCode()); - bt2.setPointName(osb.getStationName()); - batteryStationDcService.addTrace(bt1); - batteryStationDcService.addTrace(bt2); - } - +// /** +// * 订单最终状态的更新 +// * @param orderStatus +// * @param statusData +// */ +// private void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData) { +// +// Order order = orderService.getOne(new LambdaQueryWrapper().eq(Order::getOrderNo, orderStatus.getOrderNo())); +// if(ObjectUtils.isEmpty(order)){ +// throw new RuntimeException("未找到订单信息"); +// } +// //更新订单状态 +// order.setStatus(orderStatus.getStatus()); +// orderService.updateById(order); +// //修改订单状态及金额 +// alterOrderStatus(order, statusData); +// //记录电池信息 or 记录最后的换电步骤 +// alterSwapBatteryStep(orderStatus, statusData, order); +// } +// +// +// /** +// * 修改订单状态方法 +// * @param order +// * @param statusData +// * @return +// */ +// private void alterOrderStatus(Order order, OrderStatusData statusData) { +// if (order.getStatus() == 3 || order.getStatus() == 5) { +// //如果订单是完成. 查询订单详情 +// OrderDetail orderDetail = orderDetailService.getOne(new LambdaQueryWrapper().eq(OrderDetail::getOrderId, order.getPkId())); +// orderDetail.setFeeType(ParamServiceUtils.getSettlementType()); +// orderDetail.setOrderTimeEnd(new Date()); +// orderDetail.setServiceTimeEnd(new Date()); +// //copy属性 +// BeanUtils.copyProperties(statusData, orderDetail); +// orderDetail.setRentBatSoc(Double.valueOf(statusData.getRentBatSoc())); +// orderDetail.setReturnBatSoc(Double.valueOf(statusData.getReturnBatSoc())); +// switch (orderDetail.getFeeType()){ +// case HDConstant.OrderConstant.FEE_TYPE_DL: +// orderDetail.setElectricityQuantity(statusData.getElectAmount().doubleValue()); +// break; +// case HDConstant.OrderConstant.FEE_TYPE_ODO: +//// orderDetail.setElectricityQuantity(new BigDecimal(statusData.getSoc()).doubleValue()); +// break; +// case HDConstant.OrderConstant.FEE_TYPE_SOC: +// default: +// orderDetail.setElectricityQuantity(new BigDecimal(statusData.getRentBatSoc()).subtract(new BigDecimal(statusData.getReturnBatSoc())).doubleValue()); +// break; +// } +// //计算费用方式 +// log.info("\r\n=====>>>订单状态更新处理订单状态开始结算:{},{}",order.getOrderNo(),order.getStatus() ); +// //计算费用信息 +// orderBasicFeeComponent.orderBasicFee(order, orderDetail); +// //发送换电完成推送 +// wechatService.sendGzhSwapOrderSuccessMessage(order); +// orderService.calculateCost(order); +// } +// } +// +// +// +// /** +// * 修改订单费用 +// * @param order +// * @param statusData +// * @return +// */ +// private void alterSwapBatteryStep(SwapComplete orderStatus, OrderStatusData statusData, Order order) { +// if (orderStatus.getStatus() == 3 || orderStatus.getStatus() == 5){ +// //生成步骤 +// orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(orderStatus.getOrderNo(), SwapBatteryStepEnum.COMPLETED.getKey(), orderStatus.getStatusTime()); +// // 修改车上电池编码 +// vehicleService.update(new UpdateWrapper() +// .set("bat_code", statusData.getRentBatCode()) +// .set("bat_soc", statusData.getRentBatSoc()) +// .eq("plate_num", order.getPlateNum())); +// //出租电池信息维护 +// batteryStationDcService.update(new UpdateWrapper() +// .set("status", HDConstant.DcConstant.STATUS_CZ) +// .set("source_from", HDConstant.DcConstant.SOURCE_FROM_STATION) +// .set("point_type", HDConstant.DcConstant.POINT_TYPE_CAR) +// .set("point_code", order.getPlateNum()) +// .set("point_name", order.getPlateNum()) +// .set("dcc_no", 0) +// .eq("bat_code", statusData.getRentBatCode())); +// //归还电池信息维护 +// batteryStationDcService.update(new UpdateWrapper() +// .set("status", HDConstant.DcConstant.STATUS_CD) +// .set("source_from", HDConstant.DcConstant.SOURCE_FROM_CAR) +// .set("point_type", HDConstant.DcConstant.POINT_TYPE_STATION) +// .set("point_code", order.getPlateNum()) +// .set("point_name", order.getPlateNum()) +// .set("soc", statusData.getReturnBatSoc()) +// .set("dcc_no", statusData.getReturnBatNo()) +// .eq("bat_code", statusData.getReturnBatCode())); +// // 添加2块电池的溯源记录 +// addBatteryTrace(orderStatus, statusData, order); +// +// } +// } +// +// +// +// +// +// +// /** +// * 添加电池轨迹记录 +// * +// * @param orderStatus +// * @param statusData +// * @param osb +// */ +// private void addBatteryTrace(SwapComplete orderStatus, OrderStatusData statusData, Order osb) { +// BatteryTrace bt1 = new BatteryTrace(); +// bt1.setOrderNo(orderStatus.getOrderNo()); +// bt1.setBatCode(statusData.getRentBatCode()); +// bt1.setSoc(statusData.getRentBatSoc()); +// bt1.setBeginTime(orderStatus.getStatusTime()); +// bt1.setPointType(2); +// bt1.setPointCode(osb.getPlateNum()); +// bt1.setPointName(osb.getPlateNum()); +// bt1.setCreater("SYS"); +// BatteryTrace bt2 = new BatteryTrace(); +// BeanUtils.copyProperties(bt1, bt2); +// bt2.setBatCode(statusData.getReturnBatCode()); +// bt2.setSoc(statusData.getRentBatSoc()); +// bt2.setPointType(1); +// bt2.setPointCode(osb.getStationCode()); +// bt2.setPointName(osb.getStationName()); +// batteryStationDcService.addTrace(bt1); +// batteryStationDcService.addTrace(bt2); +// } +// } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttStrategyEventExchangeProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttStrategyEventExchangeProcessor.java index 1a50bca..b775ca7 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttStrategyEventExchangeProcessor.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttStrategyEventExchangeProcessor.java @@ -23,7 +23,7 @@ public interface MqttStrategyEventExchangeProcessor extends MqttStrategyExchange default void sendAESMessage(MessageTopic topic, MqttMessageHeader header, EventFunctionTypesEnum typesEnum, MqttResponse response){ - topic.setMessageType(MqttMessageTypeEnum.EVENT.getType()); + topic.setMessageType(MqttMessageTypeEnum.CONFIRM.getType()); header.setFunction(typesEnum.getReFunction()); logger.info("\r\n=====>>>回复站端的EVENT消息--MQTT发送到消息主题:{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN))); sendAESMessage(topic, header, response); diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatterySwapExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatterySwapExchangeProcessorImpl.java index 8119f01..e0f157d 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatterySwapExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatterySwapExchangeProcessorImpl.java @@ -13,15 +13,12 @@ import com.evotech.hd.cloud.service.OrderService; import com.evotech.hd.cloud.service.rpc.WechatService; import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse; import com.evotech.hd.common.core.entity.order.Order; -import com.evotech.hd.common.core.entity.order.OrderDetail; import com.evotech.hd.common.core.utils.Collections; import com.evotech.hd.common.redis.utils.RedisServiceUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.util.Date; - /** * 换电信息--站端回复开始换电通知信息类 * @@ -67,11 +64,7 @@ public class MqttRequestBatterySwapExchangeProcessorImpl implements MqttStrategy Order order = orderService.getOne(new LambdaQueryWrapper().eq(Order::getOrderNo, orderNo)); //如果是成功, 创建订单详情 if(MqttResponse.PUBLIC_SUCCESS.equals(battery.getCode())){ - OrderDetail detail = new OrderDetail(); - detail.setOrderId(order.getPkId()); - detail.setServiceTimeBegin(new Date()); - detail.setOrderTimeBegin(new Date()); - orderDetailService.save(detail); + orderDetailService.addOrderDetailByOrder(order.getPkId()); }else{ wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(Collections.asMap("code",0, "msg", battery.getMsg()))); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/OrderSwapProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/OrderSwapProcessor.java index 3f66bb5..2bf28e2 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/OrderSwapProcessor.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/OrderSwapProcessor.java @@ -4,6 +4,9 @@ import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.evotech.hd.cloud.mqtt.message.MessageTopic; +import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete; +import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData; +import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event.MqttEventSwapCompleteExchangeProcessorImpl; import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state.MqttStateSwapStepDataExchangeProcessor; import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor; import com.evotech.hd.cloud.service.OrderService; @@ -41,7 +44,8 @@ public class OrderSwapProcessor implements StationMessageStrategyExchangeProcess private OrderSwapBatteryStepService orderSwapBatteryStepService; @Resource private MqttStateSwapStepDataExchangeProcessor mqttStateSwapStepDataExchangeProcessor; - + @Resource + private MqttEventSwapCompleteExchangeProcessorImpl mqttEventSwapCompleteExchangeProcessorImpl; /*** * 新增换电单 禁止删除, 反射调用 * @param json @@ -82,7 +86,7 @@ public class OrderSwapProcessor implements StationMessageStrategyExchangeProcess */ public Result arrivalSignal(JSONObject json){ try { - Order order = orderService.getById(json.getInteger("preId")); + Order order = orderService.getById(json.getInteger("pkId")); json.put("orderNo", order.getOrderNo()); mqttStateSwapStepDataExchangeProcessor.exchange(new MessageTopic(json.getString("stationCode")+"_WEB站推送", "http"), null, JSONUtil.parseObj(json.toJSONString())); return Result.getInstance().build(Boolean.class).success(true); @@ -90,6 +94,32 @@ public class OrderSwapProcessor implements StationMessageStrategyExchangeProcess e.printStackTrace();; return Result.getInstance().build(Boolean.class).error(e.getMessage(), null); } + } + + /*** + * 车辆换电完成 + * @param json + * @return + */ + public Result orderCompleted(JSONObject json){ + try { + Order order = orderService.getById(json.getInteger("pkId")); + + OrderStatusData statusData = JSONUtil.toBean(json.toJSONString(), OrderStatusData.class); + SwapComplete orderStatus = new SwapComplete(); + orderStatus.setOrderNo(order.getOrderNo()); + orderStatus.setStatus(3); + orderStatus.setStatusTime(new Date()); + orderStatus.setStatusData(statusData); + // 订单状态更新处理 + orderService.handleOrderStatus(orderStatus, statusData); + //再次查询数据信息 + order = orderService.getById(json.getInteger("pkId")); + return Result.getInstance().build(JSONObject.class).success((JSONObject)JSONObject.toJSON(order)); + } catch (Exception e) { + e.printStackTrace(); + return Result.getInstance().build(JSONObject.class).error(e.getMessage(), null); + } } } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderDetailService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderDetailService.java index c9e215c..40419ea 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderDetailService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderDetailService.java @@ -13,4 +13,7 @@ import com.evotech.hd.common.core.entity.order.OrderDetail; * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 */ public interface OrderDetailService extends IService { + + + public OrderDetail addOrderDetailByOrder(Integer orderId); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderService.java index 2fa36e5..b250a04 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderService.java @@ -3,6 +3,8 @@ package com.evotech.hd.cloud.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.evotech.hd.cloud.entity.vo.NativePayVO; +import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete; +import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData; import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.order.OrderBillListVo; import com.evotech.hd.common.core.Dto.order.OrderDetailVo; @@ -81,4 +83,6 @@ public interface OrderService extends IService { Result> billList(String companyCode, String orderTimeEnd); void excelBillList(String companyCode, String orderTimeEnd); + + void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderDetailServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderDetailServiceImpl.java index 88c9cff..220566e 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderDetailServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderDetailServiceImpl.java @@ -1,12 +1,15 @@ package com.evotech.hd.cloud.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.evotech.hd.cloud.service.OrderDetailService; import com.evotech.hd.common.core.dao.cloud.OrderDetailDao; import com.evotech.hd.common.core.entity.order.OrderDetail; -import com.evotech.hd.cloud.service.OrderDetailService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.Date; + /** * 订单详情实现类 * @@ -21,6 +24,18 @@ import org.springframework.stereotype.Service; @Slf4j public class OrderDetailServiceImpl extends ServiceImpl implements OrderDetailService { + @Override + public OrderDetail addOrderDetailByOrder(Integer orderId) { + OrderDetail orderDetail = getOne(new LambdaQueryWrapper().eq(OrderDetail::getOrderId, orderId), false); + if(orderDetail == null){ + orderDetail = new OrderDetail(); + orderDetail.setOrderId(orderId); + orderDetail.setServiceTimeBegin(new Date()); + orderDetail.setOrderTimeBegin(new Date()); + save(orderDetail); + } + return orderDetail; + } } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java index 4dbad93..50e6add 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java @@ -10,6 +10,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao; @@ -21,12 +22,11 @@ import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum; import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; +import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatterySwapReq; +import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData; import com.evotech.hd.cloud.mqtt.message.handle.MessageUtilService; -import com.evotech.hd.cloud.service.OrderService; -import com.evotech.hd.cloud.service.TaxPointService; -import com.evotech.hd.cloud.service.TradeService; -import com.evotech.hd.cloud.service.WalletAccountService; +import com.evotech.hd.cloud.service.*; import com.evotech.hd.cloud.service.rpc.WechatService; import com.evotech.hd.cloud.utils.CommonUtil; import com.evotech.hd.cloud.utils.ExcelUtil; @@ -45,10 +45,7 @@ import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest; import com.evotech.hd.common.core.entity.order.Order; import com.evotech.hd.common.core.entity.order.OrderDetail; import com.evotech.hd.common.core.entity.resource.auth.AuthUser; -import com.evotech.hd.common.core.enums.CodeMsg; -import com.evotech.hd.common.core.enums.OrderStatusEnums; -import com.evotech.hd.common.core.enums.PayTypeEnums; -import com.evotech.hd.common.core.enums.TradeTypeEnums; +import com.evotech.hd.common.core.enums.*; import com.evotech.hd.common.core.utils.Collections; import com.evotech.hd.common.core.utils.DataUtils; import com.evotech.hd.common.permission.util.RedisPermissionUtils; @@ -60,6 +57,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -104,10 +102,15 @@ public class OrderServiceImpl extends ServiceImpl implements Or private OrderSwapBatteryPreDao orderSwapBatteryPreDao; @Resource private MessageUtilService messageUtilService; + @Autowired + private BatteryStationDcService batteryStationDcService; + @Autowired + private OrderSwapBatteryStepService orderSwapBatteryStepService; + @Autowired + private OrderDetailService orderDetailService; - - public static OrderListVo convertOrderListVo(Order order){ + public static OrderListVo convertOrderListVo(Order order){ OrderListVo vo = new OrderListVo(); BeanUtils.copyProperties(order, vo); vo.setAmount(order.getOrderAmount()); @@ -216,8 +219,17 @@ public class OrderServiceImpl extends ServiceImpl implements Or order.setStationName(orderSwapBatteryPre.getStationName()); order.setDelFlag(HDConstant.DELETE_NO); // TODO 查询换电站信息,拿到计费方式,计费信息在充电结束时, 计算 + Boolean saveResult = save(order); + if(saveResult){ + try { + orderDetailService.addOrderDetailByOrder(order.getPkId()); + } catch (Exception e) { + e.printStackTrace(); + log.error("生成换电订单详情出错",e); + } + } // osb = orderBasicFeeComponent.orderBasicFee(osb); - return (save(order) ? new Result().success(order) : new Result().error("订单生成异常", null)); + return (saveResult ? new Result().success(order) : new Result().error("订单生成异常", null)); } @Override @@ -234,6 +246,13 @@ public class OrderServiceImpl extends ServiceImpl implements Or return new Result().error("未找到符合条件的订单"); } + try { + orderDetailService.addOrderDetailByOrder(order.getPkId()); + } catch (Exception e) { + e.printStackTrace(); + log.error("生成换电订单详情出错",e); + } + try { log.info("开始处理换电请求, 订单编号: {}, 用户ID: {}", order.getOrderNo(), wuid); // 构建换电请求消息 @@ -620,6 +639,142 @@ public class OrderServiceImpl extends ServiceImpl implements Or updateById(order); } + + + + /** + * 订单最终状态的更新 + * @param orderStatus + * @param statusData + */ + @Override + public void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData) { + + Order order = getOne(new LambdaQueryWrapper().eq(Order::getOrderNo, orderStatus.getOrderNo())); + if(ObjectUtils.isEmpty(order)){ + throw new RuntimeException("未找到订单信息"); + } + //更新订单状态 + order.setStatus(orderStatus.getStatus()); + updateById(order); + //修改订单状态及金额 + alterOrderStatus(order, statusData); + //记录电池信息 or 记录最后的换电步骤 + alterSwapBatteryStep(orderStatus, statusData, order); + } + + + /** + * 修改订单状态方法 + * @param order + * @param statusData + * @return + */ + private void alterOrderStatus(Order order, OrderStatusData statusData) { + if (order.getStatus() == 3 || order.getStatus() == 5) { + //如果订单是完成. 查询订单详情 + OrderDetail orderDetail = orderDetailService.addOrderDetailByOrder(order.getPkId()); + orderDetail.setFeeType(ParamServiceUtils.getSettlementType()); + orderDetail.setOrderTimeEnd(new Date()); + orderDetail.setServiceTimeEnd(new Date()); + //copy属性 + BeanUtils.copyProperties(statusData, orderDetail); + orderDetail.setRentBatSoc(Double.valueOf(statusData.getRentBatSoc())); + orderDetail.setReturnBatSoc(Double.valueOf(statusData.getReturnBatSoc())); + switch (orderDetail.getFeeType()){ + case HDConstant.OrderConstant.FEE_TYPE_DL: + orderDetail.setElectricityQuantity(statusData.getElectAmount().doubleValue()); + break; + case HDConstant.OrderConstant.FEE_TYPE_ODO: +// orderDetail.setElectricityQuantity(new BigDecimal(statusData.getSoc()).doubleValue()); + break; + case HDConstant.OrderConstant.FEE_TYPE_SOC: + default: + orderDetail.setElectricityQuantity(new BigDecimal(statusData.getRentBatSoc()).subtract(new BigDecimal(statusData.getReturnBatSoc())).doubleValue()); + break; + } + //计算费用方式 + log.info("\r\n=====>>>订单状态更新处理订单状态开始结算:{},{}",order.getOrderNo(),order.getStatus() ); + //计算费用信息 + orderBasicFeeComponent.orderBasicFee(order, orderDetail); + //发送换电完成推送 + wechatService.sendGzhSwapOrderSuccessMessage(order); + calculateCost(order); + } + } + + + + /** + * 修改订单费用 + * @param order + * @param statusData + * @return + */ + private void alterSwapBatteryStep(SwapComplete orderStatus, OrderStatusData statusData, Order order) { + if (orderStatus.getStatus() == 3 || orderStatus.getStatus() == 5){ + //生成步骤 + orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(orderStatus.getOrderNo(), SwapBatteryStepEnum.COMPLETED.getKey(), orderStatus.getStatusTime()); + // 修改车上电池编码 + vehicleInfoDao.update(new UpdateWrapper() + .set("bat_code", statusData.getRentBatCode()) + .set("bat_soc", statusData.getRentBatSoc()) + .eq("plate_num", order.getPlateNum())); + //出租电池信息维护 + batteryStationDcService.update(new UpdateWrapper() + .set("status", HDConstant.DcConstant.STATUS_CZ) + .set("source_from", HDConstant.DcConstant.SOURCE_FROM_STATION) + .set("point_type", HDConstant.DcConstant.POINT_TYPE_CAR) + .set("point_code", order.getPlateNum()) + .set("point_name", order.getPlateNum()) + .set("dcc_no", 0) + .eq("bat_code", statusData.getRentBatCode())); + //归还电池信息维护 + batteryStationDcService.update(new UpdateWrapper() + .set("status", HDConstant.DcConstant.STATUS_CD) + .set("source_from", HDConstant.DcConstant.SOURCE_FROM_CAR) + .set("point_type", HDConstant.DcConstant.POINT_TYPE_STATION) + .set("point_code", order.getPlateNum()) + .set("point_name", order.getPlateNum()) + .set("soc", statusData.getReturnBatSoc()) + .set("dcc_no", statusData.getReturnBatNo()) + .eq("bat_code", statusData.getReturnBatCode())); + // 添加2块电池的溯源记录 + addBatteryTrace(orderStatus, statusData, order); + + } + } + + /** + * 添加电池轨迹记录 + * + * @param orderStatus + * @param statusData + * @param osb + */ + private void addBatteryTrace(SwapComplete orderStatus, OrderStatusData statusData, Order osb) { + BatteryTrace bt1 = new BatteryTrace(); + bt1.setOrderNo(orderStatus.getOrderNo()); + bt1.setBatCode(statusData.getRentBatCode()); + bt1.setSoc(statusData.getRentBatSoc()); + bt1.setBeginTime(orderStatus.getStatusTime()); + bt1.setPointType(2); + bt1.setPointCode(osb.getPlateNum()); + bt1.setPointName(osb.getPlateNum()); + bt1.setCreater("SYS"); + BatteryTrace bt2 = new BatteryTrace(); + BeanUtils.copyProperties(bt1, bt2); + bt2.setBatCode(statusData.getReturnBatCode()); + bt2.setSoc(statusData.getRentBatSoc()); + bt2.setPointType(1); + bt2.setPointCode(osb.getStationCode()); + bt2.setPointName(osb.getStationName()); + batteryStationDcService.addTrace(bt1); + batteryStationDcService.addTrace(bt2); + } + + + } diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/LoginServiceImpl.java b/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/LoginServiceImpl.java index 59c4a58..0a5e4ac 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/LoginServiceImpl.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/LoginServiceImpl.java @@ -97,10 +97,12 @@ public class LoginServiceImpl implements LoginService { String openid = redisUtil.get(HDConstant.openidPrefix + wuid).toString(); String sessionKey = redisUtil.get(HDConstant.sessionKeyPrefix + wuid).toString(); HMac hmac = DigestUtil.hmac(HmacAlgorithm.HmacSHA256, sessionKey.getBytes()); - String res = LoginUtil.checkSessionKey(accessTokenService.getAccessToken(), openid, hmac.digestHex("")); + String res = LoginUtil.resetUserSessionKey(accessTokenService.getAccessToken(), openid, hmac.digestHex("")); // String res = LoginUtil.code2Session(xcxProperties.getAppid(), openid, hmac.digestHex("")); JSONObject jo = JSONUtil.parseObj(res); if (jo.getInt("errcode") == 0) { + redisUtil.set(HDConstant.openidPrefix + wuid, jo.getStr("openid"), 0); + redisUtil.set(HDConstant.sessionKeyPrefix + wuid, jo.getStr("session_key"), 0); Map m = tokenBuilder(wuid); return new Result>().success(m); } diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/service/processor/PayExchangeProcessor.java b/wechat-server/src/main/java/com/evotech/hd/wechat/service/processor/PayExchangeProcessor.java index a47d16a..e6a45fb 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/service/processor/PayExchangeProcessor.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/service/processor/PayExchangeProcessor.java @@ -147,7 +147,7 @@ public interface PayExchangeProcessor { //交易类型 tradeDetail.setTradeType(getAttach().getInt("type")); tradeDetail.setOrderNo(getAttach().getStr("orderNo")); - tradeDetail.setOutTradeNo(getAttach().getStr("outTradeNo")); + tradeDetail.setOutTradeNo(transaction.getOutTradeNo()); tradeDetail.setOrderCount(StringUtils.isNotEmpty(tradeDetail.getOrderNo()) ? tradeDetail.getOrderNo().split(",").length : 0); tradeDetail.setTradeAmount(transaction.getAmount().getPayerTotal()); tradeDetail.setPayType(PayTypeEnums.WECHAT.getCode()); diff --git a/wechat-server/src/main/resources/application.yml b/wechat-server/src/main/resources/application.yml index d9b6287..42d8f3a 100644 --- a/wechat-server/src/main/resources/application.yml +++ b/wechat-server/src/main/resources/application.yml @@ -106,11 +106,12 @@ hbyt: -----END PUBLIC KEY----- # 支付回调地址 notify_url: http://api.evo-techina.com/wechat/pay/wechatpay/notify - #notify_url: http://y865f68d.natappfree.cc/wechat/pay/wechatpay/notify + #notify_url: http://wc8b537a.natappfree.cc/wechat/pay/wechatpay/notify # Native支付回调地址 native_notify_url: https://api.evo-techina.com/wechat/wechatpay/native/nativeback/msg # 退款回调地址 refund_notify_url: http://api.evo-techina.com/wechat/pay/wechatpay/refunds/notify + #refund_notify_url: http://wc8b537a.natappfree.cc/wechat/pay/wechatpay/refunds/notify # token缓存时效:小时 token_exp_hour: 2 # 公众号