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

Merge remote-tracking branch 'origin/master'

bing 1 год назад
Родитель
Сommit
08dc9c0f82
24 измененных файлов с 727 добавлено и 481 удалено
  1. 1 1
      pom.xml
  2. 100 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/PayStyleEnum.java
  3. 5 4
      ruoyi-common/ruoyi-common-core/src/main/resources/i18n/messages_zh_CN.properties
  4. 3 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/RuoYiBackstageApplication.java
  5. 188 110
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PayBaseBusiness.java
  6. 257 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PayOrderBusiness.java
  7. 0 33
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/IPaymentsStrategy.java
  8. 0 49
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/CommissionPaymentsStrategyImpl.java
  9. 0 34
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/PaymentsStrategyContent.java
  10. 0 58
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/RechargePaymentsStrategyImpl.java
  11. 0 66
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/RefundPaymentsStrategyImpl.java
  12. 8 29
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtCardController.java
  13. 16 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/PtSubsidyitemVo.java
  14. 4 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/mapper/PtSubsidyitemMapper.java
  15. 6 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtSubsidyitemService.java
  16. 9 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtSubsidyitemServiceImpl.java
  17. 0 7
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfCreditAccountBackBo.java
  18. 0 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfCreditAccountBackServiceImpl.java
  19. 50 73
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java
  20. 30 9
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PurseInOutBo.java
  21. 5 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/vo/PtBagVo.java
  22. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtBagServiceImpl.java
  23. 37 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/task/SubsidyScheduled.java
  24. 6 0
      ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/cardCenter/cardOperation/PtSubsidyitemMapper.xml

+ 1 - 1
pom.xml

@@ -441,7 +441,7 @@
                     <source>${java.version}</source>
                     <target>${java.version}</target>
                     <encoding>${project.build.sourceEncoding}</encoding>
-                    <annotationProcessorPaths>
+                      <annotationProcessorPaths>
                         <path>
                             <groupId>com.github.therapi</groupId>
                             <artifactId>therapi-runtime-javadoc-scribe</artifactId>

+ 100 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/PayStyleEnum.java

@@ -0,0 +1,100 @@
+package org.dromara.common.core.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * name: BalanceUpdateEnum
+ * package: org.dromara.common.core.enums
+ * description: 资金来源枚举
+ * date: 2024-08-18 20:57:35 20:57
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public enum PayStyleEnum {
+    /**
+     * 现金
+     */
+    CASH(1,"现金"),
+    /**
+     * 支票
+     */
+    CHEQUE(2,"支票"),
+    /**
+     * 转账
+     */
+    TRANSFER(3,"转账"),
+    /**
+     * 微信
+     */
+    WECHAT(5,"微信"),
+    /**
+     * 支付宝
+     */
+    ALIPAY(6,"支付宝"),
+    /**
+     * 其它
+     */
+    OTHER(4,"其它");
+
+    private final Integer code;
+    private final String message;
+
+    PayStyleEnum(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 (PayStyleEnum item : PayStyleEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.message;
+            }
+        }
+        return name;
+    }
+    public static String getMessage(int code) {
+        for (PayStyleEnum item : PayStyleEnum.values()) {
+            if (item.code().equals(code)) {
+                return item.message;
+            }
+        }
+        return "未知";
+    }
+    public static Integer getCode(String name) {
+        for (PayStyleEnum item : PayStyleEnum.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) {
+        PayStyleEnum[] thisEnums = PayStyleEnum.values();
+        List<Integer> codeList = new ArrayList<>();
+        for (PayStyleEnum thisEnum : thisEnums) {
+            if (!codeList.contains(thisEnum.code)) {
+                codeList.add(thisEnum.code());
+            }
+        }
+    }
+}

+ 5 - 4
ruoyi-common/ruoyi-common-core/src/main/resources/i18n/messages_zh_CN.properties

@@ -63,10 +63,11 @@ tenant.expired=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u8FC7\u671
 bag.balance.valid=\u8D26\u6237\u4F59\u989D\u6821\u9A8C\u5931\u8D25
 bag.balance.update=\u8D26\u6237\u5361\u4F59\u66F4\u65B0\u5931\u8D25!{0}
 ## \u8D44\u91D1\u6536\u652F
-payments.OriginalRecord.create=\u521B\u5EFA\u539F\u59CB\u6536\u652F\u8BB0\u5F55\u5931\u8D25:{0}
-payments.OriginalRecord.get=\u65E0\u6B64Id\u5BF9\u5E94\u7684\u539F\u59CB\u6536\u652F\u8BB0\u5F55:{0}
-payments.OriginalRecord.isPost=\u8BE5\u7B14\u539F\u59CB\u6536\u652F\u8BB0\u5F55\u5DF2\u5165\u8D26,\u539F\u59CBId:{0},\u6536\u652FId:{1}
-payments.keepAccounts.create = \u539F\u59CB\u6536\u652F\u8BB0\u5F55\u5165\u8D26\u5931\u8D25,\u539F\u59CBId:{0}
+payments.OriginalRecord.create=\u521B\u5EFA\u6536\u652F\u8BA2\u5355\u8BB0\u5F55\u5931\u8D25:{0}
+payments.OriginalRecord.get=\u65E0\u6536\u652F\u8BA2\u5355\u8BB0\u5F55,\u8BA2\u5355Id:{0}
+payments.OriginalRecord.isPost=\u6536\u652F\u8BA2\u5355\u5DF2\u5165\u8D26,\u8BA2\u5355Id:{0},\u5165\u8D26Id:{1}
+payments.keepAccounts.create = \u6536\u652F\u5165\u8D26\u5199\u660E\u7EC6\u8868\u5931\u8D25,\u8BA2\u5355Id:{0}
+payments.userTotal.failure = \u6536\u652F\u5165\u8D26\u66F4\u65B0\u4EBA\u5458\u65E5\u7EDF\u8BA1\u8868\u5931\u8D25,\u8BA2\u5355Id:{0}
 ## \u6D88\u8D39
 consumption.userAccount.not.exists = \u4E0D\u5B58\u5728\u6B64\u6D88\u8D39\u8D26\u6237!{0}
 consumption.userCard.not.exists = \u4E0D\u5B58\u5728\u6B64\u5361\u7247\u4FE1\u606F!{0}

+ 3 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/RuoYiBackstageApplication.java

@@ -4,6 +4,8 @@ import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 /**
  * 系统模块
@@ -12,6 +14,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
  */
 @EnableDubbo
 @SpringBootApplication
+@EnableScheduling
 public class RuoYiBackstageApplication {
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(RuoYiBackstageApplication.class);

+ 188 - 110
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PaymentsBusiness.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PayBaseBusiness.java

@@ -1,14 +1,19 @@
 package org.dromara.backstage.business.payments;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
 import org.dromara.backstage.basics.service.IPtWorkstationService;
+import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.backstage.cardCenter.service.IPtSubsidyitemService;
 import org.dromara.backstage.consumption.domain.bo.XfCreditAccountBackBo;
 import org.dromara.backstage.consumption.domain.bo.XfCreditAccountBo;
 import org.dromara.backstage.consumption.domain.bo.XfUserTotalBo;
@@ -21,29 +26,31 @@ import org.dromara.backstage.consumption.service.IXfCreditAccountService;
 import org.dromara.backstage.consumption.service.IXfTermService;
 import org.dromara.backstage.consumption.service.IXfUserTotalService;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.bo.PurseInOutBo;
 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.dromara.common.core.enums.CreditTypeEnum;
 import org.dromara.common.core.exception.payments.PaymentsException;
 import org.dromara.common.core.utils.MessageUtils;
 import org.dromara.common.core.utils.RecordIdUtils;
 import org.jetbrains.annotations.NotNull;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
+import java.text.MessageFormat;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
- * name: PaymentsBusiness
- * package: org.dromara.backstage.business.payments.strategy
- * description: 资金收支业务处理
- * date: 2024-08-20 20:21:39 20:21
+ * name: PayBaseBusiness
+ * package: org.dromara.backstage.business.payments
+ * description: 资金收支业务基础逻辑处理
+ * date: 2024-10-30 07:42:46 07:42
  *
  * @author luoyibo
  * @version 0.1
@@ -51,8 +58,8 @@ import java.util.List;
  */
 @RequiredArgsConstructor
 @Service
-public class PaymentsBusiness {
-    private static final Logger log = LoggerFactory.getLogger(PaymentsBusiness.class);
+@Slf4j
+public class PayBaseBusiness {
     private final IPtWorkstationService workstationService;
     private final IPtUserAccountService userAccountService;
     private final IXfTermService termService;
@@ -61,41 +68,136 @@ public class PaymentsBusiness {
     private final IXfCreditAccountBackService creditAccountBackService;
     private final IXfCreditAccountService creditAccountService;
     private final IXfUserTotalService userTotalService;
+    private final IPtSubsidyitemService subsidyItemService;
+    /**
+     * 检查资金收支的账户信息,资金收支必须有对应的收支账户
+     * @param orderBo 资金收支业务对象
+     * @return 账户信息
+     */
+    public PtUserAccountVo checkUserAccount(PurseInOutBo orderBo){
+        PtUserAccountVo userAccountVo = userAccountService.queryById(orderBo.getUserId());
+        if(ObjUtil.isEmpty(userAccountVo)){
+            throw new PaymentsException(MessageFormat.format("无此账户信息,账户Id:{0}",orderBo.getUserId()));
+        }
+        return userAccountVo;
+    }
 
     /**
-     * 账户资金收支时获取必要的辅助信息
-     *
-     * @param bo 资金收支信息
-     * @return 辅助信息列表
+     * 检查资金收支对应的卡片信息,只要开通了一卡通账户就可以资金收支,因此卡片信息是可能为空的
+     * @param orderBo 资金收支业务对象
+     * @return 卡片信息
      */
-    public List<Object> getOtherInfo(PtBagBo bo) {
-        List<Object> list = new ArrayList<>();
-        //1.人员辅助信息
-        PtUserAccountVo userAccountVo = userAccountService.queryById(bo.getUserId());
-        list.add(userAccountVo);
-        //2.卡片辅助信息
+    public PtCardVo checkUserCard(PurseInOutBo orderBo){
         PtCardVo ptCardVo;
-        if (bo.getCardId() != null && bo.getCardId() > 0) {
+        if (orderBo.getCardId() != null && orderBo.getCardId() > 0) {
             //如果传入了cardId,根据cardId查询卡片信息
-            ptCardVo = cardService.queryById(bo.getCardId());
+            ptCardVo = cardService.queryById(orderBo.getCardId());
         } else {
             //查询当前人的正常主卡
-            ptCardVo = cardService.queryMainCardByUserId(bo.getUserId());
+            ptCardVo = cardService.queryMainCardByUserId(orderBo.getUserId());
         }
-        list.add(ptCardVo);
-        //3.钱包辅助信息
-        PtBagVo ptBagVo = bagService.queryByUserBagCode(bo.getUserId(), bo.getBagCode());
-        list.add(ptBagVo);
-        //4.设备辅助信息
-        XfTermVo xfTermVo = termService.queryByNo(bo.getTermNo() == null ? 0 : bo.getTermNo());
-        list.add(xfTermVo);
-        //5.工作站辅助信息
-        PtWorkstationVo ptWorkstationVo = workstationService.queryById(bo.getStationId());
-        list.add(ptWorkstationVo);
+        return ptCardVo;
+    }
 
-        return list;
+    /**
+     * 检查资金收支钱包信息,资金收支必须有对应的收支钱包
+     * @param orderBo 资金收支业务对象
+     * @return 钱包信息
+     */
+    public PtBagVo checkUserBag(PurseInOutBo orderBo){
+        PtBagVo ptBagVo = bagService.queryByUserBagCode(orderBo.getUserId(), orderBo.getBagCode());
+        if(ObjUtil.isEmpty(ptBagVo)){
+            throw new PaymentsException(MessageFormat.format("无此账户钱包信息,账户Id:{0},钱包代码:{1}",orderBo.getUserId(),orderBo.getBagCode()));
+        }
+        return ptBagVo;
+    }
+
+    /**
+     * 检查资金收支消费设备信息,有些收支操作是通过专用消费机操作的,设备信息有可能为空
+     * @param orderBo 资金收支业务对象
+     * @return 设备信息
+     */
+    public XfTermVo checkTerm(PurseInOutBo orderBo){
+        if(orderBo.getTermNo()==null || orderBo.getTermNo()==0L){
+            return null;
+        }
+        return termService.queryByNo(orderBo.getTermNo());
+    }
+
+    /**
+     * 检查资金收支消费工作站信息,有些收支操作是通过工作站操作,工作站信息有可能为空
+     * @param orderBo 资金收支业务对象
+     * @return 工作站信息
+     */
+    public PtWorkstationVo checkWorkStation(PurseInOutBo orderBo){
+        if(orderBo.getStationId()==null || orderBo.getStationId()==0L){
+            return null;
+        }
+        //这里的工作站Id实际上对应的是工作站的编号
+        return workstationService.queryById(orderBo.getStationId());
     }
 
+    /**
+     * 计算收支操作后的钱包余额
+     * @param bagVo 钱包信息
+     * @param orderBo 收支订单业务对象
+     */
+    public void calculateBalance(PtBagVo bagVo,PurseInOutBo orderBo){
+        if (Objects.requireNonNull(orderBo.getCreditType()) == CreditTypeEnum.COMMISSION_CHARGE) {
+            //管理费实际是不扣钱包余额的
+            orderBo.setBalance(bagVo.getBalance());
+        } else {
+            orderBo.setBalance(bagVo.getBalance().add(orderBo.getReceiptMoney()));
+        }
+    }
+    /**
+     * 收支入账前校验收支原始记录
+     *
+     * @param originalId 原始记录Id
+     */
+    public void ValidOriginalRecord(String originalId) {
+        String message;
+        XfCreditAccountBackVo xfCreditaccountbackVo = creditAccountBackService.queryById(originalId);
+        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);
+            throw new PaymentsException(message);
+        }
+    }
+
+    /**
+     * 资金收支时计算管理费
+     * @param bo 资金收支业务对象
+     * @return 管理费收支业务对象
+     */
+     public PurseInOutBo computeCommission(PurseInOutBo bo) {
+        if (bo.getTakeCommission().equals(Constants.TAKE_COMMISSION)) {
+            Long cardType = bo.getCardTypeId();
+            if (bo.getCardTypeId() == null) {
+                PtUserAccountVo accountVo = userAccountService.queryById(bo.getUserId());
+                cardType = accountVo.getCardType();
+            }
+            bo.setCardTypeId(cardType);
+            //如果要收管理费,则计算管理费
+            PtBagBo bagBo = BeanUtil.copyProperties(bo, PtBagBo.class);
+            BigDecimal commission = cardService.computeCommission(bagBo);
+            if (commission.compareTo(BigDecimal.ZERO) > 0) {
+                //如果管理费>0,是要入资金收支记录的
+                PurseInOutBo commissionBo = new PurseInOutBo();
+                BeanUtil.copyProperties(bo, commissionBo);
+                commissionBo.setReceiptMoney(commission);
+                commissionBo.setCreditType(CreditTypeEnum.COMMISSION_CHARGE);
+                //个人收支入账的金额要减去收掉的管理费
+                bo.setReceiptMoney(bo.getReceiptMoney().subtract(commission));
+                return commissionBo;
+            }
+        }
+        return null;
+    }
     /**
      * 生成原始收支记录(收支流水备份表)
      *
@@ -106,7 +208,7 @@ public class PaymentsBusiness {
      * @param workstationVo 资金收支工作站信息
      * @return 原始收支记录
      */
-    public XfCreditAccountBackVo createOriginalRecord(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo) {
+    public XfCreditAccountBackVo createOriginalRecord(PurseInOutBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo) {
         XfCreditAccountBackBo xfCreditaccountbackBo = new XfCreditAccountBackBo();
         String backId = getRecordKeyId(bo, accountVo, bagVo);
         xfCreditaccountbackBo.setBackId(backId);
@@ -126,11 +228,10 @@ public class PaymentsBusiness {
         //设置交易卡片数据mq
         if (ObjUtil.isNotEmpty(cardVo)) {
             xfCreditaccountbackBo.setCardNo(cardVo.getCardNo());
-            xfCreditaccountbackBo.setMainCard(cardVo.getMainCard());
         }
         //设置账户钱包信息
         xfCreditaccountbackBo.setBagType(bagVo.getBagCode());
-        xfCreditaccountbackBo.setCardValue(bagVo.getBalance());
+        xfCreditaccountbackBo.setCardValue(bo.getBalance());
 
         //设置交易设备信息
         if (ObjUtil.isNotEmpty(termVo)) {
@@ -142,11 +243,11 @@ public class PaymentsBusiness {
         if (ObjUtil.isNotEmpty(workstationVo)) {
             xfCreditaccountbackBo.setStationId(workstationVo.getStationId());
         }
-
+        //原始订单入库
         XfCreditAccountBackVo creditAccountBackVo = creditAccountBackService.createOriginalRecord(xfCreditaccountbackBo);
         if (ObjUtil.isEmpty(creditAccountBackVo)) {
             String message = MessageUtils.message("payments.OriginalRecord.create", JSONUtil.parse(bo));
-            throw new PaymentsException("资金收支-原始记录", message);
+            throw new PaymentsException(message);
         }
         return creditAccountBackVo;
     }
@@ -162,9 +263,7 @@ public class PaymentsBusiness {
      * @param originalId    原始收支记录Id(收支备份表主键)
      * @return 正式收支记录
      */
-    public XfCreditAccountVo keepAccounts(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo, String originalId) {
-        //校验要处理的原始收支记录
-        ValidOriginalRecord(originalId);
+    public XfCreditAccountVo keepAccounts(PurseInOutBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo, String originalId) {
         XfCreditAccountBo xfCreditaccountbo = new XfCreditAccountBo();
         String accountId = getRecordKeyId(bo, accountVo, bagVo);
         xfCreditaccountbo.setCreditId(accountId);
@@ -183,36 +282,46 @@ public class PaymentsBusiness {
         xfCreditaccountbo.setDeptId(accountVo.getDeptId());
         xfCreditaccountbo.setDeptName(accountVo.getDeptName());
         //设置设备信息
-        xfCreditaccountbo.setTermNo(termVo.getTermNo());
-        xfCreditaccountbo.setTermName(termVo.getTermName());
-        xfCreditaccountbo.setTermRecordId(bo.getTermRecordId());
-        //设置工作站信息
-        xfCreditaccountbo.setStationNumb(workstationVo.getStationNumb());
-        xfCreditaccountbo.setStationName(workstationVo.getStationName());
+        if(ObjUtil.isNotEmpty(termVo)) {
+            xfCreditaccountbo.setTermNo(termVo.getTermNo());
+            xfCreditaccountbo.setTermName(termVo.getTermName());
+            xfCreditaccountbo.setTermRecordId(bo.getTermRecordId());
+        }
+        if(ObjUtil.isNotEmpty(workstationVo)) {
+            //设置工作站信息
+            xfCreditaccountbo.setStationNumb(workstationVo.getStationNumb());
+            xfCreditaccountbo.setStationName(workstationVo.getStationName());
+        }
         //设置卡片信息
         xfCreditaccountbo.setCardNo(cardVo.getCardNo());
-        xfCreditaccountbo.setCardValue(bagVo.getBalance());
         xfCreditaccountbo.setCardType(cardVo.getCardType());
         xfCreditaccountbo.setCardCount(bagVo.getRechargeCount() + 1);
         xfCreditaccountbo.setCardTypeName(cardVo.getCardTypeName());
         xfCreditaccountbo.setMainCard(cardVo.getMainCard());
         //设置钱包信息
         xfCreditaccountbo.setBagType(bagVo.getBagCode());
+        xfCreditaccountbo.setCardValue(bo.getBalance());
         // 设置操作员信息
-        xfCreditaccountbo.setOperatorId(bo.getOperatorId());
         xfCreditaccountbo.setOperatorName(bo.getOperatorName());
+        xfCreditaccountbo.setOperatorId(bo.getOperatorId());
 
         xfCreditaccountbo.setOriginalId(originalId);
 
         XfCreditAccountVo creditAccountVo = creditAccountService.keepAccounts(xfCreditaccountbo);
         if (ObjUtil.isEmpty(creditAccountVo)) {
             String message = MessageUtils.message("payments.keepAccounts.create", originalId);
-            throw new PaymentsException("资金收支-收支入账", message);
+            throw new PaymentsException(message);
         }
         return creditAccountVo;
     }
 
-    public XfUserTotalVo createOrUpdateUserTotal(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo) {
+    /**
+     * 处理个人日统计表
+     * @param bo 收支信息
+     * @param accountVo 账户信息
+     * @param cardVo 账户卡片信息
+     */
+    public void createOrUpdateUserTotal(PurseInOutBo bo, PtUserAccountVo accountVo, PtCardVo cardVo) {
         XfUserTotalBo xfUserTotalBo = new XfUserTotalBo();
         xfUserTotalBo.setUserId(accountVo.getUserId());
         xfUserTotalBo.setUserNumb(accountVo.getUserNumb());
@@ -223,80 +332,49 @@ public class PaymentsBusiness {
         xfUserTotalBo.setUseType(bo.getUseType().code());
         xfUserTotalBo.setCreditMoney(bo.getReceiptMoney());
 
-        return userTotalService.createOrUpdateUserTotal(xfUserTotalBo);
+        XfUserTotalVo vo = userTotalService.createOrUpdateUserTotal(xfUserTotalBo);
+        if (ObjUtil.isEmpty(vo)) {
+            String message = MessageUtils.message("payments.userTotal.failure", bo.getOriginalId());
+            throw new PaymentsException(message);
+        }
     }
 
-    public PtBagVo updateBalance(PtBagBo bagBo) {
+    /**
+     * 更新钱包余额
+     * @param bo 收支业务对象
+     * @return 更新后钱包余额
+     */
+    public PtBagVo updateBalance(PurseInOutBo bo) {
+        PtBagBo bagBo = BeanUtil.copyProperties(bo, PtBagBo.class);
         return bagService.updateBalanceByBo(bagBo);
     }
 
     /**
-     * 通用收支入账处理逻辑
-     * 这里主要是处理一次性完成的原始订单生成、收支记账
-     *
-     * @param bo 资金收支信息
-     * @return 辅助信息
+     * 更新原始订单的入账状态
+     * @param bo 收支信息
+     * @param status 入账状态
+     * @param cardValue 入账后账户余额
      */
-    public List<Object> createOrderMin(PtBagBo bo) {
-        log.info("[开始生成{}订单]-{}", bo.getCreditType().message(), JSONUtil.toJsonStr(bo));
-        //1.处理入账需要的其它信息
-        List<Object> list = getOtherInfo(bo);
-        PtUserAccountVo accountVo = list.get(0) == null ? new PtUserAccountVo() : (PtUserAccountVo) list.get(0);
-        PtCardVo cardVo = list.get(1) == null ? new PtCardVo() : (PtCardVo) list.get(1);
-        PtBagVo bagVo = list.get(2) == null ? new PtBagVo() : (PtBagVo) list.get(2);
-        XfTermVo termVo = list.get(3) == null ? new XfTermVo() : (XfTermVo) list.get(3);
-        PtWorkstationVo workstationVo = list.get(4) == null ? new PtWorkstationVo() : (PtWorkstationVo) list.get(4);
-
-        //2.创建收支订单
-        XfCreditAccountBackVo creditBackVo = createOriginalRecord(bo, (PtUserAccountVo) list.get(0),
-            (PtCardVo) list.get(1), (PtBagVo) list.get(2), (XfTermVo) list.get(3), (PtWorkstationVo) list.get(4));
-        bo.setOriginalId(creditBackVo.getBackId());
-        //3.收支入账,此处只需要入收支明细表就可以了
-        log.info("[{}订单生成完成,开始生成{}收支记录]-{}", bo.getCreditType().message(), bo.getCreditType().message(), JSONUtil.toJsonStr(bo));
-        XfCreditAccountVo creditVo = keepAccounts(bo, accountVo, cardVo, bagVo, termVo, workstationVo, creditBackVo.getBackId());
-        bo.setCreditId(creditVo.getCreditId());
-        return list;
+    public void updateOriginalOrderStatus(PurseInOutBo bo, Integer status, BigDecimal cardValue) {
+        creditAccountBackService.updateStatusById(bo.getOriginalId(), status, bo.getCreditId(), cardValue);
     }
 
     /**
-     * 通用收支入账处理逻辑
-     * 这里主要是处理一次性完成的原始订单生成、收支记账和更新个人日统计表功能
-     *
-     * @param bo 资金收支信息
+     * 获取待入账的补助明细
+     * @return 补助明细
      */
-    public void createOrderNormal(PtBagBo bo) {
-        List<Object> list = createOrderMin(bo);
-        PtUserAccountVo accountVo = list.get(0) == null ? new PtUserAccountVo() : (PtUserAccountVo) list.get(0);
-        PtCardVo cardVo = list.get(1) == null ? new PtCardVo() : (PtCardVo) list.get(1);
-
-        //4.写日统计表
-        log.info("[收支记录生成完成,开始写个人日统计表]-{}", JSONUtil.toJsonStr(bo));
-        createOrUpdateUserTotal(bo, accountVo, cardVo);
-    }
-
-    public void updateOrderStatus(PtBagBo bo, Integer status, BigDecimal cardValue) {
-        creditAccountBackService.updateStatusById(bo.getOriginalId(), status, bo.getCreditId(), cardValue);
+    public List<PtSubsidyitemVo> selectPostSubsidyItem(){
+        return subsidyItemService.selectPostSubsidyItem();
     }
 
     /**
-     * 收支入账前校验收支原始记录
-     *
-     * @param originalId 原始记录Id
+     * 更新补助明细的到账状态
+     * @param bo 补助明细
+     * @return 更新状态
      */
-    private void ValidOriginalRecord(String originalId) {
-        String message;
-        XfCreditAccountBackVo xfCreditaccountbackVo = creditAccountBackService.queryById(originalId);
-        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);
-            throw new PaymentsException("资金收支-原始记录", message);
-        }
+    public boolean updatePostSubsidyItemStatus(PtSubsidyitemBo bo){
+        return subsidyItemService.updateByBo(bo);
     }
-
     /**
      * 生成资金收支备份表和收支表的32位主键Id
      *
@@ -306,7 +384,7 @@ public class PaymentsBusiness {
      * @return 生成的记录Id
      */
     @NotNull
-    private String getRecordKeyId(PtBagBo bo, PtUserAccountVo accountVo, PtBagVo bagVo) {
+    private String getRecordKeyId(PurseInOutBo bo, PtUserAccountVo accountVo, PtBagVo bagVo) {
         BigDecimal a = new BigDecimal(100);
         int key3 = 0;
         if (bo.getReceiptMoney().compareTo(BigDecimal.ZERO) > 0) {

+ 257 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PayOrderBusiness.java

@@ -0,0 +1,257 @@
+package org.dromara.backstage.business.payments;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
+import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo;
+import org.dromara.backstage.consumption.domain.vo.XfCreditAccountBackVo;
+import org.dromara.backstage.consumption.domain.vo.XfCreditAccountVo;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
+import org.dromara.backstage.payment.domain.bo.PurseInOutBo;
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.enums.*;
+import org.dromara.common.core.exception.consume.ConsumeException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * name: PayOrderBusiness
+ * package: org.dromara.backstage.business.payments
+ * description: 和资金收支相关的订单处理逻辑
+ * date: 2024-10-29 22:43:50 22:43
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class PayOrderBusiness {
+
+    private final PayBaseBusiness payBaseBusiness;
+
+    /**
+     * 生成收支原始订单信息,写t_xf_creditAccountBack表
+     * @param orderBo 收支订单业务对象
+     * @return 原始订单信息
+     */
+    public XfCreditAccountBackVo createOrder(PurseInOutBo orderBo) {
+        log.info("[{}订单信息验证-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
+        // 获取创建订单的辅助信息
+        PtUserAccountVo userAccountVo = payBaseBusiness.checkUserAccount(orderBo);
+        PtCardVo userCardVo = payBaseBusiness.checkUserCard(orderBo);
+        PtBagVo userBagVo = payBaseBusiness.checkUserBag(orderBo);
+        XfTermVo termVo = payBaseBusiness.checkTerm(orderBo);
+        PtWorkstationVo workstationVo = payBaseBusiness.checkWorkStation(orderBo);
+
+        // 生成原始订单记录
+        log.info("[{}订单验证通过,创建订单]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
+        // 生成原始订单记录前先计算收支后的钱包余额,这里只是记录下收支完成后的钱包应有余额,但还没有实际更新钱包余额
+        payBaseBusiness.calculateBalance(userBagVo,orderBo);
+        return payBaseBusiness.createOriginalRecord(orderBo, userAccountVo,
+            userCardVo, userBagVo, termVo, workstationVo);
+    }
+
+    /**
+     * 收支订单入库
+     * 写/更新表:收支明细表:t_xf_creditAccount 个人日统计表:t_xf_userTotal 账户钱包表:t_pt_bag
+     * @param orderBo 收支订单业务对象
+     * @return 入库后的收支订单业务对象
+     */
+    @Transactional(rollbackFor = ConsumeException.class)
+    public PurseInOutBo postOrder(PurseInOutBo orderBo) {
+        //校验待入库的原始订单
+        payBaseBusiness.ValidOriginalRecord(orderBo.getOriginalId());
+        // 获取入库订单的辅助信息
+        PtUserAccountVo userAccountVo = payBaseBusiness.checkUserAccount(orderBo);
+        PtCardVo userCardVo = payBaseBusiness.checkUserCard(orderBo);
+        PtBagVo userBagVo = payBaseBusiness.checkUserBag(orderBo);
+        XfTermVo termVo = payBaseBusiness.checkTerm(orderBo);
+        PtWorkstationVo workstationVo = payBaseBusiness.checkWorkStation(orderBo);
+        // 生成收支明细表
+        log.info("[{}订单处理收支明细]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
+        XfCreditAccountVo orderDetailVo = payBaseBusiness.keepAccounts(orderBo, userAccountVo, userCardVo, userBagVo, termVo, workstationVo, orderBo.getOriginalId());
+        orderBo.setCreditId(orderDetailVo.getCreditId());
+        orderBo.setBalance(userBagVo.getBalance());
+        //如果交易类型不为收管理费,则继续下面的操作以完成订单入库
+        if(!orderBo.getCreditType().equals(CreditTypeEnum.COMMISSION_CHARGE)){
+            // 处理个人日统计表
+            log.info("[{}订单处理人日统计表]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
+            payBaseBusiness.createOrUpdateUserTotal(orderBo, userAccountVo, userCardVo);
+
+            // 更新个人钱包余额
+            log.info("[{}订单处理钱包余额]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
+            PtBagVo afterBagVo = payBaseBusiness.updateBalance(orderBo);
+            orderBo.setBalance(afterBagVo.getBalance());
+            // 入账成功,更新原始订单的入账状态
+            log.info("[{}订单更新入账状态]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
+            payBaseBusiness.updateOriginalOrderStatus(orderBo, CreditStatusEnum.SUCCESS.code(), afterBagVo.getBalance());
+        }
+        return orderBo;
+    }
+
+    /**
+     * 普通收支业务处理:充值/批量充值 退款/批量退款
+     * @param orderBo 收支业务对象
+     * @return 处理结果
+     */
+    @Transactional(rollbackFor = ConsumeException.class)
+    public R<PurseInOutBo> createNormalOrder(PurseInOutBo orderBo) {
+        //将收支请求写入原始收支记录表
+        log.info("[准备创建{}订单-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
+        XfCreditAccountBackVo OriginalOrder = createOrder(orderBo);
+        orderBo.setOriginalId(OriginalOrder.getBackId());
+
+        //原始收支记录成功,收支入账
+        log.info("准备[{}订单入账]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
+        PurseInOutBo result = postOrder(orderBo);
+
+        return R.ok(result);
+    }
+
+    /**
+     * 补助收支入账
+     * @return 入账结果
+     */
+    @Transactional(rollbackFor = ConsumeException.class)
+    public R<Object> createSubsidyOrder(){
+        List<String> infoList = new ArrayList<>();
+        Map<String, Integer> mapCount = new HashMap<>();
+        mapCount.put("successCount",0);
+        mapCount.put("errorCount",0);
+        //获取需要入账的补助明细
+        List<PtSubsidyitemVo> list = payBaseBusiness.selectPostSubsidyItem();
+        if(ObjUtil.isEmpty(list)|| list.isEmpty()){
+            return R.fail("[补助到账]-[没有需要入账的补助明细]");
+        }
+        list.parallelStream().forEach(item->{
+            PurseInOutBo orderBo = createSubsidyPostBo(item);
+            int successCount;
+            int errorCount;
+
+            try {
+                R<PurseInOutBo> result = createNormalOrder(orderBo);
+                if (result.getCode() == R.SUCCESS) {
+                    //到账成功,更新补助明细的到账状态
+                    item.setGetDate(DateUtil.date());
+                    item.setFillStatus("Y");
+                    PtSubsidyitemBo bo = BeanUtil.copyProperties(item, PtSubsidyitemBo.class);
+                    boolean bl = payBaseBusiness.updatePostSubsidyItemStatus(bo);
+                    if(bl){
+                        successCount = mapCount.get("successCount");
+                        successCount ++;
+                        mapCount.put("successCount",successCount);
+                    }
+                } else {
+                    errorCount = mapCount.get("errorCount");
+                    errorCount ++;
+                    mapCount.put("errorCount",errorCount);
+                    infoList.add(MessageFormat.format("[补助到账失败]-[补助信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(orderBo), result.getData().toString()));
+                }
+            } catch (Exception e) {
+                infoList.add(MessageFormat.format("[补助到账失败]-[补助信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(orderBo), e.getMessage()));
+            }
+        });
+        String message = MessageFormat.format("补助到账完成,成功[{0}]条,失败[{1}]条", mapCount.get("successCount"), mapCount.get("errorCount"));
+        infoList.forEach(log::error);
+        log.info(message);
+        return R.ok(message);
+    }
+    /**
+     * 资金收支时计算管理费
+     * @param bo 资金收支业务对象
+     * @return 管理费收支业务对象
+     */
+    public PurseInOutBo computeCommission(PurseInOutBo bo){
+        return payBaseBusiness.computeCommission(bo);
+    }
+
+    /**
+     * 充值入账
+     * @param bo 充值业务对象
+     * @return 入账结果
+     */
+    @Transactional(rollbackFor = ConsumeException.class)
+    public R<PurseInOutBo> recharge(PurseInOutBo bo){
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        PurseInOutBo commissionBo = computeCommission(bo);
+        try {
+            if (commissionBo != null) {
+                R<PurseInOutBo> commissionResult = createNormalOrder(commissionBo);
+                if (commissionResult.getCode() != R.SUCCESS) {
+                    return R.fail(commissionResult.getMsg());
+                }
+            }
+            R<PurseInOutBo> result = createNormalOrder(bo);
+            if (result.getCode() == R.SUCCESS) {
+                return R.ok(result.getData());
+            } else {
+                return R.fail(result.getMsg());
+            }
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
+
+    /**
+     * @param bo 退款业务对象
+     * @return 退款结果
+     */
+    @Transactional(rollbackFor = ConsumeException.class)
+    public R<PurseInOutBo>refund(PurseInOutBo bo){
+        //校验钱包余额是否充足
+        PtBagVo bagVo = payBaseBusiness.checkUserBag(bo);
+        if (bagVo.getBalance().compareTo(bo.getReceiptMoney()) < 0) {
+            return R.fail(MessageFormat.format("钱包余额不足,当前余额为:{0}", bagVo.getBalance()),bo);
+        }
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        //退款是记支出,所以金额设置为负数
+        bo.setReceiptMoney(bo.getReceiptMoney().negate());
+        try {
+            R<PurseInOutBo> result = createNormalOrder(bo);
+            if (result.getCode() == R.SUCCESS) {
+                return R.ok(result.getData());
+            } else {
+                return R.fail(result.getMsg(),bo);
+            }
+        } catch (Exception e) {
+            return R.fail(e.getMessage(),bo);
+        }
+    }
+    /**
+     * 将要入账的补助信息转成收支订单业务对象
+     * @param item 补助信息
+     * @return 收支订单
+     */
+    private static PurseInOutBo createSubsidyPostBo(PtSubsidyitemVo item) {
+        PurseInOutBo orderBo = new PurseInOutBo();
+        orderBo.setUserId(item.getUserId());
+        orderBo.setBagCode(item.getBagCode());
+        orderBo.setPayStyle(PayStyleEnum.OTHER.code().toString());
+        orderBo.setTakeCommission("0");
+        orderBo.setReceiptMoney(item.getFillMoney());
+        orderBo.setOperationMode(BalanceUpdateEnum.RECHARGE);
+        orderBo.setCreditType(CreditTypeEnum.SUBSIDY_MACHINE_RECHARGE);
+        orderBo.setOperatorId(item.getOperatorId());
+        orderBo.setOperatorName(item.getOperatorName());
+        orderBo.setUseType(SystemUseTypeEnum.CONSUME);
+
+        return orderBo;
+    }
+
+}

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

@@ -1,33 +0,0 @@
-package org.dromara.backstage.business.payments.strategy;
-
-import org.dromara.backstage.payment.domain.bo.PtBagBo;
-import org.dromara.backstage.payment.domain.vo.PtBagVo;
-
-/**
- * name: IUpdateStrategy
- * package: org.dromara.backstage.business.bag.Strategy
- * description: 资金收支策略
- * date: 2024-08-19 16:31:27 16:31
- *
- * @author yubo
- * @version 0.1
- * @since JDK 1.8
- */
-public interface IPaymentsStrategy {
-    /**
-     * 创建资金收支订单
-     *
-     *
-     * @param bo 资金收支账户钱包
-     * @return 资金收支订单信息
-     */
-    PtBagVo creteOrder(PtBagBo bo);
-
-    /**
-     * 资金收支入账
-     *
-     * @param bo 账户钱包
-     */
-    PtBagVo postOrder(PtBagBo bo);
-
-}

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

@@ -1,49 +0,0 @@
-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.COMMISSION)
-public class CommissionPaymentsStrategyImpl implements IPaymentsStrategy {
-    private static final Logger log = LoggerFactory.getLogger(CommissionPaymentsStrategyImpl.class);
-    private final PaymentsBusiness business;
-    /**
-     * 新增管理费收支明细订单管理费是不需要更新钱包数据的
-     *
-     * @param bo 资金收支明细。,
-     * @return 是否新增成功
-     */
-    @Override
-    public PtBagVo creteOrder(PtBagBo bo) {
-        business.createOrderMin(bo);
-        return null;
-    }
-
-    @Override
-    public PtBagVo postOrder(PtBagBo bo) {
-        return null;
-    }
-}

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

@@ -1,34 +0,0 @@
-package org.dromara.backstage.business.payments.strategy.impl;
-
-import org.dromara.backstage.business.payments.strategy.IPaymentsStrategy;
-import org.dromara.backstage.payment.domain.bo.PtBagBo;
-import org.dromara.backstage.payment.domain.vo.PtBagVo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * name: UpdateStrategyContent
- * package: org.dromara.backstage.business.bag.strategy.impl
- * description: 资金收支策略上下文
- * date: 2024-08-19 22:08:12 22:08
- *
- * @author luoyibo
- * @version 0.1
- * @since JDK 1.8
- */
-@Service
-public class PaymentsStrategyContent {
-    private final Map<String, IPaymentsStrategy> strategyMap = new ConcurrentHashMap<>();
-
-    @Autowired
-    public PaymentsStrategyContent(Map<String, IPaymentsStrategy> strategyMap) {
-        this.strategyMap.putAll(strategyMap);
-    }
-
-    public PtBagVo createOrder(PtBagBo bo){
-        return strategyMap.get(bo.getCreditType().name()).creteOrder(bo);
-    }
-}

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

@@ -1,58 +0,0 @@
-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.strategy.IPaymentsStrategy;
-import org.dromara.backstage.business.payments.PaymentsBusiness;
-import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
-import org.dromara.backstage.consumption.domain.vo.XfCreditAccountBackVo;
-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.dromara.common.core.enums.CreditStatusEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * 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.RECHARGE)
-public class RechargePaymentsStrategyImpl implements IPaymentsStrategy {
-    private static final Logger log = LoggerFactory.getLogger(RechargePaymentsStrategyImpl.class);
-    private final PaymentsBusiness business;
-    /**
-     * 新增资金收支明细订单
-     *
-     * @param bo 资金收支明细
-     * @return 是否新增成功
-     */
-    @Override
-    public PtBagVo creteOrder(PtBagBo bo) {
-        business.createOrderNormal(bo);
-        //5.写钱包余额
-        log.info("[个人日统计表处理成功,开始更新账户余额-{}", JSONUtil.toJsonStr(bo));
-        PtBagVo vo = business.updateBalance(bo);
-        business.updateOrderStatus(bo, CreditStatusEnum.SUCCESS.code(),vo.getBalance());
-        return vo;
-    }
-
-    @Override
-    public PtBagVo postOrder(PtBagBo bo) {
-        return null;
-    }
-}

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

@@ -1,66 +0,0 @@
-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.XfCreditAccountBackVo;
-import org.dromara.backstage.consumption.domain.vo.XfCreditAccountVo;
-import org.dromara.backstage.consumption.domain.vo.XfTermVo;
-import org.dromara.backstage.consumption.domain.vo.XfUserTotalVo;
-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.dromara.common.core.enums.CreditStatusEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * 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;
-
-    /**
-     * 新增资金收支明细订单
-     * <p>
-     * 因为管理平台的退款操作是一次性完成,所以将订单创建及更新钱包一次性完成
-     *
-     * @param bo 资金收支明细
-     * @return 是否新增成功
-     */
-    @Override
-    public PtBagVo creteOrder(PtBagBo bo) {
-        BigDecimal doValue = bo.getReceiptMoney();
-        business.createOrderNormal(bo);
-
-        //5.写钱包余额
-        log.info("[个人日统计表处理成功,开始更新账户余额-{}", JSONUtil.toJsonStr(bo));
-        bo.setReceiptMoney(doValue.negate());
-        PtBagVo vo = business.updateBalance(bo);
-        business.updateOrderStatus(bo, CreditStatusEnum.SUCCESS.code(),vo.getBalance());
-        return vo;
-    }
-
-    @Override
-    public PtBagVo postOrder(PtBagBo bo) {
-        return null;
-    }
-}

+ 8 - 29
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtCardController.java

@@ -6,18 +6,18 @@ 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.business.payments.PayOrderBusiness;
 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.dromara.backstage.payment.domain.bo.PurseInOutBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.service.IPtBagService;
 import org.dromara.common.core.constant.Constants;
 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.excel.utils.ExcelUtil;
@@ -31,6 +31,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
+import java.text.MessageFormat;
 import java.util.List;
 
 /**
@@ -45,11 +46,8 @@ import java.util.List;
 @RestController
 @RequestMapping("/cardOperation/ptCard")
 public class PtCardController extends BaseController {
-
     private final IPtCardService ptCardService;
-    private final PaymentsStrategyContent paymentsStrategyContent;
-    private final IPtBagService bagService;
-
+    private final PayOrderBusiness payOrderBusiness;
     /**
      * 查询账户卡片列表
      */
@@ -146,23 +144,8 @@ public class PtCardController extends BaseController {
     @Log(title = "账户充值", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PostMapping("/recharge")
-    public R<PtBagVo> recharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
-        PtBagVo vo;
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
-        if (bo.getTakeCommission().equals(Constants.TAKE_COMMISSION)) {
-            //如果要收管理费
-            BigDecimal commission = ptCardService.computeCommission(bo);
-            if (commission.compareTo(BigDecimal.ZERO) > 0) {
-                PtBagBo commissionBo = new PtBagBo();
-                BeanUtil.copyProperties(bo, commissionBo);
-                commissionBo.setReceiptMoney(commission);
-                commissionBo.setCreditType(CreditTypeEnum.COMMISSION_CHARGE);
-                bo.setReceiptMoney(bo.getReceiptMoney().subtract(commission));
-                paymentsStrategyContent.createOrder(commissionBo);
-            }
-        }
-        vo = paymentsStrategyContent.createOrder(bo);
-        return R.ok(vo);
+    public R<PurseInOutBo> recharge(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
+        return payOrderBusiness.recharge(bo);
     }
 
     /**
@@ -172,11 +155,7 @@ public class PtCardController extends BaseController {
     @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);
+    public R<PurseInOutBo> refund(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
+        return payOrderBusiness.refund(bo);
     }
 }

+ 16 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/PtSubsidyitemVo.java

@@ -1,5 +1,6 @@
 package org.dromara.backstage.cardCenter.domain.vo;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.backstage.cardCenter.domain.PtSubsidyitem;
@@ -58,7 +59,7 @@ public class PtSubsidyitemVo implements Serializable {
      * 补助金额
      */
     @ExcelProperty(value = "补助金额")
-    private Long fillMoney;
+    private BigDecimal fillMoney;
 
     /**
      * 预计到账时间
@@ -115,6 +116,10 @@ public class PtSubsidyitemVo implements Serializable {
     @ExcelProperty(value = "部门名称")
     private String deptName;
 
+    /*
+     * 入账钱包
+     */
+    private String bagCode;
     /**
      * 备注
      */
@@ -130,4 +135,14 @@ public class PtSubsidyitemVo implements Serializable {
 
     @ExcelProperty(value = "补助名称")
     private String subsidyName;
+
+    /**
+     * 操作员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 操作员姓名
+     */
+    private String operatorName;
 }

+ 4 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/mapper/PtSubsidyitemMapper.java

@@ -2,7 +2,6 @@ package org.dromara.backstage.cardCenter.mapper;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
-import org.dromara.backstage.basics.domain.PtOperator;
 import org.dromara.backstage.cardCenter.domain.PtSubsidyitem;
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyReportBo;
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
@@ -22,7 +21,9 @@ public interface PtSubsidyitemMapper extends BaseMapperPlus<PtSubsidyitem, PtSub
     Page<PtSubsidyitemVo> customPageList(Page<PtSubsidyitem> page, PtSubsidyitemBo bo
         , @Param("beginFillDate") String beginFillDate, @Param("endFillDate") String endFillDate);
 
-    List<PtSubsidyReportVo> queryReportList(@Param("bo")PtSubsidyReportBo bo);
-    Page<PtSubsidyReportVo> queryReportPageList(@Param("page") Page<PtSubsidyReportVo> page, @Param("bo")PtSubsidyReportBo bo);
+    List<PtSubsidyReportVo> queryReportList(@Param("bo") PtSubsidyReportBo bo);
 
+    Page<PtSubsidyReportVo> queryReportPageList(@Param("page") Page<PtSubsidyReportVo> page, @Param("bo") PtSubsidyReportBo bo);
+
+    List<PtSubsidyitemVo> selectPostSubsidyItem(@Param("justDate") String justDate);
 }

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtSubsidyitemService.java

@@ -71,4 +71,10 @@ public interface IPtSubsidyitemService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 查询入账的补助明细
+     * @return 补助明细
+     */
+    List<PtSubsidyitemVo> selectPostSubsidyItem();
 }

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

@@ -1,5 +1,6 @@
 package org.dromara.backstage.cardCenter.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import org.dromara.backstage.basics.domain.bo.PtAccountBo;
 import org.dromara.backstage.basics.domain.vo.PtAccountVo;
 import org.dromara.backstage.basics.mapper.PtAccountMapper;
@@ -188,4 +189,12 @@ public class PtSubsidyitemServiceImpl implements IPtSubsidyitemService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+    /**
+     * 查询入账的补助明细
+     * @return 补助明细
+     */
+    @Override
+    public List<PtSubsidyitemVo> selectPostSubsidyItem() {
+        return baseMapper.selectPostSubsidyItem(DateUtil.date().toString("yyyy-MM-dd HH:mm:ss"));
+    }
 }

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

@@ -32,7 +32,6 @@ public class XfCreditAccountBackBo extends BaseEntity {
     /**
      * 记录Id
      */
-    @NotNull(message = "记录Id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long recordId;
 
     /**
@@ -60,21 +59,15 @@ public class XfCreditAccountBackBo extends BaseEntity {
      */
     private BigDecimal cardValue;
 
-    /**
-     * 是否主卡,见sys_yes_no字典类别
-     */
-    private String mainCard;
 
     /**
      * 钱包类型
      */
-    @NotBlank(message = "钱包类型不能为空", groups = { AddGroup.class, EditGroup.class })
     private String bagType;
 
     /**
      * 使用类型,100-消费系统
      */
-    @NotNull(message = "使用类型,100-消费系统不能为空", groups = { AddGroup.class, EditGroup.class })
     private Integer useType;
 
     /**

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

@@ -81,7 +81,6 @@ public class XfCreditAccountBackServiceImpl implements IXfCreditAccountBackServi
         lqw.eq(bo.getTermRecordId() != null, XfCreditAccountBack::getTermRecordId, bo.getTermRecordId());
         lqw.eq(bo.getCardNo() != null, XfCreditAccountBack::getCardNo, bo.getCardNo());
         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.getUseType() != null, XfCreditAccountBack::getUseType, bo.getUseType());
         lqw.eq(bo.getStationId() != null, XfCreditAccountBack::getStationId, bo.getStationId());
@@ -90,7 +89,6 @@ public class XfCreditAccountBackServiceImpl implements IXfCreditAccountBackServi
         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.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());

+ 50 - 73
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java

@@ -1,24 +1,20 @@
 package org.dromara.backstage.payment.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.json.JSONUtil;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.dromara.backstage.business.errfill.ErrFillBusiness;
-import org.dromara.backstage.business.payments.strategy.impl.PaymentsStrategyContent;
-import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.backstage.business.payments.PayOrderBusiness;
 import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.bo.PurseInOutBo;
 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.backstage.payment.service.impl.PtBagServiceImpl;
-import org.dromara.common.core.constant.Constants;
 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.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
@@ -36,8 +32,8 @@ import org.springframework.web.bind.annotation.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Optional;
 
 /**
  * 账户钱包
@@ -49,22 +45,20 @@ import java.util.Optional;
 @Validated
 @RequiredArgsConstructor
 @RestController
+@Slf4j
 @RequestMapping("/payment/ptBag")
 public class PtBagController extends BaseController {
 
     private final IPtBagService ptBagService;
-    private final IPtCardService cardService;
-    private final IPtUserAccountService accountService;
-    private final PaymentsStrategyContent paymentsStrategyContent;
     private final ErrFillBusiness errFillBusiness;
-    private final IPtBagService bagService;
+    private final PayOrderBusiness payOrderBusiness;
 
     //根据userId查询账户余额
 //    @SaCheckPermission("payment:ptBag:query")
     @GetMapping("/selectSelfAccountBalance")
     public R<String> selectAccountBalanceByIds() {
         String userIds = String.valueOf(LoginHelper.getUserId());
-        return R.ok("",ptBagService.selectAccountBalanceByIds(userIds));
+        return R.ok("", ptBagService.selectAccountBalanceByIds(userIds));
     }
 
     /**
@@ -141,14 +135,8 @@ public class PtBagController extends BaseController {
     @Log(title = "账户钱包", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PostMapping("/recharge")
-    public R<PtBagVo> recharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
-        PtBagBo commissionBo = computeCommission(bo);
-        if (commissionBo != null) {
-            paymentsStrategyContent.createOrder(commissionBo);
-        }
-        PtBagVo vo = paymentsStrategyContent.createOrder(bo);
-        return R.ok(vo);
+    public R<PurseInOutBo> recharge(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
+        return payOrderBusiness.recharge(bo);
     }
 
     /**
@@ -158,17 +146,8 @@ public class PtBagController extends BaseController {
     @Log(title = "账户钱包", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PostMapping("/refund")
-    public R<PtBagVo> refund(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
-        //校验钱包余额是否充足
-        PtBagVo bagVo = bagService.queryByUserBagCode(bo.getUserId(), bo.getBagCode());
-        if (bagVo.getBalance().compareTo(bo.getReceiptMoney()) < 0) {
-            return R.fail(MessageFormat.format("账户余额不足,当前余额为:{0}", bagVo.getBalance()));
-        }
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
-        //退款是记支出,所以金额设置为负数
-        bo.setReceiptMoney(bo.getReceiptMoney().negate());
-        PtBagVo vo = paymentsStrategyContent.createOrder(bo);
-        return R.ok(vo);
+    public R<PurseInOutBo> refund(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
+        return payOrderBusiness.refund(bo);
     }
 
     /**
@@ -178,20 +157,31 @@ public class PtBagController extends BaseController {
     @Log(title = "批量账户充值", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PostMapping("/recharge/{userIds}")
-    public R<Void> batchRecharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo, @PathVariable Long[] userIds) {
+    public R<String> batchRecharge(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo, @PathVariable Long[] userIds) {
+        // TODO 2024-10-30 09:49:36 luoyibo 这里最好是提前处理下工作站信息
+        List<String> resultList = new ArrayList<>();
+        int succesCount = 0;
+        int errorCount = 0;
         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);
+            try {
+                R<PurseInOutBo> result = payOrderBusiness.recharge(bo);
+                if (result.getCode() == R.SUCCESS) {
+                    succesCount++;
+                } else {
+                    errorCount++;
+                    resultList.add(MessageFormat.format("[充值失败]-[充值信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(bo), result.getMsg()));
+                }
+            } catch (Exception e) {
+                errorCount++;
+                resultList.add(MessageFormat.format("[充值失败]-[充值信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(bo), e.getMessage()));
             }
-            paymentsStrategyContent.createOrder(bo);
         }
-
-        return R.ok();
+        resultList.forEach(log::error);
+        return R.ok(MessageFormat.format("批量充值完成,成功[{0}]条,失败[{1}]条", succesCount, errorCount));
     }
 
     /**
@@ -201,16 +191,30 @@ public class PtBagController extends BaseController {
     @Log(title = "账户批量退款", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PostMapping("/refund/{userIds}")
-    public R<Void> batchRefund(@Validated(EditGroup.class) @RequestBody PtBagBo bo, @PathVariable Long[] userIds) {
+    public R<Void> batchRefund(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo, @PathVariable Long[] userIds) {
+        List<String> resultList = new ArrayList<>();
+        int succesCount = 0;
+        int errorCount = 0;
+        BigDecimal doValue = bo.getReceiptMoney();
         bo.setUseType(SystemUseTypeEnum.CONSUME);
-        BigDecimal doValue = bo.getReceiptMoney().negate();
         for (Long userId : userIds) {
-            //退款是记支出,所以金额设置为负数
-            bo.setReceiptMoney(doValue);
             bo.setUserId(userId);
-            paymentsStrategyContent.createOrder(bo);
+            bo.setReceiptMoney(doValue);
+            try {
+                R<PurseInOutBo> result = payOrderBusiness.refund(bo);
+                if (result.getCode() == R.SUCCESS) {
+                    succesCount++;
+                } else {
+                    errorCount++;
+                    resultList.add(MessageFormat.format("[退款失败]-[退款信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(bo), result.getMsg()));
+                }
+            } catch (Exception e) {
+                errorCount++;
+                resultList.add(MessageFormat.format("[退款失败]-[退款信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(bo), e.getMessage()));
+            }
         }
-        return R.ok();
+        resultList.forEach(log::error);
+        return R.ok(MessageFormat.format("批量退款完成,成功[{0}]条,失败[{1}]条", succesCount, errorCount));
     }
 
     /**
@@ -244,31 +248,4 @@ public class PtBagController extends BaseController {
         String message = MessageFormat.format("错扣补款成功,补款后钱包代码:[{0}]的余额:[{1}元]", vo.getBagCode(), vo.getBalance().setScale(2, RoundingMode.HALF_UP));
         return R.ok(message, vo);
     }
-
-    /**
-     * 计算管理费
-     */
-    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;
-    }
 }

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

@@ -1,16 +1,16 @@
 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.io.Serial;
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
@@ -24,17 +24,13 @@ import java.math.BigDecimal;
  * @since JDK 1.8
  */
 @Data
-public class PurseInOutBo {
-    /**
-     * 资金收支入账钱包Id
-     */
-    @NotNull(message = "钱包Id不能为空", groups = { EditGroup.class })
-    private Long bagId;
+public class PurseInOutBo implements Serializable {
 
+    @Serial
+    private static final long serialVersionUID = 5830503618923729067L;
     /**
      * 资金收支入账所属账户Id
      */
-    @NotNull(message = "所属账户Id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long userId;
 
     /**
@@ -43,6 +39,10 @@ public class PurseInOutBo {
     @NotBlank(message = "钱包代码", groups = { AddGroup.class, EditGroup.class })
     private String bagCode;
 
+    /**
+     * 钱包余额
+     */
+    private BigDecimal balance;
     /**
      * 资金来源
      */
@@ -70,10 +70,19 @@ public class PurseInOutBo {
      * 资金收支入账对应卡片Id,可能为空
      */
     private Long cardId;
+
+    /**
+     * 资金收支入账对应卡片类别Id,可能为空
+     */
+    private Long cardTypeId;
     /**
      * 资金收支入账操作的设备机号,可能为空
      */
     private Long termNo;
+    /**
+     * 机器流水号,一般是消费机上传数据时会有此值
+     */
+    private Long termRecordId;
     /**
      * 资金收支入账的工作站编号,可能为空
      */
@@ -83,11 +92,23 @@ public class PurseInOutBo {
      */
     private Long operatorId;
 
+    /**
+     * 操作员姓名
+     */
+    private String operatorName;
     /**
      * 系统使用类型
      */
     private SystemUseTypeEnum useType;
 
+    /**
+     * 原始记录Id
+     */
+    private String originalId;
+    /**
+     * 入账记录Id
+     */
+    private String creditId;
     /**
      * 校园端流水号,一般使用第三方支付会有此编号
      * 如:微信充值、微信扫码充值、银行圈存等,会先生成一笔请求支付的订单,支付成功后才会有一卡通系统的资金收支入账

+ 5 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/vo/PtBagVo.java

@@ -84,5 +84,10 @@ public class PtBagVo implements Serializable {
     @ExcelProperty(value = "充值总次数")
     private Long rechargeCount;
 
+    /**
+     * 钱包名称
+     */
+    private String bagName;
+
 
 }

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

@@ -309,8 +309,8 @@ public class PtBagServiceImpl implements IPtBagService {
         BigDecimal after = BigDecimal.ZERO;
         //账户现有余额
         BigDecimal balance  = bag.getBalance();
-        //退款金额
-        BigDecimal doValue = bo.getReceiptMoney();
+        //退款金额,传入的金额为负数,转换成正数进行余额处理
+        BigDecimal doValue = bo.getReceiptMoney().negate();
         //如果账户现有余额比退款金额大,则最后余额为账户余额-退款金额,否则为0
         if(balance.compareTo(doValue)>0){
             after = balance.subtract(doValue);

+ 37 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/task/SubsidyScheduled.java

@@ -0,0 +1,37 @@
+package org.dromara.backstage.task;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.backstage.business.payments.PayOrderBusiness;
+import org.dromara.common.core.domain.R;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * name: SubsidyScheduled
+ * package: org.dromara.backstage.task
+ * description: 补助到账定时任务
+ * date: 2024-10-30 17:05:59 17:05
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class SubsidyScheduled implements CommandLineRunner {
+    private final PayOrderBusiness subsidyOrderBusiness;
+
+    @Scheduled(fixedDelay = 10 * 60 * 1000)
+    public void rechargeSubsidy(){
+        R<Object> result = subsidyOrderBusiness.createSubsidyOrder();
+        log.info(result.getMsg());
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+
+    }
+}

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/cardCenter/cardOperation/PtSubsidyitemMapper.xml

@@ -120,4 +120,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         group by fillDate, subsidyType,createByName
         order by fillDate desc,subsidyType desc,createByName desc
     </select>
+    <select id="selectPostSubsidyItem" resultType="org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo">
+        SELECT tpsi.*,tps.bag_code,tps.create_by AS operatorId,tsu.real_name AS operatorName FROM t_pt_subsidyItem tpsi
+        INNER JOIN t_pt_subsidy tps  ON tps.main_id=tpsi.main_id AND tps.del_flag='0' AND tps.audit_status='Y'
+        LEFT JOIN t_sys_user tsu ON tsu.user_id=tps.create_by AND tsu.del_flag='0'
+        WHERE tpsi.del_flag='0' AND tpsi.fill_status='N'
+    </select>
 </mapper>