IFdkkLaserServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. package com.fdkankan.contro.service.impl;
  2. import cn.hutool.core.io.FileUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.fdkankan.common.constant.CommonStatus;
  5. import com.fdkankan.common.constant.SceneStatus;
  6. import com.fdkankan.common.constant.SceneVersionType;
  7. import com.fdkankan.common.util.DateUtil;
  8. import com.fdkankan.common.util.FileUtils;
  9. import com.fdkankan.contro.bean.SyncLaserResultBean;
  10. import com.fdkankan.contro.entity.*;
  11. import com.fdkankan.contro.service.*;
  12. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  13. import com.fdkankan.rabbitmq.util.RabbitMqProducer;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.beans.factory.annotation.Value;
  17. import org.springframework.cloud.context.config.annotation.RefreshScope;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.util.ObjectUtils;
  20. import javax.annotation.Resource;
  21. import java.io.File;
  22. import java.io.IOException;
  23. import java.util.*;
  24. @Service
  25. @Slf4j
  26. @RefreshScope
  27. public class IFdkkLaserServiceImpl implements IFdkkLaserService {
  28. @Autowired
  29. private ISceneProService sceneProService;
  30. @Autowired
  31. private IScenePlusService scenePlusService;
  32. @Autowired
  33. private IScenePlusExtService scenePlusExtService;
  34. @Autowired
  35. private RabbitMqProducer rabbitMqProducer;
  36. @Value("${queue.application.laser.update-scene}")
  37. private String updateScene;
  38. @Value("${queue.application.laser.init-scene:laser-init-scene}")
  39. private String initScene;
  40. @Value("${queue.application.laser.update-build-status}")
  41. private String updateBuildStatus;
  42. @Value("${queue.application.laser.cloud-point-build}")
  43. private String cloudPointBuild;
  44. @Value("${4dkk.laserService.bucket}")
  45. private String bucket;
  46. @Value("${4dkk.laserService.cloud-point-fyun-path}")
  47. private String cloudPointFyunPath;
  48. @Autowired
  49. private IUserService userService;
  50. @Resource
  51. private FYunFileServiceInterface fYunFileService;
  52. public void syncBuildResult(SyncLaserResultBean laserResultBean) {
  53. log.info("激光转台相机构建结果 同步 请求 ");
  54. try {
  55. String num = laserResultBean.getNum();
  56. String dataSource = laserResultBean.getDataSource();
  57. Integer sceneStatus = laserResultBean.getSceneStatus();
  58. Date createTime = laserResultBean.getCreateTime();
  59. Integer shootCount = laserResultBean.getShootCount();
  60. Integer slamCount = laserResultBean.getSlamCount();
  61. Integer payStatus = laserResultBean.getPayStatus();
  62. Boolean mixture = laserResultBean.getMixture() == CommonStatus.NO.code().intValue() ? false : true;
  63. String version = SceneVersionType.V4.code();
  64. String jgPath = dataSource;
  65. //创建目录
  66. if (dataSource.lastIndexOf("/") != -1) {
  67. jgPath = jgPath + "_laserData";
  68. } else {
  69. jgPath = jgPath.substring(0, jgPath.length() - 1) + "_laserData";
  70. }
  71. FileUtils.createDir(jgPath + "/extras");
  72. log.info("生成 激光相机目录 " + jgPath);
  73. //生成data.json
  74. JSONObject jgDataJson = new JSONObject();
  75. jgDataJson.put("split_type", "SPLIT_V15");
  76. jgDataJson.put("skybox_type", "SKYBOX_V5");
  77. jgDataJson.put("extras", null);
  78. FileUtils.writeFile(jgPath + File.separator + "data.json", jgDataJson.toString());
  79. // result/mesh/mesh.obj --> jgPath/laserData/laser.obj
  80. log.info("开始拷贝obj文件");
  81. FileUtils.copyDirectiory(dataSource + "/results/mesh", jgPath + "/laserData/mesh");
  82. FileUtils.copyDirectiory(dataSource + "/results/laserData/cover", jgPath + "/extras");
  83. //删除旧的深度图
  84. if(FileUtil.exist( jgPath+"/laserData/depthmap/")){
  85. FileUtil.del(jgPath+"/laserData/depthmap/");
  86. }
  87. FileUtils.copyFile(dataSource + "/results/laserData", jgPath, true);
  88. // updateSceneStatus(scenePlus, scenePlusExt, jgPath + File.separator + "laserData",createTime, algorithmTime, scenePlusExt);
  89. Map<String, Object> params = new HashMap<>();
  90. params.put("sceneCode", num);
  91. params.put("status", sceneStatus);
  92. params.put("version",version);
  93. params.put("createTime", DateUtil.date2String(createTime, null));
  94. params.put("algorithmTime", DateUtil.date2String(Calendar.getInstance().getTime(), null));
  95. params.put("path", jgPath + File.separator + "laserData");
  96. params.put("shootCount", shootCount);
  97. params.put("slamCount", slamCount);
  98. params.put("payStatus", payStatus);
  99. params.put("mixture", mixture);
  100. rabbitMqProducer.sendByWorkQueue(updateScene, params);
  101. } catch (Exception e) {
  102. log.error("激光转台相机同步失败", e);
  103. }
  104. }
  105. @Override
  106. public void pushBuildStatusToLaserSystem(String projectNum, String laserObjFilePath, Integer buildObjStatus) {
  107. Map<String, Object> params = new HashMap<>();
  108. params.put("sceneCode", projectNum);
  109. params.put("objPath", laserObjFilePath);
  110. params.put("buildObjStatus", buildObjStatus);
  111. rabbitMqProducer.sendByWorkQueue(updateBuildStatus, params);
  112. }
  113. public void saveScene(ScenePlus scenePlus, JSONObject fdageJson, Camera cameraEntity, String phone, boolean rebuild, Integer payStatus) {
  114. Map<String, Object> params = new HashMap<>();
  115. params.put("childName", cameraEntity.getChildName());
  116. params.put("createTime", DateUtil.date2String(scenePlus.getCreateTime(), null));
  117. params.put("phone", phone);
  118. params.put("sceneCode", scenePlus.getNum());
  119. params.put("snCode", cameraEntity.getSnCode());
  120. params.put("status", scenePlus.getSceneStatus());
  121. if (!rebuild) {
  122. if(Objects.nonNull(fdageJson)){
  123. params.put("password", fdageJson.getString("pwd"));
  124. }
  125. } else {
  126. params.put("status", 4);
  127. }
  128. params.put("version",getSceneVersion(scenePlus.getNum()));
  129. params.put("title", scenePlus.getLaserTitle());
  130. params.put("userId", scenePlus.getUserId());
  131. params.put("sceneSource", scenePlus.getSceneSource());
  132. params.put("payStatus", scenePlus.getPayStatus());
  133. if(Objects.nonNull(fdageJson)){
  134. params.put("location", fdageJson.getInteger("location"));
  135. }
  136. params.put("payStatus", payStatus);
  137. rabbitMqProducer.sendByWorkQueue(initScene, params);
  138. }
  139. public void saveScene(ScenePro scenePro, String scenePassword, Camera cameraEntity, String phone, boolean rebuild, Integer payStatus) {
  140. Map<String, Object> params = new HashMap<>();
  141. params.put("childName", cameraEntity.getChildName());
  142. if(ObjectUtils.isEmpty(scenePro.getCreateTime())){
  143. scenePro.setCreateTime(new Date());
  144. }
  145. params.put("createTime", DateUtil.date2String(scenePro.getCreateTime(), null));
  146. params.put("phone", phone);
  147. params.put("sceneCode", scenePro.getNum());
  148. params.put("snCode", cameraEntity.getSnCode());
  149. params.put("status", scenePro.getStatus());
  150. if (!rebuild) {
  151. params.put("password", scenePassword);
  152. } else {
  153. params.put("status", 4);
  154. }
  155. params.put("version",getSceneVersion(scenePro.getNum()));
  156. params.put("title", scenePro.getSceneName());
  157. params.put("userId", scenePro.getUserId());
  158. params.put("payStatus", payStatus);
  159. rabbitMqProducer.sendByWorkQueue(initScene, params);
  160. }
  161. private String getSceneVersion(String num) {
  162. String version = "V3";
  163. ScenePro scenepro = sceneProService.getByNum(num);
  164. if (scenepro == null || scenepro.getIsUpgrade() == 1) {
  165. ScenePlus plus = scenePlusService.getScenePlusByNum(num);
  166. if (plus != null) {
  167. version = "V4";
  168. }
  169. }
  170. return version;
  171. }
  172. @Override
  173. public void cloudPointBuild(String sceneCode, String path) {
  174. log.info("开始同步点云编辑文件");
  175. // 删除旧的文件及目录
  176. try {
  177. fYunFileService.deleteFile(cloudPointFyunPath + "vision_edit.txt");
  178. fYunFileService.deleteFolder(cloudPointFyunPath + "uuidcloud");
  179. } catch (IOException e) {
  180. log.error("删除文件失败", e);
  181. e.printStackTrace();
  182. }
  183. // 上传点云编辑文件,并通知激光系统
  184. log.info("开始上传点云文件,bucket:{}", bucket);
  185. fYunFileService.uploadFile(bucket,path + "/results/laserData/vision_edit.txt", String.format(cloudPointFyunPath,sceneCode,sceneCode) + "vision_edit.txt");
  186. fYunFileService.uploadFileByCommand(bucket,path + "/results/laserData/uuidcloud", String.format(cloudPointFyunPath,sceneCode,sceneCode) + "uuidcloud");
  187. Map<String, Object> params = new HashMap<>();
  188. params.put("sceneNum", sceneCode);
  189. params.put("businessType", 0);
  190. rabbitMqProducer.sendByWorkQueue(cloudPointBuild, params);
  191. }
  192. public void sendE57ToLaser(ScenePlus scenePlus, ScenePlusExt scenePlusExt, String path) {
  193. User user = userService.getById(scenePlus.getUserId());
  194. Map<String, Object> params = new HashMap<>();
  195. params.put("createTime", DateUtil.date2String(scenePlus.getCreateTime(), null));
  196. params.put("phone", user.getUserName());
  197. params.put("sceneCode", scenePlus.getNum());
  198. params.put("status", -scenePlus.getSceneStatus());
  199. params.put("version",getSceneVersion(scenePlus.getNum()));
  200. params.put("title", scenePlus.getLaserTitle());
  201. params.put("userId", scenePlus.getUserId());
  202. params.put("dataSource", scenePlusExt.getDataSource());
  203. params.put("sceneSource", scenePlus.getSceneSource());
  204. params.put("location", scenePlusExt.getLocation());
  205. params.put("payStatus", scenePlus.getPayStatus());
  206. params.put("shootCount", scenePlusExt.getShootCount());
  207. params.put("path", path);
  208. Date algorithmTime = new Date();
  209. if(Objects.nonNull(scenePlusExt.getAlgorithmTime())){
  210. algorithmTime = scenePlusExt.getAlgorithmTime();
  211. }
  212. params.put("algorithmTime", DateUtil.date2String(algorithmTime, null));
  213. if(scenePlus.getSceneStatus() == SceneStatus.wait.code()){
  214. rabbitMqProducer.sendByWorkQueue("laser-e57-init-scene", params);
  215. }
  216. if(scenePlus.getSceneStatus() == SceneStatus.NO_DISPLAY.code() || scenePlus.getSceneStatus() == SceneStatus.FAILD.code()){
  217. rabbitMqProducer.sendByWorkQueue("laser-e57-update-scene", params);
  218. }
  219. }
  220. public void sendRebuildE57ToLaser(ScenePlus scenePlus, ScenePlusExt scenePlusExt) {
  221. User user = userService.getById(scenePlus.getUserId());
  222. Map<String, Object> params = new HashMap<>();
  223. params.put("sceneCode", scenePlus.getNum());
  224. params.put("status", SceneStatus.wait.code());
  225. params.put("dataSource", scenePlusExt.getDataSource());
  226. params.put("sceneSource", scenePlus.getSceneSource());
  227. rabbitMqProducer.sendByWorkQueue("laser-e57-update-scene", params);
  228. }
  229. public String syncBuildResult4E57(String dataSource) {
  230. log.info("激光转台相机构建结果 同步 请求 ");
  231. try {
  232. String jgPath = dataSource;
  233. //创建目录
  234. if (dataSource.lastIndexOf("/") != -1) {
  235. jgPath = jgPath + "_laserData";
  236. } else {
  237. jgPath = jgPath.substring(0, jgPath.length() - 1) + "_laserData";
  238. }
  239. FileUtils.createDir(jgPath + "/extras");
  240. log.info("生成 激光相机目录 " + jgPath);
  241. //生成data.json
  242. JSONObject jgDataJson = new JSONObject();
  243. jgDataJson.put("split_type", "SPLIT_V15");
  244. jgDataJson.put("skybox_type", "SKYBOX_V5");
  245. jgDataJson.put("extras", null);
  246. FileUtils.writeFile(jgPath + File.separator + "data.json", jgDataJson.toString());
  247. // result/mesh/mesh.obj --> jgPath/laserData/laser.obj
  248. log.info("开始拷贝obj文件");
  249. FileUtils.copyDirectiory(dataSource + "/results/mesh", jgPath + "/laserData/mesh");
  250. FileUtils.copyDirectiory(dataSource + "/results/laserData/cover", jgPath + "/extras");
  251. //删除旧的深度图
  252. if(FileUtil.exist( jgPath+"/laserData/depthmap/")){
  253. FileUtil.del(jgPath+"/laserData/depthmap/");
  254. }
  255. FileUtils.copyFile(dataSource + "/results/laserData", jgPath, true);
  256. return jgPath + "/laserData";
  257. } catch (Exception e) {
  258. log.error("激光转台相机同步失败", e);
  259. }
  260. return null;
  261. }
  262. }