ソースを参照

优化门锁开门记录定时任务

xiari 11 ヶ月 前
コミット
99feb99781

+ 23 - 12
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/lock/LockBusiness.java

@@ -1,6 +1,8 @@
 package org.dromara.backstage.business.lock;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
@@ -169,7 +171,8 @@ public class LockBusiness {
         if (CollectionUtil.isNotEmpty(roomVos)) {
             roomVos.parallelStream().forEach(p -> {
                 String lockId = p.getLockId();
-                openDoorRecord.updateAndGet(v -> v + this.queryOpenDoorRecord(lockId, p.getRoomCode(), p.getRoomName(),pageNo));
+                // 定时任务只查询最近1天的数据
+                openDoorRecord.updateAndGet(v -> v + this.queryOpenDoorRecord(lockId, p.getRoomCode(), p.getRoomName(),pageNo,true));
             });
         }
         return openDoorRecord.get();
@@ -186,7 +189,7 @@ public class LockBusiness {
     public Integer queryOpenDoorRecordByRoomCode(String RoomCode,int pageNo) {
         PtRoomVo vo = roomService.selectHotelRoom(RoomCode);
         if (ObjectUtil.isNotEmpty(vo)) {
-            return queryOpenDoorRecord(vo.getLockId(), vo.getRoomCode(), vo.getRoomName(),pageNo);
+            return queryOpenDoorRecord(vo.getLockId(), vo.getRoomCode(), vo.getRoomName(),pageNo,false);
         } else {
             return 0;
         }
@@ -211,7 +214,7 @@ public class LockBusiness {
         if (ObjectUtil.equals(flag, "0")) {
             int totalPage = JSONUtil.parseObj(result).getInt("totalPage");
             for (int i = 0; i < totalPage; i++) {
-                syncCount += queryOpenDoorRecord(lockId, roomCode, roomName, i + 1);
+                syncCount += queryOpenDoorRecord(lockId, roomCode, roomName, i + 1,  false);
             }
         }
         return syncCount;
@@ -224,9 +227,10 @@ public class LockBusiness {
      * @param roomCode
      * @param roomName
      * @param pageNo   页码
+     * @param isSchedule 是否定时任务
      * @return 记录条数
      */
-    private Integer queryOpenDoorRecord(String lockId, String roomCode, String roomName, int pageNo) {
+    private Integer queryOpenDoorRecord(String lockId, String roomCode, String roomName, int pageNo, boolean isSchedule) {
         Map<String, Object> formMap = new HashMap<>();
         formMap.put("KEYLOCKID", lockId);
         formMap.put("CARDPSWBIT", "1");
@@ -238,16 +242,23 @@ public class LockBusiness {
         String flag = JSONUtil.parseObj(result).getStr("result");
         if (ObjectUtil.equals(flag, "0")) {
             JSONArray pageData = JSONUtil.parseObj(result).getJSONArray("pageData");
-            pageData.parallelStream().forEach(p -> {
-                JSONObject record = JSONUtil.parseObj(p);
+            pageData.parallelStream().map(JSONUtil::parseObj).filter(p -> {
+                if(isSchedule){
+                    // 当前时间与开门时间相差大于25小时,则continue
+                    DateTime operateTime = DateUtil.parse(p.getStr("operateTime"), DefaultConstants.DATE_TIME_FORMAT);
+                    return operateTime != null && DateUtil.between(DateUtil.date(), operateTime, DateUnit.HOUR) <= 25;
+                }
+                return true;
+            }).forEach(p -> {
+//                JSONObject record = JSONUtil.parseObj(p);
                 RemoteDoorOpenBo remoteBo = new RemoteDoorOpenBo();
                 remoteBo.setRoomCode(roomCode);
                 remoteBo.setRoomName(roomName);
-                remoteBo.setOpenDoorMode(record.getStr("openWay"));
-                remoteBo.setOpenTime(DateUtil.parse(record.getStr("operateTime"), DefaultConstants.DATE_TIME_FORMAT));
-                remoteBo.setOpenResult(record.getStr("openResult"));
-                if (ObjectUtil.isNotEmpty(record.get("cardId"))) {
-                    remoteBo.setFactoryId(record.getStr("cardId"));
+                remoteBo.setOpenDoorMode(p.getStr("openWay"));
+                remoteBo.setOpenTime(DateUtil.parse(p.getStr("operateTime"), DefaultConstants.DATE_TIME_FORMAT));
+                remoteBo.setOpenResult(p.getStr("openResult"));
+                if (ObjectUtil.isNotEmpty(p.get("cardId"))) {
+                    remoteBo.setFactoryId(p.getStr("cardId"));
                 } else {
                     remoteBo.setFactoryId("");
                 }
@@ -258,7 +269,7 @@ public class LockBusiness {
                         syncCount.getAndSet(syncCount.get() + 1);
                     }
                 } catch (Exception e) {
-                    log.error("[同步开门记录异常]-[{}]", record, e);
+                    log.error("[同步开门记录异常]-[{}]", p, e);
                 }
             });
         }

+ 9 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/controller/lock/LockController.java

@@ -119,4 +119,13 @@ public class LockController {
         log.info(message);
         return ReturnResult.success(message);
     }
+
+    @GetMapping(value = "/open/record/executeTask")
+    public ReturnResult queryOpenDoorRecordExectueTask() {
+        Integer syncCount = lockBusiness.queryOpenDoorRecord(1);
+        String message = MessageFormat.format("开门记录同步完成,本次同步了 {0} 条记录", syncCount);
+        log.info(message);
+        return ReturnResult.success(message);
+    }
+    
 }

+ 4 - 3
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfDoorOpenHisServiceImpl.java

@@ -158,10 +158,11 @@ public class KfDoorOpenHisServiceImpl implements IKfDoorOpenHisService {
     @Override
     public Integer insertOrUpdateByBo(KfDoorOpenHisBo bo) {
         KfDoorOpenHis add = MapstructUtils.convert(bo, KfDoorOpenHis.class);
-        List<KfDoorOpenHisVo> vos = baseMapper.selectVoList(new LambdaQueryWrapper<KfDoorOpenHis>().eq(KfDoorOpenHis::getFactoryId, bo.getFactoryId())
+        // 优化,只查询数据的条数
+        Long count = baseMapper.selectCount(new LambdaQueryWrapper<KfDoorOpenHis>().eq(KfDoorOpenHis::getFactoryId, bo.getFactoryId())
             .eq(KfDoorOpenHis::getRoomCode, bo.getRoomCode()).eq(KfDoorOpenHis::getOpenTime, bo.getOpenTime())
-            .eq(KfDoorOpenHis::getOpenDoorMode, bo.getOpenDoorMode()).eq(KfDoorOpenHis::getOpenResult, bo.getOpenResult()));
-        if (CollectionUtil.isEmpty(vos)) {
+            .eq(KfDoorOpenHis::getOpenDoorMode, bo.getOpenDoorMode()).eq(KfDoorOpenHis::getOpenResult, bo.getOpenResult()).last("limit 1"));
+        if (count == null || count == 0) {
             return baseMapper.insert(add);
         }
         return 0;