Browse Source

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

yzc 1 year ago
parent
commit
4a60f00f88

+ 79 - 20
hx-account/src/main/java/com/fjhx/account/service/account/impl/AccountRunningWaterServiceImpl.java

@@ -39,7 +39,6 @@ import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
@@ -272,23 +271,73 @@ 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(oldAccountRunningWater.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);
@@ -300,7 +349,6 @@ public class AccountRunningWaterServiceImpl extends ServiceImpl<AccountRunningWa
                 .eq(AccountRemainder::getAccountManagementId, accountRunningWater.getAccountManagementId())
                 .eq(AccountRemainder::getCurrency, accountRunningWater.getCurrency())
         );
-
         if (ObjectUtil.isEmpty(accountRemainder)) {
             throw new ServiceException("该账户不存在此币种,请前往资金账户添加");
         }
@@ -311,17 +359,28 @@ public class AccountRunningWaterServiceImpl extends ServiceImpl<AccountRunningWa
         accountRemainder.setStatus(status);
         accountRemainder.setChangeRemainder(amount);
 
-        if (status.equals("10")) {
-            //收入 减余额
+        boolean update = false;
+        if ("10".equals(accountRunningWater.getStatus())) {
             BigDecimal subtract = remainder.subtract(amount);
             if (subtract.compareTo(BigDecimal.ZERO) < 0) {
                 throw new ServiceException("账户余额不足");
             }
-            accountRemainder.setRemainder(subtract);
-            //支出 加余额
-        } else if (status.equals("20")) {
-            accountRemainder.setRemainder(remainder.add(amount));
+
+            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, "余额操作失败操作失败");
+
         accountRemainderService.updateById(accountRemainder);