dengsixing 3 ヶ月 前
コミット
879f93be43
27 ファイル変更783 行追加522 行削除
  1. 8 0
      pom.xml
  2. 10 25
      src/main/java/com/fdkankan/contro/controller/SceneFileController.java
  3. 21 0
      src/main/java/com/fdkankan/contro/controller/SceneFilenameController.java
  4. 21 0
      src/main/java/com/fdkankan/contro/controller/SceneOrigBdController.java
  5. 55 0
      src/main/java/com/fdkankan/contro/entity/SceneFilename.java
  6. 114 0
      src/main/java/com/fdkankan/contro/entity/SceneOrigBd.java
  7. 2 2
      src/main/java/com/fdkankan/contro/generate/AutoGenerate.java
  8. 30 0
      src/main/java/com/fdkankan/contro/httpclient/MjHttpClient.java
  9. 26 0
      src/main/java/com/fdkankan/contro/httpclient/address/MjAddressSource.java
  10. 18 0
      src/main/java/com/fdkankan/contro/mapper/ISceneFilenameMapper.java
  11. 18 0
      src/main/java/com/fdkankan/contro/mapper/ISceneOrigBdMapper.java
  12. 37 0
      src/main/java/com/fdkankan/contro/mq/nsq/NsqConsume.java
  13. 88 0
      src/main/java/com/fdkankan/contro/mq/nsq/NsqMesgDeal.java
  14. 0 99
      src/main/java/com/fdkankan/contro/mq/service/impl/BuildSceneServiceImpl.java
  15. 13 0
      src/main/java/com/fdkankan/contro/schedule/ScheduleJob.java
  16. 1 3
      src/main/java/com/fdkankan/contro/service/ISceneFileBuildService.java
  17. 16 0
      src/main/java/com/fdkankan/contro/service/ISceneFilenameService.java
  18. 19 0
      src/main/java/com/fdkankan/contro/service/ISceneOrigBdService.java
  19. 7 0
      src/main/java/com/fdkankan/contro/service/MjService.java
  20. 0 5
      src/main/java/com/fdkankan/contro/service/impl/JmgaServiceImpl.java
  21. 137 0
      src/main/java/com/fdkankan/contro/service/impl/MjServiceImpl.java
  22. 86 149
      src/main/java/com/fdkankan/contro/service/impl/SceneFileBuildServiceImpl.java
  23. 20 0
      src/main/java/com/fdkankan/contro/service/impl/SceneFilenameServiceImpl.java
  24. 26 0
      src/main/java/com/fdkankan/contro/service/impl/SceneOrigBdServiceImpl.java
  25. 0 239
      src/main/resources/logback-nacos.xml
  26. 5 0
      src/main/resources/mapper/contro/SceneFilenameMapper.xml
  27. 5 0
      src/main/resources/mapper/contro/SceneOrigBdMapper.xml

+ 8 - 0
pom.xml

@@ -189,6 +189,14 @@
       <version>1.5.19</version>
     </dependency>
 
+    <!-- NSQ - JavaNSQClient -->
+    <dependency>
+      <groupId>com.github.brainlag</groupId>
+      <artifactId>nsq-client</artifactId>
+      <version>1.0.0.RC4</version>
+    </dependency>
+
+
   </dependencies>
   <build>
     <finalName>${artifactId}</finalName>

+ 10 - 25
src/main/java/com/fdkankan/contro/controller/SceneFileController.java

@@ -1,47 +1,32 @@
 package com.fdkankan.contro.controller;
 
 import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.core.util.ZipUtil;
 import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.fdkankan.common.constant.ErrorCode;
-import com.fdkankan.common.exception.BusinessException;
-import com.fdkankan.common.util.FileUtils;
-import com.fdkankan.contro.bean.SendCallAlgorithmDetail;
-import com.fdkankan.contro.entity.User;
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.contro.bean.SendCallAlgorithmDetail;
 import com.fdkankan.contro.service.IAppCameraFailLogService;
 import com.fdkankan.contro.service.ISceneFileBuildService;
 import com.fdkankan.contro.service.ISceneUploadCountService;
 import com.fdkankan.contro.vo.ReportFailLogVO;
 import com.fdkankan.contro.vo.ResponseSceneFile;
-import com.fdkankan.contro.vo.SendCallAlgorithmParam;
-import com.fdkankan.fyun.face.FYunFileServiceInterface;
-import com.fdkankan.model.constants.ConstantFilePath;
 import com.fdkankan.contro.vo.SceneUploadCountParamVO;
+import com.fdkankan.contro.vo.SendCallAlgorithmParam;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.web.response.ResultData;
 import lombok.extern.log4j.Log4j2;
-import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.bind.annotation.*;
 
-import java.io.File;
 import javax.validation.Valid;
+import java.io.File;
 import java.io.IOException;
-import java.util.Date;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -227,13 +212,13 @@ public class SceneFileController{
         return sceneFileBuildService.uploadFile(param);
     }
 
-    @PostMapping("/noticeBuild")
-    public ResultData noticeBuild(SendCallAlgorithmDetail detail) throws Exception {
-        if(StrUtil.isEmpty(detail.getUuid())){
-            throw new RuntimeException("uuid不能为空");
-        }
-        return sceneFileBuildService.noticeBuild(detail.getUuid());
-    }
+//    @PostMapping("/noticeBuild")
+//    public ResultData noticeBuild(SendCallAlgorithmDetail detail) throws Exception {
+//        if(StrUtil.isEmpty(detail.getUuid())){
+//            throw new RuntimeException("uuid不能为空");
+//        }
+//        return sceneFileBuildService.noticeBuild(detail.getUuid(), null);
+//    }
 
     @PostMapping("/send_bd")
     public ResultData noticeBuildBd(String ossHost, String uuid, String dir) throws Exception {

+ 21 - 0
src/main/java/com/fdkankan/contro/controller/SceneFilenameController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.contro.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2025-05-07
+ */
+@RestController
+@RequestMapping("/contro/sceneFilename")
+public class SceneFilenameController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/contro/controller/SceneOrigBdController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.contro.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2025-05-07
+ */
+@RestController
+@RequestMapping("/contro/sceneOrigBd")
+public class SceneOrigBdController {
+
+}
+

+ 55 - 0
src/main/java/com/fdkankan/contro/entity/SceneFilename.java

@@ -0,0 +1,55 @@
+package com.fdkankan.contro.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2025-05-07
+ */
+@Getter
+@Setter
+@TableName("t_scene_filename")
+public class SceneFilename implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 文件名
+     */
+    @TableField("filename")
+    private String filename;
+
+    /**
+     * unicode
+     */
+    @TableField("unicode")
+    private String unicode;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+
+}

+ 114 - 0
src/main/java/com/fdkankan/contro/entity/SceneOrigBd.java

@@ -0,0 +1,114 @@
+package com.fdkankan.contro.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2025-05-07
+ */
+@Getter
+@Setter
+@TableName("t_scene_orig_bd")
+public class SceneOrigBd implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 原始资源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("location")
+    private String location;
+
+    /**
+     * 纬度
+     */
+    @TableField("latitude")
+    private String latitude;
+
+    /**
+     * 维度
+     */
+    @TableField("longitude")
+    private String longitude;
+
+    /**
+     * 姓名
+     */
+    @TableField("user_xm")
+    private String userXm;
+
+    /**
+     * unicode
+     */
+    @TableField("unicode")
+    private String unicode;
+
+    /**
+     * 处理状态(-1-处理失败,0-等待中,1-成功推送计算)
+     */
+    @TableField("status")
+    private Integer status;
+
+    @TableField("reason")
+    private String reason;
+
+    /**
+     * 删除状态
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 2 - 2
src/main/java/com/fdkankan/contro/generate/AutoGenerate.java

@@ -17,7 +17,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir");
 
         generate(path,"contro", getTables(new String[]{
-                "t_orig_file_upload_batch", "t_orig_file_upload"
+                "t_scene_filename",
         }));
 
 //        generate(path,"goods", getTables(new String[]{
@@ -45,7 +45,7 @@ public class AutoGenerate {
 
 
     public static void  generate(String path,String moduleName,  List<String> tables){
-        FastAutoGenerator.create("jdbc:mysql://192.168.0.25:3306/4dkankan_v4",
+        FastAutoGenerator.create("jdbc:mysql://192.168.0.25:3306/4dkankan_mj",
             "root","4dkk2023cuikuan%")
                 .globalConfig(builder -> {
                     builder.author("")               //作者

+ 30 - 0
src/main/java/com/fdkankan/contro/httpclient/MjHttpClient.java

@@ -0,0 +1,30 @@
+package com.fdkankan.contro.httpclient;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.annotation.Address;
+import com.dtflys.forest.annotation.JSONBody;
+import com.dtflys.forest.annotation.Post;
+import com.fdkankan.contro.common.Result;
+import com.fdkankan.contro.httpclient.address.MjAddressSource;
+
+
+/**
+ * 获取新闻公告
+ */
+@Address(source = MjAddressSource.class)
+public interface MjHttpClient {
+
+
+    /**
+     * 分页查询内容发布
+     */
+    @Post("/wzapi/distributeDetail/notify")
+    Result notify(@JSONBody JSONObject param);
+
+
+    /**
+     *根据ID查询内容发布信息
+     */
+    @Post("/wzapi/distributeDetail/done")
+    Result done(@JSONBody JSONObject param);
+}

+ 26 - 0
src/main/java/com/fdkankan/contro/httpclient/address/MjAddressSource.java

@@ -0,0 +1,26 @@
+package com.fdkankan.contro.httpclient.address;
+
+import com.dtflys.forest.callback.AddressSource;
+import com.dtflys.forest.http.ForestAddress;
+import com.dtflys.forest.http.ForestRequest;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MjAddressSource implements AddressSource {
+
+    @Value("bd.api.scheme:http")
+    private String scheme;
+
+    @Value("bd.api.host")
+    private String host;
+
+    @Value("bd.api.port:#{null}")
+    private Integer port;
+
+
+    @Override
+    public ForestAddress getAddress(ForestRequest forestRequest) {
+        return new ForestAddress(scheme,host,port,"");
+    }
+}

+ 18 - 0
src/main/java/com/fdkankan/contro/mapper/ISceneFilenameMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.contro.mapper;
+
+import com.fdkankan.contro.entity.SceneFilename;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2025-05-07
+ */
+@Mapper
+public interface ISceneFilenameMapper extends BaseMapper<SceneFilename> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/contro/mapper/ISceneOrigBdMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.contro.mapper;
+
+import com.fdkankan.contro.entity.SceneOrigBd;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2025-05-07
+ */
+@Mapper
+public interface ISceneOrigBdMapper extends BaseMapper<SceneOrigBd> {
+
+}

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

@@ -0,0 +1,37 @@
+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}")
+    private String nsqHost;
+
+    @Value("${nsq.lookup.port}")
+    private Integer nsqLookupPort;
+
+    @Value("${nsq.topic}")
+    private String nsqTopic;
+
+    @Value("${nsq.channel1}")
+    private String channel1;
+
+    @Autowired
+    private NsqMesgDeal nsqMesgDeal;
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        NSQLookup lookup = new DefaultNSQLookup();
+        lookup.addLookupAddress(nsqHost, nsqLookupPort);
+        NSQConsumer consumer = new NSQConsumer(lookup, nsqTopic, channel1, nsqMesgDeal);
+        consumer.start();
+    }
+}

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

@@ -0,0 +1,88 @@
+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);
+        Result<SceneOrigBd> content = JSON.parseObject(msg, Result.class);
+        SceneOrigBd data = content.getData();
+        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);
+    }
+}

+ 0 - 99
src/main/java/com/fdkankan/contro/mq/service/impl/BuildSceneServiceImpl.java

@@ -152,17 +152,7 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
     public void buildScenePre(BuildSceneCallMessage message) throws Exception{
         boolean success = false;
         String num = message.getSceneNum();
-        String batchId = (String) message.getExt().get("batchId");
-        String threeCamType = (String) message.getExt().get("threeCamType");
         try {
-
-            //如果场景原始资源上传批次id不为空,则需要下载批次文件上传到oss目录
-            if(StrUtil.isNotEmpty(threeCamType) && "yzl".equals(threeCamType)){
-                this.downloadOrigFile4Yzl(batchId, message.getPath());
-            }else{
-                this.downloadOrigFile(batchId, message.getPath());
-            }
-
             //重新计算时需要删除文件夹,否知使用缓存
             if(new File(message.getPath() + File.separator + "results").exists()){
                 FileUtils.deleteDirectory(message.getPath() + File.separator + "results");
@@ -186,10 +176,6 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
                 FileUtil.del(message.getPath() + "/extras");
             }
 
-//            //用户相机重新全量上传,需要解冻结
-//            sceneColdStorageService.unfreeze(num, "用户相机重新全量上传", message.getPath());
-
-            //根据相机类型,组装资源路径
             //下载资源到本地
             this.downLoadSource(message, message.getPath());
 
@@ -239,39 +225,13 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
                 ext.put("128G", 1);
             }
 
-            Map<String, Object> param = new HashMap<>();
-            try {
-                param.put("event_type", "排队中");
-                param.put("event_content", "排队中");
-                param.put("scene_num", num);
-                param.put("event_time", new Date());
-                param.put("ryid", scenePlusService.getRyIdByNum(num));
-                jmgaService.sendStatus(param);
-            }catch (Exception e){
-                log.info("推送事件失败,param:{}", param);
-            }
-
             mqProducer.sendByWorkQueue(queueModelingCall, message);
 
             log.info("场景计算资源准备结束,场景码:{}", message.getSceneNum());
 
         }catch (Exception e){
             log.error("场景计算前置处理出错,num"+num, e);
-//            buildSceneDTService.handBaseFail("场景计算资源准备异常!", message.getPath(), message.getSceneNum(), "计算控制服务器");
             this.sendFailToLaser(num);
-
-            Map<String, Object> param = new HashMap<>();
-            try {
-                param.put("event_type", "计算失败");
-                param.put("event_content", "计算资源准备失败");
-                param.put("scene_num", num);
-                param.put("event_time", new Date());
-                param.put("ryid", scenePlusService.getRyIdByNum(num));
-                jmgaService.sendStatus(param);
-            }catch (Exception ex){
-                log.info("推送事件失败,param:{}", param);
-            }
-
             throw e;
         }
     }
@@ -373,7 +333,6 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
     public void buildScenePost(BuildSceneResultMqMessage message) throws Exception {
         String sceneCode = message.getBuildContext().get("sceneNum").toString();
         String path = message.getPath();
-        String batchId = (String) message.getExt().get("batchId");
         try {
             // 上传计算日志
             //如果是重复计算,没有走到计算逻辑,不需要上传日志文件
@@ -385,13 +344,6 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
             JSONObject fdageData = getFdageData(path + File.separator + "capture" +File.separator+"data.fdage");
             String uuid = fdageData.getString("creator") + "_" + fdageData.getString("uuidtime");
 
-            OrigFileUploadBatch origFileUploadBatch = null;
-            if(StrUtil.isNotEmpty(batchId)){
-                OrigFileUploadBatch condition = new OrigFileUploadBatch();
-                condition.setBatchId(batchId);
-                origFileUploadBatch = origFileUploadBatchService.getByCondition(condition);
-            }
-
             if (!message.getBuildSuccess()) {
                 log.error("建模失败,修改状态为失败状态");
                 scenePlusService.update(new LambdaUpdateWrapper<ScenePlus>()
@@ -399,21 +351,7 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
                         .eq(ScenePlus::getNum, sceneCode));
 
                 this.sendFailToLaser(sceneCode);
-
                 redisUtil.set(String.format(RedisKey.SCENE_BUILD_FINISH_NUM, sceneCode), "-1");
-
-                Map<String, Object> param = new HashMap<>();
-                try {
-                    param.put("event_type", "计算失败");
-                    param.put("event_content", "算法报错");
-                    param.put("scene_num", sceneCode);
-                    param.put("event_time", new Date());
-                    param.put("ryid", scenePlusService.getRyIdByNum(sceneCode));
-                    jmgaService.sendStatus(param);
-                }catch (Exception e){
-                    log.info("推送事件失败,param:{}", param);
-                }
-
                 return;
             }
 
@@ -565,19 +503,12 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
             scenePlusService.updateById(scenePlus);
             scenePlusExtService.updateById(scenePlusExt);
 
-            if(Objects.nonNull(origFileUploadBatch)){
-                origFileUploadBatch.setStatus(3);
-                origFileUploadBatchService.updateById(origFileUploadBatch);
-            }
 
             //国际环境需要发邮件通知
             if("eur".equals(env)){
                 commonService.sendEmail(sceneCode);
             }
 
-            //拜城公安需求
-//            this.sendMqForBcgn(sceneCode);
-
             //推送ai识别平面图mq
             this.sendMqForAiPano(sceneCode);
 
@@ -585,41 +516,11 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
 
             log.info("场景计算结果处理结束,场景码:{}", sceneCode);
 
-            Map<String, Object> param = new HashMap<>();
-            try {
-                param.put("event_type", "计算成功");
-                param.put("event_content", "计算成功");
-                param.put("scene_num", sceneCode);
-                param.put("event_time", new Date());
-                param.put("ryid", scenePlusService.getRyIdByNum(sceneCode));
-                jmgaService.sendStatus(param);
-            }catch (Exception e){
-                log.info("推送事件失败,param:{}", param);
-            }
-
         }catch (Exception e){
             log.error("场景计算结果处理出错,num"+sceneCode, e);
 //            buildSceneDTService.handBaseFail("场景计算结果处理出错!", message.getPath(), sceneCode, "计算控制服务器");
             this.sendFailToLaser(sceneCode);
-
-            Map<String, Object> param = new HashMap<>();
-            try {
-                param.put("event_type", "计算失败");
-                param.put("event_content", "计算结果处理失败");
-                param.put("scene_num", sceneCode);
-                param.put("event_time", new Date());
-                param.put("ryid", scenePlusService.getRyIdByNum(sceneCode));
-                jmgaService.sendStatus(param);
-            }catch (Exception ex){
-                log.info("推送事件失败,param:{}", param);
-            }
-
             throw e;
-        } finally {
-            Map<String, Object> sceneStatusParam = new HashMap<>();
-            sceneStatusParam.put("num", sceneCode);
-            sceneStatusParam.put("status", message.getBuildSuccess() ? 1 : -1);
-//            commonService.sendUpdateSceneStatusMqToQueues(sceneStatusParam);
         }
     }
 

+ 13 - 0
src/main/java/com/fdkankan/contro/schedule/ScheduleJob.java

@@ -1,5 +1,6 @@
 package com.fdkankan.contro.schedule;
 
+import com.fdkankan.contro.service.MjService;
 import com.fdkankan.contro.service.IScene3dNumService;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -12,6 +13,8 @@ public class ScheduleJob {
 
     @Autowired
     private IScene3dNumService scene3dNumService;
+    @Autowired
+    private MjService gzZcdjzxService;
 
 
     /**
@@ -21,4 +24,14 @@ public class ScheduleJob {
     public void generateSceneNum() {
         scene3dNumService.generateSceneNumHandler();
     }
+
+    /**
+     * 每隔十分钟拉取一次压缩包
+     */
+    @Scheduled(fixedDelay = 5*60*1000, initialDelay = 1000)
+    public void bd() {
+        log.info("定时任务推送开始");
+        gzZcdjzxService.bd();
+        log.info("定时任务推送结束");
+    }
 }

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

@@ -5,11 +5,9 @@ import com.fdkankan.contro.entity.SceneFileBuild;
 import com.fdkankan.contro.vo.ResponseSceneFile;
 import com.fdkankan.contro.vo.SendCallAlgorithmParam;
 import com.fdkankan.web.response.ResultData;
-import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.util.Map;
 
 /**
  * <p>
@@ -37,5 +35,5 @@ public interface ISceneFileBuildService extends IService<SceneFileBuild> {
 
     ResultData uploadFile(SendCallAlgorithmParam param) throws Exception;
 
-    ResultData noticeBuild(String params) throws Exception;
+    ResultData noticeBuild(String params, String fileName, String dataSource) throws Exception;
 }

+ 16 - 0
src/main/java/com/fdkankan/contro/service/ISceneFilenameService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.contro.service;
+
+import com.fdkankan.contro.entity.SceneFilename;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2025-05-07
+ */
+public interface ISceneFilenameService extends IService<SceneFilename> {
+
+}

+ 19 - 0
src/main/java/com/fdkankan/contro/service/ISceneOrigBdService.java

@@ -0,0 +1,19 @@
+package com.fdkankan.contro.service;
+
+import com.fdkankan.contro.entity.SceneOrigBd;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2025-05-07
+ */
+public interface ISceneOrigBdService extends IService<SceneOrigBd> {
+
+    SceneOrigBd getEnableOne(String filename);
+
+
+}

+ 7 - 0
src/main/java/com/fdkankan/contro/service/MjService.java

@@ -0,0 +1,7 @@
+package com.fdkankan.contro.service;
+
+public interface MjService {
+
+    void bd();
+
+}

+ 0 - 5
src/main/java/com/fdkankan/contro/service/impl/JmgaServiceImpl.java

@@ -78,11 +78,6 @@ public class JmgaServiceImpl implements IJmgaService {
             fileList = fileList.stream().filter(v -> origFileList.stream().noneMatch(k -> k.getFileName().equals(v))).collect(Collectors.toList());
         }
 
-//        //查询oss文件目录是否存在
-//        String homePath = SceneUtil.getHomePath(dataSource);
-//        List<String> ossKeyList = fileServiceInterface.listRemoteFiles(homePath);
-//        fileList = fileList.stream().filter(v->ossKeyList.stream().noneMatch(k->FileUtil.getName(k).equals(v))).collect(Collectors.toList());
-//
         if(CollUtil.isNotEmpty(fileList)){
             String args = JSON.toJSONString(fileList);
             if(fileList.size() > 5){

+ 137 - 0
src/main/java/com/fdkankan/contro/service/impl/MjServiceImpl.java

@@ -0,0 +1,137 @@
+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 com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+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.service.*;
+import com.fdkankan.fyun.config.FYunFileConfig;
+import com.fdkankan.fyun.local.constant.LocalConstants;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.utils.SceneUtil;
+import com.fdkankan.web.util.RSAEncrypt;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Service
+public class MjServiceImpl implements MjService {
+
+    @Resource
+    private FYunFileConfig fYunFileConfig;
+    @Autowired
+    private ISceneFileBuildService sceneFileBuildService;
+    @Autowired
+    private ISceneOrigBdService sceneOrigBdService;
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private ISceneFilenameService sceneFilenameService;
+
+
+    @Override
+    public void bd() {
+
+        List<SceneOrigBd> list = sceneOrigBdService.list(new LambdaQueryWrapper<SceneOrigBd>().eq(SceneOrigBd::getStatus, CommonSuccessStatus.WAITING.code()));
+
+        if(CollUtil.isEmpty(list)){
+            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);
+                    }
+                }
+
+                //如果场景正在计算,跳过,等待下一次定时任务进入时在进行处理
+                if(Objects.nonNull(scenePlus) && scenePlus.getSceneStatus() == SceneStatus.wait.code()){
+                    continue;
+                }
+
+                String unzipCmd = "unzip -o -O GBK " + localPath + " -d " + zipDir;
+
+                CmdUtils.callLine(unzipCmd);
+
+                //解压后删除压缩包
+                FileUtil.del(localPath);
+
+                String dataFdagePath = zipDir + "data.fdage";
+                JSONObject dataFdageJson = JSON.parseObject(FileUtil.readUtf8String(dataFdagePath));
+
+                JSONObject camJson = dataFdageJson.getJSONObject("cam");
+                String snCode = camJson.getString("uuid");
+
+                SceneFileBuild sceneFileBuild = sceneFileBuildService.getOne(new LambdaQueryWrapper<SceneFileBuild>().eq(SceneFileBuild::getUnicode, unicode));
+                String fileId = null;
+                if(Objects.isNull(sceneFileBuild)){
+                    fileId = String.valueOf(new SnowflakeIdGenerator(0,0).nextId());
+                    sceneFileBuild = new SceneFileBuild();
+                    sceneFileBuild.setFileId(fileId);
+                    sceneFileBuild.setUnicode(unicode);
+                    sceneFileBuild.setChildName(snCode);
+                    sceneFileBuild.setCreateTime(new Date());
+                    sceneFileBuild.setRecStatus(RecStatus.VALID.code());
+                    sceneFileBuildService.save(sceneFileBuild);
+                }else{
+                    fileId = sceneFileBuild.getFileId();
+                }
+                String realDataSource =  ConstantFilePath.BUILD_MODEL_PATH + snCode + "/" + fileId + "/" + unicode;
+                String realOssHomePath = SceneUtil.getHomePath(realDataSource);
+                String realOssHomeAbsolutePath = LocalConstants.BASE_PATH + fYunFileConfig.getBucket() + "/" + realOssHomePath;
+                FileUtil.loopFiles(zipDir).stream().forEach(file -> {
+                    FileUtil.copy(file.getAbsolutePath(),  file.getAbsolutePath().replace(zipDir, realOssHomeAbsolutePath), true);
+                });
+
+                sceneFileBuildService.noticeBuild(unicode, filename);
+                v.setStatus(CommonSuccessStatus.SUCCESS.code());
+            } catch (Exception e) {
+                v.setStatus(CommonSuccessStatus.FAIL.code());
+            }
+            sceneOrigBdService.updateById(v);
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        String paramsStr = "90d95cdb5#1111#333#90d95cdb5_20250115175933#123";
+        byte[] res = RSAEncrypt.encrypt(RSAEncrypt.loadPublicKeyByStr(RSAEncrypt.loadPublicKeyByFile()),
+                paramsStr.getBytes(StandardCharsets.UTF_8));
+        System.out.println(new Base64().encodeToString(res));
+
+        byte[] res2 = RSAEncrypt.decrypt(RSAEncrypt.loadPrivateKeyByStr(RSAEncrypt.loadPrivateKeyByFile()),
+                new Base64().decode(new Base64().encodeToString(res)));
+        String restr = new String(res2, "UTF-8");
+        System.out.println(restr);
+
+
+    }
+}

+ 86 - 149
src/main/java/com/fdkankan/contro/service/impl/SceneFileBuildServiceImpl.java

@@ -3,6 +3,7 @@ package com.fdkankan.contro.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.lang.UUID;
 import cn.hutool.core.thread.ThreadUtil;
@@ -247,6 +248,10 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
     @Autowired
     private IJmgaService jmgaService;
 
+    @Autowired
+    private ISceneOrigBdService sceneOrigBdService;
+
+
     @Override
     public SceneFileBuild findByFileId(String fileId) {
 
@@ -923,6 +928,9 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
         }else {
             scenePlusExt.setSceneScheme(SceneScheme.BM.code());
         }
+        if(cameraType == 6){
+            scenePlusVO.setThreeCamType("yzl");
+        }
 
         //转台相机用4k图
         if(cameraType.longValue() == 13){
@@ -1587,7 +1595,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
                     icon = fYunFileConfig.getHost() + imgViewPath + fdageData.getString("icon");
                     log.info("上传icon成功....");
                 }
-                buildScenePost(dataSource, fdageData, "V3", cameraType, sceneNum, cameraEntity, detailEntity, rebuild, icon, user, customUserId, "zip");
+//                buildScenePost(dataSource, fdageData, "V3", cameraType, sceneNum, cameraEntity, detailEntity, rebuild, icon, user, customUserId, "zip");
 
                 scenePlus = scenePlusService.getScenePlusByNum(sceneNum);
                 fdkkLaserService.saveScene(scenePlus,fdageData,cameraEntity,user.getUserName(),rebuild == 1 ? true : false, scenePlus.getPayStatus());
@@ -1600,10 +1608,8 @@ 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 customUserId, String uploadType) throws Exception {
-        String localDataPath = String.format(ConstantFilePath.DATABUFFER_FORMAT, sceneNum);
+                                       String sceneNum, Camera camera, CameraDetail cameraDetail, int rebuild,String icon,User user) throws Exception {
         String imgViewPath = String.format(UploadFilePath.IMG_VIEW_PATH, sceneNum);
-        String dataViewPath = String.format(UploadFilePath.DATA_VIEW_PATH, sceneNum);
 
         JSONObject firmwareVersion = new JSONObject();
         if (!ObjectUtils.isEmpty(jsonObject.getString("camSoftwareVersion"))) {
@@ -1639,21 +1645,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
                 jsonObject.getInteger("scenetype"), jsonObject.getString("gps"), rebuild,
                 jsonObject.getInteger("resolution"), firmwareVersion.toString(), sceneUrl, buildType, cameraDetail.getCooperationUser());
 
-//        if (Objects.nonNull(scenePlusVO)) {
-//            JSONObject statusJson = new JSONObject();
-//            //临时将-2改成1,app还没完全更新
-//            statusJson.put("status", scenePlusVO.getSceneStatus() == -2 ? 1 : scenePlusVO.getSceneStatus());
-//            statusJson.put("webSite", scenePlusVO.getWebSite());
-//            statusJson.put("sceneNum", scenePlusVO.getNum());
-//            statusJson.put("thumb", scenePlusVO.getThumb());
-//            statusJson.put("payStatus", 0);
-//            statusJson.put("recStatus", 'A');
-//            FileUtils.writeFile(localDataPath + "status.json", statusJson.toString());
-//            fYunFileService.uploadFile(localDataPath + "status.json", dataViewPath + "status.json");
-//        }
-
-        BuildSceneCallMessage mqMessage = getBuildSceneMqMessage(sceneNum, cameraType, algorithm, jsonObject, buildType,
-                scenePlusVO.getDataSource());
+        BuildSceneCallMessage mqMessage = getBuildSceneMqMessage(sceneNum, cameraType, algorithm, jsonObject, buildType, scenePlusVO.getDataSource());
 
         if (cameraDetail.getCompanyId() != null) {
             Company company = companyService.getById(cameraDetail.getCompanyId());
@@ -1662,36 +1654,9 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             }
         }
         mqMessage.getExt().put("deleteExtras", true);
-        mqMessage.getExt().put("customUserId", customUserId);
         mqMessage.getExt().put("gps", jsonObject.getString("gps"));
         mqMessage.getExt().put("threeCamType", scenePlusVO.getThreeCamType());
 
-        if(uploadType.equals("single")){//场景上传模式(single-细小文件上传, zip-压缩包上传)
-            OrigFileUploadBatch condition = new OrigFileUploadBatch();
-            condition.setUuid(unicode);
-            condition.setStatus(0);
-            OrigFileUploadBatch origFileUploadBatch = origFileUploadBatchService.getByCondition(condition);
-            origFileUploadBatch.setStatus(1);
-            origFileUploadBatch.setMqContent(JSON.toJSONString(mqMessage));
-            origFileUploadBatch.setNoticeTimes(origFileUploadBatch.getNoticeTimes() + 1);
-            mqMessage.getExt().put("batchId", origFileUploadBatch.getBatchId());
-            mqMessage.getExt().put("noticeTimes", origFileUploadBatch.getNoticeTimes());
-            origFileUploadBatchService.updateById(origFileUploadBatch);
-            redisUtil.del("single:upload:uuid:" + unicode);
-        }
-
-        Map<String, Object> param = new HashMap<>();
-        try {
-            param.put("event_type", "上传完毕");
-            param.put("event_content", "上传完毕");
-            param.put("scene_num", sceneNum);
-            param.put("event_time", new Date());
-            param.put("ryid", scenePlusService.getRyIdByNum(sceneNum));
-            jmgaService.sendStatus(param);
-        }catch (Exception e){
-            log.info("推送事件失败,param:{}", param);
-        }
-
         rabbitMqProducer.sendByWorkQueue(queueModelingPre, mqMessage);
 
         return scenePlusVO;
@@ -2370,127 +2335,99 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
     }
 
     @Override
-    public ResultData noticeBuild(String uuid) throws Exception {
+    public ResultData noticeBuild(String uuid, String fileName, String dataSource) throws Exception {
         log.info("通知计算,uuid:{} " + uuid);
 
-        String[] uuidArr = uuid.split("_");
+        SceneOrigBd sceneOrigBd = sceneOrigBdService.getEnableOne(fileName);
 
-        String snCode = uuidArr[0];
+        try {
+            String[] uuidArr = uuid.split("_");
 
-        JSONObject fdageData = JSONObject.parseObject(FileUtils.readFile(sendCallAlgorithmPath.concat(uuid).concat("/data.fdage")));
-        int camType = fdageData.getJSONObject("cam").getIntValue("type");
-        String cameraInStoreUrl = fdServiceUrl + "/service/manage/inner/cameraInStore";
-        Map<String, Object> cameraInStoreParams = new HashMap<>();
-        cameraInStoreParams.put("cameraType", camType);
-        cameraInStoreParams.put("snCode", snCode);
-        ResultData post = myClient.post(cameraInStoreUrl, cameraInStoreParams);
-        log.info("---------cameraInStore result:{}-----------", post);
+            String snCode = uuidArr[0];
 
-        Long cameraType = 13L;//默认为看见相机
+            String homePath = SceneUtil.getHomePath(dataSource);
+            JSONObject fdageData = JSONObject.parseObject(fYunFileService.getFileContent(homePath + "data.fdage"));
+            int camType = fdageData.getJSONObject("cam").getIntValue("type");
 
-        Camera camera = cameraService.getBySnCode(snCode);
-        if(Objects.isNull(camera)){
-            throw new BusinessException(ErrorCode.CAMERA_BIND_NO_EXIST.code(), "相机未入库");
-        }
-        CameraDetail cameraDetail = cameraDetailService.getByCameraId(camera.getId());
-        if(Objects.isNull(cameraDetail)){
-            throw new BusinessException(ErrorCode.CAMERA_BIND_NO_EXIST.code(), "相机未入库");
-        }
-        camType = cameraDetail.getType();
-        if(camType == 10 || camType == 11){
-            cameraType = 14L;//深时或者深光
-        }else if(camType == 9){
-            cameraType = 13L;//看见
-        }else if(camType == 5){
-            cameraType = 6L;//圆周率
-        }else {
-            cameraType = 10L;//看看
-        }
-
-        String fileId = this.getFileId(snCode, uuid);
-        String subFolder = snCode.concat(File.separator).concat(fileId).concat(File.separator).concat(uuid);
-        String dataSource = ConstantFilePath.BUILD_MODEL_PATH.concat(subFolder);
-        log.info("dataSource 为:{}", dataSource);
-
-        JSONObject configJson = JSONObject.parseObject(FileUtils.readFile(sendCallAlgorithmPath.concat(uuid).concat("/config.json")));
-        String folderName = configJson.getString("id");
-        String customUserId = configJson.getString("customUserId");
-        String customUserName = configJson.getString("customUserName");
-        String customUserPwd = configJson.getString("customUserPwd");
-        if(StrUtil.isBlank(folderName) || StrUtil.isBlank(snCode)){
-            throw new RuntimeException("config.json 文件有误!");
-        }
+            //相机入库
+            String cameraInStoreUrl = fdServiceUrl + "/service/manage/inner/cameraInStore";
+            Map<String, Object> cameraInStoreParams = new HashMap<>();
+            cameraInStoreParams.put("cameraType", camType);
+            cameraInStoreParams.put("snCode", snCode);
+            ResultData post = myClient.post(cameraInStoreUrl, cameraInStoreParams);
+            log.info("---------cameraInStore result:{}-----------", post);
 
-        //校验文件是否完整
-        jmgaService.checkFileWhole(uuid, dataSource, fdageData);
+            Long cameraType = 13L;//默认为看见相机
 
-        //推送开始上传状态
+            Camera camera = cameraService.getBySnCode(snCode);
+            if(Objects.isNull(camera)){
+                throw new BusinessException(ErrorCode.CAMERA_BIND_NO_EXIST.code(), "相机未入库");
+            }
+            CameraDetail cameraDetail = cameraDetailService.getByCameraId(camera.getId());
+            if(Objects.isNull(cameraDetail)){
+                throw new BusinessException(ErrorCode.CAMERA_BIND_NO_EXIST.code(), "相机未入库");
+            }
+            camType = cameraDetail.getType();
+            if(camType == 10 || camType == 11){
+                cameraType = 14L;//深时或者深光
+            }else if(camType == 9){
+                cameraType = 13L;//看见
+            }else if(camType == 5){
+                cameraType = 6L;//圆周率
+            }else {
+                cameraType = 10L;//看看
+            }
 
-        //调注册用户接口
-        Map<String, Object> params = new HashMap<>();
-        params.put("ryId", customUserId);
-        params.put("ryNo", customUserName);
-//        params.put("nickName", customUserName);//去掉昵称,又燕海的接口进行判断
-        params.put("password", AesUtil.encryptCBC(customUserPwd, userPasswordKey, userPasswordIv, AesUtil.ALMODE_CBC_NOPADDING));
-        String url = fdServiceUrl.concat(URL_ADD_UCENTER_USER);
-        myClient.post(url, params);
-        JyUser jyUser = jyUserService.getByRyId(customUserId);
-        User user = userService.getById(jyUser.getUserId());
-        if(Objects.isNull(jyUser)){
-            throw new RuntimeException("注册用户失败");
-        }
+            //校验文件是否完整
+//        jmgaService.checkFileWhole(uuid, dataSource, fdageData);
+
+            //调注册用户接口
+            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));
+            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());
+            User user = userService.getById(jyUser.getUserId());
+            if(Objects.isNull(jyUser)){
+                throw new RuntimeException("注册用户失败");
+            }
 
-        String sceneNum = null;
+            String sceneNum = null;
 
-        int rebuild = 0;
-        ScenePlus scenePlus = scenePlusService.getByFileId(dataSource);
-        if (!ObjectUtils.isEmpty(scenePlus)) {
-            log.info("该场景资源已存在,执行补拍逻辑!");
-            rebuild = 1;
-            sceneNum = scenePlus.getNum();
-        }else{
-            sceneNum = scene3dNumService.generateSceneNum(cameraDetail.getType());
-        }
+            int rebuild = 0;
+            ScenePlus scenePlus = scenePlusService.getByFileId(dataSource);
+            if (!ObjectUtils.isEmpty(scenePlus)) {
+                log.info("该场景资源已存在,执行补拍逻辑!");
+                rebuild = 1;
+                sceneNum = scenePlus.getNum();
+            }else{
+                sceneNum = scene3dNumService.generateSceneNum(cameraDetail.getType());
+            }
 
-//        String imgViewPath = String.format(UploadFilePath.IMG_VIEW_PATH, sceneNum);
-//        if(fdageData.containsKey("icon") && StringUtils.isNotEmpty(fdageData.getString("icon"))){
-//            String ossPath = ConstantFilePath.OSS_PREFIX + dataSource.replace(ConstantFilePath.BUILD_MODEL_PATH, "")
-//                    .replace(ConstantFilePath.BUILD_MODEL_LASER_PATH, "");
-//            fYunFileService.copyFileInBucket(ossPath + File.separator + fdageData.getString("icon"),imgViewPath + fdageData.getString("icon"));
-//            icon = fYunFileConfig.getHost() + imgViewPath + fdageData.getString("icon");
-//            log.info("上传icon成功....");
-//        }
+            buildScenePost(dataSource, fdageData, "V3", cameraType, sceneNum, camera, cameraDetail, rebuild, "", user);
 
-        buildScenePost(dataSource, fdageData, "V3", cameraType, sceneNum, camera, cameraDetail, rebuild, "", user, customUserId, "single");
+            scenePlus = scenePlusService.getScenePlusByNum(sceneNum);
 
-        scenePlus = scenePlusService.getScenePlusByNum(sceneNum);
-        fdkkLaserService.saveScene(scenePlus,fdageData,camera,user.getUserName(),rebuild == 1 ? true : false, scenePlus.getPayStatus());
+            if(cameraType == 14){
+                fdkkLaserService.saveScene(scenePlus,fdageData,camera,user.getUserName(),rebuild == 1 ? true : false, scenePlus.getPayStatus());
+            }
+            sceneOrigBd.setStatus(CommonSuccessStatus.SUCCESS.code());
+        }catch (Exception e){
+            sceneOrigBd.setStatus(CommonSuccessStatus.FAIL.code());
+            sceneOrigBd.setReason(ExceptionUtil.stacktraceToString(e,5000));
+        }
+        sceneOrigBd.setUpdateTime(null);
+        sceneOrigBdService.updateById(sceneOrigBd);
 
         return ResultData.ok();
     }
 
-    public String getFileId(String snCode, String uuid) throws Exception {
-
-        // 检测是否有生成
-        String fileId = null;
-        SceneFileBuild sceneFileBuild = this.findByUnicode(uuid);
-        if(Objects.nonNull(sceneFileBuild)){
-            fileId = sceneFileBuild.getFileId();
-            return fileId;
-        }
-
-        fileId = new SnowflakeIdGenerator(0, 0).nextId() + "";
-        log.info("新场景,fileid:{}", fileId);
-
-        sceneFileBuild = new SceneFileBuild();
-        sceneFileBuild.setChildName(snCode);
-        sceneFileBuild.setFileId(fileId);
-        sceneFileBuild.setRecStatus("A");
-        sceneFileBuild.setUnicode(uuid);
-        sceneFileBuild.setCreateTime(new Date());
-        this.save(sceneFileBuild);
-
-        return fileId;
+    public String getFileId(String unicode) throws Exception {
+        return this.getOne(new LambdaQueryWrapper<SceneFileBuild>().eq(SceneFileBuild::getUnicode, unicode)).getFileId();
     }
 
 

+ 20 - 0
src/main/java/com/fdkankan/contro/service/impl/SceneFilenameServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.contro.service.impl;
+
+import com.fdkankan.contro.entity.SceneFilename;
+import com.fdkankan.contro.mapper.ISceneFilenameMapper;
+import com.fdkankan.contro.service.ISceneFilenameService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2025-05-07
+ */
+@Service
+public class SceneFilenameServiceImpl extends ServiceImpl<ISceneFilenameMapper, SceneFilename> implements ISceneFilenameService {
+
+}

+ 26 - 0
src/main/java/com/fdkankan/contro/service/impl/SceneOrigBdServiceImpl.java

@@ -0,0 +1,26 @@
+package com.fdkankan.contro.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.common.constant.CommonSuccessStatus;
+import com.fdkankan.contro.entity.SceneOrigBd;
+import com.fdkankan.contro.mapper.ISceneOrigBdMapper;
+import com.fdkankan.contro.service.ISceneOrigBdService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2025-05-07
+ */
+@Service
+public class SceneOrigBdServiceImpl extends ServiceImpl<ISceneOrigBdMapper, SceneOrigBd> implements ISceneOrigBdService {
+
+    @Override
+    public SceneOrigBd getEnableOne(String filename) {
+        return this.getOne(new LambdaQueryWrapper<SceneOrigBd>().eq(SceneOrigBd::getFilename, filename).eq(SceneOrigBd::getStatus, CommonSuccessStatus.WAITING.code()));
+    }
+}

+ 0 - 239
src/main/resources/logback-nacos.xml

@@ -1,239 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
-<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
-<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
-<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
-<configuration scan="true" scanPeriod="10 seconds">
-
-	<contextName>nacos</contextName>
-
-	<springProperty scope="context" name="LOG_PATH" source="logging.path"/>
-	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-	<property name="log.path" value="${LOG_PATH}/modeling-control/logs" />
-
-	<!-- 彩色日志 -->
-	<!-- 彩色日志依赖的渲染类 -->
-	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
-	<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
-	<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
-	<!-- 彩色日志格式 -->
-	<property name="CONSOLE_LOG_PATTERN"
-		value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
-
-	<!--输出到控制台 -->
-	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-		<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息 -->
-		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-			<level>info</level>
-		</filter>
-		<encoder>
-			<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
-			<!-- 设置字符集 -->
-			<charset>UTF-8</charset>
-		</encoder>
-	</appender>
-	<!--输出到文件 -->
-
-	<!-- 时间滚动输出 level为 DEBUG 日志 -->
-	<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<!-- 正在记录的日志文件的路径及文件名 -->
-		<file>${log.path}/log_debug.log</file>
-		<!--日志文件输出格式 -->
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-			<charset>UTF-8</charset> <!-- 设置字符集 -->
-		</encoder>
-		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
-		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-			<!-- 日志归档 -->
-			<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log
-			</fileNamePattern>
-			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-				<maxFileSize>100MB</maxFileSize>
-			</timeBasedFileNamingAndTriggeringPolicy>
-			<!--日志文件保留天数 -->
-			<maxHistory>15</maxHistory>
-		</rollingPolicy>
-		<!-- 此日志文件只记录debug级别的 -->
-		<filter class="ch.qos.logback.classic.filter.LevelFilter">
-			<level>debug</level>
-			<onMatch>ACCEPT</onMatch>
-			<onMismatch>DENY</onMismatch>
-		</filter>
-	</appender>
-
-	<appender name="ASYNC_DEBUG_FILE" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
-		<!--默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。-->
-		<discardingThreshold>0</discardingThreshold>
-		<!--queue配置最大容量为256个events。如果队列被填满,应用程序线程被阻止记录新的events,直到工作线程有机会来转发一个或多个events。
-		因此队列深度需要根据业务场景进行相应的测试,做出相应的更改,以达到较好的性能。-->
-		<queueSize>2048</queueSize>
-		<includeCallerData>false</includeCallerData>
-		<appender-ref ref="DEBUG_FILE"/>
-	</appender>
-
-	<!-- 时间滚动输出 level为 INFO 日志 -->
-	<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<!-- 正在记录的日志文件的路径及文件名 -->
-		<file>${log.path}/log_info.log</file>
-		<!--日志文件输出格式 -->
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-			<charset>UTF-8</charset>
-		</encoder>
-		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
-		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-			<!-- 每天日志归档路径以及格式 -->
-			<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log
-			</fileNamePattern>
-			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-				<maxFileSize>100MB</maxFileSize>
-			</timeBasedFileNamingAndTriggeringPolicy>
-			<!--日志文件保留天数 -->
-			<maxHistory>15</maxHistory>
-		</rollingPolicy>
-		<!-- 此日志文件只记录info级别的 -->
-		<filter class="ch.qos.logback.classic.filter.LevelFilter">
-			<level>info</level>
-			<onMatch>ACCEPT</onMatch>
-			<onMismatch>DENY</onMismatch>
-		</filter>
-	</appender>
-
-	<appender name="ASYNC_INFO_FILE" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
-		<!--默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。-->
-		<discardingThreshold>0</discardingThreshold>
-		<!--queue配置最大容量为256个events。如果队列被填满,应用程序线程被阻止记录新的events,直到工作线程有机会来转发一个或多个events。
-		因此队列深度需要根据业务场景进行相应的测试,做出相应的更改,以达到较好的性能。-->
-		<queueSize>2048</queueSize>
-		<includeCallerData>false</includeCallerData>
-		<appender-ref ref="INFO_FILE"/>
-	</appender>
-
-	<!-- 时间滚动输出 level为 WARN 日志 -->
-	<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<!-- 正在记录的日志文件的路径及文件名 -->
-		<file>${log.path}/log_warn.log</file>
-		<!--日志文件输出格式 -->
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
-		</encoder>
-		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
-		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-			<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log
-			</fileNamePattern>
-			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-				<maxFileSize>100MB</maxFileSize>
-			</timeBasedFileNamingAndTriggeringPolicy>
-			<!--日志文件保留天数 -->
-			<maxHistory>15</maxHistory>
-		</rollingPolicy>
-		<!-- 此日志文件只记录warn级别的 -->
-		<filter class="ch.qos.logback.classic.filter.LevelFilter">
-			<level>warn</level>
-			<onMatch>ACCEPT</onMatch>
-			<onMismatch>DENY</onMismatch>
-		</filter>
-	</appender>
-
-	<appender name="ASYNC_WARN_FILE" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
-		<!--默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。-->
-		<discardingThreshold>0</discardingThreshold>
-		<!--queue配置最大容量为256个events。如果队列被填满,应用程序线程被阻止记录新的events,直到工作线程有机会来转发一个或多个events。
-		因此队列深度需要根据业务场景进行相应的测试,做出相应的更改,以达到较好的性能。-->
-		<queueSize>2048</queueSize>
-		<includeCallerData>false</includeCallerData>
-		<appender-ref ref="WARN_FILE"/>
-	</appender>
-
-
-	<!-- 时间滚动输出 level为 ERROR 日志 -->
-	<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<!-- 正在记录的日志文件的路径及文件名 -->
-		<file>${log.path}/log_error.log</file>
-		<!--日志文件输出格式 -->
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
-		</encoder>
-		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
-		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-			<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log
-			</fileNamePattern>
-			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-				<maxFileSize>100MB</maxFileSize>
-			</timeBasedFileNamingAndTriggeringPolicy>
-			<!--日志文件保留天数 -->
-			<maxHistory>15</maxHistory>
-		</rollingPolicy>
-		<!-- 此日志文件只记录ERROR级别的 -->
-		<filter class="ch.qos.logback.classic.filter.LevelFilter">
-			<level>ERROR</level>
-			<onMatch>ACCEPT</onMatch>
-			<onMismatch>DENY</onMismatch>
-		</filter>
-	</appender>
-
-	<appender name="ASYNC_ERROR_FILE" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
-		<!--默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。-->
-		<discardingThreshold>0</discardingThreshold>
-		<!--queue配置最大容量为256个events。如果队列被填满,应用程序线程被阻止记录新的events,直到工作线程有机会来转发一个或多个events。
-		因此队列深度需要根据业务场景进行相应的测试,做出相应的更改,以达到较好的性能。-->
-		<queueSize>2048</queueSize>
-		<includeCallerData>false</includeCallerData>
-		<appender-ref ref="ERROR_FILE"/>
-	</appender>
-
-	<springProperty scope="context" name="logstash_dest" source="logstash.ipAndPort"/>
-	<!--	<springProperty scope="context" name="preIvkApp" source="logstash.preIvkApp"/>-->
-	<springProperty scope="context" name="application_name" source="spring.application.name"/>
-	<springProperty scope="context" name="profiles_active" source="spring.profiles.active"/>
-	<appender name="LOGSTASH-ERROR_FILE" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
-		<destination>${logstash_dest}</destination>
-		<keepAliveDuration>5 minutes</keepAliveDuration>
-		<!-- 日志输出编码 -->
-		<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
-			<providers>
-				<provider class="com.yomahub.tlog.logstash.logback.TLogLogstashLogbackProvider"/>
-				<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
-				<pattern>
-					<pattern>
-						{
-						"level": "%level",
-						"thread": "%thread",
-						"class": "%logger{40}",
-						"message": "%message",
-						"stack_trace": "%exception{10}",
-						"client_time": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
-						"preIvkApp":"${application_name}-${profiles_active}"
-						}
-					</pattern>
-				</pattern>
-			</providers>
-		</encoder>
-		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-			<level>ERROR</level>
-		</filter>
-	</appender>
-
-
-	<!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 以及指定<appender>。<logger>仅有一个name属性, 一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE,
-		DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。 addtivity:是否向上级logger传递打印信息。默认是true。 -->
-	<!--<logger name="org.springframework.web" level="info"/> -->
-	<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/> -->
-	<!-- 使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作: 第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息 第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别: -->
-	<!-- root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 不能设置为INHERITED或者同义词NULL。默认是DEBUG 可以包含零个或多个元素,标识这个appender将会添加到这个logger。 -->
-
-	<root level="info">
-		<appender-ref ref="CONSOLE" />
-		<appender-ref ref="ASYNC_DEBUG_FILE" />
-		<appender-ref ref="ASYNC_INFO_FILE" />
-		<appender-ref ref="ASYNC_WARN_FILE" />
-		<appender-ref ref="ASYNC_ERROR_FILE" />
-		<appender-ref ref="LOGSTASH-ERROR_FILE" />
-	</root>
-
-</configuration>
-
-

+ 5 - 0
src/main/resources/mapper/contro/SceneFilenameMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.contro.mapper.ISceneFilenameMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/contro/SceneOrigBdMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.contro.mapper.ISceneOrigBdMapper">
+
+</mapper>