BuildE57SceneServiceImpl.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package com.fdkankan.contro.mq.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.ZipUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.fdkankan.common.constant.CommonSuccessStatus;
  6. import com.fdkankan.contro.entity.ScenePlus;
  7. import com.fdkankan.contro.entity.ScenePlusExt;
  8. import com.fdkankan.contro.mq.service.IBuildSceneService;
  9. import com.fdkankan.contro.service.IBuildService;
  10. import com.fdkankan.contro.service.IScenePlusExtService;
  11. import com.fdkankan.contro.service.IScenePlusService;
  12. import com.fdkankan.fyun.config.FYunFileConfig;
  13. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  14. import com.fdkankan.model.constants.ConstantFilePath;
  15. import com.fdkankan.model.constants.UploadFilePath;
  16. import com.fdkankan.model.utils.CreateObjUtil;
  17. import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
  18. import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
  19. import com.fdkankan.rabbitmq.util.RabbitMqProducer;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.beans.factory.annotation.Value;
  23. import org.springframework.cloud.context.config.annotation.RefreshScope;
  24. import org.springframework.stereotype.Service;
  25. import javax.annotation.Resource;
  26. import java.io.File;
  27. import java.util.HashMap;
  28. import java.util.List;
  29. import java.util.Map;
  30. /**
  31. * <p>
  32. * TODO
  33. * </p>
  34. *
  35. * @author dengsixing
  36. * @since 2022/4/20
  37. **/
  38. @Slf4j
  39. @Service
  40. @RefreshScope
  41. public class BuildE57SceneServiceImpl implements IBuildSceneService {
  42. public static final String logUrlFormat = "**algorithm-log**: [%sbuild_log/%s/e57/console.log](%sbuild_log/%s/e57/console.log)";
  43. @Value("${queue.modeling.e57.modeling-post}")
  44. private String queueModelingPost;
  45. @Value("${model.type:#{null}}")
  46. private String modelType;
  47. @Value("${env:gn}")
  48. private String env;
  49. @Value("#{'${build.scene.post.not-delete-nas-nums:}'.split(',')}")
  50. private List<String> notDeleteNasNumList;
  51. @Value("${queue.application.laser.e57-modeling-done:e57-modeling-done}")
  52. private String queueE57ModelingDone;
  53. @Autowired
  54. private RabbitMqProducer mqProducer;
  55. @Resource
  56. private FYunFileServiceInterface fYunFileService;
  57. @Autowired
  58. private FYunFileConfig fYunFileConfig;
  59. @Autowired
  60. private IScenePlusService scenePlusService;
  61. @Autowired
  62. private IScenePlusExtService scenePlusExtService;
  63. @Autowired
  64. private IBuildService buildService;
  65. @Override
  66. public void buildScenePre(BuildSceneCallMessage message) throws Exception{
  67. String num = message.getSceneNum();
  68. try {
  69. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
  70. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  71. String dataSource = scenePlusExt.getDataSource();
  72. String path = dataSource + "_e57";
  73. message.setPath(dataSource);
  74. //根据相机类型,组装资源路径
  75. //下载资源到本地
  76. this.downLoadSource(message, path);
  77. //发送mq,就进行计算
  78. message.setPath(path);
  79. message.setResultReceiverMqName(queueModelingPost);
  80. message.setBizType("e57");
  81. //写入算法参数文件
  82. Map<String, String> dataMap = new HashMap<>();
  83. dataMap.put("splitType", "SPLIT_V27");
  84. dataMap.put("skyboxType", "SKYBOX_V11");
  85. buildService.writeDataJson(message, null, dataMap, null);
  86. log.info("e57计算资源准备结束,场景码:{}", message.getSceneNum());
  87. }catch (Exception e){
  88. log.error("e57计算前置处理出错,num"+num, e);
  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. return;
  141. }
  142. //压缩e57
  143. String localPath = path + "/results/laserData/laser.e57";
  144. String zipPath = path + "/results/laserData/laser-e57.zip";
  145. String ossKey = String.format(ossKeyFormat, num, num);
  146. ZipUtil.zip(localPath, zipPath);
  147. fYunFileService.uploadFileByCommand(bucket,zipPath, ossKey);
  148. //发送mq通知激光系统
  149. laserMqContent.put("status", CommonSuccessStatus.SUCCESS.code());
  150. mqProducer.sendByWorkQueue(queueE57ModelingDone, laserMqContent);
  151. if(CollUtil.isEmpty(notDeleteNasNumList) || !notDeleteNasNumList.contains(num)){
  152. CreateObjUtil.deleteFile(path.replace(ConstantFilePath.BUILD_MODEL_PATH, "/"));
  153. }
  154. log.info("e57场景计算结果处理结束,场景码:{}", num);
  155. }catch (Exception e){
  156. log.error("e57场景计算结果处理出错,num"+num, e);
  157. throw e;
  158. }
  159. }
  160. }