From 9f3b9a55ebedfe6223e114abbb8f4dbb309a5e85 Mon Sep 17 00:00:00 2001 From: "925116093-qq.com" <925116093@qq.com> Date: Fri, 15 Aug 2025 18:22:12 +0800 Subject: [PATCH] 202508151822 --- .../src/api/system/transfer_20250522100538.js | 53 - .../src/api/system/transfer_20250522153157.js | 51 - pom.xml | 15 + ruoyi-system/pom.xml | 11 +- .../controller/AppleOrderController.java | 80 +- .../system/controller/ApplePayController.java | 115 +- .../system/controller/AppletController.java | 30 +- .../controller/GoodsOrderController.java | 384 +++--- .../system/controller/OrderLogController.java | 15 + .../controller/PayNotifyController.java | 1213 ++++++++++++----- .../controller/UsersPayBeforController.java | 329 +---- .../controller/WechatTransferController.java | 36 + .../controllerUtil/BenefitPointsUtil.java | 269 +++- .../system/controllerUtil/WechatPayUtil.java | 2 +- .../ruoyi/system/domain/WechatTransfer.java | 34 +- .../system/mapper/WechatTransferMapper.java | 5 + .../service/IWechatTransferService.java | 5 + .../impl/WechatTransferServiceImpl.java | 9 + .../mapper/system/WechatTransferMapper.xml | 18 + ruoyi-ui/src/api/system/OrderLog.js | 2 +- ruoyi-ui/src/api/system/transfer.js | 9 + .../system/GoodsOrder/AfterSaleDialog.vue | 34 +- .../system/GoodsOrder/PrePaymentDialog.vue | 3 + .../system/GoodsOrder/UnifiedRefundDialog.vue | 129 +- .../src/views/system/GoodsOrder/index.vue | 48 +- ruoyi-ui/src/views/system/Order/index.vue | 366 +++-- ruoyi-ui/src/views/system/transfer/index.vue | 103 +- 27 files changed, 2007 insertions(+), 1361 deletions(-) delete mode 100644 .history/ruoyi-ui/src/api/system/transfer_20250522100538.js delete mode 100644 .history/ruoyi-ui/src/api/system/transfer_20250522153157.js diff --git a/.history/ruoyi-ui/src/api/system/transfer_20250522100538.js b/.history/ruoyi-ui/src/api/system/transfer_20250522100538.js deleted file mode 100644 index d07bb15..0000000 --- a/.history/ruoyi-ui/src/api/system/transfer_20250522100538.js +++ /dev/null @@ -1,53 +0,0 @@ -import request from '@/utils/request' - -// 查询wechat_transfer列表 -export function listTransfer(query) { - return request({ - url: '/system/transfer/list', - method: 'get', - params: query - }) -} - -// 查询wechat_transfer详细 -export function getTransfer(id) { - return request({ - url: '/system/transfer/' + id, - method: 'get' - }) -} -// 查询wechat_transfer详细 -export function getUserDataList() { - return request({ - url: '/system/transfer/getUsersDataList', - method: 'get' - }) -} - - - -// 新增wechat_transfer -export function addTransfer(data) { - return request({ - url: '/system/transfer', - method: 'post', - data: data - }) -} - -// 修改wechat_transfer -export function updateTransfer(data) { - return request({ - url: '/system/transfer', - method: 'put', - data: data - }) -} - -// 删除wechat_transfer -export function delTransfer(id) { - return request({ - url: '/system/transfer/' + id, - method: 'delete' - }) -} diff --git a/.history/ruoyi-ui/src/api/system/transfer_20250522153157.js b/.history/ruoyi-ui/src/api/system/transfer_20250522153157.js deleted file mode 100644 index 6f926ca..0000000 --- a/.history/ruoyi-ui/src/api/system/transfer_20250522153157.js +++ /dev/null @@ -1,51 +0,0 @@ -import request from '@/utils/request' - -// 查询wechat_transfer列表 -export function listTransfer(query) { - return request({ - url: '/system/transfer/list', - method: 'get', - params: query - }) -} - -// 查询wechat_transfer详细 -export function getTransfer(id) { - return request({ - url: '/system/transfer/' + id, - method: 'get' - }) -} -getUserDataList () { - getUserDataList().then(response => { - this.userDataList = response.data - }) -}, - - - -// 新增wechat_transfer -export function addTransfer(data) { - return request({ - url: '/system/transfer', - method: 'post', - data: data - }) -} - -// 修改wechat_transfer -export function updateTransfer(data) { - return request({ - url: '/system/transfer', - method: 'put', - data: data - }) -} - -// 删除wechat_transfer -export function delTransfer(id) { - return request({ - url: '/system/transfer/' + id, - method: 'delete' - }) -} diff --git a/pom.xml b/pom.xml index b5f9922..1ef4b67 100644 --- a/pom.xml +++ b/pom.xml @@ -151,11 +151,26 @@ + + org.apache.poi + poi + ${poi.version} + org.apache.poi poi-ooxml ${poi.version} + + org.apache.poi + poi-scratchpad + ${poi.version} + + + org.apache.xmlbeans + xmlbeans + 3.1.0 + diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index e91e0e0..58b0338 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -60,18 +60,23 @@ org.apache.poi poi - 5.2.3 + 4.1.2 org.apache.poi poi-ooxml - 5.2.3 + 4.1.2 org.apache.poi - poi-ooxml-schemas + poi-scratchpad 4.1.2 + + org.apache.xmlbeans + xmlbeans + 3.1.0 + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/AppleOrderController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/AppleOrderController.java index c3e15b8..5e32772 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/AppleOrderController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/AppleOrderController.java @@ -4310,10 +4310,17 @@ public class AppleOrderController extends BaseController { if (goodsOrder.getStatus() != 3L) { return AppletControllerUtil.appletError("订单状态不正确,无法确认收货"); } - + int updateResult=0; + GoodsOrder goodsOrder1=new GoodsOrder(); + goodsOrder1.setMainOrderId(goodsOrder.getMainOrderId()); + List list=goodsOrderService.selectGoodsOrderList(goodsOrder1); + for (GoodsOrder goodsOrder2 : list) { + goodsOrder.setStatus(4L); + updateResult += goodsOrderService.updateGoodsOrder(goodsOrder); + } // 6. 更新订单状态为已收货 - goodsOrder.setStatus(4L); - int updateResult = goodsOrderService.updateGoodsOrder(goodsOrder); +// goodsOrder.setStatus(4L); +// int updateResult = goodsOrderService.updateGoodsOrder(goodsOrder); if (updateResult > 0) { // 7. 添加订单日志 @@ -4752,37 +4759,52 @@ public class AppleOrderController extends BaseController { // if (goodsOrder.getStatus() != 5L) { // return AppletControllerUtil.appletError("订单状态不正确,无法申请退货"); // } - + + + + + UsersPayBefor usersPayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(goodsOrder.getMainOrderId()); // 6. 验证退款金额不能超过支付金额 - BigDecimal payPrice = goodsOrder.getPayPrice() != null ? goodsOrder.getPayPrice() : BigDecimal.ZERO; + BigDecimal payPrice = usersPayBefor.getAllmoney() != null ? usersPayBefor.getAllmoney() : BigDecimal.ZERO; if (refundAmount.compareTo(payPrice) > 0) { return AppletControllerUtil.appletError("退款金额不能超过支付金额"); } - + //修改状态 + int updateResult=0; + GoodsOrder goodsOrder1=new GoodsOrder(); + goodsOrder1.setMainOrderId(usersPayBefor.getOrderid()); + List goodsOrders = goodsOrderService.selectGoodsOrderList(goodsOrder1); + for (GoodsOrder goodsOrder2 : goodsOrders) { + // 构建退货日志JSON数组 + JSONArray returnJsonArray = new JSONArray(); + JSONObject returnJsonObject = new JSONObject(); + // returnJsonObject.put("title", refundType == 1 ? "申请仅退款" : "申请退货退款"); + returnJsonObject.put("title", "申请退款"); + returnJsonObject.put("time",dateFormat.format(new Date())); + returnJsonObject.put("desc", 1); + returnJsonArray.add(returnJsonObject); + JSONObject returnJsonObject2 = new JSONObject(); + returnJsonObject2.put("title","退款中"); + returnJsonObject2.put("content","平台将在72小时为您处理,请耐心等待!"); + goodsOrder2.setReturntype(Long.valueOf(refundType)); + goodsOrder2.setReturnreason(refundReason); + goodsOrder2.setReturnfiledata(voucher); + goodsOrder2.setStatus(20L); // 设置为退货状态 + goodsOrder2.setReturntime(new Date()); + goodsOrder2.setReturnstatus(1L); + goodsOrder2.setReturnmoney(refundAmount); + goodsOrder2.setReturnshow(returnJsonObject2.toJSONString()); + goodsOrder2.setReturnjson(returnJsonArray.toJSONString()); + + // 8. 更新订单 + updateResult += goodsOrderService.updateGoodsOrder(goodsOrder2); + + } + + // 7. 更新订单退货信息 - goodsOrder.setReturntype(Long.valueOf(refundType)); - goodsOrder.setReturnreason(refundReason); - goodsOrder.setReturnfiledata(voucher); - goodsOrder.setStatus(20L); // 设置为退货状态 - goodsOrder.setReturntime(new Date()); - goodsOrder.setReturnstatus(1L); - goodsOrder.setReturnmoney(refundAmount); - // 构建退货日志JSON数组 - JSONArray returnJsonArray = new JSONArray(); - JSONObject returnJsonObject = new JSONObject(); - // returnJsonObject.put("title", refundType == 1 ? "申请仅退款" : "申请退货退款"); - returnJsonObject.put("title", "申请退款"); - returnJsonObject.put("time",dateFormat.format(new Date())); - returnJsonObject.put("desc", 1); - returnJsonArray.add(returnJsonObject); - JSONObject returnJsonObject2 = new JSONObject(); - returnJsonObject2.put("title","退款中"); - returnJsonObject2.put("content","平台将在72小时为您处理,请耐心等待!"); - goodsOrder.setReturnshow(returnJsonObject2.toJSONString()); - goodsOrder.setReturnjson(returnJsonArray.toJSONString()); - - // 8. 更新订单 - int updateResult = goodsOrderService.updateGoodsOrder(goodsOrder); + + if (updateResult > 0) { // 9. 添加订单日志 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/ApplePayController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/ApplePayController.java index b8f2609..a95876c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/ApplePayController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/ApplePayController.java @@ -1171,11 +1171,20 @@ public class ApplePayController extends BaseController { // 微信支付 if (wxMoney.compareTo(BigDecimal.ZERO) <= 0) { // 金额为0,直接走后续逻辑 - payBefor.setStatus(2L); // 已支付 - payBefor.setPaytime(new Date()); - usersPayBeforService.updateUsersPayBefor(payBefor); +// payBefor.setStatus(2L); // 已支付 +// payBefor.setPaytime(new Date()); +// usersPayBeforService.updateUsersPayBefor(payBefor); //扣减消费金服务金 - BenefitPointsUtil.deductServiceAndConsumption(payBefor.getOid(), user, payBefor.getServicemoney(), payBefor.getShopmoney()); + int flg= BenefitPointsUtil.creatServerOrderData(payBefor); + if (flg==0){ + UsersPayBefor newpayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(orderNo); + if (newpayBefor!=null){ + // 创建订单 + newpayBefor.setStatus(2L); + usersPayBeforService.updateUsersPayBefor(newpayBefor); + } + } + //BenefitPointsUtil.deductServiceAndConsumption(payBefor.getOid(), user, payBefor.getServicemoney(), payBefor.getShopmoney()); //回调方法用来处理订单相关数据 OrderUtil.prepayCallback(payBefor, user); payResult.put("istowx", 1); @@ -1199,11 +1208,20 @@ public class ApplePayController extends BaseController { // 余额支付 if (yeMoney.compareTo(BigDecimal.ZERO) <= 0) { // 金额为0,直接走后续逻辑 - payBefor.setStatus(2L); // 已支付 - payBefor.setPaytime(new Date()); - usersPayBeforService.updateUsersPayBefor(payBefor); +// payBefor.setStatus(2L); // 已支付 +// payBefor.setPaytime(new Date()); +// usersPayBeforService.updateUsersPayBefor(payBefor); //扣减消费金服务金 - BenefitPointsUtil.deductServiceAndConsumption(payBefor.getOid(), user, payBefor.getServicemoney(), payBefor.getShopmoney()); + // BenefitPointsUtil.deductServiceAndConsumption(payBefor.getOid(), user, payBefor.getServicemoney(), payBefor.getShopmoney()); + int flg= BenefitPointsUtil.creatServerOrderData(payBefor); + if (flg==0){ + UsersPayBefor newpayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(orderNo); + if (newpayBefor!=null){ + // 创建订单 + newpayBefor.setStatus(2L); + usersPayBeforService.updateUsersPayBefor(newpayBefor); + } + } //回调方法用来处理订单相关数据 OrderUtil.prepayCallback(payBefor, user); @@ -1219,12 +1237,21 @@ public class ApplePayController extends BaseController { ); if (balanceResult != null && Boolean.TRUE.equals(balanceResult.get("success"))) { // 更新预支付记录状态 - payBefor.setStatus(2L); // 已支付 - payBefor.setPaytime(new Date()); - usersPayBeforService.updateUsersPayBefor(payBefor); +// payBefor.setStatus(2L); // 已支付 +// payBefor.setPaytime(new Date()); +// usersPayBeforService.updateUsersPayBefor(payBefor); OrderUtil.prepayCallback(payBefor, user); //扣减消费金服务金 - BenefitPointsUtil.deductServiceAndConsumption(payBefor.getOid(), user, payBefor.getServicemoney(), payBefor.getShopmoney()); + int flg= BenefitPointsUtil.creatServerOrderData(payBefor); + if (flg==0){ + UsersPayBefor newpayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(orderNo); + if (newpayBefor!=null){ + // 创建订单 + newpayBefor.setStatus(2L); + usersPayBeforService.updateUsersPayBefor(newpayBefor); + } + } + //BenefitPointsUtil.deductServiceAndConsumption(payBefor.getOid(), user, payBefor.getServicemoney(), payBefor.getShopmoney()); //IntegralAndBenefitUtil.processIntegralAndBenefit(payBefor.getAllmoney(), payBefor.getOrderid(), user.getId(), payBefor.getId()); // IntegralAndBenefitUtil.paymentPostProcess(payBefor, user.getId()); payResult.put("istowx", 2); @@ -1242,8 +1269,17 @@ public class ApplePayController extends BaseController { usersPayBeforService.updateUsersPayBefor(payBefor); OrderUtil.prepayCallback(payBefor, user); //扣减消费金服务金 - BenefitPointsUtil.deductServiceAndConsumption(payBefor.getOid(), user, payBefor.getServicemoney(), payBefor.getShopmoney()); + // BenefitPointsUtil.deductServiceAndConsumption(payBefor.getOid(), user, payBefor.getServicemoney(), payBefor.getShopmoney()); // IntegralAndBenefitUtil.paymentPostProcess(payBefor, user.getId()); + int flg= BenefitPointsUtil.creatServerOrderData(payBefor); + if (flg==0){ + UsersPayBefor newpayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(orderNo); + if (newpayBefor!=null){ + // 创建订单 + newpayBefor.setStatus(2L); + usersPayBeforService.updateUsersPayBefor(newpayBefor); + } + } payResult.put("istowx", 1); return AppletControllerUtil.appletSuccess("支付成功"); } @@ -1276,7 +1312,16 @@ public class ApplePayController extends BaseController { usersPayBeforService.updateUsersPayBefor(payBefor); OrderUtil.prepayCallback(payBefor, user); //扣减消费金服务金 - BenefitPointsUtil.deductServiceAndConsumption(payBefor.getOid(), user, payBefor.getServicemoney(), payBefor.getShopmoney()); + int flg= BenefitPointsUtil.creatServerOrderData(payBefor); + if (flg==0){ + UsersPayBefor newpayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(orderNo); + if (newpayBefor!=null){ + // 创建订单 + newpayBefor.setStatus(2L); + usersPayBeforService.updateUsersPayBefor(newpayBefor); + } + } + //BenefitPointsUtil.deductServiceAndConsumption(payBefor.getOid(), user, payBefor.getServicemoney(), payBefor.getShopmoney()); // IntegralAndBenefitUtil.processIntegralAndBenefit(payBefor.getAllmoney(), payBefor.getOrderid(), user.getId(), payBefor.getId()); // IntegralAndBenefitUtil.paymentPostProcess(payBefor, user.getId()); payResult.put("istowx", 2); @@ -1500,17 +1545,7 @@ public class ApplePayController extends BaseController { if (useCard == null) { return AppletControllerUtil.appletWarning("次卡使用记录不存在"); } - -// // 4. 验证权限(只能退款自己的次卡) -// if (!useCard.getUid().equals(user.getId())) { -// return AppletControllerUtil.appletWarning("无权操作该次卡记录"); -// } - -// // 5. 验证退款状态 -// if (useCard.getStatus() == null || useCard.getStatus() != 2L) { -// return AppletControllerUtil.appletWarning("该次卡记录状态不允许退款,只有已支付的次卡才能退款"); -// } - + // 6. 验证是否已有退款记录 if (useCard.getStatus() == 3L) { return AppletControllerUtil.appletWarning("该次卡已申请退款,请勿重复操作"); @@ -1521,43 +1556,17 @@ public class ApplePayController extends BaseController { 1, 1, "次卡退款", - WechatPayUtil.PAY_FH + "/api/secondary/card/refund/notify" + WechatPayUtil.PAY_FH + "/api/worker/cika/notify" ); - // 7. 调用微信退款接口 -// Map refundResult = wechatPayV3Util.refund( -// useCard.getOrderid(), // 原订单号 -// useCard.getPaymoney(), // 退款金额 -// "次卡退款" // 退款原因 -// ); - // 8. 处理退款结果 if (refundResult != null && Boolean.TRUE.equals(refundResult.get("success"))) { - // 9. 更新次卡使用记录状态为退款状态 - 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) { - Map responseData = new HashMap<>(); - responseData.put("orderid", useCard.getOrderid()); - responseData.put("refundAmount", useCard.getPaymoney()); - responseData.put("refundTime", new Date()); - responseData.put("message", "退款申请成功"); - logger.info("次卡退款成功 - 用户ID: {}, 次卡使用记录ID: {}, 退款金额: {}", user.getId(), useCardId, useCard.getPaymoney()); - return AppletControllerUtil.appletSuccess(responseData); + return AppletControllerUtil.appletSuccess("操作成功"); } else { return AppletControllerUtil.appletWarning("退款状态更新失败"); } - } else { - String errorMsg = refundResult != null ? (String) refundResult.get("message") : "微信退款失败"; - logger.error("次卡退款失败 - 用户ID: {}, 次卡使用记录ID: {}, 错误信息: {}", - user.getId(), useCardId, errorMsg); - return AppletControllerUtil.appletWarning("退款申请失败:" + errorMsg); - } - } catch (Exception e) { logger.error("次卡退款异常 - 用户ID: {}, 参数: {}, 异常: {}", request.getHeader("token"), params, e.getMessage()); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/AppletController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/AppletController.java index c596007..650863f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/AppletController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/AppletController.java @@ -4056,15 +4056,11 @@ public class AppletController extends BaseController { } } -// // 5. 验证订单状态是否可以取消 -// if (order.getStatus() != 1L) { -// return AppletControllerUtil.appletWarning("当前订单状态不可取消"); -// } - // 6. 更新订单状态为已取消(5) Order updateOrder = new Order(); updateOrder.setId(orderId); - + //设置订单支付的金额为0,防止开票 + updateOrder.setPayPrice(new BigDecimal(0)); updateOrder.setStatus(5L); int result = orderService.updateOrder(updateOrder); if (result > 0) { @@ -4088,14 +4084,20 @@ public class AppletController extends BaseController { //如果有支付信息就要进行退款 System.out.println("=== 开始退款处理,订单号: " + order.getOrderId() + " ==="); if (usersPayBefor != null) { - //退回其他对应支付时产生的金额和积分 - BenefitPointsUtil.refundServiceAndConsumption(order.getId(), user, usersPayBefor.getServicemoney(),usersPayBefor.getShopmoney()); - System.out.println("=== 开始退款处理,2222222222订单号: " + usersPayBefor.getStatus() + " ==="); - // if (usersPayBefor.getStatus() == 2){ - System.out.println("=== 开始退款处理,2222222222订单号: " + order.getOrderId() + " ==="); - refundUtil.refundOrder(order.getOrderId()); - // } + int flg= BenefitPointsUtil.refundServerOrderData(usersPayBefor); + if(flg==0){ + UsersPayBefor newusersPayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(order.getOrderId()); + //退款里面金额退款结束,就开始回滚订单状态,添加日志 + newusersPayBefor.setStatus(3L); // 设置为已退款状态 + usersPayBeforService.updateUsersPayBefor(newusersPayBefor); + } + // BenefitPointsUtil.refundServiceAndConsumption(order.getId(), user, usersPayBefor.getServicemoney(),usersPayBefor.getShopmoney()); +// System.out.println("=== 开始退款处理,2222222222订单号: " + usersPayBefor.getStatus() + " ==="); +// // if (usersPayBefor.getStatus() == 2){ +// System.out.println("=== 开始退款处理,2222222222订单号: " + order.getOrderId() + " ==="); + // refundUtil.refundOrder(order.getOrderId()); +// // } } return AppletControllerUtil.appletSuccess("取消成功"); @@ -7527,7 +7529,7 @@ public class AppletController extends BaseController { System.out.println("快速提现成功"+result); WechatTransfer wechatTransfer = new WechatTransfer(); wechatTransfer.setUid(user.getId()); - wechatTransfer.setMoney(moneyBigDecimal); + wechatTransfer.setMoney(moneyBigDecimal);// wechatTransfer.setUname(user.getName()); wechatTransfer.setOrderId(orderId); wechatTransfer.setStatus(1L); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/GoodsOrderController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/GoodsOrderController.java index 42813fb..aeaec02 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/GoodsOrderController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/GoodsOrderController.java @@ -31,36 +31,39 @@ import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; + import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 商品订单Controller - * + * * @author ruoyi * @date 2025-05-13 */ @RestController @RequestMapping("/system/GoodsOrder") -public class GoodsOrderController extends BaseController -{ +public class GoodsOrderController extends BaseController { private static final Logger log = LoggerFactory.getLogger(GoodsOrderController.class); - + @Autowired private IGoodsOrderService goodsOrderService; @Autowired private IServiceGoodsService serviceGoodsService; @Autowired - private IUsersService usersService; + private IUsersService usersService; @Autowired private IUserAddressService userAddressService; @Autowired private ISiteDeliveryService siteDeliveryService; + @Autowired + private IUsersPayBeforService usersPayBeforService; /** @@ -68,26 +71,30 @@ public class GoodsOrderController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:GoodsOrder:list')") @GetMapping("/list") - public TableDataInfo list(GoodsOrder goodsOrder) - { + public TableDataInfo list(GoodsOrder goodsOrder) { startPage(); List list = goodsOrderService.selectGoodsOrdergrouBymAIDList(goodsOrder); - for(GoodsOrder goodsOrderdata:list){ + for (GoodsOrder goodsOrderdata : list) { goodsOrderdata.setOrderId(goodsOrderdata.getMainOrderId()); - ServiceGoods serviceGoods=serviceGoodsService.selectServiceGoodsById(goodsOrderdata.getProductId()); - if(serviceGoods!=null){ + ServiceGoods serviceGoods = serviceGoodsService.selectServiceGoodsById(goodsOrderdata.getProductId()); + if (serviceGoods != null) { goodsOrderdata.setProductName(serviceGoods.getTitle()); } - if(goodsOrderdata.getAddressId()!=null){ - UserAddress userAddress=userAddressService.selectUserAddressById(goodsOrderdata.getAddressId()); - if (userAddress != null){ - goodsOrderdata.setLatitude(userAddress.getLatitude()); - goodsOrderdata.setLongitude(userAddress.getLongitude()); - goodsOrderdata.setAdressinfo(userAddress.getAddressInfo()+userAddress.getInfo()); - } -} - Users users=usersService.selectUsersById(goodsOrderdata.getUid()); - if(users !=null){ + UsersPayBefor usersPayBefor = usersPayBeforService.selectUsersPayBeforByOrderId(goodsOrderdata.getMainOrderId()); + if (usersPayBefor != null) { + goodsOrderdata.setTotalPrice(usersPayBefor.getAllmoney()); + goodsOrderdata.setPayPrice(usersPayBefor.getAllmoney().subtract(usersPayBefor.getReturnmoney())); + } + if (goodsOrderdata.getAddressId() != null) { + UserAddress userAddress = userAddressService.selectUserAddressById(goodsOrderdata.getAddressId()); + if (userAddress != null) { + goodsOrderdata.setLatitude(userAddress.getLatitude()); + goodsOrderdata.setLongitude(userAddress.getLongitude()); + goodsOrderdata.setAdressinfo(userAddress.getAddressInfo() + userAddress.getInfo()); + } + } + Users users = usersService.selectUsersById(goodsOrderdata.getUid()); + if (users != null) { goodsOrderdata.setUname(users.getName()); goodsOrderdata.setUphone(users.getPhone()); } @@ -96,13 +103,14 @@ public class GoodsOrderController extends BaseController } return getDataTable(list); } + @GetMapping("/getByMainOrderId/{mainOrderId}") public AjaxResult getGoodsOrderByMainOrderId(@PathVariable String mainOrderId) { try { GoodsOrder goodsOrderdata = new GoodsOrder(); goodsOrderdata.setMainOrderId(mainOrderId); List orders = goodsOrderService.selectGoodsOrderList(goodsOrderdata); - + // 为每个订单补充商品详细信息 for (GoodsOrder order : orders) { if (order.getProductId() != null) { @@ -122,14 +130,14 @@ public class GoodsOrderController extends BaseController } } } - + return AjaxResult.success(orders); } catch (Exception e) { log.error("获取主订单数据失败,主订单ID: {}, 错误: {}", mainOrderId, e.getMessage()); return AjaxResult.error("获取主订单数据失败: " + e.getMessage()); } } - + /** * 根据商品ID获取商品详细信息 */ @@ -139,19 +147,19 @@ public class GoodsOrderController extends BaseController if (productId == null) { return AjaxResult.error("商品ID不能为空"); } - + ServiceGoods serviceGoods = serviceGoodsService.selectServiceGoodsById(productId); if (serviceGoods == null) { return AjaxResult.error("未找到商品信息"); } - + return AjaxResult.success(serviceGoods); } catch (Exception e) { log.error("获取商品信息失败,商品ID: {}, 错误: {}", productId, e.getMessage()); return AjaxResult.error("获取商品信息失败: " + e.getMessage()); } } - + /** * 批量获取商品信息 */ @@ -161,7 +169,7 @@ public class GoodsOrderController extends BaseController if (productIds == null || productIds.isEmpty()) { return AjaxResult.error("商品ID列表不能为空"); } - + Map productMap = new HashMap<>(); for (Long productId : productIds) { try { @@ -173,7 +181,7 @@ public class GoodsOrderController extends BaseController log.warn("获取商品信息失败,商品ID: {}, 错误: {}", productId, e.getMessage()); } } - + return AjaxResult.success(productMap); } catch (Exception e) { log.error("批量获取商品信息失败,错误: {}", e.getMessage()); @@ -187,8 +195,7 @@ public class GoodsOrderController extends BaseController @PreAuthorize("@ss.hasPermi('system:GoodsOrder:export')") @Log(title = "商品订单", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(HttpServletResponse response, GoodsOrder goodsOrder) - { + public void export(HttpServletResponse response, GoodsOrder goodsOrder) { List list = goodsOrderService.selectGoodsOrderList(goodsOrder); ExcelUtil util = new ExcelUtil(GoodsOrder.class); util.exportExcel(response, list, "商品订单数据"); @@ -199,26 +206,25 @@ public class GoodsOrderController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:GoodsOrder:query')") @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") Long id) - { - GoodsOrder goodsOrderdata =goodsOrderService.selectGoodsOrderById(id); - if(goodsOrderdata.getAddressId()!=null){ - UserAddress userAddress=userAddressService.selectUserAddressById(goodsOrderdata.getAddressId()); - if (userAddress != null){ + public AjaxResult getInfo(@PathVariable("id") Long id) { + GoodsOrder goodsOrderdata = goodsOrderService.selectGoodsOrderById(id); + if (goodsOrderdata.getAddressId() != null) { + UserAddress userAddress = userAddressService.selectUserAddressById(goodsOrderdata.getAddressId()); + if (userAddress != null) { goodsOrderdata.setLatitude(userAddress.getLatitude()); goodsOrderdata.setLongitude(userAddress.getLongitude()); - goodsOrderdata.setAdressinfo(userAddress.getAddressInfo()+userAddress.getInfo()); + goodsOrderdata.setAdressinfo(userAddress.getAddressInfo() + userAddress.getInfo()); } //ISiteDeliveryService siteDeliveryService; - if (goodsOrderdata.getDeliveryId()!=null){ - SiteDelivery siteDelivery=siteDeliveryService.selectSiteDeliveryById(goodsOrderdata.getDeliveryId()); - if(siteDelivery!=null){ + if (goodsOrderdata.getDeliveryId() != null) { + SiteDelivery siteDelivery = siteDeliveryService.selectSiteDeliveryById(goodsOrderdata.getDeliveryId()); + if (siteDelivery != null) { goodsOrderdata.setDeliveryName(siteDelivery.getTitle()); } } - Users users=usersService.selectUsersById(goodsOrderdata.getUid()); - if(users !=null){ + Users users = usersService.selectUsersById(goodsOrderdata.getUid()); + if (users != null) { goodsOrderdata.setUname(users.getName()); goodsOrderdata.setUphone(users.getPhone()); } @@ -233,11 +239,10 @@ public class GoodsOrderController extends BaseController @PreAuthorize("@ss.hasPermi('system:GoodsOrder:add')") @Log(title = "商品订单", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody GoodsOrder goodsOrder) - { - if (goodsOrder.getAddressId()!=null){ - UserAddress userAddress=userAddressService.selectUserAddressById(goodsOrder.getAddressId()); - if (userAddress!=null){ + public AjaxResult add(@RequestBody GoodsOrder goodsOrder) { + if (goodsOrder.getAddressId() != null) { + UserAddress userAddress = userAddressService.selectUserAddressById(goodsOrder.getAddressId()); + if (userAddress != null) { goodsOrder.setName(userAddress.getName()); goodsOrder.setPhone(userAddress.getPhone()); @@ -245,16 +250,16 @@ public class GoodsOrderController extends BaseController } } - if (goodsOrder.getProductId()!=null){ - ServiceGoods serviceGoods=serviceGoodsService.selectServiceGoodsById(goodsOrder.getProductId()); - if (serviceGoods!=null){ + if (goodsOrder.getProductId() != null) { + ServiceGoods serviceGoods = serviceGoodsService.selectServiceGoodsById(goodsOrder.getProductId()); + if (serviceGoods != null) { - goodsOrder.setGoodPrice(serviceGoods.getPrice()); - } - } + goodsOrder.setGoodPrice(serviceGoods.getPrice()); + } + } return toAjax(goodsOrderService.insertGoodsOrder(goodsOrder)); - } + } /** * 修改商品订单 @@ -262,16 +267,15 @@ public class GoodsOrderController extends BaseController @PreAuthorize("@ss.hasPermi('system:GoodsOrder:edit')") @Log(title = "商品订单", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody GoodsOrder goodsOrder) - { - GoodsOrder goodsOrderdata=goodsOrderService.selectGoodsOrderById(goodsOrder.getId()); - if (goodsOrderdata.getStatus()==2L&&goodsOrder.getStatus()==3L){ - SiteDelivery siteDelivery=siteDeliveryService.selectSiteDeliveryById(goodsOrder.getDeliveryId()); - if (siteDelivery!=null){ - JSONObject jsonObject= new JSONObject(); - jsonObject.put("wlgs",siteDelivery.getTitle()); - jsonObject.put("wldh",goodsOrder.getDeliveryNum()); - OrderUtil.addgoodsorderlog(goodsOrder.getId(),goodsOrder.getOrderId(),"订单已发货","2",jsonObject,2L); + public AjaxResult edit(@RequestBody GoodsOrder goodsOrder) { + GoodsOrder goodsOrderdata = goodsOrderService.selectGoodsOrderById(goodsOrder.getId()); + if (goodsOrderdata.getStatus() == 2L && goodsOrder.getStatus() == 3L) { + SiteDelivery siteDelivery = siteDeliveryService.selectSiteDeliveryById(goodsOrder.getDeliveryId()); + if (siteDelivery != null) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("wlgs", siteDelivery.getTitle()); + jsonObject.put("wldh", goodsOrder.getDeliveryNum()); + OrderUtil.addgoodsorderlog(goodsOrder.getId(), goodsOrder.getOrderId(), "订单已发货", "2", jsonObject, 2L); } } @@ -283,9 +287,8 @@ public class GoodsOrderController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:GoodsOrder:remove')") @Log(title = "商品订单", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable Long[] ids) - { + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(goodsOrderService.deleteGoodsOrderByIds(ids)); } @@ -295,17 +298,16 @@ public class GoodsOrderController extends BaseController @PreAuthorize("@ss.hasPermi('system:GoodsOrder:edit')") @Log(title = "售后申请处理", businessType = BusinessType.UPDATE) @PostMapping("/processAfterSale") - public AjaxResult processAfterSale(@RequestBody JSONObject params) - { + public AjaxResult processAfterSale(@RequestBody JSONObject params) { try { java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Long id = params.getLong("id"); String action = params.getString("action"); - + if (id == null || action == null) { return error("参数错误"); } - + GoodsOrder goodsOrder = goodsOrderService.selectGoodsOrderById(id); if (goodsOrder == null) { return error("订单不存在"); @@ -315,11 +317,11 @@ public class GoodsOrderController extends BaseController reamk = "无"; } // 检查当前状态是否为申请状态或平台收货状态 - if (goodsOrder.getReturnstatus() == null || - (goodsOrder.getReturnstatus() != 1 && goodsOrder.getReturnstatus() != 4)) { + if (goodsOrder.getReturnstatus() == null || + (goodsOrder.getReturnstatus() != 1 && goodsOrder.getReturnstatus() != 4)) { return error("当前订单状态不允许此操作"); } - + JSONArray returnLogistics = null; if (goodsOrder.getReturnjson() != null && !goodsOrder.getReturnjson().isEmpty()) { try { @@ -340,13 +342,13 @@ public class GoodsOrderController extends BaseController String logMessage = ""; String content = ""; Long newStatus = null; - + if ("reject".equals(action)) { // 驳回申请 newStatus = 6L; logMessage = "拒绝退款"; - returnJsonObject2.put("title","拒绝退款"); - returnJsonObject2.put("content","拒绝原因"+reamk); + returnJsonObject2.put("title", "拒绝退款"); + returnJsonObject2.put("content", "拒绝原因" + reamk); } else if ("approve".equals(action)) { // 同意申请 if (goodsOrder.getReturntype() != null) { @@ -354,15 +356,15 @@ public class GoodsOrderController extends BaseController // 仅退款 newStatus = 2L; logMessage = "同意退款"; - content="商家已同意申请,72小时内完成您的退款操作"; - returnJsonObject2.put("title","退款成功"); - returnJsonObject2.put("content","平台以退款"+reamk); + content = "商家已同意申请,72小时内完成您的退款操作"; + returnJsonObject2.put("title", "退款成功"); + returnJsonObject2.put("content", "平台以退款" + reamk); } else if (goodsOrder.getReturntype() == 2) { // 退货退款 newStatus = 3L; logMessage = "商品寄回"; - returnJsonObject2.put("title","请寄回物品"); - returnJsonObject2.put("content","平台将在收到货物72小时为您处理,请耐心等待!"); + returnJsonObject2.put("title", "请寄回物品"); + returnJsonObject2.put("content", "平台将在收到货物72小时为您处理,请耐心等待!"); } else { return error("售后类型错误"); } @@ -376,44 +378,44 @@ public class GoodsOrderController extends BaseController } newStatus = 6L; logMessage = "驳回退款"; - returnJsonObject2.put("title","拒绝退款"); - returnJsonObject2.put("content","拒绝原因"+reamk); + returnJsonObject2.put("title", "拒绝退款"); + returnJsonObject2.put("content", "拒绝原因" + reamk); } else if ("approve_refund".equals(action)) { // 同意退款(平台收货后) if (goodsOrder.getReturnstatus() != 4) { return error("当前状态不允许此操作"); } - + // 获取退款金额和备注 String refundAmountStr = params.getString("returnrealmoney"); String refundRemark = params.getString("refundRemark"); - + if (refundAmountStr == null || refundAmountStr.trim().isEmpty()) { return error("退款金额不能为空"); } - + try { BigDecimal refundAmount = new BigDecimal(refundAmountStr); BigDecimal orderAmount = goodsOrder.getPayPrice(); - + if (refundAmount.compareTo(orderAmount) > 0) { return error("退款金额不能超过订单金额"); } - + // 设置退款金额 goodsOrder.setReturnmoney(refundAmount); - + // 构建退款内容 String refundContent = "退款金额:¥" + refundAmount; if (refundRemark != null && !refundRemark.trim().isEmpty()) { refundContent += ",备注:" + refundRemark; } - + newStatus = 5L; logMessage = "同意退款"; - returnJsonObject2.put("title","退款成功"); + returnJsonObject2.put("title", "退款成功"); returnJsonObject2.put("content", refundContent); - + } catch (NumberFormatException e) { return error("退款金额格式错误"); } @@ -423,7 +425,7 @@ public class GoodsOrderController extends BaseController returnLogisticsData.put("title", logMessage); returnLogistics.add(returnLogisticsData); goodsOrder.setReturnjson(returnLogistics.toJSONString()); - + // 如果是同意退款,设置退款完成时间 if ("approve_refund".equals(action)) { goodsOrder.setReturnfinshtime(new Date()); @@ -432,23 +434,23 @@ public class GoodsOrderController extends BaseController // 更新订单状态 goodsOrder.setReturnstatus(newStatus); int result = goodsOrderService.updateGoodsOrder(goodsOrder); - + if (result > 0) { // 添加操作日志 OrderUtil.addgoodsorderlog( - goodsOrder.getId(), - goodsOrder.getOrderId(), - logMessage, - "3", - new JSONObject(), - 2L + goodsOrder.getId(), + goodsOrder.getOrderId(), + logMessage, + "3", + new JSONObject(), + 2L ); - + return success("操作成功"); } else { return error("操作失败"); } - + } catch (Exception e) { log.error("处理售后申请失败", e); return error("操作失败:" + e.getMessage()); @@ -461,20 +463,19 @@ public class GoodsOrderController extends BaseController @PreAuthorize("@ss.hasPermi('system:GoodsOrder:edit')") @Log(title = "订单发货", businessType = BusinessType.UPDATE) @PostMapping("/shipOrder") - public AjaxResult shipOrder(@RequestBody GoodsOrder goodsOrder) - { + public AjaxResult shipOrder(@RequestBody GoodsOrder goodsOrder) { try { // 验证订单是否存在 GoodsOrder existingOrder = goodsOrderService.selectGoodsOrderById(goodsOrder.getId()); if (existingOrder == null) { return error("订单不存在"); } - + // 验证订单状态是否为已支付待发货 if (existingOrder.getStatus() != 2L) { return error("只有已支付待发货的订单才能发货"); } - + // 验证必填字段 if (goodsOrder.getDeliveryId() == null) { return error("请选择快递公司"); @@ -485,13 +486,13 @@ public class GoodsOrderController extends BaseController if (goodsOrder.getSendTime() == null) { return error("请选择发货时间"); } - + // 获取快递公司信息 SiteDelivery siteDelivery = siteDeliveryService.selectSiteDeliveryById(goodsOrder.getDeliveryId()); if (siteDelivery == null) { return error("快递公司不存在"); } - + // // 更新订单信息 // existingOrder.setDeliveryId(goodsOrder.getDeliveryId()); // existingOrder.setDeliveryNum(goodsOrder.getDeliveryNum()); @@ -510,30 +511,30 @@ public class GoodsOrderController extends BaseController goodsOrderdata.setSendTime(goodsOrder.getSendTime()); goodsOrderdata.setMark(goodsOrder.getMark()); goodsOrderdata.setStatus(3L); // 设置为已发货状态 - count+= goodsOrderService.updateGoodsOrder(goodsOrderdata); + count += goodsOrderService.updateGoodsOrder(goodsOrderdata); } // 更新订单 - + if (count > 0) { // 添加发货日志 JSONObject logData = new JSONObject(); logData.put("wlgs", siteDelivery.getTitle()); logData.put("wldh", goodsOrder.getDeliveryNum()); OrderUtil.addgoodsorderlog( - existingOrder.getId(), - existingOrder.getMainOrderId(), - "订单已发货", - "2", - logData, - 2L + existingOrder.getId(), + existingOrder.getMainOrderId(), + "订单已发货", + "2", + logData, + 2L ); - + return success("发货成功"); } else { return error("发货失败"); } - + } catch (Exception e) { log.error("订单发货失败", e); return error("发货失败:" + e.getMessage()); @@ -546,48 +547,47 @@ public class GoodsOrderController extends BaseController @PreAuthorize("@ss.hasPermi('system:GoodsOrder:edit')") @Log(title = "Excel导入批量发货", businessType = BusinessType.UPDATE) @PostMapping("/batchShipByExcel") - public AjaxResult batchShipByExcel(@RequestParam("file") MultipartFile file) - { + public AjaxResult batchShipByExcel(@RequestParam("file") MultipartFile file) { try { if (file.isEmpty()) { return error("请选择要上传的Excel文件"); } - + String fileName = file.getOriginalFilename(); if (!fileName.endsWith(".xlsx") && !fileName.endsWith(".xls")) { return error("请上传Excel格式的文件(.xlsx或.xls)"); } - + // 读取Excel文件 List> excelData = readExcelFile(file); if (excelData == null || excelData.isEmpty()) { return error("Excel文件内容为空或格式错误"); } - + // 验证Excel数据格式 String validationResult = validateExcelData(excelData); if (!"success".equals(validationResult)) { return error("Excel数据格式错误:" + validationResult); } - + // 执行批量发货 Map result = executeBatchShipping(excelData); - + // 返回详细的结果信息 return AjaxResult.success("批量发货完成", result); - + } catch (Exception e) { log.error("Excel导入批量发货失败", e); return error("批量发货失败:" + e.getMessage()); } } - + /** * 读取Excel文件内容 */ private List> readExcelFile(MultipartFile file) throws Exception { List> dataList = new ArrayList<>(); - + try (InputStream is = file.getInputStream()) { Workbook workbook; if (file.getOriginalFilename().endsWith(".xlsx")) { @@ -595,55 +595,55 @@ public class GoodsOrderController extends BaseController } else { workbook = WorkbookFactory.create(is); } - + Sheet sheet = workbook.getSheetAt(0); if (sheet == null) { return dataList; } - + // 跳过标题行,从第二行开始读取数据 for (int i = 1; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); if (row == null) continue; - + Map rowData = new HashMap<>(); - + // 读取订单号 Cell orderIdCell = row.getCell(0); if (orderIdCell != null) { rowData.put("orderId", getCellValue(orderIdCell)); } - + // 读取快递公司 Cell deliveryCompanyCell = row.getCell(1); if (deliveryCompanyCell != null) { rowData.put("deliveryCompany", getCellValue(deliveryCompanyCell)); } - + // 读取快递单号 Cell deliveryNumCell = row.getCell(2); if (deliveryNumCell != null) { rowData.put("deliveryNum", getCellValue(deliveryNumCell)); } - + // 读取发货时间 Cell sendTimeCell = row.getCell(3); if (sendTimeCell != null) { rowData.put("sendTime", getCellValue(sendTimeCell)); } - + // 只添加有订单号的行 if (rowData.get("orderId") != null && !rowData.get("orderId").toString().trim().isEmpty()) { dataList.add(rowData); } } - + workbook.close(); } - + return dataList; } - + /** * 获取单元格值 */ @@ -651,7 +651,7 @@ public class GoodsOrderController extends BaseController if (cell == null) { return ""; } - + switch (cell.getCellType()) { case STRING: return cell.getStringCellValue(); @@ -670,7 +670,7 @@ public class GoodsOrderController extends BaseController return ""; } } - + /** * 验证Excel数据格式 */ @@ -678,35 +678,35 @@ public class GoodsOrderController extends BaseController if (excelData == null || excelData.isEmpty()) { return "Excel数据为空"; } - + for (int i = 0; i < excelData.size(); i++) { Map row = excelData.get(i); int rowNum = i + 2; // Excel行号(从2开始,因为第1行是标题) - + // 验证订单号 Object orderId = row.get("orderId"); if (orderId == null || orderId.toString().trim().isEmpty()) { return "第" + rowNum + "行:订单号不能为空"; } - + // 验证快递公司 Object deliveryCompany = row.get("deliveryCompany"); if (deliveryCompany == null || deliveryCompany.toString().trim().isEmpty()) { return "第" + rowNum + "行:快递公司不能为空"; } - + // 验证快递单号 Object deliveryNum = row.get("deliveryNum"); if (deliveryNum == null || deliveryNum.toString().trim().isEmpty()) { return "第" + rowNum + "行:快递单号不能为空"; } - + // 验证发货时间 Object sendTime = row.get("sendTime"); if (sendTime == null || sendTime.toString().trim().isEmpty()) { return "第" + rowNum + "行:发货时间不能为空"; } - + // 验证发货时间格式 try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); @@ -715,10 +715,10 @@ public class GoodsOrderController extends BaseController return "第" + rowNum + "行:发货时间格式错误,请使用yyyy-MM-dd格式"; } } - + return "success"; } - + /** * 执行批量发货 */ @@ -727,41 +727,41 @@ public class GoodsOrderController extends BaseController List successList = new ArrayList<>(); List failList = new ArrayList<>(); List skipList = new ArrayList<>(); - + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - + for (Map row : excelData) { String orderId = row.get("orderId").toString().trim(); String deliveryCompany = row.get("deliveryCompany").toString().trim(); String deliveryNum = row.get("deliveryNum").toString().trim(); String sendTimeStr = row.get("sendTime").toString().trim(); - + try { // 根据订单号查询订单 GoodsOrder queryOrder = new GoodsOrder(); queryOrder.setOrderId(orderId); List orders = goodsOrderService.selectGoodsOrderList(queryOrder); - + if (orders == null || orders.isEmpty()) { failList.add(orderId + ":订单不存在"); continue; } - + GoodsOrder order = orders.get(0); - + // 检查订单状态 if (order.getStatus() != 2L) { skipList.add(orderId + ":订单状态不是待发货状态(当前状态:" + order.getStatus() + ")"); continue; } - + // 根据快递公司名称查找快递公司ID Long deliveryId = findDeliveryIdByName(deliveryCompany); if (deliveryId == null) { failList.add(orderId + ":快递公司'" + deliveryCompany + "'不存在"); continue; } - + // 解析发货时间 Date sendTime; try { @@ -770,22 +770,22 @@ public class GoodsOrderController extends BaseController failList.add(orderId + ":发货时间格式错误"); continue; } - + // 执行发货 boolean shipResult = shipSingleOrder(order, deliveryId, deliveryNum, sendTime); - + if (shipResult) { successList.add(orderId); } else { failList.add(orderId + ":发货失败"); } - + } catch (Exception e) { log.error("处理订单" + orderId + "发货失败", e); failList.add(orderId + ":处理异常 - " + e.getMessage()); } } - + result.put("total", excelData.size()); result.put("success", successList.size()); result.put("fail", failList.size()); @@ -793,10 +793,10 @@ public class GoodsOrderController extends BaseController result.put("successList", successList); result.put("failList", failList); result.put("skipList", skipList); - + return result; } - + /** * 根据快递公司名称查找ID */ @@ -814,7 +814,7 @@ public class GoodsOrderController extends BaseController } return null; } - + /** * 发货单个订单 */ @@ -825,39 +825,39 @@ public class GoodsOrderController extends BaseController order.setDeliveryNum(deliveryNum); order.setSendTime(sendTime); order.setStatus(3L); // 设置为已发货状态 - + // 更新订单 int result = goodsOrderService.updateGoodsOrder(order); - + if (result > 0) { // 获取快递公司信息 SiteDelivery siteDelivery = siteDeliveryService.selectSiteDeliveryById(deliveryId); String deliveryTitle = siteDelivery != null ? siteDelivery.getTitle() : "未知快递"; - + // 添加发货日志 JSONObject logData = new JSONObject(); logData.put("wlgs", deliveryTitle); logData.put("wldh", deliveryNum); OrderUtil.addgoodsorderlog( - 999L, - order.getMainOrderId(), - "Excel批量导入发货", - "2", - logData, - 2L + 999L, + order.getMainOrderId(), + "Excel批量导入发货", + "2", + logData, + 2L ); - + return true; } - + return false; - + } catch (Exception e) { log.error("发货订单" + order.getOrderId() + "失败", e); return false; } } - + /** * 下载批量发货Excel模板 */ @@ -866,27 +866,27 @@ public class GoodsOrderController extends BaseController try { // 创建CSV内容 String csvContent = "订单号,快递公司,快递单号,发货时间\n" + - "B00001,顺丰,35434353,2025/8/11\n" + - "B00002,圆通,12345678,2025/8/11"; - + "B00001,顺丰,35434353,2025/8/11\n" + + "B00002,圆通,12345678,2025/8/11"; + // 设置响应头 response.setContentType("text/csv;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); String fileName = "批量发货模板.csv"; - response.setHeader("Content-Disposition", "attachment;filename=" + - java.net.URLEncoder.encode(fileName, "UTF-8")); - + response.setHeader("Content-Disposition", "attachment;filename=" + + java.net.URLEncoder.encode(fileName, "UTF-8")); + // 写入CSV内容 response.getWriter().write(csvContent); response.getWriter().flush(); - + } catch (Exception e) { log.error("下载模板失败", e); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); response.getWriter().write("下载模板失败:" + e.getMessage()); } } - + /** * 测试模板文件是否正常 */ @@ -898,27 +898,27 @@ public class GoodsOrderController extends BaseController if (resourceUrl == null) { return error("模板文件不存在"); } - + // 使用Files.readAllBytes来读取文件内容 java.nio.file.Path filePath = java.nio.file.Paths.get(resourceUrl.toURI()); byte[] fileContent = java.nio.file.Files.readAllBytes(filePath); - + if (fileContent.length == 0) { return error("模板文件为空"); } - + // 检查文件头,验证是否为有效的XLSX文件 if (fileContent.length < 4) { return error("模板文件太小,可能已损坏"); } - + // XLSX文件应该以PK开头(ZIP格式) if (fileContent[0] != 0x50 || fileContent[1] != 0x4B) { return error("模板文件不是有效的XLSX格式(缺少ZIP文件头)"); } - + return success("模板文件正常,大小:" + fileContent.length + " 字节"); - + } catch (Exception e) { log.error("测试模板文件失败", e); return error("测试模板文件失败:" + e.getMessage()); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderLogController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderLogController.java index 31135ff..7f9e148 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderLogController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderLogController.java @@ -46,6 +46,21 @@ public class OrderLogController extends BaseController return getDataTable(list); } + + /** + * 查询订单服务记录列表 + */ + @PreAuthorize("@ss.hasPermi('system:OrderLog:list')") + @GetMapping("/getAllList") + public AjaxResult getAllList(OrderLog orderLog) + { + + List 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(""); 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 @@ + + +