SceneProServiceImpl.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package com.fdkankan.contro.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.fdkankan.common.constant.*;
  8. import com.fdkankan.common.exception.BusinessException;
  9. import com.fdkankan.contro.common.Result;
  10. import com.fdkankan.contro.entity.ScenePlus;
  11. import com.fdkankan.contro.entity.ScenePlusExt;
  12. import com.fdkankan.contro.entity.ScenePro;
  13. import com.fdkankan.contro.httpclient.LaserClient;
  14. import com.fdkankan.contro.mapper.ISceneProMapper;
  15. import com.fdkankan.contro.mapper.ISceneUpgradeMapper;
  16. import com.fdkankan.contro.service.IScenePlusExtService;
  17. import com.fdkankan.contro.service.IScenePlusService;
  18. import com.fdkankan.contro.service.ISceneProService;
  19. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  20. import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
  21. import com.fdkankan.rabbitmq.util.RabbitMqProducer;
  22. import lombok.extern.slf4j.Slf4j;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.beans.factory.annotation.Value;
  25. import org.springframework.http.HttpStatus;
  26. import org.springframework.stereotype.Service;
  27. import org.springframework.util.ObjectUtils;
  28. import javax.annotation.Resource;
  29. import java.util.List;
  30. import java.util.Objects;
  31. /**
  32. * <p>
  33. * pro场景表 服务实现类
  34. * </p>
  35. *
  36. * @author dengsixing
  37. * @since 2021-12-23
  38. */
  39. @Slf4j
  40. @Service
  41. public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
  42. private static final String GET_LASER_INIT_API = "/laser/init/@num@";
  43. @Value("${4dkk.laserService.basePath}")
  44. private String laserBasePath;
  45. @Value("${queue.modeling.obj.modeling-pre}")
  46. private String queueObjModelingPre;
  47. @Autowired
  48. private IScenePlusService scenePlusService;
  49. @Resource
  50. private FYunFileServiceInterface fYunFileService;
  51. @Resource
  52. private LaserClient laserClient;
  53. @Autowired
  54. private ISceneUpgradeMapper sceneUpgradeMapper;
  55. @Resource
  56. private RabbitMqProducer mqProducer;
  57. @Autowired
  58. private IScenePlusExtService scenePlusExtService;
  59. @Override
  60. public ScenePro getByNum(String num) {
  61. return this.getOne(new LambdaQueryWrapper<ScenePro>().eq(ScenePro::getNum, num));
  62. }
  63. @Override
  64. public Long sumUsedSpaceByCameraId(Long cameraId, String spaceTypeStr) {
  65. LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<ScenePro>()
  66. .eq(ScenePro::getCameraId, cameraId)
  67. .in(ScenePro::getStatus, SceneStatus.SUCCESS.code(), SceneStatus.NO_DISPLAY.code())
  68. .eq(ScenePro::getIsUpgrade, CommonStatus.NO.code());
  69. SpaceType spaceType = SpaceType.get(spaceTypeStr);
  70. switch (spaceType){
  71. case GB:
  72. wrapper.select(ScenePro::getSpace);
  73. List<ScenePro> list = this.list(wrapper);
  74. if(CollUtil.isEmpty(list)){
  75. return 0L;
  76. }
  77. return list.stream().mapToLong(pro -> {
  78. Long space = pro.getSpace();
  79. return Objects.isNull(space) ? 0L : space;
  80. }).sum();
  81. case SP:
  82. wrapper.eq(ScenePro::getPayStatus, PayStatus.PAY.code());
  83. return this.count(wrapper);
  84. }
  85. return 0L;
  86. }
  87. @Override
  88. public void generateObjFile(String num) {
  89. ScenePro sceneProEntity = this.getByNum(num);
  90. if(ObjectUtils.isEmpty(sceneProEntity) || sceneProEntity.getIsUpgrade() == 1){
  91. generatePlusObjFile(num);
  92. return;
  93. }
  94. if(sceneProEntity.getSceneSource() != 4 && sceneProEntity.getSceneSource() != 5){
  95. throw new BusinessException(ErrorCode.FAILURE_CODE_3003, "只能操作激光场景");
  96. }
  97. // 拷贝文件
  98. String path = sceneProEntity.getDataSource();
  99. String ossPath = path.replace("/mnt/data","home")+"/data.fdage";
  100. if(!fYunFileService.fileExist(ossPath)){
  101. throw new BusinessException(ErrorCode.FAILURE_CODE_3037);
  102. }
  103. // 获取最新的场景名称
  104. String url = laserBasePath + GET_LASER_INIT_API.replace("@num@", num);
  105. Result laserSceneByNum = laserClient.getSceneByNum(url);
  106. if(laserSceneByNum.getCode() != HttpStatus.OK.value()){
  107. throw new RuntimeException("获取激光转台场景失败!");
  108. }
  109. JSONObject sceneInfo = JSONObject.parseObject(JSONObject.toJSONString(laserSceneByNum.getData()));
  110. LambdaUpdateWrapper<ScenePro> updateWrapper = new LambdaUpdateWrapper<>();
  111. updateWrapper
  112. .set(ScenePro::getStatus, 0)
  113. .set(ScenePro::getIsObj, 1)
  114. .set(ScenePro::getIsUpgrade, 2) // 升级中
  115. .set(ScenePro::getSceneName, sceneInfo.getString("title"))
  116. .eq(ScenePro::getNum, sceneProEntity.getNum());
  117. this.update(updateWrapper);
  118. //同步到scenePlus、scenePlus
  119. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
  120. if(Objects.nonNull(scenePlus)){
  121. sceneUpgradeMapper.deleteScenePlus(num);
  122. sceneUpgradeMapper.deleteScenePlusExt(scenePlus.getId());
  123. }
  124. sceneUpgradeMapper.transferScenePlus(num);
  125. scenePlus = scenePlusService.getScenePlusByNum(num);
  126. String sceneKind = sceneProEntity.getSceneScheme() == 3 ? SceneKind.FACE.code():SceneKind.TILES.code();
  127. sceneUpgradeMapper.transferScenePlusExt(num, scenePlus.getId(), sceneKind);
  128. log.info("开始发送激光场景生成obj mq消息");
  129. // 发送MQ
  130. BuildSceneCallMessage mqMsg = new BuildSceneCallMessage();
  131. mqMsg.setSceneNum(sceneProEntity.getNum());
  132. mqMsg.setAlgorithm(sceneProEntity.getAlgorithm());
  133. mqMsg.setBuildType(sceneProEntity.getBuildType());
  134. mqMsg.setPath(sceneProEntity.getDataSource());
  135. mqProducer.sendByWorkQueue(queueObjModelingPre,mqMsg);
  136. }
  137. public void generatePlusObjFile(String num) {
  138. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
  139. if(ObjectUtils.isEmpty(scenePlus)){
  140. throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
  141. }
  142. if(scenePlus.getSceneSource() != 4 && scenePlus.getSceneSource() !=5){
  143. throw new BusinessException(ErrorCode.FAILURE_CODE_3003, "只能操作激光场景");
  144. }
  145. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  146. String ossPath = scenePlusExt.getDataSource().replace("/mnt/data","home")+"/data.fdage";
  147. if(!fYunFileService.fileExist(ossPath)){
  148. throw new BusinessException(ErrorCode.FAILURE_CODE_3037);
  149. }
  150. // 获取最新的场景名称
  151. String url = laserBasePath + GET_LASER_INIT_API.replace("@num@", num);
  152. Result laserSceneByNum = laserClient.getSceneByNum(url);
  153. if(laserSceneByNum.getCode() != HttpStatus.OK.value()){
  154. throw new RuntimeException("获取激光转台场景失败!");
  155. }
  156. JSONObject sceneInfo = JSONObject.parseObject(JSONObject.toJSONString(laserSceneByNum.getData()));
  157. LambdaUpdateWrapper<ScenePlus> updateWrapper = new LambdaUpdateWrapper<>();
  158. updateWrapper
  159. .set(ScenePlus::getSceneStatus, 0)
  160. .set(ScenePlus::getTitle, sceneInfo.getString("title"))
  161. .eq(ScenePlus::getNum, num);
  162. scenePlusService.update(updateWrapper);
  163. LambdaUpdateWrapper<ScenePlusExt> plusExtUpdateWrapper = new LambdaUpdateWrapper<>();
  164. plusExtUpdateWrapper
  165. .set(ScenePlusExt::getIsObj, 1)
  166. .eq(ScenePlusExt::getPlusId, scenePlus.getId());
  167. scenePlusExtService.update(plusExtUpdateWrapper);
  168. log.info("开始发送激光场景生成obj mq消息");
  169. // 发送MQ
  170. BuildSceneCallMessage mqMsg = new BuildSceneCallMessage();
  171. mqMsg.setSceneNum(num);
  172. mqMsg.setAlgorithm(scenePlusExt.getAlgorithm());
  173. mqMsg.setBuildType(scenePlusExt.getBuildType());
  174. mqMsg.setPath(scenePlusExt.getDataSource());
  175. mqProducer.sendByWorkQueue(queueObjModelingPre,mqMsg);
  176. }
  177. public JSONObject getSceneByNum(String num) {
  178. Result result = laserClient.getSceneByNum(num);
  179. if(result.getCode() != HttpStatus.OK.value()){
  180. log.error("获取激光转台场景失败!");
  181. return null;
  182. }
  183. return JSONObject.parseObject(JSONObject.toJSONString(result.getData()));
  184. }
  185. }