From 5d85e1f21e2bf8fd1db778d986ca359d9d604670 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 28 Apr 2022 15:47:00 +0800
Subject: [PATCH] add common wallet update

---
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java |   83 +++++++++++++++++++++++++++++++++++++++++
 src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java         |    4 ++
 src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java               |    2 +
 src/main/resources/mapper/modules/MallMemberWalletMapper.xml                       |   18 +++++++++
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java    |    4 +
 5 files changed, 110 insertions(+), 1 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
index 50b5cd5..3473eab 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
@@ -12,5 +12,7 @@
 
     int updateCommissionWithVersion(@Param("record") MallMemberWallet wallet);
 
+    int updateAmountWithVersion(@Param("record") MallMemberWallet wallet);
+
     void updateBalanceWithId(@Param("record")MallMemberWallet mallMemberWallet);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java
index cb187ba..b4d3388 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java
@@ -14,4 +14,8 @@
     void addCommission(BigDecimal amount, Long member);
 
     void reduceCommission(BigDecimal amount, Long member);
+
+    void add(BigDecimal amount, Long memberId, String field);
+
+    void reduce(BigDecimal amount, Long memberId, String field);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java
index dff3490..28febbf 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java
@@ -9,6 +9,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.lang.reflect.Field;
 import java.math.BigDecimal;
 
 /**
@@ -88,6 +89,15 @@
         }
     }
 
+    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
+        Field commission = MallMemberWallet.class.getDeclaredField("commission");
+        MallMemberWallet wallet = new MallMemberWallet();
+        commission.setAccessible(true);
+        commission.set(wallet, BigDecimal.valueOf(12.34d));
+
+        System.out.println(1);
+    }
+
     @Override
     public void reduceCommission(BigDecimal amount, Long memberId) {
         int i = 0;
@@ -112,4 +122,77 @@
             }
         }
     }
+
+    @Override
+    public void add(BigDecimal amount, Long memberId, String field) {
+        int i = 0;
+        boolean flag = true;
+
+        while (flag) {
+            i++;
+            MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId);
+            wallet.setCommission(wallet.getCommission().add(amount));
+
+            MallMemberWallet update = new MallMemberWallet();
+            update.setId(wallet.getId());
+            update.setRevision(wallet.getRevision());
+
+            Field declaredField = null;
+            try {
+                declaredField = MallMemberWallet.class.getDeclaredField(field);
+                declaredField.setAccessible(true);
+                declaredField.set(update, amount);
+            } catch (NoSuchFieldException | IllegalAccessException e) {
+                e.printStackTrace();
+                throw new FebsException("金额新增失败");
+            }
+
+            int result = this.baseMapper.updateAmountWithVersion(wallet);
+            if (result > 0) {
+                flag = false;
+            } else {
+                if (i > 2) {
+                    throw new FebsException("金额新增失败");
+                }
+            }
+        }
+    }
+
+    @Override
+    public void reduce(BigDecimal amount, Long memberId, String field) {
+        int i = 0;
+        boolean flag = true;
+
+        while (flag) {
+            i++;
+            MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId);
+
+            MallMemberWallet update = new MallMemberWallet();
+            update.setId(wallet.getId());
+            update.setRevision(wallet.getRevision());
+
+            try {
+                Field declaredField = MallMemberWallet.class.getDeclaredField(field);
+                declaredField.setAccessible(true);
+                BigDecimal balance = (BigDecimal) declaredField.get(wallet);
+
+                if (amount.compareTo(balance) > 0) {
+                    throw new FebsException("余额不足");
+                }
+                declaredField.set(update, wallet.getCommission().subtract(amount));
+
+            } catch (NoSuchFieldException | IllegalAccessException e) {
+                e.printStackTrace();
+            }
+
+            int result = this.baseMapper.updateAmountWithVersion(wallet);
+            if (result > 0) {
+                flag = false;
+            } else {
+                if (i > 2) {
+                    throw new FebsException("余额修改失败");
+                }
+            }
+        }
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
index 1733f9e..8cabb42 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -209,6 +209,8 @@
 
                         MallGoodsSku sku = mallGoodsSkuMapper.selectById(orderItem.getSkuId());
                         BigDecimal score = sku.getOriginalPrice().multiply(mallGoods.getStaticMultiple());
+
+                        memberWalletService.add(score, member.getId(), "score");
                         memberService.addMoneyFlow(member.getId(), score, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderInfo.getOrderNo(), null, null, null, null, FlowTypeEnum.SCORE.getValue());
                     }
                 }
@@ -246,7 +248,7 @@
             throw new FebsException("支付密码错误");
         }
 
-        memberWalletService.reduceBalance(orderInfo.getAmount(), mallMember.getId());
+        memberWalletService.reduce(orderInfo.getAmount(), mallMember.getId(), "balance");
 
         return orderInfo.getOrderNo();
     }
diff --git a/src/main/resources/mapper/modules/MallMemberWalletMapper.xml b/src/main/resources/mapper/modules/MallMemberWalletMapper.xml
index 7e60066..73bbd88 100644
--- a/src/main/resources/mapper/modules/MallMemberWalletMapper.xml
+++ b/src/main/resources/mapper/modules/MallMemberWalletMapper.xml
@@ -26,4 +26,22 @@
             balance = #{record.balance}
         where id=#{record.id}
     </update>
+
+    <update id="updateAmountWithVersion">
+        update mall_member_wallet
+        set revision = revision + 1
+        <if test="record.balance != null">
+            , balance = #{record.balance}
+        </if>
+        <if test="record.score != null">
+            , score = #{record.score}
+        </if>
+        <if test="record.prizeScore != null">
+            , prize_score = #{record.prizeScoree}
+        </if>
+        <if test="record.commission != null">
+            , commission = #{record.commission}
+        </if>
+        where id=#{record.id} and revision=#{record.revision}
+    </update>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.1