Procházet zdrojové kódy

门锁记录定时任务优化

xiari před 11 měsíci
rodič
revize
2e796ef9eb

+ 4 - 0
ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/service/RemoteOpenDoorService.java

@@ -2,6 +2,8 @@ package org.dromara.hotel.api.service;
 
 import org.dromara.hotel.api.domain.bo.RemoteDoorOpenBo;
 
+import java.util.List;
+
 /**
  * @ClassName RemoteOpenDoorService
  * @Description 酒店系统开门记录远程服务接口
@@ -19,5 +21,7 @@ public interface RemoteOpenDoorService {
      * @return 操作结果
      */
     Integer insertOpenDoorByBo(RemoteDoorOpenBo remoteBo);
+
+    Integer insertBatchByBo(List<RemoteDoorOpenBo> remoteBos);
 }
 

+ 66 - 36
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/lock/LockBusiness.java

@@ -25,6 +25,7 @@ import org.dromara.hotel.api.service.RemoteLockPowerService;
 import org.dromara.hotel.api.service.RemoteOpenDoorService;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -168,14 +169,19 @@ public class LockBusiness {
     public Integer queryOpenDoorRecord(Integer pageNo) {
         AtomicReference<Integer> openDoorRecord = new AtomicReference<>(0);
         List<PtRoomVo> roomVos = roomService.queryHotelRoomList();
+        List<RemoteDoorOpenBo> list = new ArrayList<>();
         if (CollectionUtil.isNotEmpty(roomVos)) {
             roomVos.parallelStream().forEach(p -> {
                 String lockId = p.getLockId();
                 // 定时任务只查询最近1天的数据
-                openDoorRecord.updateAndGet(v -> v + this.queryOpenDoorRecord(lockId, p.getRoomCode(), p.getRoomName(),pageNo,true));
+                List<RemoteDoorOpenBo> bos = this.queryOpenDoorRecordForSchedule(lockId, p.getRoomCode(), p.getRoomName(), pageNo);
+                list.addAll(bos);
             });
+            if(CollectionUtil.isNotEmpty(list)){
+                remoteOpenDoorService.insertBatchByBo(list);
+            }
         }
-        return openDoorRecord.get();
+        return list.size();
     }
 
     public Integer queryOpenDoorRecordByRoomCode(String RoomCode) {
@@ -190,7 +196,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,false);
+            return queryOpenDoorRecord(vo.getLockId(), vo.getRoomCode(), vo.getRoomName(),pageNo);
         } else {
             return 0;
         }
@@ -216,7 +222,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,  false);
+                syncCount += queryOpenDoorRecord(lockId, roomCode, roomName, i + 1);
             }
         }
         return syncCount;
@@ -229,42 +235,16 @@ public class LockBusiness {
      * @param roomCode
      * @param roomName
      * @param pageNo   页码
-     * @param isSchedule 是否定时任务
      * @return 记录条数
      */
-    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");
-        formMap.put("OPERATETYPE", "2");
-        formMap.put("PAGENO", pageNo);
-
+    private Integer queryOpenDoorRecord(String lockId, String roomCode, String roomName, int pageNo) {
+        JSONObject resultObj = buildAndSendLockRecordRequest(lockId, pageNo);
+        String flag = resultObj.getStr("result");
         AtomicReference<Integer> syncCount = new AtomicReference<>(0);
-        String result = lockUtils.sendPost(formMap, "operateLockRecord");
-        String flag = JSONUtil.parseObj(result).getStr("result");
         if (ObjectUtil.equals(flag, "0")) {
-            JSONArray pageData = JSONUtil.parseObj(result).getJSONArray("pageData");
-            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(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("");
-                }
-                remoteBo.setOpenDoorUser(0L);
+            JSONArray pageData = resultObj.getJSONArray("pageData");
+            pageData.parallelStream().map(JSONUtil::parseObj).forEach(p -> {
+                RemoteDoorOpenBo remoteBo = buildRemoteDoorOpenBo(p, roomCode, roomName);
                 try {
                     int iCount = remoteOpenDoorService.insertOpenDoorByBo(remoteBo);
                     if (iCount > 0) {
@@ -278,6 +258,56 @@ public class LockBusiness {
         return syncCount.get();
     }
 
+    private List<RemoteDoorOpenBo> queryOpenDoorRecordForSchedule(String lockId, String roomCode, String roomName, int pageNo) {
+        List<RemoteDoorOpenBo> list = new ArrayList<>();
+        JSONObject resultObj = buildAndSendLockRecordRequest(lockId, pageNo);
+        String flag = resultObj.getStr("result");
+        if (ObjectUtil.equals(flag, "0")) {
+            JSONArray pageData = resultObj.getJSONArray("pageData");
+            pageData.parallelStream().map(JSONUtil::parseObj).filter(p -> {
+                // 当前时间与开门时间相差大于25小时
+                DateTime operateTime = DateUtil.parse(p.getStr("operateTime"), DefaultConstants.DATE_TIME_FORMAT);
+                return operateTime != null && DateUtil.between(DateUtil.date(), operateTime, DateUnit.HOUR) <= 24;
+            }).forEach(p -> {
+                RemoteDoorOpenBo remoteBo = buildRemoteDoorOpenBo(p, roomCode, roomName);
+                list.add(remoteBo);
+            });
+        }
+        return list;
+    }
+
+    /**
+ * 构建并发送门锁开门记录请求
+ *
+ * @param lockId 门锁ID
+ * @param pageNo 页码
+ * @return 请求响应数据
+ */
+private JSONObject buildAndSendLockRecordRequest(String lockId, int pageNo) {
+    Map<String, Object> formMap = new HashMap<>();
+    formMap.put("KEYLOCKID", lockId);
+    formMap.put("CARDPSWBIT", "1");
+    formMap.put("OPERATETYPE", "2");
+    formMap.put("PAGENO", pageNo);
+
+    String result = lockUtils.sendPost(formMap, "operateLockRecord");
+    return JSONUtil.parseObj(result);
+}
+
+    // 构造 RemoteDoorOpenBo 对象
+    private RemoteDoorOpenBo buildRemoteDoorOpenBo(JSONObject p, String roomCode, String roomName) {
+        RemoteDoorOpenBo remoteBo = new RemoteDoorOpenBo();
+        remoteBo.setRoomCode(roomCode);
+        remoteBo.setRoomName(roomName);
+        remoteBo.setOpenDoorMode(p.getStr("openWay"));
+        remoteBo.setOpenTime(DateUtil.parse(p.getStr("operateTime"), DefaultConstants.DATE_TIME_FORMAT));
+        remoteBo.setOpenResult(p.getStr("openResult"));
+        remoteBo.setFactoryId(ObjectUtil.isNotEmpty(p.get("cardId")) ? p.getStr("cardId") : "");
+        remoteBo.setOpenDoorUser(0L);
+        return remoteBo;
+    }
+
+
     /**
      * 门锁电量入库
      *

+ 8 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/dubbo/RemoteOpenDoorServiceImpl.java

@@ -10,6 +10,8 @@ import org.dromara.hotel.domain.bo.KfDoorOpenHisBo;
 import org.dromara.hotel.service.IKfDoorOpenHisService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @ClassName RemoteLockPowerServiceImpl
  * @Description 酒店门锁电量远程服务实现
@@ -31,4 +33,10 @@ public class RemoteOpenDoorServiceImpl implements RemoteOpenDoorService {
         KfDoorOpenHisBo bo = BeanUtil.copyProperties(remoteBo, KfDoorOpenHisBo.class);
         return doorOpenHisService.insertOrUpdateByBo(bo);
     }
+
+    @Override
+    public Integer insertBatchByBo(List<RemoteDoorOpenBo> remoteBos) {
+        List<KfDoorOpenHisBo> bos = BeanUtil.copyToList(remoteBos, KfDoorOpenHisBo.class);
+        return doorOpenHisService.insertBatch(bos);
+    }
 }

+ 8 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfDoorOpenHisService.java

@@ -73,4 +73,12 @@ public interface IKfDoorOpenHisService {
      * @return 受影响记录数
      */
     Integer insertOrUpdateByBo(KfDoorOpenHisBo bo);
+
+    /**
+     * 批量插入
+     *
+     * @param list 批量插入数据
+     * @return 受影响记录数
+     */
+    Integer insertBatch(List<KfDoorOpenHisBo> list);
 }

+ 20 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfDoorOpenHisServiceImpl.java

@@ -17,6 +17,7 @@ import org.dromara.hotel.mapper.KfDoorOpenHisMapper;
 import org.dromara.hotel.service.IKfDoorOpenHisService;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -167,4 +168,23 @@ public class KfDoorOpenHisServiceImpl implements IKfDoorOpenHisService {
         }
         return 0;
     }
+
+    /**
+     * 批量插入
+     *
+     * @param list 批量插入数据
+     * @return 受影响记录数
+     */
+    @Override
+    public Integer insertBatch(List<KfDoorOpenHisBo> list) {
+        if(CollectionUtil.isEmpty( list)) return 0;
+        List<KfDoorOpenHis> kfDoorOpenHisList = new ArrayList<>();
+        list.forEach(
+            bo -> kfDoorOpenHisList.add(MapstructUtils.convert(bo, KfDoorOpenHis.class))
+        );
+        if(CollectionUtil.isNotEmpty(kfDoorOpenHisList)){
+            return baseMapper.insertBatch(kfDoorOpenHisList)?kfDoorOpenHisList.size():0;
+        }
+        return 0;
+    }
 }