StructureServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. package cn.cslg.pas.service.impl;
  2. import cn.cslg.pas.common.model.dto.*;
  3. import cn.cslg.pas.common.model.vo.PathStructureNameVO;
  4. import cn.cslg.pas.common.model.vo.StructurePictureVO;
  5. import cn.cslg.pas.common.model.vo.StructureVO;
  6. import cn.cslg.pas.common.utils.FileUtils;
  7. import cn.cslg.pas.domain.Structure;
  8. import cn.cslg.pas.domain.asso.AssoStructurePicture;
  9. import cn.cslg.pas.exception.XiaoShiException;
  10. import cn.cslg.pas.mapper.AssoStructurePictureMapper;
  11. import cn.cslg.pas.mapper.StructureMapper;
  12. import cn.cslg.pas.service.IStructureService;
  13. import lombok.RequiredArgsConstructor;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.springframework.beans.BeanUtils;
  16. import org.springframework.stereotype.Service;
  17. import org.springframework.web.multipart.MultipartFile;
  18. import java.util.ArrayList;
  19. import java.util.HashMap;
  20. import java.util.List;
  21. /**
  22. * 架构的Service层接口实现类
  23. *
  24. * @Author chenyu
  25. * @Date 2023/3/10
  26. */
  27. @RequiredArgsConstructor
  28. @Slf4j
  29. @Service
  30. public class StructureServiceImpl implements IStructureService {
  31. private final StructureMapper structureMapper;
  32. private final AssoStructurePictureMapper assoStructurePictureMapper;
  33. private final FileUtils fileUtils;
  34. /**
  35. * 新增架构
  36. *
  37. * @param structureAddNewDTO 新增架构DTO对象
  38. * @param files 架构图片
  39. */
  40. @Override
  41. public void addNew(StructureAddNewDTO structureAddNewDTO, List<MultipartFile> files) {
  42. log.info("开始处理【新增架构】的业务,参数为:{}, {}", structureAddNewDTO, files);
  43. //取出DTO中父级id,若父级id为null则表示该架构为第1级架构,手动给其父级id设为0
  44. if (structureAddNewDTO.getParentId() == null) {
  45. structureAddNewDTO.setParentId(0);
  46. }
  47. Integer parentId = structureAddNewDTO.getParentId();
  48. String structureName = structureAddNewDTO.getStructureName();
  49. //检查名称是否被占用(检查当前架构父级下是否有同名架构)
  50. log.info("检查名称是否被占用(检查当前父级下是否有同名架构)");
  51. int count = structureMapper.countByparentIdAndStructureName(parentId, structureName, null);
  52. if (count > 0) {
  53. String message = "新增架构失败,当前父级下已存在【" + structureName + "】,请尝试更换名称";
  54. log.info("{}", message);
  55. throw new XiaoShiException(message);
  56. }
  57. //DTO对象赋值给实体类
  58. Structure structure = new Structure();
  59. BeanUtils.copyProperties(structureAddNewDTO, structure);
  60. //数据入架构表(此时数据暂不含路径path)
  61. log.info("数据入架构表");
  62. int rows = structureMapper.insert(structure);
  63. if (rows != 1) {
  64. String message = "新增架构失败,服务器忙请稍后再次尝试!";
  65. log.info("{}", message);
  66. throw new XiaoShiException(message);
  67. }
  68. //数据入架构表后,取出id
  69. Integer structureId = structure.getId();
  70. String parentPath = structureAddNewDTO.getParentPath();
  71. String path;
  72. if (parentPath != null) {
  73. path = parentPath + "," + structureId;
  74. } else {
  75. path = "0," + structureId;
  76. }
  77. structure.setPath(path);
  78. log.info("更新架构表");
  79. rows = structureMapper.update(structure);
  80. if (rows != 1) {
  81. String message = "新增架构失败,服务器忙请稍后再次尝试!";
  82. log.info("{}", message);
  83. throw new XiaoShiException(message);
  84. }
  85. //如果前端有传来架构图片,则图片上传服务器并获取图片信息,将图片信息入架构图片关联表
  86. if (files != null && files.size() > 0) {
  87. ArrayList<AssoStructurePicture> assoStructurePictures = new ArrayList<>();
  88. for (MultipartFile file : files) {
  89. UploadFileDTO fileDTO = fileUtils.uploadFile(file);
  90. AssoStructurePicture assoStructurePicture = new AssoStructurePicture()
  91. .setStructureId(structureId)
  92. .setName(fileDTO.getName())
  93. .setSuffix(fileDTO.getExtName())
  94. .setUrl(fileDTO.getPath());
  95. assoStructurePictures.add(assoStructurePicture);
  96. }
  97. rows = assoStructurePictureMapper.insertBatch(assoStructurePictures);
  98. if (rows != assoStructurePictures.size()) {
  99. String message = "新增架构失败,数据入架构图片关联表失败,服务器忙请稍后再次尝试!";
  100. log.info("{}", message);
  101. throw new XiaoShiException(message);
  102. }
  103. }
  104. log.info("新增架构完成");
  105. }
  106. /**
  107. * 修改架构
  108. *
  109. * @param structureUpdateDTO 修改架构DTO对象
  110. * @param files 架构图片
  111. */
  112. @Override
  113. public void update(StructureUpdateDTO structureUpdateDTO, List<MultipartFile> files) {
  114. log.info("开始处理【修改架构】的业务,参数为:{}, {}", structureUpdateDTO, files);
  115. //检查尝试修改的数据是否存在
  116. Integer structureId = structureUpdateDTO.getId();
  117. log.info("检查尝试修改的数据是否存在");
  118. Structure queryResult = structureMapper.getStandardById(structureId);
  119. if (queryResult == null) {
  120. String message = "修改架构失败,尝试访问的数据已不存在";
  121. log.info("{}", message);
  122. throw new XiaoShiException(message);
  123. }
  124. Integer newParentId = structureUpdateDTO.getParentId();
  125. String newStructureName = structureUpdateDTO.getStructureName();
  126. //检查名称是否被占用(检查当前尝试修改的架构父级下是否有同名架构)
  127. log.info("检查名称是否被占用(检查当前尝试修改的架构父级下是否有同名架构)");
  128. int count = structureMapper.countByparentIdAndStructureName(newParentId, newStructureName, structureId);
  129. if (count > 0) {
  130. String message = "修改架构失败,当前尝试修改的架构父级下已存在【" + newStructureName + "】,请尝试更换名称";
  131. log.info("{}", message);
  132. throw new XiaoShiException(message);
  133. }
  134. //DTO对象赋值给实体类
  135. Structure structure = new Structure();
  136. BeanUtils.copyProperties(structureUpdateDTO, structure);
  137. String parentPath = structureUpdateDTO.getParentPath();
  138. if (parentPath == null) {
  139. parentPath = "0";
  140. }
  141. String oldPath = queryResult.getPath();
  142. String newPath = parentPath + "," + structureId;
  143. if (!newPath.equals(oldPath)) {
  144. structure.setPath(newPath);
  145. }
  146. //架构表修改数据
  147. log.info("架构表修改数据");
  148. int rows = structureMapper.update(structure);
  149. if (rows != 1) {
  150. String message = "修改架构失败,服务器忙请稍后再次尝试!";
  151. log.info("{}", message);
  152. throw new XiaoShiException(message);
  153. }
  154. //如果当前修改的架构更换了父级,则要将当前架构下所有子级架构的路径也都更新
  155. Integer oldParentId = queryResult.getParentId();
  156. if (!oldParentId.equals(newParentId)) {
  157. //根据当前架构原来的路径查询所有子级架构
  158. List<StructureVO> structures = structureMapper.selectByFindInSetPath(oldPath);
  159. for (StructureVO n : structures) {
  160. String path = n.getPath();
  161. //从当前架构(即它们的父级架构)的原来的路径的长度的位置处截取后面路径
  162. String behindString = path.substring(oldPath.length());
  163. path = newPath + behindString;
  164. n.setPath(path);
  165. Structure structure2 = new Structure();
  166. BeanUtils.copyProperties(n, structure2);
  167. log.info("修改当前已更换父级的架构的子级架构路径path");
  168. rows = structureMapper.update(structure2);
  169. if (rows != 1) {
  170. String message = "修改架构失败,修改当前已更换父级的架构的子级架构路径path失败,服务器忙请稍后再次尝试!";
  171. log.info("{}", message);
  172. throw new XiaoShiException(message);
  173. }
  174. }
  175. }
  176. //架构图片关联表删除数据(若有原有图片被删除)
  177. //根据架构id查询出所有原有图片
  178. log.info("根据架构id查询出所有原有图片");
  179. List<StructurePictureVO> structurePictures = assoStructurePictureMapper.selectByStructureId(structureId);
  180. ArrayList<Integer> oldPictureIds = new ArrayList<>();
  181. for (StructurePictureVO structurePicture : structurePictures) {
  182. Integer oldPictureId = structurePicture.getId();
  183. oldPictureIds.add(oldPictureId);
  184. }
  185. //从DTO中获取传过来的原有图片
  186. List<StructurePictureUpdateDTO> pictures = structureUpdateDTO.getPictures();
  187. ArrayList<Integer> newOldPictureIds = new ArrayList<>();
  188. for (StructurePictureUpdateDTO picture : pictures) {
  189. Integer newOldPictureId = picture.getId();
  190. newOldPictureIds.add(newOldPictureId);
  191. }
  192. //图片id集合去重,保留下来的即被删除的图片id
  193. oldPictureIds.removeAll(newOldPictureIds);
  194. if (oldPictureIds.size() > 0) {
  195. log.info("架构图片关联表删除数据");
  196. rows = assoStructurePictureMapper.deleteByIds(oldPictureIds);
  197. if (rows != oldPictureIds.size()) {
  198. String message = "修改架构失败,架构图片关联表删除数据失败,服务器忙请稍后再次尝试!";
  199. log.info("{}", message);
  200. throw new XiaoShiException(message);
  201. }
  202. }
  203. //数据入架构图片关联表(若有新增新图片)
  204. if (files != null && files.size() != 0) {
  205. ArrayList<AssoStructurePicture> assoStructurePictures = new ArrayList<>();
  206. for (MultipartFile file : files) {
  207. UploadFileDTO fileDTO = fileUtils.uploadFile(file);
  208. AssoStructurePicture assoStructurePicture = new AssoStructurePicture()
  209. .setStructureId(structureId)
  210. .setName(fileDTO.getName())
  211. .setSuffix(fileDTO.getExtName())
  212. .setUrl(fileDTO.getPath());
  213. assoStructurePictures.add(assoStructurePicture);
  214. }
  215. log.info("数据入架构图片关联表");
  216. rows = assoStructurePictureMapper.insertBatch(assoStructurePictures);
  217. if (rows != files.size()) {
  218. String message = "修改架构失败,数据入架构图片关联表失败,服务器忙请稍后再次尝试!";
  219. log.info("{}", message);
  220. throw new XiaoShiException(message);
  221. }
  222. }
  223. log.info("修改架构完成");
  224. }
  225. /**
  226. * 分页查询架构树
  227. *
  228. * @param structureQueryPageDTO 分页信息
  229. * @return 返回查询到的数据
  230. */
  231. @Override
  232. public StructureVO query(StructureQueryPageDTO structureQueryPageDTO) {
  233. log.info("开始处理【查询架构树】的业务,参数为:{}", structureQueryPageDTO);
  234. //从DTO中取出产品id、架构id、架构名称
  235. Integer productId = structureQueryPageDTO.getProductId();
  236. Integer structureId = structureQueryPageDTO.getStructureId();
  237. StructureVO structureVO = new StructureVO();
  238. diGui(structureVO, structureId, productId);
  239. return structureVO;
  240. }
  241. /**
  242. * 查询架构路径和路径架构名称
  243. *
  244. * @return 返回查询到的数据
  245. */
  246. @Override
  247. public List<PathStructureNameVO> queryPathStructureName(Integer productId) {
  248. log.info("开始处理【查询所有架构路径和路径架构名称】的业务");
  249. List<StructureVO> structures = structureMapper.selectAllByProductId(productId);
  250. HashMap<String, String> map = new HashMap<>();
  251. for (StructureVO structure : structures) {
  252. Integer structureId = structure.getId();
  253. String structureStrId = structureId + "";
  254. String structureName = structure.getStructureName();
  255. map.put(structureStrId, structureName);
  256. }
  257. for (StructureVO structure : structures) {
  258. String path = structure.getPath();
  259. path = path.substring(path.indexOf(",") + 1);
  260. String[] split = path.split(",");
  261. for (String id : split) {
  262. map.get(id)
  263. }
  264. }
  265. return null;
  266. }
  267. /**
  268. * 删除架构
  269. *
  270. * @param id 架构id
  271. */
  272. @Override
  273. public void delete(Integer id) {
  274. log.info("开始处理【删除架构】的业务,参数为:{}", id);
  275. //检查尝试删除的数据是否存在
  276. Structure queryResult = structureMapper.getStandardById(id);
  277. if (queryResult == null) {
  278. String message = "删除架构失败,尝试访问的数据已不存在";
  279. log.info("{}", message);
  280. throw new XiaoShiException(message);
  281. }
  282. //根据架构id查询其所有子级架构
  283. ArrayList<Integer> structureIds = new ArrayList<>();
  284. structureIds.add(id);
  285. String path = queryResult.getPath();
  286. log.info("根据架构id查询其所有子级架构");
  287. List<StructureVO> structures = structureMapper.selectByFindInSetPath(path);
  288. for (StructureVO structure : structures) {
  289. Integer childStructureId = structure.getId();
  290. structureIds.add(childStructureId);
  291. }
  292. //架构和专利关联表删除数据
  293. log.info("架构和专利关联表删除数据");
  294. assoStructurePictureMapper.deleteByIds(structureIds);
  295. // if (rows != structureIds.size()) {
  296. // String message = "删除架构失败,架构和专利关联表删除数据失败,服务器忙请稍后再次尝试";
  297. // log.info("{}", message);
  298. // throw new XiaoShiException(message);
  299. // }
  300. //架构和图片关联表删除数据
  301. log.info("架构和图片关联表删除数据");
  302. assoStructurePictureMapper.deleteByStructureIds(structureIds);
  303. // if (rows != structureIds.size()) {
  304. // String message = "删除架构失败,架构和图片关联表删除数据失败,服务器忙请稍后再次尝试";
  305. // log.info("{}", message);
  306. // throw new XiaoShiException(message);
  307. // }
  308. //架构表删除数据
  309. log.info("架构表删除数据");
  310. int rows = structureMapper.deleteByIds(structureIds);
  311. if (rows != structureIds.size()) {
  312. String message = "删除架构失败,架构表删除数据失败,服务器忙请稍后再次尝试";
  313. log.info("{}", message);
  314. throw new XiaoShiException(message);
  315. }
  316. log.info("删除架构完成");
  317. }
  318. //递归组装架构树集合
  319. private void diGui(StructureVO structureVO, Integer structureId, Integer productId) {
  320. List<StructureVO> structureVOs = structureMapper.selectByParentIdAndProductId(structureId, productId);
  321. if (structureVOs != null) {
  322. structureVO.setChildren(structureVOs);
  323. for (StructureVO n : structureVOs) {
  324. structureId = n.getId();
  325. diGui(n, structureId, productId);
  326. }
  327. }
  328. }
  329. }