Pārlūkot izejas kodu

feature: 卡务中心->卡务操作 解决循环依赖问题

luoyb 1 gadu atpakaļ
vecāks
revīzija
6ad35b240d
19 mainītis faili ar 504 papildinājumiem un 164 dzēšanām
  1. 22 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteUserAccountService.java
  2. 84 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/SystemUseTypeEnum.java
  3. 4 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/PtCardtype.java
  4. 3 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/PtCardtypeVo.java
  5. 10 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtCardtypeService.java
  6. 15 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtCardtypeServiceImpl.java
  7. 71 27
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PaymentsBusiness.java
  8. 5 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/CommissionPaymentsStrategyImpl.java
  9. 2 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/RechargePaymentsStrategyImpl.java
  10. 58 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/RefundPaymentsStrategyImpl.java
  11. 60 22
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtCardController.java
  12. 2 12
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java
  13. 6 80
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java
  14. 7 6
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfCreditaccountbackBo.java
  15. 2 6
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfCreditaccountbackVo.java
  16. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfCreditAccountBackServiceImpl.java
  17. 11 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PtBagBo.java
  18. 106 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PurseInOutBo.java
  19. 34 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/dubbo/RemoteUserAccountServiceImpl.java

+ 22 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteUserAccountService.java

@@ -0,0 +1,22 @@
+package org.dromara.backstage.api;
+
+/**
+ * name: RemoteUserAccountService
+ * package: org.dromara.backstage.api
+ * description: 用户账户服务
+ * date: 2024-08-22 15:53:29 15:53
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface RemoteUserAccountService {
+    /**
+     * 根据人员账户Id获取账户的卡类
+     *
+     * @param userId 人员账户Id
+     * @return 账户卡类
+     */
+    Long queryCardTypeByUserId(Long userId);
+
+}

+ 84 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/SystemUseTypeEnum.java

@@ -0,0 +1,84 @@
+package org.dromara.common.core.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * name: SystemUseTypeEnum
+ * package: org.dromara.common.core.enums
+ * description: 系统使用类型枚举
+ * date: 2024-08-22 09:24:05 09:24
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public enum SystemUseTypeEnum {
+    /**
+     * 消费
+     */
+    CONSUME(100,"消费"),
+    /**
+     * 水控
+     */
+    WATER(101,"水控");
+
+    private final Integer code;
+    private final String message;
+
+    SystemUseTypeEnum(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return this.code;
+    }
+
+    public String message() {
+        return this.message;
+    }
+
+    public static String getMessage(String name) {
+        for (SystemUseTypeEnum item : SystemUseTypeEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.message;
+            }
+        }
+        return name;
+    }
+    public static String getMessage(int code) {
+        for (SystemUseTypeEnum item : SystemUseTypeEnum.values()) {
+            if (item.code().equals(code)) {
+                return item.message;
+            }
+        }
+        return "未知";
+    }
+    public static Integer getCode(String name) {
+        for (SystemUseTypeEnum item : SystemUseTypeEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.code;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return this.name();
+    }
+
+    /***
+     * 校验重复的code值
+     */
+    public static void main(String[] args) {
+        SystemUseTypeEnum[] thisEnums = SystemUseTypeEnum.values();
+        List<Integer> codeList = new ArrayList<>();
+        for (SystemUseTypeEnum thisEnum : thisEnums) {
+            if (!codeList.contains(thisEnum.code)) {
+                codeList.add(thisEnum.code());
+            }
+        }
+    }
+}

+ 4 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/PtCardtype.java

@@ -28,10 +28,13 @@ public class PtCardtype extends TenantEntity {
     private Long typeId;
 
     /**
-     * 卡类别
+     * 卡类别名称
      */
     private String typeName;
 
+    /**
+     * 卡类别代码
+     */
     private Long code;
 
     /**

+ 3 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/PtCardtypeVo.java

@@ -40,6 +40,9 @@ public class PtCardtypeVo implements Serializable {
     @ExcelProperty(value = "卡类别")
     private String typeName;
 
+    /**
+     * 卡类别代码
+     */
     @ExcelProperty(value = "code")
     private Long code;
     /**

+ 10 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtCardtypeService.java

@@ -3,8 +3,10 @@ package org.dromara.backstage.basics.service;
 import org.dromara.backstage.basics.domain.PtCardtype;
 import org.dromara.backstage.basics.domain.vo.PtCardtypeVo;
 import org.dromara.backstage.basics.domain.bo.PtCardtypeBo;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
+import org.springframework.cache.annotation.Cacheable;
 
 import java.util.Collection;
 import java.util.List;
@@ -77,4 +79,12 @@ public interface IPtCardtypeService {
      * @return 卡片类别名称串,英文逗号分隔
      */
     String selectCardTypeNameByIds(String cardTypeIds);
+
+    /**
+     * 根据卡片类别代码查询卡片类别
+     *
+     * @param code 类别代码
+     * @return 卡片类别
+     */
+    PtCardtypeVo queryByCode(Long code);
 }

+ 15 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtCardtypeServiceImpl.java

@@ -162,4 +162,19 @@ public class PtCardtypeServiceImpl implements IPtCardtypeService {
         }
         return String.join(StringUtils.SEPARATOR, list);
     }
+
+    /**
+     * 根据卡片类别代码查询卡片类别
+     *
+     * @param code 类别代码
+     * @return 卡片类别
+     */
+    @Cacheable(cacheNames = CacheNames.PT_CARD_TYPE, key = "#code")
+    @Override
+    public PtCardtypeVo queryByCode(Long code){
+        PtCardtypeBo bo = new PtCardtypeBo();
+        bo.setCode(code);
+        List<PtCardtypeVo> list = baseMapper.selectVoList(buildQueryWrapper(bo));
+        return list==null?null:list.get(0);
+    }
 }

+ 71 - 27
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PaymentsBusiness.java

@@ -1,22 +1,25 @@
 package org.dromara.backstage.business.payments;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjUtil;
 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.bo.XfCreditaccountbackBo;
+import org.dromara.backstage.consumption.domain.vo.XfCreditaccountbackVo;
 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.PtBagVo;
 import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.backstage.payment.service.IPtBagService;
 import org.dromara.backstage.payment.service.IPtUserAccountService;
-import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.enums.CreditStatusEnum;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-
 /**
  * name: PaymentsBusiness
  * package: org.dromara.backstage.business.payments.strategy
@@ -35,17 +38,18 @@ public class PaymentsBusiness {
     private final IPtUserAccountService userAccountService;
     private final IXfTermService termService;
     private final IPtCardService cardService;
+    private final IPtBagService bagService;
     /**
      * 账户资金收支时获取必要的辅助信息
      *
-     * @param bo 资金收支信息
-     * @param accountVo 资金收支账户信息
-     * @param cardVo 资金收支卡片信息
-     * @param termVo 资金收支消费设备信息
+     * @param bo            资金收支信息
+     * @param accountVo     资金收支账户信息
+     * @param cardVo        资金收支卡片信息
+     * @param bagVo         资金收支钱包信息
+     * @param termVo        资金收支消费设备信息
      * @param workstationVo 资金收支工作站信息
-     *
      */
-    public void getOtherInfo(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, XfTermVo termVo, PtWorkstationVo workstationVo) {
+    public void getOtherInfo(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo) {
         //1.人员辅助信息
         accountVo = userAccountService.queryById(bo.getUserId());
         //2.卡片辅助信息
@@ -56,30 +60,70 @@ public class PaymentsBusiness {
             //查询当前人的正常主卡
             cardVo = cardService.queryMainCardByUserId(bo.getUserId());
         }
-        //3.设备辅助信息
+        //3.钱包辅助信息
+        bagVo = bagService.queryById(bo.getBagId());
+        //4.设备辅助信息
         termVo = termService.queryByNo(bo.getTermNo());
-        //4.工作站辅助信息
+        //5.工作站辅助信息
         workstationVo = workstationService.queryById(bo.getStationId());
 
     }
     /**
-     * 计算管理费
+     * 生成原始收支记录(收支流水备份表)
+     *
+     * @param bo 资金收支信息
+     * @param accountVo 资金收支账户信息
+     * @param cardVo 资金收支卡片信息
+     * @param termVo 资金收支消费设备信息
+     * @param workstationVo 资金收支工作站信息
      *
-     * @param data   需要计算管理费的金额
-     * @param cardNo 卡流水号
-     * @return 管理费
+     * @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;
+    public XfCreditaccountbackVo createOriginalRecord(PtBagBo bo,PtUserAccountVo accountVo, PtCardVo cardVo,PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo){
+        XfCreditaccountbackBo xfCreditaccountbackBo = new XfCreditaccountbackBo();
+        //xfCreditaccountbackBo.setBackId();
+
+        //设置交易数据
+        xfCreditaccountbackBo.setCreditTime(DateUtil.date());
+        xfCreditaccountbackBo.setCreditType(bo.getCreditType().code().toString());
+        xfCreditaccountbackBo.setReceiptMoney(bo.getReceiptMoney());
+        xfCreditaccountbackBo.setPayStyle(bo.getPayStyle());
+        xfCreditaccountbackBo.setCreditStatus(CreditStatusEnum.CREATE.code());
+        xfCreditaccountbackBo.setUseType(bo.getUseType().code());
+        xfCreditaccountbackBo.setOperatorId(bo.getOperatorId());
+
+        //设置交易人数据
+        xfCreditaccountbackBo.setUserId(bo.getUserId());
+
+        //设置交易卡片数据mq
+        if (ObjUtil.isNotEmpty(cardVo)){
+            xfCreditaccountbackBo.setCardNo(cardVo.getCardNo());
+            xfCreditaccountbackBo.setMainCard(cardVo.getMainCard());
         }
-        return commission;
+        //设置账户钱包信息
+        xfCreditaccountbackBo.setBagType(bagVo.getBagCode());
+        xfCreditaccountbackBo.setCardValue(bagVo.getBalance());
+
+        //设置交易设备信息
+        if(ObjUtil.isNotEmpty(termVo)){
+            xfCreditaccountbackBo.setTermNo(termVo.getTermNo());
+            // TODO 2024-08-22 09:15:23 luoyibo 这个termRecordId要看看从哪里来的
+            xfCreditaccountbackBo.setTermRecordId(termVo.getTermId());
+        }
+
+        //设置交易工作站信息
+        if(ObjUtil.isNotEmpty(workstationVo)){
+            xfCreditaccountbackBo.setStationId(workstationVo.getStationId());
+        }
+        //xfCreditaccountbackBo.setRecordId();
+        //xfCreditaccountbackBo.setGroupId();
+        //xfCreditaccountbackBo.setCreditId();
+        //xfCreditaccountbackBo.setOriginalId();
+        //xfCreditaccountbackBo.setSmsSend();
+
+
+
+
+        return null;
     }
 }

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

@@ -33,18 +33,20 @@ public class CommissionPaymentsStrategyImpl implements IPaymentsStrategy {
     /**
      * 新增管理费收支明细订单管理费是不需要更新钱包数据的
      *
-     * @param bo 资金收支明细
+     * @param bo 资金收支明细。,
      * @return 是否新增成功
      */
     @Override
     public PtBagVo creteOrder(PtBagBo bo) {
-        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);
+        PtBagVo bagVo = new PtBagVo();
+        business.getOtherInfo(bo,  accountVo,  cardVo, bagVo, termVo, workstationVo);
+        log.info("[开始生成{}订单]-{}",bo.getOperationMode().message(), JSONUtil.toJsonStr(bo));
         //2.创建收支订单
         //3.收支入账,此处只需要入收支明细表就可以了
         return null;

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

@@ -10,15 +10,11 @@ import org.dromara.backstage.consumption.domain.vo.XfTermVo;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 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.CreditTypeConstants;
-import org.dromara.common.core.enums.CreditTypeEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
-
 /**
  * name: RechargePaymentsStrategyImpl
  * package: org.dromara.backstage.business.payments.strategy.impl
@@ -48,7 +44,8 @@ public class RechargePaymentsStrategyImpl implements IPaymentsStrategy {
         PtCardVo cardVo = new PtCardVo();
         XfTermVo termVo = new XfTermVo();
         PtWorkstationVo workstationVo = new PtWorkstationVo();
-        business.getOtherInfo(bo,  accountVo,  cardVo, termVo, workstationVo);
+        PtBagVo bagVo = new PtBagVo();
+        business.getOtherInfo(bo,  accountVo,  cardVo, bagVo, termVo, workstationVo);
         //2.创建收支订单
         //3.收支入账,此处只需要入收支明细表就可以了
         return null;

+ 58 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/RefundPaymentsStrategyImpl.java

@@ -0,0 +1,58 @@
+package org.dromara.backstage.business.payments.strategy.impl;
+
+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.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.vo.PtBagVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.common.core.constant.CreditTypeConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * name: RechargePaymentsStrategyImpl
+ * package: org.dromara.backstage.business.payments.strategy.impl
+ * description: 退款时资金收支处理策略实现
+ * date: 2024-08-20 19:37:01 19:37
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service(CreditTypeConstants.REFUND)
+public class RefundPaymentsStrategyImpl implements IPaymentsStrategy {
+    private static final Logger log = LoggerFactory.getLogger(RefundPaymentsStrategyImpl.class);
+    private final PaymentsBusiness business;
+    /**
+     * 新增资金收支明细订单
+     *
+     * @param bo 资金收支明细
+     * @return 是否新增成功
+     */
+    @Override
+    public PtBagVo creteOrder(PtBagBo bo) {
+        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();
+        PtBagVo bagVo = new PtBagVo();
+        business.getOtherInfo(bo,  accountVo,  cardVo, bagVo, termVo, workstationVo);
+        //2.创建收支订单
+        //3.收支入账,此处只需要入收支明细表就可以了s
+        return null;
+    }
+
+    @Override
+    public PtBagVo postOrder(PtBagBo bo) {
+        return null;
+    }
+}

+ 60 - 22
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtCardController.java

@@ -1,27 +1,35 @@
 package org.dromara.backstage.cardCenter.controller;
 
-import java.util.List;
-
-import lombok.RequiredArgsConstructor;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.business.payments.strategy.impl.PaymentsStrategyContent;
+import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.validation.annotation.Validated;
-import org.dromara.common.idempotent.annotation.RepeatSubmit;
-import org.dromara.common.log.annotation.Log;
-import org.dromara.common.web.core.BaseController;
-import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.dromara.backstage.payment.domain.vo.PtBagVoToPtBagMapperImpl;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.enums.CreditTypeEnum;
+import org.dromara.common.core.enums.SystemUseTypeEnum;
+import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
-import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
-import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 账户卡片
@@ -37,6 +45,8 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 public class PtCardController extends BaseController {
 
     private final IPtCardService ptCardService;
+    private final PaymentsStrategyContent paymentsStrategyContent;
+    private final PtBagVoToPtBagMapperImpl ptBagVoToPtBagMapperImpl;
 
     /**
      * 查询账户卡片列表
@@ -66,7 +76,7 @@ public class PtCardController extends BaseController {
     @SaCheckPermission("cardOperation:ptCard:query")
     @GetMapping("/{cardId}")
     public R<PtCardVo> getInfo(@NotNull(message = "主键不能为空")
-                                     @PathVariable Long cardId) {
+                               @PathVariable Long cardId) {
         return R.ok(ptCardService.queryById(cardId));
     }
 
@@ -112,7 +122,7 @@ public class PtCardController extends BaseController {
     @Log(title = "账户卡片", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping("/lockCard/{cardId}")
-    public R<Void> lockPtCard( @PathVariable Long cardId) {
+    public R<Void> lockPtCard(@PathVariable Long cardId) {
         return toAjax(ptCardService.lockCard(cardId));
     }
 
@@ -123,18 +133,46 @@ public class PtCardController extends BaseController {
     @Log(title = "账户卡片", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping("/unlockCard/{cardId}")
-    public R<Void> unlockPtCard( @PathVariable Long cardId) {
+    public R<Void> unlockPtCard(@PathVariable Long cardId) {
         return toAjax(ptCardService.unlockCard(cardId));
     }
 
     /**
-     * 修改账户卡片
+     * 充值
      */
     @SaCheckPermission("cardOperation:ptCard:edit")
-    @Log(title = "账户卡片", businessType = BusinessType.UPDATE)
+    @Log(title = "账户充值", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PostMapping("/recharge")
-    public R<Void> recharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
-        return toAjax(ptCardService.rechargeByBo(bo));
+    public R<PtBagVo> recharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
+        PtBagVo vo;
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        BigDecimal commission = ptCardService.computeCommission(bo);
+        if (commission.compareTo(BigDecimal.ZERO) > 0) {
+            PtBagBo commissionBo = MapstructUtils.convert(bo, PtBagBo.class);
+            if (commissionBo != null) {
+                commissionBo.setReceiptMoney(commission);
+                commissionBo.setCreditType(CreditTypeEnum.COMMISSION_CHARGE);
+                paymentsStrategyContent.createOrder(commissionBo);
+            }
+            bo.setReceiptMoney(bo.getReceiptMoney().subtract(commission));
+        }
+        vo = paymentsStrategyContent.createOrder(bo);
+        return R.ok(vo);
+    }
+
+    /**
+     * 充值
+     */
+    @SaCheckPermission("cardOperation:ptCard:edit")
+    @Log(title = "账户退款", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PostMapping("/refund")
+    public R<PtBagVo> refund(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
+        //退款是记支出,所以金额设置为负数
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        bo.setReceiptMoney(bo.getReceiptMoney().negate());
+        PtBagVo vo = paymentsStrategyContent.createOrder(bo);
+        return R.ok(vo);
     }
 }

+ 2 - 12
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java

@@ -1,6 +1,5 @@
 package org.dromara.backstage.cardCenter.service;
 
-import org.dromara.backstage.cardCenter.domain.PtCard;
 import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
@@ -120,20 +119,11 @@ public interface IPtCardService {
      */
     boolean unlockCard(Long cardId);
 
-    /**
-     * 账户充值
-     *
-     * @param bo 充值钱包
-     * @return 是否充值成功
-     */
-    Boolean rechargeByBo(PtBagBo bo);
-
     /**
      * 计算管理费
      *
-     * @param data   需要计算管理费的金额
-     * @param cardId 卡Id
+     * @param bo 需要计算管理费的金额
      * @return 管理费
      */
-    BigDecimal computeCommission(BigDecimal data, Long cardId);
+    BigDecimal computeCommission(PtBagBo bo);
 }

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

@@ -8,23 +8,15 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 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.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.mapper.PtCardMapper;
 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;
@@ -47,12 +39,8 @@ import java.util.*;
 public class PtCardServiceImpl implements IPtCardService {
 
     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;
+    private final IPtCardtypeService cardTypeService;
 
 
     /**
@@ -279,81 +267,18 @@ public class PtCardServiceImpl implements IPtCardService {
             .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
+     * @param bo     资金收支业务对象
      * @return 管理费
      */
     @Override
-    public BigDecimal computeCommission(BigDecimal data, Long userId) {
-        //当前账户信息
-        PtUserAccountVo accountVo = userAccountService.queryById(userId);
+    public BigDecimal computeCommission(PtBagBo bo) {
         //当前账户的卡类
-        PtCardtypeVo cardTypeVo = cardtypeService.queryById(accountVo.getCardType());
+        PtCardtypeVo cardTypeVo = cardTypeService.queryByCode(bo.getCardTypeId());
         //卡类对应的管理费
         BigDecimal commissionRate = new BigDecimal(cardTypeVo.getCommissionCharge());
         if (commissionRate.compareTo(BigDecimal.ZERO) > 0) {
@@ -363,13 +288,14 @@ public class PtCardServiceImpl implements IPtCardService {
             //从系统参数表中拿收管理费的设置
             if (Constants.TAKE_COMMISSION.equals(commType)) {
                 //按比例收取
-                commission = data.multiply(commissionRate.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP)).setScale(2, RoundingMode.HALF_UP);
+                commission = bo.getReceiptMoney().multiply(commissionRate.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP)).setScale(2, RoundingMode.HALF_UP);
             } else {
                 //直接设置
                 commission = commissionRate;
             }
             return commission;
         } else {
+            //没有设置管理费,设置为0
             return BigDecimal.ZERO;
         }
     }

+ 7 - 6
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfCreditaccountbackBo.java

@@ -8,8 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+
+import java.math.BigDecimal;
 import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
 
 /**
  * 资金收支备份业务对象 t_xf_creditAccountBack
@@ -55,9 +56,9 @@ public class XfCreditaccountbackBo extends BaseEntity {
     private Long cardNo;
 
     /**
-     * 卡上余额
+     * 账户余额
      */
-    private Long cardValue;
+    private BigDecimal cardValue;
 
     /**
      * 是否主卡,见sys_yes_no字典类别
@@ -74,7 +75,7 @@ public class XfCreditaccountbackBo extends BaseEntity {
      * 使用类型,100-消费系统
      */
     @NotNull(message = "使用类型,100-消费系统不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long useYpe;
+    private Integer useType;
 
     /**
      * 工作站Id
@@ -108,12 +109,12 @@ public class XfCreditaccountbackBo extends BaseEntity {
      * 交易金额
      */
     @NotNull(message = "交易金额不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long receiptMoney;
+    private BigDecimal receiptMoney;
 
     /**
      * 交易状态
      */
-    private Long creditStatus;
+    private int creditStatus;
 
     /**
      * 团充Id

+ 2 - 6
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfCreditaccountbackVo.java

@@ -1,19 +1,15 @@
 package org.dromara.backstage.consumption.domain.vo;
 
 import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
+
 import org.dromara.backstage.consumption.domain.XfCreditaccountback;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import org.dromara.common.excel.annotation.ExcelDictFormat;
-import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
-import java.util.Date;
-
 
 
 /**
@@ -88,7 +84,7 @@ public class XfCreditaccountbackVo implements Serializable {
      * 使用类型,100-消费系统
      */
     @ExcelProperty(value = "使用类型,100-消费系统")
-    private Long useYpe;
+    private Long useType;
 
     /**
      * 工作站Id

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfCreditAccountBackServiceImpl.java

@@ -81,14 +81,14 @@ public class XfCreditAccountBackServiceImpl implements IXfCreditAccountBackServi
         lqw.eq(bo.getCardValue() != null, XfCreditaccountback::getCardValue, bo.getCardValue());
         lqw.eq(StringUtils.isNotBlank(bo.getMainCard()), XfCreditaccountback::getMainCard, bo.getMainCard());
         lqw.eq(StringUtils.isNotBlank(bo.getBagType()), XfCreditaccountback::getBagType, bo.getBagType());
-        lqw.eq(bo.getUseYpe() != null, XfCreditaccountback::getUseYpe, bo.getUseYpe());
+        lqw.eq(bo.getUseType() != null, XfCreditaccountback::getUseYpe, bo.getUseType());
         lqw.eq(bo.getStationId() != null, XfCreditaccountback::getStationId, bo.getStationId());
         lqw.eq(bo.getOperatorId() != null, XfCreditaccountback::getOperatorId, bo.getOperatorId());
         lqw.eq(bo.getCreditTime() != null, XfCreditaccountback::getCreditTime, bo.getCreditTime());
         lqw.eq(StringUtils.isNotBlank(bo.getCreditType()), XfCreditaccountback::getCreditType, bo.getCreditType());
         lqw.eq(StringUtils.isNotBlank(bo.getPayStyle()), XfCreditaccountback::getPayStyle, bo.getPayStyle());
         lqw.eq(bo.getReceiptMoney() != null, XfCreditaccountback::getReceiptMoney, bo.getReceiptMoney());
-        lqw.eq(bo.getCreditStatus() != null, XfCreditaccountback::getCreditStatus, bo.getCreditStatus());
+        //lqw.eq(bo.getCreditStatus() != null, XfCreditaccountback::getCreditStatus, bo.getCreditStatus());
         lqw.eq(bo.getGroupId() != null, XfCreditaccountback::getGroupId, bo.getGroupId());
         lqw.eq(StringUtils.isNotBlank(bo.getCreditId()), XfCreditaccountback::getCreditId, bo.getCreditId());
         lqw.eq(StringUtils.isNotBlank(bo.getOriginalId()), XfCreditaccountback::getOriginalId, bo.getOriginalId());

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

@@ -3,6 +3,7 @@ package org.dromara.backstage.payment.domain.bo;
 import org.dromara.backstage.payment.domain.PtBag;
 import org.dromara.common.core.enums.BalanceUpdateEnum;
 import org.dromara.common.core.enums.CreditTypeEnum;
+import org.dromara.common.core.enums.SystemUseTypeEnum;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
@@ -115,5 +116,15 @@ public class PtBagBo extends BaseEntity {
      * 操作员Id
      */
     private Long operatorId;
+
+    /**
+     * 系统使用类型
+     */
+    private SystemUseTypeEnum useType;
+
+    /**
+     * 卡片类型Id
+     */
+    private Long cardTypeId;
     //endregion
 }

+ 106 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PurseInOutBo.java

@@ -0,0 +1,106 @@
+package org.dromara.backstage.payment.domain.bo;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.enums.BalanceUpdateEnum;
+import org.dromara.common.core.enums.CreditTypeEnum;
+import org.dromara.common.core.enums.SystemUseTypeEnum;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+
+import java.math.BigDecimal;
+
+/**
+ * name: PurseInOutBo
+ * package: org.dromara.backstage.payment.domain.bo
+ * description: 资金收支业务对象
+ * date: 2024-08-22 09:48:26 09:48
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+public class PurseInOutBo {
+    /**
+     * 资金收支入账钱包Id
+     */
+    @NotNull(message = "钱包Id不能为空", groups = { EditGroup.class })
+    private Long bagId;
+
+    /**
+     * 资金收支入账所属账户Id
+     */
+    @NotNull(message = "所属账户Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
+
+    /**
+     * 资金收支入账钱包代码
+     */
+    @NotBlank(message = "钱包代码", groups = { AddGroup.class, EditGroup.class })
+    private String bagCode;
+
+    /**
+     * 资金来源
+     */
+    private String payStyle;
+
+    /**
+     * 是否收管理费
+     */
+    private String takeCommission;
+
+    /**
+     * 资金收支入账金额
+     */
+    private BigDecimal receiptMoney;
+
+    /**
+     * 资金收支入账对账户余额的操作类型
+     */
+    private BalanceUpdateEnum operationMode;
+    /**
+     * 交易类型
+     */
+    private CreditTypeEnum creditType;
+    /**
+     * 资金收支入账对应卡片Id,可能为空
+     */
+    private Long cardId;
+    /**
+     * 资金收支入账操作的设备机号,可能为空
+     */
+    private Long termNo;
+    /**
+     * 资金收支入账的工作站编号,可能为空
+     */
+    private Long stationId;
+    /**
+     * 操作员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 系统使用类型
+     */
+    private SystemUseTypeEnum useType;
+
+    /**
+     * 校园端流水号,一般使用第三方支付会有此编号
+     * 如:微信充值、微信扫码充值、银行圈存等,会先生成一笔请求支付的订单,支付成功后才会有一卡通系统的资金收支入账
+     *      并通过这个流水号确认订单入账的情况及对账
+     *
+     */
+    private String customerSn;
+
+    /**
+     * 收款方流水号,一般使用第三方支付成功后会有此编号
+     * 如:微信充值、微信扫码充值、银行圈存等,会先生成一笔请求支付的订单,并收收款方返回收款成功后有此数据,
+     *      用来和第三方收款方对账
+     *
+     */
+    private String PayeeSn;
+}

+ 34 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/dubbo/RemoteUserAccountServiceImpl.java

@@ -0,0 +1,34 @@
+package org.dromara.backstage.payment.dubbo;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.backstage.api.RemoteUserAccountService;
+import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.springframework.stereotype.Service;
+
+/**
+ * name: RemoteUserAccountServiceImpl
+ * package: org.dromara.backstage.payment.dubbo
+ * description: 人员账户服务实现
+ * date: 2024-08-22 15:58:36 15:58
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteUserAccountServiceImpl implements RemoteUserAccountService {
+    private final IPtUserAccountService userAccountService;
+    /**
+     * 根据人员账户Id获取账户的卡类
+     *
+     * @param userId 人员账户Id
+     * @return 账户卡类
+     */
+    @Override
+    public Long queryCardTypeByUserId(Long userId) {
+        return userAccountService.queryById(userId).getCardType();
+    }
+}