list = orderLogService.selectOrderLogList(orderLog);
+ return success(list);
+ }
+
+
+
/**
* 导出订单服务记录列表
*/
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/PayNotifyController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/PayNotifyController.java
index 5cd5ac8..3351804 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/PayNotifyController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/PayNotifyController.java
@@ -39,18 +39,19 @@ import java.util.Map;
/**
* 支付回调控制器
- *
+ *
* 处理各种支付场景的微信支付回调通知
* 所有回调接口都以api开头,符合项目规范
- *
+ *
* @author Mr. Zhang Pan
- * @date 2025-06-16
* @version 1.0
+ * @date 2025-06-16
*/
@RestController
public class PayNotifyController extends BaseController {
-
+
private static final Logger logger = LoggerFactory.getLogger(PayNotifyController.class);
+
/**
* 获取微信配置
*/
@@ -60,10 +61,10 @@ public class PayNotifyController extends BaseController {
@Autowired
private WechatPayUtil wechatPayUtil;
-
+
@Autowired
private IGoodsOrderService goodsOrderService;
-
+
@Autowired
private IOrderService orderService;
@@ -72,31 +73,31 @@ public class PayNotifyController extends BaseController {
@Autowired
private IOrderLogService orderLogService;
-
+
@Autowired
private IUsersService usersService;
-
+
@Autowired
private IServiceGoodsService serviceGoodsService;
-
+
@Autowired
private ISiteConfigService siteConfigService;
-
+
@Autowired
private IIntegralLogService integralLogService;
-
+
@Autowired
private IPayMoneyLogService payMoneyLogService;
@Autowired
- private IWorkerLevelService workerLevelService;
+ private IWorkerLevelService workerLevelService;
@Autowired
- private IWorkerMarginLogService workerMarginLogService;
+ private IWorkerMarginLogService workerMarginLogService;
@Autowired
- private IWorkerMoneyLogService workerMoneyLogService;
+ private IWorkerMoneyLogService workerMoneyLogService;
@Autowired
@@ -123,10 +124,10 @@ public class PayNotifyController extends BaseController {
/**
* 商品支付回调接口
- *
+ *
* @param request HTTP请求对象
* @return XML格式响应给微信服务器
- *
+ *
* 处理商品订单的支付成功回调:
* 1. 验证支付签名
* 2. 更新商品订单支付状态
@@ -173,25 +174,25 @@ public class PayNotifyController extends BaseController {
// }
long uid = Long.parseLong("0");
// 6. 更新商品订单状态
- for (GoodsOrder goodsOrderData : goodsOrderslist){
- uid= goodsOrderData.getUid();
+ for (GoodsOrder goodsOrderData : goodsOrderslist) {
+ uid = goodsOrderData.getUid();
goodsOrderData.setStatus(2L); // 2:已支付
goodsOrderData.setPayTime(new Date());
goodsOrderData.setTransactionId(transactionId);
int updateResult = goodsOrderService.updateGoodsOrder(goodsOrderData);
ServiceGoods serviceGoods = serviceGoodsService.selectServiceGoodsById(goodsOrderData.getProductId());
Users userinfo = usersService.selectUsersById(goodsOrderData.getUid());
- // WXsendMsgUtil.sendUserForMoneySuccess(userinfo.getOpenid(),goodsOrder,serviceGoods);
+ // WXsendMsgUtil.sendUserForMoneySuccess(userinfo.getOpenid(),goodsOrder,serviceGoods);
}
// if (updateResult <= 0) {
// logger.error("更新商品订单状态失败,订单号:{}", outTradeNo);
// return buildFailResponse("更新订单状态失败");
// }
- Users users =usersService.selectUsersById(uid);
+ Users users = usersService.selectUsersById(uid);
// 7. 处理商品订单支付成功后的业务逻辑
- handleGoodsPaymentSuccess(users,outTradeNo, paymentInfo);
- //8向客户推送微信消息
+ handleGoodsPaymentSuccess(users, outTradeNo, paymentInfo);
+ //8向客户推送微信消息
//sendWechatMessage(users,outTradeNo);
logger.info("商品支付回调处理成功,订单号:{}", outTradeNo);
@@ -204,14 +205,12 @@ public class PayNotifyController extends BaseController {
}
-
-
/**
* 拼团支付的回调接口
*
* @param request HTTP请求对象
* @return XML格式响应给微信服务器
- *IUserGroupBuyingService userGroupBuyingService;
+ * IUserGroupBuyingService userGroupBuyingService;
* 处理商品订单的支付成功回调:
* 1. 验证支付签名
* 2. 更新商品订单支付状态
@@ -241,7 +240,7 @@ public class PayNotifyController extends BaseController {
String transactionId = (String) paymentInfo.get("transactionId");
String totalFee = (String) paymentInfo.get("totalFee");
UserGroupBuying userGroupBuying = userGroupBuyingService.selectUserGroupBuyingById(Long.valueOf(outTradeNo));
- if (userGroupBuying!=null){
+ if (userGroupBuying != null) {
userGroupBuying.setStatus(1L);
userGroupBuying.setTransactionId(transactionId);
userGroupBuying.setPaytime(new Date());
@@ -286,14 +285,12 @@ public class PayNotifyController extends BaseController {
}
-
-
/**
* 拼团支付的回调接口
*
* @param request HTTP请求对象
* @return XML格式响应给微信服务器
- *IUserGroupBuyingService userGroupBuyingService;
+ * IUserGroupBuyingService userGroupBuyingService;
* 处理商品订单的支付成功回调:
* 1. 验证支付签名
* 2. 更新商品订单支付状态
@@ -301,7 +298,7 @@ public class PayNotifyController extends BaseController {
* 4. 处理库存扣减等业务逻辑
*/
@PostMapping(value = "/api/order/amount/paydata/notify")
- public String apiorderamountpaydatanotify(HttpServletRequest request) {
+ public String apiorderamountpaydatanotify(HttpServletRequest request) {
try {
logger.info("收到商品支付回调通知,开始处理...");
@@ -324,7 +321,7 @@ public class PayNotifyController extends BaseController {
String totalFee = (String) paymentInfo.get("totalFee");
UsersPayBefor usersPayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(outTradeNo);
- if (usersPayBefor!=null){
+ if (usersPayBefor != null) {
usersPayBefor.setStatus(2L);
usersPayBefor.setPaytime(new Date());
usersPayBefor.setPaycode(transactionId);
@@ -334,8 +331,17 @@ public class PayNotifyController extends BaseController {
if (usersPayBefor != null) {
users = usersService.selectUsersById(usersPayBefor.getUid());
}
+ int flg= BenefitPointsUtil.creatServerOrderData(usersPayBefor);
+ if (flg==0){
+ UsersPayBefor newpayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(usersPayBefor.getOrderid());
+ if (newpayBefor!=null){
+ // 创建订单
+ newpayBefor.setStatus(2L);
+ usersPayBeforService.updateUsersPayBefor(newpayBefor);
+ }
+ }
//扣减消费金服务金
- BenefitPointsUtil.deductServiceAndConsumption(usersPayBefor.getOid(), users, usersPayBefor.getServicemoney(), usersPayBefor.getShopmoney());
+ // BenefitPointsUtil.deductServiceAndConsumption(usersPayBefor.getOid(), users, usersPayBefor.getServicemoney(), usersPayBefor.getShopmoney());
//回调方法用来处理订单相关数据
OrderUtil.prepayCallback(usersPayBefor, users);
// //订单回调处理,拼团创建订单,其他订单修改状态
@@ -370,7 +376,7 @@ public class PayNotifyController extends BaseController {
*
* @param request HTTP请求对象
* @return XML格式响应给微信服务器
- *IUserGroupBuyingService userGroupBuyingService;
+ * IUserGroupBuyingService userGroupBuyingService;
* 处理商品订单的支付成功回调:
* 1. 验证支付签名
* 2. 更新商品订单支付状态
@@ -378,7 +384,7 @@ public class PayNotifyController extends BaseController {
* 4. 处理库存扣减等业务逻辑
*/
@PostMapping(value = "/api/order/friend/paydata/notify")
- public String apiorderfriendpaydatanotify(HttpServletRequest request) {
+ public String apiorderfriendpaydatanotify(HttpServletRequest request) {
try {
logger.info("收到商品支付回调通知,开始处理...");
@@ -401,8 +407,9 @@ public class PayNotifyController extends BaseController {
String totalFee = (String) paymentInfo.get("totalFee");
UsersPayBefor usersPayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(outTradeNo);
- if (usersPayBefor!=null){
- usersPayBefor.setStatus(2L); usersPayBefor.setPaytype(4L);
+ if (usersPayBefor != null) {
+ usersPayBefor.setStatus(2L);
+ usersPayBefor.setPaytype(4L);
usersPayBefor.setPaytime(new Date());
usersPayBefor.setPaycode(transactionId);
usersPayBeforService.updateUsersPayBefor(usersPayBefor);
@@ -444,7 +451,7 @@ public class PayNotifyController extends BaseController {
*
* @param request HTTP请求对象
* @return XML格式响应给微信服务器
- *IUserGroupBuyingService userGroupBuyingService;
+ * IUserGroupBuyingService userGroupBuyingService;
* 处理商品订单的支付成功回调:
* 1. 验证支付签名
* 2. 更新商品订单支付状态
@@ -452,7 +459,7 @@ public class PayNotifyController extends BaseController {
* 4. 处理库存扣减等业务逻辑
*/
@PostMapping(value = "/api/order/amount/paydata/zuhenotify")
- public String apiorderamountpaydatazuhenotify(HttpServletRequest request) {
+ public String apiorderamountpaydatazuhenotify(HttpServletRequest request) {
try {
logger.info("收到商品支付回调通知,开始处理...");
@@ -479,15 +486,24 @@ public class PayNotifyController extends BaseController {
if (usersPayBefor != null && usersPayBefor.getYemoney() != null && usersPayBefor.getYemoney().compareTo(BigDecimal.ZERO) > 0) {
Users user = usersService.selectUsersById(usersPayBefor.getUid());
Map balanceResult = BalancePayUtil.processBalancePayment(
- user.getId(),
- usersPayBefor.getYemoney(),
- "订单组合支付-余额部分" + usersPayBefor.getYemoney() + "元",
- usersPayBefor.getOrderid()
+ user.getId(),
+ usersPayBefor.getYemoney(),
+ "订单组合支付-余额部分" + usersPayBefor.getYemoney() + "元",
+ usersPayBefor.getOrderid()
);
if (balanceResult == null || !Boolean.TRUE.equals(balanceResult.get("success"))) {
//扣减消费金服务金
- BenefitPointsUtil.deductServiceAndConsumption(usersPayBefor.getOid(), user, usersPayBefor.getServicemoney(), usersPayBefor.getShopmoney());
+ // BenefitPointsUtil.deductServiceAndConsumption(usersPayBefor.getOid(), user, usersPayBefor.getServicemoney(), usersPayBefor.getShopmoney());
//回调方法用来处理订单相关数据
+ int flg= BenefitPointsUtil.creatServerOrderData(usersPayBefor);
+ if (flg==0){
+ UsersPayBefor newpayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(usersPayBefor.getOrderid());
+ if (newpayBefor!=null){
+ // 创建订单
+ newpayBefor.setStatus(2L);
+ usersPayBeforService.updateUsersPayBefor(newpayBefor);
+ }
+ }
OrderUtil.prepayCallback(usersPayBefor, user);
String errorMsg = balanceResult != null ? (String) balanceResult.get("message") : "余额支付失败";
logger.error("组合支付余额部分扣款失败:{}", errorMsg);
@@ -495,7 +511,7 @@ public class PayNotifyController extends BaseController {
}
}
- if (usersPayBefor!=null){
+ if (usersPayBefor != null) {
usersPayBefor.setStatus(2L);
usersPayBefor.setPaytime(new Date());
usersPayBefor.setPaycode(transactionId);
@@ -534,17 +550,12 @@ public class PayNotifyController extends BaseController {
}
-
-
-
-
-
/**
* 用户支付接口
*
* @param request HTTP请求对象
* @return XML格式响应给微信服务器
- *IUserMemberRechargeLogService userMemberRechargeLogService;
+ * IUserMemberRechargeLogService userMemberRechargeLogService;
* 处理商品订单的支付成功回调:
* 1. 验证支付签名
* 2. 更新商品订单支付状态
@@ -573,9 +584,9 @@ public class PayNotifyController extends BaseController {
String transactionId = (String) paymentInfo.get("transactionId");
String totalFee = (String) paymentInfo.get("totalFee");
UserMemberRechargeLog userMemberRechargeLog = userMemberRechargeLogService.selectUserMemberRechargeLogById(Integer.parseInt(outTradeNo));
- if (userMemberRechargeLog!=null){
- Users users =usersService.selectUsersById(Long.valueOf(userMemberRechargeLog.getUid()));
- if (users!=null){
+ if (userMemberRechargeLog != null) {
+ Users users = usersService.selectUsersById(Long.valueOf(userMemberRechargeLog.getUid()));
+ if (users != null) {
userMemberRechargeLog.setPaytype(1);
userMemberRechargeLog.setTransactionId(transactionId);
userMemberRechargeLogService.updateUserMemberRechargeLog(userMemberRechargeLog);
@@ -585,7 +596,7 @@ public class PayNotifyController extends BaseController {
newuserMemnerConsumptionLog.setConsumptiontype(3);
newuserMemnerConsumptionLog.setConsumptiontime(new Date());
newuserMemnerConsumptionLog.setConsumptionmoney(userMemberRechargeLog.getComemoney());
- newuserMemnerConsumptionLog.setReamk("用户充值"+userMemberRechargeLog.getInmoney()+"实际到账"+userMemberRechargeLog.getComemoney());
+ newuserMemnerConsumptionLog.setReamk("用户充值" + userMemberRechargeLog.getInmoney() + "实际到账" + userMemberRechargeLog.getComemoney());
newuserMemnerConsumptionLog.setBeformoney(users.getBalance());
newuserMemnerConsumptionLog.setAftermoney(users.getBalance().add(userMemberRechargeLog.getComemoney()));
newuserMemnerConsumptionLog.setNowmoney(users.getBalance().add(userMemberRechargeLog.getComemoney()));
@@ -593,49 +604,49 @@ public class PayNotifyController extends BaseController {
userMemnerConsumptionLogService.insertUserMemnerConsumptionLog(newuserMemnerConsumptionLog);
users.setBalance(users.getBalance().add(userMemberRechargeLog.getComemoney()));
usersService.updateUsers(users);
- WXsendMsgUtil.sendUserPayMoney(users.getOpenid(),"充值成功",totalFee,"1","充值成功");
+ WXsendMsgUtil.sendUserPayMoney(users.getOpenid(), "充值成功", totalFee, "1", "充值成功");
//如果是会员包年充值就需要先充值后消费,形成一个用户余额不变动,但是用户的流水里面需要提现出用户的这次消费情况
- if (userMemberRechargeLog.getIsmember()==1){
- UserMemnerConsumptionLog userMemnerConsumptionLog = new UserMemnerConsumptionLog();
- userMemnerConsumptionLog.setUid(Math.toIntExact(users.getId()));
- userMemnerConsumptionLog.setConsumptiontype(2);
- userMemnerConsumptionLog.setConsumptiontime(new Date());
- userMemnerConsumptionLog.setConsumptionmoney(userMemberRechargeLog.getComemoney());
- userMemnerConsumptionLog.setReamk("会员包年扣减");
- userMemnerConsumptionLog.setBeformoney(users.getBalance());
- userMemnerConsumptionLog.setAftermoney(users.getBalance().subtract(userMemberRechargeLog.getComemoney()));
- userMemnerConsumptionLog.setNowmoney(users.getBalance().subtract(userMemberRechargeLog.getComemoney()));
- userMemnerConsumptionLog.setType(2);
- userMemnerConsumptionLogService.insertUserMemnerConsumptionLog(userMemnerConsumptionLog);
+ if (userMemberRechargeLog.getIsmember() == 1) {
+ UserMemnerConsumptionLog userMemnerConsumptionLog = new UserMemnerConsumptionLog();
+ userMemnerConsumptionLog.setUid(Math.toIntExact(users.getId()));
+ userMemnerConsumptionLog.setConsumptiontype(2);
+ userMemnerConsumptionLog.setConsumptiontime(new Date());
+ userMemnerConsumptionLog.setConsumptionmoney(userMemberRechargeLog.getComemoney());
+ userMemnerConsumptionLog.setReamk("会员包年扣减");
+ userMemnerConsumptionLog.setBeformoney(users.getBalance());
+ userMemnerConsumptionLog.setAftermoney(users.getBalance().subtract(userMemberRechargeLog.getComemoney()));
+ userMemnerConsumptionLog.setNowmoney(users.getBalance().subtract(userMemberRechargeLog.getComemoney()));
+ userMemnerConsumptionLog.setType(2);
+ userMemnerConsumptionLogService.insertUserMemnerConsumptionLog(userMemnerConsumptionLog);
- if (userMemberRechargeLog.getIsmember() == 1) {
- // 会员包年充值
- if (users.getIsmember() == 1 && users.getMemberEnd() != null) {
- // 续费会员:在原有会员结束时间基础上加一年
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(users.getMemberEnd());
- calendar.add(Calendar.YEAR, 1);
- users.setMemberEnd(calendar.getTime());
- } else if (users.getIsmember() == 0) {
- // 新会员:会员开始时间为当前,结束时间为一年后
- users.setMemberBegin(new Date());
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(new Date());
- calendar.add(Calendar.YEAR, 1);
- users.setMemberEnd(calendar.getTime());
+ if (userMemberRechargeLog.getIsmember() == 1) {
+ // 会员包年充值
+ if (users.getIsmember() == 1 && users.getMemberEnd() != null) {
+ // 续费会员:在原有会员结束时间基础上加一年
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(users.getMemberEnd());
+ calendar.add(Calendar.YEAR, 1);
+ users.setMemberEnd(calendar.getTime());
+ } else if (users.getIsmember() == 0) {
+ // 新会员:会员开始时间为当前,结束时间为一年后
+ users.setMemberBegin(new Date());
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(new Date());
+ calendar.add(Calendar.YEAR, 1);
+ users.setMemberEnd(calendar.getTime());
+ }
+ users.setIsmember(1);
+ users.setBalance(users.getBalance().subtract(userMemberRechargeLog.getComemoney()));
+ usersService.updateUsers(users);
}
- users.setIsmember(1);
- users.setBalance(users.getBalance().subtract(userMemberRechargeLog.getComemoney()));
- usersService.updateUsers(users);
- }
-
+
}
//WXsendMsgUtil.sendUserForMoneySuccess(users.getOpenid(),userMemberRechargeLog,users);
}
}
- Users users1 =usersService.selectUsersById(Long.valueOf(userMemberRechargeLog.getUid()));
+ Users users1 = usersService.selectUsersById(Long.valueOf(userMemberRechargeLog.getUid()));
//最后无论如何平台流水需要添加,让平台看到流水和账目
PayMoneyLog payMoneyLog = new PayMoneyLog();
payMoneyLog.setOid(Long.valueOf(userMemberRechargeLog.getId()));
@@ -657,15 +668,12 @@ public class PayNotifyController extends BaseController {
}
-
-
-
/**
* 上门费支付回调接口
- *
+ *
* @param request HTTP请求对象
* @return XML格式响应给微信服务器
- *
+ *
* 处理上门费的支付成功回调:
* 1. 验证支付签名
* 2. 更新订单日志中的上门费支付状态
@@ -711,7 +719,7 @@ public class PayNotifyController extends BaseController {
// 6. 更新上门费支付状态
orderLog.setPaid(2L); // 1:已支付
orderLog.setWorkerCost(new BigDecimal(totalFee));
- orderLog.setPayTime(System.currentTimeMillis()/1000);
+ orderLog.setPayTime(System.currentTimeMillis() / 1000);
//orderLog.setUpdateTime(new Date());
int updateResult = orderLogService.updateOrderLog(orderLog);
@@ -737,14 +745,14 @@ public class PayNotifyController extends BaseController {
// 7. 处理上门费支付成功后的业务逻辑
handleDoorFeePaymentSuccess(orderLog, paymentInfo);
- // 2. 处理积分奖励
+ // 2. 处理积分奖励
handleIntegralReward(users, paymentInfo, "付款赠送积分");
//微信推送给师傅用户已支付上门费String openid, Order order, ServiceGoods serviceGoods
- Users worker=usersService.selectUsersById(mainOrder.getWorkerId());
- if (worker != null){
+ Users worker = usersService.selectUsersById(mainOrder.getWorkerId());
+ if (worker != null) {
ServiceGoods serviceGoods = serviceGoodsService.selectServiceGoodsById(mainOrder.getProductId());
- if (serviceGoods != null){
- WXsendMsgUtil.sendUserPayDoorMoneyForWorker(worker.getOpenid(),mainOrder,"上门费");
+ if (serviceGoods != null) {
+ WXsendMsgUtil.sendUserPayDoorMoneyForWorker(worker.getOpenid(), mainOrder, "上门费");
}
}
@@ -760,10 +768,10 @@ public class PayNotifyController extends BaseController {
/**
* 定金支付回调接口
- *
+ *
* @param request HTTP请求对象
* @return XML格式响应给微信服务器
- *
+ *
* 处理定金的支付成功回调:
* 1. 验证支付签名
* 2. 更新订单日志中的定金支付状态
@@ -808,8 +816,8 @@ public class PayNotifyController extends BaseController {
// 6. 更新定金支付状态
orderLog.setDepPaid(2); // 1:已支付
- orderLog.setDepPayTime(System.currentTimeMillis()/1000);
- // orderLog.setUpdateTime(new Date());
+ orderLog.setDepPayTime(System.currentTimeMillis() / 1000);
+ // orderLog.setUpdateTime(new Date());
int updateResult = orderLogService.updateOrderLog(orderLog);
if (updateResult <= 0) {
@@ -830,7 +838,7 @@ public class PayNotifyController extends BaseController {
// 7. 处理定金支付成功后的业务逻辑
Users users = usersService.selectUsersById(mainOrder.getUid());
- handleDepositPaymentSuccess(users,orderLog, paymentInfo);
+ handleDepositPaymentSuccess(users, orderLog, paymentInfo);
logger.info("定金支付回调处理成功,订单号:{}", outTradeNo);
return buildSuccessResponse();
@@ -843,10 +851,10 @@ public class PayNotifyController extends BaseController {
/**
* 订单金额支付回调接口
- *
+ *
* @param request HTTP请求对象
* @return XML格式响应给微信服务器
- *
+ *
* 处理订单总金额的支付成功回调:
* 1. 验证支付签名
* 2. 更新服务订单支付状态
@@ -891,7 +899,7 @@ public class PayNotifyController extends BaseController {
}
//更新最新的一条日志信息
OrderLog orderLog = orderLogService.selectDataTheFirstNew(order.getId());
- orderLog.setPayTime(System.currentTimeMillis()/1000);
+ orderLog.setPayTime(System.currentTimeMillis() / 1000);
orderLog.setPaid(2L);
orderLogService.updateOrderLog(orderLog);
@@ -913,7 +921,7 @@ public class PayNotifyController extends BaseController {
// 7. 处理订单支付成功后的业务逻辑
handleOrderAmountPaymentSuccess(order, paymentInfo);
- calculateCommissionAndRecord(order.getOrderId(),order.getWorkerId());
+ calculateCommissionAndRecord(order.getOrderId(), order.getWorkerId());
//calculateCommissionMoney(order.getOrderId(), order.getUid(),order.getWorkerId());
logger.info("订单金额支付回调处理成功,订单号:{}", outTradeNo);
return buildSuccessResponse();
@@ -927,7 +935,7 @@ public class PayNotifyController extends BaseController {
/**
* 处理商品支付成功后的业务逻辑
*/
- private void handleGoodsPaymentSuccess(Users users,String outTradeNo, Map paymentInfo) {
+ private void handleGoodsPaymentSuccess(Users users, String outTradeNo, Map paymentInfo) {
try {
// 1. 记录支付成功日志
logger.info("商品订单支付成功,订单号:{},支付金额:{}",
@@ -937,7 +945,7 @@ public class PayNotifyController extends BaseController {
handleIntegralReward(users, paymentInfo, "下单赠送积分");
// 3. 记录支付记录
- recordPaymentLog(outTradeNo, paymentInfo,"支付订单金额");
+ recordPaymentLog(outTradeNo, paymentInfo, "支付订单金额");
} catch (Exception e) {
logger.error("处理商品支付成功业务逻辑异常:", e);
@@ -950,8 +958,8 @@ public class PayNotifyController extends BaseController {
private void handleDoorFeePaymentSuccess(OrderLog orderLog, Map paymentInfo) {
try {
// 1. 记录支付成功日志
- logger.info("上门费支付成功,订单号:{},支付金额:{}",
- orderLog.getLogOrderId(), paymentInfo.get("totalFee"));
+ logger.info("上门费支付成功,订单号:{},支付金额:{}",
+ orderLog.getLogOrderId(), paymentInfo.get("totalFee"));
// 2. 获取主订单信息以获取用户信息
Order mainOrder = orderService.selectOrderByOrderId(orderLog.getOrderId());
@@ -959,7 +967,7 @@ public class PayNotifyController extends BaseController {
// 3. 上门费支付不赠送积分(按照PHP逻辑)
logger.info("上门费支付不赠送积分");
- recordPaymentLogones(orderLog.getOid(), orderLog.getLogOrderId(),mainOrder.getUid(),mainOrder.getUname(), paymentInfo, "支付上门费");
+ recordPaymentLogones(orderLog.getOid(), orderLog.getLogOrderId(), mainOrder.getUid(), mainOrder.getUname(), paymentInfo, "支付上门费");
//// // 4. 记录支付记录
@@ -975,23 +983,22 @@ public class PayNotifyController extends BaseController {
/**
* 处理定金支付成功后的业务逻辑
*/
- private void handleDepositPaymentSuccess(Users users,OrderLog orderLog, Map paymentInfo) {
+ private void handleDepositPaymentSuccess(Users users, OrderLog orderLog, Map paymentInfo) {
try {
// 1. 记录支付成功日志
- logger.info("定金支付成功,订单号:{},支付金额:{}",
- orderLog.getDepLogId(), paymentInfo.get("totalFee"));
+ logger.info("定金支付成功,订单号:{},支付金额:{}",
+ orderLog.getDepLogId(), paymentInfo.get("totalFee"));
// 2. 获取主订单信息以获取用户信息
Order mainOrder = orderService.selectOrderByOrderId(orderLog.getOrderId());
if (mainOrder != null) {
-
// 2. 处理积分奖励
handleIntegralReward(users, paymentInfo, "支付赠送积分");
- // long oid,String orderid,long uid,String uname,Map paymentInfo, String description
+ // long oid,String orderid,long uid,String uname,Map paymentInfo, String description
// 3. 记录支付记录
- recordPaymentLogones(orderLog.getOid(), orderLog.getOrderId(),users.getId(),users.getName(), paymentInfo,"支付定金金额");
+ recordPaymentLogones(orderLog.getOid(), orderLog.getOrderId(), users.getId(), users.getName(), paymentInfo, "支付定金金额");
// // 3. 处理积分奖励
// handleIntegralReward(orderLog.getDepLogId(), mainOrder.getUid(),
@@ -1013,8 +1020,8 @@ public class PayNotifyController extends BaseController {
private void handleOrderAmountPaymentSuccess(Order order, Map paymentInfo) {
try {
// 1. 记录支付成功日志
- logger.info("订单金额支付成功,订单号:{},支付金额:{}",
- order.getOrderId(), paymentInfo.get("totalFee"));
+ logger.info("订单金额支付成功,订单号:{},支付金额:{}",
+ order.getOrderId(), paymentInfo.get("totalFee"));
// 2. 更新订单状态为已完成
order.setStatus(4L); // 4:已结束
@@ -1026,7 +1033,7 @@ public class PayNotifyController extends BaseController {
// 4. 记录支付记录
// recordPaymentLog(order.getId(), order.getOrderId(),
// order.getUid(), order.getUname(), paymentInfo, "支付" + order.getProductName() + "服务尾款");
- recordPaymentLogones(order.getId(),order.getOrderId(),order.getUid(),order.getUname(), paymentInfo, "订单尾款支付");
+ recordPaymentLogones(order.getId(), order.getOrderId(), order.getUid(), order.getUname(), paymentInfo, "订单尾款支付");
} catch (Exception e) {
logger.error("处理订单金额支付成功业务逻辑异常:", e);
@@ -1083,27 +1090,27 @@ public class PayNotifyController extends BaseController {
* @param paymentInfo 支付信息
* @param description 描述
*/
- private void handleIntegralReward(Users users,Map paymentInfo, String description) {
+ private void handleIntegralReward(Users users, Map paymentInfo, String description) {
try {
// 1. 查询系统配置 config_one
SiteConfig siteConfigQuery = new SiteConfig();
siteConfigQuery.setName("config_one");
List configList = siteConfigService.selectSiteConfigList(siteConfigQuery);
-
+
if (configList.isEmpty()) {
logger.warn("未找到config_one配置,跳过积分奖励");
return;
}
-
+
SiteConfig config = configList.get(0);
String configValue = config.getValue();
-
+
if (StringUtils.isEmpty(configValue)) {
logger.warn("config_one配置值为空,跳过积分奖励");
return;
}
-
+
// 2. 解析JSON获取integral值(积分配置)
Integer integral = null;
try {
@@ -1113,25 +1120,25 @@ public class PayNotifyController extends BaseController {
logger.error("解析config_one配置失败:", e);
return;
}
-
+
if (integral == null || integral <= 0) {
logger.warn("integral配置无效,跳过积分奖励");
return;
}
-
+
// 3. 计算积分
String totalFeeStr = (String) paymentInfo.get("totalFee");
if (StringUtils.isEmpty(totalFeeStr)) {
logger.warn("支付金额为空,跳过积分奖励");
return;
}
-
+
// 支付金额单位为分,转换为元
BigDecimal payAmount = new BigDecimal(totalFeeStr).divide(new BigDecimal(100));
-
+
// 计算积分:实际支付金额除以integral,向下取整
long integralReward = payAmount.divide(new BigDecimal(integral), 0, BigDecimal.ROUND_DOWN).longValue();
-
+
// 4. 如果积分大于1,则添加积分记录
if (integralReward >= 1) {
IntegralLog integralLog = new IntegralLog();
@@ -1144,7 +1151,7 @@ public class PayNotifyController extends BaseController {
integralLog.setNum(integralReward);
integralLog.setCreatedAt(new Date());
integralLog.setUpdatedAt(new Date());
-
+
int result = integralLogService.insertIntegralLog(integralLog);
if (result > 0) {
logger.info("用户{}通过{}获得{}积分", users.getName(), description, integralReward);
@@ -1152,20 +1159,21 @@ public class PayNotifyController extends BaseController {
logger.error("添加积分记录失败,订单号:{}", integralLog.getOrderId());
}
} else {
- logger.info("订单{}积分奖励小于1,不予奖励","");
+ logger.info("订单{}积分奖励小于1,不予奖励", "");
}
-
+
} catch (Exception e) {
logger.error("处理积分奖励异常,订单号:{},异常信息:", "", e);
}
}
+
/**
* 记录支付记录单条
*
* @param paymentInfo 支付信息
* @param description 描述
*/
- private void recordPaymentLogones(long oid,String orderid,long uid,String uname,Map paymentInfo, String description) {
+ private void recordPaymentLogones(long oid, String orderid, long uid, String uname, Map paymentInfo, String description) {
try {
String totalFeeStr = (String) paymentInfo.get("totalFee");
@@ -1173,16 +1181,16 @@ public class PayNotifyController extends BaseController {
logger.warn("支付金额为空,跳过支付记录");
return;
}
- PayMoneyLog payMoneyLog = new PayMoneyLog();
- payMoneyLog.setOid(oid);
- payMoneyLog.setOrderId(orderid);
- payMoneyLog.setUid(uid);
- payMoneyLog.setUname(uname);
- payMoneyLog.setPrice(new BigDecimal(totalFeeStr));
- payMoneyLog.setMark(description);
- payMoneyLog.setPayTime(new Date());
- payMoneyLogService.insertPayMoneyLog(payMoneyLog);
- logger.info("用户{}的{}支付记录已保存,金额:{}元", uname, description, totalFeeStr);
+ PayMoneyLog payMoneyLog = new PayMoneyLog();
+ payMoneyLog.setOid(oid);
+ payMoneyLog.setOrderId(orderid);
+ payMoneyLog.setUid(uid);
+ payMoneyLog.setUname(uname);
+ payMoneyLog.setPrice(new BigDecimal(totalFeeStr));
+ payMoneyLog.setMark(description);
+ payMoneyLog.setPayTime(new Date());
+ payMoneyLogService.insertPayMoneyLog(payMoneyLog);
+ logger.info("用户{}的{}支付记录已保存,金额:{}元", uname, description, totalFeeStr);
// 支付金额单位为分,转换为元
// BigDecimal payAmount = new BigDecimal(totalFeeStr).divide(new BigDecimal(100));
@@ -1191,13 +1199,14 @@ public class PayNotifyController extends BaseController {
logger.error("记录支付记录异常,订单号:{},异常信息:", oid, e);
}
}
+
/**
* 记录支付记录多条
*
* @param paymentInfo 支付信息
* @param description 描述
*/
- private void recordPaymentLog(String outTradeNo,Map paymentInfo, String description) {
+ private void recordPaymentLog(String outTradeNo, Map paymentInfo, String description) {
try {
String totalFeeStr = (String) paymentInfo.get("totalFee");
@@ -1211,29 +1220,24 @@ public class PayNotifyController extends BaseController {
goodsOrder.setMainOrderId(outTradeNo);
List goodsOrderslist = goodsOrderService.selectGoodsOrderList(goodsOrder);
if (!goodsOrderslist.isEmpty()) {
- for (GoodsOrder goodsOrderdata : goodsOrderslist){
- PayMoneyLog payMoneyLog = new PayMoneyLog();
- payMoneyLog.setOid(goodsOrderdata.getId());
- payMoneyLog.setOrderId(goodsOrderdata.getOrderId());
- payMoneyLog.setUid(goodsOrderdata.getUid());
- payMoneyLog.setUname(goodsOrderdata.getUname());
- payMoneyLog.setPrice(goodsOrderdata.getTotalPrice());
- payMoneyLog.setMark(description);
- payMoneyLog.setPayTime(new Date());
- payMoneyLogService.insertPayMoneyLog(payMoneyLog);
- logger.info("用户{}的{}支付记录已保存,金额:{}元", goodsOrderdata.getUname(), description, goodsOrderdata.getTotalPrice());
- }
+ for (GoodsOrder goodsOrderdata : goodsOrderslist) {
+ PayMoneyLog payMoneyLog = new PayMoneyLog();
+ payMoneyLog.setOid(goodsOrderdata.getId());
+ payMoneyLog.setOrderId(goodsOrderdata.getOrderId());
+ payMoneyLog.setUid(goodsOrderdata.getUid());
+ payMoneyLog.setUname(goodsOrderdata.getUname());
+ payMoneyLog.setPrice(goodsOrderdata.getTotalPrice());
+ payMoneyLog.setMark(description);
+ payMoneyLog.setPayTime(new Date());
+ payMoneyLogService.insertPayMoneyLog(payMoneyLog);
+ logger.info("用户{}的{}支付记录已保存,金额:{}元", goodsOrderdata.getUname(), description, goodsOrderdata.getTotalPrice());
+ }
}
// 支付金额单位为分,转换为元
- // BigDecimal payAmount = new BigDecimal(totalFeeStr).divide(new BigDecimal(100));
-
-
-
+ // BigDecimal payAmount = new BigDecimal(totalFeeStr).divide(new BigDecimal(100));
-
-
} catch (Exception e) {
logger.error("记录支付记录异常,订单号:{},异常信息:", outTradeNo, e);
}
@@ -1241,8 +1245,8 @@ public class PayNotifyController extends BaseController {
/**
* 处理订单总金额的积分奖励(考虑定金情况)
- *
- * @param order 订单信息
+ *
+ * @param order 订单信息
* @param paymentInfo 支付信息
*/
private void handleOrderAmountIntegralReward(Order order, Map paymentInfo) {
@@ -1251,20 +1255,20 @@ public class PayNotifyController extends BaseController {
SiteConfig siteConfigQuery = new SiteConfig();
siteConfigQuery.setName("config_one");
List configList = siteConfigService.selectSiteConfigList(siteConfigQuery);
-
+
if (configList.isEmpty()) {
logger.warn("未找到config_one配置,跳过积分奖励");
return;
}
-
+
SiteConfig config = configList.get(0);
String configValue = config.getValue();
-
+
if (StringUtils.isEmpty(configValue)) {
logger.warn("config_one配置值为空,跳过积分奖励");
return;
}
-
+
// 2. 解析JSON获取integral值
Integer integral = null;
try {
@@ -1274,20 +1278,20 @@ public class PayNotifyController extends BaseController {
logger.error("解析config_one配置失败:", e);
return;
}
-
+
if (integral == null || integral <= 0) {
logger.warn("integral配置无效,跳过积分奖励");
return;
}
-
+
// 3. 查询是否有定金记录
OrderLog orderLogQuery = new OrderLog();
orderLogQuery.setOrderId(order.getOrderId());
List orderLogList = orderLogService.selectOrderLogList(orderLogQuery);
-
+
BigDecimal totalPrice = BigDecimal.ZERO;
OrderLog depositLog = null;
-
+
// 查找定金记录
for (OrderLog log : orderLogList) {
if (log.getDeposit() != null && log.getDeposit().compareTo(BigDecimal.ZERO) > 0) {
@@ -1295,7 +1299,7 @@ public class PayNotifyController extends BaseController {
break;
}
}
-
+
// 4. 根据定金情况计算积分基数
if (depositLog != null && depositLog.getDepPaid() != null) {
if (depositLog.getDepPaid() == 1) {
@@ -1309,10 +1313,10 @@ public class PayNotifyController extends BaseController {
// 没有定金,使用订单总金额
totalPrice = order.getPayPrice();
}
-
+
// 5. 计算积分
long integralReward = totalPrice.divide(new BigDecimal(integral), 0, BigDecimal.ROUND_DOWN).longValue();
-
+
// 6. 如果积分大于0,则添加积分记录
if (integralReward > 0) {
IntegralLog integralLog = new IntegralLog();
@@ -1325,7 +1329,7 @@ public class PayNotifyController extends BaseController {
integralLog.setNum(integralReward);
integralLog.setCreatedAt(new Date());
integralLog.setUpdatedAt(new Date());
-
+
int result = integralLogService.insertIntegralLog(integralLog);
if (result > 0) {
logger.info("用户{}通过服务费用支付获得{}积分", order.getUname(), integralReward);
@@ -1335,14 +1339,13 @@ public class PayNotifyController extends BaseController {
} else {
logger.info("订单{}服务费用积分奖励为0,不予奖励", order.getOrderId());
}
-
+
} catch (Exception e) {
logger.error("处理订单总金额积分奖励异常,订单号:{},异常信息:", order.getOrderId(), e);
}
}
-
public Map calculateCommissionAndRecord(
String orderId,
Long workerId
@@ -1468,7 +1471,7 @@ public class PayNotifyController extends BaseController {
moneyLog.setType(1); // 1=收入
moneyLog.setServicePrice(servicePrice);
moneyLog.setReductionPrice(reduction);
- int bfb=cr.multiply(new BigDecimal(100)).intValue();
+ int bfb = cr.multiply(new BigDecimal(100)).intValue();
moneyLog.setCr(bfb); // 百分比
moneyLog.setMergin(margin);
moneyLog.setDoorPrice(doorPrice);
@@ -1505,9 +1508,6 @@ public class PayNotifyController extends BaseController {
}
-
-
-
// /**
// * 分佣
// *
@@ -1606,11 +1606,9 @@ public class PayNotifyController extends BaseController {
// }
-
-
/**
* 获取商品标题
- *
+ *
* @param goodsOrder 商品订单
* @return 商品标题
*/
@@ -1629,6 +1627,7 @@ public class PayNotifyController extends BaseController {
/**
* 次卡微信支付回调接口
+ *
* @param request HTTP请求对象
* @return XML格式响应给微信服务器
* 逻辑:
@@ -1686,7 +1685,7 @@ public class PayNotifyController extends BaseController {
@PostMapping("/api/worker/tixian/notify")
public void apiworkertixiannotify(HttpServletRequest request, HttpServletResponse response) throws IOException {
logger.info("🚀 开始处理微信提现回调...");
-
+
try {
// 步骤1: 读取原始数据
logger.info("📖 步骤1: 读取原始数据");
@@ -1702,11 +1701,10 @@ public class PayNotifyController extends BaseController {
logger.info("📄 原始数据内容: {}", rawDataStr);
-
JSONObject jsonObject = JSONObject.parseObject(rawDataStr);
String nonced = jsonObject.getString("nonce");
String associated_data = request.getHeader("associated_data");
- // WechatPayV3Util.refundtixian();
+ // WechatPayV3Util.refundtixian();
// if (StringUtils.isNotBlank(nonced)&&StringUtils.isNotBlank(associated_data)){
// //wechatConfig().getApiv3Key();
// String decryptedValue = WechatPayV3Util.decryptAesGcm(associatedData, nonce, ciphertext);
@@ -1715,7 +1713,7 @@ public class PayNotifyController extends BaseController {
// 步骤2: 验证微信回调签名和证书
logger.info("🔐 步骤2: 验证微信回调签名和证书");
-
+
// 验证平台证书序列号
String serial = request.getHeader("Wechatpay-Serial");
if (serial == null || serial.trim().isEmpty()) {
@@ -1723,7 +1721,7 @@ public class PayNotifyController extends BaseController {
buildFailResponse(response, "缺少Wechatpay-Serial头");
return;
}
-
+
// 验证时间戳 (允许5分钟偏差)
String timestampStr = request.getHeader("Wechatpay-Timestamp");
if (timestampStr == null || timestampStr.trim().isEmpty()) {
@@ -1731,13 +1729,13 @@ public class PayNotifyController extends BaseController {
buildFailResponse(response, "缺少Wechatpay-Timestamp头");
return;
}
-
+
try {
Long timestamp = Long.valueOf(timestampStr);
long currentTime = System.currentTimeMillis() / 1000; // 转换为秒
if (Math.abs(currentTime - timestamp) > 5 * 60) {
- logger.error("❌ 步骤2失败: 时间戳不正确,当前时间: {}, 回调时间: {}, 偏差: {}秒",
- currentTime, timestamp, Math.abs(currentTime - timestamp));
+ logger.error("❌ 步骤2失败: 时间戳不正确,当前时间: {}, 回调时间: {}, 偏差: {}秒",
+ currentTime, timestamp, Math.abs(currentTime - timestamp));
buildFailResponse(response, "时间戳不正确");
return;
}
@@ -1747,7 +1745,7 @@ public class PayNotifyController extends BaseController {
buildFailResponse(response, "时间戳格式错误");
return;
}
-
+
// 验证签名
if (!verifyWithdrawSign(request, rawDataStr)) {
logger.error("❌ 步骤2失败: 签名验证失败");
@@ -1755,12 +1753,12 @@ public class PayNotifyController extends BaseController {
return;
}
logger.info("✅ 步骤2完成: 签名验证通过");
-
+
// 步骤3: 解析数据格式
logger.info("🔍 步骤3: 解析数据格式");
JSONObject jsonData = null;
Map xmlData = null;
-
+
try {
// 尝试解析为JSON
jsonData = JSONObject.parseObject(rawDataStr);
@@ -1776,29 +1774,29 @@ public class PayNotifyController extends BaseController {
return;
}
}
-
+
// 步骤4: 检查提现结果
logger.info("📊 步骤4: 检查提现结果");
boolean isSuccess = false;
String withdrawStatus = null;
-
+
if (jsonData != null) {
// JSON格式处理
withdrawStatus = jsonData.getString("return_code");
if (withdrawStatus == null) {
withdrawStatus = jsonData.getString("returnCode");
}
-
+
// 检查各种成功状态
String resultCode = jsonData.getString("result_code");
String errCode = jsonData.getString("err_code");
String errCodeDes = jsonData.getString("err_code_des");
String batchStatus = jsonData.getString("batch_status");
String eventType = jsonData.getString("event_type");
-
- logger.info("📋 提现状态信息 - return_code: {}, result_code: {}, err_code: {}, err_code_des: {}, batch_status: {}, event_type: {}",
- withdrawStatus, resultCode, errCode, errCodeDes, batchStatus, eventType);
-
+
+ logger.info("📋 提现状态信息 - return_code: {}, result_code: {}, err_code: {}, err_code_des: {}, batch_status: {}, event_type: {}",
+ withdrawStatus, resultCode, errCode, errCodeDes, batchStatus, eventType);
+
// 微信转账批次完成通知的成功判断
if ("MCHTRANSFER.BATCH.FINISHED".equals(eventType)) {
isSuccess = true;
@@ -1817,14 +1815,14 @@ public class PayNotifyController extends BaseController {
if (withdrawStatus == null) {
withdrawStatus = xmlData.get("returnCode");
}
-
+
String resultCode = xmlData.get("result_code");
String errCode = xmlData.get("err_code");
String errCodeDes = xmlData.get("err_code_des");
-
- logger.info("📋 提现状态信息 - return_code: {}, result_code: {}, err_code: {}, err_code_des: {}",
- withdrawStatus, resultCode, errCode, errCodeDes);
-
+
+ logger.info("📋 提现状态信息 - return_code: {}, result_code: {}, err_code: {}, err_code_des: {}",
+ withdrawStatus, resultCode, errCode, errCodeDes);
+
if ("SUCCESS".equals(withdrawStatus) || "SUCCESS".equals(resultCode)) {
isSuccess = true;
logger.info("✅ 提现成功");
@@ -1833,30 +1831,30 @@ public class PayNotifyController extends BaseController {
logger.info("✅ 无错误码,视为成功状态");
}
}
-
+
if (!isSuccess) {
logger.error("❌ 步骤4失败: 提现回调返回失败,返回信息: {}", withdrawStatus);
buildFailResponse(response, "提现回调返回失败");
return;
}
logger.info("✅ 步骤4完成: 提现状态检查通过");
-
+
// 步骤5: 处理加密资源数据
logger.info("🔓 步骤5: 处理加密资源数据");
Map withdrawInfo = new HashMap<>();
-
+
if (jsonData != null) {
// 检查是否有加密资源
String resourceType = jsonData.getString("resource_type");
logger.info("📦 资源类型: {}", resourceType);
-
+
if ("encrypt-resource".equals(resourceType)) {
logger.info("🔐 检测到加密资源,开始解密...");
-
+
// 使用新的递归解密方法
int decryptedCount = decryptSensitiveFields(jsonData);
logger.info("✅ 递归解密完成,共解密 {} 个字段", decryptedCount);
-
+
// 转换JSONObject到Map,并处理resource字段
for (String key : jsonData.keySet()) {
Object value = jsonData.get(key);
@@ -1865,7 +1863,7 @@ public class PayNotifyController extends BaseController {
try {
String resourceStr = (String) value;
logger.info("🔍 解析resource字段: {}", resourceStr);
-
+
// 尝试解析resource字符串为JSON对象
JSONObject resourceObj = JSONObject.parseObject(resourceStr);
if (resourceObj != null) {
@@ -1890,7 +1888,7 @@ public class PayNotifyController extends BaseController {
withdrawInfo.put(key, value);
}
}
-
+
// 重新检查解密后的状态
String decryptedStatus = jsonData.getString("status");
String decryptedResultCode = jsonData.getString("result_code");
@@ -1898,7 +1896,7 @@ public class PayNotifyController extends BaseController {
isSuccess = true;
logger.info("✅ 解密后数据确认提现成功");
}
-
+
} else {
logger.info("📄 非加密资源,直接使用外层数据");
// 转换JSONObject到Map
@@ -1913,13 +1911,13 @@ public class PayNotifyController extends BaseController {
withdrawInfo.put(entry.getKey(), entry.getValue());
}
}
-
+
logger.info("✅ 步骤5完成: 资源数据处理完成,数据字段数: {}", withdrawInfo.size());
logger.info("📋 withdrawInfo内容: {}", withdrawInfo);
-
+
// 步骤6: 查询提现记录
logger.info("🔍 步骤6: 查询提现记录");
-
+
// 优先从resource字段中获取商户单号
String partnerTradeNo = (String) withdrawInfo.get("out_batch_no");
if (partnerTradeNo == null) {
@@ -1934,111 +1932,623 @@ public class PayNotifyController extends BaseController {
if (partnerTradeNo == null) {
partnerTradeNo = (String) withdrawInfo.get("outBatchNo");
}
-
+
// 获取批次状态
String batchStatus = (String) withdrawInfo.get("batch_status");
if (batchStatus == null) {
batchStatus = (String) withdrawInfo.get("batchStatus");
}
-
+
logger.info("🔍 提取的关键信息:");
logger.info(" ├─ 商户单号: {}", partnerTradeNo);
logger.info(" ├─ 批次状态: {}", batchStatus);
logger.info(" └─ 微信批次ID: {}", withdrawInfo.get("batch_id"));
-
+
if (partnerTradeNo == null || partnerTradeNo.trim().isEmpty()) {
logger.error("❌ 步骤6失败: 无法获取商户单号");
logger.error("📋 可用的字段: {}", withdrawInfo.keySet());
buildFailResponse(response, "无法获取商户单号");
return;
}
-
+
logger.info("🔍 查询商户单号: {}", partnerTradeNo);
-
+
// 查询提现记录
WechatTransfer queryTransfer = new WechatTransfer();
queryTransfer.setOrderId(partnerTradeNo);
List transferList = wechatTransferService.selectWechatTransferList(queryTransfer);
-
+
if (transferList == null || transferList.isEmpty()) {
logger.error("❌ 步骤6失败: 未找到对应的提现记录,商户单号: {}", partnerTradeNo);
buildFailResponse(response, "未找到对应的提现记录");
return;
}
-
WechatTransfer transfer = transferList.get(0);
- logger.info("✅ 步骤6完成: 找到提现记录,ID: {}, 金额: {}, 状态: {}",
- transfer.getId(), transfer.getMoney(), transfer.getStatus());
-
+ logger.info("✅ 步骤6完成: 找到提现记录,ID: {}, 金额: {}, 状态: {}",
+ transfer.getId(), transfer.getMoney(), transfer.getStatus());
+
// 步骤7: 更新提现状态
logger.info("📝 步骤7: 更新提现状态");
// 使用步骤6中已经获取的batchStatus变量
-
+
if ("SUCCESS".equals(batchStatus) || "FINISHED".equals(batchStatus) || isSuccess) {
- transfer.setStatus(2L);
- transfer.setUpdatedAt(new Date());
+ transfer.setStatus(2L);//已到账
+ transfer.setPaid(1L);
+ transfer.setBatchId(withdrawInfo.get("batch_id").toString());
+ transfer.setPayTime(new Date());//到账时间
// 保存更新
- int flg= wechatTransferService.updateWechatTransfer(transfer);
- if(flg>0){
- Users user = usersService.selectUsersById(transfer.getUid());
- if (user != null){
- //减少师傅提现的余额
- user.setCommission(user.getCommission().subtract(transfer.getMoney()));
- //增加师傅的累计提现金额
- user.setPropose(user.getPropose().add(transfer.getMoney()));
- usersService.updateUsers(user);
- }
-
- }
-
-// // 记录提现成功日志
-// OrderLog orderLog = new OrderLog();
-// orderLog.setOrderId(transfer.getId().toString());
-// orderLog.setTitle("微信提现回调成功");
-// orderLog.setContent("微信提现回调成功,商户单号: " + partnerTradeNo + ",批次状态: " + batchStatus);
-// orderLog.setCreatedAt(new Date());
-// orderLogService.insertOrderLog(orderLog);
-
+ int flg = wechatTransferService.updateWechatTransfer(transfer);
+ if (flg > 0) {
+ Users user = usersService.selectUsersById(transfer.getUid());
+ if (user != null) {
+ //减少师傅提现的余额
+ user.setCommission(user.getCommission().subtract(transfer.getMoney()));
+ //增加师傅的累计提现金额
+ user.setPropose(user.getPropose().add(transfer.getMoney()));
+ usersService.updateUsers(user);
+ }
+ }
logger.info("✅ 步骤7完成: 提现状态更新为成功");
}
-// else {
-// transfer.setStatus(0L);
-// transfer.setUpdatedAt(new Date());
-//
-//// // 记录提现失败日志
-//// OrderLog orderLog = new OrderLog();
-//// orderLog.setOrderId(transfer.getId().toString());
-//// orderLog.setTitle("微信提现回调失败");
-//// orderLog.setContent("微信提现回调失败,商户单号: " + partnerTradeNo + ",状态: " + batchStatus);
-//// orderLog.setCreatedAt(new Date());
-//// orderLogService.insertOrderLog(orderLog);
-//
-// logger.info("⚠️ 步骤7完成: 提现状态更新为失败");
- // }
-
-
-
// 步骤8: 返回成功响应
logger.info("📤 步骤8: 返回成功响应");
response.setStatus(HttpStatus.OK.value());
response.setContentType("application/json;charset=UTF-8");
-
+
JSONObject responseJson = new JSONObject();
responseJson.put("code", "SUCCESS");
responseJson.put("message", "处理成功");
responseJson.put("data", partnerTradeNo);
-
+
response.getWriter().write(responseJson.toJSONString());
logger.info("✅ 步骤8完成: 响应已返回");
-
+
logger.info("🎉 微信提现回调处理完成!");
-
+
} catch (Exception e) {
logger.error("❌ 微信提现回调处理异常", e);
buildFailResponse(response, "处理异常: " + e.getMessage());
}
}
-
+
+
+ /**
+ * 微信提现回调接口
+ */
+ @PostMapping("/api/secondary/tuikuan/refund/notify")
+ public void apisecondarytuikuanrefundnotify(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ logger.info("🚀 开始处理微信提现回调...");
+
+ try {
+ // 步骤1: 读取原始数据
+ logger.info("📖 步骤1: 读取原始数据");
+ StringBuilder rawData = new StringBuilder();
+ try (BufferedReader reader = request.getReader()) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ rawData.append(line);
+ }
+ }
+ String rawDataStr = rawData.toString();
+ logger.info("✅ 步骤1完成: 原始数据长度: {}", rawDataStr.length());
+ logger.info("📄 原始数据内容: {}", rawDataStr);
+
+
+ // 步骤2: 验证微信回调签名和证书
+ logger.info("🔐 步骤2: 验证微信回调签名和证书");
+
+ // 验证平台证书序列号
+ String serial = request.getHeader("Wechatpay-Serial");
+ if (serial == null || serial.trim().isEmpty()) {
+ logger.error("❌ 步骤2失败: 缺少Wechatpay-Serial头");
+ buildFailResponse(response, "缺少Wechatpay-Serial头");
+ return;
+ }
+
+ // 验证时间戳 (允许5分钟偏差)
+ String timestampStr = request.getHeader("Wechatpay-Timestamp");
+ if (timestampStr == null || timestampStr.trim().isEmpty()) {
+ logger.error("❌ 步骤2失败: 缺少Wechatpay-Timestamp头");
+ buildFailResponse(response, "缺少Wechatpay-Timestamp头");
+ return;
+ }
+
+ try {
+ Long timestamp = Long.valueOf(timestampStr);
+ long currentTime = System.currentTimeMillis() / 1000; // 转换为秒
+ if (Math.abs(currentTime - timestamp) > 5 * 60) {
+ logger.error("❌ 步骤2失败: 时间戳不正确,当前时间: {}, 回调时间: {}, 偏差: {}秒",
+ currentTime, timestamp, Math.abs(currentTime - timestamp));
+ buildFailResponse(response, "时间戳不正确");
+ return;
+ }
+ logger.info("✅ 时间戳验证通过,偏差: {}秒", Math.abs(currentTime - timestamp));
+ } catch (NumberFormatException e) {
+ logger.error("❌ 步骤2失败: 时间戳格式错误: {}", timestampStr);
+ buildFailResponse(response, "时间戳格式错误");
+ return;
+ }
+
+ // 验证签名
+ if (!verifyWithdrawSign(request, rawDataStr)) {
+ logger.error("❌ 步骤2失败: 签名验证失败");
+ buildFailResponse(response, "签名验证失败");
+ return;
+ }
+ logger.info("✅ 步骤2完成: 签名验证通过");
+
+ // 步骤3: 解析数据格式
+ logger.info("🔍 步骤3: 解析数据格式");
+ JSONObject jsonData = null;
+ Map xmlData = null;
+
+ try {
+ // 尝试解析为JSON
+ jsonData = JSONObject.parseObject(rawDataStr);
+ logger.info("✅ 步骤3完成: 数据格式为JSON,字段数量: {}", jsonData.size());
+ } catch (Exception e) {
+ logger.warn("⚠️ JSON解析失败,尝试XML解析: {}", e.getMessage());
+ try {
+ xmlData = xmlToMap(rawDataStr);
+ logger.info("✅ 步骤3完成: 数据格式为XML,字段数量: {}", xmlData.size());
+ } catch (Exception ex) {
+ logger.error("❌ 步骤3失败: 无法解析数据格式,JSON错误: {}, XML错误: {}", e.getMessage(), ex.getMessage());
+ buildFailResponse(response, "无法解析数据格式");
+ return;
+ }
+ }
+
+ // 步骤4: 检查提现结果
+ logger.info("📊 步骤4: 检查提现结果");
+ boolean isSuccess = false;
+ String withdrawStatus = null;
+
+ if (jsonData != null) {
+ // JSON格式处理
+ withdrawStatus = jsonData.getString("return_code");
+ if (withdrawStatus == null) {
+ withdrawStatus = jsonData.getString("returnCode");
+ }
+
+ // 检查各种成功状态
+ String resultCode = jsonData.getString("result_code");
+ String errCode = jsonData.getString("err_code");
+ String errCodeDes = jsonData.getString("err_code_des");
+ String batchStatus = jsonData.getString("batch_status");
+ String eventType = jsonData.getString("event_type");
+
+ logger.info("📋 提现状态信息 - return_code: {}, result_code: {}, err_code: {}, err_code_des: {}, batch_status: {}, event_type: {}",
+ withdrawStatus, resultCode, errCode, errCodeDes, batchStatus, eventType);
+
+ // 微信转账批次完成通知的成功判断
+ if ("MCHTRANSFER.BATCH.FINISHED".equals(eventType)) {
+ isSuccess = true;
+ logger.info("✅ 微信转账批次完成通知");
+ } else if ("SUCCESS".equals(withdrawStatus) || "SUCCESS".equals(resultCode)) {
+ isSuccess = true;
+ logger.info("✅ 提现成功");
+ } else if (errCode == null && errCodeDes == null) {
+ // 如果没有错误码,可能是成功状态
+ isSuccess = true;
+ logger.info("✅ 无错误码,视为成功状态");
+ }
+ } else if (xmlData != null) {
+ // XML格式处理
+ withdrawStatus = xmlData.get("return_code");
+ if (withdrawStatus == null) {
+ withdrawStatus = xmlData.get("returnCode");
+ }
+
+ String resultCode = xmlData.get("result_code");
+ String errCode = xmlData.get("err_code");
+ String errCodeDes = xmlData.get("err_code_des");
+
+ logger.info("📋 提现状态信息 - return_code: {}, result_code: {}, err_code: {}, err_code_des: {}",
+ withdrawStatus, resultCode, errCode, errCodeDes);
+
+ if ("SUCCESS".equals(withdrawStatus) || "SUCCESS".equals(resultCode)) {
+ isSuccess = true;
+ logger.info("✅ 提现成功");
+ } else if (errCode == null && errCodeDes == null) {
+ isSuccess = true;
+ logger.info("✅ 无错误码,视为成功状态");
+ }
+ }
+
+ if (!isSuccess) {
+ logger.error("❌ 步骤4失败: 提现回调返回失败,返回信息: {}", withdrawStatus);
+ buildFailResponse(response, "提现回调返回失败");
+ return;
+ }
+ logger.info("✅ 步骤4完成: 提现状态检查通过");
+
+ // 步骤5: 处理加密资源数据
+ logger.info("🔓 步骤5: 处理加密资源数据");
+ Map withdrawInfo = new HashMap<>();
+
+ if (jsonData != null) {
+ // 检查是否有加密资源
+ String resourceType = jsonData.getString("resource_type");
+ logger.info("📦 资源类型: {}", resourceType);
+
+ if ("encrypt-resource".equals(resourceType)) {
+ logger.info("🔐 检测到加密资源,开始解密...");
+
+ // 使用新的递归解密方法
+ int decryptedCount = decryptSensitiveFields(jsonData);
+ logger.info("✅ 递归解密完成,共解密 {} 个字段", decryptedCount);
+
+ // 转换JSONObject到Map,并处理resource字段
+ for (String key : jsonData.keySet()) {
+ Object value = jsonData.get(key);
+ if ("resource".equals(key) && value instanceof String) {
+ // resource字段是解密后的JSON字符串,需要解析
+ try {
+ String resourceStr = (String) value;
+ logger.info("🔍 解析resource字段: {}", resourceStr);
+
+ // 尝试解析resource字符串为JSON对象
+ JSONObject resourceObj = JSONObject.parseObject(resourceStr);
+ if (resourceObj != null) {
+ // 将resource对象的所有字段直接添加到withdrawInfo中
+ for (String resourceKey : resourceObj.keySet()) {
+ withdrawInfo.put(resourceKey, resourceObj.get(resourceKey));
+ logger.info("📋 添加resource字段: {} = {}", resourceKey, resourceObj.get(resourceKey));
+ }
+ logger.info("✅ resource字段解析成功,添加了 {} 个字段", resourceObj.size());
+ } else {
+ logger.warn("⚠️ resource字段解析失败,保持原值");
+ withdrawInfo.put(key, value);
+ }
+ } catch (Exception e) {
+ logger.warn("⚠️ resource字段JSON解析异常: {}, 保持原值", e.getMessage());
+ withdrawInfo.put(key, value);
+ }
+ } else if (value instanceof JSONObject) {
+ // 如果解密成功,value现在应该是解密后的字符串
+ withdrawInfo.put(key, value.toString());
+ } else {
+ withdrawInfo.put(key, value);
+ }
+ }
+
+ // 重新检查解密后的状态
+ String decryptedStatus = jsonData.getString("status");
+ String decryptedResultCode = jsonData.getString("result_code");
+ if ("SUCCESS".equals(decryptedStatus) || "SUCCESS".equals(decryptedResultCode)) {
+ isSuccess = true;
+ logger.info("✅ 解密后数据确认提现成功");
+ }
+
+ } else {
+ logger.info("📄 非加密资源,直接使用外层数据");
+ // 转换JSONObject到Map
+ for (String key : jsonData.keySet()) {
+ withdrawInfo.put(key, jsonData.getString(key));
+ }
+ }
+ } else if (xmlData != null) {
+ logger.info("📄 XML格式数据,直接使用");
+ // 转换Map到Map
+ for (Map.Entry entry : xmlData.entrySet()) {
+ withdrawInfo.put(entry.getKey(), entry.getValue());
+ }
+ }
+ String oid = withdrawInfo.get("out_refund_no").toString();
+
+ String refund_status = withdrawInfo.get("refund_status").toString();
+ String amount = withdrawInfo.get("amount").toString();
+ if (StringUtils.isNotBlank(oid)) {
+ // 3. 查询次卡使用记录详情
+ if (refund_status.equals("SUCCESS")) {
+ JSONObject amountjson = JSONObject.parseObject(amount);
+ BigDecimal refund_amount = amountjson.getBigDecimal("refund").divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+ UsersPayBefor usersPayBeforData = usersPayBeforService.selectUsersPayBeforById(Long.valueOf(oid));
+ if(usersPayBeforData.getReturnmoney()==null){
+ usersPayBeforData.setReturnmoney(BigDecimal.ZERO);
+ }
+ if (usersPayBeforData != null) {
+ Users user = usersService.selectUsersById(usersPayBeforData.getUid());
+
+ PayMoneyLog payMoneyLog = new PayMoneyLog();
+ if (usersPayBeforData != null) {
+ payMoneyLog.setOid(usersPayBeforData.getId());
+ }
+ payMoneyLog.setOrderId(usersPayBeforData.getOrderid());
+ payMoneyLog.setUid(usersPayBeforData.getUid());
+ if (user != null) {
+ payMoneyLog.setUname(user.getName());
+ }
+ payMoneyLog.setPrice(refund_amount.negate());//退款就是负数
+ payMoneyLog.setMark("订单退款");
+ payMoneyLog.setPayTime(new Date());
+ payMoneyLogService.insertPayMoneyLog(payMoneyLog);
+ usersPayBeforData.setReturnmoney(usersPayBeforData.getReturnmoney().add(refund_amount));
+ usersPayBeforData.setWxmoney(usersPayBeforData.getWxmoney().subtract(refund_amount));
+ usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
+ }
+ }
+ }
+ // 步骤8: 返回成功响应
+ response.setStatus(HttpStatus.OK.value());
+ response.setContentType("application/json;charset=UTF-8");
+
+ JSONObject responseJson = new JSONObject();
+ responseJson.put("code", "SUCCESS");
+ responseJson.put("message", "处理成功");
+ response.getWriter().write(responseJson.toJSONString());
+
+ } catch (Exception e) {
+ buildFailResponse(response, "处理异常: " + e.getMessage());
+ }
+ }
+
+
+ /**
+ * 微信提现回调接口
+ */
+ @PostMapping("/api/worker/cika/notify")
+ public void apiworkercikanotify(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ logger.info("🚀 开始处理微信提现回调...");
+
+ try {
+ // 步骤1: 读取原始数据
+ logger.info("📖 步骤1: 读取原始数据");
+ StringBuilder rawData = new StringBuilder();
+ try (BufferedReader reader = request.getReader()) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ rawData.append(line);
+ }
+ }
+ String rawDataStr = rawData.toString();
+ logger.info("✅ 步骤1完成: 原始数据长度: {}", rawDataStr.length());
+ logger.info("📄 原始数据内容: {}", rawDataStr);
+
+
+ // 步骤2: 验证微信回调签名和证书
+ logger.info("🔐 步骤2: 验证微信回调签名和证书");
+
+ // 验证平台证书序列号
+ String serial = request.getHeader("Wechatpay-Serial");
+ if (serial == null || serial.trim().isEmpty()) {
+ logger.error("❌ 步骤2失败: 缺少Wechatpay-Serial头");
+ buildFailResponse(response, "缺少Wechatpay-Serial头");
+ return;
+ }
+
+ // 验证时间戳 (允许5分钟偏差)
+ String timestampStr = request.getHeader("Wechatpay-Timestamp");
+ if (timestampStr == null || timestampStr.trim().isEmpty()) {
+ logger.error("❌ 步骤2失败: 缺少Wechatpay-Timestamp头");
+ buildFailResponse(response, "缺少Wechatpay-Timestamp头");
+ return;
+ }
+
+ try {
+ Long timestamp = Long.valueOf(timestampStr);
+ long currentTime = System.currentTimeMillis() / 1000; // 转换为秒
+ if (Math.abs(currentTime - timestamp) > 5 * 60) {
+ logger.error("❌ 步骤2失败: 时间戳不正确,当前时间: {}, 回调时间: {}, 偏差: {}秒",
+ currentTime, timestamp, Math.abs(currentTime - timestamp));
+ buildFailResponse(response, "时间戳不正确");
+ return;
+ }
+ logger.info("✅ 时间戳验证通过,偏差: {}秒", Math.abs(currentTime - timestamp));
+ } catch (NumberFormatException e) {
+ logger.error("❌ 步骤2失败: 时间戳格式错误: {}", timestampStr);
+ buildFailResponse(response, "时间戳格式错误");
+ return;
+ }
+
+ // 验证签名
+ if (!verifyWithdrawSign(request, rawDataStr)) {
+ logger.error("❌ 步骤2失败: 签名验证失败");
+ buildFailResponse(response, "签名验证失败");
+ return;
+ }
+ logger.info("✅ 步骤2完成: 签名验证通过");
+
+ // 步骤3: 解析数据格式
+ logger.info("🔍 步骤3: 解析数据格式");
+ JSONObject jsonData = null;
+ Map xmlData = null;
+
+ try {
+ // 尝试解析为JSON
+ jsonData = JSONObject.parseObject(rawDataStr);
+ logger.info("✅ 步骤3完成: 数据格式为JSON,字段数量: {}", jsonData.size());
+ } catch (Exception e) {
+ logger.warn("⚠️ JSON解析失败,尝试XML解析: {}", e.getMessage());
+ try {
+ xmlData = xmlToMap(rawDataStr);
+ logger.info("✅ 步骤3完成: 数据格式为XML,字段数量: {}", xmlData.size());
+ } catch (Exception ex) {
+ logger.error("❌ 步骤3失败: 无法解析数据格式,JSON错误: {}, XML错误: {}", e.getMessage(), ex.getMessage());
+ buildFailResponse(response, "无法解析数据格式");
+ return;
+ }
+ }
+
+ // 步骤4: 检查提现结果
+ logger.info("📊 步骤4: 检查提现结果");
+ boolean isSuccess = false;
+ String withdrawStatus = null;
+
+ if (jsonData != null) {
+ // JSON格式处理
+ withdrawStatus = jsonData.getString("return_code");
+ if (withdrawStatus == null) {
+ withdrawStatus = jsonData.getString("returnCode");
+ }
+
+ // 检查各种成功状态
+ String resultCode = jsonData.getString("result_code");
+ String errCode = jsonData.getString("err_code");
+ String errCodeDes = jsonData.getString("err_code_des");
+ String batchStatus = jsonData.getString("batch_status");
+ String eventType = jsonData.getString("event_type");
+
+ logger.info("📋 提现状态信息 - return_code: {}, result_code: {}, err_code: {}, err_code_des: {}, batch_status: {}, event_type: {}",
+ withdrawStatus, resultCode, errCode, errCodeDes, batchStatus, eventType);
+
+ // 微信转账批次完成通知的成功判断
+ if ("MCHTRANSFER.BATCH.FINISHED".equals(eventType)) {
+ isSuccess = true;
+ logger.info("✅ 微信转账批次完成通知");
+ } else if ("SUCCESS".equals(withdrawStatus) || "SUCCESS".equals(resultCode)) {
+ isSuccess = true;
+ logger.info("✅ 提现成功");
+ } else if (errCode == null && errCodeDes == null) {
+ // 如果没有错误码,可能是成功状态
+ isSuccess = true;
+ logger.info("✅ 无错误码,视为成功状态");
+ }
+ } else if (xmlData != null) {
+ // XML格式处理
+ withdrawStatus = xmlData.get("return_code");
+ if (withdrawStatus == null) {
+ withdrawStatus = xmlData.get("returnCode");
+ }
+
+ String resultCode = xmlData.get("result_code");
+ String errCode = xmlData.get("err_code");
+ String errCodeDes = xmlData.get("err_code_des");
+
+ logger.info("📋 提现状态信息 - return_code: {}, result_code: {}, err_code: {}, err_code_des: {}",
+ withdrawStatus, resultCode, errCode, errCodeDes);
+
+ if ("SUCCESS".equals(withdrawStatus) || "SUCCESS".equals(resultCode)) {
+ isSuccess = true;
+ logger.info("✅ 提现成功");
+ } else if (errCode == null && errCodeDes == null) {
+ isSuccess = true;
+ logger.info("✅ 无错误码,视为成功状态");
+ }
+ }
+
+ if (!isSuccess) {
+ logger.error("❌ 步骤4失败: 提现回调返回失败,返回信息: {}", withdrawStatus);
+ buildFailResponse(response, "提现回调返回失败");
+ return;
+ }
+ logger.info("✅ 步骤4完成: 提现状态检查通过");
+
+ // 步骤5: 处理加密资源数据
+ logger.info("🔓 步骤5: 处理加密资源数据");
+ Map withdrawInfo = new HashMap<>();
+
+ if (jsonData != null) {
+ // 检查是否有加密资源
+ String resourceType = jsonData.getString("resource_type");
+ logger.info("📦 资源类型: {}", resourceType);
+
+ if ("encrypt-resource".equals(resourceType)) {
+ logger.info("🔐 检测到加密资源,开始解密...");
+
+ // 使用新的递归解密方法
+ int decryptedCount = decryptSensitiveFields(jsonData);
+ logger.info("✅ 递归解密完成,共解密 {} 个字段", decryptedCount);
+
+ // 转换JSONObject到Map,并处理resource字段
+ for (String key : jsonData.keySet()) {
+ Object value = jsonData.get(key);
+ if ("resource".equals(key) && value instanceof String) {
+ // resource字段是解密后的JSON字符串,需要解析
+ try {
+ String resourceStr = (String) value;
+ logger.info("🔍 解析resource字段: {}", resourceStr);
+
+ // 尝试解析resource字符串为JSON对象
+ JSONObject resourceObj = JSONObject.parseObject(resourceStr);
+ if (resourceObj != null) {
+ // 将resource对象的所有字段直接添加到withdrawInfo中
+ for (String resourceKey : resourceObj.keySet()) {
+ withdrawInfo.put(resourceKey, resourceObj.get(resourceKey));
+ logger.info("📋 添加resource字段: {} = {}", resourceKey, resourceObj.get(resourceKey));
+ }
+ logger.info("✅ resource字段解析成功,添加了 {} 个字段", resourceObj.size());
+ } else {
+ logger.warn("⚠️ resource字段解析失败,保持原值");
+ withdrawInfo.put(key, value);
+ }
+ } catch (Exception e) {
+ logger.warn("⚠️ resource字段JSON解析异常: {}, 保持原值", e.getMessage());
+ withdrawInfo.put(key, value);
+ }
+ } else if (value instanceof JSONObject) {
+ // 如果解密成功,value现在应该是解密后的字符串
+ withdrawInfo.put(key, value.toString());
+ } else {
+ withdrawInfo.put(key, value);
+ }
+ }
+
+ // 重新检查解密后的状态
+ String decryptedStatus = jsonData.getString("status");
+ String decryptedResultCode = jsonData.getString("result_code");
+ if ("SUCCESS".equals(decryptedStatus) || "SUCCESS".equals(decryptedResultCode)) {
+ isSuccess = true;
+ logger.info("✅ 解密后数据确认提现成功");
+ }
+
+ } else {
+ logger.info("📄 非加密资源,直接使用外层数据");
+ // 转换JSONObject到Map
+ for (String key : jsonData.keySet()) {
+ withdrawInfo.put(key, jsonData.getString(key));
+ }
+ }
+ } else if (xmlData != null) {
+ logger.info("📄 XML格式数据,直接使用");
+ // 转换Map到Map
+ for (Map.Entry entry : xmlData.entrySet()) {
+ withdrawInfo.put(entry.getKey(), entry.getValue());
+ }
+ }
+ String oid = withdrawInfo.get("out_trade_no").toString();
+ String refund_status = withdrawInfo.get("refund_status").toString();
+ if (StringUtils.isNotBlank(oid)) {
+ // 3. 查询次卡使用记录详情
+ UserUseSecondaryCard useCard = userUseSecondaryCardService.selectUserUseSecondaryCardById(Long.valueOf(oid));
+ if (useCard != null) {
+ if ("SUCCESS".equals(refund_status)) {
+ // 9. 更新次卡使用记录状态为退款状态
+ Users user = usersService.selectUsersById(useCard.getUid());
+ useCard.setStatus(3L); // 3=退款状态
+ useCard.setRemark("退款成功,退款时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+ userUseSecondaryCardService.updateUserUseSecondaryCard(useCard);
+ PayMoneyLog payMoneyLog = new PayMoneyLog();
+ if (useCard != null) {
+ payMoneyLog.setOid(useCard.getId());
+ }
+ payMoneyLog.setOrderId(useCard.getOrderid());
+ payMoneyLog.setUid(useCard.getUid());
+ if (user != null) {
+ payMoneyLog.setUname(user.getName());
+ }
+ payMoneyLog.setPrice(useCard.getPaymoney().negate());//退款就是负数
+ payMoneyLog.setMark("次卡退款");
+ payMoneyLog.setPayTime(new Date());
+ payMoneyLogService.insertPayMoneyLog(payMoneyLog);
+ }
+ }
+ }
+ // 步骤8: 返回成功响应
+ response.setStatus(HttpStatus.OK.value());
+ response.setContentType("application/json;charset=UTF-8");
+
+ JSONObject responseJson = new JSONObject();
+ responseJson.put("code", "SUCCESS");
+ responseJson.put("message", "处理成功");
+ response.getWriter().write(responseJson.toJSONString());
+
+ } catch (Exception e) {
+ buildFailResponse(response, "处理异常: " + e.getMessage());
+ }
+ }
+
+
/**
* 验证提现回调签名
*/
@@ -2048,37 +2558,37 @@ public class PayNotifyController extends BaseController {
String timestamp = request.getHeader("Wechatpay-Timestamp");
String nonce = request.getHeader("Wechatpay-Nonce");
String signature = request.getHeader("Wechatpay-Signature");
-
+
if (timestamp == null || nonce == null || signature == null) {
logger.error("❌ 缺少签名验证必要头信息");
return false;
}
-
- logger.info("🔐 开始验证签名 - 时间戳: {}, 随机数: {}, 签名: {}",
- timestamp, nonce, signature.substring(0, Math.min(20, signature.length())));
-
+
+ logger.info("🔐 开始验证签名 - 时间戳: {}, 随机数: {}, 签名: {}",
+ timestamp, nonce, signature.substring(0, Math.min(20, signature.length())));
+
// 拼接签名字符串
String srcData = timestamp + "\n" + nonce + "\n" + bodyStr + "\n";
logger.info("📝 签名字符串: {}", srcData.substring(0, Math.min(100, srcData.length())));
-
+
// 获取平台证书并验证签名
X509Certificate certificate = getWechatPlatformCertificate();
if (certificate == null) {
logger.error("❌ 无法获取微信平台证书");
return false;
}
-
+
boolean verifyResult = verifySignature(srcData, certificate, signature);
logger.info("🔐 签名验证结果: {}", verifyResult ? "✅ 成功" : "❌ 失败");
-
+
return verifyResult;
-
+
} catch (Exception e) {
logger.error("❌ 签名验证异常: {}", e.getMessage(), e);
return false;
}
}
-
+
/**
* 获取微信平台证书
@@ -2086,18 +2596,18 @@ public class PayNotifyController extends BaseController {
private X509Certificate getWechatPlatformCertificate() {
try {
ClassLoader classLoader = this.getClass().getClassLoader();
-
+
// 首先尝试从配置中获取证书目录和序列号
String certDir = wechatConfig().getCertDir();
String wechatpaySerial = wechatConfig().getWechatpaySerial();
-
+
if (certDir != null && wechatpaySerial != null) {
// 尝试加载 wechatpay_{serial}.pem 格式的证书
String certFileName = "wechatpay_" + wechatpaySerial + ".pem";
String certPath = certDir + "/" + certFileName;
-
+
logger.info("🔐 尝试加载微信支付平台证书: {}", certPath);
-
+
try (InputStream in = classLoader.getResourceAsStream(certPath)) {
if (in != null) {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
@@ -2109,12 +2619,12 @@ public class PayNotifyController extends BaseController {
logger.warn("⚠️ 加载证书文件失败: {} - {}", certPath, e.getMessage());
}
}
-
+
// 如果找不到平台证书,尝试加载商户证书作为备选
if (certDir != null) {
String merchantCertPath = certDir + "/apiclient_cert.pem";
logger.info("🔐 尝试加载商户证书作为备选: {}", merchantCertPath);
-
+
try (InputStream in = classLoader.getResourceAsStream(merchantCertPath)) {
if (in != null) {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
@@ -2126,7 +2636,7 @@ public class PayNotifyController extends BaseController {
logger.warn("⚠️ 加载商户证书失败: {} - {}", merchantCertPath, e.getMessage());
}
}
-
+
// 最后尝试旧的路径
try (InputStream in = classLoader.getResourceAsStream("v3/platform_cert.pem")) {
if (in != null) {
@@ -2138,7 +2648,7 @@ public class PayNotifyController extends BaseController {
} catch (Exception e) {
logger.warn("⚠️ 加载证书文件失败: v3/platform_cert.pem - {}", e.getMessage());
}
-
+
logger.error("❌ 无法找到任何可用的证书文件");
logger.error("🔍 请确保以下证书文件之一存在:");
if (certDir != null && wechatpaySerial != null) {
@@ -2151,13 +2661,13 @@ public class PayNotifyController extends BaseController {
logger.error("📁 证书目录配置: {}", certDir);
logger.error("🔑 微信支付平台证书序列号: {}", wechatpaySerial);
return null;
-
+
} catch (Exception e) {
logger.error("❌ 获取平台证书异常: {}", e.getMessage());
return null;
}
}
-
+
/**
* 从配置获取证书
*/
@@ -2172,7 +2682,7 @@ public class PayNotifyController extends BaseController {
return null;
}
}
-
+
/**
* 验证签名
*/
@@ -2181,19 +2691,19 @@ public class PayNotifyController extends BaseController {
Signature sha256withRSA = Signature.getInstance("SHA256withRSA");
sha256withRSA.initVerify(certificate.getPublicKey());
sha256withRSA.update(srcData.getBytes(StandardCharsets.UTF_8));
-
+
byte[] signatureBytes = Base64.getDecoder().decode(signature);
boolean result = sha256withRSA.verify(signatureBytes);
-
+
logger.info("🔐 签名验证详情 - 算法: SHA256withRSA, 结果: {}", result);
return result;
-
+
} catch (Exception e) {
logger.error("❌ 签名验证失败: {}", e.getMessage());
return false;
}
}
-
+
/**
* 返回失败响应
*/
@@ -2201,17 +2711,18 @@ public class PayNotifyController extends BaseController {
logger.error("❌ 返回失败响应: {}", message);
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
response.setContentType("application/json;charset=UTF-8");
-
+
JSONObject responseJson = new JSONObject();
responseJson.put("code", "FAIL");
responseJson.put("message", message);
responseJson.put("timestamp", new Date().getTime());
-
+
response.getWriter().write(responseJson.toJSONString());
}
/**
* 次卡退款回调接口
+ *
* @param request HTTP请求对象
* @return XML格式响应给微信服务器
* 逻辑:
@@ -2233,7 +2744,7 @@ public class PayNotifyController extends BaseController {
xmlData.append(line);
}
reader.close();
-
+
logger.info("------------------------------------------------------------退款回调原始数据:{}", xmlData.toString());
// 2. 解析XML数据
@@ -2249,12 +2760,12 @@ public class PayNotifyController extends BaseController {
// 4. 检查退款结果
String returnCode = refundData.get("return_code");
String resultCode = refundData.get("result_code");
-
+
if (!"SUCCESS".equals(returnCode)) {
logger.error("------------------------------------------------------------退款回调返回失败:{}", refundData.get("return_msg"));
return buildFailResponse("退款回调返回失败");
}
-
+
if (!"SUCCESS".equals(resultCode)) {
logger.error("------------------------------------------------------------退款处理失败:{}", refundData.get("err_code_des"));
return buildFailResponse("退款处理失败");
@@ -2280,14 +2791,14 @@ public class PayNotifyController extends BaseController {
// 7. 更新退款状态(暂时设置为退款成功状态)
useCard.setStatus(3L); // 3=退款成功状态
useCard.setRemark("------------------------------------------------------------退款成功,退款时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
-
+
int updateResult = userUseSecondaryCardService.updateUserUseSecondaryCard(useCard);
if (updateResult > 0) {
logger.info("次卡退款成功,订单号:{},退款金额:{}", outTradeNo, useCard.getPaymoney());
-
+
// 8. 处理退款成功后的业务逻辑
handleSecondaryCardRefundSuccess(useCard, refundInfo);
-
+
return buildSuccessResponse();
} else {
logger.error("更新次卡退款状态失败,订单号:{}", outTradeNo);
@@ -2302,7 +2813,8 @@ public class PayNotifyController extends BaseController {
/**
* 处理次卡退款成功后的业务逻辑
- * @param useCard 次卡使用记录
+ *
+ * @param useCard 次卡使用记录
* @param refundInfo 退款信息
*/
private void handleSecondaryCardRefundSuccess(UserUseSecondaryCard useCard, Map refundInfo) {
@@ -2316,7 +2828,7 @@ public class PayNotifyController extends BaseController {
if (user != null) {
// 3. 发送退款成功通知(可选)
// WXsendMsgUtil.sendRefundSuccess(user.getOpenid(), useCard, refundInfo);
-
+
// 4. 记录退款流水(可选)
PayMoneyLog payMoneyLog = new PayMoneyLog();
payMoneyLog.setOid(useCard.getId());
@@ -2327,7 +2839,7 @@ public class PayNotifyController extends BaseController {
payMoneyLog.setMark("次卡退款");
payMoneyLog.setPayTime(new Date());
payMoneyLogService.insertPayMoneyLog(payMoneyLog);
-
+
logger.info("次卡退款流水记录已保存,用户:{},金额:{}", user.getName(), useCard.getPaymoney());
}
@@ -2342,6 +2854,7 @@ public class PayNotifyController extends BaseController {
/**
* 验证提现回调签名
* 提现回调的签名验证方式与支付回调不同
+ *
* @param withdrawData 提现回调数据
* @return 是否验证通过
*/
@@ -2352,7 +2865,7 @@ public class PayNotifyController extends BaseController {
// 目前先返回true,避免签名验证失败
logger.info("提现回调签名验证(暂时跳过)");
return true;
-
+
// TODO: 实现真正的提现回调签名验证
// 1. 获取签名
// 2. 按照微信提现回调的签名规则验证
@@ -2362,10 +2875,11 @@ public class PayNotifyController extends BaseController {
return false;
}
}
-
+
/**
* 验证退款回调签名
* 退款回调的签名验证方式与支付回调不同
+ *
* @param refundData 退款回调数据
* @return 是否验证通过
*/
@@ -2376,7 +2890,7 @@ public class PayNotifyController extends BaseController {
// 目前先返回true,避免签名验证失败
logger.info("------------------------------------------------------------退款回调签名验证(暂时跳过)");
return true;
-
+
// TODO: 实现真正的退款回调签名验证
// 1. 获取签名
// 2. 按照微信退款回调的签名规则验证
@@ -2389,9 +2903,10 @@ public class PayNotifyController extends BaseController {
/**
* 解密微信加密资源数据
- * @param ciphertext 密文
- * @param algorithm 加密算法
- * @param nonce 随机数
+ *
+ * @param ciphertext 密文
+ * @param algorithm 加密算法
+ * @param nonce 随机数
* @param associatedData 关联数据
* @return 解密后的数据Map
*/
@@ -2401,7 +2916,7 @@ public class PayNotifyController extends BaseController {
logger.info(" ├─ 随机数长度: {} 字符", nonce != null ? nonce.length() : 0);
logger.info(" ├─ 关联数据: {}", associatedData);
logger.info(" └─ 密文长度: {} 字符", ciphertext != null ? ciphertext.length() : 0);
-
+
try {
// 获取微信支付V3 API密钥
String apiv3Key = getWechatApiV3Key();
@@ -2409,17 +2924,17 @@ public class PayNotifyController extends BaseController {
logger.error("❌ 无法获取微信支付V3 API密钥");
return null;
}
-
+
// 使用WechatPayV3Util中的解密逻辑
String decryptedValue = decryptAesGcm(associatedData, nonce, ciphertext, apiv3Key);
if (decryptedValue == null) {
logger.error("❌ AES-GCM解密失败");
return null;
}
-
+
logger.info("✅ 解密成功,解密后内容长度: {} 字符", decryptedValue.length());
logger.info("📄 解密后的内容: {}", decryptedValue);
-
+
// 解析解密后的JSON
try {
Map result = JSONObject.parseObject(decryptedValue);
@@ -2429,19 +2944,20 @@ public class PayNotifyController extends BaseController {
logger.error("❌ 解析解密后的JSON失败: {}", e.getMessage());
return null;
}
-
+
} catch (Exception e) {
logger.error("❌ 解密微信加密数据异常: {}", e.getMessage(), e);
return null;
}
}
-
+
/**
* 使用AEAD_AES_256_GCM算法解密(借鉴WechatPayV3Util的实现)
+ *
* @param associatedData 关联数据
- * @param nonce 随机数
- * @param ciphertext 密文
- * @param apiv3Key API密钥
+ * @param nonce 随机数
+ * @param ciphertext 密文
+ * @param apiv3Key API密钥
* @return 解密后的字符串
*/
private String decryptAesGcm(String associatedData, String nonce, String ciphertext, String apiv3Key) {
@@ -2449,35 +2965,36 @@ public class PayNotifyController extends BaseController {
logger.info(" ├─ 关联数据: {}", associatedData);
logger.info(" ├─ 随机数长度: {} 字符", nonce != null ? nonce.length() : 0);
logger.info(" └─ 密文长度: {} 字符", ciphertext != null ? ciphertext.length() : 0);
-
+
try {
byte[] key = apiv3Key.getBytes(java.nio.charset.StandardCharsets.UTF_8);
javax.crypto.spec.SecretKeySpec secretKey = new javax.crypto.spec.SecretKeySpec(key, "AES");
-
+
javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("AES/GCM/NoPadding");
javax.crypto.spec.GCMParameterSpec spec = new javax.crypto.spec.GCMParameterSpec(128, nonce.getBytes(java.nio.charset.StandardCharsets.UTF_8));
cipher.init(javax.crypto.Cipher.DECRYPT_MODE, secretKey, spec);
-
+
// 如果有关联数据,先处理关联数据
if (associatedData != null && !associatedData.trim().isEmpty()) {
cipher.updateAAD(associatedData.getBytes(java.nio.charset.StandardCharsets.UTF_8));
}
-
+
// 解密
byte[] decryptedBytes = cipher.doFinal(java.util.Base64.getDecoder().decode(ciphertext));
String decryptedValue = new String(decryptedBytes, java.nio.charset.StandardCharsets.UTF_8);
-
+
logger.info("✅ AES-GCM解密成功,明文长度: {} 字符", decryptedValue.length());
return decryptedValue;
-
+
} catch (Exception e) {
logger.error("❌ AES-GCM解密失败: {}", e.getMessage(), e);
return null;
}
}
-
+
/**
* 递归解密敏感字段(借鉴WechatPayV3Util的实现)
+ *
* @param jsonResponse 需要解密的JSON对象
* @return 解密后的字段数量
*/
@@ -2486,13 +3003,13 @@ public class PayNotifyController extends BaseController {
logger.debug("🔓 ----------------------无需解密:响应为空");
return 0;
}
-
+
logger.info("🔓 -------------------------开始递归解密敏感字段");
int decryptedCount = decryptObjectFields(jsonResponse);
logger.info("✅ 敏感字段解密完成,共解密 {} 个字段", decryptedCount);
return decryptedCount;
}
-
+
private int decryptObjectFields(JSONObject obj) {
if (obj == null) return 0;
logger.info("✅ -----------------------------------------------字段 {} 解密成功", obj);
@@ -2504,14 +3021,14 @@ public class PayNotifyController extends BaseController {
if (encryptedField.containsKey("algorithm") &&
encryptedField.containsKey("ciphertext") &&
encryptedField.containsKey("nonce")) {
-
+
// 这是一个加密字段,进行解密
logger.info("🔍 发现加密字段: {}", key);
String algorithm = encryptedField.getString("algorithm");
String ciphertext = encryptedField.getString("ciphertext");
String nonce = encryptedField.getString("nonce");
String associatedData = encryptedField.getString("associated_data");
-
+
if ("AEAD_AES_256_GCM".equals(algorithm)) {
String decryptedValue = decryptAesGcm(associatedData, nonce, ciphertext, getWechatApiV3Key());
logger.info("✅ -----------------------------------------------字段 {} 解密成功", decryptedValue);
@@ -2536,14 +3053,15 @@ public class PayNotifyController extends BaseController {
/**
* 获取微信支付V3 API密钥
+ *
* @return API密钥
*/
private String getWechatApiV3Key() {
try {
// 从Spring容器中获取WechatConfig配置
- com.ruoyi.system.config.WechatConfig wechatConfig =
- com.ruoyi.common.utils.spring.SpringUtils.getBean(com.ruoyi.system.config.WechatConfig.class);
-
+ com.ruoyi.system.config.WechatConfig wechatConfig =
+ com.ruoyi.common.utils.spring.SpringUtils.getBean(com.ruoyi.system.config.WechatConfig.class);
+
if (wechatConfig != null) {
String apiv3Key = wechatConfig.getApiv3Key();
if (apiv3Key != null && !apiv3Key.trim().isEmpty()) {
@@ -2558,12 +3076,13 @@ public class PayNotifyController extends BaseController {
} catch (Exception e) {
logger.error("获取微信支付V3 API密钥异常: {}", e.getMessage());
}
-
+
return null;
}
/**
* XML转Map(简化实现)
+ *
* @param xml XML字符串
* @return Map
*/
@@ -2572,8 +3091,8 @@ public class PayNotifyController extends BaseController {
try {
// 移除XML声明和根标签
String processedXml = xml.replaceAll("<\\?xml[^>]*\\?>", "")
- .replaceAll("", "")
- .replaceAll("", "");
+ .replaceAll("", "")
+ .replaceAll("", "");
String[] elements = processedXml.split("\\w+>");
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/UsersPayBeforController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/UsersPayBeforController.java
index 4dd7c1e..ff544ae 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/UsersPayBeforController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/UsersPayBeforController.java
@@ -444,29 +444,6 @@ public class UsersPayBeforController extends BaseController
if (paymentInfo == null) {
return error("未找到支付记录");
}
-
- // 根据servicetype查询对应订单
- Order order = null;
- if (paymentInfo.getServicetype() != null) {
- if (paymentInfo.getServicetype() == 1) {
- // 服务类型为1,调用orderService根据orderid查询订单
- order = orderService.selectOrderByOrderId(orderId);
- } else if (paymentInfo.getServicetype() == 2) {
- // 服务类型为2,调用goodsOrderService根据mainOrderId查询订单
- GoodsOrder goodsOrder = new GoodsOrder();
- goodsOrder.setMainOrderId(orderId);
- List goodsOrders = goodsOrderService.selectGoodsOrderList(goodsOrder);
- if (goodsOrders != null && !goodsOrders.isEmpty()) {
- // 使用第一个商品订单的orderId查询订单
- //order = orderService.selectOrderByOrderId(goodsOrders.get(0).getOrderId());
- }
- }
- }
-
-// if (order == null) {
-// return error("订单不存在");
-// }
-
List payRecords = usersPayBeforService.selectPayDetailsByOrderId(orderId);
System.out.println("000%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"+payRecords.size());
if (payRecords == null || payRecords.isEmpty()) {
@@ -610,337 +587,53 @@ public class UsersPayBeforController extends BaseController
BigDecimal remainingServiceGoldRefund = serviceGoldRefund;
BigDecimal remainingCouponRefund = couponRefund;
-
- // 修复:确保BigDecimal转换正确,处理可能的null值和类型问题
-// BigDecimal wechatRefund = BigDecimal.ZERO;
-// BigDecimal balanceRefund = BigDecimal.ZERO;
-// BigDecimal shoppingGoldRefund = BigDecimal.ZERO;
-// BigDecimal serviceGoldRefund = BigDecimal.ZERO;
-// BigDecimal memberDiscountRefund = BigDecimal.ZERO;
-// BigDecimal couponRefund = BigDecimal.ZERO;
-
// 修复:正确计算各项支付方式的退款金额
for (UsersPayBefor record : payRecords) {
BigDecimal currentRefunded = record.getReturnmoney() != null ? record.getReturnmoney() : BigDecimal.ZERO;
// 计算本次退款中该记录应承担的退款金额
- BigDecimal recordRefundAmount = BigDecimal.ZERO;
-
// 根据该记录的支付方式分配退款金额
if (record.getWxmoney() != null && record.getWxmoney().compareTo(BigDecimal.ZERO) > 0) {
// 修复:计算该记录微信支付的剩余可退款金额
- BigDecimal wxRemaining = record.getWxmoney().subtract(currentRefunded);
- if (wxRemaining.compareTo(BigDecimal.ZERO) > 0 && remainingWechatRefund.compareTo(BigDecimal.ZERO) > 0) {
- record.setWxmoney(record.getWxmoney().subtract(currentRefunded));
+ if (remainingWechatRefund.compareTo(BigDecimal.ZERO) > 0) {
+ BenefitPointsUtil.theWXmoneyChangeResult(record, remainingWechatRefund, "微信支付退款成功");
}
-// BigDecimal wxRemaining = record.getWxmoney().subtract(currentRefunded);
-// if (wxRemaining.compareTo(BigDecimal.ZERO) > 0 && remainingWechatRefund.compareTo(BigDecimal.ZERO) > 0) {
-// record.setWxmoney(wxRemaining);
-// BigDecimal wxRefund = remainingWechatRefund.min(wxRemaining);
-// recordRefundAmount = recordRefundAmount.add(wxRefund);
-// remainingWechatRefund = remainingWechatRefund.subtract(wxRefund);
-// }
}
//余额
if (record.getYemoney() != null && record.getYemoney().compareTo(BigDecimal.ZERO) > 0) {
// 修复:计算该记录余额支付的剩余可退款金额
- BigDecimal yeRemaining = record.getYemoney().subtract(currentRefunded);
- if (yeRemaining.compareTo(BigDecimal.ZERO) > 0 && remainingBalanceRefund.compareTo(BigDecimal.ZERO) > 0) {
- record.setYemoney(record.getYemoney().subtract(remainingBalanceRefund));
-// System.out.println("=== 调用退款工具方法前的参数验证 yeRemaining======================================================"+yeRemaining);
-// System.out.println("=== 调用退款工具方法前的参数验证 record.getYemoney()======================================================"+record.getYemoney());
-// System.out.println("=== 调用退款工具方法前的参数验证 currentRefunded======================================================"+currentRefunded);
-//
-// record.setYemoney(yeRemaining);
-// BigDecimal yeRefund = remainingBalanceRefund.min(yeRemaining);
-// recordRefundAmount = recordRefundAmount.add(yeRefund);
-// remainingBalanceRefund = remainingBalanceRefund.subtract(yeRefund);
+ if (remainingBalanceRefund.compareTo(BigDecimal.ZERO) > 0) {
+ BenefitPointsUtil.theYueChangeResult(record, remainingBalanceRefund, 1, "余额支付退款");
}
}
if (record.getShopmoney() != null && record.getShopmoney().compareTo(BigDecimal.ZERO) > 0) {
// 修复:计算该记录购物金的剩余可退款金额
- BigDecimal shopRemaining = record.getShopmoney().subtract(currentRefunded);
- if (shopRemaining.compareTo(BigDecimal.ZERO) > 0 && remainingShoppingGoldRefund.compareTo(BigDecimal.ZERO) > 0) {
-
-// record.setShopmoney(shopRemaining);
-// BigDecimal shopRefund = remainingShoppingGoldRefund.min(shopRemaining);
-// recordRefundAmount = recordRefundAmount.add(shopRefund);
-// remainingShoppingGoldRefund = remainingShoppingGoldRefund.subtract(shopRefund);
+ if (remainingShoppingGoldRefund.compareTo(BigDecimal.ZERO) > 0) {
+ BenefitPointsUtil.theBenefitPointsGoodsMoneyChangeResult(record, remainingShoppingGoldRefund, 1, "订单退款");
}
}
if (record.getServicemoney() != null && record.getServicemoney().compareTo(BigDecimal.ZERO) > 0) {
// 修复:计算该记录服务金的剩余可退款金额
- BigDecimal serviceRemaining = record.getServicemoney().subtract(currentRefunded);
- if (serviceRemaining.compareTo(BigDecimal.ZERO) > 0 && remainingServiceGoldRefund.compareTo(BigDecimal.ZERO) > 0) {
+
+ if (remainingServiceGoldRefund.compareTo(BigDecimal.ZERO) > 0) {
BenefitPointsUtil.theBenefitPointsServiceMoneyChangeResult(record,remainingServiceGoldRefund,1,"订单退款");
}
}
if (record.getCouponmoney() != null && record.getCouponmoney().compareTo(BigDecimal.ZERO) > 0) {
// 修复:计算该记录优惠券的剩余可退款金额
- BigDecimal couponRemaining = record.getCouponmoney().subtract(currentRefunded);
- if (couponRemaining.compareTo(BigDecimal.ZERO) > 0 && remainingCouponRefund.compareTo(BigDecimal.ZERO) > 0) {
- BenefitPointsUtil.theBenefitPointsGoodsMoneyChangeResult(record,remainingShoppingGoldRefund,1,"订单退款");
-
+ if (remainingCouponRefund.compareTo(BigDecimal.ZERO) > 0) {
+ BenefitPointsUtil.theyouhuimoneyChangeResult(record,1);
}
}
-
- // 如果该记录有退款金额,则更新
- if (recordRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
- BigDecimal newTotalRefunded = currentRefunded.add(recordRefundAmount);
-
- // 如果累计退款金额等于或超过支付金额,设置为已退款状态
- if (newTotalRefunded.compareTo(record.getAllmoney()) >= 0) {
- record.setStatus(3L); // 完全退款
- } else {
- record.setStatus(2L); // 部分退款
- }
-
- record.setReturnmoney(newTotalRefunded);
- usersPayBeforService.updateUsersPayBefor(record);
-
- System.out.println("更新支付记录: ID=" + record.getId() +
- ", 原退款金额=" + currentRefunded +
- ", 本次退款=" + recordRefundAmount +
- ", 新总退款=" + newTotalRefunded +
- ", 状态=" + record.getStatus());
- }
}
-
- // 调用退款工具方法实现真实的业务退款与金额变动
- // 使用原始参数,而不是被修改的副本
- System.out.println("=== 调用退款工具方法前的参数验证 ===");
- System.out.println("原始退款参数:");
- System.out.println(" orderId: " + orderId);
- System.out.println(" wechatRefund: " + wechatRefund);
- System.out.println(" balanceRefund: " + balanceRefund);
- System.out.println(" shoppingGoldRefund: " + shoppingGoldRefund);
- System.out.println(" serviceGoldRefund: " + serviceGoldRefund);
- System.out.println(" memberDiscountRefund: " + memberDiscountRefund);
- System.out.println(" couponRefund: " + couponRefund);
- System.out.println(" refundRemark: " + refundRemark);
-
- // 验证参数类型和值
- System.out.println("参数类型检查:");
- System.out.println(" balanceRefund类型: " + balanceRefund.getClass().getName());
- System.out.println(" balanceRefund值: " + balanceRefund);
- System.out.println(" balanceRefund比较0: " + balanceRefund.compareTo(BigDecimal.ZERO));
-
-// Map refundResult = refundUtil.processUnifiedRefund(
-// orderId, wechatRefund, balanceRefund, shoppingGoldRefund,
-// serviceGoldRefund, memberDiscountRefund, couponRefund, refundRemark
-// );
return success("退款成功");
-// if (refundResult != null && (Boolean) refundResult.get("success")) {
-// return success("退款成功");
-// } else {
-// String errorMsg = (String) refundResult.get("message");
-// return error(errorMsg != null ? errorMsg : "退款处理失败");
-// }
} catch (Exception e) {
return error("退款失败:" + e.getMessage());
}
}
-// /**
-// * 统一退款方法 - 核心逻辑:直接修改预支付表金额
-// */
-// @Log(title = "统一退款", businessType = BusinessType.UPDATE)
-// @PostMapping("/unifiedRefund")
-// public AjaxResult unifiedRefund(@RequestBody Map params)
-// {
-// try {
-// System.out.println("=== 开始统一退款 ===");
-// System.out.println("接收到的参数: " + params);
-//
-// // 1. 获取订单ID
-// String orderId = params.get("orderId") == null ? null : params.get("orderId").toString();
-// if (orderId == null || orderId.trim().isEmpty()) {
-// return error("订单ID不能为空");
-// }
-//
-// // 2. 获取各项退款金额
-// BigDecimal wechatRefund = parseBigDecimalSafely(params.get("wechatRefund"));
-// BigDecimal balanceRefund = parseBigDecimalSafely(params.get("balanceRefund"));
-// BigDecimal shoppingGoldRefund = parseBigDecimalSafely(params.get("shoppingGoldRefund"));
-// BigDecimal serviceGoldRefund = parseBigDecimalSafely(params.get("serviceGoldRefund"));
-// BigDecimal couponRefund = parseBigDecimalSafely(params.get("couponRefund"));
-// String refundRemark = params.get("refundRemark") == null ? "" : params.get("refundRemark").toString();
-//
-// // 3. 计算总退款金额
-// BigDecimal totalRefund = wechatRefund.add(balanceRefund).add(shoppingGoldRefund)
-// .add(serviceGoldRefund).add(couponRefund);
-//
-// if (totalRefund.compareTo(BigDecimal.ZERO) <= 0) {
-// return error("退款金额必须大于0");
-// }
-//
-// System.out.println("=== 退款金额 ===");
-// System.out.println("微信退款: " + wechatRefund + "元");
-// System.out.println("余额退款: " + balanceRefund + "元");
-// System.out.println("购物金退款: " + shoppingGoldRefund + "元");
-// System.out.println("服务金退款: " + serviceGoldRefund + "元");
-// System.out.println("优惠券退款: " + couponRefund + "元");
-// System.out.println("总退款金额: " + totalRefund + "元");
-//
-// // 4. 核心逻辑:调用IUsersPayBeforService查询orderid获取预支付数据
-// UsersPayBefor paymentInfo = usersPayBeforService.selectUsersPayBeforByOrderId(orderId);
-// if (paymentInfo == null) {
-// return error("未找到支付记录");
-// }
-//
-// // 5. 获取原始金额
-// BigDecimal originalWxMoney = paymentInfo.getWxmoney() != null ? paymentInfo.getWxmoney() : BigDecimal.ZERO;
-// BigDecimal originalYeMoney = paymentInfo.getYemoney() != null ? paymentInfo.getYemoney() : BigDecimal.ZERO;
-// BigDecimal originalShopMoney = paymentInfo.getShopmoney() != null ? paymentInfo.getShopmoney() : BigDecimal.ZERO;
-// BigDecimal originalServiceMoney = paymentInfo.getServicemoney() != null ? paymentInfo.getServicemoney() : BigDecimal.ZERO;
-// BigDecimal originalCouponMoney = paymentInfo.getCouponmoney() != null ? paymentInfo.getCouponmoney() : BigDecimal.ZERO;
-// BigDecimal originalMemberMoney = paymentInfo.getMembermoney() != null ? paymentInfo.getMembermoney() : BigDecimal.ZERO;
-//
-// System.out.println("=== 原始金额 ===");
-// System.out.println("微信支付: " + originalWxMoney + "元");
-// System.out.println("余额支付: " + originalYeMoney + "元");
-// System.out.println("购物金: " + originalShopMoney + "元");
-// System.out.println("服务金: " + originalServiceMoney + "元");
-// System.out.println("优惠券: " + originalCouponMoney + "元");
-// System.out.println("会员优惠: " + originalMemberMoney + "元");
-//
-// // 6. 验证退款金额不超过原始金额
-// if (wechatRefund.compareTo(originalWxMoney) > 0) {
-// return error("微信退款金额不能超过微信支付金额");
-// }
-// if (balanceRefund.compareTo(originalYeMoney) > 0) {
-// return error("余额退款金额不能超过余额支付金额");
-// }
-// if (shoppingGoldRefund.compareTo(originalShopMoney) > 0) {
-// return error("购物金退款金额不能超过购物金金额");
-// }
-// if (serviceGoldRefund.compareTo(originalServiceMoney) > 0) {
-// return error("服务金退款金额不能超过服务金金额");
-// }
-// // 优惠券只能全额退:要么退0,要么等于原优惠券金额
-// if (couponRefund.compareTo(BigDecimal.ZERO) > 0) {
-// if (originalCouponMoney.compareTo(BigDecimal.ZERO) == 0) {
-// return error("无可退的优惠券金额");
-// }
-// if (couponRefund.compareTo(originalCouponMoney) != 0) {
-// return error("优惠券只能全额退,原金额:¥" + originalCouponMoney + ",本次退款:¥" + couponRefund);
-// }
-// }
-//
-// // 7. 核心逻辑:根据各个项目的退款进行修改上面的金额
-// BigDecimal newWxMoney = originalWxMoney.subtract(wechatRefund);
-// BigDecimal newYeMoney = originalYeMoney.subtract(balanceRefund);
-// BigDecimal newShopMoney = originalShopMoney.subtract(shoppingGoldRefund);
-// BigDecimal newServiceMoney = originalServiceMoney.subtract(serviceGoldRefund);
-// BigDecimal newCouponMoney = originalCouponMoney.subtract(couponRefund);
-//
-// // 确保金额不为负数
-// if (newWxMoney.compareTo(BigDecimal.ZERO) < 0) newWxMoney = BigDecimal.ZERO;
-// if (newYeMoney.compareTo(BigDecimal.ZERO) < 0) newYeMoney = BigDecimal.ZERO;
-// if (newShopMoney.compareTo(BigDecimal.ZERO) < 0) newShopMoney = BigDecimal.ZERO;
-// if (newServiceMoney.compareTo(BigDecimal.ZERO) < 0) newServiceMoney = BigDecimal.ZERO;
-// if (newCouponMoney.compareTo(BigDecimal.ZERO) < 0) newCouponMoney = BigDecimal.ZERO;
-//
-// // 8. 计算新的总金额(不包括会员优惠)
-// BigDecimal newTotalAmount = newWxMoney.add(newYeMoney).add(newShopMoney)
-// .add(newServiceMoney).add(newCouponMoney);
-//
-// // 9. 获取当前已退款金额并计算新的总退款金额
-// BigDecimal currentRefunded = paymentInfo.getReturnmoney() != null ? paymentInfo.getReturnmoney() : BigDecimal.ZERO;
-// BigDecimal newTotalRefunded = currentRefunded.add(totalRefund);
-//
-// System.out.println("=== 修改后的金额 ===");
-// System.out.println("微信支付: " + newWxMoney + "元 (原: " + originalWxMoney + " - 退: " + wechatRefund + ")");
-// System.out.println("余额支付: " + newYeMoney + "元 (原: " + originalYeMoney + " - 退: " + balanceRefund + ")");
-// System.out.println("购物金: " + newShopMoney + "元 (原: " + originalShopMoney + " - 退: " + shoppingGoldRefund + ")");
-// System.out.println("服务金: " + newServiceMoney + "元 (原: " + originalServiceMoney + " - 退: " + serviceGoldRefund + ")");
-// System.out.println("优惠券: " + newCouponMoney + "元 (原: " + originalCouponMoney + " - 退: " + couponRefund + ")");
-// System.out.println("会员优惠: " + originalMemberMoney + "元 (不参与退款)");
-// System.out.println("新总金额: " + newTotalAmount + "元");
-// System.out.println("累计退款: " + newTotalRefunded + "元");
-//
-// // 10. 更新预支付表数据
-// paymentInfo.setWxmoney(newWxMoney);
-// paymentInfo.setYemoney(newYeMoney);
-// paymentInfo.setShopmoney(newShopMoney);
-// paymentInfo.setServicemoney(newServiceMoney);
-// paymentInfo.setCouponmoney(newCouponMoney);
-// paymentInfo.setAllmoney(newTotalAmount);
-// paymentInfo.setReturnmoney(newTotalRefunded);
-//
-// // 设置状态
-// if (newTotalRefunded.compareTo(newTotalAmount) >= 0) {
-// paymentInfo.setStatus(3L); // 完全退款
-// } else {
-// paymentInfo.setStatus(2L); // 部分退款
-// }
-//
-// // 11. 保存更新
-// int updateResult = usersPayBeforService.updateUsersPayBefor(paymentInfo);
-// if (updateResult <= 0) {
-// return error("支付记录更新失败");
-// }
-//
-// // 12. 记录退款日志
-// OrderLog orderLog = new OrderLog();
-// orderLog.setOrderId(orderId);
-// orderLog.setOid(999L);
-// orderLog.setTitle("退款");
-// orderLog.setOrdertype(paymentInfo.getServicetype());
-// orderLog.setType(new BigDecimal(11));
-//
-// // 构建退款说明
-// StringBuilder refundDesc = new StringBuilder("统一退款:");
-// if (wechatRefund.compareTo(BigDecimal.ZERO) > 0) {
-// refundDesc.append("微信支付退款¥").append(wechatRefund).append(",");
-// }
-// if (balanceRefund.compareTo(BigDecimal.ZERO) > 0) {
-// refundDesc.append("余额退款¥").append(balanceRefund).append(",");
-// }
-// if (shoppingGoldRefund.compareTo(BigDecimal.ZERO) > 0) {
-// refundDesc.append("购物金退款¥").append(shoppingGoldRefund).append(",");
-// }
-// if (serviceGoldRefund.compareTo(BigDecimal.ZERO) > 0) {
-// refundDesc.append("服务金退款¥").append(serviceGoldRefund).append(",");
-// }
-// if (couponRefund.compareTo(BigDecimal.ZERO) > 0) {
-// refundDesc.append("优惠券退款¥").append(couponRefund).append(",");
-// }
-//
-// if (refundDesc.charAt(refundDesc.length() - 1) == ',') {
-// refundDesc.setLength(refundDesc.length() - 1);
-// }
-//
-// refundDesc.append(",本次退款金额:¥").append(totalRefund);
-// refundDesc.append(",累计已退款:¥").append(newTotalRefunded);
-// refundDesc.append(",剩余可退款:¥").append(newTotalAmount);
-// refundDesc.append("(会员优惠¥").append(originalMemberMoney).append("不参与退款)");
-//
-// orderLog.setContent(refundDesc.toString());
-// orderLogService.insertOrderLog(orderLog);
-//
-// // 13. 调用退款工具方法处理业务逻辑
-// System.out.println("=== 调用退款工具方法 ===");
-// Map refundResult = refundUtil.processUnifiedRefund(
-// orderId, wechatRefund, balanceRefund, shoppingGoldRefund,
-// serviceGoldRefund, BigDecimal.ZERO, couponRefund, refundRemark
-// );
-//
-// if (refundResult != null && (Boolean) refundResult.get("success")) {
-// System.out.println("✅ 退款处理成功");
-// return success("退款成功");
-// } else {
-// String errorMsg = (String) refundResult.get("message");
-// return error(errorMsg != null ? errorMsg : "退款处理失败");
-// }
-//
-// } catch (Exception e) {
-// System.err.println("❌ 退款处理异常: " + e.getMessage());
-// e.printStackTrace();
-// return error("退款失败:" + e.getMessage());
-// }
-// }
+
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/WechatTransferController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/WechatTransferController.java
index 216deb7..d77858b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/WechatTransferController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/WechatTransferController.java
@@ -75,6 +75,16 @@ public class WechatTransferController extends BaseController
}
return success(usersService.selectUsersList(users));
}
+
+ /**
+ * 统计汇总:总申请金额、已到账金额、处理中金额(不含状态3)
+ */
+ @PreAuthorize("@ss.hasPermi('system:transfer:list')")
+ @GetMapping("/summary")
+ public AjaxResult summary(WechatTransfer wechatTransfer)
+ {
+ return success(wechatTransferService.selectWechatTransferSummary(wechatTransfer));
+ }
/**
* 导出wechat_transfer列表
*/
@@ -84,6 +94,32 @@ public class WechatTransferController extends BaseController
public void export(HttpServletResponse response, WechatTransfer wechatTransfer)
{
List list = wechatTransferService.selectWechatTransferList(wechatTransfer);
+ for(WechatTransfer dd: list){
+ Users users=usersService.selectUsersById(dd.getUid());
+ if (users!=null){
+ dd.setUname(users.getName());
+ }
+ if (dd.getPaid()!=null){
+ if (dd.getPaid()==1){
+ dd.setPaname("已到账");
+ }else{
+ dd.setPaname("未到账");
+ }
+ }else{
+ dd.setPaname("未到账");
+ }
+ if (dd.getStatus()!=null){
+ if (dd.getStatus()==1){
+ dd.setStatusname("待处理");
+ }
+ if (dd.getStatus()==2){
+ dd.setStatusname("处理完成");
+ }
+ if (dd.getStatus()==3){
+ dd.setStatusname("驳回");
+ }
+ }
+ }
ExcelUtil util = new ExcelUtil(WechatTransfer.class);
util.exportExcel(response, list, "wechat_transfer数据");
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/BenefitPointsUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/BenefitPointsUtil.java
index 125392b..96caedd 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/BenefitPointsUtil.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/BenefitPointsUtil.java
@@ -40,7 +40,7 @@ public class BenefitPointsUtil {
private static final IUsersPayBeforService usersPayBeforService = SpringUtils.getBean(IUsersPayBeforService.class);
private static final IUserMemnerConsumptionLogService userMemnerConsumptionLogService = SpringUtils.getBean(IUserMemnerConsumptionLogService.class);
private static final IPayMoneyLogService payMoneyLogService = SpringUtils.getBean(IPayMoneyLogService.class);
-
+ private static final ICouponUserService couponUserService = SpringUtils.getBean(ICouponUserService.class);
// 配置常量
@@ -102,6 +102,10 @@ public class BenefitPointsUtil {
log.error("【错误】订单不存在,订单ID: {}", orderId);
return new BenefitPointsResult(false, "订单不存在", null);
}
+ UsersPayBefor payBefor = usersPayBeforService.selectUsersPayBeforByOrderId(order.getMainOrderId());
+ if (payBefor == null){
+ return new BenefitPointsResult(false, "订单不存在", null);
+ }
// 2. 获取用户信息
Users user = usersService.selectUsersById(order.getUid());
if (user == null) {
@@ -115,7 +119,7 @@ public class BenefitPointsUtil {
return new BenefitPointsResult(false, "系统配置获取失败", null);
}
//处理积分
- IntegralAndBenefitUtil.processIntegralAndBenefit(money, order.getOrderId(), order.getUid());
+ IntegralAndBenefitUtil.processIntegralAndBenefit(payBefor.getAllmoney(), payBefor.getOrderid(), payBefor.getUid());
// //处理库存及销量
// OrderUtil.updateInventoryAndSales(order.getOrderId(), 2);
@@ -443,6 +447,10 @@ public class BenefitPointsUtil {
if (userDb != null && userDb.getServicefee() != null && userDb.getServicefee().compareTo(ZERO) > 0) {
BigDecimal serviceRate = serviceDeductionRatio.divide(new BigDecimal("100"), 4, ROUND_HALF_UP);
serviceMoney = userDb.getServicefee().multiply(serviceRate);
+ //判断一下如果服务抵扣金额大于总金额amount就表示服务金全部抵扣,如果小于就抵扣一部分
+ if (serviceMoney.compareTo(amount) > 0) {
+ serviceMoney=amount;
+ }
log.info("【服务金抵扣】用户ID: {}, 服务金余额: {}, 抵扣比例: {}, 抵扣金额: {}",
user.getId(), userDb.getServicefee(), serviceDeductionRatio, serviceMoney);
}
@@ -456,6 +464,9 @@ public class BenefitPointsUtil {
if (userDb != null && userDb.getConsumption() != null && userDb.getConsumption().compareTo(ZERO) > 0) {
BigDecimal consumptionRate = consumptionDeductionRatio.divide(new BigDecimal("100"), 4, ROUND_HALF_UP);
shopMoney = userDb.getConsumption().multiply(consumptionRate);
+ if (shopMoney.compareTo(amount) > 0) {
+ shopMoney=amount;
+ }
log.info("【消费金抵扣】用户ID: {}, 消费金余额: {}, 抵扣比例: {}, 抵扣金额: {}",
user.getId(), userDb.getConsumption(), consumptionDeductionRatio, shopMoney);
}
@@ -1166,6 +1177,70 @@ public class BenefitPointsUtil {
public UserBenefitPoints getLog() { return log; }
public void setLog(UserBenefitPoints log) { this.log = log; }
}
+ //这是用户创建订单和退款的时候的调用 减少各类数据
+
+ public static int creatServerOrderData(UsersPayBefor usersPayBefor) {
+ UsersPayBefor usersPayBeforData=usersPayBeforService.selectUsersPayBeforById(usersPayBefor.getId());
+ if(usersPayBeforData!=null){
+ if (usersPayBeforData.getStatus()==1){
+ //微信支付比较特殊在回调里面直接处理就可以,回调里面添加流水修改订单状态即可
+// if (usersPayBeforData.getWxmoney()!=null&&usersPayBeforData.getWxmoney().compareTo(BigDecimal.ZERO)>0){
+// theWXmoneyChangeResult(usersPayBeforData,usersPayBeforData.getWxmoney(),"");
+// }
+ //余额退款
+ if (usersPayBeforData.getYemoney()!=null&&usersPayBeforData.getYemoney().compareTo(BigDecimal.ZERO)>0){
+ theYueChangeResult(usersPayBeforData,usersPayBeforData.getYemoney(),2,"创建订单消费");
+ }
+ //购物金退款
+ if (usersPayBeforData.getShopmoney()!=null&&usersPayBeforData.getShopmoney().compareTo(BigDecimal.ZERO)>0){
+ theBenefitPointsGoodsMoneyChangeResult(usersPayBeforData,usersPayBeforData.getShopmoney(),2,"创建订单消费");
+ }
+ //服务金退款
+ if (usersPayBeforData.getServicemoney()!=null&&usersPayBeforData.getServicemoney().compareTo(BigDecimal.ZERO)>0){
+ theBenefitPointsServiceMoneyChangeResult(usersPayBeforData,usersPayBeforData.getServicemoney(),2,"创建订单消费");
+ }
+ //优惠券退款
+ if (usersPayBeforData.getCouponmoney()!=null&&usersPayBeforData.getCouponmoney().compareTo(BigDecimal.ZERO)>0){
+ theyouhuimoneyChangeResult(usersPayBeforData,2);
+ }
+ }
+
+ }
+ return 0;
+ }
+ //这是用户取消订单和退款的时候的调用 添加各类数据
+ public static int refundServerOrderData(UsersPayBefor usersPayBefor) {
+ UsersPayBefor usersPayBeforData=usersPayBeforService.selectUsersPayBeforById(usersPayBefor.getId());
+ if(usersPayBeforData!=null) {
+ if (usersPayBeforData.getStatus()==2){
+ //微信退款
+ if (usersPayBeforData.getWxmoney()!=null&&usersPayBeforData.getWxmoney().compareTo(BigDecimal.ZERO)>0){
+ theWXmoneyChangeResult(usersPayBeforData,usersPayBeforData.getWxmoney(),"");
+ }
+ //余额退款
+ if (usersPayBeforData.getYemoney()!=null&&usersPayBeforData.getYemoney().compareTo(BigDecimal.ZERO)>0){
+ theYueChangeResult(usersPayBeforData,usersPayBeforData.getYemoney(),1,"用户取消订单退款");
+ }
+ //购物金退款
+ if (usersPayBeforData.getShopmoney()!=null&&usersPayBeforData.getShopmoney().compareTo(BigDecimal.ZERO)>0){
+ theBenefitPointsGoodsMoneyChangeResult(usersPayBeforData,usersPayBeforData.getShopmoney(),1,"用户取消订单退款");
+ }
+ //服务金退款
+ if (usersPayBeforData.getServicemoney()!=null&&usersPayBeforData.getServicemoney().compareTo(BigDecimal.ZERO)>0){
+ theBenefitPointsServiceMoneyChangeResult(usersPayBeforData,usersPayBeforData.getServicemoney(),1,"用户取消订单退款");
+ }
+ //优惠券退款
+ if (usersPayBeforData.getCouponmoney()!=null&&usersPayBeforData.getCouponmoney().compareTo(BigDecimal.ZERO)>0){
+ theyouhuimoneyChangeResult(usersPayBeforData,1);
+ }
+ }
+ }
+
+ return 0;
+ }
+
+
+
//------------------------------------------------------------------------------------------------------------------------------
//服务金变更
// private IUsersPayBeforService usersPayBeforService;
@@ -1174,14 +1249,24 @@ public class BenefitPointsUtil {
Map remap=new HashMap<>();
Map config = getSystemConfig();
BigDecimal servicefeeRatio = getConfigValue(config, SERVICEFEE_KEY, new BigDecimal("0"));
- BigDecimal amountService = servicemoney.multiply(servicefeeRatio).divide(new BigDecimal("100"));
+ // BigDecimal amountService = servicemoney.multiply(servicefeeRatio).divide(new BigDecimal("100"));
+ BigDecimal amountService = BigDecimal.ZERO;
+ if (servicefeeRatio.compareTo(BigDecimal.ZERO) > 0) {
+ // 将百分比转换为小数(如10% -> 0.1)
+ BigDecimal ratioDecimal = servicefeeRatio.divide(new BigDecimal("100"), 4, RoundingMode.HALF_UP);
+ // 计算退回金额:Goodsmoney / ratioDecimal
+ amountService = servicemoney.divide(ratioDecimal, 2, RoundingMode.HALF_UP);
+ }
Users user = usersService.selectUsersById(usersPayBefor.getUid());
UsersPayBefor usersPayBeforData=usersPayBeforService.selectUsersPayBeforById(usersPayBefor.getId());
+ if(usersPayBeforData.getReturnmoney()==null){
+ usersPayBeforData.setReturnmoney(BigDecimal.ZERO);
+ }
if (user==null){
remap.put("code",2);
return remap;
}
- //type 1增加 0减少
+ //type 1增加(用户增加,就是退款的时候用) 0减少
if(type==1){
user.setServicefee(user.getServicefee().add(amountService));
UserBenefitPoints benefitLog = new UserBenefitPoints();
@@ -1198,8 +1283,11 @@ public class BenefitPointsUtil {
userBenefitPointsService.insertUserBenefitPoints(benefitLog);
usersService.updateUsers(user);
//增加用户服务金金就是减少预支付的服务金
+ usersPayBeforData.setReturnmoney(usersPayBeforData.getReturnmoney().add(servicemoney));
usersPayBeforData.setServicemoney(usersPayBeforData.getServicemoney().subtract(servicemoney));
usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
+ //退款的时候就要添加退款金额累加的
+
remap.put("code",1);
return remap;
@@ -1219,23 +1307,27 @@ public class BenefitPointsUtil {
userBenefitPointsService.insertUserBenefitPoints(benefitLog);
usersService.updateUsers(user);
//减少用户服务金金就是增加预支付的服务金
- usersPayBeforData.setServicemoney(usersPayBeforData.getServicemoney().add(servicemoney));
- usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
+// usersPayBeforData.setServicemoney(usersPayBeforData.getServicemoney().add(servicemoney));
+// usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
remap.put("code",1);
return remap;
}
}
- //余额变动
+ //余额变动//type 1增加(用户增加,就是退款的时候用) 0减少
public static Map theYueChangeResult(UsersPayBefor usersPayBefor,BigDecimal money,int type,String reamk) {
Map remap=new HashMap<>();
+ System.out.println("余额变动-------"+money);
//余额变动
Users user = usersService.selectUsersById(usersPayBefor.getUid());
UsersPayBefor usersPayBeforData=usersPayBeforService.selectUsersPayBeforById(usersPayBefor.getId());
+ if(usersPayBeforData.getReturnmoney()==null){
+ usersPayBeforData.setReturnmoney(BigDecimal.ZERO);
+ }
if(type==1){
user.setBalance(user.getBalance().add(money));
- usersPayBeforData.setYemoney(usersPayBeforData.getYemoney().subtract(money));
+
UserMemnerConsumptionLog userMemnerConsumptionLog=new UserMemnerConsumptionLog();
userMemnerConsumptionLog.setUid(Math.toIntExact(user.getId()));
userMemnerConsumptionLog.setConsumptiontype(2);
@@ -1249,11 +1341,14 @@ public class BenefitPointsUtil {
userMemnerConsumptionLog.setOrderid(usersPayBefor.getOrderid());
userMemnerConsumptionLogService.insertUserMemnerConsumptionLog(userMemnerConsumptionLog);
usersService.updateUsers(user);
+ usersPayBeforData.setYemoney(usersPayBeforData.getYemoney().subtract(money));
+ usersPayBeforData.setReturnmoney(usersPayBeforData.getReturnmoney().add(money));
+ System.out.println("11余额变动-------"+usersPayBeforData.getYemoney());
usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
remap.put("code",1);
}else{
user.setBalance(user.getBalance().subtract(money));
- usersPayBeforData.setYemoney(usersPayBeforData.getYemoney().add(money));
+ // usersPayBeforData.setYemoney(money);
UserMemnerConsumptionLog userMemnerConsumptionLog=new UserMemnerConsumptionLog();
userMemnerConsumptionLog.setUid(Math.toIntExact(user.getId()));
userMemnerConsumptionLog.setConsumptiontype(2);
@@ -1267,21 +1362,34 @@ public class BenefitPointsUtil {
userMemnerConsumptionLog.setOrderid(usersPayBefor.getOrderid());
userMemnerConsumptionLogService.insertUserMemnerConsumptionLog(userMemnerConsumptionLog);
usersService.updateUsers(user);
- usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
+ // usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
remap.put("code",1);
}
return remap;
}
- //购物金变更
+ //购物金变更//type 1增加(用户增加,就是退款的时候用) 0减少
public static Map theBenefitPointsGoodsMoneyChangeResult(UsersPayBefor usersPayBefor,BigDecimal Goodsmoney,int type,String reamk) {
- //第一步获取系统维护的服务金比例
+ //第一步获取系统维护的购物金比例
Map remap=new HashMap<>();
Map config = getSystemConfig();
BigDecimal goodsfeeRatio = getConfigValue(config, CONSUMPTION_KEY, new BigDecimal("0"));
- BigDecimal amountService = Goodsmoney.multiply(goodsfeeRatio).divide(new BigDecimal("100"));
+ System.out.println("换算比例-------"+goodsfeeRatio);
+ // 修改计算逻辑:amountGoodsmoney = Goodsmoney / goodsfeeRatio
+ // 例如:goodsfeeRatio=10表示10%,Goodsmoney=5,则amountGoodsmoney=5/0.1=50
+ BigDecimal amountGoodsmoney = BigDecimal.ZERO;
+ if (goodsfeeRatio.compareTo(BigDecimal.ZERO) > 0) {
+ // 将百分比转换为小数(如10% -> 0.1)
+ BigDecimal ratioDecimal = goodsfeeRatio.divide(new BigDecimal("100"), 4, RoundingMode.HALF_UP);
+ // 计算退回金额:Goodsmoney / ratioDecimal
+ amountGoodsmoney = Goodsmoney.divide(ratioDecimal, 2, RoundingMode.HALF_UP);
+ }
+ System.out.println("抵扣金额-------"+amountGoodsmoney);
UsersPayBefor usersPayBeforData=usersPayBeforService.selectUsersPayBeforById(usersPayBefor.getId());
+ if(usersPayBeforData.getReturnmoney()==null){
+ usersPayBeforData.setReturnmoney(BigDecimal.ZERO);
+ }
Users user = usersService.selectUsersById(usersPayBefor.getUid());
if (user==null){
remap.put("code",2);
@@ -1289,42 +1397,46 @@ public class BenefitPointsUtil {
}
//type 1增加 0减少
if(type==1){
- user.setConsumption(user.getConsumption().add(amountService));
+ user.setConsumption(user.getConsumption().add(amountGoodsmoney));
UserBenefitPoints benefitLog = new UserBenefitPoints();
benefitLog.setOrderid(usersPayBefor.getId());
benefitLog.setUid(usersPayBefor.getUid());
benefitLog.setType(2L);//类别 1服务金 2消费金
benefitLog.setOrdertype(1L); //数据类别 1收入 2支出
benefitLog.setOrdermoney(usersPayBefor.getAllmoney());
- benefitLog.setMoney(amountService);
- benefitLog.setBeformoney(user.getConsumption().subtract(amountService));
+ benefitLog.setMoney(amountGoodsmoney);
+ benefitLog.setBeformoney(user.getConsumption().subtract(amountGoodsmoney));
benefitLog.setAftremoney(user.getConsumption());
benefitLog.setReamk(reamk);
benefitLog.setDotime(new Date());
userBenefitPointsService.insertUserBenefitPoints(benefitLog);
usersService.updateUsers(user);
+ usersPayBeforData.setReturnmoney(usersPayBeforData.getReturnmoney().add(Goodsmoney));
usersPayBeforData.setShopmoney(usersPayBeforData.getShopmoney().subtract(Goodsmoney));
usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
+
remap.put("code",1);
return remap;
}else{
- user.setConsumption(user.getConsumption().subtract(amountService));
+ System.out.println("抵扣区间-------"+user.getConsumption().subtract(amountGoodsmoney));
+ user.setConsumption(user.getConsumption().subtract(amountGoodsmoney));
UserBenefitPoints benefitLog = new UserBenefitPoints();
benefitLog.setOrderid(usersPayBefor.getId());
benefitLog.setUid(usersPayBefor.getUid());
benefitLog.setType(2L);//类别 1服务金 2消费金
benefitLog.setOrdertype(2L); //数据类别 1收入 2支出
benefitLog.setOrdermoney(usersPayBefor.getAllmoney());
- benefitLog.setMoney(amountService);
- benefitLog.setBeformoney(user.getConsumption().add(amountService));
+ benefitLog.setMoney(amountGoodsmoney);
+ benefitLog.setBeformoney(user.getConsumption().add(amountGoodsmoney));
benefitLog.setAftremoney(user.getConsumption());
benefitLog.setReamk(reamk);
benefitLog.setDotime(new Date());
userBenefitPointsService.insertUserBenefitPoints(benefitLog);
usersService.updateUsers(user);
- usersPayBeforData.setShopmoney(usersPayBeforData.getShopmoney().add(Goodsmoney));
- usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
+ System.out.println("抵扣完成-------"+benefitLog.getId());
+ // usersPayBeforData.setShopmoney(usersPayBeforData.getShopmoney().add(Goodsmoney));
+ // usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
remap.put("code",1);
return remap;
@@ -1332,75 +1444,82 @@ public class BenefitPointsUtil {
}
- //微信支付变动
- public static Map theWXmoneyChangeResult(UsersPayBefor usersPayBefor,BigDecimal money,int type,String reamk) {
+ //微信支付变动,只有退款
+ public static Map theWXmoneyChangeResult(UsersPayBefor usersPayBefor,BigDecimal money,String reamk) {
Map remap=new HashMap<>();
//余额变动
Users user = usersService.selectUsersById(usersPayBefor.getUid());
UsersPayBefor usersPayBeforData=usersPayBeforService.selectUsersPayBeforById(usersPayBefor.getId());
+ if(usersPayBeforData.getReturnmoney()==null){
+ usersPayBeforData.setReturnmoney(BigDecimal.ZERO);
+ }
int allmoney=usersPayBefor.getWxmoney().multiply(new BigDecimal(100)).intValue();
int tkmoney=money.multiply(new BigDecimal(100)).intValue();
WechatPayV3Util WW=new WechatPayV3Util();
// 7. 调用微信退款接口
- Map refundResult = WW.refund(usersPayBeforData.getOrderid(),
+ Map refundResult = WW.refund(
usersPayBeforData.getOrderid(),
+ String.valueOf(usersPayBeforData.getId()),
allmoney,
tkmoney,
"订单退款",
- WechatPayUtil.PAY_FH + "/api/secondary/card/refund/notify"
+ WechatPayUtil.PAY_FH + "/api/secondary/tuikuan/refund/notify"
);
-
- PayMoneyLog payMoneyLog = new PayMoneyLog();
- if (usersPayBefor != null) {
- payMoneyLog.setOid(usersPayBefor.getId());
+ if (refundResult != null && Boolean.TRUE.equals(refundResult.get("success"))) {
+ remap.put("success", true);
+ return remap;
}
- payMoneyLog.setOrderId(usersPayBefor.getOrderid());
- payMoneyLog.setUid(usersPayBefor.getUid());
- if (user != null) {
- payMoneyLog.setUname(user.getName());
- }
- payMoneyLog.setPrice(money);
- payMoneyLog.setMark("订单退款");
- payMoneyLog.setPayTime(new Date());
- payMoneyLogService.insertPayMoneyLog(payMoneyLog);
-
-// if(type==1){
-// user.setBalance(user.getBalance().add(money));
-// usersPayBeforData.setYemoney(usersPayBeforData.getYemoney().subtract(money));
-// UserMemnerConsumptionLog userMemnerConsumptionLog=new UserMemnerConsumptionLog();
-// userMemnerConsumptionLog.setUid(Math.toIntExact(user.getId()));
-// userMemnerConsumptionLog.setConsumptiontype(2);
-// userMemnerConsumptionLog.setConsumptiontime(new Date());
-// userMemnerConsumptionLog.setConsumptionmoney(money);
-// userMemnerConsumptionLog.setReamk(reamk);
-// userMemnerConsumptionLog.setBeformoney(user.getBalance().subtract(money));
-// userMemnerConsumptionLog.setAftermoney(user.getBalance());
-// userMemnerConsumptionLog.setNowmoney(user.getBalance());
-// userMemnerConsumptionLog.setType(1);
-// userMemnerConsumptionLog.setOrderid(usersPayBefor.getOrderid());
-// userMemnerConsumptionLogService.insertUserMemnerConsumptionLog(userMemnerConsumptionLog);
-// usersService.updateUsers(user);
-// usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
-// remap.put("code",1);
-// }else{
-// user.setBalance(user.getBalance().subtract(money));
-// usersPayBeforData.setYemoney(usersPayBeforData.getYemoney().add(money));
-// UserMemnerConsumptionLog userMemnerConsumptionLog=new UserMemnerConsumptionLog();
-// userMemnerConsumptionLog.setUid(Math.toIntExact(user.getId()));
-// userMemnerConsumptionLog.setConsumptiontype(2);
-// userMemnerConsumptionLog.setConsumptiontime(new Date());
-// userMemnerConsumptionLog.setConsumptionmoney(money);
-// userMemnerConsumptionLog.setReamk(reamk);
-// userMemnerConsumptionLog.setBeformoney(user.getBalance().add(money));
-// userMemnerConsumptionLog.setAftermoney(user.getBalance());
-// userMemnerConsumptionLog.setNowmoney(user.getBalance());
-// userMemnerConsumptionLog.setType(2);
-// userMemnerConsumptionLog.setOrderid(usersPayBefor.getOrderid());
-// userMemnerConsumptionLogService.insertUserMemnerConsumptionLog(userMemnerConsumptionLog);
-// usersService.updateUsers(user);
-// usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
-// remap.put("code",1);
+// PayMoneyLog payMoneyLog = new PayMoneyLog();
+// if (usersPayBefor != null) {
+// payMoneyLog.setOid(usersPayBefor.getId());
// }
+// payMoneyLog.setOrderId(usersPayBefor.getOrderid());
+// payMoneyLog.setUid(usersPayBefor.getUid());
+// if (user != null) {
+// payMoneyLog.setUname(user.getName());
+// }
+// payMoneyLog.setPrice(money);
+// payMoneyLog.setMark(reamk);
+// payMoneyLog.setPayTime(new Date());
+// payMoneyLogService.insertPayMoneyLog(payMoneyLog);
+// usersPayBeforData.setReturnmoney(usersPayBeforData.getReturnmoney().add(money));
+// usersPayBeforData.setWxmoney(usersPayBefor.getWxmoney().subtract(money));
+// usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
+
+ return remap;
+ }
+
+
+ //优惠券回款,直接退回优惠券就可以
+ public static Map theyouhuimoneyChangeResult(UsersPayBefor usersPayBefor,int type) {
+ Map remap=new HashMap<>();
+ //余额变动
+ Users user = usersService.selectUsersById(usersPayBefor.getUid());
+ UsersPayBefor usersPayBeforData=usersPayBeforService.selectUsersPayBeforById(usersPayBefor.getId());
+ if(usersPayBeforData.getReturnmoney()==null){
+ usersPayBeforData.setReturnmoney(BigDecimal.ZERO);
+ }
+ //1为退款的时候回滚优惠券
+ if (type==1){
+ CouponUser couponUser=couponUserService.selectCouponUserById(usersPayBefor.getCouponid());
+ if(couponUser!=null){
+ couponUser.setStatus(1L);
+ couponUserService.updateCouponUser(couponUser);
+ }
+ usersPayBeforData.setCouponid( null);
+ usersPayBeforData.setReturnmoney(usersPayBeforData.getReturnmoney().add(usersPayBeforData.getCouponmoney()));
+ usersPayBeforData.setCouponmoney(new BigDecimal("0"));
+ usersPayBeforService.updateUsersPayBefor(usersPayBeforData);
+ }else{
+ CouponUser couponUser=couponUserService.selectCouponUserById(usersPayBefor.getCouponid());
+ if(couponUser!=null){
+ couponUser.setStatus(2L);
+ couponUserService.updateCouponUser(couponUser);
+ }
+ }
+
+
+
return remap;
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WechatPayUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WechatPayUtil.java
index 13dc336..d61e8e5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WechatPayUtil.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WechatPayUtil.java
@@ -82,7 +82,7 @@ public class WechatPayUtil {
// public static final String PAY_FH = "https://www.huafurenjia.cn/";
- public static final String PAY_FH = "https://api.huafurenjia.cn/";
+ public static final String PAY_FH = "https://552e105d.r3.cpolar.top/";
/**
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/WechatTransfer.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/WechatTransfer.java
index 34f3019..84b8790 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/WechatTransfer.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/WechatTransfer.java
@@ -41,7 +41,7 @@ public class WechatTransfer extends BaseEntity
private BigDecimal priceMax;
/** 状态 */
- @Excel(name = "状态")
+
private Long status;
/** 订单号 */
@@ -51,19 +51,28 @@ public class WechatTransfer extends BaseEntity
private String openid;
/** 0:未到账 */
- @Excel(name = "0:未到账")
+
private Long paid;
+ /** 0:未到账 */
+ @Excel(name = "是否到账")
+ private String paname;
+
+ /** 0:未到账 */
+ @Excel(name = "申请状态")
+ private String statusname;
+
/** 到账时间 */
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "到账时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date payTime;
- /** 操作时间 */
- @Excel(name = "操作时间")
+
private Long time;
/** $column.columnComment */
+ /** 操作时间 */
+ @Excel(name = "操作时间",width = 30, dateFormat = "yyyy-MM-dd")
private Date createdAt;
/** $column.columnComment */
@@ -213,6 +222,23 @@ public class WechatTransfer extends BaseEntity
this.priceMax = priceMax;
}
+
+ public String getStatusname() {
+ return statusname;
+ }
+
+ public void setStatusname(String statusname) {
+ this.statusname = statusname;
+ }
+
+ public String getPaname() {
+ return paname;
+ }
+
+ public void setPaname(String paname) {
+ this.paname = paname;
+ }
+
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/WechatTransferMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/WechatTransferMapper.java
index 4479cf9..cefec20 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/WechatTransferMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/WechatTransferMapper.java
@@ -58,4 +58,9 @@ public interface WechatTransferMapper
* @return 结果
*/
public int deleteWechatTransferByIds(Long[] ids);
+
+ /**
+ * 统计汇总:总申请金额、已到账金额、处理中金额(不计入状态3)
+ */
+ public java.util.Map selectWechatTransferSummary(WechatTransfer wechatTransfer);
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IWechatTransferService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IWechatTransferService.java
index 74b7a47..88b23a5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/IWechatTransferService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IWechatTransferService.java
@@ -58,4 +58,9 @@ public interface IWechatTransferService
* @return 结果
*/
public int deleteWechatTransferById(Long id);
+
+ /**
+ * 统计汇总:总申请金额、已到账金额、处理中金额(不含状态3)
+ */
+ public java.util.Map selectWechatTransferSummary(WechatTransfer wechatTransfer);
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatTransferServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatTransferServiceImpl.java
index c10cfa4..3c4096f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatTransferServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatTransferServiceImpl.java
@@ -90,4 +90,13 @@ public class WechatTransferServiceImpl implements IWechatTransferService
{
return wechatTransferMapper.deleteWechatTransferById(id);
}
+
+ /**
+ * 统计汇总
+ */
+ @Override
+ public java.util.Map selectWechatTransferSummary(WechatTransfer wechatTransfer)
+ {
+ return wechatTransferMapper.selectWechatTransferSummary(wechatTransfer);
+ }
}
diff --git a/ruoyi-system/src/main/resources/mapper/system/WechatTransferMapper.xml b/ruoyi-system/src/main/resources/mapper/system/WechatTransferMapper.xml
index b47465c..f509584 100644
--- a/ruoyi-system/src/main/resources/mapper/system/WechatTransferMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/WechatTransferMapper.xml
@@ -100,4 +100,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
+
+
+
\ No newline at end of file
diff --git a/ruoyi-ui/src/api/system/OrderLog.js b/ruoyi-ui/src/api/system/OrderLog.js
index dd7d17a..ef0cea2 100644
--- a/ruoyi-ui/src/api/system/OrderLog.js
+++ b/ruoyi-ui/src/api/system/OrderLog.js
@@ -52,7 +52,7 @@ export function delOrderLog(id) {
// 查询退款历史记录
export function getRefundHistory(orderId) {
return request({
- url: '/system/OrderLog/list',
+ url: '/system/OrderLog/getAllList',
method: 'get',
params: {
orderId: orderId,
diff --git a/ruoyi-ui/src/api/system/transfer.js b/ruoyi-ui/src/api/system/transfer.js
index af17008..45e7db3 100644
--- a/ruoyi-ui/src/api/system/transfer.js
+++ b/ruoyi-ui/src/api/system/transfer.js
@@ -9,6 +9,15 @@ export function listTransfer(query) {
})
}
+// 查询统计汇总
+export function getTransferSummary(query) {
+ return request({
+ url: '/system/transfer/summary',
+ method: 'get',
+ params: query
+ })
+}
+
// 查询wechat_transfer详细
export function getTransfer(id) {
return request({
diff --git a/ruoyi-ui/src/views/system/GoodsOrder/AfterSaleDialog.vue b/ruoyi-ui/src/views/system/GoodsOrder/AfterSaleDialog.vue
index 1b346a6..93da496 100644
--- a/ruoyi-ui/src/views/system/GoodsOrder/AfterSaleDialog.vue
+++ b/ruoyi-ui/src/views/system/GoodsOrder/AfterSaleDialog.vue
@@ -89,12 +89,25 @@
+
+
+