ModelServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  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.concurrent.ThreadPoolExecutor;
  7. import java.util.stream.Collectors;
  8. import cn.hutool.core.io.FileUtil;
  9. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  10. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  11. import com.fdkankan.fusion.common.PageInfo;
  12. import com.fdkankan.fusion.common.util.*;
  13. import com.fdkankan.fusion.common.FilePath;
  14. import com.fdkankan.fusion.common.ResultCode;
  15. import com.fdkankan.fusion.entity.*;
  16. import com.fdkankan.fusion.exception.BusinessException;
  17. import com.fdkankan.fusion.mapper.IModelMapper;
  18. import com.fdkankan.fusion.request.ModelPram;
  19. import com.fdkankan.fusion.response.SceneVo;
  20. import com.fdkankan.fusion.service.ICaseNumService;
  21. import com.fdkankan.fusion.service.ICaseService;
  22. import com.fdkankan.fusion.service.IFusionNumService;
  23. import com.fdkankan.fusion.service.IModelService;
  24. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  25. import com.fdkankan.redis.util.RedisUtil;
  26. import org.apache.commons.lang3.StringUtils;
  27. import org.springframework.beans.BeanUtils;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.beans.factory.annotation.Value;
  30. import org.springframework.stereotype.Service;
  31. import org.springframework.web.multipart.MultipartFile;
  32. /**
  33. * <p>
  34. * 服务实现类
  35. * </p>
  36. *
  37. * @author
  38. * @since 2022-08-03
  39. */
  40. @Service
  41. public class ModelServiceImpl extends ServiceImpl<IModelMapper, Model> implements IModelService {
  42. @Autowired
  43. UploadToOssUtil uploadToOssUtil;
  44. @Autowired
  45. UploadService uploadService;
  46. @Autowired
  47. ICaseNumService caseNumService;
  48. @Autowired
  49. ICaseService caseService;
  50. @Autowired
  51. IFusionNumService fusionNumService;
  52. @Autowired
  53. RedisUtil redisUtil;
  54. @Value("${local.obj_path}")
  55. private String OBJ_PATH;
  56. @Value("${local.glb_path}")
  57. private String GLB_PATH;
  58. @Value("${upload.query-path}")
  59. private String queryPath;
  60. @Override
  61. public Model uploadObj(MultipartFile file, String username) throws Exception {
  62. if(file.isEmpty()){
  63. throw new BusinessException(ResultCode.UPLOAD_FILE_NO_EXIST);
  64. }
  65. if(file.getSize()>10 * 1024 * 1024 * 100){
  66. throw new BusinessException(ResultCode.UPLOAD_FILE_TO_LONG);
  67. }
  68. //获取文件名
  69. String fileName = file.getOriginalFilename();
  70. if(StringUtils.isEmpty(fileName)){
  71. throw new BusinessException(ResultCode.UPLOAD_FILE_NO_EXIST);
  72. }
  73. if(com.fdkankan.fusion.common.util.StringUtils.isChinese(fileName)){
  74. throw new BusinessException(ResultCode.UPLOAD_FILE_CHINA_NAME);
  75. }
  76. if(fileName.length() >50){
  77. throw new BusinessException(ResultCode.UPLOAD_FILE_NAME_TO_LONG);
  78. }
  79. if(!fileName.toLowerCase().endsWith(".zip")){
  80. throw new BusinessException(ResultCode.UPLOAD_FILE_TYPE_ERROR);
  81. }
  82. //获取文件后缀名
  83. String modelName = fileName.substring(0,fileName.lastIndexOf("."));
  84. Model model = new Model();
  85. model.setModelTitle(modelName);
  86. model.setModelSize(FileWriterUtil.setFileSize(file.getSize()));
  87. model.setUserName(username);
  88. this.save(model);
  89. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),"0");
  90. fileName = UUID.randomUUID().toString().replace("-","") +".zip";
  91. File newObjFile = null;
  92. File objPathFile = null;
  93. String objPath = String.format(OBJ_PATH , "modelId_"+model.getModelId()) ;
  94. newObjFile = new File(objPath +"/" + fileName);
  95. if(!newObjFile.getParentFile().exists()){
  96. newObjFile.mkdirs();
  97. }
  98. file.transferTo(newObjFile);
  99. if(fileName.toLowerCase().endsWith(".zip")){
  100. ShellUtil.unZip(newObjFile.getPath(),objPath);
  101. }
  102. objPathFile = new File(objPath );
  103. if(!objPathFile.isDirectory()){
  104. setCreateStatus(model,-1);
  105. throw new BusinessException(ResultCode.UPLOAD_FILE_TYPE_ERROR);
  106. }
  107. List<File> fileList = new ArrayList<>();
  108. FileWriterUtil.getCanRunList(fileList,objPathFile);
  109. if(fileList.size() != 1){
  110. setCreateStatus(model,-1);
  111. throw new BusinessException(ResultCode.UPLOAD_FILE_MSG_ERROR);
  112. }
  113. File file1 = fileList.get(0);
  114. if(file1 == null){
  115. setCreateStatus(model,-1);
  116. throw new BusinessException(ResultCode.UPLOAD_FILE_OBJ_ERROR);
  117. }
  118. if(com.fdkankan.fusion.common.util.StringUtils.isChinese(file1.getName())){
  119. setCreateStatus(model,-1);
  120. throw new BusinessException(ResultCode.UPLOAD_FILE_CHINA_NAME);
  121. }
  122. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),"20");
  123. runThread(file1,model,newObjFile,objPathFile,this);
  124. return model;
  125. }
  126. private void setCreateStatus(Model model,Integer status){
  127. model.setCreateStatus(status);
  128. this.saveOrUpdate(model);
  129. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),status.toString());
  130. }
  131. private void runThread(File file1,Model model,File newObjFile,File objPathFile,IModelService modelService){
  132. new Thread() {
  133. @Override
  134. public void run() {
  135. File mntFile = null;
  136. try {
  137. String glbOssPath = String.format(FilePath.GLB_OSS_PATH, model.getModelId());
  138. String name = file1.getName();
  139. if(name.contains("obj") || name.contains("OBJ")){
  140. glbOssPath = glbOssPath.replace("mesh.glb",file1.getName().replace(".obj",".glb"));
  141. model.setModelDateType("obj");
  142. model.setModelType("glb");
  143. OBJToGLBUtil.objToGlb2(file1.getPath(), file1.getPath().replace(".obj",".glb"));
  144. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),"65");
  145. uploadToOssUtil.uploadOss(file1.getPath().replace(".obj",".glb"),glbOssPath);
  146. }
  147. if(name.contains(".ply")){
  148. model.setModelDateType("ply");
  149. model.setModelType("ply");
  150. }
  151. if(name.contains(".las")){
  152. model.setModelDateType("las");
  153. model.setModelType("las");
  154. }
  155. if("las".equals(model.getModelType()) || "ply".equals(model.getModelType()) ){
  156. mntFile = OBJToGLBUtil.lasOrPlyToBin(file1);
  157. glbOssPath = mntFile.getPath().replace("/mnt/","")+"/webcloud";
  158. redisUtil.set(RedisKeyUtil.modelUpload+model.getModelId(),"65");
  159. uploadToOssUtil.uploadFileOss(mntFile );
  160. }
  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. @Override
  294. public void cancelUpload(Integer modelId) {
  295. String redisKey = RedisKeyUtil.modelUpload+modelId;
  296. if(!redisUtil.hasKey(redisKey)){
  297. return;
  298. }
  299. }
  300. }