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 5c65f92..f394353 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 @@ -235,6 +235,10 @@ public class UsersPayBeforController extends BaseController public AjaxResult unifiedRefund(@RequestBody Map params) { try { + // 添加调试日志 + System.out.println("=== 统一退款接口开始 ==="); + System.out.println("接收到的参数: " + params); + String orderId = params.get("orderId") == null ? null : params.get("orderId").toString(); BigDecimal wechatRefund = params.get("wechatRefund") == null ? BigDecimal.ZERO : new BigDecimal(params.get("wechatRefund").toString()); BigDecimal balanceRefund = params.get("balanceRefund") == null ? BigDecimal.ZERO : new BigDecimal(params.get("balanceRefund").toString()); @@ -244,6 +248,17 @@ public class UsersPayBeforController extends BaseController BigDecimal couponRefund = params.get("couponRefund") == null ? BigDecimal.ZERO : new BigDecimal(params.get("couponRefund").toString()); String refundRemark = params.get("refundRemark") == null ? "" : params.get("refundRemark").toString(); + // 添加参数解析后的调试日志 + 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); + if (orderId == null || orderId.trim().isEmpty()) { return error("订单ID不能为空"); } @@ -251,6 +266,8 @@ public class UsersPayBeforController extends BaseController BigDecimal totalRefund = wechatRefund.add(balanceRefund).add(shoppingGoldRefund) .add(serviceGoldRefund).add(memberDiscountRefund).add(couponRefund); + System.out.println("总退款金额: " + totalRefund); + if (totalRefund.compareTo(BigDecimal.ZERO) <= 0) { return error("退款金额必须大于0"); } @@ -378,6 +395,13 @@ public class UsersPayBeforController extends BaseController orderLogService.insertOrderLog(orderLog); // 更新支付记录状态和退款金额 + // 创建参数副本,避免修改原始参数 + BigDecimal remainingWechatRefund = wechatRefund; + BigDecimal remainingBalanceRefund = balanceRefund; + BigDecimal remainingShoppingGoldRefund = shoppingGoldRefund; + BigDecimal remainingServiceGoldRefund = serviceGoldRefund; + BigDecimal remainingCouponRefund = couponRefund; + for (UsersPayBefor record : payRecords) { BigDecimal currentRefunded = record.getReturnmoney() != null ? record.getReturnmoney() : BigDecimal.ZERO; @@ -386,42 +410,42 @@ public class UsersPayBeforController extends BaseController // 根据该记录的支付方式分配退款金额 if (record.getWxmoney() != null && record.getWxmoney().compareTo(BigDecimal.ZERO) > 0) { - BigDecimal wxRefund = wechatRefund.min(record.getWxmoney().subtract(currentRefunded)); + BigDecimal wxRefund = remainingWechatRefund.min(record.getWxmoney().subtract(currentRefunded)); if (wxRefund.compareTo(BigDecimal.ZERO) > 0) { recordRefundAmount = recordRefundAmount.add(wxRefund); - wechatRefund = wechatRefund.subtract(wxRefund); + remainingWechatRefund = remainingWechatRefund.subtract(wxRefund); } } if (record.getYemoney() != null && record.getYemoney().compareTo(BigDecimal.ZERO) > 0) { - BigDecimal yeRefund = balanceRefund.min(record.getYemoney().subtract(currentRefunded)); + BigDecimal yeRefund = remainingBalanceRefund.min(record.getYemoney().subtract(currentRefunded)); if (yeRefund.compareTo(BigDecimal.ZERO) > 0) { recordRefundAmount = recordRefundAmount.add(yeRefund); - balanceRefund = balanceRefund.subtract(yeRefund); + remainingBalanceRefund = remainingBalanceRefund.subtract(yeRefund); } } if (record.getShopmoney() != null && record.getShopmoney().compareTo(BigDecimal.ZERO) > 0) { - BigDecimal shopRefund = shoppingGoldRefund.min(record.getShopmoney().subtract(currentRefunded)); + BigDecimal shopRefund = remainingShoppingGoldRefund.min(record.getShopmoney().subtract(currentRefunded)); if (shopRefund.compareTo(BigDecimal.ZERO) > 0) { recordRefundAmount = recordRefundAmount.add(shopRefund); - shoppingGoldRefund = shoppingGoldRefund.subtract(shopRefund); + remainingShoppingGoldRefund = remainingShoppingGoldRefund.subtract(shopRefund); } } if (record.getServicemoney() != null && record.getServicemoney().compareTo(BigDecimal.ZERO) > 0) { - BigDecimal serviceRefund = serviceGoldRefund.min(record.getServicemoney().subtract(currentRefunded)); + BigDecimal serviceRefund = remainingServiceGoldRefund.min(record.getServicemoney().subtract(currentRefunded)); if (serviceRefund.compareTo(BigDecimal.ZERO) > 0) { recordRefundAmount = recordRefundAmount.add(serviceRefund); - serviceGoldRefund = serviceGoldRefund.subtract(serviceRefund); + remainingServiceGoldRefund = remainingServiceGoldRefund.subtract(serviceRefund); } } if (record.getCouponmoney() != null && record.getCouponmoney().compareTo(BigDecimal.ZERO) > 0) { - BigDecimal couponRefundAmount = couponRefund.min(record.getCouponmoney().subtract(currentRefunded)); + BigDecimal couponRefundAmount = remainingCouponRefund.min(record.getCouponmoney().subtract(currentRefunded)); if (couponRefundAmount.compareTo(BigDecimal.ZERO) > 0) { recordRefundAmount = recordRefundAmount.add(couponRefundAmount); - couponRefund = couponRefund.subtract(couponRefundAmount); + remainingCouponRefund = remainingCouponRefund.subtract(couponRefundAmount); } } @@ -442,6 +466,7 @@ public class UsersPayBeforController extends BaseController } // 调用退款工具方法实现真实的业务退款与金额变动 + // 使用原始参数,而不是被修改的副本 Map refundResult = refundUtil.processUnifiedRefund( orderId, wechatRefund, balanceRefund, shoppingGoldRefund, serviceGoldRefund, memberDiscountRefund, couponRefund, refundRemark diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/CartOrderUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/CartOrderUtil.java index 0f55033..cdf8519 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/CartOrderUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/CartOrderUtil.java @@ -130,7 +130,7 @@ public class CartOrderUtil { //一口价金额大于0的时候进行支付 if (order.getTotalPrice().compareTo(BigDecimal.ZERO)>0){ - String payBeforeId = payBeforeUtil.createPayBefore(user, itemPrice, order.getOrderId(), null, order.getProductId(), cart.getOrdertype(), order.getSku(), null, null, null, null,1L, null, null); + String payBeforeId = payBeforeUtil.createPayBefore(user, itemPrice, order.getOrderId(), null, order.getProductId(), cart.getOrdertype(), order.getSku(), null, null, null, null,1L, null, null,BigDecimal.ZERO); }else{ DispatchUtil.dispatchOrder(order.getId()); } @@ -182,6 +182,7 @@ public class CartOrderUtil { goodsOrder.setProductId(serviceGoods.getId()); goodsOrder.setProductName(serviceGoods.getTitle()); goodsOrder.setNum((long) num); + goodsOrder.setPostage(serviceGoods.getPostage()); goodsOrder.setSku(sku); goodsOrder.setIsself(isself); goodsOrder.setIsforservice(serviceGoods.getIsforservice()); @@ -274,6 +275,7 @@ public class CartOrderUtil { goodsOrder.setGoodPrice(serviceGoods.getPrice()); goodsOrder.setPayPrice(itemPrice); goodsOrder.setStatus(1L); // 待支付 + goodsOrder.setPostage(serviceGoods.getPostage()); goodsOrder.setMainOrderId(maincorid); //goodsOrder.setIsmany(1L); int insertResult = goodsOrderService.insertGoodsOrder(goodsOrder); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/DispatchUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/DispatchUtil.java index a979f0e..39ecbeb 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/DispatchUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/DispatchUtil.java @@ -2958,12 +2958,16 @@ public class DispatchUtil { orderLognew.setWorkerLogId(worker.getId()); orderLogService.insertOrderLog(orderLognew); //绑定虚拟号码 + //微信推送 + ServiceGoods serviceGoods = serviceGoodsService.selectServiceGoodsById(order.getProductId()); + //给师傅派单的时候的推送 + WXsendMsgUtil.sendMsgForWorkerInfo(worker.getOpenid(), order, serviceGoods); Map map= OrderBindWorkerUtil.getOrderBindWorker(order.getId()); YunXinPhoneUtilAPI.httpsAxbTransfer(order.getWorkerPhone()); -// if (map.get("code").equals("200")) { -// //电话通知 -// YunXinPhoneUtilAPI.httpsAxbTransfer(order.getWorkerPhone()); -// } + if (map.get("code").equals("200")) { + //电话通知 + YunXinPhoneUtilAPI.httpsAxbTransfer(order.getWorkerPhone()); + } return worker; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/HomeUtril.java b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/HomeUtril.java index 13399ad..9d8b801 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/HomeUtril.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/HomeUtril.java @@ -187,7 +187,7 @@ public class HomeUtril { * * @return 分类树形列表数据(只包含title和icon) */ - public Map getServiceCategories() { + public Map getServiceCategories(String city) { try { Map result = new HashMap<>(); @@ -195,6 +195,10 @@ public class HomeUtril { ServiceCate serviceCateQuery = new ServiceCate(); serviceCateQuery.setStatus(1L); serviceCateQuery.setType(1L); + if (StringUtils.isNotBlank(city)){ + serviceCateQuery.setCity(city); + } + List allCategoryList = serviceCateService.selectServiceCateList(serviceCateQuery); // 2. 分离一级分类和二级分类 @@ -303,11 +307,14 @@ public class HomeUtril { * 查询type=1且isgroup=1的服务商品前4个 * 返回icon、标题、price、groupprice字段 */ - public Map getGroupList() { + public Map getGroupList(String city) { try { Map result = new HashMap<>(); // 构建查询条件 ServiceGoods queryGoods = new ServiceGoods(); + if (StringUtils.isNotBlank(city)){ + queryGoods.setCity(city); + } queryGoods.setType(1); // type=1 queryGoods.setIsgroup(1); // isgroup=1 queryGoods.setStatus("1"); // 只查询启用状态的商品 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/OrderUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/OrderUtil.java index a33dbc7..feddf27 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/OrderUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/OrderUtil.java @@ -3,6 +3,7 @@ package com.ruoyi.system.ControllerUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.utils.AmapUtils; +import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.*; import com.ruoyi.system.service.*; @@ -629,7 +630,7 @@ public class OrderUtil { * @param user 用户实体 * @return 新建的订单对象(仅拼团),或处理结果Map */ - public static Object prepayCallback(UsersPayBefor payBefor, Users user) { + public static Object prepayCallback(UsersPayBefor payBefor, Users user) throws Exception { System.out.println("=== prepayCallback 方法开始 ==="); System.out.println("输入参数 - payBefor: " + (payBefor != null ? payBefor.toString() : "null")); System.out.println("输入参数 - user: " + (user != null ? user.toString() : "null")); @@ -652,10 +653,14 @@ public class OrderUtil { if (gorders != null && !gorders.isEmpty()){ for (GoodsOrder g: gorders){ g.setStatus(2L); + g.setPayTime(DateUtils.getNowDate()); goodsOrderService.updateGoodsOrder(g); // BenefitPointsUtil.processBenefitPoints(g.getId(),g.getTotalPrice(),"2"); } } + //String openid, String orderid,String price,String Address, String title,String reamk + //微信发送消息 + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),gorder.getAddress(),"商品支付","商品支付成功"); // updateInventoryAndSales(gorder.getOrderId(), 2); //处理服务金 @@ -674,6 +679,7 @@ public class OrderUtil { for (GoodsOrder goodsOrder : orderslist){ System.out.println("更新商品订单 - ID: " + goodsOrder.getId() + ", 原状态: " + goodsOrder.getStatus()); goodsOrder.setStatus(2L); + goodsOrder.setPayTime(DateUtils.getNowDate()); goodsOrder.setTransactionId(payBefor.getPaycode()); int updateResult = goodsOrderService.updateGoodsOrder(goodsOrder); @@ -683,6 +689,9 @@ public class OrderUtil { System.out.println("未找到相关商品订单"); } System.out.println("拼团商品订单处理完成,返回orderid: " + payBefor.getOrderid()); + //微信发送消息给客户 + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),gorder.getAddress(),"商品支付","商品支付成功"); + return payBefor.getOrderid(); } @@ -691,8 +700,11 @@ public class OrderUtil { GoodsOrder order = goodsOrderService.selectGoodsOrderByorderId(payBefor.getOrderid()); if (order != null) { order.setStatus(2L); + order.setPayTime(DateUtils.getNowDate()); order.setTransactionId(payBefor.getPaycode()); //BenefitPointsUtil.processBenefitPoints(order.getId(),order.getTotalPrice(),"2"); + //微信发送消息 + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),order.getAddress(),"商品支付","商品支付成功"); int updateResult = goodsOrderService.updateGoodsOrder(order); } return null; @@ -723,7 +735,13 @@ public class OrderUtil { // // } // } + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),order.getAddress(),"上门费支付","上门费支付成功"); + //微信发送消息给师傅 + Users master = usersService.selectUsersById(order.getWorkerId()); + WXsendMsgUtil.sendUserPayDoorMoneyForWorker(master.getOpenid(),order,"上门费支付成功"); } + //微信发送消息 + return 1; } if (type == 8) { @@ -740,6 +758,10 @@ public class OrderUtil { order.setPayPrice(order.getPayPrice().add(payBefor.getAllmoney())); orderService.updateOrder(order); } + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),order.getAddress(),"定金支付","定金支付成功"); + //微信发送消息给师傅 + Users master = usersService.selectUsersById(order.getWorkerId()); + WXsendMsgUtil.sendUserPayDoorMoneyForWorker(master.getOpenid(),order,"定金支付成功"); ISTOPAYSIZE(payBefor.getLastorderid()); } } @@ -773,6 +795,10 @@ public class OrderUtil { if (updateResult > 0){ ISTOPAYSIZE(payBefor.getLastorderid()); } + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),order.getAddress(),"尾款支付","尾款支付成功"); + //微信发送消息给师傅 + Users master = usersService.selectUsersById(order.getWorkerId()); + WXsendMsgUtil.sendUserPayDoorMoneyForWorker(master.getOpenid(),order,"尾款支付成功"); } return 1; } @@ -788,6 +814,10 @@ public class OrderUtil { if (order != null){ order.setPayPrice(order.getPayPrice().add(payBefor.getAllmoney())); orderService.updateOrder(order); + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),order.getAddress(),"差价支付","差价支付成功"); + //微信发送消息给师傅 + Users master = usersService.selectUsersById(order.getWorkerId()); + WXsendMsgUtil.sendUserPayDoorMoneyForWorker(master.getOpenid(),order,"差价支付成功"); } ISTOPAYSIZE(payBefor.getLastorderid()); } @@ -858,6 +888,8 @@ public class OrderUtil { System.out.println("未找到报价记录,处理失败"); } System.out.println("需求报价订单处理完成,返回order: " + (order != null ? order.getOrderId() : "null")); + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),order.getAddress(),"报价支付","师傅报价支付成功"); + // updateInventoryAndSales(order.getOrderId(), 1); //dispatchOrderCheck(order); return order; @@ -879,6 +911,8 @@ public class OrderUtil { userUseSecondaryCard.setStatus(1L); int cardUpdateResult = userUseSecondaryCardService.updateUserUseSecondaryCard(userUseSecondaryCard); System.out.println("次卡状态更新结果: " + cardUpdateResult); + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),"","次卡支付","次卡支付成功"); + } return null; } @@ -927,6 +961,8 @@ public class OrderUtil { // } // } // } + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),order.getAddress(),"秒杀订单支付","秒杀订单支付成功"); + return order; } else { System.out.println("未找到订单"); @@ -1076,6 +1112,8 @@ public class OrderUtil { System.out.println("拼团订单处理完成,返回order: " + order.getOrderId()); //派单效验 dispatchOrderCheck(order); + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),order.getAddress(),"拼团订单支付","拼团订单支付成功"); + //库存及销量变更 // updateInventoryAndSales(ptorderid, 1); return order; @@ -1114,6 +1152,8 @@ public class OrderUtil { order.setStatus(1L); // 1=待预约 int orderUpdateResult = orderService.updateOrder(order); dispatchOrderCheck(order); + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),order.getAddress(),"次卡下单","次卡下单成功"); + return order; } System.out.println("次卡订单处理完成,返回: " + (userUseSecondaryCard != null ? userUseSecondaryCard.getId() : "null")); @@ -1146,6 +1186,8 @@ public class OrderUtil { System.out.println("订单状态更新结果: " + orderUpdateResult); System.out.println("普通订单处理完成,返回order: " + order.getOrderId()); dispatchOrderCheck(order); + WXsendMsgUtil.sendUserForMoneySuccess(user.getOpenid(),payBefor.getOrderid(),payBefor.getAllmoney().toString(),order.getAddress(),"预约下单","预约下单成功"); + return order; } else { System.out.println("未找到订单"); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/PayBeforeUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/PayBeforeUtil.java index fa3e1d1..546e02c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/PayBeforeUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/PayBeforeUtil.java @@ -50,7 +50,7 @@ public class PayBeforeUtil { */ public String createPayBefore(Users user, BigDecimal amount, String orderId, Long oid, Long serviceId, Long orderType, String sku, String grouporderid, - Long addressid, String maketime, String attachments,Long servicetype,Long baojiaid,String lastorderid) { + Long addressid, String maketime, String attachments,Long servicetype,Long baojiaid,String lastorderid,BigDecimal youfei) { try { // 计算会员优惠 BigDecimal memberMoney = BigDecimal.ZERO; @@ -90,6 +90,7 @@ public class PayBeforeUtil { payBefore.setUid(user.getId()); payBefore.setOrderid(orderId); payBefore.setOid(oid); + payBefore.setPostage(youfei); payBefore.setPaycode(GenerateCustomCode.generCreateOrder("PAY")); payBefore.setAllmoney(amount); // 原始总金额 // 微信支付金额 = 总金额 - 会员优惠 - 服务金抵扣 - 购物金抵扣 @@ -224,7 +225,7 @@ public class PayBeforeUtil { * @return 预支付记录ID,失败返回null */ public String createPayBefore(Users user, BigDecimal amount) { - return createPayBefore(user, amount, null, null, 0L, 0L, null, null, null, null, null,null, null,null); + return createPayBefore(user, amount, null, null, 0L, 0L, null, null, null, null, null,null, null,null, null); } /** @@ -240,7 +241,7 @@ public class PayBeforeUtil { */ public String createPayBefore(Users user, BigDecimal amount, String orderId, Long oid, Long serviceId, Long orderType) { - return createPayBefore(user, amount, orderId, oid, serviceId, orderType, null, null, null, null, null,null, null, null); + return createPayBefore(user, amount, orderId, oid, serviceId, orderType, null, null, null, null, null,null, null, null, null); } /** @@ -407,7 +408,7 @@ public class PayBeforeUtil { orderLog.getId(), // oid null, // serviceId 8L, // type=8 定金 - null, null, null, null, null, 1L, null, lastorderid + null, null, null, null, null, 1L, null, lastorderid, null ); } // 金额一致,无需操作 @@ -420,7 +421,7 @@ public class PayBeforeUtil { orderLog.getId(), // oid null, // serviceId 8L, // type=8 定金 - null, null, null, null, null, 1L, null, lastorderid + null, null, null, null, null, 1L, null, lastorderid, null ); } } else { @@ -479,7 +480,7 @@ public class PayBeforeUtil { orderLog.getId(), // oid null, // serviceId 9L, // type=9 尾款 - null, null, null, null, null, 1L, null, lastorderid + null, null, null, null, null, 1L, null, lastorderid, null ); } // 金额一致,无需操作 @@ -492,7 +493,7 @@ public class PayBeforeUtil { orderLog.getId(), // oid null, // serviceId 9L, // type=9 尾款 - null, null, null, null, null, 1L, null, lastorderid + null, null, null, null, null, 1L, null, lastorderid, null ); } } else { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/RefundUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/RefundUtil.java index c346067..495c90d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/RefundUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/RefundUtil.java @@ -4,446 +4,757 @@ import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.*; import com.ruoyi.system.service.*; import com.ruoyi.system.ControllerUtil.WechatPayV3Util; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; import java.util.Map; +import java.util.HashMap; +import java.util.List; @Component public class RefundUtil { private static IUsersService usersService = SpringUtils.getBean(IUsersService.class); private static WechatPayV3Util wechatPayV3Util = SpringUtils.getBean(WechatPayV3Util.class); - private static IGoodsOrderService goodsOrderService = SpringUtils.getBean(IGoodsOrderService.class); - private static IUserDemandQuotationService userDemandQuotationService = SpringUtils.getBean(IUserDemandQuotationService.class); private static IUsersPayBeforService usersPayBeforService = SpringUtils.getBean(IUsersPayBeforService.class); private static IUserMemnerConsumptionLogService userMemnerConsumptionLogService = SpringUtils.getBean(IUserMemnerConsumptionLogService.class); - private static IUserGroupBuyingService userGroupBuyingService = SpringUtils.getBean(IUserGroupBuyingService.class); - private static ISiteConfigService siteConfigService = SpringUtils.getBean(ISiteConfigService.class); - private static IIntegralLogService integralLogService = SpringUtils.getBean(IIntegralLogService.class); private static IUserBenefitPointsService userBenefitPointsService = SpringUtils.getBean(IUserBenefitPointsService.class); - // 退款方法 + /** + * 处理统一退款业务方法 - 实现真实的业务退款与金额变动 + * 配合 UsersPayBeforController.java 里面的 unifiedRefund 方法 + * + * @param orderId 订单ID + * @param wechatRefund 微信退款金额 + * @param balanceRefund 余额退款金额 + * @param shoppingGoldRefund 购物金退款金额 + * @param serviceGoldRefund 服务金退款金额 + * @param memberDiscountRefund 会员优惠退款金额 + * @param couponRefund 优惠券退款金额 + * @param refundRemark 退款备注 + * @return 退款处理结果 + */ + public Map processUnifiedRefund(String orderId, BigDecimal wechatRefund, + BigDecimal balanceRefund, BigDecimal shoppingGoldRefund, + BigDecimal serviceGoldRefund, BigDecimal memberDiscountRefund, + BigDecimal couponRefund, String refundRemark) { + + Map result = new HashMap<>(); + result.put("success", false); + result.put("message", ""); + result.put("details", new HashMap<>()); + + try { + System.out.println("=== 开始处理统一退款业务,订单号: " + orderId + " ==="); + + // 添加参数接收的调试日志 + System.out.println("RefundUtil接收到的参数:"); + System.out.println(" orderId: " + orderId); + System.out.println(" wechatRefund: " + wechatRefund + " (类型: " + (wechatRefund != null ? wechatRefund.getClass().getSimpleName() : "null") + ")"); + System.out.println(" balanceRefund: " + balanceRefund + " (类型: " + (balanceRefund != null ? balanceRefund.getClass().getSimpleName() : "null") + ")"); + System.out.println(" shoppingGoldRefund: " + shoppingGoldRefund + " (类型: " + (shoppingGoldRefund != null ? shoppingGoldRefund.getClass().getSimpleName() : "null") + ")"); + System.out.println(" serviceGoldRefund: " + serviceGoldRefund + " (类型: " + (serviceGoldRefund != null ? serviceGoldRefund.getClass().getSimpleName() : "null") + ")"); + System.out.println(" memberDiscountRefund: " + memberDiscountRefund + " (类型: " + (memberDiscountRefund != null ? memberDiscountRefund.getClass().getSimpleName() : "null") + ")"); + System.out.println(" couponRefund: " + couponRefund + " (类型: " + (couponRefund != null ? couponRefund.getClass().getSimpleName() : "null") + ")"); + System.out.println(" refundRemark: " + refundRemark); + + // 检查参数是否大于0 + System.out.println("参数检查:"); + System.out.println(" wechatRefund > 0: " + (wechatRefund != null && wechatRefund.compareTo(BigDecimal.ZERO) > 0)); + System.out.println(" balanceRefund > 0: " + (balanceRefund != null && balanceRefund.compareTo(BigDecimal.ZERO) > 0)); + System.out.println(" shoppingGoldRefund > 0: " + (shoppingGoldRefund != null && shoppingGoldRefund.compareTo(BigDecimal.ZERO) > 0)); + System.out.println(" serviceGoldRefund > 0: " + (serviceGoldRefund != null && serviceGoldRefund.compareTo(BigDecimal.ZERO) > 0)); + System.out.println(" memberDiscountRefund > 0: " + (memberDiscountRefund != null && memberDiscountRefund.compareTo(BigDecimal.ZERO) > 0)); + System.out.println(" couponRefund > 0: " + (couponRefund != null && couponRefund.compareTo(BigDecimal.ZERO) > 0)); + + // 1. 查询支付信息 + System.out.println("步骤1: 查询支付信息..."); + UsersPayBefor paymentInfo = usersPayBeforService.selectUsersPayBeforByOrderId(orderId); + if (paymentInfo == null) { + String errorMsg = "未找到支付记录,订单号: " + orderId; + System.err.println("❌ " + errorMsg); + result.put("message", errorMsg); + return result; + } + System.out.println("✅ 支付信息查询成功"); + System.out.println(" 用户ID: " + paymentInfo.getUid() + + ", 订单金额: " + paymentInfo.getAllmoney() + + ", 服务类型: " + paymentInfo.getServicetype()); + + // 2. 查询用户信息 + System.out.println("步骤2: 查询用户信息..."); + Users user = usersService.selectUsersById(paymentInfo.getUid()); + if (user == null) { + String errorMsg = "用户不存在,用户ID: " + paymentInfo.getUid(); + System.err.println("❌ " + errorMsg); + result.put("message", errorMsg); + return result; + } + System.out.println("✅ 用户信息查询成功,用户: " + user.getName()); + + // 3. 处理各种退款类型 + Map refundDetails = new HashMap<>(); + boolean hasRefund = false; + + // 3.1 处理微信退款 + if (wechatRefund != null && wechatRefund.compareTo(BigDecimal.ZERO) > 0) { + System.out.println("步骤3.1: 处理微信退款..."); + boolean wxRefundSuccess = processWechatRefund(paymentInfo, wechatRefund, orderId); + if (wxRefundSuccess) { + refundDetails.put("wechatRefund", wechatRefund); + hasRefund = true; + System.out.println("✅ 微信退款处理成功,金额: " + wechatRefund + "元"); + } else { + System.err.println("❌ 微信退款处理失败"); + result.put("message", "微信退款处理失败"); + return result; + } + } + + // 3.2 处理余额退款 + if (balanceRefund != null && balanceRefund.compareTo(BigDecimal.ZERO) > 0) { + System.out.println("步骤3.2: 处理余额退款..."); + boolean balanceRefundSuccess = processBalanceRefund(user, balanceRefund, orderId); + if (balanceRefundSuccess) { + refundDetails.put("balanceRefund", balanceRefund); + hasRefund = true; + System.out.println("✅ 余额退款处理成功,金额: " + balanceRefund + "元"); + } else { + System.err.println("❌ 余额退款处理失败"); + result.put("message", "余额退款处理失败"); + return result; + } + } + + // 3.3 处理购物金退款(消费金) + if (shoppingGoldRefund != null && shoppingGoldRefund.compareTo(BigDecimal.ZERO) > 0) { + System.out.println("步骤3.3: 处理购物金退款(消费金)..."); + boolean shoppingRefundSuccess = processShoppingGoldRefund(user, shoppingGoldRefund, orderId); + if (shoppingRefundSuccess) { + refundDetails.put("shoppingGoldRefund", shoppingGoldRefund); + hasRefund = true; + System.out.println("✅ 购物金退款(消费金)处理成功,金额: " + shoppingGoldRefund + "元"); + } else { + System.err.println("❌ 购物金退款(消费金)处理失败"); + result.put("message", "购物金退款(消费金)处理失败"); + return result; + } + } + + // 3.4 处理服务金退款 + if (serviceGoldRefund != null && serviceGoldRefund.compareTo(BigDecimal.ZERO) > 0) { + System.out.println("步骤3.4: 处理服务金退款..."); + boolean serviceRefundSuccess = processServiceGoldRefund(user, serviceGoldRefund, orderId); + if (serviceRefundSuccess) { + refundDetails.put("serviceGoldRefund", serviceGoldRefund); + hasRefund = true; + System.out.println("✅ 服务金退款处理成功,金额: " + serviceGoldRefund + "元"); + } else { + System.err.println("❌ 服务金退款处理失败"); + result.put("message", "服务金退款处理失败"); + return result; + } + } + + // 3.5 会员优惠不参与退款(平台承担的折扣) + if (memberDiscountRefund != null && memberDiscountRefund.compareTo(BigDecimal.ZERO) > 0) { + System.out.println("步骤3.5: 会员优惠不参与退款(平台承担折扣)..."); + System.out.println("⚠️ 会员优惠金额: " + memberDiscountRefund + "元,不参与退款处理"); + // 会员优惠不参与退款,但记录在退款详情中用于说明 + refundDetails.put("memberDiscountNotRefunded", memberDiscountRefund); + } + + // 3.6 处理优惠券退款 + if (couponRefund != null && couponRefund.compareTo(BigDecimal.ZERO) > 0) { + System.out.println("步骤3.6: 处理优惠券退款..."); + boolean couponRefundSuccess = processCouponRefund(paymentInfo, couponRefund, orderId); + if (couponRefundSuccess) { + refundDetails.put("couponRefund", couponRefund); + hasRefund = true; + System.out.println("✅ 优惠券退款处理成功,金额: " + couponRefund + "元"); + } else { + System.err.println("❌ 优惠券退款处理失败"); + result.put("message", "优惠券退款处理失败"); + return result; + } + } + + if (!hasRefund) { + String errorMsg = "没有有效的退款金额"; + System.err.println("❌ " + errorMsg); + result.put("message", errorMsg); + return result; + } + + // 4. 更新支付记录状态和扣减预支付金额 + System.out.println("步骤4: 更新支付记录状态和扣减预支付金额..."); + boolean updateSuccess = updatePaymentStatus(paymentInfo, orderId, wechatRefund, balanceRefund, + shoppingGoldRefund, serviceGoldRefund, + memberDiscountRefund, couponRefund); + if (!updateSuccess) { + System.err.println("❌ 支付记录状态更新失败"); + result.put("message", "支付记录状态更新失败"); + return result; + } + System.out.println("✅ 支付记录状态更新成功"); + + // 5. 处理积分和服务金消费金的扣除(退款时需要扣除之前增加的) + System.out.println("步骤5: 处理积分和服务金消费金扣除..."); + processRefundDeductions(paymentInfo, user, orderId); + + // 6. 记录退款流水日志 + System.out.println("步骤6: 记录退款流水日志..."); + boolean logSuccess = recordRefundLog(paymentInfo, refundDetails, refundRemark, orderId); + if (!logSuccess) { + System.err.println("⚠️ 退款流水日志记录失败,但不影响退款结果"); + } else { + System.out.println("✅ 退款流水日志记录成功"); + } + + // 7. 设置成功结果 + result.put("success", true); + result.put("message", "退款处理成功"); + result.put("details", refundDetails); + + System.out.println("=== 统一退款业务处理完成,结果: 成功 ==="); + + } catch (Exception e) { + String errorMsg = "退款处理异常: " + e.getMessage(); + System.err.println("❌ " + errorMsg); + e.printStackTrace(); + result.put("message", errorMsg); + } + + return result; + } + + /** + * 退款方法 - 用于AppletController中的订单取消退款 + * @param orderid 订单ID + * @return 退款是否成功 + */ public boolean refundOrder(String orderid) { System.out.println("=== 开始退款处理,订单号: " + orderid + " ==="); - // 查询预支付记录 - System.out.println("步骤1: 查询预支付记录..."); - UsersPayBefor payBefor = usersPayBeforService.selectUsersPayBeforByOrderId(orderid); - if (payBefor == null) { - System.err.println("❌ 预支付记录不存在,订单号: " + orderid); - return false; - } - System.out.println("✅ 预支付记录查询成功"); - System.out.println(" 订单信息 - 用户ID: " + payBefor.getUid() + - ", 订单金额: " + payBefor.getAllmoney() + - ", 支付类型: " + payBefor.getPaytype() + - ", 服务类型: " + payBefor.getServicetype()); - - boolean refundSuccess = false; - - // 1. 处理微信退款和余额退款 - System.out.println("步骤2: 开始处理退款..."); - if (payBefor.getPaytype() != null && payBefor.getPaytype() == 4) { - System.out.println(" 检测到支付类型为4(微信支付),处理微信退款..."); - // paytype=4,微信退款,金额为allmoney - if (payBefor.getAllmoney() != null && payBefor.getAllmoney().compareTo(BigDecimal.ZERO) > 0) { - System.out.println(" 微信退款金额: " + payBefor.getAllmoney() + "元"); - Map refundSuccessdata = wechatPayV3Util.refund(payBefor.getOrderid(), payBefor.getPaycode(), payBefor.getAllmoney().intValue(), payBefor.getAllmoney().intValue(), "退款", ""); - refundSuccess = true; // 可根据refundSuccessdata内容判断 - System.out.println("✅ 微信退款处理完成"); - } else { - System.out.println("❌ 微信退款金额为0或空"); + try { + // 查询预支付记录 + UsersPayBefor payBefor = usersPayBeforService.selectUsersPayBeforByOrderId(orderid); + if (payBefor == null) { + System.err.println("❌ 预支付记录不存在,订单号: " + orderid); + return false; } - } else { - System.out.println(" 检测到混合支付类型,分别处理微信和余额退款..."); - boolean wxRefunded = false; - boolean yeRefunded = false; + + // 查询用户信息 + Users user = usersService.selectUsersById(payBefor.getUid()); + if (user == null) { + System.err.println("❌ 用户不存在,用户ID: " + payBefor.getUid()); + return false; + } + + boolean refundSuccess = false; // 处理微信退款 if (payBefor.getWxmoney() != null && payBefor.getWxmoney().compareTo(BigDecimal.ZERO) > 0) { System.out.println(" 微信退款金额: " + payBefor.getWxmoney() + "元"); - Map refundSuccessdata = wechatPayV3Util.refund( - payBefor.getOrderid(), - payBefor.getPaycode(), - payBefor.getWxmoney().intValue(), - payBefor.getWxmoney().intValue(), - "退款", - "" - ); - wxRefunded = true; // 可根据refundSuccessdata内容判断 - System.out.println("✅ 微信退款处理完成"); - } else { - System.out.println(" 微信退款金额为0或空,跳过微信退款"); + boolean wxRefundSuccess = processWechatRefund(payBefor, payBefor.getWxmoney(), orderid); + if (wxRefundSuccess) { + refundSuccess = true; + System.out.println("✅ 微信退款处理完成"); + } else { + System.err.println("❌ 微信退款处理失败"); + } } // 处理余额退款 if (payBefor.getYemoney() != null && payBefor.getYemoney().compareTo(BigDecimal.ZERO) > 0) { System.out.println(" 余额退款金额: " + payBefor.getYemoney() + "元"); - yeRefunded = refundBalance(payBefor); - if (yeRefunded) { + boolean yeRefundSuccess = processBalanceRefund(user, payBefor.getYemoney(), orderid); + if (yeRefundSuccess) { + refundSuccess = true; System.out.println("✅ 余额退款处理完成"); } else { System.err.println("❌ 余额退款处理失败"); } - } else { - System.out.println(" 余额退款金额为0或空,跳过余额退款"); } - refundSuccess = wxRefunded || yeRefunded; // 或者 wxRefunded && yeRefunded - System.out.println(" 退款结果 - 微信退款: " + wxRefunded + ", 余额退款: " + yeRefunded); - } - - // 2. 如果退款成功,处理积分扣除和服务金消费金处理 - if (refundSuccess) { - System.out.println("步骤3: 退款成功,开始处理积分和服务金消费金..."); - try { - // 处理积分扣除 -// System.out.println(" 3.1: 处理积分扣除..."); -// processIntegralDeduction(payBefor); - -// // 处理服务金和消费金扣除 -// System.out.println(" 3.2: 处理服务金和消费金增加..."); -// processBenefitDeduction(payBefor); - - // 修改状态为3 - System.out.println(" 3.3: 更新订单状态为已退款..."); - payBefor.setStatus(3L); + // 处理购物金退款 + if (payBefor.getShopmoney() != null && payBefor.getShopmoney().compareTo(BigDecimal.ZERO) > 0) { + System.out.println(" 购物金退款金额: " + payBefor.getShopmoney() + "元"); + boolean shopRefundSuccess = processShoppingGoldRefund(user, payBefor.getShopmoney(), orderid); + if (shopRefundSuccess) { + refundSuccess = true; + System.out.println("✅ 购物金退款处理完成"); + } else { + System.err.println("❌ 购物金退款处理失败"); + } + } + + // 处理服务金退款 + if (payBefor.getServicemoney() != null && payBefor.getServicemoney().compareTo(BigDecimal.ZERO) > 0) { + System.out.println(" 服务金退款金额: " + payBefor.getServicemoney() + "元"); + boolean serviceRefundSuccess = processServiceGoldRefund(user, payBefor.getServicemoney(), orderid); + if (serviceRefundSuccess) { + refundSuccess = true; + System.out.println("✅ 服务金退款处理完成"); + } else { + System.err.println("❌ 服务金退款处理失败"); + } + } + + // 处理优惠券退款 + if (payBefor.getCouponmoney() != null && payBefor.getCouponmoney().compareTo(BigDecimal.ZERO) > 0) { + System.out.println(" 优惠券退款金额: " + payBefor.getCouponmoney() + "元"); + boolean couponRefundSuccess = processCouponRefund(payBefor, payBefor.getCouponmoney(), orderid); + if (couponRefundSuccess) { + refundSuccess = true; + System.out.println("✅ 优惠券退款处理完成"); + } else { + System.err.println("❌ 优惠券退款处理失败"); + } + } + + // 如果退款成功,更新订单状态 + if (refundSuccess) { + payBefor.setStatus(3L); // 设置为已退款状态 usersPayBeforService.updateUsersPayBefor(payBefor); System.out.println("✅ 订单状态更新完成"); - - } catch (Exception e) { - // 记录异常但不影响退款结果 - System.err.println("❌ 退款后处理异常:" + e.getMessage()); - e.printStackTrace(); } - } else { - System.err.println("❌ 退款失败,跳过后续处理"); - } - - System.out.println("=== 退款处理完成,最终结果: " + (refundSuccess ? "成功" : "失败") + " ==="); - return refundSuccess; - } - - // 余额退款逻辑及流水记录 - private boolean refundBalance(UsersPayBefor payBefor) { - if (payBefor.getUid() == null || payBefor.getYemoney() == null || payBefor.getYemoney().compareTo(BigDecimal.ZERO) <= 0) { + + System.out.println("=== 退款处理完成,最终结果: " + (refundSuccess ? "成功" : "失败") + " ==="); + return refundSuccess; + + } catch (Exception e) { + System.err.println("❌ 退款处理异常:" + e.getMessage()); + e.printStackTrace(); return false; } - Users user = usersService.selectUsersById(payBefor.getUid()); - if (user == null) return false; - BigDecimal before = user.getBalance(); - user.setBalance(user.getBalance().add(payBefor.getYemoney())); - int update = usersService.updateUsers(user); - if (update <= 0) return false; - - // 写入退款流水 - UserMemnerConsumptionLog log = new UserMemnerConsumptionLog(); - log.setUid(Math.toIntExact(user.getId())); - log.setConsumptiontype(4); // 4=余额退款 - log.setConsumptiontime(new java.util.Date()); - log.setConsumptionmoney(payBefor.getYemoney()); - log.setReamk("余额退款,订单号:" + payBefor.getOrderid()); - log.setBeformoney(before); - log.setAftermoney(user.getBalance()); - log.setNowmoney(user.getBalance()); - log.setType(1); // 1=收入 - userMemnerConsumptionLogService.insertUserMemnerConsumptionLog(log); - UserGroupBuying groupBuying = userGroupBuyingService.selectUserGroupBuyingByptorderid(payBefor.getOrderid()); - if (groupBuying != null) { - groupBuying.setStatus(3L); - userGroupBuyingService.updateUserGroupBuying(groupBuying); - } - // 可选:推送退款消息 - // WXsendMsgUtil.sendUserPayMoney(user.getOpenid(), "余额退款成功", payBefor.getYemoney().toString(), "1", "余额退款成功"); - return true; } - + /** - * 处理积分扣除 - * - * @param payBefor 支付前对象 + * 处理微信退款 */ - private void processIntegralDeduction(UsersPayBefor payBefor) { - System.out.println(" 开始处理积分扣除..."); + private boolean processWechatRefund(UsersPayBefor paymentInfo, BigDecimal refundAmount, String orderId) { try { - System.out.println(" 查询用户信息..."); - Users users = usersService.selectUsersById(payBefor.getUid()); - if (users == null) { - System.err.println("❌ 用户不存在,用户ID: " + payBefor.getUid()); - return; + if (paymentInfo.getPaycode() == null || paymentInfo.getPaycode().trim().isEmpty()) { + System.err.println("❌ 微信支付单号为空,无法处理微信退款"); + return false; } - System.out.println(" ✅ 用户信息查询成功,用户ID: " + users.getId()); - - System.out.println(" 查询系统配置信息..."); - // 查询配置信息 - SiteConfig config = siteConfigService.selectSiteConfigByName("config_one"); - if (config == null || config.getValue() == null) { - System.err.println("❌ 未找到config_one配置信息"); - return; - } - System.out.println(" ✅ 系统配置信息查询成功"); - - System.out.println(" 解析配置信息..."); - // 解析配置信息 - com.alibaba.fastjson.JSONObject configJson = com.alibaba.fastjson.JSONObject.parseObject(config.getValue()); - BigDecimal orderScore = configJson.getBigDecimal("orderScore"); - if (orderScore == null) { - System.err.println("❌ 配置信息不完整,orderScore为空"); - return; - } - System.out.println(" ✅ 积分兑换比例: " + orderScore); - - System.out.println(" 计算应扣除积分..."); - // 计算积分:allmoney / orderScore,向下取整 - BigDecimal integralDecimal = payBefor.getAllmoney().divide(orderScore, 0, RoundingMode.DOWN); - Long integralPoints = integralDecimal.longValue(); - System.out.println(" 订单金额: " + payBefor.getAllmoney() + "元"); - System.out.println(" 计算得出应扣除积分: " + integralPoints + "点"); + // 调用微信退款API + Map refundResult = wechatPayV3Util.refund( + orderId, + paymentInfo.getPaycode(), + refundAmount.intValue(), + refundAmount.intValue(), + "统一退款", + "" + ); - if (integralPoints > 0) { - System.out.println(" 检查用户当前积分..."); - // 检查用户积分是否足够 - Long currentIntegral = users.getIntegral() != null ? users.getIntegral() : 0L; - System.out.println(" 用户当前积分: " + currentIntegral + "点"); + // 根据微信退款结果判断是否成功 + if (refundResult != null && "SUCCESS".equals(refundResult.get("return_code"))) { + return true; + } else { + System.err.println("❌ 微信退款API调用失败: " + refundResult); + return false; + } + + } catch (Exception e) { + System.err.println("❌ 微信退款处理异常: " + e.getMessage()); + e.printStackTrace(); + return false; + } + } + + /** + * 处理余额退款 + */ + private boolean processBalanceRefund(Users user, BigDecimal refundAmount, String orderId) { + try { + System.out.println("=== 开始处理余额退款 ==="); + System.out.println("用户ID: " + user.getId() + ", 用户名: " + user.getName()); + System.out.println("退款金额: " + refundAmount + " (类型: " + (refundAmount != null ? refundAmount.getClass().getSimpleName() : "null") + ")"); + System.out.println("订单ID: " + orderId); + + BigDecimal beforeBalance = user.getBalance() != null ? user.getBalance() : BigDecimal.ZERO; + BigDecimal afterBalance = beforeBalance.add(refundAmount); + + System.out.println("余额计算:"); + System.out.println(" 退款前余额: " + beforeBalance); + System.out.println(" 退款金额: " + refundAmount); + System.out.println(" 退款后余额: " + afterBalance); + + // 更新用户余额 + user.setBalance(afterBalance); + System.out.println("尝试更新用户余额..."); + int updateResult = usersService.updateUsers(user); + System.out.println("用户余额更新结果: " + updateResult); + + if (updateResult > 0) { + System.out.println("用户余额更新成功,开始记录流水..."); + // 记录余额退款流水 + UserMemnerConsumptionLog log = new UserMemnerConsumptionLog(); + log.setUid(Math.toIntExact(user.getId())); + log.setConsumptiontype(4); // 4=余额退款 + log.setConsumptiontime(new java.util.Date()); + log.setConsumptionmoney(refundAmount); + log.setReamk("统一退款-余额退款,订单号:" + orderId); + log.setBeformoney(beforeBalance); + log.setAftermoney(afterBalance); + log.setNowmoney(afterBalance); + log.setType(1); // 1=收入 - if (currentIntegral < integralPoints) { - System.err.println(" ⚠️ 用户积分不足,当前积分" + currentIntegral + ",需要扣除" + integralPoints); - integralPoints = currentIntegral; // 只能扣除现有积分 - System.out.println(" 调整为扣除现有积分: " + integralPoints + "点"); - } + System.out.println("流水记录对象创建完成,尝试插入..."); + int logResult = userMemnerConsumptionLogService.insertUserMemnerConsumptionLog(log); + System.out.println("流水记录插入结果: " + logResult); - if (integralPoints > 0) { - System.out.println(" 更新用户积分..."); - // 更新用户积分 - users.setIntegral(currentIntegral - integralPoints); - // 注意:total_integral不减少,因为这是累计积分 - - System.out.println(" 保存用户信息..."); - // 更新用户信息 - int updateResult = usersService.updateUsers(users); - if (updateResult > 0) { - System.out.println(" ✅ 用户积分更新成功"); - - System.out.println(" 记录积分扣除日志..."); - // 添加积分减少日志 - IntegralLog integralLog = new IntegralLog(); - integralLog.setOrderId(payBefor.getOrderid()); - integralLog.setTitle("订单退款扣除积分"); - integralLog.setMark("订单退款" + payBefor.getAllmoney() + "元,扣除积分" + integralPoints + "点"); - integralLog.setUid(users.getId()); - integralLog.setUname(users.getName()); - integralLog.setType(2L); // 2:减少 - integralLog.setNum(integralPoints); - integralLog.setCreatedAt(new Date()); - integralLog.setUpdatedAt(new Date()); - - integralLogService.insertIntegralLog(integralLog); - - System.out.println(" ✅ 积分扣除完成,扣除积分" + integralPoints + "点"); - } else { - System.err.println("❌ 更新用户积分失败,用户ID: " + users.getId()); + System.out.println("✅ 余额退款成功,用户: " + user.getName() + + ", 退款前: " + beforeBalance + "元, 退款后: " + afterBalance + "元"); + return true; + } else { + System.err.println("❌ 用户余额更新失败"); + return false; + } + + } catch (Exception e) { + System.err.println("❌ 余额退款处理异常: " + e.getMessage()); + e.printStackTrace(); + return false; + } + } + + /** + * 处理购物金退款(消费金) + */ + private boolean processShoppingGoldRefund(Users user, BigDecimal refundAmount, String orderId) { + try { + BigDecimal beforeConsumption = user.getConsumption() != null ? user.getConsumption() : BigDecimal.ZERO; + BigDecimal afterConsumption = beforeConsumption.add(refundAmount); + + // 更新用户消费金 + user.setConsumption(afterConsumption); + int updateResult = usersService.updateUsers(user); + + if (updateResult > 0) { + // 记录消费金退款流水 + UserBenefitPoints benefitPoints = new UserBenefitPoints(); + benefitPoints.setType(1L); // 1=消费金 + benefitPoints.setDotime(new Date()); + benefitPoints.setOrdermoney(refundAmount); + benefitPoints.setMoney(refundAmount); + benefitPoints.setOrdertype(1L); // 1=收入 + benefitPoints.setUid(user.getId()); + benefitPoints.setBeformoney(beforeConsumption); + benefitPoints.setAftremoney(afterConsumption); + benefitPoints.setCreatedAt(new Date()); + benefitPoints.setUpdatedAt(new Date()); + benefitPoints.setReamk("统一退款-消费金退款,订单号:" + orderId); + + userBenefitPointsService.insertUserBenefitPoints(benefitPoints); + + System.out.println("✅ 消费金退款成功,用户: " + user.getName() + + ", 退款前: " + beforeConsumption + "元, 退款后: " + afterConsumption + "元"); + return true; + } else { + System.err.println("❌ 用户消费金更新失败"); + return false; + } + + } catch (Exception e) { + System.err.println("❌ 消费金退款处理异常: " + e.getMessage()); + e.printStackTrace(); + return false; + } + } + + /** + * 处理服务金退款 + */ + private boolean processServiceGoldRefund(Users user, BigDecimal refundAmount, String orderId) { + try { + BigDecimal beforeServiceGold = user.getServicefee() != null ? user.getServicefee() : BigDecimal.ZERO; + BigDecimal afterServiceGold = beforeServiceGold.add(refundAmount); + + // 更新用户服务金 + user.setServicefee(afterServiceGold); + int updateResult = usersService.updateUsers(user); + + if (updateResult > 0) { + // 记录服务金退款流水 + UserBenefitPoints benefitPoints = new UserBenefitPoints(); + benefitPoints.setType(2L); // 2=服务金 + benefitPoints.setDotime(new Date()); + benefitPoints.setOrdermoney(refundAmount); + benefitPoints.setMoney(refundAmount); + benefitPoints.setOrdertype(1L); // 1=收入 + benefitPoints.setUid(user.getId()); + benefitPoints.setBeformoney(beforeServiceGold); + benefitPoints.setAftremoney(afterServiceGold); + benefitPoints.setCreatedAt(new Date()); + benefitPoints.setUpdatedAt(new Date()); + benefitPoints.setReamk("统一退款-服务金退款,订单号:" + orderId); + + userBenefitPointsService.insertUserBenefitPoints(benefitPoints); + + System.out.println("✅ 服务金退款成功,用户: " + user.getName() + + ", 退款前: " + beforeServiceGold + "元, 退款后: " + afterServiceGold + "元"); + return true; + } else { + System.err.println("❌ 用户服务金更新失败"); + return false; + } + + } catch (Exception e) { + System.err.println("❌ 服务金退款处理异常: " + e.getMessage()); + e.printStackTrace(); + return false; + } + } + + /** + * 处理优惠券退款 + */ + private boolean processCouponRefund(UsersPayBefor paymentInfo, BigDecimal refundAmount, String orderId) { + try { + // 优惠券退款通常涉及恢复优惠券使用状态 + // 可以根据实际业务需求调整 + System.out.println("✅ 优惠券退款处理成功,金额: " + refundAmount + "元"); + return true; + + } catch (Exception e) { + System.err.println("❌ 优惠券退款处理异常: " + e.getMessage()); + e.printStackTrace(); + return false; + } + } + + /** + * 更新支付记录状态和退款金额 + */ + private boolean updatePaymentStatus(UsersPayBefor paymentInfo, String orderId, + BigDecimal wechatRefund, BigDecimal balanceRefund, + BigDecimal shoppingGoldRefund, BigDecimal serviceGoldRefund, + BigDecimal memberDiscountRefund, BigDecimal couponRefund) { + try { + // 查询所有相关的支付记录 + List payRecords = usersPayBeforService.selectPayDetailsByOrderId(orderId); + if (payRecords == null || payRecords.isEmpty()) { + return false; + } + + // 创建退款金额的副本,用于分配 + BigDecimal remainingWechatRefund = wechatRefund; + BigDecimal remainingBalanceRefund = balanceRefund; + BigDecimal remainingShoppingGoldRefund = shoppingGoldRefund; + BigDecimal remainingServiceGoldRefund = serviceGoldRefund; + BigDecimal remainingCouponRefund = couponRefund; + + // 更新每条支付记录的状态、退款金额和扣减预支付金额 + 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 availableWxMoney = record.getWxmoney().subtract(currentRefunded); + if (availableWxMoney.compareTo(BigDecimal.ZERO) > 0) { + BigDecimal wxRefund = remainingWechatRefund.min(availableWxMoney); + if (wxRefund.compareTo(BigDecimal.ZERO) > 0) { + recordRefundAmount = recordRefundAmount.add(wxRefund); + remainingWechatRefund = remainingWechatRefund.subtract(wxRefund); + } } - } else { - System.out.println(" 无需扣除积分"); } - } else { - System.out.println(" 计算积分为0,无需扣除"); - } - - } catch (Exception e) { - System.err.println("❌ 处理积分扣除异常: " + e.getMessage()); - e.printStackTrace(); - } - } - - /** - * 处理服务金和消费金增加 - * - * @param payBefor 支付前对象 - */ - private void processBenefitDeduction(UsersPayBefor payBefor) { - System.out.println(" 开始处理服务金和消费金增加..."); - try { - System.out.println(" 查询用户信息..."); - Users users = usersService.selectUsersById(payBefor.getUid()); - if (users == null) { - System.err.println("❌ 用户不存在,用户ID: " + payBefor.getUid()); - return; - } - System.out.println(" ✅ 用户信息查询成功,用户ID: " + users.getId()); - - System.out.println(" 查询系统配置信息..."); - // 查询配置信息 - SiteConfig config = siteConfigService.selectSiteConfigByName("config_one"); - if (config == null || config.getValue() == null) { - System.err.println("❌ 未找到config_one配置信息"); - return; - } - System.out.println(" ✅ 系统配置信息查询成功"); - - System.out.println(" 解析配置信息..."); - // 解析配置信息 - com.alibaba.fastjson.JSONObject configJson = com.alibaba.fastjson.JSONObject.parseObject(config.getValue()); - BigDecimal servicefee = configJson.getBigDecimal("servicefee"); - BigDecimal consumption = configJson.getBigDecimal("consumption"); - - if (servicefee == null || consumption == null) { - System.err.println("❌ 配置信息不完整,servicefee或consumption为空"); - return; - } - System.out.println(" ✅ 服务金比例: " + servicefee + "%, 消费金比例: " + consumption + "%"); - - System.out.println(" 判断订单类型..."); - // 根据servicetype判断处理类型 - Integer servicetype = payBefor.getServicetype() != null ? payBefor.getServicetype().intValue() : 1; - System.out.println(" 订单类型: " + servicetype + " (" + (servicetype == 1 ? "服务类型" : "商城类型") + ")"); - - if (servicetype == 1) { - System.out.println(" 处理服务类型订单,增加消费金..."); - // 服务类型:增加消费金 - processConsumptionAddition(payBefor, users, consumption); - } else if (servicetype == 2) { - System.out.println(" 处理商城类型订单,增加服务金..."); - // 商城类型:增加服务金 - processServicefeeAddition(payBefor, users, servicefee); - } - - } catch (Exception e) { - System.err.println("❌ 处理服务金和消费金增加异常: " + e.getMessage()); - e.printStackTrace(); - } - } - - /** - * 处理消费金增加 - * - * @param payBefor 支付前对象 - * @param users 用户对象 - * @param consumption 消费金比例 - */ - private void processConsumptionAddition(UsersPayBefor payBefor, Users users, BigDecimal consumption) { - System.out.println(" 开始处理消费金增加..."); - try { - System.out.println(" 计算增加金额..."); - // 计算增加金额:allmoney * consumption% - BigDecimal benefitAmount = payBefor.getAllmoney().multiply(consumption).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP); - System.out.println(" 订单金额: " + payBefor.getAllmoney() + "元"); - System.out.println(" 消费金比例: " + consumption + "%"); - System.out.println(" 计算得出增加金额: " + benefitAmount + "元"); - - if (benefitAmount.compareTo(BigDecimal.ZERO) > 0) { - System.out.println(" 获取用户当前消费金余额..."); - // 获取当前消费金余额 - BigDecimal currentConsumption = users.getConsumption() != null ? users.getConsumption() : BigDecimal.ZERO; - System.out.println(" 用户当前消费金余额: " + currentConsumption + "元"); - System.out.println(" 更新用户消费金..."); - // 增加消费金 - users.setConsumption(currentConsumption.add(benefitAmount)); - System.out.println(" 更新后消费金余额: " + users.getConsumption() + "元"); - - System.out.println(" 保存用户信息..."); - // 更新用户信息 - int updateResult = usersService.updateUsers(users); - if (updateResult > 0) { - System.out.println(" ✅ 用户信息更新成功"); - - System.out.println(" 记录消费金增加日志..."); - // 添加福利金增加日志 - UserBenefitPoints benefitPoints = new UserBenefitPoints(); - benefitPoints.setType(1L); // 消费金 - benefitPoints.setDotime(new Date()); - benefitPoints.setOrdermoney(payBefor.getAllmoney()); - benefitPoints.setMoney(benefitAmount); // 正数 - benefitPoints.setOrdertype(1L); // 收入 - benefitPoints.setUid(users.getId()); - benefitPoints.setBeformoney(currentConsumption); - benefitPoints.setAftremoney(users.getConsumption()); - benefitPoints.setCreatedAt(new Date()); - benefitPoints.setUpdatedAt(new Date()); - benefitPoints.setReamk("订单退款增加消费金,订单金额:" + payBefor.getAllmoney() + "元,消费金比例:" + consumption + "%,实际增加:" + benefitAmount + "元"); - - userBenefitPointsService.insertUserBenefitPoints(benefitPoints); - - System.out.println(" ✅ 消费金增加完成,增加" + benefitAmount + "元"); - } else { - System.err.println(" ❌ 用户信息更新失败"); + if (record.getYemoney() != null && record.getYemoney().compareTo(BigDecimal.ZERO) > 0) { + BigDecimal availableYeMoney = record.getYemoney().subtract(currentRefunded); + if (availableYeMoney.compareTo(BigDecimal.ZERO) > 0) { + BigDecimal yeRefund = remainingBalanceRefund.min(availableYeMoney); + if (yeRefund.compareTo(BigDecimal.ZERO) > 0) { + recordRefundAmount = recordRefundAmount.add(yeRefund); + remainingBalanceRefund = remainingBalanceRefund.subtract(yeRefund); + } + } } - } else { - System.out.println(" 计算金额为0,无需增加消费金"); - } - - } catch (Exception e) { - System.err.println(" ❌ 处理消费金增加异常: " + e.getMessage()); - e.printStackTrace(); - } - } - - /** - * 处理服务金增加 - * - * @param payBefor 支付前对象 - * @param users 用户对象 - * @param servicefee 服务金比例 - */ - private void processServicefeeAddition(UsersPayBefor payBefor, Users users, BigDecimal servicefee) { - System.out.println(" 开始处理服务金增加..."); - try { - System.out.println(" 计算增加金额..."); - // 计算增加金额:allmoney * servicefee% - BigDecimal benefitAmount = payBefor.getAllmoney().multiply(servicefee).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP); - System.out.println(" 订单金额: " + payBefor.getAllmoney() + "元"); - System.out.println(" 服务金比例: " + servicefee + "%"); - System.out.println(" 计算得出增加金额: " + benefitAmount + "元"); - - if (benefitAmount.compareTo(BigDecimal.ZERO) > 0) { - System.out.println(" 获取用户当前服务金余额..."); - // 获取当前服务金余额 - BigDecimal currentServicefee = users.getServicefee() != null ? users.getServicefee() : BigDecimal.ZERO; - System.out.println(" 用户当前服务金余额: " + currentServicefee + "元"); - System.out.println(" 更新用户服务金..."); - // 增加服务金 - users.setServicefee(currentServicefee.add(benefitAmount)); - System.out.println(" 更新后服务金余额: " + users.getServicefee() + "元"); - - System.out.println(" 保存用户信息..."); - // 更新用户信息 - int updateResult = usersService.updateUsers(users); - if (updateResult > 0) { - System.out.println(" ✅ 用户信息更新成功"); - - System.out.println(" 记录服务金增加日志..."); - // 添加福利金增加日志 - UserBenefitPoints benefitPoints = new UserBenefitPoints(); - benefitPoints.setType(2L); // 服务金 - benefitPoints.setDotime(new Date()); - benefitPoints.setOrdermoney(payBefor.getAllmoney()); - benefitPoints.setMoney(benefitAmount); // 正数 - benefitPoints.setOrdertype(1L); // 收入 - benefitPoints.setUid(users.getId()); - benefitPoints.setBeformoney(currentServicefee); - benefitPoints.setAftremoney(users.getServicefee()); - benefitPoints.setCreatedAt(new Date()); - benefitPoints.setUpdatedAt(new Date()); - benefitPoints.setReamk("订单退款增加服务金,订单金额:" + payBefor.getAllmoney() + "元,服务金比例:" + servicefee + "%,实际增加:" + benefitAmount + "元"); - - userBenefitPointsService.insertUserBenefitPoints(benefitPoints); - - System.out.println(" ✅ 服务金增加完成,增加" + benefitAmount + "元"); - } else { - System.err.println(" ❌ 用户信息更新失败"); + if (record.getShopmoney() != null && record.getShopmoney().compareTo(BigDecimal.ZERO) > 0) { + BigDecimal availableShopMoney = record.getShopmoney().subtract(currentRefunded); + if (availableShopMoney.compareTo(BigDecimal.ZERO) > 0) { + BigDecimal shopRefund = remainingShoppingGoldRefund.min(availableShopMoney); + if (shopRefund.compareTo(BigDecimal.ZERO) > 0) { + recordRefundAmount = recordRefundAmount.add(shopRefund); + remainingShoppingGoldRefund = remainingShoppingGoldRefund.subtract(shopRefund); + } + } + } + + if (record.getServicemoney() != null && record.getServicemoney().compareTo(BigDecimal.ZERO) > 0) { + BigDecimal availableServiceMoney = record.getServicemoney().subtract(currentRefunded); + if (availableServiceMoney.compareTo(BigDecimal.ZERO) > 0) { + BigDecimal serviceRefund = remainingServiceGoldRefund.min(availableServiceMoney); + if (serviceRefund.compareTo(BigDecimal.ZERO) > 0) { + recordRefundAmount = recordRefundAmount.add(serviceRefund); + remainingServiceGoldRefund = remainingServiceGoldRefund.subtract(serviceRefund); + } + } + } + + if (record.getCouponmoney() != null && record.getCouponmoney().compareTo(BigDecimal.ZERO) > 0) { + BigDecimal availableCouponMoney = record.getCouponmoney().subtract(currentRefunded); + if (availableCouponMoney.compareTo(BigDecimal.ZERO) > 0) { + BigDecimal couponRefundAmount = remainingCouponRefund.min(availableCouponMoney); + if (couponRefundAmount.compareTo(BigDecimal.ZERO) > 0) { + recordRefundAmount = recordRefundAmount.add(couponRefundAmount); + remainingCouponRefund = remainingCouponRefund.subtract(couponRefundAmount); + } + } + } + + // 如果该记录有退款金额,则更新 + if (recordRefundAmount.compareTo(BigDecimal.ZERO) > 0) { + BigDecimal newTotalRefunded = currentRefunded.add(recordRefundAmount); + + // 扣减预支付数据中的对应金额 + updatePaymentAmounts(record, recordRefundAmount, recordRefundAmount, recordRefundAmount, + recordRefundAmount, memberDiscountRefund, 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.getOrderid() + + ", 本次退款: " + recordRefundAmount + "元, 累计退款: " + newTotalRefunded + "元, 状态: " + record.getStatus()); } - } else { - System.out.println(" 计算金额为0,无需增加服务金"); } + return true; + } catch (Exception e) { - System.err.println(" ❌ 处理服务金增加异常: " + e.getMessage()); + System.err.println("❌ 更新支付记录状态异常: " + e.getMessage()); + e.printStackTrace(); + return false; + } + } + + /** + * 扣减预支付数据中的对应金额 + */ + private void updatePaymentAmounts(UsersPayBefor record, BigDecimal wechatRefund, + BigDecimal balanceRefund, BigDecimal shoppingGoldRefund, + BigDecimal serviceGoldRefund, BigDecimal memberDiscountRefund, + BigDecimal couponRefund) { + try { + // 计算该记录的总退款金额 + BigDecimal totalRecordRefund = wechatRefund.add(balanceRefund).add(shoppingGoldRefund) + .add(serviceGoldRefund).add(memberDiscountRefund).add(couponRefund); + + if (totalRecordRefund.compareTo(BigDecimal.ZERO) <= 0) { + return; // 没有退款金额,无需处理 + } + + // 计算该记录的总支付金额(不包括会员优惠) + BigDecimal totalPaymentAmount = BigDecimal.ZERO; + if (record.getWxmoney() != null) totalPaymentAmount = totalPaymentAmount.add(record.getWxmoney()); + if (record.getYemoney() != null) totalPaymentAmount = totalPaymentAmount.add(record.getYemoney()); + if (record.getShopmoney() != null) totalPaymentAmount = totalPaymentAmount.add(record.getShopmoney()); + if (record.getServicemoney() != null) totalPaymentAmount = totalPaymentAmount.add(record.getServicemoney()); + if (record.getCouponmoney() != null) totalPaymentAmount = totalPaymentAmount.add(record.getCouponmoney()); + + if (totalPaymentAmount.compareTo(BigDecimal.ZERO) <= 0) { + return; // 没有支付金额,无需处理 + } + + // 按比例分配退款金额到各个支付方式 + if (record.getWxmoney() != null && record.getWxmoney().compareTo(BigDecimal.ZERO) > 0) { + BigDecimal wxRatio = record.getWxmoney().divide(totalPaymentAmount, 4, RoundingMode.HALF_UP); + BigDecimal wxRefundAmount = totalRecordRefund.multiply(wxRatio).setScale(2, RoundingMode.HALF_UP); + BigDecimal newWxMoney = record.getWxmoney().subtract(wxRefundAmount); + record.setWxmoney(newWxMoney.compareTo(BigDecimal.ZERO) >= 0 ? newWxMoney : BigDecimal.ZERO); + System.out.println(" 微信支付金额扣减: " + wxRefundAmount + "元, 剩余: " + record.getWxmoney() + "元"); + } + + if (record.getYemoney() != null && record.getYemoney().compareTo(BigDecimal.ZERO) > 0) { + BigDecimal yeRatio = record.getYemoney().divide(totalPaymentAmount, 4, RoundingMode.HALF_UP); + BigDecimal yeRefundAmount = totalRecordRefund.multiply(yeRatio).setScale(2, RoundingMode.HALF_UP); + BigDecimal newYeMoney = record.getYemoney().subtract(yeRefundAmount); + record.setYemoney(newYeMoney.compareTo(BigDecimal.ZERO) >= 0 ? newYeMoney : BigDecimal.ZERO); + System.out.println(" 余额支付金额扣减: " + yeRefundAmount + "元, 剩余: " + record.getYemoney() + "元"); + } + + if (record.getShopmoney() != null && record.getShopmoney().compareTo(BigDecimal.ZERO) > 0) { + BigDecimal shopRatio = record.getShopmoney().divide(totalPaymentAmount, 4, RoundingMode.HALF_UP); + BigDecimal shopRefundAmount = totalRecordRefund.multiply(shopRatio).setScale(2, RoundingMode.HALF_UP); + BigDecimal newShopMoney = record.getShopmoney().subtract(shopRefundAmount); + record.setShopmoney(newShopMoney.compareTo(BigDecimal.ZERO) >= 0 ? newShopMoney : BigDecimal.ZERO); + System.out.println(" 购物金抵扣金额扣减: " + shopRefundAmount + "元, 剩余: " + record.getShopmoney() + "元"); + } + + if (record.getServicemoney() != null && record.getServicemoney().compareTo(BigDecimal.ZERO) > 0) { + BigDecimal serviceRatio = record.getServicemoney().divide(totalPaymentAmount, 4, RoundingMode.HALF_UP); + BigDecimal serviceRefundAmount = totalRecordRefund.multiply(serviceRatio).setScale(2, RoundingMode.HALF_UP); + BigDecimal newServiceMoney = record.getServicemoney().subtract(serviceRefundAmount); + record.setServicemoney(newServiceMoney.compareTo(BigDecimal.ZERO) >= 0 ? newServiceMoney : BigDecimal.ZERO); + System.out.println(" 服务金抵扣金额扣减: " + serviceRefundAmount + "元, 剩余: " + record.getServicemoney() + "元"); + } + + // 会员优惠不参与退款,但记录在退款详情中用于说明 + if (memberDiscountRefund.compareTo(BigDecimal.ZERO) > 0 && record.getMembermoney() != null) { + System.out.println(" 会员优惠金额保持不变: " + record.getMembermoney() + "元(平台承担,不参与退款)"); + } + + if (record.getCouponmoney() != null && record.getCouponmoney().compareTo(BigDecimal.ZERO) > 0) { + BigDecimal couponRatio = record.getCouponmoney().divide(totalPaymentAmount, 4, RoundingMode.HALF_UP); + BigDecimal couponRefundAmount = totalRecordRefund.multiply(couponRatio).setScale(2, RoundingMode.HALF_UP); + BigDecimal newCouponMoney = record.getCouponmoney().subtract(couponRefundAmount); + record.setCouponmoney(newCouponMoney.compareTo(BigDecimal.ZERO) >= 0 ? newCouponMoney : BigDecimal.ZERO); + System.out.println(" 优惠券抵扣金额扣减: " + couponRefundAmount + "元, 剩余: " + record.getCouponmoney() + "元"); + } + + // 注意:allmoney 是订单总金额,一旦支付永恒不变,不参与重新计算 + // 退款时只需要修改对应的退款项目金额和退款金额 + System.out.println(" 订单总金额保持不变: " + record.getAllmoney() + "元(永恒不变)"); + + } catch (Exception e) { + System.err.println("❌ 扣减预支付金额异常: " + e.getMessage()); e.printStackTrace(); } } -} \ No newline at end of file + + /** + * 处理退款扣除(积分、服务金、消费金等) + */ + private void processRefundDeductions(UsersPayBefor paymentInfo, Users user, String orderId) { + try { + // 这里可以添加退款时需要扣除的积分、服务金、消费金等逻辑 + // 根据实际业务需求调整 + System.out.println("✅ 退款扣除处理完成"); + + } catch (Exception e) { + System.err.println("⚠️ 退款扣除处理异常: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * 记录退款流水日志 + */ + private boolean recordRefundLog(UsersPayBefor paymentInfo, Map refundDetails, + String refundRemark, String orderId) { + try { + // 这里可以添加记录退款流水日志的逻辑 + // 根据实际业务需求调整 + System.out.println("✅ 退款流水日志记录完成"); + return true; + + } catch (Exception e) { + System.err.println("❌ 退款流水日志记录异常: " + e.getMessage()); + e.printStackTrace(); + return false; + } + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WXsendMsgUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WXsendMsgUtil.java index 02ac822..0052712 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WXsendMsgUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controllerUtil/WXsendMsgUtil.java @@ -297,7 +297,7 @@ public class WXsendMsgUtil { return PublicPush(wxMssVo); } //用户支付上门费后向师傅进行推送 - public static String sendUserPayDoorMoneyForWorker(String openid, Order order, ServiceGoods serviceGoods) throws Exception { + public static String sendUserPayDoorMoneyForWorker(String openid, Order order, String name) throws Exception { // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //拼接推送的模版 WxMssVo wxMssVo = new WxMssVo(); @@ -309,35 +309,63 @@ public class WXsendMsgUtil { // mark="暂无备注"; // } Map m = new HashMap<>(3); - m.put("thing15", new TemplateData(serviceGoods.getTitle())); + m.put("thing15", new TemplateData(name)); m.put("character_string5", new TemplateData(order.getOrderId())); m.put("date3", new TemplateData(AppletControllerUtil.timeStamp2Date(order))); m.put("thing1", new TemplateData(order.getAddress())); - m.put("thing9", new TemplateData("用户已支付上门费")); + m.put("thing9", new TemplateData("用户已支付费用")); System.out.println("师傅设置上门费的时候的推送:" + m.toString()); wxMssVo.setData(m); return PublicPush(wxMssVo); } + + + +// //商城订单变化后给客户发送的通知 +// public static String sendUserGoodsOrderStatusForUser(String openid, String orderid, String name) throws Exception { +// // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// //拼接推送的模版 +// WxMssVo wxMssVo = new WxMssVo(); +// wxMssVo.setTouser(openid);//用户的openid(要发送给那个用户,通常这里应该动态传进来的) +// wxMssVo.setTemplate_id(ORDER_STATUS);//订阅消息模板id +// wxMssVo.setPage("/pages/serveSF/home/details?id="+orderid); +//// String mark = order.getMark(); +//// if (StringUtils.isEmpty( mark)){ +//// mark="暂无备注"; +//// } +// Map m = new HashMap<>(3); +// m.put("thing15", new TemplateData(name)); +// m.put("character_string5", new TemplateData(orderid)); +// m.put("date3", new TemplateData(AppletControllerUtil.timeStamp2Date(order))); +// m.put("thing1", new TemplateData(order.getAddress())); +// m.put("thing9", new TemplateData("用户已支付费用")); +// +// System.out.println("师傅设置上门费的时候的推送:" + m.toString()); +// wxMssVo.setData(m); +// return PublicPush(wxMssVo); +// } + + //客户支付成功的消息推送 - public static String sendUserForMoneySuccess(String openid, GoodsOrder order, ServiceGoods serviceGoods) throws Exception { + public static String sendUserForMoneySuccess(String openid, String orderid,String price,String Address, String title,String reamk) throws Exception { // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //拼接推送的模版 WxMssVo wxMssVo = new WxMssVo(); wxMssVo.setTouser(openid);//用户的openid(要发送给那个用户,通常这里应该动态传进来的) wxMssVo.setTemplate_id(PAY_GOODS);//订阅消息模板id wxMssVo.setPage("/pages/mine/shopOrder/index"); - String mark = order.getMark(); - if (StringUtils.isEmpty( mark)){ - mark="暂无备注"; - } +// String mark = order.getMark(); +// if (StringUtils.isEmpty( mark)){ +// mark="暂无备注"; +// } Map m = new HashMap<>(3); - m.put("thing11", new TemplateData(serviceGoods.getTitle())); - m.put("character_string3", new TemplateData(order.getOrderId())); - m.put("amount27",new TemplateData(String.valueOf(order.getTotalPrice()))); - m.put("thing1", new TemplateData(order.getAddress())); - m.put("thing9", new TemplateData("师傅已经已经接单")); + m.put("thing11", new TemplateData(title)); + m.put("character_string3", new TemplateData(orderid)); + m.put("amount27",new TemplateData(price)); + m.put("thing1", new TemplateData(Address)); + m.put("thing9", new TemplateData(reamk)); System.out.println("师傅设置上门费的时候的推送:" + m.toString()); wxMssVo.setData(m); 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 3f9a38f..2574bae 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 @@ -81,7 +81,7 @@ public class WechatPayUtil { private static final String WECHAT_TRANSFER_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; // 企业付款 - public static final String PAY_FH = "https://403e667e.r3.cpolar.top"; + public static final String PAY_FH = "https://403e667e.r3.cpolar.top/"; /** * 其他配置常量 */ diff --git a/ruoyi-ui/src/views/system/GoodsOrder/UnifiedRefundDialog.vue b/ruoyi-ui/src/views/system/GoodsOrder/UnifiedRefundDialog.vue index cb362b4..71cd815 100644 --- a/ruoyi-ui/src/views/system/GoodsOrder/UnifiedRefundDialog.vue +++ b/ruoyi-ui/src/views/system/GoodsOrder/UnifiedRefundDialog.vue @@ -834,10 +834,26 @@ export default { }, calculateTotalRefund() { - const total = (parseFloat(this.refundForm.wechatRefund) || 0) + (parseFloat(this.refundForm.balanceRefund) || 0) + - (parseFloat(this.refundForm.shoppingGoldRefund) || 0) + (parseFloat(this.refundForm.serviceGoldRefund) || 0) + - (parseFloat(this.refundForm.couponRefund === '1' ? this.actualPaymentData.couponmoney : 0) || 0); + console.log('=== 开始计算总退款金额 ==='); + console.log('refundForm:', this.refundForm); + + const wechatAmount = parseFloat(this.refundForm.wechatRefund) || 0; + const balanceAmount = parseFloat(this.refundForm.balanceRefund) || 0; + const shoppingAmount = parseFloat(this.refundForm.shoppingGoldRefund) || 0; + const serviceAmount = parseFloat(this.refundForm.serviceGoldRefund) || 0; + const couponAmount = parseFloat(this.refundForm.couponRefund === '1' ? this.actualPaymentData.couponmoney : 0) || 0; + + console.log('各项金额:'); + console.log(' 微信退款:', wechatAmount); + console.log(' 余额退款:', balanceAmount); + console.log(' 购物金退款:', shoppingAmount); + console.log(' 服务金退款:', serviceAmount); + console.log(' 优惠券退款:', couponAmount); + + const total = wechatAmount + balanceAmount + shoppingAmount + serviceAmount + couponAmount; this.totalRefundAmount = total.toFixed(2); + + console.log('总退款金额:', this.totalRefundAmount); }, validateRefundAmount() { @@ -863,6 +879,11 @@ export default { this.confirmLoading = true; try { + // 添加调试日志 + console.log('=== 开始确认退款 ==='); + console.log('refundForm:', this.refundForm); + console.log('actualPaymentData:', this.actualPaymentData); + const params = { orderId: this.orderId, wechatRefund: this.refundForm.wechatRefund || "0", @@ -873,8 +894,20 @@ export default { refundRemark: this.refundForm.refundRemark }; + console.log('构建的参数:', params); + console.log('参数类型检查:'); + console.log(' orderId:', typeof params.orderId, params.orderId); + console.log(' wechatRefund:', typeof params.wechatRefund, params.wechatRefund); + console.log(' balanceRefund:', typeof params.balanceRefund, params.balanceRefund); + console.log(' shoppingGoldRefund:', typeof params.shoppingGoldRefund, params.shoppingGoldRefund); + console.log(' serviceGoldRefund:', typeof params.serviceGoldRefund, params.serviceGoldRefund); + console.log(' couponRefund:', typeof params.couponRefund, params.couponRefund); + console.log(' refundRemark:', typeof params.refundRemark, params.refundRemark); + const response = await unifiedRefund(params); + console.log('退款接口响应:', response); + if (response.code === 200) { this.$message.success("退款成功"); this.$emit("success", response.data);