소스 검색

fix: 消费服务
1.上传消费记录改为异步处理

luoyb 11 달 전
부모
커밋
538d7cd4dd

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

@@ -61,55 +61,41 @@ public class TermBusiness {
     private final IXfTermService termService;
     private final TokenManager tokenManager;
     private final DefaultConfig defaultConfig;
-
+    // 常量定义(2000-01-01 00:00:00+8 的固定时间戳)
+    private static final long MIN_TIME = LocalDateTime.of(2000, 1, 1, 0, 0, 0)
+        .toInstant(ZoneOffset.of("+8")).toEpochMilli();
+    private static final long TOKEN_EXPIRE_HOURS = 2;
+    private static final long TOKEN_EXPIRE_MS = TOKEN_EXPIRE_HOURS * 3600000;
     public R<TermToken> getTermToken(Long termNo, String admin, String pwd) {
-        // XfTermVo termVo = termService.queryVoOneByNo(termNo);
         RemoteXfTermVo remoteVo = remoteTermService.queryByNo(termNo, defaultConfig.getTenantId());
         if (ObjectUtil.isEmpty(remoteVo)) {
             return R.fail(MessageFormat.format("机号为[{0}]的设备不存在", termNo), null);
         }
-        RemoteUserVo userVo = remoteUserService.selectUserVoByUserName(admin, defaultConfig.getTenantId());
-        if (ObjectUtil.isEmpty(userVo)) {
-            return R.fail(MessageFormat.format("用户为[{0}]的用户不存在", admin), null);
-        }
-        TermToken termToken = null;
-        synchronized (locker) {
-            String strTermNo = String.valueOf(termNo);
-            termToken = tokenManager.getTermToken().get(strTermNo);
-            if (ObjectUtil.isEmpty(termToken)) {
-                LocalDateTime ldt = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
-                Date minDate = Date.from(ldt.toInstant(ZoneOffset.of("+8")));
-
-                LocalDateTime now = LocalDateTime.now();
-                LocalDateTime expireTime = now.plusHours(2);
-                // termToken = new TermToken(strTermNo, UUID.randomUUID().toString(), admin, new Date().getTime(), minDate.getTime(),
-                //     Date.from(expireTime.toInstant(ZoneOffset.of("+8"))).getTime());
+        //RemoteUserVo userVo = remoteUserService.selectUserVoByUserName(admin, defaultConfig.getTenantId());
+        //if (ObjectUtil.isEmpty(userVo)) {
+        //    return R.fail(MessageFormat.format("用户为[{0}]的用户不存在", admin), null);
+        //}
+        final String strTermNo = String.valueOf(termNo);
+        final String roomName = remoteVo.getRoomName();
 
-                termToken = new TermToken(strTermNo, UUID.randomUUID().toString(), admin, new Date().getTime(), minDate.getTime(),
-                                          Date.from(expireTime.toInstant(ZoneOffset.of("+8"))).getTime(), remoteVo.getRoomName());
+        // 使用termNo字符串作为锁对象,减小锁粒度
+        synchronized (strTermNo.intern()) {
+            Map<String, TermToken> tokenMap = tokenManager.getTermToken();
+            TermToken termToken = tokenMap.get(strTermNo);
 
-                tokenManager.getTermToken().put(strTermNo, termToken);
+            if (ObjectUtil.isEmpty(termToken)) {
+                termToken = createNewTermToken(strTermNo, admin, roomName);
+                tokenMap.put(strTermNo, termToken);
             } else {
-                if (termToken.getExpireTime() < new Date().getTime()) {
-                    LocalDateTime ldt = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
-                    Date minDate = Date.from(ldt.toInstant(ZoneOffset.of("+8")));
-
-                    LocalDateTime now = LocalDateTime.now();
-                    LocalDateTime expireTime = now.plusHours(2);
-                    Date expireDate = Date.from(expireTime.toInstant(ZoneOffset.of("+8")));
-
-                    termToken.setAdmin(admin);
-                    termToken.setToken(UUID.randomUUID().toString());
-                    termToken.setDateTime(DateUtil.date().getTime());
-                    termToken.setAuthTime(minDate.getTime());
-                    termToken.setExpireTime(expireDate.getTime());
-                    termToken.setRoomName(remoteVo.getRoomName());
+                long currentTime = System.currentTimeMillis();
+                if (termToken.getExpireTime() < currentTime) {
+                    resetTermToken(termToken, admin, roomName);
                 } else {
                     termToken.setAdmin(admin);
                 }
             }
+            return R.ok(MessageFormat.format("获取token成功,设备编号[{0}],账号[{1}]", termNo, admin), termToken);
         }
-        return R.ok(MessageFormat.format("获取token成功,设备编号[{0}],账号[{1}]", termNo, admin), termToken);
     }
 
     public R<TermToken> getTermTokenNew(Long termNo, String admin, String pwd){
@@ -302,5 +288,29 @@ public class TermBusiness {
         RedisUtils.setCacheObject(cacheName, newToken, Duration.ofHours(4));
         return newToken;
     }
+    // 创建新令牌
+    private TermToken createNewTermToken(String termNo, String admin, String roomName) {
+        long currentTime = System.currentTimeMillis();
+        return new TermToken(
+            termNo,
+            UUID.randomUUID().toString(),
+            admin,
+            currentTime,
+            MIN_TIME,
+            currentTime + TOKEN_EXPIRE_MS,
+            roomName
+        );
+    }
+
+    // 重置过期令牌
+    private void resetTermToken(TermToken token, String admin, String roomName) {
+        long currentTime = System.currentTimeMillis();
+        token.setToken(UUID.randomUUID().toString());
+        token.setAdmin(admin);
+        token.setDateTime(currentTime);
+        token.setAuthTime(MIN_TIME);
+        token.setExpireTime(currentTime + TOKEN_EXPIRE_MS);
+        token.setRoomName(roomName);
+    }
 
 }

+ 2 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/AuthController.java

@@ -35,8 +35,8 @@ public class AuthController {
         if (ObjectUtil.isEmpty(pwd)) {
             pwd = "123456";
         }
-        // R<TermToken> mapResult = termBusiness.getTermToken(termId, admin, pwd);
-        R<TermToken> mapResult = termBusiness.getTermTokenNew(termId, admin, pwd);
+         R<TermToken> mapResult = termBusiness.getTermToken(termId, admin, pwd);
+        //R<TermToken> mapResult = termBusiness.getTermTokenNew(termId, admin, pwd);
 
         if (R.isError(mapResult)) {
             ErrorResult result = new ErrorResult();