Przeglądaj źródła

场景上传任务-异步调用

WXF 3 lat temu
rodzic
commit
ac0c9b829e

+ 26 - 18
simulation-resource-scene/src/main/java/com/css/simulation/resource/scene/SceneImportCtrl.java

@@ -4,15 +4,16 @@ import api.common.pojo.common.ResponseBodyVO;
 import api.common.pojo.constants.DictConstants;
 import api.common.pojo.param.scene.SceneImportParam;
 import api.common.pojo.po.system.SceneImportPO;
+import com.css.simulation.resource.scene.common.oauth.AuthorizationHolder;
 import com.css.simulation.resource.scene.feign.SceneService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.context.request.RequestContextHolder;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 
 @Controller
 @RequestMapping("/sceneImport")
@@ -29,31 +30,22 @@ public class SceneImportCtrl {
      */
     @RequestMapping("/startImport")
     @ResponseBody
-    public ResponseBodyVO startImport(@RequestBody SceneImportPO po) {
+    public ResponseBodyVO startImport(@RequestBody SceneImportPO po, HttpServletRequest request) {
         try {
             //开始上传
             po.setStatus(DictConstants.SCENE_IMPORT_STATUS_1);
             sceneImportService.updateStatus(po);
             //上传
-            sceneImportService.startImport(po);
+            Boolean b = sceneImportService.startImport(po);
+            if(!b){
+                po.setStatus(DictConstants.SCENE_IMPORT_STATUS_0);
+                po.setErrorMessage("路径错误");
+                sceneImportService.updateStatus(po);
+                return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE);
+            }
             //上传成功
             po.setStatus(DictConstants.SCENE_IMPORT_STATUS_2);
             sceneImportService.updateStatus(po);
-            SceneImportParam param = new SceneImportParam();
-            param.setId(po.getId());
-            param.setMinioDirectory(po.getDataDirectory());
-            //异步-启动解析
-            RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(),true);
-            switch (po.getSceneType()){
-                case DictConstants.SCENE_NATURAL://自然驾驶
-                    sceneService.saveSceneAccidentBatch(param);
-                    break;
-                case DictConstants.SCENE_STANDARD:// 标准法规
-                    sceneService.saveSceneAccidentBatch(param);
-                    break;
-                case DictConstants.SCENE_ACCIDENT:// 交通事故
-                    sceneService.saveSceneAccidentBatch(param);
-            }
         }catch (Exception e){
             e.printStackTrace();
             po.setStatus(DictConstants.SCENE_IMPORT_STATUS_0);
@@ -61,6 +53,22 @@ public class SceneImportCtrl {
             sceneImportService.updateStatus(po);
             return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE);
         }
+        //异步-启动解析
+        SceneImportParam param = new SceneImportParam();
+        param.setId(po.getId());
+        param.setMinioDirectory(po.getDataDirectory());
+        String authorization = request.getHeader("Authorization");
+        AuthorizationHolder.setAuthorization(authorization);
+        switch (po.getSceneType()){
+            case DictConstants.SCENE_NATURAL://自然驾驶
+                sceneService.saveSceneNaturalBatch(param);
+                break;
+            case DictConstants.SCENE_STANDARD:// 标准法规
+                sceneService.saveStandardsRegulationsBatch(param);
+                break;
+            case DictConstants.SCENE_ACCIDENT:// 交通事故
+                sceneService.saveSceneAccidentBatch(param);
+        }
         return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
     }
 }

+ 66 - 3
simulation-resource-scene/src/main/java/com/css/simulation/resource/scene/SceneImportService.java

@@ -1,22 +1,85 @@
 package com.css.simulation.resource.scene;
 
+import api.common.pojo.constants.DictConstants;
 import api.common.pojo.po.system.SceneImportPO;
+import api.common.util.FileUtil;
+import api.common.util.ObjectUtil;
+import api.common.util.StringUtil;
+import api.common.util.TimeUtil;
 import com.css.simulation.resource.scene.common.utils.PoUtil;
+import io.minio.MinioClient;
+import io.minio.UploadObjectArgs;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.Date;
+import java.util.List;
+
 @Service
 public class SceneImportService {
 
+    //场景目录中必须包含的子文件夹
+    @Value("${scene.sub-directory}")
+    String subDirectory = "Scenarios";
+
+    //minio仓库名
+    @Value("${minio.bucket-name}")
+    String bucketName;
+
     @Autowired
     SceneImportMapper sceneImportMapper;
 
-    public Boolean startImport(SceneImportPO po) {
-        //TODO
-        System.out.println(123);
+    @Resource(name = "minioClientPrivate")
+    MinioClient minioClient;
+
+    public Boolean startImport(SceneImportPO po) throws Exception {
+        //目录校验
+        if(!checkDirectory(po)){
+            return false;
+        }
+        //minio路径生成
+        String sceneType = po.getSceneType();
+        Integer nowTime = TimeUtil.getRq(new Date(), 0);
+        String randomCode = StringUtil.getRandomCode();
+        String sceneName = "";
+        if (DictConstants.SCENE_NATURAL.equals(sceneType)) {
+            sceneName = "自然驾驶场景";
+        } else if (DictConstants.SCENE_STANDARD.equals(sceneType)) {
+            sceneName = "标准法规场景";
+        } else if (DictConstants.SCENE_ACCIDENT.equals(sceneType)) {
+            sceneName = "交通事故场景";
+        }
+        String objectPath = sceneName + "/" + nowTime + "/" + randomCode + "/";
+        //数据上传
+        String dataDirectory = po.getDataDirectory();
+        List<String> list = FileUtil.list(dataDirectory);
+        for (String fileName: list) {
+            //minio路径完善
+            String objectName = fileName.replace(dataDirectory, objectPath).replaceAll("\\\\", "/");
+            minioClient.uploadObject(UploadObjectArgs.builder()
+                    .filename(fileName)
+                    .bucket(bucketName)
+                    .object(objectName)
+                    .build());
+        }
+        po.setDataDirectory(objectPath);
         return true;
     }
 
+    private Boolean checkDirectory(SceneImportPO po) {
+        try {
+            String dataDirectory = po.getDataDirectory() + File.separator + subDirectory;
+            List<String> ls = FileUtil.ls(dataDirectory);
+            return ObjectUtil.isNotNull(ls);
+        }catch (Exception e){
+            e.printStackTrace();
+            return false;
+        }
+    }
+
     public void updateStatus(SceneImportPO po) {
         PoUtil.initUpdatePo(po);
         sceneImportMapper.updateStatus(po);

+ 11 - 2
simulation-resource-scene/src/main/java/com/css/simulation/resource/scene/common/config/FeignConfiguration.java

@@ -1,5 +1,7 @@
 package com.css.simulation.resource.scene.common.config;
 
+import api.common.util.ObjectUtil;
+import com.css.simulation.resource.scene.common.oauth.AuthorizationHolder;
 import feign.Logger;
 import feign.RequestInterceptor;
 import feign.RequestTemplate;
@@ -24,7 +26,14 @@ public class FeignConfiguration implements RequestInterceptor {
     @Override
     public void apply(RequestTemplate requestTemplate) {
         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-        HttpServletRequest request = attributes.getRequest();
-        requestTemplate.header("Authorization", request.getHeader("Authorization"));
+        String authorization = "";
+        if(ObjectUtil.isNull(attributes)){
+            authorization = AuthorizationHolder.getAuthorization();
+            AuthorizationHolder.remove();
+        }else{
+            HttpServletRequest request = attributes.getRequest();
+            authorization = request.getHeader("Authorization");
+        }
+        requestTemplate.header("Authorization", authorization);
     }
 }

+ 37 - 0
simulation-resource-scene/src/main/java/com/css/simulation/resource/scene/common/minio/MinioConfiguration.java

@@ -0,0 +1,37 @@
+package com.css.simulation.resource.scene.common.minio;
+
+import io.minio.MinioClient;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "minio")
+public class MinioConfiguration {
+
+    private String endpointPrivate;
+    private String endpointPublic;
+    private String accessKey;
+    private String secretKey;
+
+    @Bean
+    public MinioClient minioClientPrivate() {
+        MinioClient minioClient = MinioClient.builder()
+                .endpoint(endpointPrivate)
+                .credentials(accessKey, secretKey)
+                .build();
+        return minioClient;
+    }
+
+    @Bean
+    public MinioClient minioClientPublic() {
+        MinioClient minioClient = MinioClient.builder()
+                .endpoint(endpointPublic)
+                .credentials(accessKey, secretKey)
+                .build();
+        return minioClient;
+    }
+
+}

+ 21 - 0
simulation-resource-scene/src/main/java/com/css/simulation/resource/scene/common/oauth/AuthorizationHolder.java

@@ -0,0 +1,21 @@
+package com.css.simulation.resource.scene.common.oauth;
+
+import org.springframework.core.NamedInheritableThreadLocal;
+
+public class AuthorizationHolder {
+
+    private static final ThreadLocal<String> inheritableRequestAttributesHolder = new NamedInheritableThreadLocal("Authorization");
+
+    public static void setAuthorization(String authorization){
+        inheritableRequestAttributesHolder.set(authorization);
+    }
+
+    public static String getAuthorization(){
+        return inheritableRequestAttributesHolder.get();
+    }
+
+    public static void remove(){
+        inheritableRequestAttributesHolder.remove();
+    }
+
+}

+ 15 - 1
simulation-resource-scene/src/main/java/com/css/simulation/resource/scene/feign/SceneService.java

@@ -4,15 +4,29 @@ import api.common.pojo.common.ResponseBodyVO;
 import api.common.pojo.param.scene.SceneImportParam;
 import com.css.simulation.resource.scene.common.config.FeignConfiguration;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.bind.annotation.PostMapping;
 
-@FeignClient(value = "simulation-resource-server",
+@FeignClient(
+        //name = "SceneService",
+        //url = "http://127.0.0.1:7003",
         contextId = "SceneService",
+        value = "simulation-resource-server",
         path = "/simulation/resource/server",
         fallback = SceneServiceFallback.class,
         configuration = FeignConfiguration.class)
 public interface SceneService {
 
+    //交通事故
+    @Async
     @PostMapping("/SceneAccident/saveSceneAccidentBatch")
     ResponseBodyVO saveSceneAccidentBatch(SceneImportParam sceneImportParam);
+    //自然场景
+    @Async
+    @PostMapping("/SceneNatural/saveSceneNaturalBatch")
+    ResponseBodyVO saveSceneNaturalBatch(SceneImportParam sceneImportParam);
+    //标准法规
+    @Async
+    @PostMapping("/StandardsRegulations/saveStandardsRegulationsBatch")
+    ResponseBodyVO saveStandardsRegulationsBatch(SceneImportParam sceneImportParam);
 }

+ 10 - 0
simulation-resource-scene/src/main/java/com/css/simulation/resource/scene/feign/SceneServiceFallback.java

@@ -9,4 +9,14 @@ public class SceneServiceFallback implements SceneService {
     public ResponseBodyVO saveSceneAccidentBatch(SceneImportParam sceneImportParam) {
         return new ResponseBodyVO<>(ResponseBodyVO.Response.SERVER_FAILURE);
     }
+
+    @Override
+    public ResponseBodyVO saveSceneNaturalBatch(SceneImportParam sceneImportParam) {
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SERVER_FAILURE);
+    }
+
+    @Override
+    public ResponseBodyVO saveStandardsRegulationsBatch(SceneImportParam sceneImportParam) {
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SERVER_FAILURE);
+    }
 }

+ 11 - 2
simulation-resource-server/src/main/java/com/css/simulation/resource/common/config/FeignConfiguration.java

@@ -1,5 +1,7 @@
 package com.css.simulation.resource.common.config;
 
+import api.common.util.ObjectUtil;
+import com.css.simulation.resource.common.oauth.AuthorizationHolder;
 import feign.Logger;
 import feign.RequestInterceptor;
 import feign.RequestTemplate;
@@ -24,7 +26,14 @@ public class FeignConfiguration implements RequestInterceptor {
     @Override
     public void apply(RequestTemplate requestTemplate) {
         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-        HttpServletRequest request = attributes.getRequest();
-        requestTemplate.header("Authorization", request.getHeader("Authorization"));
+        String authorization = "";
+        if(ObjectUtil.isNull(attributes)){
+            authorization = AuthorizationHolder.getAuthorization();
+            AuthorizationHolder.remove();
+        }else{
+            HttpServletRequest request = attributes.getRequest();
+            authorization = request.getHeader("Authorization");
+        }
+        requestTemplate.header("Authorization", authorization);
     }
 }

+ 21 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/common/oauth/AuthorizationHolder.java

@@ -0,0 +1,21 @@
+package com.css.simulation.resource.common.oauth;
+
+import org.springframework.core.NamedInheritableThreadLocal;
+
+public class AuthorizationHolder {
+
+    private static final ThreadLocal<String> inheritableRequestAttributesHolder = new NamedInheritableThreadLocal("Authorization");
+
+    public static void setAuthorization(String authorization){
+        inheritableRequestAttributesHolder.set(authorization);
+    }
+
+    public static String getAuthorization(){
+        return inheritableRequestAttributesHolder.get();
+    }
+
+    public static void remove(){
+        inheritableRequestAttributesHolder.remove();
+    }
+
+}

+ 4 - 1
simulation-resource-server/src/main/java/com/css/simulation/resource/feign/SceneService.java

@@ -10,8 +10,11 @@ import org.springframework.web.bind.annotation.PostMapping;
 
 
 
-@FeignClient(value = "simulation-resource-scene",
+@FeignClient(
+        //name = "scene",
+        //url = "http://127.0.0.1:7005",
         contextId = "scene",
+        value = "simulation-resource-scene",
         path = "/simulation/resource/scene",
         fallback = SceneServiceFallback.class,
         configuration = FeignConfiguration.class)

+ 7 - 2
simulation-resource-server/src/main/java/com/css/simulation/resource/system/ctrl/SceneImportCtrl.java

@@ -5,6 +5,7 @@ import api.common.pojo.constants.DictConstants;
 import api.common.pojo.param.system.SceneImportPageParam;
 import api.common.pojo.po.system.SceneImportPO;
 import api.common.util.ObjectUtil;
+import com.css.simulation.resource.common.oauth.AuthorizationHolder;
 import com.css.simulation.resource.feign.SceneService;
 import com.css.simulation.resource.system.service.SceneImportService;
 import com.github.pagehelper.PageInfo;
@@ -13,9 +14,12 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 
 @Controller
 @RequestMapping("/sceneImport")
@@ -32,7 +36,7 @@ public class SceneImportCtrl {
      */
     @RequestMapping("/saveTask")
     @ResponseBody
-    public ResponseBodyVO saveTask(@RequestBody SceneImportPO po) {
+    public ResponseBodyVO saveTask(@RequestBody SceneImportPO po, HttpServletRequest request) {
         if(ObjectUtil.isNull(po)){
             return new ResponseBodyVO(false, 500, "参数错误!",null);
         }
@@ -47,7 +51,8 @@ public class SceneImportCtrl {
         ResponseBodyVO<SceneImportPO> response = new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
         response.setInfo(po);
         //异步-启动上传
-        RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(),true);
+        String authorization = request.getHeader("Authorization");
+        AuthorizationHolder.setAuthorization(authorization);
         sceneService.startImport(po);
         return response;
     }

+ 2 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/system/service/UserService.java

@@ -80,6 +80,8 @@ public class UserService {
             userPO.setRoleCode(DictConstants.ROLE_CODE_UESR);
         }else if(DictConstants.ROLE_CODE_UESR.equals(currentUserRoleCode)){//普通用户
             userPO.setRoleCode(DictConstants.ROLE_CODE_SUBUESR);
+            //普通用户创建子账户时,占用类型继承
+            userPO.setUseType(AuthUtil.getCurrentUseType());
         }else{
             return null;
         }