ZoneInfoService.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. package com.lqkj.link.module.zone.service;
  2. import com.alibaba.fastjson2.JSON;
  3. import com.alibaba.fastjson2.JSONObject;
  4. import com.lqkj.link.module.authority.domain.UserInfo;
  5. import com.lqkj.link.module.authority.repository.UserInfoRepository;
  6. import com.lqkj.link.module.zone.domain.*;
  7. import com.lqkj.link.module.zone.repository.GeomInfoRepository;
  8. import com.lqkj.link.module.zone.repository.ModelInfoRepository;
  9. import com.lqkj.link.module.zone.repository.ZoneInfoRepository;
  10. import com.lqkj.link.util.Unzipper;
  11. import org.apache.commons.lang3.StringUtils;
  12. import org.locationtech.jts.geom.Coordinate;
  13. import org.locationtech.jts.geom.GeometryFactory;
  14. import org.springframework.data.domain.Page;
  15. import org.springframework.data.domain.PageRequest;
  16. import org.springframework.data.domain.Pageable;
  17. import org.springframework.stereotype.Service;
  18. import org.springframework.transaction.annotation.Transactional;
  19. import java.io.File;
  20. import java.nio.file.Files;
  21. import java.nio.file.Paths;
  22. import java.util.*;
  23. import java.util.stream.Collectors;
  24. @Service
  25. public class ZoneInfoService {
  26. private final ZoneInfoRepository zoneInfoRepository;
  27. private final UserInfoRepository userInfoRepository;
  28. private final GeomInfoRepository geomInfoRepository;
  29. private final ModelInfoRepository modelInfoRepository;
  30. public ZoneInfoService(ZoneInfoRepository zoneInfoRepository, UserInfoRepository userInfoRepository,
  31. GeomInfoRepository geomInfoRepository, ModelInfoRepository modelInfoRepository) {
  32. this.zoneInfoRepository = zoneInfoRepository;
  33. this.userInfoRepository = userInfoRepository;
  34. this.geomInfoRepository = geomInfoRepository;
  35. this.modelInfoRepository = modelInfoRepository;
  36. }
  37. public Page<ZoneInfo> pageQueryTemplate(String zoneName, Integer page, Integer pageSize) {
  38. Pageable pageable = PageRequest.of(page, pageSize);
  39. return zoneInfoRepository.pageQueryTemplate(zoneName, pageable);
  40. }
  41. @Transactional
  42. public Map<String, Object> saveTemplate(ZoneInfo zoneInfo) {
  43. Map<String, Object> result = new HashMap<>();
  44. if ((zoneInfo.getZoneId() != null && zoneInfoRepository.hasSameTemplateNameWithoutOne(zoneInfo.getZoneName(), zoneInfo.getZoneId()))
  45. || (zoneInfo.getZoneId() == null && zoneInfoRepository.hasSameTemplateName(zoneInfo.getZoneName()))) {
  46. result.put("msg", "模板名称不能重复!");
  47. return result;
  48. }
  49. zoneInfo.setUpdateTime(new Date());
  50. if (zoneInfo.getZoneId() == null) {
  51. zoneInfo.setShareCount(0);
  52. zoneInfo.setViewCount(0);
  53. zoneInfo.setTemplateUse(0);
  54. }
  55. ZoneInfo zoneInfo1 = zoneInfoRepository.save(zoneInfo);
  56. try {
  57. if (StringUtils.isNotBlank(zoneInfo.getTemplateFilePath())) {
  58. // 清除元素与模型
  59. geomInfoRepository.deleteAllByZoneId(zoneInfo1.getZoneId());
  60. modelInfoRepository.deleteAllByTemplateIds(Collections.singletonList(zoneInfo1.getZoneId()));
  61. // 解压压缩文件
  62. // 文件目录格式:
  63. // --geom.json
  64. // --models
  65. // ----model1.fbx 模型1文件
  66. // ----model2.fbx 模型2文件
  67. // ----model1.json 模型1材质
  68. // ----model2.json 模型2材质
  69. //
  70. // geom.json文件总json格式:
  71. // {
  72. // "init": {
  73. // "rotation": {
  74. // "x": 0,
  75. // "y": 0,
  76. // "z": 0,
  77. // "w": 0
  78. // },
  79. // "translation": {
  80. // "x": 0,
  81. // "y": 0,
  82. // "z": 0
  83. // },
  84. // "scale3D": {
  85. // "x": 0,
  86. // "y": 0,
  87. // "z": 0
  88. // }
  89. // },
  90. // "models": [
  91. // {
  92. // "modelPath": "model1.fbx",
  93. // "location": [
  94. // {
  95. // "rotation": {
  96. // "x": 0,
  97. // "y": 0,
  98. // "z": 0,
  99. // "w": 0
  100. // },
  101. // "translation": {
  102. // "x": 0,
  103. // "y": 0,
  104. // "z": 0
  105. // },
  106. // "scale3D": {
  107. // "x": 0,
  108. // "y": 0,
  109. // "z": 0
  110. // }
  111. // }
  112. // ]
  113. // }
  114. // ]
  115. // }
  116. Unzipper.unZipFiles(new File("." + zoneInfo.getTemplateFilePath()), "./upload/template/" + zoneInfo1.getZoneId() + "/");
  117. String geomJsonString = Files.readString(Paths.get("./upload/template/" + zoneInfo1.getZoneId() + "/geom.json"));
  118. TemplateGeom templateGeom = JSON.parseObject(geomJsonString, TemplateGeom.class);
  119. zoneInfo1.setInitLocation(templateGeom.getInit());
  120. zoneInfoRepository.save(zoneInfo1);
  121. List<TemplateInfo> templateInfoList = templateGeom.getModels();
  122. String modelFolderPath = "./upload/template/" + zoneInfo1.getZoneId() + "/models";
  123. File modelFolder = new File(modelFolderPath);
  124. List<ModelInfo> list = new ArrayList<>();
  125. File[] models = modelFolder.listFiles();
  126. assert models != null;
  127. for (File model : models) {
  128. if (model.isFile()) {
  129. String modelFileName = model.getName();
  130. if (modelFileName.endsWith(".fbx")) {
  131. String modelPath = "/upload/template/" + zoneInfo1.getZoneId() + "/models/";
  132. if (modelFileName.matches(".*[\u4e00-\u9fa5]+.*")) {
  133. // 如果包含中文,重命名
  134. String newFileName =UUID.randomUUID() + ".fbx";
  135. modelPath += newFileName;
  136. boolean rename = model.renameTo(new File("." + modelPath));
  137. System.out.println(rename);
  138. // 材质文件也需要重命名
  139. File oldMaterialFile = new File("." + "/upload/template/" + zoneInfo1.getZoneId() + "/models/" + modelFileName.replace(".fbx", ".json"));
  140. if (oldMaterialFile.exists()) {
  141. File newMaterialFile = new File("." + "/upload/template/" + zoneInfo1.getZoneId() + "/models/" + newFileName.replace(".fbx", ".json"));
  142. rename = oldMaterialFile.renameTo(newMaterialFile);
  143. System.out.println(rename);
  144. }
  145. } else {
  146. modelPath += modelFileName;
  147. }
  148. list.add(new ModelInfo(null, null, modelFileName.substring(0, modelFileName.lastIndexOf(".")).toLowerCase(),
  149. null, null, null, modelPath,
  150. null, null, zoneInfo1.getZoneId()));
  151. }
  152. }
  153. }
  154. List<ModelInfo> modelInfoList = modelInfoRepository.saveAll(list);
  155. Map<String, ModelInfo> modelPathIdMap = modelInfoList
  156. .stream()
  157. .collect(Collectors.toMap(ModelInfo::getModelName, ModelInfo -> ModelInfo));
  158. List<GeomInfo> geomInfoList = new ArrayList<>();
  159. GeometryFactory geometryFactory = new GeometryFactory();
  160. int j = 1;
  161. for (TemplateInfo templateInfo : templateInfoList) {
  162. String modelName = templateInfo.getModelPath().substring(0, templateInfo.getModelPath().lastIndexOf(".")).toLowerCase();
  163. ModelInfo modelInfo = modelPathIdMap.get(modelName);
  164. for (int i = 0; i < templateInfo.getLocation().size(); i++) {
  165. JSONObject trans = templateInfo.getLocation().get(i);
  166. GeomInfo geomInfo = new GeomInfo();
  167. geomInfo.setGeomId(zoneInfo1.getZoneId() + "_" + j);
  168. geomInfo.setModelId(modelInfo.getModelId());
  169. geomInfo.setGeomName(modelInfo.getModelName());
  170. geomInfo.setZoneId(zoneInfo1.getZoneId());
  171. geomInfo.setLocking(false);
  172. geomInfo.setTrans(trans);
  173. JSONObject pointObject = trans.getJSONObject("translation");
  174. geomInfo.setGeom(geometryFactory.createPoint(new Coordinate(
  175. Double.parseDouble(pointObject.get("x").toString()),
  176. Double.parseDouble(pointObject.get("y").toString()),
  177. Double.parseDouble(pointObject.get("z").toString()))));
  178. j++;
  179. geomInfoList.add(geomInfo);
  180. }
  181. }
  182. geomInfoRepository.saveAll(geomInfoList);
  183. }
  184. } catch (Exception e) {
  185. modelInfoRepository.deleteAllByTemplateIds(Collections.singletonList(zoneInfo1.getZoneId()));
  186. zoneInfoRepository.delete(zoneInfo1);
  187. result.put("msg", "模板压缩文件解压失败!");
  188. return result;
  189. }
  190. result.put("zone", zoneInfo1);
  191. return result;
  192. }
  193. @Transactional
  194. public void deleteTemplate(List<Integer> zoneIds) {
  195. zoneInfoRepository.deleteAllByIdInBatch(zoneIds);
  196. modelInfoRepository.deleteAllByTemplateIds(zoneIds);
  197. }
  198. public List<String> autoCompleteMyWork(String userCode, String keyword) {
  199. return zoneInfoRepository
  200. .autoCompleteMyWork(userCode, keyword)
  201. .stream()
  202. .map(v -> (String) v.get("name"))
  203. .toList();
  204. }
  205. public List<String> autoCompleteResource(String keyword, Integer searchType) {
  206. return zoneInfoRepository
  207. .autoCompleteResource(keyword, searchType)
  208. .stream()
  209. .map(v -> (String) v.get("name"))
  210. .toList();
  211. }
  212. public List<String> autoCompleteAudit(String keyword, Integer searchType) {
  213. return zoneInfoRepository
  214. .autoCompleteAudit(keyword, searchType)
  215. .stream()
  216. .map(v -> (String) v.get("name"))
  217. .toList();
  218. }
  219. public Page<ZoneInfo> myWork(String userCode, String name, Integer page, Integer pageSize) {
  220. Pageable pageable = PageRequest.of(page, pageSize);
  221. return zoneInfoRepository.pageQueryMyWork(userCode, name, pageable);
  222. }
  223. public Page<Map<String, Object>> resourceCenter(String name, Integer searchType, Integer page, Integer pageSize) {
  224. Pageable pageable = PageRequest.of(page, pageSize);
  225. return zoneInfoRepository.pageQueryResourceCenter(name, searchType, pageable);
  226. }
  227. public Page<Map<String, Object>> auditCenter(String name, Integer searchType, Integer page, Integer pageSize) {
  228. Pageable pageable = PageRequest.of(page, pageSize);
  229. return zoneInfoRepository.auditCenter(name, searchType, pageable);
  230. }
  231. @Transactional
  232. public String share(Integer zoneId, String userCode) {
  233. String shareCode = UUID.randomUUID().toString();
  234. zoneInfoRepository.share(zoneId, userCode, shareCode);
  235. return shareCode;
  236. }
  237. @Transactional
  238. public void view(Integer zoneId, String userCode) {
  239. zoneInfoRepository.view(zoneId, userCode);
  240. }
  241. @Transactional
  242. public String rename(Integer zoneId, String newName, String userCode) {
  243. if (zoneInfoRepository.hasSameNameWithUser(newName, userCode, zoneId)) {
  244. return "不能与已有作品重名!";
  245. }
  246. zoneInfoRepository.rename(newName, zoneId);
  247. return null;
  248. }
  249. public String deleteWork(Integer zoneId, String userCode) {
  250. if(!zoneInfoRepository.existsById(zoneId)){
  251. return "该作品不存在!";
  252. }
  253. if (!zoneInfoRepository.isAuthor(zoneId, userCode)) {
  254. return "您不是该作品的作者!";
  255. }
  256. if (zoneInfoRepository.canBeDeleteWithAuthStatus(zoneId)) {
  257. return "不能删除正在审核或已发布的作品!";
  258. }
  259. zoneInfoRepository.deleteById(zoneId);
  260. return null;
  261. }
  262. @Transactional
  263. public Map<String, Object> create(String name, Integer templateId, String userCode) {
  264. Map<String, Object> result = new HashMap<>();
  265. UserInfo userInfo = userInfoRepository.findByUserCode(userCode);
  266. if (zoneInfoRepository.existsByZoneNameAndUserId(name, userInfo.getUserId())) {
  267. result.put("msg", "不能与已有作品重名!");
  268. return result;
  269. }
  270. ZoneInfo template = null;
  271. if (templateId != null) {
  272. template = zoneInfoRepository.findById(templateId).get();
  273. }
  274. ZoneInfo zoneInfo = new ZoneInfo(null, userInfo.getUserId(), name, template == null ? null : template.getInitLocation(),
  275. template == null ? null : template.getThumbnail(), 0, new Date(), 0, 0,
  276. null, null, 0);
  277. ZoneInfo newInfo = zoneInfoRepository.save(zoneInfo);
  278. if (templateId != null) {
  279. GeometryFactory geometryFactory = new GeometryFactory();
  280. if (geomInfoRepository.hasGeom(templateId)) {
  281. List<GeomInfo> geomInfoList = geomInfoRepository.findAllByZoneId(templateId);
  282. List<GeomInfo> list = new ArrayList<>();
  283. for (GeomInfo geomInfo : geomInfoList) {
  284. String geomId = geomInfo.getGeomId();
  285. String newId = newInfo.getZoneId() + "_" + geomId.split("_")[1];
  286. GeomInfo newGeom = JSON.parseObject(JSON.toJSONString(geomInfo), GeomInfo.class);
  287. newGeom.setGeomId(newId);
  288. newGeom.setZoneId(newInfo.getZoneId());
  289. newGeom.setTrans(geomInfo.getLocation());
  290. JSONObject pointObject = geomInfo.getLocation().getJSONObject("translation");
  291. newGeom.setGeom(geometryFactory.createPoint(new Coordinate(
  292. Double.parseDouble(pointObject.get("x").toString()),
  293. Double.parseDouble(pointObject.get("y").toString()),
  294. Double.parseDouble(pointObject.get("z").toString()))));
  295. newGeom.setLocking(false);
  296. list.add(newGeom);
  297. }
  298. geomInfoRepository.saveAll(list);
  299. }
  300. // 模板使用次数+1
  301. zoneInfoRepository.addTemplateUse(templateId);
  302. }
  303. result.put("zone", newInfo);
  304. return result;
  305. }
  306. public void saveThumbnail(Integer zoneId, String thumbnailPath) {
  307. ZoneInfo zoneInfo = zoneInfoRepository.findById(zoneId).get();
  308. zoneInfo.setThumbnail(thumbnailPath);
  309. zoneInfoRepository.save(zoneInfo);
  310. }
  311. public JSONObject readTrans(Integer zoneId) {
  312. return zoneInfoRepository.findById(zoneId).get().getInitLocation();
  313. }
  314. }