فهرست منبع

Merge remote-tracking branch 'origin/master'

martin 3 سال پیش
والد
کامیت
256a0ea07e

+ 10 - 0
api-common/src/main/java/api/common/pojo/param/project/SimulationManualProjectParam.java

@@ -106,4 +106,14 @@ public class SimulationManualProjectParam extends PageVO {
     private String runResultFilePath;
 
 
+    //是否生成本地pdf文件
+    private Boolean isCreateLocalPdfFile;
+
+    //本地pdf文件路径
+    private String LocalPdfFilePath;
+
+    //是否打包报告pdf
+    private Boolean isPagePdf;
+
+
 }

+ 3 - 0
api-common/src/main/java/api/common/pojo/vo/project/ManualProjectTaskVo.java

@@ -58,5 +58,8 @@ public class ManualProjectTaskVo {
     //返回的场景id
     private String returnSceneId;
 
+    //运行结果文件minio路径
+    private String runResultFilePath;
+
 
 }

+ 5 - 2
simulation-resource-common/src/main/java/com/css/simulation/resource/common/configuration/minio/MinioConfiguration.java

@@ -10,15 +10,18 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 @ConfigurationProperties(prefix = "minio")
 public class MinioConfiguration {
+
     private String endpoint;
     private String accessKey;
     private String secretKey;
 
     @Bean
-    public MinioClient minioClient() {
-        return MinioClient.builder()
+    public SubMinioClient minioClient() {
+        MinioClient minioClient = MinioClient.builder()
                 .endpoint(endpoint)
                 .credentials(accessKey, secretKey)
                 .build();
+        return new SubMinioClient(minioClient);
     }
+
 }

+ 37 - 0
simulation-resource-common/src/main/java/com/css/simulation/resource/common/configuration/minio/SubMinioClient.java

@@ -0,0 +1,37 @@
+package com.css.simulation.resource.common.configuration.minio;
+
+import com.google.common.collect.Multimap;
+import io.minio.CreateMultipartUploadResponse;
+import io.minio.ListPartsResponse;
+import io.minio.MinioClient;
+import io.minio.ObjectWriteResponse;
+import io.minio.errors.*;
+import io.minio.messages.Part;
+
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+
+public class SubMinioClient extends MinioClient {
+
+    protected SubMinioClient(MinioClient client) {
+        super(client);
+    }
+
+    @Override
+    public CreateMultipartUploadResponse createMultipartUpload(String bucketName, String region, String objectName, Multimap<String, String> headers, Multimap<String, String> extraQueryParams) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InsufficientDataException, ServerException, InternalException, XmlParserException, InvalidResponseException, ErrorResponseException {
+        return super.createMultipartUpload(bucketName,region,objectName,headers,extraQueryParams);
+    }
+
+    @Override
+    public ObjectWriteResponse completeMultipartUpload(String bucketName, String region, String objectName, String uploadId, Part[] parts, Multimap<String, String> extraHeaders, Multimap<String, String> extraQueryParams) throws NoSuchAlgorithmException, InsufficientDataException, IOException, InvalidKeyException, ServerException, XmlParserException, ErrorResponseException, InternalException, InvalidResponseException {
+        return super.completeMultipartUpload(bucketName, region, objectName, uploadId, parts, extraHeaders, extraQueryParams);
+    }
+
+    @Override
+    public ListPartsResponse listParts(String bucketName, String region, String objectName, Integer maxParts, Integer partNumberMarker, String uploadId, Multimap<String, String> extraHeaders, Multimap<String, String> extraQueryParams) throws NoSuchAlgorithmException, InsufficientDataException, IOException, InvalidKeyException, ServerException, XmlParserException, ErrorResponseException, InternalException, InvalidResponseException {
+        return super.listParts(bucketName, region, objectName, maxParts, partNumberMarker, uploadId, extraHeaders, extraQueryParams);
+    }
+
+}

+ 62 - 5
simulation-resource-common/src/main/java/com/css/simulation/resource/common/controller/MinioController.java

@@ -4,11 +4,14 @@ import api.common.pojo.common.ResponseBodyVO;
 import api.common.pojo.constants.DictConstants;
 import api.common.pojo.param.MinioParameter;
 import api.common.util.FileUtil;
+import api.common.util.ObjectUtil;
 import api.common.util.TimeUtil;
+import com.css.simulation.resource.common.configuration.minio.SubMinioClient;
 import com.css.simulation.resource.common.util.MinioUtil;
-import io.minio.MinioClient;
+import io.minio.*;
 import io.minio.errors.*;
 import io.minio.http.Method;
+import io.minio.messages.Part;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.MediaType;
@@ -23,16 +26,14 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 @RestController
 @RequestMapping("/minio")
 public class MinioController {
 
     @Resource
-    private MinioClient minioClient;
+    private SubMinioClient minioClient;
 
     @Value("${minio.bucket-name}")
     private String bucketName;
@@ -133,4 +134,60 @@ public class MinioController {
         FileUtil.downloadForHttp(fileName, inputStream, response, 1024);
     }
 
+    @RequestMapping("/createMultipartUpload")
+    @ResponseBody
+    public ResponseBodyVO createMultipartUpload(@RequestBody Map<String,String> paramMap) throws Exception {
+        String objectName = paramMap.get("objectName");
+        String chunkSize = paramMap.get("chunkSize");
+        String type = paramMap.get("type");
+        if(ObjectUtil.isNull(objectName) || ObjectUtil.isNull(chunkSize) || ObjectUtil.isNull(type)){
+            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE,"请求参数缺失");
+        }
+        Integer nowTime = TimeUtil.getRq(new Date(), 0);
+        if (type.equals(DictConstants.ALGORITHM_FILE)) {
+            objectName = "algorithm/" + nowTime + "/" + objectName;
+        }
+        Map<String,Object> result = new HashMap<>();//结果数据
+        CreateMultipartUploadResponse multipartUpload = minioClient.createMultipartUpload(bucketName, null, objectName, null, null);
+        String uploadId = multipartUpload.result().uploadId();
+        List<String> UrlList = new LinkedList<>();
+        Map<String,String> queryParam = new HashMap();
+        queryParam.put("uploadId",uploadId);
+        int size = Integer.valueOf(chunkSize);
+        for (int i = 1; i <= size; i++) {
+            queryParam.put("partNumber",String.valueOf(i));
+            String presignedObjectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
+                    .method(Method.PUT)
+                    .bucket(bucketName)
+                    .object(objectName)
+                    .expiry(60 * 60)//上传URL有效期
+                    .extraQueryParams(queryParam)
+                    .build());
+            UrlList.add(presignedObjectUrl);
+        }
+        result.put("uploadId",uploadId);
+        result.put("uploadUrls",UrlList);
+        result.put("objectName",objectName);
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS,result);
+    }
+
+    @RequestMapping("/completeMultipartUpload")
+    @ResponseBody
+    public ResponseBodyVO completeMultipartUpload(@RequestBody Map<String,String> paramMap) throws Exception {
+        String objectName = paramMap.get("objectName");
+        String uploadId = paramMap.get("uploadId");
+        if(ObjectUtil.isNull(objectName) || ObjectUtil.isNull(uploadId)){
+            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE,"请求参数缺失");
+        }
+        ListPartsResponse listPartsResponse = minioClient.listParts(bucketName, null, objectName, 10000, 0, uploadId, null, null);
+        List<Part> parts = listPartsResponse.result().partList();
+        Part[] partArr = new Part[parts.size()];
+        int partNumber = 1;
+        for (Part part: parts) {
+            partArr[partNumber-1] = new Part(partNumber,part.etag());
+            partNumber++;
+        }
+        minioClient.completeMultipartUpload(bucketName,null,objectName,uploadId,partArr,null,null);
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS,"合并成功");
+    }
 }

+ 12 - 2
simulation-resource-server/src/main/java/com/css/simulation/resource/project/ctrl/SimulationProjectCtrl.java

@@ -207,8 +207,18 @@ public class SimulationProjectCtrl {
      */
     @RequestMapping("exportProjectTaskFileById")
     @ResponseBody
-    public ResponseBodyVO exportProjectTaskFileById(@RequestBody SimulationManualProjectParam param){
-        return service.exportProjectTaskFileById(param);
+    public void exportProjectTaskFileById(@RequestBody SimulationManualProjectParam param){
+        service.exportProjectTaskFileById(param);
+    }
+
+    /**
+     * 同时导出工作报告和任务包
+     * @param param
+     */
+    @RequestMapping("exportProjectReportAndTaskFileById")
+    @ResponseBody
+    public void exportProjectReportAndTaskFileById(@RequestBody SimulationManualProjectParam param){
+        service.exportProjectReportAndTaskFileById(param);
     }
 
 

+ 167 - 22
simulation-resource-server/src/main/java/com/css/simulation/resource/project/impl/SimulationProjectServiceImpl.java

@@ -57,10 +57,13 @@ import java.io.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.URLEncoder;
+import java.nio.file.Files;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
 
 @Service
 @Slf4j
@@ -241,8 +244,6 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
     @SneakyThrows
     @Override
     public ResponseBodyVO updateProjectNowRunState(SimulationManualProjectParam param) {
-        log.info("updateProjectNowRunState_id:"+param.getId());
-        log.info("updateProjectNowRunState_nowRunState:"+param.getNowRunState());
 
         SimulationManualProjectPo po = simulationProjectMapper.selectProjectById(param);
 
@@ -253,24 +254,46 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         if(isEmpty(param.getId()) || isEmpty(param.getNowRunState())){
             return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE);
         }
-        if("20".equals(param.getNowRunState())){
-            //设置开始时间
-            param.setStartTime(new Date());
 
+        //已经完成的项目再次运行
+        if("30".equals(po.getNowRunState()) && "20".equals(param.getNowRunState())){
+            po.createPo(AuthUtil.getCurrentUserId());
+            //生成id
+            createProjectId(po);
+            //初始化数据
+            po.setNowRunState(param.getNowRunState());
+            po.setEvaluationLevel("");
+            po.setStartTime(new Date());
+            po.setFinishTime(null);
+            int add = simulationProjectMapper.add(po);
+            if(add <= 0){
+                return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"生成新工作失败");
+            }
             //Kafka推送消息
             projectRunToKafka(po);
 
-        }else if("30".equals(param.getNowRunState())){
-            //设置完成时间
-            param.setFinishTime(new Date());
+        } else{
+            if("20".equals(param.getNowRunState())){
+                //设置开始时间
+                param.setStartTime(new Date());
+
+                //Kafka推送消息
+                projectRunToKafka(po);
+
+            }else if("30".equals(param.getNowRunState())){
+                //设置完成时间
+                param.setFinishTime(new Date());
+
+            }
+            int i = simulationProjectMapper.updateProjectNowRunState(param);
+            if(i <=  0){
+                return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE);
+
+            }
 
         }
-        int i = simulationProjectMapper.updateProjectNowRunState(param);
-        if(i > 0){
-            return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
-        }
-        return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE);
 
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
 
     }
 
@@ -458,7 +481,7 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         for(String key : dict.keySet()){
             boolean b = false;
             for(ProjectRunResultRatioNumVo pv : vos){
-                if(pv.getResultName().equals(dict.get(key))){
+                if(dict.get(key).equals(pv.getResultName())){
                     b = true;
                 }
             }
@@ -2166,11 +2189,17 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
             ResponseBodyVO bodyVO = selectProjectReportById(param);
             ProjectReportVo vo = (ProjectReportVo)bodyVO.getInfo();
 
-            //下载
-            String fileName=vo.getProjectId()+"_"+vo.getProjectName();
-            response.setContentType("application/x-download");
-            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".pdf");
-            os = new BufferedOutputStream(response.getOutputStream());
+            //下载 or 保存本地
+            if(param.getIsCreateLocalPdfFile() != null && param.getIsCreateLocalPdfFile() == true){
+                File file = new File(param.getLocalPdfFilePath());
+                os = new BufferedOutputStream(new FileOutputStream(file));
+            }else{
+                String fileName=vo.getProjectId()+"_"+vo.getProjectName();
+                response.setContentType("application/x-download");
+                response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".pdf");
+                os = new BufferedOutputStream(response.getOutputStream());
+            }
+
 
             //监听生成pdf数据
             PdfWriter.getInstance(document, os);
@@ -3197,13 +3226,129 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
     }
 
     @Override
-    public ResponseBodyVO exportProjectTaskFileById(SimulationManualProjectParam param) {
+    public void exportProjectTaskFileById(SimulationManualProjectParam param) {
         String id = param.getId();
         if(StringUtil.isEmpty(id)){
-            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE,"工作id不能为空");
+            throw new RuntimeException("工作id不能为空");
         }
 
-        return null;
+        //获取任务包信息
+        ProjectTaskParam projectTaskParam = new ProjectTaskParam();
+        projectTaskParam.setPId(id);
+        List<ManualProjectTaskVo> manualProjectTaskVos = simulationProjectTaskMapper.selectProjectTaskByProjectId(projectTaskParam);
+        if(isEmpty(manualProjectTaskVos)){
+            throw new RuntimeException("没有获取到任务信息");
+        }
+
+        //压缩包根路径
+        SimulationManualProjectParam sp = new SimulationManualProjectParam();
+        sp.setId(id);
+        SimulationManualProjectPo spo = simulationProjectMapper.selectProjectBaseById(sp);
+        String rootPath = spo.getProjectName()+"_"+StringUtil.getRandomUUID();
+//        FileUtil.createDirectory(rootPath);
+
+
+        int len;
+        byte[] buffer = new byte[1024];
+        BufferedInputStream in = null;
+        ZipOutputStream zos = null;
+        InputStream inputStream = null;
+        File pdfFile = null;
+        try {
+            HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
+            response.setContentType("multipart/form-data");
+            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("运行任务包.zip", "UTF-8"));
+            zos = new ZipOutputStream(response.getOutputStream());
+            for(ManualProjectTaskVo v : manualProjectTaskVos){
+                String runResultFilePath = v.getRunResultFilePath();
+                if(!isEmpty(runResultFilePath)){
+                    MinioParameter minioParameter = new MinioParameter();
+                    minioParameter.setObjectName(runResultFilePath+"/Ego.csv");
+                    Response download = fileDownService.download(minioParameter);
+                    Response.Body body = download.body();
+                    inputStream = body.asInputStream();
+
+                    //获取场景名
+                    SceneBaseInfoVo sceneBaseInfoVo = getsceneNameAndOther(v.getSceneId(), v.getSceneType());
+                    String sceneName = sceneBaseInfoVo.getCommonSceneName();
+
+                    //任务包路径
+                    String taskPagePath = rootPath+File.separator+sceneName+"_"+StringUtil.getRandomUUID();
+//                    FileUtil.createDirectory(taskPagePath);
+
+                    //任务文件路径
+                    String taskFilePath = taskPagePath +File.separator+ ".Ego.csv";
+//                    FileUtil.writeInputStreamToLocalFile(inputStream,taskFilePath);
+
+                    ZipEntry entry = new ZipEntry(taskFilePath);
+                    in = new BufferedInputStream(inputStream);
+                    zos.putNextEntry(entry);
+                    while ((len = in.read(buffer)) != -1 ) {
+                        zos.write(buffer, 0, len);
+                    }
+                }
+            }
+
+            //打包pdf
+            if(param.getIsPagePdf() != null && param.getIsPagePdf() == true){
+                //获取工作信息
+                SimulationManualProjectPo p = simulationProjectMapper.selectProjectBaseById(param);
+
+                pdfFile = new File(param.getLocalPdfFilePath());
+                FileInputStream fileInputStream = new FileInputStream(pdfFile);
+                in = new BufferedInputStream(fileInputStream);
+                ZipEntry entry = new ZipEntry(rootPath+File.separator+p.getProjectName()+"_"+StringUtil.getRandomUUID()+".pdf");
+                zos.putNextEntry(entry);
+                while ((len = in.read(buffer)) != -1 ) {
+                    zos.write(buffer, 0, len);
+                }
+
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            try {
+                if(in != null){
+                        in.close();
+                }
+                if(zos != null){
+                    zos.close();
+                }
+                if(inputStream != null){
+                    inputStream.close();
+                }
+                if(pdfFile != null){
+                    pdfFile.delete();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+        }
+
+    }
+
+    @Override
+    public void exportProjectReportAndTaskFileById(SimulationManualProjectParam param) {
+
+        String id = param.getId();
+        if(StringUtil.isEmpty(id)){
+            throw new RuntimeException("工作id不能为空");
+        }
+
+        //生成本地pdf
+        String path = StringUtil.getRandomUUID();
+        param.setIsCreateLocalPdfFile(true);
+        param.setLocalPdfFilePath(path);
+
+        exportProjectReport(param);
+
+        //下载报告和任务包
+        param.setIsPagePdf(true);
+
+        exportProjectTaskFileById(param);
+
     }
 
     /**

+ 3 - 1
simulation-resource-server/src/main/java/com/css/simulation/resource/project/service/SimulationProjectService.java

@@ -58,5 +58,7 @@ public interface SimulationProjectService {
     //仿真结果保存到数据库
     ResponseBodyVO saveTaskResult(SimulationManualProjectParam param);
 
-    ResponseBodyVO exportProjectTaskFileById(SimulationManualProjectParam param);
+    void exportProjectTaskFileById(SimulationManualProjectParam param);
+
+    void exportProjectReportAndTaskFileById(SimulationManualProjectParam param);
 }

+ 2 - 0
simulation-resource-server/src/main/resources/mapper/project/SimulationProjectMapper.xml

@@ -26,6 +26,7 @@
         automatic_run_state,
         now_run_state,
         evaluation_level,
+        start_time,
         finish_time,
         max_simulation_time,
         create_time,
@@ -55,6 +56,7 @@
         #{automaticRunState,jdbcType=VARCHAR},
         #{nowRunState,jdbcType=VARCHAR},
         #{evaluationLevel,jdbcType=VARCHAR},
+        #{startTime,jdbcType=TIMESTAMP},
         #{finishTime,jdbcType=TIMESTAMP},
         #{maxSimulationTime,jdbcType=BIGINT},
         #{createTime,jdbcType=TIMESTAMP},