Kaynağa Gözat

perf(消费服务): 设备校时与获取token接口实现优化

1.设备校时与获取token的设备信息改成从数据库查询
2.去掉了校时与获取token的并发锁机机制
autumnal_wind 11 ay önce
ebeveyn
işleme
65b30abec7

+ 46 - 35
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/TermBusiness.java

@@ -1,20 +1,14 @@
 package org.dromara.server.consume.business;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.dromara.backstage.api.domain.vo.RemoteCardVo;
 import org.dromara.common.core.config.DefaultConfig;
-import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.enums.SystemUseTypeEnum;
-import org.dromara.common.json.utils.JsonUtils;
-import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.server.common.constant.ConsumeConstants;
-import org.dromara.server.consume.cache.CardCacheManager;
 import org.dromara.server.consume.cache.TokenManager;
 import org.dromara.server.consume.domain.vo.XfTermVo;
 import org.dromara.server.consume.domain.vo.yc.RoomInfo;
@@ -78,32 +72,47 @@ public class TermBusiness {
      *         如果操作成功,则 TermToken 将包含在返回值中;如果失败,则可能包含错误信息。
      */
     public R<TermToken> getTermToken(Long termNo, String admin, String pwd) {
-        R<TermInfo> result = this.getTermInfoByTermNo(termNo);
-        if(R.isError(result)) {
-            return R.fail(result.getMsg());
-        }
-        TermInfo termInfo = result.getData();
+        // R<TermInfo> result = this.getTermInfoByTermNo(termNo);
+        // if(R.isError(result)) {
+        //     return R.fail(result.getMsg());
+        // }
+        // TermInfo termInfo = result.getData();
         final String strTermNo = String.valueOf(termNo);
-        final String roomName = termInfo == null ? "未知房间" : termInfo.getRoomName();
-
+        // final String roomName = termInfo == null ? "未知房间" : termInfo.getRoomName();
+        String roomName = termService.queryRoomNameByNo(termNo);
         // 使用termNo字符串作为锁对象,减小锁粒度
-        synchronized (strTermNo.intern()) {
-            Map<String, TermToken> tokenMap = tokenManager.getTermToken();
-            TermToken termToken = tokenMap.get(strTermNo);
+        // synchronized (strTermNo.intern()) {
+        //     Map<String, TermToken> tokenMap = tokenManager.getTermToken();
+        //     TermToken termToken = tokenMap.get(strTermNo);
+        //
+        //     if (ObjectUtil.isEmpty(termToken)) {
+        //         termToken = createNewTermToken(strTermNo, admin, roomName);
+        //         tokenMap.put(strTermNo, termToken);
+        //     } else {
+        //         long currentTime = System.currentTimeMillis();
+        //         if (termToken.getExpireTime() < currentTime) {
+        //             resetTermToken(termToken, admin, roomName);
+        //         } else {
+        //             termToken.setAdmin(admin);
+        //         }
+        //     }
+        //     return R.ok(termToken);
+        // }
+        Map<String, TermToken> tokenMap = tokenManager.getTermToken();
+        TermToken termToken = tokenMap.get(strTermNo);
 
-            if (ObjectUtil.isEmpty(termToken)) {
-                termToken = createNewTermToken(strTermNo, admin, roomName);
-                tokenMap.put(strTermNo, termToken);
+        if (ObjectUtil.isEmpty(termToken)) {
+            termToken = createNewTermToken(strTermNo, admin, roomName);
+            tokenMap.put(strTermNo, termToken);
+        } else {
+            long currentTime = System.currentTimeMillis();
+            if (termToken.getExpireTime() < currentTime) {
+                resetTermToken(termToken, admin, roomName);
             } else {
-                long currentTime = System.currentTimeMillis();
-                if (termToken.getExpireTime() < currentTime) {
-                    resetTermToken(termToken, admin, roomName);
-                } else {
-                    termToken.setAdmin(admin);
-                }
+                termToken.setAdmin(admin);
             }
-            return R.ok(termToken);
         }
+        return R.ok(termToken);
     }
 
     /**
@@ -123,14 +132,16 @@ public class TermBusiness {
         final long lTermNo = termNo.longValue();
 
         // 2. 带缓存的终端信息获取
-        long startTime = System.currentTimeMillis();
-        R<TermInfo> result = this.getTermInfoByTermNo(lTermNo);
-        if(R.isError(result)) {
-            return R.fail(result.getMsg());
-        }
-        TermInfo termInfo = result.getData();
-        log.info("[设备校时]-[获取设备:{}]-[耗时: {} ms]",termNo,System.currentTimeMillis()-startTime);
+        // long startTime = System.currentTimeMillis();
+        // R<TermInfo> result = this.getTermInfoByTermNo(lTermNo);
+        // if(R.isError(result)) {
+        //     return R.fail(result.getMsg());
+        // }
+        // TermInfo termInfo = result.getData();
+        // log.info("[设备校时]-[获取设备:{}]-[耗时: {} ms]",termNo,System.currentTimeMillis()-startTime);
         // 3. 原子化时间检查与更新
+        String termName = termService.queryNameByNo(lTermNo);
+
         final long currentTime = System.currentTimeMillis();
 
         final Long lastCheck = lastCheckModify.get(termNo);
@@ -144,12 +155,12 @@ public class TermBusiness {
             //                                        oldVal
             //);
         }
-        log.info("最后校时情况,设备:{},时间:{}", termNo, lastCheckModify.get(termNo));
+        // log.info("最后校时情况,设备:{},时间:{}", termNo, lastCheckModify.get(termNo));
         // 4. 构建响应数据
         Map<String, Object> resultMap = new HashMap<>(4);
         resultMap.put("time", DateUtil.format(new Date(currentTime), DefaultConstants.DATE_TIME_FORMAT));
         resultMap.put("type", "");
-        resultMap.put("data", termInfo != null ? termInfo.getTermName() : "未知设备");
+        resultMap.put("data", ObjectUtil.isNotEmpty(termName) ? termName : "未知设备");
 
         return R.ok(resultMap);
     }

+ 4 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfTermService.java

@@ -43,4 +43,8 @@ public interface IXfTermService {
     XfTermVo queryVoOneByNo(Long termNo);
 
     XfTermVo queryVoOneByMac(String mac);
+
+    String queryNameByNo(Long termNo);
+
+    String queryRoomNameByNo(Long termNo);
 }

+ 28 - 5
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/XfTermServiceImpl.java

@@ -70,14 +70,14 @@ public class XfTermServiceImpl implements IXfTermService {
         list.forEach(p -> {
             //设置结算账户名称
             String accountName = accountVoList.parallelStream()
-                                     .filter(k -> k.getAccountId().equals(p.getAccountId()))
-                                     .findFirst().map(RemotePtAccountVo::getAccountName).orElse("未知结算账户");
+                .filter(k -> k.getAccountId().equals(p.getAccountId()))
+                .findFirst().map(RemotePtAccountVo::getAccountName).orElse("未知结算账户");
             p.setAccountName(accountName);
 
             //设置设备所在房间名称
             String roomName = roomVoList.parallelStream()
-                                     .filter(k -> k.getRoomId().equals(p.getRoomId()))
-                                     .findFirst().map(RemotePtRoomVo::getRoomName).orElse("未知房间");
+                .filter(k -> k.getRoomId().equals(p.getRoomId()))
+                .findFirst().map(RemotePtRoomVo::getRoomName).orElse("未知房间");
             p.setRoomName(roomName);
         });
         return list;
@@ -97,7 +97,7 @@ public class XfTermServiceImpl implements IXfTermService {
             RemotePtAccountVo accountVo = remotePtAccountService.selectVoById(vo.getAccountId());
             if (ObjUtil.isNotEmpty(accountVo)) {
                 vo.setAccountName(accountVo.getAccountName());
-            } else{
+            } else {
                 vo.setAccountName("未知结算账户");
             }
             RemotePtRoomVo roomVo = remotePtRoomService.selectVoById(vo.getRoomId());
@@ -134,6 +134,29 @@ public class XfTermServiceImpl implements IXfTermService {
         return queryVoOneByBo(bo);
     }
 
+    @Override
+    public String queryNameByNo(Long termNo) {
+        if (termNo == null || termNo == 0L) {
+            return "";
+        }
+        XfTerm entity = baseMapper.selectOne(new LambdaQueryWrapper<XfTerm>().select(XfTerm::getTermName).eq(XfTerm::getTermNo, termNo));
+        if (entity == null) {
+            return "";
+        }
+        return entity.getTermName();
+    }
+
+    @Override
+    public String queryRoomNameByNo(Long termNo) {
+        XfTermBo bo = new XfTermBo();
+        bo.setTermNo(termNo);
+        XfTermVo vo = queryVoOneByBo(bo);
+        if (vo != null) {
+            return vo.getRoomName();
+        }
+        return "未知房间";
+    }
+
     /**
      * 组装查询条件
      *