Browse Source

feature: 卡务中心->卡片操作 批量充值、退款与设置余额逻辑及前后端交互

autumnal_wind@yeah.net 1 năm trước cách đây
mục cha
commit
910d922227

+ 23 - 20
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PaymentsBusiness.java

@@ -75,7 +75,7 @@ public class PaymentsBusiness {
         list.add(userAccountVo);
         //2.卡片辅助信息
         PtCardVo ptCardVo;
-        if (bo.getCardId() > 0) {
+        if (bo.getCardId() != null && bo.getCardId() > 0) {
             //如果传入了cardId,根据cardId查询卡片信息
             ptCardVo = cardService.queryById(bo.getCardId());
         } else {
@@ -84,7 +84,7 @@ public class PaymentsBusiness {
         }
         list.add(ptCardVo);
         //3.钱包辅助信息
-        PtBagVo ptBagVo = bagService.queryById(bo.getBagId());
+        PtBagVo ptBagVo = bagService.queryByUserBagCode(bo.getUserId(),bo.getBagCode());
         list.add(ptBagVo);
         //4.设备辅助信息
         XfTermVo xfTermVo = termService.queryByNo(bo.getTermNo() == null ? 0 : bo.getTermNo());
@@ -144,11 +144,11 @@ public class PaymentsBusiness {
         }
 
         XfCreditAccountBackVo creditAccountBackVo = creditAccountBackService.createOriginalRecord(xfCreditaccountbackBo);
-        if(ObjUtil.isEmpty(creditAccountBackVo)){
+        if (ObjUtil.isEmpty(creditAccountBackVo)) {
             String message = MessageUtils.message("payments.OriginalRecord.create", JSONUtil.parse(bo));
             throw new PaymentsException("资金收支-原始记录", message);
         }
-        return  creditAccountBackVo;
+        return creditAccountBackVo;
     }
 
     /**
@@ -159,10 +159,10 @@ public class PaymentsBusiness {
      * @param cardVo        资金收支卡片信息
      * @param termVo        资金收支消费设备信息
      * @param workstationVo 资金收支工作站信息
-     * @param originalId     原始收支记录Id(收支备份表主键)
+     * @param originalId    原始收支记录Id(收支备份表主键)
      * @return 正式收支记录
      */
-    public XfCreditAccountVo keepAccounts(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo,String originalId){
+    public XfCreditAccountVo keepAccounts(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo, String originalId) {
         //校验要处理的原始收支记录
         ValidOriginalRecord(originalId);
         XfCreditAccountBo xfCreditaccountbo = new XfCreditAccountBo();
@@ -193,7 +193,7 @@ public class PaymentsBusiness {
         xfCreditaccountbo.setCardNo(cardVo.getCardNo());
         xfCreditaccountbo.setCardValue(bagVo.getBalance());
         xfCreditaccountbo.setCardType(cardVo.getCardType());
-        xfCreditaccountbo.setCardCount(bagVo.getRechargeCount()+1);
+        xfCreditaccountbo.setCardCount(bagVo.getRechargeCount() + 1);
         xfCreditaccountbo.setCardTypeName(cardVo.getCardTypeName());
         xfCreditaccountbo.setMainCard(cardVo.getMainCard());
         //设置钱包信息
@@ -205,33 +205,34 @@ public class PaymentsBusiness {
         xfCreditaccountbo.setOriginalId(originalId);
 
         XfCreditAccountVo creditAccountVo = creditAccountService.keepAccounts(xfCreditaccountbo);
-        if(ObjUtil.isEmpty(creditAccountVo)){
+        if (ObjUtil.isEmpty(creditAccountVo)) {
             String message = MessageUtils.message("payments.keepAccounts.create", originalId);
             throw new PaymentsException("资金收支-收支入账", message);
         }
         return creditAccountVo;
     }
 
-    public XfUserTotalVo createOrUpdateUserTotal(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo){
+    public XfUserTotalVo createOrUpdateUserTotal(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo) {
         XfUserTotalBo xfUserTotalBo = new XfUserTotalBo();
         xfUserTotalBo.setUserId(accountVo.getUserId());
         xfUserTotalBo.setUserNumb(accountVo.getUserNumb());
         xfUserTotalBo.setRealName(accountVo.getRealName());
         xfUserTotalBo.setDeptName(accountVo.getDeptName());
         xfUserTotalBo.setCardNo(cardVo.getCardNo());
-        xfUserTotalBo.setDateDay(DateUtil.format(new Date(),"yyyy-MM-dd"));
+        xfUserTotalBo.setDateDay(DateUtil.format(new Date(), "yyyy-MM-dd"));
         xfUserTotalBo.setUseType(bo.getUseType().code());
         xfUserTotalBo.setCreditMoney(bo.getReceiptMoney());
 
         return userTotalService.createOrUpdateUserTotal(xfUserTotalBo);
     }
-    public PtBagVo updateBalance(PtBagBo bagBo){
+
+    public PtBagVo updateBalance(PtBagBo bagBo) {
         return bagService.updateBalanceByBo(bagBo);
     }
 
     /**
      * 通用收支入账处理逻辑
-     *  这里主要是处理一次性完成的原始订单生成、收支记账
+     * 这里主要是处理一次性完成的原始订单生成、收支记账
      *
      * @param bo 资金收支信息
      */
@@ -256,7 +257,7 @@ public class PaymentsBusiness {
 
     /**
      * 通用收支入账处理逻辑
-     *  这里主要是处理一次性完成的原始订单生成、收支记账和更新个人日统计表功能
+     * 这里主要是处理一次性完成的原始订单生成、收支记账和更新个人日统计表功能
      *
      * @param bo 资金收支信息
      */
@@ -282,37 +283,39 @@ public class PaymentsBusiness {
         log.info("[收支记录生成完成,开始写个人日统计表]-{}", JSONUtil.toJsonStr(bo));
         createOrUpdateUserTotal(bo, accountVo, cardVo);
     }
+
     /**
      * 收支入账前校验收支原始记录
      *
      * @param originalId 原始记录Id
      */
-    private void ValidOriginalRecord(String originalId){
+    private void ValidOriginalRecord(String originalId) {
         String message;
         XfCreditAccountBackVo xfCreditaccountbackVo = creditAccountBackService.queryById(originalId);
-        if(ObjUtil.isEmpty(xfCreditaccountbackVo)){
+        if (ObjUtil.isEmpty(xfCreditaccountbackVo)) {
             message = MessageUtils.message("payments.OriginalRecord.get", originalId);
             throw new PaymentsException("资金收支-原始记录", message);
         }
         String accountId = xfCreditaccountbackVo.getCreditId();
-        if(StrUtil.isNotEmpty(accountId)){
-            message = MessageUtils.message("payments.OriginalRecord.isPost", originalId,accountId);
+        if (StrUtil.isNotEmpty(accountId)) {
+            message = MessageUtils.message("payments.OriginalRecord.isPost", originalId, accountId);
             throw new PaymentsException("资金收支-原始记录", message);
         }
     }
+
     /**
      * 生成资金收支备份表和收支表的32位主键Id
      *
-     * @param bo 资金收支信息
+     * @param bo        资金收支信息
      * @param accountVo 人员账户信息
-     * @param bagVo 账户钱包信息
+     * @param bagVo     账户钱包信息
      * @return 生成的记录Id
      */
     @NotNull
     private String getRecordKeyId(PtBagBo bo, PtUserAccountVo accountVo, PtBagVo bagVo) {
         BigDecimal a = new BigDecimal(100);
         int key3 = 0;
-        if(bo.getReceiptMoney().compareTo(BigDecimal.ZERO)>0){
+        if (bo.getReceiptMoney().compareTo(BigDecimal.ZERO) > 0) {
             key3 = bo.getReceiptMoney().multiply(a).intValue();
         } else {
             key3 = bo.getReceiptMoney().negate().multiply(a).intValue();

+ 0 - 69
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtCardController.java

@@ -179,73 +179,4 @@ public class PtCardController extends BaseController {
         PtBagVo vo = paymentsStrategyContent.createOrder(bo);
         return R.ok(vo);
     }
-
-    /**
-     * 批量充值
-     */
-    @SaCheckPermission("cardOperation:ptCard:edit")
-    @Log(title = "批量账户充值", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PostMapping("/recharge/{userIds}")
-    public R<Void> batchRecharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo, @PathVariable Long[] userIds) {
-        PtBagVo vo;
-        PtBagBo commissionBo = new PtBagBo();
-        commissionBo.setReceiptMoney(BigDecimal.ZERO);
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
-        if (bo.getTakeCommission().equals(Constants.TAKE_COMMISSION)) {
-            //如果要收管理费
-            BigDecimal commission = ptCardService.computeCommission(bo);
-            if (commission.compareTo(BigDecimal.ZERO) > 0) {
-                BeanUtil.copyProperties(bo, commissionBo);
-                commissionBo.setReceiptMoney(commission);
-                commissionBo.setCreditType(CreditTypeEnum.COMMISSION_CHARGE);
-                bo.setReceiptMoney(bo.getReceiptMoney().subtract(commission));
-            }
-        }
-        for (Long userId : userIds) {
-            bo.setUserId(userId);
-            vo = paymentsStrategyContent.createOrder(bo);
-        }
-        if(commissionBo.getReceiptMoney().compareTo(BigDecimal.ZERO)>0){
-            for (Long userId : userIds) {
-                commissionBo.setUserId(userId);
-                vo = paymentsStrategyContent.createOrder(commissionBo);
-            }
-        }
-        return R.ok();
-    }
-
-    /**
-     * 批量退款
-     */
-    @SaCheckPermission("cardOperation:ptCard:edit")
-    @Log(title = "账户批量退款", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PostMapping("/refund/{userIds}")
-    public R<Void> batchRefund(@Validated(EditGroup.class) @RequestBody PtBagBo bo, @PathVariable Long[] userIds) {
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
-        //退款是记支出,所以金额设置为负数
-        bo.setReceiptMoney(bo.getReceiptMoney().negate());
-        for (Long userId:userIds) {
-            bo.setUserId(userId);
-            PtBagVo vo = paymentsStrategyContent.createOrder(bo);
-        }
-        return R.ok();
-    }
-
-    /**
-     * 批量退款
-     */
-    @SaCheckPermission("cardOperation:ptCard:edit")
-    @Log(title = "账户批量设置余额", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PostMapping("/recover/{userIds}")
-    public R<Void> batchRecover(@Validated(EditGroup.class) @RequestBody PtBagBo bo, @PathVariable Long[] userIds) {
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
-        for (Long userId:userIds) {
-            bo.setUserId(userId);
-            PtBagVo vo = bagService.updateBalanceByBo(bo);
-        }
-        return R.ok();
-    }
 }

+ 1 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java

@@ -16,6 +16,7 @@ import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.mapper.PtCardMapper;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.SpringUtils;

+ 112 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java

@@ -1,11 +1,20 @@
 package org.dromara.backstage.payment.controller;
 
+import java.math.BigDecimal;
 import java.util.List;
 
+import cn.hutool.core.bean.BeanUtil;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.backstage.business.payments.strategy.impl.PaymentsStrategyContent;
+import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.enums.CreditTypeEnum;
+import org.dromara.common.core.enums.SystemUseTypeEnum;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -36,6 +45,9 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 public class PtBagController extends BaseController {
 
     private final IPtBagService ptBagService;
+    private final IPtCardService cardService;
+    private final IPtUserAccountService accountService;
+    private final PaymentsStrategyContent paymentsStrategyContent;
 
     /**
      * 查询账户钱包列表
@@ -65,7 +77,7 @@ public class PtBagController extends BaseController {
     @SaCheckPermission("payment:ptBag:query")
     @GetMapping("/{bagId}")
     public R<PtBagVo> getInfo(@NotNull(message = "主键不能为空")
-                                     @PathVariable Long bagId) {
+                              @PathVariable Long bagId) {
         return R.ok(ptBagService.queryById(bagId));
     }
 
@@ -112,8 +124,15 @@ public class PtBagController extends BaseController {
     @RepeatSubmit()
     @PostMapping("/recharge")
     public R<PtBagVo> recharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
-        return R.ok(ptBagService.updateBalanceByBo(bo));
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        PtBagBo commissionBo = computeCommission(bo);
+        if (commissionBo != null) {
+            paymentsStrategyContent.createOrder(commissionBo);
+        }
+        PtBagVo vo = paymentsStrategyContent.createOrder(bo);
+        return R.ok(vo);
     }
+
     /**
      * 账户钱包退款
      */
@@ -122,6 +141,96 @@ public class PtBagController extends BaseController {
     @RepeatSubmit()
     @PostMapping("/refund")
     public R<PtBagVo> refund(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
-        return R.ok(ptBagService.updateBalanceByBo(bo));
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        //退款是记支出,所以金额设置为负数
+        bo.setReceiptMoney(bo.getReceiptMoney().negate());
+        PtBagVo vo = paymentsStrategyContent.createOrder(bo);
+        return R.ok(vo);
+    }
+
+    /**
+     * 批量充值
+     */
+    @SaCheckPermission("cardOperation:ptCard:edit")
+    @Log(title = "批量账户充值", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PostMapping("/recharge/{userIds}")
+    public R<Void> batchRecharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo, @PathVariable Long[] userIds) {
+        BigDecimal doValue = bo.getReceiptMoney();
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        for (Long userId : userIds) {
+            bo.setUserId(userId);
+            bo.setReceiptMoney(doValue);
+            PtBagBo commissionBo = computeCommission(bo);
+            if(commissionBo!=null){
+                paymentsStrategyContent.createOrder(commissionBo);
+            }
+            paymentsStrategyContent.createOrder(bo);
+        }
+
+        return R.ok();
+    }
+
+    /**
+     * 批量退款
+     */
+    @SaCheckPermission("cardOperation:ptCard:edit")
+    @Log(title = "账户批量退款", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PostMapping("/refund/{userIds}")
+    public R<Void> batchRefund(@Validated(EditGroup.class) @RequestBody PtBagBo bo, @PathVariable Long[] userIds) {
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        BigDecimal doValue = bo.getReceiptMoney().negate();
+        for (Long userId : userIds) {
+            //退款是记支出,所以金额设置为负数
+            bo.setReceiptMoney(doValue);
+            bo.setUserId(userId);
+            paymentsStrategyContent.createOrder(bo);
+        }
+        return R.ok();
+    }
+
+    /**
+     * 批量设置余额
+     */
+    @SaCheckPermission("cardOperation:ptCard:edit")
+    @Log(title = "账户批量设置余额", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PostMapping("/recover/{userIds}")
+    public R<Void> batchRecover(@Validated(EditGroup.class) @RequestBody PtBagBo bo, @PathVariable Long[] userIds) {
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        BigDecimal doValue = bo.getReceiptMoney();
+        for (Long userId : userIds) {
+            bo.setUserId(userId);
+            bo.setReceiptMoney(doValue);
+            ptBagService.updateBalanceByBo(bo);
+        }
+        return R.ok();
+    }
+    /**
+     * 计算管理费
+     */
+    private PtBagBo computeCommission(PtBagBo bo) {
+        if (bo.getTakeCommission().equals(Constants.TAKE_COMMISSION)) {
+            Long cardType = bo.getCardTypeId();
+            if(bo.getCardTypeId()==null){
+                PtUserAccountVo accountVo = accountService.queryById(bo.getUserId());
+                cardType = accountVo.getCardType();
+            }
+            bo.setCardTypeId(cardType);
+            //如果要收管理费,则计算管理费
+            BigDecimal commission = cardService.computeCommission(bo);
+            if (commission.compareTo(BigDecimal.ZERO) > 0) {
+                //如果管理费>0,是要入资金收支记录的
+                PtBagBo commissionBo = new PtBagBo();
+                BeanUtil.copyProperties(bo, commissionBo);
+                commissionBo.setReceiptMoney(commission);
+                commissionBo.setCreditType(CreditTypeEnum.COMMISSION_CHARGE);
+                //个人收支入账的金额要减去收掉的管理费
+                bo.setReceiptMoney(bo.getReceiptMoney().subtract(commission));
+                return commissionBo;
+            }
+        }
+        return null;
     }
 }

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PtBagBo.java

@@ -29,13 +29,13 @@ public class PtBagBo extends BaseEntity {
     /**
      * 钱包Id,主键
      */
-    @NotNull(message = "钱包Id,主键不能为空", groups = { EditGroup.class })
+    //@NotNull(message = "钱包Id,主键不能为空", groups = { EditGroup.class })
     private Long bagId;
 
     /**
      * 所属账户Id
      */
-    @NotNull(message = "所属账户Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "所属账户Id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long userId;
 
     /**

+ 8 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPtBagService.java

@@ -97,4 +97,12 @@ public interface IPtBagService {
      * @return 验证通过后的账户钱包
      */
     PtBag verification(PtBagBo bo);
+    /**
+     * 查询账户钱包
+     *
+     * @param userId 用户Id
+     * @param bagCode 敖包代码
+     * @return 账户钱包
+     */
+    PtBagVo queryByUserBagCode(Long userId,String bagCode);
 }

+ 23 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtBagServiceImpl.java

@@ -1,12 +1,14 @@
 package org.dromara.backstage.payment.service.impl;
 
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
+import org.apache.poi.ss.formula.functions.T;
 import org.dromara.backstage.payment.domain.PtBag;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
@@ -46,6 +48,23 @@ public class PtBagServiceImpl implements IPtBagService {
     public PtBagVo queryById(Long bagId) {
         return baseMapper.selectVoById(bagId);
     }
+    /**
+     * 查询账户钱包
+     *
+     * @param userId 用户Id
+     * @param bagCode 敖包代码
+     * @return 账户钱包
+     */
+    @Override
+    public PtBagVo queryByUserBagCode(Long userId, String bagCode) {
+        PtBag entity = baseMapper.selectOne(Wrappers.<PtBag>lambdaQuery()
+            .eq(PtBag::getUserId, userId)
+            .eq(PtBag::getBagCode,bagCode));
+        if (ObjectUtil.isNull(entity)) {
+            return null;
+        }
+        return MapstructUtils.convert(entity, PtBagVo.class);
+    }
 
     /**
      * 分页查询账户钱包列表
@@ -245,10 +264,12 @@ public class PtBagServiceImpl implements IPtBagService {
     public PtBag verification(PtBagBo bo) {
         //获取数据库中对应的钱包
         PtBag entity = baseMapper.selectOne(Wrappers.<PtBag>lambdaQuery()
-            .eq(PtBag::getBagId, bo.getBagId()));
+            .eq(PtBag::getUserId, bo.getUserId())
+            .eq(PtBag::getBagCode,bo.getBagCode()));
 
         //解密余额密文,得到加密的余额
-        BigDecimal entryptValue = BigDecimal.ZERO;
+        //加密余额默认=明文余额
+        BigDecimal entryptValue = entity.getBalance();
         if (StrUtil.isNotBlank(entity.getEncryptBalance())) {
             String decryptValue = YcEncryptUtil.decryptBagBalanceByPublicKey(entity.getEncryptBalance(), entity.getUserId().toString());
             entryptValue = new BigDecimal(decryptValue);

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRegisterInfoController.java

@@ -32,7 +32,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 @Validated
 @RequiredArgsConstructor
 @RestController
-@RequestMapping("/system/registerInfo")
+@RequestMapping("/registerInfo")
 public class SysRegisterInfoController extends BaseController {
 
     private final ISysRegisterInfoService sysRegisterInfoService;