浏览代码

内部转账

yzc 1 年之前
父节点
当前提交
775bc237f1

+ 8 - 0
hx-account/src/main/java/com/fjhx/account/controller/account/AccountRunningWaterController.java

@@ -107,4 +107,12 @@ public class AccountRunningWaterController {
         accountRunningWaterService.taxRefund(dto);
     }
 
+    /**
+     * 内部转账
+     */
+    @PostMapping("/internalTransfer")
+    public void internalTransfer(@RequestBody AccountRunningWaterDto dto) {
+        accountRunningWaterService.internalTransfer(dto);
+    }
+
 }

+ 26 - 0
hx-account/src/main/java/com/fjhx/account/entity/account/dto/AccountRunningWaterDto.java

@@ -5,6 +5,8 @@ import com.fjhx.account.entity.tax.po.TaxRefundDetails;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.constraints.NotBlank;
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -22,4 +24,28 @@ public class AccountRunningWaterDto extends AccountRunningWater {
      */
     List<TaxRefundDetails> taxRefundDetailsList;
 
+    /**
+     * 转入账户-管理表ID
+     */
+    private Long inAccountManagementId;
+    /**
+     * 转入金额
+     */
+    private BigDecimal inAmount;
+
+    /**
+     * 转入币种(字典account_currency)
+     */
+    private String inCurrency;
+
+    /**
+     * 手续费金额
+     */
+    private BigDecimal commissionAmount;
+
+    /**
+     * 手续费币种(字典account_currency)
+     */
+    private String commissionCurrency;
+
 }

+ 6 - 0
hx-account/src/main/java/com/fjhx/account/service/account/AccountRunningWaterService.java

@@ -1,5 +1,6 @@
 package com.fjhx.account.service.account;
 
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.account.entity.account.dto.AccountRunningWaterDto;
 import com.fjhx.account.entity.account.dto.AccountRunningWaterSelectDto;
@@ -66,4 +67,9 @@ public interface AccountRunningWaterService extends BaseService<AccountRunningWa
      * 退税添加
      */
     void taxRefund(AccountRunningWaterDto dto);
+
+    /**
+     * 内部转账
+     */
+    void internalTransfer(AccountRunningWaterDto dto);
 }

+ 96 - 39
hx-account/src/main/java/com/fjhx/account/service/account/impl/AccountRunningWaterServiceImpl.java

@@ -2,7 +2,6 @@ package com.fjhx.account.service.account.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -28,7 +27,6 @@ import com.fjhx.common.service.corporation.CorporationService;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.common.utils.ExchangeRateUtil;
 import com.fjhx.item.util.excel.util.ExcelUtil;
-//import com.fjhx.socket.service.WebSocketServer;
 import com.fjhx.tenant.entity.dict.dto.DictTenantDataSelectDto;
 import com.fjhx.tenant.entity.dict.vo.DictTenantDataVo;
 import com.fjhx.tenant.service.dict.DictTenantDataService;
@@ -37,7 +35,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;
@@ -331,43 +328,12 @@ public class AccountRunningWaterServiceImpl extends ServiceImpl<AccountRunningWa
         AccountRunningWater accountRunningWater = getById(id);
         Assert.notEmpty(accountRunningWater, "获取不到该流水信息");
 
+        //回滚余额 修改操作类型 收入变支出 支出变收入
+        String status = "10".equals(accountRunningWater.getStatus()) ? "20" : "10";
+        accountRunningWater.setStatus(status);
 
-        // 修改账户余额表的余额
-        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, "余额操作失败操作失败");
+        //操作余额
+        changeRemainder(accountRunningWater);
 
         this.removeById(id);
     }
@@ -468,4 +434,95 @@ public class AccountRunningWaterServiceImpl extends ServiceImpl<AccountRunningWa
         taxRefundDetailsService.saveBatch(taxRefundDetailsList);
     }
 
+    /**
+     * 内部转账
+     */
+    @DSTransactional
+    @Override
+    public void internalTransfer(AccountRunningWaterDto dto) {
+        //生成转出流水
+        dto.setStatus("20");//支出
+        dto.setType("50");//内部转账
+        //操作余额
+        changeRemainder(dto);
+        this.save(dto);
+
+        //如果手续费不为0生成手续费
+        if (ObjectUtil.isNotEmpty(dto.getCommissionAmount()) && dto.getCommissionAmount().compareTo(BigDecimal.ZERO) != 0) {
+            AccountRunningWater commissionAccountRunningWater = new AccountRunningWater();
+            commissionAccountRunningWater.setStatus("20");
+            commissionAccountRunningWater.setType("50");//内部转账
+            commissionAccountRunningWater.setRemarks(dto.getRemarks());
+            commissionAccountRunningWater.setTransactionTime(dto.getTransactionTime());
+
+            commissionAccountRunningWater.setAccountManagementId(dto.getAccountManagementId());
+            commissionAccountRunningWater.setAmount(dto.getCommissionAmount());
+            Assert.notEmpty(dto.getCommissionCurrency(), "手续费币种不能为空");
+            commissionAccountRunningWater.setCurrency(dto.getCommissionCurrency());
+            commissionAccountRunningWater.setRemarks("手续费");
+            //操作余额
+            changeRemainder(commissionAccountRunningWater);
+            this.save(commissionAccountRunningWater);
+        }
+
+        //生成收入流水
+        AccountRunningWater inAccountRunningWater = new AccountRunningWater();
+        inAccountRunningWater.setStatus("10");
+        inAccountRunningWater.setType("50");//内部转账
+        inAccountRunningWater.setRemarks(dto.getRemarks());
+        inAccountRunningWater.setTransactionTime(dto.getTransactionTime());
+
+        inAccountRunningWater.setAccountManagementId(dto.getInAccountManagementId());
+        inAccountRunningWater.setAmount(dto.getInAmount());
+        Assert.notEmpty(dto.getInCurrency(), "收入币种不能为空");
+        inAccountRunningWater.setCurrency(dto.getInCurrency());
+        //操作余额
+        changeRemainder(inAccountRunningWater);
+        this.save(inAccountRunningWater);
+    }
+
+    /**
+     * 余额操作
+     */
+    private void changeRemainder(AccountRunningWater 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())) {
+            //收入操作
+            update = accountRemainderService.update(q -> q
+                    .setSql("remainder = remainder + " + accountRunningWater.getAmount())
+                    .setSql("change_remainder = " + accountRunningWater.getAmount())
+                    .eq(AccountRemainder::getId, accountRemainder.getId())
+            );
+        } else {
+            //支出操作
+            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())
+            );
+        }
+        Assert.eqTrue(update, "余额操作失败,请重试!!!");
+    }
+
 }