Ver Fonte

Merge remote-tracking branch 'origin/master'

autumnal_wind há 11 meses atrás
pai
commit
c2a3c2a8f2

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

@@ -44,7 +44,7 @@ public class ConsumptionEventHandler implements HikEventHandler {
         ConsumptionEventReceive receive = jsonObject.toJavaObject(ConsumptionEventReceive.class);
         ConsumptionEventDetail consumptionEvent = receive.getConsumptionEvent();
         log.info("消费机事件,类型:{}", consumptionEvent.getMinor());
-        XfTermVo termVo = termService.queryByMac(receive.getMacAddress());
+        XfTermVo termVo = termService.getByMac(receive.getMacAddress());
         if (TRANSACTION_PREPROCESSING_REQUEST.equals(consumptionEvent.getMinor())) {
             if (termVo == null) {
                 log.error("消费机交易记录事件,设备信息为空,mac:{}, 不存在系统中", receive.getMacAddress());

+ 41 - 36
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/event/handler/HeatBeatHandler.java

@@ -1,6 +1,7 @@
 package org.dromara.server.hik.event.handler;
 
 import com.alibaba.fastjson.JSONObject;
+import io.seata.common.util.StringUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.backstage.api.RemoteUserAccountService;
@@ -8,6 +9,7 @@ import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
 import org.dromara.common.core.constant.CacheConstants;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.server.hik.domain.vo.XfTermVo;
 import org.dromara.server.hik.event.HikEventHandler;
 import org.dromara.server.hik.event.domain.FileContent;
 import org.dromara.server.hik.event.domain.HeatBeatData;
@@ -40,45 +42,48 @@ public class HeatBeatHandler implements HikEventHandler {
         // mac -> ip 和 心跳的IP 是否相等,不相等则更新
         String ipAddress = heatBeatData.getIpAddress();
         String macAddress = heatBeatData.getMacAddress();
-        boolean b = xfTermService.updateByMac(macAddress, ipAddress);
+        XfTermVo termVo = xfTermService.getByMac(macAddress);
+        if(termVo == null) return null;
+        if(!StringUtils.equals(ipAddress, termVo.getTermIp())){
+            log.info("设备IP地址更新:{} -> {}", ipAddress, termVo.getTermIp());
+            xfTermService.updateByMac(macAddress, ipAddress);
+        }
 
-        if(b){
-            //增量下发 人脸数据和卡数据
-            Long cacheObject = RedisUtils.getCacheObject(CacheNames.XF_TERM_IP + ipAddress);
-            if(cacheObject == null){
-                // 第一次上线 默认只下发最近1天的 新增或修改的数据
-                //记录每天第一次上来的心跳数据时 下发最近3天的 新增或修改的数据
-                //        t_pt_useraccount表 update_time  更新人脸
-                //        t_pt_card表   change_time、create_time  更新卡片
-                //下发数据
-                // 获取当前时间的前一天的时间
-                LocalDateTime localDate = LocalDateTime.now();
-                LocalDateTime minus = localDate.minus(1, ChronoUnit.DAYS);
-                // LocalDateTime 转 date
-                Date date = Date.from(minus.atZone(ZoneId.systemDefault()).toInstant());
-                System.err.println("minus: " + minus);
-                System.err.println("date: " + date);
-                sendDeviceService.upLoadEmpToDevice(macAddress,date,true);
+        //增量下发 人脸数据和卡数据
+        Long cacheObject = RedisUtils.getCacheObject(CacheNames.XF_TERM_IP + ipAddress);
+        if(cacheObject == null){
+            // 第一次上线 默认只下发最近1天的 新增或修改的数据
+            //记录每天第一次上来的心跳数据时 下发最近3天的 新增或修改的数据
+            //        t_pt_useraccount表 update_time  更新人脸
+            //        t_pt_card表   change_time、create_time  更新卡片
+            //下发数据
+            // 获取当前时间的前一天的时间
+            LocalDateTime localDate = LocalDateTime.now();
+            LocalDateTime minus = localDate.minus(1, ChronoUnit.DAYS);
+            // LocalDateTime 转 date
+            Date date = Date.from(minus.atZone(ZoneId.systemDefault()).toInstant());
+            System.err.println("minus: " + minus);
+            System.err.println("date: " + date);
+            sendDeviceService.upLoadEmpToDevice(macAddress,date,true);
 
-                RedisUtils.setCacheObject(CacheNames.XF_TERM_IP + ipAddress, date.getTime());
-            }else{
-                // 当前时间-上次下发时间 >= 1天 就下发
-                Date now = new Date();
-                Date last = new Date(cacheObject);
-                // 舍弃时分秒,只保留日期部分
-                LocalDate nowDate = now.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
-                LocalDate lastDate = last.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
-                System.err.println("nowDate: " + nowDate);
-                System.err.println("lastDate: " + lastDate);
-                // 计算两个日期之间的天数差
-                long daysBetween = ChronoUnit.DAYS.between(lastDate, nowDate);
+            RedisUtils.setCacheObject(CacheNames.XF_TERM_IP + ipAddress, date.getTime());
+        }else{
+            // 当前时间-上次下发时间 >= 1天 就下发
+            Date now = new Date();
+            Date last = new Date(cacheObject);
+            // 舍弃时分秒,只保留日期部分
+            LocalDate nowDate = now.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            LocalDate lastDate = last.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            System.err.println("nowDate: " + nowDate);
+            System.err.println("lastDate: " + lastDate);
+            // 计算两个日期之间的天数差
+            long daysBetween = ChronoUnit.DAYS.between(lastDate, nowDate);
 
-                // 判断是否相差 1 天或以上
-                if (daysBetween >= 1) {
-                    // 相差一天以上,执行下发逻辑
-                    sendDeviceService.upLoadEmpToDevice(macAddress, last, true);
-                    RedisUtils.setCacheObject(CacheNames.XF_TERM_IP + ipAddress, now.getTime());
-                }
+            // 判断是否相差 1 天或以上
+            if (daysBetween >= 1) {
+                // 相差一天以上,执行下发逻辑
+                sendDeviceService.upLoadEmpToDevice(macAddress, last, true);
+                RedisUtils.setCacheObject(CacheNames.XF_TERM_IP + ipAddress, now.getTime());
             }
         }
 

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

@@ -59,7 +59,7 @@ public class TransactionRecordEventHandler implements HikEventHandler {
         log.info("消费机交易记录事件,类型,在线or离线:{},{}", modeType, jsonObject.toJSONString());
 
         //设备信息
-        XfTermVo termVo = termService.queryByMac(transactionRecordEventReceive.getMacAddress());
+        XfTermVo termVo = termService.getByMac(transactionRecordEventReceive.getMacAddress());
         Long termNo = termVo.getTermNo();
         // 消费抓拍图片保存
         if (fileContent != null) {

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

@@ -20,7 +20,7 @@ public interface IXfTermService {
     /**
      * 根据设备的mac查询设备信息
      */
-    XfTermVo queryByMac(String termMac);
+//    XfTermVo queryByMac(String termMac);
 
     public XfTermVo getByMac(String termMac);
 
@@ -30,6 +30,6 @@ public interface IXfTermService {
      * @param newIP 新ip
      * @return 修改成功
      */
-    boolean updateByMac(String termMac,String newIP);
+    XfTermVo updateByMac(String termMac,String newIP);
 
 }

+ 1 - 1
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/service/impl/SendDeviceServiceImpl.java

@@ -714,7 +714,7 @@ public class SendDeviceServiceImpl implements ISendDeviceService {
             return R.warn("没有要处理人员数据");
         }
         log.info("day处理人员数据条数" + vos.size());
-        XfTermVo termVo = xfTermService.queryByMac(macAddress);
+        XfTermVo termVo = xfTermService.getByMac(macAddress);
         if (ObjectUtil.isEmpty(termVo)) {
             return R.warn(MessageFormat.format("设备未找到,mac:{0}", macAddress));
         }

+ 16 - 20
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/service/impl/XfTermServiceImpl.java

@@ -3,6 +3,7 @@ package org.dromara.server.hik.service.impl;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -13,6 +14,7 @@ import org.dromara.backstage.api.domain.vo.RemotePtRoomVo;
 import org.dromara.common.core.config.DefaultConfig;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.tenant.helper.TenantHelper;
@@ -20,6 +22,8 @@ import org.dromara.server.hik.domain.XfTerm;
 import org.dromara.server.hik.domain.vo.XfTermVo;
 import org.dromara.server.hik.mapper.XfTermMapper;
 import org.dromara.server.hik.service.IXfTermService;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
 import java.time.Duration;
@@ -41,10 +45,10 @@ public class XfTermServiceImpl implements IXfTermService {
     private final XfTermMapper baseMapper;
     private final DefaultConfig defaultConfig;
 
-    private String cache = CacheNames.PT_TERM_MAC_MAP + "_hik";
+    public static final String cache = CacheNames.PT_TERM_MAC_MAP + "_hik";
 
 
-    @Override
+//    @Override
     public XfTermVo queryByMac(String termMac) {
         boolean existsObject = RedisUtils.isExistsObject(cache);
         if(!existsObject){
@@ -74,6 +78,7 @@ public class XfTermServiceImpl implements IXfTermService {
     }
 
     @Override
+    @Cacheable(cacheNames = XfTermServiceImpl.cache, key = "#termMac", unless = "#result == null", condition = "#termMac != null")
     public XfTermVo getByMac(String termMac){
         List<XfTermVo> termVos = baseMapper.selectVoList(new LambdaQueryWrapper<XfTerm>().eq(XfTerm::getTermMac, termMac));
         if(CollectionUtil.isEmpty(termVos)){
@@ -92,24 +97,15 @@ public class XfTermServiceImpl implements IXfTermService {
      * @return 修改成功
      */
     @Override
-    public boolean updateByMac(String termMac, String newIP) {
-        XfTermVo xfTermVo = queryByMac(termMac);
-        if(xfTermVo!=null){
-            if(StringUtils.isBlank(xfTermVo.getTermIp()) || !xfTermVo.getTermIp().equals(newIP)){
-                XfTerm xfTerm = new XfTerm();
-                xfTerm.setTermId(xfTermVo.getTermId());
-                xfTerm.setTermIp(newIP);
-                xfTermVo.setTermIp(newIP);
-                boolean b = baseMapper.updateById(xfTerm) > 0;
-                boolean existsObject = RedisUtils.isExistsObject(cache);
-                if(existsObject){
-                    RedisUtils.setCacheMapValue(cache, termMac, xfTermVo);
-                }
-                return b;
-            }
-            return true;
-        }
-        return false;
+    @CachePut(cacheNames = XfTermServiceImpl.cache, key = "#termMac", condition = "#result != null")
+    public XfTermVo updateByMac(String termMac, String newIP) {
+        if(StringUtils.isBlank(termMac)) return null;
+        XfTerm xfTerm = new XfTerm();
+        xfTerm.setTermMac(termMac);
+        xfTerm.setTermIp(newIP);
+        LambdaUpdateWrapper<XfTerm> set = Wrappers.lambdaUpdate(XfTerm.class).eq(XfTerm::getTermMac, termMac).set(XfTerm::getTermIp, newIP);
+        baseMapper.update(set);
+        return getByMac(termMac);
     }
 
 }