Commit d14aaae641f0b361e2a3b3c0d932e438d04017d0

Authored by 芋道源码
Committed by Gitee
2 parents bb236af6 064fecf4

!1348 feat:【INFRA 基础设施】vben5-antd-schema 代码生成时,可生成批量删除

Merge pull request !1348 from puhui999/vben5-antd-schema
Showing 54 changed files with 1809 additions and 254 deletions
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo01/Demo01ContactController.java
@@ -60,6 +60,15 @@ public class Demo01ContactController { @@ -60,6 +60,15 @@ public class Demo01ContactController {
60 return success(true); 60 return success(true);
61 } 61 }
62 62
  63 + @DeleteMapping("/delete-batch")
  64 + @Parameter(name = "ids", description = "编号", required = true)
  65 + @Operation(summary = "批量删除示例联系人")
  66 + @PreAuthorize("@ss.hasPermission('infra:demo01-contact:delete')")
  67 + public CommonResult<Boolean> deleteDemo01Contact(@RequestParam("ids") List<Long> ids) {
  68 + demo01ContactService.deleteDemo01ContactByIds(ids);
  69 + return success(true);
  70 + }
  71 +
63 @GetMapping("/get") 72 @GetMapping("/get")
64 @Operation(summary = "获得示例联系人") 73 @Operation(summary = "获得示例联系人")
65 @Parameter(name = "id", description = "编号", required = true, example = "1024") 74 @Parameter(name = "id", description = "编号", required = true, example = "1024")
@@ -82,12 +91,12 @@ public class Demo01ContactController { @@ -82,12 +91,12 @@ public class Demo01ContactController {
82 @PreAuthorize("@ss.hasPermission('infra:demo01-contact:export')") 91 @PreAuthorize("@ss.hasPermission('infra:demo01-contact:export')")
83 @ApiAccessLog(operateType = EXPORT) 92 @ApiAccessLog(operateType = EXPORT)
84 public void exportDemo01ContactExcel(@Valid Demo01ContactPageReqVO pageReqVO, 93 public void exportDemo01ContactExcel(@Valid Demo01ContactPageReqVO pageReqVO,
85 - HttpServletResponse response) throws IOException { 94 + HttpServletResponse response) throws IOException {
86 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); 95 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
87 List<Demo01ContactDO> list = demo01ContactService.getDemo01ContactPage(pageReqVO).getList(); 96 List<Demo01ContactDO> list = demo01ContactService.getDemo01ContactPage(pageReqVO).getList();
88 // 导出 Excel 97 // 导出 Excel
89 ExcelUtils.write(response, "示例联系人.xls", "数据", Demo01ContactRespVO.class, 98 ExcelUtils.write(response, "示例联系人.xls", "数据", Demo01ContactRespVO.class,
90 - BeanUtils.toBean(list, Demo01ContactRespVO.class)); 99 + BeanUtils.toBean(list, Demo01ContactRespVO.class));
91 } 100 }
92 101
93 } 102 }
94 \ No newline at end of file 103 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo01/vo/Demo01ContactPageReqVO.java
1 package cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo; 1 package cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo;
2 2
3 -import lombok.*;  
4 -import java.util.*;  
5 -import io.swagger.v3.oas.annotations.media.Schema;  
6 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
7 import org.springframework.format.annotation.DateTimeFormat; 8 import org.springframework.format.annotation.DateTimeFormat;
  9 +
8 import java.time.LocalDateTime; 10 import java.time.LocalDateTime;
9 11
10 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo01/vo/Demo01ContactRespVO.java
1 package cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo; 1 package cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo;
2 2
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.*;  
5 -import java.util.*;  
6 -import java.util.*;  
7 -import org.springframework.format.annotation.DateTimeFormat;  
8 -import java.time.LocalDateTime;  
9 -import com.alibaba.excel.annotation.*;  
10 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
11 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  5 +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  6 +import com.alibaba.excel.annotation.ExcelProperty;
  7 +import io.swagger.v3.oas.annotations.media.Schema;
  8 +import lombok.Data;
  9 +
  10 +import java.time.LocalDateTime;
12 11
13 @Schema(description = "管理后台 - 示例联系人 Response VO") 12 @Schema(description = "管理后台 - 示例联系人 Response VO")
14 @Data 13 @Data
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo01/vo/Demo01ContactSaveReqVO.java
1 package cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo; 1 package cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 -import lombok.Data;  
5 -  
6 import jakarta.validation.constraints.NotEmpty; 4 import jakarta.validation.constraints.NotEmpty;
7 import jakarta.validation.constraints.NotNull; 5 import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
  7 +
8 import java.time.LocalDateTime; 8 import java.time.LocalDateTime;
9 9
10 @Schema(description = "管理后台 - 示例联系人新增/修改 Request VO") 10 @Schema(description = "管理后台 - 示例联系人新增/修改 Request VO")
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo02/Demo02CategoryController.java
@@ -80,11 +80,11 @@ public class Demo02CategoryController { @@ -80,11 +80,11 @@ public class Demo02CategoryController {
80 @PreAuthorize("@ss.hasPermission('infra:demo02-category:export')") 80 @PreAuthorize("@ss.hasPermission('infra:demo02-category:export')")
81 @ApiAccessLog(operateType = EXPORT) 81 @ApiAccessLog(operateType = EXPORT)
82 public void exportDemo02CategoryExcel(@Valid Demo02CategoryListReqVO listReqVO, 82 public void exportDemo02CategoryExcel(@Valid Demo02CategoryListReqVO listReqVO,
83 - HttpServletResponse response) throws IOException { 83 + HttpServletResponse response) throws IOException {
84 List<Demo02CategoryDO> list = demo02CategoryService.getDemo02CategoryList(listReqVO); 84 List<Demo02CategoryDO> list = demo02CategoryService.getDemo02CategoryList(listReqVO);
85 // 导出 Excel 85 // 导出 Excel
86 ExcelUtils.write(response, "示例分类.xls", "数据", Demo02CategoryRespVO.class, 86 ExcelUtils.write(response, "示例分类.xls", "数据", Demo02CategoryRespVO.class,
87 - BeanUtils.toBean(list, Demo02CategoryRespVO.class)); 87 + BeanUtils.toBean(list, Demo02CategoryRespVO.class));
88 } 88 }
89 89
90 } 90 }
91 \ No newline at end of file 91 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo02/vo/Demo02CategorySaveReqVO.java
1 package cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo; 1 package cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 -import lombok.Data;  
5 -  
6 import jakarta.validation.constraints.NotEmpty; 4 import jakarta.validation.constraints.NotEmpty;
7 import jakarta.validation.constraints.NotNull; 5 import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
8 7
9 @Schema(description = "管理后台 - 示例分类新增/修改 Request VO") 8 @Schema(description = "管理后台 - 示例分类新增/修改 Request VO")
10 @Data 9 @Data
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/Demo03StudentController.java renamed to yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/erp/Demo03StudentErpController.java
1 -package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03; 1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp;
2 2
3 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; 3 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
@@ -6,13 +6,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; @@ -6,13 +6,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
8 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; 8 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
9 -import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentPageReqVO;  
10 -import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentRespVO;  
11 -import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentSaveReqVO; 9 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo.Demo03StudentErpPageReqVO;
  10 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo.Demo03StudentErpRespVO;
  11 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo.Demo03StudentErpSaveReqVO;
12 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO; 12 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
13 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO; 13 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
14 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO; 14 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
15 -import cn.iocoder.yudao.module.infra.service.demo.demo03.Demo03StudentService; 15 +import cn.iocoder.yudao.module.infra.service.demo.demo03.erp.Demo03StudentErpService;
16 import io.swagger.v3.oas.annotations.Operation; 16 import io.swagger.v3.oas.annotations.Operation;
17 import io.swagger.v3.oas.annotations.Parameter; 17 import io.swagger.v3.oas.annotations.Parameter;
18 import io.swagger.v3.oas.annotations.tags.Tag; 18 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -31,25 +31,25 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -31,25 +31,25 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
31 31
32 @Tag(name = "管理后台 - 学生") 32 @Tag(name = "管理后台 - 学生")
33 @RestController 33 @RestController
34 -@RequestMapping("/infra/demo03-student") 34 +@RequestMapping("/infra/demo03-student-erp")
35 @Validated 35 @Validated
36 -public class Demo03StudentController { 36 +public class Demo03StudentErpController {
37 37
38 @Resource 38 @Resource
39 - private Demo03StudentService demo03StudentService; 39 + private Demo03StudentErpService demo03StudentErpService;
40 40
41 @PostMapping("/create") 41 @PostMapping("/create")
42 @Operation(summary = "创建学生") 42 @Operation(summary = "创建学生")
43 @PreAuthorize("@ss.hasPermission('infra:demo03-student:create')") 43 @PreAuthorize("@ss.hasPermission('infra:demo03-student:create')")
44 - public CommonResult<Long> createDemo03Student(@Valid @RequestBody Demo03StudentSaveReqVO createReqVO) {  
45 - return success(demo03StudentService.createDemo03Student(createReqVO)); 44 + public CommonResult<Long> createDemo03Student(@Valid @RequestBody Demo03StudentErpSaveReqVO createReqVO) {
  45 + return success(demo03StudentErpService.createDemo03Student(createReqVO));
46 } 46 }
47 47
48 @PutMapping("/update") 48 @PutMapping("/update")
49 @Operation(summary = "更新学生") 49 @Operation(summary = "更新学生")
50 @PreAuthorize("@ss.hasPermission('infra:demo03-student:update')") 50 @PreAuthorize("@ss.hasPermission('infra:demo03-student:update')")
51 - public CommonResult<Boolean> updateDemo03Student(@Valid @RequestBody Demo03StudentSaveReqVO updateReqVO) {  
52 - demo03StudentService.updateDemo03Student(updateReqVO); 51 + public CommonResult<Boolean> updateDemo03Student(@Valid @RequestBody Demo03StudentErpSaveReqVO updateReqVO) {
  52 + demo03StudentErpService.updateDemo03Student(updateReqVO);
53 return success(true); 53 return success(true);
54 } 54 }
55 55
@@ -58,7 +58,16 @@ public class Demo03StudentController { @@ -58,7 +58,16 @@ public class Demo03StudentController {
58 @Parameter(name = "id", description = "编号", required = true) 58 @Parameter(name = "id", description = "编号", required = true)
59 @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')") 59 @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')")
60 public CommonResult<Boolean> deleteDemo03Student(@RequestParam("id") Long id) { 60 public CommonResult<Boolean> deleteDemo03Student(@RequestParam("id") Long id) {
61 - demo03StudentService.deleteDemo03Student(id); 61 + demo03StudentErpService.deleteDemo03Student(id);
  62 + return success(true);
  63 + }
  64 +
  65 + @DeleteMapping("/delete-batch")
  66 + @Parameter(name = "ids", description = "编号", required = true)
  67 + @Operation(summary = "批量删除学生")
  68 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')")
  69 + public CommonResult<Boolean> deleteDemo03Student(@RequestParam("ids") List<Long> ids) {
  70 + demo03StudentErpService.deleteDemo03StudentByIds(ids);
62 return success(true); 71 return success(true);
63 } 72 }
64 73
@@ -66,30 +75,30 @@ public class Demo03StudentController { @@ -66,30 +75,30 @@ public class Demo03StudentController {
66 @Operation(summary = "获得学生") 75 @Operation(summary = "获得学生")
67 @Parameter(name = "id", description = "编号", required = true, example = "1024") 76 @Parameter(name = "id", description = "编号", required = true, example = "1024")
68 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") 77 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
69 - public CommonResult<Demo03StudentRespVO> getDemo03Student(@RequestParam("id") Long id) {  
70 - Demo03StudentDO demo03Student = demo03StudentService.getDemo03Student(id);  
71 - return success(BeanUtils.toBean(demo03Student, Demo03StudentRespVO.class)); 78 + public CommonResult<Demo03StudentErpRespVO> getDemo03Student(@RequestParam("id") Long id) {
  79 + Demo03StudentDO demo03Student = demo03StudentErpService.getDemo03Student(id);
  80 + return success(BeanUtils.toBean(demo03Student, Demo03StudentErpRespVO.class));
72 } 81 }
73 82
74 @GetMapping("/page") 83 @GetMapping("/page")
75 @Operation(summary = "获得学生分页") 84 @Operation(summary = "获得学生分页")
76 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") 85 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
77 - public CommonResult<PageResult<Demo03StudentRespVO>> getDemo03StudentPage(@Valid Demo03StudentPageReqVO pageReqVO) {  
78 - PageResult<Demo03StudentDO> pageResult = demo03StudentService.getDemo03StudentPage(pageReqVO);  
79 - return success(BeanUtils.toBean(pageResult, Demo03StudentRespVO.class)); 86 + public CommonResult<PageResult<Demo03StudentErpRespVO>> getDemo03StudentPage(@Valid Demo03StudentErpPageReqVO pageReqVO) {
  87 + PageResult<Demo03StudentDO> pageResult = demo03StudentErpService.getDemo03StudentPage(pageReqVO);
  88 + return success(BeanUtils.toBean(pageResult, Demo03StudentErpRespVO.class));
80 } 89 }
81 90
82 @GetMapping("/export-excel") 91 @GetMapping("/export-excel")
83 @Operation(summary = "导出学生 Excel") 92 @Operation(summary = "导出学生 Excel")
84 @PreAuthorize("@ss.hasPermission('infra:demo03-student:export')") 93 @PreAuthorize("@ss.hasPermission('infra:demo03-student:export')")
85 @ApiAccessLog(operateType = EXPORT) 94 @ApiAccessLog(operateType = EXPORT)
86 - public void exportDemo03StudentExcel(@Valid Demo03StudentPageReqVO pageReqVO,  
87 - HttpServletResponse response) throws IOException { 95 + public void exportDemo03StudentExcel(@Valid Demo03StudentErpPageReqVO pageReqVO,
  96 + HttpServletResponse response) throws IOException {
88 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); 97 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
89 - List<Demo03StudentDO> list = demo03StudentService.getDemo03StudentPage(pageReqVO).getList(); 98 + List<Demo03StudentDO> list = demo03StudentErpService.getDemo03StudentPage(pageReqVO).getList();
90 // 导出 Excel 99 // 导出 Excel
91 - ExcelUtils.write(response, "学生.xls", "数据", Demo03StudentRespVO.class,  
92 - BeanUtils.toBean(list, Demo03StudentRespVO.class)); 100 + ExcelUtils.write(response, "学生.xls", "数据", Demo03StudentErpRespVO.class,
  101 + BeanUtils.toBean(list, Demo03StudentErpRespVO.class));
93 } 102 }
94 103
95 // ==================== 子表(学生课程) ==================== 104 // ==================== 子表(学生课程) ====================
@@ -100,21 +109,21 @@ public class Demo03StudentController { @@ -100,21 +109,21 @@ public class Demo03StudentController {
100 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") 109 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
101 public CommonResult<PageResult<Demo03CourseDO>> getDemo03CoursePage(PageParam pageReqVO, 110 public CommonResult<PageResult<Demo03CourseDO>> getDemo03CoursePage(PageParam pageReqVO,
102 @RequestParam("studentId") Long studentId) { 111 @RequestParam("studentId") Long studentId) {
103 - return success(demo03StudentService.getDemo03CoursePage(pageReqVO, studentId)); 112 + return success(demo03StudentErpService.getDemo03CoursePage(pageReqVO, studentId));
104 } 113 }
105 114
106 @PostMapping("/demo03-course/create") 115 @PostMapping("/demo03-course/create")
107 @Operation(summary = "创建学生课程") 116 @Operation(summary = "创建学生课程")
108 @PreAuthorize("@ss.hasPermission('infra:demo03-student:create')") 117 @PreAuthorize("@ss.hasPermission('infra:demo03-student:create')")
109 public CommonResult<Long> createDemo03Course(@Valid @RequestBody Demo03CourseDO demo03Course) { 118 public CommonResult<Long> createDemo03Course(@Valid @RequestBody Demo03CourseDO demo03Course) {
110 - return success(demo03StudentService.createDemo03Course(demo03Course)); 119 + return success(demo03StudentErpService.createDemo03Course(demo03Course));
111 } 120 }
112 121
113 @PutMapping("/demo03-course/update") 122 @PutMapping("/demo03-course/update")
114 @Operation(summary = "更新学生课程") 123 @Operation(summary = "更新学生课程")
115 @PreAuthorize("@ss.hasPermission('infra:demo03-student:update')") 124 @PreAuthorize("@ss.hasPermission('infra:demo03-student:update')")
116 public CommonResult<Boolean> updateDemo03Course(@Valid @RequestBody Demo03CourseDO demo03Course) { 125 public CommonResult<Boolean> updateDemo03Course(@Valid @RequestBody Demo03CourseDO demo03Course) {
117 - demo03StudentService.updateDemo03Course(demo03Course); 126 + demo03StudentErpService.updateDemo03Course(demo03Course);
118 return success(true); 127 return success(true);
119 } 128 }
120 129
@@ -123,7 +132,16 @@ public class Demo03StudentController { @@ -123,7 +132,16 @@ public class Demo03StudentController {
123 @Operation(summary = "删除学生课程") 132 @Operation(summary = "删除学生课程")
124 @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')") 133 @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')")
125 public CommonResult<Boolean> deleteDemo03Course(@RequestParam("id") Long id) { 134 public CommonResult<Boolean> deleteDemo03Course(@RequestParam("id") Long id) {
126 - demo03StudentService.deleteDemo03Course(id); 135 + demo03StudentErpService.deleteDemo03Course(id);
  136 + return success(true);
  137 + }
  138 +
  139 + @DeleteMapping("/demo03-course/delete-batch")
  140 + @Parameter(name = "ids", description = "编号", required = true)
  141 + @Operation(summary = "批量删除学生课程")
  142 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')")
  143 + public CommonResult<Boolean> deleteDemo03Course(@RequestParam("ids") List<Long> ids) {
  144 + demo03StudentErpService.deleteDemo03CourseByIds(ids);
127 return success(true); 145 return success(true);
128 } 146 }
129 147
@@ -132,15 +150,7 @@ public class Demo03StudentController { @@ -132,15 +150,7 @@ public class Demo03StudentController {
132 @Parameter(name = "id", description = "编号", required = true) 150 @Parameter(name = "id", description = "编号", required = true)
133 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") 151 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
134 public CommonResult<Demo03CourseDO> getDemo03Course(@RequestParam("id") Long id) { 152 public CommonResult<Demo03CourseDO> getDemo03Course(@RequestParam("id") Long id) {
135 - return success(demo03StudentService.getDemo03Course(id));  
136 - }  
137 -  
138 - @GetMapping("/demo03-course/list-by-student-id")  
139 - @Operation(summary = "获得学生课程列表")  
140 - @Parameter(name = "studentId", description = "学生编号")  
141 - @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")  
142 - public CommonResult<List<Demo03CourseDO>> getDemo03CourseListByStudentId(@RequestParam("studentId") Long studentId) {  
143 - return success(demo03StudentService.getDemo03CourseListByStudentId(studentId)); 153 + return success(demo03StudentErpService.getDemo03Course(id));
144 } 154 }
145 155
146 // ==================== 子表(学生班级) ==================== 156 // ==================== 子表(学生班级) ====================
@@ -151,21 +161,21 @@ public class Demo03StudentController { @@ -151,21 +161,21 @@ public class Demo03StudentController {
151 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") 161 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
152 public CommonResult<PageResult<Demo03GradeDO>> getDemo03GradePage(PageParam pageReqVO, 162 public CommonResult<PageResult<Demo03GradeDO>> getDemo03GradePage(PageParam pageReqVO,
153 @RequestParam("studentId") Long studentId) { 163 @RequestParam("studentId") Long studentId) {
154 - return success(demo03StudentService.getDemo03GradePage(pageReqVO, studentId)); 164 + return success(demo03StudentErpService.getDemo03GradePage(pageReqVO, studentId));
155 } 165 }
156 166
157 @PostMapping("/demo03-grade/create") 167 @PostMapping("/demo03-grade/create")
158 @Operation(summary = "创建学生班级") 168 @Operation(summary = "创建学生班级")
159 @PreAuthorize("@ss.hasPermission('infra:demo03-student:create')") 169 @PreAuthorize("@ss.hasPermission('infra:demo03-student:create')")
160 public CommonResult<Long> createDemo03Grade(@Valid @RequestBody Demo03GradeDO demo03Grade) { 170 public CommonResult<Long> createDemo03Grade(@Valid @RequestBody Demo03GradeDO demo03Grade) {
161 - return success(demo03StudentService.createDemo03Grade(demo03Grade)); 171 + return success(demo03StudentErpService.createDemo03Grade(demo03Grade));
162 } 172 }
163 173
164 @PutMapping("/demo03-grade/update") 174 @PutMapping("/demo03-grade/update")
165 @Operation(summary = "更新学生班级") 175 @Operation(summary = "更新学生班级")
166 @PreAuthorize("@ss.hasPermission('infra:demo03-student:update')") 176 @PreAuthorize("@ss.hasPermission('infra:demo03-student:update')")
167 public CommonResult<Boolean> updateDemo03Grade(@Valid @RequestBody Demo03GradeDO demo03Grade) { 177 public CommonResult<Boolean> updateDemo03Grade(@Valid @RequestBody Demo03GradeDO demo03Grade) {
168 - demo03StudentService.updateDemo03Grade(demo03Grade); 178 + demo03StudentErpService.updateDemo03Grade(demo03Grade);
169 return success(true); 179 return success(true);
170 } 180 }
171 181
@@ -174,7 +184,16 @@ public class Demo03StudentController { @@ -174,7 +184,16 @@ public class Demo03StudentController {
174 @Operation(summary = "删除学生班级") 184 @Operation(summary = "删除学生班级")
175 @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')") 185 @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')")
176 public CommonResult<Boolean> deleteDemo03Grade(@RequestParam("id") Long id) { 186 public CommonResult<Boolean> deleteDemo03Grade(@RequestParam("id") Long id) {
177 - demo03StudentService.deleteDemo03Grade(id); 187 + demo03StudentErpService.deleteDemo03Grade(id);
  188 + return success(true);
  189 + }
  190 +
  191 + @DeleteMapping("/demo03-grade/delete-batch")
  192 + @Parameter(name = "ids", description = "编号", required = true)
  193 + @Operation(summary = "批量删除学生班级")
  194 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')")
  195 + public CommonResult<Boolean> deleteDemo03Grade(@RequestParam("ids") List<Long> ids) {
  196 + demo03StudentErpService.deleteDemo03GradeByIds(ids);
178 return success(true); 197 return success(true);
179 } 198 }
180 199
@@ -183,15 +202,7 @@ public class Demo03StudentController { @@ -183,15 +202,7 @@ public class Demo03StudentController {
183 @Parameter(name = "id", description = "编号", required = true) 202 @Parameter(name = "id", description = "编号", required = true)
184 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") 203 @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
185 public CommonResult<Demo03GradeDO> getDemo03Grade(@RequestParam("id") Long id) { 204 public CommonResult<Demo03GradeDO> getDemo03Grade(@RequestParam("id") Long id) {
186 - return success(demo03StudentService.getDemo03Grade(id));  
187 - }  
188 -  
189 - @GetMapping("/demo03-grade/get-by-student-id")  
190 - @Operation(summary = "获得学生班级")  
191 - @Parameter(name = "studentId", description = "学生编号")  
192 - @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")  
193 - public CommonResult<Demo03GradeDO> getDemo03GradeByStudentId(@RequestParam("studentId") Long studentId) {  
194 - return success(demo03StudentService.getDemo03GradeByStudentId(studentId)); 205 + return success(demo03StudentErpService.getDemo03Grade(id));
195 } 206 }
196 207
197 } 208 }
198 \ No newline at end of file 209 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/vo/Demo03StudentPageReqVO.java renamed to yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/erp/vo/Demo03StudentErpPageReqVO.java
1 -package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo; 1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo;
2 2
3 -import lombok.*;  
4 -import io.swagger.v3.oas.annotations.media.Schema;  
5 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
6 import org.springframework.format.annotation.DateTimeFormat; 8 import org.springframework.format.annotation.DateTimeFormat;
  9 +
7 import java.time.LocalDateTime; 10 import java.time.LocalDateTime;
8 11
9 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@@ -12,7 +15,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -12,7 +15,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
12 @Data 15 @Data
13 @EqualsAndHashCode(callSuper = true) 16 @EqualsAndHashCode(callSuper = true)
14 @ToString(callSuper = true) 17 @ToString(callSuper = true)
15 -public class Demo03StudentPageReqVO extends PageParam { 18 +public class Demo03StudentErpPageReqVO extends PageParam {
16 19
17 @Schema(description = "名字", example = "芋艿") 20 @Schema(description = "名字", example = "芋艿")
18 private String name; 21 private String name;
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/vo/Demo03StudentRespVO.java renamed to yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/erp/vo/Demo03StudentErpRespVO.java
1 -package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo; 1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo;
2 2
  3 +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  5 +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  6 +import com.alibaba.excel.annotation.ExcelProperty;
3 import io.swagger.v3.oas.annotations.media.Schema; 7 import io.swagger.v3.oas.annotations.media.Schema;
4 -import lombok.*; 8 +import lombok.Data;
5 9
6 import java.time.LocalDateTime; 10 import java.time.LocalDateTime;
7 -import com.alibaba.excel.annotation.*;  
8 -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;  
9 -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;  
10 11
11 @Schema(description = "管理后台 - 学生 Response VO") 12 @Schema(description = "管理后台 - 学生 Response VO")
12 @Data 13 @Data
13 @ExcelIgnoreUnannotated 14 @ExcelIgnoreUnannotated
14 -public class Demo03StudentRespVO { 15 +public class Demo03StudentErpRespVO {
15 16
16 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8525") 17 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8525")
17 @ExcelProperty("编号") 18 @ExcelProperty("编号")
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/erp/vo/Demo03StudentErpSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +@Schema(description = "管理后台 - 学生新增/修改 Request VO")
  11 +@Data
  12 +public class Demo03StudentErpSaveReqVO {
  13 +
  14 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8525")
  15 + private Long id;
  16 +
  17 + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
  18 + @NotEmpty(message = "名字不能为空")
  19 + private String name;
  20 +
  21 + @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED)
  22 + @NotNull(message = "性别不能为空")
  23 + private Integer sex;
  24 +
  25 + @Schema(description = "出生日期", requiredMode = Schema.RequiredMode.REQUIRED)
  26 + @NotNull(message = "出生日期不能为空")
  27 + private LocalDateTime birthday;
  28 +
  29 + @Schema(description = "简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "随便")
  30 + @NotEmpty(message = "简介不能为空")
  31 + private String description;
  32 +
  33 +}
0 \ No newline at end of file 34 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/inner/Demo03StudentInnerController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner;
  2 +
  3 +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  8 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  9 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo.Demo03StudentInnerPageReqVO;
  10 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo.Demo03StudentInnerRespVO;
  11 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo.Demo03StudentInnerSaveReqVO;
  12 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
  13 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
  14 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
  15 +import cn.iocoder.yudao.module.infra.service.demo.demo03.inner.Demo03StudentInnerService;
  16 +import io.swagger.v3.oas.annotations.Operation;
  17 +import io.swagger.v3.oas.annotations.Parameter;
  18 +import io.swagger.v3.oas.annotations.tags.Tag;
  19 +import jakarta.annotation.Resource;
  20 +import jakarta.servlet.http.HttpServletResponse;
  21 +import jakarta.validation.Valid;
  22 +import org.springframework.security.access.prepost.PreAuthorize;
  23 +import org.springframework.validation.annotation.Validated;
  24 +import org.springframework.web.bind.annotation.*;
  25 +
  26 +import java.io.IOException;
  27 +import java.util.List;
  28 +
  29 +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
  30 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  31 +
  32 +@Tag(name = "管理后台 - 学生")
  33 +@RestController
  34 +@RequestMapping("/infra/demo03-student-inner")
  35 +@Validated
  36 +public class Demo03StudentInnerController {
  37 +
  38 + @Resource
  39 + private Demo03StudentInnerService demo03StudentInnerService;
  40 +
  41 + @PostMapping("/create")
  42 + @Operation(summary = "创建学生")
  43 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:create')")
  44 + public CommonResult<Long> createDemo03Student(@Valid @RequestBody Demo03StudentInnerSaveReqVO createReqVO) {
  45 + return success(demo03StudentInnerService.createDemo03Student(createReqVO));
  46 + }
  47 +
  48 + @PutMapping("/update")
  49 + @Operation(summary = "更新学生")
  50 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:update')")
  51 + public CommonResult<Boolean> updateDemo03Student(@Valid @RequestBody Demo03StudentInnerSaveReqVO updateReqVO) {
  52 + demo03StudentInnerService.updateDemo03Student(updateReqVO);
  53 + return success(true);
  54 + }
  55 +
  56 + @DeleteMapping("/delete")
  57 + @Operation(summary = "删除学生")
  58 + @Parameter(name = "id", description = "编号", required = true)
  59 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')")
  60 + public CommonResult<Boolean> deleteDemo03Student(@RequestParam("id") Long id) {
  61 + demo03StudentInnerService.deleteDemo03Student(id);
  62 + return success(true);
  63 + }
  64 +
  65 + @DeleteMapping("/delete-batch")
  66 + @Parameter(name = "ids", description = "编号", required = true)
  67 + @Operation(summary = "批量删除学生")
  68 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')")
  69 + public CommonResult<Boolean> deleteDemo03Student(@RequestParam("ids") List<Long> ids) {
  70 + demo03StudentInnerService.deleteDemo03StudentByIds(ids);
  71 + return success(true);
  72 + }
  73 +
  74 + @GetMapping("/get")
  75 + @Operation(summary = "获得学生")
  76 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  77 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
  78 + public CommonResult<Demo03StudentInnerRespVO> getDemo03Student(@RequestParam("id") Long id) {
  79 + Demo03StudentDO demo03Student = demo03StudentInnerService.getDemo03Student(id);
  80 + return success(BeanUtils.toBean(demo03Student, Demo03StudentInnerRespVO.class));
  81 + }
  82 +
  83 + @GetMapping("/page")
  84 + @Operation(summary = "获得学生分页")
  85 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
  86 + public CommonResult<PageResult<Demo03StudentInnerRespVO>> getDemo03StudentPage(@Valid Demo03StudentInnerPageReqVO pageReqVO) {
  87 + PageResult<Demo03StudentDO> pageResult = demo03StudentInnerService.getDemo03StudentPage(pageReqVO);
  88 + return success(BeanUtils.toBean(pageResult, Demo03StudentInnerRespVO.class));
  89 + }
  90 +
  91 + @GetMapping("/export-excel")
  92 + @Operation(summary = "导出学生 Excel")
  93 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:export')")
  94 + @ApiAccessLog(operateType = EXPORT)
  95 + public void exportDemo03StudentExcel(@Valid Demo03StudentInnerPageReqVO pageReqVO,
  96 + HttpServletResponse response) throws IOException {
  97 + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
  98 + List<Demo03StudentDO> list = demo03StudentInnerService.getDemo03StudentPage(pageReqVO).getList();
  99 + // 导出 Excel
  100 + ExcelUtils.write(response, "学生.xls", "数据", Demo03StudentInnerRespVO.class,
  101 + BeanUtils.toBean(list, Demo03StudentInnerRespVO.class));
  102 + }
  103 +
  104 + // ==================== 子表(学生课程) ====================
  105 +
  106 + @GetMapping("/demo03-course/list-by-student-id")
  107 + @Operation(summary = "获得学生课程列表")
  108 + @Parameter(name = "studentId", description = "学生编号")
  109 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
  110 + public CommonResult<List<Demo03CourseDO>> getDemo03CourseListByStudentId(@RequestParam("studentId") Long studentId) {
  111 + return success(demo03StudentInnerService.getDemo03CourseListByStudentId(studentId));
  112 + }
  113 +
  114 + // ==================== 子表(学生班级) ====================
  115 +
  116 + @GetMapping("/demo03-grade/get-by-student-id")
  117 + @Operation(summary = "获得学生班级")
  118 + @Parameter(name = "studentId", description = "学生编号")
  119 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
  120 + public CommonResult<Demo03GradeDO> getDemo03GradeByStudentId(@RequestParam("studentId") Long studentId) {
  121 + return success(demo03StudentInnerService.getDemo03GradeByStudentId(studentId));
  122 + }
  123 +
  124 +}
0 \ No newline at end of file 125 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/inner/vo/Demo03StudentInnerPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@Schema(description = "管理后台 - 学生分页 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class Demo03StudentInnerPageReqVO extends PageParam {
  19 +
  20 + @Schema(description = "名字", example = "芋艿")
  21 + private String name;
  22 +
  23 + @Schema(description = "性别")
  24 + private Integer sex;
  25 +
  26 + @Schema(description = "简介", example = "随便")
  27 + private String description;
  28 +
  29 + @Schema(description = "创建时间")
  30 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  31 + private LocalDateTime[] createTime;
  32 +
  33 +}
0 \ No newline at end of file 34 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/inner/vo/Demo03StudentInnerRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  5 +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  6 +import com.alibaba.excel.annotation.ExcelProperty;
  7 +import io.swagger.v3.oas.annotations.media.Schema;
  8 +import lombok.Data;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +@Schema(description = "管理后台 - 学生 Response VO")
  13 +@Data
  14 +@ExcelIgnoreUnannotated
  15 +public class Demo03StudentInnerRespVO {
  16 +
  17 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8525")
  18 + @ExcelProperty("编号")
  19 + private Long id;
  20 +
  21 + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
  22 + @ExcelProperty("名字")
  23 + private String name;
  24 +
  25 + @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED)
  26 + @ExcelProperty(value = "性别", converter = DictConvert.class)
  27 + @DictFormat("system_user_sex") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
  28 + private Integer sex;
  29 +
  30 + @Schema(description = "出生日期", requiredMode = Schema.RequiredMode.REQUIRED)
  31 + @ExcelProperty("出生日期")
  32 + private LocalDateTime birthday;
  33 +
  34 + @Schema(description = "简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "随便")
  35 + @ExcelProperty("简介")
  36 + private String description;
  37 +
  38 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  39 + @ExcelProperty("创建时间")
  40 + private LocalDateTime createTime;
  41 +
  42 +}
0 \ No newline at end of file 43 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/vo/Demo03StudentSaveReqVO.java renamed to yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/inner/vo/Demo03StudentInnerSaveReqVO.java
1 -package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo; 1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo;
2 2
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.*;  
5 -import java.util.*;  
6 -import jakarta.validation.constraints.*;  
7 -import java.time.LocalDateTime;  
8 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO; 3 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
9 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO; 4 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
  6 +import jakarta.validation.constraints.NotEmpty;
  7 +import jakarta.validation.constraints.NotNull;
  8 +import lombok.Data;
  9 +
  10 +import java.time.LocalDateTime;
  11 +import java.util.List;
10 12
11 @Schema(description = "管理后台 - 学生新增/修改 Request VO") 13 @Schema(description = "管理后台 - 学生新增/修改 Request VO")
12 @Data 14 @Data
13 -public class Demo03StudentSaveReqVO { 15 +public class Demo03StudentInnerSaveReqVO {
14 16
15 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8525") 17 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8525")
16 private Long id; 18 private Long id;
@@ -31,9 +33,10 @@ public class Demo03StudentSaveReqVO { @@ -31,9 +33,10 @@ public class Demo03StudentSaveReqVO {
31 @NotEmpty(message = "简介不能为空") 33 @NotEmpty(message = "简介不能为空")
32 private String description; 34 private String description;
33 35
34 - 36 + @Schema(description = "学生课程列表")
35 private List<Demo03CourseDO> demo03Courses; 37 private List<Demo03CourseDO> demo03Courses;
36 38
  39 + @Schema(description = "学生班级")
37 private Demo03GradeDO demo03Grade; 40 private Demo03GradeDO demo03Grade;
38 41
39 } 42 }
40 \ No newline at end of file 43 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/normal/Demo03StudentNormalController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal;
  2 +
  3 +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  8 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  9 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo.Demo03StudentNormalPageReqVO;
  10 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo.Demo03StudentNormalRespVO;
  11 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo.Demo03StudentNormalSaveReqVO;
  12 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
  13 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
  14 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
  15 +import cn.iocoder.yudao.module.infra.service.demo.demo03.normal.Demo03StudentNormalService;
  16 +import io.swagger.v3.oas.annotations.Operation;
  17 +import io.swagger.v3.oas.annotations.Parameter;
  18 +import io.swagger.v3.oas.annotations.tags.Tag;
  19 +import jakarta.annotation.Resource;
  20 +import jakarta.servlet.http.HttpServletResponse;
  21 +import jakarta.validation.Valid;
  22 +import org.springframework.security.access.prepost.PreAuthorize;
  23 +import org.springframework.validation.annotation.Validated;
  24 +import org.springframework.web.bind.annotation.*;
  25 +
  26 +import java.io.IOException;
  27 +import java.util.List;
  28 +
  29 +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
  30 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  31 +
  32 +@Tag(name = "管理后台 - 学生")
  33 +@RestController
  34 +@RequestMapping("/infra/demo03-student-normal")
  35 +@Validated
  36 +public class Demo03StudentNormalController {
  37 +
  38 + @Resource
  39 + private Demo03StudentNormalService demo03StudentNormalService;
  40 +
  41 + @PostMapping("/create")
  42 + @Operation(summary = "创建学生")
  43 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:create')")
  44 + public CommonResult<Long> createDemo03Student(@Valid @RequestBody Demo03StudentNormalSaveReqVO createReqVO) {
  45 + return success(demo03StudentNormalService.createDemo03Student(createReqVO));
  46 + }
  47 +
  48 + @PutMapping("/update")
  49 + @Operation(summary = "更新学生")
  50 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:update')")
  51 + public CommonResult<Boolean> updateDemo03Student(@Valid @RequestBody Demo03StudentNormalSaveReqVO updateReqVO) {
  52 + demo03StudentNormalService.updateDemo03Student(updateReqVO);
  53 + return success(true);
  54 + }
  55 +
  56 + @DeleteMapping("/delete")
  57 + @Operation(summary = "删除学生")
  58 + @Parameter(name = "id", description = "编号", required = true)
  59 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')")
  60 + public CommonResult<Boolean> deleteDemo03Student(@RequestParam("id") Long id) {
  61 + demo03StudentNormalService.deleteDemo03Student(id);
  62 + return success(true);
  63 + }
  64 +
  65 + @DeleteMapping("/delete-batch")
  66 + @Parameter(name = "ids", description = "编号", required = true)
  67 + @Operation(summary = "批量删除学生")
  68 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')")
  69 + public CommonResult<Boolean> deleteDemo03Student(@RequestParam("ids") List<Long> ids) {
  70 + demo03StudentNormalService.deleteDemo03StudentByIds(ids);
  71 + return success(true);
  72 + }
  73 +
  74 + @GetMapping("/get")
  75 + @Operation(summary = "获得学生")
  76 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  77 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
  78 + public CommonResult<Demo03StudentNormalRespVO> getDemo03Student(@RequestParam("id") Long id) {
  79 + Demo03StudentDO demo03Student = demo03StudentNormalService.getDemo03Student(id);
  80 + return success(BeanUtils.toBean(demo03Student, Demo03StudentNormalRespVO.class));
  81 + }
  82 +
  83 + @GetMapping("/page")
  84 + @Operation(summary = "获得学生分页")
  85 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
  86 + public CommonResult<PageResult<Demo03StudentNormalRespVO>> getDemo03StudentPage(@Valid Demo03StudentNormalPageReqVO pageReqVO) {
  87 + PageResult<Demo03StudentDO> pageResult = demo03StudentNormalService.getDemo03StudentPage(pageReqVO);
  88 + return success(BeanUtils.toBean(pageResult, Demo03StudentNormalRespVO.class));
  89 + }
  90 +
  91 + @GetMapping("/export-excel")
  92 + @Operation(summary = "导出学生 Excel")
  93 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:export')")
  94 + @ApiAccessLog(operateType = EXPORT)
  95 + public void exportDemo03StudentExcel(@Valid Demo03StudentNormalPageReqVO pageReqVO,
  96 + HttpServletResponse response) throws IOException {
  97 + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
  98 + List<Demo03StudentDO> list = demo03StudentNormalService.getDemo03StudentPage(pageReqVO).getList();
  99 + // 导出 Excel
  100 + ExcelUtils.write(response, "学生.xls", "数据", Demo03StudentNormalRespVO.class,
  101 + BeanUtils.toBean(list, Demo03StudentNormalRespVO.class));
  102 + }
  103 +
  104 + // ==================== 子表(学生课程) ====================
  105 +
  106 + @GetMapping("/demo03-course/list-by-student-id")
  107 + @Operation(summary = "获得学生课程列表")
  108 + @Parameter(name = "studentId", description = "学生编号")
  109 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
  110 + public CommonResult<List<Demo03CourseDO>> getDemo03CourseListByStudentId(@RequestParam("studentId") Long studentId) {
  111 + return success(demo03StudentNormalService.getDemo03CourseListByStudentId(studentId));
  112 + }
  113 +
  114 + // ==================== 子表(学生班级) ====================
  115 +
  116 + @GetMapping("/demo03-grade/get-by-student-id")
  117 + @Operation(summary = "获得学生班级")
  118 + @Parameter(name = "studentId", description = "学生编号")
  119 + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')")
  120 + public CommonResult<Demo03GradeDO> getDemo03GradeByStudentId(@RequestParam("studentId") Long studentId) {
  121 + return success(demo03StudentNormalService.getDemo03GradeByStudentId(studentId));
  122 + }
  123 +
  124 +}
0 \ No newline at end of file 125 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/normal/vo/Demo03StudentNormalPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@Schema(description = "管理后台 - 学生分页 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class Demo03StudentNormalPageReqVO extends PageParam {
  19 +
  20 + @Schema(description = "名字", example = "芋艿")
  21 + private String name;
  22 +
  23 + @Schema(description = "性别")
  24 + private Integer sex;
  25 +
  26 + @Schema(description = "简介", example = "随便")
  27 + private String description;
  28 +
  29 + @Schema(description = "创建时间")
  30 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  31 + private LocalDateTime[] createTime;
  32 +
  33 +}
0 \ No newline at end of file 34 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/normal/vo/Demo03StudentNormalRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  5 +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  6 +import com.alibaba.excel.annotation.ExcelProperty;
  7 +import io.swagger.v3.oas.annotations.media.Schema;
  8 +import lombok.Data;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +@Schema(description = "管理后台 - 学生 Response VO")
  13 +@Data
  14 +@ExcelIgnoreUnannotated
  15 +public class Demo03StudentNormalRespVO {
  16 +
  17 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8525")
  18 + @ExcelProperty("编号")
  19 + private Long id;
  20 +
  21 + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
  22 + @ExcelProperty("名字")
  23 + private String name;
  24 +
  25 + @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED)
  26 + @ExcelProperty(value = "性别", converter = DictConvert.class)
  27 + @DictFormat("system_user_sex") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
  28 + private Integer sex;
  29 +
  30 + @Schema(description = "出生日期", requiredMode = Schema.RequiredMode.REQUIRED)
  31 + @ExcelProperty("出生日期")
  32 + private LocalDateTime birthday;
  33 +
  34 + @Schema(description = "简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "随便")
  35 + @ExcelProperty("简介")
  36 + private String description;
  37 +
  38 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  39 + @ExcelProperty("创建时间")
  40 + private LocalDateTime createTime;
  41 +
  42 +}
0 \ No newline at end of file 43 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/normal/vo/Demo03StudentNormalSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo;
  2 +
  3 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
  4 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
  6 +import jakarta.validation.constraints.NotEmpty;
  7 +import jakarta.validation.constraints.NotNull;
  8 +import lombok.Data;
  9 +
  10 +import java.time.LocalDateTime;
  11 +import java.util.List;
  12 +
  13 +@Schema(description = "管理后台 - 学生新增/修改 Request VO")
  14 +@Data
  15 +public class Demo03StudentNormalSaveReqVO {
  16 +
  17 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8525")
  18 + private Long id;
  19 +
  20 + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
  21 + @NotEmpty(message = "名字不能为空")
  22 + private String name;
  23 +
  24 + @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED)
  25 + @NotNull(message = "性别不能为空")
  26 + private Integer sex;
  27 +
  28 + @Schema(description = "出生日期", requiredMode = Schema.RequiredMode.REQUIRED)
  29 + @NotNull(message = "出生日期不能为空")
  30 + private LocalDateTime birthday;
  31 +
  32 + @Schema(description = "简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "随便")
  33 + @NotEmpty(message = "简介不能为空")
  34 + private String description;
  35 +
  36 + @Schema(description = "学生课程列表")
  37 + private List<Demo03CourseDO> demo03Courses;
  38 +
  39 + @Schema(description = "学生班级")
  40 + private Demo03GradeDO demo03Grade;
  41 +
  42 +}
0 \ No newline at end of file 43 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/package-info.java deleted
1 -package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03;  
2 \ No newline at end of file 0 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo01/Demo01ContactMapper.java
1 package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo01; 1 package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo01;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;  
5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO; 6 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO;
7 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo01.Demo01ContactDO; 7 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo01.Demo01ContactDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo02/Demo02CategoryMapper.java
1 package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo02; 1 package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo02;
2 2
3 -import java.util.*;  
4 -  
5 -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;  
6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryListReqVO; 5 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryListReqVO;
8 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo02.Demo02CategoryDO; 6 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo02.Demo02CategoryDO;
9 import org.apache.ibatis.annotations.Mapper; 7 import org.apache.ibatis.annotations.Mapper;
10 8
  9 +import java.util.List;
  10 +
11 /** 11 /**
12 * 示例分类 Mapper 12 * 示例分类 Mapper
13 * 13 *
@@ -24,9 +24,9 @@ public interface Demo02CategoryMapper extends BaseMapperX&lt;Demo02CategoryDO&gt; { @@ -24,9 +24,9 @@ public interface Demo02CategoryMapper extends BaseMapperX&lt;Demo02CategoryDO&gt; {
24 .orderByDesc(Demo02CategoryDO::getId)); 24 .orderByDesc(Demo02CategoryDO::getId));
25 } 25 }
26 26
27 - default Demo02CategoryDO selectByParentIdAndName(Long parentId, String name) {  
28 - return selectOne(Demo02CategoryDO::getParentId, parentId, Demo02CategoryDO::getName, name);  
29 - } 27 + default Demo02CategoryDO selectByParentIdAndName(Long parentId, String name) {
  28 + return selectOne(Demo02CategoryDO::getParentId, parentId, Demo02CategoryDO::getName, name);
  29 + }
30 30
31 default Long selectCountByParentId(Long parentId) { 31 default Long selectCountByParentId(Long parentId) {
32 return selectCount(Demo02CategoryDO::getParentId, parentId); 32 return selectCount(Demo02CategoryDO::getParentId, parentId);
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/Demo03CourseMapper.java renamed to yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/erp/Demo03CourseErpMapper.java
1 -package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03; 1 +package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.erp;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -15,7 +15,7 @@ import java.util.List; @@ -15,7 +15,7 @@ import java.util.List;
15 * @author 芋道源码 15 * @author 芋道源码
16 */ 16 */
17 @Mapper 17 @Mapper
18 -public interface Demo03CourseMapper extends BaseMapperX<Demo03CourseDO> { 18 +public interface Demo03CourseErpMapper extends BaseMapperX<Demo03CourseDO> {
19 19
20 default PageResult<Demo03CourseDO> selectPage(PageParam reqVO, Long studentId) { 20 default PageResult<Demo03CourseDO> selectPage(PageParam reqVO, Long studentId) {
21 return selectPage(reqVO, new LambdaQueryWrapperX<Demo03CourseDO>() 21 return selectPage(reqVO, new LambdaQueryWrapperX<Demo03CourseDO>()
@@ -23,12 +23,12 @@ public interface Demo03CourseMapper extends BaseMapperX&lt;Demo03CourseDO&gt; { @@ -23,12 +23,12 @@ public interface Demo03CourseMapper extends BaseMapperX&lt;Demo03CourseDO&gt; {
23 .orderByDesc(Demo03CourseDO::getId)); 23 .orderByDesc(Demo03CourseDO::getId));
24 } 24 }
25 25
26 - default List<Demo03CourseDO> selectListByStudentId(Long studentId) {  
27 - return selectList(Demo03CourseDO::getStudentId, studentId);  
28 - }  
29 -  
30 default int deleteByStudentId(Long studentId) { 26 default int deleteByStudentId(Long studentId) {
31 return delete(Demo03CourseDO::getStudentId, studentId); 27 return delete(Demo03CourseDO::getStudentId, studentId);
32 } 28 }
33 29
34 -}  
35 \ No newline at end of file 30 \ No newline at end of file
  31 + default int deleteByStudentIds(List<Long> studentIds) {
  32 + return delete(Demo03CourseDO::getStudentId, studentIds);
  33 + }
  34 +
  35 +}
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/Demo03GradeMapper.java renamed to yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/erp/Demo03GradeErpMapper.java
1 -package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03; 1 +package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.erp;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -7,13 +7,15 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; @@ -7,13 +7,15 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO; 7 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
  10 +import java.util.List;
  11 +
10 /** 12 /**
11 * 学生班级 Mapper 13 * 学生班级 Mapper
12 * 14 *
13 * @author 芋道源码 15 * @author 芋道源码
14 */ 16 */
15 @Mapper 17 @Mapper
16 -public interface Demo03GradeMapper extends BaseMapperX<Demo03GradeDO> { 18 +public interface Demo03GradeErpMapper extends BaseMapperX<Demo03GradeDO> {
17 19
18 default PageResult<Demo03GradeDO> selectPage(PageParam reqVO, Long studentId) { 20 default PageResult<Demo03GradeDO> selectPage(PageParam reqVO, Long studentId) {
19 return selectPage(reqVO, new LambdaQueryWrapperX<Demo03GradeDO>() 21 return selectPage(reqVO, new LambdaQueryWrapperX<Demo03GradeDO>()
@@ -29,4 +31,8 @@ public interface Demo03GradeMapper extends BaseMapperX&lt;Demo03GradeDO&gt; { @@ -29,4 +31,8 @@ public interface Demo03GradeMapper extends BaseMapperX&lt;Demo03GradeDO&gt; {
29 return delete(Demo03GradeDO::getStudentId, studentId); 31 return delete(Demo03GradeDO::getStudentId, studentId);
30 } 32 }
31 33
32 -}  
33 \ No newline at end of file 34 \ No newline at end of file
  35 + default int deleteByStudentIds(List<Long> studentIds) {
  36 + return delete(Demo03GradeDO::getStudentId, studentIds);
  37 + }
  38 +
  39 +}
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/Demo03StudentMapper.java renamed to yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/erp/Demo03StudentErpMapper.java
1 -package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03; 1 +package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.erp;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;  
5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo.Demo03StudentErpPageReqVO;
6 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO; 7 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
7 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
8 -import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.*;  
9 9
10 /** 10 /**
11 * 学生 Mapper 11 * 学生 Mapper
@@ -13,9 +13,9 @@ import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.*; @@ -13,9 +13,9 @@ import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.*;
13 * @author 芋道源码 13 * @author 芋道源码
14 */ 14 */
15 @Mapper 15 @Mapper
16 -public interface Demo03StudentMapper extends BaseMapperX<Demo03StudentDO> { 16 +public interface Demo03StudentErpMapper extends BaseMapperX<Demo03StudentDO> {
17 17
18 - default PageResult<Demo03StudentDO> selectPage(Demo03StudentPageReqVO reqVO) { 18 + default PageResult<Demo03StudentDO> selectPage(Demo03StudentErpPageReqVO reqVO) {
19 return selectPage(reqVO, new LambdaQueryWrapperX<Demo03StudentDO>() 19 return selectPage(reqVO, new LambdaQueryWrapperX<Demo03StudentDO>()
20 .likeIfPresent(Demo03StudentDO::getName, reqVO.getName()) 20 .likeIfPresent(Demo03StudentDO::getName, reqVO.getName())
21 .eqIfPresent(Demo03StudentDO::getSex, reqVO.getSex()) 21 .eqIfPresent(Demo03StudentDO::getSex, reqVO.getSex())
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/inner/Demo03CourseInnerMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.inner;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * 学生课程 Mapper
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Mapper
  15 +public interface Demo03CourseInnerMapper extends BaseMapperX<Demo03CourseDO> {
  16 +
  17 + default List<Demo03CourseDO> selectListByStudentId(Long studentId) {
  18 + return selectList(Demo03CourseDO::getStudentId, studentId);
  19 + }
  20 +
  21 + default int deleteByStudentId(Long studentId) {
  22 + return delete(Demo03CourseDO::getStudentId, studentId);
  23 + }
  24 +
  25 + default int deleteByStudentIds(List<Long> studentIds) {
  26 + return delete(Demo03CourseDO::getStudentId, studentIds);
  27 + }
  28 +
  29 +}
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/inner/Demo03GradeInnerMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.inner;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * 学生班级 Mapper
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Mapper
  15 +public interface Demo03GradeInnerMapper extends BaseMapperX<Demo03GradeDO> {
  16 +
  17 + default Demo03GradeDO selectByStudentId(Long studentId) {
  18 + return selectOne(Demo03GradeDO::getStudentId, studentId);
  19 + }
  20 +
  21 + default int deleteByStudentId(Long studentId) {
  22 + return delete(Demo03GradeDO::getStudentId, studentId);
  23 + }
  24 +
  25 + default int deleteByStudentIds(List<Long> studentIds) {
  26 + return delete(Demo03GradeDO::getStudentId, studentIds);
  27 + }
  28 +
  29 +}
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/inner/Demo03StudentInnerMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.inner;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo.Demo03StudentInnerPageReqVO;
  7 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +/**
  11 + * 学生 Mapper
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Mapper
  16 +public interface Demo03StudentInnerMapper extends BaseMapperX<Demo03StudentDO> {
  17 +
  18 + default PageResult<Demo03StudentDO> selectPage(Demo03StudentInnerPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<Demo03StudentDO>()
  20 + .likeIfPresent(Demo03StudentDO::getName, reqVO.getName())
  21 + .eqIfPresent(Demo03StudentDO::getSex, reqVO.getSex())
  22 + .eqIfPresent(Demo03StudentDO::getDescription, reqVO.getDescription())
  23 + .betweenIfPresent(Demo03StudentDO::getCreateTime, reqVO.getCreateTime())
  24 + .orderByDesc(Demo03StudentDO::getId));
  25 + }
  26 +
  27 +}
0 \ No newline at end of file 28 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/normal/Demo03CourseNormalMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.normal;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * 学生课程 Mapper
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Mapper
  15 +public interface Demo03CourseNormalMapper extends BaseMapperX<Demo03CourseDO> {
  16 +
  17 + default List<Demo03CourseDO> selectListByStudentId(Long studentId) {
  18 + return selectList(Demo03CourseDO::getStudentId, studentId);
  19 + }
  20 +
  21 + default int deleteByStudentId(Long studentId) {
  22 + return delete(Demo03CourseDO::getStudentId, studentId);
  23 + }
  24 +
  25 + default int deleteByStudentIds(List<Long> studentIds) {
  26 + return delete(Demo03CourseDO::getStudentId, studentIds);
  27 + }
  28 +
  29 +}
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/normal/Demo03GradeNormalMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.normal;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * 学生班级 Mapper
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Mapper
  15 +public interface Demo03GradeNormalMapper extends BaseMapperX<Demo03GradeDO> {
  16 +
  17 + default Demo03GradeDO selectByStudentId(Long studentId) {
  18 + return selectOne(Demo03GradeDO::getStudentId, studentId);
  19 + }
  20 +
  21 + default int deleteByStudentId(Long studentId) {
  22 + return delete(Demo03GradeDO::getStudentId, studentId);
  23 + }
  24 +
  25 + default int deleteByStudentIds(List<Long> studentIds) {
  26 + return delete(Demo03GradeDO::getStudentId, studentIds);
  27 + }
  28 +
  29 +}
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo/demo03/normal/Demo03StudentNormalMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.normal;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo.Demo03StudentNormalPageReqVO;
  7 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +/**
  11 + * 学生 Mapper
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Mapper
  16 +public interface Demo03StudentNormalMapper extends BaseMapperX<Demo03StudentDO> {
  17 +
  18 + default PageResult<Demo03StudentDO> selectPage(Demo03StudentNormalPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<Demo03StudentDO>()
  20 + .likeIfPresent(Demo03StudentDO::getName, reqVO.getName())
  21 + .eqIfPresent(Demo03StudentDO::getSex, reqVO.getSex())
  22 + .eqIfPresent(Demo03StudentDO::getDescription, reqVO.getDescription())
  23 + .betweenIfPresent(Demo03StudentDO::getCreateTime, reqVO.getCreateTime())
  24 + .orderByDesc(Demo03StudentDO::getId));
  25 + }
  26 +
  27 +}
0 \ No newline at end of file 28 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/enums/ErrorCodeConstants.java
@@ -65,7 +65,8 @@ public interface ErrorCodeConstants { @@ -65,7 +65,8 @@ public interface ErrorCodeConstants {
65 ErrorCode DEMO02_CATEGORY_NAME_DUPLICATE = new ErrorCode(1_001_201_005, "已经存在该名字的示例分类"); 65 ErrorCode DEMO02_CATEGORY_NAME_DUPLICATE = new ErrorCode(1_001_201_005, "已经存在该名字的示例分类");
66 ErrorCode DEMO02_CATEGORY_PARENT_IS_CHILD = new ErrorCode(1_001_201_006, "不能设置自己的子示例分类为父示例分类"); 66 ErrorCode DEMO02_CATEGORY_PARENT_IS_CHILD = new ErrorCode(1_001_201_006, "不能设置自己的子示例分类为父示例分类");
67 ErrorCode DEMO03_STUDENT_NOT_EXISTS = new ErrorCode(1_001_201_007, "学生不存在"); 67 ErrorCode DEMO03_STUDENT_NOT_EXISTS = new ErrorCode(1_001_201_007, "学生不存在");
68 - ErrorCode DEMO03_GRADE_NOT_EXISTS = new ErrorCode(1_001_201_008, "学生班级不存在");  
69 - ErrorCode DEMO03_GRADE_EXISTS = new ErrorCode(1_001_201_009, "学生班级已存在"); 68 + ErrorCode DEMO03_COURSE_NOT_EXISTS = new ErrorCode(1_001_201_008, "学生课程不存在");
  69 + ErrorCode DEMO03_GRADE_NOT_EXISTS = new ErrorCode(1_001_201_009, "学生班级不存在");
  70 + ErrorCode DEMO03_GRADE_EXISTS = new ErrorCode(1_001_201_010, "学生班级已存在");
70 71
71 } 72 }
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/framework/codegen/config/CodegenProperties.java
@@ -49,4 +49,10 @@ public class CodegenProperties { @@ -49,4 +49,10 @@ public class CodegenProperties {
49 @NotNull(message = "是否生成单元测试不能为空") 49 @NotNull(message = "是否生成单元测试不能为空")
50 private Boolean unitTestEnable; 50 private Boolean unitTestEnable;
51 51
  52 + /**
  53 + * 是否生成批量删除接口
  54 + */
  55 + @NotNull(message = "是否生成批量删除接口不能为空")
  56 + private Boolean deleteBatchEnable;
  57 +
52 } 58 }
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
@@ -236,6 +236,7 @@ public class CodegenEngine { @@ -236,6 +236,7 @@ public class CodegenEngine {
236 + '.' + "framework"); // 用于后续获取测试类的 package 地址 236 + '.' + "framework"); // 用于后续获取测试类的 package 地址
237 globalBindingMap.put("jakartaPackage", jakartaEnable ? "jakarta" : "javax"); 237 globalBindingMap.put("jakartaPackage", jakartaEnable ? "jakarta" : "javax");
238 globalBindingMap.put("voType", codegenProperties.getVoType()); 238 globalBindingMap.put("voType", codegenProperties.getVoType());
  239 + globalBindingMap.put("deleteBatchEnable", codegenProperties.getDeleteBatchEnable());
239 // 全局 Java Bean 240 // 全局 Java Bean
240 globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); 241 globalBindingMap.put("CommonResultClassName", CommonResult.class.getName());
241 globalBindingMap.put("PageResultClassName", PageResult.class.getName()); 242 globalBindingMap.put("PageResultClassName", PageResult.class.getName());
@@ -257,6 +258,7 @@ public class CodegenEngine { @@ -257,6 +258,7 @@ public class CodegenEngine {
257 globalBindingMap.put("ApiAccessLogClassName", ApiAccessLog.class.getName()); 258 globalBindingMap.put("ApiAccessLogClassName", ApiAccessLog.class.getName());
258 globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName()); 259 globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName());
259 globalBindingMap.put("BeanUtils", BeanUtils.class.getName()); 260 globalBindingMap.put("BeanUtils", BeanUtils.class.getName());
  261 + globalBindingMap.put("CollectionUtilsClassName", CollectionUtils.class.getName());
260 } 262 }
261 263
262 /** 264 /**
@@ -382,7 +384,6 @@ public class CodegenEngine { @@ -382,7 +384,6 @@ public class CodegenEngine {
382 bindingMap.put("columns", columns); 384 bindingMap.put("columns", columns);
383 bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, CodegenColumnDO::getPrimaryKey)); // 主键字段 385 bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, CodegenColumnDO::getPrimaryKey)); // 主键字段
384 bindingMap.put("sceneEnum", CodegenSceneEnum.valueOf(table.getScene())); 386 bindingMap.put("sceneEnum", CodegenSceneEnum.valueOf(table.getScene()));
385 -  
386 // className 相关 387 // className 相关
387 // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 388 // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀
388 String className = table.getClassName(); 389 String className = table.getClassName();
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo01/Demo01ContactService.java
1 package cn.iocoder.yudao.module.infra.service.demo.demo01; 1 package cn.iocoder.yudao.module.infra.service.demo.demo01;
2 2
3 -import jakarta.validation.*;  
4 - 3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO; 4 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO;
6 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactSaveReqVO; 5 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactSaveReqVO;
7 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo01.Demo01ContactDO; 6 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo01.Demo01ContactDO;
8 -import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 +import jakarta.validation.Valid;
  8 +
  9 +import java.util.List;
9 10
10 /** 11 /**
11 * 示例联系人 Service 接口 12 * 示例联系人 Service 接口
@@ -37,6 +38,13 @@ public interface Demo01ContactService { @@ -37,6 +38,13 @@ public interface Demo01ContactService {
37 void deleteDemo01Contact(Long id); 38 void deleteDemo01Contact(Long id);
38 39
39 /** 40 /**
  41 + * 批量删除示例联系人
  42 + *
  43 + * @param ids 编号
  44 + */
  45 + void deleteDemo01ContactByIds(List<Long> ids);
  46 +
  47 + /**
40 * 获得示例联系人 48 * 获得示例联系人
41 * 49 *
42 * @param id 编号 50 * @param id 编号
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo01/Demo01ContactServiceImpl.java
1 package cn.iocoder.yudao.module.infra.service.demo.demo01; 1 package cn.iocoder.yudao.module.infra.service.demo.demo01;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
3 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO; 6 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO;
4 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactSaveReqVO; 7 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactSaveReqVO;
5 -import org.springframework.stereotype.Service; 8 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo01.Demo01ContactDO;
  9 +import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo01.Demo01ContactMapper;
6 import jakarta.annotation.Resource; 10 import jakarta.annotation.Resource;
  11 +import org.springframework.stereotype.Service;
7 import org.springframework.validation.annotation.Validated; 12 import org.springframework.validation.annotation.Validated;
8 13
9 -import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo01.Demo01ContactDO;  
10 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
11 -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;  
12 -  
13 -import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo01.Demo01ContactMapper; 14 +import java.util.List;
14 15
15 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 16 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
16 -import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; 17 +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.DEMO01_CONTACT_NOT_EXISTS;
17 18
18 /** 19 /**
19 * 示例联系人 Service 实现类 20 * 示例联系人 Service 实现类
@@ -53,6 +54,21 @@ public class Demo01ContactServiceImpl implements Demo01ContactService { @@ -53,6 +54,21 @@ public class Demo01ContactServiceImpl implements Demo01ContactService {
53 demo01ContactMapper.deleteById(id); 54 demo01ContactMapper.deleteById(id);
54 } 55 }
55 56
  57 + @Override
  58 + public void deleteDemo01ContactByIds(List<Long> ids) {
  59 + // 校验存在
  60 + validateDemo01ContactExists(ids);
  61 + // 删除
  62 + demo01ContactMapper.deleteByIds(ids);
  63 + }
  64 +
  65 + private void validateDemo01ContactExists(List<Long> ids) {
  66 + List<Demo01ContactDO> list = demo01ContactMapper.selectByIds(ids);
  67 + if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
  68 + throw exception(DEMO01_CONTACT_NOT_EXISTS);
  69 + }
  70 + }
  71 +
56 private void validateDemo01ContactExists(Long id) { 72 private void validateDemo01ContactExists(Long id) {
57 if (demo01ContactMapper.selectById(id) == null) { 73 if (demo01ContactMapper.selectById(id) == null) {
58 throw exception(DEMO01_CONTACT_NOT_EXISTS); 74 throw exception(DEMO01_CONTACT_NOT_EXISTS);
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo02/Demo02CategoryService.java
1 package cn.iocoder.yudao.module.infra.service.demo.demo02; 1 package cn.iocoder.yudao.module.infra.service.demo.demo02;
2 2
3 -import java.util.*;  
4 -import jakarta.validation.*;  
5 -  
6 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryListReqVO; 3 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryListReqVO;
7 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategorySaveReqVO; 4 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategorySaveReqVO;
8 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo02.Demo02CategoryDO; 5 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo02.Demo02CategoryDO;
  6 +import jakarta.validation.Valid;
  7 +
  8 +import java.util.List;
9 9
10 /** 10 /**
11 * 示例分类 Service 接口 11 * 示例分类 Service 接口
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo02/Demo02CategoryServiceImpl.java
@@ -5,10 +5,10 @@ import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02Categ @@ -5,10 +5,10 @@ import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02Categ
5 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategorySaveReqVO; 5 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategorySaveReqVO;
6 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo02.Demo02CategoryDO; 6 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo02.Demo02CategoryDO;
7 import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo02.Demo02CategoryMapper; 7 import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo02.Demo02CategoryMapper;
  8 +import jakarta.annotation.Resource;
8 import org.springframework.stereotype.Service; 9 import org.springframework.stereotype.Service;
9 import org.springframework.validation.annotation.Validated; 10 import org.springframework.validation.annotation.Validated;
10 11
11 -import jakarta.annotation.Resource;  
12 import java.util.List; 12 import java.util.List;
13 import java.util.Objects; 13 import java.util.Objects;
14 14
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo03/Demo03StudentService.java renamed to yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo03/erp/Demo03StudentErpService.java
1 -package cn.iocoder.yudao.module.infra.service.demo.demo03; 1 +package cn.iocoder.yudao.module.infra.service.demo.demo03.erp;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 -import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentPageReqVO;  
6 -import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentSaveReqVO; 5 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo.Demo03StudentErpPageReqVO;
  6 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo.Demo03StudentErpSaveReqVO;
7 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO; 7 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
8 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO; 8 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
9 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO; 9 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
10 -  
11 import jakarta.validation.Valid; 10 import jakarta.validation.Valid;
  11 +
12 import java.util.List; 12 import java.util.List;
13 13
14 /** 14 /**
@@ -16,7 +16,7 @@ import java.util.List; @@ -16,7 +16,7 @@ import java.util.List;
16 * 16 *
17 * @author 芋道源码 17 * @author 芋道源码
18 */ 18 */
19 -public interface Demo03StudentService { 19 +public interface Demo03StudentErpService {
20 20
21 /** 21 /**
22 * 创建学生 22 * 创建学生
@@ -24,14 +24,14 @@ public interface Demo03StudentService { @@ -24,14 +24,14 @@ public interface Demo03StudentService {
24 * @param createReqVO 创建信息 24 * @param createReqVO 创建信息
25 * @return 编号 25 * @return 编号
26 */ 26 */
27 - Long createDemo03Student(@Valid Demo03StudentSaveReqVO createReqVO); 27 + Long createDemo03Student(@Valid Demo03StudentErpSaveReqVO createReqVO);
28 28
29 /** 29 /**
30 * 更新学生 30 * 更新学生
31 * 31 *
32 * @param updateReqVO 更新信息 32 * @param updateReqVO 更新信息
33 */ 33 */
34 - void updateDemo03Student(@Valid Demo03StudentSaveReqVO updateReqVO); 34 + void updateDemo03Student(@Valid Demo03StudentErpSaveReqVO updateReqVO);
35 35
36 /** 36 /**
37 * 删除学生 37 * 删除学生
@@ -41,6 +41,13 @@ public interface Demo03StudentService { @@ -41,6 +41,13 @@ public interface Demo03StudentService {
41 void deleteDemo03Student(Long id); 41 void deleteDemo03Student(Long id);
42 42
43 /** 43 /**
  44 + * 批量删除学生
  45 + *
  46 + * @param ids 编号
  47 + */
  48 + void deleteDemo03StudentByIds(List<Long> ids);
  49 +
  50 + /**
44 * 获得学生 51 * 获得学生
45 * 52 *
46 * @param id 编号 53 * @param id 编号
@@ -54,20 +61,11 @@ public interface Demo03StudentService { @@ -54,20 +61,11 @@ public interface Demo03StudentService {
54 * @param pageReqVO 分页查询 61 * @param pageReqVO 分页查询
55 * @return 学生分页 62 * @return 学生分页
56 */ 63 */
57 - PageResult<Demo03StudentDO> getDemo03StudentPage(Demo03StudentPageReqVO pageReqVO);  
58 - 64 + PageResult<Demo03StudentDO> getDemo03StudentPage(Demo03StudentErpPageReqVO pageReqVO);
59 65
60 // ==================== 子表(学生课程) ==================== 66 // ==================== 子表(学生课程) ====================
61 67
62 /** 68 /**
63 - * 获得学生课程列表  
64 - *  
65 - * @param studentId 学生编号  
66 - * @return 学生课程列表  
67 - */  
68 - List<Demo03CourseDO> getDemo03CourseListByStudentId(Long studentId);  
69 -  
70 - /**  
71 * 获得学生课程分页 69 * 获得学生课程分页
72 * 70 *
73 * @param pageReqVO 分页查询 71 * @param pageReqVO 分页查询
@@ -99,6 +97,13 @@ public interface Demo03StudentService { @@ -99,6 +97,13 @@ public interface Demo03StudentService {
99 void deleteDemo03Course(Long id); 97 void deleteDemo03Course(Long id);
100 98
101 /** 99 /**
  100 + * 批量删除学生课程
  101 + *
  102 + * @param ids 编号
  103 + */
  104 + void deleteDemo03CourseByIds(List<Long> ids);
  105 +
  106 + /**
102 * 获得学生课程 107 * 获得学生课程
103 * 108 *
104 * @param id 编号 109 * @param id 编号
@@ -109,14 +114,6 @@ public interface Demo03StudentService { @@ -109,14 +114,6 @@ public interface Demo03StudentService {
109 // ==================== 子表(学生班级) ==================== 114 // ==================== 子表(学生班级) ====================
110 115
111 /** 116 /**
112 - * 获得学生班级  
113 - *  
114 - * @param studentId 学生编号  
115 - * @return 学生班级  
116 - */  
117 - Demo03GradeDO getDemo03GradeByStudentId(Long studentId);  
118 -  
119 - /**  
120 * 获得学生班级分页 117 * 获得学生班级分页
121 * 118 *
122 * @param pageReqVO 分页查询 119 * @param pageReqVO 分页查询
@@ -148,6 +145,13 @@ public interface Demo03StudentService { @@ -148,6 +145,13 @@ public interface Demo03StudentService {
148 void deleteDemo03Grade(Long id); 145 void deleteDemo03Grade(Long id);
149 146
150 /** 147 /**
  148 + * 批量删除学生班级
  149 + *
  150 + * @param ids 编号
  151 + */
  152 + void deleteDemo03GradeByIds(List<Long> ids);
  153 +
  154 + /**
151 * 获得学生班级 155 * 获得学生班级
152 * 156 *
153 * @param id 编号 157 * @param id 编号
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo03/Demo03StudentServiceImpl.java renamed to yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo03/erp/Demo03StudentErpServiceImpl.java
1 -package cn.iocoder.yudao.module.infra.service.demo.demo03; 1 +package cn.iocoder.yudao.module.infra.service.demo.demo03.erp;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 4 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 -import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentPageReqVO;  
7 -import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentSaveReqVO; 7 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo.Demo03StudentErpPageReqVO;
  8 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo.Demo03StudentErpSaveReqVO;
8 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO; 9 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
9 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO; 10 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
10 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO; 11 import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
11 -import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.Demo03CourseMapper;  
12 -import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.Demo03GradeMapper;  
13 -import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.Demo03StudentMapper; 12 +import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.erp.Demo03CourseErpMapper;
  13 +import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.erp.Demo03GradeErpMapper;
  14 +import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.erp.Demo03StudentErpMapper;
  15 +import jakarta.annotation.Resource;
14 import org.springframework.stereotype.Service; 16 import org.springframework.stereotype.Service;
15 import org.springframework.transaction.annotation.Transactional; 17 import org.springframework.transaction.annotation.Transactional;
16 import org.springframework.validation.annotation.Validated; 18 import org.springframework.validation.annotation.Validated;
17 19
18 -import jakarta.annotation.Resource;  
19 import java.util.List; 20 import java.util.List;
20 21
21 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 22 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -28,41 +29,31 @@ import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; @@ -28,41 +29,31 @@ import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*;
28 */ 29 */
29 @Service 30 @Service
30 @Validated 31 @Validated
31 -public class Demo03StudentServiceImpl implements Demo03StudentService { 32 +public class Demo03StudentErpServiceImpl implements Demo03StudentErpService {
32 33
33 @Resource 34 @Resource
34 - private Demo03StudentMapper demo03StudentMapper; 35 + private Demo03StudentErpMapper demo03StudentErpMapper;
35 @Resource 36 @Resource
36 - private Demo03CourseMapper demo03CourseMapper; 37 + private Demo03CourseErpMapper demo03CourseErpMapper;
37 @Resource 38 @Resource
38 - private Demo03GradeMapper demo03GradeMapper; 39 + private Demo03GradeErpMapper demo03GradeErpMapper;
39 40
40 @Override 41 @Override
41 - @Transactional(rollbackFor = Exception.class)  
42 - public Long createDemo03Student(Demo03StudentSaveReqVO createReqVO) { 42 + public Long createDemo03Student(Demo03StudentErpSaveReqVO createReqVO) {
43 // 插入 43 // 插入
44 Demo03StudentDO demo03Student = BeanUtils.toBean(createReqVO, Demo03StudentDO.class); 44 Demo03StudentDO demo03Student = BeanUtils.toBean(createReqVO, Demo03StudentDO.class);
45 - demo03StudentMapper.insert(demo03Student);  
46 -  
47 - // 插入子表  
48 - createDemo03CourseList(demo03Student.getId(), createReqVO.getDemo03Courses());  
49 - createDemo03Grade(demo03Student.getId(), createReqVO.getDemo03Grade()); 45 + demo03StudentErpMapper.insert(demo03Student);
50 // 返回 46 // 返回
51 return demo03Student.getId(); 47 return demo03Student.getId();
52 } 48 }
53 49
54 @Override 50 @Override
55 - @Transactional(rollbackFor = Exception.class)  
56 - public void updateDemo03Student(Demo03StudentSaveReqVO updateReqVO) { 51 + public void updateDemo03Student(Demo03StudentErpSaveReqVO updateReqVO) {
57 // 校验存在 52 // 校验存在
58 validateDemo03StudentExists(updateReqVO.getId()); 53 validateDemo03StudentExists(updateReqVO.getId());
59 // 更新 54 // 更新
60 Demo03StudentDO updateObj = BeanUtils.toBean(updateReqVO, Demo03StudentDO.class); 55 Demo03StudentDO updateObj = BeanUtils.toBean(updateReqVO, Demo03StudentDO.class);
61 - demo03StudentMapper.updateById(updateObj);  
62 -  
63 - // 更新子表  
64 - updateDemo03CourseList(updateReqVO.getId(), updateReqVO.getDemo03Courses());  
65 - updateDemo03Grade(updateReqVO.getId(), updateReqVO.getDemo03Grade()); 56 + demo03StudentErpMapper.updateById(updateObj);
66 } 57 }
67 58
68 @Override 59 @Override
@@ -71,119 +62,128 @@ public class Demo03StudentServiceImpl implements Demo03StudentService { @@ -71,119 +62,128 @@ public class Demo03StudentServiceImpl implements Demo03StudentService {
71 // 校验存在 62 // 校验存在
72 validateDemo03StudentExists(id); 63 validateDemo03StudentExists(id);
73 // 删除 64 // 删除
74 - demo03StudentMapper.deleteById(id); 65 + demo03StudentErpMapper.deleteById(id);
75 66
76 // 删除子表 67 // 删除子表
77 deleteDemo03CourseByStudentId(id); 68 deleteDemo03CourseByStudentId(id);
78 deleteDemo03GradeByStudentId(id); 69 deleteDemo03GradeByStudentId(id);
79 } 70 }
80 71
  72 + @Override
  73 + @Transactional(rollbackFor = Exception.class)
  74 + public void deleteDemo03StudentByIds(List<Long> ids) {
  75 + // 校验存在
  76 + validateDemo03StudentExists(ids);
  77 + // 删除
  78 + demo03StudentErpMapper.deleteByIds(ids);
  79 +
  80 + // 删除子表
  81 + deleteDemo03CourseByStudentIds(ids);
  82 + deleteDemo03GradeByStudentIds(ids);
  83 + }
  84 +
  85 + private void validateDemo03StudentExists(List<Long> ids) {
  86 + List<Demo03StudentDO> list = demo03StudentErpMapper.selectByIds(ids);
  87 + if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
  88 + throw exception(DEMO03_STUDENT_NOT_EXISTS);
  89 + }
  90 + }
  91 +
81 private void validateDemo03StudentExists(Long id) { 92 private void validateDemo03StudentExists(Long id) {
82 - if (demo03StudentMapper.selectById(id) == null) { 93 + if (demo03StudentErpMapper.selectById(id) == null) {
83 throw exception(DEMO03_STUDENT_NOT_EXISTS); 94 throw exception(DEMO03_STUDENT_NOT_EXISTS);
84 } 95 }
85 } 96 }
86 97
87 @Override 98 @Override
88 public Demo03StudentDO getDemo03Student(Long id) { 99 public Demo03StudentDO getDemo03Student(Long id) {
89 - return demo03StudentMapper.selectById(id); 100 + return demo03StudentErpMapper.selectById(id);
90 } 101 }
91 102
92 @Override 103 @Override
93 - public PageResult<Demo03StudentDO> getDemo03StudentPage(Demo03StudentPageReqVO pageReqVO) {  
94 - return demo03StudentMapper.selectPage(pageReqVO); 104 + public PageResult<Demo03StudentDO> getDemo03StudentPage(Demo03StudentErpPageReqVO pageReqVO) {
  105 + return demo03StudentErpMapper.selectPage(pageReqVO);
95 } 106 }
96 107
97 // ==================== 子表(学生课程) ==================== 108 // ==================== 子表(学生课程) ====================
98 109
99 @Override 110 @Override
100 - public List<Demo03CourseDO> getDemo03CourseListByStudentId(Long studentId) {  
101 - return demo03CourseMapper.selectListByStudentId(studentId);  
102 - }  
103 -  
104 - private void createDemo03CourseList(Long studentId, List<Demo03CourseDO> list) {  
105 - if (list != null) {  
106 - list.forEach(o -> o.setStudentId(studentId));  
107 - }  
108 - demo03CourseMapper.insertBatch(list);  
109 - }  
110 -  
111 - private void updateDemo03CourseList(Long studentId, List<Demo03CourseDO> list) {  
112 - deleteDemo03CourseByStudentId(studentId);  
113 - list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新  
114 - createDemo03CourseList(studentId, list);  
115 - }  
116 -  
117 - private void deleteDemo03CourseByStudentId(Long studentId) {  
118 - demo03CourseMapper.deleteByStudentId(studentId);  
119 - }  
120 -  
121 - @Override  
122 public PageResult<Demo03CourseDO> getDemo03CoursePage(PageParam pageReqVO, Long studentId) { 111 public PageResult<Demo03CourseDO> getDemo03CoursePage(PageParam pageReqVO, Long studentId) {
123 - return demo03CourseMapper.selectPage(pageReqVO, studentId); 112 + return demo03CourseErpMapper.selectPage(pageReqVO, studentId);
124 } 113 }
125 114
126 @Override 115 @Override
127 public Long createDemo03Course(Demo03CourseDO demo03Course) { 116 public Long createDemo03Course(Demo03CourseDO demo03Course) {
128 - demo03CourseMapper.insert(demo03Course); 117 + demo03CourseErpMapper.insert(demo03Course);
129 return demo03Course.getId(); 118 return demo03Course.getId();
130 } 119 }
131 120
132 @Override 121 @Override
133 public void updateDemo03Course(Demo03CourseDO demo03Course) { 122 public void updateDemo03Course(Demo03CourseDO demo03Course) {
134 - demo03CourseMapper.updateById(demo03Course); 123 + // 校验存在
  124 + validateDemo03CourseExists(demo03Course.getId());
  125 + // 更新
  126 + demo03Course.setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  127 + demo03CourseErpMapper.updateById(demo03Course);
135 } 128 }
136 129
137 @Override 130 @Override
138 public void deleteDemo03Course(Long id) { 131 public void deleteDemo03Course(Long id) {
139 - demo03CourseMapper.deleteById(id); 132 + // 校验存在
  133 + validateDemo03CourseExists(id);
  134 + // 删除
  135 + demo03CourseErpMapper.deleteById(id);
140 } 136 }
141 137
142 @Override 138 @Override
143 - public Demo03CourseDO getDemo03Course(Long id) {  
144 - return demo03CourseMapper.selectById(id); 139 + public void deleteDemo03CourseByIds(List<Long> ids) {
  140 + // 校验存在
  141 + validateDemo03CourseExists(ids);
  142 + // 删除
  143 + demo03CourseErpMapper.deleteByIds(ids);
145 } 144 }
146 145
147 - // ==================== 子表(学生班级) ====================  
148 -  
149 @Override 146 @Override
150 - public Demo03GradeDO getDemo03GradeByStudentId(Long studentId) {  
151 - return demo03GradeMapper.selectByStudentId(studentId); 147 + public Demo03CourseDO getDemo03Course(Long id) {
  148 + return demo03CourseErpMapper.selectById(id);
152 } 149 }
153 150
154 - private void createDemo03Grade(Long studentId, Demo03GradeDO demo03Grade) {  
155 - if (demo03Grade == null) {  
156 - return; 151 + private void validateDemo03CourseExists(Long id) {
  152 + if (demo03CourseErpMapper.selectById(id) == null) {
  153 + throw exception(DEMO03_COURSE_NOT_EXISTS);
157 } 154 }
158 - demo03Grade.setStudentId(studentId);  
159 - demo03GradeMapper.insert(demo03Grade);  
160 } 155 }
161 156
162 - private void updateDemo03Grade(Long studentId, Demo03GradeDO demo03Grade) {  
163 - if (demo03Grade == null) {  
164 - return; 157 + private void validateDemo03CourseExists(List<Long> ids) {
  158 + List<Demo03CourseDO> list = demo03CourseErpMapper.selectByIds(ids);
  159 + if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
  160 + throw exception(DEMO03_COURSE_NOT_EXISTS);
165 } 161 }
166 - demo03Grade.setStudentId(studentId);  
167 - demo03Grade.setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新  
168 - demo03GradeMapper.insertOrUpdate(demo03Grade);  
169 } 162 }
170 163
171 - private void deleteDemo03GradeByStudentId(Long studentId) {  
172 - demo03GradeMapper.deleteByStudentId(studentId); 164 + private void deleteDemo03CourseByStudentId(Long studentId) {
  165 + demo03CourseErpMapper.deleteByStudentId(studentId);
  166 + }
  167 +
  168 + private void deleteDemo03CourseByStudentIds(List<Long> studentIds) {
  169 + demo03CourseErpMapper.deleteByStudentIds(studentIds);
173 } 170 }
174 171
  172 + // ==================== 子表(学生班级) ====================
  173 +
175 @Override 174 @Override
176 public PageResult<Demo03GradeDO> getDemo03GradePage(PageParam pageReqVO, Long studentId) { 175 public PageResult<Demo03GradeDO> getDemo03GradePage(PageParam pageReqVO, Long studentId) {
177 - return demo03GradeMapper.selectPage(pageReqVO, studentId); 176 + return demo03GradeErpMapper.selectPage(pageReqVO, studentId);
178 } 177 }
179 178
180 @Override 179 @Override
181 public Long createDemo03Grade(Demo03GradeDO demo03Grade) { 180 public Long createDemo03Grade(Demo03GradeDO demo03Grade) {
182 // 校验是否已经存在 181 // 校验是否已经存在
183 - if (demo03GradeMapper.selectByStudentId(demo03Grade.getStudentId()) != null) { 182 + if (demo03GradeErpMapper.selectByStudentId(demo03Grade.getStudentId()) != null) {
184 throw exception(DEMO03_GRADE_EXISTS); 183 throw exception(DEMO03_GRADE_EXISTS);
185 } 184 }
186 - demo03GradeMapper.insert(demo03Grade); 185 + // 插入
  186 + demo03GradeErpMapper.insert(demo03Grade);
187 return demo03Grade.getId(); 187 return demo03Grade.getId();
188 } 188 }
189 189
@@ -192,7 +192,8 @@ public class Demo03StudentServiceImpl implements Demo03StudentService { @@ -192,7 +192,8 @@ public class Demo03StudentServiceImpl implements Demo03StudentService {
192 // 校验存在 192 // 校验存在
193 validateDemo03GradeExists(demo03Grade.getId()); 193 validateDemo03GradeExists(demo03Grade.getId());
194 // 更新 194 // 更新
195 - demo03GradeMapper.updateById(demo03Grade); 195 + demo03Grade.setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  196 + demo03GradeErpMapper.updateById(demo03Grade);
196 } 197 }
197 198
198 @Override 199 @Override
@@ -200,18 +201,41 @@ public class Demo03StudentServiceImpl implements Demo03StudentService { @@ -200,18 +201,41 @@ public class Demo03StudentServiceImpl implements Demo03StudentService {
200 // 校验存在 201 // 校验存在
201 validateDemo03GradeExists(id); 202 validateDemo03GradeExists(id);
202 // 删除 203 // 删除
203 - demo03GradeMapper.deleteById(id); 204 + demo03GradeErpMapper.deleteById(id);
  205 + }
  206 +
  207 + @Override
  208 + public void deleteDemo03GradeByIds(List<Long> ids) {
  209 + // 校验存在
  210 + validateDemo03GradeExists(ids);
  211 + // 删除
  212 + demo03GradeErpMapper.deleteByIds(ids);
204 } 213 }
205 214
206 @Override 215 @Override
207 public Demo03GradeDO getDemo03Grade(Long id) { 216 public Demo03GradeDO getDemo03Grade(Long id) {
208 - return demo03GradeMapper.selectById(id); 217 + return demo03GradeErpMapper.selectById(id);
209 } 218 }
210 219
211 private void validateDemo03GradeExists(Long id) { 220 private void validateDemo03GradeExists(Long id) {
212 - if (demo03GradeMapper.selectById(id) == null) { 221 + if (demo03GradeErpMapper.selectById(id) == null) {
213 throw exception(DEMO03_GRADE_NOT_EXISTS); 222 throw exception(DEMO03_GRADE_NOT_EXISTS);
214 } 223 }
215 } 224 }
216 225
  226 + private void validateDemo03GradeExists(List<Long> ids) {
  227 + List<Demo03GradeDO> list = demo03GradeErpMapper.selectByIds(ids);
  228 + if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
  229 + throw exception(DEMO03_GRADE_NOT_EXISTS);
  230 + }
  231 + }
  232 +
  233 + private void deleteDemo03GradeByStudentId(Long studentId) {
  234 + demo03GradeErpMapper.deleteByStudentId(studentId);
  235 + }
  236 +
  237 + private void deleteDemo03GradeByStudentIds(List<Long> studentIds) {
  238 + demo03GradeErpMapper.deleteByStudentIds(studentIds);
  239 + }
  240 +
217 } 241 }
218 \ No newline at end of file 242 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo03/inner/Demo03StudentInnerService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.service.demo.demo03.inner;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo.Demo03StudentInnerPageReqVO;
  5 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo.Demo03StudentInnerSaveReqVO;
  6 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
  7 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
  8 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
  9 +import jakarta.validation.Valid;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 学生 Service 接口
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +public interface Demo03StudentInnerService {
  19 +
  20 + /**
  21 + * 创建学生
  22 + *
  23 + * @param createReqVO 创建信息
  24 + * @return 编号
  25 + */
  26 + Long createDemo03Student(@Valid Demo03StudentInnerSaveReqVO createReqVO);
  27 +
  28 + /**
  29 + * 更新学生
  30 + *
  31 + * @param updateReqVO 更新信息
  32 + */
  33 + void updateDemo03Student(@Valid Demo03StudentInnerSaveReqVO updateReqVO);
  34 +
  35 + /**
  36 + * 删除学生
  37 + *
  38 + * @param id 编号
  39 + */
  40 + void deleteDemo03Student(Long id);
  41 +
  42 + /**
  43 + * 批量删除学生
  44 + *
  45 + * @param ids 编号
  46 + */
  47 + void deleteDemo03StudentByIds(List<Long> ids);
  48 +
  49 + /**
  50 + * 获得学生
  51 + *
  52 + * @param id 编号
  53 + * @return 学生
  54 + */
  55 + Demo03StudentDO getDemo03Student(Long id);
  56 +
  57 + /**
  58 + * 获得学生分页
  59 + *
  60 + * @param pageReqVO 分页查询
  61 + * @return 学生分页
  62 + */
  63 + PageResult<Demo03StudentDO> getDemo03StudentPage(Demo03StudentInnerPageReqVO pageReqVO);
  64 +
  65 + // ==================== 子表(学生课程) ====================
  66 +
  67 + /**
  68 + * 获得学生课程列表
  69 + *
  70 + * @param studentId 学生编号
  71 + * @return 学生课程列表
  72 + */
  73 + List<Demo03CourseDO> getDemo03CourseListByStudentId(Long studentId);
  74 +
  75 + // ==================== 子表(学生班级) ====================
  76 +
  77 + /**
  78 + * 获得学生班级
  79 + *
  80 + * @param studentId 学生编号
  81 + * @return 学生班级
  82 + */
  83 + Demo03GradeDO getDemo03GradeByStudentId(Long studentId);
  84 +
  85 +}
0 \ No newline at end of file 86 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo03/inner/Demo03StudentInnerServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.service.demo.demo03.inner;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  7 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo.Demo03StudentInnerPageReqVO;
  8 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo.Demo03StudentInnerSaveReqVO;
  9 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
  10 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
  11 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
  12 +import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.inner.Demo03CourseInnerMapper;
  13 +import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.inner.Demo03GradeInnerMapper;
  14 +import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.inner.Demo03StudentInnerMapper;
  15 +import jakarta.annotation.Resource;
  16 +import org.springframework.stereotype.Service;
  17 +import org.springframework.transaction.annotation.Transactional;
  18 +import org.springframework.validation.annotation.Validated;
  19 +
  20 +import java.util.List;
  21 +
  22 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  23 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  24 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
  25 +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.DEMO03_STUDENT_NOT_EXISTS;
  26 +
  27 +/**
  28 + * 学生 Service 实现类
  29 + *
  30 + * @author 芋道源码
  31 + */
  32 +@Service
  33 +@Validated
  34 +public class Demo03StudentInnerServiceImpl implements Demo03StudentInnerService {
  35 +
  36 + @Resource
  37 + private Demo03StudentInnerMapper demo03StudentInnerMapper;
  38 + @Resource
  39 + private Demo03CourseInnerMapper demo03CourseInnerMapper;
  40 + @Resource
  41 + private Demo03GradeInnerMapper demo03GradeInnerMapper;
  42 +
  43 + @Override
  44 + @Transactional(rollbackFor = Exception.class)
  45 + public Long createDemo03Student(Demo03StudentInnerSaveReqVO createReqVO) {
  46 + // 插入
  47 + Demo03StudentDO demo03Student = BeanUtils.toBean(createReqVO, Demo03StudentDO.class);
  48 + demo03StudentInnerMapper.insert(demo03Student);
  49 +
  50 + // 插入子表
  51 + createDemo03CourseList(demo03Student.getId(), createReqVO.getDemo03Courses());
  52 + createDemo03Grade(demo03Student.getId(), createReqVO.getDemo03Grade());
  53 + // 返回
  54 + return demo03Student.getId();
  55 + }
  56 +
  57 + @Override
  58 + @Transactional(rollbackFor = Exception.class)
  59 + public void updateDemo03Student(Demo03StudentInnerSaveReqVO updateReqVO) {
  60 + // 校验存在
  61 + validateDemo03StudentExists(updateReqVO.getId());
  62 + // 更新
  63 + Demo03StudentDO updateObj = BeanUtils.toBean(updateReqVO, Demo03StudentDO.class);
  64 + demo03StudentInnerMapper.updateById(updateObj);
  65 +
  66 + // 更新子表
  67 + updateDemo03CourseList(updateReqVO.getId(), updateReqVO.getDemo03Courses());
  68 + updateDemo03Grade(updateReqVO.getId(), updateReqVO.getDemo03Grade());
  69 + }
  70 +
  71 + @Override
  72 + @Transactional(rollbackFor = Exception.class)
  73 + public void deleteDemo03Student(Long id) {
  74 + // 校验存在
  75 + validateDemo03StudentExists(id);
  76 + // 删除
  77 + demo03StudentInnerMapper.deleteById(id);
  78 +
  79 + // 删除子表
  80 + deleteDemo03CourseByStudentId(id);
  81 + deleteDemo03GradeByStudentId(id);
  82 + }
  83 +
  84 + @Override
  85 + @Transactional(rollbackFor = Exception.class)
  86 + public void deleteDemo03StudentByIds(List<Long> ids) {
  87 + // 校验存在
  88 + validateDemo03StudentExists(ids);
  89 + // 删除
  90 + demo03StudentInnerMapper.deleteByIds(ids);
  91 +
  92 + // 删除子表
  93 + deleteDemo03CourseByStudentIds(ids);
  94 + deleteDemo03GradeByStudentIds(ids);
  95 + }
  96 +
  97 + private void validateDemo03StudentExists(List<Long> ids) {
  98 + List<Demo03StudentDO> list = demo03StudentInnerMapper.selectByIds(ids);
  99 + if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
  100 + throw exception(DEMO03_STUDENT_NOT_EXISTS);
  101 + }
  102 + }
  103 +
  104 + private void validateDemo03StudentExists(Long id) {
  105 + if (demo03StudentInnerMapper.selectById(id) == null) {
  106 + throw exception(DEMO03_STUDENT_NOT_EXISTS);
  107 + }
  108 + }
  109 +
  110 + @Override
  111 + public Demo03StudentDO getDemo03Student(Long id) {
  112 + return demo03StudentInnerMapper.selectById(id);
  113 + }
  114 +
  115 + @Override
  116 + public PageResult<Demo03StudentDO> getDemo03StudentPage(Demo03StudentInnerPageReqVO pageReqVO) {
  117 + return demo03StudentInnerMapper.selectPage(pageReqVO);
  118 + }
  119 +
  120 + // ==================== 子表(学生课程) ====================
  121 +
  122 + @Override
  123 + public List<Demo03CourseDO> getDemo03CourseListByStudentId(Long studentId) {
  124 + return demo03CourseInnerMapper.selectListByStudentId(studentId);
  125 + }
  126 +
  127 + private void createDemo03CourseList(Long studentId, List<Demo03CourseDO> list) {
  128 + list.forEach(o -> o.setStudentId(studentId));
  129 + demo03CourseInnerMapper.insertBatch(list);
  130 + }
  131 +
  132 + private void updateDemo03CourseList(Long studentId, List<Demo03CourseDO> list) {
  133 + list.forEach(o -> o.setStudentId(studentId));
  134 + List<Demo03CourseDO> oldList = demo03CourseInnerMapper.selectListByStudentId(studentId);
  135 + List<List<Demo03CourseDO>> diffList = diffList(oldList, list, (oldVal, newVal) -> {
  136 + boolean same = ObjectUtil.equal(oldVal.getId(), newVal.getId());
  137 + if (same) {
  138 + newVal.setId(oldVal.getId()).setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  139 + }
  140 + return same;
  141 + });
  142 +
  143 + // 第二步,批量添加、修改、删除
  144 + if (CollUtil.isNotEmpty(diffList.get(0))) {
  145 + demo03CourseInnerMapper.insertBatch(diffList.get(0));
  146 + }
  147 + if (CollUtil.isNotEmpty(diffList.get(1))) {
  148 + demo03CourseInnerMapper.updateBatch(diffList.get(1));
  149 + }
  150 + if (CollUtil.isNotEmpty(diffList.get(2))) {
  151 + demo03CourseInnerMapper.deleteByIds(convertList(diffList.get(2), Demo03CourseDO::getId));
  152 + }
  153 + }
  154 +
  155 + private void deleteDemo03CourseByStudentId(Long studentId) {
  156 + demo03CourseInnerMapper.deleteByStudentId(studentId);
  157 + }
  158 +
  159 + private void deleteDemo03CourseByStudentIds(List<Long> studentIds) {
  160 + demo03CourseInnerMapper.deleteByStudentIds(studentIds);
  161 + }
  162 +
  163 + // ==================== 子表(学生班级) ====================
  164 +
  165 + @Override
  166 + public Demo03GradeDO getDemo03GradeByStudentId(Long studentId) {
  167 + return demo03GradeInnerMapper.selectByStudentId(studentId);
  168 + }
  169 +
  170 + private void createDemo03Grade(Long studentId, Demo03GradeDO demo03Grade) {
  171 + if (demo03Grade == null) {
  172 + return;
  173 + }
  174 + demo03Grade.setStudentId(studentId);
  175 + demo03GradeInnerMapper.insert(demo03Grade);
  176 + }
  177 +
  178 + private void updateDemo03Grade(Long studentId, Demo03GradeDO demo03Grade) {
  179 + if (demo03Grade == null) {
  180 + return;
  181 + }
  182 + demo03Grade.setStudentId(studentId);
  183 + demo03Grade.setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  184 + demo03GradeInnerMapper.insertOrUpdate(demo03Grade);
  185 + }
  186 +
  187 + private void deleteDemo03GradeByStudentId(Long studentId) {
  188 + demo03GradeInnerMapper.deleteByStudentId(studentId);
  189 + }
  190 +
  191 + private void deleteDemo03GradeByStudentIds(List<Long> studentIds) {
  192 + demo03GradeInnerMapper.deleteByStudentIds(studentIds);
  193 + }
  194 +
  195 +}
0 \ No newline at end of file 196 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo03/normal/Demo03StudentNormalService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.service.demo.demo03.normal;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo.Demo03StudentNormalPageReqVO;
  5 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo.Demo03StudentNormalSaveReqVO;
  6 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
  7 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
  8 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
  9 +import jakarta.validation.Valid;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 学生 Service 接口
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +public interface Demo03StudentNormalService {
  19 +
  20 + /**
  21 + * 创建学生
  22 + *
  23 + * @param createReqVO 创建信息
  24 + * @return 编号
  25 + */
  26 + Long createDemo03Student(@Valid Demo03StudentNormalSaveReqVO createReqVO);
  27 +
  28 + /**
  29 + * 更新学生
  30 + *
  31 + * @param updateReqVO 更新信息
  32 + */
  33 + void updateDemo03Student(@Valid Demo03StudentNormalSaveReqVO updateReqVO);
  34 +
  35 + /**
  36 + * 删除学生
  37 + *
  38 + * @param id 编号
  39 + */
  40 + void deleteDemo03Student(Long id);
  41 +
  42 + /**
  43 + * 批量删除学生
  44 + *
  45 + * @param ids 编号
  46 + */
  47 + void deleteDemo03StudentByIds(List<Long> ids);
  48 +
  49 + /**
  50 + * 获得学生
  51 + *
  52 + * @param id 编号
  53 + * @return 学生
  54 + */
  55 + Demo03StudentDO getDemo03Student(Long id);
  56 +
  57 + /**
  58 + * 获得学生分页
  59 + *
  60 + * @param pageReqVO 分页查询
  61 + * @return 学生分页
  62 + */
  63 + PageResult<Demo03StudentDO> getDemo03StudentPage(Demo03StudentNormalPageReqVO pageReqVO);
  64 +
  65 + // ==================== 子表(学生课程) ====================
  66 +
  67 + /**
  68 + * 获得学生课程列表
  69 + *
  70 + * @param studentId 学生编号
  71 + * @return 学生课程列表
  72 + */
  73 + List<Demo03CourseDO> getDemo03CourseListByStudentId(Long studentId);
  74 +
  75 + // ==================== 子表(学生班级) ====================
  76 +
  77 + /**
  78 + * 获得学生班级
  79 + *
  80 + * @param studentId 学生编号
  81 + * @return 学生班级
  82 + */
  83 + Demo03GradeDO getDemo03GradeByStudentId(Long studentId);
  84 +
  85 +}
0 \ No newline at end of file 86 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo03/normal/Demo03StudentNormalServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.service.demo.demo03.normal;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  7 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo.Demo03StudentNormalPageReqVO;
  8 +import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo.Demo03StudentNormalSaveReqVO;
  9 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO;
  10 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO;
  11 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO;
  12 +import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.normal.Demo03CourseNormalMapper;
  13 +import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.normal.Demo03GradeNormalMapper;
  14 +import cn.iocoder.yudao.module.infra.dal.mysql.demo.demo03.normal.Demo03StudentNormalMapper;
  15 +import jakarta.annotation.Resource;
  16 +import org.springframework.stereotype.Service;
  17 +import org.springframework.transaction.annotation.Transactional;
  18 +import org.springframework.validation.annotation.Validated;
  19 +
  20 +import java.util.List;
  21 +
  22 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  23 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  24 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
  25 +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.DEMO03_STUDENT_NOT_EXISTS;
  26 +
  27 +/**
  28 + * 学生 Service 实现类
  29 + *
  30 + * @author 芋道源码
  31 + */
  32 +@Service
  33 +@Validated
  34 +public class Demo03StudentNormalServiceImpl implements Demo03StudentNormalService {
  35 +
  36 + @Resource
  37 + private Demo03StudentNormalMapper demo03StudentNormalMapper;
  38 + @Resource
  39 + private Demo03CourseNormalMapper demo03CourseNormalMapper;
  40 + @Resource
  41 + private Demo03GradeNormalMapper demo03GradeNormalMapper;
  42 +
  43 + @Override
  44 + @Transactional(rollbackFor = Exception.class)
  45 + public Long createDemo03Student(Demo03StudentNormalSaveReqVO createReqVO) {
  46 + // 插入
  47 + Demo03StudentDO demo03Student = BeanUtils.toBean(createReqVO, Demo03StudentDO.class);
  48 + demo03StudentNormalMapper.insert(demo03Student);
  49 +
  50 + // 插入子表
  51 + createDemo03CourseList(demo03Student.getId(), createReqVO.getDemo03Courses());
  52 + createDemo03Grade(demo03Student.getId(), createReqVO.getDemo03Grade());
  53 + // 返回
  54 + return demo03Student.getId();
  55 + }
  56 +
  57 + @Override
  58 + @Transactional(rollbackFor = Exception.class)
  59 + public void updateDemo03Student(Demo03StudentNormalSaveReqVO updateReqVO) {
  60 + // 校验存在
  61 + validateDemo03StudentExists(updateReqVO.getId());
  62 + // 更新
  63 + Demo03StudentDO updateObj = BeanUtils.toBean(updateReqVO, Demo03StudentDO.class);
  64 + demo03StudentNormalMapper.updateById(updateObj);
  65 +
  66 + // 更新子表
  67 + updateDemo03CourseList(updateReqVO.getId(), updateReqVO.getDemo03Courses());
  68 + updateDemo03Grade(updateReqVO.getId(), updateReqVO.getDemo03Grade());
  69 + }
  70 +
  71 + @Override
  72 + @Transactional(rollbackFor = Exception.class)
  73 + public void deleteDemo03Student(Long id) {
  74 + // 校验存在
  75 + validateDemo03StudentExists(id);
  76 + // 删除
  77 + demo03StudentNormalMapper.deleteById(id);
  78 +
  79 + // 删除子表
  80 + deleteDemo03CourseByStudentId(id);
  81 + deleteDemo03GradeByStudentId(id);
  82 + }
  83 +
  84 + @Override
  85 + @Transactional(rollbackFor = Exception.class)
  86 + public void deleteDemo03StudentByIds(List<Long> ids) {
  87 + // 校验存在
  88 + validateDemo03StudentExists(ids);
  89 + // 删除
  90 + demo03StudentNormalMapper.deleteByIds(ids);
  91 +
  92 + // 删除子表
  93 + deleteDemo03CourseByStudentIds(ids);
  94 + deleteDemo03GradeByStudentIds(ids);
  95 + }
  96 +
  97 + private void validateDemo03StudentExists(List<Long> ids) {
  98 + List<Demo03StudentDO> list = demo03StudentNormalMapper.selectByIds(ids);
  99 + if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
  100 + throw exception(DEMO03_STUDENT_NOT_EXISTS);
  101 + }
  102 + }
  103 +
  104 + private void validateDemo03StudentExists(Long id) {
  105 + if (demo03StudentNormalMapper.selectById(id) == null) {
  106 + throw exception(DEMO03_STUDENT_NOT_EXISTS);
  107 + }
  108 + }
  109 +
  110 + @Override
  111 + public Demo03StudentDO getDemo03Student(Long id) {
  112 + return demo03StudentNormalMapper.selectById(id);
  113 + }
  114 +
  115 + @Override
  116 + public PageResult<Demo03StudentDO> getDemo03StudentPage(Demo03StudentNormalPageReqVO pageReqVO) {
  117 + return demo03StudentNormalMapper.selectPage(pageReqVO);
  118 + }
  119 +
  120 + // ==================== 子表(学生课程) ====================
  121 +
  122 + @Override
  123 + public List<Demo03CourseDO> getDemo03CourseListByStudentId(Long studentId) {
  124 + return demo03CourseNormalMapper.selectListByStudentId(studentId);
  125 + }
  126 +
  127 + private void createDemo03CourseList(Long studentId, List<Demo03CourseDO> list) {
  128 + list.forEach(o -> o.setStudentId(studentId));
  129 + demo03CourseNormalMapper.insertBatch(list);
  130 + }
  131 +
  132 + private void updateDemo03CourseList(Long studentId, List<Demo03CourseDO> list) {
  133 + list.forEach(o -> o.setStudentId(studentId));
  134 + List<Demo03CourseDO> oldList = demo03CourseNormalMapper.selectListByStudentId(studentId);
  135 + List<List<Demo03CourseDO>> diffList = diffList(oldList, list, (oldVal, newVal) -> {
  136 + boolean same = ObjectUtil.equal(oldVal.getId(), newVal.getId());
  137 + if (same) {
  138 + newVal.setId(oldVal.getId()).setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  139 + }
  140 + return same;
  141 + });
  142 +
  143 + // 第二步,批量添加、修改、删除
  144 + if (CollUtil.isNotEmpty(diffList.get(0))) {
  145 + demo03CourseNormalMapper.insertBatch(diffList.get(0));
  146 + }
  147 + if (CollUtil.isNotEmpty(diffList.get(1))) {
  148 + demo03CourseNormalMapper.updateBatch(diffList.get(1));
  149 + }
  150 + if (CollUtil.isNotEmpty(diffList.get(2))) {
  151 + demo03CourseNormalMapper.deleteByIds(convertList(diffList.get(2), Demo03CourseDO::getId));
  152 + }
  153 + }
  154 +
  155 + private void deleteDemo03CourseByStudentId(Long studentId) {
  156 + demo03CourseNormalMapper.deleteByStudentId(studentId);
  157 + }
  158 +
  159 + private void deleteDemo03CourseByStudentIds(List<Long> studentIds) {
  160 + demo03CourseNormalMapper.deleteByStudentIds(studentIds);
  161 + }
  162 +
  163 + // ==================== 子表(学生班级) ====================
  164 +
  165 + @Override
  166 + public Demo03GradeDO getDemo03GradeByStudentId(Long studentId) {
  167 + return demo03GradeNormalMapper.selectByStudentId(studentId);
  168 + }
  169 +
  170 + private void createDemo03Grade(Long studentId, Demo03GradeDO demo03Grade) {
  171 + if (demo03Grade == null) {
  172 + return;
  173 + }
  174 + demo03Grade.setStudentId(studentId);
  175 + demo03GradeNormalMapper.insert(demo03Grade);
  176 + }
  177 +
  178 + private void updateDemo03Grade(Long studentId, Demo03GradeDO demo03Grade) {
  179 + if (demo03Grade == null) {
  180 + return;
  181 + }
  182 + demo03Grade.setStudentId(studentId);
  183 + demo03Grade.setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  184 + demo03GradeNormalMapper.insertOrUpdate(demo03Grade);
  185 + }
  186 +
  187 + private void deleteDemo03GradeByStudentId(Long studentId) {
  188 + demo03GradeNormalMapper.deleteByStudentId(studentId);
  189 + }
  190 +
  191 + private void deleteDemo03GradeByStudentIds(List<Long> studentIds) {
  192 + demo03GradeNormalMapper.deleteByStudentIds(studentIds);
  193 + }
  194 +
  195 +}
0 \ No newline at end of file 196 \ No newline at end of file
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo03/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.service.demo.demo03;
0 \ No newline at end of file 2 \ No newline at end of file
yudao-module-infra/src/main/resources/codegen/java/controller/controller.vm
@@ -74,6 +74,19 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { @@ -74,6 +74,19 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
74 return success(true); 74 return success(true);
75 } 75 }
76 76
  77 +#if ( $table.templateType != 2 && $deleteBatchEnable)
  78 + @DeleteMapping("/delete-batch")
  79 + @Parameter(name = "ids", description = "编号", required = true)
  80 + @Operation(summary = "批量删除${table.classComment}")
  81 + #if ($sceneEnum.scene == 1)
  82 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")
  83 + #end
  84 + public CommonResult<Boolean> delete${simpleClassName}(@RequestParam("ids") List<${primaryColumn.javaType}> ids) {
  85 + ${classNameVar}Service.delete${simpleClassName}ByIds(ids);
  86 + return success(true);
  87 + }
  88 +#end
  89 +
77 @GetMapping("/get") 90 @GetMapping("/get")
78 @Operation(summary = "获得${table.classComment}") 91 @Operation(summary = "获得${table.classComment}")
79 @Parameter(name = "id", description = "编号", required = true, example = "1024") 92 @Parameter(name = "id", description = "编号", required = true, example = "1024")
@@ -230,6 +243,19 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { @@ -230,6 +243,19 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
230 return success(true); 243 return success(true);
231 } 244 }
232 245
  246 +#if ($deleteBatchEnable)
  247 + @DeleteMapping("/${subSimpleClassName_strikeCase}/delete-batch")
  248 + @Parameter(name = "ids", description = "编号", required = true)
  249 + @Operation(summary = "批量删除${subTable.classComment}")
  250 +#if ($sceneEnum.scene == 1)
  251 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")
  252 +#end
  253 + public CommonResult<Boolean> delete${subSimpleClassName}(@RequestParam("ids") List<${subPrimaryColumn.javaType}> ids) {
  254 + ${classNameVar}Service.delete${subSimpleClassName}ByIds(ids);
  255 + return success(true);
  256 + }
  257 +#end
  258 +
233 @GetMapping("/${subSimpleClassName_strikeCase}/get") 259 @GetMapping("/${subSimpleClassName_strikeCase}/get")
234 @Operation(summary = "获得${subTable.classComment}") 260 @Operation(summary = "获得${subTable.classComment}")
235 @Parameter(name = "id", description = "编号", required = true) 261 @Parameter(name = "id", description = "编号", required = true)
yudao-module-infra/src/main/resources/codegen/java/dal/do.vm
@@ -78,4 +78,19 @@ public class ${table.className}DO extends BaseDO { @@ -78,4 +78,19 @@ public class ${table.className}DO extends BaseDO {
78 #end 78 #end
79 #end 79 #end
80 80
  81 +## 特殊:主子表专属逻辑(非 ERP 模式)
  82 +#if ( $voType == 20 && $subTables && $subTables.size() > 0 && $table.templateType != 11 )
  83 + #foreach ($subTable in $subTables)
  84 + #set ($index = $foreach.count - 1)
  85 + #if ( $subTable.subJoinMany)
  86 + @Schema(description = "${subTable.classComment}列表")
  87 + private List<${subTable.className}DO> ${subClassNameVars.get($index)}s;
  88 +
  89 + #else
  90 + @Schema(description = "${subTable.classComment}")
  91 + private ${subTable.className}DO ${subClassNameVars.get($index)};
  92 + #end
  93 + #end
  94 +#end
  95 +
81 } 96 }
82 \ No newline at end of file 97 \ No newline at end of file
yudao-module-infra/src/main/resources/codegen/java/dal/mapper_sub.vm
@@ -54,4 +54,10 @@ public interface ${subTable.className}Mapper extends BaseMapperX&lt;${subTable.clas @@ -54,4 +54,10 @@ public interface ${subTable.className}Mapper extends BaseMapperX&lt;${subTable.clas
54 return delete(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); 54 return delete(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField});
55 } 55 }
56 56
  57 +#if ( $table.templateType != 2 && $deleteBatchEnable)
  58 + default int deleteBy${SubJoinColumnName}s(List<${subJoinColumn.javaType}> ${subJoinColumn.javaField}s) {
  59 + return delete(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}s);
  60 + }
  61 +#end
  62 +
57 } 63 }
yudao-module-infra/src/main/resources/codegen/java/service/service.vm
@@ -40,6 +40,15 @@ public interface ${table.className}Service { @@ -40,6 +40,15 @@ public interface ${table.className}Service {
40 */ 40 */
41 void delete${simpleClassName}(${primaryColumn.javaType} id); 41 void delete${simpleClassName}(${primaryColumn.javaType} id);
42 42
  43 +#if ( $table.templateType != 2 && $deleteBatchEnable)
  44 + /**
  45 + * 批量删除${table.classComment}
  46 + *
  47 + * @param ids 编号
  48 + */
  49 + void delete${simpleClassName}ByIds(List<${primaryColumn.javaType}> ids);
  50 +#end
  51 +
43 /** 52 /**
44 * 获得${table.classComment} 53 * 获得${table.classComment}
45 * 54 *
@@ -134,6 +143,15 @@ public interface ${table.className}Service { @@ -134,6 +143,15 @@ public interface ${table.className}Service {
134 */ 143 */
135 void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id); 144 void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id);
136 145
  146 +#if ($deleteBatchEnable)
  147 + /**
  148 + * 批量删除${subTable.classComment}
  149 + *
  150 + * @param ids 编号
  151 + */
  152 + void delete${subSimpleClassName}ByIds(List<${subPrimaryColumn.javaType}> ids);
  153 +#end
  154 +
137 /** 155 /**
138 * 获得${subTable.classComment} 156 * 获得${subTable.classComment}
139 * 157 *
yudao-module-infra/src/main/resources/codegen/java/service/serviceImpl.vm
1 package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; 1 package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import org.springframework.stereotype.Service; 4 import org.springframework.stereotype.Service;
4 import ${jakartaPackage}.annotation.Resource; 5 import ${jakartaPackage}.annotation.Resource;
5 import org.springframework.validation.annotation.Validated; 6 import org.springframework.validation.annotation.Validated;
@@ -24,6 +25,8 @@ import ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.busines @@ -24,6 +25,8 @@ import ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.busines
24 #end 25 #end
25 26
26 import static ${ServiceExceptionUtilClassName}.exception; 27 import static ${ServiceExceptionUtilClassName}.exception;
  28 +import static ${CollectionUtilsClassName}.convertList;
  29 +import static ${CollectionUtilsClassName}.diffList;
27 import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; 30 import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*;
28 31
29 /** 32 /**
@@ -55,9 +58,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service @@ -55,9 +58,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
55 #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 58 #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
56 #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 59 #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写
57 // 校验${treeParentColumn.columnComment}的有效性 60 // 校验${treeParentColumn.columnComment}的有效性
58 - validateParent${simpleClassName}(null, ${createReqVOVar}.get${TreeParentJavaField}()); 61 + validateParent${simpleClassName}(null, ${saveReqVOVar}.get${TreeParentJavaField}());
59 // 校验${treeNameColumn.columnComment}的唯一性 62 // 校验${treeNameColumn.columnComment}的唯一性
60 - validate${simpleClassName}${TreeNameJavaField}Unique(null, ${createReqVOVar}.get${TreeParentJavaField}(), ${createReqVOVar}.get${TreeNameJavaField}()); 63 + validate${simpleClassName}${TreeNameJavaField}Unique(null, ${saveReqVOVar}.get${TreeParentJavaField}(), ${saveReqVOVar}.get${TreeNameJavaField}());
61 64
62 #end 65 #end
63 // 插入 66 // 插入
@@ -75,9 +78,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service @@ -75,9 +78,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
75 #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 78 #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
76 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 79 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
77 #if ( $subTable.subJoinMany) 80 #if ( $subTable.subJoinMany)
78 - create${subSimpleClassName}List(${classNameVar}.getId(), ${createReqVOVar}.get${subSimpleClassNames.get($index)}s()); 81 + create${subSimpleClassName}List(${classNameVar}.getId(), ${saveReqVOVar}.get${subSimpleClassNames.get($index)}s());
79 #else 82 #else
80 - create${subSimpleClassName}(${classNameVar}.getId(), ${createReqVOVar}.get${subSimpleClassNames.get($index)}()); 83 + create${subSimpleClassName}(${classNameVar}.getId(), ${saveReqVOVar}.get${subSimpleClassNames.get($index)}());
81 #end 84 #end
82 #end 85 #end
83 #end 86 #end
@@ -160,6 +163,39 @@ public class ${table.className}ServiceImpl implements ${table.className}Service @@ -160,6 +163,39 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
160 #end 163 #end
161 } 164 }
162 165
  166 +#if ( $table.templateType != 2 && $deleteBatchEnable)
  167 + @Override
  168 + ## 特殊:主子表专属逻辑
  169 + #if ( $subTables && $subTables.size() > 0)
  170 + @Transactional(rollbackFor = Exception.class)
  171 + #end
  172 + public void delete${simpleClassName}ByIds(List<${primaryColumn.javaType}> ids) {
  173 + // 校验存在
  174 + validate${simpleClassName}Exists(ids);
  175 + // 删除
  176 + ${classNameVar}Mapper.deleteByIds(ids);
  177 + ## 特殊:主子表专属逻辑
  178 + #if ( $subTables && $subTables.size() > 0)
  179 +
  180 + // 删除子表
  181 + #foreach ($subTable in $subTables)
  182 + #set ($index = $foreach.count - 1)
  183 + #set ($subSimpleClassName = $subSimpleClassNames.get($index))
  184 + #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
  185 + #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
  186 + delete${subSimpleClassName}By${SubJoinColumnName}s(ids);
  187 + #end
  188 + #end
  189 + }
  190 +
  191 + private void validate${simpleClassName}Exists(List<${primaryColumn.javaType}> ids) {
  192 + List<${table.className}DO> list = ${classNameVar}Mapper.selectByIds(ids);
  193 + if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
  194 + throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS);
  195 + }
  196 + }
  197 +#end
  198 +
163 private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) { 199 private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) {
164 if (${classNameVar}Mapper.selectById(id) == null) { 200 if (${classNameVar}Mapper.selectById(id) == null) {
165 throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); 201 throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS);
@@ -304,6 +340,16 @@ public class ${table.className}ServiceImpl implements ${table.className}Service @@ -304,6 +340,16 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
304 ${subClassNameVars.get($index)}Mapper.deleteById(id); 340 ${subClassNameVars.get($index)}Mapper.deleteById(id);
305 } 341 }
306 342
  343 +#if ($deleteBatchEnable)
  344 + @Override
  345 + public void delete${subSimpleClassName}ByIds(List<${subPrimaryColumn.javaType}> ids) {
  346 + // 校验存在
  347 + validate${subSimpleClassName}Exists(ids);
  348 + // 删除
  349 + ${subClassNameVars.get($index)}Mapper.deleteByIds(ids);
  350 + }
  351 +#end
  352 +
307 @Override 353 @Override
308 public ${subTable.className}DO get${subSimpleClassName}(${subPrimaryColumn.javaType} id) { 354 public ${subTable.className}DO get${subSimpleClassName}(${subPrimaryColumn.javaType} id) {
309 return ${subClassNameVars.get($index)}Mapper.selectById(id); 355 return ${subClassNameVars.get($index)}Mapper.selectById(id);
@@ -315,18 +361,44 @@ public class ${table.className}ServiceImpl implements ${table.className}Service @@ -315,18 +361,44 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
315 } 361 }
316 } 362 }
317 363
  364 +#if ($deleteBatchEnable)
  365 + private void validate${subSimpleClassName}Exists(List<${subPrimaryColumn.javaType}> ids) {
  366 + List<${subTable.className}DO> list = ${subClassNameVar}Mapper.selectByIds(ids);
  367 + if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
  368 + throw exception(${simpleClassNameUnderlineCase.toUpperCase()}_NOT_EXISTS);
  369 + }
  370 + }
  371 +#end
  372 +
318 ## 情况二:非 MASTER_ERP 时,支持批量的新增、修改操作 373 ## 情况二:非 MASTER_ERP 时,支持批量的新增、修改操作
319 #else 374 #else
320 #if ( $subTable.subJoinMany) 375 #if ( $subTable.subJoinMany)
321 private void create${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) { 376 private void create${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) {
322 - list.forEach(o -> o.set$SubJoinColumnName(${subJoinColumn.javaField})); 377 + list.forEach(o -> o.set${SubJoinColumnName}(${subJoinColumn.javaField}));
323 ${subClassNameVars.get($index)}Mapper.insertBatch(list); 378 ${subClassNameVars.get($index)}Mapper.insertBatch(list);
324 } 379 }
325 380
326 private void update${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) { 381 private void update${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) {
327 - delete${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField});  
328 - list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新  
329 - create${subSimpleClassName}List(${subJoinColumn.javaField}, list); 382 + list.forEach(o -> o.set${SubJoinColumnName}(${subJoinColumn.javaField}));
  383 + List<${subTable.className}DO> oldList = ${subClassNameVar}Mapper.selectListBy${SubJoinColumnName}(${subJoinColumn.javaField});
  384 + List<List<${subTable.className}DO>> diffList = diffList(oldList, list, (oldVal, newVal) -> {
  385 + boolean same = ObjectUtil.equal(oldVal.getId(), newVal.getId());
  386 + if (same) {
  387 + newVal.setId(oldVal.getId()).setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  388 + }
  389 + return same;
  390 + });
  391 +
  392 + // 第二步,批量添加、修改、删除
  393 + if (CollUtil.isNotEmpty(diffList.get(0))) {
  394 + ${subClassNameVar}Mapper.insertBatch(diffList.get(0));
  395 + }
  396 + if (CollUtil.isNotEmpty(diffList.get(1))) {
  397 + ${subClassNameVar}Mapper.updateBatch(diffList.get(1));
  398 + }
  399 + if (CollUtil.isNotEmpty(diffList.get(2))) {
  400 + ${subClassNameVar}Mapper.deleteByIds(convertList(diffList.get(2), ${subTable.className}DO::getId));
  401 + }
330 } 402 }
331 403
332 #else 404 #else
@@ -353,5 +425,11 @@ public class ${table.className}ServiceImpl implements ${table.className}Service @@ -353,5 +425,11 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
353 ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}(${subJoinColumn.javaField}); 425 ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}(${subJoinColumn.javaField});
354 } 426 }
355 427
  428 +#if ( $table.templateType != 2 && $deleteBatchEnable)
  429 + private void delete${subSimpleClassName}By${SubJoinColumnName}s(List<${primaryColumn.javaType}> ${subJoinColumn.javaField}s) {
  430 + ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}s(${subJoinColumn.javaField}s);
  431 + }
  432 +#end
  433 +
356 #end 434 #end
357 } 435 }
358 \ No newline at end of file 436 \ No newline at end of file
yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm
@@ -89,6 +89,13 @@ export function delete${simpleClassName}(id: number) { @@ -89,6 +89,13 @@ export function delete${simpleClassName}(id: number) {
89 return requestClient.delete(`${baseURL}/delete?id=${id}`); 89 return requestClient.delete(`${baseURL}/delete?id=${id}`);
90 } 90 }
91 91
  92 +#if ( $table.templateType != 2 && $deleteBatchEnable)
  93 +// 批量删除${table.classComment}
  94 +export function delete${simpleClassName}ByIds(ids: number[]) {
  95 + return requestClient.delete(`${baseURL}/delete-batch?ids=${ids.join(',')}`)
  96 +}
  97 +#end
  98 +
92 /** 导出${table.classComment} */ 99 /** 导出${table.classComment} */
93 export function export${simpleClassName}(params: any) { 100 export function export${simpleClassName}(params: any) {
94 return requestClient.download('${baseURL}/export-excel', params); 101 return requestClient.download('${baseURL}/export-excel', params);
@@ -144,6 +151,13 @@ export function delete${subSimpleClassName}(id: number) { @@ -144,6 +151,13 @@ export function delete${subSimpleClassName}(id: number) {
144 return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete?id=${id}`); 151 return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete?id=${id}`);
145 } 152 }
146 153
  154 +#if ($deleteBatchEnable)
  155 +// 批量删除${subTable.classComment}
  156 +export function delete${subSimpleClassName}ByIds(ids: number[]) {
  157 + return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete-batch?ids=${ids.join(',')}`)
  158 +}
  159 +#end
  160 +
147 /** 获得${subTable.classComment} */ 161 /** 获得${subTable.classComment} */
148 export function get${subSimpleClassName}(id: number) { 162 export function get${subSimpleClassName}(id: number) {
149 return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`); 163 return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`);
yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm
@@ -3,9 +3,11 @@ import type { OnActionClickFn, VxeTableGridOptions } from &#39;#/adapter/vxe-table&#39;; @@ -3,9 +3,11 @@ import type { OnActionClickFn, VxeTableGridOptions } from &#39;#/adapter/vxe-table&#39;;
3 import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${table.businessName}'; 3 import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${table.businessName}';
4 4
5 import { z } from '#/adapter/form'; 5 import { z } from '#/adapter/form';
6 -import { getRangePickerDefaultProps } from '#/utils/date';  
7 -import { DICT_TYPE, getDictOptions } from '#/utils/dict';  
8 - 6 +import {
  7 + DICT_TYPE,
  8 + getDictOptions,
  9 + getRangePickerDefaultProps,
  10 +} from '#/utils';
9 #if(${table.templateType} == 2)## 树表需要导入这些 11 #if(${table.templateType} == 2)## 树表需要导入这些
10 import { get${simpleClassName}List } from '#/api/${table.moduleName}/${table.businessName}'; 12 import { get${simpleClassName}List } from '#/api/${table.moduleName}/${table.businessName}';
11 import { handleTree } from '@vben/utils'; 13 import { handleTree } from '@vben/utils';
@@ -191,6 +193,9 @@ export function useGridColumns( @@ -191,6 +193,9 @@ export function useGridColumns(
191 onActionClick?: OnActionClickFn<${simpleClassName}Api.${simpleClassName}>, 193 onActionClick?: OnActionClickFn<${simpleClassName}Api.${simpleClassName}>,
192 ): VxeTableGridOptions<${simpleClassName}Api.${simpleClassName}>['columns'] { 194 ): VxeTableGridOptions<${simpleClassName}Api.${simpleClassName}>['columns'] {
193 return [ 195 return [
  196 +#if ($table.templateType != 2 && $deleteBatchEnable)
  197 + { type: 'checkbox', width: 40 },
  198 +#end
194 #if ($table.templateType == 12) ## 内嵌情况 199 #if ($table.templateType == 12) ## 内嵌情况
195 { type: 'expand', width: 80, slots: { content: 'expand_content' } }, 200 { type: 'expand', width: 80, slots: { content: 'expand_content' } },
196 #end 201 #end
@@ -426,6 +431,9 @@ export function use${subSimpleClassName}GridColumns( @@ -426,6 +431,9 @@ export function use${subSimpleClassName}GridColumns(
426 onActionClick?: OnActionClickFn<${simpleClassName}Api.${subSimpleClassName}>, 431 onActionClick?: OnActionClickFn<${simpleClassName}Api.${subSimpleClassName}>,
427 ): VxeTableGridOptions<${simpleClassName}Api.${subSimpleClassName}>['columns'] { 432 ): VxeTableGridOptions<${simpleClassName}Api.${subSimpleClassName}>['columns'] {
428 return [ 433 return [
  434 + #if ($table.templateType != 2 && $deleteBatchEnable)
  435 + { type: 'checkbox', width: 40 },
  436 + #end
429 #foreach($column in $subColumns) 437 #foreach($column in $subColumns)
430 #if ($column.listOperationResult) 438 #if ($column.listOperationResult)
431 #set ($dictType = $column.dictType) 439 #set ($dictType = $column.dictType)
yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm
@@ -4,7 +4,7 @@ import type { ${simpleClassName}Api } from &#39;#/api/${table.moduleName}/${table.bu @@ -4,7 +4,7 @@ import type { ${simpleClassName}Api } from &#39;#/api/${table.moduleName}/${table.bu
4 4
5 import { Page, useVbenModal } from '@vben/common-ui'; 5 import { Page, useVbenModal } from '@vben/common-ui';
6 import { Button, message,Tabs } from 'ant-design-vue'; 6 import { Button, message,Tabs } from 'ant-design-vue';
7 -import { Download, Plus } from '@vben/icons'; 7 +import { Download, Plus, Trash2 } from '@vben/icons';
8 import Form from './modules/form.vue'; 8 import Form from './modules/form.vue';
9 9
10 ## 特殊:主子表专属逻辑 10 ## 特殊:主子表专属逻辑
@@ -16,15 +16,15 @@ import Form from &#39;./modules/form.vue&#39;; @@ -16,15 +16,15 @@ import Form from &#39;./modules/form.vue&#39;;
16 #end 16 #end
17 #end 17 #end
18 18
19 -import { ref, h } from 'vue'; 19 +import { ref, h, computed } from 'vue';
20 import { $t } from '#/locales'; 20 import { $t } from '#/locales';
21 import { useVbenVxeGrid } from '#/adapter/vxe-table'; 21 import { useVbenVxeGrid } from '#/adapter/vxe-table';
22 #if (${table.templateType} == 2)## 树表接口 22 #if (${table.templateType} == 2)## 树表接口
23 import { get${simpleClassName}List, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${table.businessName}'; 23 import { get${simpleClassName}List, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${table.businessName}';
24 #else## 标准表接口 24 #else## 标准表接口
25 -import { get${simpleClassName}Page, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${table.businessName}'; 25 +import { get${simpleClassName}Page, delete${simpleClassName},#if ($deleteBatchEnable) delete${simpleClassName}ByIds,#end export${simpleClassName} } from '#/api/${table.moduleName}/${table.businessName}';
26 #end 26 #end
27 -import { downloadFileFromBlobPart } from '@vben/utils'; 27 +import { downloadFileFromBlobPart, isEmpty } from '@vben/utils';
28 28
29 import { useGridColumns, useGridFormSchema } from './data'; 29 import { useGridColumns, useGridFormSchema } from './data';
30 30
@@ -87,11 +87,38 @@ async function onDelete(row: ${simpleClassName}Api.${simpleClassName}) { @@ -87,11 +87,38 @@ async function onDelete(row: ${simpleClassName}Api.${simpleClassName}) {
87 await delete${simpleClassName}(row.id as number); 87 await delete${simpleClassName}(row.id as number);
88 message.success( $t('ui.actionMessage.deleteSuccess', [row.id]) ); 88 message.success( $t('ui.actionMessage.deleteSuccess', [row.id]) );
89 onRefresh(); 89 onRefresh();
90 - } catch { 90 + } finally {
91 hideLoading(); 91 hideLoading();
92 } 92 }
93 } 93 }
94 94
  95 +#if ($table.templateType != 2 && $deleteBatchEnable)
  96 +const deleteIds = ref<number[]>([]) // 待删除${table.classComment} ID
  97 +const showDeleteBatchBtn = computed(() => isEmpty(deleteIds.value));
  98 +function setDeleteIds({
  99 + records,
  100 +}: {
  101 + records: ${simpleClassName}Api.${simpleClassName}[];
  102 +}) {
  103 + deleteIds.value = records.map((item) => item.id);
  104 +}
  105 +/** 批量删除${table.classComment} */
  106 +async function onDeleteBatch() {
  107 + const hideLoading = message.loading({
  108 + content: $t('ui.actionMessage.deleting'),
  109 + duration: 0,
  110 + key: 'action_process_msg',
  111 + });
  112 + try {
  113 + await delete${simpleClassName}ByIds(deleteIds.value);
  114 + message.success( $t('ui.actionMessage.deleteSuccess') );
  115 + onRefresh();
  116 + } finally {
  117 + hideLoading();
  118 + }
  119 +}
  120 +#end
  121 +
95 /** 导出表格 */ 122 /** 导出表格 */
96 async function onExport() { 123 async function onExport() {
97 const data = await export${simpleClassName}(await gridApi.formApi.getValues()); 124 const data = await export${simpleClassName}(await gridApi.formApi.getValues());
@@ -177,11 +204,17 @@ const [Grid, gridApi] = useVbenVxeGrid({ @@ -177,11 +204,17 @@ const [Grid, gridApi] = useVbenVxeGrid({
177 search: true, 204 search: true,
178 }, 205 },
179 } as VxeTableGridOptions<${simpleClassName}Api.${simpleClassName}>, 206 } as VxeTableGridOptions<${simpleClassName}Api.${simpleClassName}>,
180 -#if (${table.templateType} == 11) 207 +#if (${table.templateType} == 11 || $deleteBatchEnable)
181 gridEvents:{ 208 gridEvents:{
  209 + #if(${table.templateType} == 11)
182 cellClick: ({ row }: { row: ${simpleClassName}Api.${simpleClassName}}) => { 210 cellClick: ({ row }: { row: ${simpleClassName}Api.${simpleClassName}}) => {
183 select${simpleClassName}.value = row; 211 select${simpleClassName}.value = row;
184 }, 212 },
  213 + #end
  214 + #if($deleteBatchEnable)
  215 + checkboxAll: setDeleteIds,
  216 + checkboxChange: setDeleteIds,
  217 + #end
185 } 218 }
186 #end 219 #end
187 }); 220 });
@@ -229,6 +262,19 @@ const [Grid, gridApi] = useVbenVxeGrid({ @@ -229,6 +262,19 @@ const [Grid, gridApi] = useVbenVxeGrid({
229 > 262 >
230 {{ $t('ui.actionTitle.export') }} 263 {{ $t('ui.actionTitle.export') }}
231 </Button> 264 </Button>
  265 +#if ($table.templateType != 2 && $deleteBatchEnable)
  266 + <Button
  267 + :icon="h(Trash2)"
  268 + type="primary"
  269 + danger
  270 + class="ml-2"
  271 + :disabled="showDeleteBatchBtn"
  272 + @click="onDeleteBatch"
  273 + v-access:code="['${table.moduleName}:${simpleClassName_strikeCase}:delete']"
  274 + >
  275 + 批量删除
  276 + </Button>
  277 +#end
232 </template> 278 </template>
233 </Grid> 279 </Grid>
234 280
yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm
@@ -14,15 +14,16 @@ @@ -14,15 +14,16 @@
14 #end 14 #end
15 import { useVbenModal } from '@vben/common-ui'; 15 import { useVbenModal } from '@vben/common-ui';
16 import { Button, message } from 'ant-design-vue'; 16 import { Button, message } from 'ant-design-vue';
17 - import { Plus } from '@vben/icons';  
18 - import { #if($table.templateType != 11)ref,#end h, nextTick,watch } from 'vue'; 17 + import { Plus, Trash2 } from '@vben/icons';
  18 + import { ref, computed, h, nextTick,watch } from 'vue';
19 import { $t } from '#/locales'; 19 import { $t } from '#/locales';
20 import { useVbenVxeGrid } from '#/adapter/vxe-table'; 20 import { useVbenVxeGrid } from '#/adapter/vxe-table';
21 21
22 22
23 #if ($table.templateType == 11) ## erp 23 #if ($table.templateType == 11) ## erp
24 - import { delete${subSimpleClassName}, get${subSimpleClassName}Page } from '#/api/${table.moduleName}/${table.businessName}'; 24 + import { delete${subSimpleClassName},#if ($deleteBatchEnable) delete${subSimpleClassName}ByIds,#end get${subSimpleClassName}Page } from '#/api/${table.moduleName}/${table.businessName}';
25 import { use${subSimpleClassName}GridFormSchema, use${subSimpleClassName}GridColumns } from '../data'; 25 import { use${subSimpleClassName}GridFormSchema, use${subSimpleClassName}GridColumns } from '../data';
  26 + import { isEmpty } from '@vben/utils';
26 #else 27 #else
27 #if ($subTable.subJoinMany) ## 一对多 28 #if ($subTable.subJoinMany) ## 一对多
28 import { get${subSimpleClassName}ListBy${SubJoinColumnName} } from '#/api/${table.moduleName}/${table.businessName}'; 29 import { get${subSimpleClassName}ListBy${SubJoinColumnName} } from '#/api/${table.moduleName}/${table.businessName}';
@@ -67,11 +68,38 @@ async function onDelete(row: ${simpleClassName}Api.${subSimpleClassName}) { @@ -67,11 +68,38 @@ async function onDelete(row: ${simpleClassName}Api.${subSimpleClassName}) {
67 await delete${subSimpleClassName}(row.id as number); 68 await delete${subSimpleClassName}(row.id as number);
68 message.success( $t('ui.actionMessage.deleteSuccess', [row.id]) ); 69 message.success( $t('ui.actionMessage.deleteSuccess', [row.id]) );
69 onRefresh(); 70 onRefresh();
70 - } catch { 71 + } finally {
71 hideLoading(); 72 hideLoading();
72 } 73 }
73 } 74 }
74 75
  76 +#if ($deleteBatchEnable)
  77 +const deleteIds = ref<number[]>([]) // 待删除${subTable.classComment} ID
  78 +const showDeleteBatchBtn = computed(() => isEmpty(deleteIds.value));
  79 +function setDeleteIds({
  80 + records,
  81 +}: {
  82 + records: ${simpleClassName}Api.${subSimpleClassName}[];
  83 +}) {
  84 + deleteIds.value = records.map((item) => item.id);
  85 +}
  86 +/** 批量删除${subTable.classComment} */
  87 +async function onDeleteBatch() {
  88 + const hideLoading = message.loading({
  89 + content: $t('ui.actionMessage.deleting'),
  90 + duration: 0,
  91 + key: 'action_process_msg',
  92 + });
  93 + try {
  94 + await delete${subSimpleClassName}ByIds(deleteIds.value);
  95 + message.success( $t('ui.actionMessage.deleteSuccess') );
  96 + onRefresh();
  97 + } finally {
  98 + hideLoading();
  99 + }
  100 +}
  101 +#end
  102 +
75 /** 表格操作按钮的回调函数 */ 103 /** 表格操作按钮的回调函数 */
76 function onActionClick({ 104 function onActionClick({
77 code, 105 code,
@@ -136,6 +164,12 @@ function onActionClick({ @@ -136,6 +164,12 @@ function onActionClick({
136 isHover: true, 164 isHover: true,
137 }, 165 },
138 } as VxeTableGridOptions<${simpleClassName}Api.${subSimpleClassName}>, 166 } as VxeTableGridOptions<${simpleClassName}Api.${subSimpleClassName}>,
  167 + #if (${table.templateType} == 11 && $deleteBatchEnable)
  168 + gridEvents:{
  169 + checkboxAll: setDeleteIds,
  170 + checkboxChange: setDeleteIds,
  171 + }
  172 + #end
139 }); 173 });
140 174
141 /** 刷新表格 */ 175 /** 刷新表格 */
@@ -173,6 +207,19 @@ const onRefresh = async ()=&gt; { @@ -173,6 +207,19 @@ const onRefresh = async ()=&gt; {
173 <Button :icon="h(Plus)" type="primary" @click="onCreate" v-access:code="['${table.moduleName}:${simpleClassName_strikeCase}:create']"> 207 <Button :icon="h(Plus)" type="primary" @click="onCreate" v-access:code="['${table.moduleName}:${simpleClassName_strikeCase}:create']">
174 {{ $t('ui.actionTitle.create', ['${subTable.classComment}']) }} 208 {{ $t('ui.actionTitle.create', ['${subTable.classComment}']) }}
175 </Button> 209 </Button>
  210 + #if ($table.templateType == 11 && $deleteBatchEnable)
  211 + <Button
  212 + :icon="h(Trash2)"
  213 + type="primary"
  214 + danger
  215 + class="ml-2"
  216 + :disabled="showDeleteBatchBtn"
  217 + @click="onDeleteBatch"
  218 + v-access:code="['${table.moduleName}:${simpleClassName_strikeCase}:delete']"
  219 + >
  220 + 批量删除
  221 + </Button>
  222 + #end
176 </template> 223 </template>
177 </Grid> 224 </Grid>
178 #else 225 #else
yudao-server/src/main/resources/application.yaml
@@ -271,6 +271,7 @@ yudao: @@ -271,6 +271,7 @@ yudao:
271 front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 271 front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类
272 vo-type: 10 # VO 的类型,参见 CodegenVOTypeEnum 枚举类 272 vo-type: 10 # VO 的类型,参见 CodegenVOTypeEnum 枚举类
273 unit-test-enable: false # 是否生成单元测试 273 unit-test-enable: false # 是否生成单元测试
  274 + delete-batch-enable: false # 是否生成批量删除接口
274 tenant: # 多租户相关配置项 275 tenant: # 多租户相关配置项
275 enable: true 276 enable: true
276 ignore-urls: 277 ignore-urls: