Prechádzať zdrojové kódy

feature: 消费对接
1.消费机对接

luo.yibo@datuai.com 1 rok pred
rodič
commit
febd5f64e0
31 zmenil súbory, kde vykonal 1366 pridanie a 36 odobranie
  1. 7 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java
  2. 51 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BagNameEnum.java
  3. 29 31
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtSubsidyitemController.java
  4. 13 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java
  5. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java
  6. 11 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  7. 127 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CardBusiness.java
  8. 1 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java
  9. 97 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/EmployeeBusiness.java
  10. 217 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/TermBusiness.java
  11. 17 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/cache/TokenManager.java
  12. 44 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/AuthController.java
  13. 35 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/CardController.java
  14. 35 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/EmployeeController.java
  15. 26 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/LicenceController.java
  16. 68 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/TermsController.java
  17. 5 2
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/convert/strategy/impl/YcRecordConvertStrategyImpl.java
  18. 5 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/PtBagVo.java
  19. 59 2
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfTermVo.java
  20. 44 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/BagInfo.java
  21. 20 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/CardBagInfo.java
  22. 121 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/CardInfo.java
  23. 29 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/CardStatusVo.java
  24. 29 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/CardTypeVo.java
  25. 23 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/DepartmentVo.java
  26. 31 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/RoomInfo.java
  27. 35 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/SettlementAccount.java
  28. 98 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/TermInfo.java
  29. 31 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/TermToken.java
  30. 25 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/UserCardVo.java
  31. 27 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/UserInfoVo.java

+ 7 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java

@@ -153,4 +153,11 @@ public interface RemoteUserService {
      * @return 修改结果
      */
     R<RemoteUserVo> updateUser(RemoteUserBo remoteUserBo);
+
+    /**
+     * 根据用户账号查询用户
+     * @param userName 用户账号
+     * @return 用户信息
+     */
+    RemoteUserVo selectUserVoByUserName(String userName);
 }

+ 51 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BagNameEnum.java

@@ -0,0 +1,51 @@
+package org.dromara.common.core.enums;
+
+/**
+ * 钱包名称枚举
+ */
+public enum BagNameEnum {
+    XJ(1,"消费现金钱包"),
+    SK(2,"水控钱包"),
+    BZ(3,"消费补助钱包"),
+    YY(4,"脱机信用钱包"),
+    DC(5,"订餐钱包"),
+    PC(6,"配餐钱包");
+
+    private final Integer code;
+    private final String message;
+
+    BagNameEnum(Integer code, String name) {
+        this.code = code;
+        this.message = name;
+    }
+
+    public Integer code() {
+        return this.code;
+    }
+
+    public String message() {
+        return this.message;
+    }
+
+    public static String getMessage(String name) {
+        for (BagNameEnum item : BagNameEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.message;
+            }
+        }
+        return name;
+    }
+    public static String getMessage(Integer code) {
+        for (BagNameEnum item : BagNameEnum.values()) {
+            if (item.code().equals(code)) {
+                return item.message;
+            }
+        }
+        return "未知";
+    }
+    @Override
+    public String toString() {
+        return this.name();
+    }
+
+}

+ 29 - 31
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtSubsidyitemController.java

@@ -1,46 +1,46 @@
 package org.dromara.backstage.cardCenter.controller;
 
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
+import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.itextpdf.kernel.geom.PageSize;
-import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.*;
-import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyReportBo;
+import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyFirstPageVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyReportVo;
+import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo;
+import org.dromara.backstage.cardCenter.service.IPtSubsidyitemService;
+import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.DateUtils;
-import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.pdf.PdfUtil;
-import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
-import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.system.api.model.LoginUser;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.validation.annotation.Validated;
-import org.dromara.common.idempotent.annotation.RepeatSubmit;
-import org.dromara.common.log.annotation.Log;
-import org.dromara.common.web.core.BaseController;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.core.domain.R;
 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.cardCenter.domain.vo.PtSubsidyitemVo;
-import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
-import org.dromara.backstage.cardCenter.service.IPtSubsidyitemService;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
+import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.api.model.LoginUser;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 
-import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.SUBSIDY_ITEM_REMOVE;
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.SUBSIDY_SENDER;
 
 /**
  * 补助明细
@@ -136,8 +136,6 @@ public class PtSubsidyitemController extends BaseController {
 
     /**
      * 首页查询 每月的补助报表
-     * @param bo
-     * @param pageQuery
      * @return
      */
     @GetMapping("/queryUseForIndex")

+ 13 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java

@@ -371,7 +371,18 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         //}
     }
 
-    private void setUserDept(SysUserBo bo,RemoteUserBo remoteBo){
+    /**
+     * 根据账号获取人员信息
+     * @param userName 用户账号
+     * @return 人员信息
+     */
+    @Override
+    public RemoteUserVo selectUserVoByUserName(String userName) {
+        SysUserVo vo = userService.selectUserVoByUserName(userName);
+        return BeanUtil.copyProperties(vo, RemoteUserVo.class);
+    }
+
+    private void setUserDept(SysUserBo bo, RemoteUserBo remoteBo){
         List<UserDeptBo> userDeptBoList = new ArrayList<>();
         if(ObjectUtil.isNotEmpty(remoteBo.getUserDeptList())){
             remoteBo.getUserDeptList().forEach(remoteUserDeptBo -> {
@@ -382,4 +393,5 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         bo.setUserDeptBoList(userDeptBoList);
     }
 
+
 }

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java

@@ -282,4 +282,10 @@ public interface ISysUserService {
      */
     SysUserVo selectUserVoByOtherId(String otherId);
 
+    /**
+     * 根据账号查询用户信息
+     * @param userName 账号
+     * @return 用户信息
+     */
+    SysUserVo selectUserVoByUserName(String userName);
 }

+ 11 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -704,6 +704,17 @@ public class SysUserServiceImpl implements ISysUserService {
         return baseMapper.selectVoOne(new LambdaQueryWrapper<SysUser>()
             .eq(SysUser::getOtherId, otherId));
     }
+    /**
+     * 根据账号查询用户信息
+     * @param userName 账号
+     * @return 用户信息
+     */
+
+    @Override
+    public SysUserVo selectUserVoByUserName(String userName) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<SysUser>()
+                                          .eq(SysUser::getUserName, userName));
+    }
 
     private void insertUserDept(SysUserBo bo, List<UserDeptBo> userDeptBoList) {
         //将已有的人员部门关系设置成非主部门

+ 127 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CardBusiness.java

@@ -0,0 +1,127 @@
+package org.dromara.server.consume.business;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.backstage.api.RemoteCardService;
+import org.dromara.backstage.api.RemoteUserAccountService;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
+import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
+import org.dromara.common.core.api.ReturnResult;
+import org.dromara.common.core.constant.ApiErrorTypeConstants;
+import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.common.core.domain.model.ErrorResult;
+import org.dromara.common.core.enums.BagNameEnum;
+import org.dromara.common.core.enums.ResultCodeEnum;
+import org.dromara.common.encrypt.utils.YcEncryptUtil;
+import org.dromara.server.consume.domain.bo.PtBagBo;
+import org.dromara.server.consume.domain.vo.PtBagVo;
+import org.dromara.server.consume.domain.vo.yc.BagInfo;
+import org.dromara.server.consume.domain.vo.yc.CardBagInfo;
+import org.dromara.server.consume.service.IPtBagService;
+import org.dromara.system.api.RemoteDeptService;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @ClassName EmployeeBusiness
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2024-12-16 15:47
+ * @Version 1.0
+ * @since jdk17
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class CardBusiness {
+    @DubboReference
+    private final RemoteUserAccountService remoteUserAccountService;
+    @DubboReference
+    private final RemoteDeptService remoteDeptService;
+    @DubboReference
+    private final RemoteCardService remoteCardService;
+
+    private final IPtBagService ptBagService;
+
+    public ReturnResult getCardBagsByCardNo(Long cardNo) {
+        RemoteCardVo remoteCardVo = remoteCardService.queryCardByCardNo(cardNo);
+        if (ObjectUtil.isEmpty(remoteCardVo)) {
+            ErrorResult result = new ErrorResult();
+            result.setStatusCode(HttpStatus.NOT_FOUND.value());
+            result.setMessage("获取卡片信息失败");
+            result.getErrors()
+                .add(new ErrorInfo(1, "获取卡片信息失败", ApiErrorTypeConstants.NOT_FOUND, "流水号为[" + cardNo + "]的卡片不存在!"));
+
+            return ReturnResult.failure(ResultCodeEnum.DATA_NOT_FOUND, result);
+        }
+        return ReturnResult.success(this.setCardBagInfo(remoteCardVo));
+    }
+
+    private Object setCardBagInfo(RemoteCardVo remoteCardVo) {
+        CardBagInfo cardBagInfo = new CardBagInfo();
+        RemoteUserAccountVo userAccountVo = remoteUserAccountService.getUserAccountVoById(remoteCardVo.getUserId());
+        PtBagBo bagBo = new PtBagBo();
+        bagBo.setUserId(remoteCardVo.getUserId());
+        List<PtBagVo> bagVos = ptBagService.queryList(bagBo);
+        PtBagVo bagVo = null;
+        BagInfo bagInfo = null;
+        for (PtBagVo vo : bagVos) {
+            bagInfo = new BagInfo();
+            bagInfo.setBagid(Integer.valueOf(vo.getBagCode()));
+            bagInfo.setBagname(BagNameEnum.getMessage(bagInfo.getBagid()));
+            bagInfo.setCardid(remoteCardVo.getCardNo().intValue());
+            bagInfo.setEmployeeid(userAccountVo.getUserNo());
+            // 获取解密后的卡余
+            if (ObjectUtil.isNotEmpty(vo.getEncryptBalance())) {
+                String decryptValue = YcEncryptUtil.decryptByRsaPublicKeySection(vo.getEncryptBalance(), vo.getUserId().toString());
+                bagInfo.setCardvalue(new BigDecimal(decryptValue));
+            } else {
+                bagInfo.setCardvalue(vo.getBalance());
+            }
+
+            bagInfo.setXfmoneytotal(vo.getConsumeTotal());
+            bagInfo.setXfcount(vo.getConsumeCount().intValue());
+            bagInfo.setCzmoneytotal(vo.getRechargeTotal());
+            bagInfo.setCzcount(vo.getRechargeCount().intValue());
+            bagInfo.setBagupdatedate(DateUtil.formatDate(vo.getUpdateTime()));
+            bagInfo.setBagstatusid(1);
+            bagInfo.setBagstatuschangedate(DateUtil.formatDate(vo.getUpdateTime()));
+            bagInfo.setCreateuser(1);
+            bagInfo.setCreatedate(DateUtil.formatDate(vo.getCreateTime()));
+            bagInfo.setModifyuser(1);
+            bagInfo.setModifydate(DateUtil.formatDate(vo.getCreateTime()));
+            bagInfo.setCardvaluE_ENRYPT("");
+
+            cardBagInfo.getBags().add(bagInfo);
+        }
+        cardBagInfo.setCardID(remoteCardVo.getCardNo());
+        cardBagInfo.setEmployeeID(userAccountVo.getUserNo());
+        cardBagInfo.setFactoryFixID(remoteCardVo.getFactoryId());
+        cardBagInfo.setCardTypeID(remoteCardVo.getCardType().intValue());
+        cardBagInfo.setValidateDate(DateUtil.formatTime(remoteCardVo.getLifespan()));
+        // cardBagInfo.setDeposit(remoteCardVo.get());
+        cardBagInfo.setCreditFactor(Objects.equals(remoteCardVo.getMainCard(), "Y") ? 1 : 2);
+        cardBagInfo.setCardStatusIDXF(Integer.parseInt(remoteCardVo.getStatus()));
+        cardBagInfo.setCardStatusIDJS(Integer.parseInt(remoteCardVo.getStatus()));
+        cardBagInfo.setStatusChangeTimeXF(DateUtil.formatDate(remoteCardVo.getChangeTime()));
+        cardBagInfo.setStatusChangeTimeJS(cardBagInfo.getStatusChangeTimeXF());
+        cardBagInfo.setUpdateDateBalanceXF(cardBagInfo.getStatusChangeTimeXF());
+        cardBagInfo.setUpdateDateBalanceJS(cardBagInfo.getStatusChangeTimeXF());
+        // cardBagInfo.setCreateDate(DateUtils.formatDate(remoteCardVo.getCreateTime(), null));
+        // cardBagInfo.setModifyDate(DateUtils.formatDate(remoteCardVo.getUpdateTime(), null));
+        cardBagInfo.setDayCount(remoteCardVo.getDayCount().intValue());
+        cardBagInfo.setMealCount(remoteCardVo.getMealCount().intValue());
+        cardBagInfo.setLastPayMealType(remoteCardVo.getLastMeal().intValue());
+        cardBagInfo.setDayValue(remoteCardVo.getDayTotal());
+        cardBagInfo.setMealValue(remoteCardVo.getMealTotal());
+
+        return cardBagInfo;
+    }
+}

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

@@ -422,6 +422,7 @@ public class CheckBusiness {
                                         MessageFormat.format("余额不足,余额[{0}],消费金额[{1}]", totalBalance,
                                                              consumeMoney)));
         }
+        bo.setBalance(totalBalance.subtract(consumeMoney));
         bagVos.addAll(doBagVos);
         return R.ok();
     }

+ 97 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/EmployeeBusiness.java

@@ -0,0 +1,97 @@
+package org.dromara.server.consume.business;
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.backstage.api.RemoteCardService;
+import org.dromara.backstage.api.RemoteUserAccountService;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
+import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
+import org.dromara.common.core.api.ReturnResult;
+import org.dromara.common.core.constant.ApiErrorTypeConstants;
+import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.common.core.domain.model.ErrorResult;
+import org.dromara.common.core.enums.ResultCodeEnum;
+import org.dromara.server.consume.domain.vo.yc.*;
+import org.dromara.system.api.RemoteDeptService;
+import org.dromara.system.api.domain.vo.RemoteDeptVo;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+
+/**
+ * @ClassName EmployeeBusiness
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2024-12-16 15:47
+ * @Version 1.0
+ * @since jdk17
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class EmployeeBusiness {
+    @DubboReference
+    private final RemoteUserAccountService remoteUserAccountService;
+    @DubboReference
+    private final RemoteDeptService remoteDeptService;
+    @DubboReference
+    private final RemoteCardService remoteCardService;
+
+
+    public ReturnResult getEmployeeVoByNumb(String userNumb) {
+        RemoteUserAccountVo userAccountVo = remoteUserAccountService.getUserAccountVoByUserNumb(userNumb);
+        if (ObjectUtil.isEmpty(userAccountVo)) {
+            ErrorResult result = new ErrorResult();
+            result.setStatusCode(HttpStatus.NOT_FOUND.value());
+            result.setMessage("获取用户信息失败");
+            result.getErrors()
+                .add(new ErrorInfo(1, "获取用户信息失败", ApiErrorTypeConstants.NOT_FOUND, "编号为[" + userNumb + "]的用户不存在!"));
+
+            return ReturnResult.failure(ResultCodeEnum.DATA_NOT_FOUND, result);
+        }
+        return ReturnResult.success(this.setReturnEmployeeVo(userAccountVo));
+    }
+
+    private Object setReturnEmployeeVo(RemoteUserAccountVo userAccountVo) {
+        RemoteDeptVo remoteDeptVo = remoteDeptService.selectDeptById(userAccountVo.getDeptId());
+        DepartmentVo departmentVo = new DepartmentVo();
+        departmentVo.setDepartmentID(remoteDeptVo.getDeptId().toString());
+        departmentVo.setParentDepartmentID(remoteDeptVo.getParentId().toString());
+        departmentVo.setDepartmentName(remoteDeptVo.getDeptName());
+
+        RemoteCardVo remoteCardVo = remoteCardService.queryMainCardByUserId(userAccountVo.getUserId());
+        UserCardVo userCardVo = new UserCardVo();
+        Long cardNo = 0L;
+        if (ObjectUtil.isNotEmpty(remoteCardVo)) {
+            CardStatusVo cardStatusVo = new CardStatusVo();
+            int cardStatusId = Integer.parseInt(remoteCardVo.getStatus());
+            cardStatusVo.setCardStatusID(cardStatusId);
+            cardStatusVo.setCardStatus(cardStatusId == 1 ? "正常"
+                                           : cardStatusId == 2 ? "挂失" : cardStatusId == 3 ? "注销"
+                                           : cardStatusId == 4 ? "退卡" : cardStatusId == 7 ?"冻结" :"未知");
+            userCardVo.setCardStatus(cardStatusVo);
+
+            CardTypeVo cardTypeVo = new CardTypeVo();
+            cardTypeVo.setCardTypeId(remoteCardVo.getCardType().intValue());
+            cardTypeVo.setCardType(remoteCardVo.getCardTypeName());
+            userCardVo.setCardType(cardTypeVo);
+
+            userCardVo.setCardTypeID(remoteCardVo.getCardType().intValue());
+            userCardVo.setEmployeeID(userAccountVo.getUserNo());
+            userCardVo.setFactoryFixID(remoteCardVo.getFactoryId());
+            cardNo = remoteCardVo.getCardNo();
+        }
+        UserInfoVo userInfoVo = new UserInfoVo();
+        userInfoVo.setDepartment(departmentVo);
+        userInfoVo.setCard(userCardVo);
+        userInfoVo.setEmployeeID(userAccountVo.getUserNo());
+        userInfoVo.setEmployeeName(userAccountVo.getRealName());
+        userInfoVo.setEmployeeStrID(userAccountVo.getUserNumb());
+        userInfoVo.setCardId(cardNo);
+        // String consumePwd = null;
+        userInfoVo.setEmployeePWDWeb("");
+
+        return userInfoVo;
+    }
+}

+ 217 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/TermBusiness.java

@@ -0,0 +1,217 @@
+package org.dromara.server.consume.business;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.domain.R;
+import org.dromara.server.common.constant.DefaultConstants;
+import org.dromara.server.consume.cache.TokenManager;
+import org.dromara.server.consume.domain.vo.XfTermVo;
+import org.dromara.server.consume.domain.vo.yc.RoomInfo;
+import org.dromara.server.consume.domain.vo.yc.SettlementAccount;
+import org.dromara.server.consume.domain.vo.yc.TermInfo;
+import org.dromara.server.consume.domain.vo.yc.TermToken;
+import org.dromara.server.consume.service.IXfTermService;
+import org.dromara.system.api.RemoteUserService;
+import org.dromara.system.api.domain.vo.RemoteUserVo;
+import org.springframework.stereotype.Service;
+
+import java.text.MessageFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @ClassName TermBusiness
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2024-12-18 08:50
+ * @Version 1.0
+ * @since jdk17
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class TermBusiness {
+    private static final Object locker = new Object();
+    @DubboReference
+    private final RemoteUserService remoteUserService;
+    private final IXfTermService termService;
+    private final TokenManager tokenManager;
+
+    private static final ConcurrentHashMap<Integer, Long> lastCheckModify = new ConcurrentHashMap<>();
+    private static final ConcurrentHashMap<Integer, Long> lastModify = new ConcurrentHashMap<>();
+    private static final ConcurrentHashMap<Integer, Long> lastCheckBlack = new ConcurrentHashMap<>();
+    private static final ConcurrentHashMap<Integer, Long> lastBlack = new ConcurrentHashMap<>();
+
+    public R<TermToken> getTermToken(Long termNo, String admin, String pwd) {
+        XfTermVo termVo = termService.queryVoOneByNo(termNo);
+        if (ObjectUtil.isEmpty(termVo)) {
+            return R.fail(MessageFormat.format("机号为[{0}]的设备不存在", termNo), null);
+        }
+        RemoteUserVo userVo = remoteUserService.selectUserVoByUserName(admin);
+        if (ObjectUtil.isEmpty(userVo)) {
+            return R.fail(MessageFormat.format("用户为[{0}]的用户不存在", admin), null);
+        }
+        TermToken termToken = null;
+        synchronized (locker) {
+            String strTermNo = String.valueOf(termNo);
+            termToken = tokenManager.getTermToken().get(strTermNo);
+            if (ObjectUtil.isEmpty(termToken)) {
+                LocalDateTime ldt = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
+                Date minDate = Date.from(ldt.toInstant(ZoneOffset.of("+8")));
+
+                LocalDateTime now = LocalDateTime.now();
+                LocalDateTime expireTime = now.plusHours(2);
+                termToken = new TermToken(strTermNo, UUID.randomUUID().toString(), admin, new Date(), minDate,
+                                          Date.from(expireTime.toInstant(ZoneOffset.of("+8"))));
+
+                tokenManager.getTermToken().put(strTermNo, termToken);
+            } else {
+                if (termToken.getExpireTime().getTime() < new Date().getTime()) {
+                    LocalDateTime ldt = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
+                    Date minDate = Date.from(ldt.toInstant(ZoneOffset.of("+8")));
+
+                    LocalDateTime now = LocalDateTime.now();
+                    LocalDateTime expireTime = now.plusHours(2);
+                    Date expireDate = Date.from(expireTime.toInstant(ZoneOffset.of("+8")));
+
+                    termToken.setAdmin(admin);
+                    termToken.setToken(UUID.randomUUID().toString());
+                    termToken.setDateTime(new Date());
+                    termToken.setAuthTime(minDate);
+                    termToken.setExpireTime(expireDate);
+                } else {
+                    termToken.setAdmin(admin);
+                }
+            }
+        }
+        return R.ok(MessageFormat.format("获取token成功,设备编号[{0}],账号[{1}]", termNo, admin), termToken);
+    }
+
+    public R<TermInfo> getTermInfoByTermNo(Long termNo) {
+        XfTermVo termVo = termService.queryVoOneByNo(termNo);
+        if (ObjectUtil.isEmpty(termVo)) {
+            return R.fail(MessageFormat.format("机号为[{0}]的设备不存在", termNo), null);
+        }
+
+        TermInfo termInfo = this.convertToYc(termVo);
+
+        return R.ok(termInfo);
+    }
+
+    public R<Map<String, Object>> checkTermTime(Integer termNo) {
+        XfTermVo termVo = termService.queryVoOneByNo(Long.valueOf(termNo));
+        if (ObjectUtil.isEmpty(termVo)) {
+            return R.fail(MessageFormat.format("机号为[{0}]的设备不存在", termNo), null);
+        }
+        Map<String, Object> resultMap = new HashMap<>();
+        if (!lastCheckModify.containsKey(termNo)) {
+            lastCheckModify.put(termNo, 0L);
+        }
+        Date nowDate = new Date();
+        long currentTime = nowDate.getTime();
+        if (currentTime > lastCheckModify.get(termNo)) {
+            lastCheckModify.put(termNo, currentTime + 1000 * 60);
+        }
+        resultMap.put("time", DateUtil.format(nowDate, DefaultConstants.DATE_TIME_FORMAT));
+        resultMap.put("type", "");
+        resultMap.put("data", termVo == null ? "" : termVo.getTermName());
+
+        return R.ok(resultMap);
+    }
+
+    private TermInfo convertToYc(XfTermVo termVo) {
+        TermInfo termInfo = new TermInfo();
+        termInfo.setTermId(termVo.getTermId().toString());
+        termInfo.setTermNo(termVo.getTermNo().intValue());
+        termInfo.setTermName(termVo.getTermName());
+        termInfo.setTermType(termVo.getTermType());
+        termInfo.setConsumeType("4");
+        termInfo.setRoomId(termVo.getRoomId().toString());
+        termInfo.setAccountId(termVo.getAccountId().toString());
+        termInfo.setWorkStationId(termVo.getStationId() == null ? null : termVo.getStationId().toString());
+        termInfo.setUseType(termVo.getUseType());
+        termInfo.setCardTypeId(termVo.getCardType());
+        termInfo.setOperateMode(!termVo.getOpenMode().equals("0"));
+        termInfo.setWorkModeId(termVo.getWorkMode());
+        termInfo.setTermDescript(termVo.getRemark());
+        termInfo.setTermRecordId(termVo.getRecordId());
+        termInfo.setRecordUpTime(termVo.getUploadTime());
+        termInfo.setBlackListDownTime(termVo.getBlackDownTime());
+        termInfo.setMaxMoney(termVo.getSingleMoney());
+        termInfo.setMaxCardMoney(termVo.getMaxCardMoney());
+        termInfo.setEachMealMoney(termVo.getConstantValue());
+        termInfo.setRation0(termVo.getRationZero());
+        termInfo.setRation1(termVo.getRationOne());
+        termInfo.setRation2(termVo.getRationTwo());
+        termInfo.setRation3(termVo.getRationThree());
+        termInfo.setRation4(termVo.getRationFour());
+        termInfo.setRation5(termVo.getRationFive());
+        termInfo.setRation6(termVo.getRationSix());
+        termInfo.setRation7(termVo.getRationSeven());
+        termInfo.setRation8(termVo.getRationEight());
+        termInfo.setRation9(termVo.getRationNine());
+        termInfo.setTimesQuota(termVo.getDayCount());
+        termInfo.setValueQuota(termVo.getDayMoney());
+        termInfo.setMealTimesQuota(termVo.getMealCount());
+        termInfo.setDejeunerValue(termVo.getBreakfastMoney());
+        termInfo.setLunchValue(termVo.getLunchMoney());
+        termInfo.setSupperValue(termVo.getSupperMoney());
+        termInfo.setNightValue(termVo.getNightMoney());
+        termInfo.setDejeunerBegin(termVo.getBreakfastBegin().intValue());
+        termInfo.setDejeunerEnd(termVo.getBreakfastEnd().intValue());
+        termInfo.setLunchBegin(termVo.getLunchBegin().intValue());
+        termInfo.setLunchEnd(termVo.getLunchEnd().intValue());
+        termInfo.setSupperBegin(termVo.getSupperBegin().intValue());
+        termInfo.setSupperEnd(termVo.getSupperEnd().intValue());
+        termInfo.setNightMealBegin(termVo.getNightBegin().intValue());
+        termInfo.setNightMealEnd(termVo.getNightEnd().intValue());
+        termInfo.setTermIP(termVo.getTermIp());
+        termInfo.setTermMAC(termVo.getTermMac());
+        termInfo.setTermPort(termVo.getCommPort().toString());
+        termInfo.setUseTermOfValidity(termVo.getTermValidity().equals("1"));
+        termInfo.setPosParam(null);
+        termInfo.setRateParam(null);
+        termInfo.setAdvParam(null);
+        termInfo.setGatewayIp(termVo.getGatewayIp());
+        termInfo.setServerIp(termVo.getServerIp());
+        termInfo.setServerPort(termVo.getServerPort().toString());
+        termInfo.setMask(termVo.getMask());
+        termInfo.setQrCode(termVo.getQrCode());
+        termInfo.setIsAutoDownParameter(termVo.getAutoDown().equals("Y"));
+        termInfo.setLastCheckTime(termVo.getLastCheck());
+        termInfo.setOutLineMin(termVo.getOfflineTime().intValue());
+        termInfo.setAvailableInterval(termVo.getSwipeInterval());
+        termInfo.setRebootTime(termVo.getRebootTime());
+        termInfo.setTimeout(termVo.getTimeout().intValue());
+        termInfo.setBeatInterval(termVo.getBeatInterval().intValue());
+        // termInfo.setAllowOfflineTime();
+        termInfo.setRoomName(termVo.getRoomName());
+        // termInfo.setCreateTime();
+        // termInfo.setCreateUser();
+        // termInfo.setIsDelete();
+        // termInfo.setOrderIndex();
+        // termInfo.setUpdateTime();
+        // termInfo.setUpdateUser();
+        termInfo.setVersion(0);
+
+        RoomInfo roomInfo = new RoomInfo();
+        roomInfo.setAreaID(termVo.getRoomId().toString());
+        roomInfo.setAreaName(termVo.getRoomName());
+        termInfo.setArea(roomInfo);
+
+        SettlementAccount account = new SettlementAccount();
+        account.setAccountID(termVo.getAccountId().toString());
+        account.setAccountName(termVo.getAccountName());
+        termInfo.setAccount(account);
+
+        return termInfo;
+    }
+}

+ 17 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/cache/TokenManager.java

@@ -0,0 +1,17 @@
+package org.dromara.server.consume.cache;
+
+import lombok.Getter;
+import org.dromara.server.consume.domain.vo.yc.TermToken;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+@Getter
+@Component
+@Qualifier("TokenManager")
+public class TokenManager {
+	private final ConcurrentMap<String, TermToken> termToken = new ConcurrentHashMap<>();
+
+}

+ 44 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/AuthController.java

@@ -0,0 +1,44 @@
+package org.dromara.server.consume.controller.v1;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.ApiErrorTypeConstants;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.common.core.domain.model.ErrorResult;
+import org.dromara.server.consume.business.TermBusiness;
+import org.dromara.server.consume.domain.vo.yc.TermToken;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(path = { "/v1/Auth" })
+public class AuthController {
+
+	private final TermBusiness termBusiness;
+
+	/**
+	 * 获取设备Token
+	 *
+	 * @param termId 设备的机号(兼容UP)
+	 * @return token
+	 */
+	@GetMapping("/token/term/{termId}")
+	public Object termToken(@PathVariable("termId") Long termId, @RequestHeader(name = "admin") String admin,
+			@RequestHeader(name = "pwd") String pwd) {
+
+		R<TermToken> mapResult = termBusiness.getTermToken(termId, admin, pwd);
+
+		if (R.isError(mapResult)) {
+			ErrorResult result = new ErrorResult();
+			result.setStatusCode(HttpStatus.BAD_REQUEST.value());
+			result.setMessage("获取Token失败");
+			result.getErrors().add(new ErrorInfo(1, "获取设备Token失败", ApiErrorTypeConstants.BAD_REQUEST, mapResult.getMsg()));
+
+			return new ResponseEntity<Object>(result, null, HttpStatus.BAD_REQUEST);
+		}
+
+		return mapResult.getData();
+	}
+}

+ 35 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/CardController.java

@@ -0,0 +1,35 @@
+package org.dromara.server.consume.controller.v1;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.api.ReturnResult;
+import org.dromara.common.core.constant.HttpStatus;
+import org.dromara.server.consume.business.CardBusiness;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @ClassName CardController
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2024-12-16 20:13
+ * @Version 1.0
+ * @since jdk17
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/v1/Cards")
+public class CardController {
+    private final CardBusiness cardBusiness;
+    @GetMapping("/{cardNo}/bags")
+    public Object getCardBags(@PathVariable("cardNo") Long cardNo) {
+        ReturnResult result = cardBusiness.getCardBagsByCardNo(cardNo);
+        if(result.isSuccess()){
+            return result.getData();
+        } else{
+            return new ResponseEntity<>(result.getData(), null, HttpStatus.NOT_FOUND);
+        }
+    }
+}

+ 35 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/EmployeeController.java

@@ -0,0 +1,35 @@
+package org.dromara.server.consume.controller.v1;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.api.ReturnResult;
+import org.dromara.common.core.constant.HttpStatus;
+import org.dromara.server.consume.business.EmployeeBusiness;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @ClassName EmployeeController
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2024-12-16 15:37
+ * @Version 1.0
+ * @since jdk17
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/v1/Employees")
+public class EmployeeController {
+    private final EmployeeBusiness employeeBusiness;
+    @GetMapping("/{userNumb}")
+    public Object getEmployeeByUserNumb(@PathVariable("userNumb") String userNumb) {
+        ReturnResult result = employeeBusiness.getEmployeeVoByNumb(userNumb);
+        if(result.isSuccess()){
+            return result.getData();
+        } else{
+            return new ResponseEntity<>(result.getData(), null, HttpStatus.NOT_FOUND);
+        }
+    }
+}

+ 26 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/LicenceController.java

@@ -0,0 +1,26 @@
+package org.dromara.server.consume.controller.v1;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @ClassName LicenceController
+ * @Description 消费授权控制器
+ * @Author luoyibo
+ * @Date 2024-12-16 11:02
+ * @Version 1.0
+ * @since jdk17
+ */
+@RestController
+@RequestMapping("Licence")
+public class LicenceController {
+    @GetMapping()
+    public Object getUser(@RequestParam(name = "key") String key) {
+        String license = "H4sIAAAAAAAAAAGAAH//KB7A//d/5ZJVovg9EYnfvkVEhwN2vHb7PGzvWOBlQYOZipycgUk+lMNpcooniVZEW9asKT4zfD1QpAXzHcGRxMatacpi1Bp82EmlDQn0Y4QFbgZiuvSzDbEVb2tQ1AhcDm9benoVYSkISCQb8pvRg9edSB08JCupRk1otYYHu5CtvCkFgAAAAA==";
+        String message = "";
+
+        return license;
+    }
+}

+ 68 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/TermsController.java

@@ -0,0 +1,68 @@
+package org.dromara.server.consume.controller.v1;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.ApiErrorTypeConstants;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.common.core.domain.model.ErrorResult;
+import org.dromara.server.consume.business.TermBusiness;
+import org.dromara.server.consume.domain.vo.yc.TermInfo;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(path = { "/v1/Terms" })
+public class TermsController {
+
+	private final TermBusiness termBusiness;
+
+	/**
+	 * 获取设备信息(根据机号)
+	 *
+	 * @param termNo 设备的机号(兼容UP)
+	 * @return token
+	 */
+	@GetMapping("/{termNo}")
+	public Object getTermByTermNo(@PathVariable("termNo") Long termNo) {
+
+        R<TermInfo> mapResult = termBusiness.getTermInfoByTermNo(termNo);
+		if (R.isError(mapResult)) {
+			ErrorResult result = new ErrorResult();
+			result.setStatusCode(HttpStatus.BAD_REQUEST.value());
+			result.setMessage("获取设备信息失败");
+			result.getErrors().add(new ErrorInfo(1, "获取设备信息失败", ApiErrorTypeConstants.BAD_REQUEST, mapResult.getMsg()));
+
+			return new ResponseEntity<Object>(result, null, HttpStatus.BAD_REQUEST);
+		}
+
+		return mapResult.getData();
+	}
+
+    /**
+     * 设备校时
+     * @param termNo 设备编号
+     * @return 校时
+     */
+    @GetMapping("/CheckTime/{termNo}")
+    public Object checkTermTime(@PathVariable("termNo") Integer termNo){
+        R<Map<String,Object>> mapResult = termBusiness.checkTermTime(termNo);
+        if (R.isError(mapResult)) {
+            ErrorResult result = new ErrorResult();
+            result.setStatusCode(HttpStatus.BAD_REQUEST.value());
+            result.setMessage("设备校时失败");
+            result.getErrors().add(new ErrorInfo(1, "设备校时失败", ApiErrorTypeConstants.BAD_REQUEST, mapResult.getMsg()));
+
+            return new ResponseEntity<Object>(result, null, HttpStatus.BAD_REQUEST);
+        }
+
+        return mapResult.getData();
+    }
+
+}

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

@@ -4,7 +4,8 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.dromara.server.common.constant.DefaultConstants;
 import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
 import org.dromara.server.common.util.CardDateUtils;
@@ -27,6 +28,7 @@ import java.math.RoundingMode;
  * @since JDK 1.8
  */
 @Service(TermSupplierConstants.YC)
+@Slf4j
 public class YcRecordConvertStrategyImpl implements IRecordConvertStrategy {
     @Override
     public ConsumptionBo convertToStandard(Object source) {
@@ -62,7 +64,7 @@ public class YcRecordConvertStrategyImpl implements IRecordConvertStrategy {
             yc.setConsumeValue(bo.getConsumeMoney());
             yc.setConsumeDate(DateUtil.format(bo.getConsumeDate(),DefaultConstants.TERM_DATE_FORMAT));
             yc.setCreateDate(DateUtil.format(bo.getConsumeDate(),DefaultConstants.TERM_DATE_FORMAT));
-            yc.setCardValueXY(BigDecimal.ZERO);
+            yc.setCardValueXY(new BigDecimal(20));
             yc.setCardValue(bo.getBalance());
             yc.setCardID(bo.getCardNo());
             yc.setFactoryFixID(bo.getFactoryId());
@@ -78,6 +80,7 @@ public class YcRecordConvertStrategyImpl implements IRecordConvertStrategy {
             yc.setOperatorID(bo.getOperatorId());
             yc.setConsumeDetailId(bo.getTermRecordId());
 
+            log.info(JSONUtil.toJsonStr(yc));
             return yc;
         }
         return null;

+ 5 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/PtBagVo.java

@@ -8,6 +8,7 @@ import org.dromara.server.consume.domain.PtBag;
 import java.io.Serial;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Date;
 
 
 /**
@@ -79,4 +80,8 @@ public class PtBagVo implements Serializable {
      */
     private BigDecimal receiptMoney;
 
+    private Date createTime;
+
+    private Date updateTime;
+
 }

+ 59 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfTermVo.java

@@ -8,6 +8,7 @@ import org.dromara.server.consume.domain.XfTerm;
 import java.io.Serial;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Date;
 
 
 /**
@@ -34,11 +35,19 @@ public class XfTermVo implements Serializable {
      */
     private Long termNo;
 
+    /**
+     * 工作站Id
+     */
+    private Long stationId;
+
     /**
      * 设备名称
      */
     private String termName;
-
+    /**
+     * 设备二维码
+     */
+    private String qrCode;
     /**
      * 所属餐厅Id
      */
@@ -72,10 +81,24 @@ public class XfTermVo implements Serializable {
      */
     private String termIp;
 
+    /**
+     * 设备MAC地址
+     */
+    private String termMac;
+
     /**
      * 设备通讯端口
      */
     private Long commPort;
+    /**
+     * 子网掩码
+     */
+    private String mask;
+
+    /**
+     * 网关IP
+     */
+    private String gatewayIp;
 
     /**
      * 服务器IP
@@ -100,7 +123,10 @@ public class XfTermVo implements Serializable {
      * 租户编号
      */
     private String tenantId;
-
+    /**
+     * 应用系统,见YYXT数据字典类别
+     */
+    private String useType;
     //region 以下为消费机的参数属性
     private Integer cardType;
 
@@ -268,5 +294,36 @@ public class XfTermVo implements Serializable {
      * 重启时间
      */
     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
 }

+ 44 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/BagInfo.java

@@ -0,0 +1,44 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @ClassName CardInfo
+ * @Description 钱包信息
+ * @Author luoyibo
+ * @Date 2024-12-16 19:58
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class BagInfo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -4409916059306831799L;
+    // 卡流水号
+    private Integer cardid;
+    // 钱包编号
+    private Integer bagid;
+    // 用户流水号
+    private Long employeeid;
+    // 钱包名称
+    private String bagname;
+    // 解密后的金额
+    private BigDecimal cardvalue;
+
+    private BigDecimal xfmoneytotal;
+    private Integer xfcount;
+    private BigDecimal czmoneytotal;
+    private Integer czcount;
+    private String bagupdatedate;
+    private Integer bagstatusid;
+    private String bagstatuschangedate;
+    private Integer createuser;
+    private String createdate;
+    private Integer modifyuser;
+    private String modifydate;
+    private String cardvaluE_ENRYPT;
+}

+ 20 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/CardBagInfo.java

@@ -0,0 +1,20 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 卡片钱包信息(兼容UP安卓消费机)
+ *
+ * @author ZZK
+ *
+ *         2019年9月20日
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class CardBagInfo extends CardInfo {
+ 	private List<BagInfo> bags = new ArrayList<>();
+}

+ 121 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/CardInfo.java

@@ -0,0 +1,121 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @ClassName CardInfo
+ * @Description 卡片信息
+ * @Author luoyibo
+ * @Date 2024-12-16 19:58
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class CardInfo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -4409916059306831799L;
+    private Long cardID;
+
+    private Long employeeID;
+
+    private Long factoryFixID;
+
+    private Integer cardTypeID;
+
+    private String validateDate; // 卡有效期 "2030-03-05"
+    private BigDecimal deposit; // 押金
+    private BigDecimal cardValueXF; // 消费钱包卡余
+    private BigDecimal accountValueXF; // 信用钱包卡余
+    private Integer creditCountorXF; // 信用消费次数
+    private Integer debitCountorXF; // 消费次数
+
+    private BigDecimal cardValueJS; // 水控钱包卡余
+    private BigDecimal accountValueJS; // 水控信用钱包卡余
+    private Integer creditCountorJS; // 水控信用消费次数
+    private Integer debitCountorJS; // 水控消费次数
+
+    private Integer creditFactor; // 是否主卡
+    private Integer cardStatusIDXF;
+    private Integer cardStatusIDJS;
+    private String statusChangeTimeXF;// "2020-08-05 16:31:18.2230000"
+    private String statusChangeTimeJS;
+    private String updateDateBalanceXF;
+    private String updateDateBalanceJS;
+
+    private Integer createOperatorId;
+    private Integer modifyOperatorId;
+
+    private String createDate;
+    private String modifyDate;
+    //@JsonProperty(value = "isComsumeUpdateXF")
+    private Boolean isComsumeUpdateXF;
+    //@JsonProperty(value = "isComsumeUpdateJS")
+    private Boolean isComsumeUpdateJS;
+    //@JsonProperty(value = "isRFSimCard")
+    private Boolean isRFSimCard;
+    private Boolean mjIsEnable;
+    private String mjDateStart;
+    private String mjDateEnd;
+    private Integer mjPassword;
+    private Integer mjCardId;
+
+    private Integer cardident;
+    private String factoryFixID32;
+
+    private Integer dayCount;
+    private Integer mealCount;
+    private Integer lastPayMealType;
+    private BigDecimal dayValue;
+    private BigDecimal mealValue;
+
+    public CardInfo() {
+        this.cardID = 0L;
+        this.employeeID = 0L;
+        this.factoryFixID = 0L;
+        this.cardTypeID = 0;
+        this.validateDate = "2050-01-01";
+        this.deposit = BigDecimal.ZERO;
+        this.cardValueXF = BigDecimal.ZERO;
+        this.accountValueXF = BigDecimal.ZERO;
+        this.creditCountorXF = 0;
+        this.debitCountorXF = 0;
+
+        this.cardValueJS = BigDecimal.ZERO;
+        this.accountValueJS = BigDecimal.ZERO;
+        this.creditCountorJS = 0;
+        this.debitCountorJS = 0;
+
+        this.creditFactor = 0;
+        this.cardStatusIDXF = 0;
+        this.cardStatusIDJS = 0;
+        this.statusChangeTimeXF = "2024-12-16 16:31:18.2230000";
+        this.statusChangeTimeJS = "2024-12-16 16:31:18.2230000";
+        this.updateDateBalanceXF = "2024-12-16 16:31:18.2230000";
+        this.updateDateBalanceJS = "2024-12-16 16:31:18.2230000";
+        this.createOperatorId = 0;
+        this.modifyOperatorId = 0;
+
+        this.createDate = "2024-12-16 16:31:18.2230000";
+        this.modifyDate = "2024-12-16 16:31:18.2230000";
+        this.isComsumeUpdateXF = false;
+        this.isComsumeUpdateJS = false;
+        this.isRFSimCard = false;
+        this.mjIsEnable = false;
+        this.mjDateStart = "2024-12-16 16:31:18.2230000";
+        this.mjDateEnd = "2024-12-16 16:31:18.2230000";
+        this.mjPassword = 0;
+        this.mjCardId = 0;
+
+        this.cardident = 0;
+        this.factoryFixID32 = "";
+        this.dayCount = 0;
+        this.mealCount = 0;
+        this.lastPayMealType = 0;
+        this.dayValue = BigDecimal.ZERO;
+        this.mealValue = BigDecimal.ZERO;
+    }
+}

+ 29 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/CardStatusVo.java

@@ -0,0 +1,29 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @ClassName CardTypeBo
+ * @Description 卡片状态业务对象
+ * @Author luoyibo
+ * @Date 2024-12-16 15:54
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class CardStatusVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+    /**
+     * 卡状态Id
+     */
+    private Integer cardStatusID;
+
+    /**
+     * 卡状态名称
+     */
+    private String cardStatus;
+}

+ 29 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/CardTypeVo.java

@@ -0,0 +1,29 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @ClassName CardTypeBo
+ * @Description 卡片类型业务对象
+ * @Author luoyibo
+ * @Date 2024-12-16 15:54
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class CardTypeVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+    /**
+     * 卡类型Id
+     */
+    private Integer cardTypeId;
+
+    /**
+     * 卡类型名称
+     */
+    private String cardType;
+}

+ 23 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/DepartmentVo.java

@@ -0,0 +1,23 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @ClassName UserCardBo
+ * @Description 部门业务对象
+ * @Author luoyibo
+ * @Date 2024-12-16 16:02
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class DepartmentVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -2973604562520803864L;
+    private String departmentID;
+    private String parentDepartmentID;
+    private String departmentName;
+}

+ 31 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/RoomInfo.java

@@ -0,0 +1,31 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @ClassName RoomInfo
+ * @Description 房间信息
+ * @Author luoyibo
+ * @Date 2024-12-18 10:31
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class RoomInfo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 8949744579628422634L;
+    private String areaID;
+    private String areaName;
+    private Integer parentAreaID;
+    private Integer areaType;
+    private String areaDescription;
+    private Integer commPort;
+    private Integer workStationID;
+    private Integer createOperatorId;
+    private Integer modifyOperatorId;
+    private String createDate;
+    private String modifyDate;
+}

+ 35 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/SettlementAccount.java

@@ -0,0 +1,35 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @ClassName SettlementAccount
+ * @Description 结算账户信息
+ * @Author luoyibo
+ * @Date 2024-12-18 10:33
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class SettlementAccount implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -5294060117684363218L;
+    private String accountID;
+    private String accountName;
+    private String accountPWD;
+
+    private String accountDescription;
+    private String accountOwnerTel;
+    private Boolean accountStatus;
+    private String accountCreatDate;
+    private String createOperatorId;
+    private String modifyOperatorId;
+    private String createDate;
+    private String modifyDate;
+    private String accountNo;
+    private String adminName;
+    private String idCard;
+}

+ 98 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/TermInfo.java

@@ -0,0 +1,98 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class TermInfo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private String termId;
+    private Integer termNo;
+    private String termName;
+    private String termType;
+    private String consumeType;
+    private String roomId;
+    private String accountId;
+    private String workStationId;
+    private String useType;
+    private Integer cardTypeId;
+    private Boolean operateMode;
+    private String workModeId;
+    private String termDescript;
+    private Long termRecordId;
+    private Date recordUpTime;
+    private Date blackListDownTime;
+    private BigDecimal maxMoney;
+    private BigDecimal maxCardMoney;
+    private BigDecimal eachMealMoney;
+    private BigDecimal ration0;
+    private BigDecimal ration1;
+    private BigDecimal ration2;
+    private BigDecimal ration3;
+    private BigDecimal ration4;
+    private BigDecimal ration5;
+    private BigDecimal ration6;
+    private BigDecimal ration7;
+    private BigDecimal ration8;
+    private BigDecimal ration9;
+    private Integer timesQuota;
+    private BigDecimal valueQuota;
+    private Integer mealTimesQuota;
+    private BigDecimal dejeunerValue;
+    private BigDecimal lunchValue;
+    private BigDecimal supperValue;
+    private BigDecimal nightValue;
+    private Integer dejeunerBegin;
+    private Integer dejeunerEnd;
+    private Integer lunchBegin;
+    private Integer lunchEnd;
+    private Integer supperBegin;
+    private Integer supperEnd;
+    private Integer nightMealBegin;
+    private Integer nightMealEnd;
+    private String termIP;
+    private String termMAC;
+    private String termPort;
+    private Boolean useTermOfValidity;
+    private byte[] posParam;
+    private byte[] rateParam;
+    private byte[] advParam;
+    private String gatewayIp;
+    private String serverIp;
+    private String serverPort;
+    private String mask;
+    private String qrCode;
+    private Boolean isAutoDownParameter;
+    private Date lastCheckTime;
+    private Integer outLineMin;
+    private Integer availableInterval;
+    private String rebootTime;
+    private Integer timeout;
+    private Integer beatInterval;
+    private Integer allowOfflineTime;
+    private String roomName;
+
+    private Date createTime;
+
+    private String createUser;
+
+    private Short isDelete;
+
+    private Integer orderIndex;
+
+    private Date updateTime;
+
+    private String updateUser;
+
+    private Integer version;
+
+    private RoomInfo area;
+    private SettlementAccount account;
+}

+ 31 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/TermToken.java

@@ -0,0 +1,31 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 设备Token信息
+ *
+ * @author ZZK
+ *
+ *         2019年9月20日
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class TermToken implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -6397545912397815036L;
+    public String key;
+	public String token;
+	public String admin;
+	public Date dateTime;
+	public Date authTime;
+	public Date expireTime;
+
+}

+ 25 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/UserCardVo.java

@@ -0,0 +1,25 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @ClassName UserCardBo
+ * @Description 用户卡片业务对象
+ * @Author luoyibo
+ * @Date 2024-12-16 16:02
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class UserCardVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 4346475875549461909L;
+    private CardStatusVo cardStatus;
+    private CardTypeVo cardType;
+    private Long employeeID;
+    private Long factoryFixID;
+    private Integer cardTypeID;
+}

+ 27 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/yc/UserInfoVo.java

@@ -0,0 +1,27 @@
+package org.dromara.server.consume.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @ClassName UserInfoVo
+ * @Description 用户信息视图对象
+ * @Author luoyibo
+ * @Date 2024-12-16 16:02
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class UserInfoVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 4346475875549461909L;
+    private DepartmentVo department;
+    private UserCardVo card;
+    private Long employeeID;
+    private String employeeName;
+    private String employeeStrID;
+    private Long cardId;
+    private String employeePWDWeb;
+}