فهرست منبع

资金问题优化

skyline 1 هفته پیش
والد
کامیت
0776688ed0

+ 5 - 5
car-wash-mp/src/pages-user/wallet/index.vue

@@ -351,7 +351,7 @@ const handleClickDetail = (walletDetail: any) => {
     display: flex;
     justify-content: center;
     align-items: center;
-    background: rgba(255, 255, 255, 0.22);
+    background: rgba($uni-color-primary, 0.06);
     border-radius: 16rpx;
     padding: 24rpx 20rpx;
     position: relative;
@@ -368,7 +368,7 @@ const handleClickDetail = (walletDetail: any) => {
       .detail-icon {
         width: 44rpx;
         height: 44rpx;
-        background: $uni-text-color-inverse;
+        background: rgba($uni-color-primary, 0.08);
         border-radius: 50%;
         display: flex;
         align-items: center;
@@ -382,12 +382,12 @@ const handleClickDetail = (walletDetail: any) => {
         gap: 6rpx;
 
         .detail-label {
-          color: rgba(255, 255, 255, 0.8);
+          color: $uni-text-color-hint;
           font-size: 24rpx;
         }
 
         .detail-value {
-          color: $uni-text-color-inverse;
+          color: $uni-text-color;
           font-size: 28rpx;
           font-weight: $uni-font-weight-semibold;
         }
@@ -397,7 +397,7 @@ const handleClickDetail = (walletDetail: any) => {
     .detail-divider {
       width: 2rpx;
       height: 60rpx;
-      background: rgba(255, 255, 255, 0.25);
+      background: $uni-border-color-light;
       margin: 0 20rpx;
     }
   }

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

@@ -64,7 +64,7 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
 
         int rechargePayment;
         int grantsPayment = 0;
-        var account = accountService.getAccountByUserId(washOrder.getUserId());
+        var account = accountService.lambdaQuery().eq(Account::getUserId, washOrder.getUserId()).last("FOR UPDATE").one();
         // 以实收金额扣款(优先扣减充值款,不够则扣除赠款)
         int amountReceived = orderInfo.getAmount_received();
         if (account.getRechargeBalance() >= amountReceived) {

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

@@ -3,7 +3,6 @@ package com.kym.service.factory;
 import com.kym.entity.Activity;
 import com.kym.service.DiscountService;
 import com.kym.service.OrderWashDayService;
-import com.kym.service.WashDayService;
 import com.kym.service.impl.NoDiscountHandle;
 import com.kym.service.impl.WashDayDiscountHandle;
 import org.springframework.stereotype.Component;
@@ -16,18 +15,15 @@ import org.springframework.stereotype.Component;
 @Component
 public class DiscountStrategyFactory {
 
-    private static WashDayService washDayService;
-
     private static OrderWashDayService orderWashDayService;
 
-    public DiscountStrategyFactory(WashDayService washDayService, OrderWashDayService orderWashDayService) {
-        DiscountStrategyFactory.washDayService = washDayService;
+    public DiscountStrategyFactory(OrderWashDayService orderWashDayService) {
         DiscountStrategyFactory.orderWashDayService = orderWashDayService;
     }
 
     public static DiscountService getDiscountStrategy(String discountType) {
         if (Activity.DISCOUNT_TYPE_洗车日.equals(discountType)) {
-            return new WashDayDiscountHandle(washDayService, orderWashDayService);
+            return new WashDayDiscountHandle(orderWashDayService);
         } else {
             return new NoDiscountHandle();
         }

+ 7 - 0
car-wash-service/src/main/java/com/kym/service/impl/SettlementServiceImpl.java

@@ -68,6 +68,13 @@ public class SettlementServiceImpl extends MyBaseServiceImpl<SettlementRecordMap
 
         log.info("开始执行结算,周期:{}", period);
 
+        // 幂等检查:如果本期已有结算记录则跳过
+        long settledCount = lambdaQuery().eq(SettlementRecord::getSettlementPeriod, period).count();
+        if (settledCount > 0) {
+            log.warn("本期 {} 已有 {} 条结算记录,跳过重复结算", period, settledCount);
+            return;
+        }
+
         // 汇总本期各站点分账数据
         var allRecords = splitRecordService.lambdaQuery()
                 .ge(SplitRecord::getCreateTime, periodStart)

+ 5 - 19
car-wash-service/src/main/java/com/kym/service/impl/WashDayDiscountHandle.java

@@ -2,10 +2,8 @@ package com.kym.service.impl;
 
 import com.kym.entity.Account;
 import com.kym.entity.OrderWashDay;
-import com.kym.entity.WashDay;
 import com.kym.entity.WashOrder;
 import com.kym.service.DiscountService;
-import com.kym.service.WashDayService;
 import com.kym.service.OrderWashDayService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -17,31 +15,19 @@ import org.springframework.stereotype.Service;
 @Slf4j
 public class WashDayDiscountHandle implements DiscountService {
 
-    private final WashDayService washDayService;
-
     private final OrderWashDayService orderWashDayService;
 
-    public WashDayDiscountHandle(WashDayService washDayService, OrderWashDayService orderWashDayService) {
-        this.washDayService = washDayService;
+    public WashDayDiscountHandle(OrderWashDayService orderWashDayService) {
         this.orderWashDayService = orderWashDayService;
     }
 
     @Override
     public void computeDiscount(WashOrder order, Account account) {
-        // 获取订单关联的洗车日活动信息
-        var orderWashDay = orderWashDayService.lambdaQuery().eq(OrderWashDay::getOrderId,  order.getOrderId()).oneOpt();
+        // 设备已上报实际优惠金额,以设备值为准,记录到订单优惠日关联表
+        var orderWashDay = orderWashDayService.lambdaQuery().eq(OrderWashDay::getOrderId, order.getOrderId()).oneOpt();
         orderWashDay.ifPresent(owd -> {
-            var washDay = washDayService.lambdaQuery().eq(WashDay::getId, owd.getWashDayId()).oneOpt();
-            washDay.ifPresent(wd -> {
-                // 折扣
-                var discount = wd.getDiscount();
-                // 计算折扣金额
-                var discountAmount = order.getAmount() * discount / 100;
-                order.setDiscountAmount(discountAmount);
-                // 订单实付金额
-                order.setAmountReceivable(order.getAmount() - discountAmount);
-            });
+            owd.setDiscountAmount(order.getDiscountMoney());
+            orderWashDayService.updateById(owd);
         });
-
     }
 }

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

@@ -316,16 +316,20 @@ public class WxPayServiceImpl implements WxPayService {
 
                 var rechargeConfig = rechargeConfigService.getRechargeConfigByAmount(walletDetail.getAmount());
 
-                // 更新余额
+                // 更新余额(赠款计入不可退优惠金额)
                 var account = accountService.getAccountByUserId(walletDetail.getUserId());
-                accountService.lambdaUpdate().setSql("balance = balance + {0}, recharge_balance = recharge_balance + {0}, grants_balance = grants_balance + {1}", transaction.getAmount().getTotal(), rechargeConfig.getGrantsAmount())
+                var grantsAmount = rechargeConfig.getGrantsAmount();
+                accountService.lambdaUpdate().setSql("balance = balance + {0}, recharge_balance = recharge_balance + {0}, grants_balance = grants_balance + {1}, discount_amount = discount_amount + {1}", transaction.getAmount().getTotal(), grantsAmount)
                         .eq(Account::getUserId, walletDetail.getUserId()).update();
 
                 walletDetail.setStatus(WalletDetail.STATUS_已确认);  //已确认
                 walletDetail.setCurrency(transaction.getAmount().getCurrency());
                 walletDetail.setAmount(transaction.getAmount().getTotal());
+                walletDetail.setGrantsAmount(grantsAmount);
                 walletDetail.setBeforeBalance(account.getBalance());
                 walletDetail.setAfterBalance(account.getBalance() + walletDetail.getAmount());
+                walletDetail.setBeforeGrantsBalance(account.getGrantsBalance());
+                walletDetail.setAfterGrantsBalance(account.getGrantsBalance() + grantsAmount);
                 walletDetail.setTransactionTime(successTime);
                 walletDetailService.updateById(walletDetail);
 
@@ -407,8 +411,8 @@ public class WxPayServiceImpl implements WxPayService {
             throw new BusinessException("不可退金额高于钱包余额,不支持退款");
         }
 
-        // 将余额转移至冻结余额
-        accountService.lambdaUpdate().setSql(" frozen_amount = (frozen_amount + balance) ,balance = 0").eq(Account::getUserId, userId).update();
+        // 将余额转移至冻结余额,同时清零充值余额和赠款余额
+        accountService.lambdaUpdate().setSql(" frozen_amount = (frozen_amount + balance), balance = 0, recharge_balance = 0, grants_balance = 0").eq(Account::getUserId, userId).update();
 
         // 退款时,充值权益失效(权益余额转入冻结余额,权益状态设置为失效)
         userRechargeRightsService.lambdaUpdate()