Explorar o código

分账修改,新增站点账户变动记录

skyline hai 1 ano
pai
achega
43884c4878

+ 2 - 1
admin-web/src/views/admin/station/account/index.vue

@@ -87,7 +87,7 @@
             <template v-else-if="field.prop==='type'">
               <ext-d-label type="Object.type" :model-value="row[field.prop]"></ext-d-label>
             </template>
-            <template v-else-if="['balance','frozenAmount','amount'].includes(field.prop)">
+            <template v-else-if="['balance','frozenAmount','frozenAmountSplit','amount'].includes(field.prop)">
               {{ u.fmt.fmtMoney(row[field.prop]) }}
             </template>
             <template v-else-if="field.prop==='idleRemainTime'||field.prop==='operationRemainTime'">
@@ -151,6 +151,7 @@ const state = reactive({
     {label: '站点名称', width: 200,prop: 'stationName', query: true, type: 'text', resizable: true},
     {label: '可提现金额(元)', width: 180,prop: 'balance', query: true, type: '', resizable: true},
     {label: '充值未消费金额(元)', width: 180,prop: 'frozenAmount', query: true, type: '', resizable: true},
+    {label: '未消费可分账金额(元)', width: 200,prop: 'frozenSplitAmount', query: true, type: '', resizable: true},
     {label: '创建时间', width: 180,prop: 'createTime', query: true, sortable: 'custom', type: 'datetime', resizable: true, conf: {format: (val: any) => u.fmt.fmtDate(val)}},
     {label: '更新时间', width: 180,prop: 'updateTime', query: true, sortable: 'custom', type: 'datetime', resizable: true, conf: {format: (val: any) => u.fmt.fmtDate(val)}},
     // {                label: '操作', prop: 'action', type: 'render', width: 180, align: 'center', fixed: 'right',

+ 3 - 2
car-wash-entity/src/main/java/com/kym/entity/SplitRecord.java

@@ -22,13 +22,14 @@ public class SplitRecord extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
     /**
-     * 交易类型(0-平台技术服务费,1-充值 2-消费 3-解冻 4-退款)
+     * 交易类型(0-平台技术服务费,1-充值 2-消费 3-解冻 4-跨店支出 5-退款)
      */
     public static final Integer TYPE_PLATFORM = 0;
     public static final Integer TYPE_RECHARGE = 1;
     public static final Integer TYPE_CONSUME = 2;
     public static final Integer TYPE_UNFREEZE = 3;
-    public static final Integer TYPE_REFUND = 4;
+    public static final Integer TYPE_CROSS_EXPEND = 4;
+    public static final Integer TYPE_REFUND = 5;
 
     /**
      * 出账站点ID

+ 73 - 0
car-wash-entity/src/main/java/com/kym/entity/StationAccountRecord.java

@@ -0,0 +1,73 @@
+package com.kym.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.kym.entity.BaseEntity;
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 平台分账记录表
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-04-10
+ */
+@Getter
+@Setter
+@Accessors(chain = true)
+@TableName("t_station_account_record")
+public class StationAccountRecord extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    public static final int TYPE_收入 = 0;
+    public static final int TYPE_支出 = 1;
+
+
+    /**
+     * 站点ID
+     */
+    private String stationId;
+
+    /**
+     * 分账交易流水号
+     */
+    private String tradeNo;
+
+    /**
+     * 分账交易金额(分)
+     */
+    private Integer amount;
+
+    /**
+     * 0:收入 1:支出
+     */
+    private Integer type;
+
+    /**
+     * 交易前余额(分)
+     */
+    private Integer beforeBalance;
+
+    /**
+     * 交易前冻结金额(分)
+     */
+    private Integer beforeFrozenAmount;
+
+    /**
+     * 交易后余额(分)
+     */
+    private Integer afterBalance;
+    /**
+     * 交易后冻结金额(分)
+     */
+    private Integer afterFrozenAmount;
+
+    /**
+     * 状态(0-处理中 1-成功 2-失败)
+     */
+    private Integer status;
+}

+ 5 - 0
car-wash-entity/src/main/java/com/kym/entity/vo/StationAccountVo.java

@@ -32,4 +32,9 @@ public class StationAccountVo extends BaseEntity {
      * 冻结金额(分)
      */
     private Integer frozenAmount;
+
+    /**
+     * 未消费可分账金额(分)
+     */
+    private Integer frozenAmountSplit;
 }

+ 16 - 0
car-wash-mapper/src/main/java/com/kym/mapper/StationAccountRecordMapper.java

@@ -0,0 +1,16 @@
+package com.kym.mapper;
+
+import com.kym.entity.StationAccountRecord;
+import com.kym.mapper.mybatisplus.MyBaseMapper;
+
+/**
+ * <p>
+ * 平台分账记录表 Mapper 接口
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-04-10
+ */
+public interface StationAccountRecordMapper extends MyBaseMapper<StationAccountRecord> {
+
+}

+ 21 - 0
car-wash-mapper/src/main/resources/mappers/StationAccountRecordMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.kym.mapper.StationAccountRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.kym.entity.StationAccountRecord">
+        <result column="station_id" property="stationId" />
+        <result column="trade_no" property="tradeNo" />
+        <result column="amount" property="amount" />
+        <result column="type" property="type" />
+        <result column="before_balance" property="beforeBalance" />
+        <result column="after_balance" property="afterBalance" />
+        <result column="status" property="status" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        station_id, trade_no, amount, type, before_balance, after_balance, status
+    </sql>
+
+</mapper>

+ 18 - 0
car-wash-miniapp/src/main/java/com/kym/admin/controller/StationAccountRecordController.java

@@ -0,0 +1,18 @@
+package com.kym.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 平台分账记录表 前端控制器
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-04-10
+ */
+@RestController
+@RequestMapping("/station-account-record")
+public class StationAccountRecordController {
+
+}

+ 16 - 0
car-wash-service/src/main/java/com/kym/service/StationAccountRecordService.java

@@ -0,0 +1,16 @@
+package com.kym.service;
+
+import com.kym.entity.StationAccountRecord;
+import com.kym.service.mybatisplus.MyBaseService;
+
+/**
+ * <p>
+ * 平台分账记录表 服务类
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-04-10
+ */
+public interface StationAccountRecordService extends MyBaseService<StationAccountRecord> {
+
+}

+ 101 - 23
car-wash-service/src/main/java/com/kym/service/awoara/event/handle/OrderCloseEventHandler.java

@@ -27,13 +27,17 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
     private final StationAccountService stationAccountService;
     private final SplitRecordService splitRecordService;
 
+    private final StationAccountRecordService stationAccountRecordService;
+
     public OrderCloseEventHandler(WashOrderService washOrderService, WalletDetailService walletDetailService,
-                                  AccountService accountService, StationAccountService stationAccountService, SplitRecordService splitRecordService) {
+                                  AccountService accountService, StationAccountService stationAccountService,
+                                  SplitRecordService splitRecordService, StationAccountRecordService stationAccountRecordService) {
         this.washOrderService = washOrderService;
         this.walletDetailService = walletDetailService;
         this.accountService = accountService;
         this.stationAccountService = stationAccountService;
         this.splitRecordService = splitRecordService;
+        this.stationAccountRecordService = stationAccountRecordService;
     }
 
 
@@ -87,7 +91,7 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
             // todo t_account减(上面已完成),t_station_account冻结户减,t_station_account商户加,t_split_record记录
             // todo 需要判断是否跨网点,分开处理;跨网点结算比例是消费站点分订单额的30%,充值站点分70%
             if (washOrder.getIsCross()) {
-                // 跨网点订单结算比例是消费站点分订单额的30%,充值站点分70%
+                // 跨网点订单结算比例是消费站点分订单额的30%,消费站点分70%
                 doCrossSplit(washOrder, KymCache.INSTANCE.getUserStationId(washOrder.getUserId()));
             } else {
                 // 不跨网点订单结算比例是消费站点分订单额的100%,消费金额*商家消费分润比例30%-消费金额*平台分润10%=消费金额*(商家消费分润比例-平台分润)
@@ -163,29 +167,55 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
 
         splitRecordService.saveBatch(List.of(splitRecord0, splitRecord1, splitRecord2));
 
+        // t_station_account_record 0.平台服务费收入 1.归属站点收入 2.归属站点解冻
+        var platformStationAccount = stationAccountService.getStationAccount(StationAccount.PLATFORM_STATION_ID);
+        var userStationAccount = stationAccountService.getStationAccount(washOrder.getStationId());
+
+        var stationAccountRecord0 = new StationAccountRecord()
+                .setStationId(StationAccount.PLATFORM_STATION_ID)
+                .setTradeNo(washOrder.getOrderId())
+                .setAmount(platformAmount)
+                .setType(StationAccountRecord.TYPE_收入)
+                .setBeforeBalance(platformStationAccount.getBalance())
+                .setAfterBalance(platformStationAccount.getBalance() + platformAmount);
+
+        var stationAccountRecord1 = new StationAccountRecord()
+                .setStationId(washOrder.getStationId())
+                .setTradeNo(washOrder.getOrderId())
+                .setAmount(unfreezeAmount)
+                .setType(StationAccountRecord.TYPE_收入)
+                .setBeforeBalance(userStationAccount.getBalance())
+                .setAfterBalance(userStationAccount.getBalance() + unfreezeAmount);
+
+        stationAccountRecordService.saveBatch(List.of(stationAccountRecord0, stationAccountRecord1));
+
     }
 
     /**
      * 执行跨店分账操作
+     * 跨店结算比例是消费站点分订单额的70%,充值站点分30%
+     * 具体步骤:
+     * 1.归属站点解冻消费金额(扣除平台手续费)
+     * 2.归属站点支出(订单金额的70%)
+     * 3.消费站点收入(订单金额的70%)
      *
      * @param washOrder
-     * @param stationId 用户归属的站点Id
+     * @param userStationId 用户归属的站点Id
      */
-    private void doCrossSplit(WashOrder washOrder, String stationId) {
+    private void doCrossSplit(WashOrder washOrder, String userStationId) {
         log.info("订单:{},执行(跨店)分账", washOrder.getOrderId());
 
         // 平台技术服务费10%
         var platformAmount = (int) (washOrder.getAmount() * 0.1);
-        // 解冻金额
-        var unfreezeAmount = (int) (washOrder.getAmount() * 0.3);
 
-        // 扣除平台技术服务费后总共用于分账的金额
-        var splitAmount = unfreezeAmount - platformAmount;
+        // 解冻金额 = 订单金额
+        var unfreezeAmount = washOrder.getAmount();
+
+        // 归属站点账户解冻扣除平台技术服务费后总共用于分账的金额
+        var localAmount = (int)(unfreezeAmount * 0.3) - platformAmount;
 
-        // 用户归属站点分账收入
-        var localAmount = (int) (splitAmount * 0.7);
-        // 当前消费站点分账收入
-        var crossAmount = splitAmount - localAmount;
+        // 当前消费站点分账收入(订单金额的70%,不承担平台手续费)
+        var crossAmount = washOrder.getAmount() - (int)(unfreezeAmount * 0.3);
 
         // 当前消费站点收入(跨店消费,原充值站点要分订单的70%)
         stationAccountService.lambdaUpdate()
@@ -193,43 +223,91 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
                 .eq(StationAccount::getStationId, washOrder.getStationId())
                 .update();
 
-        // 用户归属站点收入
+        // 用户归属站点解冻和收入,用户归属站点支出(支付给消费站点)
         stationAccountService.lambdaUpdate()
-                .setSql("balance = balance + {0}, frozen_amount = frozen_amount - {1}", localAmount, unfreezeAmount)
-                .eq(StationAccount::getStationId, stationId)
+                .setSql("balance = balance + {0}, frozen_amount = frozen_amount - {1}", localAmount - crossAmount, unfreezeAmount)
+                .eq(StationAccount::getStationId, userStationId)
                 .update();
 
-
-        // t_split_record 0.平台服务费收入 1.消费站点收入 2.归属站点收入 3.归属站点解冻
+        // t_split_record 0.平台服务费收入 1.消费站点收入 2.归属站点收入 3.归属站点解冻 4.归属站点支出(给消费站点结算)
         var splitRecord0 = new SplitRecord()
-                .setFromStationId(stationId)
+                .setFromStationId(userStationId)
                 .setToStationId(StationAccount.PLATFORM_STATION_ID)
                 .setTradeNo(washOrder.getOrderId())
                 .setAmount(platformAmount)
                 .setType(SplitRecord.TYPE_PLATFORM);
 
         var splitRecord1 = new SplitRecord()
-                .setFromStationId(stationId)
+                .setFromStationId(userStationId)
                 .setToStationId(washOrder.getStationId())
                 .setTradeNo(washOrder.getOrderId())
                 .setAmount(crossAmount)
                 .setType(SplitRecord.TYPE_CONSUME);
 
         var splitRecord2 = new SplitRecord()
-                .setFromStationId(stationId)
-                .setToStationId(stationId)
+                .setFromStationId(userStationId)
+                .setToStationId(userStationId)
                 .setTradeNo(washOrder.getOrderId())
                 .setAmount(localAmount)
                 .setType(SplitRecord.TYPE_CONSUME);
 
         var splitRecord3 = new SplitRecord()
-                .setFromStationId(stationId)
+                .setFromStationId(userStationId)
                 .setToStationId(washOrder.getStationId())
                 .setTradeNo(washOrder.getOrderId())
                 .setAmount(unfreezeAmount)
                 .setType(SplitRecord.TYPE_UNFREEZE);
 
-        splitRecordService.saveBatch(List.of(splitRecord0, splitRecord1, splitRecord2, splitRecord3));
+        var splitRecord4 = new SplitRecord()
+                .setFromStationId(userStationId)
+                .setToStationId(washOrder.getStationId())
+                .setTradeNo(washOrder.getOrderId())
+                .setAmount(crossAmount)
+                .setType(SplitRecord.TYPE_CROSS_EXPEND);
+
+        splitRecordService.saveBatch(List.of(splitRecord0, splitRecord1, splitRecord2, splitRecord3, splitRecord4));
+
+        // t_station_account_record 0.平台服务费收入 1.消费站点收入 2.归属站点收入 3.归属站点解冻 4.归属站点支出(给消费站点结算)
+        var platformStationAccount = stationAccountService.getStationAccount(StationAccount.PLATFORM_STATION_ID);
+        var consumeStationAccount = stationAccountService.getStationAccount(washOrder.getStationId());
+        var userStationAccount = stationAccountService.getStationAccount(userStationId);
+
+        var stationAccountRecord0 = new StationAccountRecord()
+                .setStationId(StationAccount.PLATFORM_STATION_ID)
+                .setTradeNo(washOrder.getOrderId())
+                .setAmount(platformAmount)
+                .setType(StationAccountRecord.TYPE_收入)
+                .setBeforeBalance(platformStationAccount.getBalance())
+                .setAfterBalance(platformStationAccount.getBalance() + platformAmount);
+
+        var stationAccountRecord1 = new StationAccountRecord()
+                .setStationId(washOrder.getStationId())
+                .setTradeNo(washOrder.getOrderId())
+                .setAmount(crossAmount)
+                .setType(StationAccountRecord.TYPE_收入)
+                .setBeforeBalance(consumeStationAccount.getBalance())
+                .setAfterBalance(consumeStationAccount.getBalance() + crossAmount);
+
+        // 归属站点收入和归属站点解冻合并成一条数据
+        var stationAccountRecord2 = new StationAccountRecord()
+                .setStationId(userStationId)
+                .setTradeNo(washOrder.getOrderId())
+                .setAmount(localAmount)
+                .setType(StationAccountRecord.TYPE_收入)
+                .setBeforeBalance(userStationAccount.getBalance())
+                .setAfterBalance(userStationAccount.getBalance() + localAmount)
+                .setBeforeFrozenAmount(userStationAccount.getFrozenAmount())
+                .setAfterFrozenAmount(userStationAccount.getFrozenAmount() - unfreezeAmount);
+
+        // 归属站点支出(结算给消费站点)
+        var stationAccountRecord3 = new StationAccountRecord()
+                .setStationId(userStationId)
+                .setTradeNo(washOrder.getOrderId())
+                .setAmount(crossAmount)
+                .setType(StationAccountRecord.TYPE_支出)
+                .setBeforeBalance(stationAccountRecord2.getAfterBalance())
+                .setAfterBalance(stationAccountRecord2.getAfterBalance() - unfreezeAmount);
 
+        stationAccountRecordService.saveBatch(List.of(stationAccountRecord0, stationAccountRecord1, stationAccountRecord2, stationAccountRecord3));
     }
 }

+ 6 - 2
car-wash-service/src/main/java/com/kym/service/awoara/factory/AwoaraEventHandlerFactory.java

@@ -21,14 +21,18 @@ public class AwoaraEventHandlerFactory {
     private static StationAccountService stationAccountService;
     private static SplitRecordService splitRecordService;
 
+    private static StationAccountRecordService stationAccountRecordService;
+
     public AwoaraEventHandlerFactory(WashDeviceService washDeviceService, WashOrderService washOrderService, WalletDetailService walletDetailService,
-                                     AccountService accountService, StationAccountService stationAccountService, SplitRecordService splitRecordService) {
+                                     AccountService accountService, StationAccountService stationAccountService, SplitRecordService splitRecordService,
+                                     StationAccountRecordService stationAccountRecordService) {
         AwoaraEventHandlerFactory.washDeviceService = washDeviceService;
         AwoaraEventHandlerFactory.washOrderService = washOrderService;
         AwoaraEventHandlerFactory.walletDetailService = walletDetailService;
         AwoaraEventHandlerFactory.accountService = accountService;
         AwoaraEventHandlerFactory.stationAccountService = stationAccountService;
         AwoaraEventHandlerFactory.splitRecordService = splitRecordService;
+        AwoaraEventHandlerFactory.stationAccountRecordService = stationAccountRecordService;
     }
 
     public static AwoaraEventHandler getEventHandler(String eventName) {
@@ -40,7 +44,7 @@ public class AwoaraEventHandlerFactory {
                 case order_create -> new OrderCreateEventHandler(washOrderService);
                 case order_update -> new OrderUpdateEventHandler(washOrderService);
                 case order_close ->
-                        new OrderCloseEventHandler(washOrderService, walletDetailService, accountService, stationAccountService, splitRecordService);
+                        new OrderCloseEventHandler(washOrderService, walletDetailService, accountService, stationAccountService, splitRecordService, stationAccountRecordService);
                 case user_login -> new UserLoginEventHandler();
                 case card_event -> new CardEventHandler();
             };

+ 20 - 0
car-wash-service/src/main/java/com/kym/service/impl/StationAccountRecordServiceImpl.java

@@ -0,0 +1,20 @@
+package com.kym.service.impl;
+
+import com.kym.entity.StationAccountRecord;
+import com.kym.mapper.StationAccountRecordMapper;
+import com.kym.service.StationAccountRecordService;
+import com.kym.service.mybatisplus.MyBaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 平台分账记录表 服务实现类
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-04-10
+ */
+@Service
+public class StationAccountRecordServiceImpl extends MyBaseServiceImpl<StationAccountRecordMapper, StationAccountRecord> implements StationAccountRecordService {
+
+}

+ 18 - 4
car-wash-service/src/main/java/com/kym/service/wechat/impl/WxPayServiceImpl.java

@@ -89,7 +89,7 @@ public class WxPayServiceImpl implements WxPayService {
     private final RechargeConfigService rechargeConfigService;
     private final StationAccountService stationAccountService;
     private final SplitRecordService splitRecordService;
-
+    private final StationAccountRecordService stationAccountRecordService;
     private final WashOrderService washOrderService;
 
 
@@ -103,7 +103,7 @@ public class WxPayServiceImpl implements WxPayService {
                             PayLogService payLogService, AccountService accountService,
                             RefundLogService refundLogService,
                             ActivityService activityService, UserRechargeRightsService userRechargeRightsService,
-                            RechargeConfigService rechargeConfigService, StationAccountService stationAccountService, SplitRecordService splitRecordService, WashOrderService washOrderService) {
+                            RechargeConfigService rechargeConfigService, StationAccountService stationAccountService, SplitRecordService splitRecordService, StationAccountRecordService stationAccountRecordService, WashOrderService washOrderService) {
         this.conf = conf;
         this.walletDetailService = walletDetailService;
         this.payLogService = payLogService;
@@ -114,6 +114,7 @@ public class WxPayServiceImpl implements WxPayService {
         this.rechargeConfigService = rechargeConfigService;
         this.stationAccountService = stationAccountService;
         this.splitRecordService = splitRecordService;
+        this.stationAccountRecordService = stationAccountRecordService;
         this.washOrderService = washOrderService;
     }
 
@@ -349,6 +350,7 @@ public class WxPayServiceImpl implements WxPayService {
                 // 用户(此时要知道用户归属的站点)充值的资金先进到洗车站商户账户的基本户和冻结户,然后在消费时再将冻结户金额进行分润
                 var stationId = transaction.getAttach();
                 // 70%进入站点商户基本户,30%进入站点商户冻结户 todo 后面将比例进行配置化(需要考虑历史数据处理)
+                var stationAccount = stationAccountService.getStationAccount(stationId);
                 var stationBasicAmount = (int) (totalAmount * 0.7);
                 var stationFreezeAmount = totalAmount - stationBasicAmount;
                 stationAccountService.lambdaUpdate()
@@ -365,6 +367,18 @@ public class WxPayServiceImpl implements WxPayService {
                         .setType(SplitRecord.TYPE_RECHARGE);
                 splitRecordService.save(splitRecord);
 
+                // 站点收支记录
+                var stationAccountRecord = new StationAccountRecord()
+                        .setStationId(stationId)
+                        .setTradeNo(transaction.getTransactionId())
+                        .setAmount(stationBasicAmount)
+                        .setType(StationAccountRecord.TYPE_收入)
+                        .setBeforeBalance(stationAccount.getBalance())
+                        .setBeforeFrozenAmount(stationAccount.getFrozenAmount())
+                        .setAfterBalance(stationAccount.getBalance() + stationBasicAmount)
+                        .setBeforeFrozenAmount(stationAccount.getFrozenAmount() + stationFreezeAmount);
+                stationAccountRecordService.save(stationAccountRecord);
+
                 LOGGER.info("微信支付回调{}:业务处理结束", notifyRes[2]);
                 return ResponseEntity.status(HttpStatus.OK).build();
 
@@ -396,7 +410,7 @@ public class WxPayServiceImpl implements WxPayService {
         if (washOrder != null) {
             throw new BusinessException("存在未完结的订单,请完成所有订单完结之后重试");
         }
-        
+
         var account = accountService.getAccountByUserId(userId);
         if (account.getBalance() <= 0) {
             throw new BusinessException("账户余额不足,无需退款");
@@ -616,7 +630,7 @@ public class WxPayServiceImpl implements WxPayService {
                 return ResponseEntity.status(HttpStatus.OK).build();
             } else {
                 // 退款失败
-                LOGGER.error("微信退款失败,用户id:{},退款状态:{} \n 退款结果通知详情:{}", refundLog.getUserId(), refundNotification.getRefundStatus().name(), refundNotification);
+                LOGGER.error("微信退款失败,用户id:{},退款状态:{}退款结果通知详情:{}", refundLog.getUserId(), refundNotification.getRefundStatus().name(), refundNotification);
                 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("code", HttpStatus.INTERNAL_SERVER_ERROR, "message", "退款处理异常"));
             }
         } catch (ValidationException e) {