Procházet zdrojové kódy

feature: 消费服务功能
1.将消费相关的表及入库操作在消费服务中放一份,此处尽量直接数据库操作
2.整理消费相关业务的逻辑及简要的程序设计
3.消费机请求消费接口实现(入库原始消费记录表)

luoyb před 1 rokem
rodič
revize
31b439d46c
100 změnil soubory, kde provedl 7562 přidání a 148 odebrání
  1. 25 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteCardService.java
  2. 17 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteUserAccountService.java
  3. 101 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemoteCardBo.java
  4. 101 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/vo/RemoteCardVo.java
  5. 146 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/vo/RemoteUserAccountVo.java
  6. 4 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  7. 45 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/ErrorInfo.java
  8. 53 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/ErrorResult.java
  9. 5 1
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CreditTypeEnum.java
  10. 6 0
      ruoyi-common/ruoyi-common-web/pom.xml
  11. 2 10
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtCardController.java
  12. 19 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/convert/RemoteCardBoConvert.java
  13. 19 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/convert/RemoteCardVoConvert.java
  14. 31 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/dubbo/RemoteCardServiceImpl.java
  15. 24 12
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java
  16. 75 32
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java
  17. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/ConsumptionBo.java
  18. 19 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/convert/RemoteUserAccountVoConvert.java
  19. 21 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/dubbo/RemoteUserAccountServiceImpl.java
  20. 6 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPtUserAccountService.java
  21. 153 90
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java
  22. 1 0
      ruoyi-server/pom.xml
  23. 4 0
      ruoyi-server/ruoyi-server-common/pom.xml
  24. 9 2
      ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/constant/DefaultConstants.java
  25. 101 0
      ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/domain/consume/bo/ConsumeRecordBo.java
  26. 142 0
      ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/domain/consume/bo/ConsumptionBo.java
  27. 22 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/RuoYiServerConsumeApplication.java
  28. 64 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/BaseBusiness.java
  29. 248 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java
  30. 87 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/ConsumeBusiness.java
  31. 18 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/constant/TermSupplierConstants.java
  32. 72 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/ConsumeController.java
  33. 20 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/convert/strategy/IRecordConvertStrategy.java
  34. 36 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/convert/strategy/RecordConvertStrategyContent.java
  35. 84 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/convert/strategy/impl/YcRecordConvertStrategyImpl.java
  36. 205 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfConsumeDetail.java
  37. 171 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfConsumeDetailOriginal.java
  38. 201 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfCreditAccount.java
  39. 161 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfCreditAccountBack.java
  40. 84 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfDiscount.java
  41. 44 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfDiscountTerm.java
  42. 79 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfLimited.java
  43. 44 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfLimitedTerm.java
  44. 79 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfQuota.java
  45. 44 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfQuotaTerm.java
  46. 358 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfTerm.java
  47. 105 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfTermTotal.java
  48. 85 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfUserTotal.java
  49. 96 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/YcConsumeInfo.java
  50. 212 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfConsumeDetailBo.java
  51. 175 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfConsumeDetailOriginalBo.java
  52. 154 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfCreditAccountBackBo.java
  53. 205 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfCreditAccountBo.java
  54. 79 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfDiscountBo.java
  55. 36 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfDiscountTermBo.java
  56. 71 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfLimitedBo.java
  57. 36 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfLimitedTermBo.java
  58. 79 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfQuotaBo.java
  59. 36 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfQuotaTermBo.java
  60. 363 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfTermBo.java
  61. 198 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfTermParamBo.java
  62. 104 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfTermTotalBo.java
  63. 82 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfUserTotalBo.java
  64. 162 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfConsumeDetailOriginalVo.java
  65. 199 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfConsumeDetailVo.java
  66. 154 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfCreditAccountBackVo.java
  67. 193 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfCreditAccountVo.java
  68. 54 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfDiscountTermVo.java
  69. 83 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfDiscountVo.java
  70. 50 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfLimitedTermVo.java
  71. 76 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfLimitedVo.java
  72. 54 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfQuotaTermVo.java
  73. 79 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfQuotaVo.java
  74. 200 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfTermParamVo.java
  75. 99 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfTermTotalVo.java
  76. 103 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfTermVo.java
  77. 79 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfUserTotalVo.java
  78. 13 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfConsumeDetailMapper.java
  79. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfConsumeDetailOriginalMapper.java
  80. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfCreditAccountBackMapper.java
  81. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfCreditAccountMapper.java
  82. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfDiscountMapper.java
  83. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfDiscountTermMapper.java
  84. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfLimitedMapper.java
  85. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfLimitedTermMapper.java
  86. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfQuotaMapper.java
  87. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfQuotaTermMapper.java
  88. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfTermMapper.java
  89. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfTermTotalMapper.java
  90. 15 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfUserTotalMapper.java
  91. 47 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfConsumeDetailOriginalService.java
  92. 64 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfConsumeDetailService.java
  93. 66 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfCreditAccountBackService.java
  94. 54 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfCreditAccountService.java
  95. 30 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfDiscountService.java
  96. 32 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfDiscountTermService.java
  97. 32 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfLimitedService.java
  98. 30 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfLimitedTermService.java
  99. 32 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfQuotaService.java
  100. 30 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfQuotaTermService.java

+ 25 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteCardService.java

@@ -1,5 +1,8 @@
 package org.dromara.backstage.api;
 
+import org.dromara.backstage.api.domain.bo.RemoteCardBo;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
+
 /**
  * name: RemoteBagService
  * package: org.dromara.backstage.api
@@ -18,4 +21,26 @@ public interface RemoteCardService {
      * @return 发卡信息串,英文逗号分隔
      */
     String selectAccountCardByIds(String userIds);
+
+    /**
+     * 根据卡流水号获取对应的卡片信息
+     *
+     * @param cardNo     卡流水号
+     * @return 卡片信息
+     */
+    RemoteCardVo queryCardByCardNo(Long cardNo);
+
+    /**
+     * 根据物理卡号获取卡片信息
+     * @param factoryId 物理卡号
+     * @return 卡片信息
+     */
+    RemoteCardVo queryCardByFactoryId(Long factoryId);
+
+    /**
+     * 根据人员Id主卡信息
+     * @param userId 人员Id
+     * @return 主卡信息
+     */
+    RemoteCardVo queryMainCardByUserId(Long userId);
 }

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

@@ -1,6 +1,7 @@
 package org.dromara.backstage.api;
 
 import org.dromara.backstage.api.domain.bo.RemoteUserAccountBo;
+import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
 import org.dromara.common.core.domain.R;
 
 /**
@@ -28,4 +29,20 @@ public interface RemoteUserAccountService {
 
      void updateByBo(RemoteUserAccountBo bo);
 
+    /**
+     * 根据账户Id查询账户信息
+     * @param userId 账户Id
+     * @return 账户信息
+     */
+    RemoteUserAccountVo getUserAccountVoById(Long userId);
+
+    /**
+     * 根据账户流水号查询账户信息
+     * @param userNo 账户流水号
+     * @return 账户信息
+     */
+    RemoteUserAccountVo getUserAccountVoByUserNo(Long userNo);
+
+    RemoteUserAccountVo getUserAccountVoByUserNumb(String userNumb);
+
 }

+ 101 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemoteCardBo.java

@@ -0,0 +1,101 @@
+package org.dromara.backstage.api.domain.bo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 账户卡片视图对象 t_pt_card
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+@Data
+public class RemoteCardBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 卡片Id,主键
+     */
+    private Long cardId;
+
+    /**
+     * 所属账户Id
+     */
+    private Long userId;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 卡片类型
+     */
+    private Long cardType;
+
+    /**
+     * 卡片有效期
+     */
+    private Date lifespan;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
+
+    /**
+     * 是否主卡,见sys_yes_no字典类别
+     */
+    private String mainCard;
+
+    /**
+     * 卡片状态,见KZT字典类别
+     */
+    private String status;
+
+    /**
+     * 卡状态变更时间
+     */
+    private Date changeTime;
+
+    /**
+     * 当日消费金额
+     */
+    private Long dayTotal;
+
+    /**
+     * 当日消费次数
+     */
+    private Long dayCount;
+
+    /**
+     * 当餐交易金额
+     */
+    private Long mealTotal;
+
+    /**
+     * 当餐消费次数
+     */
+    private Long mealCount;
+
+    /**
+     * 最后交易时间
+     */
+    private Date lastPay;
+
+    /**
+     * 最后交易餐类,对应营业时段的编号
+     */
+    private Long lastMeal;
+
+    /**
+     * 卡类名
+     */
+    private String cardTypeName;
+}

+ 101 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/vo/RemoteCardVo.java

@@ -0,0 +1,101 @@
+package org.dromara.backstage.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 账户卡片视图对象 t_pt_card
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+@Data
+public class RemoteCardVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 卡片Id,主键
+     */
+    private Long cardId;
+
+    /**
+     * 所属账户Id
+     */
+    private Long userId;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 卡片类型
+     */
+    private Long cardType;
+
+    /**
+     * 卡片有效期
+     */
+    private Date lifespan;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
+
+    /**
+     * 是否主卡,见sys_yes_no字典类别
+     */
+    private String mainCard;
+
+    /**
+     * 卡片状态,见KZT字典类别
+     */
+    private String status;
+
+    /**
+     * 卡状态变更时间
+     */
+    private Date changeTime;
+
+    /**
+     * 当日消费金额
+     */
+    private Long dayTotal;
+
+    /**
+     * 当日消费次数
+     */
+    private Long dayCount;
+
+    /**
+     * 当餐交易金额
+     */
+    private Long mealTotal;
+
+    /**
+     * 当餐消费次数
+     */
+    private Long mealCount;
+
+    /**
+     * 最后交易时间
+     */
+    private Date lastPay;
+
+    /**
+     * 最后交易餐类,对应营业时段的编号
+     */
+    private Long lastMeal;
+
+    /**
+     * 卡类名
+     */
+    private String cardTypeName;
+}

+ 146 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/vo/RemoteUserAccountVo.java

@@ -0,0 +1,146 @@
+package org.dromara.backstage.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 一卡通账户视图对象 t_pt_userAccount
+ *
+ * @author LionLi
+ * @date 2024-08-05
+ */
+@Data
+public class RemoteUserAccountVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 账户Id,主键
+     */
+    private Long userId;
+
+    /**
+     * 岗位Id
+     */
+    private Long postId;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 账户名/登录账号
+     */
+    private String userName;
+
+    /**
+     * 账户编号/工号
+     */
+    private String userNumb;
+
+    /**
+     * 账户姓名
+     */
+    private String realName;
+
+    /**
+     * 账户性别,见sys_user_sex字典类型
+     */
+    private String sex;
+
+    /**
+     * 账户类型(0=内部账户 1=老师 2=学生 3=家长  4=其他人员)
+     */
+    private String category;
+
+    /**
+     * 手机号码
+     */
+    private String phone;
+
+    /**
+     * 身份证号
+     */
+    private String idNumber;
+
+    /**
+     * 一卡通账户状态(0-未开户  1-已开户  -1已销户)
+     */
+    private String accountStatus;
+
+    /**
+     * 账户是否被冻结,见sys_yes_no字典类型
+     */
+    private String freezeStatus;
+
+    /**
+     * 消费密码
+     */
+    private String consumePwd;
+
+    /**
+     * 账户流水号
+     */
+    private Long userNo;
+
+    /**
+     * 账户卡片类型
+     */
+    private Long cardType;
+
+    /**
+     * 账户有效期
+     */
+    private Date lifespan;
+
+     /**
+     * 人脸照片地址
+     */
+    private String photo;
+
+    /**
+     * 唯一身份标识,第三方统一身份认证ID
+     */
+    private String otherId;
+
+    /**
+     * 第三方人员状态
+     */
+    private String userState;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 账户状态,见sys_normal_disable字典类型
+     */
+    private String status;
+
+    /**
+     * 部门名
+     */
+    private String deptName;
+
+    /**
+     * 卡类名
+     */
+    private String cardTypeName;
+
+    /**
+     * 账户余额
+     */
+    private String accountBalance;
+
+    /**
+     * 账户发卡信息
+     */
+    private String accountCard;
+}

+ 4 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -121,4 +121,8 @@ public interface CacheNames {
      * 卡流水号
      */
     String  CARD_NO = "card_no";
+    /**
+     * 一卡通账户
+     */
+    String PT_USER_ACCOUNT = "pt_user_account";
 }

+ 45 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/ErrorInfo.java

@@ -0,0 +1,45 @@
+package org.dromara.common.core.domain.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * name: ErrorInfo
+ * package: org.dromara.common.core.domain.model
+ * description: 接口或服务调用时的出错信息
+ * date: 2024-11-01 16:04:34 16:04
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ErrorInfo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 错误代码
+     */
+    private Integer code;
+    /**
+     * 错误类型
+     */
+    private String type;
+    /**
+     * 错误消息
+     */
+    private String message;
+
+    /**
+     * 错误详情
+     */
+    private String detils;
+}

+ 53 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/ErrorResult.java

@@ -0,0 +1,53 @@
+package org.dromara.common.core.domain.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.http.HttpStatus;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * name: ErrorResult
+ * package: org.dromara.common.core.domain.model
+ * description: 接口或服务出错的应答结果
+ * date: 2024-11-01 17:07:05 17:07
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ErrorResult implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+    /**
+     * 应答状态码
+     */
+    private Integer statusCode;
+    /**
+     * 应答消息
+     */
+    private String message;
+
+    /**
+     * 错误信息
+     */
+    List<ErrorInfo> errors = new ArrayList<>();
+
+    public static ErrorResult instance(HttpStatus status, String err, int code, String type, String msg,
+                                       String detail) {
+        ErrorResult error = new ErrorResult();
+        error.setStatusCode(status.value());
+        error.setMessage(err);
+        error.getErrors().add(new ErrorInfo(code,type, msg , detail));
+
+        return error;
+    }
+}

+ 5 - 1
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CreditTypeEnum.java

@@ -122,7 +122,11 @@ public enum CreditTypeEnum {
     /**
      * 设备消费
      */
-    TERM_CONSUME(25000, "设备消费");
+    TERM_CONSUME(25000, "设备消费"),
+    /**
+     * 错扣补款
+     */
+    ERROR_FILL(25010, "错扣补款");
 
     private final Integer code;
     private final String message;

+ 6 - 0
ruoyi-common/ruoyi-common-web/pom.xml

@@ -38,6 +38,12 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-undertow</artifactId>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/io.undertow/undertow-servlet -->
+        <dependency>
+            <groupId>io.undertow</groupId>
+            <artifactId>undertow-servlet</artifactId>
+            <version>2.0.15.Final</version>
+        </dependency>
 
         <!-- SpringBoot Actuator -->
         <dependency>

+ 2 - 10
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtCardController.java

@@ -1,7 +1,6 @@
 package org.dromara.backstage.cardCenter.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.hutool.core.bean.BeanUtil;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
@@ -10,14 +9,8 @@ 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.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.excel.utils.ExcelUtil;
@@ -30,8 +23,6 @@ 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.text.MessageFormat;
 import java.util.List;
 
 /**
@@ -77,7 +68,8 @@ public class PtCardController extends BaseController {
     @GetMapping("/{cardId}")
     public R<PtCardVo> getInfo(@NotNull(message = "主键不能为空")
                                @PathVariable Long cardId) {
-        return R.ok(ptCardService.queryById(cardId));
+        //return R.ok(ptCardService.queryById(cardId));
+        return R.ok(ptCardService.queryCardByFactoryId(36014L));
     }
 
     /**

+ 19 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/convert/RemoteCardBoConvert.java

@@ -0,0 +1,19 @@
+package org.dromara.backstage.cardCenter.domain.convert;
+
+import io.github.linpeilie.BaseMapper;
+import org.dromara.backstage.api.domain.bo.RemoteCardBo;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
+import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * 卡片业务对象转换器
+ * @author bing
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface RemoteCardBoConvert extends BaseMapper<RemoteCardBo, PtCardBo> {
+
+}

+ 19 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/convert/RemoteCardVoConvert.java

@@ -0,0 +1,19 @@
+package org.dromara.backstage.cardCenter.domain.convert;
+
+import io.github.linpeilie.BaseMapper;
+import org.dromara.backstage.api.domain.bo.RemotePtAreaBo;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
+import org.dromara.backstage.basics.domain.bo.PtAreaBo;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * 卡片视图对象转换器
+ * @author bing
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface RemoteCardVoConvert extends BaseMapper<PtCardVo,RemoteCardVo> {
+
+}

+ 31 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/dubbo/RemoteCardServiceImpl.java

@@ -4,8 +4,13 @@ import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.backstage.api.RemoteBagService;
 import org.dromara.backstage.api.RemoteCardService;
+import org.dromara.backstage.api.domain.bo.RemoteCardBo;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
+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.service.IPtBagService;
+import org.dromara.common.core.utils.MapstructUtils;
 import org.springframework.stereotype.Service;
 
 /**
@@ -27,4 +32,30 @@ public class RemoteCardServiceImpl implements RemoteCardService {
     public String selectAccountCardByIds(String userIds) {
         return cardService.selectAccountCardByIds(userIds);
     }
+
+    @Override
+    public RemoteCardVo queryCardByCardNo(Long cardNo) {
+        PtCardVo vo = cardService.queryCardByCardNo(cardNo);
+        return MapstructUtils.convert(vo,RemoteCardVo.class);
+    }
+    /**
+     * 根据物理卡号获取卡片信息
+     * @param factoryId 物理卡号
+     * @return 卡片信息
+     */
+    @Override
+    public RemoteCardVo queryCardByFactoryId(Long factoryId) {
+        PtCardVo vo = cardService.queryCardByFactoryId(factoryId);
+        return MapstructUtils.convert(vo,RemoteCardVo.class);
+    }
+    /**
+     * 根据人员Id查询主卡信息
+     * @param userId 人员Id
+     * @return 主卡信息
+     */
+    @Override
+    public RemoteCardVo queryMainCardByUserId(Long userId) {
+        PtCardVo vo = cardService.queryMainCardByUserId(userId);
+        return MapstructUtils.convert(vo,RemoteCardVo.class);
+    }
 }

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

@@ -96,13 +96,7 @@ public interface IPtCardService {
      * @return 发卡信息串,英文逗号隔开
      */
     String selectAccountCardByIds(String userIds);
-    /**
-     * 根据人员Id获取账户主卡
-     *
-     * @param userId     人员Id
-     * @return 主卡信息
-     */
-    PtCardVo queryMainCardByUserId(Long userId);
+
     /**
      * 根据Id挂失卡片
      *
@@ -126,7 +120,11 @@ public interface IPtCardService {
      * @return 管理费
      */
     BigDecimal computeCommission(PtBagBo bo);
-
+    /**
+     * 获取已有的最大卡流水号
+     * @return 最大卡流水号
+     */
+    Long getMaxCardNo();
     /**
      * 根据卡流水号获取对应的卡片信息
      *
@@ -134,10 +132,24 @@ public interface IPtCardService {
      * @return 卡片信息
      */
     PtCardVo queryCardByCardNo(Long cardNo);
-
     /**
-     * 获取已有的最大卡流水号
-     * @return 最大卡流水号
+     * 根据物理卡号号获取对应的卡片信息
+     *
+     * @param factoryId   物理卡号
+     * @return 卡片信息
      */
-    Long getMaxCardNo();
+    PtCardVo queryCardByFactoryId(Long factoryId);
+    /**
+     * 根据人员Id获取账户主卡
+     *
+     * @param userId     人员Id
+     * @return 主卡信息
+     */
+    PtCardVo queryMainCardByUserId(Long userId);
+    /**
+     * 根据卡片业务对象查询卡片信息
+     * @param bo 卡片业务对象
+     * @return 卡片信息
+     */
+    PtCardVo selectOneByBo(PtCardBo bo);
 }

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

@@ -2,6 +2,7 @@ package org.dromara.backstage.cardCenter.service.impl;
 
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -24,7 +25,7 @@ import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.springframework.cache.annotation.Cacheable;
+import org.dromara.common.redis.utils.RedisUtils;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -212,9 +213,9 @@ public class PtCardServiceImpl implements IPtCardService {
         for (Long id : StringUtils.splitTo(userIds, Convert::toLong)) {
             LambdaQueryWrapper<PtCard> lqw = new LambdaQueryWrapper<>();
             lqw.eq(PtCard::getUserId, id);
-            lqw.in(PtCard::getStatus,"1","2","7");
+            lqw.in(PtCard::getStatus, "1", "2", "7");
 
-            List<PtCardVo> listVo = baseMapper.selectVoList(lqw,PtCardVo.class);
+            List<PtCardVo> listVo = baseMapper.selectVoList(lqw, PtCardVo.class);
             if (listVo.isEmpty()) {
                 list.add(CardOpenEnum.NO.message());
             } else {
@@ -225,27 +226,6 @@ public class PtCardServiceImpl implements IPtCardService {
         return String.join(StringUtils.SEPARATOR, list);
     }
 
-    /**
-     * 根据人员Id获取账户主卡
-     *
-     * @param userId 人员Id
-     * @return 主卡信息
-     */
-    @Override
-    @Cacheable(cacheNames = CacheNames.PT_USER_CARD, key = "#userId")
-    public PtCardVo queryMainCardByUserId(Long userId) {
-        PtCardVo vo = baseMapper.selectVoOne(new LambdaQueryWrapper<PtCard>()
-            .eq(PtCard::getMainCard, "Y")
-            .eq(PtCard::getStatus, "1")
-            .eq(PtCard::getUserId, userId));
-        if (vo != null) {
-            PtCardtypeVo cardTypeVo = cardTypeService.queryByCode(vo.getCardType());
-            vo.setCardTypeName(cardTypeVo.getTypeName());
-            return vo;
-        }
-        return null;
-    }
-
     /**
      * 根据Id挂失卡片
      *
@@ -308,35 +288,98 @@ public class PtCardServiceImpl implements IPtCardService {
             return BigDecimal.ZERO;
         }
     }
+    /**
+     * 根据人员Id获取账户主卡
+     *
+     * @param userId 人员Id
+     * @return 主卡信息
+     */
+    @Override
+    public PtCardVo queryMainCardByUserId(Long userId) {
+        PtCardVo vo;
+        List<PtCardVo> redisList = RedisUtils.getCacheList(CacheNames.PT_USER_CARD);
+        if (ObjUtil.isNotNull(redisList)&& !redisList.isEmpty()) {
+            vo = redisList.stream().filter(p -> Objects.equals(p.getUserId(), userId)
+            &&Objects.equals(p.getMainCard(),"Y")&&Objects.equals(p.getStatus(),"1")).findFirst().orElse(null);
+            if (ObjUtil.isNotNull(vo)) {
+                return vo;
+            }
+        }
+        PtCardBo bo = new PtCardBo();
+        bo.setUserId(userId);
+        bo.setMainCard("Y");
+        bo.setStatus("1");
+        return this.selectOneByBo(bo);
+    }
     /**
      * 根据卡流水号获取对应的卡片信息
      *
-     * @param cardNo     卡流水号
+     * @param cardNo 卡流水号
      * @return 卡片信息
      */
     @Override
-    @Cacheable(cacheNames = CacheNames.PT_USER_CARD, key = "#cardNo")
     public PtCardVo queryCardByCardNo(Long cardNo) {
-        PtCardVo vo = baseMapper.selectVoOne(new LambdaQueryWrapper<PtCard>()
-            .eq(PtCard::getStatus, "1")
-            .eq(PtCard::getCardNo, cardNo));
-        if (vo != null) {
+        PtCardVo vo;
+        List<PtCardVo> redisList = RedisUtils.getCacheList(CacheNames.PT_USER_CARD);
+        if (ObjUtil.isNotNull(redisList)&& !redisList.isEmpty()) {
+            vo = redisList.stream().filter(p -> Objects.equals(p.getCardNo(), cardNo)).findFirst().orElse(null);
+            if (ObjUtil.isNotNull(vo)) {
+                return vo;
+            }
+        }
+        PtCardBo bo = new PtCardBo();
+        bo.setCardNo(cardNo);
+        return this.selectOneByBo(bo);
+    }
+    /**
+     * 根据物理卡号号获取对应的卡片信息
+     *
+     * @param factoryId   物理卡号
+     * @return 卡片信息
+     */
+    @Override
+    public PtCardVo queryCardByFactoryId(Long factoryId) {
+        PtCardVo vo;
+        List<PtCardVo> redisList = RedisUtils.getCacheList(CacheNames.PT_USER_CARD);
+        if (ObjUtil.isNotNull(redisList)&& !redisList.isEmpty()) {
+            vo = redisList.stream().filter(p -> Objects.equals(p.getFactoryId(), factoryId)).findFirst().orElse(null);
+            if (ObjUtil.isNotNull(vo)) {
+                return vo;
+            }
+        }
+        PtCardBo bo = new PtCardBo();
+        bo.setFactoryId(factoryId);
+        return this.selectOneByBo(bo);
+    }
+
+    /**
+     * 根据卡片业务对象查询卡片信息
+     *
+     * @param bo 卡片业务对象
+     * @return 卡片信息
+     */
+    @Override
+    public PtCardVo selectOneByBo(PtCardBo bo) {
+        List<PtCardVo> list = this.queryList(bo);
+        if (ObjUtil.isNotNull(list) && !list.isEmpty()) {
+            PtCardVo vo = list.get(0);
             PtCardtypeVo cardTypeVo = cardTypeService.queryByCode(vo.getCardType());
             vo.setCardTypeName(cardTypeVo.getTypeName());
+            RedisUtils.addCacheList(CacheNames.PT_USER_CARD, vo);
             return vo;
         }
         return null;
     }
-
     /**
      * 获取已有的最大卡流水号
+     *
      * @return 最大卡流水号
      */
     @Override
     public Long getMaxCardNo() {
         QueryWrapper<PtCard> lqw = new QueryWrapper<>();
         lqw.select("max(card_no) as card_no");
-        lqw.in("status", "1","2","7");
+        lqw.in("status", "1", "2", "7");
         lqw.eq("tenant_id", "20200813044411");
         PtCard card = baseMapper.selectOne(lqw);
 

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/ConsumptionBo.java

@@ -94,7 +94,7 @@ public class ConsumptionBo extends BaseEntity {
      */
     private Long recordId;
     /**
-     * 消费记录标志位?
+     * 消费记录标志位
      */
     private Long recordStatus;
 

+ 19 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/convert/RemoteUserAccountVoConvert.java

@@ -0,0 +1,19 @@
+package org.dromara.backstage.payment.domain.convert;
+
+import io.github.linpeilie.BaseMapper;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
+import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * 卡片视图对象转换器
+ * @author bing
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface RemoteUserAccountVoConvert extends BaseMapper<PtUserAccountVo, RemoteUserAccountVo> {
+
+}

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

@@ -5,10 +5,13 @@ import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.backstage.api.RemoteUserAccountService;
 import org.dromara.backstage.api.domain.bo.RemoteUserAccountBo;
+import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
 import org.dromara.backstage.business.accouunt.UserAccountBusiness;
 import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.backstage.payment.service.IPtUserAccountService;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.MapstructUtils;
 import org.springframework.stereotype.Service;
 
 /**
@@ -50,8 +53,26 @@ public class RemoteUserAccountServiceImpl implements RemoteUserAccountService {
         return userAccountBusiness.openAccount(ptUserAccountBo);
     }
 
+    @Override
+    public RemoteUserAccountVo getUserAccountVoById(Long userId) {
+        PtUserAccountVo vo = userAccountService.queryById(userId);
+        return MapstructUtils.convert(vo,RemoteUserAccountVo.class);
+    }
+
     @Override
     public void updateByBo(RemoteUserAccountBo bo) {
         userAccountService.updateByBo(BeanUtil.copyProperties(bo, PtUserAccountBo.class));
     }
+
+    @Override
+    public RemoteUserAccountVo getUserAccountVoByUserNo(Long userNo) {
+        PtUserAccountVo vo = userAccountService.getUserAccountVoByUserNo(userNo);
+        return MapstructUtils.convert(vo,RemoteUserAccountVo.class);
+    }
+
+    @Override
+    public RemoteUserAccountVo getUserAccountVoByUserNumb(String userNumb) {
+        PtUserAccountVo vo = userAccountService.getUserAccountVoByUserNumb(userNumb);
+        return MapstructUtils.convert(vo, RemoteUserAccountVo.class);
+    }
 }

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPtUserAccountService.java

@@ -166,4 +166,10 @@ public interface IPtUserAccountService {
      * @return 人员信息
      */
     PtUserAccountVo queryByNameAndNumb(String realName,String userNumb);
+
+    PtUserAccountVo getUserAccountVoByUserNo(Long userNo);
+
+    PtUserAccountVo getUserAccountVoByUserNumb(String userNumb);
+
+    PtUserAccountVo selectVoOneByBo(PtUserAccountBo bo);
 }

+ 153 - 90
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java

@@ -1,22 +1,30 @@
 package org.dromara.backstage.payment.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import lombok.Builder;
-import lombok.NoArgsConstructor;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.backstage.payment.domain.PtUserAccount;
+import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
 import org.dromara.backstage.payment.domain.vo.PtUserAccount4SelectVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.backstage.payment.mapper.PtUserAccountMapper;
 import org.dromara.backstage.payment.service.IPtBagService;
+import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.SpringUtils;
@@ -24,19 +32,11 @@ import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.file.FileUtils;
 import org.dromara.common.core.utils.file.MimeTypeUtils;
 import org.dromara.common.encrypt.interceptor.MybatisEncryptInterceptor;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.system.api.RemoteDeptService;
 import org.springframework.stereotype.Service;
-import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
-import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
-import org.dromara.backstage.payment.domain.PtUserAccount;
-import org.dromara.backstage.payment.mapper.PtUserAccountMapper;
-import org.dromara.backstage.payment.service.IPtUserAccountService;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
@@ -74,9 +74,9 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
      * @return 一卡通账户
      */
     @Override
-    public PtUserAccountVo queryById(Long userId){
-        PtUserAccountVo vo= baseMapper.selectVoById(userId);
-        if(vo!=null) {
+    public PtUserAccountVo queryById(Long userId) {
+        PtUserAccountVo vo = baseMapper.selectVoById(userId);
+        if (vo != null) {
             String deptName = remoteDeptService.selectDeptNameByIds(vo.getDeptId().toString());
             vo.setDeptName(deptName);
         }
@@ -94,7 +94,7 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     public TableDataInfo<PtUserAccountVo> queryPageList(PtUserAccountBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<PtUserAccount> lqw = buildQueryWrapper(bo);
         Long deptId = bo.getDeptId();
-        if(deptId != null){
+        if (deptId != null) {
             List<Long> ids = remoteDeptService.selectDeptAndChildrenDeptById(bo.getDeptId());
             lqw.in(PtUserAccount::getDeptId, ids);
         }
@@ -174,6 +174,7 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
 
     /**
      * 给一卡通账户列表查询条件使用
+     *
      * @param bo
      * @param tableAlias
      * @return
@@ -181,16 +182,16 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     private QueryWrapper<PtUserAccount> buildQueryWrapper4Select(PtUserAccountBo bo, String tableAlias) {
         QueryWrapper<PtUserAccount> wrapper = new QueryWrapper<>();
         String columnPrefix = "";
-        if(StringUtils.isNotBlank(tableAlias)){
+        if (StringUtils.isNotBlank(tableAlias)) {
             columnPrefix = tableAlias + ".";
         }
-        wrapper.eq(bo.getPostId() != null, columnPrefix+"post_id", bo.getPostId());
+        wrapper.eq(bo.getPostId() != null, columnPrefix + "post_id", bo.getPostId());
 //        wrapper.like(bo.getDeptId() != null, columnPrefix+"dept_id", bo.getDeptId());
-        wrapper.eq(StringUtils.isNotBlank(bo.getUserNumb()), columnPrefix+"user_numb", bo.getUserNumb());
-        wrapper.like(StringUtils.isNotBlank(bo.getRealName()), columnPrefix+"real_name", bo.getRealName());
-        wrapper.eq(StringUtils.isNotBlank(bo.getAccountStatus()), columnPrefix+"account_status", bo.getAccountStatus());
-        wrapper.eq(StringUtils.isNotBlank(bo.getFreezeStatus()), columnPrefix+"freeze_status", bo.getFreezeStatus());
-        wrapper.eq(StringUtils.isNotBlank(bo.getStatus()), columnPrefix+"status", bo.getStatus());
+        wrapper.eq(StringUtils.isNotBlank(bo.getUserNumb()), columnPrefix + "user_numb", bo.getUserNumb());
+        wrapper.like(StringUtils.isNotBlank(bo.getRealName()), columnPrefix + "real_name", bo.getRealName());
+        wrapper.eq(StringUtils.isNotBlank(bo.getAccountStatus()), columnPrefix + "account_status", bo.getAccountStatus());
+        wrapper.eq(StringUtils.isNotBlank(bo.getFreezeStatus()), columnPrefix + "freeze_status", bo.getFreezeStatus());
+        wrapper.eq(StringUtils.isNotBlank(bo.getStatus()), columnPrefix + "status", bo.getStatus());
         return wrapper;
     }
 
@@ -227,7 +228,7 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(PtUserAccount entity){
+    private void validEntityBeforeSave(PtUserAccount entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -240,11 +241,12 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
     /*
      * 根据Id更新账户的冻结状态
      *
@@ -256,10 +258,11 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
      */
     @Override
     public int updateFreezeStatus(Long userId, String freezeStatus) {
-        return baseMapper.update(null,new LambdaUpdateWrapper<PtUserAccount>()
-            .set(PtUserAccount::getFreezeStatus,freezeStatus)
-            .eq(PtUserAccount::getUserId,userId));
+        return baseMapper.update(null, new LambdaUpdateWrapper<PtUserAccount>()
+            .set(PtUserAccount::getFreezeStatus, freezeStatus)
+            .eq(PtUserAccount::getUserId, userId));
     }
+
     /*
      * 根据Id更新账户的冻结状态
      *
@@ -272,12 +275,13 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     @Override
     public int updateFreezeStatus(Long[] userIds, String freezeStatus) {
         for (Long userId : userIds) {
-            baseMapper.update(null,new LambdaUpdateWrapper<PtUserAccount>()
-                .set(PtUserAccount::getFreezeStatus,freezeStatus)
-                .eq(PtUserAccount::getUserId,userId));
+            baseMapper.update(null, new LambdaUpdateWrapper<PtUserAccount>()
+                .set(PtUserAccount::getFreezeStatus, freezeStatus)
+                .eq(PtUserAccount::getUserId, userId));
         }
         return userIds.length;
     }
+
     /*
      * 根据Id重置账户有效期
      *
@@ -290,13 +294,14 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     @Override
     public int resetLifespan(Long[] userIds, String lifespan) {
         for (Long userId : userIds) {
-            baseMapper.update(null,new LambdaUpdateWrapper<PtUserAccount>()
-                .set(PtUserAccount::getLifespan,lifespan)
-                .eq(PtUserAccount::getUserId,userId));
+            baseMapper.update(null, new LambdaUpdateWrapper<PtUserAccount>()
+                .set(PtUserAccount::getLifespan, lifespan)
+                .eq(PtUserAccount::getUserId, userId));
         }
         return ptCardService.resetLifespan(userIds, lifespan);
 //        return userIds.length;
     }
+
     /*
      * 根据Id更新账户的卡类
      *
@@ -309,13 +314,14 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     @Override
     public int resetCardType(Long[] userIds, String cardType) {
         for (Long userId : userIds) {
-            baseMapper.update(null,new LambdaUpdateWrapper<PtUserAccount>()
-                .set(PtUserAccount::getCardType,cardType)
-                .eq(PtUserAccount::getUserId,userId));
+            baseMapper.update(null, new LambdaUpdateWrapper<PtUserAccount>()
+                .set(PtUserAccount::getCardType, cardType)
+                .eq(PtUserAccount::getUserId, userId));
         }
         return ptCardService.resetCardType(userIds, cardType);
 //        return userIds.length;
     }
+
     /*
      * 根据Id更新账户的消费密码
      *
@@ -328,9 +334,9 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     @Override
     public int resetConsumePwd(Long[] userIds, String pwd) {
         for (Long userId : userIds) {
-            baseMapper.update(null,new LambdaUpdateWrapper<PtUserAccount>()
-                .set(PtUserAccount::getConsumePwd,pwd)
-                .eq(PtUserAccount::getUserId,userId));
+            baseMapper.update(null, new LambdaUpdateWrapper<PtUserAccount>()
+                .set(PtUserAccount::getConsumePwd, pwd)
+                .eq(PtUserAccount::getUserId, userId));
         }
         return userIds.length;
     }
@@ -345,16 +351,17 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
      */
     @Override
     public int openAccount(Long[] userIds) {
-        for (Long userId : userIds){
+        for (Long userId : userIds) {
             //先初始化钱包
             bagService.initAccountBag(userId);
             //更新开户状态
-            baseMapper.update(null,new LambdaUpdateWrapper<PtUserAccount>()
-                .set(PtUserAccount::getAccountStatus,"1")
-                .eq(PtUserAccount::getUserId,userId));
+            baseMapper.update(null, new LambdaUpdateWrapper<PtUserAccount>()
+                .set(PtUserAccount::getAccountStatus, "1")
+                .eq(PtUserAccount::getUserId, userId));
         }
         return userIds.length;
     }
+
     /**
      * 开户
      *
@@ -375,7 +382,7 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
             //return cardBusiness.openVirtualCard(cardBo);
 
         }
-        return R.fail(MessageFormat.format("[一卡通开户]-[失败]-[写账户表失败,开户Id:{0}]",bo.getUserId()));
+        return R.fail(MessageFormat.format("[一卡通开户]-[失败]-[写账户表失败,开户Id:{0}]", bo.getUserId()));
     }
 
     /*
@@ -389,19 +396,19 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     @Override
     public Boolean closeAccount(Long[] userIds) {
         List<String> notCloseList = new ArrayList<>();
-        for (Long userId : userIds){
+        for (Long userId : userIds) {
             String tempValue = bagService.selectAccountBalanceByIds(String.valueOf(userId));
             BigDecimal totalValue = new BigDecimal(tempValue);
-            if (totalValue.compareTo(BigDecimal.ZERO)==0){
+            if (totalValue.compareTo(BigDecimal.ZERO) == 0) {
                 //卡余为0,可以销户
-                baseMapper.update(null,new LambdaUpdateWrapper<PtUserAccount>()
-                    .set(PtUserAccount::getAccountStatus,"-1")
-                    .eq(PtUserAccount::getUserId,userId));
+                baseMapper.update(null, new LambdaUpdateWrapper<PtUserAccount>()
+                    .set(PtUserAccount::getAccountStatus, "-1")
+                    .eq(PtUserAccount::getUserId, userId));
             } else {
                 notCloseList.add(userId.toString());
             }
         }
-        if(!notCloseList.isEmpty()){
+        if (!notCloseList.isEmpty()) {
             log.warn("[销户失败,有账户存在余额]-[{}]", String.join(StringUtils.SEPARATOR, notCloseList));
         }
         return notCloseList.isEmpty();
@@ -411,33 +418,33 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     public int photoBatchUpload(MultipartFile[] files, String uploadPath, String userPath) throws IOException {
         //1. 根据文件名查询账户信息
         List<String> idCards = new ArrayList<>();
-        for (MultipartFile file : files){
+        for (MultipartFile file : files) {
             String idCard = FileUtil.mainName(file.getOriginalFilename());
             idCards.add(idCard);
         }
         Map<String, Long> idCardMap = baseMapper.selectList(Wrappers.lambdaQuery(PtUserAccount.class)
             .select(PtUserAccount::getIdNumber, PtUserAccount::getUserId)
-            .in(PtUserAccount::getIdNumber,idCards)
-        ).stream().collect(Collectors.toMap(PtUserAccount::getIdNumber, PtUserAccount:: getUserId));
+            .in(PtUserAccount::getIdNumber, idCards)
+        ).stream().collect(Collectors.toMap(PtUserAccount::getIdNumber, PtUserAccount::getUserId));
 
         //2. 循环上传照片,并更新账号的照片路径
-            //2.1. 拼接文件完整路径
+        //2.1. 拼接文件完整路径
         String path = uploadPath + userPath;
         int okNum = 0;
-        for (MultipartFile file : files){
+        for (MultipartFile file : files) {
             String extension = FileUtils.extName(file.getOriginalFilename());
             if (StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) {
                 //只上传指定格式文件
                 String idCard = FileUtil.mainName(file.getOriginalFilename());
-                if (idCardMap.containsKey(idCard)){
+                if (idCardMap.containsKey(idCard)) {
                     //只上传根据身份证能匹配到对应账号的照片
                     String newFileName = UUID.randomUUID() + "." + extension;
                     //2. 保存照片
                     FileUtils.upload(file, path, newFileName);
                     //4.保存图片路径到数据库
                     String photoUrl = userPath + newFileName;
-                        updateByBo(PtUserAccountBo.builder().userId(idCardMap.get(idCard)).photo(photoUrl).build());
-                        okNum++;
+                    updateByBo(PtUserAccountBo.builder().userId(idCardMap.get(idCard)).photo(photoUrl).build());
+                    okNum++;
                 }
             }
         }
@@ -446,33 +453,89 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
 
     /**
      * 根据人员编号与姓名查询人员信息
+     *
      * @param realName 人员姓名
      * @param userNumb 人员编号
      * @return 人员信息
      */
     @Override
     public PtUserAccountVo queryByNameAndNumb(String realName, String userNumb) {
-        LambdaQueryWrapper<PtUserAccount> query = new LambdaQueryWrapper<PtUserAccount>()
-            .eq(PtUserAccount::getRealName,realName)
-            .eq(PtUserAccount::getUserNumb,userNumb);
+        PtUserAccountVo vo;
+        List<PtUserAccountVo> redisList = RedisUtils.getCacheList(CacheNames.PT_USER_ACCOUNT);
+
+        if (ObjUtil.isNotNull(redisList) && !redisList.isEmpty()) {
+            vo = redisList.stream().filter(p -> Objects.equals(p.getRealName(), realName)
+            && Objects.equals(p.getUserNumb(),userNumb)).findFirst().orElse(null);
+            if (ObjUtil.isNotNull(vo)) {
+                return vo;
+            }
+        }
 
-        PtUserAccountVo vo = baseMapper.selectVoOne(query);
-        if(vo!=null) {
-            String deptName = remoteDeptService.selectDeptNameByIds(vo.getDeptId().toString());
-            vo.setDeptName(deptName);
+        PtUserAccountBo bo = new PtUserAccountBo();
+        bo.setRealName(realName);
+        bo.setUserNumb(userNumb);
+        return this.selectVoOneByBo(bo);
+    }
+
+    @Override
+    public PtUserAccountVo getUserAccountVoByUserNo(Long userNo) {
+        PtUserAccountVo vo;
+        List<PtUserAccountVo> redisList = RedisUtils.getCacheList(CacheNames.PT_USER_ACCOUNT);
+
+        if (ObjUtil.isNotNull(redisList) && !redisList.isEmpty()) {
+            vo = redisList.stream().filter(p -> Objects.equals(p.getUserNo(), userNo)).findFirst().orElse(null);
+            if (ObjUtil.isNotNull(vo)) {
+                return vo;
+            }
         }
-        return vo;
+
+        PtUserAccountBo bo = new PtUserAccountBo();
+        bo.setUserNo(userNo);
+        return this.selectVoOneByBo(bo);
+    }
+    @Override
+    public PtUserAccountVo getUserAccountVoByUserNumb(String userNumb) {
+        PtUserAccountVo vo;
+        List<PtUserAccountVo> redisList = RedisUtils.getCacheList(CacheNames.PT_USER_ACCOUNT);
+
+        if (ObjUtil.isNotNull(redisList) && !redisList.isEmpty()) {
+            vo = redisList.stream().filter(p -> Objects.equals(p.getUserNumb(), userNumb)).findFirst().orElse(null);
+            if (ObjUtil.isNotNull(vo)) {
+                return vo;
+            }
+        }
+
+        PtUserAccountBo bo = new PtUserAccountBo();
+        bo.setUserNumb(userNumb);
+        return this.selectVoOneByBo(bo);
     }
+    @Override
+    public PtUserAccountVo selectVoOneByBo(PtUserAccountBo bo) {
+        List<PtUserAccountVo> list = this.queryList(bo);
+        if (ObjectUtil.isNotEmpty(list) && !list.isEmpty()) {
+            PtUserAccountVo vo = list.get(0);
+            if (vo != null) {
+                String deptName = remoteDeptService.selectDeptNameByIds(vo.getDeptId().toString());
+                vo.setDeptName(deptName);
+
+                RedisUtils.addCacheList(CacheNames.PT_USER_ACCOUNT, vo);
+                return vo;
+            }
+        }
+        return null;
+    }
+
+
 
-    public static void downloadPicture(String urlList,String name,String userNumb) {
+    public static void downloadPicture(String urlList, String name, String userNumb) {
         URL url = null;
         int imageNumber = 0;
 
         try {
-            url = new URL("http://172.16.137.86:8080/upload/"+urlList);
+            url = new URL("http://172.16.137.86:8080/upload/" + urlList);
             DataInputStream dataInputStream = new DataInputStream(url.openStream());
 
-            String imageName =  "C:\\Users\\LENOVO\\Desktop\\img\\"+name+"_"+userNumb+urlList.substring(urlList.lastIndexOf("."));
+            String imageName = "C:\\Users\\LENOVO\\Desktop\\img\\" + name + "_" + userNumb + urlList.substring(urlList.lastIndexOf("."));
 
             FileOutputStream fileOutputStream = new FileOutputStream(new File(imageName));
             ByteArrayOutputStream output = new ByteArrayOutputStream();
@@ -483,7 +546,7 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
             while ((length = dataInputStream.read(buffer)) > 0) {
                 output.write(buffer, 0, length);
             }
-            byte[] context=output.toByteArray();
+            byte[] context = output.toByteArray();
             fileOutputStream.write(output.toByteArray());
             dataInputStream.close();
             fileOutputStream.close();
@@ -494,7 +557,7 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
         }
     }
 
-    public static class ImageData{
+    public static class ImageData {
         private String url;
         private String name;
 
@@ -507,33 +570,33 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
         }
     }
 
-    public static List<ImageData> parseTxt(String filePath){
-        return FileUtils.readLines(filePath, Charset.defaultCharset()).stream().map(line->{
+    public static List<ImageData> parseTxt(String filePath) {
+        return FileUtils.readLines(filePath, Charset.defaultCharset()).stream().map(line -> {
             String[] split = line.split("\\|");
-            if(split.length!=3){
+            if (split.length != 3) {
                 throw new RuntimeException("txt文件格式错误");
             }
             String userNumb = split[0].replaceAll(" ", "");
             String url = split[1].replaceAll(" ", "");
             String name = split[2].replaceAll(" ", "");
-            return new ImageData(url,name,userNumb);
+            return new ImageData(url, name, userNumb);
         }).collect(Collectors.toList());
     }
 
     //使用 http form-data方式上传图片,使用hutool工具包
-    public static String uploadImage(String userNumb,String name) throws IOException {
+    public static String uploadImage(String userNumb, String name) throws IOException {
         //使用 http form-data方式上传图片,使用hutool工具包
-        String imagePath = "C:\\Users\\LENOVO\\Desktop\\img\\"+name+"_"+userNumb+".jpg";
+        String imagePath = "C:\\Users\\LENOVO\\Desktop\\img\\" + name + "_" + userNumb + ".jpg";
         File file = new File(imagePath);
         Long length = file.length();
-        if(!file.exists() || length <= 0){
-            System.err.println(userNumb+" "+name+" "+"照片不存在 "+ imagePath);
-            return "error: "+ userNumb+" "+name+" "+"照片不存在";
+        if (!file.exists() || length <= 0) {
+            System.err.println(userNumb + " " + name + " " + "照片不存在 " + imagePath);
+            return "error: " + userNumb + " " + name + " " + "照片不存在";
         }
-        Map<String,String> headers = new HashMap<>();
+        Map<String, String> headers = new HashMap<>();
         headers.put("Content-Type", "multipart/form-data");
         headers.put("cookie", "Data=jsv2g08wiSwgsuDrAwQvLCDfueDealwvg330G2yywIAVWXnLV1M/jR6EKPdJqhxGkWwYfHnmjF6+WJk2b8t4gPWQ8T35rBBxD1GiOIQF9jM%3D; Words=MTY6OTQyNjgyNDIyOjg1ODkyODk0NTo5NDMwNzU2MzI6ODQyMDE5NjM3");
-        String json = "{\"method\":\"faceInfoUpdate.addFace\",\"params\":{\"GroupID\":1,\"PersonInfo\":{\"CertificateType\":\"IC\",\"ID\":\""+userNumb+"\"},\"ImageInfo\":{\"Lengths\":["+length+"],\"Amount\":1}},\"session\":\"1d6e61e33641e339c68a3930c4b3e949\",\"id\":120}";
+        String json = "{\"method\":\"faceInfoUpdate.addFace\",\"params\":{\"GroupID\":1,\"PersonInfo\":{\"CertificateType\":\"IC\",\"ID\":\"" + userNumb + "\"},\"ImageInfo\":{\"Lengths\":[" + length + "],\"Amount\":1}},\"session\":\"1d6e61e33641e339c68a3930c4b3e949\",\"id\":120}";
 //        System.err.println(" json "+json);
         HttpRequest form = HttpRequest.post("http://172.19.50.101/CmdCall")
             .addHeaders(headers)
@@ -542,10 +605,10 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
         HttpResponse execute = form.execute();
         String body = execute.body();
 
-        if(body.contains("error")){
-            System.err.println("error: "+ userNumb+" "+name+" "+"照片上传失败,请手动上传"+ "  " + body);
-        }else{
-            System.out.println("state : "+ userNumb+" "+name+" " + execute.isOk() + "  " + body);
+        if (body.contains("error")) {
+            System.err.println("error: " + userNumb + " " + name + " " + "照片上传失败,请手动上传" + "  " + body);
+        } else {
+            System.out.println("state : " + userNumb + " " + name + " " + execute.isOk() + "  " + body);
         }
 //        System.err.println("body : " + body);
         return "ok";
@@ -567,7 +630,7 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
         list = parseTxt("C:\\Users\\LENOVO\\Desktop\\userdata.txt");
 
         for (ImageData imageData : list) {
-            uploadImage(imageData.userNumb,imageData.name);
+            uploadImage(imageData.userNumb, imageData.name);
         }
 
 

+ 1 - 0
ruoyi-server/pom.xml

@@ -10,6 +10,7 @@
         <module>ruoyi-server-base</module>
         <module>ruoyi-server-sync</module>
         <module>ruoyi-server-mqdata</module>
+        <module>ruoyi-server-consume</module>
     </modules>
     <modelVersion>4.0.0</modelVersion>
 

+ 4 - 0
ruoyi-server/ruoyi-server-common/pom.xml

@@ -23,5 +23,9 @@
             <artifactId>ruoyi-common-message</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 9 - 2
ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/constant/DefaultConstants.java

@@ -37,12 +37,19 @@ public interface DefaultConstants {
      * 登录密码
      */
     String LOGIN_PASSWORD = "dtSchool@2024";
+    /**
+     * 日期格式
+     */
+    String DATE_FORMAT = "yyyy-MM-dd";
 
     /**
      * 时间格式
      */
-    String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
-
+    String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    /**
+     * 消费机接收的时间格式
+     */
+    String TERM_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
     /**
      * 父部门Id(学校)
      */

+ 101 - 0
ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/domain/consume/bo/ConsumeRecordBo.java

@@ -0,0 +1,101 @@
+package org.dromara.server.common.domain.consume.bo;
+
+import lombok.Data;
+import org.dromara.common.core.enums.CreditTypeEnum;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * name: consumeRecordBo
+ * package: org.dromara.backstage.consumption.domain.bo
+ * description: 消费记录业务对象,用在安卓消费机上传消费记录
+ * date: 2024-10-14 09:49:50 09:49
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+public class ConsumeRecordBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 5990669486873024387L;
+
+    /**
+     * 消费账户金额
+     */
+    private BigDecimal consumeValue;
+    /**
+     * 消费日期 DateUtils.formatDate(new Date(), "yyyy-MM-dd'T'HH:mm:ss");
+     */
+    private Date consumeDate;
+
+    /**
+     * 消费账户Id
+     */
+    private BigDecimal cardValueXY;
+    /**
+     * 消费账户Id
+     */
+    private BigDecimal cardValue;
+    /**
+     * 消费账户Id
+     */
+    private Long cardID;
+    /**
+     * 消费账户Id
+     */
+    private Long employeeID;
+    /**
+     * 消费账户Id
+     */
+    private Long factoryFixID;
+    /**
+     * 消费账户Id
+     */
+    private Long termID;
+    /**
+     * 消费账户Id
+     */
+    private Long mathineTermID;
+    /**
+     * 消费账户Id
+     */
+    private Long termRecordID;
+    /**
+     * 消费账户Id
+     */
+    private String employeeName;
+    /**
+     * 消费账户Id
+     */
+    private String employeeStrID;
+    /**
+     * 消费账户Id
+     */
+    private Long oriRecordID = 0L;
+    /**
+     * 消费账户Id oriRecordID一样
+     */
+    private Long id = 0L;
+    /**
+     * 消费账户Id
+     */
+    private Integer posRecordState = 0;
+    /**
+     * 消费账户Id
+     */
+    private Long operatorID = 0L;
+    /**
+     * 消费账户Id
+     */
+    private Long consumeDetailId = 0L;
+
+    /**
+     * 交易类型
+     */
+    private CreditTypeEnum creditType;
+}

+ 142 - 0
ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/domain/consume/bo/ConsumptionBo.java

@@ -0,0 +1,142 @@
+package org.dromara.server.common.domain.consume.bo;
+
+import lombok.Data;
+import org.dromara.common.core.enums.CreditTypeEnum;
+import org.dromara.common.core.enums.SystemUseTypeEnum;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * name: ConsumeBo
+ * package: org.dromara.backstage.consumption.domain.bo
+ * description: 消费业务对象,和消费相关的业务都使用此业务对象
+ *             属性可能会根据业务动态调整,最早的业务是错扣补款业务
+ * date: 2024-09-04 08:53:02 08:53
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+public class ConsumptionBo {
+    //region 消费业务基础属性
+    /**
+     * 人员账户Id
+     */
+    private Long userId;
+    /**
+     * 账户流水号
+     */
+    private Long userNo;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 人员姓名
+     */
+    private String realName;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
+    /**
+     * 钱包代码
+     */
+    private String bagType;
+
+    /**
+     * 消费金额
+     */
+    private BigDecimal consumeMoney;
+
+    /**
+     * 消费钱包余额
+     */
+    private BigDecimal balance;
+    /**
+     * 消费日期
+     */
+    private Date consumeDate;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+    /**
+     * 餐类Id
+     */
+    private Long mealType;
+    /**
+     * 原始记录Id
+     */
+    private String consumeId;
+
+    /**
+     * 记录Id
+     */
+    private Long recordId;
+    /**
+     * 消费记录标志位?
+     */
+    private Long recordStatus;
+
+    /**
+     * 状态标识(记录消费类型?)
+     */
+    private Integer statusFlag;
+    /**
+     * 系统使用类型
+     */
+    private SystemUseTypeEnum useType;
+    /**
+     * 操作员Id
+     */
+    private Long operatorId;
+    /**
+     * 操作员姓名
+     */
+    private String operatorName;
+
+    /**
+     * 交易类型
+     */
+    private CreditTypeEnum creditType;
+
+    /**
+     * 租户编号
+     */
+    private String tenantId;
+
+    /**
+     * 防伪验证码(记录消费模式的中文信息)
+     */
+    private String digitalSign;
+    //endregion
+
+    //region 错扣补款属性
+    /**
+     * 补款日期
+     */
+    private Date fillDate;
+
+    /**
+     * 操作金额
+     */
+    private BigDecimal operatorMoney;
+    //endregion
+}

+ 22 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/RuoYiServerConsumeApplication.java

@@ -0,0 +1,22 @@
+package org.dromara.server.consume;
+
+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;
+
+/**
+ * 系统模块
+ *
+ * @author ruoyi
+ */
+@EnableDubbo
+@SpringBootApplication
+public class RuoYiServerConsumeApplication {
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplication(RuoYiServerConsumeApplication.class);
+        application.setApplicationStartup(new BufferingApplicationStartup(2048));
+        application.run(args);
+        System.out.println("(♥◠‿◠)ノ゙  消费服务服务启动成功   ლ(´ڡ`ლ)゙  ");
+    }
+}

+ 64 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/BaseBusiness.java

@@ -0,0 +1,64 @@
+package org.dromara.server.consume.business;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.common.core.utils.RecordIdUtils;
+import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
+import org.dromara.server.consume.domain.bo.XfConsumeDetailOriginalBo;
+import org.dromara.server.consume.domain.vo.XfConsumeDetailOriginalVo;
+import org.dromara.server.consume.service.IXfConsumeDetailOriginalService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+/**
+ * name: BaseBusiness
+ * package: org.dromara.server.consume.business
+ * description: 消费基础业务逻辑封装
+ * <p>主要是对远程调用、数据库入库等业务的封装</p>
+ * date: 2024-10-31 21:21:44 21:21
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class BaseBusiness {
+    private final IXfConsumeDetailOriginalService originalService;
+
+    /**
+     * 生成原始消费记录
+     *
+     * @param consumeBo  消费记录
+     * @param accountVo  消费账户
+     * @param originalVo 原始记录
+     * @return 生成结果
+     */
+    public R<ErrorInfo> createOriginalOrder(ConsumptionBo consumeBo, RemoteUserAccountVo accountVo, XfConsumeDetailOriginalVo originalVo) {
+        String originalId = RecordIdUtils.getRecordId(new Date(), consumeBo.getTermNo().shortValue(), consumeBo.getTermRecordId().shortValue(), accountVo.getUserNo().intValue(), 0);
+
+        XfConsumeDetailOriginalBo originalBo = new XfConsumeDetailOriginalBo();
+        BeanUtil.copyProperties(consumeBo, originalBo);
+        originalBo.setOriginalId(originalId);
+        originalBo.setDataFlag(0L);
+        originalBo.setAnalysisFlag(0L);
+        originalBo.setCardValue(consumeBo.getBalance());
+        originalBo.setConsumeBalance(consumeBo.getBalance());
+        originalBo.setDigitalSign(consumeBo.getDigitalSign());
+        originalBo.setUserId(accountVo.getUserId());
+        originalBo.setDeptId(accountVo.getDeptId());
+        XfConsumeDetailOriginalVo vo = originalService.insertByBo(originalBo);
+        if (ObjUtil.isNotEmpty(vo)) {
+            BeanUtil.copyProperties(vo, originalVo);
+            return R.ok();
+        }
+        return R.fail();
+    }
+}

+ 248 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java

@@ -0,0 +1,248 @@
+package org.dromara.server.consume.business;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.backstage.api.RemoteCardService;
+import org.dromara.backstage.api.RemoteUserAccountService;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
+import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
+import org.dromara.server.consume.domain.vo.XfTermVo;
+import org.dromara.server.consume.service.IXfTermService;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.stereotype.Service;
+
+import java.text.MessageFormat;
+import java.util.Objects;
+
+/**
+ * name: CheckBusiness
+ * package: org.dromara.server.consume.business
+ * description: 消费数据验证业务处理
+ * date: 2024-11-02 07:49:37 07:49
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class CheckBusiness {
+    @DubboReference
+    private final RemoteCardService remoteCardService;
+    @DubboReference
+    private final RemoteUserAccountService remoteUserAccountService;
+
+    private final IXfTermService termService;
+
+    /**
+     * 消费记录参数检检查
+     * 1.检查设备编号,设备编号必须大于0
+     * 2.检查交易人员标识:卡流水号、物理卡号、人员Id、人员编号至少有1项
+     *
+     * @param bo 消费记录业务对象
+     * @return 检查结果
+     */
+    public R<ErrorInfo> checkParam(ConsumptionBo bo) {
+        ErrorInfo errorInfo;
+        //检查设备机号
+        if (ObjectUtil.isEmpty(bo.getTermNo()) || bo.getTermNo() == 0) {
+            errorInfo = new ErrorInfo(1, "", "设备机号不正确", "设备机号必须大于零!");
+            return R.fail(errorInfo);
+        }
+        //检查交易人员标识
+        if (bo.getCardNo() <= 0 && bo.getFactoryId() == 0 && bo.getUserNo() <= 0 && StrUtil.isEmpty(bo.getUserNumb())) {
+            errorInfo = new ErrorInfo(1, "", "交易人员标识不满足", "必须提供 [CardNo | FactoryId | userNo | userNumb] 中至少1项来标识交易用户");
+            return R.fail(errorInfo);
+        }
+        return R.ok();
+    }
+
+    /**
+     * 消费记录人员、卡片检查,一切通过后获取到消费账户、卡片及设备的视图信息
+     *
+     * @param bo            消费记录
+     * @param userAccountVo 消费账户
+     * @param userCardVo  消费卡片
+     * @param useTermVo 消费设备
+     * @return 验证结果
+     */
+    public R<ErrorInfo> checkUser(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo, XfTermVo useTermVo) {
+        long termNo = ObjectUtil.isEmpty(bo.getTermNo())? 0 : bo.getTermNo();
+        long cardNo = ObjectUtil.isEmpty(bo.getCardNo()) ? 0 : bo.getCardNo();
+        long factoryId = ObjectUtil.isEmpty(bo.getFactoryId()) ? 0 : bo.getFactoryId();
+        long userNo = ObjectUtil.isEmpty(bo.getUserNo()) ? 0 : bo.getUserNo();
+        String userNumb = bo.getUserNumb() == null ? null : bo.getUserNumb();
+        XfTermVo termVo = termService.queryVoOneByNo(termNo);
+        if(ObjectUtil.isEmpty(termVo)){
+            ErrorInfo errorInfo = new ErrorInfo(400, "", "设备不存在", MessageFormat.format("设备机号为[{0}]的设备不存在,不允许交易", termNo));
+
+            return R.fail(errorInfo);
+        }
+       BeanUtil.copyProperties(termVo,useTermVo);
+        //卡流水号检查
+        if (cardNo > 0) {
+            return checkCardNo(bo,userAccountVo ,userCardVo );
+        }
+        //物理卡号检查
+        if (factoryId > 0) {
+            return checkFactoryId(bo,userAccountVo ,userCardVo);
+        }
+        //用户流水号检查
+        if (userNo > 0) {
+            return checkUserNo(bo,userAccountVo ,userCardVo);
+        }
+        //人员编号检查
+        if (StrUtil.isNotEmpty(userNumb)) {
+            return checkUserNumb(bo,userAccountVo ,userCardVo);
+        }
+        return R.ok();
+    }
+
+    /**
+     * 消费逻辑检查,检查是否能消费
+     * @param bo 消费记录
+     * @param userAccountVo 消费账户
+     * @param userCardVo 消费卡片
+     * @param useTermVo 消费设备
+     * @return 验证结果
+     */
+    public R<ErrorInfo> checkConsume(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo, XfTermVo useTermVo){
+        // TODO 2024-11-03 14:36:42 luoyibo 1.获取传入的参数
+        // TODO 2024-11-03 14:36:42 luoyibo 2.卡有效性验证
+        // TODO 2024-11-03 14:39:21 luoyibo 3.消费账户状态验证
+        // TODO 2024-11-03 14:39:49 luoyibo 4.餐类验证
+        // TODO 2024-11-03 14:41:28 luoyibo 5.折扣\限额\限次验证
+        // TODO 2024-11-03 14:45:18 luoyibo 6.根据消费机的消费模式验证余额
+        return R.ok();
+    }
+    /**
+     * 验证后设置人员信息
+     * @param bo 消费记录
+     * @param accountVo 人员账户信息
+     */
+    private void setUserInfo(ConsumptionBo bo, RemoteUserAccountVo accountVo) {
+        bo.setRealName(StrUtil.isEmpty(accountVo.getRealName()) ? "----" : accountVo.getRealName());
+        bo.setUserNo(accountVo.getUserNo());
+        bo.setUserNumb(accountVo.getUserNumb());
+    }
+
+    @NotNull
+    private R<ErrorInfo> checkCardNo(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo) {
+        Long cardNo = bo.getCardNo();
+        ErrorInfo errorInfo;
+        RemoteCardVo cardVo = remoteCardService.queryCardByCardNo(cardNo);
+        if (ObjectUtil.isEmpty(cardVo)) {
+            errorInfo = new ErrorInfo(400, "", "卡片不存在", MessageFormat.format("流水号为[{0}]的卡片不存在,不允许交易", cardNo));
+
+            return R.fail(errorInfo);
+        }
+        if (!"1".equals(cardVo.getStatus())) {
+            errorInfo = new ErrorInfo(400, "", "卡片状态不正确", MessageFormat.format("流水号为[{0}]的卡片状态不正确,不允许交易", cardNo));
+
+            return R.fail(errorInfo);
+        }
+        if (!Objects.equals(cardVo.getFactoryId(), bo.getFactoryId())) {
+            errorInfo = new ErrorInfo(400, "", "卡片不正确", "物理卡不一致,不允许交易");
+
+            return R.fail(errorInfo);
+        }
+        RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
+        setUserInfo(bo, accountVo);
+        bo.setFactoryId(cardVo.getFactoryId());
+        BeanUtil.copyProperties(accountVo,userAccountVo);
+        BeanUtil.copyProperties(cardVo,userCardVo);
+        return R.ok();
+    }
+
+    @NotNull
+    private R<ErrorInfo> checkFactoryId(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo) {
+        ErrorInfo errorInfo;
+        Long factoryId = bo.getFactoryId();
+        RemoteCardVo cardVo = remoteCardService.queryCardByFactoryId(factoryId);
+        if (ObjectUtil.isEmpty(cardVo)) {
+            errorInfo = new ErrorInfo(400, "", "卡片不存在", MessageFormat.format("物理卡号为[{0}]的卡片不存在,不允许交易", factoryId));
+
+            return R.fail(errorInfo);
+        }
+        if (!"1".equals(cardVo.getStatus())) {
+            errorInfo = new ErrorInfo(400, "", "卡片状态不正确", MessageFormat.format("物理卡号为[{0}]的卡片卡片状态不正确,不允许交易", factoryId));
+
+            return R.fail(errorInfo);
+        }
+        RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
+        setUserInfo(bo, accountVo);
+        bo.setCardNo(cardVo.getCardNo());
+        BeanUtil.copyProperties(accountVo,userAccountVo);
+        BeanUtil.copyProperties(cardVo,userCardVo);
+        return R.ok();
+    }
+
+    @NotNull
+    private R<ErrorInfo> checkUserNo(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo) {
+        ErrorInfo errorInfo;
+        Long userNo = bo.getUserNo();
+        RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoByUserNo(userNo);
+        if (ObjectUtil.isEmpty(accountVo)) {
+            errorInfo = new ErrorInfo(400, "", "人员不存在", MessageFormat.format("流水号为[{0}]的人员不存在,不允许交易", userNo));
+
+            return R.fail(errorInfo);
+        }
+        RemoteCardVo cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
+        if (ObjectUtil.isEmpty(cardVo)) {
+            errorInfo = new ErrorInfo(400, "", "卡片不存在", MessageFormat.format("流水号为[{0}]的人员卡片不存在,不允许交易", userNo));
+
+            return R.fail(errorInfo);
+        }
+        if (!"1".equals(cardVo.getStatus())) {
+            errorInfo = new ErrorInfo(400, "", "卡片状态不正确", MessageFormat.format("流水号为[{0}]的人员卡片状态不正确,不允许交易", userNo));
+
+            return R.fail(errorInfo);
+        }
+        setUserInfo(bo, accountVo);
+        bo.setCardNo(cardVo.getCardNo());
+        bo.setFactoryId(cardVo.getFactoryId());
+        BeanUtil.copyProperties(accountVo,userAccountVo);
+        BeanUtil.copyProperties(cardVo,userCardVo);
+        return R.ok();
+    }
+
+    @NotNull
+    private R<ErrorInfo> checkUserNumb(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo) {
+        ErrorInfo errorInfo;
+        String userNumb = bo.getUserNumb();
+        RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoByUserNumb(userNumb);
+
+        if (ObjectUtil.isEmpty(accountVo)) {
+            errorInfo = new ErrorInfo(400, "", "人员不存在", MessageFormat.format("编号为[{0}]的人员不存在,不允许交易", userNumb));
+
+            return R.fail(errorInfo);
+        }
+        RemoteCardVo cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
+        if (ObjectUtil.isEmpty(cardVo)) {
+            errorInfo = new ErrorInfo(400, "", "卡片不存在", MessageFormat.format("编号为[{0}]的人员卡片不存在,不允许交易", userNumb));
+
+            return R.fail(errorInfo);
+        }
+        if (!"1".equals(cardVo.getStatus())) {
+            errorInfo = new ErrorInfo(400, "", "卡片状态不正确", MessageFormat.format("编号为[{0}]的人员卡片状态不正确,不允许交易", userNumb));
+
+            return R.fail(errorInfo);
+        }
+
+        setUserInfo(bo, accountVo);
+        bo.setCardNo(cardVo.getCardNo());
+        bo.setFactoryId(cardVo.getFactoryId());
+        BeanUtil.copyProperties(accountVo,userAccountVo);
+        BeanUtil.copyProperties(cardVo,userCardVo);
+
+        return R.ok();
+    }
+}

+ 87 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/ConsumeBusiness.java

@@ -0,0 +1,87 @@
+package org.dromara.server.consume.business;
+
+import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
+import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
+import org.dromara.server.consume.domain.vo.XfConsumeDetailOriginalVo;
+import org.dromara.server.consume.domain.vo.XfTermVo;
+import org.springframework.stereotype.Service;
+
+import java.text.MessageFormat;
+
+/**
+ * name: ConsumeBusiness
+ * package: org.dromara.server.consume.business
+ * description: 消费业务处理入口
+ * date: 2024-11-01 20:25:48 20:25
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ConsumeBusiness {
+    private final CheckBusiness checkBusiness;
+    private final BaseBusiness baseBusiness;
+
+    /**
+     * 请求消费
+     *
+     * @param bo 消费记录
+     * @return 请求结果
+     */
+    public R<ErrorInfo> createOrder(ConsumptionBo bo) {
+        R<ErrorInfo> result = checkBusiness.checkParam(bo);
+        if (R.isError(result)) {
+            log.error("[请求交易]-[参数验证失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
+            return result;
+        }
+
+        RemoteUserAccountVo userAccountVo = new RemoteUserAccountVo();
+        RemoteCardVo userCardVo = new RemoteCardVo();
+        XfTermVo termVo = new XfTermVo();
+        result = checkBusiness.checkUser(bo, userAccountVo, userCardVo, termVo);
+        if (R.isError(result)) {
+            log.error("[请求交易]-[用户信息验证失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
+            return result;
+        }
+
+        result = checkBusiness.checkConsume(bo, userAccountVo, userCardVo, termVo);
+        if (R.isError(result)) {
+            log.error("[请求交易]-[交易验证失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
+            return result;
+        }
+
+        XfConsumeDetailOriginalVo originalVo = new XfConsumeDetailOriginalVo();
+        result = baseBusiness.createOriginalOrder(bo, userAccountVo, originalVo);
+        if (R.isError(result)) {
+            String msg = MessageFormat.format("设备编号[{0}] 消费流水号[{1}] 卡流水号[{2}]", bo.getTermNo(), bo.getTermRecordId(), userCardVo.getCardNo());
+            log.error("[请求交易]-[消费原始记录表入库失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
+            return result;
+        }
+        bo.setRecordId(originalVo.getRecordId());
+        return R.ok();
+    }
+
+    /**
+     * 上传消费记录
+     *
+     * @param bo 消费记录
+     * @return 上传结果
+     */
+    public R<ErrorInfo> postOrder(ConsumptionBo bo) {
+        R<ErrorInfo> result = checkBusiness.checkParam(bo);
+        if (R.isError(result)) {
+            log.error("[上传交易]-[参数验证失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
+            return result;
+        }
+        return R.ok();
+    }
+}

+ 18 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/constant/TermSupplierConstants.java

@@ -0,0 +1,18 @@
+package org.dromara.server.consume.constant;
+
+/**
+ * name: TermSupplierConstants
+ * package: org.dromara.server.consume.constant
+ * description: 消费机供应商常量
+ * date: 2024-11-01 22:33:54 22:33
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface TermSupplierConstants {
+    /**
+     * YC
+     */
+    String YC="YC";
+}

+ 72 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/ConsumeController.java

@@ -0,0 +1,72 @@
+package org.dromara.server.consume.controller.v1;
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.common.core.domain.model.ErrorResult;
+import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
+import org.dromara.server.consume.business.ConsumeBusiness;
+import org.dromara.server.consume.convert.strategy.RecordConvertStrategyContent;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Objects;
+
+/**
+ * name: ConsumeController
+ * package: org.dromara.server.consume.controller.v1
+ * description: V系列安卓消费消费接口
+ * date: 2024-10-31 16:21:24 16:21
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/v1/Consumes")
+public class ConsumeController {
+    private final RecordConvertStrategyContent recordConvertStrategy;
+    private final ConsumeBusiness consumeBusiness;
+
+    @PostMapping("/ConsumeOriginal")
+    public Object consumeOriginal(@RequestBody Object record) {
+        return doRecordData(record,"requestConsume");
+    }
+    @PostMapping("/Consume")
+    public Object uploadRecord(@RequestBody Object record) {
+        return doRecordData(record,"uploadRecord");
+    }
+
+    private Object doRecordData(Object record,String type){
+        if(ObjectUtil.length(record)==0){
+            ErrorResult result = ErrorResult.instance(HttpStatus.FORBIDDEN, "处理失败", 1, "PARAM_ERROR", "参数错误",
+                "json字符串无法还原为对象,可能原因是格式不正确。");
+            return new ResponseEntity<Object>(result, null, HttpStatus.FORBIDDEN);
+        }
+        ConsumptionBo bo = recordConvertStrategy.convert(record, "YC");
+        R<ErrorInfo> errorInfo;
+        if(Objects.equals(type, "requestConsume")) {
+             errorInfo = consumeBusiness.createOrder(bo);
+        } else {
+            errorInfo = consumeBusiness.postOrder(bo);
+        }
+        if(!R.isSuccess(errorInfo)){
+            ErrorResult result = new ErrorResult();
+            result.setStatusCode(HttpStatus.NOT_FOUND.value());
+            result.setMessage(errorInfo.getMsg());
+            result.getErrors().add(errorInfo.getData());
+            return new ResponseEntity<Object>(result, null, HttpStatus.NOT_FOUND);
+        }
+        return recordConvertStrategy.reConvert(bo,"YC");
+    }
+
+}

+ 20 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/convert/strategy/IRecordConvertStrategy.java

@@ -0,0 +1,20 @@
+package org.dromara.server.consume.convert.strategy;
+
+import cn.hutool.json.JSONObject;
+import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
+
+/**
+ * name: IRecordConvertStrategy
+ * package: org.dromara.server.consume.business.Strategy.Convert
+ * description: 接收到的消费记录转换成标准的消费记录业务对象
+ * date: 2024-11-01 21:15:27 21:15
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface IRecordConvertStrategy {
+    ConsumptionBo convertToStandard(Object source);
+
+    Object convertToSupplier(ConsumptionBo bo);
+}

+ 36 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/convert/strategy/RecordConvertStrategyContent.java

@@ -0,0 +1,36 @@
+package org.dromara.server.consume.convert.strategy;
+
+import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * name: ConsumeStrategyContent
+ * package: org.dromara.backstage.business.consume.strategy.impl
+ * description: 消费策略上下文
+ * date: 2024-08-19 22:08:12 22:08
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Service
+public class RecordConvertStrategyContent{
+    private final Map<String, IRecordConvertStrategy> strategyMap = new ConcurrentHashMap<>();
+
+    @Autowired
+    public RecordConvertStrategyContent(Map<String, IRecordConvertStrategy> strategyMap) {
+        this.strategyMap.putAll(strategyMap);
+    }
+
+    public ConsumptionBo convert(Object source, String type) {
+        return strategyMap.get(type).convertToStandard(source);
+    }
+
+    public Object reConvert(ConsumptionBo source, String type) {
+        return strategyMap.get(type).convertToSupplier(source);
+    }
+}

+ 84 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/convert/strategy/impl/YcRecordConvertStrategyImpl.java

@@ -0,0 +1,84 @@
+package org.dromara.server.consume.convert.strategy.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import org.dromara.server.common.constant.DefaultConstants;
+import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
+import org.dromara.server.consume.constant.TermSupplierConstants;
+import org.dromara.server.consume.convert.strategy.IRecordConvertStrategy;
+import org.dromara.server.consume.domain.YcConsumeInfo;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * name: YcRecordConvertStrategyImpl
+ * package: org.dromara.server.consume.convert.strategy.impl
+ * description: 宇川消费机上传消费记录转换
+ * date: 2024-11-01 21:29:10 21:29
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Service(TermSupplierConstants.YC)
+public class YcRecordConvertStrategyImpl implements IRecordConvertStrategy {
+    @Override
+    public ConsumptionBo convertToStandard(Object source) {
+        YcConsumeInfo yc = BeanUtil.copyProperties(source, YcConsumeInfo.class);
+        if (yc != null) {
+            ConsumptionBo consumptionBo = new ConsumptionBo();
+            consumptionBo.setUserNo(ObjectUtil.isEmpty(yc.getEmployeeID()) ? 0 : yc.getEmployeeID());
+            consumptionBo.setUserNumb(ObjectUtil.isEmpty(yc.getEmployeeStrID()) ? "" : yc.getEmployeeStrID());
+            consumptionBo.setRealName(ObjectUtil.isEmpty(yc.getEmployeeName()) ? "" : yc.getEmployeeName());
+            consumptionBo.setCardNo(ObjectUtil.isEmpty(yc.getCardID()) ? 0 : yc.getCardID());
+            consumptionBo.setFactoryId(ObjectUtil.isEmpty(yc.getFactoryFixID()) ? 0 : yc.getFactoryFixID());
+            //金额精确到两位小数
+            consumptionBo.setConsumeMoney(ObjectUtil.isEmpty(yc.getConsumeValue()) ? BigDecimal.ZERO : yc.getConsumeValue().setScale(2, RoundingMode.HALF_UP));
+            String tempDate = yc.getConsumeDate();
+            if(StrUtil.isNotEmpty(tempDate)){
+                consumptionBo.setConsumeDate(DateUtil.parse(tempDate, DefaultConstants.DATE_TIME_FORMAT));
+            }
+            consumptionBo.setTermNo(ObjectUtil.isEmpty(yc.getTermID()) ? 0 : yc.getTermID());
+            consumptionBo.setTermRecordId(ObjectUtil.isEmpty(yc.getTermRecordID()) ? 0 : yc.getTermRecordID());
+            consumptionBo.setRecordId(ObjectUtil.isEmpty(yc.getOriRecordID()) ? null : yc.getOriRecordID());
+            consumptionBo.setRecordStatus(ObjectUtil.isEmpty(yc.getPosRecordState()) ? 0 : yc.getPosRecordState());
+            consumptionBo.setOperatorId(ObjectUtil.isEmpty(yc.getOperatorID()) ? 0 : yc.getOperatorID());
+
+            return consumptionBo;
+        }
+        return null;
+    }
+
+    @Override
+    public Object convertToSupplier(ConsumptionBo bo) {
+        if(ObjectUtil.isNotEmpty(bo)){
+            YcConsumeInfo yc = new YcConsumeInfo();
+            yc.setConsumeValue(bo.getConsumeMoney());
+            yc.setConsumeDate(DateUtil.format(bo.getConsumeDate(),DefaultConstants.TERM_DATE_FORMAT));
+            yc.setCreateDate(DateUtil.format(bo.getConsumeDate(),DefaultConstants.TERM_DATE_FORMAT));
+            yc.setCardValueXY(BigDecimal.ZERO);
+            yc.setCardValue(bo.getBalance());
+            yc.setCardID(bo.getCardNo());
+            yc.setFactoryFixID(bo.getFactoryId());
+            yc.setEmployeeID(bo.getUserNo());
+            yc.setEmployeeName(bo.getRealName());
+            yc.setEmployeeStrID(bo.getUserNumb());
+            yc.setTermID(bo.getTermNo());
+            yc.setMathineTermID(bo.getTermNo());
+            yc.setTermRecordID(bo.getTermRecordId());
+            yc.setOriRecordID(bo.getRecordId());
+            yc.setId(bo.getRecordId());
+            yc.setPosRecordState(bo.getRecordStatus());
+            yc.setOperatorID(bo.getOperatorId());
+            yc.setConsumeDetailId(bo.getTermRecordId());
+
+            return yc;
+        }
+        return null;
+    }
+}

+ 205 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfConsumeDetail.java

@@ -0,0 +1,205 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 消费明细对象 t_xf_consumeDetail
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_consumeDetail")
+public class XfConsumeDetail extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 消费记录Id,主键
+     */
+    @TableId(value = "consume_id")
+    private String consumeId;
+
+    /**
+     * 原始记录Id,主键
+     */
+    private String originalId;
+
+    /**
+     * 记录Id
+     */
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 消费日期
+     */
+    private Date consumeDate;
+
+    /**
+     * 消费金额
+     */
+    private BigDecimal consumeMoney;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
+
+    /**
+     * 卡上余额
+     */
+    private BigDecimal cardValue;
+
+    /**
+     * 卡使用次数
+     */
+    private Long cardCount;
+
+    /**
+     * 消费账户金额
+     */
+    private BigDecimal consumeBalance;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 是否已处理(和灰记录处理有关)
+     */
+    private Long analysisFlag;
+
+    /**
+     * 状态标识(记录消费类型?)
+     */
+    private Long statusFlag;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 营业员名称
+     */
+    private String operatorName;
+
+    /**
+     * 结算账户Id
+     */
+    private Long accountId;
+
+    /**
+     * 结算账户名称
+     */
+    private String accountName;
+
+    /**
+     * 房间Id
+     */
+    private Long roomId;
+
+    /**
+     * 房间名称
+     */
+    private String roomName;
+
+    /**
+     * 钱包类型
+     */
+    private String bagType;
+
+    /**
+     * 餐类Id
+     */
+    private Long mealType;
+
+    /**
+     * 餐类名称
+     */
+    private String mealName;
+
+    /**
+     * 是否发送短信,见 sys_yes_no字典类别
+     */
+    private String smsSend;
+
+    /**
+     * 消费记录标志位?
+     */
+    private Long recordStatus;
+
+    /**
+     * 同步标志,0-未同步,1-已同步
+     */
+    private Long syncStatus;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 针对错扣补款的消费记录的id
+     */
+    private String detailId;
+
+}

+ 171 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfConsumeDetailOriginal.java

@@ -0,0 +1,171 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 原始消费记录对象 t_xf_consumeDetailOriginal
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_consumeDetailOriginal")
+public class XfConsumeDetailOriginal extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 原始记录Id,主键
+     */
+    @TableId(value = "original_id")
+    private String originalId;
+
+    /**
+     * 记录Id,自增长,唯一id值,用于应答给消费设备
+     */
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 消费日期
+     */
+    private Date consumeDate;
+
+    /**
+     * 消费金额
+     */
+    private BigDecimal consumeMoney;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
+
+    /**
+     * 卡上余额
+     */
+    private BigDecimal cardValue;
+
+    /**
+     * 卡使用次数
+     */
+    private Long cardCount;
+
+    /**
+     * 消费账户金额
+     */
+    private BigDecimal consumeBalance;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 是否已处理(和灰记录处理有关)
+     */
+    private Long analysisFlag;
+
+    /**
+     * 消费记录标志
+     */
+    private Long dataFlag;
+
+    /**
+     * 状态标识(记录消费类型?)
+     */
+    private Long statusFlag;
+
+    /**
+     * 防伪验证码(记录消费模式的中文信息)
+     */
+    private String digitalSign;
+
+    /**
+     * 水控金额
+     */
+    private BigDecimal waterValue;
+
+    /**
+     * 水控历史余额
+     */
+    private BigDecimal waterHistoryValue;
+
+    /**
+     * 水控当天总和
+     */
+    private BigDecimal waterDaySum;
+
+    /**
+     * 水控错误余额
+     */
+    private BigDecimal waterErrValue;
+
+    /**
+     * 水控错误消费金额
+     */
+    private BigDecimal waterErrMoney;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 201 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfCreditAccount.java

@@ -0,0 +1,201 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 资金收支明细对象 t_xf_creditAccount
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_creditAccount")
+public class XfCreditAccount extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 收支Id
+     */
+    @TableId(value = "credit_id")
+    private String creditId;
+
+    /**
+     * 记录Id
+     */
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 卡上余额
+     */
+    private BigDecimal cardValue;
+
+    /**
+     * 卡片类型
+     */
+    private Long cardType;
+
+    /**
+     * 卡使用次数
+     */
+    private Long cardCount;
+
+    /**
+     * 卡片类型名称
+     */
+    private String cardTypeName;
+
+    /**
+     * 是否主卡,见sys_yes_no字典类别
+     */
+    private String mainCard;
+
+    /**
+     * 钱包类型
+     */
+    private String bagType;
+
+    /**
+     * 使用类型,100-消费系统
+     */
+    private Long useType;
+
+    /**
+     * 工作站编号
+     */
+    private Long stationNumb;
+
+    /**
+     * 工作站名称
+     */
+    private String stationName;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 营业员名称
+     */
+    private String operatorName;
+
+    /**
+     * 交易时间
+     */
+    private Date creditTime;
+
+    /**
+     * 交易类型,见CREDITTYPE字典类型
+     */
+    private String creditType;
+
+    /**
+     * 资金来源,见PAYSTYLE字典类型
+     */
+    private String payStyle;
+
+    /**
+     * 交易金额
+     */
+    private BigDecimal receiptMoney;
+
+    /**
+     * 核对状态,见sys_yes_no字典类型
+     */
+    private String auditStatus;
+
+    /**
+     * 核对时间
+     */
+    private Date auditDate;
+
+    /**
+     * 团充Id
+     */
+    private Long groupId;
+
+    /**
+     * 原始记录Id,对应收支备份表的主键字段
+     */
+    private String originalId;
+
+    /**
+     * 是否发送短信,见 sys_yes_no字典类别
+     */
+    private String smsSend;
+
+    /**
+     * 消费记录标志位?
+     */
+    private Long recordStatus;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 161 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfCreditAccountBack.java

@@ -0,0 +1,161 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 资金收支备份对象 t_xf_creditAccountBack
+ *
+ * @author Yb
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_creditAccountBack")
+public class XfCreditAccountBack extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 收支备份Id,主键
+     */
+    @TableId(value = "back_id")
+    private String backId;
+
+    /**
+     * 记录Id
+     */
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 卡上余额
+     */
+    private BigDecimal cardValue;
+
+    /**
+     * 是否主卡,见sys_yes_no字典类别
+     */
+    private String mainCard;
+
+    /**
+     * 钱包类型
+     */
+    private String bagType;
+
+    /**
+     * 使用类型,100-消费系统
+     */
+    private Integer useType;
+
+    /**
+     * 工作站Id
+     */
+    private Long stationId;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 交易时间
+     */
+    private Date creditTime;
+
+    /**
+     * 交易类型,见CREDITTYPE字典类型
+     */
+    private String creditType;
+
+    /**
+     * 资金来源,见PAYSTYLE字典类型
+     */
+    private String payStyle;
+
+    /**
+     * 交易金额
+     */
+    private BigDecimal receiptMoney;
+
+    /**
+     * 交易状态
+     */
+    private Long creditStatus;
+
+    /**
+     * 团充Id
+     */
+    private Long groupId;
+
+    /**
+     * 收支记录Id,对应收支明细表的主键字段
+     */
+    private String creditId;
+
+    /**
+     * 原始记录Id?
+     */
+    private String originalId;
+
+    /**
+     * 是否发送短信,见 sys_yes_no字典类别
+     */
+    private String smsSend;
+
+    /**
+     * 消费记录标志位?
+     */
+    private Long recordStatus;
+
+    /**
+     * 统计分析标识
+     */
+    private Long analysisFlag;
+
+    /**
+     * 数字签名
+     */
+    private String digitalSign;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 84 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfDiscount.java

@@ -0,0 +1,84 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * 折扣管理对象 t_xf_discount
+ *
+ * @author bing
+ * @date 2024-08-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_discount")
+public class XfDiscount extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 折扣Id,主键
+     */
+    @TableId(value = "discount_id")
+    private Long discountId;
+
+    /**
+     * 卡类Id
+     */
+    private Long cardType;
+
+    /**
+     * 餐类Id
+     */
+    private String mealType;
+
+    /**
+     * 折扣类型,默认为0
+     */
+    private String rateType;
+
+    /**
+     * 折扣率1
+     */
+    private Long oneRate;
+
+    /**
+     * 折扣率2
+     */
+    private Long twoRate;
+
+    /**
+     * 折扣率3
+     */
+    private Long threeRate;
+
+    /**
+     * 折扣率4
+     */
+    private Long fourRate;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 启用状态,0-未启用 1-启用
+     */
+    private String status;
+
+
+}

+ 44 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfDiscountTerm.java

@@ -0,0 +1,44 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * 折扣设备对象 t_xf_discountTerm
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_discountTerm")
+public class XfDiscountTerm extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 折扣Id,主键
+     */
+    @TableId(value = "discount_term_id")
+    private Long discountTermId;
+
+    /**
+     * 设备Id
+     */
+    private Long termId;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 79 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfLimited.java

@@ -0,0 +1,79 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * 限次管理对象 t_xf_limited
+ *
+ * @author bing
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_limited")
+public class XfLimited extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 限次Id,主键
+     */
+    @TableId(value = "limited_id")
+    private Long limitedId;
+
+    /**
+     * 卡类Id
+     */
+    private Long cardType;
+
+    /**
+     * 每日次数
+     */
+    private Long dailyCount;
+
+    /**
+     * 早餐次数
+     */
+    private Long oneCount;
+
+    /**
+     * 午餐次数
+     */
+    private Long twoCount;
+
+    /**
+     * 晚餐次数
+     */
+    private Long threeCount;
+
+    /**
+     * 宵夜次数
+     */
+    private Long fourCount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 启用状态,0-未启用 1-启用
+     */
+    private String status;
+
+
+}

+ 44 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfLimitedTerm.java

@@ -0,0 +1,44 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * 限次设备绑定对象 t_xf_limitedTerm
+ *
+ * @author bing
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_limitedTerm")
+public class XfLimitedTerm extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 限次Id,主键
+     */
+    @TableId(value = "limited_term_id")
+    private Long limitedTermId;
+
+    /**
+     * 设备Id
+     */
+    private Long termId;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 79 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfQuota.java

@@ -0,0 +1,79 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * 限额管理对象 t_xf_quota
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_quota")
+public class XfQuota extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 限额Id,主键
+     */
+    @TableId(value = "quota_id")
+    private Long quotaId;
+
+    /**
+     * 卡类Id
+     */
+    private Long cardType;
+
+    /**
+     * 每日金额
+     */
+    private Long dailyMoney;
+
+    /**
+     * 早餐金额
+     */
+    private Long oneMoney;
+
+    /**
+     * 午餐金额
+     */
+    private Long twoMoney;
+
+    /**
+     * 晚餐金额
+     */
+    private Long threeMoney;
+
+    /**
+     * 宵夜金额
+     */
+    private Long fourMoney;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 启用状态,0-未启用 1-启用
+     */
+    private String status;
+
+
+}

+ 44 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfQuotaTerm.java

@@ -0,0 +1,44 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * 限额设备绑定对象 t_xf_quotaTerm
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_quotaTerm")
+public class XfQuotaTerm extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 限额Id,主键
+     */
+    @TableId(value = "quota_term_id")
+    private Long quotaTermId;
+
+    /**
+     * 设备Id
+     */
+    private Long termId;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 358 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfTerm.java

@@ -0,0 +1,358 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 消费设备对象 t_xf_term
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_term")
+public class XfTerm extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 设备Id,主键
+     */
+    @TableId(value = "term_id")
+    private Long termId;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 所属餐厅Id
+     */
+    private Long roomId;
+
+    /**
+     * 结算账户Id
+     */
+    private Long accountId;
+
+    /**
+     * 设备类型,见XF_TermType字典类型
+     */
+    private String termType;
+
+    /**
+     * 设备二维码
+     */
+    private String qrCode;
+
+    /**
+     * 工作站Id
+     */
+    private Long stationId;
+
+    /**
+     * 扣费类型,见XF_ConsumeType字典类型
+     */
+    private String consumeType;
+
+    /**
+     * 是否自动下载参数,见sys_yew_no字典项
+     */
+    private String autoDown;
+
+    /**
+     * 应用系统,见YYXT数据字典类别
+     */
+    private String useType;
+
+    /**
+     * 允许使用的卡类
+     */
+    private Long cardType;
+
+    /**
+     * 设备IP
+     */
+    private String termIp;
+
+    /**
+     * 设备MAC地址
+     */
+    private String termMac;
+
+    /**
+     * 设备通讯端口
+     */
+    private Long commPort;
+
+    /**
+     * 子网掩码
+     */
+    private String mask;
+
+    /**
+     * 服务器IP
+     */
+    private String serverIp;
+
+    /**
+     * 服务器端口
+     */
+    private Long serverPort;
+
+    /**
+     * 网关IP
+     */
+    private String gatewayIp;
+
+    /**
+     * 心跳间隔,以秒为单位
+     */
+    private Long beatInterval;
+
+    /**
+     * 通讯超时时间,以100毫秒为单位
+     */
+    private Long timeout;
+
+    /**
+     * 允许脱机时间
+     */
+    private Long offlineTime;
+
+    /**
+     * 高级参数
+     */
+    private String advParam;
+
+    /**
+     * 设备参数
+     */
+    private String posParam;
+
+    /**
+     * 费率参数
+     */
+    private String rateParam;
+
+    /**
+     * 消费工作模式,见XF_WorkMode字典类别
+     */
+    private String workMode;
+
+    /**
+     * 开机模式,0-不需要营业员开机,1-需要营业员开机
+     */
+    private String openMode;
+
+    /**
+     * 卡上最大金额
+     */
+    private BigDecimal maxCardMoney;
+
+    /**
+     * 定值消费金额
+     */
+    private BigDecimal constantValue;
+
+    /**
+     * 编号0代表的金额
+     */
+    private BigDecimal rationZero;
+
+    /**
+     * 编号1代表的金额
+     */
+    private BigDecimal rationOne;
+
+    /**
+     * 编号2代表的金额
+     */
+    private BigDecimal rationTwo;
+
+    /**
+     * 编号3代表的金额
+     */
+    private BigDecimal rationThree;
+
+    /**
+     * 编号4代表的金额
+     */
+    private BigDecimal rationFour;
+
+    /**
+     * 编号5代表的金额
+     */
+    private BigDecimal rationFive;
+
+    /**
+     * 编号6代表的金额
+     */
+    private BigDecimal rationSix;
+
+    /**
+     * 编号7代表的金额
+     */
+    private BigDecimal rationSeven;
+
+    /**
+     * 编号8代表的金额
+     */
+    private BigDecimal rationEight;
+
+    /**
+     * 编号9代表的金额
+     */
+    private BigDecimal rationNine;
+
+    /**
+     * 每天最大消费次数,0-不限
+     */
+    private BigDecimal dayCount;
+
+    /**
+     * 每天最大消费金额
+     */
+    private BigDecimal dayMoney;
+
+    /**
+     * 每餐最大消费次数,0-不限
+     */
+    private Long mealCount;
+
+    /**
+     * 单次最大消费金额
+     */
+    private BigDecimal singleMoney;
+
+    /**
+     * 早餐消费金额
+     */
+    private BigDecimal breakfastMoney;
+
+    /**
+     * 午餐消费金额
+     */
+    private BigDecimal lunchMoney;
+
+    /**
+     * 晚餐消费金额
+     */
+    private BigDecimal supperMoney;
+
+    /**
+     * 夜宵消费金额
+     */
+    private BigDecimal nightMoney;
+
+    /**
+     * 早餐开始时间
+     */
+    private Long breakfastBegin;
+
+    /**
+     * 早餐结束时间
+     */
+    private Long breakfastEnd;
+
+    /**
+     * 午餐开始时间
+     */
+    private Long lunchBegin;
+
+    /**
+     * 午餐结束时间
+     */
+    private Long lunchEnd;
+
+    /**
+     * 晚餐开始时间
+     */
+    private Long supperBegin;
+
+    /**
+     * 晚餐结束时间
+     */
+    private Long supperEnd;
+
+    /**
+     * 宵夜开始时间
+     */
+    private Long nightBegin;
+
+    /**
+     * 宵夜结束时间
+     */
+    private Long nightEnd;
+
+    /**
+     * 两次刷卡间隔,0-不限制
+     */
+    private Long swipeInterval;
+
+    /**
+     * 是否启用卡片有效限制,0-禁用 1-启用
+     */
+    private String termValidity;
+
+    /**
+     * 设备记录流水号
+     */
+    private Long recordId;
+
+    /**
+     * 数据上传时间
+     */
+    private Date uploadTime;
+
+    /**
+     * 黑名单下载时间
+     */
+    private Date blackDownTime;
+
+    /**
+     * 最后校时时间
+     */
+    private Date lastCheck;
+
+    /**
+     * 重启时间
+     */
+    private String rebootTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    @TableField(exist = false)
+    private Long roomName;
+
+    @TableField(exist = false)
+    private Long accountName;
+
+
+}

+ 105 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfTermTotal.java

@@ -0,0 +1,105 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+
+/**
+ * 消费机消费记录对象 t_xf_termTotal
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_termTotal")
+public class XfTermTotal extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 汇总Id,主键
+     */
+    @TableId(value = "total_id")
+    private String totalId;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 房间Id
+     */
+    private Long roomId;
+
+    /**
+     * 房间名称
+     */
+    private String roomName;
+
+    /**
+     * 结算账户Id
+     */
+    private Long accountId;
+
+    /**
+     * 结算账户名称
+     */
+    private String accountName;
+
+    /**
+     * 消费日期
+     */
+    private String dateDay;
+
+    /**
+     * 营业时段
+     */
+    private Long mealType;
+
+    /**
+     * 消费总额(该机该天该餐消费总额)
+     */
+    private BigDecimal mealAmount;
+
+    /**
+     * 消费次数(该机该天该餐消费次数)
+     */
+    private Long mealCount;
+
+    /**
+     * 使用类型,100-消费系统
+     */
+    private Integer useType;
+
+    /**
+     * 错扣补款次数(该机该天该餐错扣补款次数)
+     */
+    private Long errFillCount;
+
+    /**
+     * 错扣补款总额(该机该天该餐错扣补款总额)
+     */
+    private BigDecimal errFillMoney;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 85 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfUserTotal.java

@@ -0,0 +1,85 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+
+/**
+ * 个人与消费与充值统计对象 t_xf_userTotal
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_xf_userTotal")
+public class XfUserTotal extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 汇总Id,主键
+     */
+    @TableId(value = "total_id")
+    private String totalId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 消费日期
+     */
+    private String dateDay;
+
+    /**
+     * 使用类型,100-消费系统
+     */
+    private Integer useType;
+
+    /**
+     * 充值金额
+     */
+    private BigDecimal creditMoney;
+
+    /**
+     * 消费金额
+     */
+    private BigDecimal consumeMoney;
+
+    /**
+     * 删除标志(0-未删除 2-已删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 96 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/YcConsumeInfo.java

@@ -0,0 +1,96 @@
+package org.dromara.server.consume.domain;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * name: YcConsumeInfo
+ * package: org.dromara.server.consume.domain
+ * description: 宇川安卓消费机请求业务对象
+ * date: 2024-11-01 20:48:16 20:48
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+public class YcConsumeInfo implements Serializable
+{
+    @Serial
+    private static final long serialVersionUID = 1L;
+    /**
+     * 消费金额
+     */
+    private BigDecimal consumeValue;
+    /**
+     * 消费时间 ?DateUtils.formatDate(new Date(), "yyyy-MM-dd'T'HH:mm:ss");
+     */
+    private String consumeDate;
+    /**
+     * 创建日期 ?DateUtils.formatDate(new Date(), "yyyy-MM-dd'T'HH:mm:ss");
+     */
+    private String createDate;
+    /**
+     * 信用钱包余额
+     */
+    private BigDecimal cardValueXY;
+    /**
+     * 现金钱包余额
+     */
+    private BigDecimal cardValue;
+    /**
+     * 卡流水号
+     */
+    private Long cardID;
+    /**
+     * 物理卡号
+     */
+    private Long factoryFixID;
+    /**
+     * 员工Id
+     */
+    private Long employeeID;
+    /**
+     * 人员姓名
+     */
+    private String employeeName;
+    /**
+     * 人员编号
+     */
+    private String employeeStrID;
+    /**
+     * 设备Id
+     */
+    private Long termID;
+    /**
+     * 设备Id 上传消费记录时的设备Id用此字段
+     */
+    private Long mathineTermID;
+    /**
+     * 设备消费流水号
+     */
+    private Long termRecordID;
+    /**
+     * 原始记录Id
+     */
+    private Long oriRecordID;
+    /**
+     * 同原始记录Id
+     */
+    private Long id;
+    /**
+     * 消费记录类型
+     */
+    private Long posRecordState = 0L;
+    /**
+     * 操作员Id
+     */
+    private Long operatorID;
+    /**
+     * 消费详情Id
+     */
+    private Long consumeDetailId;
+}

+ 212 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfConsumeDetailBo.java

@@ -0,0 +1,212 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfConsumeDetail;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 消费明细业务对象 t_xf_consumeDetail
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfConsumeDetail.class, reverseConvertGenerate = false)
+public class XfConsumeDetailBo extends BaseEntity {
+
+    /**
+     * 消费记录Id,主键
+     */
+    @NotBlank(message = "消费记录Id,主键不能为空", groups = { EditGroup.class })
+    private String consumeId;
+
+    /**
+     * 原始记录Id,主键
+     */
+    @NotBlank(message = "原始记录Id,主键不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String originalId;
+
+    /**
+     * 记录Id
+     */
+    @NotNull(message = "记录Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    @NotNull(message = "人员Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 消费日期
+     */
+    @NotNull(message = "消费日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date consumeDate;
+
+    /**
+     * 消费金额
+     */
+    @NotNull(message = "消费金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal consumeMoney;
+
+    /**
+     * 卡流水号
+     */
+    @NotNull(message = "卡流水号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    @NotNull(message = "物理卡号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long factoryId;
+
+    /**
+     * 卡上余额
+     */
+    @NotNull(message = "卡上余额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal cardValue;
+
+    /**
+     * 卡使用次数
+     */
+    private Long cardCount;
+
+    /**
+     * 消费账户金额
+     */
+    private BigDecimal consumeBalance;
+
+    /**
+     * 设备机号
+     */
+    @NotNull(message = "设备机号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 是否已处理(和灰记录处理有关)
+     */
+    private Long analysisFlag;
+
+    /**
+     * 状态标识(记录消费类型?)
+     */
+    private Long statusFlag;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 营业员名称
+     */
+    private String operatorName;
+
+    /**
+     * 结算账户Id
+     */
+    @NotNull(message = "结算账户Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long accountId;
+
+    /**
+     * 结算账户名称
+     */
+    private String accountName;
+
+    /**
+     * 房间Id
+     */
+    @NotNull(message = "房间Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long roomId;
+
+    /**
+     * 房间名称
+     */
+    private String roomName;
+
+    /**
+     * 钱包类型
+     */
+    @NotBlank(message = "钱包类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String bagType;
+
+    /**
+     * 餐类Id
+     */
+    @NotNull(message = "餐类Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long mealType;
+
+    /**
+     * 餐类名称
+     */
+    private String mealName;
+
+    /**
+     * 是否发送短信,见 sys_yes_no字典类别
+     */
+    private String smsSend;
+
+    /**
+     * 消费记录标志位?
+     */
+    private Long recordStatus;
+
+    /**
+     * 同步标志,0-未同步,1-已同步
+     */
+    private Long syncStatus;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 针对错扣补款的消费记录的id
+     */
+    private String detailId;
+
+
+}

+ 175 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfConsumeDetailOriginalBo.java

@@ -0,0 +1,175 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfConsumeDetailOriginal;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 原始消费记录业务对象 t_xf_consumeDetailOriginal
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfConsumeDetailOriginal.class, reverseConvertGenerate = false)
+public class XfConsumeDetailOriginalBo extends BaseEntity {
+
+    /**
+     * 原始记录Id,主键
+     */
+    @NotBlank(message = "原始记录Id,主键不能为空", groups = { EditGroup.class })
+    private String originalId;
+
+    /**
+     * 记录Id,自增长
+     */
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    @NotNull(message = "人员Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 消费日期
+     */
+    @NotNull(message = "消费日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date consumeDate;
+
+    /**
+     * 消费金额
+     */
+    @NotNull(message = "消费金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal consumeMoney;
+
+    /**
+     * 卡流水号
+     */
+    @NotNull(message = "卡流水号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    @NotNull(message = "物理卡号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long factoryId;
+
+    /**
+     * 卡上余额
+     */
+    @NotNull(message = "卡上余额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal cardValue;
+
+    /**
+     * 卡使用次数
+     */
+    private Long cardCount;
+
+    /**
+     * 消费账户金额
+     */
+    private BigDecimal consumeBalance;
+
+    /**
+     * 设备机号
+     */
+    @NotNull(message = "设备机号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 是否已处理(和灰记录处理有关)
+     */
+    private Long analysisFlag;
+
+    /**
+     * 消费记录标志
+     */
+    private Long dataFlag;
+
+    /**
+     * 状态标识(记录消费类型?)
+     */
+    private Integer statusFlag;
+
+    /**
+     * 防伪验证码(记录消费模式的中文信息)
+     */
+    private String digitalSign;
+
+    /**
+     * 水控金额
+     */
+    private BigDecimal waterValue;
+
+    /**
+     * 水控历史余额
+     */
+    private BigDecimal waterHistoryValue;
+
+    /**
+     * 水控当天总和
+     */
+    private BigDecimal waterDaySum;
+
+    /**
+     * 水控错误余额
+     */
+    private BigDecimal waterErrValue;
+
+    /**
+     * 水控错误消费金额
+     */
+    private BigDecimal waterErrMoney;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 租户编号
+     */
+    private String tenantId;
+
+}

+ 154 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfCreditAccountBackBo.java

@@ -0,0 +1,154 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfCreditAccountBack;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 资金收支备份业务对象 t_xf_creditAccountBack
+ *
+ * @author Yb
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfCreditAccountBack.class, reverseConvertGenerate = false)
+public class XfCreditAccountBackBo extends BaseEntity {
+
+    /**
+     * 收支备份Id,主键
+     */
+    @NotBlank(message = "收支备份Id,主键不能为空", groups = { EditGroup.class })
+    private String backId;
+
+    /**
+     * 记录Id
+     */
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 账户余额
+     */
+    private BigDecimal cardValue;
+
+
+    /**
+     * 钱包类型
+     */
+    private String bagType;
+
+    /**
+     * 使用类型,100-消费系统
+     */
+    private Integer useType;
+
+    /**
+     * 工作站Id
+     */
+    private Long stationId;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 交易时间
+     */
+    @NotNull(message = "交易时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date creditTime;
+
+    /**
+     * 交易类型,见CREDITTYPE字典类型
+     */
+    @NotBlank(message = "交易类型,见CREDITTYPE字典类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String creditType;
+
+    /**
+     * 资金来源,见PAYSTYLE字典类型
+     */
+    @NotBlank(message = "资金来源,见PAYSTYLE字典类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String payStyle;
+
+    /**
+     * 交易金额
+     */
+    @NotNull(message = "交易金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal receiptMoney;
+
+    /**
+     * 交易状态
+     */
+    private int creditStatus;
+
+    /**
+     * 团充Id
+     */
+    private Long groupId;
+
+    /**
+     * 收支记录Id,对应收支明细表的主键字段
+     */
+    private String creditId;
+
+    /**
+     * 原始记录Id?
+     */
+    private String originalId;
+
+    /**
+     * 是否发送短信,见 sys_yes_no字典类别
+     */
+    private String smsSend;
+
+    /**
+     * 消费记录标志位?
+     */
+    private Long recordStatus;
+
+    /**
+     * 统计分析标识
+     */
+    private Long analysisFlag;
+
+    /**
+     * 数字签名
+     */
+    private String digitalSign;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 205 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfCreditAccountBo.java

@@ -0,0 +1,205 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfCreditAccount;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 资金收支明细业务对象 t_xf_creditAccount
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfCreditAccount.class, reverseConvertGenerate = false)
+public class XfCreditAccountBo extends BaseEntity {
+
+    /**
+     * 收支Id
+     */
+    @NotBlank(message = "收支Id不能为空", groups = { EditGroup.class })
+    private String creditId;
+
+    /**
+     * 记录Id
+     */
+    @NotNull(message = "记录Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    @NotNull(message = "人员Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 卡上余额
+     */
+    private BigDecimal cardValue;
+
+    /**
+     * 卡片类型
+     */
+    private Long cardType;
+
+    /**
+     * 卡使用次数
+     */
+    private Long cardCount;
+
+    /**
+     * 卡片类型名称
+     */
+    private String cardTypeName;
+
+    /**
+     * 是否主卡,见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;
+
+    /**
+     * 工作站编号
+     */
+    private Long stationNumb;
+
+    /**
+     * 工作站名称
+     */
+    private String stationName;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 营业员名称
+     */
+    private String operatorName;
+
+    /**
+     * 交易时间
+     */
+    @NotNull(message = "交易时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date creditTime;
+
+    /**
+     * 交易类型,见CREDITTYPE字典类型
+     */
+    @NotBlank(message = "交易类型,见CREDITTYPE字典类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String creditType;
+
+    /**
+     * 资金来源,见PAYSTYLE字典类型
+     */
+    @NotBlank(message = "资金来源,见PAYSTYLE字典类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String payStyle;
+
+    /**
+     * 交易金额
+     */
+    @NotNull(message = "交易金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal receiptMoney;
+
+    /**
+     * 核对状态,见sys_yes_no字典类型
+     */
+    private String auditStatus;
+
+    /**
+     * 核对时间
+     */
+    private Date auditDate;
+
+    /**
+     * 团充Id
+     */
+    private Long groupId;
+
+    /**
+     * 原始记录Id,对应收支备份表的主键字段
+     */
+    @NotBlank(message = "原始记录Id,对应收支备份表的主键字段不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String originalId;
+
+    /**
+     * 是否发送短信,见 sys_yes_no字典类别
+     */
+    @NotBlank(message = "是否发送短信,见 sys_yes_no字典类别不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String smsSend;
+
+    /**
+     * 消费记录标志位?
+     */
+    @NotNull(message = "消费记录标志位?不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long recordStatus;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 79 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfDiscountBo.java

@@ -0,0 +1,79 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfDiscount;
+
+/**
+ * 折扣管理业务对象 t_xf_discount
+ *
+ * @author bing
+ * @date 2024-08-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfDiscount.class, reverseConvertGenerate = false)
+public class XfDiscountBo extends BaseEntity {
+
+    /**
+     * 折扣Id,主键
+     */
+    @NotNull(message = "折扣Id,主键不能为空", groups = { EditGroup.class })
+    private Long discountId;
+
+    /**
+     * 卡类Id
+     */
+    @NotNull(message = "卡类Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long cardType;
+
+    /**
+     * 餐类Id
+     */
+    @NotBlank(message = "餐类Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String mealType;
+
+    /**
+     * 折扣类型,默认为0
+     */
+    private String rateType;
+
+    /**
+     * 折扣率1
+     */
+    private Long oneRate;
+
+    /**
+     * 折扣率2
+     */
+    private Long twoRate;
+
+    /**
+     * 折扣率3
+     */
+    private Long threeRate;
+
+    /**
+     * 折扣率4
+     */
+    private Long fourRate;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 启用状态,0-未启用 1-启用
+     */
+    @NotBlank(message = "启用状态,0-未启用 1-启用不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+
+}

+ 36 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfDiscountTermBo.java

@@ -0,0 +1,36 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfDiscountTerm;
+
+/**
+ * 折扣设备业务对象 t_xf_discountTerm
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfDiscountTerm.class, reverseConvertGenerate = false)
+public class XfDiscountTermBo extends BaseEntity {
+
+    /**
+     * 折扣Id,主键
+     */
+    @NotNull(message = "折扣Id,主键不能为空", groups = { EditGroup.class })
+    private Long discountTermId;
+
+    /**
+     * 设备Id
+     */
+    @NotNull(message = "设备Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long termId;
+
+
+}

+ 71 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfLimitedBo.java

@@ -0,0 +1,71 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfLimited;
+
+/**
+ * 限次管理业务对象 t_xf_limited
+ *
+ * @author bing
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfLimited.class, reverseConvertGenerate = false)
+public class XfLimitedBo extends BaseEntity {
+
+    /**
+     * 限次Id,主键
+     */
+    @NotNull(message = "限次Id,主键不能为空", groups = { EditGroup.class })
+    private Long limitedId;
+
+    /**
+     * 卡类Id
+     */
+    @NotNull(message = "卡类Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long cardType;
+
+    /**
+     * 每日次数
+     */
+    private Long dailyCount;
+
+    /**
+     * 早餐次数
+     */
+    private Long oneCount;
+
+    /**
+     * 午餐次数
+     */
+    private Long twoCount;
+
+    /**
+     * 晚餐次数
+     */
+    private Long threeCount;
+
+    /**
+     * 宵夜次数
+     */
+    private Long fourCount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 启用状态,0-未启用 1-启用
+     */
+    private String status;
+
+
+}

+ 36 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfLimitedTermBo.java

@@ -0,0 +1,36 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfLimitedTerm;
+
+/**
+ * 限次设备绑定业务对象 t_xf_limitedTerm
+ *
+ * @author bing
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfLimitedTerm.class, reverseConvertGenerate = false)
+public class XfLimitedTermBo extends BaseEntity {
+
+    /**
+     * 限次Id,主键
+     */
+    @NotNull(message = "限次Id,主键不能为空", groups = { EditGroup.class })
+    private Long limitedTermId;
+
+    /**
+     * 设备Id
+     */
+    @NotNull(message = "设备Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long termId;
+
+
+}

+ 79 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfQuotaBo.java

@@ -0,0 +1,79 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfQuota;
+
+/**
+ * 限额管理业务对象 t_xf_quota
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfQuota.class, reverseConvertGenerate = false)
+public class XfQuotaBo extends BaseEntity {
+
+    /**
+     * 限额Id,主键
+     */
+    @NotNull(message = "限额Id,主键不能为空", groups = { EditGroup.class })
+    private Long quotaId;
+
+    /**
+     * 卡类Id
+     */
+    @NotNull(message = "卡类Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long cardType;
+
+    /**
+     * 每日金额
+     */
+//    @NotNull(message = "每日金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long dailyMoney;
+
+    /**
+     * 早餐金额
+     */
+//    @NotNull(message = "早餐金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long oneMoney;
+
+    /**
+     * 午餐金额
+     */
+//    @NotNull(message = "午餐金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long twoMoney;
+
+    /**
+     * 晚餐金额
+     */
+//    @NotNull(message = "晚餐金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long threeMoney;
+
+    /**
+     * 宵夜金额
+     */
+//    @NotNull(message = "宵夜金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long fourMoney;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+    /**
+     * 启用状态,0-未启用 1-启用
+     */
+    @NotBlank(message = "启用状态,0-未启用 1-启用不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+
+}

+ 36 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfQuotaTermBo.java

@@ -0,0 +1,36 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfQuotaTerm;
+
+/**
+ * 限额设备绑定业务对象 t_xf_quotaTerm
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfQuotaTerm.class, reverseConvertGenerate = false)
+public class XfQuotaTermBo extends BaseEntity {
+
+    /**
+     * 限额Id,主键
+     */
+    @NotNull(message = "限额Id,主键不能为空", groups = { EditGroup.class })
+    private Long quotaTermId;
+
+    /**
+     * 设备Id
+     */
+    @NotNull(message = "设备Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long termId;
+
+
+}

+ 363 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfTermBo.java

@@ -0,0 +1,363 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfTerm;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 消费设备业务对象 t_xf_term
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfTerm.class, reverseConvertGenerate = false)
+public class XfTermBo extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 3335304346440907682L;
+    /**
+     * 设备Id,主键
+     */
+    @NotNull(message = "设备Id,主键不能为空", groups = { EditGroup.class })
+    private Long termId;
+
+    /**
+     * 设备机号
+     */
+    @NotNull(message = "设备机号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    @NotBlank(message = "设备名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String termName;
+
+    /**
+     * 所属餐厅Id 所属餐厅不能为空
+     */
+    @NotNull(message = "所属餐厅不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long roomId;
+
+    /**
+     * 结算账户Id
+     */
+    @NotNull(message = "结算账户Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long accountId;
+
+    /**
+     * 设备类型,见XF_TermType字典类型
+     */
+    @NotBlank(message = "设备类型,见XF_TermType字典类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String termType;
+
+    /**
+     * 设备二维码
+     */
+    private String qrCode;
+
+    /**
+     * 工作站Id
+     */
+    private Long stationId;
+
+    /**
+     * 扣费类型,见XF_ConsumeType字典类型
+     */
+    @NotBlank(message = "扣费类型,见XF_ConsumeType字典类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String consumeType;
+
+    /**
+     * 是否自动下载参数,见sys_yew_no字典项
+     */
+    private String autoDown;
+
+    /**
+     * 应用系统,见YYXT数据字典类别
+     */
+    private String useType;
+
+    /**
+     * 允许使用的卡类
+     */
+    private Long cardType;
+
+    /**
+     * 设备IP
+     */
+    @NotBlank(message = "设备IP不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String termIp;
+
+    /**
+     * 设备MAC地址
+     */
+    private String termMac;
+
+    /**
+     * 设备通讯端口
+     */
+    @NotNull(message = "设备通讯端口不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long commPort;
+
+    /**
+     * 子网掩码
+     */
+    private String mask;
+
+    /**
+     * 服务器IP
+     */
+    @NotBlank(message = "服务器IP不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String serverIp;
+
+    /**
+     * 服务器端口
+     */
+    @NotNull(message = "服务器端口不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long serverPort;
+
+    /**
+     * 网关IP
+     */
+    private String gatewayIp;
+
+    /**
+     * 心跳间隔,以秒为单位
+     */
+    private Long beatInterval;
+
+    /**
+     * 通讯超时时间,以100毫秒为单位
+     */
+    private Long timeout;
+
+    /**
+     * 允许脱机时间
+     */
+    private Long offlineTime;
+
+    /**
+     * 高级参数
+     */
+    private String advParam;
+
+    /**
+     * 设备参数
+     */
+    private String posParam;
+
+    /**
+     * 费率参数
+     */
+    private String rateParam;
+
+    /**
+     * 消费工作模式,见XF_WorkMode字典类别
+     */
+//    @NotBlank(message = "消费工作模式,见XF_WorkMode字典类别不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String workMode;
+
+    /**
+     * 开机模式,0-不需要营业员开机,1-需要营业员开机
+     */
+//    @NotBlank(message = "开机模式,0-不需要营业员开机,1-需要营业员开机不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String openMode;
+
+    /**
+     * 卡上最大金额
+     */
+//    @NotNull(message = "卡上最大金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal maxCardMoney;
+
+    /**
+     * 定值消费金额
+     */
+    private BigDecimal constantValue;
+
+    /**
+     * 编号0代表的金额
+     */
+    private BigDecimal rationZero;
+
+    /**
+     * 编号1代表的金额
+     */
+    private BigDecimal rationOne;
+
+    /**
+     * 编号2代表的金额
+     */
+    private BigDecimal rationTwo;
+
+    /**
+     * 编号3代表的金额
+     */
+    private BigDecimal rationThree;
+
+    /**
+     * 编号4代表的金额
+     */
+    private BigDecimal rationFour;
+
+    /**
+     * 编号5代表的金额
+     */
+    private BigDecimal rationFive;
+
+    /**
+     * 编号6代表的金额
+     */
+    private BigDecimal rationSix;
+
+    /**
+     * 编号7代表的金额
+     */
+    private BigDecimal rationSeven;
+
+    /**
+     * 编号8代表的金额
+     */
+    private BigDecimal rationEight;
+
+    /**
+     * 编号9代表的金额
+     */
+    private BigDecimal rationNine;
+
+    /**
+     * 每天最大消费次数,0-不限
+     */
+    private Long dayCount;
+
+    /**
+     * 每天最大消费金额
+     */
+    private Long dayMoney;
+
+    /**
+     * 每餐最大消费次数,0-不限
+     */
+    private BigDecimal mealCount;
+
+    /**
+     * 单次最大消费金额
+     */
+    private BigDecimal singleMoney;
+
+    /**
+     * 早餐消费金额
+     */
+    private BigDecimal breakfastMoney;
+
+    /**
+     * 午餐消费金额
+     */
+    private BigDecimal lunchMoney;
+
+    /**
+     * 晚餐消费金额
+     */
+    private BigDecimal supperMoney;
+
+    /**
+     * 夜宵消费金额
+     */
+    private BigDecimal nightMoney;
+
+    /**
+     * 早餐开始时间
+     */
+    private Long breakfastBegin;
+
+    /**
+     * 早餐结束时间
+     */
+    private Long breakfastEnd;
+
+    /**
+     * 午餐开始时间
+     */
+    private Long lunchBegin;
+
+    /**
+     * 午餐结束时间
+     */
+    private Long lunchEnd;
+
+    /**
+     * 晚餐开始时间
+     */
+    private Long supperBegin;
+
+    /**
+     * 晚餐结束时间
+     */
+    private Long supperEnd;
+
+    /**
+     * 宵夜开始时间
+     */
+    private Long nightBegin;
+
+    /**
+     * 宵夜结束时间
+     */
+    private Long nightEnd;
+
+    /**
+     * 两次刷卡间隔,0-不限制
+     */
+    private Long swipeInterval;
+
+    /**
+     * 是否启用卡片有效限制,0-禁用 1-启用
+     */
+    private String termValidity;
+
+    /**
+     * 设备记录流水号
+     */
+    private Long recordId;
+
+    /**
+     * 数据上传时间
+     */
+    private Date uploadTime;
+
+    /**
+     * 黑名单下载时间
+     */
+    private Date blackDownTime;
+
+    /**
+     * 最后校时时间
+     */
+    private Date lastCheck;
+
+    /**
+     * 重启时间
+     */
+    private String rebootTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 租户编号
+     */
+    private String tenantId;
+}

+ 198 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfTermParamBo.java

@@ -0,0 +1,198 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfTerm;
+
+import java.math.BigDecimal;
+
+/**
+ * 消费设备参数编辑对象
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfTerm.class, reverseConvertGenerate = false)
+public class XfTermParamBo extends BaseEntity {
+
+    /**
+     * 设备Id,主键
+     */
+    @NotNull(message = "设备Id,主键不能为空")
+    private Long termId;
+
+    private Long cardType;
+
+    /**
+     * 消费工作模式,见XF_WorkMode字典类别
+     */
+    @NotBlank(message = "消费工作模式不能为空")
+    private String workMode;
+
+    /**
+     * 开机模式,0-不需要营业员开机,1-需要营业员开机
+     */
+    @NotBlank(message = "开机模式不能为空")
+    private String openMode;
+
+    /**
+     * 卡上最大金额
+     */
+    @NotNull(message = "卡上最大金额不能为空")
+    private BigDecimal maxCardMoney;
+
+    /**
+     * 定值消费金额
+     */
+    private BigDecimal constantValue;
+
+    /**
+     * 编号0代表的金额
+     */
+    private BigDecimal rationZero;
+
+    /**
+     * 编号1代表的金额
+     */
+    private BigDecimal rationOne;
+
+    /**
+     * 编号2代表的金额
+     */
+    private BigDecimal rationTwo;
+
+    /**
+     * 编号3代表的金额
+     */
+    private BigDecimal rationThree;
+
+    /**
+     * 编号4代表的金额
+     */
+    private BigDecimal rationFour;
+
+    /**
+     * 编号5代表的金额
+     */
+    private BigDecimal rationFive;
+
+    /**
+     * 编号6代表的金额
+     */
+    private BigDecimal rationSix;
+
+    /**
+     * 编号7代表的金额
+     */
+    private BigDecimal rationSeven;
+
+    /**
+     * 编号8代表的金额
+     */
+    private BigDecimal rationEight;
+
+    /**
+     * 编号9代表的金额
+     */
+    private BigDecimal rationNine;
+
+    /**
+     * 每天最大消费次数,0-不限
+     */
+    private Long dayCount;
+
+    /**
+     * 每天最大消费金额
+     */
+    private BigDecimal dayMoney;
+
+    /**
+     * 每餐最大消费次数,0-不限
+     */
+    private Long mealCount;
+
+    /**
+     * 单次最大消费金额
+     */
+    private BigDecimal singleMoney;
+
+    /**
+     * 早餐消费金额
+     */
+    private BigDecimal breakfastMoney;
+
+    /**
+     * 午餐消费金额
+     */
+    private BigDecimal lunchMoney;
+
+    /**
+     * 晚餐消费金额
+     */
+    private BigDecimal supperMoney;
+
+    /**
+     * 夜宵消费金额
+     */
+    private BigDecimal nightMoney;
+
+    /**
+     * 早餐开始时间
+     */
+    private Long breakfastBegin;
+
+    /**
+     * 早餐结束时间
+     */
+    private Long breakfastEnd;
+
+    /**
+     * 午餐开始时间
+     */
+    private Long lunchBegin;
+
+    /**
+     * 午餐结束时间
+     */
+    private Long lunchEnd;
+
+    /**
+     * 晚餐开始时间
+     */
+    private Long supperBegin;
+
+    /**
+     * 晚餐结束时间
+     */
+    private Long suppeEnd;
+
+    /**
+     * 宵夜开始时间
+     */
+    private Long nightBegin;
+
+    /**
+     * 宵夜结束时间
+     */
+    private Long nightEnd;
+
+    /**
+     * 两次刷卡间隔,0-不限制
+     */
+    private Long swipeInterval;
+
+    /**
+     * 是否启用卡片有效限制,0-禁用 1-启用
+     */
+    private String termValidity;
+
+    private String rebootTime;
+
+
+}

+ 104 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfTermTotalBo.java

@@ -0,0 +1,104 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfTermTotal;
+
+import java.math.BigDecimal;
+
+/**
+ * 消费机消费记录业务对象 t_xf_termTotal
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfTermTotal.class, reverseConvertGenerate = false)
+public class XfTermTotalBo extends BaseEntity {
+
+    /**
+     * 汇总Id,主键
+     */
+    @NotBlank(message = "汇总Id,主键不能为空", groups = { EditGroup.class })
+    private String totalId;
+
+    /**
+     * 设备机号
+     */
+    @NotNull(message = "设备机号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 房间Id
+     */
+    @NotNull(message = "房间Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long roomId;
+
+    /**
+     * 房间名称
+     */
+    private String roomName;
+
+    /**
+     * 结算账户Id
+     */
+    @NotNull(message = "结算账户Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long accountId;
+
+    /**
+     * 结算账户名称
+     */
+    private String accountName;
+
+    /**
+     * 消费日期
+     */
+    @NotBlank(message = "消费日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dateDay;
+
+    /**
+     * 营业时段
+     */
+    @NotNull(message = "营业时段不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long mealType;
+
+    /**
+     * 消费总额(该机该天该餐消费总额)
+     */
+    private BigDecimal mealAmount;
+
+    /**
+     * 消费次数(该机该天该餐消费次数)
+     */
+    private Long mealCount;
+
+    /**
+     * 使用类型,100-消费系统
+     */
+    @NotNull(message = "使用类型,100-消费系统不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer useType;
+
+    /**
+     * 错扣补款次数(该机该天该餐错扣补款次数)
+     */
+    private Long errFillCount;
+
+    /**
+     * 错扣补款总额(该机该天该餐错扣补款总额)
+     */
+    private BigDecimal errFillMoney;
+
+
+}

+ 82 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfUserTotalBo.java

@@ -0,0 +1,82 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.XfUserTotal;
+
+import java.math.BigDecimal;
+
+/**
+ * 个人与消费与充值统计业务对象 t_xf_userTotal
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = XfUserTotal.class, reverseConvertGenerate = false)
+public class XfUserTotalBo extends BaseEntity {
+
+    /**
+     * 汇总Id,主键
+     */
+    @NotBlank(message = "汇总Id,主键不能为空", groups = { EditGroup.class })
+    private String totalId;
+
+    /**
+     * 人员Id
+     */
+    @NotNull(message = "人员Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 卡流水号
+     */
+    @NotNull(message = "卡流水号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long cardNo;
+
+    /**
+     * 消费日期
+     */
+    @NotBlank(message = "消费日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dateDay;
+
+    /**
+     * 使用类型,100-消费系统
+     */
+    @NotNull(message = "使用类型,100-消费系统不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer useType;
+
+    /**
+     * 充值金额
+     */
+    private BigDecimal creditMoney;
+
+    /**
+     * 消费金额
+     */
+    private BigDecimal consumeMoney;
+
+
+}

+ 162 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfConsumeDetailOriginalVo.java

@@ -0,0 +1,162 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfConsumeDetailOriginal;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 原始消费记录视图对象 t_xf_consumeDetailOriginal
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfConsumeDetailOriginal.class)
+public class XfConsumeDetailOriginalVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 原始记录Id,主键
+     */
+    private String originalId;
+
+    /**
+     * 记录Id
+     */
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 消费日期
+     */
+    private Date consumeDate;
+
+    /**
+     * 消费金额
+     */
+    private Long consumeMoney;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
+
+    /**
+     * 卡上余额
+     */
+    private Long cardValue;
+
+    /**
+     * 卡使用次数
+     */
+    private Long cardCount;
+
+    /**
+     * 消费账户金额
+     */
+    private Long consumeBalance;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 是否已处理(和灰记录处理有关)
+     */
+    private Long anlysFlag;
+
+    /**
+     * 消费记录标志
+     */
+    private Long dataFlag;
+
+    /**
+     * 状态标识(记录消费类型?)
+     */
+    private Long statusFlag;
+
+    /**
+     * 防伪验证码(记录消费模式的中文信息)
+     */
+    private String digitalSign;
+
+    /**
+     * 水控金额
+     */
+    private Long waterValue;
+
+    /**
+     * 水控历史余额
+     */
+    private Long waterHistoryValue;
+
+    /**
+     * 水控当天总和
+     */
+    private Long waterDaySum;
+
+    /**
+     * 水控错误余额
+     */
+    private Long waterErrValue;
+
+    /**
+     * 水控错误消费金额
+     */
+    private Long waterErrMoney;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+}

+ 199 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfConsumeDetailVo.java

@@ -0,0 +1,199 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfConsumeDetail;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 消费明细视图对象 t_xf_consumeDetail
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfConsumeDetail.class)
+public class XfConsumeDetailVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 消费记录Id,主键
+     */
+    private String consumeId;
+
+    /**
+     * 原始记录Id,主键
+     */
+    private String originalId;
+
+    /**
+     * 记录Id
+     */
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 消费日期
+     */
+    private Date consumeDate;
+
+    /**
+     * 消费金额
+     */
+    private BigDecimal consumeMoney;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
+
+    /**
+     * 卡上余额
+     */
+    private BigDecimal cardValue;
+
+    /**
+     * 卡使用次数
+     */
+    private Long cardCount;
+
+    /**
+     * 消费账户金额
+     */
+    private BigDecimal consumeBalance;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 是否已处理(和灰记录处理有关)
+     */
+    private Long analysisFlag;
+
+    /**
+     * 状态标识(记录消费类型?)
+     */
+    private Long statusFlag;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 营业员名称
+     */
+    private String operatorName;
+
+    /**
+     * 结算账户Id
+     */
+    private Long accountId;
+
+    /**
+     * 结算账户名称
+     */
+    private String accountName;
+
+    /**
+     * 房间Id
+     */
+    private Long roomId;
+
+    /**
+     * 房间名称
+     */
+    private String roomName;
+
+    /**
+     * 钱包类型
+     */
+    private String bagType;
+
+    /**
+     * 餐类Id
+     */
+    private Long mealType;
+
+    /**
+     * 餐类名称
+     */
+    private String mealName;
+
+    /**
+     * 是否发送短信,见 sys_yes_no字典类别
+     */
+    private String smsSend;
+
+    /**
+     * 消费记录标志位?
+     */
+    private Long recordStatus;
+
+    /**
+     * 同步标志,0-未同步,1-已同步
+     */
+    private Long syncStatus;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 针对错扣补款的消费记录的id
+     */
+    private String detailId;
+
+
+}

+ 154 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfCreditAccountBackVo.java

@@ -0,0 +1,154 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfCreditAccountBack;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 资金收支备份视图对象 t_xf_creditAccountBack
+ *
+ * @author Yb
+ * @date 2024-08-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfCreditAccountBack.class)
+public class XfCreditAccountBackVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 收支备份Id,主键
+     */
+    private String backId;
+
+    /**
+     * 记录Id
+     */
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 卡上余额
+     */
+    private BigDecimal cardValue;
+
+    /**
+     * 是否主卡,见sys_yes_no字典类别
+     */
+    private String mainCard;
+
+    /**
+     * 钱包类型
+     */
+    private String bagType;
+
+    /**
+     * 使用类型,100-消费系统
+     */
+    private Long useType;
+
+    /**
+     * 工作站Id
+     */
+    private Long stationId;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 交易时间
+     */
+    private Date creditTime;
+
+    /**
+     * 交易类型,见CREDITTYPE字典类型
+     */
+    private String creditType;
+
+    /**
+     * 资金来源,见PAYSTYLE字典类型
+     */
+    private String payStyle;
+
+    /**
+     * 交易金额
+     */
+    private BigDecimal receiptMoney;
+
+    /**
+     * 交易状态
+     */
+    private Long creditStatus;
+
+    /**
+     * 团充Id
+     */
+    private Long groupId;
+
+    /**
+     * 收支记录Id,对应收支明细表的主键字段
+     */
+    private String creditId;
+
+    /**
+     * 原始记录Id?
+     */
+    private String originalId;
+
+    /**
+     * 是否发送短信,见 sys_yes_no字典类别
+     */
+    private String smsSend;
+
+    /**
+     * 消费记录标志位?
+     */
+    private Long recordStatus;
+
+    /**
+     * 统计分析标识
+     */
+    private Long anlysFlag;
+
+    /**
+     * 数字签名
+     */
+    private String digitalSign;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 193 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfCreditAccountVo.java

@@ -0,0 +1,193 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfCreditAccount;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 资金收支明细视图对象 t_xf_creditAccount
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfCreditAccount.class)
+public class XfCreditAccountVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 收支Id
+     */
+    private String creditId;
+
+    /**
+     * 记录Id
+     */
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 卡上余额
+     */
+    private BigDecimal cardValue;
+
+    /**
+     * 卡片类型
+     */
+    private Long cardType;
+
+    /**
+     * 卡片类型名称
+     */
+    private String cardTypeName;
+    /**
+     * 卡使用次数
+     */
+    private Long cardCount;
+
+    /**
+     * 是否主卡,见sys_yes_no字典类别
+     */
+    private String mainCard;
+
+    /**
+     * 钱包类型
+     */
+    private String bagType;
+
+    /**
+     * 使用类型,100-消费系统
+     */
+    private Long useType;
+
+    /**
+     * 工作站编号
+     */
+    private Long stationNumb;
+
+    /**
+     * 工作站名称
+     */
+    private String stationName;
+
+    /**
+     * 营业员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 营业员名称
+     */
+    private String operatorName;
+
+    /**
+     * 交易时间
+     */
+    private Date creditTime;
+
+    /**
+     * 交易类型,见CREDITTYPE字典类型
+     */
+    private String creditType;
+
+    /**
+     * 资金来源,见PAYSTYLE字典类型
+     */
+    private String payStyle;
+
+    /**
+     * 交易金额
+     */
+    private BigDecimal receiptMoney;
+
+    /**
+     * 核对状态,见sys_yes_no字典类型
+     */
+    private String auditStatus;
+
+    /**
+     * 核对时间
+     */
+    private Date auditDate;
+
+    /**
+     * 团充Id
+     */
+    private Long groupId;
+
+    /**
+     * 原始记录Id,对应收支备份表的主键字段
+     */
+    private String originalId;
+
+    /**
+     * 是否发送短信,见 sys_yes_no字典类别
+     */
+    private String smsSend;
+
+    /**
+     * 消费记录标志位?
+     */
+    private Long recordStatus;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 54 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfDiscountTermVo.java

@@ -0,0 +1,54 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfDiscountTerm;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 折扣设备视图对象 t_xf_discountTerm
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfDiscountTerm.class)
+public class XfDiscountTermVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 折扣Id,主键
+     */
+    private Long discountTermId;
+
+    /**
+     * 设备Id
+     */
+    private Long termId;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+
+}

+ 83 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfDiscountVo.java

@@ -0,0 +1,83 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfDiscount;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 折扣管理视图对象 t_xf_discount
+ *
+ * @author bing
+ * @date 2024-08-13
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfDiscount.class)
+public class XfDiscountVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 折扣Id,主键
+     */
+    private Long discountId;
+
+    /**
+     * 卡类Id
+     */
+    private String cardType;
+    /**
+     * 卡类名称
+     */
+    private String cardTypeName;
+
+    /**
+     * 餐类Id
+     */
+    private Long mealType;
+    /**
+     * 餐类名称
+     */
+    private String mealTypeName;
+
+    /**
+     * 折扣类型,默认为0
+     */
+    private String rateType;
+
+    /**
+     * 折扣率1
+     */
+    private Long oneRate;
+
+    /**
+     * 折扣率2
+     */
+    private Long twoRate;
+
+    /**
+     * 折扣率3
+     */
+    private Long threeRate;
+
+    /**
+     * 折扣率4
+     */
+    private Long fourRate;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 启用状态,0-未启用 1-启用
+     */
+    private String status;
+}

+ 50 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfLimitedTermVo.java

@@ -0,0 +1,50 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfLimitedTerm;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 限次设备绑定视图对象 t_xf_limitedTerm
+ *
+ * @author bing
+ * @date 2024-08-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfLimitedTerm.class)
+public class XfLimitedTermVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+    /**
+     * 限次Id,主键
+     */
+    private Long limitedTermId;
+    /**
+     * 设备Id
+     */
+    private Long termId;
+    /**
+     * 设备名称
+     */
+    private String termName;
+    /**
+     * 设备编号
+     */
+    private Long termNo;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+
+}

+ 76 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfLimitedVo.java

@@ -0,0 +1,76 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfLimited;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 限次管理视图对象 t_xf_limited
+ *
+ * @author bing
+ * @date 2024-08-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfLimited.class)
+public class XfLimitedVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 限次Id,主键
+     */
+    private Long limitedId;
+
+    /**
+     * 卡类Id
+     */
+    private Long cardType;
+    /**
+     * 卡类名称
+     */
+    private String cardTypeName;
+
+    /**
+     * 每日次数
+     */
+    private Long dailyCount;
+
+    /**
+     * 早餐次数
+     */
+    private Long oneCount;
+
+    /**
+     * 午餐次数
+     */
+    private Long twoCount;
+
+    /**
+     * 晚餐次数
+     */
+    private Long threeCount;
+
+    /**
+     * 宵夜次数
+     */
+    private Long fourCount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 启用状态,0-未启用 1-启用
+     */
+    private String status;
+
+
+}

+ 54 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfQuotaTermVo.java

@@ -0,0 +1,54 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfQuotaTerm;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 限额设备绑定视图对象 t_xf_quotaTerm
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfQuotaTerm.class)
+public class XfQuotaTermVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 限额Id,主键
+     */
+    private Long quotaTermId;
+
+    /**
+     * 设备Id
+     */
+    private Long termId;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+
+}

+ 79 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfQuotaVo.java

@@ -0,0 +1,79 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.server.consume.domain.XfQuota;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 限额管理视图对象 t_xf_quota
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfQuota.class)
+public class XfQuotaVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 限额Id,主键
+     */
+    private Long quotaId;
+
+    /**
+     * 卡类Id
+     */
+    private Long cardType;
+    /**
+     * 卡类名称
+     */
+    private String cardTypeName;
+
+    /**
+     * 每日金额
+     */
+    private Long dailyMoney;
+
+    /**
+     * 早餐金额
+     */
+    private Long oneMoney;
+
+    /**
+     * 午餐金额
+     */
+    private Long twoMoney;
+
+    /**
+     * 晚餐金额
+     */
+    private Long threeMoney;
+
+    /**
+     * 宵夜金额
+     */
+    private Long fourMoney;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 启用状态,0-未启用 1-启用
+     */
+    private String status;
+
+
+}

+ 200 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfTermParamVo.java

@@ -0,0 +1,200 @@
+package org.dromara.server.consume.domain.vo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfTerm;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+/**
+ * 消费设备视图对象 t_xf_term
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@AutoMapper(target = XfTerm.class)
+public class XfTermParamVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 设备Id,主键
+     */
+    private Long termId;
+
+    private Long cardType;
+
+    /**
+     * 消费工作模式,见XF_WorkMode字典类别
+     */
+    private String workMode;
+
+    /**
+     * 开机模式,0-不需要营业员开机,1-需要营业员开机
+     */
+    private String openMode;
+
+    /**
+     * 卡上最大金额
+     */
+    private BigDecimal maxCardMoney;
+
+    /**
+     * 定值消费金额
+     */
+    private BigDecimal constantValue;
+
+    /**
+     * 编号0代表的金额
+     */
+    private BigDecimal rationZero;
+
+    /**
+     * 编号1代表的金额
+     */
+    private BigDecimal rationOne;
+
+    /**
+     * 编号2代表的金额
+     */
+    private BigDecimal rationTwo;
+
+    /**
+     * 编号3代表的金额
+     */
+    private BigDecimal rationThree;
+
+    /**
+     * 编号4代表的金额
+     */
+    private BigDecimal rationFour;
+
+    /**
+     * 编号5代表的金额
+     */
+    private BigDecimal rationFive;
+
+    /**
+     * 编号6代表的金额
+     */
+    private BigDecimal rationSix;
+
+    /**
+     * 编号7代表的金额
+     */
+    private BigDecimal rationSeven;
+
+    /**
+     * 编号8代表的金额
+     */
+    private BigDecimal rationEight;
+
+    /**
+     * 编号9代表的金额
+     */
+    private BigDecimal rationNine;
+
+    /**
+     * 每天最大消费次数,0-不限
+     */
+    private Long dayCount;
+
+    /**
+     * 每天最大消费金额
+     */
+    private BigDecimal dayMoney;
+
+    /**
+     * 每餐最大消费次数,0-不限
+     */
+    private Long mealCount;
+
+    /**
+     * 单次最大消费金额
+     */
+    private BigDecimal singleMoney;
+
+    /**
+     * 早餐消费金额
+     */
+    private BigDecimal breakfastMoney;
+
+    /**
+     * 午餐消费金额
+     */
+    private BigDecimal lunchMoney;
+
+    /**
+     * 晚餐消费金额
+     */
+    private BigDecimal supperMoney;
+
+    /**
+     * 夜宵消费金额
+     */
+    private BigDecimal nightMoney;
+
+    /**
+     * 早餐开始时间
+     */
+    private Long breakfastBegin;
+
+    /**
+     * 早餐结束时间
+     */
+    private Long breakfastEnd;
+
+    /**
+     * 午餐开始时间
+     */
+    private Long lunchBegin;
+
+    /**
+     * 午餐结束时间
+     */
+    private Long lunchEnd;
+
+    /**
+     * 晚餐开始时间
+     */
+    private Long supperBegin;
+
+    /**
+     * 晚餐结束时间
+     */
+    private Long supperEnd;
+
+    /**
+     * 宵夜开始时间
+     */
+    private Long nightBegin;
+
+    /**
+     * 宵夜结束时间
+     */
+    private Long nightEnd;
+
+    /**
+     * 两次刷卡间隔,0-不限制
+     */
+    private Long swipeInterval;
+
+    /**
+     * 是否启用卡片有效限制,0-禁用 1-启用
+     */
+    private String termValidity;
+
+    /**
+     * 重启时间
+     */
+    private String rebootTime;
+
+
+
+
+}

+ 99 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfTermTotalVo.java

@@ -0,0 +1,99 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfTermTotal;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+/**
+ * 消费机消费记录视图对象 t_xf_termTotal
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfTermTotal.class)
+public class XfTermTotalVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 汇总Id,主键
+     */
+    private String totalId;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 所属餐厅Id
+     */
+    private Long roomId;
+
+    /**
+     * 所属餐厅名称
+     */
+    private String roomName;
+
+    /**
+     * 结算账户Id
+     */
+    private Long accountId;
+
+    /**
+     * 结算账户名称
+     */
+    private String accountName;
+
+    /**
+     * 消费日期
+     */
+    private String dateDay;
+
+    /**
+     * 营业时段
+     */
+    private Long mealType;
+
+    /**
+     * 消费总额(该机该天该餐消费总额)
+     */
+    private BigDecimal mealAmount;
+
+    /**
+     * 消费次数(该机该天该餐消费次数)
+     */
+    private Long mealCount;
+
+    /**
+     * 使用类型,100-消费系统
+     */
+    private Integer useType;
+
+    /**
+     * 错扣补款次数(该机该天该餐错扣补款次数)
+     */
+    private Long errFillCount;
+
+    /**
+     * 错扣补款总额(该机该天该餐错扣补款总额)
+     */
+    private BigDecimal errFillMoney;
+
+
+}

+ 103 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfTermVo.java

@@ -0,0 +1,103 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfTerm;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 消费设备视图对象 t_xf_term
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfTerm.class)
+public class XfTermVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 设备Id,主键
+     */
+    private Long termId;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 所属餐厅Id
+     */
+    private Long roomId;
+    /**
+     * 所属餐厅名称
+     */
+    private String roomName;
+
+    /**
+     * 结算账户Id
+     */
+    private Long accountId;
+    /**
+     * 结算账户名称
+     */
+    private String accountName;
+
+    /**
+     * 设备类型,见XF_TermType字典类型
+     */
+    private String termType;
+
+    /**
+     * 扣费类型,见XF_ConsumeType字典类型
+     */
+    private String consumeType;
+
+    /**
+     * 设备IP
+     */
+    private String termIp;
+
+    /**
+     * 设备通讯端口
+     */
+    private Long commPort;
+
+    /**
+     * 服务器IP
+     */
+    private String serverIp;
+
+    /**
+     * 服务器端口
+     */
+    private Long serverPort;
+
+    /**
+     * 是否自动下载参数
+     */
+    private String autoDown;
+
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 租户编号
+     */
+    private String tenantId;
+
+}

+ 79 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfUserTotalVo.java

@@ -0,0 +1,79 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.XfUserTotal;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+/**
+ * 个人与消费与充值统计视图对象 t_xf_userTotal
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfUserTotal.class)
+public class XfUserTotalVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 汇总Id,主键
+     */
+    private String totalId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 消费日期
+     */
+    private String dateDay;
+
+    /**
+     * 使用类型,100-消费系统
+     */
+    private Integer useType;
+
+    /**
+     * 充值金额
+     */
+    private BigDecimal creditMoney;
+
+    /**
+     * 消费金额
+     */
+    private BigDecimal consumeMoney;
+
+
+}

+ 13 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfConsumeDetailMapper.java

@@ -0,0 +1,13 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfConsumeDetail;
+import org.dromara.server.consume.domain.vo.XfConsumeDetailVo;
+
+/**
+ * 消费明细Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+public interface XfConsumeDetailMapper extends BaseMapperPlus<XfConsumeDetail, XfConsumeDetailVo> {}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfConsumeDetailOriginalMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfConsumeDetailOriginal;
+import org.dromara.server.consume.domain.vo.XfConsumeDetailOriginalVo;
+
+/**
+ * 原始消费记录Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+public interface XfConsumeDetailOriginalMapper extends BaseMapperPlus<XfConsumeDetailOriginal, XfConsumeDetailOriginalVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfCreditAccountBackMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfCreditAccountBack;
+import org.dromara.server.consume.domain.vo.XfCreditAccountBackVo;
+
+/**
+ * 资金收支备份Mapper接口
+ *
+ * @author Yb
+ * @date 2024-08-15
+ */
+public interface XfCreditAccountBackMapper extends BaseMapperPlus<XfCreditAccountBack, XfCreditAccountBackVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfCreditAccountMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfCreditAccount;
+import org.dromara.server.consume.domain.vo.XfCreditAccountVo;
+
+/**
+ * 资金收支明细Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+public interface XfCreditAccountMapper extends BaseMapperPlus<XfCreditAccount, XfCreditAccountVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfDiscountMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfDiscount;
+import org.dromara.server.consume.domain.vo.XfDiscountVo;
+
+/**
+ * 折扣管理Mapper接口
+ *
+ * @author bing
+ * @date 2024-08-13
+ */
+public interface XfDiscountMapper extends BaseMapperPlus<XfDiscount, XfDiscountVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfDiscountTermMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfDiscountTerm;
+import org.dromara.server.consume.domain.vo.XfDiscountTermVo;
+
+/**
+ * 折扣设备Mapper接口
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+public interface XfDiscountTermMapper extends BaseMapperPlus<XfDiscountTerm, XfDiscountTermVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfLimitedMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfLimited;
+import org.dromara.server.consume.domain.vo.XfLimitedVo;
+
+/**
+ * 限次管理Mapper接口
+ *
+ * @author bing
+ * @date 2024-08-15
+ */
+public interface XfLimitedMapper extends BaseMapperPlus<XfLimited, XfLimitedVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfLimitedTermMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfLimitedTerm;
+import org.dromara.server.consume.domain.vo.XfLimitedTermVo;
+
+/**
+ * 限次设备绑定Mapper接口
+ *
+ * @author bing
+ * @date 2024-08-15
+ */
+public interface XfLimitedTermMapper extends BaseMapperPlus<XfLimitedTerm, XfLimitedTermVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfQuotaMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfQuota;
+import org.dromara.server.consume.domain.vo.XfQuotaVo;
+
+/**
+ * 限额管理Mapper接口
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+public interface XfQuotaMapper extends BaseMapperPlus<XfQuota, XfQuotaVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfQuotaTermMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfQuotaTerm;
+import org.dromara.server.consume.domain.vo.XfQuotaTermVo;
+
+/**
+ * 限额设备绑定Mapper接口
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+public interface XfQuotaTermMapper extends BaseMapperPlus<XfQuotaTerm, XfQuotaTermVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfTermMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfTerm;
+import org.dromara.server.consume.domain.vo.XfTermVo;
+
+/**
+ * 消费设备Mapper接口
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+public interface XfTermMapper extends BaseMapperPlus<XfTerm, XfTermVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfTermTotalMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfTermTotal;
+import org.dromara.server.consume.domain.vo.XfTermTotalVo;
+
+/**
+ * 消费机消费记录Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+public interface XfTermTotalMapper extends BaseMapperPlus<XfTermTotal, XfTermTotalVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/XfUserTotalMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.XfUserTotal;
+import org.dromara.server.consume.domain.vo.XfUserTotalVo;
+
+/**
+ * 个人与消费与充值统计Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+public interface XfUserTotalMapper extends BaseMapperPlus<XfUserTotal, XfUserTotalVo> {
+
+}

+ 47 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfConsumeDetailOriginalService.java

@@ -0,0 +1,47 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.bo.XfConsumeDetailOriginalBo;
+import org.dromara.server.consume.domain.vo.XfConsumeDetailOriginalVo;
+
+import java.util.List;
+
+/**
+ * 原始消费记录Service接口
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+public interface IXfConsumeDetailOriginalService {
+    /**
+     * 查询原始消费记录
+     *
+     * @param originalId 主键
+     * @return 原始消费记录
+     */
+    XfConsumeDetailOriginalVo queryById(String originalId);
+
+    /**
+     * 查询符合条件的原始消费记录列表
+     *
+     * @param bo 查询条件
+     * @return 原始消费记录列表
+     */
+    List<XfConsumeDetailOriginalVo> queryList(XfConsumeDetailOriginalBo bo);
+
+    /**
+     * 新增原始消费记录
+     *
+     * @param bo 原始消费记录
+     * @return 原始消费记录视图
+     */
+    XfConsumeDetailOriginalVo insertByBo(XfConsumeDetailOriginalBo bo);
+
+    /**
+     * 修改原始消费记录
+     *
+     * @param bo 原始消费记录
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(XfConsumeDetailOriginalBo bo);
+
+}

+ 64 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfConsumeDetailService.java

@@ -0,0 +1,64 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.bo.XfConsumeDetailBo;
+import org.dromara.server.consume.domain.vo.XfConsumeDetailVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 消费明细Service接口
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+public interface IXfConsumeDetailService {
+
+    /**
+     * 查询消费明细
+     *
+     * @param consumeId 主键
+     * @return 消费明细
+     */
+    XfConsumeDetailVo queryById(String consumeId);
+    /**
+     * 查询符合条件的消费明细列表
+     *
+     * @param bo 查询条件
+     * @return 消费明细列表
+     */
+    List<XfConsumeDetailVo> queryList(XfConsumeDetailBo bo);
+
+    /**
+     * 新增消费明细
+     *
+     * @param bo 消费明细
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(XfConsumeDetailBo bo);
+
+    /**
+     * 修改消费明细
+     *
+     * @param bo 消费明细
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(XfConsumeDetailBo bo);
+
+    /**
+     * 创建消费明细记录
+     *
+     * @param bo 消费明细
+     * @return 创建的消费明细视图
+     */
+    XfConsumeDetailVo createConsumeDetailRecord(XfConsumeDetailBo bo);
+
+    /**
+     * 修改消费明细
+     *
+     * @param bo 消费明细
+     * @return 是否修改成功
+     */
+    Boolean updateByBoId(XfConsumeDetailBo bo);
+
+}

+ 66 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfCreditAccountBackService.java

@@ -0,0 +1,66 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.bo.XfCreditAccountBackBo;
+import org.dromara.server.consume.domain.vo.XfCreditAccountBackVo;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 资金收支备份Service接口
+ *
+ * @author Yb
+ * @date 2024-08-15
+ */
+public interface IXfCreditAccountBackService {
+
+    /**
+     * 查询资金收支备份
+     *
+     * @param backId 主键
+     * @return 资金收支备份
+     */
+    XfCreditAccountBackVo queryById(String backId);
+
+    /**
+     * 查询符合条件的资金收支备份列表
+     *
+     * @param bo 查询条件
+     * @return 资金收支备份列表
+     */
+    List<XfCreditAccountBackVo> queryList(XfCreditAccountBackBo bo);
+
+    /**
+     * 新增资金收支备份
+     *
+     * @param bo 资金收支备份
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(XfCreditAccountBackBo bo);
+
+    /**
+     * 修改资金收支备份
+     *
+     * @param bo 资金收支备份
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(XfCreditAccountBackBo bo);
+
+    /**
+     * 创建原始收支记录
+     *
+     * @param bo     原始收支记录
+     * @return 原始收支记录入库信息
+     */
+    XfCreditAccountBackVo createOriginalRecord(XfCreditAccountBackBo bo);
+    /**
+     * 更新原始收支记录的处理状态
+     *
+     * @param backId     原始收支记录Id
+     * @param status     原始收支记录状态
+     * @param accountId  收支记录Id
+     * @param cardValue  处理完成后的卡余
+     * @return 原始收支记录入库信息
+     */
+    Boolean updateStatusById(String backId, Integer status, String accountId, BigDecimal cardValue);
+}

+ 54 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfCreditAccountService.java

@@ -0,0 +1,54 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.bo.XfCreditAccountBo;
+import org.dromara.server.consume.domain.vo.XfCreditAccountVo;
+
+import java.util.List;
+
+/**
+ * 资金收支明细Service接口
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+public interface IXfCreditAccountService {
+
+    /**
+     * 查询资金收支明细
+     *
+     * @param creditId 主键
+     * @return 资金收支明细
+     */
+    XfCreditAccountVo queryById(String creditId);
+
+    /**
+     * 查询符合条件的资金收支明细列表
+     *
+     * @param bo 查询条件
+     * @return 资金收支明细列表
+     */
+    List<XfCreditAccountVo> queryList(XfCreditAccountBo bo);
+
+    /**
+     * 新增资金收支明细
+     *
+     * @param bo 资金收支明细
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(XfCreditAccountBo bo);
+
+    /**
+     * 修改资金收支明细
+     *
+     * @param bo 资金收支明细
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(XfCreditAccountBo bo);
+
+    /**
+     * 收支入账
+     * @param bo 收支业务对象
+     * @return 入账结果
+     */
+    XfCreditAccountVo keepAccounts(XfCreditAccountBo bo);
+}

+ 30 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfDiscountService.java

@@ -0,0 +1,30 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.bo.XfDiscountBo;
+import org.dromara.server.consume.domain.vo.XfDiscountVo;
+
+import java.util.List;
+
+/**
+ * 折扣管理Service接口
+ *
+ * @author bing
+ * @date 2024-08-13
+ */
+public interface IXfDiscountService {
+
+    /**
+     * 查询折扣管理
+     *
+     * @param discountId 主键
+     * @return 折扣管理
+     */
+    XfDiscountVo queryById(Long discountId);
+    /**
+     * 查询符合条件的折扣管理列表
+     *
+     * @param bo 查询条件
+     * @return 折扣管理列表
+     */
+    List<XfDiscountVo> queryList(XfDiscountBo bo);
+}

+ 32 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfDiscountTermService.java

@@ -0,0 +1,32 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.bo.XfDiscountTermBo;
+import org.dromara.server.consume.domain.vo.XfDiscountTermVo;
+
+import java.util.List;
+
+/**
+ * 折扣设备Service接口
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+public interface IXfDiscountTermService {
+
+    /**
+     * 查询折扣设备
+     *
+     * @param discountTermId 主键
+     * @return 折扣设备
+     */
+    XfDiscountTermVo queryById(Long discountTermId);
+
+    /**
+     * 查询符合条件的折扣设备列表
+     *
+     * @param bo 查询条件
+     * @return 折扣设备列表
+     */
+    List<XfDiscountTermVo> queryList(XfDiscountTermBo bo);
+
+}

+ 32 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfLimitedService.java

@@ -0,0 +1,32 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.bo.XfLimitedBo;
+import org.dromara.server.consume.domain.vo.XfLimitedVo;
+
+import java.util.List;
+
+/**
+ * 限次管理Service接口
+ *
+ * @author bing
+ * @date 2024-08-15
+ */
+public interface IXfLimitedService {
+
+    /**
+     * 查询限次管理
+     *
+     * @param limitedId 主键
+     * @return 限次管理
+     */
+    XfLimitedVo queryById(Long limitedId);
+
+    /**
+     * 查询符合条件的限次管理列表
+     *
+     * @param bo 查询条件
+     * @return 限次管理列表
+     */
+    List<XfLimitedVo> queryList(XfLimitedBo bo);
+
+}

+ 30 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfLimitedTermService.java

@@ -0,0 +1,30 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.bo.XfLimitedTermBo;
+import org.dromara.server.consume.domain.vo.XfLimitedTermVo;
+
+import java.util.List;
+
+/**
+ * 限次设备绑定Service接口
+ *
+ * @author bing
+ * @date 2024-08-15
+ */
+public interface IXfLimitedTermService {
+    /**
+     * 查询限次设备绑定
+     *
+     * @param limitedTermId 主键
+     * @return 限次设备绑定
+     */
+    XfLimitedTermVo queryById(Long limitedTermId);
+    /**
+     * 查询符合条件的限次设备绑定列表
+     *
+     * @param bo 查询条件
+     * @return 限次设备绑定列表
+     */
+    List<XfLimitedTermVo> queryList(XfLimitedTermBo bo);
+
+}

+ 32 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfQuotaService.java

@@ -0,0 +1,32 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.bo.XfQuotaBo;
+import org.dromara.server.consume.domain.vo.XfQuotaVo;
+
+import java.util.List;
+
+/**
+ * 限额管理Service接口
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+public interface IXfQuotaService {
+
+    /**
+     * 查询限额管理
+     *
+     * @param quotaId 主键
+     * @return 限额管理
+     */
+    XfQuotaVo queryById(Long quotaId);
+
+    /**
+     * 查询符合条件的限额管理列表
+     *
+     * @param bo 查询条件
+     * @return 限额管理列表
+     */
+    List<XfQuotaVo> queryList(XfQuotaBo bo);
+
+}

+ 30 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfQuotaTermService.java

@@ -0,0 +1,30 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.bo.XfQuotaTermBo;
+import org.dromara.server.consume.domain.vo.XfQuotaTermVo;
+
+import java.util.List;
+
+/**
+ * 限额设备绑定Service接口
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+public interface IXfQuotaTermService {
+    /**
+     * 查询限额设备绑定
+     *
+     * @param quotaTermId 主键
+     * @return 限额设备绑定
+     */
+    XfQuotaTermVo queryById(Long quotaTermId);
+
+    /**
+     * 查询符合条件的限额设备绑定列表
+     *
+     * @param bo 查询条件
+     * @return 限额设备绑定列表
+     */
+    List<XfQuotaTermVo> queryList(XfQuotaTermBo bo);
+}

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů