Răsfoiți Sursa

根据海康设备测试问题调整

xiari 11 luni în urmă
părinte
comite
971a48c366

+ 9 - 6
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/ConsumeRequestCheck.java

@@ -88,16 +88,12 @@ public class ConsumeRequestCheck {
             // 设备是否可以消费验证
             result = checkTermLimitedAndOther(bo, useTermVo, userCardVo, remoteMealTypeVo);
             if (R.isError(result)) {
-                ErrorInfo data = result.getData();
-                String details = Optional.ofNullable(data).map(ErrorInfo::getDetils).orElse("超过消费限制");
-                return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "消费限制判断存在问题", details));
+                return obtainResult(result);
             }
             // 卡片是否可以消费验证
             result = cardConsumevalidation.cardValidation(bo, useTermVo, userCardVo, remoteMealTypeVo, xfCardLimitedVo, mapCardLimited);
             if (R.isError(result)) {
-                ErrorInfo data = result.getData();
-                String details = Optional.ofNullable(data).map(ErrorInfo::getDetils).orElse("超过消费限制");
-                return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "消费限制判断存在问题", details));
+                return obtainResult(result);
             }
         }
 
@@ -110,6 +106,13 @@ public class ConsumeRequestCheck {
         return R.ok();
     }
 
+    private  R<ErrorInfo> obtainResult(R<ErrorInfo> result){
+        ErrorInfo data = result.getData();
+        String details = Optional.ofNullable(data).map(ErrorInfo::getDetils).orElse("超过消费限制");
+        String msg = Optional.ofNullable(data).map(ErrorInfo::getMessage).orElse("消费限制判断存在问题");
+        return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, msg, details));
+    }
+
     public R<ErrorInfo> completeConsumeRequest(ConsumptionBo bo, RemoteUserAccountVo userAccountVo,
                                                RemoteCardVo userCardVo, XfTermVo useTermVo,
                                                Map<String, Boolean> mapCardLimited,

+ 2 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/dubbo/RemoteConsumeServiceImpl.java

@@ -10,6 +10,7 @@ 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.common.core.enums.SystemUseTypeEnum;
 import org.dromara.consume.api.RemoteConsumeService;
 import org.dromara.consume.api.domain.bo.RemoteConsumeBo;
 import org.dromara.consume.api.domain.bo.RemoteResultDto;
@@ -75,6 +76,7 @@ public class RemoteConsumeServiceImpl implements RemoteConsumeService {
     @Override
     public RemoteResultDto dealHikUploadRecord(RemoteConsumeBo remoteBo) {
         ConsumptionBo bo = RemoteConsumeBoConvert.INSTANCE.fromRemote(remoteBo);
+        bo.setUseType(SystemUseTypeEnum.CONSUME.code());
         R<ErrorInfo> result =   consumeBusiness.postOrder(bo, "", "");
         if(R.isSuccess(result)){
             if (ObjectUtil.equals(defaultConfig.getLocationFlag(), DefaultConstants.LOCAL_FLAG)) {

+ 2 - 0
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/event/domain/TransactionRecordEventConfirmBo.java

@@ -22,6 +22,8 @@ public class TransactionRecordEventConfirmBo implements Serializable {
     /*opt, string, 工号, range:[1,32], desc:敏感信息加密*/
     private String balance;
     /*opt, string, 余额, range:[0,8], desc:1、单位:分,敏感信息加密。2、应用场景:设备从离线消费转在线消费时,平台返回消费人员的余额和余次,供设备进行记录刷新。*/
+    private String actualPayment;
+    //*opt, string, 实付金额(单位:分)*//*
    /* private Integer remainingTimes;
     *//*opt, int, 余次*//*
     private String currencyType;

+ 13 - 6
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/event/handler/ConsumptionEventHandler.java

@@ -7,6 +7,7 @@ import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.domain.model.ErrorInfo;
 import org.dromara.common.core.enums.CreditTypeEnum;
+import org.dromara.common.core.enums.SystemUseTypeEnum;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.consume.api.RemoteConsumeService;
 import org.dromara.consume.api.domain.bo.RemoteConsumeBo;
@@ -67,6 +68,7 @@ public class ConsumptionEventHandler implements HikEventHandler {
             String reason = "";
             BigDecimal balance = updatedRemoteBo.getBalance();
             BigDecimal consumeMoney = updatedRemoteBo.getConsumeMoney();
+//            BigDecimal consumeMoney = new BigDecimal("10");
             String deptName =updatedRemoteBo.getDeptName();
             if (R.isError(errorInfo)) {
                 // 应答失败
@@ -76,9 +78,7 @@ public class ConsumptionEventHandler implements HikEventHandler {
                 if(data != null){
                     reason = data.getMessage();
                 }
-
             }
-
             // 应答
             return answerEvent(consumptionEvent, bussiRs, balance,consumeMoney, reason,deptName);
         }else if(TRANSACTION_CONFIRMING_REQUEST.equals(consumptionEvent.getMinor())){
@@ -121,6 +121,7 @@ public class ConsumptionEventHandler implements HikEventHandler {
             receive.getDateTime(), consumptionEvent.getSerialNo(), consumptionEvent.getTotalPayment(), receive.getMacAddress());
         remoteBo.setCardNo(0L);
         remoteBo.setStatusFlag(4);
+        remoteBo.setUseType(SystemUseTypeEnum.CONSUME.code());
         remoteBo.setCreditType(CreditTypeEnum.TERM_CONSUME.code());
         return remoteBo;
     }
@@ -148,8 +149,9 @@ public class ConsumptionEventHandler implements HikEventHandler {
             }
         }else{
             if(answerResult){
-                confirmBo.setActualPayment(consumeMoney.toString().split("\\.")[0]);
-                BigDecimal balanceBeforeDeduct = balance.multiply(new BigDecimal("100")).add(consumeMoney);
+                BigDecimal con = consumeMoney.multiply(new BigDecimal("100"));
+                confirmBo.setActualPayment(con.toString().split("\\.")[0]);
+                BigDecimal balanceBeforeDeduct = balance.multiply(new BigDecimal("100")).add(con);
                 confirmBo.setBalanceBeforeDeduct(balanceBeforeDeduct.toString().split("\\.")[0]); // 未扣款前的余额,要根据余额加上扣款金额,单位为分 ,金额模式必填
             }else{
                 confirmBo.setActualPayment("0");
@@ -158,10 +160,15 @@ public class ConsumptionEventHandler implements HikEventHandler {
         }
 
         String broadcastVoice = isCountMode ? "刷卡成功":"支付成功";
+        String newReason = reason;
         if(!answerResult){
             broadcastVoice = isCountMode ? "刷卡失败":"支付失败";
             // 提示刷卡失败的原因
-            broadcastVoice += reason;
+            if(StringUtils.isNotBlank(reason) && reason.length() > 30){
+                log.info("海康消费失败原因:{}", reason);
+                newReason = reason.substring(0,30);
+            }
+            broadcastVoice += newReason;
             confirmBo.setReason("platformException");
         }
         confirmBo.setCustomTTSBroadcastVoice(broadcastVoice);
@@ -174,7 +181,7 @@ public class ConsumptionEventHandler implements HikEventHandler {
         contentInfo.setContent(deptName);
         if(!answerResult){
             contentInfo.setTitle(consumptionEvent.getName()+ "  "+deptName);
-            contentInfo.setContent("失败原因:"+reason);
+            contentInfo.setContent("失败原因:"+ newReason);
         }
         confirmBo.setContentInfo(contentInfo);
 

+ 12 - 0
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/event/handler/HeatBeatHandler.java

@@ -1,23 +1,35 @@
 package org.dromara.server.hik.event.handler;
 
 import com.alibaba.fastjson.JSONObject;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.server.hik.event.HikEventHandler;
 import org.dromara.server.hik.event.domain.FileContent;
 import org.dromara.server.hik.event.domain.HeatBeatData;
+import org.dromara.server.hik.service.IXfTermService;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
 
 @Slf4j
 @Component
+@RequiredArgsConstructor
 public class HeatBeatHandler implements HikEventHandler {
+
+    public final IXfTermService xfTermService;
+
     @Override
     public Map<String, Object> handleEvent(JSONObject jsonObject, FileContent fileContent) {
         // 1.JSONObject 转换成心跳 HeadBeatData对象
         HeatBeatData heatBeatData = jsonObject.toJavaObject(HeatBeatData.class);
         log.info("接收到心跳数据:{}", heatBeatData);
 
+        //更新设备的IP地址
+        // mac -> ip 和 心跳的IP 是否相等,不相等则更新
+        xfTermService.updateByMac(heatBeatData.getMacAddress(), heatBeatData.getIpAddress());
+
+        //记录第一次上来的心跳数据时 是否下发全量数据到当前设备
+
         return null;
     }
 }

+ 17 - 7
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/event/handler/TransactionRecordEventHandler.java

@@ -74,12 +74,17 @@ public class TransactionRecordEventHandler implements HikEventHandler {
         }
 
         BigDecimal balance = null;
+        String actualPayment = transactionRecordEvent.getActualPayment();
+        BigDecimal consumeMoney = BigDecimal.ZERO;
+        if(StringUtils.isNotBlank(actualPayment)){
+            balance = new BigDecimal(actualPayment).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+        }
         // 这里只能应答成功,如果是业务异常(余额不足、脏数据等)失败,要存入表中,使用定时任务处理失败,所以即使失败的 也要回复成功
         // 如果是在线交易的,平台根据流水号判断当前交易记录事件是否为未处理事件,若为未处理事件,则平台进行处理并进行扣费;
         // 如果是离线交易记录事件,则平台进行处理并进行扣费;
         RemoteConsumeBo remoteBo = getRemoteBo(transactionRecordEventReceive);
         remoteBo.setTermNo(termNo);
-        R<ErrorInfo> errorInfo = R.fail("处理失败");
+        R<ErrorInfo> errorInfo = R.ok("处理成功");
         try  {
             if (ModeTypeEnum.offLine.getCode().equals(modeType)) {
                 // 离线交易,调用原始消费记录请求+消费记录入库的接口,如果失败要记录入库
@@ -88,6 +93,7 @@ public class TransactionRecordEventHandler implements HikEventHandler {
                 RemoteConsumeBo updatedRemoteBo = remoteResultDto.getUpdatedRemoteBo();
                 if(updatedRemoteBo !=null) {
                     balance  = updatedRemoteBo.getBalance();
+                    consumeMoney = updatedRemoteBo.getConsumeMoney();
                 }
             }else{
                 // 在线交易,调用消费记录入库的接口
@@ -102,10 +108,12 @@ public class TransactionRecordEventHandler implements HikEventHandler {
                     RemoteConsumeBo updatedRemoteBo = remoteResultDto.getUpdatedRemoteBo();
                     if(updatedRemoteBo !=null) {
                         balance  = updatedRemoteBo.getBalance();
+                        consumeMoney = updatedRemoteBo.getConsumeMoney();
                     }
                 }else{
                     XfConsumeDetailVo consumeDetailVo = vos.get(0);
                     balance = consumeDetailVo.getCardValue();
+                    consumeMoney = consumeDetailVo.getConsumeMoney();
                 }
             }
         } catch (Exception e) {
@@ -117,14 +125,14 @@ public class TransactionRecordEventHandler implements HikEventHandler {
 
         insertFailedRecordBo(transactionRecordEventReceive, termNo, errorInfo, modeType);
         //应答
-        return answerEvent(transactionRecordEventReceive,balance);
+        return answerEvent(transactionRecordEventReceive,balance,consumeMoney);
     }
 
     /**
      * @param info 事件信息
      * 应答事件 put /ISAPI/Consume/transactionRecordEventConfirm?format=json 应答TransactionRecordEvent
      */
-    public Map<String, Object> answerEvent(TransactionRecordEventReceive info, BigDecimal balance){
+    public Map<String, Object> answerEvent(TransactionRecordEventReceive info, BigDecimal balance, BigDecimal consumeMoney){
         TransactionRecordEventConfirmBo confirmBo = new TransactionRecordEventConfirmBo();
 
         TransactionRecordEventDetail transactionDetail  = info.getTransactionRecordEvent();
@@ -132,10 +140,12 @@ public class TransactionRecordEventHandler implements HikEventHandler {
         confirmBo.setResult("success");
         confirmBo.setEmployeeNo(transactionDetail.getEmployeeNoString());
         //余额的单位为分
-        if(balance == null){
-            balance = new BigDecimal("0");
-        }
-        confirmBo.setBalance(balance.multiply(new BigDecimal("100")).toString().split("\\.")[0]);
+        // 使用 BigDecimal 的 null 安全处理工具类简化逻辑,并避免重复代码
+        BigDecimal newBalance = Optional.ofNullable(balance).orElse(BigDecimal.ZERO);
+        confirmBo.setBalance(newBalance.multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.DOWN).toString());
+
+        BigDecimal newConsumeMoney = Optional.ofNullable(consumeMoney).orElse(BigDecimal.ZERO);
+        confirmBo.setActualPayment(newConsumeMoney.multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.DOWN).toString());
 
         HashMap<String, Object> map = new HashMap<>(1);
         map.put("TransactionRecordEventConfirm", confirmBo);

+ 8 - 0
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/service/IXfTermService.java

@@ -24,4 +24,12 @@ public interface IXfTermService {
 
     public XfTermVo getByMac(String termMac);
 
+    /**
+     *  修改设备ip
+     * @param termMac 设备mac
+     * @param newIP 新ip
+     * @return 修改成功
+     */
+    boolean updateByMac(String termMac,String newIP);
+
 }

+ 29 - 0
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/service/impl/XfTermServiceImpl.java

@@ -84,4 +84,33 @@ public class XfTermServiceImpl implements IXfTermService {
         return termVos.get(0);
     }
 
+    /**
+     * 修改设备ip
+     *
+     * @param termMac 设备mac
+     * @param newIP   新ip
+     * @return 修改成功
+     */
+    @Override
+    public boolean updateByMac(String termMac, String newIP) {
+        List<XfTermVo> termVos = TenantHelper.ignore(() -> {
+            LambdaQueryWrapper<XfTerm> select = new LambdaQueryWrapper<XfTerm>().eq(XfTerm::getTermMac, termMac)
+                .select(XfTerm::getTermId, XfTerm::getTermIp, XfTerm::getTermMac);
+            return baseMapper.selectVoList(select);
+        });
+        if(CollectionUtil.isNotEmpty(termVos) && termVos.size()==1){
+            XfTermVo xfTermVo = termVos.get(0);
+            if(StringUtils.isBlank(xfTermVo.getTermIp()) || !xfTermVo.getTermIp().equals(newIP)){
+                return TenantHelper.ignore(() -> {
+                    XfTerm xfTerm = new XfTerm();
+                    xfTerm.setTermId(xfTermVo.getTermId());
+                    xfTerm.setTermIp(newIP);
+                    return baseMapper.updateById(xfTerm) > 0;
+                });
+            }
+            return true;
+        }
+        return false;
+    }
+
 }