4517f9ce5b61bdcd7a011b9cf0bf7bc7df1a1921.svn-base 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package org.jeecg.modules.demo.resManager.catalog.service.impl;
  2. import org.jeecg.common.exception.JeecgBootException;
  3. import org.jeecg.common.util.oConvertUtils;
  4. import org.jeecg.modules.demo.resManager.catalog.entity.Rescatalog;
  5. import org.jeecg.modules.demo.resManager.catalog.mapper.RescatalogMapper;
  6. import org.jeecg.modules.demo.resManager.catalog.service.IRescatalogService;
  7. import org.springframework.stereotype.Service;
  8. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  9. import org.springframework.transaction.annotation.Transactional;
  10. import java.util.ArrayList;
  11. import java.util.Arrays;
  12. import java.util.List;
  13. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  14. /**
  15. * @Description: 资源目录
  16. * @Author: jeecg-boot
  17. * @Date: 2022-01-17
  18. * @Version: V1.0
  19. */
  20. @Service
  21. public class RescatalogServiceImpl extends ServiceImpl<RescatalogMapper, Rescatalog> implements IRescatalogService {
  22. @Override
  23. public void addRescatalog(Rescatalog rescatalog) {
  24. //新增时设置hasChild为0
  25. rescatalog.setHasChild(IRescatalogService.NOCHILD);
  26. if(oConvertUtils.isEmpty(rescatalog.getPid())){
  27. rescatalog.setPid(IRescatalogService.ROOT_PID_VALUE);
  28. }else{
  29. //如果当前节点父ID不为空 则设置父节点的hasChildren 为1
  30. Rescatalog parent = baseMapper.selectById(rescatalog.getPid());
  31. if(parent!=null && !"1".equals(parent.getHasChild())){
  32. parent.setHasChild("1");
  33. baseMapper.updateById(parent);
  34. }
  35. }
  36. baseMapper.insert(rescatalog);
  37. }
  38. @Override
  39. public void updateRescatalog(Rescatalog rescatalog) {
  40. Rescatalog entity = this.getById(rescatalog.getId());
  41. if(entity==null) {
  42. throw new JeecgBootException("未找到对应实体");
  43. }
  44. String old_pid = entity.getPid();
  45. String new_pid = rescatalog.getPid();
  46. if(!old_pid.equals(new_pid)) {
  47. updateOldParentNode(old_pid);
  48. if(oConvertUtils.isEmpty(new_pid)){
  49. rescatalog.setPid(IRescatalogService.ROOT_PID_VALUE);
  50. }
  51. if(!IRescatalogService.ROOT_PID_VALUE.equals(rescatalog.getPid())) {
  52. baseMapper.updateTreeNodeStatus(rescatalog.getPid(), IRescatalogService.HASCHILD);
  53. }
  54. }
  55. baseMapper.updateById(rescatalog);
  56. }
  57. @Override
  58. @Transactional(rollbackFor = Exception.class)
  59. public void deleteRescatalog(String id) throws JeecgBootException {
  60. //查询选中节点下所有子节点一并删除
  61. id = this.queryTreeChildIds(id);
  62. if(id.indexOf(",")>0) {
  63. StringBuffer sb = new StringBuffer();
  64. String[] idArr = id.split(",");
  65. for (String idVal : idArr) {
  66. if(idVal != null){
  67. Rescatalog rescatalog = this.getById(idVal);
  68. String pidVal = rescatalog.getPid();
  69. //查询此节点上一级是否还有其他子节点
  70. List<Rescatalog> dataList = baseMapper.selectList(new QueryWrapper<Rescatalog>().eq("pid", pidVal).notIn("id",Arrays.asList(idArr)));
  71. if((dataList == null || dataList.size()==0) && !Arrays.asList(idArr).contains(pidVal)
  72. && !sb.toString().contains(pidVal)){
  73. //如果当前节点原本有子节点 现在木有了,更新状态
  74. sb.append(pidVal).append(",");
  75. }
  76. }
  77. }
  78. //批量删除节点
  79. baseMapper.deleteBatchIds(Arrays.asList(idArr));
  80. //修改已无子节点的标识
  81. String[] pidArr = sb.toString().split(",");
  82. for(String pid : pidArr){
  83. this.updateOldParentNode(pid);
  84. }
  85. }else{
  86. Rescatalog rescatalog = this.getById(id);
  87. if(rescatalog==null) {
  88. throw new JeecgBootException("未找到对应实体");
  89. }
  90. updateOldParentNode(rescatalog.getPid());
  91. baseMapper.deleteById(id);
  92. }
  93. }
  94. @Override
  95. public List<Rescatalog> queryTreeListNoPage(QueryWrapper<Rescatalog> queryWrapper) {
  96. List<Rescatalog> dataList = baseMapper.selectList(queryWrapper);
  97. List<Rescatalog> mapList = new ArrayList<>();
  98. for(Rescatalog data : dataList){
  99. String pidVal = data.getPid();
  100. //递归查询子节点的根节点
  101. if(pidVal != null && !"0".equals(pidVal)){
  102. Rescatalog rootVal = this.getTreeRoot(pidVal);
  103. if(rootVal != null && !mapList.contains(rootVal)){
  104. mapList.add(rootVal);
  105. }
  106. }else{
  107. if(!mapList.contains(data)){
  108. mapList.add(data);
  109. }
  110. }
  111. }
  112. return mapList;
  113. }
  114. /**
  115. * 根据所传pid查询旧的父级节点的子节点并修改相应状态值
  116. * @param pid
  117. */
  118. private void updateOldParentNode(String pid) {
  119. if(!IRescatalogService.ROOT_PID_VALUE.equals(pid)) {
  120. Integer count = baseMapper.selectCount(new QueryWrapper<Rescatalog>().eq("pid", pid));
  121. if(count==null || count<=1) {
  122. baseMapper.updateTreeNodeStatus(pid, IRescatalogService.NOCHILD);
  123. }
  124. }
  125. }
  126. /**
  127. * 递归查询节点的根节点
  128. * @param pidVal
  129. * @return
  130. */
  131. private Rescatalog getTreeRoot(String pidVal){
  132. Rescatalog data = baseMapper.selectById(pidVal);
  133. if(data != null && !"0".equals(data.getPid())){
  134. return this.getTreeRoot(data.getPid());
  135. }else{
  136. return data;
  137. }
  138. }
  139. /**
  140. * 根据id查询所有子节点id
  141. * @param ids
  142. * @return
  143. */
  144. private String queryTreeChildIds(String ids) {
  145. //获取id数组
  146. String[] idArr = ids.split(",");
  147. StringBuffer sb = new StringBuffer();
  148. for (String pidVal : idArr) {
  149. if(pidVal != null){
  150. if(!sb.toString().contains(pidVal)){
  151. if(sb.toString().length() > 0){
  152. sb.append(",");
  153. }
  154. sb.append(pidVal);
  155. this.getTreeChildIds(pidVal,sb);
  156. }
  157. }
  158. }
  159. return sb.toString();
  160. }
  161. /**
  162. * 递归查询所有子节点
  163. * @param pidVal
  164. * @param sb
  165. * @return
  166. */
  167. private StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){
  168. List<Rescatalog> dataList = baseMapper.selectList(new QueryWrapper<Rescatalog>().eq("pid", pidVal));
  169. if(dataList != null && dataList.size()>0){
  170. for(Rescatalog tree : dataList) {
  171. if(!sb.toString().contains(tree.getId())){
  172. sb.append(",").append(tree.getId());
  173. }
  174. this.getTreeChildIds(tree.getId(),sb);
  175. }
  176. }
  177. return sb;
  178. }
  179. }