dengsixing 3 mēneši atpakaļ
vecāks
revīzija
d730df6d3d
21 mainītis faili ar 329 papildinājumiem un 402 dzēšanām
  1. 0 31
      pom.xml
  2. 16 1
      src/main/java/com/fdkankan/contro/controller/SceneOrigBdController.java
  3. 28 0
      src/main/java/com/fdkankan/contro/dto/UploadSceneDTO.java
  4. 6 0
      src/main/java/com/fdkankan/contro/entity/SceneFileBuild.java
  5. 20 50
      src/main/java/com/fdkankan/contro/entity/SceneOrigBd.java
  6. 12 0
      src/main/java/com/fdkankan/contro/entity/ScenePlus.java
  7. 39 0
      src/main/java/com/fdkankan/contro/httpclient/CustomHttpClient.java
  8. 19 0
      src/main/java/com/fdkankan/contro/httpclient/HaixinClient.java
  9. 0 24
      src/main/java/com/fdkankan/contro/mq/nsq/NsqClient.java
  10. 0 17
      src/main/java/com/fdkankan/contro/mq/nsq/NsqClientPruductor.java
  11. 0 38
      src/main/java/com/fdkankan/contro/mq/nsq/NsqConsume.java
  12. 0 106
      src/main/java/com/fdkankan/contro/mq/nsq/NsqMesgDeal.java
  13. 0 18
      src/main/java/com/fdkankan/contro/mq/nsq/PubExample.java
  14. 0 20
      src/main/java/com/fdkankan/contro/mq/nsq/PubExample2.java
  15. 0 43
      src/main/java/com/fdkankan/contro/mq/nsq/WatchManNsqConsume.java
  16. 8 14
      src/main/java/com/fdkankan/contro/mq/service/impl/BuildSceneServiceImpl.java
  17. 12 0
      src/main/java/com/fdkankan/contro/service/IHaixinService.java
  18. 1 1
      src/main/java/com/fdkankan/contro/service/ISceneFileBuildService.java
  19. 124 0
      src/main/java/com/fdkankan/contro/service/impl/HaixinServiceImpl.java
  20. 29 23
      src/main/java/com/fdkankan/contro/service/impl/MjServiceImpl.java
  21. 15 16
      src/main/java/com/fdkankan/contro/service/impl/SceneFileBuildServiceImpl.java

+ 0 - 31
pom.xml

@@ -189,37 +189,6 @@
       <version>1.5.19</version>
     </dependency>
 
-    <!-- NSQ - JavaNSQClient -->
-    <dependency>
-      <groupId>com.github.brainlag</groupId>
-      <artifactId>nsq-client</artifactId>
-      <version>1.0.0.RC4</version>
-      <exclusions>
-        <exclusion>
-          <groupId>com.google.guava</groupId>
-          <artifactId>guava</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>20.0</version>
-    </dependency>
-
-<!--    <dependency>-->
-<!--      <groupId>com.sproutsocial</groupId>-->
-<!--      <artifactId>nsq-j</artifactId>-->
-<!--      <version>1.0</version>-->
-<!--    </dependency>-->
-
-<!--    <dependency>-->
-<!--      <groupId>com.sproutsocial</groupId>-->
-<!--      <artifactId>nsq-j</artifactId>-->
-<!--      <version>1.6.0</version>-->
-<!--    </dependency>-->
-
-
   </dependencies>
   <build>
     <finalName>${artifactId}</finalName>

+ 16 - 1
src/main/java/com/fdkankan/contro/controller/SceneOrigBdController.java

@@ -1,10 +1,17 @@
 package com.fdkankan.contro.controller;
 
 
+import com.fdkankan.contro.dto.UploadSceneDTO;
+import com.fdkankan.contro.service.IHaixinService;
+import com.fdkankan.web.response.ResultData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.Valid;
+
 /**
  * <p>
  *  前端控制器
@@ -17,5 +24,13 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/contro/sceneOrigBd")
 public class SceneOrigBdController {
 
+    @Autowired
+    private IHaixinService haixinService;
+
+    @PostMapping("uploadScene")
+    public ResultData uploadScene(@RequestBody @Valid UploadSceneDTO dto) throws Exception {
+        return haixinService.uploadScene(dto);
+    }
+
 }
 

+ 28 - 0
src/main/java/com/fdkankan/contro/dto/UploadSceneDTO.java

@@ -0,0 +1,28 @@
+package com.fdkankan.contro.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class UploadSceneDTO {
+
+    /**
+     * 原始资源压缩包url
+     */
+    @NotBlank(message = "fileUrl不能为空")
+    private String fileUrl;
+
+    @NotBlank(message = "项目号不能为空")
+    private String taskId;
+
+    @NotBlank(message = "案件号不能为空")
+    private String kNo;
+
+    private String ryNo;
+
+    private String password;
+
+
+
+}

+ 6 - 0
src/main/java/com/fdkankan/contro/entity/SceneFileBuild.java

@@ -83,5 +83,11 @@ public class SceneFileBuild implements Serializable {
     @TableLogic("A")
     private String recStatus;
 
+    @TableField("task_id")
+    private String taskId;
+
+    @TableField("k_no")
+    private String kNo;
+
 
 }

+ 20 - 50
src/main/java/com/fdkankan/contro/entity/SceneOrigBd.java

@@ -9,11 +9,11 @@ import java.util.Date;
 
 /**
  * <p>
- * 
+ *
  * </p>
  *
- * @author 
- * @since 2025-05-07
+ * @author
+ * @since 2025-02-13
  */
 @Getter
 @Setter
@@ -28,59 +28,20 @@ public class SceneOrigBd implements Serializable {
     /**
      * 原始资源url
      */
-    @TableField("path")
-    private String path;
-
-    @TableField("local_path")
-    private String localPath;
-
-    /**
-     * 文件md5
-     */
-    @TableField("file_hash")
-    private String fileHash;
-
-    /**
-     * 警员号
-     */
-    @TableField("jyh")
-    private String jyh;
-
-    /**
-     * 文件名
-     */
-    @TableField("filename")
-    private String filename;
+    @TableField("file_url")
+    private String fileUrl;
 
     /**
-     * 地理位置
+     * 案件号
      */
-    @TableField("location")
-    private String location;
+    @TableField("task_id")
+    private String taskId;
 
     /**
-     * 纬度
+     * 勘探号
      */
-    @TableField("latitude")
-    private String latitude;
-
-    /**
-     * 维度
-     */
-    @TableField("longitude")
-    private String longitude;
-
-    /**
-     * 姓名
-     */
-    @TableField("user_xm")
-    private String userXm;
-
-    /**
-     * unicode
-     */
-    @TableField("unicode")
-    private String unicode;
+    @TableField("k_no")
+    private String kNo;
 
     /**
      * 处理状态(-1-处理失败,0-等待中,1-成功推送计算)
@@ -110,5 +71,14 @@ public class SceneOrigBd implements Serializable {
     @TableField("update_time")
     private Date updateTime;
 
+    @TableField("ry_no")
+    private String ryNo;
+
+    @TableField("ry_id")
+    private String ryId;
+
+    @TableField("password")
+    private String password;
+
 
 }

+ 12 - 0
src/main/java/com/fdkankan/contro/entity/ScenePlus.java

@@ -128,10 +128,22 @@ public class ScenePlus implements Serializable {
     @TableLogic("A")
     private String recStatus;
 
+    @TableField("other_type")
+    private String otherType;
+
+    @TableField("source_id")
+    private Long sourceId;
+
+    @TableField("task_id")
+    private String taskId;
+
+    @TableField("k_no")
+    private String kNo;
 
     /**
      * 是否有平面图i识别
      */
     @TableField("has_floorplan_ai")
     private Integer hasFloorplanAi;
+
 }

+ 39 - 0
src/main/java/com/fdkankan/contro/httpclient/CustomHttpClient.java

@@ -0,0 +1,39 @@
+package com.fdkankan.contro.httpclient;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.annotation.*;
+import com.dtflys.forest.extensions.DownloadFile;
+import com.fdkankan.web.response.ResultData;
+
+import java.io.InputStream;
+import java.util.Map;
+
+public interface CustomHttpClient {
+
+    @Post(url = "{url}", connectTimeout = 30000,  readTimeout = 30000, maxRetryInterval = 5)
+    JSONObject postJson(@Var("url") String url, @JSONBody Object object);
+
+    @Post(url = "{url}", connectTimeout = 30000,  readTimeout = 30000, maxRetryInterval = 5)
+    JSONObject postJson(@Var("url") String url, @Header Map<String, String> headers, @JSONBody Object object);
+
+    @Post(url = "{url}", connectTimeout = 30000,  readTimeout = 30000, maxRetryInterval = 5)
+    JSONObject post(@Header Map<String, String> headers, @Var("url") String url);
+
+    @Post(url = "{url}", connectTimeout = 30000,  readTimeout = 30000, maxRetryInterval = 5)
+    ResultData post(@Var("url") String url, @Body("params") String params);
+
+    /**
+     * 返回类型用InputStream,用流的方式读取文件内容
+     */
+    @GetRequest(url = "{url}", connectTimeout = 6000, readTimeout = 60000, maxRetryInterval = 5)
+    InputStream downloadFileToInputStream(@Var("url") String url);
+
+    @GetRequest(url = "{url}", connectTimeout = 60000, readTimeout = 600000, maxRetryInterval = 5)
+    @DownloadFile(dir = "{dir}", filename = "{fileName}")
+    void downloadFile(@Var("url") String url, @Var("dir") String dir, @Var("fileName") String fileName);
+
+    @Post(url="{url}", readTimeout = 60*60*1000, connectTimeout = 60*60*1000, timeout = 60*60*1000, maxRetryInterval = 5)
+    JSONObject upload(@Var("url")String url, @Header Map<String, String> headers, @DataFile("file") String filePath, @Body Object param);
+
+}

+ 19 - 0
src/main/java/com/fdkankan/contro/httpclient/HaixinClient.java

@@ -0,0 +1,19 @@
+package com.fdkankan.contro.httpclient;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.annotation.DataFile;
+import com.dtflys.forest.annotation.JSONBody;
+import com.dtflys.forest.annotation.Post;
+import com.dtflys.forest.annotation.Var;
+import com.fdkankan.web.response.ResultData;
+
+public interface HaixinClient {
+
+    @Post(url = "${url}", readTimeout = 60*60*1000, connectTimeout = 60*60*1000, timeout = 60*60*1000, maxRetryInterval = 5)
+    ResultData postJson(@Var("url") String url, @JSONBody Object param);
+
+    @Post(url="{url}", readTimeout = 60*60*1000, connectTimeout = 60*60*1000, timeout = 60*60*1000, maxRetryInterval = 5)
+    JSONObject uploadToFdfs(@Var("url")String url, @DataFile("file") String filePath);
+
+}

+ 0 - 24
src/main/java/com/fdkankan/contro/mq/nsq/NsqClient.java

@@ -1,24 +0,0 @@
-package com.fdkankan.contro.mq.nsq;
-
-import com.github.brainlag.nsq.NSQConsumer;
-import com.github.brainlag.nsq.lookup.DefaultNSQLookup;
-import com.github.brainlag.nsq.lookup.NSQLookup;
-
-public class NsqClient {
-
-    public static void main(String[] args) {
-        NSQLookup lookup = new DefaultNSQLookup();
-        lookup.addLookupAddress("192.168.0.127", 4161);
-        NSQConsumer consumer = new NSQConsumer(lookup, "topic-bd", "channel-bd", (message) -> {
-            System.out.println("received: " + message);
-            //now mark the message as finished.
-//            message.finished();
-
-            //or you could requeue it, which indicates a failure and puts it back on the queue.
-            message.requeue();
-        });
-
-        consumer.start();
-    }
-
-}

+ 0 - 17
src/main/java/com/fdkankan/contro/mq/nsq/NsqClientPruductor.java

@@ -1,17 +0,0 @@
-package com.fdkankan.contro.mq.nsq;
-
-import com.github.brainlag.nsq.NSQProducer;
-import com.github.brainlag.nsq.exceptions.NSQException;
-
-import java.util.concurrent.TimeoutException;
-
-public class NsqClientPruductor {
-
-    public static void main(String[] args) throws NSQException, TimeoutException {
-
-        NSQProducer producer = new NSQProducer().addAddress("192.168.0.127", 4150).start();
-        producer.produce("topic-bd", ("this is a message").getBytes());
-
-    }
-
-}

+ 0 - 38
src/main/java/com/fdkankan/contro/mq/nsq/NsqConsume.java

@@ -1,38 +0,0 @@
-package com.fdkankan.contro.mq.nsq;
-
-import com.github.brainlag.nsq.NSQConsumer;
-import com.github.brainlag.nsq.lookup.DefaultNSQLookup;
-import com.github.brainlag.nsq.lookup.NSQLookup;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.stereotype.Component;
-
-@Component
-public class NsqConsume implements ApplicationRunner {
-
-    @Value("${nsq.lookup.host:192.168.0.127}")
-    private String nsqHost;
-
-    @Value("${nsq.lookup.port:4161}")
-    private Integer port;
-
-    @Value("${nsq.topic:topic-bd}")
-    private String nsqTopic;
-
-    @Value("${nsq.channel:channel-bd}")
-    private String channel;
-
-    @Autowired
-    private NsqMesgDeal nsqMesgDeal;
-
-    @Override
-    public void run(ApplicationArguments args) throws Exception {
-        NSQLookup lookup = new DefaultNSQLookup();
-        lookup.addLookupAddress(nsqHost, 4161);
-        NSQConsumer consumer = new NSQConsumer(lookup, nsqTopic, channel, nsqMesgDeal);
-        consumer.start();
-
-    }
-}

+ 0 - 106
src/main/java/com/fdkankan/contro/mq/nsq/NsqMesgDeal.java

@@ -1,106 +0,0 @@
-package com.fdkankan.contro.mq.nsq;
-
-import cn.hutool.core.exceptions.ExceptionUtil;
-import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.ZipUtil;
-import cn.hutool.crypto.digest.MD5;
-import cn.hutool.http.HttpUtil;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.fdkankan.common.constant.CommonSuccessStatus;
-import com.fdkankan.contro.common.Result;
-import com.fdkankan.contro.entity.SceneOrigBd;
-import com.fdkankan.contro.httpclient.MjHttpClient;
-import com.fdkankan.contro.service.ISceneOrigBdService;
-import com.fdkankan.model.constants.ConstantFilePath;
-import com.github.brainlag.nsq.NSQMessage;
-import com.github.brainlag.nsq.callbacks.NSQMessageCallback;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.ZipFile;
-
-@Component
-@Slf4j
-public class NsqMesgDeal implements NSQMessageCallback {
-
-    private static final String BD_BASE_PATH = ConstantFilePath.BUILD_MODEL_PATH + "bd/";
-
-    @Autowired
-    private ISceneOrigBdService sceneOrigBdService;
-    @Resource
-    private MjHttpClient mjHttpClient;
-
-
-    @Override
-    public void message(NSQMessage nsqMessage) {
-        String msg = new String(nsqMessage.getMessage());
-        String id = new String(nsqMessage.getId());
-        log.info("start deal call msg, id:{}, content:{}", id, msg);
-        nsqMessage.finished();
-        Result content = JSON.parseObject(msg, Result.class);
-//        SceneOrigBd data = content.getData();
-        JSONObject obj = (JSONObject) content.getData();
-        SceneOrigBd data = JSON.parseObject(obj.toJSONString(), SceneOrigBd.class);
-        try {
-            String path = data.getPath();
-            String fileHash = data.getFileHash();
-            String localPath = BD_BASE_PATH + fileHash + File.separator + fileHash + ".zip";
-            HttpUtil.downloadFile(path, new File(localPath), 1000 * 60 * 60 * 4);
-            String md5 = MD5.create().digestHex(new File(localPath));
-            data.setLocalPath(localPath);
-            //比对md5是否一致
-            if(!md5.equals(fileHash)){
-                throw new RuntimeException("md5不匹配");
-            }
-            //data.fdage临时文件路径
-            String tempFdagePath = null;
-            try (
-                    ZipFile zipFile = new ZipFile(localPath);
-                    InputStream ins = ZipUtil.get(zipFile, "data.fdage")
-            ){
-                tempFdagePath = BD_BASE_PATH + fileHash + File.separator + fileHash + ".fdage";
-                FileUtil.writeFromStream(ins, tempFdagePath);
-                JSONObject dataFdage = JSON.parseObject(FileUtil.readUtf8String(tempFdagePath));
-                String unicode = dataFdage.getString("creator") + "_" + dataFdage.getString("uuidtime");
-                data.setUnicode(unicode);
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }finally {
-                FileUtil.del(tempFdagePath);
-            }
-
-            //通知平台文件已下载(删除文件)
-            JSONObject param = new JSONObject();
-            param.put("filename", data.getFilename());
-//            mjHttpClient.notify(param);
-        }catch (Exception e){
-            data.setReason(ExceptionUtil.stacktraceToString(e, 5000));
-            data.setStatus(CommonSuccessStatus.FAIL.code());
-        }
-        sceneOrigBdService.save(data);
-        nsqMessage.finished();
-
-        log.info("end deal call msg, id:{}, content:{}", id, msg);
-    }
-
-    public static void main(String[] args) {
-        try (
-                ZipFile zipFile = new ZipFile("D:\\Downloads\\916ed6689_202501101516307030\\916ed6689_202501101516307030.zip");
-                InputStream ins = ZipUtil.get(zipFile, "data.fdage")
-        ){
-            String tempFdagePath = "D:\\Downloads\\aaa.fdage";
-            FileUtil.writeFromStream(ins, tempFdagePath);
-            JSONObject dataFdage = JSON.parseObject(FileUtil.readUtf8String(tempFdagePath));
-            String unicode = dataFdage.getString("creator") + "_" + dataFdage.getString("uuidtime");
-            System.out.println(unicode);
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}

+ 0 - 18
src/main/java/com/fdkankan/contro/mq/nsq/PubExample.java

@@ -1,18 +0,0 @@
-//package com.fdkankan.contro.mq.nsq;
-//
-//import com.sproutsocial.nsq.Subscriber;
-//
-//public class PubExample {
-//
-//    public static void handleData(byte[] data) {
-//        System.out.println("Received:" + new String(data));
-//    }
-//
-//    public static void main(String[] args) {
-//        Subscriber subscriber = new Subscriber("192.168.0.127:4161");
-//        subscriber.subscribe("topic-bd", "channel-bd", PubExample::handleData);
-//
-//
-//
-//    }
-//}

+ 0 - 20
src/main/java/com/fdkankan/contro/mq/nsq/PubExample2.java

@@ -1,20 +0,0 @@
-//package com.fdkankan.contro.mq.nsq;
-//
-//import com.sproutsocial.nsq.Publisher;
-//
-//public class PubExample2 {
-//
-//    public static void handleData(byte[] data) {
-//        System.out.println("Received:" + new String(data));
-//    }
-//
-//    public static void main(String[] args) {
-//
-//        Publisher publisher = new Publisher("192.168.0.127:4150");
-//        byte[] data = "Hello nsq".getBytes();
-//        publisher.publishBuffered("topic-bd", data);
-//        System.out.println(123);
-//
-//
-//    }
-//}

+ 0 - 43
src/main/java/com/fdkankan/contro/mq/nsq/WatchManNsqConsume.java

@@ -1,43 +0,0 @@
-//package com.fdkankan.contro.mq.nsq;
-//
-//import com.sproutsocial.nsq.DirectSubscriber;
-//import com.sproutsocial.nsq.MessageDataHandler;
-//import com.sproutsocial.nsq.Subscriber;
-//import lombok.extern.slf4j.Slf4j;
-//import org.springframework.beans.factory.annotation.Value;
-//import org.springframework.boot.ApplicationArguments;
-//import org.springframework.boot.ApplicationRunner;
-//import org.springframework.stereotype.Component;
-//
-//import java.util.Objects;
-//
-//@Component
-//@Slf4j
-//public class WatchManNsqConsume implements ApplicationRunner {
-//
-//    @Value("${nsq.lookup.host}")
-//    private String host;
-//
-//    @Value("${nsq.topic:topic-bd}")
-//    private String nsqTopic;
-//
-//    @Value("${nsq.channel:channel-bd}")
-//    private String channel;
-//
-//
-//    @Override
-//    public void run(ApplicationArguments applicationArguments) throws InterruptedException {
-//        Subscriber directSubscriber = null;
-//        while(Objects.isNull(directSubscriber) || directSubscriber.getConnectionCount() == 0){
-//            Thread.sleep(500);
-//                directSubscriber = new DirectSubscriber(2, host);
-//                directSubscriber.subscribe(nsqTopic, channel, new MessageDataHandler() {
-//                    @Override
-//                    public void accept(byte[] bytes) {
-//                    }
-//                });
-//        }
-//
-//
-//    }
-//}

+ 8 - 14
src/main/java/com/fdkankan/contro/mq/service/impl/BuildSceneServiceImpl.java

@@ -146,8 +146,7 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
     private ILinkPanService linkPanService;
     @Autowired
     private IJmgaService jmgaService;
-    @Autowired
-    private MjService mjService;
+    private IHaixinService haixinService;
 
 
     @Override
@@ -235,9 +234,7 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
         }catch (Exception e){
             log.error("场景计算前置处理出错,num"+num, e);
             this.sendFailToLaser(num);
-            if(StrUtil.isNotEmpty(filename)){
-                mjService.distributeDetailDone("2", filename);
-            }
+            haixinService.noticHaixin(num, false);
             throw e;
         }
     }
@@ -340,6 +337,7 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
         String sceneCode = message.getBuildContext().get("sceneNum").toString();
         String filename = (String)message.getExt().get("filename");
         String path = message.getPath();
+        boolean status = false;
         try {
             // 上传计算日志
             //如果是重复计算,没有走到计算逻辑,不需要上传日志文件
@@ -359,9 +357,6 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
 
                 this.sendFailToLaser(sceneCode);
                 redisUtil.set(String.format(RedisKey.SCENE_BUILD_FINISH_NUM, sceneCode), "-1");
-                if(StrUtil.isNotEmpty(filename)){
-                    mjService.distributeDetailDone("2", filename);
-                }
                 return;
             }
 
@@ -524,9 +519,7 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
 
             redisUtil.set(String.format(RedisKey.SCENE_BUILD_FINISH_NUM, sceneCode), "1");
 
-            if(StrUtil.isNotEmpty(filename)){
-                mjService.distributeDetailDone("1", filename);
-            }
+            status = true;
 
             log.info("场景计算结果处理结束,场景码:{}", sceneCode);
 
@@ -534,11 +527,12 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
             log.error("场景计算结果处理出错,num"+sceneCode, e);
 //            buildSceneDTService.handBaseFail("场景计算结果处理出错!", message.getPath(), sceneCode, "计算控制服务器");
             this.sendFailToLaser(sceneCode);
-            if(StrUtil.isNotEmpty(filename)){
-                mjService.distributeDetailDone("2", filename);
-            }
             throw e;
+        }finally {
+            //海鑫需求,下载展示目录,打压缩包,进行推送
+            haixinService.noticHaixin(sceneCode, status);
         }
+
     }
 
 

+ 12 - 0
src/main/java/com/fdkankan/contro/service/IHaixinService.java

@@ -0,0 +1,12 @@
+package com.fdkankan.contro.service;
+
+import com.fdkankan.contro.dto.UploadSceneDTO;
+import com.fdkankan.web.response.ResultData;
+
+public interface IHaixinService {
+
+    ResultData uploadScene(UploadSceneDTO dto);
+
+    void noticHaixin(String num, boolean buildSuccess) throws Exception;
+    void sendResult(String taskId, String packetPath);
+}

+ 1 - 1
src/main/java/com/fdkankan/contro/service/ISceneFileBuildService.java

@@ -35,5 +35,5 @@ public interface ISceneFileBuildService extends IService<SceneFileBuild> {
 
     ResultData uploadFile(SendCallAlgorithmParam param) throws Exception;
 
-    ResultData noticeBuild(String params, String fileName, String dataSource) throws Exception;
+    ResultData noticeBuild(String params, Long bdId, String dataSource) throws Exception;
 }

+ 124 - 0
src/main/java/com/fdkankan/contro/service/impl/HaixinServiceImpl.java

@@ -0,0 +1,124 @@
+package com.fdkankan.contro.service.impl;
+
+import cn.hutool.core.io.FileUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.util.CmdUtils;
+import com.fdkankan.contro.dto.UploadSceneDTO;
+import com.fdkankan.contro.entity.SceneOrigBd;
+import com.fdkankan.contro.entity.ScenePlus;
+import com.fdkankan.contro.httpclient.HaixinClient;
+import com.fdkankan.contro.service.IHaixinService;
+import com.fdkankan.contro.service.ISceneOrigBdService;
+import com.fdkankan.contro.service.IScenePlusService;
+import com.fdkankan.fyun.config.FYunFileConfig;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.fdkankan.web.response.ResultData;
+import lombok.extern.slf4j.Slf4j;
+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.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class HaixinServiceImpl implements IHaixinService {
+
+    private static final String  API_FDFS_UPLOAD = "/fdfs/api/file/upload";
+    private static final String  API_SUBMIT_RENDER_RESULT = "/ecs/api/panoramicImageService/submitRenderResult";
+
+    @Value("${haixin.host}")
+    private String haixinHost;
+
+    @Autowired
+    private ISceneOrigBdService sceneOrigBdService;
+    @Resource
+    private FYunFileConfig fYunFileConfig;
+    @Resource
+    private FYunFileServiceInterface fileServiceInterface;
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Resource
+    private HaixinClient haixinClient;
+
+    @Override
+    public ResultData uploadScene(UploadSceneDTO dto) {
+        SceneOrigBd sceneOrigBd = new SceneOrigBd();
+        sceneOrigBd.setFileUrl(dto.getFileUrl());
+        sceneOrigBd.setTaskId(dto.getTaskId());
+        sceneOrigBd.setKNo(dto.getKNo());
+        sceneOrigBdService.save(sceneOrigBd);
+        return ResultData.ok();
+    }
+
+    @Override
+    public void noticHaixin(String num, boolean buildSuccess) throws Exception {
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
+        String taskId = scenePlus.getTaskId();
+        String zipDir = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "haixin/";
+        String zipPath = zipDir + num + ".zip";
+        try {
+            if(buildSuccess){//计算成功,把原始资源打压缩包
+                //复制scene_edit_data/num/data/mapping目录到view目录
+                String editMappingPath = "/oss/4dkankan/" + String.format(UploadFilePath.DATA_EDIT_PATH, num) + "mapping";
+                String viewMappingPath = "/oss/4dkankan/" + String.format(UploadFilePath.DATA_VIEW_PATH, num) + "mapping";
+                if(FileUtil.exist(editMappingPath)){
+                    FileUtil.copyContent(new File(editMappingPath), new File(viewMappingPath), true);
+                }
+
+                String viewPath = "/oss/4dkankan/" + String.format(UploadFilePath.VIEW_PATH, num);
+
+                //打压缩包
+                this.zip(viewPath, zipPath);
+
+                //上传到fastdf
+                String url = haixinHost.concat(API_FDFS_UPLOAD);
+                List<File> files = FileUtil.loopFiles(zipDir);
+                List<String> fileNameRemoteList = new ArrayList<>();
+                String finalUrl = url;
+                files.stream().forEach(file->{
+                    JSONObject jsonObject = haixinClient.uploadToFdfs(finalUrl, file.getAbsolutePath());
+                    JSONObject data = jsonObject.getJSONObject("data");
+                    fileNameRemoteList.add(data.getString("fileNameRemote"));
+                });
+
+                //通知计算结果
+                StringBuilder sb = new StringBuilder();
+                for (String fileNameRemote : fileNameRemoteList) {
+                    sb.append(",").append(fileNameRemote);
+                }
+                this.sendResult(taskId, sb.substring(1));
+            }else{
+                this.sendResult(taskId, null);
+            }
+        }catch (Exception e){
+            log.warn("推送计算结果失败,taskId:{}", taskId, e);
+            this.sendResult(taskId, null);
+        }finally {
+            FileUtil.del(zipDir);
+        }
+    }
+
+    private void zip(String sourcePath, String zipPath) throws Exception {
+        FileUtil.mkParentDirs(zipPath);
+        String cmd = "cd " + sourcePath + " && zip -r -s 2048M " + zipPath + " *";//&& mv -f " + zipPath + " "  + target
+        CmdUtils.callLineSh(cmd, 200);
+    }
+
+    @Override
+    public void sendResult(String taskId, String packetPath){
+        String url = haixinHost.concat(API_SUBMIT_RENDER_RESULT);
+        Map<String, String> params = new HashMap<>();
+        params.put("vendor","A0BF");
+        params.put("projectId", taskId);
+        params.put("packetPath", packetPath);
+        haixinClient.postJson(url, params);
+    }
+}

+ 29 - 23
src/main/java/com/fdkankan/contro/service/impl/MjServiceImpl.java

@@ -2,7 +2,6 @@ package com.fdkankan.contro.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.ZipUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
@@ -10,11 +9,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fdkankan.common.constant.CommonSuccessStatus;
 import com.fdkankan.common.constant.RecStatus;
 import com.fdkankan.common.constant.SceneStatus;
+import com.fdkankan.common.util.CmdUtils;
 import com.fdkankan.common.util.SnowflakeIdGenerator;
 import com.fdkankan.contro.entity.SceneFileBuild;
-import com.fdkankan.contro.entity.SceneFilename;
 import com.fdkankan.contro.entity.SceneOrigBd;
 import com.fdkankan.contro.entity.ScenePlus;
+import com.fdkankan.contro.httpclient.CustomHttpClient;
 import com.fdkankan.contro.httpclient.MjHttpClient;
 import com.fdkankan.contro.service.*;
 import com.fdkankan.fyun.config.FYunFileConfig;
@@ -30,6 +30,7 @@ import java.io.File;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.UUID;
 
 @Slf4j
 @Service
@@ -47,6 +48,8 @@ public class MjServiceImpl implements MjService {
     private ISceneFilenameService sceneFilenameService;
     @Resource
     private MjHttpClient mjHttpClient;
+    @Resource
+    private CustomHttpClient httpClient;
 
 
     @Override
@@ -58,41 +61,42 @@ public class MjServiceImpl implements MjService {
             return;
         }
         for (SceneOrigBd v : list) {
-            String filename = v.getFilename();
-            String unicode = v.getUnicode();
-            String localPath = v.getLocalPath();
-            String zipDir = FileUtil.getParent(localPath, 1) + File.separator;
-            try {
 
-                ScenePlus scenePlus = null;
-                List<SceneFilename> SceneFilenames = sceneFilenameService.list(new LambdaQueryWrapper<SceneFilename>().eq(SceneFilename::getUnicode, unicode));
-                if (CollUtil.isNotEmpty(SceneFilenames)) {
-                    String num = SceneFilenames.get(0).getNum();
-                    if (StrUtil.isNotEmpty(num)) {
-                        scenePlus = scenePlusService.getScenePlusByNum(num);
-                    }
-                }
+            String uuid = UUID.randomUUID().toString();
+            String fileUrl = v.getFileUrl();
+            String zipName = FileUtil.getName(fileUrl);
+            String zipDir = ConstantFilePath.BUILD_MODEL_PATH + "bd/" + uuid + "/";
+            String taskId = v.getTaskId();
+            String kNo = v.getKNo();
+
+//            String filename = v.getFilename();
+//            String unicode = v.getUnicode();
+//            String localPath = v.getLocalPath();
+//            String zipDir = FileUtil.getParent(localPath, 1) + File.separator;
+            try {
 
-                //如果场景正在计算,跳过,等待下一次定时任务进入时在进行处理
-                if (Objects.nonNull(scenePlus) && scenePlus.getSceneStatus() == SceneStatus.wait.code()) {
+                ScenePlus scenePlus = scenePlusService.getByTaskId(taskId);
+                if(Objects.nonNull(scenePlus) && scenePlus.getSceneStatus() == SceneStatus.wait.code()){
                     continue;
                 }
 
-//                String unzipCmd = "unzip -o GBK " + localPath + " -d " + zipDir;
-//                CmdUtils.callLine(unzipCmd);
+                httpClient.downloadFile(fileUrl, zipDir, zipName);
+                String unzipCmd = "unzip -o -O GBK " + zipDir + zipName + " -d " + zipDir;
 
-                ZipUtil.unzip(new File(localPath), new File(zipDir));
+                CmdUtils.callLine(unzipCmd);
 
                 //解压后删除压缩包
-//                FileUtil.del(localPath);
+                FileUtil.del(zipDir + zipName);
 
                 String dataFdagePath = zipDir + "data.fdage";
                 JSONObject dataFdageJson = JSON.parseObject(FileUtil.readUtf8String(dataFdagePath));
 
                 JSONObject camJson = dataFdageJson.getJSONObject("cam");
                 String snCode = camJson.getString("uuid");
+                String uuidtime = dataFdageJson.getString("uuidtime");
+                String unicode = snCode + "_" + uuidtime;
 
-                SceneFileBuild sceneFileBuild = sceneFileBuildService.getOne(new LambdaQueryWrapper<SceneFileBuild>().eq(SceneFileBuild::getUnicode, unicode));
+                SceneFileBuild sceneFileBuild = sceneFileBuildService.getOne(new LambdaQueryWrapper<SceneFileBuild>().eq(SceneFileBuild::getTaskId, taskId));
                 String fileId = null;
                 if (Objects.isNull(sceneFileBuild)) {
                     fileId = String.valueOf(new SnowflakeIdGenerator(0, 0).nextId());
@@ -102,6 +106,8 @@ public class MjServiceImpl implements MjService {
                     sceneFileBuild.setChildName(snCode);
                     sceneFileBuild.setCreateTime(new Date());
                     sceneFileBuild.setRecStatus(RecStatus.VALID.code());
+                    sceneFileBuild.setTaskId(taskId);
+                    sceneFileBuild.setKNo(kNo);
                     sceneFileBuildService.save(sceneFileBuild);
                 } else {
                     fileId = sceneFileBuild.getFileId();
@@ -113,7 +119,7 @@ public class MjServiceImpl implements MjService {
                     FileUtil.copy(file.getAbsolutePath(), file.getAbsolutePath().replace(zipDir, realOssHomeAbsolutePath), true);
                 });
 
-                sceneFileBuildService.noticeBuild(unicode, filename, realDataSource);
+                sceneFileBuildService.noticeBuild(unicode, v.getId(), realDataSource);
                 v.setStatus(CommonSuccessStatus.SUCCESS.code());
             } catch (Exception e) {
                 v.setStatus(CommonSuccessStatus.FAIL.code());

+ 15 - 16
src/main/java/com/fdkankan/contro/service/impl/SceneFileBuildServiceImpl.java

@@ -1610,7 +1610,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
     }
 
     private ScenePlusVO buildScenePost(String dataSource, JSONObject jsonObject, String buildType, long cameraType,
-                                       String sceneNum, Camera camera, CameraDetail cameraDetail, int rebuild,String icon,User user, String fileName) throws Exception {
+                                       String sceneNum, Camera camera, CameraDetail cameraDetail, int rebuild,String icon,User user) throws Exception {
         String imgViewPath = String.format(UploadFilePath.IMG_VIEW_PATH, sceneNum);
 
         JSONObject firmwareVersion = new JSONObject();
@@ -1647,6 +1647,11 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
                 jsonObject.getInteger("scenetype"), jsonObject.getString("gps"), rebuild,
                 jsonObject.getInteger("resolution"), firmwareVersion.toString(), sceneUrl, buildType, cameraDetail.getCooperationUser());
 
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(sceneNum);
+        scenePlus.setTaskId(jsonObject.getString("taskId"));
+        scenePlus.setKNo(jsonObject.getString("kNo"));
+        scenePlusService.updateById(scenePlus);
+
         BuildSceneCallMessage mqMessage = getBuildSceneMqMessage(sceneNum, cameraType, algorithm, jsonObject, buildType, scenePlusVO.getDataSource());
 
         if (cameraDetail.getCompanyId() != null) {
@@ -1659,13 +1664,6 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
         mqMessage.getExt().put("deleteExtras", true);
         mqMessage.getExt().put("gps", jsonObject.getString("gps"));
         mqMessage.getExt().put("threeCamType", scenePlusVO.getThreeCamType());
-        mqMessage.getExt().put("filename", fileName);
-
-        SceneFilename sceneFilename = new SceneFilename();
-        sceneFilename.setNum(sceneNum);;
-        sceneFilename.setFilename(fileName);
-        sceneFilename.setUnicode(unicode);
-        sceneFilenameService.save(sceneFilename);
 
         rabbitMqProducer.sendByWorkQueue(queueModelingPre, mqMessage);
 
@@ -2345,10 +2343,10 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
     }
 
     @Override
-    public ResultData noticeBuild(String uuid, String fileName, String dataSource) throws Exception {
+    public ResultData noticeBuild(String uuid, Long bdId, String dataSource) throws Exception {
         log.info("通知计算,uuid:{} " + uuid);
 
-        SceneOrigBd sceneOrigBd = sceneOrigBdService.getEnableOne(fileName);
+        SceneOrigBd sceneOrigBd = sceneOrigBdService.getById(bdId);
 
         try {
             String[] uuidArr = uuid.split("_");
@@ -2358,6 +2356,8 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             String homePath = SceneUtil.getHomePath(dataSource);
             JSONObject fdageData = JSONObject.parseObject(fYunFileService.getFileContent(homePath + "data.fdage"));
             int camType = fdageData.getJSONObject("cam").getIntValue("type");
+            fdageData.put("taskId", sceneOrigBd.getTaskId());
+            fdageData.put("kNo", sceneOrigBd.getKNo());
 
             //相机入库
             String cameraInStoreUrl = fdServiceUrl + "/service/manage/inner/cameraInStore";
@@ -2393,14 +2393,13 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
 
             //调注册用户接口
             Map<String, Object> params = new HashMap<>();
-            params.put("ryId", sceneOrigBd.getJyh());
-            params.put("ryNo", sceneOrigBd.getJyh());
-            params.put("nickName", sceneOrigBd.getUserXm());
-            params.put("password", AesUtil.encryptCBC("Aa123456", userPasswordKey, userPasswordIv, AesUtil.ALMODE_CBC_NOPADDING));
+            params.put("ryId", sceneOrigBd.getRyId());
+            params.put("ryNo", sceneOrigBd.getRyNo());
+            params.put("password", AesUtil.encryptCBC(sceneOrigBd.getPassword(), userPasswordKey, userPasswordIv, AesUtil.ALMODE_CBC_NOPADDING));
             String url = fdServiceUrl.concat(URL_ADD_UCENTER_USER);
             ResultData post1 = myClient.post(url, params);
             log.info("---------registerUser result:{}-----------", post1);
-            JyUser jyUser = jyUserService.getByRyId(sceneOrigBd.getJyh());
+            JyUser jyUser = jyUserService.getByRyId(sceneOrigBd.getRyId());
             User user = userService.getById(jyUser.getUserId());
             if(Objects.isNull(jyUser)){
                 throw new RuntimeException("注册用户失败");
@@ -2418,7 +2417,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
                 sceneNum = scene3dNumService.generateSceneNum(cameraDetail.getType());
             }
 
-            buildScenePost(dataSource, fdageData, "V3", cameraType, sceneNum, camera, cameraDetail, rebuild, "", user, fileName);
+            buildScenePost(dataSource, fdageData, "V3", cameraType, sceneNum, camera, cameraDetail, rebuild, "", user);
 
             scenePlus = scenePlusService.getScenePlusByNum(sceneNum);