Browse Source

feature: kafka消费数据上传

luoyb 6 days ago
parent
commit
67e6847f42
30 changed files with 1056 additions and 39 deletions
  1. 19 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteConsumeService.java
  2. 133 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemoteConsumptionBo.java
  3. 23 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/ConsumeTypeConstants.java
  4. 5 1
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CreditTypeEnum.java
  5. 4 0
      ruoyi-modules/ruoyi-backstage/pom.xml
  6. 3 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/mapper/PtMealtypeMapper.java
  7. 7 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtMealtypeService.java
  8. 14 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtMealtypeServiceImpl.java
  9. 247 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/consume/ConsumeBusiness.java
  10. 31 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/consume/strategy/IConsumeStrategy.java
  11. 37 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/consume/strategy/Impl/ConsumeStrategyContent.java
  12. 82 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/consume/strategy/Impl/TermConsumeStrategyImpl.java
  13. 52 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/ConsumesController.java
  14. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfConsumeDetailOriginalController.java
  15. 12 10
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfConsumeDetailOriginal.java
  16. 102 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/ConsumeRecordBo.java
  17. 35 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/ConsumptionBo.java
  18. 14 13
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfConsumeDetailOriginalBo.java
  19. 40 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteConsumeServiceImpl.java
  20. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfConsumedetailoriginalService.java
  21. 3 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumedetailoriginalServiceImpl.java
  22. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumeDetailServiceImpl.java
  23. 1 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfTermTotalServiceImpl.java
  24. 82 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/KafkaNormalConsumer.java
  25. 33 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/domain/bo/KafkaHeader.java
  26. 19 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/domain/bo/KafkaMessage.java
  27. 2 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPtBagService.java
  28. 8 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPtUserAccountService.java
  29. 18 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java
  30. 26 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/task/InitRunner.java

+ 19 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteConsumeService.java

@@ -0,0 +1,19 @@
1
+package org.dromara.backstage.api;
2
+
3
+import org.dromara.backstage.api.domain.bo.RemoteConsumptionBo;
4
+import org.dromara.common.core.domain.R;
5
+
6
+/**
7
+ * name: RemoteConsumeService
8
+ * package: org.dromara.backstage.api
9
+ * description: 消费服务
10
+ * date: 2024-10-15 14:19:13 14:19
11
+ *
12
+ * @author luoyibo
13
+ * @version 0.1
14
+ * @since JDK 1.8
15
+ */
16
+public interface RemoteConsumeService {
17
+
18
+    R<Object> receiveConsumeOriginalRecord(RemoteConsumptionBo bo);
19
+}

+ 133 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemoteConsumptionBo.java

@@ -0,0 +1,133 @@
1
+package org.dromara.backstage.api.domain.bo;
2
+
3
+import jakarta.validation.constraints.NotNull;
4
+import lombok.Data;
5
+import lombok.NoArgsConstructor;
6
+import org.dromara.common.core.enums.CreditTypeEnum;
7
+import org.dromara.common.core.enums.SystemUseTypeEnum;
8
+import org.dromara.common.core.validate.AddGroup;
9
+import org.dromara.common.core.validate.EditGroup;
10
+
11
+import java.io.Serial;
12
+import java.io.Serializable;
13
+import java.math.BigDecimal;
14
+import java.util.Date;
15
+
16
+/**
17
+ * name: RemoteConsumptionBo
18
+ * package: org.dromara.backstage.api.domain.bo
19
+ * description: 消费服务远程访问业务模型
20
+ * date: 2024-10-15 14:20:35 14:20
21
+ *
22
+ * @author luoyibo
23
+ * @version 0.1
24
+ * @since JDK 1.8
25
+ */
26
+@Data
27
+@NoArgsConstructor
28
+public class RemoteConsumptionBo implements Serializable {
29
+    @Serial
30
+    private static final long serialVersionUID = 7218154172363464218L;
31
+
32
+    //region 消费业务基础属性
33
+    /**
34
+     * 人员账户Id
35
+     */
36
+    private Long userId;
37
+
38
+    /**
39
+     * 学/工号
40
+     */
41
+    private String userNumb;
42
+
43
+    /**
44
+     * 人员姓名
45
+     */
46
+    private String realName;
47
+
48
+    /**
49
+     * 卡流水号
50
+     */
51
+    private Long cardNo;
52
+
53
+    /**
54
+     * 物理卡号
55
+     */
56
+    private Long factoryId;
57
+    /**
58
+     * 钱包代码
59
+     */
60
+    private String bagType;
61
+
62
+    /**
63
+     * 消费金额
64
+     */
65
+    private BigDecimal consumeMoney;
66
+
67
+    /**
68
+     * 消费日期
69
+     */
70
+    private Date consumeDate;
71
+
72
+    /**
73
+     * 设备机号
74
+     */
75
+    private Long termNo;
76
+
77
+    /**
78
+     * 机器流水号
79
+     */
80
+    private Long termRecordId;
81
+    /**
82
+     * 餐类Id
83
+     */
84
+    private Long mealType;
85
+    /**
86
+     * 原始记录Id
87
+     */
88
+    private String consumeId;
89
+
90
+    /**
91
+     * 记录Id
92
+     */
93
+    private Long recordId;
94
+    /**
95
+     * 消费记录标志位?
96
+     */
97
+    private Long recordStatus;
98
+
99
+    /**
100
+     * 状态标识(记录消费类型?)
101
+     */
102
+    private Integer statusFlag;
103
+    /**
104
+     * 系统使用类型
105
+     */
106
+    private SystemUseTypeEnum useType;
107
+    /**
108
+     * 操作员Id
109
+     */
110
+    private Long operatorId;
111
+    /**
112
+     * 操作员姓名
113
+     */
114
+    private String operatorName;
115
+
116
+    /**
117
+     * 交易类型
118
+     */
119
+    private CreditTypeEnum creditType;
120
+    //endregion
121
+
122
+    //region 错扣补款属性
123
+    /**
124
+     * 补款日期
125
+     */
126
+    private Date fillDate;
127
+
128
+    /**
129
+     * 操作金额
130
+     */
131
+    private BigDecimal operatorMoney;
132
+    //endregion
133
+}

+ 23 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/ConsumeTypeConstants.java

@@ -0,0 +1,23 @@
1
+package org.dromara.common.core.constant;
2
+
3
+/**
4
+ * name: ConsumeTypeConstants
5
+ * package: org.dromara.common.core.constant
6
+ * description: 消费类型常量
7
+ * date: 2024-10-14 12:43:07 12:43
8
+ *
9
+ * @author luoyibo
10
+ * @version 0.1
11
+ * @since JDK 1.8
12
+ */
13
+public interface ConsumeTypeConstants {
14
+    /**
15
+     * 消费机消费
16
+     */
17
+    String TERM_CONSUME="TERM_CONSUME";
18
+    /**
19
+     * 错扣补款消费
20
+     */
21
+    String ERROR_FILL="ERROR_FILL";
22
+
23
+}

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

@@ -118,7 +118,11 @@ public enum CreditTypeEnum {
118 118
     /**
119 119
      * 微信充值
120 120
      */
121
-    WECHAT_RECHARGE(24600, "微信充值");
121
+    WECHAT_RECHARGE(24600, "微信充值"),
122
+    /**
123
+     * 设备消费
124
+     */
125
+    TERM_CONSUME(25000, "设备消费");
122 126
 
123 127
     private final Integer code;
124 128
     private final String message;

+ 4 - 0
ruoyi-modules/ruoyi-backstage/pom.xml

@@ -113,6 +113,10 @@
113 113
             <version>2.2.0</version>
114 114
             <scope>compile</scope>
115 115
         </dependency>
116
+        <dependency>
117
+            <groupId>org.springframework.kafka</groupId>
118
+            <artifactId>spring-kafka</artifactId>
119
+        </dependency>
116 120
     </dependencies>
117 121
 
118 122
     <build>

+ 3 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/mapper/PtMealtypeMapper.java

@@ -24,4 +24,7 @@ public interface PtMealtypeMapper extends BaseMapperPlus<PtMealType, PtMealTypeV
24 24
     List<PtMealTypeVo> validateSelect(@Param("typeId") String typeId, @Param("mealId") Long mealId
25 25
         , @Param("beginTime") String beginTime, @Param("endTime") String endTime);
26 26
 
27
+    @Select("SELECT * FROM t_pt_mealType tpmt WHERE #{mealTime}>begin_Time " +
28
+        "AND #{mealTime}<end_time")
29
+    List<PtMealTypeVo> queryVoByTime(@Param("mealTime") String mealTime);
27 30
 }

+ 7 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtMealtypeService.java

@@ -74,4 +74,11 @@ public interface IPtMealtypeService {
74 74
      * @return 餐类视图
75 75
      */
76 76
     PtMealTypeVo queryVoByTypeId(String typeId);
77
+
78
+    /**
79
+     * 根据就餐时间查询对应的餐类
80
+     * @param mealTime 就餐时间
81
+     * @return 餐类
82
+     */
83
+    PtMealTypeVo queryVoByTime(String mealTime);
77 84
 }

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

@@ -167,4 +167,18 @@ public class PtMealtypeServiceImpl implements IPtMealtypeService {
167 167
         return baseMapper.selectVoOne(new LambdaQueryWrapper<PtMealType>()
168 168
             .eq(PtMealType::getTypeId, typeId));
169 169
     }
170
+    /**
171
+     * 根据就餐时间查询对应的餐类
172
+     * @param mealTime 就餐时间
173
+     * @return 餐类
174
+     */
175
+    @Override
176
+    public PtMealTypeVo queryVoByTime(String mealTime) {
177
+        List<PtMealTypeVo> voList = baseMapper.queryVoByTime(mealTime);
178
+        if(voList!=null && !voList.isEmpty()){
179
+            return voList.get(0);
180
+        } else {
181
+            return null;
182
+        }
183
+    }
170 184
 }

+ 247 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/consume/ConsumeBusiness.java

@@ -0,0 +1,247 @@
1
+package org.dromara.backstage.business.consume;
2
+
3
+import cn.hutool.core.bean.BeanUtil;
4
+import cn.hutool.core.date.DateUtil;
5
+import lombok.RequiredArgsConstructor;
6
+import lombok.extern.slf4j.Slf4j;
7
+import org.dromara.backstage.basics.domain.vo.PtMealTypeVo;
8
+import org.dromara.backstage.basics.service.IPtMealtypeService;
9
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
10
+import org.dromara.backstage.cardCenter.service.IPtCardService;
11
+import org.dromara.backstage.consumption.domain.bo.*;
12
+import org.dromara.backstage.consumption.domain.vo.*;
13
+import org.dromara.backstage.consumption.service.*;
14
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
15
+import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
16
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
17
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
18
+import org.dromara.backstage.payment.service.IPtBagService;
19
+import org.dromara.backstage.payment.service.IPtUserAccountService;
20
+import org.dromara.common.core.enums.BalanceUpdateEnum;
21
+import org.dromara.common.core.enums.SystemUseTypeEnum;
22
+import org.dromara.common.core.utils.RecordIdUtils;
23
+import org.jetbrains.annotations.NotNull;
24
+import org.springframework.stereotype.Service;
25
+
26
+import java.math.BigDecimal;
27
+import java.util.ArrayList;
28
+import java.util.Date;
29
+import java.util.List;
30
+
31
+/**
32
+ * name: ConsumeBusiness
33
+ * package: org.dromara.backstage.business.consume
34
+ * description: 消费业务处理逻辑
35
+ * date: 2024-10-14 10:30:27 10:30
36
+ *
37
+ * @author luoyibo
38
+ * @version 0.1
39
+ * @since JDK 1.8
40
+ */
41
+@RequiredArgsConstructor
42
+@Service
43
+@Slf4j
44
+public class ConsumeBusiness {
45
+
46
+    private final IXfConsumeDetailOriginalService consumeDetailOriginalService;
47
+    private final IXfConsumeDetailService consumeDetailService;
48
+    private final IPtUserAccountService userAccountService;
49
+    private final IPtCardService cardService;
50
+    private final IXfTermService termService;
51
+    private final IPtMealtypeService mealTypeService;
52
+    private final IPtBagService bagService;
53
+    private final IXfUserTotalService userTotalService;
54
+    private final IXfTermTotalService termTotalService;
55
+
56
+    /**
57
+     * 将消费机上传的消费数据转换成系统的消费业务对象
58
+     *
59
+     * @param recordBo 消费记录数据
60
+     * @return 消费业务对象
61
+     */
62
+    public ConsumptionBo recordToBusiness(ConsumeRecordBo recordBo) {
63
+        ConsumptionBo consumptionBo = new ConsumptionBo();
64
+
65
+        consumptionBo.setConsumeMoney(recordBo.getConsumeValue());
66
+        consumptionBo.setConsumeDate(recordBo.getConsumeDate());
67
+        consumptionBo.setTermRecordId(recordBo.getTermRecordID());
68
+        if (recordBo.getOriRecordID() != 0) {
69
+            consumptionBo.setRecordId(recordBo.getOriRecordID());
70
+        }
71
+        consumptionBo.setCardNo(recordBo.getCardID());
72
+        consumptionBo.setFactoryId(recordBo.getFactoryFixID());
73
+        consumptionBo.setUserId(recordBo.getEmployeeID());
74
+        consumptionBo.setUserNumb(recordBo.getEmployeeStrID());
75
+        consumptionBo.setRealName(recordBo.getEmployeeName());
76
+        consumptionBo.setRecordStatus(recordBo.getPosRecordState().longValue());
77
+        Long termNo = recordBo.getTermID() == null ? recordBo.getMathineTermID() : recordBo.getTermID();
78
+        consumptionBo.setTermNo(termNo);
79
+        consumptionBo.setCreditType(recordBo.getCreditType());
80
+        return consumptionBo;
81
+    }
82
+
83
+    public XfConsumeDetailOriginalVo createConsumeOriginalRecord(ConsumptionBo consumeBo, PtUserAccountVo accountVo) {
84
+        String originalId = getRecordKeyId(consumeBo.getTermNo().intValue(), consumeBo.getTermRecordId(), accountVo.getUserNo(), 0);
85
+
86
+        XfConsumeDetailOriginalBo originalBo = new XfConsumeDetailOriginalBo();
87
+        BeanUtil.copyProperties(consumeBo, originalBo);
88
+        originalBo.setOriginalId(originalId);
89
+        originalBo.setDataFlag(0L);
90
+        originalBo.setAnalysisFlag(0L);
91
+        //这项实际要根据消费的扣款模式来赋值
92
+        BigDecimal cardValue = this.getAccountBalance(consumeBo, accountVo);
93
+        originalBo.setCardValue(cardValue);
94
+        originalBo.setConsumeBalance(cardValue);
95
+        originalBo.setDigitalSign("补助消费");
96
+        originalBo.setUserId(accountVo.getUserId());
97
+
98
+        consumeDetailOriginalService.insertByBo(originalBo);
99
+
100
+        return consumeDetailOriginalService.queryById(originalBo.getOriginalId());
101
+    }
102
+
103
+    /**
104
+     * 生成消费明细表的32位主键Id
105
+     *
106
+     * @param termNo       设备编号
107
+     * @param termRecordId 设备流水号
108
+     * @param userNo       人员流水号
109
+     * @return 生成的记录Id
110
+     */
111
+    @NotNull
112
+    private String getRecordKeyId(Integer termNo, Long termRecordId, Long userNo, Integer bagCode) {
113
+        return RecordIdUtils.getRecordId(new Date(), termNo.shortValue(), termRecordId.shortValue(), userNo.intValue(), bagCode);
114
+    }
115
+
116
+    public PtUserAccountVo getPtUserAccountVo(ConsumptionBo recordBo) {
117
+        return userAccountService.queryByNameAndNumb(recordBo.getRealName(),recordBo.getUserNumb());
118
+    }
119
+
120
+    public PtCardVo getPtCardVo(ConsumptionBo recordBo) {
121
+        PtCardVo ptCardVo;
122
+        if (recordBo.getCardNo() != null && recordBo.getCardNo() > 0) {
123
+            //如果传入了cardNo,根据cardNo查询卡片信息
124
+            ptCardVo = cardService.queryCardByCardNo(recordBo.getCardNo());
125
+        } else {
126
+            //查询当前人的正常主卡
127
+            ptCardVo = cardService.queryMainCardByUserId(recordBo.getUserId());
128
+        }
129
+        return ptCardVo;
130
+    }
131
+
132
+    public XfTermVo getXfTermVo(ConsumptionBo recordBo) {
133
+        return termService.queryByNo(recordBo.getTermNo());
134
+    }
135
+
136
+    public PtMealTypeVo getMealTypeVo(ConsumptionBo recordBo) {
137
+        PtMealTypeVo vo = mealTypeService.queryVoByTime(DateUtil.format(recordBo.getConsumeDate(), "HH:mm:ss"));
138
+        if (vo == null) {
139
+            vo = new PtMealTypeVo();
140
+            vo.setTypeId("0");
141
+            vo.setMealName("未知");
142
+        }
143
+        return vo;
144
+    }
145
+
146
+    public List<PtBagVo> getBagVo(PtUserAccountVo userAccountVo, XfTermVo xfTermVo) {
147
+        // TODO 2024-10-14 15:18:58 luoyibo 这里实际需要根据消费机的扣费类型来获取消费钱包,暂时写死为补助钱包
148
+        PtBagVo vo = bagService.queryByUserBagCode(userAccountVo.getUserId(), "3");
149
+        List<PtBagVo> list = new ArrayList<>();
150
+        list.add(vo);
151
+        return list;
152
+    }
153
+
154
+    public BigDecimal getAccountBalance(ConsumptionBo recordBo,PtUserAccountVo userAccountVo) {
155
+        BigDecimal beforeValue = new BigDecimal(bagService.selectAccountBalanceByIds(userAccountVo.getUserId().toString()));
156
+        return beforeValue.subtract(recordBo.getConsumeMoney());
157
+    }
158
+
159
+    public XfConsumeDetailVo createConsumeRecord(ConsumptionBo bo, PtUserAccountVo userAccountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtMealTypeVo mealTypeVo, String remark) {
160
+        String recordId = getRecordKeyId(termVo.getTermNo().intValue(), bo.getTermNo(), userAccountVo.getUserNo(), Integer.valueOf(bagVo.getBagCode()));
161
+        XfConsumeDetailBo consumeDetailBo = new XfConsumeDetailBo();
162
+        BeanUtil.copyProperties(bo, consumeDetailBo);
163
+        consumeDetailBo.setConsumeId(recordId);
164
+        //设置消费账户信息
165
+        BeanUtil.copyProperties(userAccountVo, consumeDetailBo);
166
+        //设置消费信息
167
+        consumeDetailBo.setConsumeDate(bo.getConsumeDate());
168
+        //设置卡片信息
169
+        consumeDetailBo.setCardNo(cardVo.getCardNo());
170
+        consumeDetailBo.setFactoryId(cardVo.getFactoryId());
171
+        BigDecimal cardValue = this.getAccountBalance(bo, userAccountVo);
172
+        consumeDetailBo.setCardValue(cardValue);
173
+        consumeDetailBo.setConsumeBalance(cardValue);
174
+        //设置设备信息
175
+        BeanUtil.copyProperties(termVo, consumeDetailBo);
176
+        //设置操作员信息
177
+        //consumeDetailBo.setOperatorId(bo.getOperatorId());
178
+        //consumeDetailBo.setOperatorName(bo.getOperatorName());
179
+        //设置餐类信息
180
+        consumeDetailBo.setMealType(Long.valueOf(mealTypeVo.getTypeId()));
181
+        consumeDetailBo.setMealName(mealTypeVo.getMealName());
182
+        //设置钱包信息
183
+        consumeDetailBo.setBagType(bagVo.getBagCode());
184
+        //错扣补款设置statusFlag为0
185
+        consumeDetailBo.setRecordId(bo.getRecordId());
186
+        consumeDetailBo.setRemark(remark);
187
+
188
+        return consumeDetailService.createConsumeDetailRecord(consumeDetailBo);
189
+    }
190
+
191
+    /**
192
+     * 创建或更新人员日统计表
193
+     *
194
+     * @param bo        消费业务对象
195
+     * @param accountVo 人员账户视图
196
+     * @param cardVo    账户卡片视图
197
+     * @return 更新后的人员日统计表
198
+     */
199
+    public XfUserTotalVo createOrUpdateUserTotal(ConsumptionBo bo, PtUserAccountVo accountVo, PtCardVo cardVo) {
200
+        XfUserTotalBo xfUserTotalBo = new XfUserTotalBo();
201
+        BeanUtil.copyProperties(accountVo, xfUserTotalBo);
202
+        xfUserTotalBo.setDeptName(accountVo.getDeptName());
203
+        xfUserTotalBo.setCardNo(cardVo.getCardNo());
204
+        xfUserTotalBo.setDateDay(DateUtil.format(new Date(), "yyyy-MM-dd"));
205
+        xfUserTotalBo.setUseType(SystemUseTypeEnum.CONSUME.code());
206
+        xfUserTotalBo.setConsumeMoney(bo.getConsumeMoney());
207
+
208
+        return userTotalService.createOrUpdateUserTotal(xfUserTotalBo);
209
+    }
210
+
211
+    /**
212
+     * 创建或更新设备日统计
213
+     *
214
+     * @param bo         消费业务对象
215
+     * @param termVo     设备视图
216
+     * @param mealTypeVo 餐类视图
217
+     * @return 日统计视图
218
+     */
219
+    public XfTermTotalVo createOrUpdateTermTotal(ConsumptionBo bo, XfTermVo termVo, PtMealTypeVo mealTypeVo) {
220
+        XfTermTotalBo termTotalBo = new XfTermTotalBo();
221
+        BeanUtil.copyProperties(termVo, termTotalBo);
222
+        termTotalBo.setDateDay(DateUtil.format(new Date(), "yyyy-MM-dd"));
223
+        termTotalBo.setMealType(Long.valueOf(mealTypeVo.getTypeId()));
224
+        termTotalBo.setMealCount(1L);
225
+        termTotalBo.setMealAmount(bo.getConsumeMoney());
226
+        termTotalBo.setUseType(SystemUseTypeEnum.CONSUME.code());
227
+
228
+        return termTotalService.createOrUpdateTermTotal(termTotalBo);
229
+    }
230
+
231
+    /**
232
+     * 更新账户钱包余额
233
+     *
234
+     * @param bo    消费业务对象
235
+     * @param bagVo 账户钱包视图
236
+     * @return 更新后的账户钱包
237
+     */
238
+    public PtBagVo updateBalance(ConsumptionBo bo, PtBagVo bagVo) {
239
+        PtBagBo bagBo = new PtBagBo();
240
+        bagBo.setUserId(bagVo.getUserId());
241
+        bagBo.setBagId(bagVo.getBagId());
242
+        bagBo.setBagCode(bagVo.getBagCode());
243
+        bagBo.setReceiptMoney(bo.getConsumeMoney());
244
+        bagBo.setOperationMode(BalanceUpdateEnum.CONSUME);
245
+        return bagService.updateBalanceByBo(bagBo);
246
+    }
247
+}

+ 31 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/consume/strategy/IConsumeStrategy.java

@@ -0,0 +1,31 @@
1
+package org.dromara.backstage.business.consume.strategy;
2
+
3
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
4
+import org.dromara.common.core.domain.R;
5
+
6
+/**
7
+ * name: IConsumeStrategy
8
+ * package: org.dromara.backstage.business.consume.strategy
9
+ * description: 消费业务处理策略
10
+ * date: 2024-10-14 12:36:17 12:36
11
+ *
12
+ * @author luoyibo
13
+ * @version 0.1
14
+ * @since JDK 1.8
15
+ */
16
+public interface IConsumeStrategy {
17
+    /**
18
+     * 生成消费原始订单
19
+     *
20
+     * @param recordBo 消费记录业务模型
21
+     * @return 生成结果
22
+     */
23
+    R<Object> creteOrder(ConsumptionBo recordBo);
24
+
25
+    /**
26
+     * 消费入账
27
+      * @param bo 消费记录业务模型
28
+     * @return 入账结果
29
+     */
30
+    R<Object> postOrder(ConsumptionBo bo);
31
+}

+ 37 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/consume/strategy/Impl/ConsumeStrategyContent.java

@@ -0,0 +1,37 @@
1
+package org.dromara.backstage.business.consume.strategy.Impl;
2
+
3
+import org.dromara.backstage.business.consume.strategy.IConsumeStrategy;
4
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
5
+import org.dromara.common.core.domain.R;
6
+import org.springframework.beans.factory.annotation.Autowired;
7
+import org.springframework.stereotype.Service;
8
+
9
+import java.util.Map;
10
+import java.util.concurrent.ConcurrentHashMap;
11
+
12
+/**
13
+ * name: ConsumeStrategyContent
14
+ * package: org.dromara.backstage.business.consume.strategy.impl
15
+ * description: 消费策略上下文
16
+ * date: 2024-08-19 22:08:12 22:08
17
+ *
18
+ * @author luoyibo
19
+ * @version 0.1
20
+ * @since JDK 1.8
21
+ */
22
+@Service
23
+public class ConsumeStrategyContent {
24
+    private final Map<String, IConsumeStrategy> strategyMap = new ConcurrentHashMap<>();
25
+
26
+    @Autowired
27
+    public ConsumeStrategyContent(Map<String, IConsumeStrategy> strategyMap) {
28
+        this.strategyMap.putAll(strategyMap);
29
+    }
30
+
31
+    public R<Object> createOrder(ConsumptionBo recordBo){
32
+        return strategyMap.get(recordBo.getCreditType().name()).creteOrder(recordBo);
33
+    }
34
+    public R<Object> postOrder(ConsumptionBo bo){
35
+        return strategyMap.get(bo.getCreditType().name()).postOrder(bo);
36
+    }
37
+}

+ 82 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/consume/strategy/Impl/TermConsumeStrategyImpl.java

@@ -0,0 +1,82 @@
1
+package org.dromara.backstage.business.consume.strategy.Impl;
2
+
3
+import cn.hutool.json.JSONUtil;
4
+import lombok.RequiredArgsConstructor;
5
+import org.dromara.backstage.basics.domain.vo.PtMealTypeVo;
6
+import org.dromara.backstage.business.consume.ConsumeBusiness;
7
+import org.dromara.backstage.business.consume.strategy.IConsumeStrategy;
8
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
9
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
10
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailOriginalVo;
11
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailVo;
12
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
13
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
14
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
15
+import org.dromara.common.core.constant.ConsumeTypeConstants;
16
+import org.dromara.common.core.domain.R;
17
+import org.slf4j.Logger;
18
+import org.slf4j.LoggerFactory;
19
+import org.springframework.stereotype.Service;
20
+
21
+import java.util.List;
22
+
23
+/**
24
+ * name: TermCnsumeStrategyImpl
25
+ * package: org.dromara.backstage.business.consume.strategy.Impl
26
+ * description: 消费机消费处理
27
+ * date: 2024-10-14 13:04:17 13:04
28
+ *
29
+ * @author luoyibo
30
+ * @version 0.1
31
+ * @since JDK 1.8
32
+ */
33
+@RequiredArgsConstructor
34
+@Service(ConsumeTypeConstants.TERM_CONSUME)
35
+public class TermConsumeStrategyImpl implements IConsumeStrategy {
36
+    private static final Logger log = LoggerFactory.getLogger(TermConsumeStrategyImpl.class);
37
+    private final ConsumeBusiness consumeBusiness;
38
+
39
+    /**
40
+     * 生成消费订单,主要处理的业务
41
+     * 1.验证是否能消费并将验证结果返回前端
42
+     * 2.入库消费原始记录表
43
+     *
44
+     * @param consumptionBo 消费记录业务模型
45
+     * @return 生成结果
46
+     */
47
+    @Override
48
+    public R<Object> creteOrder(ConsumptionBo consumptionBo) {
49
+        PtUserAccountVo userAccountVo = consumeBusiness.getPtUserAccountVo(consumptionBo);
50
+        XfTermVo termVo = consumeBusiness.getXfTermVo(consumptionBo);
51
+        log.info("[验证通过,开始创建消费订单]-[{}]", JSONUtil.toJsonStr(consumptionBo));
52
+
53
+        // 消费设置记录的状态标志为4
54
+        consumptionBo.setStatusFlag(4);
55
+        XfConsumeDetailOriginalVo xfConsumeDetailOriginalVo = consumeBusiness.createConsumeOriginalRecord(consumptionBo, userAccountVo);
56
+        return R.ok(xfConsumeDetailOriginalVo);
57
+    }
58
+
59
+    @Override
60
+    public R<Object> postOrder(ConsumptionBo bo) {
61
+        PtUserAccountVo userAccountVo = consumeBusiness.getPtUserAccountVo(bo);
62
+        PtCardVo cardVo = consumeBusiness.getPtCardVo(bo);
63
+        XfTermVo termVo = consumeBusiness.getXfTermVo(bo);
64
+        PtMealTypeVo mealTypeVo = consumeBusiness.getMealTypeVo(bo);
65
+        List<PtBagVo> bagVoList = consumeBusiness.getBagVo(userAccountVo, termVo);
66
+        bo.setStatusFlag(4);
67
+        log.info("[验证通过,开始写入消费明细数据]-[{}]", JSONUtil.toJsonStr(bo));
68
+
69
+        XfConsumeDetailVo detailVo = consumeBusiness.createConsumeRecord(bo, userAccountVo, cardVo, bagVoList.get(0), termVo, mealTypeVo, "");
70
+
71
+        log.info("[消费明细处理完毕,开始更新人员日统计表]-[{}]", JSONUtil.toJsonStr(bo));
72
+        consumeBusiness.createOrUpdateUserTotal(bo, userAccountVo, cardVo);
73
+
74
+        log.info("[人员日统计表更新完毕,开始更新设备日统计表]-[{}]", JSONUtil.toJsonStr(bo));
75
+        consumeBusiness.createOrUpdateTermTotal(bo, termVo, mealTypeVo);
76
+
77
+        log.info("[设备日统计表更新完毕,开始更新钱包余额]-[{}]", JSONUtil.toJsonStr(bo));
78
+        consumeBusiness.updateBalance(bo, bagVoList.get(0));
79
+
80
+        return R.ok();
81
+    }
82
+}

+ 52 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/ConsumesController.java

@@ -0,0 +1,52 @@
1
+package org.dromara.backstage.consumption.controller;
2
+
3
+import cn.hutool.core.bean.BeanUtil;
4
+import lombok.RequiredArgsConstructor;
5
+import org.dromara.backstage.business.consume.ConsumeBusiness;
6
+import org.dromara.backstage.business.consume.strategy.Impl.ConsumeStrategyContent;
7
+import org.dromara.backstage.consumption.domain.bo.ConsumeRecordBo;
8
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
9
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailOriginalVo;
10
+import org.dromara.common.core.domain.R;
11
+import org.dromara.common.core.enums.CreditTypeEnum;
12
+import org.dromara.common.web.core.BaseController;
13
+import org.springframework.validation.annotation.Validated;
14
+import org.springframework.web.bind.annotation.PostMapping;
15
+import org.springframework.web.bind.annotation.RequestBody;
16
+import org.springframework.web.bind.annotation.RequestMapping;
17
+import org.springframework.web.bind.annotation.RestController;
18
+
19
+import java.math.RoundingMode;
20
+
21
+/**
22
+ * name: ConsumesController
23
+ * package: org.dromara.backstage.consumption.controller
24
+ * description: 消费数据访问路由地址
25
+ * date: 2024-10-14 10:09:31 10:09
26
+ *
27
+ * @author luoyibo
28
+ * @version 0.1
29
+ * @since JDK 1.8
30
+ */
31
+@Validated
32
+@RequiredArgsConstructor
33
+@RestController
34
+@RequestMapping("/v1/Consumes")
35
+public class ConsumesController extends BaseController {
36
+
37
+    private final ConsumeBusiness consumeBusiness;
38
+    private final ConsumeStrategyContent consumeStrategyContent;
39
+    @PostMapping("/ConsumeOriginal")
40
+    public R<Object> ConsumeOriginal(@RequestBody ConsumeRecordBo consumeRecordBo) {
41
+        consumeRecordBo.setCreditType(CreditTypeEnum.TERM_CONSUME);
42
+        consumeRecordBo.setConsumeValue(consumeRecordBo.getConsumeValue().setScale(2, RoundingMode.HALF_UP));
43
+        ConsumptionBo consumptionBo = consumeBusiness.recordToBusiness(consumeRecordBo);
44
+        R<Object> result = consumeStrategyContent.createOrder(consumptionBo);
45
+        XfConsumeDetailOriginalVo vo = (XfConsumeDetailOriginalVo)result.getData();
46
+
47
+        consumptionBo.setRecordId(vo.getRecordId());
48
+        consumptionBo.setConsumeId(vo.getOriginalId());
49
+        return consumeStrategyContent.postOrder(consumptionBo);
50
+        //return R.ok(vo);
51
+    }
52
+}

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfConsumeDetailOriginalController.java

@@ -19,7 +19,7 @@ import org.dromara.common.core.validate.AddGroup;
19 19
 import org.dromara.common.core.validate.EditGroup;
20 20
 import org.dromara.common.log.enums.BusinessType;
21 21
 import org.dromara.common.excel.utils.ExcelUtil;
22
-import org.dromara.backstage.consumption.service.IXfConsumedetailoriginalService;
22
+import org.dromara.backstage.consumption.service.IXfConsumeDetailOriginalService;
23 23
 import org.dromara.common.mybatis.core.page.TableDataInfo;
24 24
 
25 25
 /**
@@ -35,7 +35,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
35 35
 @RequestMapping("/consumption/xfConsumedetailoriginal")
36 36
 public class XfConsumeDetailOriginalController extends BaseController {
37 37
 
38
-    private final IXfConsumedetailoriginalService xfConsumedetailoriginalService;
38
+    private final IXfConsumeDetailOriginalService xfConsumedetailoriginalService;
39 39
 
40 40
     /**
41 41
      * 查询原始消费记录列表

+ 12 - 10
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfConsumeDetailOriginal.java

@@ -4,6 +4,8 @@ import org.dromara.common.tenant.core.TenantEntity;
4 4
 import com.baomidou.mybatisplus.annotation.*;
5 5
 import lombok.Data;
6 6
 import lombok.EqualsAndHashCode;
7
+
8
+import java.math.BigDecimal;
7 9
 import java.util.Date;
8 10
 
9 11
 import java.io.Serial;
@@ -29,7 +31,7 @@ public class XfConsumeDetailOriginal extends TenantEntity {
29 31
     private String originalId;
30 32
 
31 33
     /**
32
-     * 记录Id
34
+     * 记录Id,自增长,唯一id值,用于应答给消费设备
33 35
      */
34 36
     private Long recordId;
35 37
 
@@ -66,7 +68,7 @@ public class XfConsumeDetailOriginal extends TenantEntity {
66 68
     /**
67 69
      * 消费金额
68 70
      */
69
-    private Long consumeMoney;
71
+    private BigDecimal consumeMoney;
70 72
 
71 73
     /**
72 74
      * 卡流水号
@@ -81,7 +83,7 @@ public class XfConsumeDetailOriginal extends TenantEntity {
81 83
     /**
82 84
      * 卡上余额
83 85
      */
84
-    private Long cardValue;
86
+    private BigDecimal cardValue;
85 87
 
86 88
     /**
87 89
      * 卡使用次数
@@ -91,7 +93,7 @@ public class XfConsumeDetailOriginal extends TenantEntity {
91 93
     /**
92 94
      * 消费账户金额
93 95
      */
94
-    private Long consumeBalance;
96
+    private BigDecimal consumeBalance;
95 97
 
96 98
     /**
97 99
      * 设备机号
@@ -111,7 +113,7 @@ public class XfConsumeDetailOriginal extends TenantEntity {
111 113
     /**
112 114
      * 是否已处理(和灰记录处理有关)
113 115
      */
114
-    private Long anlysFlag;
116
+    private Long analysisFlag;
115 117
 
116 118
     /**
117 119
      * 消费记录标志
@@ -131,27 +133,27 @@ public class XfConsumeDetailOriginal extends TenantEntity {
131 133
     /**
132 134
      * 水控金额
133 135
      */
134
-    private Long waterValue;
136
+    private BigDecimal waterValue;
135 137
 
136 138
     /**
137 139
      * 水控历史余额
138 140
      */
139
-    private Long waterHistoryValue;
141
+    private BigDecimal waterHistoryValue;
140 142
 
141 143
     /**
142 144
      * 水控当天总和
143 145
      */
144
-    private Long waterDaySum;
146
+    private BigDecimal waterDaySum;
145 147
 
146 148
     /**
147 149
      * 水控错误余额
148 150
      */
149
-    private Long waterErrValue;
151
+    private BigDecimal waterErrValue;
150 152
 
151 153
     /**
152 154
      * 水控错误消费金额
153 155
      */
154
-    private Long waterErrMoney;
156
+    private BigDecimal waterErrMoney;
155 157
 
156 158
     /**
157 159
      * 营业员Id

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

@@ -0,0 +1,102 @@
1
+package org.dromara.backstage.consumption.domain.bo;
2
+
3
+import lombok.Data;
4
+import org.dromara.common.core.constant.ConsumeTypeConstants;
5
+import org.dromara.common.core.enums.CreditTypeEnum;
6
+
7
+import java.io.Serial;
8
+import java.io.Serializable;
9
+import java.math.BigDecimal;
10
+import java.util.Date;
11
+
12
+/**
13
+ * name: consumeRecordBo
14
+ * package: org.dromara.backstage.consumption.domain.bo
15
+ * description: 消费记录业务对象,用在安卓消费机上传消费记录
16
+ * date: 2024-10-14 09:49:50 09:49
17
+ *
18
+ * @author luoyibo
19
+ * @version 0.1
20
+ * @since JDK 1.8
21
+ */
22
+@Data
23
+public class ConsumeRecordBo implements Serializable {
24
+
25
+    @Serial
26
+    private static final long serialVersionUID = 5990669486873024387L;
27
+
28
+    /**
29
+     * 消费账户金额
30
+     */
31
+    private BigDecimal consumeValue;
32
+    /**
33
+     * 消费日期 DateUtils.formatDate(new Date(), "yyyy-MM-dd'T'HH:mm:ss");
34
+     */
35
+    private Date consumeDate;
36
+
37
+    /**
38
+     * 消费账户Id
39
+     */
40
+    private BigDecimal cardValueXY;
41
+    /**
42
+     * 消费账户Id
43
+     */
44
+    private BigDecimal cardValue;
45
+    /**
46
+     * 消费账户Id
47
+     */
48
+    private Long cardID;
49
+    /**
50
+     * 消费账户Id
51
+     */
52
+    private Long employeeID;
53
+    /**
54
+     * 消费账户Id
55
+     */
56
+    private Long factoryFixID;
57
+    /**
58
+     * 消费账户Id
59
+     */
60
+    private Long termID;
61
+    /**
62
+     * 消费账户Id
63
+     */
64
+    private Long mathineTermID;
65
+    /**
66
+     * 消费账户Id
67
+     */
68
+    private Long termRecordID;
69
+    /**
70
+     * 消费账户Id
71
+     */
72
+    private String employeeName;
73
+    /**
74
+     * 消费账户Id
75
+     */
76
+    private String employeeStrID;
77
+    /**
78
+     * 消费账户Id
79
+     */
80
+    private Long oriRecordID = 0L;
81
+    /**
82
+     * 消费账户Id oriRecordID一样
83
+     */
84
+    private Long id = 0L;
85
+    /**
86
+     * 消费账户Id
87
+     */
88
+    private Integer posRecordState = 0;
89
+    /**
90
+     * 消费账户Id
91
+     */
92
+    private Long operatorID = 0L;
93
+    /**
94
+     * 消费账户Id
95
+     */
96
+    private Long consumeDetailId = 0L;
97
+
98
+    /**
99
+     * 交易类型
100
+     */
101
+    private CreditTypeEnum creditType;
102
+}

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

@@ -30,7 +30,7 @@ import java.util.Date;
30 30
 public class ConsumptionBo extends BaseEntity {
31 31
     //region 消费业务基础属性
32 32
     /**
33
-     * 消费账户Id
33
+     * 人员账户Id
34 34
      */
35 35
     private Long userId;
36 36
 
@@ -39,14 +39,23 @@ public class ConsumptionBo extends BaseEntity {
39 39
      */
40 40
     private String userNumb;
41 41
 
42
+    /**
43
+     * 人员姓名
44
+     */
45
+    private String realName;
46
+
42 47
     /**
43 48
      * 卡流水号
44 49
      */
45 50
     private Long cardNo;
51
+
52
+    /**
53
+     * 物理卡号
54
+     */
55
+    private Long factoryId;
46 56
     /**
47 57
      * 钱包代码
48 58
      */
49
-    @NotBlank(message = "消费钱包不能为空", groups = { AddGroup.class, EditGroup.class })
50 59
     private String bagType;
51 60
 
52 61
     /**
@@ -66,16 +75,33 @@ public class ConsumptionBo extends BaseEntity {
66 75
      */
67 76
     @NotNull(message = "消费设备不能为空", groups = { AddGroup.class, EditGroup.class })
68 77
     private Long termNo;
78
+
79
+    /**
80
+     * 机器流水号
81
+     */
82
+    private Long termRecordId;
69 83
     /**
70 84
      * 餐类Id
71 85
      */
72
-    @NotNull(message = "消费餐类不能为空", groups = { AddGroup.class, EditGroup.class })
73 86
     private Long mealType;
74 87
     /**
75
-     * 餐类Id
88
+     * 原始记录Id
76 89
      */
77
-    @NotNull(message = "消费记录Id不能为空", groups = { AddGroup.class, EditGroup.class })
78 90
     private String consumeId;
91
+
92
+    /**
93
+     * 记录Id
94
+     */
95
+    private Long recordId;
96
+    /**
97
+     * 消费记录标志位?
98
+     */
99
+    private Long recordStatus;
100
+
101
+    /**
102
+     * 状态标识(记录消费类型?)
103
+     */
104
+    private Integer statusFlag;
79 105
     /**
80 106
      * 系统使用类型
81 107
      */
@@ -89,6 +115,10 @@ public class ConsumptionBo extends BaseEntity {
89 115
      */
90 116
     private String operatorName;
91 117
 
118
+    /**
119
+     * 交易类型
120
+     */
121
+    private CreditTypeEnum creditType;
92 122
     //endregion
93 123
 
94 124
     //region 错扣补款属性

+ 14 - 13
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfConsumeDetailOriginalBo.java

@@ -8,6 +8,8 @@ import io.github.linpeilie.annotations.AutoMapper;
8 8
 import lombok.Data;
9 9
 import lombok.EqualsAndHashCode;
10 10
 import jakarta.validation.constraints.*;
11
+
12
+import java.math.BigDecimal;
11 13
 import java.util.Date;
12 14
 
13 15
 /**
@@ -28,9 +30,8 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
28 30
     private String originalId;
29 31
 
30 32
     /**
31
-     * 记录Id
33
+     * 记录Id,自增长
32 34
      */
33
-    @NotNull(message = "记录Id不能为空", groups = { AddGroup.class, EditGroup.class })
34 35
     private Long recordId;
35 36
 
36 37
     /**
@@ -69,7 +70,7 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
69 70
      * 消费金额
70 71
      */
71 72
     @NotNull(message = "消费金额不能为空", groups = { AddGroup.class, EditGroup.class })
72
-    private Long consumeMoney;
73
+    private BigDecimal consumeMoney;
73 74
 
74 75
     /**
75 76
      * 卡流水号
@@ -87,7 +88,7 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
87 88
      * 卡上余额
88 89
      */
89 90
     @NotNull(message = "卡上余额不能为空", groups = { AddGroup.class, EditGroup.class })
90
-    private Long cardValue;
91
+    private BigDecimal cardValue;
91 92
 
92 93
     /**
93 94
      * 卡使用次数
@@ -97,13 +98,13 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
97 98
     /**
98 99
      * 消费账户金额
99 100
      */
100
-    private Long consumeBalance;
101
+    private BigDecimal consumeBalance;
101 102
 
102 103
     /**
103 104
      * 设备机号
104 105
      */
105 106
     @NotNull(message = "设备机号不能为空", groups = { AddGroup.class, EditGroup.class })
106
-    private Long termNo;
107
+    private Integer termNo;
107 108
 
108 109
     /**
109 110
      * 设备名称
@@ -118,7 +119,7 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
118 119
     /**
119 120
      * 是否已处理(和灰记录处理有关)
120 121
      */
121
-    private Long anlysFlag;
122
+    private Long analysisFlag;
122 123
 
123 124
     /**
124 125
      * 消费记录标志
@@ -128,7 +129,7 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
128 129
     /**
129 130
      * 状态标识(记录消费类型?)
130 131
      */
131
-    private Long statusFlag;
132
+    private Integer statusFlag;
132 133
 
133 134
     /**
134 135
      * 防伪验证码(记录消费模式的中文信息)
@@ -138,27 +139,27 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
138 139
     /**
139 140
      * 水控金额
140 141
      */
141
-    private Long waterValue;
142
+    private BigDecimal waterValue;
142 143
 
143 144
     /**
144 145
      * 水控历史余额
145 146
      */
146
-    private Long waterHistoryValue;
147
+    private BigDecimal waterHistoryValue;
147 148
 
148 149
     /**
149 150
      * 水控当天总和
150 151
      */
151
-    private Long waterDaySum;
152
+    private BigDecimal waterDaySum;
152 153
 
153 154
     /**
154 155
      * 水控错误余额
155 156
      */
156
-    private Long waterErrValue;
157
+    private BigDecimal waterErrValue;
157 158
 
158 159
     /**
159 160
      * 水控错误消费金额
160 161
      */
161
-    private Long waterErrMoney;
162
+    private BigDecimal waterErrMoney;
162 163
 
163 164
     /**
164 165
      * 营业员Id

+ 40 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteConsumeServiceImpl.java

@@ -0,0 +1,40 @@
1
+package org.dromara.backstage.consumption.dubbo;
2
+
3
+import cn.hutool.core.bean.BeanUtil;
4
+import lombok.RequiredArgsConstructor;
5
+import org.apache.dubbo.config.annotation.DubboService;
6
+import org.dromara.backstage.api.RemoteConsumeService;
7
+import org.dromara.backstage.api.domain.bo.RemoteConsumptionBo;
8
+import org.dromara.backstage.business.consume.strategy.Impl.ConsumeStrategyContent;
9
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
10
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailOriginalVo;
11
+import org.dromara.common.core.domain.R;
12
+import org.springframework.stereotype.Service;
13
+
14
+/**
15
+ * name: RemoteConsumeServiceImpl
16
+ * package: org.dromara.backstage.consumption.dubbo
17
+ * description: 消费远程服务实现
18
+ * date: 2024-10-15 14:32:43 14:32
19
+ *
20
+ * @author luoyibo
21
+ * @version 0.1
22
+ * @since JDK 1.8
23
+ */
24
+@RequiredArgsConstructor
25
+@Service
26
+@DubboService
27
+public class RemoteConsumeServiceImpl implements RemoteConsumeService {
28
+    private final ConsumeStrategyContent consumeStrategyContent;
29
+    @Override
30
+    public R<Object> receiveConsumeOriginalRecord(RemoteConsumptionBo bo) {
31
+        ConsumptionBo consumptionBo = BeanUtil.copyProperties(bo, ConsumptionBo.class);
32
+
33
+        R<Object> result = consumeStrategyContent.createOrder(consumptionBo);
34
+        XfConsumeDetailOriginalVo vo = (XfConsumeDetailOriginalVo)result.getData();
35
+
36
+        consumptionBo.setRecordId(vo.getRecordId());
37
+        consumptionBo.setConsumeId(vo.getOriginalId());
38
+        return consumeStrategyContent.postOrder(consumptionBo);
39
+    }
40
+}

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfConsumedetailoriginalService.java

@@ -14,7 +14,7 @@ import java.util.List;
14 14
  * @author LionLi
15 15
  * @date 2024-08-15
16 16
  */
17
-public interface IXfConsumedetailoriginalService {
17
+public interface IXfConsumeDetailOriginalService {
18 18
 
19 19
     /**
20 20
      * 查询原始消费记录

+ 3 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumedetailoriginalServiceImpl.java

@@ -14,7 +14,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
14 14
 import lombok.RequiredArgsConstructor;
15 15
 import org.springframework.stereotype.Service;
16 16
 import org.dromara.backstage.consumption.mapper.XfConsumeDetailOriginalMapper;
17
-import org.dromara.backstage.consumption.service.IXfConsumedetailoriginalService;
17
+import org.dromara.backstage.consumption.service.IXfConsumeDetailOriginalService;
18 18
 
19 19
 import java.util.List;
20 20
 import java.util.Map;
@@ -29,7 +29,7 @@ import java.util.Collection;
29 29
 @RequiredArgsConstructor
30 30
 @Service
31 31
 @DS("storage")
32
-public class XfConsumedetailoriginalServiceImpl implements IXfConsumedetailoriginalService {
32
+public class XfConsumeDetailOriginalServiceImpl implements IXfConsumeDetailOriginalService {
33 33
 
34 34
     private final XfConsumeDetailOriginalMapper baseMapper;
35 35
 
@@ -89,7 +89,7 @@ public class XfConsumedetailoriginalServiceImpl implements IXfConsumedetailorigi
89 89
         lqw.eq(bo.getTermNo() != null, XfConsumeDetailOriginal::getTermNo, bo.getTermNo());
90 90
         lqw.like(StringUtils.isNotBlank(bo.getTermName()), XfConsumeDetailOriginal::getTermName, bo.getTermName());
91 91
         lqw.eq(bo.getTermRecordId() != null, XfConsumeDetailOriginal::getTermRecordId, bo.getTermRecordId());
92
-        lqw.eq(bo.getAnlysFlag() != null, XfConsumeDetailOriginal::getAnlysFlag, bo.getAnlysFlag());
92
+        lqw.eq(bo.getAnalysisFlag() != null, XfConsumeDetailOriginal::getAnalysisFlag, bo.getAnalysisFlag());
93 93
         lqw.eq(bo.getDataFlag() != null, XfConsumeDetailOriginal::getDataFlag, bo.getDataFlag());
94 94
         lqw.eq(bo.getStatusFlag() != null, XfConsumeDetailOriginal::getStatusFlag, bo.getStatusFlag());
95 95
         lqw.eq(StringUtils.isNotBlank(bo.getDigitalSign()), XfConsumeDetailOriginal::getDigitalSign, bo.getDigitalSign());

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumeDetailServiceImpl.java

@@ -63,7 +63,7 @@ public class XfConsumeDetailServiceImpl implements IXfConsumeDetailService {
63 63
         if(beginDate != null && endDate != null){
64 64
             lqw.between(XfConsumeDetail::getConsumeDate, beginDate + " 00:00:00", endDate + " 23:59:59");
65 65
         }
66
-        lqw.orderByDesc(XfConsumeDetail::getConsumeDate);
66
+        //lqw.orderByDesc(XfConsumeDetail::getConsumeDate);
67 67
         Page<XfConsumeDetailVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
68 68
         return TableDataInfo.build(result);
69 69
     }

+ 1 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfTermTotalServiceImpl.java

@@ -1,7 +1,6 @@
1 1
 package org.dromara.backstage.consumption.service.impl;
2 2
 
3 3
 import cn.hutool.core.util.ObjUtil;
4
-import com.baomidou.dynamic.datasource.annotation.DS;
5 4
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
6 5
 import org.dromara.common.core.utils.MapstructUtils;
7 6
 import org.dromara.common.core.utils.StringUtils;
@@ -30,7 +29,6 @@ import java.util.Collection;
30 29
  */
31 30
 @RequiredArgsConstructor
32 31
 @Service
33
-@DS("storage")
34 32
 public class XfTermTotalServiceImpl implements IXfTermTotalService {
35 33
 
36 34
     private final XfTermTotalMapper baseMapper;
@@ -188,7 +186,7 @@ public class XfTermTotalServiceImpl implements IXfTermTotalService {
188 186
             lqw.set(XfTermTotal::getErrFillMoney,entity.getErrFillMoney().add(bo.getErrFillMoney()));
189 187
         }
190 188
         if(bo.getMealCount()!=null){
191
-            lqw.set(XfTermTotal::getMealCount, entity.getErrFillCount()+1);
189
+            lqw.set(XfTermTotal::getMealCount, entity.getMealCount()+1);
192 190
         }
193 191
         if(bo.getMealAmount()!=null){
194 192
             lqw.set(XfTermTotal::getMealAmount,entity.getMealAmount().add(bo.getMealAmount()));

File diff suppressed because it is too large
+ 82 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/KafkaNormalConsumer.java


+ 33 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/domain/bo/KafkaHeader.java

@@ -0,0 +1,33 @@
1
+package org.dromara.backstage.mq.domain.bo;
2
+
3
+import lombok.Data;
4
+
5
+/**
6
+ * name: KafkaHeader
7
+ * package: org.dromara.stream.domain.bo
8
+ * description: kafka消息头
9
+ * date: 2024-10-15 11:22:26 11:22
10
+ *
11
+ * @author luoyibo
12
+ * @version 0.1
13
+ * @since JDK 1.8
14
+ */
15
+@Data
16
+public class KafkaHeader {
17
+    /**
18
+     * 发送方
19
+     */
20
+    private String sender;
21
+    /**
22
+     * 时间戳
23
+     */
24
+    private Long timestamp;
25
+    /**
26
+     * 事件类型
27
+     */
28
+    private String eventType;
29
+    /**
30
+     * 事件Id
31
+     */
32
+    private String eventId;
33
+}

+ 19 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/domain/bo/KafkaMessage.java

@@ -0,0 +1,19 @@
1
+package org.dromara.backstage.mq.domain.bo;
2
+
3
+import lombok.Data;
4
+/**
5
+ * name: KafkaMessage
6
+ * package: org.dromara.stream.domain.bo
7
+ * description: Kafka消息内容
8
+ * date: 2024-10-15 11:28:02 11:28
9
+ *
10
+ * @author luoyibo
11
+ * @version 0.1
12
+ * @since JDK 1.8
13
+ */
14
+@Data
15
+public class KafkaMessage<T> {
16
+    private KafkaHeader header=new KafkaHeader();
17
+
18
+    private T body;
19
+}

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

@@ -105,4 +105,6 @@ public interface IPtBagService {
105 105
      * @return 账户钱包
106 106
      */
107 107
     PtBagVo queryByUserBagCode(Long userId,String bagCode);
108
+
109
+
108 110
 }

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

@@ -158,4 +158,12 @@ public interface IPtUserAccountService {
158 158
      * @return
159 159
      */
160 160
     int photoBatchUpload(MultipartFile[] files, String uploadPath, String userPath) throws IOException;
161
+
162
+    /**
163
+     * 根据人员编号与姓名查询人员信息
164
+     * @param realName 人员姓名
165
+     * @param userNumb 人员编号
166
+     * @return 人员信息
167
+     */
168
+    PtUserAccountVo queryByNameAndNumb(String realName,String userNumb);
161 169
 }

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

@@ -429,4 +429,22 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
429 429
         }
430 430
         return okNum;
431 431
     }
432
+
433
+    /**
434
+     * 根据人员编号与姓名查询人员信息
435
+     * @param realName 人员姓名
436
+     * @param userNumb 人员编号
437
+     * @return 人员信息
438
+     */
439
+    @Override
440
+    public PtUserAccountVo queryByNameAndNumb(String realName, String userNumb) {
441
+        PtUserAccountVo vo = baseMapper.selectVoOne(Wrappers.<PtUserAccount>lambdaQuery()
442
+            .eq(PtUserAccount::getRealName,realName)
443
+            .eq(PtUserAccount::getUserNumb,userNumb));
444
+        if(vo!=null) {
445
+            String deptName = remoteDeptService.selectDeptNameByIds(vo.getDeptId().toString());
446
+            vo.setDeptName(deptName);
447
+        }
448
+        return vo;
449
+    }
432 450
 }

+ 26 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/task/InitRunner.java

@@ -0,0 +1,26 @@
1
+package org.dromara.backstage.task;
2
+
3
+import lombok.RequiredArgsConstructor;
4
+import lombok.extern.slf4j.Slf4j;
5
+import org.springframework.boot.CommandLineRunner;
6
+import org.springframework.stereotype.Component;
7
+
8
+/**
9
+ * name: InitRunner
10
+ * package: org.dromara.backstage.task
11
+ * description: 系统启动时的初始化工作
12
+ * date: 2024-09-09 10:32:29 10:32
13
+ *
14
+ * @author yubo
15
+ * @version 0.1
16
+ * @since JDK 1.8
17
+ */
18
+@RequiredArgsConstructor
19
+@Component
20
+@Slf4j
21
+public class InitRunner implements CommandLineRunner {
22
+    @Override
23
+    public void run(String... args) throws Exception {
24
+
25
+    }
26
+}