BuildE57SceneServiceImpl.java 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package com.fdkankan.contro.mq.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.io.FileUtil;
  4. import cn.hutool.core.util.ZipUtil;
  5. import com.alibaba.fastjson.JSON;
  6. import com.fdkankan.common.constant.CommonSuccessStatus;
  7. import com.fdkankan.contro.entity.ScenePlus;
  8. import com.fdkankan.contro.entity.ScenePlusExt;
  9. import com.fdkankan.contro.mq.service.IBuildSceneService;
  10. import com.fdkankan.contro.service.*;
  11. import com.fdkankan.fyun.config.FYunFileConfig;
  12. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  13. import com.fdkankan.model.constants.ConstantFilePath;
  14. import com.fdkankan.model.constants.UploadFilePath;
  15. import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
  16. import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
  17. import com.fdkankan.rabbitmq.util.RabbitMqProducer;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.beans.factory.annotation.Value;
  21. import org.springframework.cloud.context.config.annotation.RefreshScope;
  22. import org.springframework.stereotype.Service;
  23. import javax.annotation.Resource;
  24. import java.io.File;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;
  28. /**
  29. * <p>
  30. * TODO
  31. * </p>
  32. *
  33. * @author dengsixing
  34. * @since 2022/4/20
  35. **/
  36. @Slf4j
  37. @Service
  38. @RefreshScope
  39. public class BuildE57SceneServiceImpl implements IBuildSceneService {
  40. public static final String logUrlFormat = "**algorithm-log**: [%sbuild_log/%s/e57/console.log](%sbuild_log/%s/e57/console.log)";
  41. @Value("${queue.modeling.e57.modeling-post}")
  42. private String queueModelingPost;
  43. @Value("${model.type:#{null}}")
  44. private String modelType;
  45. @Value("${env:gn}")
  46. private String env;
  47. @Value("#{'${build.scene.post.not-delete-nas-nums:}'.split(',')}")
  48. private List<String> notDeleteNasNumList;
  49. @Value("${queue.application.laser.e57-modeling-done:e57-modeling-done}")
  50. private String queueE57ModelingDone;
  51. @Autowired
  52. private RabbitMqProducer mqProducer;
  53. @Resource
  54. private FYunFileServiceInterface fYunFileService;
  55. @Autowired
  56. private FYunFileConfig fYunFileConfig;
  57. @Autowired
  58. private IScenePlusService scenePlusService;
  59. @Autowired
  60. private IScenePlusExtService scenePlusExtService;
  61. @Autowired
  62. private IBuildSceneDTService buildSceneDTService;
  63. @Autowired
  64. private ICommonService commonService;
  65. @Autowired
  66. private ISceneColdStorageService sceneColdStorageService;
  67. @Autowired
  68. private IntermitSceneService intermitSceneService;
  69. @Override
  70. public void buildScenePre(BuildSceneCallMessage message) throws Exception{
  71. String num = message.getSceneNum();
  72. try {
  73. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
  74. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  75. String dataSource = scenePlusExt.getDataSource();
  76. String path = dataSource + "_e57";
  77. message.setPath(dataSource);
  78. //根据相机类型,组装资源路径
  79. //下载资源到本地
  80. this.downLoadSource(message, path);
  81. //发送mq,就进行计算
  82. message.setPath(path);
  83. message.setResultReceiverMqName(queueModelingPost);
  84. message.setBizType("e57");
  85. log.info("e57计算资源准备结束,场景码:{}", message.getSceneNum());
  86. }catch (Exception e){
  87. log.error("e57计算前置处理出错,num"+num, e);
  88. buildSceneDTService.handBaseFail("e57计算资源准备异常!", message.getPath(), message.getSceneNum(), "计算控制服务器");
  89. throw e;
  90. }
  91. }
  92. private String getOssPath(String path) {
  93. String ossPath = ConstantFilePath.OSS_PREFIX
  94. + path.replace(ConstantFilePath.BUILD_MODEL_PATH, "")
  95. .replace(ConstantFilePath.BUILD_MODEL_LASER_PATH, "");
  96. if (!ossPath.endsWith("/")) {
  97. ossPath = ossPath.concat("/");
  98. }
  99. return ossPath;
  100. }
  101. @Override
  102. public void downLoadSource(BuildSceneCallMessage buildSceneMqMessage,String path){
  103. String ossPath = getOssPath(buildSceneMqMessage.getPath());
  104. fYunFileService.downloadFileByCommand(path + "/capture", ossPath);
  105. //下载点位校准文件
  106. //上传点位校准相关文件(小)
  107. String localExtraPath = path + "/extras/vision_edit.txt";
  108. String ossExtras = String.format(UploadFilePath.scene_result_data_path, buildSceneMqMessage.getSceneNum()) + "extras";
  109. List<String> extras = fYunFileService.listRemoteFiles(ossExtras);
  110. log.info("key:{}, list:{}", ossExtras, JSON.toJSONString(extras));
  111. if(CollUtil.isNotEmpty(extras)){
  112. extras.parallelStream().forEach(key->{
  113. fYunFileService.downloadFile(key, localExtraPath);
  114. });
  115. }
  116. }
  117. @Override
  118. public void buildScenePost(BuildSceneResultMqMessage message) throws Exception {
  119. String num = message.getBuildContext().get("sceneNum").toString();
  120. String path = message.getPath();
  121. String bucket = (String)message.getExt().get("bucket");
  122. String bizId = (String)message.getExt().get("bizId");
  123. String ossKeyFormat = (String)message.getExt().get("ossKey");
  124. try {
  125. // 上传计算日志
  126. //如果是重复计算,没有走到计算逻辑,不需要上传日志文件
  127. log.info("开始上传计算日志");
  128. String buildLogPath = String.format(UploadFilePath.BUILD_LOG_PATH, num) + "e57/";
  129. fYunFileService.uploadFile(path + File.separator + "console.log", buildLogPath + "console.log");
  130. log.info("计算日志上传完成");
  131. Map<String, Object> laserMqContent = new HashMap<>();
  132. laserMqContent.put("num", num);
  133. laserMqContent.put("bizId", bizId);
  134. if (!message.getBuildSuccess()) {
  135. //发送mq通知激光系统
  136. laserMqContent.put("status", CommonSuccessStatus.FAIL.code());
  137. mqProducer.sendByWorkQueue(queueE57ModelingDone, laserMqContent);
  138. // 发送钉钉消息,计算失败
  139. String logUrl = String.format(logUrlFormat,fYunFileConfig.getHost(),num,fYunFileConfig.getHost(),num);
  140. buildSceneDTService.handModelFail("计算失败", message.getPath(), num, message.getHostName(), logUrl);
  141. return;
  142. }
  143. //压缩e57
  144. String localPath = path + "/results/laserData/laser.e57";
  145. String zipPath = path + "/results/laserData/laser-e57.zip";
  146. String ossKey = String.format(ossKeyFormat, num, num);
  147. ZipUtil.zip(localPath, zipPath);
  148. fYunFileService.uploadFileByCommand(bucket,zipPath, ossKey);
  149. //发送mq通知激光系统
  150. laserMqContent.put("status", CommonSuccessStatus.SUCCESS.code());
  151. mqProducer.sendByWorkQueue(queueE57ModelingDone, laserMqContent);
  152. try {
  153. FileUtil.del(path);
  154. }catch (Exception e){
  155. log.error("删除计算目录失败,path:{}", path);
  156. }
  157. log.info("e57场景计算结果处理结束,场景码:{}", num);
  158. }catch (Exception e){
  159. log.error("e57场景计算结果处理出错,num"+num, e);
  160. buildSceneDTService.handBaseFail("e57场景计算结果处理出错!", message.getPath(), num, "计算控制服务器");
  161. throw e;
  162. }
  163. }
  164. }