feat(微信支付): 添加获取支付附加信息功能并优化订单处理- 在 CloudServeController 和 CloudService 中添加获取支付附加信息的接口

- 在 WalletAccountController 和 WalletAccountService 中实现获取支付附加信息的方法
- 优化 OrderSwapBatteryServiceImpl 中的订单处理逻辑,增加未支付订单的校验
- 更新 WechatPayComponent 中的支付处理逻辑,集成新的支付附加信息
This commit is contained in:
tzy 2025-04-09 14:10:39 +08:00
parent 88ceb8a9e7
commit 011dbf48c6
8 changed files with 127 additions and 17 deletions

View File

@ -2,6 +2,7 @@ package com.evotech.hd.cloud.controller.order;
import java.util.List;
import com.evotech.hd.common.core.entity.wechat.WechatPayAttach;
import jakarta.servlet.http.HttpServletRequest;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.GetMapping;
@ -94,5 +95,11 @@ public class WalletAccountController {
public Result<String> getWalleCode(String wuid) {
return walletAccountService.getWalleCode(wuid);
}
@Operation(summary = "获取附加信息")
@PostMapping("/getPayAttach")
@ApiOperationSupport(order = 8)
public Result<WechatPayAttach> getPayAttach(String wuid) {
return walletAccountService.getPayAttach(wuid);
}
}

View File

@ -6,6 +6,7 @@ import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.WalletAccount;
import com.evotech.hd.common.core.entity.cloud.WalletAccountDetail;
import com.evotech.hd.common.core.entity.cloud.request.PageListWalletRequest;
import com.evotech.hd.common.core.entity.wechat.WechatPayAttach;
public interface WalletAccountService {
@ -25,5 +26,7 @@ public interface WalletAccountService {
public Result<Boolean> isOpenAccount(String wuid);
public Result<String> getWalleCode(String wuid);
public Result<String> getWalleCode(String wuid);
public Result<WechatPayAttach> getPayAttach(String wuid);
}

View File

@ -82,6 +82,10 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService {
private RedisUtil redisUtil;
@Resource
private BatteryStationDao batteryStationDao;
@Resource
private GZHTemplateMessageService gzhTemplateMessageService;
@Override
public Result<Integer> addPre(OrderSwapBatteryPre osbp) {
// 1. 检查车辆
@ -107,19 +111,15 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService {
if (!b3){
return new Result<Integer>().error("该换电站未运营!");
}
/* //判断预约时间是否在换电站开放时间范围内
//示例 20210430
String swapDay = osbp.getSwapDay();
//预约时间段 6:00-20:00
String swapDuration = osbp.getSwapDuration();
boolean b4 = batteryStationDao.exists(new QueryWrapper<BatteryStation>()
.eq("code", osbp.getStationCode())
);
if (!b4){
return new Result<Integer>().error("该换电站开放时间范围!");
}*/
//校验预约人是否有未支付的订单
Long ordercount = orderSwapBatteryDao.selectCount(new QueryWrapper<OrderSwapBattery>()
.eq("order_pre_uid", osbp.getUcode())
.eq("status", 6)
.eq("order_pre_uname", osbp.getUname())
.eq("station_code", osbp.getStationCode()));
if (ordercount > 3){
return new Result<Integer>().error("您有未支付的订单,请先支付!");
}
// 是否需要验证人和车绑定关系
// 是否需要验证公司和车的绑定关系
@ -306,6 +306,8 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService {
order.setAmount(fee.intValue());
order.setStatus(6);
orderSwapBatteryDao.updateById(order);
log.info("订单费用计算完成:{}", JSONUtil.parseObj(order));
gzhTemplateMessageService.orderMessageSend2(order.getPkId(),2);
return new Result<String>().success(fee);
}else {
return new Result<String>().error("此订单不是按照电量计算");

View File

@ -7,8 +7,11 @@ import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.dao.CompanyDao;
import com.evotech.hd.cloud.dao.TradeDetailDao;
import com.evotech.hd.common.core.dao.wechat.WechatUserDao;
import com.evotech.hd.common.core.entity.cloud.Company;
import com.evotech.hd.common.core.entity.cloud.TradeDetail;
import com.evotech.hd.common.core.entity.wechat.WechatPayAttach;
import com.evotech.hd.common.core.entity.wechat.WechatUser;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
@ -45,6 +48,8 @@ public class WalletAccountServiceImpl implements WalletAccountService {
private WechatUserDao wechatUserDao;
@Resource
private CompanyDao companyDao;
@Resource
private TradeDetailDao tradeDetailDao;
@Override
public Result<Integer> add(WalletAccount wa) {
@ -193,7 +198,7 @@ public class WalletAccountServiceImpl implements WalletAccountService {
}
@Override
public Result<String> getWalleCode(String wuid) {
public Result<String> getWalleCode(String wuid) {
LambdaQueryWrapper<WalletAccount> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(WalletAccount::getOwnerId, wuid);
WalletAccount walletAccount = walletAccountDao.selectOne(queryWrapper);
@ -211,4 +216,67 @@ public class WalletAccountServiceImpl implements WalletAccountService {
return new Result<String>().success("成功",(StringUtils.hasText(walletAccount.getAccName()) ? walletAccount.getAccName() : "")+"_"+walletAccount.getCode());
}
@Override
public Result<WechatPayAttach> getPayAttach(String wuid) {
try {
if (!StringUtils.hasText(wuid)) {
return new Result<WechatPayAttach>().error("WUID不能为空");
}
// 查询 WechatUser
WechatUser wechatUser = queryWechatUserByWuid(wuid);
if (wechatUser == null) {
log.warn("未找到对应的WechatUser, WUID: {}", wuid);
return new Result<WechatPayAttach>().error("未找到对应的WechatUser");
}
// 查询 WalletAccount
WalletAccount walletAccount = queryWalletAccountByCode(wechatUser.getWuid());
if (walletAccount == null) {
log.warn("未找到对应的WalletAccount, Code: {}", walletAccount.getCode());
return new Result<WechatPayAttach>().error("未找到对应的WalletAccount");
}
// 构建并返回结果
WechatPayAttach wechatPayAttach = buildWechatPayAttach( walletAccount,wechatUser);
return new Result<WechatPayAttach>().success(wechatPayAttach);
} catch (Exception e) {
log.error("获取支付附加信息失败, WUID: {}, 错误信息: {}", wuid, e.getMessage(), e);
return new Result<WechatPayAttach>().error("系统异常,请稍后再试");
}
}
// 查询 WechatUser 的封装方法
private WechatUser queryWechatUserByWuid(String wuid) {
LambdaQueryWrapper<WechatUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(WechatUser::getWuid, wuid);
return wechatUserDao.selectOne(queryWrapper);
}
// 查询 TradeDetail 的封装方法
private TradeDetail queryTradeDetailByTraderCode(String traderCode) {
LambdaQueryWrapper<TradeDetail> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(TradeDetail::getTraderCode, traderCode);
return tradeDetailDao.selectOne(queryWrapper);
}
// 查询 WalletAccount 的封装方法
private WalletAccount queryWalletAccountByCode(String wuid) {
LambdaQueryWrapper<WalletAccount> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(WalletAccount::getOwnerId, wuid);
return walletAccountDao.selectOne(queryWrapper);
}
// 构建 WechatPayAttach 的封装方法
private WechatPayAttach buildWechatPayAttach( WalletAccount walletAccount,WechatUser user) {
WechatPayAttach wechatPayAttach = new WechatPayAttach();
wechatPayAttach.setTrader(user.getName());
wechatPayAttach.setTraderCode(walletAccount.getOwnerId());
wechatPayAttach.setWalletCode(walletAccount.getCode());
return wechatPayAttach;
}
}

View File

@ -22,7 +22,7 @@ public class OrderSwapBatteryTask {
@Resource
private OrderSwapBatteryPreDao orderSwapBatteryPreDao;
// @Scheduled(cron = "0 0 * * * ?") // 每小时执行一次
@Scheduled(cron = "0 0 * * * ?") // 每小时执行一次
public void orderSwapBatteryExpired() {
log.info("\r\n===>>> 开始查找预约单更新预约状态..");

View File

@ -3,6 +3,7 @@ package com.evotech.hd.wechat.controller;
import java.util.List;
import java.util.Map;
import com.evotech.hd.common.core.entity.wechat.WechatPayAttach;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@ -54,4 +55,10 @@ public class CloudServeController {
return cloudService.listWechatUserCar(wuid);
}
@Operation(summary = "获取附加信息")
@GetMapping("/wechatuser/getPayAttach")
@ApiOperationSupport(order = 12)
public Result<WechatPayAttach> getPayAttach(@NotBlank @RequestParam String wuid) {
return cloudService.getPayAttach(wuid);
}
}

View File

@ -5,6 +5,8 @@ import java.util.Map;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.wechat.WechatPayAttach;
import jakarta.validation.constraints.NotBlank;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.http.MediaType;
@ -92,7 +94,11 @@ public interface CloudService {
@PostMapping(value = "/cloud/order/swap/getStartSwap",
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public Result<BatterySwapResponse> getStartSwap(@RequestParam String wuid, String orderId);
@PostMapping(value = "/cloud/wallet/getWalleCode",
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public Result<String> getWalleCode(@RequestParam String wuid);
@PostMapping(value = "/cloud/wallet/getPayAttach", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public Result<WechatPayAttach> getPayAttach(@NotBlank String wuid);
}

View File

@ -2,7 +2,9 @@ package com.evotech.hd.wechat.utils.wechatpay;
import java.util.Date;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
import com.evotech.hd.common.core.entity.cloud.WalletAccount;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
@ -39,6 +41,7 @@ public class WechatPayComponent {
@Resource
private CloudService cloudService;
/**
* 校验并创建钱包账户
* @param wuid 用户ID
@ -111,11 +114,25 @@ public class WechatPayComponent {
}
// 附加信息处理
WechatPayAttach payAttach = JSONUtil.toBean(transaction.getAttach(), WechatPayAttach.class);
tradeDetail.setTradeType(payAttach.getType());
if (wuser != null) {
Result<WechatPayAttach> payAttach1 = cloudService.getPayAttach(wuser.getWuid());
if (payAttach1 != null && payAttach1.getObj() != null) {
payAttach.setTrader(payAttach1.getObj().getTrader());
payAttach.setTraderCode(payAttach1.getObj().getTraderCode());
payAttach.setWalletCode(payAttach1.getObj().getWalletCode());
}
}
tradeDetail.setTradeType(payAttach.getType());
//交易人
tradeDetail.setTrader(payAttach.getTrader());
//交易人编码
tradeDetail.setTraderCode(payAttach.getTraderCode());
//变动金额的钱包账户
tradeDetail.setWallet(payAttach.getWalletCode());
tradeDetail.setDescription(payAttach.getDescription());
if (payAttach.getType() == TradeTypeEnums.PAYORDER.getCode() && Transaction.TradeTypeEnum.JSAPI.equals(transaction.getTradeType())) {
tradeDetail.setOrderNo(payAttach.getOrderNo());
tradeDetail.setOrderCount(payAttach.getOrderNo().split(",").length);