Просмотр исходного кода

feature: 卡务中心->卡务操作 充值逻辑

luoyb 1 год назад
Родитель
Сommit
048304dac0

+ 4 - 4
config/nacos/datasource.yml

@@ -4,19 +4,19 @@ datasource:
     # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能
     # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能
     url: jdbc:mysql://localhost:3306/ykt_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
     url: jdbc:mysql://localhost:3306/ykt_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
     username: root
     username: root
-    password: sql2016
+    password: root@2024
   gen:
   gen:
     url: jdbc:mysql://localhost:3306/ykt_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
     url: jdbc:mysql://localhost:3306/ykt_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
     username: root
     username: root
-    password: sql2016
+    password: root@2024
   job:
   job:
     url: jdbc:mysql://localhost:3306/ykt_job?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
     url: jdbc:mysql://localhost:3306/ykt_job?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
     username: root
     username: root
-    password: sql2016
+    password: root@2024
   workflow:
   workflow:
     url: jdbc:mysql://localhost:3306/ykt_workflow?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
     url: jdbc:mysql://localhost:3306/ykt_workflow?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
     username: root
     username: root
-    password: sql2016
+    password: root@2024
 #  system-oracle:
 #  system-oracle:
 #    url: jdbc:oracle:thin:@//localhost:1521/XE
 #    url: jdbc:oracle:thin:@//localhost:1521/XE
 #    username: ROOT
 #    username: ROOT

+ 85 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PaymentsBusiness.java

@@ -0,0 +1,85 @@
+package org.dromara.backstage.business.payments;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
+import org.dromara.backstage.basics.service.IPtParameterService;
+import org.dromara.backstage.basics.service.IPtWorkstationService;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
+import org.dromara.backstage.consumption.service.IXfTermService;
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.dromara.common.core.constant.Constants;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * name: PaymentsBusiness
+ * package: org.dromara.backstage.business.payments.strategy
+ * description: 资金收支业务处理类
+ * date: 2024-08-20 20:21:39 20:21
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+public class PaymentsBusiness {
+    private final IPtParameterService parameterService;
+    private final IPtWorkstationService workstationService;
+    private final IPtUserAccountService userAccountService;
+    private final IXfTermService termService;
+    private final IPtCardService cardService;
+    /**
+     * 账户资金收支时获取必要的辅助信息
+     *
+     * @param bo 资金收支信息
+     * @param accountVo 资金收支账户信息
+     * @param cardVo 资金收支卡片信息
+     * @param termVo 资金收支消费设备信息
+     * @param workstationVo 资金收支工作站信息
+     *
+     */
+    public void getOtherInfo(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, XfTermVo termVo, PtWorkstationVo workstationVo) {
+        //1.人员辅助信息
+        accountVo = userAccountService.queryById(bo.getUserId());
+        //2.卡片辅助信息
+        if (bo.getCardId() > 0) {
+            //如果传入了cardId,根据cardId查询卡片信息
+            cardVo = cardService.queryById(bo.getCardId());
+        } else {
+            //查询当前人的正常主卡
+            cardVo = cardService.queryMainCardByUserId(bo.getUserId());
+        }
+        //3.设备辅助信息
+        termVo = termService.queryByNo(bo.getTermNo());
+        //4.工作站辅助信息
+        workstationVo = workstationService.queryById(bo.getStationId());
+
+    }
+    /**
+     * 计算管理费
+     *
+     * @param data   需要计算管理费的金额
+     * @param cardNo 卡流水号
+     * @return 管理费
+     */
+    public BigDecimal computeCommission(BigDecimal data, Long cardNo) {
+        BigDecimal commission = BigDecimal.ZERO;
+        String commType = parameterService.selectParamByCode("COMMISSION_TYPE");
+        //从系统参数表中拿收管理费的设置
+        if(Constants.TAKE_COMMISSION.equals(commType)) {
+            BigDecimal commissionRate = BigDecimal.TEN;
+            commission = data.multiply(commissionRate.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP)).setScale(2, RoundingMode.HALF_UP);
+        }else {
+            //查找卡流水号对卡类的管理费
+            commission = BigDecimal.ZERO;
+        }
+        return commission;
+    }
+}

+ 0 - 45
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/PaymentsBusiness.java

@@ -1,45 +0,0 @@
-package org.dromara.backstage.business.payments.strategy;
-
-import lombok.RequiredArgsConstructor;
-import org.dromara.backstage.basics.service.IPtParameterService;
-import org.dromara.common.core.constant.Constants;
-import org.springframework.stereotype.Service;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-
-/**
- * name: PaymentsBusiness
- * package: org.dromara.backstage.business.payments.strategy
- * description: 资金收支业务处理类
- * date: 2024-08-20 20:21:39 20:21
- *
- * @author luoyibo
- * @version 0.1
- * @since JDK 1.8
- */
-@RequiredArgsConstructor
-@Service
-public class PaymentsBusiness {
-    private final IPtParameterService parameterService;
-    /**
-     * 计算管理费
-     *
-     * @param data   需要计算管理费的金额
-     * @param cardNo 卡流水号
-     * @return 管理费
-     */
-    public BigDecimal computeCommission(BigDecimal data, Long cardNo) {
-        BigDecimal commission = BigDecimal.ZERO;
-        String commType = parameterService.selectParamByCode("COMMISSION_TYPE");
-        //从系统参数表中拿收管理费的设置
-        if(Constants.TAKE_COMMISSION.equals(commType)) {
-            BigDecimal commissionRate = BigDecimal.TEN;
-            commission = data.multiply(commissionRate.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP)).setScale(2, RoundingMode.HALF_UP);
-        }else {
-            //查找卡流水号对卡类的管理费
-            commission = BigDecimal.ZERO;
-        }
-        return commission;
-    }
-}

+ 17 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/CommissionPaymentsStrategyImpl.java

@@ -1,9 +1,15 @@
 package org.dromara.backstage.business.payments.strategy.impl;
 package org.dromara.backstage.business.payments.strategy.impl;
 
 
 import cn.hutool.json.JSONUtil;
 import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
+import org.dromara.backstage.business.payments.PaymentsBusiness;
 import org.dromara.backstage.business.payments.strategy.IPaymentsStrategy;
 import org.dromara.backstage.business.payments.strategy.IPaymentsStrategy;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.common.core.constant.CreditTypeConstants;
 import org.dromara.common.core.constant.CreditTypeConstants;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
@@ -19,9 +25,11 @@ import org.springframework.stereotype.Service;
  * @version 0.1
  * @version 0.1
  * @since JDK 1.8
  * @since JDK 1.8
  */
  */
+@RequiredArgsConstructor
 @Service(CreditTypeConstants.COMMISSION)
 @Service(CreditTypeConstants.COMMISSION)
 public class CommissionPaymentsStrategyImpl implements IPaymentsStrategy {
 public class CommissionPaymentsStrategyImpl implements IPaymentsStrategy {
     private static final Logger log = LoggerFactory.getLogger(CommissionPaymentsStrategyImpl.class);
     private static final Logger log = LoggerFactory.getLogger(CommissionPaymentsStrategyImpl.class);
+    private final PaymentsBusiness business;
     /**
     /**
      * 新增管理费收支明细订单管理费是不需要更新钱包数据的
      * 新增管理费收支明细订单管理费是不需要更新钱包数据的
      *
      *
@@ -30,9 +38,15 @@ public class CommissionPaymentsStrategyImpl implements IPaymentsStrategy {
      */
      */
     @Override
     @Override
     public PtBagVo creteOrder(PtBagBo bo) {
     public PtBagVo creteOrder(PtBagBo bo) {
-        log.info("[开始生成管理费收支订单]-{}", JSONUtil.toJsonStr(bo));
-        //1.创建收支订单
-        //2.收支入账,此处只需要入收支明细表就可以了
+        log.info("[开始生成{}订单]-{}",bo.getOperationMode().message(), JSONUtil.toJsonStr(bo));
+        //1.处理入账需要的其它信息
+        PtUserAccountVo accountVo = new PtUserAccountVo();
+        PtCardVo cardVo = new PtCardVo();
+        XfTermVo termVo = new XfTermVo();
+        PtWorkstationVo workstationVo = new PtWorkstationVo();
+        business.getOtherInfo(bo,  accountVo,  cardVo, termVo, workstationVo);
+        //2.创建收支订单
+        //3.收支入账,此处只需要入收支明细表就可以了
         return null;
         return null;
     }
     }
 
 

+ 13 - 21
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/RechargePaymentsStrategyImpl.java

@@ -2,10 +2,14 @@ package org.dromara.backstage.business.payments.strategy.impl;
 
 
 import cn.hutool.json.JSONUtil;
 import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
 import org.dromara.backstage.business.payments.strategy.IPaymentsStrategy;
 import org.dromara.backstage.business.payments.strategy.IPaymentsStrategy;
-import org.dromara.backstage.business.payments.strategy.PaymentsBusiness;
+import org.dromara.backstage.business.payments.PaymentsBusiness;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.constant.CreditTypeConstants;
 import org.dromara.common.core.constant.CreditTypeConstants;
 import org.dromara.common.core.enums.CreditTypeEnum;
 import org.dromara.common.core.enums.CreditTypeEnum;
@@ -29,7 +33,6 @@ import java.math.BigDecimal;
 @Service(CreditTypeConstants.RECHARGE)
 @Service(CreditTypeConstants.RECHARGE)
 public class RechargePaymentsStrategyImpl implements IPaymentsStrategy {
 public class RechargePaymentsStrategyImpl implements IPaymentsStrategy {
     private static final Logger log = LoggerFactory.getLogger(RechargePaymentsStrategyImpl.class);
     private static final Logger log = LoggerFactory.getLogger(RechargePaymentsStrategyImpl.class);
-    private final PaymentsStrategyContent strategyContent;
     private final PaymentsBusiness business;
     private final PaymentsBusiness business;
     /**
     /**
      * 新增资金收支明细订单
      * 新增资金收支明细订单
@@ -40,25 +43,14 @@ public class RechargePaymentsStrategyImpl implements IPaymentsStrategy {
     @Override
     @Override
     public PtBagVo creteOrder(PtBagBo bo) {
     public PtBagVo creteOrder(PtBagBo bo) {
         log.info("[开始生成{}订单]-{}",bo.getOperationMode().message(), JSONUtil.toJsonStr(bo));
         log.info("[开始生成{}订单]-{}",bo.getOperationMode().message(), JSONUtil.toJsonStr(bo));
-        BigDecimal doMoney = bo.getReceiptMoney();
-        if(bo.getTakeCommission().equals(Constants.TAKE_COMMISSION)){
-            // TODO 2024-08-20 20:01:58 luoyibo 要收管理费,在此处理
-            //1.计算管理费
-            BigDecimal commission = business.computeCommission(bo.getReceiptMoney(), bo.getCardNo());
-            if(commission.compareTo(BigDecimal.ZERO)>0) {
-                //管理费大于0,需要收支入账
-                bo.setReceiptMoney(commission);
-                bo.setCreditType(CreditTypeEnum.COMMISSION_CHARGE);
-
-                strategyContent.createOrder(bo);
-                //管理入账成功后重新设置充值数据
-                //交易类型重置为充值,交易金额为原交易金额-管理费
-                bo.setCreditType(CreditTypeEnum.RECHARGE);
-                bo.setReceiptMoney(doMoney.subtract(commission));
-            }
-        }
-        //1.创建收支订单
-        //2.收支入账,此处只需要入收支明细表就可以了
+        //1.处理入账需要的其它信息
+        PtUserAccountVo accountVo = new PtUserAccountVo();
+        PtCardVo cardVo = new PtCardVo();
+        XfTermVo termVo = new XfTermVo();
+        PtWorkstationVo workstationVo = new PtWorkstationVo();
+        business.getOtherInfo(bo,  accountVo,  cardVo, termVo, workstationVo);
+        //2.创建收支订单
+        //3.收支入账,此处只需要入收支明细表就可以了
         return null;
         return null;
     }
     }
 
 

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

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -125,4 +126,15 @@ public class PtCardController extends BaseController {
     public R<Void> unlockPtCard( @PathVariable Long cardId) {
     public R<Void> unlockPtCard( @PathVariable Long cardId) {
         return toAjax(ptCardService.unlockCard(cardId));
         return toAjax(ptCardService.unlockCard(cardId));
     }
     }
+
+    /**
+     * 修改账户卡片
+     */
+    @SaCheckPermission("cardOperation:ptCard:edit")
+    @Log(title = "账户卡片", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PostMapping("/recharge")
+    public R<Void> recharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
+        return toAjax(ptCardService.rechargeByBo(bo));
+    }
 }
 }

+ 29 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java

@@ -3,9 +3,11 @@ package org.dromara.backstage.cardCenter.service;
 import org.dromara.backstage.cardCenter.domain.PtCard;
 import org.dromara.backstage.cardCenter.domain.PtCard;
 import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.PageQuery;
 
 
+import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
 
 
@@ -68,7 +70,7 @@ public interface IPtCardService {
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
 
     /*
     /*
-     * 根据Id重置账户有效期
+     * 根据人员Id重置账户有效期
      *
      *
      * date 2024-08-06 21:53:42 21:53
      * date 2024-08-06 21:53:42 21:53
      * @author: luoyibo
      * @author: luoyibo
@@ -78,7 +80,7 @@ public interface IPtCardService {
      */
      */
     int resetLifespan(Long[] userIds, String lifespan);
     int resetLifespan(Long[] userIds, String lifespan);
     /*
     /*
-     * 根据Id更新账户的卡类
+     * 根据人员Id更新账户的卡类
      *
      *
      * date 2024-08-06 21:53:42 21:53
      * date 2024-08-06 21:53:42 21:53
      * @author: luoyibo
      * @author: luoyibo
@@ -89,13 +91,19 @@ public interface IPtCardService {
     int resetCardType(Long[] userIds, String cardType);
     int resetCardType(Long[] userIds, String cardType);
 
 
     /**
     /**
-     * 根据Id获取账户发卡信息
+     * 根据人员Id获取账户发卡信息
      *
      *
      * @param userIds     id串,英文逗号隔开
      * @param userIds     id串,英文逗号隔开
      * @return 发卡信息串,英文逗号隔开
      * @return 发卡信息串,英文逗号隔开
      */
      */
     String selectAccountCardByIds(String userIds);
     String selectAccountCardByIds(String userIds);
-
+    /**
+     * 根据人员Id获取账户主卡
+     *
+     * @param userId     人员Id
+     * @return 主卡信息
+     */
+    PtCardVo queryMainCardByUserId(Long userId);
     /**
     /**
      * 根据Id挂失卡片
      * 根据Id挂失卡片
      *
      *
@@ -111,4 +119,21 @@ public interface IPtCardService {
      * @return 解挂是否成功
      * @return 解挂是否成功
      */
      */
     boolean unlockCard(Long cardId);
     boolean unlockCard(Long cardId);
+
+    /**
+     * 账户充值
+     *
+     * @param bo 充值钱包
+     * @return 是否充值成功
+     */
+    Boolean rechargeByBo(PtBagBo bo);
+
+    /**
+     * 计算管理费
+     *
+     * @param data   需要计算管理费的金额
+     * @param cardId 卡Id
+     * @return 管理费
+     */
+    BigDecimal computeCommission(BigDecimal data, Long cardId);
 }
 }

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

@@ -2,28 +2,38 @@ package org.dromara.backstage.cardCenter.service.impl;
 
 
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.DateUtil;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import org.dromara.backstage.payment.domain.PtUserAccount;
-import org.dromara.backstage.payment.domain.bo.PtBagBo;
-import org.dromara.backstage.payment.domain.vo.PtBagVo;
-import org.dromara.common.core.utils.DateUtils;
-import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.SpringUtils;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
+import org.dromara.backstage.basics.domain.vo.PtCardtypeVo;
+import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
+import org.dromara.backstage.basics.service.IPtCardtypeService;
+import org.dromara.backstage.basics.service.IPtParameterService;
+import org.dromara.backstage.basics.service.IPtWorkstationService;
+import org.dromara.backstage.business.payments.strategy.impl.PaymentsStrategyContent;
+import org.dromara.backstage.cardCenter.domain.PtCard;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
-import org.dromara.backstage.cardCenter.domain.PtCard;
 import org.dromara.backstage.cardCenter.mapper.PtCardMapper;
 import org.dromara.backstage.cardCenter.mapper.PtCardMapper;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
+import org.dromara.backstage.consumption.service.IXfTermService;
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
+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.utils.MapstructUtils;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.stereotype.Service;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.*;
 
 
 /**
 /**
@@ -37,6 +47,13 @@ import java.util.*;
 public class PtCardServiceImpl implements IPtCardService {
 public class PtCardServiceImpl implements IPtCardService {
 
 
     private final PtCardMapper baseMapper;
     private final PtCardMapper baseMapper;
+    private final IPtWorkstationService workstationService;
+    private final IPtUserAccountService userAccountService;
+    private final IXfTermService termService;
+    private final IPtParameterService parameterService;
+    private final IPtCardtypeService cardtypeService;
+    private final PaymentsStrategyContent paymentsStrategyContent;
+
 
 
     /**
     /**
      * 查询账户卡片
      * 查询账户卡片
@@ -108,7 +125,9 @@ public class PtCardServiceImpl implements IPtCardService {
         validEntityBeforeSave(add);
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
         if (flag) {
-            bo.setCardId(add.getCardId());
+            if (add != null) {
+                bo.setCardId(add.getCardId());
+            }
         }
         }
         return flag;
         return flag;
     }
     }
@@ -149,7 +168,7 @@ public class PtCardServiceImpl implements IPtCardService {
     }
     }
 
 
     /*
     /*
-     * 根据Id重置账户有效期
+     * 根据人员Id重置账户有效期
      *
      *
      * date 2024-08-06 21:53:42 21:53
      * date 2024-08-06 21:53:42 21:53
      * @author: luoyibo
      * @author: luoyibo
@@ -170,7 +189,7 @@ public class PtCardServiceImpl implements IPtCardService {
     }
     }
 
 
     /*
     /*
-     * 根据Id更新账户的卡类
+     * 根据人员Id更新账户的卡类
      *
      *
      * date 2024-08-06 21:53:42 21:53
      * date 2024-08-06 21:53:42 21:53
      * @author: luoyibo
      * @author: luoyibo
@@ -180,18 +199,16 @@ public class PtCardServiceImpl implements IPtCardService {
      */
      */
     @Override
     @Override
     public int resetCardType(Long[] userIds, String cardType) {
     public int resetCardType(Long[] userIds, String cardType) {
-        for (Long userId : userIds) {
-            baseMapper.update(null, new LambdaUpdateWrapper<PtCard>()
-                .set(PtCard::getCardType, cardType)
-                .set(PtCard::getChangeTime, DateUtil.date())
-                .eq(PtCard::getStatus, '1')
-                .eq(PtCard::getUserId, userId));
-        }
+        Arrays.stream(userIds).forEach(userId -> baseMapper.update(null, new LambdaUpdateWrapper<PtCard>()
+            .set(PtCard::getCardType, cardType)
+            .set(PtCard::getChangeTime, DateUtil.date())
+            .eq(PtCard::getStatus, '1')
+            .eq(PtCard::getUserId, userId)));
         return userIds.length;
         return userIds.length;
     }
     }
 
 
     /**
     /**
-     * 根据Id获取账户发卡信息
+     * 根据人员Id获取账户发卡信息
      *
      *
      * @param userIds id串,英文逗号隔开
      * @param userIds id串,英文逗号隔开
      * @return 发卡信息串,英文逗号隔开
      * @return 发卡信息串,英文逗号隔开
@@ -215,6 +232,23 @@ public class PtCardServiceImpl implements IPtCardService {
         return String.join(StringUtils.SEPARATOR, list);
         return String.join(StringUtils.SEPARATOR, list);
     }
     }
 
 
+    /**
+     * 根据人员Id获取账户主卡
+     *
+     * @param userId 人员Id
+     * @return 主卡信息
+     */
+    @Override
+    public PtCardVo queryMainCardByUserId(Long userId) {
+        PtCardBo bo = new PtCardBo();
+        bo.setUserId(userId);
+        bo.setStatus("1");
+        bo.setMainCard("Y");
+
+        List<PtCardVo> list = SpringUtils.getAopProxy(this).queryList(bo);
+        return list == null ? null : list.get(0);
+    }
+
     /**
     /**
      * 根据Id挂失卡片
      * 根据Id挂失卡片
      *
      *
@@ -244,4 +278,99 @@ public class PtCardServiceImpl implements IPtCardService {
             .eq(PtCard::getStatus, '2')
             .eq(PtCard::getStatus, '2')
             .eq(PtCard::getCardId, cardId)) > 0;
             .eq(PtCard::getCardId, cardId)) > 0;
     }
     }
+
+    /**
+     * 账户充值
+     *
+     * @param bo 充值钱包
+     * @return 是否充值成功
+     */
+    @Override
+    public Boolean rechargeByBo(PtBagBo bo) {
+        BigDecimal doMoney = bo.getReceiptMoney();
+        if (bo.getTakeCommission().equals(Constants.TAKE_COMMISSION)) {
+            //需要收管理费,则要计算管理费并将管理费收支入账
+            BigDecimal commission = computeCommission(bo.getReceiptMoney(), bo.getUserId());
+            if (commission.compareTo(BigDecimal.ZERO) > 0) {
+                //管理费>0,管理费入收支账
+                PtBagBo commissionBo = MapstructUtils.convert(bo, PtBagBo.class);
+                if (commissionBo != null) {
+                    commissionBo.setReceiptMoney(commission);
+                    commissionBo.setCreditType(CreditTypeEnum.COMMISSION_CHARGE);
+                    paymentsStrategyContent.createOrder(commissionBo);
+                }
+                //收了管理费,收支入账的金额=原收支金额-管理费
+                bo.setReceiptMoney(doMoney.subtract(commission));
+                paymentsStrategyContent.createOrder(bo);
+            } else {
+                //管理费=0,直接记资金收支
+                paymentsStrategyContent.createOrder(bo);
+            }
+        } else {
+            //不收管理费,直接记资金收支
+            paymentsStrategyContent.createOrder(bo);
+        }
+        return null;
+    }
+
+    /**
+     * 账户资金收支时获取必要的辅助信息
+     *
+     * @param bo            资金收支信息
+     * @param accountVo     资金收支账户信息
+     * @param cardVo        资金收支卡片信息
+     * @param termVo        资金收支消费设备信息
+     * @param workstationVo 资金收支工作站信息
+     */
+    private void getOtherInfo(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, XfTermVo termVo, PtWorkstationVo workstationVo) {
+        //1.人员辅助信息
+        accountVo = userAccountService.queryById(bo.getUserId());
+        //2.卡片辅助信息
+        if (bo.getCardId() > 0) {
+            //如果传入了cardId,根据cardId查询卡片信息
+            cardVo = queryById(bo.getCardId());
+        } else {
+            //查询当前人的正常主卡
+            cardVo = queryMainCardByUserId(bo.getUserId());
+        }
+        //3.设备辅助信息
+        termVo = termService.queryByNo(bo.getTermNo());
+        //4.工作站辅助信息
+        workstationVo = workstationService.queryById(bo.getStationId());
+
+    }
+
+    /**
+     * 计算管理费
+     * 考虑账户可能没有卡数据就充值,此时只能从账户中获取账户的卡类,从而得到管理费的计算方式
+     *
+     * @param data   需要计算管理费的金额
+     * @param userId 账户Id
+     * @return 管理费
+     */
+    @Override
+    public BigDecimal computeCommission(BigDecimal data, Long userId) {
+        //当前账户信息
+        PtUserAccountVo accountVo = userAccountService.queryById(userId);
+        //当前账户的卡类
+        PtCardtypeVo cardTypeVo = cardtypeService.queryById(accountVo.getCardType());
+        //卡类对应的管理费
+        BigDecimal commissionRate = new BigDecimal(cardTypeVo.getCommissionCharge());
+        if (commissionRate.compareTo(BigDecimal.ZERO) > 0) {
+            //设置有管理费率,需要计算管理费
+            BigDecimal commission;
+            String commType = parameterService.selectParamByCode("COMMISSION_TYPE");
+            //从系统参数表中拿收管理费的设置
+            if (Constants.TAKE_COMMISSION.equals(commType)) {
+                //按比例收取
+                commission = data.multiply(commissionRate.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP)).setScale(2, RoundingMode.HALF_UP);
+            } else {
+                //直接设置
+                commission = commissionRate;
+            }
+            return commission;
+        } else {
+            return BigDecimal.ZERO;
+        }
+    }
 }
 }

+ 8 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfTermService.java

@@ -66,4 +66,12 @@ public interface IXfTermService {
      * @return 是否删除成功
      * @return 是否删除成功
      */
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 根据消费设备编号查询设备信息
+     *
+     * @param  termNo 设备编号
+     * @return 消费设备
+     */
+    XfTermVo queryByNo(Long termNo);
 }
 }

+ 32 - 17
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfTermServiceImpl.java

@@ -1,24 +1,24 @@
 package org.dromara.backstage.consumption.service.impl;
 package org.dromara.backstage.consumption.service.impl;
 
 
-import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
+import org.dromara.backstage.consumption.domain.XfTerm;
 import org.dromara.backstage.consumption.domain.bo.XfTermBo;
 import org.dromara.backstage.consumption.domain.bo.XfTermBo;
 import org.dromara.backstage.consumption.domain.vo.XfTermVo;
 import org.dromara.backstage.consumption.domain.vo.XfTermVo;
-import org.dromara.backstage.consumption.domain.XfTerm;
 import org.dromara.backstage.consumption.mapper.XfTermMapper;
 import org.dromara.backstage.consumption.mapper.XfTermMapper;
 import org.dromara.backstage.consumption.service.IXfTermService;
 import org.dromara.backstage.consumption.service.IXfTermService;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.stereotype.Service;
 
 
+import java.util.Collection;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.Collection;
 
 
 /**
 /**
  * 消费设备Service业务层处理
  * 消费设备Service业务层处理
@@ -39,7 +39,7 @@ public class XfTermServiceImpl implements IXfTermService {
      * @return 消费设备
      * @return 消费设备
      */
      */
     @Override
     @Override
-    public XfTermVo queryById(Long termId){
+    public XfTermVo queryById(Long termId) {
         return baseMapper.selectVoById(termId);
         return baseMapper.selectVoById(termId);
     }
     }
 
 
@@ -78,15 +78,15 @@ public class XfTermServiceImpl implements IXfTermService {
         return lqw;
         return lqw;
     }
     }
 
 
-    private QueryWrapper<XfTerm> buildQueryWrapper(XfTermBo bo,String tableAlias) {
+    private QueryWrapper<XfTerm> buildQueryWrapper(XfTermBo bo, String tableAlias) {
         QueryWrapper<XfTerm> lqw = new QueryWrapper<>();
         QueryWrapper<XfTerm> lqw = new QueryWrapper<>();
         String columnPrefix = "";
         String columnPrefix = "";
-        if(StringUtils.isNotBlank(tableAlias)){
+        if (StringUtils.isNotBlank(tableAlias)) {
             columnPrefix = tableAlias + ".";
             columnPrefix = tableAlias + ".";
         }
         }
-        lqw.eq(bo.getTermNo() != null, columnPrefix+"term_no", bo.getTermNo());
-        lqw.like(StringUtils.isNotBlank(bo.getTermName()), columnPrefix+"term_name", bo.getTermName());
-        lqw.eq(StringUtils.isNotBlank(bo.getTermIp()), columnPrefix+"term_ip", bo.getTermIp());
+        lqw.eq(bo.getTermNo() != null, columnPrefix + "term_no", bo.getTermNo());
+        lqw.like(StringUtils.isNotBlank(bo.getTermName()), columnPrefix + "term_name", bo.getTermName());
+        lqw.eq(StringUtils.isNotBlank(bo.getTermIp()), columnPrefix + "term_ip", bo.getTermIp());
         return lqw;
         return lqw;
     }
     }
 
 
@@ -123,7 +123,7 @@ public class XfTermServiceImpl implements IXfTermService {
     /**
     /**
      * 保存前的数据校验
      * 保存前的数据校验
      */
      */
-    private void validEntityBeforeSave(XfTerm entity){
+    private void validEntityBeforeSave(XfTerm entity) {
         //TODO 做一些数据校验,如唯一约束
         //TODO 做一些数据校验,如唯一约束
     }
     }
 
 
@@ -136,9 +136,24 @@ public class XfTermServiceImpl implements IXfTermService {
      */
      */
     @Override
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         }
         return baseMapper.deleteByIds(ids) > 0;
         return baseMapper.deleteByIds(ids) > 0;
     }
     }
+
+    /**
+     * 根据消费设备编号查询设备信息
+     *
+     * @param termNo 设备编号
+     * @return 消费设备
+     */
+    @Override
+    public XfTermVo queryByNo(Long termNo) {
+        XfTermBo bo = new XfTermBo();
+        bo.setTermNo(termNo);
+        List<XfTermVo> list = baseMapper.selectVoList(buildQueryWrapper(bo));
+
+        return list == null ? null : list.get(0);
+    }
 }
 }

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

@@ -100,9 +100,9 @@ public class PtBagBo extends BaseEntity {
      */
      */
    private CreditTypeEnum creditType;
    private CreditTypeEnum creditType;
     /**
     /**
-     * 卡流水号
+     * 卡片Id
      */
      */
-   private Long cardNo;
+   private Long cardId;
     /**
     /**
      * 设备机号
      * 设备机号
      */
      */