BoxModelServiceImpl.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package com.fdkankan.scene.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.img.ImgUtil;
  4. import cn.hutool.core.io.FileUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import com.alibaba.fastjson.JSON;
  7. import com.alibaba.fastjson.JSONArray;
  8. import com.alibaba.fastjson.JSONObject;
  9. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  10. import com.fdkankan.common.constant.ConstantFilePath;
  11. import com.fdkankan.common.constant.ErrorCode;
  12. import com.fdkankan.common.constant.FileBizType;
  13. import com.fdkankan.common.constant.OperationType;
  14. import com.fdkankan.common.constant.ServerCode;
  15. import com.fdkankan.common.constant.UploadFilePath;
  16. import com.fdkankan.common.exception.BusinessException;
  17. import com.fdkankan.common.response.ResultData;
  18. import com.fdkankan.common.util.FileUtils;
  19. import com.fdkankan.common.util.OBJToGLBUtil;
  20. import com.fdkankan.fyun.oss.UploadToOssUtil;
  21. import com.fdkankan.scene.bean.BoxModelBean;
  22. import com.fdkankan.scene.bean.BoxPhotoBean;
  23. import com.fdkankan.scene.entity.SceneEditInfo;
  24. import com.fdkankan.scene.entity.ScenePlus;
  25. import com.fdkankan.scene.service.IBoxModelService;
  26. import com.fdkankan.scene.service.ISceneEditInfoService;
  27. import com.fdkankan.scene.service.IScenePlusService;
  28. import com.fdkankan.scene.vo.BaseDataParamVO;
  29. import com.fdkankan.scene.vo.BaseJsonDataParamVO;
  30. import com.fdkankan.scene.vo.DeleteFileParamVO;
  31. import com.fdkankan.scene.vo.DeleteSidParamVO;
  32. import com.google.common.collect.Lists;
  33. import java.awt.image.BufferedImage;
  34. import java.io.File;
  35. import java.io.IOException;
  36. import java.util.ArrayList;
  37. import java.util.Arrays;
  38. import java.util.Calendar;
  39. import java.util.Comparator;
  40. import java.util.HashSet;
  41. import java.util.List;
  42. import java.util.Objects;
  43. import java.util.Set;
  44. import lombok.extern.slf4j.Slf4j;
  45. import org.springframework.beans.factory.annotation.Autowired;
  46. import org.springframework.stereotype.Service;
  47. import org.springframework.web.multipart.MultipartFile;
  48. /**
  49. * <p>
  50. * TODO
  51. * </p>
  52. *
  53. * @author dengsixing
  54. * @since 2022/10/19
  55. **/
  56. @Slf4j
  57. @Service
  58. public class BoxModelServiceImpl implements IBoxModelService {
  59. @Autowired
  60. private UploadToOssUtil uploadToOssUtil;
  61. @Autowired
  62. private IScenePlusService scenePlusService;
  63. @Autowired
  64. private ISceneEditInfoService sceneEditInfoService;
  65. @Override
  66. public ResultData uploadBoxModel(String num, String sid, MultipartFile file) throws Exception {
  67. if(!file.getOriginalFilename().endsWith(".zip")){
  68. throw new BusinessException(ErrorCode.FAILURE_CODE_7015);
  69. }
  70. if(!FileUtils.checkFileSizeIsLimit(file.getSize(), 5, "M")){
  71. throw new BusinessException(ErrorCode.FAILURE_CODE_7023, "5M");
  72. }
  73. String path = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "boxModel/" + sid + "/";
  74. String zipPath = path + file.getOriginalFilename();
  75. String srcPath = path + "data/";
  76. String glbPath = path + sid + ".glb";
  77. FileUtil.del(path);
  78. FileUtil.mkParentDirs(zipPath);
  79. file.transferTo(new File(zipPath));
  80. //解压
  81. FileUtils.decompress(zipPath, srcPath);
  82. //校验是否包含目录,如果包含目录提示错误
  83. File srcFile = new File(srcPath);
  84. Arrays.stream(srcFile.listFiles()).forEach(subFile->{
  85. if(subFile.isDirectory()){
  86. throw new BusinessException(ErrorCode.FAILURE_CODE_5065);
  87. }
  88. });
  89. //转glb
  90. OBJToGLBUtil.objToGlb(srcPath, glbPath);
  91. if(!FileUtil.exist(glbPath)){
  92. throw new BusinessException(ErrorCode.FAILURE_CODE_7013);
  93. }
  94. //上传glb
  95. uploadToOssUtil.upload(glbPath, String.format(UploadFilePath.USER_EDIT_PATH, num) + "boxModels/" + sid + ".glb");
  96. return ResultData.ok(sid + ".glb");
  97. }
  98. @Override
  99. public ResultData saveBoxModel(BaseJsonDataParamVO param) throws Exception {
  100. JSONObject data = param.getData();
  101. String sid = data.getString("sid");
  102. if(StrUtil.isEmpty(sid)){
  103. throw new BusinessException(ServerCode.PARAM_REQUIRED, sid);
  104. }
  105. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
  106. if(Objects.isNull(scenePlus))
  107. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  108. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  109. //生成boxVideos数据
  110. String boxPhotos = this.createBoxModels(param.getNum(), sid, data, sceneEditInfo, OperationType.ADDORUPDATE.code());
  111. //更新数据库
  112. this.updateBoxModels(sceneEditInfo, boxPhotos);
  113. return ResultData.ok();
  114. }
  115. @Override
  116. public ResultData deleteBoxModel(DeleteSidParamVO param) throws Exception {
  117. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
  118. if(Objects.isNull(scenePlus))
  119. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  120. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  121. //根据sid移除json
  122. String boxModels = this.createBoxModels(param.getNum(), param.getSid(), null, sceneEditInfo, OperationType.DELETE.code());
  123. //写数据库
  124. this.updateBoxModels(sceneEditInfo, boxModels);
  125. return ResultData.ok();
  126. }
  127. private void updateBoxModels(SceneEditInfo sceneEditInfo, String boxModels){
  128. sceneEditInfoService.update(new LambdaUpdateWrapper<SceneEditInfo>()
  129. .set(SceneEditInfo::getBoxModels, boxModels)
  130. .setSql("version = version + 1")
  131. .eq(SceneEditInfo::getId, sceneEditInfo.getId()));
  132. }
  133. private String createBoxModels(String num, String sid, JSONObject data, SceneEditInfo sceneEditInfo, int type) throws Exception{
  134. String boxModels = null;
  135. if(sceneEditInfo != null){
  136. boxModels = sceneEditInfo.getBoxModels();
  137. }
  138. JSONArray boxModelsJson = null;
  139. if (StrUtil.isNotEmpty(boxModels)) {
  140. boxModelsJson = JSONArray.parseArray(boxModels);
  141. }else {
  142. boxModelsJson = new JSONArray();
  143. }
  144. String result = null;
  145. //删除
  146. if(type == OperationType.DELETE.code()){
  147. Set<String> deleteFile = new HashSet<>();
  148. if(boxModelsJson.size() == 0)
  149. return null;
  150. for(int i=0;i<boxModelsJson.size();++i){
  151. JSONObject ele = boxModelsJson.getJSONObject(i);
  152. if(ele.getString("sid").equals(sid)){
  153. boxModelsJson.remove(i);
  154. deleteFile.add(String.format(UploadFilePath.USER_EDIT_PATH, num) + sid + ".glb");
  155. }
  156. }
  157. //删除资源文件
  158. if(CollUtil.isNotEmpty(deleteFile))
  159. deleteFile.stream().forEach(key -> {
  160. try {
  161. uploadToOssUtil.delete(key);
  162. } catch (IOException e) {
  163. log.warn("oss删除文件失败,key:{}", key);
  164. }
  165. });
  166. }else{
  167. //更新
  168. boolean exist = false;
  169. for(int i=0;i<boxModelsJson.size();++i){
  170. JSONObject ele = boxModelsJson.getJSONObject(i);
  171. if(ele.getString("sid").equals(sid)){
  172. data.put("createTime", ele.getLong("createTime"));
  173. boxModelsJson.set(i, data);
  174. exist = true;
  175. }
  176. }
  177. //新增
  178. if(!exist){
  179. data.put("createTime", Calendar.getInstance().getTimeInMillis());
  180. boxModelsJson.add(data);
  181. }
  182. }
  183. if(boxModelsJson.size() != 0){
  184. List<BoxModelBean> list = Lists.newArrayList();
  185. for (Object o : boxModelsJson) {
  186. JSONObject jsonObject = (JSONObject)o;
  187. list.add(BoxModelBean.builder().createTime(jsonObject.getLong("createTime")).boxModel(jsonObject).build());
  188. }
  189. //按创建时间倒叙排序
  190. list.sort(Comparator.comparingLong(BoxModelBean::getCreateTime).reversed());
  191. // list转JSONArray
  192. JSONArray array = new JSONArray();
  193. list.stream().forEach(bean->{
  194. array.add(bean.getBoxModel());
  195. });
  196. result = array.toJSONString();
  197. }
  198. return result;
  199. }
  200. }