Ver Fonte

refactor(national-motion-module-system): 优化多个服务实现类中的逻辑

- 重构 DetailServiceImpl 中的 runStatus 设置逻辑,提高可读性和维护性
- 优化 ESignServiceImpl 中 signerRole 的获取方式,增强健壮性
- 实现 HikiotTool 中的 token 缓存机制,提高性能和减少不必要的请求
- 修正 OrderServiceImpl 中的订单相关逻辑,确保数据准确性和流程正确性
SheepHy há 3 semanas atrás
pai
commit
fb882b3c6a

+ 11 - 9
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/DetailServiceImpl.java

@@ -110,15 +110,17 @@ public class DetailServiceImpl implements IDetailService {
             }
         }
         placeInfo.setInstructorVOList(instructorVOList);
-        placeInfo.setRunStatus((appSite.getRunStatus() == 0) && (
-                (appSite.getRunType() == 0) ||
-                        (appSite.getRunType() == 1 &&
-                                appSite.getStartTime() != null &&
-                                appSite.getEndTime() != null &&
-                                new Date().after(appSite.getStartTime()) &&
-                                new Date().before(appSite.getEndTime()))
-        ));
-
+        placeInfo.setRunStatus(false);
+        if(appSite.getRunStatus() == 0 && appSite.getRunType() == 0){
+            placeInfo.setRunStatus(true);
+        }else if(appSite.getRunStatus() == 0){
+            if(appSite.getStartTime() != null &&
+                    appSite.getEndTime() != null &&
+                    new Date().after(appSite.getStartTime()) &&
+                    new Date().before(appSite.getEndTime())){
+                placeInfo.setRunStatus(true);
+            }
+        }
         if(appSite.getType() == 0){
             List<PlaceInfoVO.PlaceInfoMsgVO> placeInfoMsgVOS = new ArrayList<>();
             appSitePlaceMapper.selectList(Wrappers.<AppSitePlace>lambdaQuery().eq(AppSitePlace::getSiteId, id)

+ 9 - 3
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/ESignServiceImpl.java

@@ -274,9 +274,15 @@ public class ESignServiceImpl implements IESignService {
 
         for (JsonElement element : components) {
             JsonObject component = element.getAsJsonObject();
-            String role = component
-                    .getAsJsonObject("componentSpecialAttribute")
-                    .get("signerRole").getAsString();
+            JsonObject componentSpecialAttribute = component
+                    .getAsJsonObject("componentSpecialAttribute");
+            String role = null;
+            if (componentSpecialAttribute.has("signerRole")) {
+                JsonElement roleElement = componentSpecialAttribute.get("signerRole");
+                if (!roleElement.isJsonNull()) {
+                    role = roleElement.getAsString();
+                }
+            }
 
             JsonObject position = component
                     .getAsJsonObject("componentPosition");

+ 5 - 2
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/OrderServiceImpl.java

@@ -781,7 +781,7 @@ public class OrderServiceImpl implements IOrderService {
                 AppCourses appCourse = appCoursesMapper.selectById(appOrder.getProductIds());
                 List<AppCoursesPriceRules> priceRulesList = appCoursesPriceRulesMapper.selectList(Wrappers.<AppCoursesPriceRules>lambdaQuery().eq(AppCoursesPriceRules::getCoursesId, appCourse.getId()));
                 AppSite appSite = appSiteMapper.selectById(appCourse.getAddressSiteId());
-
+                appOrder.setOrderOrFree(appCourse.getPriceType());
                 appOrder.setType(CommonConstant.ORDER_TYPE_2);
                 appOrder.setOrgCode(appCourse.getOrgCode());
                 appOrder.setTenantId(appCourse.getTenantId());
@@ -917,7 +917,7 @@ public class OrderServiceImpl implements IOrderService {
         }
         appOrder.setPrice(totalPrice);
         appOrderMapper.insert(appOrder);
-        if(appOrder.getType()== 5 && appOrder.getOrderOrFree()==0){
+        if(appOrder.getOrderType()== 5 && appOrder.getOrderOrFree()==0){
             saveSignFlowRecord(appOrder);
         }
         if (!insureOrderInfoList.isEmpty()) {
@@ -1181,6 +1181,9 @@ public class OrderServiceImpl implements IOrderService {
         AppOrderInfoDTO appOrderInfoDTO = new AppOrderInfoDTO();
 
         AppOrder appOrder = appOrderMapper.selectById(orderId);
+        if (ObjectUtil.isEmpty(appOrder)) {
+           throw new JeecgBootException("当前订单不存在!");
+        }
         appOrderInfoDTO.setId(appOrder.getId());
         appOrderInfoDTO.setOrderCode(appOrder.getOrderCode());
         appOrderInfoDTO.setOrderStatus(appOrder.getOrderStatus());

+ 53 - 31
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/hikiot/HikiotTool.java

@@ -24,6 +24,11 @@ import static com.alibaba.dashscope.utils.JsonUtils.gson;
 import static org.jeecg.modules.hikiot.HikiotConstant.*;
 
 public class HikiotTool {
+
+    private static String cachedAppAccessToken = null;
+    private static long expirationTime = 0L;
+    private static String cachedUserAccessToken = null;
+    private static long userTokenExpirationTime = 0L;
     private static final HttpClient httpClient = HttpClient.newBuilder()
             .version(HttpClient.Version.HTTP_2)
             .build();
@@ -71,20 +76,12 @@ public class HikiotTool {
      * @return 响应结果
      */
     public static String sendGetRequest(String url, Map<String, String> headers){
-        // 获取访问凭证
-        JsonObject appAccessToken = JsonParser.parseString(HikiotTool.getAppAccessToken()).getAsJsonObject();
-        if (appAccessToken.get("code").getAsInt() == 0) {
-            appAccessToken = appAccessToken.getAsJsonObject("data");
-        } else {
-            throw new JeecgBootException("海康API appAccessToken请求失败: " + appAccessToken.get("msg").getAsString());
-        }
-
         // 构建请求基础配置
         HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
                 .uri(URI.create(url))
                 .GET()
                 .header("Content-Type", "application/json")
-                .header(APP_ACCESS_TOKEN_AUTH_HEADER, appAccessToken.get("appAccessToken").getAsString());
+                .header(APP_ACCESS_TOKEN_AUTH_HEADER, getAppAccessToken());
 
         // 添加动态header
         if (headers != null) {
@@ -104,14 +101,30 @@ public class HikiotTool {
 
     /**
      * @Author SheepHy
-     * @Description 获取应用访问凭证
+     * @Description 获取应用访问凭证(带缓存)
      * @Date 16:05 2025/8/12
      **/
-    public static String getAppAccessToken() {
+    public static synchronized String getAppAccessToken() {
+        // 检查缓存是否有效
+        if (cachedAppAccessToken != null && System.currentTimeMillis() < expirationTime) {
+            return cachedAppAccessToken;
+        }
+        // 缓存失效或不存在,重新获取
         Map<String, String> map = new HashMap<>();
         map.put(APP_KEY, APP_KEY_VALUE);
         map.put(APP_SECRET, APP_SECRET_VALUE);
-        return HikiotTool.sendPostRequest(GET_ACCESS_TOKEN_URL, gson.toJson(map), null);
+        JsonObject appAccessToken = JsonParser.parseString(HikiotTool.sendPostRequest(GET_ACCESS_TOKEN_URL, gson.toJson(map), null)).getAsJsonObject();
+        if (appAccessToken.get("code").getAsInt() == 0) {
+            JsonObject data = appAccessToken.getAsJsonObject("data");
+            int expiresIn = data.get("expiresIn").getAsInt();
+            String token = data.get("appAccessToken").getAsString();
+            // 更新缓存和过期时间(单位:小时转毫秒)
+            cachedAppAccessToken = token;
+            expirationTime = System.currentTimeMillis() + (expiresIn * 60L * 60L * 1000L);
+            return token;
+        } else {
+            throw new JeecgBootException("海康API appAccessToken请求失败: " + appAccessToken.get("msg").getAsString());
+        }
     }
 
     /**
@@ -144,19 +157,36 @@ public class HikiotTool {
 
     /**
      * @Author SheepHy
-     * @Description 授权码获取用户访问凭证
+     * @Description 授权码获取用户访问凭证(带缓存)
      * @Date 11:36 2025/8/14
-     * @Param
-     * @return
-     **/
-    public static String getUserAccessToken() {
+     */
+    public static synchronized String getUserAccessToken() {
+        // 检查缓存是否有效
+        if (cachedUserAccessToken != null && System.currentTimeMillis() < userTokenExpirationTime) {
+            return cachedUserAccessToken;
+        }
+        // 缓存失效或不存在,重新获取
         JsonObject dataAuthCode = JsonParser.parseString(HikiotTool.getAuthCode()).getAsJsonObject();
-        if (dataAuthCode.get("code").getAsInt() == 0) {
-            dataAuthCode = dataAuthCode.getAsJsonObject("data");
-        } else {
+        if (dataAuthCode.get("code").getAsInt() != 0) {
             throw new JeecgBootException("海康API authCode请求失败: " + dataAuthCode.get("msg").getAsString());
         }
-        return sendGetRequest(GET_USER_ACCESS_TOKEN_URL + dataAuthCode.get("authCode").getAsString(), null);
+        String authCode = dataAuthCode.getAsJsonObject("data").get("authCode").getAsString();
+        JsonObject userAccessToken = JsonParser.parseString(sendGetRequest(GET_USER_ACCESS_TOKEN_URL + authCode, null)).getAsJsonObject();
+        if (userAccessToken.get("code").getAsInt() != 0) {
+            throw new JeecgBootException("海康API userAccessToken请求失败: " + userAccessToken.get("msg").getAsString());
+        }
+        JsonObject data = userAccessToken.getAsJsonObject("data");
+        String expiresInStr = data.get("expiresIn").getAsString();
+        try {
+            int expiresInDays = Integer.parseInt(expiresInStr);
+            String token = data.get("userAccessToken").getAsString();
+            // 更新缓存和过期时间(单位:天转毫秒)
+            cachedUserAccessToken = token;
+            userTokenExpirationTime = System.currentTimeMillis() + (expiresInDays * 24L * 60L * 60L * 1000L);
+            return token;
+        } catch (NumberFormatException e) {
+            throw new JeecgBootException("海康API expiresIn字段解析失败: " + expiresInStr, e);
+        }
     }
 
     /** 
@@ -212,16 +242,8 @@ public class HikiotTool {
      **/
     private static Map<String, String> setHeaders() {
         Map<String, String> variables = new HashMap<>();
-        JsonObject appAccessToken = JsonParser.parseString(HikiotTool.getAppAccessToken()).getAsJsonObject();
-        JsonObject userAccessToken = JsonParser.parseString(HikiotTool.getUserAccessToken()).getAsJsonObject();
-        if (appAccessToken.get("code").getAsInt() == 0) {
-            appAccessToken = appAccessToken.getAsJsonObject("data");
-        }
-        if (userAccessToken.get("code").getAsInt() == 0) {
-            userAccessToken = userAccessToken.getAsJsonObject("data");
-        }
-        variables.put(APP_ACCESS_TOKEN_AUTH_HEADER, appAccessToken.get("appAccessToken").getAsString());
-        variables.put(USER_ACCESS_TOKEN, userAccessToken.get("userAccessToken").getAsString());
+        variables.put(APP_ACCESS_TOKEN_AUTH_HEADER, getAppAccessToken());
+        variables.put(USER_ACCESS_TOKEN, getUserAccessToken());
         return variables;
     }