소스 검색

优化海康设备实时下发只下发卡数据,将上一次的下发的时间放置redis缓存中,根据缓存时间下发数据

xiari 11 달 전
부모
커밋
ac7609634a

+ 2 - 1
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteUserAccountService.java

@@ -4,6 +4,7 @@ import org.dromara.backstage.api.domain.bo.RemoteUserAccountBo;
 import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
 import org.dromara.common.core.domain.R;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -94,5 +95,5 @@ public interface RemoteUserAccountService {
      * @param days
      * @return
      */
-    List<RemoteUserAccountVo> getUpdateUserAccountVo(int days);
+    List<RemoteUserAccountVo> getUpdateUserAccountVo(Date startDate);
 }

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java

@@ -57,7 +57,7 @@ public interface IPtCardService {
      * @param startDate 开始时间
      * @return 卡片列表
      */
-    List<PtCardVo> getList(Date startDate);
+    List<PtCardVo> getList(Date startDate,Date endDate);
 
     /**
      * 新增账户卡片

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java

@@ -125,9 +125,9 @@ public class PtCardServiceImpl implements IPtCardService {
      * @return 卡片列表
      */
     @Override
-    public List<PtCardVo> getList(Date startDate) {
+    public List<PtCardVo> getList(Date startDate, Date endDate) {
         LambdaQueryWrapper<PtCard> between = Wrappers.lambdaQuery(PtCard.class).eq(PtCard::getStatus, CardStatusEnum.NORMAL.code().toString())
-            .and(wrapper -> wrapper.between(PtCard::getChangeTime, startDate, new Date()).or().between(PtCard::getCreateTime, startDate, new Date()));
+            .and(wrapper -> wrapper.between(PtCard::getChangeTime, startDate, endDate).or().between(PtCard::getCreateTime, startDate, endDate));
         return baseMapper.selectVoList(between);
     }
 

+ 4 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/dubbo/RemoteUserAccountServiceImpl.java

@@ -18,6 +18,7 @@ import org.dromara.common.core.utils.MapstructUtils;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -189,13 +190,13 @@ public class RemoteUserAccountServiceImpl implements RemoteUserAccountService {
     /**
      * 获取指定天数内有更新账户信息的和有卡片更新的账户信息
      *
-     * @param days 天数
+     * @param startDate 天数
      * @return List<RemoteUserAccountVo>
      */
     @Override
-    public List<RemoteUserAccountVo> getUpdateUserAccountVo(int days) {
+    public List<RemoteUserAccountVo> getUpdateUserAccountVo(Date startDate) {
         List<RemoteUserAccountVo> rs = new ArrayList<>();
-        List<PtUserAccountVo> userAccountVoByDay = userAccountService.getUserAccountVoByDay(days);
+        List<PtUserAccountVo> userAccountVoByDay = userAccountService.getUserAccountVoByDay(startDate);
         for (PtUserAccountVo userAccountAndCard : userAccountVoByDay) {
             RemoteUserAccountVo vo = MapstructUtils.convert(userAccountAndCard, RemoteUserAccountVo.class);
             if(vo !=null){

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPtUserAccountService.java

@@ -212,5 +212,5 @@ public interface IPtUserAccountService {
     /**
      * 获取指定天数内有更新账户信息的和有卡片更新的账户信息
      */
-    List<PtUserAccountVo> getUserAccountVoByDay(int days);
+    List<PtUserAccountVo> getUserAccountVoByDay(Date startDate);
 }

+ 4 - 7
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java

@@ -673,17 +673,14 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     /**
      * 获取指定天数内有更新账户信息的和有卡片更新的账户信息
      *
-     * @param days
+     * @param startDate
      */
     @Override
-    public List<PtUserAccountVo> getUserAccountVoByDay(int days) {
+    public List<PtUserAccountVo> getUserAccountVoByDay(Date startDate) {
         // 获取指定天数内有更新账户信息的
         // 人脸的
         Date date = new Date();
-        DateTime dateTime = DateUtil.offsetDay(date, -days);
-        // DateTime 转date
-        Date dateMin= dateTime.toJdkDate();
-        LambdaQueryWrapper<PtUserAccount> between = Wrappers.lambdaQuery(PtUserAccount.class).between(PtUserAccount::getUpdateTime, dateMin, date);
+        LambdaQueryWrapper<PtUserAccount> between = Wrappers.lambdaQuery(PtUserAccount.class).between(PtUserAccount::getUpdateTime, startDate, date);
         List<PtUserAccountVo> userAccountVos = baseMapper.selectVoList(between);
         List<PtUserAccountVo> updatePhotos = userAccountVos.stream().filter(e -> StringUtils.isNotBlank(e.getPhoto())).toList();
         updatePhotos.forEach(e -> e.setFacePicUrl(photoPrefix+e.getPhoto()));
@@ -691,7 +688,7 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
         List<PtUserAccountVo> rs = new ArrayList<>(updatePhotos);
 
         // 卡片的
-        List<PtCardVo> cardVos = ptCardService.getList(dateMin);
+        List<PtCardVo> cardVos = ptCardService.getList(startDate, date);
         List<Long> userIds = cardVos.stream().map(PtCardVo::getUserId).toList();
         Map<Long, PtCardVo> collect = cardVos.stream().collect(Collectors.toMap(PtCardVo::getUserId, e -> e));
         if(CollectionUtil.isNotEmpty(userIds)){

+ 1 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/XfTermServiceImpl.java

@@ -128,6 +128,7 @@ public class XfTermServiceImpl implements IXfTermService {
     @Override
     @Cacheable(cacheNames = CacheNames.PT_TERM_MAC_MAP, key = "#mac", unless = "#result == null")
     public XfTermVo queryVoOneByMac(String mac) {
+        if (StringUtils.isBlank(mac)) return null;
         XfTermBo bo = new XfTermBo();
         bo.setTermMac(mac);
         return queryVoOneByBo(bo);

+ 32 - 11
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/event/handler/HeatBeatHandler.java

@@ -15,9 +15,9 @@ import org.dromara.server.hik.service.ISendDeviceService;
 import org.dromara.server.hik.service.IXfTermService;
 import org.springframework.stereotype.Component;
 
-import java.time.Duration;
-import java.time.LocalTime;
+import java.time.*;
 import java.time.temporal.ChronoUnit;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -43,21 +43,42 @@ public class HeatBeatHandler implements HikEventHandler {
         boolean b = xfTermService.updateByMac(macAddress, ipAddress);
 
         if(b){
-            //RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, userOnline, Duration.ofSeconds(tokenConfig.getTimeout()));
-            Object cacheObject = RedisUtils.getCacheObject(CacheNames.XF_TERM_IP + ipAddress);
+            //增量下发 人脸数据和卡数据
+            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  更新卡片
                 //下发数据
-                sendDeviceService.upLoadEmpToDevice(macAddress,3,true);
+                // 获取当前时间的前一天的时间
+                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);
 
-                // 设置过期时间为当天还剩余时间
-                LocalTime now = LocalTime.now();
-                LocalTime endOfDay = LocalTime.MAX;
-                long untilEndOfDay = ChronoUnit.MINUTES.between(now, endOfDay);
-                RedisUtils.setCacheObject(CacheNames.XF_TERM_IP + ipAddress, macAddress,Duration.ofMinutes(untilEndOfDay));
+                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());
+                }
             }
         }
 

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

@@ -181,11 +181,11 @@ public interface ISendDeviceService {
 
     /**
      * 上传days内的数据至到指定设备
-     * @param days 天数
+     * @param startDate 天数
      * @param uploadPhoto 是否上传照片
      * @return 无
      */
-    R<Void> upLoadEmpToDevice(String macAddress,int days, Boolean uploadPhoto);
+    R<Void> upLoadEmpToDevice(String macAddress,Date startDate, Boolean uploadPhoto);
 
     /**
      * 上传指定员工信息到所有设备。

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

@@ -703,13 +703,13 @@ public class SendDeviceServiceImpl implements ISendDeviceService {
     /**
      * 上传days内的数据至指定mac设备
      *
-     * @param days        天数
+     * @param startDate        天数
      * @param uploadPhoto 是否上传照片
      * @return 无
      */
     @Override
-    public R<Void> upLoadEmpToDevice(String macAddress,int days, Boolean uploadPhoto) {
-        List<RemoteUserAccountVo> vos = remoteUserAccountService.getUpdateUserAccountVo(days);
+    public R<Void> upLoadEmpToDevice(String macAddress,Date startDate, Boolean uploadPhoto) {
+        List<RemoteUserAccountVo> vos = remoteUserAccountService.getUpdateUserAccountVo(startDate);
         if (CollectionUtil.isEmpty(vos)) {
             return R.warn("没有要处理人员数据");
         }

+ 12 - 15
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/service/impl/XfTermServiceImpl.java

@@ -41,10 +41,12 @@ public class XfTermServiceImpl implements IXfTermService {
     private final XfTermMapper baseMapper;
     private final DefaultConfig defaultConfig;
 
+    private String cache = CacheNames.PT_TERM_MAC_MAP + "_hik";
+
 
     @Override
     public XfTermVo queryByMac(String termMac) {
-        boolean existsObject = RedisUtils.isExistsObject(CacheNames.PT_TERM_MAC_MAP);
+        boolean existsObject = RedisUtils.isExistsObject(cache);
         if(!existsObject){
             // 缓存设备mac地址
             XfTermVo byMac = getByMac(termMac);
@@ -53,21 +55,21 @@ public class XfTermServiceImpl implements IXfTermService {
             }
             Map<String, XfTermVo> map = new HashMap<>();
             map.put(termMac, byMac);
-            RedisUtils.setCacheMap(CacheNames.PT_TERM_MAC_MAP, map);
-            RedisUtils.expire(CacheNames.PT_TERM_MAC_MAP, Duration.ofHours(1));
+            RedisUtils.setCacheMap(cache, map);
+            RedisUtils.expire(cache, Duration.ofHours(1));
             return byMac;
         }
-        Object value = RedisUtils.getCacheMapValue(CacheNames.PT_TERM_MAC_MAP, termMac);
+        XfTermVo value = RedisUtils.getCacheMapValue(cache, termMac);
         if(ObjUtil.isNull(value)){
             // 缓存设备mac地址
             XfTermVo byMac = getByMac(termMac);
             if(ObjUtil.isNull(byMac)){
                 return null;
             }
-            RedisUtils.setCacheMapValue(CacheNames.PT_TERM_MAC_MAP, termMac, byMac);
+            RedisUtils.setCacheMapValue(cache, termMac, byMac);
             return byMac;
         }
-        return (XfTermVo) value;
+        return value;
 
     }
 
@@ -91,22 +93,17 @@ public class XfTermServiceImpl implements IXfTermService {
      */
     @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);
+        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(CacheNames.PT_TERM_MAC_MAP);
+                boolean existsObject = RedisUtils.isExistsObject(cache);
                 if(existsObject){
-                    RedisUtils.setCacheMapValue(CacheNames.PT_TERM_MAC_MAP, termMac, xfTermVo);
+                    RedisUtils.setCacheMapValue(cache, termMac, xfTermVo);
                 }
                 return b;
             }

+ 2 - 2
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/task/ScheduledTasks.java

@@ -34,7 +34,7 @@ public class ScheduledTasks {
      * 注意:此方法依赖于外部服务接口的具体实现,确保目标设备和员工信息管理后台接口可用。
      */
     // 每天11:10和17:10、7:00执行
-    @Scheduled(cron = "0 20 11,17 * * *")
+//    @Scheduled(cron = "0 20 11,17 * * *")
     public void upLoadEmpToDevice() {
         scheduledExecutorService.submit(() -> {
             log.info("向所有海康消费机下发人员定时任务开始执行");
@@ -50,7 +50,7 @@ public class ScheduledTasks {
      * <p>
      * 注意:此方法依赖于外部服务接口的具体实现,确保目标设备和员工信息管理后台接口可用。
      */
-    @Scheduled(cron = "0 0 7 * * *")
+//    @Scheduled(cron = "0 0 7 * * *")
     public void upLoadEmpToDevice2() {
         scheduledExecutorService.submit(() -> {
             log.info("向所有海康消费机下发人员定时任务开始执行");