510703ab6b485e42b8bb2510b90ae4149bcb6261.svn-base 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package org.jeecg.modules.system.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import org.jeecg.common.constant.FillRuleConstant;
  8. import org.jeecg.common.exception.JeecgBootException;
  9. import org.jeecg.common.util.FillRuleUtil;
  10. import org.jeecg.common.util.oConvertUtils;
  11. import org.jeecg.modules.system.entity.SysCategory;
  12. import org.jeecg.modules.system.mapper.SysCategoryMapper;
  13. import org.jeecg.modules.system.model.TreeSelectModel;
  14. import org.jeecg.modules.system.service.ISysCategoryService;
  15. import org.springframework.stereotype.Service;
  16. import org.springframework.transaction.annotation.Transactional;
  17. import java.util.ArrayList;
  18. import java.util.Arrays;
  19. import java.util.List;
  20. import java.util.Map;
  21. import java.util.stream.Collectors;
  22. /**
  23. * @Description: 分类字典
  24. * @Author: jeecg-boot
  25. * @Date: 2019-05-29
  26. * @Version: V1.0
  27. */
  28. @Service
  29. public class SysCategoryServiceImpl extends ServiceImpl<SysCategoryMapper, SysCategory> implements ISysCategoryService {
  30. @Override
  31. public void addSysCategory(SysCategory sysCategory) {
  32. String categoryCode = "";
  33. String categoryPid = ISysCategoryService.ROOT_PID_VALUE;
  34. String parentCode = null;
  35. if(oConvertUtils.isNotEmpty(sysCategory.getPid())){
  36. categoryPid = sysCategory.getPid();
  37. //PID 不是根节点 说明需要设置父节点 hasChild 为1
  38. if(!ISysCategoryService.ROOT_PID_VALUE.equals(categoryPid)){
  39. SysCategory parent = baseMapper.selectById(categoryPid);
  40. parentCode = parent.getCode();
  41. if(parent!=null && !"1".equals(parent.getHasChild())){
  42. parent.setHasChild("1");
  43. baseMapper.updateById(parent);
  44. }
  45. }
  46. }
  47. //update-begin--Author:baihailong Date:20191209 for:分类字典编码规则生成器做成公用配置
  48. JSONObject formData = new JSONObject();
  49. formData.put("pid",categoryPid);
  50. categoryCode = (String) FillRuleUtil.executeRule(FillRuleConstant.CATEGORY,formData);
  51. //update-end--Author:baihailong Date:20191209 for:分类字典编码规则生成器做成公用配置
  52. sysCategory.setCode(categoryCode);
  53. sysCategory.setPid(categoryPid);
  54. baseMapper.insert(sysCategory);
  55. }
  56. @Override
  57. public void updateSysCategory(SysCategory sysCategory) {
  58. if(oConvertUtils.isEmpty(sysCategory.getPid())){
  59. sysCategory.setPid(ISysCategoryService.ROOT_PID_VALUE);
  60. }else{
  61. //如果当前节点父ID不为空 则设置父节点的hasChild 为1
  62. SysCategory parent = baseMapper.selectById(sysCategory.getPid());
  63. if(parent!=null && !"1".equals(parent.getHasChild())){
  64. parent.setHasChild("1");
  65. baseMapper.updateById(parent);
  66. }
  67. }
  68. baseMapper.updateById(sysCategory);
  69. }
  70. @Override
  71. public List<TreeSelectModel> queryListByCode(String pcode) throws JeecgBootException{
  72. String pid = ROOT_PID_VALUE;
  73. if(oConvertUtils.isNotEmpty(pcode)) {
  74. List<SysCategory> list = baseMapper.selectList(new LambdaQueryWrapper<SysCategory>().eq(SysCategory::getCode, pcode));
  75. if(list==null || list.size() ==0) {
  76. throw new JeecgBootException("该编码【"+pcode+"】不存在,请核实!");
  77. }
  78. if(list.size()>1) {
  79. throw new JeecgBootException("该编码【"+pcode+"】存在多个,请核实!");
  80. }
  81. pid = list.get(0).getId();
  82. }
  83. return baseMapper.queryListByPid(pid,null);
  84. }
  85. @Override
  86. public List<TreeSelectModel> queryListByPid(String pid) {
  87. if(oConvertUtils.isEmpty(pid)) {
  88. pid = ROOT_PID_VALUE;
  89. }
  90. return baseMapper.queryListByPid(pid,null);
  91. }
  92. @Override
  93. public List<TreeSelectModel> queryListByPid(String pid, Map<String, String> condition) {
  94. if(oConvertUtils.isEmpty(pid)) {
  95. pid = ROOT_PID_VALUE;
  96. }
  97. return baseMapper.queryListByPid(pid,condition);
  98. }
  99. @Override
  100. public String queryIdByCode(String code) {
  101. return baseMapper.queryIdByCode(code);
  102. }
  103. @Override
  104. @Transactional(rollbackFor = Exception.class)
  105. public void deleteSysCategory(String ids) {
  106. String allIds = this.queryTreeChildIds(ids);
  107. String pids = this.queryTreePids(ids);
  108. //1.删除时将节点下所有子节点一并删除
  109. this.baseMapper.deleteBatchIds(Arrays.asList(allIds.split(",")));
  110. //2.将父节点中已经没有下级的节点,修改为没有子节点
  111. if(oConvertUtils.isNotEmpty(pids)){
  112. LambdaUpdateWrapper<SysCategory> updateWrapper = new UpdateWrapper<SysCategory>()
  113. .lambda()
  114. .in(SysCategory::getId,Arrays.asList(pids.split(",")))
  115. .set(SysCategory::getHasChild,"0");
  116. this.update(updateWrapper);
  117. }
  118. }
  119. /**
  120. * 查询节点下所有子节点
  121. * @param ids
  122. * @return
  123. */
  124. private String queryTreeChildIds(String ids) {
  125. //获取id数组
  126. String[] idArr = ids.split(",");
  127. StringBuffer sb = new StringBuffer();
  128. for (String pidVal : idArr) {
  129. if(pidVal != null){
  130. if(!sb.toString().contains(pidVal)){
  131. if(sb.toString().length() > 0){
  132. sb.append(",");
  133. }
  134. sb.append(pidVal);
  135. this.getTreeChildIds(pidVal,sb);
  136. }
  137. }
  138. }
  139. return sb.toString();
  140. }
  141. /**
  142. * 查询需修改标识的父节点ids
  143. * @param ids
  144. * @return
  145. */
  146. private String queryTreePids(String ids) {
  147. StringBuffer sb = new StringBuffer();
  148. //获取id数组
  149. String[] idArr = ids.split(",");
  150. for (String id : idArr) {
  151. if(id != null){
  152. SysCategory category = this.baseMapper.selectById(id);
  153. //根据id查询pid值
  154. String metaPid = category.getPid();
  155. //查询此节点上一级是否还有其他子节点
  156. LambdaQueryWrapper<SysCategory> queryWrapper = new LambdaQueryWrapper<>();
  157. queryWrapper.eq(SysCategory::getPid,metaPid);
  158. queryWrapper.notIn(SysCategory::getId,Arrays.asList(idArr));
  159. List<SysCategory> dataList = this.baseMapper.selectList(queryWrapper);
  160. if((dataList == null || dataList.size()==0) && !Arrays.asList(idArr).contains(metaPid)
  161. && !sb.toString().contains(metaPid)){
  162. //如果当前节点原本有子节点 现在木有了,更新状态
  163. sb.append(metaPid).append(",");
  164. }
  165. }
  166. }
  167. if(sb.toString().endsWith(",")){
  168. sb = sb.deleteCharAt(sb.length() - 1);
  169. }
  170. return sb.toString();
  171. }
  172. /**
  173. * 递归 根据父id获取子节点id
  174. * @param pidVal
  175. * @param sb
  176. * @return
  177. */
  178. private StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){
  179. LambdaQueryWrapper<SysCategory> queryWrapper = new LambdaQueryWrapper<>();
  180. queryWrapper.eq(SysCategory::getPid,pidVal);
  181. List<SysCategory> dataList = baseMapper.selectList(queryWrapper);
  182. if(dataList != null && dataList.size()>0){
  183. for(SysCategory category : dataList) {
  184. if(!sb.toString().contains(category.getId())){
  185. sb.append(",").append(category.getId());
  186. }
  187. this.getTreeChildIds(category.getId(), sb);
  188. }
  189. }
  190. return sb;
  191. }
  192. @Override
  193. public List<String> loadDictItem(String ids) {
  194. return this.loadDictItem(ids, true);
  195. }
  196. @Override
  197. public List<String> loadDictItem(String ids, boolean delNotExist) {
  198. String[] idArray = ids.split(",");
  199. LambdaQueryWrapper<SysCategory> query = new LambdaQueryWrapper<>();
  200. query.in(SysCategory::getId, Arrays.asList(idArray));
  201. // 查询数据
  202. List<SysCategory> list = super.list(query);
  203. // 取出name并返回
  204. List<String> textList;
  205. // update-begin--author:sunjianlei--date:20210514--for:新增delNotExist参数,设为false不删除数据库里不存在的key ----
  206. if (delNotExist) {
  207. textList = list.stream().map(SysCategory::getName).collect(Collectors.toList());
  208. } else {
  209. textList = new ArrayList<>();
  210. for (String id : idArray) {
  211. List<SysCategory> res = list.stream().filter(i -> id.equals(i.getId())).collect(Collectors.toList());
  212. textList.add(res.size() > 0 ? res.get(0).getName() : id);
  213. }
  214. }
  215. // update-end--author:sunjianlei--date:20210514--for:新增delNotExist参数,设为false不删除数据库里不存在的key ----
  216. return textList;
  217. }
  218. }