调整mq消息, 处理支付问题

This commit is contained in:
andy 2025-09-06 16:16:59 +08:00
parent f51c0df5f7
commit c4271768e1
15 changed files with 401 additions and 198 deletions

View File

@ -46,7 +46,7 @@ public class MqttResponse<T> implements Serializable {
return this;
}
public MqttResponse<T> success(T data){
public MqttResponse<T> success(T dataBody){
this.code=SUCCESS;
this.msg="成功";
this.data=data;

View File

@ -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;

View File

@ -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());

View File

@ -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())) {

View File

@ -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<Order>().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<OrderDetail>().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<VehicleInfo>()
.set("bat_code", statusData.getRentBatCode())
.set("bat_soc", statusData.getRentBatSoc())
.eq("plate_num", order.getPlateNum()));
//出租电池信息维护
batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
.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<BatteryStationDc>()
.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<Order>().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<OrderDetail>().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<VehicleInfo>()
// .set("bat_code", statusData.getRentBatCode())
// .set("bat_soc", statusData.getRentBatSoc())
// .eq("plate_num", order.getPlateNum()));
// //出租电池信息维护
// batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
// .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<BatteryStationDc>()
// .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);
// }
//
}

View File

@ -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);

View File

@ -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<Order>().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())));
}

View File

@ -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);
}
}
}

View File

@ -13,4 +13,7 @@ import com.evotech.hd.common.core.entity.order.OrderDetail;
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface OrderDetailService extends IService<OrderDetail> {
public OrderDetail addOrderDetailByOrder(Integer orderId);
}

View File

@ -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<Order> {
Result<List<OrderBillListVo>> billList(String companyCode, String orderTimeEnd);
void excelBillList(String companyCode, String orderTimeEnd);
void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData);
}

View File

@ -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<OrderDetailDao, OrderDetail> implements OrderDetailService {
@Override
public OrderDetail addOrderDetailByOrder(Integer orderId) {
OrderDetail orderDetail = getOne(new LambdaQueryWrapper<OrderDetail>().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;
}
}

View File

@ -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<OrderDao, Order> 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<OrderDao, Order> 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<Order>().success(order) : new Result<Order>().error("订单生成异常", null));
return (saveResult ? new Result<Order>().success(order) : new Result<Order>().error("订单生成异常", null));
}
@Override
@ -234,6 +246,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
return new Result<Boolean>().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<OrderDao, Order> implements Or
updateById(order);
}
/**
* 订单最终状态的更新
* @param orderStatus
* @param statusData
*/
@Override
public void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData) {
Order order = getOne(new LambdaQueryWrapper<Order>().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<VehicleInfo>()
.set("bat_code", statusData.getRentBatCode())
.set("bat_soc", statusData.getRentBatSoc())
.eq("plate_num", order.getPlateNum()));
//出租电池信息维护
batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
.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<BatteryStationDc>()
.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);
}
}

View File

@ -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<String, String> m = tokenBuilder(wuid);
return new Result<Map<String, String>>().success(m);
}

View File

@ -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());

View File

@ -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
# 公众号