ScenePlusServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. package com.fdkankan.openApi.service.www.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.io.FileUtil;
  5. import com.alibaba.fastjson.JSON;
  6. import com.alibaba.fastjson.JSONArray;
  7. import com.alibaba.fastjson.JSONObject;
  8. import com.baomidou.dynamic.datasource.annotation.DS;
  9. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  10. import com.fdkankan.common.constant.*;
  11. import com.fdkankan.common.exception.BusinessException;
  12. import com.fdkankan.common.util.FileUtils;
  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.ComputerUtil;
  17. import com.fdkankan.model.utils.CreateObjUtil;
  18. import com.fdkankan.openApi.bean.www.SceneJsonBean;
  19. import com.fdkankan.openApi.entity.www.*;
  20. import com.fdkankan.openApi.mapper.www.IScenePlusMapper;
  21. import com.fdkankan.openApi.service.www.*;
  22. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  23. import com.fdkankan.openApi.vo.www.CreateFicTitiousSceneParamVO;
  24. import com.fdkankan.openApi.vo.www.SceneEditControlsVO;
  25. import com.fdkankan.redis.constant.RedisKey;
  26. import com.fdkankan.redis.util.RedisUtil;
  27. import com.fdkankan.web.response.ResultData;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.beans.factory.annotation.Value;
  30. import org.springframework.stereotype.Service;
  31. import java.io.File;
  32. import java.util.HashMap;
  33. import java.util.Map;
  34. import java.util.Objects;
  35. /**
  36. * <p>
  37. * 场景主表 服务实现类
  38. * </p>
  39. *
  40. * @author
  41. * @since 2023-02-15
  42. */
  43. @DS("www")
  44. @Service
  45. public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
  46. @Value("${main.url}")
  47. private String mainUrl;
  48. @Value("${scene.pro.new.url}")
  49. private String sceneUrl;
  50. @Autowired
  51. private FYunFileServiceInterface fYunFileService;
  52. @Autowired
  53. private ISceneEditInfoService sceneEditInfoService;
  54. @Autowired
  55. private IScenePlusExtService scenePlusExtService;
  56. @Autowired
  57. private ISceneEditInfoExtService sceneEditInfoExtService;
  58. @Autowired
  59. private ISceneEditControlsService sceneEditControlsService;
  60. @Autowired
  61. private RedisUtil redisUtil;
  62. @Override
  63. public ScenePlus getByNum(String num) {
  64. return this.getOne(new LambdaQueryWrapper<ScenePlus>().eq(ScenePlus::getNum, num));
  65. }
  66. @Override
  67. public ResultData createVirtualScene(CreateFicTitiousSceneParamVO param) throws Exception {
  68. this.buildScene4CreateVirtualScene(param);
  69. String website = this.updateScene4CreateVirtualScene(param);
  70. return ResultData.ok(website);
  71. }
  72. private void buildScene4CreateVirtualScene(CreateFicTitiousSceneParamVO param) throws Exception {
  73. String num = param.getNum();
  74. String objName = param.getObjName();
  75. String mtlName = param.getMtlName();
  76. String localImagePath = String.format(ConstantFilePath.SCENE_IMAGES_PATH_V4, num);
  77. String ossImagePath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
  78. String ossObjPath = ossImagePath + objName;
  79. if(!fYunFileService.fileExist(ossObjPath)){
  80. throw new BusinessException(ErrorCode.FAILURE_CODE_4001, objName);
  81. }
  82. String ossMtlPath = ossImagePath + mtlName;
  83. if(!fYunFileService.fileExist(ossMtlPath)){
  84. throw new BusinessException(ErrorCode.FAILURE_CODE_4001, mtlName);
  85. }
  86. String ossTexturePath = ossImagePath + "dacf7dfa24ae47fab8fcebfe4dc41ab9_50k_texture_jpg_high1/";
  87. // if(CollUtil.isEmpty(fYunFileService.listRemoteFiles(ossTexturePath))){
  88. // throw new BusinessException(ErrorCode.FAILURE_CODE_4001, "贴图");
  89. // }
  90. String ossVisionTxtPath = ossImagePath + "vision.txt";
  91. if(!fYunFileService.fileExist(ossVisionTxtPath)){
  92. throw new BusinessException(ErrorCode.FAILURE_CODE_4001, "vision.txt");
  93. }
  94. FileUtil.del(localImagePath + "/result/");
  95. FileUtil.del(localImagePath + "extras/");
  96. fYunFileService.downloadFile(ossObjPath, localImagePath + "extras/" + "mesh.obj");
  97. fYunFileService.downloadFile(ossMtlPath, localImagePath + "extras/" + mtlName);
  98. fYunFileService.downloadFileByCommand(localImagePath + "extras/", ossTexturePath);
  99. fYunFileService.downloadFile(ossVisionTxtPath, localImagePath + "vision.txt");
  100. //创建data.json
  101. JSONObject dataJson = new JSONObject();
  102. dataJson.put("obj2txt", true);
  103. dataJson.put("split_type", "SPLIT_V6");
  104. dataJson.put("data_describe", "double spherical");
  105. dataJson.put("skybox_type", "SKYBOX_V5");
  106. FileUtil.writeUtf8String(dataJson.toJSONString(), localImagePath + "data.json");
  107. //调用objToTxt算法
  108. CreateObjUtil.build3dModel(localImagePath, "");
  109. Thread.sleep(2000);
  110. String uploadJsonPath = localImagePath + "results/upload.json";
  111. boolean exist = ComputerUtil.checkComputeCompleted(uploadJsonPath, 3, 3000);
  112. if(!exist){
  113. throw new BusinessException(ErrorCode.FAILURE_CODE_5042);
  114. }
  115. String uploadData = FileUtils.readFile(uploadJsonPath);
  116. JSONObject uploadJson = null;
  117. JSONArray array = null;
  118. if(uploadData!=null) {
  119. uploadJson = JSONObject.parseObject(uploadData);
  120. array = uploadJson.getJSONArray("upload");
  121. }
  122. if(array == null){
  123. log.error("upload.json数据出错");
  124. throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
  125. }
  126. Map<String,String> map = new HashMap<String,String>();
  127. JSONObject fileJson = null;
  128. String fileName = "";
  129. for(int i = 0, len = array.size(); i < len; i++) {
  130. fileJson = array.getJSONObject(i);
  131. fileName = fileJson.getString("file");
  132. String filePath = localImagePath + "results/" + fileName;
  133. //文件不存在抛出异常
  134. if(!FileUtil.exist(filePath)){
  135. throw new BusinessException(ErrorCode.FAILURE_CODE_4002, filePath);
  136. }
  137. //tex文件夹
  138. if (fileJson.getIntValue("clazz") == 15) {
  139. map.put(filePath, ossImagePath + "dacf7dfa24ae47fab8fcebfe4dc41ab9_50k_texture_jpg_high1/" + fileName.replace("tex/", ""));
  140. continue;
  141. }
  142. }
  143. CreateObjUtil.convertTxtToDam(localImagePath + "results/" + "modeldata.txt", localImagePath + "results/" + "dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam");
  144. // CreateObjUtil.convertDamToLzma(imagesBuffer.toString() + File.separator + "results" +File.separator+ "dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam");
  145. // CreateObjUtil.convertTxtToDam(imagesBuffer.toString() + File.separator + "results" +File.separator+"modeldata.txt", imagesBuffer.toString() + File.separator + "results" + File.separator+ "dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam");
  146. // map.put(imagesBuffer.toString() + File.separator + "results" +File.separator+"dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam.lzma", "images/images"+param.getNum()+"/"+"dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam.lzma");
  147. map.put(localImagePath + "results/" + "dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam", ossImagePath + "dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam");
  148. FileUtils.deleteFile(localImagePath + "vision.modeldata");
  149. CreateObjUtil.convertTxtToVisionmodeldata(localImagePath + "vision.txt", localImagePath + "vision.modeldata");
  150. map.put(localImagePath + "vision.modeldata", ossImagePath + "vision.modeldata");
  151. fYunFileService.uploadMulFiles(map);
  152. }
  153. private String updateScene4CreateVirtualScene(CreateFicTitiousSceneParamVO param){
  154. ScenePlus scenePlus = this.getByNum(param.getNum());
  155. ScenePlusExt scenePlusExt = null;
  156. SceneEditInfo sceneEditInfo = null;
  157. SceneEditInfoExt sceneEditInfoExt = null;
  158. SceneEditControls sceneEditControls = null;
  159. if(Objects.nonNull(scenePlus)){
  160. scenePlusExt = scenePlusExtService.getByPlusId(scenePlus.getId());
  161. sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  162. sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
  163. sceneEditControls = sceneEditControlsService.getByEditInfoId(sceneEditInfo.getId());
  164. }else {
  165. scenePlus = new ScenePlus();
  166. scenePlusExt = new ScenePlusExt();
  167. sceneEditInfo = new SceneEditInfo();
  168. sceneEditInfoExt = new SceneEditInfoExt();
  169. sceneEditControls = new SceneEditControls();
  170. }
  171. scenePlus.setNum(param.getNum());
  172. scenePlus.setUserId(param.getUserId());
  173. scenePlus.setTitle("四维看看");
  174. scenePlus.setDescription("<p>四维看看 让空间讲故事</p>");
  175. scenePlus.setSceneStatus(SceneStatus.SUCCESS.code());
  176. scenePlus.setPayStatus(PayStatus.PAY.code());
  177. this.saveOrUpdate(scenePlus);
  178. scenePlusExt.setPlusId(scenePlus.getId());
  179. scenePlusExt.setWebSite(mainUrl + "/" + sceneUrl + param.getNum());
  180. scenePlusExt.setBuildType("V3");
  181. scenePlusExt.setSceneResolution(param.getSceneResolution());
  182. scenePlusExt.setSceneFrom(param.getSceneFrom());
  183. scenePlusExt.setSceneKind(param.getSceneKind());
  184. scenePlusExt.setModelKind(ModelKind.DAM.code());
  185. scenePlusExtService.saveOrUpdate(scenePlusExt);
  186. sceneEditInfo.setScenePlusId(scenePlus.getId());
  187. sceneEditInfo.setVersion(Objects.isNull(sceneEditInfo.getVersion()) ? 0 : sceneEditInfo.getVersion() + 1);
  188. sceneEditInfo.setTitle(scenePlus.getTitle());
  189. sceneEditInfo.setDescription(scenePlus.getDescription());
  190. sceneEditInfoService.saveOrUpdate(sceneEditInfo);
  191. sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
  192. sceneEditInfoExt.setScenePlusId(scenePlus.getId());
  193. sceneEditInfoExtService.saveOrUpdate(sceneEditInfoExt);
  194. sceneEditControls.setEditInfoId(sceneEditInfo.getId());
  195. sceneEditControlsService.saveOrUpdate(sceneEditControls);
  196. SceneJsonBean sceneJson = new SceneJsonBean();
  197. BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
  198. BeanUtil.copyProperties(sceneEditInfo, sceneJson);
  199. SceneEditControlsVO sceneEditControlsVO = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class);
  200. sceneJson.setControls(sceneEditControlsVO);
  201. sceneJson.setNum(param.getNum());
  202. sceneJson.setCreateTime(scenePlus.getCreateTime());
  203. sceneJson.setSceneResolution(scenePlusExt.getSceneResolution());
  204. sceneJson.setVersion(sceneEditInfo.getVersion());
  205. sceneJson.setImgVersion(sceneEditInfo.getImgVersion());
  206. sceneJson.setSceneFrom(scenePlusExt.getSceneFrom());
  207. sceneJson.setSceneKind(scenePlusExt.getSceneKind());
  208. sceneJson.setModelKind(scenePlusExt.getModelKind());
  209. sceneJson.setPayStatus(scenePlus.getPayStatus());
  210. String sceneJsonStr = JSON.toJSONString(sceneJson);
  211. //上传sceneJson文件
  212. fYunFileService.uploadFile(sceneJsonStr.getBytes(), String.format(UploadFilePath.DATA_VIEW_PATH, param.getNum()) + "scene.json");
  213. //scenejson写入缓存
  214. redisUtil.set(String.format(RedisKey.SCENE_JSON, param.getNum()), sceneJsonStr);
  215. return scenePlusExt.getWebSite();
  216. }
  217. public static void main(String[] args) {
  218. FileUtil.del("D:\\test4\\");
  219. }
  220. }