Sfoglia il codice sorgente

资金流水 删除/修改余额不变问题处理

yzc 1 anno fa
parent
commit
2c84819db7

+ 103 - 12
hx-account/src/main/java/com/fjhx/account/service/account/impl/AccountRunningWaterServiceImpl.java

@@ -259,25 +259,116 @@ public class AccountRunningWaterServiceImpl extends ServiceImpl<AccountRunningWa
      * 账户资金流水表编辑
      */
     @Override
-    @Transactional(rollbackFor = {Exception.class})
+    @DSTransactional
     public void edit(AccountRunningWater accountRunningWaterDto) {
-        //        //查询资金流水表的数据
-        //        AccountRunningWater accountRunningWater = this.getById(accountRunningWaterDto.getId());
-        //
-        //        //修改账户余额表的余额
-        //        AccountRemainder accountRemainder = accountRemainderService.getOne(Wrappers.<AccountRemainder>lambdaQuery()
-        //                .eq(AccountRemainder::getAccountManagementId,accountRunningWater.getAccountManagementId())
-        //                .eq(AccountRemainder::getCurrency,accountRunningWater.getCurrency())
-        //        );
-        //        if (accountRemainder.getStatus().equals("10")){
-        //            if (accountRemainder.getRemainder().compareTo(accountRunningWater.getAmount())==1)
-        //        }
+        //先回滚历史数据
+        //获取历史的流水信息信息
+        AccountRunningWater oldAccountRunningWater = getById(accountRunningWaterDto.getId());
+        //获取余额
+        AccountRemainder accountRemainder = accountRemainderService.getOne(q -> q
+                .eq(AccountRemainder::getAccountManagementId, oldAccountRunningWater.getAccountManagementId())
+                .eq(AccountRemainder::getCurrency, oldAccountRunningWater.getCurrency())
+        );
+        if (ObjectUtil.isEmpty(accountRemainder)) {
+            throw new ServiceException("历史数据 该账户不存在此币种,请前往资金账户添加");
+        }
+        boolean update = false;
+        if ("10".equals(oldAccountRunningWater.getStatus())) {
+            BigDecimal subtract = accountRemainder.getRemainder().subtract(oldAccountRunningWater.getAmount());
+            if (subtract.compareTo(BigDecimal.ZERO) < 0) {
+                throw new ServiceException("修改前数据 账户余额不足");
+            }
+            update = accountRemainderService.update(q -> q
+                    .setSql("remainder = remainder - " + oldAccountRunningWater.getAmount())
+                    .setSql("change_remainder = " + oldAccountRunningWater.getAmount())
+                    .eq(AccountRemainder::getId, accountRemainder.getId())
+                    .apply("remainder - {0} >= 0", oldAccountRunningWater.getAmount())
+            );
+        } else {
+            update = accountRemainderService.update(q -> q
+                    .setSql("remainder = remainder + " + oldAccountRunningWater.getAmount())
+                    .setSql("change_remainder = " + oldAccountRunningWater.getAmount())
+                    .eq(AccountRemainder::getId, accountRemainder.getId())
+            );
+        }
+        Assert.eqTrue(update, "余额回滚操作失败");
+        //再操作修改后数据
+        //获取余额
+        AccountRemainder accountRemainder1 = accountRemainderService.getOne(q -> q
+                .eq(AccountRemainder::getAccountManagementId, accountRunningWaterDto.getAccountManagementId())
+                .eq(AccountRemainder::getCurrency, accountRunningWaterDto.getCurrency())
+        );
+        if (ObjectUtil.isEmpty(accountRemainder)) {
+            throw new ServiceException("修改后数据 该账户不存在此币种,请前往资金账户添加");
+        }
+        boolean update1 = false;
+        if ("10".equals(accountRunningWaterDto.getStatus())) {
+            update1 = accountRemainderService.update(q -> q
+                    .setSql("remainder = remainder + " + accountRunningWaterDto.getAmount())
+                    .setSql("change_remainder = " + accountRunningWaterDto.getAmount())
+                    .eq(AccountRemainder::getId, accountRemainder1.getId())
+            );
+        } else {
+            BigDecimal subtract = accountRemainder1.getRemainder().subtract(accountRunningWaterDto.getAmount());
+            if (subtract.compareTo(BigDecimal.ZERO) < 0) {
+                throw new ServiceException("修改后数据 账户余额不足");
+            }
+            update1 = accountRemainderService.update(q -> q
+                    .setSql("remainder = remainder - " + accountRunningWaterDto.getAmount())
+                    .setSql("change_remainder = " + accountRunningWaterDto.getAmount())
+                    .eq(AccountRemainder::getId, accountRemainder1.getId())
+                    .apply("remainder - {0} >= 0", accountRunningWaterDto.getAmount())
+            );
+        }
+        Assert.eqTrue(update1, "余额修改操作失败");
 
         this.updateById(accountRunningWaterDto);
     }
 
+    @DSTransactional
     @Override
     public void delete(Long id) {
+        AccountRunningWater accountRunningWater = getById(id);
+        Assert.notEmpty(accountRunningWater, "获取不到该流水信息");
+
+
+        // 修改账户余额表的余额
+        AccountRemainder accountRemainder = accountRemainderService.getOne(q -> q
+                .eq(AccountRemainder::getAccountManagementId, accountRunningWater.getAccountManagementId())
+                .eq(AccountRemainder::getCurrency, accountRunningWater.getCurrency())
+        );
+        if (ObjectUtil.isEmpty(accountRemainder)) {
+            throw new ServiceException("该账户不存在此币种,请前往资金账户添加");
+        }
+        BigDecimal amount = accountRunningWater.getAmount();
+        String status = accountRunningWater.getStatus();
+        BigDecimal remainder = accountRemainder.getRemainder();
+
+        accountRemainder.setStatus(status);
+        accountRemainder.setChangeRemainder(amount);
+
+        boolean update = false;
+        if ("10".equals(accountRunningWater.getStatus())) {
+            BigDecimal subtract = remainder.subtract(amount);
+            if (subtract.compareTo(BigDecimal.ZERO) < 0) {
+                throw new ServiceException("账户余额不足");
+            }
+
+            update = accountRemainderService.update(q -> q
+                    .setSql("remainder = remainder - " + accountRunningWater.getAmount())
+                    .setSql("change_remainder = " + accountRunningWater.getAmount())
+                    .eq(AccountRemainder::getId, accountRemainder.getId())
+                    .apply("remainder - {0} >= 0", accountRunningWater.getAmount())
+            );
+        } else {
+            update = accountRemainderService.update(q -> q
+                    .setSql("remainder = remainder + " + accountRunningWater.getAmount())
+                    .setSql("change_remainder = " + accountRunningWater.getAmount())
+                    .eq(AccountRemainder::getId, accountRemainder.getId())
+            );
+        }
+        Assert.eqTrue(update, "余额操作失败操作失败");
+
         this.removeById(id);
     }