serviceImpl.java.vm 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. package ${packageName}.service.impl;
  2. ##判断是否包含用户选择框的标志位
  3. #set( $hasUser = 0)
  4. ##判断是否包含用户选择框的标志位
  5. #set( $hasDept = 0)
  6. #foreach($column in $columns)
  7. #if($column.htmlType == "user")
  8. #set( $hasUser = $hasUser + 1)
  9. #elseif($column.htmlType == "dept")
  10. #set( $hasDept = $hasDept + 1)
  11. #end
  12. #end
  13. import java.util.*;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import com.alibaba.fastjson2.JSONObject;
  17. import org.springframework.stereotype.Service;
  18. import org.springframework.transaction.annotation.Transactional;
  19. import org.apache.commons.collections.CollectionUtils;
  20. import com.aidex.common.constant.Constants;
  21. import com.aidex.common.utils.StringUtils;
  22. import com.aidex.common.core.domain.BaseEntity;
  23. import com.aidex.common.exception.BizException;
  24. import com.aidex.common.core.domain.TreeNode;
  25. import com.aidex.common.utils.uuid.IdUtils;
  26. import com.aidex.common.core.domain.entity.SysUser;
  27. import com.aidex.common.core.domain.entity.SysDept;
  28. import com.aidex.common.core.service.BaseTreeServiceImpl;
  29. import com.aidex.framework.cache.DeptUtils;
  30. import com.aidex.framework.cache.UserUtils;
  31. import ${packageName}.mapper.${ClassName}Mapper;
  32. import ${packageName}.domain.${ClassName};
  33. import ${packageName}.service.${ClassName}Service;
  34. ##是否有排序字段
  35. #foreach($column in $columns)
  36. #if($column.columnName == "tree_sort")
  37. import com.aidex.common.utils.NumberUtils;
  38. #break;
  39. #end
  40. #end
  41. ##唯一性校验
  42. #foreach($column in $columns)
  43. #if($column.isUnique == "1")
  44. import com.aidex.common.exception.BizException;
  45. #break;
  46. #end
  47. #end
  48. /**
  49. * ${functionName}Service业务层处理
  50. * @author ${functionAuthor}
  51. * @email ${functionAuthorEmail}
  52. * @date ${datetime}
  53. */
  54. @Service
  55. @Transactional(readOnly = true)
  56. public class ${ClassName}ServiceImpl extends BaseTreeServiceImpl<${ClassName}Mapper, ${ClassName}> implements ${ClassName}Service
  57. {
  58. private static final Logger log = LoggerFactory.getLogger(${ClassName}ServiceImpl.class);
  59. private static final int ID_LIMIT = 500;
  60. /**
  61. * 获取单条数据
  62. * @param ${className} ${functionName}
  63. * @return ${functionName}
  64. */
  65. @Override
  66. public ${ClassName} get(${ClassName} ${className}) {
  67. ${ClassName} dto = super.get(${className});
  68. #foreach($column in $columns)
  69. #set($javaField=$column.javaField)
  70. #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  71. #if($column.htmlType == "user")
  72. if (StringUtils.isNotEmpty(dto.get${AttrName}())){
  73. SysUser sysUser = UserUtils.getSysUser(dto.get${AttrName}());
  74. if (null != sysUser){
  75. dto.set${AttrName}Name(sysUser.getName());
  76. }
  77. }
  78. #elseif($column.htmlType == "dept")
  79. if (StringUtils.isNotEmpty(dto.get${AttrName}())){
  80. SysDept sysDept = DeptUtils.getSysDept(dto.get${AttrName}());
  81. if (null != sysDept){
  82. dto.set${AttrName}Name(sysDept.getDeptName());
  83. }
  84. }
  85. #end
  86. #end
  87. return dto;
  88. }
  89. /**
  90. * 获取单条数据
  91. * @param id ${functionName}id
  92. * @return ${functionName}
  93. */
  94. @Override
  95. public ${ClassName} get(String id) {
  96. ${ClassName} dto = super.get(id);
  97. #foreach($column in $columns)
  98. #set($javaField=$column.javaField)
  99. #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  100. #if($column.htmlType == "user")
  101. if (StringUtils.isNotEmpty(dto.get${AttrName}())){
  102. SysUser sysUser = UserUtils.getSysUser(dto.get${AttrName}());
  103. if (null != sysUser){
  104. dto.set${AttrName}Name(sysUser.getName());
  105. }
  106. }
  107. #elseif($column.htmlType == "dept")
  108. if (StringUtils.isNotEmpty(dto.get${AttrName}())){
  109. SysDept sysDept = DeptUtils.getSysDept(dto.get${AttrName}());
  110. if (null != sysDept){
  111. dto.set${AttrName}Name(sysDept.getDeptName());
  112. }
  113. }
  114. #end
  115. #end
  116. return dto;
  117. }
  118. /**
  119. * 根据展开层级和父节点递归获取展示的数据
  120. * @param level 展开层级
  121. * @param id 父节点ID
  122. * @return
  123. */
  124. @Override
  125. public List<${ClassName}> listDataByLevel(int level, String id) {
  126. List<${ClassName}> listData = new ArrayList<${ClassName}>();
  127. level--;
  128. List<${ClassName}> childrenList = findChildListByParentId(id);
  129. for (${ClassName} dto : childrenList) {
  130. if ("n".equals(dto.getTreeLeaf()) && level != 0) {
  131. dto.setChildren(this.listDataByLevel(level, dto.getId()));
  132. } else {
  133. dto.setChildren(new ArrayList<>());
  134. }
  135. listData.add(dto);
  136. }
  137. return listData;
  138. }
  139. /**
  140. * 根据父ID查询当前子节点集合
  141. * @param parentId 父节点ID
  142. * @return
  143. */
  144. @Override
  145. public List<${ClassName}> findChildListByParentId(String parentId) {
  146. ${ClassName} ${className} = new ${ClassName}();
  147. ${className}.setParentId(parentId);
  148. List<${ClassName}> ${className}List = super.findList(${className});
  149. #if($hasUser >0 || $hasDept >0)
  150. if (!CollectionUtils.isEmpty(${className}List)) {
  151. ${className}List.stream().forEach(dto -> {
  152. #foreach($column in $columns)
  153. #set($javaField=$column.javaField)
  154. #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  155. #if($column.htmlType == "user")
  156. if (StringUtils.isNotEmpty(dto.get${AttrName}())){
  157. SysUser sysUser = UserUtils.getSysUser(dto.get${AttrName}());
  158. if (null != sysUser){
  159. dto.set${AttrName}Name(sysUser.getName());
  160. }
  161. }
  162. #elseif($column.htmlType == "dept")
  163. if (StringUtils.isNotEmpty(dto.get${AttrName}())){
  164. SysDept sysDept = DeptUtils.getSysDept(dto.get${AttrName}());
  165. if (null != sysDept){
  166. dto.set${AttrName}Name(sysDept.getDeptName());
  167. }
  168. }
  169. #end
  170. #end
  171. });
  172. }
  173. #end
  174. return ${className}List;
  175. }
  176. /**
  177. * 构建前端所需要树结构
  178. * @param level 展开层级
  179. * @param parentId 父节点ID
  180. * @return
  181. */
  182. @Override
  183. public List<TreeNode> buildTree(int level, String parentId){
  184. ${ClassName} ${className} = new ${ClassName}();
  185. ${className}.setId(StringUtils.EMPTY);
  186. return this.buildTreeDataExcludeChild(level, parentId, ${className});
  187. }
  188. /**
  189. * 递归构建前端所需要树结构
  190. * @param level 展开层级
  191. * @param parentId 父节点ID
  192. * @param exclude${ClassName} 排除节点信息
  193. * @return
  194. */
  195. @Override
  196. public List<TreeNode> buildTreeDataExcludeChild(int level, String parentId, ${ClassName} exclude${ClassName}) {
  197. List<TreeNode> listData = new ArrayList<TreeNode>();
  198. level--;
  199. ${ClassName} ${className}Query = new ${ClassName}();
  200. ${className}Query.setParentId(parentId);
  201. ${className}Query.setStatus(BaseEntity.STATUS_NORMAL);
  202. List<${ClassName}> ${className}List = super.findList(${className}Query);
  203. for (${ClassName} ${className} : ${className}List) {
  204. if (!${className}.getId().equals(exclude${ClassName}.getId())) {
  205. TreeNode treeNode = this.convertTreeNodeData(${className});
  206. if ("n".equals(${className}.getTreeLeaf()) && level != 0) {
  207. treeNode.setChildren(this.buildTreeDataExcludeChild(level, ${className}.getId(), exclude${ClassName}));
  208. } else {
  209. treeNode.setChildren(null);
  210. }
  211. //判断父节点的加好是否需要展开:如果没有兄弟节点,则该父节点收起来
  212. if(${className}.getId().equals(exclude${ClassName}.getParentId())){
  213. if (CollectionUtils.isEmpty(treeNode.getChildren())) {
  214. treeNode.setIsLeaf(true);
  215. }
  216. }
  217. //不展开节点的父节点数据处理
  218. if (CollectionUtils.isEmpty(treeNode.getChildren())) {
  219. treeNode.setChildren(null);
  220. }
  221. listData.add(treeNode);
  222. }
  223. }
  224. return listData;
  225. }
  226. /**
  227. * 保存${functionName}
  228. * @param ${className}
  229. * @return
  230. */
  231. @Override
  232. public boolean save(${ClassName} ${className})
  233. {
  234. #foreach($column in $columns)
  235. #if($column.isUnique == "1")
  236. #set($attrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  237. check${attrName}Unique(${className});
  238. #end
  239. #end
  240. ${ClassName} parent${ClassName} = mapper.get(${className}.getParentId());
  241. if (StringUtils.isEmpty(${className}.getId())) {
  242. if (null != parent${ClassName}) {
  243. setTreeProperties(${className}, null, Constants.OpType.insert);
  244. super.save(${className});
  245. } else {
  246. //新增根节点
  247. ${className}.setId(IdUtils.randomUUID());
  248. ${className}.setNewRecord(true);
  249. ${className}.setParentIds(${className}.getId());
  250. // 设置当前树全路径排序
  251. Integer treeSort = ${className}.getTreeSort();
  252. String treeSorts = String.format("%06d", treeSort);
  253. ${className}.setTreeSorts(treeSorts);
  254. ${className}.setTreeLeaf(Constants.TREE_LEAF_Y);
  255. // 设置当前节点级别.
  256. ${className}.setTreeLevel(1);
  257. super.save(${className});
  258. }
  259. } else {
  260. ${ClassName} old${ClassName} = mapper.get(${className});
  261. List<${ClassName}> updateChildList = new ArrayList<${ClassName}>();
  262. if (isUpdateTreeProperties(${className}, old${ClassName})) {
  263. setTreeProperties(${className}, old${ClassName}, Constants.OpType.update);
  264. updateChildList = updateChildTreeProperties(${className}, old${ClassName});
  265. if (!CollectionUtils.isEmpty(updateChildList)) {
  266. mapper.update${ClassName}Children(updateChildList);
  267. }
  268. }
  269. parent${ClassName} = mapper.get(${className}.getParentId());
  270. // 新的父节点变更为非叶子节点
  271. if (!Constants.TREE_ROOT.equals(${className}.getParentId())
  272. && parent${ClassName}.getTreeLeaf().equals(Constants.TREE_LEAF_Y)) {
  273. parent${ClassName}.setTreeLeaf(Constants.TREE_LEAF_N);
  274. super.save(parent${ClassName});
  275. }
  276. String oldParentId = old${ClassName}.getParentId();
  277. super.save(${className});
  278. // 判断原节点是否还有子节点,否则改为叶子节点
  279. if (!hasChildByParentId(oldParentId)) {
  280. ${ClassName} oldParent${ClassName} = mapper.get(oldParentId);
  281. oldParent${ClassName}.setTreeLeaf(Constants.TREE_LEAF_Y);
  282. super.save(oldParent${ClassName});
  283. }
  284. }
  285. return Boolean.TRUE;
  286. }
  287. #if($hasDisableEnable)
  288. /**
  289. * 更新${functionName}状态
  290. * @param ${className}
  291. * @return 结果
  292. */
  293. @Transactional(readOnly = false)
  294. @Override
  295. public int updateStatus(${ClassName} ${className}) {
  296. return mapper.updateStatus(${className});
  297. }
  298. #end
  299. /**
  300. * 删除${functionName}信息
  301. * @param ${className}
  302. * @return
  303. */
  304. @Override
  305. public boolean remove(${ClassName} ${className})
  306. {
  307. ${className} = get(${className});
  308. if (hasChildByParentId(${className}.getId()))
  309. {
  310. throw new BizException("存在子节点数据,不允许删除");
  311. }
  312. super.remove(${className});
  313. //判断当前父节点下还是否有子节点,如果没有,则需要把父节点置为叶子节点
  314. ${ClassName} parent${ClassName} = mapper.get(${className}.getParentId());
  315. if (findChildCountById(${className}.getParentId()) == 0) {
  316. parent${ClassName}.setTreeLeaf(Constants.TREE_LEAF_Y);
  317. super.save(parent${ClassName});
  318. }
  319. return Boolean.TRUE;
  320. }
  321. /**
  322. * 是否存在子节点
  323. * @param parentId 部门ID
  324. * @return 结果
  325. */
  326. @Override
  327. public boolean hasChildByParentId(String parentId) {
  328. int result = findChildCountById(parentId);
  329. return result > 0;
  330. }
  331. /**
  332. * 查询子节点数量
  333. * @param parentId
  334. * @return
  335. */
  336. private Integer findChildCountById(String parentId) {
  337. ${ClassName} ${className} = new ${ClassName}();
  338. ${className}.setParentId(parentId);
  339. return mapper.findCount(${className});
  340. }
  341. /**
  342. * 树表格检索
  343. * @param queryParams 检索对象
  344. * @return
  345. */
  346. @Override
  347. public List<${ClassName}> search${ClassName}List(${ClassName} queryParams){
  348. List<${ClassName}> ${className}List = new ArrayList<${ClassName}>();
  349. List<${ClassName}> searchNodes = mapper.search${ClassName}Tree(queryParams);
  350. if (!CollectionUtils.isEmpty(searchNodes)){
  351. Set<String> treeIdSet = getTreeIdByTreePath(searchNodes);
  352. int i = 0;
  353. //考虑mybatis foreach的限制,所以定义参数格式为list内还是list
  354. List<List<String>> idsList = new ArrayList<List<String>>();
  355. List<String> idList = new ArrayList<String>();
  356. for (String treeId : treeIdSet) {
  357. //当id个数超出限制后,则新new一个list来存放
  358. if(i % ID_LIMIT == 0 && i > 0){
  359. idsList.add(idList);
  360. idList = new ArrayList<String>();
  361. }
  362. idList.add(treeId);
  363. i++;
  364. }
  365. idsList.add(idList);
  366. List<${ClassName}> allNodes = mapper.search${ClassName}TreeByIds(idsList);
  367. ${className}List = createTreeGridData(allNodes);
  368. }
  369. return ${className}List;
  370. }
  371. /**
  372. * 树检索
  373. * @param queryParams 检索对象
  374. * @return
  375. */
  376. @Override
  377. public List<TreeNode> search${ClassName}(${ClassName} queryParams){
  378. List<TreeNode> ${className}List = new ArrayList<TreeNode>();
  379. List<${ClassName}> searchNodes = mapper.search${ClassName}Tree(queryParams);
  380. if (!CollectionUtils.isEmpty(searchNodes)){
  381. Set<String> treeIdSet = getTreeIdByTreePath(searchNodes);
  382. int i = 0;
  383. //考虑mybatis foreach的限制,所以定义参数格式为list内还是list
  384. List<List<String>> idsList = new ArrayList<List<String>>();
  385. List<String> idList = new ArrayList<String>();
  386. for (String treeId : treeIdSet) {
  387. //当id个数超出限制后,则新new一个list来存放
  388. if(i % ID_LIMIT == 0 && i > 0){
  389. idsList.add(idList);
  390. idList = new ArrayList<String>();
  391. }
  392. idList.add(treeId);
  393. i++;
  394. }
  395. idsList.add(idList);
  396. List<${ClassName}> allNodes = mapper.search${ClassName}TreeByIds(idsList);
  397. ${className}List = createTreeData(allNodes);
  398. }
  399. return ${className}List;
  400. }
  401. /**
  402. * 根据parentIds去重
  403. * @param entityNodes entityNodes
  404. */
  405. private Set<String> getTreeIdByTreePath(List<${ClassName}> entityNodes) {
  406. Set<String> treeIdSet = new HashSet<String>();
  407. for (${ClassName} dto : entityNodes) {
  408. String treePath = dto.getParentIds();
  409. treeIdSet.addAll(Arrays.asList(treePath.split("/")));
  410. }
  411. return treeIdSet;
  412. }
  413. /**
  414. * 构建树形结构
  415. * @param entityNodes 节点集合
  416. * @return List<${ClassName}>
  417. */
  418. private List<${ClassName}> createTreeGridData(List<${ClassName}> entityNodes) {
  419. List<${ClassName}> treeList = new ArrayList<${ClassName}>();
  420. for (${ClassName} ${className} : entityNodes) {
  421. //找到根节点
  422. if (Constants.TREE_ROOT.equals(${className}.getParentId())) {
  423. treeList.add(${className});
  424. }
  425. List<${ClassName}> children = new ArrayList<${ClassName}>();
  426. //再次遍历list,找到子节点
  427. for (${ClassName} node : entityNodes) {
  428. if (node.getParentId().equals(${className}.getId())) {
  429. children.add(node);
  430. }
  431. }
  432. ${className}.setChildren(children);
  433. }
  434. return treeList;
  435. }
  436. /**
  437. * 构建树形结构
  438. * @param entityNodes 节点集合
  439. * @return List<VueNode>
  440. */
  441. private List<TreeNode> createTreeData(List<${ClassName}> entityNodes) {
  442. List<TreeNode> list = convertTreeNodeDatas(entityNodes);
  443. List<TreeNode> treeList = new ArrayList<TreeNode>();
  444. for (TreeNode treeNode : list) {
  445. //找到根节点
  446. if (Constants.TREE_ROOT.equals(treeNode.getParentId())) {
  447. treeList.add(treeNode);
  448. }
  449. List<TreeNode> children = new ArrayList<TreeNode>();
  450. //再次遍历list,找到子节点
  451. for (TreeNode node : list) {
  452. if (node.getParentId().equals(treeNode.getId())) {
  453. children.add(node);
  454. }
  455. }
  456. treeNode.setChildren(children);
  457. }
  458. return treeList;
  459. }
  460. /**
  461. * 转换前端树节点
  462. * @param listData 树表格数据
  463. * @return
  464. */
  465. private List<TreeNode> convertTreeNodeDatas(List<${ClassName}> listData) {
  466. List<TreeNode> treeNodes = new ArrayList<TreeNode>();
  467. for (${ClassName} node : listData) {
  468. TreeNode treeNode = convertTreeNodeData(node);
  469. treeNodes.add(treeNode);
  470. }
  471. return treeNodes;
  472. }
  473. /**
  474. * 将实体类转化成前端对象格式
  475. * @param node 树表格对象
  476. * @return
  477. */
  478. private TreeNode convertTreeNodeData(${ClassName} node) {
  479. TreeNode treeNode = new TreeNode();
  480. treeNode.setId(node.getId());
  481. treeNode.setKey(node.getId());
  482. treeNode.setTitle(node.get${TreeName}());
  483. treeNode.setLabel(node.get${TreeName}());
  484. treeNode.setSelectable(true);
  485. treeNode.setDisabled(false);
  486. treeNode.setDisableCheckbox(false);
  487. treeNode.setParentId(node.getParentId());
  488. treeNode.setParentIds(node.getParentIds());
  489. HashMap<String,Object> attr = new HashMap<>();
  490. attr.put("treeLeaf", node.getTreeLeaf());
  491. attr.put("treeLevel", node.getTreeLevel());
  492. attr.put("treePath", node.getParentIds());
  493. treeNode.setAttributes(attr);
  494. treeNode.setIsLeaf(Constants.TREE_LEAF_Y.equals(node.getTreeLeaf()) ? true : false);
  495. JSONObject slotsValue = new JSONObject();
  496. treeNode.setSlots(slotsValue);
  497. JSONObject scopedSlotsValue = new JSONObject();
  498. scopedSlotsValue.put("title","title");
  499. treeNode.setScopedSlots(scopedSlotsValue);
  500. return treeNode;
  501. }
  502. #foreach($column in $columns)
  503. #if($column.isUnique == "1")
  504. #set($attrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  505. /**
  506. * 校验${column.columnComment}的唯一性
  507. * @param ${className}
  508. * @return
  509. */
  510. @Override
  511. public void check${attrName}Unique(${ClassName} ${className}){
  512. ${ClassName} ${className}Unique = new ${ClassName}();
  513. ${className}Unique.setNotEqualId(${className}.getId());
  514. ${className}Unique.set${attrName}(${className}.get${attrName}());
  515. if (!CollectionUtils.isEmpty(mapper.findListWithUnique(${className}Unique))) {
  516. throw new BizException("${column.columnComment}已存在,请重新输入!");
  517. }
  518. }
  519. #end
  520. #end
  521. /**
  522. * 获取最大编号
  523. * @param ${className}
  524. * @return
  525. */
  526. @Override
  527. public Integer findMaxSort(${ClassName} ${className})
  528. {
  529. return NumberUtils.nextOrder(super.findMaxSort(${className}));
  530. }
  531. }