Ver Fonte

feature: kafka消费数据上传

luoyb há 1 ano atrás
pai
commit
67e6847f42
30 ficheiros alterados com 1056 adições e 39 exclusões
  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 @@
+package org.dromara.backstage.api;
+
+import org.dromara.backstage.api.domain.bo.RemoteConsumptionBo;
+import org.dromara.common.core.domain.R;
+
+/**
+ * name: RemoteConsumeService
+ * package: org.dromara.backstage.api
+ * description: 消费服务
+ * date: 2024-10-15 14:19:13 14:19
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface RemoteConsumeService {
+
+    R<Object> receiveConsumeOriginalRecord(RemoteConsumptionBo bo);
+}

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

@@ -0,0 +1,133 @@
+package org.dromara.backstage.api.domain.bo;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.dromara.common.core.enums.CreditTypeEnum;
+import org.dromara.common.core.enums.SystemUseTypeEnum;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * name: RemoteConsumptionBo
+ * package: org.dromara.backstage.api.domain.bo
+ * description: 消费服务远程访问业务模型
+ * date: 2024-10-15 14:20:35 14:20
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@NoArgsConstructor
+public class RemoteConsumptionBo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 7218154172363464218L;
+
+    //region 消费业务基础属性
+    /**
+     * 人员账户Id
+     */
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 人员姓名
+     */
+    private String realName;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
+    /**
+     * 钱包代码
+     */
+    private String bagType;
+
+    /**
+     * 消费金额
+     */
+    private BigDecimal consumeMoney;
+
+    /**
+     * 消费日期
+     */
+    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;
+    //endregion
+
+    //region 错扣补款属性
+    /**
+     * 补款日期
+     */
+    private Date fillDate;
+
+    /**
+     * 操作金额
+     */
+    private BigDecimal operatorMoney;
+    //endregion
+}

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

@@ -0,0 +1,23 @@
+package org.dromara.common.core.constant;
+
+/**
+ * name: ConsumeTypeConstants
+ * package: org.dromara.common.core.constant
+ * description: 消费类型常量
+ * date: 2024-10-14 12:43:07 12:43
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface ConsumeTypeConstants {
+    /**
+     * 消费机消费
+     */
+    String TERM_CONSUME="TERM_CONSUME";
+    /**
+     * 错扣补款消费
+     */
+    String ERROR_FILL="ERROR_FILL";
+
+}

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

@@ -118,7 +118,11 @@ public enum CreditTypeEnum {
     /**
      * 微信充值
      */
-    WECHAT_RECHARGE(24600, "微信充值");
+    WECHAT_RECHARGE(24600, "微信充值"),
+    /**
+     * 设备消费
+     */
+    TERM_CONSUME(25000, "设备消费");
 
     private final Integer code;
     private final String message;

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

@@ -113,6 +113,10 @@
             <version>2.2.0</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.kafka</groupId>
+            <artifactId>spring-kafka</artifactId>
+        </dependency>
     </dependencies>
 
     <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
     List<PtMealTypeVo> validateSelect(@Param("typeId") String typeId, @Param("mealId") Long mealId
         , @Param("beginTime") String beginTime, @Param("endTime") String endTime);
 
+    @Select("SELECT * FROM t_pt_mealType tpmt WHERE #{mealTime}>begin_Time " +
+        "AND #{mealTime}<end_time")
+    List<PtMealTypeVo> queryVoByTime(@Param("mealTime") String mealTime);
 }

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

@@ -74,4 +74,11 @@ public interface IPtMealtypeService {
      * @return 餐类视图
      */
     PtMealTypeVo queryVoByTypeId(String typeId);
+
+    /**
+     * 根据就餐时间查询对应的餐类
+     * @param mealTime 就餐时间
+     * @return 餐类
+     */
+    PtMealTypeVo queryVoByTime(String mealTime);
 }

+ 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 {
         return baseMapper.selectVoOne(new LambdaQueryWrapper<PtMealType>()
             .eq(PtMealType::getTypeId, typeId));
     }
+    /**
+     * 根据就餐时间查询对应的餐类
+     * @param mealTime 就餐时间
+     * @return 餐类
+     */
+    @Override
+    public PtMealTypeVo queryVoByTime(String mealTime) {
+        List<PtMealTypeVo> voList = baseMapper.queryVoByTime(mealTime);
+        if(voList!=null && !voList.isEmpty()){
+            return voList.get(0);
+        } else {
+            return null;
+        }
+    }
 }

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

@@ -0,0 +1,247 @@
+package org.dromara.backstage.business.consume;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.backstage.basics.domain.vo.PtMealTypeVo;
+import org.dromara.backstage.basics.service.IPtMealtypeService;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.backstage.consumption.domain.bo.*;
+import org.dromara.backstage.consumption.domain.vo.*;
+import org.dromara.backstage.consumption.service.*;
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.backstage.payment.service.IPtBagService;
+import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.dromara.common.core.enums.BalanceUpdateEnum;
+import org.dromara.common.core.enums.SystemUseTypeEnum;
+import org.dromara.common.core.utils.RecordIdUtils;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * name: ConsumeBusiness
+ * package: org.dromara.backstage.business.consume
+ * description: 消费业务处理逻辑
+ * date: 2024-10-14 10:30:27 10:30
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class ConsumeBusiness {
+
+    private final IXfConsumeDetailOriginalService consumeDetailOriginalService;
+    private final IXfConsumeDetailService consumeDetailService;
+    private final IPtUserAccountService userAccountService;
+    private final IPtCardService cardService;
+    private final IXfTermService termService;
+    private final IPtMealtypeService mealTypeService;
+    private final IPtBagService bagService;
+    private final IXfUserTotalService userTotalService;
+    private final IXfTermTotalService termTotalService;
+
+    /**
+     * 将消费机上传的消费数据转换成系统的消费业务对象
+     *
+     * @param recordBo 消费记录数据
+     * @return 消费业务对象
+     */
+    public ConsumptionBo recordToBusiness(ConsumeRecordBo recordBo) {
+        ConsumptionBo consumptionBo = new ConsumptionBo();
+
+        consumptionBo.setConsumeMoney(recordBo.getConsumeValue());
+        consumptionBo.setConsumeDate(recordBo.getConsumeDate());
+        consumptionBo.setTermRecordId(recordBo.getTermRecordID());
+        if (recordBo.getOriRecordID() != 0) {
+            consumptionBo.setRecordId(recordBo.getOriRecordID());
+        }
+        consumptionBo.setCardNo(recordBo.getCardID());
+        consumptionBo.setFactoryId(recordBo.getFactoryFixID());
+        consumptionBo.setUserId(recordBo.getEmployeeID());
+        consumptionBo.setUserNumb(recordBo.getEmployeeStrID());
+        consumptionBo.setRealName(recordBo.getEmployeeName());
+        consumptionBo.setRecordStatus(recordBo.getPosRecordState().longValue());
+        Long termNo = recordBo.getTermID() == null ? recordBo.getMathineTermID() : recordBo.getTermID();
+        consumptionBo.setTermNo(termNo);
+        consumptionBo.setCreditType(recordBo.getCreditType());
+        return consumptionBo;
+    }
+
+    public XfConsumeDetailOriginalVo createConsumeOriginalRecord(ConsumptionBo consumeBo, PtUserAccountVo accountVo) {
+        String originalId = getRecordKeyId(consumeBo.getTermNo().intValue(), consumeBo.getTermRecordId(), accountVo.getUserNo(), 0);
+
+        XfConsumeDetailOriginalBo originalBo = new XfConsumeDetailOriginalBo();
+        BeanUtil.copyProperties(consumeBo, originalBo);
+        originalBo.setOriginalId(originalId);
+        originalBo.setDataFlag(0L);
+        originalBo.setAnalysisFlag(0L);
+        //这项实际要根据消费的扣款模式来赋值
+        BigDecimal cardValue = this.getAccountBalance(consumeBo, accountVo);
+        originalBo.setCardValue(cardValue);
+        originalBo.setConsumeBalance(cardValue);
+        originalBo.setDigitalSign("补助消费");
+        originalBo.setUserId(accountVo.getUserId());
+
+        consumeDetailOriginalService.insertByBo(originalBo);
+
+        return consumeDetailOriginalService.queryById(originalBo.getOriginalId());
+    }
+
+    /**
+     * 生成消费明细表的32位主键Id
+     *
+     * @param termNo       设备编号
+     * @param termRecordId 设备流水号
+     * @param userNo       人员流水号
+     * @return 生成的记录Id
+     */
+    @NotNull
+    private String getRecordKeyId(Integer termNo, Long termRecordId, Long userNo, Integer bagCode) {
+        return RecordIdUtils.getRecordId(new Date(), termNo.shortValue(), termRecordId.shortValue(), userNo.intValue(), bagCode);
+    }
+
+    public PtUserAccountVo getPtUserAccountVo(ConsumptionBo recordBo) {
+        return userAccountService.queryByNameAndNumb(recordBo.getRealName(),recordBo.getUserNumb());
+    }
+
+    public PtCardVo getPtCardVo(ConsumptionBo recordBo) {
+        PtCardVo ptCardVo;
+        if (recordBo.getCardNo() != null && recordBo.getCardNo() > 0) {
+            //如果传入了cardNo,根据cardNo查询卡片信息
+            ptCardVo = cardService.queryCardByCardNo(recordBo.getCardNo());
+        } else {
+            //查询当前人的正常主卡
+            ptCardVo = cardService.queryMainCardByUserId(recordBo.getUserId());
+        }
+        return ptCardVo;
+    }
+
+    public XfTermVo getXfTermVo(ConsumptionBo recordBo) {
+        return termService.queryByNo(recordBo.getTermNo());
+    }
+
+    public PtMealTypeVo getMealTypeVo(ConsumptionBo recordBo) {
+        PtMealTypeVo vo = mealTypeService.queryVoByTime(DateUtil.format(recordBo.getConsumeDate(), "HH:mm:ss"));
+        if (vo == null) {
+            vo = new PtMealTypeVo();
+            vo.setTypeId("0");
+            vo.setMealName("未知");
+        }
+        return vo;
+    }
+
+    public List<PtBagVo> getBagVo(PtUserAccountVo userAccountVo, XfTermVo xfTermVo) {
+        // TODO 2024-10-14 15:18:58 luoyibo 这里实际需要根据消费机的扣费类型来获取消费钱包,暂时写死为补助钱包
+        PtBagVo vo = bagService.queryByUserBagCode(userAccountVo.getUserId(), "3");
+        List<PtBagVo> list = new ArrayList<>();
+        list.add(vo);
+        return list;
+    }
+
+    public BigDecimal getAccountBalance(ConsumptionBo recordBo,PtUserAccountVo userAccountVo) {
+        BigDecimal beforeValue = new BigDecimal(bagService.selectAccountBalanceByIds(userAccountVo.getUserId().toString()));
+        return beforeValue.subtract(recordBo.getConsumeMoney());
+    }
+
+    public XfConsumeDetailVo createConsumeRecord(ConsumptionBo bo, PtUserAccountVo userAccountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtMealTypeVo mealTypeVo, String remark) {
+        String recordId = getRecordKeyId(termVo.getTermNo().intValue(), bo.getTermNo(), userAccountVo.getUserNo(), Integer.valueOf(bagVo.getBagCode()));
+        XfConsumeDetailBo consumeDetailBo = new XfConsumeDetailBo();
+        BeanUtil.copyProperties(bo, consumeDetailBo);
+        consumeDetailBo.setConsumeId(recordId);
+        //设置消费账户信息
+        BeanUtil.copyProperties(userAccountVo, consumeDetailBo);
+        //设置消费信息
+        consumeDetailBo.setConsumeDate(bo.getConsumeDate());
+        //设置卡片信息
+        consumeDetailBo.setCardNo(cardVo.getCardNo());
+        consumeDetailBo.setFactoryId(cardVo.getFactoryId());
+        BigDecimal cardValue = this.getAccountBalance(bo, userAccountVo);
+        consumeDetailBo.setCardValue(cardValue);
+        consumeDetailBo.setConsumeBalance(cardValue);
+        //设置设备信息
+        BeanUtil.copyProperties(termVo, consumeDetailBo);
+        //设置操作员信息
+        //consumeDetailBo.setOperatorId(bo.getOperatorId());
+        //consumeDetailBo.setOperatorName(bo.getOperatorName());
+        //设置餐类信息
+        consumeDetailBo.setMealType(Long.valueOf(mealTypeVo.getTypeId()));
+        consumeDetailBo.setMealName(mealTypeVo.getMealName());
+        //设置钱包信息
+        consumeDetailBo.setBagType(bagVo.getBagCode());
+        //错扣补款设置statusFlag为0
+        consumeDetailBo.setRecordId(bo.getRecordId());
+        consumeDetailBo.setRemark(remark);
+
+        return consumeDetailService.createConsumeDetailRecord(consumeDetailBo);
+    }
+
+    /**
+     * 创建或更新人员日统计表
+     *
+     * @param bo        消费业务对象
+     * @param accountVo 人员账户视图
+     * @param cardVo    账户卡片视图
+     * @return 更新后的人员日统计表
+     */
+    public XfUserTotalVo createOrUpdateUserTotal(ConsumptionBo bo, PtUserAccountVo accountVo, PtCardVo cardVo) {
+        XfUserTotalBo xfUserTotalBo = new XfUserTotalBo();
+        BeanUtil.copyProperties(accountVo, xfUserTotalBo);
+        xfUserTotalBo.setDeptName(accountVo.getDeptName());
+        xfUserTotalBo.setCardNo(cardVo.getCardNo());
+        xfUserTotalBo.setDateDay(DateUtil.format(new Date(), "yyyy-MM-dd"));
+        xfUserTotalBo.setUseType(SystemUseTypeEnum.CONSUME.code());
+        xfUserTotalBo.setConsumeMoney(bo.getConsumeMoney());
+
+        return userTotalService.createOrUpdateUserTotal(xfUserTotalBo);
+    }
+
+    /**
+     * 创建或更新设备日统计
+     *
+     * @param bo         消费业务对象
+     * @param termVo     设备视图
+     * @param mealTypeVo 餐类视图
+     * @return 日统计视图
+     */
+    public XfTermTotalVo createOrUpdateTermTotal(ConsumptionBo bo, XfTermVo termVo, PtMealTypeVo mealTypeVo) {
+        XfTermTotalBo termTotalBo = new XfTermTotalBo();
+        BeanUtil.copyProperties(termVo, termTotalBo);
+        termTotalBo.setDateDay(DateUtil.format(new Date(), "yyyy-MM-dd"));
+        termTotalBo.setMealType(Long.valueOf(mealTypeVo.getTypeId()));
+        termTotalBo.setMealCount(1L);
+        termTotalBo.setMealAmount(bo.getConsumeMoney());
+        termTotalBo.setUseType(SystemUseTypeEnum.CONSUME.code());
+
+        return termTotalService.createOrUpdateTermTotal(termTotalBo);
+    }
+
+    /**
+     * 更新账户钱包余额
+     *
+     * @param bo    消费业务对象
+     * @param bagVo 账户钱包视图
+     * @return 更新后的账户钱包
+     */
+    public PtBagVo updateBalance(ConsumptionBo bo, PtBagVo bagVo) {
+        PtBagBo bagBo = new PtBagBo();
+        bagBo.setUserId(bagVo.getUserId());
+        bagBo.setBagId(bagVo.getBagId());
+        bagBo.setBagCode(bagVo.getBagCode());
+        bagBo.setReceiptMoney(bo.getConsumeMoney());
+        bagBo.setOperationMode(BalanceUpdateEnum.CONSUME);
+        return bagService.updateBalanceByBo(bagBo);
+    }
+}

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

@@ -0,0 +1,31 @@
+package org.dromara.backstage.business.consume.strategy;
+
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
+import org.dromara.common.core.domain.R;
+
+/**
+ * name: IConsumeStrategy
+ * package: org.dromara.backstage.business.consume.strategy
+ * description: 消费业务处理策略
+ * date: 2024-10-14 12:36:17 12:36
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface IConsumeStrategy {
+    /**
+     * 生成消费原始订单
+     *
+     * @param recordBo 消费记录业务模型
+     * @return 生成结果
+     */
+    R<Object> creteOrder(ConsumptionBo recordBo);
+
+    /**
+     * 消费入账
+      * @param bo 消费记录业务模型
+     * @return 入账结果
+     */
+    R<Object> postOrder(ConsumptionBo bo);
+}

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

@@ -0,0 +1,37 @@
+package org.dromara.backstage.business.consume.strategy.Impl;
+
+import org.dromara.backstage.business.consume.strategy.IConsumeStrategy;
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
+import org.dromara.common.core.domain.R;
+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 ConsumeStrategyContent {
+    private final Map<String, IConsumeStrategy> strategyMap = new ConcurrentHashMap<>();
+
+    @Autowired
+    public ConsumeStrategyContent(Map<String, IConsumeStrategy> strategyMap) {
+        this.strategyMap.putAll(strategyMap);
+    }
+
+    public R<Object> createOrder(ConsumptionBo recordBo){
+        return strategyMap.get(recordBo.getCreditType().name()).creteOrder(recordBo);
+    }
+    public R<Object> postOrder(ConsumptionBo bo){
+        return strategyMap.get(bo.getCreditType().name()).postOrder(bo);
+    }
+}

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

@@ -0,0 +1,82 @@
+package org.dromara.backstage.business.consume.strategy.Impl;
+
+import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.basics.domain.vo.PtMealTypeVo;
+import org.dromara.backstage.business.consume.ConsumeBusiness;
+import org.dromara.backstage.business.consume.strategy.IConsumeStrategy;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailOriginalVo;
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailVo;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.common.core.constant.ConsumeTypeConstants;
+import org.dromara.common.core.domain.R;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * name: TermCnsumeStrategyImpl
+ * package: org.dromara.backstage.business.consume.strategy.Impl
+ * description: 消费机消费处理
+ * date: 2024-10-14 13:04:17 13:04
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service(ConsumeTypeConstants.TERM_CONSUME)
+public class TermConsumeStrategyImpl implements IConsumeStrategy {
+    private static final Logger log = LoggerFactory.getLogger(TermConsumeStrategyImpl.class);
+    private final ConsumeBusiness consumeBusiness;
+
+    /**
+     * 生成消费订单,主要处理的业务
+     * 1.验证是否能消费并将验证结果返回前端
+     * 2.入库消费原始记录表
+     *
+     * @param consumptionBo 消费记录业务模型
+     * @return 生成结果
+     */
+    @Override
+    public R<Object> creteOrder(ConsumptionBo consumptionBo) {
+        PtUserAccountVo userAccountVo = consumeBusiness.getPtUserAccountVo(consumptionBo);
+        XfTermVo termVo = consumeBusiness.getXfTermVo(consumptionBo);
+        log.info("[验证通过,开始创建消费订单]-[{}]", JSONUtil.toJsonStr(consumptionBo));
+
+        // 消费设置记录的状态标志为4
+        consumptionBo.setStatusFlag(4);
+        XfConsumeDetailOriginalVo xfConsumeDetailOriginalVo = consumeBusiness.createConsumeOriginalRecord(consumptionBo, userAccountVo);
+        return R.ok(xfConsumeDetailOriginalVo);
+    }
+
+    @Override
+    public R<Object> postOrder(ConsumptionBo bo) {
+        PtUserAccountVo userAccountVo = consumeBusiness.getPtUserAccountVo(bo);
+        PtCardVo cardVo = consumeBusiness.getPtCardVo(bo);
+        XfTermVo termVo = consumeBusiness.getXfTermVo(bo);
+        PtMealTypeVo mealTypeVo = consumeBusiness.getMealTypeVo(bo);
+        List<PtBagVo> bagVoList = consumeBusiness.getBagVo(userAccountVo, termVo);
+        bo.setStatusFlag(4);
+        log.info("[验证通过,开始写入消费明细数据]-[{}]", JSONUtil.toJsonStr(bo));
+
+        XfConsumeDetailVo detailVo = consumeBusiness.createConsumeRecord(bo, userAccountVo, cardVo, bagVoList.get(0), termVo, mealTypeVo, "");
+
+        log.info("[消费明细处理完毕,开始更新人员日统计表]-[{}]", JSONUtil.toJsonStr(bo));
+        consumeBusiness.createOrUpdateUserTotal(bo, userAccountVo, cardVo);
+
+        log.info("[人员日统计表更新完毕,开始更新设备日统计表]-[{}]", JSONUtil.toJsonStr(bo));
+        consumeBusiness.createOrUpdateTermTotal(bo, termVo, mealTypeVo);
+
+        log.info("[设备日统计表更新完毕,开始更新钱包余额]-[{}]", JSONUtil.toJsonStr(bo));
+        consumeBusiness.updateBalance(bo, bagVoList.get(0));
+
+        return R.ok();
+    }
+}

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

@@ -0,0 +1,52 @@
+package org.dromara.backstage.consumption.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.business.consume.ConsumeBusiness;
+import org.dromara.backstage.business.consume.strategy.Impl.ConsumeStrategyContent;
+import org.dromara.backstage.consumption.domain.bo.ConsumeRecordBo;
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailOriginalVo;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.enums.CreditTypeEnum;
+import org.dromara.common.web.core.BaseController;
+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.math.RoundingMode;
+
+/**
+ * name: ConsumesController
+ * package: org.dromara.backstage.consumption.controller
+ * description: 消费数据访问路由地址
+ * date: 2024-10-14 10:09:31 10:09
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/v1/Consumes")
+public class ConsumesController extends BaseController {
+
+    private final ConsumeBusiness consumeBusiness;
+    private final ConsumeStrategyContent consumeStrategyContent;
+    @PostMapping("/ConsumeOriginal")
+    public R<Object> ConsumeOriginal(@RequestBody ConsumeRecordBo consumeRecordBo) {
+        consumeRecordBo.setCreditType(CreditTypeEnum.TERM_CONSUME);
+        consumeRecordBo.setConsumeValue(consumeRecordBo.getConsumeValue().setScale(2, RoundingMode.HALF_UP));
+        ConsumptionBo consumptionBo = consumeBusiness.recordToBusiness(consumeRecordBo);
+        R<Object> result = consumeStrategyContent.createOrder(consumptionBo);
+        XfConsumeDetailOriginalVo vo = (XfConsumeDetailOriginalVo)result.getData();
+
+        consumptionBo.setRecordId(vo.getRecordId());
+        consumptionBo.setConsumeId(vo.getOriginalId());
+        return consumeStrategyContent.postOrder(consumptionBo);
+        //return R.ok(vo);
+    }
+}

+ 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;
 import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.backstage.consumption.service.IXfConsumedetailoriginalService;
+import org.dromara.backstage.consumption.service.IXfConsumeDetailOriginalService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 /**
@@ -35,7 +35,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 @RequestMapping("/consumption/xfConsumedetailoriginal")
 public class XfConsumeDetailOriginalController extends BaseController {
 
-    private final IXfConsumedetailoriginalService xfConsumedetailoriginalService;
+    private final IXfConsumeDetailOriginalService xfConsumedetailoriginalService;
 
     /**
      * 查询原始消费记录列表

+ 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;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
 import java.util.Date;
 
 import java.io.Serial;
@@ -29,7 +31,7 @@ public class XfConsumeDetailOriginal extends TenantEntity {
     private String originalId;
 
     /**
-     * 记录Id
+     * 记录Id,自增长,唯一id值,用于应答给消费设备
      */
     private Long recordId;
 
@@ -66,7 +68,7 @@ public class XfConsumeDetailOriginal extends TenantEntity {
     /**
      * 消费金额
      */
-    private Long consumeMoney;
+    private BigDecimal consumeMoney;
 
     /**
      * 卡流水号
@@ -81,7 +83,7 @@ public class XfConsumeDetailOriginal extends TenantEntity {
     /**
      * 卡上余额
      */
-    private Long cardValue;
+    private BigDecimal cardValue;
 
     /**
      * 卡使用次数
@@ -91,7 +93,7 @@ public class XfConsumeDetailOriginal extends TenantEntity {
     /**
      * 消费账户金额
      */
-    private Long consumeBalance;
+    private BigDecimal consumeBalance;
 
     /**
      * 设备机号
@@ -111,7 +113,7 @@ public class XfConsumeDetailOriginal extends TenantEntity {
     /**
      * 是否已处理(和灰记录处理有关)
      */
-    private Long anlysFlag;
+    private Long analysisFlag;
 
     /**
      * 消费记录标志
@@ -131,27 +133,27 @@ public class XfConsumeDetailOriginal extends TenantEntity {
     /**
      * 水控金额
      */
-    private Long waterValue;
+    private BigDecimal waterValue;
 
     /**
      * 水控历史余额
      */
-    private Long waterHistoryValue;
+    private BigDecimal waterHistoryValue;
 
     /**
      * 水控当天总和
      */
-    private Long waterDaySum;
+    private BigDecimal waterDaySum;
 
     /**
      * 水控错误余额
      */
-    private Long waterErrValue;
+    private BigDecimal waterErrValue;
 
     /**
      * 水控错误消费金额
      */
-    private Long waterErrMoney;
+    private BigDecimal waterErrMoney;
 
     /**
      * 营业员Id

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

@@ -0,0 +1,102 @@
+package org.dromara.backstage.consumption.domain.bo;
+
+import lombok.Data;
+import org.dromara.common.core.constant.ConsumeTypeConstants;
+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;
+}

+ 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;
 public class ConsumptionBo extends BaseEntity {
     //region 消费业务基础属性
     /**
-     * 消费账户Id
+     * 人员账户Id
      */
     private Long userId;
 
@@ -39,14 +39,23 @@ public class ConsumptionBo extends BaseEntity {
      */
     private String userNumb;
 
+    /**
+     * 人员姓名
+     */
+    private String realName;
+
     /**
      * 卡流水号
      */
     private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
     /**
      * 钱包代码
      */
-    @NotBlank(message = "消费钱包不能为空", groups = { AddGroup.class, EditGroup.class })
     private String bagType;
 
     /**
@@ -66,16 +75,33 @@ public class ConsumptionBo extends BaseEntity {
      */
     @NotNull(message = "消费设备不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long termNo;
+
+    /**
+     * 机器流水号
+     */
+    private Long termRecordId;
     /**
      * 餐类Id
      */
-    @NotNull(message = "消费餐类不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long mealType;
     /**
-     * 餐类Id
+     * 原始记录Id
      */
-    @NotNull(message = "消费记录Id不能为空", groups = { AddGroup.class, EditGroup.class })
     private String consumeId;
+
+    /**
+     * 记录Id
+     */
+    private Long recordId;
+    /**
+     * 消费记录标志位?
+     */
+    private Long recordStatus;
+
+    /**
+     * 状态标识(记录消费类型?)
+     */
+    private Integer statusFlag;
     /**
      * 系统使用类型
      */
@@ -89,6 +115,10 @@ public class ConsumptionBo extends BaseEntity {
      */
     private String operatorName;
 
+    /**
+     * 交易类型
+     */
+    private CreditTypeEnum creditType;
     //endregion
 
     //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;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -28,9 +30,8 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
     private String originalId;
 
     /**
-     * 记录Id
+     * 记录Id,自增长
      */
-    @NotNull(message = "记录Id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long recordId;
 
     /**
@@ -69,7 +70,7 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
      * 消费金额
      */
     @NotNull(message = "消费金额不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long consumeMoney;
+    private BigDecimal consumeMoney;
 
     /**
      * 卡流水号
@@ -87,7 +88,7 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
      * 卡上余额
      */
     @NotNull(message = "卡上余额不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long cardValue;
+    private BigDecimal cardValue;
 
     /**
      * 卡使用次数
@@ -97,13 +98,13 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
     /**
      * 消费账户金额
      */
-    private Long consumeBalance;
+    private BigDecimal consumeBalance;
 
     /**
      * 设备机号
      */
     @NotNull(message = "设备机号不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long termNo;
+    private Integer termNo;
 
     /**
      * 设备名称
@@ -118,7 +119,7 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
     /**
      * 是否已处理(和灰记录处理有关)
      */
-    private Long anlysFlag;
+    private Long analysisFlag;
 
     /**
      * 消费记录标志
@@ -128,7 +129,7 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
     /**
      * 状态标识(记录消费类型?)
      */
-    private Long statusFlag;
+    private Integer statusFlag;
 
     /**
      * 防伪验证码(记录消费模式的中文信息)
@@ -138,27 +139,27 @@ public class XfConsumeDetailOriginalBo extends BaseEntity {
     /**
      * 水控金额
      */
-    private Long waterValue;
+    private BigDecimal waterValue;
 
     /**
      * 水控历史余额
      */
-    private Long waterHistoryValue;
+    private BigDecimal waterHistoryValue;
 
     /**
      * 水控当天总和
      */
-    private Long waterDaySum;
+    private BigDecimal waterDaySum;
 
     /**
      * 水控错误余额
      */
-    private Long waterErrValue;
+    private BigDecimal waterErrValue;
 
     /**
      * 水控错误消费金额
      */
-    private Long waterErrMoney;
+    private BigDecimal waterErrMoney;
 
     /**
      * 营业员Id

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

@@ -0,0 +1,40 @@
+package org.dromara.backstage.consumption.dubbo;
+
+import cn.hutool.core.bean.BeanUtil;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.backstage.api.RemoteConsumeService;
+import org.dromara.backstage.api.domain.bo.RemoteConsumptionBo;
+import org.dromara.backstage.business.consume.strategy.Impl.ConsumeStrategyContent;
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailOriginalVo;
+import org.dromara.common.core.domain.R;
+import org.springframework.stereotype.Service;
+
+/**
+ * name: RemoteConsumeServiceImpl
+ * package: org.dromara.backstage.consumption.dubbo
+ * description: 消费远程服务实现
+ * date: 2024-10-15 14:32:43 14:32
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteConsumeServiceImpl implements RemoteConsumeService {
+    private final ConsumeStrategyContent consumeStrategyContent;
+    @Override
+    public R<Object> receiveConsumeOriginalRecord(RemoteConsumptionBo bo) {
+        ConsumptionBo consumptionBo = BeanUtil.copyProperties(bo, ConsumptionBo.class);
+
+        R<Object> result = consumeStrategyContent.createOrder(consumptionBo);
+        XfConsumeDetailOriginalVo vo = (XfConsumeDetailOriginalVo)result.getData();
+
+        consumptionBo.setRecordId(vo.getRecordId());
+        consumptionBo.setConsumeId(vo.getOriginalId());
+        return consumeStrategyContent.postOrder(consumptionBo);
+    }
+}

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

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

+ 3 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumedetailoriginalServiceImpl.java → 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;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.dromara.backstage.consumption.mapper.XfConsumeDetailOriginalMapper;
-import org.dromara.backstage.consumption.service.IXfConsumedetailoriginalService;
+import org.dromara.backstage.consumption.service.IXfConsumeDetailOriginalService;
 
 import java.util.List;
 import java.util.Map;
@@ -29,7 +29,7 @@ import java.util.Collection;
 @RequiredArgsConstructor
 @Service
 @DS("storage")
-public class XfConsumedetailoriginalServiceImpl implements IXfConsumedetailoriginalService {
+public class XfConsumeDetailOriginalServiceImpl implements IXfConsumeDetailOriginalService {
 
     private final XfConsumeDetailOriginalMapper baseMapper;
 
@@ -89,7 +89,7 @@ public class XfConsumedetailoriginalServiceImpl implements IXfConsumedetailorigi
         lqw.eq(bo.getTermNo() != null, XfConsumeDetailOriginal::getTermNo, bo.getTermNo());
         lqw.like(StringUtils.isNotBlank(bo.getTermName()), XfConsumeDetailOriginal::getTermName, bo.getTermName());
         lqw.eq(bo.getTermRecordId() != null, XfConsumeDetailOriginal::getTermRecordId, bo.getTermRecordId());
-        lqw.eq(bo.getAnlysFlag() != null, XfConsumeDetailOriginal::getAnlysFlag, bo.getAnlysFlag());
+        lqw.eq(bo.getAnalysisFlag() != null, XfConsumeDetailOriginal::getAnalysisFlag, bo.getAnalysisFlag());
         lqw.eq(bo.getDataFlag() != null, XfConsumeDetailOriginal::getDataFlag, bo.getDataFlag());
         lqw.eq(bo.getStatusFlag() != null, XfConsumeDetailOriginal::getStatusFlag, bo.getStatusFlag());
         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 {
         if(beginDate != null && endDate != null){
             lqw.between(XfConsumeDetail::getConsumeDate, beginDate + " 00:00:00", endDate + " 23:59:59");
         }
-        lqw.orderByDesc(XfConsumeDetail::getConsumeDate);
+        //lqw.orderByDesc(XfConsumeDetail::getConsumeDate);
         Page<XfConsumeDetailVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         return TableDataInfo.build(result);
     }

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

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

+ 82 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/KafkaNormalConsumer.java

@@ -0,0 +1,82 @@
+package org.dromara.backstage.mq;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.nacos.api.model.v2.Result;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.dromara.backstage.api.domain.bo.RemoteConsumptionBo;
+import org.dromara.backstage.business.consume.strategy.Impl.ConsumeStrategyContent;
+import org.dromara.backstage.consumption.domain.bo.ConsumeRecordBo;
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailOriginalVo;
+import org.dromara.backstage.mq.domain.bo.KafkaMessage;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.enums.CreditTypeEnum;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+
+/**
+ * name: KafkaNormalConsumer
+ * package: org.dromara.backstage.mq
+ * description:
+ * date: 2024-10-15 15:33:41 15:33
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Slf4j
+@Component
+public class KafkaNormalConsumer {
+    private final ConsumeStrategyContent consumeStrategyContent;
+
+    @KafkaListener(topics = "eventBus", groupId = "test-group-id")
+    public void timiKafka(ConsumerRecord<String, String> record) {
+        Object key = record.key();
+        Object value = record.value();
+        KafkaMessage<?> kmsg = JSONUtil.toBean(record.value(), KafkaMessage.class);
+        if(kmsg.getHeader().getEventType().equals("00500001")){
+            JSONObject data = JSONUtil.parseObj(kmsg.getBody());
+            ConsumeRecordBo recordBo = new ConsumeRecordBo();
+            String time = data.get("consumeDate").toString();
+            recordBo.setConsumeValue(new BigDecimal(data.get("consumeValue").toString()));
+            recordBo.setConsumeDate(DateUtil.parse(time));
+            recordBo.setCardID(Long.valueOf(data.get("cardNo").toString()));
+            recordBo.setFactoryFixID(Long.valueOf(data.get("factoryFixId").toString()));
+            recordBo.setTermID(Long.valueOf( data.get("termNo").toString()));
+            recordBo.setTermRecordID(Long.valueOf(data.get("termRecordID").toString()));
+            recordBo.setEmployeeName(data.get("xm").toString());
+            recordBo.setEmployeeStrID(data.get("userNumb").toString());
+            recordBo.setPosRecordState(Integer.valueOf(data.get("posRecordState").toString()));
+            //recordBo.setCreditType(CreditTypeEnum.TERM_CONSUME);
+
+            HashMap<String, String> headerMap = new HashMap<>();
+            headerMap.put("clientId", "e5cd7e4891bf95d1d19206ce24a7b32e");
+            headerMap.put("authorization","Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxMDAiLCJyblN0ciI6IjFGWlpaVVdCNVlScU0xZU1BWW5ZbGJKQnI1Vzh6Z3R2IiwiY2xpZW50aWQiOiJlNWNkN2U0ODkxYmY5NWQxZDE5MjA2Y2UyNGE3YjMyZSIsInRlbmFudElkIjoiMjAyMDA4MTMwNDQ0MTEiLCJ1c2VySWQiOjEwMCwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAwLCJkZXB0TmFtZSI6IuS4reWFsea5luWNl-ecgeWnlOWFmuagoea5luWNl-ihjOaUv-WtpumZoiIsImRlcHRUeXBlIjoiMDEifQ.WYs2kJDaU0UQW5WBpQuRzrEPRGrg0io9QTkRrC-XBBI");
+            String url = "http://localhost:8001/dev-api/backstage/v1/Consumes/ConsumeOriginal";
+            String bodyStr = bodyStr = JSONUtil.toJsonStr(recordBo);
+            HttpResponse response = HttpRequest.post(url)
+                .body(bodyStr)
+                .addHeaders(headerMap).timeout(20000).execute();
+
+            log.info(response.body());
+            //R<Object> result = consumeStrategyContent.createOrder(recordBo);
+            //XfConsumeDetailOriginalVo vo = (XfConsumeDetailOriginalVo)result.getData();
+            //
+            //recordBo.setRecordId(vo.getRecordId());
+            //recordBo.setConsumeId(vo.getOriginalId());
+            //result =  consumeStrategyContent.postOrder(recordBo);
+        }
+        log.info("【消费者】received the message key {},value:{}", key, value);
+    }
+}

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

@@ -0,0 +1,33 @@
+package org.dromara.backstage.mq.domain.bo;
+
+import lombok.Data;
+
+/**
+ * name: KafkaHeader
+ * package: org.dromara.stream.domain.bo
+ * description: kafka消息头
+ * date: 2024-10-15 11:22:26 11:22
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+public class KafkaHeader {
+    /**
+     * 发送方
+     */
+    private String sender;
+    /**
+     * 时间戳
+     */
+    private Long timestamp;
+    /**
+     * 事件类型
+     */
+    private String eventType;
+    /**
+     * 事件Id
+     */
+    private String eventId;
+}

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

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

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

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

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

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

+ 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 {
         }
         return okNum;
     }
+
+    /**
+     * 根据人员编号与姓名查询人员信息
+     * @param realName 人员姓名
+     * @param userNumb 人员编号
+     * @return 人员信息
+     */
+    @Override
+    public PtUserAccountVo queryByNameAndNumb(String realName, String userNumb) {
+        PtUserAccountVo vo = baseMapper.selectVoOne(Wrappers.<PtUserAccount>lambdaQuery()
+            .eq(PtUserAccount::getRealName,realName)
+            .eq(PtUserAccount::getUserNumb,userNumb));
+        if(vo!=null) {
+            String deptName = remoteDeptService.selectDeptNameByIds(vo.getDeptId().toString());
+            vo.setDeptName(deptName);
+        }
+        return vo;
+    }
 }

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

@@ -0,0 +1,26 @@
+package org.dromara.backstage.task;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+/**
+ * name: InitRunner
+ * package: org.dromara.backstage.task
+ * description: 系统启动时的初始化工作
+ * date: 2024-09-09 10:32:29 10:32
+ *
+ * @author yubo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Component
+@Slf4j
+public class InitRunner implements CommandLineRunner {
+    @Override
+    public void run(String... args) throws Exception {
+
+    }
+}