Browse Source

feat(消费服务): 请求交易用户检查增加了账户被冻结、过期的检查

luo.yibo@datuai.com 11 tháng trước cách đây
mục cha
commit
76568432d2

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

@@ -86,5 +86,9 @@ public interface Constants {
      * 自动创建一卡通账户
      */
     String AUTO_USER_ACCOUNT = "1";
+
+    String SYS_YES = "Y";
+
+    String SYS_NO = "N";
 }
 

+ 111 - 47
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java

@@ -13,6 +13,7 @@ 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.constant.Constants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.domain.model.ErrorInfo;
 import org.dromara.common.core.enums.BagNameEnum;
@@ -283,6 +284,18 @@ public class CheckBusiness {
         return R.ok();
     }
 
+    /**
+     * 检查消费交易的账单,通过验证各种组件如卡片详情、原始记录、餐类信息、扣款钱包以及操作员详情。此外,它还会更新与用户卡片相关的其他消费信息
+     *
+     * @param bo 包含交易详情的消费业务对象
+     * @param userAccountVo 与交易关联的用户账户信息
+     * @param userCardVo 与用户关联的卡片信息。
+     * @param useTermVo 处理交易的终端信息
+     * @param bagVoList 扣款钱包信息的列表
+     * @param mealTypeVo 交易餐类信息
+     * @param operatorVo 为交易操作员信息
+     * @return 返回一个结果对象,包含成功或错误信息。如果发生验证失败,错误信息将包括有关验证失败的详细信息
+     */
     public R<ErrorInfo> checkBill(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo,
                                   XfTermVo useTermVo, List<PtBagVo> bagVoList, RemoteMealTypeVo mealTypeVo,
                                   RemoteOperatorVo operatorVo) {
@@ -324,6 +337,7 @@ public class CheckBusiness {
      * @param accountVo 消费账户
      */
     private void setUserInfo(ConsumptionBo bo, RemoteUserAccountVo accountVo) {
+        bo.setUserId(accountVo.getUserId());
         bo.setRealName(StrUtil.isEmpty(accountVo.getRealName()) ? "----" : accountVo.getRealName());
         bo.setUserNo(accountVo.getUserNo());
         bo.setUserNumb(accountVo.getUserNumb());
@@ -342,46 +356,58 @@ public class CheckBusiness {
      */
     @NotNull
     private R<ErrorInfo> checkCardNo(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo) {
-        RemoteUserAccountVo accountVo;
-        RemoteCardVo cardVo;
+        ErrorInfo errorInfo;
         Long cardNo = bo.getCardNo();
-        if (cardNo > 0L) {
-            ErrorInfo errorInfo;
-            cardVo = remoteCardService.queryCardByCardNo(cardNo);
-            if (ObjectUtil.isEmpty(cardVo)) {
-                errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
-                                          MessageFormat.format("流水号为[{0}]的卡片不存在,不允许交易", cardNo));
 
-                return R.fail(errorInfo);
-            }
-            if (!String.valueOf(CardStatusEnum.NORMAL.code()).equals(cardVo.getStatus())) {
-                errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片状态不正确",
-                                          MessageFormat.format("流水号为[{0}]的卡片状态不正确,不允许交易", cardNo));
+        RemoteCardVo cardVo = remoteCardService.queryCardByCardNo(cardNo);
+        if (ObjectUtil.isEmpty(cardVo)) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
+                                      MessageFormat.format("流水号为[{0}]的卡片不存在,不允许交易", cardNo));
+
+            return R.fail(errorInfo);
+        }
+        if (!String.valueOf(CardStatusEnum.NORMAL.code()).equals(cardVo.getStatus())) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片状态不正确",
+                                      MessageFormat.format("流水号为[{0}]的卡片状态不正确,不允许交易", cardNo));
+
+            return R.fail(errorInfo);
+        }
+        if (bo.getFactoryId() > 0) {
+            if (!Objects.equals(cardVo.getFactoryId(), bo.getFactoryId())) {
+                errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不正确", "物理卡号不一致,不允许交易");
 
                 return R.fail(errorInfo);
             }
-            if (bo.getFactoryId() > 0) {
-                if (!Objects.equals(cardVo.getFactoryId(), bo.getFactoryId())) {
-                    errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不正确", "物理卡号不一致,不允许交易");
+        }
+        RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
+        if (Objects.isNull(accountVo)) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "人员不存在",
+                                      MessageFormat.format("流水号为[{0}]的卡片无对应的人员信息,不允许交易", cardNo));
 
-                    return R.fail(errorInfo);
-                }
-            }
-            accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
-        } else {
-            accountVo = remoteUserAccountService.getUserAccountVoByUserNo(bo.getUserNo());
-            cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
+            return R.fail(errorInfo);
+        }
+        if (Objects.equals(accountVo.getFreezeStatus(), Constants.SYS_YES)) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "人员被冻结",
+                                      MessageFormat.format("流水号为[{0}]的卡片对应的人员被冻结,不允许交易", cardNo));
+
+            return R.fail(errorInfo);
+        }
+        Date nowDate = new Date();
+        long currentTime = nowDate.getTime();
+        if (accountVo.getLifespan().getTime()<currentTime) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "账户过期",
+                                      MessageFormat.format("流水号为[{0}]的卡片对应的人员账户过期,不允许交易", cardNo));
+
+            return R.fail(errorInfo);
         }
+        // 设置返回的消费用户信息
         setUserInfo(bo, accountVo);
+
         bo.setCardNo(cardVo.getCardNo());
         bo.setFactoryId(cardVo.getFactoryId());
         bo.setCardTypeName(cardVo.getCardTypeName());
-        bo.setExpireDate(accountVo.getLifespan());
-        bo.setDeptName(accountVo.getDeptName());
-        // BeanUtil.copyProperties(accountVo, userAccountVo);
-        RemoteVoConvert.INSTANCE.copyRemoteUserAccountVo(userAccountVo,accountVo);
-        // BeanUtil.copyProperties(cardVo, userCardVo);
-        RemoteVoConvert.INSTANCE.copyRemoteCardVo(userCardVo,cardVo);
+        RemoteVoConvert.INSTANCE.copyRemoteUserAccountVo(userAccountVo, accountVo);
+        RemoteVoConvert.INSTANCE.copyRemoteCardVo(userCardVo, cardVo);
         return R.ok();
     }
 
@@ -409,15 +435,31 @@ public class CheckBusiness {
             return R.fail(errorInfo);
         }
         RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
+        if (Objects.isNull(accountVo)) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "人员不存在",
+                                      MessageFormat.format("物理卡号为[{0}]的卡片无对应的人员信息,不允许交易", factoryId));
+
+            return R.fail(errorInfo);
+        }
+        if (Objects.equals(accountVo.getFreezeStatus(), Constants.SYS_YES)) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "人员被冻结",
+                                      MessageFormat.format("物理卡号为[{0}]的卡片对应的人员被冻结,不允许交易", factoryId));
+
+            return R.fail(errorInfo);
+        }
+        Date nowDate = new Date();
+        long currentTime = nowDate.getTime();
+        if (accountVo.getLifespan().getTime()<currentTime) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "账户过期",
+                                      MessageFormat.format("物理卡号为[{0}]的卡片对应的人员账户过期,不允许交易", factoryId));
+
+            return R.fail(errorInfo);
+        }
         setUserInfo(bo, accountVo);
         bo.setCardNo(cardVo.getCardNo());
         bo.setCardTypeName(cardVo.getCardTypeName());
-        bo.setExpireDate(accountVo.getLifespan());
-        bo.setDeptName(accountVo.getDeptName());
-        // BeanUtil.copyProperties(accountVo, userAccountVo);
-        RemoteVoConvert.INSTANCE.copyRemoteUserAccountVo(userAccountVo,accountVo);
-        // BeanUtil.copyProperties(cardVo, userCardVo);
-        RemoteVoConvert.INSTANCE.copyRemoteCardVo(userCardVo,cardVo);
+        RemoteVoConvert.INSTANCE.copyRemoteUserAccountVo(userAccountVo, accountVo);
+        RemoteVoConvert.INSTANCE.copyRemoteCardVo(userCardVo, cardVo);
         return R.ok();
     }
 
@@ -440,6 +482,20 @@ public class CheckBusiness {
 
             return R.fail(errorInfo);
         }
+        if (Objects.equals(accountVo.getFreezeStatus(), Constants.SYS_YES)) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "人员被冻结",
+                                      MessageFormat.format("流水号为[{0}]的人员被冻结,不允许交易", userNo));
+
+            return R.fail(errorInfo);
+        }
+        Date nowDate = new Date();
+        long currentTime = nowDate.getTime();
+        if (accountVo.getLifespan().getTime()<currentTime) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "账户过期",
+                                      MessageFormat.format("流水号为[{0}]的人员账户过期,不允许交易", userNo));
+
+            return R.fail(errorInfo);
+        }
         RemoteCardVo cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
         if (ObjectUtil.isEmpty(cardVo)) {
             errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
@@ -458,12 +514,8 @@ public class CheckBusiness {
         bo.setCardNo(cardVo.getCardNo());
         bo.setFactoryId(cardVo.getFactoryId());
         bo.setCardTypeName(cardVo.getCardTypeName());
-        bo.setExpireDate(accountVo.getLifespan());
-        bo.setDeptName(accountVo.getDeptName());
-        // BeanUtil.copyProperties(accountVo, userAccountVo);
-        RemoteVoConvert.INSTANCE.copyRemoteUserAccountVo(userAccountVo,accountVo);
-        // BeanUtil.copyProperties(cardVo, userCardVo);
-        RemoteVoConvert.INSTANCE.copyRemoteCardVo(userCardVo,cardVo);
+        RemoteVoConvert.INSTANCE.copyRemoteUserAccountVo(userAccountVo, accountVo);
+        RemoteVoConvert.INSTANCE.copyRemoteCardVo(userCardVo, cardVo);
         return R.ok();
     }
 
@@ -487,17 +539,31 @@ public class CheckBusiness {
 
             return R.fail(errorInfo);
         }
+        if (Objects.equals(accountVo.getFreezeStatus(), Constants.SYS_YES)) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "人员被冻结",
+                                      MessageFormat.format("编号为[{0}]的人员被冻结,不允许交易", userNumb));
+
+            return R.fail(errorInfo);
+        }
+        Date nowDate = new Date();
+        long currentTime = nowDate.getTime();
+        if (accountVo.getLifespan().getTime()<currentTime) {
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "账户过期",
+                                      MessageFormat.format("编号为[{0}]的人员账户过期,不允许交易", userNumb));
+
+            return R.fail(errorInfo);
+        }
         RemoteCardVo cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
         if (ObjectUtil.isEmpty(cardVo)) {
             errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
-                                      MessageFormat.format("没有编号为[{0}]的人员的卡片信息,不允许交易", userNumb));
+                                      MessageFormat.format("没有编号为[{0}]人员的卡片信息,不允许交易", userNumb));
 
             return R.fail(errorInfo);
         }
         // 实体卡时需要验证卡状态
         if (!String.valueOf(CardStatusEnum.NORMAL.code()).equals(cardVo.getStatus()) && cardVo.getFactoryId() > 0) {
             errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片状态不正确",
-                                      MessageFormat.format("编号为[{0}]的人员卡片状态不正确,不允许交易", userNumb));
+                                      MessageFormat.format("编号为[{0}]人员卡片状态不正确,不允许交易", userNumb));
 
             return R.fail(errorInfo);
         }
@@ -507,10 +573,8 @@ public class CheckBusiness {
         bo.setFactoryId(cardVo.getFactoryId());
         bo.setCardTypeName(cardVo.getCardTypeName());
 
-        // BeanUtil.copyProperties(accountVo, userAccountVo);
-        RemoteVoConvert.INSTANCE.copyRemoteUserAccountVo(userAccountVo,accountVo);
-        // BeanUtil.copyProperties(cardVo, userCardVo);
-        RemoteVoConvert.INSTANCE.copyRemoteCardVo(userCardVo,cardVo);
+        RemoteVoConvert.INSTANCE.copyRemoteUserAccountVo(userAccountVo, accountVo);
+        RemoteVoConvert.INSTANCE.copyRemoteCardVo(userCardVo, cardVo);
 
         return R.ok();
     }

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

@@ -62,9 +62,6 @@ public class ConsumeBusiness {
      * @return 请求结果
      */
     public R<ErrorInfo> createOrder(ConsumptionBo bo, String mac, String xfPwd) {
-        //检查下客户的公钥与么钥
-        // baseBusiness.getRegisterInfo();
-
         log.warn("[请求交易]-[开始参数验证]-[{}]", JSONUtil.toJsonStr(bo));
         R<ErrorInfo> result = checkBusiness.checkParam(bo);
         if (R.isError(result)) {

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

@@ -177,11 +177,6 @@ public class ConsumeController {
 
         R<ErrorInfo> errorInfo;
         if (Objects.equals(type, "requestConsume")) {
-            // int recordType = bo.getRecordStatus().intValue();
-            //if (ObjectUtil.equals(bo.getCreditType(), CreditTypeEnum.TERM_CONSUME.code()) && recordType == 364) {
-            //    // 如果是消费机请求消费,而且是正常消费记录将消费时间设置为当前时间,以防消费时时钟不对造成实际消费时间不正确
-            //    bo.setConsumeDate(DateUtil.date());
-            //}
             errorInfo = consumeBusiness.createOrder(bo, mac, xfPwd);
         } else if (Objects.equals(type, "uploadRecord")) {
             errorInfo = consumeBusiness.postOrder(bo, mac, xfPwd);
@@ -204,7 +199,6 @@ public class ConsumeController {
             // 发送消息
             if (ObjectUtil.equals(defaultConfig.getLocationFlag(), DefaultConstants.LOCAL_FLAG)) {
                 ConsumptionBo bo = recordConvertStrategy.convert(record, "YC");
-                // bo.setConsumeDate(jsonObject.getDate("consumeDate"));
                 ThreadUtil.execAsync(() -> baseBusiness.sendCloudConsume(bo));
             }
         }

+ 32 - 21
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/TermsController.java

@@ -5,6 +5,7 @@ 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.common.redis.utils.CacheUtils;
 import org.dromara.server.consume.business.TermBusiness;
 import org.dromara.server.consume.domain.vo.yc.TermInfo;
 import org.springframework.http.HttpStatus;
@@ -18,41 +19,42 @@ import java.util.Map;
 
 @RestController
 @RequiredArgsConstructor
-@RequestMapping(path = { "/v1/Terms" })
+@RequestMapping(path = {"/v1/Terms"})
 public class TermsController {
 
-	private final TermBusiness termBusiness;
+    private final TermBusiness termBusiness;
 
-	/**
-	 * 获取设备信息(根据机号)
-	 *
-	 * @param termNo 设备的机号(兼容UP)
-	 * @return token
-	 */
-	@GetMapping("/{termNo}")
-	public Object getTermByTermNo(@PathVariable("termNo") Long termNo) {
+    /**
+     * 获取设备信息(根据机号)
+     *
+     * @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()));
+        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 new ResponseEntity<Object>(result, null, HttpStatus.BAD_REQUEST);
+        }
 
-		return mapResult.getData();
-	}
+        return mapResult.getData();
+    }
 
     /**
      * 设备校时
+     *
      * @param termNo 设备编号
      * @return 校时
      */
     @GetMapping("/CheckTime/{termNo}")
-    public Object checkTermTime(@PathVariable("termNo") Integer termNo){
-        R<Map<String,Object>> mapResult = termBusiness.checkTermTime(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());
@@ -65,4 +67,13 @@ public class TermsController {
         return mapResult.getData();
     }
 
+    /**
+     * 缓存测试
+     * @return 测试结果
+     */
+    @GetMapping("/cache/test")
+    public R<Void> cacheTest(){
+        CacheUtils.put("test", "01", "测试数据");
+        return R.ok();
+    }
 }