TreeNodeService.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895
  1. package cn.cslg.pas.service.business;
  2. import cn.cslg.pas.common.dto.CopyTreeNodeDTO;
  3. import cn.cslg.pas.common.dto.business.QueryAllTreePathDTO;
  4. import cn.cslg.pas.common.dto.business.QueryTreeNodeDTO;
  5. import cn.cslg.pas.common.dto.business.TreeNodeDTO;
  6. import cn.cslg.pas.common.dto.business.UpdateTreeNodeDTO;
  7. import cn.cslg.pas.common.model.cronModel.*;
  8. import cn.cslg.pas.common.model.request.GroupRequest;
  9. import cn.cslg.pas.common.model.request.QueryRequest;
  10. import cn.cslg.pas.common.utils.CacheUtils;
  11. import cn.cslg.pas.common.utils.LoginUtils;
  12. import cn.cslg.pas.common.vo.ReTreeNodeVO;
  13. import cn.cslg.pas.common.vo.business.ProductVO;
  14. import cn.cslg.pas.common.vo.business.TreeNodeVO;
  15. import cn.cslg.pas.common.vo.business.TreePathVO;
  16. import cn.cslg.pas.domain.business.AssoProjectTreeNode;
  17. import cn.cslg.pas.domain.business.AssoTreeNodeFile;
  18. import cn.cslg.pas.domain.business.TreeNode;
  19. import cn.cslg.pas.exception.UnLoginException;
  20. import cn.cslg.pas.exception.XiaoShiException;
  21. import cn.cslg.pas.factorys.businessFactory.Business;
  22. import cn.cslg.pas.mapper.TreeNodeMapper;
  23. import cn.cslg.pas.service.business.es.EsProductPatentService;
  24. import cn.cslg.pas.service.common.FileManagerService;
  25. import cn.cslg.pas.service.permissions.PermissionService;
  26. import cn.cslg.pas.service.query.FormatQueryService;
  27. import com.alibaba.fastjson.JSONObject;
  28. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  29. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  30. import lombok.extern.slf4j.Slf4j;
  31. import org.apache.commons.lang3.StringUtils;
  32. import org.springframework.beans.BeanUtils;
  33. import org.springframework.beans.factory.annotation.Autowired;
  34. import org.springframework.stereotype.Service;
  35. import org.springframework.transaction.annotation.Transactional;
  36. import org.springframework.util.CollectionUtils;
  37. import org.springframework.web.multipart.MultipartFile;
  38. import java.io.IOException;
  39. import java.util.ArrayList;
  40. import java.util.Arrays;
  41. import java.util.Comparator;
  42. import java.util.List;
  43. import java.util.stream.Collectors;
  44. /**
  45. * 架构的Service层
  46. *
  47. * @Author xiexiang
  48. * @Date 2023/10/26
  49. */
  50. @Service
  51. @Slf4j
  52. public class TreeNodeService extends ServiceImpl<TreeNodeMapper, TreeNode> implements Business {
  53. @Autowired
  54. private TreeNodeMapper treeNodeMapper;
  55. @Autowired
  56. private AssoTreeNodeFileService assoTreeNodeFileService;
  57. @Autowired
  58. private FileManagerService fileManagerService;
  59. @Autowired
  60. private CacheUtils cacheUtils;
  61. @Autowired
  62. private LoginUtils loginUtils;
  63. @Autowired
  64. private FormatQueryService formatQueryService;
  65. @Autowired
  66. private PermissionService permissionService;
  67. @Autowired
  68. private AssoProjectTreeNodeService assoProjectTreeNodeService;
  69. @Autowired
  70. private EsProductPatentService esProductPatentService;
  71. @Override
  72. public Object queryMessage(QueryRequest queryRequest) throws Exception {
  73. List<String> sqls = formatQueryService.reSqls(queryRequest, "treeNode");
  74. //根据sql查询节点信息
  75. List<TreeNodeVO> treeNodeVOS = this.getBaseMapper().getTreeNodes(sqls.get(0), sqls.get(1), sqls.get(2));
  76. //查询节点总数
  77. Long total = this.getBaseMapper().getTreeNodeCount(sqls.get(0));
  78. //装载节点信息
  79. if (treeNodeVOS.size() != 0) {
  80. this.loadTreeNode(treeNodeVOS);
  81. this.loadPath(treeNodeVOS);
  82. }
  83. Records records = new Records();
  84. records.setCurrent(queryRequest.getCurrent());
  85. records.setSize(queryRequest.getSize());
  86. records.setData(treeNodeVOS);
  87. records.setTotal(total);
  88. return records;
  89. }
  90. /**
  91. * 查询树
  92. *
  93. * @param queryTreeNodeDTO
  94. * @return
  95. * @throws Exception
  96. */
  97. public Records queryMessage(QueryTreeNodeDTO queryTreeNodeDTO) throws Exception {
  98. //返回数据
  99. Records records = new Records();
  100. List<ReTreeNodeVO> reTreeNodeVOS = new ArrayList<>();
  101. Integer type = queryTreeNodeDTO.getType();
  102. Integer typeId = queryTreeNodeDTO.getTypeId();
  103. Integer projectId = queryTreeNodeDTO.getProjectId();
  104. //校验格式
  105. if (type == null || typeId == null) {
  106. throw new XiaoShiException("参数错误");
  107. }
  108. if (projectId != null) {
  109. LambdaQueryWrapper<AssoProjectTreeNode> queryWrapper = new LambdaQueryWrapper<>();
  110. queryWrapper.eq(AssoProjectTreeNode::getProjectId, projectId);
  111. AssoProjectTreeNode assoProjectTreeNode = assoProjectTreeNodeService.getOne(queryWrapper, false);
  112. if (assoProjectTreeNode != null) {
  113. if (!assoProjectTreeNode.getValueId().equals(0)) {
  114. queryTreeNodeDTO.setId(assoProjectTreeNode.getValueId());
  115. }
  116. }
  117. }
  118. List<TreeNodeVO> treeNodes = treeNodeMapper.getTreeNode(queryTreeNodeDTO);
  119. //如果根据名称查询
  120. if (queryTreeNodeDTO.getName() != null && !queryTreeNodeDTO.getName().trim().equals("")) {
  121. List<Integer> ids = new ArrayList<>();
  122. //当根据名称查出了节点
  123. if (treeNodes != null && treeNodes.size() != 0) {
  124. List<String> pathStrs = treeNodes.stream().map(TreeNodeVO::getPath).collect(Collectors.toList());
  125. List<Integer> nameIds = treeNodes.stream().map(TreeNodeVO::getId).collect(Collectors.toList());
  126. ids.addAll(nameIds);
  127. pathStrs.forEach(item -> {
  128. if (item != null && !item.trim().equals("")) {
  129. List<Integer> paths = Arrays.stream(item.split("/")).map(s -> {
  130. if (!s.equals("")) {
  131. return Integer.parseInt(s.trim());
  132. } else return null;
  133. }).collect(Collectors.toList());
  134. ids.addAll(paths);
  135. }
  136. });
  137. //返回树
  138. List<TreeNodeVO> treeNodeVOS = treeNodeMapper.getTreeNodeByIds(ids, false, null, null);
  139. this.loadTreeNode(treeNodeVOS);
  140. reTreeNodeVOS = this.reTrees(treeNodeVOS);
  141. records.setData(reTreeNodeVOS);
  142. return records;
  143. } else {
  144. records.setData(reTreeNodeVOS);
  145. return records;
  146. }
  147. }
  148. //返回树
  149. this.loadTreeNode(treeNodes);
  150. reTreeNodeVOS = this.reTrees(treeNodes);
  151. records.setData(reTreeNodeVOS);
  152. return records;
  153. }
  154. //装载树
  155. List<ReTreeNodeVO> reTrees(List<TreeNodeVO> treeNodes) {
  156. treeNodes = treeNodes.stream().sorted(Comparator.comparing(TreeNodeVO::getLevel).reversed())
  157. .collect(Collectors.toList());
  158. List<ReTreeNodeVO> reTreeNodeVOS = new ArrayList<>();
  159. for (TreeNodeVO treeNode : treeNodes) {
  160. ReTreeNodeVO reTreeNodeVO = new ReTreeNodeVO();
  161. BeanUtils.copyProperties(treeNode, reTreeNodeVO);
  162. List<String> pathNames = new ArrayList<>();
  163. if (treeNode.getPath() != null && !treeNode.getPath().trim().equals("")) {
  164. List<Integer> paths = Arrays.stream(treeNode.getPath().split("/")).map(s -> {
  165. if (!s.equals("")) {
  166. return Integer.parseInt(s.trim());
  167. } else return null;
  168. }).collect(Collectors.toList());
  169. for (Integer tem : paths) {
  170. TreeNodeVO treeNode1 = treeNodes.stream().filter(item -> item.getId().equals(tem)).findFirst().orElse(null);
  171. if (treeNode1 != null) {
  172. pathNames.add(treeNode1.getName());
  173. }
  174. }
  175. if (pathNames.size() != 0) {
  176. reTreeNodeVO.setPathName("/" + StringUtils.join(pathNames, "/"));
  177. }
  178. } else {
  179. reTreeNodeVO.setPathName("/");
  180. }
  181. List<ReTreeNodeVO> childReTreeNodeVOs = reTreeNodeVOS.stream().filter(item -> item.getParentId().equals(treeNode.getId())).collect(Collectors.toList());
  182. reTreeNodeVO.setChild(childReTreeNodeVOs);
  183. reTreeNodeVOS.removeAll(childReTreeNodeVOs);
  184. reTreeNodeVOS.add(reTreeNodeVO);
  185. }
  186. return reTreeNodeVOS;
  187. }
  188. /**
  189. * 新增架构
  190. *
  191. * @param object
  192. * @param files
  193. * @return
  194. */
  195. @Override
  196. public Object addMessage(Object object, List<MultipartFile> files) {
  197. //object to treeNodeDTO
  198. TreeNodeDTO treeNodeDTO = (TreeNodeDTO) object;
  199. //检测名称是否规范
  200. treeNodeDTO.setName(treeNodeDTO.getName().trim());
  201. //根据名称查询是否重复
  202. String name = treeNodeDTO.getName();
  203. Integer parentId = treeNodeDTO.getParentId();
  204. Integer type = treeNodeDTO.getType();
  205. Integer typeId = treeNodeDTO.getTypeId();
  206. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  207. queryWrapper.eq(TreeNode::getName, name);
  208. queryWrapper.eq(TreeNode::getParentId, parentId);
  209. queryWrapper.eq(TreeNode::getType, type);
  210. queryWrapper.eq(TreeNode::getTypeId, typeId);
  211. List<TreeNode> treeNodes = this.list(queryWrapper);
  212. if (treeNodes != null && treeNodes.size() != 0) {
  213. throw new XiaoShiException("名称不能重复!");
  214. }
  215. //获取登录人信息
  216. PersonnelVO personnelVO = new PersonnelVO();
  217. personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  218. //赋值
  219. TreeNode treeNode = new TreeNode();
  220. BeanUtils.copyProperties(treeNodeDTO, treeNode);
  221. //若父id为0,则代表这是顶层id
  222. if (parentId.equals(0)) {
  223. treeNode.setPath("");
  224. treeNode.setLevel(0);
  225. } else {//有父id,根据父id获取它的路径,然后加上父id拼接成该条路径
  226. TreeNode parentNode = this.getById(parentId);
  227. String parentPath = parentNode.getPath();
  228. if (parentPath != null) {
  229. //父id若为顶层id,则父id没有路径
  230. if (parentPath.equals("")) {
  231. treeNode.setPath(parentId + "");
  232. treeNode.setLevel(1);
  233. } else {
  234. //父id不是顶层id,父id有路径
  235. treeNode.setPath(parentPath + "/" + parentId);
  236. treeNode.setLevel(parentNode.getLevel() + 1);
  237. }
  238. } else {
  239. throw new XiaoShiException("数据库中路径错误");
  240. }
  241. }
  242. treeNode.setCreateId(personnelVO.getId());
  243. treeNode.insert();
  244. //处理文件
  245. if (files != null && files.size() != 0) {
  246. try {
  247. List<String> guids = fileManagerService.uploadFileGetGuid(files);
  248. List<AssoTreeNodeFile> assoTreeNodeFiles = new ArrayList<>();
  249. for (String item : guids) {
  250. AssoTreeNodeFile assoTreeNodeFile = new AssoTreeNodeFile();
  251. assoTreeNodeFile.setTreeNodeId(treeNode.getId());
  252. assoTreeNodeFile.setFileGuid(item);
  253. assoTreeNodeFile.setCreateId(personnelVO.getId());
  254. assoTreeNodeFiles.add(assoTreeNodeFile);
  255. }
  256. if (assoTreeNodeFiles != null && assoTreeNodeFiles.size() != 0) {
  257. assoTreeNodeFileService.saveBatch(assoTreeNodeFiles);
  258. }
  259. } catch (Exception e) {
  260. }
  261. }
  262. //返回id
  263. return treeNode.getId();
  264. }
  265. /**
  266. * 删除架构
  267. *
  268. * @param ids
  269. * @return
  270. */
  271. @Override
  272. @Transactional(rollbackFor = Exception.class)
  273. public Object deleteMessage(List<Integer> ids) throws IOException {
  274. //检验参数
  275. if (ids == null || ids.size() == 0) {
  276. throw new XiaoShiException("参数错误");
  277. }
  278. //查询节点下的子节点以及自身id
  279. List<Integer> trueIds = new ArrayList<>();
  280. ids.forEach(item -> {
  281. QueryTreeNodeDTO queryTreeNodeDTO = new QueryTreeNodeDTO();
  282. queryTreeNodeDTO.setId(item);
  283. List<TreeNodeVO> treeNodes = treeNodeMapper.getTreeNode(queryTreeNodeDTO);
  284. List<Integer> tmpIds = treeNodes.stream().map(TreeNodeVO::getId).collect(Collectors.toList());
  285. trueIds.addAll(tmpIds);
  286. });
  287. //根据架构id删除架构和文件关联
  288. LambdaQueryWrapper<AssoTreeNodeFile> queryWrapper = new LambdaQueryWrapper<>();
  289. queryWrapper.in(AssoTreeNodeFile::getTreeNodeId, trueIds);
  290. List<AssoTreeNodeFile> assoTreeNodeFiles = assoTreeNodeFileService.list(queryWrapper);
  291. List<String> guids = assoTreeNodeFiles.stream().map(AssoTreeNodeFile::getFileGuid).collect(Collectors.toList());
  292. //TODO 根据guids删除文件
  293. if (guids.size() != 0) {
  294. fileManagerService.deleteFileFromFMS(guids);
  295. }
  296. //删除架构和文件关联表
  297. assoTreeNodeFiles.remove(queryWrapper);
  298. //根据架构id删除架构数据
  299. this.removeBatchByIds(trueIds);
  300. return ids;
  301. }
  302. /**
  303. * 更新架构
  304. *
  305. * @param object
  306. * @param files
  307. * @return
  308. */
  309. @Override
  310. public Object updateMessage(Object object, List<MultipartFile> files) {
  311. //object to treeNode
  312. UpdateTreeNodeDTO updateTreeNodeDTO = (UpdateTreeNodeDTO) object;
  313. //检测传入参数合理性
  314. if (updateTreeNodeDTO == null || updateTreeNodeDTO.getId() == null) {
  315. throw new XiaoShiException("传入参数不能为空");
  316. }
  317. //获取登录人信息
  318. PersonnelVO personnelVO = new PersonnelVO();
  319. personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  320. TreeNode treeNode = this.getById(updateTreeNodeDTO.getId());
  321. //检查名称是否规范
  322. updateTreeNodeDTO.setName(updateTreeNodeDTO.getName().trim());
  323. //根据名称查询是否重复
  324. String name = updateTreeNodeDTO.getName();
  325. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  326. queryWrapper.eq(TreeNode::getName, name);
  327. List<TreeNode> treeNodes = this.list(queryWrapper);
  328. if (!updateTreeNodeDTO.getName().equals(treeNode.getName()) && treeNodes.size() != 0) {
  329. throw new XiaoShiException("节点名称重复");
  330. }
  331. BeanUtils.copyProperties(updateTreeNodeDTO, treeNode);
  332. Integer parentId = updateTreeNodeDTO.getParentId();
  333. //若父id为0,则代表这是顶层id
  334. if (parentId.equals(0)) {
  335. treeNode.setPath("");
  336. treeNode.setLevel(0);
  337. } else {//有父id,根据父id获取它的路径,然后加上父id拼接成该条路径
  338. TreeNode parentNode = this.getById(parentId);
  339. String parentPath = parentNode.getPath();
  340. if (parentPath != null) {
  341. //父id若为顶层id,则父id没有路径
  342. if (parentPath.equals("")) {
  343. treeNode.setPath(parentId + "/");
  344. treeNode.setLevel(1);
  345. } else {
  346. //父id不是顶层id,父id有路径
  347. treeNode.setPath(parentPath + parentId + "/");
  348. treeNode.setLevel(parentNode.getLevel() + 1);
  349. }
  350. } else {
  351. throw new XiaoShiException("数据库中路径错误");
  352. }
  353. }
  354. //数据入表
  355. treeNode.updateById();
  356. /**
  357. * 与架构节点有关文件的处理
  358. */
  359. //根据架构id查询对应的附件id
  360. LambdaQueryWrapper<AssoTreeNodeFile> wrapper = new LambdaQueryWrapper<>();
  361. wrapper.eq(AssoTreeNodeFile::getTreeNodeId, updateTreeNodeDTO.getId());
  362. List<AssoTreeNodeFile> assoFiles = assoTreeNodeFileService.list(wrapper);
  363. List<String> fileGuIds = assoFiles.stream().map(AssoTreeNodeFile::getFileGuid).collect(Collectors.toList());
  364. //获取更新后的附件ids
  365. List<String> updateFileGuIds = new ArrayList<>();
  366. if (updateTreeNodeDTO.getGuids() != null && updateTreeNodeDTO.getGuids().size() != 0) {
  367. updateFileGuIds = updateTreeNodeDTO.getGuids();
  368. fileGuIds.retainAll(updateFileGuIds);
  369. }
  370. //做差获得被删除的文件id
  371. if (fileGuIds.size() != 0) {
  372. //根据文件id删除架构与文件关联表记录
  373. LambdaQueryWrapper<AssoTreeNodeFile> deleteWrapper = new LambdaQueryWrapper<>();
  374. deleteWrapper.in(AssoTreeNodeFile::getFileGuid, fileGuIds);
  375. assoTreeNodeFileService.remove(deleteWrapper);
  376. //远程删除服务器上的文件
  377. try {
  378. fileManagerService.deleteFileFromFMS(fileGuIds);
  379. } catch (Exception e) {
  380. }
  381. }
  382. //处理文件
  383. if (files != null && files.size() != 0) {
  384. try {
  385. List<String> guids = fileManagerService.uploadFileGetGuid(files);
  386. List<AssoTreeNodeFile> assoTreeNodeFiles = new ArrayList<>();
  387. for (String item : guids) {
  388. AssoTreeNodeFile assoTreeNodeFile = new AssoTreeNodeFile();
  389. assoTreeNodeFile.setTreeNodeId(treeNode.getId());
  390. assoTreeNodeFile.setFileGuid(item);
  391. assoTreeNodeFile.setCreateId(personnelVO.getId());
  392. assoTreeNodeFiles.add(assoTreeNodeFile);
  393. }
  394. if (assoTreeNodeFiles != null && assoTreeNodeFiles.size() != 0) {
  395. assoTreeNodeFileService.saveBatch(assoTreeNodeFiles);
  396. }
  397. } catch (Exception e) {
  398. }
  399. }
  400. //返回id
  401. return treeNode.getId();
  402. }
  403. @Override
  404. public GroupVO getGroup(GroupRequest groupRequest, String tableName) throws Exception {
  405. return null;
  406. }
  407. @Override
  408. public Object addMessage(Object object) {
  409. return null;
  410. }
  411. @Override
  412. public Object updateMessage(Object object) {
  413. return null;
  414. }
  415. private void loadTreeNode(List<TreeNodeVO> treeNodeVOS) throws Exception {
  416. List<String> createIds = new ArrayList<>();
  417. List<Integer> ids = new ArrayList<>();
  418. treeNodeVOS.forEach(
  419. item -> {
  420. if (item.getCreateId() != null) {
  421. createIds.add(item.getCreateId());
  422. }
  423. if (item.getId() != null) {
  424. ids.add(item.getId());
  425. }
  426. }
  427. );
  428. if (!CollectionUtils.isEmpty(treeNodeVOS)) {
  429. for (TreeNodeVO nodeVO : treeNodeVOS) {
  430. Integer type = nodeVO.getType();
  431. if (type != null) {
  432. if (type == 1 || type == 2) {
  433. Long relevantProductNum = esProductPatentService.selectRelevantTreeNodeNum(nodeVO.getId(),type);
  434. nodeVO.setRelevantProductNum(relevantProductNum);
  435. }
  436. }
  437. }
  438. }
  439. List<Personnel> personnels = new ArrayList<>();
  440. List<String> guids = new ArrayList<>();
  441. List<SystemFile> systemFiles = new ArrayList<>();
  442. List<AssoTreeNodeFile> assoTreeNodeFiles = new ArrayList<>();
  443. if (ids.size() != 0) {
  444. //根据架构id获得架构与文件关联表
  445. LambdaQueryWrapper<AssoTreeNodeFile> queryWrapper = new LambdaQueryWrapper<>();
  446. queryWrapper.in(AssoTreeNodeFile::getTreeNodeId, ids);
  447. assoTreeNodeFiles = assoTreeNodeFileService.list(queryWrapper);
  448. guids = assoTreeNodeFiles.stream().map(AssoTreeNodeFile::getFileGuid).collect(Collectors.toList());
  449. }
  450. //查询创建人名称
  451. if (createIds.size() != 0) {
  452. String res = permissionService.getPersonnelByIdsFromPCS(createIds);
  453. JSONObject jsonObject = JSONObject.parseObject(res);
  454. personnels = JSONObject.parseArray(jsonObject.getString("data"), Personnel.class);
  455. }
  456. //查询文件
  457. if (guids.size() != 0) {
  458. String res = fileManagerService.getSystemFileFromFMS(guids);
  459. if (res != null && !res.equals("")) {
  460. systemFiles = JSONObject.parseArray(res, SystemFile.class);
  461. }
  462. }
  463. //装载信息
  464. for (TreeNodeVO treeNodeVO : treeNodeVOS) {
  465. //装载人员信息
  466. Personnel personnel = personnels.stream().filter(item -> item.getId().toString().equals(treeNodeVO.getCreateId())).findFirst().orElse(null);
  467. if (personnel != null) {
  468. treeNodeVO.setCreateName(personnel.getPersonnelName());
  469. }
  470. //装载文件信息
  471. List<AssoTreeNodeFile> assoTreeNodeFilesTemp = assoTreeNodeFiles.stream().filter(item -> item.getTreeNodeId().equals(treeNodeVO.getId())).collect(Collectors.toList());
  472. if (assoTreeNodeFilesTemp.size() != 0) {
  473. List<String> guidTemp = assoTreeNodeFilesTemp.stream().map(AssoTreeNodeFile::getFileGuid).collect(Collectors.toList());
  474. if (guidTemp.size() != 0) {
  475. List<SystemFile> systemFileTemp = systemFiles.stream().filter(item -> guidTemp.contains(item.getGuid())).collect(Collectors.toList());
  476. if (systemFileTemp.size() != 0) {
  477. treeNodeVO.setSystemFileList(systemFileTemp);
  478. }
  479. }
  480. }
  481. }
  482. }
  483. //复制节点
  484. @Transactional(rollbackFor = Exception.class)
  485. public void copy(CopyTreeNodeDTO copyTreeNodeDTO) {
  486. Integer fromTypeId = copyTreeNodeDTO.getFromTypeId();
  487. Integer fromType = copyTreeNodeDTO.getFromType();
  488. List<Integer> fromNodeIds = copyTreeNodeDTO.getFromNodeIds();
  489. Integer toTypeId = copyTreeNodeDTO.getToTypeId();
  490. Integer toType = copyTreeNodeDTO.getToType();
  491. Integer toId = copyTreeNodeDTO.getToNodeId();
  492. Boolean ifCopyChild = copyTreeNodeDTO.getIfCopyChild();
  493. Boolean ifDelete = copyTreeNodeDTO.getIfDelete();
  494. List<TreeNodeVO> fromTreeNodeVOS = new ArrayList<>();
  495. //判断是否复制全部
  496. if (fromNodeIds == null || fromNodeIds.size() == 0) {
  497. fromTreeNodeVOS = treeNodeMapper.getTreeNodeByIds(null, false, fromType, fromTypeId);
  498. } else {
  499. fromTreeNodeVOS = treeNodeMapper.getTreeNodeByIds(fromNodeIds, ifCopyChild, null, null);
  500. }
  501. //根据id查出树
  502. List<ReTreeNodeVO> fromReTreeNodeVOs = this.reTrees(fromTreeNodeVOS);
  503. Integer level = 0;
  504. //根据copyId 查询节点
  505. if (toId != null) {
  506. TreeNode treeNode = this.getById(toId);
  507. level = treeNode.getLevel();
  508. for (ReTreeNodeVO item : fromReTreeNodeVOs) {
  509. item.setParentId(toId);
  510. item.setPath(treeNode.getPath() + treeNode.getId() + "/");
  511. item.setLevel(level + 1);
  512. item.setType(treeNode.getType());
  513. item.setTypeId(treeNode.getTypeId());
  514. }
  515. } else {
  516. for (ReTreeNodeVO item : fromReTreeNodeVOs) {
  517. item.setParentId(0);
  518. item.setPath("");
  519. item.setLevel(level);
  520. item.setType(toType);
  521. item.setTypeId(toTypeId);
  522. }
  523. }
  524. List<TreeNodeVO> toTreeNodeVOs = new ArrayList<>();
  525. if (toId != null) {
  526. QueryTreeNodeDTO queryTreeNodeDTO2 = new QueryTreeNodeDTO();
  527. queryTreeNodeDTO2.setId(toId);
  528. toTreeNodeVOs = treeNodeMapper.getTreeNode(queryTreeNodeDTO2);
  529. } else {
  530. toTreeNodeVOs = treeNodeMapper.getTreeNodeByIds(null, true, toType, toTypeId);
  531. }
  532. while (fromReTreeNodeVOs.size() != 0) {
  533. List<ReTreeNodeVO> reTreeNodeVOS = new ArrayList<>();
  534. for (ReTreeNodeVO reTreeNodeVO : fromReTreeNodeVOs) {
  535. //根据父id查找子节点
  536. TreeNodeVO treeNodeVO = toTreeNodeVOs.stream().filter(item -> item.getParentId().equals(reTreeNodeVO.getParentId()) && item.getName().equals(reTreeNodeVO.getName())).findFirst().orElse(null);
  537. //当有相同节点时
  538. if (treeNodeVO != null) {
  539. BeanUtils.copyProperties(treeNodeVO, reTreeNodeVO);
  540. } else {
  541. TreeNode treeNode1 = new TreeNode();
  542. BeanUtils.copyProperties(reTreeNodeVO, treeNode1);
  543. treeNode1.setId(null);
  544. treeNode1.insert();
  545. reTreeNodeVO.setId(treeNode1.getId());
  546. }
  547. //TODO 复制相关专利
  548. List<ReTreeNodeVO> childNodes = reTreeNodeVO.getChild();
  549. if (childNodes != null && childNodes.size() > 0) {
  550. childNodes.forEach(item -> {
  551. item.setParentId(reTreeNodeVO.getId());
  552. item.setPath(reTreeNodeVO.getPath() + reTreeNodeVO.getId());
  553. item.setTypeId(reTreeNodeVO.getTypeId());
  554. item.setType(reTreeNodeVO.getType());
  555. item.setLevel(reTreeNodeVO.getLevel() + 1);
  556. });
  557. reTreeNodeVOS.addAll(childNodes);
  558. }
  559. }
  560. fromReTreeNodeVOs = reTreeNodeVOS;
  561. }
  562. }
  563. public void loadPath(List<TreeNodeVO> treeNodeVOS) {
  564. //装载所有的父节点id
  565. List<Integer> parentIds = new ArrayList<>();
  566. treeNodeVOS.forEach(item -> {
  567. if (item.getPath() != null && !item.getPath().trim().equals("")) {
  568. List<Integer> pathIds = Arrays.stream(item.getPath().split("/")).map(s -> {
  569. if (!s.equals("")) {
  570. return Integer.parseInt(s.trim());
  571. } else {
  572. return null;
  573. }
  574. }).collect(Collectors.toList());
  575. parentIds.addAll(pathIds);
  576. }
  577. });
  578. //根据父节点id查询
  579. List<TreeNode> parentNodes = new ArrayList<>();
  580. if (parentIds.size() != 0) {
  581. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  582. queryWrapper.in(TreeNode::getId, parentIds);
  583. parentNodes = this.list(queryWrapper);
  584. }
  585. //装载路径
  586. for (TreeNodeVO treeNode : treeNodeVOS) {
  587. List<String> pathNames = new ArrayList<>();
  588. if (treeNode.getPath() != null && !treeNode.getPath().trim().equals("")) {
  589. List<Integer> paths = Arrays.stream(treeNode.getPath().split("/")).map(s -> {
  590. if (!s.equals("")) {
  591. return Integer.parseInt(s.trim());
  592. } else return null;
  593. }).collect(Collectors.toList());
  594. for (Integer tem : paths) {
  595. TreeNode treeNode1 = parentNodes.stream().filter(item -> item.getId().equals(tem)).findFirst().orElse(null);
  596. if (treeNode1 != null) {
  597. pathNames.add(treeNode1.getName());
  598. }
  599. }
  600. if (pathNames.size() != 0) {
  601. treeNode.setPathName("/" + StringUtils.join(pathNames, "/"));
  602. }
  603. } else {
  604. treeNode.setPathName("/");
  605. }
  606. }
  607. }
  608. /**
  609. * 查询树
  610. *
  611. * @param queryTreeNodeDTO
  612. * @return
  613. * @throws Exception
  614. */
  615. public Records queryAllPath(QueryAllTreePathDTO queryTreeNodeDTO) throws Exception {
  616. //校验
  617. if (queryTreeNodeDTO == null || queryTreeNodeDTO.getType() == null || queryTreeNodeDTO.getTypeId() == null) {
  618. throw new XiaoShiException("参数错误");
  619. }
  620. //返回数据
  621. Records records = new Records();
  622. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  623. queryWrapper.eq(TreeNode::getType, queryTreeNodeDTO.getType())
  624. .eq(TreeNode::getTypeId, queryTreeNodeDTO.getTypeId()).orderByAsc(TreeNode::getLevel);
  625. List<TreeNode> treeNodes = this.list(queryWrapper);
  626. List<TreePathVO> treeNodeVOS = new ArrayList<>();
  627. TreePathVO treePathFirst = new TreePathVO();
  628. treePathFirst.setId(0);
  629. treePathFirst.setPath("/");
  630. treePathFirst.setPathName("/");
  631. treeNodeVOS.add(treePathFirst);
  632. //装载路径
  633. for (TreeNode treeNode : treeNodes) {
  634. TreePathVO treePathVO = new TreePathVO();
  635. treePathVO.setId(treeNode.getId());
  636. treePathVO.setPath(treeNode.getPath() + treeNode.getId() + "/");
  637. List<String> pathNames = new ArrayList<>();
  638. if (treeNode.getPath() != null && !treeNode.getPath().trim().equals("")) {
  639. List<Integer> paths = Arrays.stream(treeNode.getPath().split("/")).map(s -> {
  640. if (!s.equals("")) {
  641. return Integer.parseInt(s.trim());
  642. } else return null;
  643. }).collect(Collectors.toList());
  644. for (Integer tem : paths) {
  645. TreeNode treeNode1 = treeNodes.stream().filter(item -> item.getId().equals(tem)).findFirst().orElse(null);
  646. if (treeNode1 != null) {
  647. pathNames.add(treeNode1.getName());
  648. }
  649. }
  650. if (pathNames.size() != 0) {
  651. treePathVO.setPathName("/" + StringUtils.join(pathNames, "/") + "/" + treeNode.getName() + "/");
  652. }
  653. } else {
  654. treePathVO.setPathName("/" + treeNode.getName() + "/");
  655. }
  656. treeNodeVOS.add(treePathVO);
  657. }
  658. records.setData(treeNodeVOS);
  659. return records;
  660. }
  661. public List<String> getIdByNames(List<String> values, Integer fieldId, Integer type) {
  662. if (type == 6) {
  663. type = 4;
  664. }
  665. Integer newType = type;
  666. List<String> ids = new ArrayList<>();
  667. values.forEach(item -> {
  668. List<String> nodes = cn.cslg.pas.common.utils.StringUtils.changeStringToString(item, "\\\\");
  669. TreeNode lastTreeNode = null;
  670. for (int i = 0; i < nodes.size(); i++) {
  671. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  672. queryWrapper.eq(TreeNode::getTypeId, fieldId)
  673. .eq(TreeNode::getType, newType)
  674. .eq(TreeNode::getName, nodes.get(i))
  675. .eq(TreeNode::getLevel, i);
  676. if (lastTreeNode == null) {
  677. queryWrapper.eq(TreeNode::getParentId, 0);
  678. } else {
  679. queryWrapper.eq(TreeNode::getParentId, lastTreeNode.getId());
  680. }
  681. TreeNode treeNode = this.getOne(queryWrapper);
  682. if (treeNode == null) {
  683. treeNode = new TreeNode();
  684. treeNode.setLevel(i);
  685. treeNode.setName(nodes.get(i));
  686. treeNode.setType(newType);
  687. treeNode.setTypeId(fieldId);
  688. treeNode.setParentId(0);
  689. treeNode.setPath("");
  690. if (lastTreeNode != null) {
  691. treeNode.setParentId(lastTreeNode.getId());
  692. if (lastTreeNode.getParentId() == 0) {
  693. treeNode.setPath("" + lastTreeNode.getId());
  694. } else {
  695. treeNode.setPath(lastTreeNode.getPath() + "/" + lastTreeNode.getId());
  696. }
  697. }
  698. treeNode.insert();
  699. }
  700. lastTreeNode = treeNode;
  701. if (nodes.size() - 1 == i) {
  702. ids.add(treeNode.getId().toString());
  703. }
  704. }
  705. });
  706. return ids;
  707. }
  708. //
  709. public List<String> getIdByNames2(List<String> values, Integer fieldId, Integer conditionId) {
  710. List<String> valuesIds = new ArrayList<>();
  711. for (String value : values) {
  712. String[] valueQs = value.split("\\\\");
  713. TreeNode treeNode = null;
  714. for (int i = 0; i < valueQs.length; i++) {
  715. String valueQ = valueQs[i];
  716. treeNode = this.getTreeNodeByName(valueQ, i, fieldId, treeNode, conditionId);
  717. if (i == valueQs.length - 1) {
  718. if (!valuesIds.contains(treeNode.getId())) {
  719. valuesIds.add(treeNode.getId().toString());
  720. }
  721. }
  722. }
  723. }
  724. return valuesIds;
  725. }
  726. public TreeNode getTreeNodeByName(String value, Integer level, Integer fieldId, TreeNode parentTreeNode, Integer conditionId) {
  727. Integer parentId = 0;
  728. if (parentTreeNode != null) {
  729. parentId = parentTreeNode.getId();
  730. }
  731. //根据名称查询
  732. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  733. queryWrapper.eq(TreeNode::getName, value)
  734. .eq(TreeNode::getLevel, level)
  735. .eq(TreeNode::getParentId, parentId)
  736. .eq(TreeNode::getType, 4)
  737. .eq(TreeNode::getTypeId, fieldId);
  738. TreeNode treeNode = this.getOne(queryWrapper, false);
  739. if (treeNode == null) {
  740. treeNode = new TreeNode();
  741. treeNode.setName(value);
  742. treeNode.setType(4);
  743. treeNode.setParentId(parentId);
  744. treeNode.setLevel(level);
  745. treeNode.setTypeId(fieldId);
  746. if (parentTreeNode != null) {
  747. treeNode.setPath(parentTreeNode.getPath() + "/" + parentTreeNode.getId());
  748. } else {
  749. treeNode.setPath("");
  750. }
  751. treeNode.insert();
  752. }
  753. return treeNode;
  754. }
  755. /**
  756. * 添加自定义树节点
  757. *
  758. * @param treeNodeDTO
  759. * @return
  760. */
  761. public TreeNode addTreeNode(TreeNodeDTO treeNodeDTO) {
  762. //object to treeNodeDTO
  763. //检测名称是否规范
  764. treeNodeDTO.setName(treeNodeDTO.getName().trim());
  765. //根据名称查询是否重复
  766. String name = treeNodeDTO.getName();
  767. Integer parentId = treeNodeDTO.getParentId();
  768. Integer type = treeNodeDTO.getType();
  769. Integer typeId = treeNodeDTO.getTypeId();
  770. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  771. queryWrapper.eq(TreeNode::getName, name);
  772. queryWrapper.eq(TreeNode::getParentId, parentId);
  773. queryWrapper.eq(TreeNode::getType, type);
  774. queryWrapper.eq(TreeNode::getTypeId, typeId);
  775. List<TreeNode> treeNodes = this.list(queryWrapper);
  776. if (treeNodes != null && treeNodes.size() != 0) {
  777. throw new XiaoShiException("名称不能重复!");
  778. }
  779. //赋值
  780. TreeNode treeNode = new TreeNode();
  781. BeanUtils.copyProperties(treeNodeDTO, treeNode);
  782. //若父id为0,则代表这是顶层id
  783. if (parentId.equals(0)) {
  784. treeNode.setPath("");
  785. treeNode.setLevel(0);
  786. } else {//有父id,根据父id获取它的路径,然后加上父id拼接成该条路径
  787. TreeNode parentNode = this.getById(parentId);
  788. String parentPath = parentNode.getPath();
  789. if (parentPath != null) {
  790. //父id若为顶层id,则父id没有路径
  791. if (parentPath.equals("")) {
  792. treeNode.setPath(parentId + "");
  793. treeNode.setLevel(1);
  794. } else {
  795. //父id不是顶层id,父id有路径
  796. treeNode.setPath(parentPath + "/" + parentId);
  797. treeNode.setLevel(parentNode.getLevel() + 1);
  798. }
  799. } else {
  800. throw new XiaoShiException("数据库中路径错误");
  801. }
  802. }
  803. treeNode.setCreateId(treeNodeDTO.getPersonId());
  804. treeNode.insert();
  805. //返回id
  806. return treeNode;
  807. }
  808. }