Explorar o código

feature: 功能完善
1.处理消费设备缓存问题
2.错扣补款写消费明细时的余额改为补款后的余额
3.报到时推送的报到日期格式化到秒

luo.yibo@datuai.com hai 1 ano
pai
achega
f0fc6ab251
Modificáronse 13 ficheiros con 628 adicións e 79 borrados
  1. 9 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemotePtXfTermService.java
  2. 294 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/vo/RemoteXfTermVo.java
  3. 5 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/errfill/ErrFillBusiness.java
  4. 4 17
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/self/TraineeBusiness.java
  5. 18 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/convert/RemoteXfTermVoConvert.java
  6. 203 10
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfTermVo.java
  7. 18 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfTermServiceImpl.java
  8. 10 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfTermService.java
  9. 43 28
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfTermServiceImpl.java
  10. 2 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/domain/bo/kafka/TraineeCheckIn.java
  11. 1 6
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtBagServiceImpl.java
  12. 12 5
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java
  13. 9 9
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/XfTermServiceImpl.java

+ 9 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemotePtXfTermService.java

@@ -2,6 +2,7 @@ package org.dromara.backstage.api;
 
 import org.dromara.backstage.api.domain.bo.RemoteXfTermBo;
 import org.dromara.backstage.api.domain.bo.RemoteXfTermParamBo;
+import org.dromara.backstage.api.domain.vo.RemoteXfTermVo;
 
 import java.util.Collection;
 
@@ -32,4 +33,12 @@ public interface RemotePtXfTermService {
      */
     Boolean editParam(RemoteXfTermParamBo bo);
 
+    /**
+     * 根据设备机号查询设备信息
+     * @param termNo 设备机号
+     * @param tenantId 所属租户Id
+     * @return 设备信息
+     */
+    RemoteXfTermVo queryByNo(Long termNo,String tenantId);
+
 }

+ 294 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/vo/RemoteXfTermVo.java

@@ -0,0 +1,294 @@
+package org.dromara.backstage.api.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 消费设备视图对象 t_xf_term
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class RemoteXfTermVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 设备Id,主键
+     */
+    private Long termId;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 所属餐厅Id
+     */
+    private Long roomId;
+
+    private String roomName;
+
+    /**
+     * 结算账户Id
+     */
+    private Long accountId;
+
+    /**
+     * 账户名称
+     */
+    private String accountName;
+
+    /**
+     * 设备类型,见XF_TermType字典类型
+     */
+    private String termType;
+
+    /**
+     * 扣费类型,见XF_ConsumeType字典类型
+     */
+    private String consumeType;
+
+    /**
+     * 设备IP
+     */
+      private String termIp;
+
+    /**
+     * 设备通讯端口
+     */
+    private Long commPort;
+
+    /**
+     *
+     * 服务器IP
+     */
+    private String serverIp;
+
+    /**
+     * 服务器端口
+     */
+    private Long serverPort;
+
+    private String autoDown;
+
+    /**
+     * 备注
+     */
+    private String remark;
+    //region 以下为消费机的参数属性
+    private Integer cardType;
+
+    /**
+     * 消费工作模式,见XF_WorkMode字典类别
+     */
+    private String workMode;
+
+    /**
+     * 开机模式,0-不需要营业员开机,1-需要营业员开机
+     */
+    private String openMode;
+
+    /**
+     * 卡上最大金额
+     */
+    private BigDecimal maxCardMoney;
+
+    /**
+     * 定值消费金额
+     */
+    private BigDecimal constantValue;
+
+    /**
+     * 编号0代表的金额
+     */
+    private BigDecimal rationZero;
+
+    /**
+     * 编号1代表的金额
+     */
+    private BigDecimal rationOne;
+
+    /**
+     * 编号2代表的金额
+     */
+    private BigDecimal rationTwo;
+
+    /**
+     * 编号3代表的金额
+     */
+    private BigDecimal rationThree;
+
+    /**
+     * 编号4代表的金额
+     */
+    private BigDecimal rationFour;
+
+    /**
+     * 编号5代表的金额
+     */
+    private BigDecimal rationFive;
+
+    /**
+     * 编号6代表的金额
+     */
+    private BigDecimal rationSix;
+
+    /**
+     * 编号7代表的金额
+     */
+    private BigDecimal rationSeven;
+
+    /**
+     * 编号8代表的金额
+     */
+    private BigDecimal rationEight;
+
+    /**
+     * 编号9代表的金额
+     */
+    private BigDecimal rationNine;
+
+    /**
+     * 每天最大消费次数,0-不限
+     */
+    private Integer dayCount;
+
+    /**
+     * 每天最大消费金额
+     */
+    private BigDecimal dayMoney;
+
+    /**
+     * 每餐最大消费次数,0-不限
+     */
+    private Integer mealCount;
+
+    /**
+     * 单次最大消费金额
+     */
+    private BigDecimal singleMoney;
+
+    /**
+     * 早餐消费金额
+     */
+    private BigDecimal breakfastMoney;
+
+    /**
+     * 午餐消费金额
+     */
+    private BigDecimal lunchMoney;
+
+    /**
+     * 晚餐消费金额
+     */
+    private BigDecimal supperMoney;
+
+    /**
+     * 夜宵消费金额
+     */
+    private BigDecimal nightMoney;
+
+    /**
+     * 早餐开始时间
+     */
+    private Long breakfastBegin;
+
+    /**
+     * 早餐结束时间
+     */
+    private Long breakfastEnd;
+
+    /**
+     * 午餐开始时间
+     */
+    private Long lunchBegin;
+
+    /**
+     * 午餐结束时间
+     */
+    private Long lunchEnd;
+
+    /**
+     * 晚餐开始时间
+     */
+    private Long supperBegin;
+
+    /**
+     * 晚餐结束时间
+     */
+    private Long supperEnd;
+
+    /**
+     * 宵夜开始时间
+     */
+    private Long nightBegin;
+
+    /**
+     * 宵夜结束时间
+     */
+    private Long nightEnd;
+
+    /**
+     * 两次刷卡间隔,0-不限制
+     */
+    private Integer swipeInterval;
+
+    /**
+     * 是否启用卡片有效限制,0-禁用 1-启用
+     */
+    private String termValidity;
+
+    /**
+     * 重启时间
+     */
+    private String rebootTime;
+
+    /**
+     * 最后校时时间
+     */
+    private Date lastCheck;
+    /**
+     * 允许脱机时间
+     */
+    private Long offlineTime;
+    /**
+     * 通讯超时时间,以100毫秒为单位
+     */
+    private Long timeout;
+    /**
+     * 心跳间隔,以秒为单位
+     */
+    private Long beatInterval;
+    /**
+     * 设备记录流水号
+     */
+    private Long recordId;
+
+    /**
+     * 数据上传时间
+     */
+    private Date uploadTime;
+
+    /**
+     * 黑名单下载时间
+     */
+    private Date blackDownTime;
+    //endregion
+
+}

+ 5 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/errfill/ErrFillBusiness.java

@@ -137,7 +137,11 @@ public class ErrFillBusiness {
         //设置卡片信息
         consumeDetailBo.setCardNo(cardVo.getCardNo());
         consumeDetailBo.setFactoryId(cardVo.getFactoryId());
-        consumeDetailBo.setCardValue(bagVo.getBalance());
+
+        // 入明细表的余额为操作完成后的余额
+        BigDecimal afterValue = bagVo.getBalance().add(bo.getOperatorMoney());
+        consumeDetailBo.setCardValue(afterValue);
+        consumeDetailBo.setConsumeBalance(afterValue);
         //设置设备信息
         BeanUtil.copyProperties(termVo, consumeDetailBo);
          //设置操作员信息

+ 4 - 17
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/self/TraineeBusiness.java

@@ -23,15 +23,14 @@ import org.dromara.backstage.domain.vo.yc.YcBagVo;
 import org.dromara.backstage.domain.vo.yc.YcCardVo;
 import org.dromara.backstage.domain.vo.yc.YcLockCardVo;
 import org.dromara.backstage.domain.vo.yc.YcTraineeVo;
-import org.dromara.backstage.mq.KafkaNormalProducer;
 import org.dromara.backstage.mq.PushKafkaData;
-import org.dromara.backstage.mq.constant.YktEventConstaints;
 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.service.IPtBagService;
 import org.dromara.backstage.payment.service.IPtUserAccountService;
 import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.constant.HotelBusinessConstants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.domain.model.ErrorInfo;
@@ -41,8 +40,6 @@ import org.dromara.common.core.enums.RoomCardTypeEnum;
 import org.dromara.common.message.kafka.constant.EventSenderConstants;
 import org.dromara.common.message.kafka.constant.EventTypeConstants;
 import org.dromara.common.message.kafka.constant.KafkaTopicConstants;
-import org.dromara.common.message.kafka.domain.KafkaHeader;
-import org.dromara.common.message.kafka.domain.KafkaMessage;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.hotel.api.domain.bo.RemoteCardDataBo;
 import org.dromara.hotel.api.domain.bo.RemoteOrderBo;
@@ -405,25 +402,15 @@ public class TraineeBusiness {
      * @param bo 学员报到业务对象
      */
     public void sendCheckInMessageToKafka(YcTraineeBo bo){
+
         TraineeCheckIn traineeCheckIn = new TraineeCheckIn();
         traineeCheckIn.setOtherSysId(bo.getOtherUserId());
         traineeCheckIn.setClassId(bo.getOtherDeptId());
         traineeCheckIn.setCheckinState(true);
-        traineeCheckIn.setCheckInDate(bo.getCheckInDate());
+        traineeCheckIn.setCheckInDate(DateUtil.format(bo.getCheckInDate(), DefaultConstants.DATE_TIME_FORMAT));
         traineeCheckIn.setPayStatus(true);
-        traineeCheckIn.setPayDate(bo.getCheckoutDate());
-
-
-        //KafkaMessage<TraineeCheckIn> message = new KafkaMessage<>();
-        //KafkaHeader header = message.getHeader();
-        //header.setTimestamp(System.currentTimeMillis());
-        //header.setEventId(YktEventConstaints.CHECKIN_STATE);
-        //header.setEventType(YktEventConstaints.CHECKIN_STATE);
-        //header.setSender(YktEventConstaints.SENDER);
-        //message.setHeader(header);
-        //message.setBody(traineeCheckIn);
+        traineeCheckIn.setPayDate(DateUtil.format(bo.getCheckInDate(), DefaultConstants.DATE_TIME_FORMAT));
 
-        //kafkaProducer.sendKafkaMessage(KafkaTopicConstants.OLD_SYNC_TOPIC,message);
         kafkaProducer.sendKafkaMessage(KafkaTopicConstants.OLD_SYNC_TOPIC, EventTypeConstants.REGISTER_STATUS, EventSenderConstants.YKT, traineeCheckIn);
     }
 

+ 18 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/convert/RemoteXfTermVoConvert.java

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

+ 203 - 10
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfTermVo.java

@@ -1,28 +1,22 @@
 package org.dromara.backstage.consumption.domain.vo;
 
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import org.dromara.backstage.consumption.domain.XfTerm;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.backstage.consumption.domain.XfTerm;
 import org.dromara.common.core.enums.YesNoEnum;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.excel.annotation.ExcelDictFormat;
 import org.dromara.common.excel.annotation.ExcelEnumFormat;
 import org.dromara.common.excel.convert.ExcelDictConvert;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
 import org.dromara.common.excel.convert.ExcelEnumConvert;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 
-
 /**
  * 消费设备视图对象 t_xf_term
  *
@@ -117,5 +111,204 @@ public class XfTermVo implements Serializable {
     @ExcelProperty(value = "备注")
     private String remark;
 
+    //region 以下为消费机的参数属性
+    private Integer cardType;
+
+    /**
+     * 消费工作模式,见XF_WorkMode字典类别
+     */
+    private String workMode;
+
+    /**
+     * 开机模式,0-不需要营业员开机,1-需要营业员开机
+     */
+    private String openMode;
+
+    /**
+     * 卡上最大金额
+     */
+    private BigDecimal maxCardMoney;
+
+    /**
+     * 定值消费金额
+     */
+    private BigDecimal constantValue;
+
+    /**
+     * 编号0代表的金额
+     */
+    private BigDecimal rationZero;
+
+    /**
+     * 编号1代表的金额
+     */
+    private BigDecimal rationOne;
+
+    /**
+     * 编号2代表的金额
+     */
+    private BigDecimal rationTwo;
+
+    /**
+     * 编号3代表的金额
+     */
+    private BigDecimal rationThree;
+
+    /**
+     * 编号4代表的金额
+     */
+    private BigDecimal rationFour;
+
+    /**
+     * 编号5代表的金额
+     */
+    private BigDecimal rationFive;
+
+    /**
+     * 编号6代表的金额
+     */
+    private BigDecimal rationSix;
+
+    /**
+     * 编号7代表的金额
+     */
+    private BigDecimal rationSeven;
+
+    /**
+     * 编号8代表的金额
+     */
+    private BigDecimal rationEight;
+
+    /**
+     * 编号9代表的金额
+     */
+    private BigDecimal rationNine;
+
+    /**
+     * 每天最大消费次数,0-不限
+     */
+    private Integer dayCount;
+
+    /**
+     * 每天最大消费金额
+     */
+    private BigDecimal dayMoney;
+
+    /**
+     * 每餐最大消费次数,0-不限
+     */
+    private Integer mealCount;
+
+    /**
+     * 单次最大消费金额
+     */
+    private BigDecimal singleMoney;
+
+    /**
+     * 早餐消费金额
+     */
+    private BigDecimal breakfastMoney;
+
+    /**
+     * 午餐消费金额
+     */
+    private BigDecimal lunchMoney;
+
+    /**
+     * 晚餐消费金额
+     */
+    private BigDecimal supperMoney;
+
+    /**
+     * 夜宵消费金额
+     */
+    private BigDecimal nightMoney;
+
+    /**
+     * 早餐开始时间
+     */
+    private Long breakfastBegin;
+
+    /**
+     * 早餐结束时间
+     */
+    private Long breakfastEnd;
+
+    /**
+     * 午餐开始时间
+     */
+    private Long lunchBegin;
+
+    /**
+     * 午餐结束时间
+     */
+    private Long lunchEnd;
+
+    /**
+     * 晚餐开始时间
+     */
+    private Long supperBegin;
+
+    /**
+     * 晚餐结束时间
+     */
+    private Long supperEnd;
+
+    /**
+     * 宵夜开始时间
+     */
+    private Long nightBegin;
+
+    /**
+     * 宵夜结束时间
+     */
+    private Long nightEnd;
+
+    /**
+     * 两次刷卡间隔,0-不限制
+     */
+    private Integer swipeInterval;
+
+    /**
+     * 是否启用卡片有效限制,0-禁用 1-启用
+     */
+    private String termValidity;
+
+    /**
+     * 重启时间
+     */
+    private String rebootTime;
+
+    /**
+     * 最后校时时间
+     */
+    private Date lastCheck;
+    /**
+     * 允许脱机时间
+     */
+    private Long offlineTime;
+    /**
+     * 通讯超时时间,以100毫秒为单位
+     */
+    private Long timeout;
+    /**
+     * 心跳间隔,以秒为单位
+     */
+    private Long beatInterval;
+    /**
+     * 设备记录流水号
+     */
+    private Long recordId;
+
+    /**
+     * 数据上传时间
+     */
+    private Date uploadTime;
+
+    /**
+     * 黑名单下载时间
+     */
+    private Date blackDownTime;
+    //endregion
 
 }

+ 18 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfTermServiceImpl.java

@@ -1,14 +1,18 @@
 package org.dromara.backstage.consumption.dubbo;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.backstage.api.RemotePtXfTermService;
 import org.dromara.backstage.api.domain.bo.RemoteXfTermBo;
 import org.dromara.backstage.api.domain.bo.RemoteXfTermParamBo;
+import org.dromara.backstage.api.domain.vo.RemoteXfTermVo;
 import org.dromara.backstage.consumption.domain.bo.XfTermBo;
 import org.dromara.backstage.consumption.domain.bo.XfTermParamBo;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
 import org.dromara.backstage.consumption.service.IXfTermService;
+import org.dromara.common.core.utils.MapstructUtils;
 import org.springframework.stereotype.Service;
 
 import java.util.Collection;
@@ -43,4 +47,18 @@ public class RemoteXfTermServiceImpl implements RemotePtXfTermService {
     public Boolean editParam(RemoteXfTermParamBo bo) {
         return xfTermService.updateParamByBo(BeanUtil.copyProperties(bo, XfTermParamBo.class));
     }
+    /**
+     * 根据设备机号查询设备信息
+     * @param termNo 设备机号
+     * @param tenantId 所属租户Id
+     * @return 设备信息
+     */
+    @Override
+    public RemoteXfTermVo queryByNo(Long termNo, String tenantId) {
+        XfTermVo vo = xfTermService.queryByNo(termNo, tenantId);
+        if (ObjectUtil.isNotEmpty(vo)) {
+            return MapstructUtils.convert(vo, RemoteXfTermVo.class);
+        }
+        return null;
+    }
 }

+ 10 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfTermService.java

@@ -83,4 +83,14 @@ public interface IXfTermService {
      * @return 消费设备
      */
     XfTermVo queryByNo(Long termNo);
+
+    /**
+     * 根据设备机号查询设备信息
+     *
+     * @param termNo   设备机号
+     * @param tenantId 所属租户Id
+     * @return 设备信息
+     */
+     XfTermVo queryByNo(Long termNo, String tenantId);
+
 }

+ 43 - 28
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfTermServiceImpl.java

@@ -8,6 +8,7 @@ import org.dromara.backstage.basics.service.IPtAccountService;
 import org.dromara.backstage.basics.service.IPtRoomService;
 import org.dromara.backstage.consumption.domain.bo.XfTermParamBo;
 import org.dromara.backstage.consumption.domain.vo.XfTermParamVo;
+import org.dromara.common.core.config.DefaultConfig;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
@@ -46,6 +47,7 @@ public class XfTermServiceImpl implements IXfTermService {
     private final IPtRoomService roomService;
 
     private final IPtAccountService accountService;
+    private final DefaultConfig defaultConfig;
 
     /**
      * 查询消费设备
@@ -58,9 +60,9 @@ public class XfTermServiceImpl implements IXfTermService {
         return baseMapper.selectVoById(termId);
     }
 
-    public XfTermParamVo queryById4Param(Long termId){
+    public XfTermParamVo queryById4Param(Long termId) {
         XfTerm xfTerm = baseMapper.selectById(termId);
-        if(xfTerm==null){
+        if (xfTerm == null) {
             return null;
         }
         return MapstructUtils.convert(xfTerm, XfTermParamVo.class);
@@ -75,25 +77,25 @@ public class XfTermServiceImpl implements IXfTermService {
      */
     @Override
     public TableDataInfo<XfTermVo> queryPageList(XfTermBo bo, PageQuery pageQuery) {
-        QueryWrapper<XfTerm> lqw = buildQueryWrapper(bo,"t");
+        QueryWrapper<XfTerm> lqw = buildQueryWrapper(bo, "t");
         Map<String, Object> params = bo.getParams();
         Object roomId1 = params.get("roomId");
         List<Long> roomIds = new ArrayList<>();
-        if(roomId1!=null){
+        if (roomId1 != null) {
             Object type = params.get("type");
-            if(type!=null && type.toString().equals("area")){
+            if (type != null && type.toString().equals("area")) {
                 List<PtRoomVo> ptRoomVos = roomService.queryRoomByAreaId(Long.parseLong(roomId1.toString()));
-                if(CollectionUtil.isNotEmpty(ptRoomVos)){
+                if (CollectionUtil.isNotEmpty(ptRoomVos)) {
                     roomIds.addAll(ptRoomVos.stream().map(PtRoomVo::getRoomId).toList());
-                }else{
+                } else {
                     // 没有房间id 则不用查询了
                     return TableDataInfo.build(new Page<>());
                 }
-            }else {
+            } else {
                 roomIds.add(Long.valueOf(roomId1.toString()));
             }
         }
-        lqw.in(CollectionUtil.isNotEmpty(roomIds),"t.room_id", roomIds);
+        lqw.in(CollectionUtil.isNotEmpty(roomIds), "t.room_id", roomIds);
         lqw.eq("t.del_flag", 0);
         lqw.orderByDesc("t.create_time");
         Page<XfTermVo> result = baseMapper.customPageList(pageQuery.build(), lqw);
@@ -110,8 +112,8 @@ public class XfTermServiceImpl implements IXfTermService {
     public List<XfTermVo> queryList(XfTermBo bo) {
         LambdaQueryWrapper<XfTerm> lqw = buildQueryWrapper(bo);
         List<XfTermVo> xfTermVos = baseMapper.selectVoList(lqw);
-        if(CollectionUtil.isNotEmpty(xfTermVos)){
-            xfTermVos.forEach(x->{
+        if (CollectionUtil.isNotEmpty(xfTermVos)) {
+            xfTermVos.forEach(x -> {
                 PtRoomVo ptRoomVo = Optional.ofNullable(roomService.queryById(x.getRoomId())).orElse(new PtRoomVo());
                 x.setRoomName(ptRoomVo.getRoomName());
                 PtAccountVo ptAccountVo = Optional.ofNullable(accountService.queryById(x.getAccountId())).orElse(new PtAccountVo());
@@ -128,14 +130,14 @@ public class XfTermServiceImpl implements IXfTermService {
         return baseMapper.selectVoList(query);
     }
 
-    public List<XfTermVo> queryListByIds(List<Long> ids){
+    public List<XfTermVo> queryListByIds(List<Long> ids) {
         LambdaQueryWrapper<XfTerm> lqw = Wrappers.lambdaQuery();
         return baseMapper.selectVoList(lqw.in(XfTerm::getTermId, ids));
     }
 
-    public Map<Long,XfTermVo> queryMapByIds(List<Long> ids){
+    public Map<Long, XfTermVo> queryMapByIds(List<Long> ids) {
         List<XfTermVo> xfTermVos = queryListByIds(ids);
-        if(CollectionUtil.isNotEmpty(xfTermVos)){
+        if (CollectionUtil.isNotEmpty(xfTermVos)) {
             return xfTermVos.stream().collect(Collectors.toMap(XfTermVo::getTermId, x -> x));
         }
 
@@ -197,7 +199,7 @@ public class XfTermServiceImpl implements IXfTermService {
     }
 
     @CacheEvict(cacheNames = CacheNames.PT_TERM, allEntries = true)
-    public Boolean updateParamByBo(XfTermParamBo bo){
+    public Boolean updateParamByBo(XfTermParamBo bo) {
         XfTerm update = MapstructUtils.convert(bo, XfTerm.class);
         return baseMapper.updateById(update) > 0;
     }
@@ -205,20 +207,20 @@ public class XfTermServiceImpl implements IXfTermService {
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(XfTerm entity){
-        //设备机号和设备名称必须唯一
+    private void validEntityBeforeSave(XfTerm entity) {
+        // 设备机号和设备名称必须唯一
         Long aLong = baseMapper.selectCount(Wrappers.<XfTerm>lambdaQuery()
-            .ne(entity.getTermId() != null,XfTerm::getTermId, entity.getTermId())
-            .and(queryWrapper -> queryWrapper.eq(XfTerm::getTermNo, entity.getTermNo())
-                .or().eq(XfTerm::getTermName, entity.getTermName())
-                .or().eq(XfTerm::getTermIp, entity.getTermIp())
-            ));
-        if(aLong>0){
+                                                .ne(entity.getTermId() != null, XfTerm::getTermId, entity.getTermId())
+                                                .and(queryWrapper -> queryWrapper.eq(XfTerm::getTermNo, entity.getTermNo())
+                                                                         .or().eq(XfTerm::getTermName, entity.getTermName())
+                                                                         .or().eq(XfTerm::getTermIp, entity.getTermIp())
+                                                ));
+        if (aLong > 0) {
             throw new ServiceException("设备机号或设备名称或设备IP重复");
         }
         // 校验房间
         PtRoomVo roomVo = roomService.queryById(entity.getRoomId());
-        if(roomVo==null){
+        if (roomVo == null) {
             throw new ServiceException("房间不存在");
         }
     }
@@ -233,8 +235,8 @@ public class XfTermServiceImpl implements IXfTermService {
     @Override
     @CacheEvict(cacheNames = CacheNames.PT_TERM, allEntries = true)
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //可以删除
+        if (isValid) {
+            // 可以删除
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
@@ -248,8 +250,21 @@ public class XfTermServiceImpl implements IXfTermService {
     @Override
     @Cacheable(cacheNames = CacheNames.PT_TERM, key = "#termNo")
     public XfTermVo queryByNo(Long termNo) {
-        XfTermVo vo = baseMapper.selectVoOne(new LambdaQueryWrapper<XfTerm>().eq(XfTerm::getTermNo, termNo));
-        if(vo!=null){
+        return this.queryByNo(termNo, defaultConfig.getTenantId());
+    }
+
+    /**
+     * 根据设备机号查询设备信息
+     *
+     * @param termNo   设备机号
+     * @param tenantId 所属租户Id
+     * @return 设备信息
+     */
+    @Override
+    @Cacheable(cacheNames = CacheNames.PT_TERM, key = "#termNo")
+    public XfTermVo queryByNo(Long termNo, String tenantId) {
+        XfTermVo vo = baseMapper.selectVoOne(new LambdaQueryWrapper<XfTerm>().eq(XfTerm::getTermNo, termNo).eq(XfTerm::getTenantId, tenantId));
+        if (vo != null) {
             PtRoomVo roomVo = roomService.queryById(vo.getRoomId());
             vo.setRoomName(roomVo.getRoomName());
 

+ 2 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/domain/bo/kafka/TraineeCheckIn.java

@@ -4,7 +4,6 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
-import java.util.Date;
 
 /**
  * @ClassName TraineeCheckIn
@@ -37,7 +36,7 @@ public class TraineeCheckIn implements Serializable {
     /**
      * 报到日期
      */
-    private Date checkInDate;
+    private String checkInDate;
 
     /**
      * 支付状态
@@ -47,6 +46,6 @@ public class TraineeCheckIn implements Serializable {
     /**
      * 支付日期
      */
-    private Date payDate;
+    private String payDate;
 
 }

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

@@ -8,8 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
-import org.apache.poi.ss.formula.functions.T;
-import org.dromara.backstage.mq.PushKafkaData;
 import org.dromara.backstage.payment.domain.PtBag;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
@@ -21,9 +19,6 @@ import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.encrypt.utils.YcEncryptUtil;
-import org.dromara.common.message.kafka.constant.EventTypeConstants;
-import org.dromara.common.message.kafka.constant.KafkaTopicConstants;
-import org.dromara.common.message.kafka.enums.EventSenderEnum;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.springframework.stereotype.Service;
@@ -233,7 +228,7 @@ public class PtBagServiceImpl implements IPtBagService {
         //校验入库数据
         PtBag entity = verification(bo);
         //根据不同的操作组装入库数据
-        switch (BalanceUpdateEnum.fromCode(Integer.parseInt(bo.getOperationMode()))) {
+        switch (Objects.requireNonNull(BalanceUpdateEnum.fromCode(Integer.parseInt(bo.getOperationMode())))) {
             case REFUND:
                 refundBag(entity, bo);
                 break;

+ 12 - 5
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java

@@ -10,6 +10,7 @@ import org.apache.commons.lang3.time.DateFormatUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.backstage.api.*;
 import org.dromara.backstage.api.domain.vo.*;
+import org.dromara.common.core.config.DefaultConfig;
 import org.dromara.common.core.constant.ApiErrorTypeConstants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.domain.model.ErrorInfo;
@@ -23,7 +24,10 @@ import org.dromara.server.consume.cache.TokenManager;
 import org.dromara.server.consume.domain.bo.XfCardLimitedBo;
 import org.dromara.server.consume.domain.vo.*;
 import org.dromara.server.consume.domain.vo.yc.TermToken;
-import org.dromara.server.consume.service.*;
+import org.dromara.server.consume.service.IConsumeDetailOriginalService;
+import org.dromara.server.consume.service.IPtBagService;
+import org.dromara.server.consume.service.IXfCardLimitedService;
+import org.dromara.server.consume.service.IXfConsumeDetailService;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 
@@ -67,13 +71,16 @@ public class CheckBusiness {
     private final RemoteXfDiscountService remoteDisCountService;
     @DubboReference
     private final RemoteXfQuotaService remoteQuotaService;
+    @DubboReference
+    private final RemotePtXfTermService remoteXfTermService;
 
-    private final IXfTermService termService;
     private final IConsumeDetailOriginalService consumeDetailOriginalService;
     private final IXfConsumeDetailService consumeDetailService;
     private final IPtBagService bagService;
     private final TokenManager tokenManager;
     private final IXfCardLimitedService cardLimitedService;
+    private final DefaultConfig defaultConfig;
+    // private final SyncRemoteXfTermService syncRemoteXfTermService;
 
     /**
      * 消费记录参数检检查
@@ -163,14 +170,14 @@ public class CheckBusiness {
      */
     public R<ErrorInfo> checkTerm(ConsumptionBo bo, XfTermVo useTermVo) {
         long termNo = bo.getTermNo();
-        XfTermVo termVo = termService.queryVoOneByNo(termNo);
-        if (ObjectUtil.isEmpty(termVo)) {
+        RemoteXfTermVo remoteXfTermVo = remoteXfTermService.queryByNo(termNo,defaultConfig.getTenantId());
+        if (ObjectUtil.isEmpty(remoteXfTermVo)) {
             ErrorInfo errorInfo = new ErrorInfo(400, "", "设备不存在",
                                                 MessageFormat.format("机号为[{0}]的设备不存在,不允许交易", termNo));
 
             return R.fail(errorInfo);
         }
-        BeanUtil.copyProperties(termVo, useTermVo);
+        BeanUtil.copyProperties(remoteXfTermVo, useTermVo);
         return R.ok();
     }
 

+ 9 - 9
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/XfTermServiceImpl.java

@@ -22,7 +22,6 @@ import org.dromara.server.consume.service.IXfTermService;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
-import java.util.Objects;
 
 /**
  * 消费设备Service业务层处理
@@ -104,15 +103,16 @@ public class XfTermServiceImpl implements IXfTermService {
      * @return 消费设备设备
      */
     @Override
+
     public XfTermVo queryVoOneByNo(Long termNo) {
-        XfTermVo vo;
-        List<XfTermVo> redisList = RedisUtils.getCacheList(CacheNames.PT_TERM);
-        if (CollectionUtil.isNotEmpty(redisList)) {
-            vo = redisList.stream().filter(p -> Objects.equals(p.getTermNo(), termNo)).findFirst().orElse(null);
-            if (ObjUtil.isNotNull(vo)) {
-                return vo;
-            }
-        }
+        // XfTermVo vo;
+        // List<XfTermVo> redisList = RedisUtils.getCacheList(CacheNames.PT_TERM);
+        // if (CollectionUtil.isNotEmpty(redisList)) {
+        //     vo = redisList.stream().filter(p -> Objects.equals(p.getTermNo(), termNo)).findFirst().orElse(null);
+        //     if (ObjUtil.isNotNull(vo)) {
+        //         return vo;
+        //     }
+        // }
         XfTermBo bo = new XfTermBo();
         bo.setTermNo(termNo);
         bo.setTenantId(defaultConfig.getTenantId());