浏览代码

feat(消费服务、海康消费机服务): 海康消费机上传消费记录和脱机记录

luo.yibo@datuai.com 11 月之前
父节点
当前提交
945906ddd7

+ 2 - 2
ruoyi-api/ruoyi-api-consume/src/main/java/org/dromara/consume/api/RemoteConsumeService.java

@@ -45,7 +45,7 @@ public interface RemoteConsumeService {
      * @param remoteBo 包含消费相关业务数据的对象,用于传递消费的基础信息和扩展信息
      * @return 返回一个包含错误信息的响应对象,如果操作成功则data为null,如果失败则data包含具体的错误信息
      */
-    R<ErrorInfo>  dealHikUploadRecord(RemoteConsumeBo remoteBo);
+    RemoteResultDto dealHikUploadRecord(RemoteConsumeBo remoteBo);
 
     /**
      * 处理海康上传的离线消费记录。
@@ -53,5 +53,5 @@ public interface RemoteConsumeService {
      * @param remoteBo 包含消费相关业务数据的对象,用于传递消费的基础信息和扩展信息
      * @return 返回一个包含错误信息的响应对象,如果操作成功则data为null,如果失败则data包含具体的错误信息
      */
-    R<ErrorInfo>  dealHikUploadOffLineRecord(RemoteConsumeBo remoteBo);
+    RemoteResultDto dealHikUploadOffLineRecord(RemoteConsumeBo remoteBo);
 }

+ 7 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/BaseBusiness.java

@@ -23,6 +23,7 @@ import org.dromara.common.core.enums.CreditTypeEnum;
 import org.dromara.common.core.enums.ResultCodeEnum;
 import org.dromara.common.core.exception.consume.ConsumeException;
 import org.dromara.common.core.utils.RecordIdUtils;
+import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.message.kafka.constant.EventTypeConstants;
 import org.dromara.common.message.kafka.constant.KafkaTopicConstants;
 import org.dromara.common.message.kafka.enums.EventSenderEnum;
@@ -186,7 +187,8 @@ public class BaseBusiness {
 
         // 5.发送一条消费记录到kafka(教务就餐打卡)
         if (ObjectUtil.equals(defaultConfig.getLocationFlag(), DefaultConstants.LOCAL_FLAG)) {
-            this.sendConsumeToKafka(detailVos, userAccountVo);
+            SpringUtils.getAopProxy(this).sendConsumeToKafka(detailVos, userAccountVo);
+            // this.sendConsumeToKafka(detailVos, userAccountVo);
         }
         return R.ok();
     }
@@ -282,6 +284,7 @@ public class BaseBusiness {
      */
     @Async
     public void sendCloudConsume(ConsumptionBo bo) {
+        log.info("[发送消费请求至云平台]-[{}]", bo);
         kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.TO_CLOUD_TOPIC, EventTypeConstants.CONSUME, EventSenderEnum.CONSUME.code(), bo);
     }
 
@@ -397,7 +400,8 @@ public class BaseBusiness {
      * @param consumeList 消费记录列表
      * @param accountVo   消费人员信息
      */
-    private void sendConsumeToKafka(List<XfConsumeDetailVo> consumeList, RemoteUserAccountVo accountVo) {
+    @Async
+    protected void sendConsumeToKafka(List<XfConsumeDetailVo> consumeList, RemoteUserAccountVo accountVo) {
         for (XfConsumeDetailVo vo : consumeList) {
             YcPushConsumeInfoVo ycSendConsumeInfo = new YcPushConsumeInfoVo();
             ycSendConsumeInfo.setRecordId(vo.getRecordId().toString());
@@ -423,6 +427,7 @@ public class BaseBusiness {
             ycSendConsumeInfo.setTermRecordID(vo.getTermRecordId());
             ycSendConsumeInfo.setPosRecordState(vo.getRecordStatus().intValue());
 
+            log.info("[向教务系统发送就餐打卡]-[{}]", ycSendConsumeInfo);
             kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.OLD_SYNC_TOPIC, EventTypeConstants.CONSUME_RECORD, EventSenderEnum.OLD.code(),
                                                  ycSendConsumeInfo);
         }

+ 26 - 17
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java

@@ -339,30 +339,38 @@ public class CheckBusiness {
      */
     @NotNull
     private R<ErrorInfo> checkCardNo(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo) {
+        RemoteUserAccountVo accountVo;
+        RemoteCardVo cardVo;
         Long cardNo = bo.getCardNo();
-        ErrorInfo errorInfo;
-        RemoteCardVo cardVo = remoteCardService.queryCardByCardNo(cardNo);
-        if (ObjectUtil.isEmpty(cardVo)) {
-            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
-                                      MessageFormat.format("流水号为[{0}]的卡片不存在,不允许交易", cardNo));
+        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));
-
-            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 (!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);
+                }
+            }
+            accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
+        } else {
+            accountVo = remoteUserAccountService.getUserAccountVoByUserNo(bo.getUserNo());
+            cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
         }
-        RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
         setUserInfo(bo, accountVo);
+        bo.setCardNo(cardVo.getCardNo());
         bo.setFactoryId(cardVo.getFactoryId());
         bo.setCardTypeName(cardVo.getCardTypeName());
         bo.setExpireDate(accountVo.getLifespan());
@@ -544,6 +552,7 @@ public class CheckBusiness {
                     }
                 }
             }
+            bo.setRecordId(originalVo.getRecordId());
         } else {
             R<ErrorInfo> result = doOfflineRecord(bo, originalId, userAccountVo);
             if (R.isError(result)) {

+ 30 - 10
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/dubbo/RemoteConsumeServiceImpl.java

@@ -1,9 +1,13 @@
 package org.dromara.server.consume.dubbo;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.common.core.config.DefaultConfig;
+import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.domain.model.ErrorInfo;
 import org.dromara.consume.api.RemoteConsumeService;
@@ -11,6 +15,7 @@ import org.dromara.consume.api.domain.bo.RemoteConsumeBo;
 import org.dromara.consume.api.domain.bo.RemoteResultDto;
 import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
 import org.dromara.server.consume.business.ArcFaceBusiness;
+import org.dromara.server.consume.business.BaseBusiness;
 import org.dromara.server.consume.business.ConsumeBusiness;
 import org.dromara.server.consume.domain.convert.RemoteConsumeBoConvert;
 import org.springframework.stereotype.Service;
@@ -30,6 +35,9 @@ import org.springframework.stereotype.Service;
 public class RemoteConsumeServiceImpl implements RemoteConsumeService {
     private final ConsumeBusiness consumeBusiness;
     private final ArcFaceBusiness faceBusiness;
+    private final BaseBusiness baseBusiness;
+    private final DefaultConfig defaultConfig;
+
 
     /**
      * 消费处理.
@@ -56,27 +64,39 @@ public class RemoteConsumeServiceImpl implements RemoteConsumeService {
 
     @Override
     public RemoteResultDto dealHikRequestConsume(RemoteConsumeBo remoteBo) {
-        // log.info("before:{}", remoteBo);
-        System.out.println("调用前引用: " + System.identityHashCode(remoteBo));
         ConsumptionBo bo = RemoteConsumeBoConvert.INSTANCE.fromRemote(remoteBo);
         R<ErrorInfo> result =  consumeBusiness.createOrder(bo, "", "");
-        // RemoteConsumeBoConvert.INSTANCE.updateRemote(remoteBo, bo);
-        // log.info("after:{}", remoteBo);
-        // System.out.println("调用后引用: " + System.identityHashCode(remoteBo));
-        //
+
         RemoteConsumeBo updatedRemote = RemoteConsumeBoConvert.INSTANCE.toRemote(bo);
+
         return new RemoteResultDto(result, updatedRemote);
     }
 
     @Override
-    public R<ErrorInfo> dealHikUploadRecord(RemoteConsumeBo remoteBo) {
+    public RemoteResultDto dealHikUploadRecord(RemoteConsumeBo remoteBo) {
         ConsumptionBo bo = RemoteConsumeBoConvert.INSTANCE.fromRemote(remoteBo);
-        return consumeBusiness.postOrder(bo, "", "");
+        R<ErrorInfo> result =   consumeBusiness.postOrder(bo, "", "");
+        if(R.isSuccess(result)){
+            if (ObjectUtil.equals(defaultConfig.getLocationFlag(), DefaultConstants.LOCAL_FLAG)) {
+                ThreadUtil.execAsync(() -> baseBusiness.sendCloudConsume(bo));
+            }
+        }
+        RemoteConsumeBo updatedRemote = RemoteConsumeBoConvert.INSTANCE.toRemote(bo);
+
+        return new RemoteResultDto(result, updatedRemote);
     }
 
     @Override
-    public R<ErrorInfo> dealHikUploadOffLineRecord(RemoteConsumeBo remoteBo) {
+    public RemoteResultDto dealHikUploadOffLineRecord(RemoteConsumeBo remoteBo) {
         ConsumptionBo bo = RemoteConsumeBoConvert.INSTANCE.fromRemote(remoteBo);
-        return consumeBusiness.fullOrder(bo, "", "");
+        R<ErrorInfo> result =   consumeBusiness.fullOrder(bo, "", "");
+        if(R.isSuccess(result)){
+            if (ObjectUtil.equals(defaultConfig.getLocationFlag(), DefaultConstants.LOCAL_FLAG)) {
+                ThreadUtil.execAsync(() -> baseBusiness.sendCloudConsume(bo));
+            }
+        }
+        RemoteConsumeBo updatedRemote = RemoteConsumeBoConvert.INSTANCE.toRemote(bo);
+
+        return new RemoteResultDto(result, updatedRemote);
     }
 }

+ 36 - 2
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/controller/TestController.java

@@ -391,9 +391,43 @@ public class TestController {
      */
     @PostMapping("/uploadRecord")
     public Object uploadConsumeRecord(@RequestBody Map<String, Object> mapConsumeInfo) {
+        RemoteConsumeBo remoteBo = new RemoteConsumeBo();
+        if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("userNo"))){
+            remoteBo.setUserNo(Long.valueOf(mapConsumeInfo.get("userNo").toString()));
+        }
+        if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("factoryId"))){
+            remoteBo.setFactoryId(Long.valueOf(mapConsumeInfo.get("factoryId").toString()));
+        } else {
+            remoteBo.setFactoryId(0L);
+        }
+        if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("consumeDate"))){
+            remoteBo.setConsumeDate(DateUtil.parseDateTime(mapConsumeInfo.get("consumeDate").toString()));
+        }
+        if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("termRecordId"))){
+            remoteBo.setTermRecordId(Long.valueOf(mapConsumeInfo.get("termRecordId").toString()));
+        }
+        if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("consumeMoney"))){
+            remoteBo.setConsumeMoney(new BigDecimal(mapConsumeInfo.get("consumeMoney").toString()));
+        }
+        if(ObjectUtil.isNotEmpty(mapConsumeInfo.get("termMac"))){
+            remoteBo.setTermMac(mapConsumeInfo.get("termMac").toString());
+        }
+        remoteBo.setCardNo(0L);
+        remoteBo.setStatusFlag(4);
+        remoteBo.setCreditType(CreditTypeEnum.TERM_CONSUME.code());
+        remoteBo.setRecordStatus(364L);
+        remoteBo.setRecordId(0L);
 
-
-        return null;
+        RemoteResultDto result = remoteConsumeService.dealHikUploadRecord(remoteBo);
+        R<ErrorInfo> errorInfo = result.getErrorInfo();
+        if (R.isError(errorInfo)) {
+            ErrorResult errResult = new ErrorResult();
+            errResult.setStatusCode(HttpStatus.NOT_FOUND.value());
+            errResult.setMessage(errorInfo.getMsg());
+            errResult.getErrors().add(errorInfo.getData());
+            return new ResponseEntity<Object>(errResult, null, HttpStatus.NOT_FOUND);
+        }
+         return result.getUpdatedRemoteBo();
     }
 
     /**