serviceImpl.vm 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
  2. import org.springframework.stereotype.Service;
  3. import ${jakartaPackage}.annotation.Resource;
  4. import org.springframework.validation.annotation.Validated;
  5. import org.springframework.transaction.annotation.Transactional;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import java.util.*;
  8. import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
  9. import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
  10. ## 特殊:主子表专属逻辑
  11. #foreach ($subTable in $subTables)
  12. import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO;
  13. #end
  14. import ${PageResultClassName};
  15. import ${PageParamClassName};
  16. import ${BeanUtils};
  17. import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper;
  18. ## 特殊:主子表专属逻辑
  19. #foreach ($subTable in $subTables)
  20. #set ($index = $foreach.count - 1)
  21. import ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.businessName}.${subTable.className}Mapper;
  22. #end
  23. import static ${ServiceExceptionUtilClassName}.exception;
  24. import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*;
  25. /**
  26. * ${table.classComment} Service 实现类
  27. *
  28. * @author ${table.author}
  29. */
  30. @Service
  31. @Validated
  32. public class ${table.className}ServiceImpl extends ServiceImpl<${table.className}Mapper, ${table.className}DO> implements ${table.className}Service {
  33. @Resource
  34. private ${table.className}Mapper ${classNameVar}Mapper;
  35. ## 特殊:主子表专属逻辑
  36. #foreach ($subTable in $subTables)
  37. #set ($index = $foreach.count - 1)
  38. @Resource
  39. private ${subTable.className}Mapper ${subClassNameVars.get($index)}Mapper;
  40. #end
  41. @Override
  42. ## 特殊:主子表专属逻辑(非 ERP 模式)
  43. #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 )
  44. @Transactional(rollbackFor = Exception.class)
  45. #end
  46. public ${primaryColumn.javaType} create${simpleClassName}(${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO) {
  47. ## 特殊:树表专属逻辑
  48. #if ( $table.templateType == 2 )
  49. #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
  50. #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写
  51. // 校验${treeParentColumn.columnComment}的有效性
  52. validateParent${simpleClassName}(null, createReqVO.get${TreeParentJavaField}());
  53. // 校验${treeNameColumn.columnComment}的唯一性
  54. validate${simpleClassName}${TreeNameJavaField}Unique(null, createReqVO.get${TreeParentJavaField}(), createReqVO.get${TreeNameJavaField}());
  55. #end
  56. // 插入
  57. ${table.className}DO ${classNameVar} = BeanUtils.toBean(createReqVO, ${table.className}DO.class);
  58. ${classNameVar}Mapper.insert(${classNameVar});
  59. ## 特殊:主子表专属逻辑(非 ERP 模式)
  60. #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 )
  61. // 插入子表
  62. #foreach ($subTable in $subTables)
  63. #set ($index = $foreach.count - 1)
  64. #set ($subSimpleClassName = $subSimpleClassNames.get($index))
  65. #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
  66. #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
  67. #if ( $subTable.subJoinMany)
  68. create${subSimpleClassName}List(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}s());
  69. #else
  70. create${subSimpleClassName}(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}());
  71. #end
  72. #end
  73. #end
  74. // 返回
  75. return ${classNameVar}.getId();
  76. }
  77. @Override
  78. ## 特殊:主子表专属逻辑(非 ERP 模式)
  79. #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 )
  80. @Transactional(rollbackFor = Exception.class)
  81. #end
  82. public void update${simpleClassName}(${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO) {
  83. // 校验存在
  84. validate${simpleClassName}Exists(updateReqVO.getId());
  85. ## 特殊:树表专属逻辑
  86. #if ( $table.templateType == 2 )
  87. #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
  88. #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写
  89. // 校验${treeParentColumn.columnComment}的有效性
  90. validateParent${simpleClassName}(updateReqVO.getId(), updateReqVO.get${TreeParentJavaField}());
  91. // 校验${treeNameColumn.columnComment}的唯一性
  92. validate${simpleClassName}${TreeNameJavaField}Unique(updateReqVO.getId(), updateReqVO.get${TreeParentJavaField}(), updateReqVO.get${TreeNameJavaField}());
  93. #end
  94. // 更新
  95. ${table.className}DO updateObj = BeanUtils.toBean(updateReqVO, ${table.className}DO.class);
  96. ${classNameVar}Mapper.updateById(updateObj);
  97. ## 特殊:主子表专属逻辑(非 ERP 模式)
  98. #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11)
  99. // 更新子表
  100. #foreach ($subTable in $subTables)
  101. #set ($index = $foreach.count - 1)
  102. #set ($subSimpleClassName = $subSimpleClassNames.get($index))
  103. #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
  104. #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
  105. #if ( $subTable.subJoinMany)
  106. update${subSimpleClassName}List(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}s());
  107. #else
  108. update${subSimpleClassName}(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}());
  109. #end
  110. #end
  111. #end
  112. }
  113. @Override
  114. ## 特殊:主子表专属逻辑
  115. #if ( $subTables && $subTables.size() > 0)
  116. @Transactional(rollbackFor = Exception.class)
  117. #end
  118. public void delete${simpleClassName}(${primaryColumn.javaType} id) {
  119. // 校验存在
  120. validate${simpleClassName}Exists(id);
  121. ## 特殊:树表专属逻辑
  122. #if ( $table.templateType == 2 )
  123. #set ($ParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
  124. // 校验是否有子${table.classComment}
  125. if (${classNameVar}Mapper.selectCountBy${ParentJavaField}(id) > 0) {
  126. throw exception(${simpleClassName_underlineCase.toUpperCase()}_EXITS_CHILDREN);
  127. }
  128. #end
  129. // 删除
  130. ${classNameVar}Mapper.deleteById(id);
  131. ## 特殊:主子表专属逻辑
  132. #if ( $subTables && $subTables.size() > 0)
  133. // 删除子表
  134. #foreach ($subTable in $subTables)
  135. #set ($index = $foreach.count - 1)
  136. #set ($subSimpleClassName = $subSimpleClassNames.get($index))
  137. #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
  138. #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
  139. delete${subSimpleClassName}By${SubJoinColumnName}(id);
  140. #end
  141. #end
  142. }
  143. private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) {
  144. if (${classNameVar}Mapper.selectById(id) == null) {
  145. throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS);
  146. }
  147. }
  148. ## 特殊:树表专属逻辑
  149. #if ( $table.templateType == 2 )
  150. #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
  151. #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写
  152. private void validateParent${simpleClassName}(Long id, Long ${treeParentColumn.javaField}) {
  153. if (${treeParentColumn.javaField} == null || ${simpleClassName}DO.${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT.equals(${treeParentColumn.javaField})) {
  154. return;
  155. }
  156. // 1. 不能设置自己为父${table.classComment}
  157. if (Objects.equals(id, ${treeParentColumn.javaField})) {
  158. throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_ERROR);
  159. }
  160. // 2. 父${table.classComment}不存在
  161. ${simpleClassName}DO parent${simpleClassName} = ${classNameVar}Mapper.selectById(${treeParentColumn.javaField});
  162. if (parent${simpleClassName} == null) {
  163. throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_NOT_EXITS);
  164. }
  165. // 3. 递归校验父${table.classComment},如果父${table.classComment}是自己的子${table.classComment},则报错,避免形成环路
  166. if (id == null) { // id 为空,说明新增,不需要考虑环路
  167. return;
  168. }
  169. for (int i = 0; i < Short.MAX_VALUE; i++) {
  170. // 3.1 校验环路
  171. ${treeParentColumn.javaField} = parent${simpleClassName}.get${TreeParentJavaField}();
  172. if (Objects.equals(id, ${treeParentColumn.javaField})) {
  173. throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_IS_CHILD);
  174. }
  175. // 3.2 继续递归下一级父${table.classComment}
  176. if (${treeParentColumn.javaField} == null || ${simpleClassName}DO.${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT.equals(${treeParentColumn.javaField})) {
  177. break;
  178. }
  179. parent${simpleClassName} = ${classNameVar}Mapper.selectById(${treeParentColumn.javaField});
  180. if (parent${simpleClassName} == null) {
  181. break;
  182. }
  183. }
  184. }
  185. private void validate${simpleClassName}${TreeNameJavaField}Unique(Long id, Long ${treeParentColumn.javaField}, String ${treeNameColumn.javaField}) {
  186. ${simpleClassName}DO ${classNameVar} = ${classNameVar}Mapper.selectBy${TreeParentJavaField}And${TreeNameJavaField}(${treeParentColumn.javaField}, ${treeNameColumn.javaField});
  187. if (${classNameVar} == null) {
  188. return;
  189. }
  190. // 如果 id 为空,说明不用比较是否为相同 id 的${table.classComment}
  191. if (id == null) {
  192. throw exception(${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE);
  193. }
  194. if (!Objects.equals(${classNameVar}.getId(), id)) {
  195. throw exception(${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE);
  196. }
  197. }
  198. #end
  199. @Override
  200. public ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id) {
  201. return ${classNameVar}Mapper.selectById(id);
  202. }
  203. ## 特殊:树表专属逻辑(树不需要分页接口)
  204. #if ( $table.templateType != 2 )
  205. @Override
  206. public PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) {
  207. return ${classNameVar}Mapper.selectPage(pageReqVO);
  208. }
  209. #else
  210. @Override
  211. public List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) {
  212. return ${classNameVar}Mapper.selectList(listReqVO);
  213. }
  214. #end
  215. ## 特殊:主子表专属逻辑
  216. #foreach ($subTable in $subTables)
  217. #set ($index = $foreach.count - 1)
  218. #set ($subSimpleClassName = $subSimpleClassNames.get($index))
  219. #set ($simpleClassNameUnderlineCase = $simpleClassNameUnderlineCases.get($index))
  220. #set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段
  221. #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
  222. #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
  223. #set ($subClassNameVar = $subClassNameVars.get($index))
  224. // ==================== 子表($subTable.classComment) ====================
  225. ## 情况一:MASTER_ERP 时,需要分查询页子表
  226. #if ( $table.templateType == 11 )
  227. @Override
  228. public PageResult<${subTable.className}DO> get${subSimpleClassName}Page(PageParam pageReqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
  229. return ${subClassNameVars.get($index)}Mapper.selectPage(pageReqVO, ${subJoinColumn.javaField});
  230. }
  231. ## 情况二:非 MASTER_ERP 时,需要列表查询子表
  232. #else
  233. #if ( $subTable.subJoinMany )
  234. @Override
  235. public List<${subTable.className}DO> get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
  236. return ${subClassNameVars.get($index)}Mapper.selectListBy${SubJoinColumnName}(${subJoinColumn.javaField});
  237. }
  238. #else
  239. @Override
  240. public ${subTable.className}DO get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
  241. return ${subClassNameVars.get($index)}Mapper.selectBy${SubJoinColumnName}(${subJoinColumn.javaField});
  242. }
  243. #end
  244. #end
  245. ## 情况一:MASTER_ERP 时,支持单个的新增、修改、删除操作
  246. #if ( $table.templateType == 11 )
  247. @Override
  248. public ${subPrimaryColumn.javaType} create${subSimpleClassName}(${subTable.className}DO ${subClassNameVar}) {
  249. ## 特殊:一对一时,需要保证只有一条,不能重复插入
  250. #if ( !$subTable.subJoinMany)
  251. // 校验是否已经存在
  252. if (${subClassNameVars.get($index)}Mapper.selectBy${SubJoinColumnName}(${subClassNameVar}.get${SubJoinColumnName}()) != null) {
  253. throw exception(${simpleClassNameUnderlineCase.toUpperCase()}_EXISTS);
  254. }
  255. // 插入
  256. #end
  257. ${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar});
  258. return ${subClassNameVar}.getId();
  259. }
  260. @Override
  261. public void update${subSimpleClassName}(${subTable.className}DO ${subClassNameVar}) {
  262. // 校验存在
  263. validate${subSimpleClassName}Exists(${subClassNameVar}.getId());
  264. // 更新
  265. ${subClassNameVar}.setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  266. ${subClassNameVars.get($index)}Mapper.updateById(${subClassNameVar});
  267. }
  268. @Override
  269. public void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id) {
  270. // 校验存在
  271. validate${subSimpleClassName}Exists(id);
  272. // 删除
  273. ${subClassNameVars.get($index)}Mapper.deleteById(id);
  274. }
  275. @Override
  276. public ${subTable.className}DO get${subSimpleClassName}(${subPrimaryColumn.javaType} id) {
  277. return ${subClassNameVars.get($index)}Mapper.selectById(id);
  278. }
  279. private void validate${subSimpleClassName}Exists(${subPrimaryColumn.javaType} id) {
  280. if (${subClassNameVar}Mapper.selectById(id) == null) {
  281. throw exception(${simpleClassNameUnderlineCase.toUpperCase()}_NOT_EXISTS);
  282. }
  283. }
  284. ## 情况二:非 MASTER_ERP 时,支持批量的新增、修改操作
  285. #else
  286. #if ( $subTable.subJoinMany)
  287. private void create${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) {
  288. list.forEach(o -> o.set$SubJoinColumnName(${subJoinColumn.javaField}));
  289. ${subClassNameVars.get($index)}Mapper.insertBatch(list);
  290. }
  291. private void update${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) {
  292. delete${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField});
  293. list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新
  294. create${subSimpleClassName}List(${subJoinColumn.javaField}, list);
  295. }
  296. #else
  297. private void create${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) {
  298. if (${subClassNameVar} == null) {
  299. return;
  300. }
  301. ${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField});
  302. ${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar});
  303. }
  304. private void update${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) {
  305. if (${subClassNameVar} == null) {
  306. return;
  307. }
  308. ${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField});
  309. ${subClassNameVar}.setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  310. ${subClassNameVars.get($index)}Mapper.insertOrUpdate(${subClassNameVar});
  311. }
  312. #end
  313. #end
  314. private void delete${subSimpleClassName}By${SubJoinColumnName}(${primaryColumn.javaType} ${subJoinColumn.javaField}) {
  315. ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}(${subJoinColumn.javaField});
  316. }
  317. #end
  318. }