Parcourir la source

feature: 客房系统
1.同步开门记录入库

luo.yibo@datuai.com il y a 1 an
Parent
commit
d7660647e5

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

@@ -1,9 +1,6 @@
 package org.dromara.hotel.api.service;
 
-import org.dromara.common.core.domain.R;
-import org.dromara.common.core.domain.model.ErrorInfo;
 import org.dromara.hotel.api.domain.bo.RemoteDoorOpenBo;
-import org.dromara.hotel.api.domain.bo.RemoteLockPowerBo;
 
 /**
  * @ClassName RemoteOpenDoorService
@@ -17,9 +14,10 @@ public interface RemoteOpenDoorService {
 
     /**
      * 增加开门记录信息
+     *
      * @param remoteBo 开门纪录业务对象
      * @return 操作结果
      */
-    R<ErrorInfo> insertOpenDoorByBo(RemoteDoorOpenBo remoteBo);
+    Integer insertOpenDoorByBo(RemoteDoorOpenBo remoteBo);
 }
 

+ 57 - 15
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/lock/LockBusiness.java

@@ -1,14 +1,11 @@
 package org.dromara.backstage.business.lock;
-import java.util.Date;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.lang.TypeReference;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONString;
 import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -17,7 +14,6 @@ import org.dromara.backstage.basics.domain.vo.PtRoomVo;
 import org.dromara.backstage.basics.service.IPtRoomService;
 import org.dromara.backstage.domain.bo.lock.RoomCardBo;
 import org.dromara.backstage.util.LockUtils;
-import org.dromara.backstage.util.SignatureUtil;
 import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.constant.LockConstants;
 import org.dromara.common.core.domain.R;
@@ -30,6 +26,7 @@ import org.springframework.stereotype.Service;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * @ClassName LockBusiness
@@ -59,7 +56,7 @@ public class LockBusiness {
      * @return 发卡数据
      */
     public R<String> getWriteCardData(RoomCardBo bo) {
-        log.debug("发卡入参:{}, {}", JSONUtil.toJsonStr(bo),bo.getCardType());
+        log.debug("发卡入参:{}, {}", JSONUtil.toJsonStr(bo), bo.getCardType());
         Integer cardType = bo.getCardType();
         String cardData = "";
         Map<String, Object> formMap;
@@ -90,6 +87,7 @@ public class LockBusiness {
 
     /**
      * 远程开门
+     *
      * @param lockId 门锁Id
      * @return 开门结果
      */
@@ -127,6 +125,7 @@ public class LockBusiness {
 
     /**
      * 查询门锁电量并保持至数据库
+     *
      * @param areaId 指定区域
      * @return 查询结果
      */
@@ -138,6 +137,7 @@ public class LockBusiness {
 
     /**
      * 查询门锁电量并保持至数据库
+     *
      * @return 查询结果
      */
     public Boolean syncLockPower() {
@@ -146,54 +146,96 @@ public class LockBusiness {
         return true;
     }
 
-    public void queryOpenDoorRecord(String lockId) {
+    /**
+     * 同步所有房间的开门记录
+     *
+     * @return 同步记录数
+     */
+    public Integer queryOpenDoorRecord() {
+        AtomicReference<Integer> openDoorRecord = new AtomicReference<>(0);
+        List<PtRoomVo> roomVos = roomService.queryHotelRoomList();
+        if (CollectionUtil.isNotEmpty(roomVos)) {
+            roomVos.parallelStream().forEach(p -> {
+                String lockId = p.getLockId();
+                openDoorRecord.updateAndGet(v -> v + this.queryOpenDoorRecord(lockId));
+            });
+        }
+        return openDoorRecord.get();
+    }
+
+    /**
+     * 同步处理开门记录(指定门锁)
+     *
+     * @param lockId 门锁Id
+     */
+    public Integer queryOpenDoorRecord(String lockId) {
         Map<String, Object> formMap = new HashMap<>();
         formMap.put("KEYLOCKID", lockId);
         formMap.put("CARDPSWBIT", "1");
         formMap.put("OPERATETYPE", "2");
-        formMap.put("PAGENO","1");
+        formMap.put("PAGENO", "1");
 
         String result = lockUtils.sendPost(formMap, "operateLockRecord");
         String flag = JSONUtil.parseObj(result).getStr("result");
+        Integer syncCount = 0;
         if (ObjectUtil.equals(flag, "0")) {
             int totalPage = JSONUtil.parseObj(result).getInt("totalPage");
             for (int i = 0; i < totalPage; i++) {
-                queryOpenDoorRecord(lockId, i + 1);
+                syncCount += queryOpenDoorRecord(lockId, i + 1);
             }
         }
-   }
+        return syncCount;
+    }
 
-    public void queryOpenDoorRecord(String lockId,int pageNo) {
+    /**
+     * 同步处理开门记录(指定门锁与页码)
+     *
+     * @param lockId 门锁Id
+     * @param pageNo 页码
+     * @return 记录条数
+     */
+    public Integer queryOpenDoorRecord(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);
+        formMap.put("PAGENO", pageNo);
 
+        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().forEach(p->{
+            pageData.parallelStream().forEach(p -> {
                 JSONObject record = JSONUtil.parseObj(p);
                 RemoteDoorOpenBo remoteBo = new RemoteDoorOpenBo();
                 remoteBo.setRoomCode("A604");
                 remoteBo.setRoomName("A604");
                 remoteBo.setOpenDoorMode(record.getStr("openWay"));
-                remoteBo.setOpenTime(DateUtil.parse(record.getStr("operateTime"),DefaultConstants.DATE_TIME_FORMAT));
+                remoteBo.setOpenTime(DateUtil.parse(record.getStr("operateTime"), DefaultConstants.DATE_TIME_FORMAT));
                 remoteBo.setOpenResult(record.getStr("openResult"));
-                if(ObjectUtil.isNotEmpty(record.get("cardId"))) {
+                if (ObjectUtil.isNotEmpty(record.get("cardId"))) {
                     remoteBo.setFactoryId(record.getStr("cardId"));
                 } else {
                     remoteBo.setFactoryId("");
                 }
                 remoteBo.setOpenDoorUser(0L);
-                remoteOpenDoorService.insertOpenDoorByBo(remoteBo);
+                try {
+                    int iCount = remoteOpenDoorService.insertOpenDoorByBo(remoteBo);
+                    if (iCount > 0) {
+                        syncCount.getAndSet(syncCount.get() + 1);
+                    }
+                } catch (Exception e) {
+                    log.error("[同步开门记录异常]-[{}]", record, e);
+                }
             });
         }
+        return syncCount.get();
     }
+
     /**
      * 门锁电量入库
+     *
      * @param roomVos 门锁列表
      */
     private void insertLockPower(List<PtRoomVo> roomVos) {

+ 23 - 6
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/controller/lock/LockController.java

@@ -10,6 +10,8 @@ import org.dromara.common.core.domain.R;
 import org.dromara.common.core.enums.ResultCodeEnum;
 import org.springframework.web.bind.annotation.*;
 
+import java.text.MessageFormat;
+
 /**
  * name: lockController
  * package: org.dromara.backstage.controller.lock
@@ -81,22 +83,37 @@ public class LockController {
     }
 
     /**
-     * 获取指定门锁的开门记录(全部记录)
+     * 同步指定门锁的开门记录(全部记录)
      * @param lockId 门锁Id
      */
     @GetMapping(value = "/open/record/{lockId}")
-    public void queryOpenDoorRecord(@PathVariable String lockId){
-        lockBusiness.queryOpenDoorRecord(lockId);
+    public ReturnResult queryOpenDoorRecord(@PathVariable String lockId) {
+        Integer syncCount = lockBusiness.queryOpenDoorRecord(lockId);
+        String message = MessageFormat.format("开门记录同步完成,本次同步了 {0} 条记录", syncCount);
+        return ReturnResult.success(message);
     }
 
     /**
-     * 获取指定门锁的开门记录(指定页码)
+     * 同步指定门锁的开门记录(指定页码)
      * @param lockId 门锁Id
      * @param pageNo 页码
      */
     @GetMapping(value = "/open/record/{lockId}/{pageNo}")
-    public void queryOpenDoorRecord(@PathVariable String lockId,@PathVariable int pageNo){
-        lockBusiness.queryOpenDoorRecord(lockId,pageNo);
+    public ReturnResult queryOpenDoorRecord(@PathVariable String lockId, @PathVariable int pageNo) {
+        Integer syncCount = lockBusiness.queryOpenDoorRecord(lockId, pageNo);
+        String message = MessageFormat.format("开门记录同步完成,本次同步了 {0} 条记录", syncCount);
+        return ReturnResult.success(message);
     }
 
+    /**
+     * 同步所有房间的开门记录
+     *
+     * @return 同步结果
+     */
+    @GetMapping(value = "/open/record")
+    public ReturnResult queryOpenDoorRecord() {
+        Integer syncCount = lockBusiness.queryOpenDoorRecord();
+        String message = MessageFormat.format("开门记录同步完成,本次同步了 {0} 条记录", syncCount);
+        return ReturnResult.success(message);
+    }
 }

+ 2 - 6
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/dubbo/RemoteOpenDoorServiceImpl.java

@@ -4,8 +4,6 @@ import cn.hutool.core.bean.BeanUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
-import org.dromara.common.core.domain.R;
-import org.dromara.common.core.domain.model.ErrorInfo;
 import org.dromara.hotel.api.domain.bo.RemoteDoorOpenBo;
 import org.dromara.hotel.api.service.RemoteOpenDoorService;
 import org.dromara.hotel.domain.bo.KfDoorOpenHisBo;
@@ -29,10 +27,8 @@ public class RemoteOpenDoorServiceImpl implements RemoteOpenDoorService {
     private final IKfDoorOpenHisService doorOpenHisService;
 
     @Override
-    public R<ErrorInfo> insertOpenDoorByBo(RemoteDoorOpenBo remoteBo) {
+    public Integer insertOpenDoorByBo(RemoteDoorOpenBo remoteBo) {
         KfDoorOpenHisBo bo = BeanUtil.copyProperties(remoteBo, KfDoorOpenHisBo.class);
-        boolean flag = doorOpenHisService.insertOrUpdateByBo(bo);
-        //boolean flag = doorOpenHisService.insertByBo(bo);
-        return flag ? R.ok() : R.fail();
+        return doorOpenHisService.insertOrUpdateByBo(bo);
     }
 }

+ 10 - 5
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfDoorOpenHisService.java

@@ -1,10 +1,9 @@
 package org.dromara.hotel.service;
 
-import org.dromara.hotel.domain.KfDoorOpenHis;
-import org.dromara.hotel.domain.vo.KfDoorOpenHisVo;
-import org.dromara.hotel.domain.bo.KfDoorOpenHisBo;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.hotel.domain.bo.KfDoorOpenHisBo;
+import org.dromara.hotel.domain.vo.KfDoorOpenHisVo;
 
 import java.util.Collection;
 import java.util.List;
@@ -67,5 +66,11 @@ public interface IKfDoorOpenHisService {
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
-    Boolean insertOrUpdateByBo(KfDoorOpenHisBo bo);
+    /**
+     * 增加或修改开门记录
+     *
+     * @param bo 开门记录业务对象
+     * @return 受影响记录数
+     */
+    Integer insertOrUpdateByBo(KfDoorOpenHisBo bo);
 }

+ 18 - 13
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfDoorOpenHisServiceImpl.java

@@ -1,26 +1,25 @@
 package org.dromara.hotel.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.ObjectUtil;
-import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.hotel.domain.KfDoorOpenHis;
 import org.dromara.hotel.domain.bo.KfDoorOpenHisBo;
 import org.dromara.hotel.domain.vo.KfDoorOpenHisVo;
-import org.dromara.hotel.domain.KfDoorOpenHis;
 import org.dromara.hotel.mapper.KfDoorOpenHisMapper;
 import org.dromara.hotel.service.IKfDoorOpenHisService;
+import org.springframework.stereotype.Service;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.Collection;
 
 /**
  * 开门记录Service业务层处理
@@ -150,15 +149,21 @@ public class KfDoorOpenHisServiceImpl implements IKfDoorOpenHisService {
         return baseMapper.deleteByIds(ids) > 0;
     }
 
+    /**
+     * 增加或修改开门记录
+     *
+     * @param bo 开门记录业务对象
+     * @return 受影响记录数
+     */
     @Override
-    public Boolean insertOrUpdateByBo(KfDoorOpenHisBo bo) {
+    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())
             .eq(KfDoorOpenHis::getRoomCode, bo.getRoomCode()).eq(KfDoorOpenHis::getOpenTime, bo.getOpenTime())
             .eq(KfDoorOpenHis::getOpenDoorMode, bo.getOpenDoorMode()).eq(KfDoorOpenHis::getOpenResult, bo.getOpenResult()));
         if (CollectionUtil.isEmpty(vos)) {
-            return baseMapper.insert (add)>0;
+            return baseMapper.insert(add);
         }
-        return true;
+        return 0;
     }
 }