StructureServiceImpl.java 15 KB

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