ModelServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. package com.fdkankan.fusion.service.impl;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.UUID;
  6. import java.util.stream.Collectors;
  7. import cn.hutool.core.io.FileUtil;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  10. import com.fdkankan.fusion.common.PageInfo;
  11. import com.fdkankan.fusion.common.util.*;
  12. import com.fdkankan.fusion.common.FilePath;
  13. import com.fdkankan.fusion.common.ResultCode;
  14. import com.fdkankan.fusion.entity.*;
  15. import com.fdkankan.fusion.exception.BusinessException;
  16. import com.fdkankan.fusion.mapper.IModelMapper;
  17. import com.fdkankan.fusion.request.ModelPram;
  18. import com.fdkankan.fusion.response.SceneVo;
  19. import com.fdkankan.fusion.service.ICaseNumService;
  20. import com.fdkankan.fusion.service.ICaseService;
  21. import com.fdkankan.fusion.service.IFusionNumService;
  22. import com.fdkankan.fusion.service.IModelService;
  23. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  24. import com.fdkankan.redis.util.RedisUtil;
  25. import org.apache.commons.lang3.StringUtils;
  26. import org.springframework.beans.BeanUtils;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.beans.factory.annotation.Value;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.web.multipart.MultipartFile;
  31. /**
  32. * <p>
  33. * 服务实现类
  34. * </p>
  35. *
  36. * @author
  37. * @since 2022-08-03
  38. */
  39. @Service
  40. public class ModelServiceImpl extends ServiceImpl<IModelMapper, Model> implements IModelService {
  41. @Autowired
  42. UploadToOssUtil uploadToOssUtil;
  43. @Autowired
  44. UploadService uploadService;
  45. @Autowired
  46. ICaseNumService caseNumService;
  47. @Autowired
  48. ICaseService caseService;
  49. @Autowired
  50. IFusionNumService fusionNumService;
  51. @Autowired
  52. RedisUtil redisUtil;
  53. @Value("${local.obj_path}")
  54. private String OBJ_PATH;
  55. @Value("${local.glb_path}")
  56. private String GLB_PATH;
  57. @Value("${upload.query-path}")
  58. private String queryPath;
  59. @Override
  60. public Model uploadObj(MultipartFile file, String username) throws Exception {
  61. if(file.isEmpty()){
  62. throw new BusinessException(ResultCode.UPLOAD_FILE_NO_EXIST);
  63. }
  64. if(file.getSize()>10 * 1024 * 1024 * 100){
  65. throw new BusinessException(ResultCode.UPLOAD_FILE_TO_LONG);
  66. }
  67. //获取文件名
  68. String fileName = file.getOriginalFilename();
  69. if(StringUtils.isEmpty(fileName)){
  70. throw new BusinessException(ResultCode.UPLOAD_FILE_NO_EXIST);
  71. }
  72. if(com.fdkankan.fusion.common.util.StringUtils.isChinese(fileName)){
  73. throw new BusinessException(ResultCode.UPLOAD_FILE_CHINA_NAME);
  74. }
  75. if(fileName.length() >50){
  76. throw new BusinessException(ResultCode.UPLOAD_FILE_NAME_TO_LONG);
  77. }
  78. if(!fileName.toLowerCase().endsWith(".zip")){
  79. throw new BusinessException(ResultCode.UPLOAD_FILE_TYPE_ERROR);
  80. }
  81. //获取文件后缀名
  82. String modelName = fileName.substring(0,fileName.lastIndexOf("."));
  83. Model model = new Model();
  84. model.setModelTitle(modelName);
  85. model.setModelSize(FileWriterUtil.setFileSize(file.getSize()));
  86. model.setUserName(username);
  87. this.save(model);
  88. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),"0");
  89. fileName = UUID.randomUUID().toString().replace("-","") +".zip";
  90. File newObjFile = null;
  91. File objPathFile = null;
  92. String objPath = String.format(OBJ_PATH , "modelId_"+model.getModelId()) ;
  93. newObjFile = new File(objPath +"/" + fileName);
  94. if(!newObjFile.getParentFile().exists()){
  95. newObjFile.mkdirs();
  96. }
  97. file.transferTo(newObjFile);
  98. if(fileName.toLowerCase().endsWith(".zip")){
  99. ShellUtil.unZip(newObjFile.getPath(),objPath);
  100. }
  101. objPathFile = new File(objPath );
  102. if(!objPathFile.isDirectory()){
  103. setCreateStatus(model,-1);
  104. throw new BusinessException(ResultCode.UPLOAD_FILE_TYPE_ERROR);
  105. }
  106. List<File> fileList = new ArrayList<>();
  107. FileWriterUtil.getCanRunList(fileList,objPathFile);
  108. if(fileList.size() != 1){
  109. setCreateStatus(model,-1);
  110. throw new BusinessException(ResultCode.UPLOAD_FILE_MSG_ERROR);
  111. }
  112. File file1 = fileList.get(0);
  113. if(file1 == null){
  114. setCreateStatus(model,-1);
  115. throw new BusinessException(ResultCode.UPLOAD_FILE_OBJ_ERROR);
  116. }
  117. if(com.fdkankan.fusion.common.util.StringUtils.isChinese(file1.getName())){
  118. setCreateStatus(model,-1);
  119. throw new BusinessException(ResultCode.UPLOAD_FILE_CHINA_NAME);
  120. }
  121. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),"20");
  122. runThread(file1,objPath,model,newObjFile,objPathFile,this);
  123. return model;
  124. }
  125. private void setCreateStatus(Model model,Integer status){
  126. model.setCreateStatus(status);
  127. this.saveOrUpdate(model);
  128. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),status.toString());
  129. }
  130. private void runThread(File file1,String objPath,Model model,File newObjFile,File objPathFile,IModelService modelService){
  131. new Thread() {
  132. @Override
  133. public void run() {
  134. File mntFile = null;
  135. try {
  136. String glbOssPath = String.format(FilePath.GLB_OSS_PATH, model.getModelId());
  137. String name = file1.getName();
  138. if(name.contains("obj") || name.contains("OBJ")){
  139. glbOssPath = glbOssPath.replace("mesh.glb",file1.getName().replace("obj","glb"));
  140. model.setModelDateType("obj");
  141. model.setModelType("glb");
  142. OBJToGLBUtil.objToGlb(objPath,name, file1.getPath().replace("obj","glb"));
  143. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),"65");
  144. uploadToOssUtil.uploadOss(file1.getPath(),glbOssPath);
  145. }
  146. if(name.contains(".ply")){
  147. model.setModelDateType("ply");
  148. model.setModelType("ply");
  149. }
  150. if(name.contains(".las")){
  151. model.setModelDateType("las");
  152. model.setModelType("las");
  153. }
  154. if("las".equals(model.getModelType()) || "ply".equals(model.getModelType()) ){
  155. mntFile = OBJToGLBUtil.lasOrPlyToBin(file1);
  156. glbOssPath = mntFile.getPath().replace("/mnt/","")+"/webcloud";
  157. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),"65");
  158. uploadToOssUtil.uploadFileOss(mntFile );
  159. }
  160. model.setModelObjUrl(objPath);
  161. model.setModelGlbUrl(queryPath + glbOssPath);
  162. model.setCreateStatus(1); //上传成功
  163. modelService.saveOrUpdate(model);
  164. }catch (Exception e){
  165. model.setCreateStatus(-1);
  166. modelService.saveOrUpdate(model);
  167. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),"-1");
  168. }finally {
  169. if(newObjFile!=null){
  170. FileUtil.del(newObjFile);
  171. }
  172. if(objPathFile!=null){
  173. FileUtil.del(objPathFile);
  174. }
  175. if(mntFile!=null){
  176. FileUtil.del(mntFile.getParentFile());
  177. }
  178. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),"100");
  179. }
  180. }
  181. }.start();
  182. }
  183. @Override
  184. public PageInfo pageList(ModelPram param, String token) {
  185. String username = JwtUtil.getUsername(token);
  186. LambdaQueryWrapper<Model> wrapper = new LambdaQueryWrapper<>();
  187. wrapper.eq(Model::getUserName,username);
  188. wrapper.eq(Model::getType,3);
  189. if(param.getStatus()!=null){ //参数2为成功,数据库中成功为1
  190. wrapper.eq(Model::getCreateStatus,param.getStatus() == 2 ? 1 :param.getStatus());
  191. }
  192. if(StringUtils.isNotBlank(param.getModelTitle())){
  193. wrapper.like(Model::getModelTitle,param.getModelTitle());
  194. }
  195. wrapper.orderByDesc(Model::getCreateTime);
  196. Page<Model> page = this.page(new Page<>(param.getPageNum(),param.getPageSize()),wrapper);
  197. for (Model model : page.getRecords()) {
  198. if(model.getType() == 3 && StringUtils.isEmpty(model.getNum())) {
  199. model.setNum(model.getModelId().toString());
  200. }
  201. }
  202. return PageInfo.PageInfo(page);
  203. }
  204. @Override
  205. public void delete(Integer modelId) {
  206. List<CaseNumEntity> caseNumEntityList = caseNumService.getByNum(modelId.toString());
  207. List<FusionNum> fusionNumList = fusionNumService.getByNum(modelId.toString());
  208. if(caseNumEntityList.size() >0 || fusionNumList.size() >0){
  209. StringBuilder title = new StringBuilder();
  210. List<Integer> caseIdIds = caseNumEntityList.parallelStream().map(CaseNumEntity::getCaseId).collect(Collectors.toList());
  211. if(caseIdIds.size() >0){
  212. List<CaseEntity> list = caseService.getByIds(caseIdIds);
  213. List<String> collect = list.parallelStream().map(CaseEntity::getCaseTitle).collect(Collectors.toList());
  214. for (String str : collect) {
  215. title.append(str).append(",");
  216. }
  217. if(title.length()>0){
  218. title.delete(title.length()-1,title.length());
  219. }
  220. }
  221. throw new BusinessException(ResultCode.CASE_USE.code, String.format(ResultCode.CASE_USE.msg,title));
  222. }
  223. Model model = this.getById(modelId);
  224. if(model == null ){
  225. throw new BusinessException(ResultCode.MODEL_NOT_EXIST);
  226. }
  227. this.removeById(modelId);
  228. fusionNumService.deleteByModelId(modelId);
  229. if(StringUtils.isNotBlank(model.getModelGlbUrl())){
  230. uploadService.deleteOssUrl(model.getModelGlbUrl());
  231. }
  232. }
  233. @Override
  234. public List<Model> getListByNum(List<String> numList) {
  235. LambdaQueryWrapper<Model> wrapper = new LambdaQueryWrapper<>();
  236. wrapper.in(Model::getNum,numList);
  237. return this.list(wrapper);
  238. }
  239. @Override
  240. public List<Model> getListByModelIds(List<Integer> modelIds) {
  241. LambdaQueryWrapper<Model> wrapper = new LambdaQueryWrapper<>();
  242. wrapper.in(Model::getModelId,modelIds);
  243. return this.list(wrapper);
  244. }
  245. @Override
  246. public List<Model> getListByModelIdStrs(List<String> numList) {
  247. LambdaQueryWrapper<Model> wrapper = new LambdaQueryWrapper<>();
  248. wrapper.in(Model::getModelId,numList);
  249. wrapper.orderByDesc(Model::getCreateTime);
  250. return this.list(wrapper);
  251. }
  252. @Override
  253. public void deleteByNum(List<String> numList) {
  254. LambdaQueryWrapper<Model> wrapper = new LambdaQueryWrapper<>();
  255. wrapper.in(Model::getNum,numList);
  256. this.remove(wrapper);
  257. }
  258. @Override
  259. public List<Model> getByUserName(String username) {
  260. LambdaQueryWrapper<Model> wrapper = new LambdaQueryWrapper<>();
  261. wrapper.eq(Model::getUserName,username)
  262. .eq(Model::getType,3);
  263. return this.list(wrapper);
  264. }
  265. @Override
  266. public Model getIsNullNewByNum(String num) {
  267. LambdaQueryWrapper<Model> wrapper = new LambdaQueryWrapper<>();
  268. wrapper.eq(Model::getNum,num);
  269. Model model = this.getOne(wrapper);
  270. if(model == null){
  271. model = new Model();
  272. }
  273. return model;
  274. }
  275. @Override
  276. public Object getInfo(Integer modelId) {
  277. Model model = this.getById(modelId);
  278. if(model == null){
  279. throw new BusinessException(ResultCode.SCENE_NOT_EXIST);
  280. }
  281. SceneVo sceneVo = new SceneVo();
  282. BeanUtils.copyProperties(model,sceneVo);
  283. return sceneVo;
  284. }
  285. @Override
  286. public String uploadObjProgress(Integer modelId) {
  287. String redisKey = RedisKeyUtil.modelUpload+modelId;
  288. if(redisUtil.hasKey(redisKey)){
  289. return redisUtil.get(redisKey);
  290. }
  291. return "0";
  292. }
  293. }