src/main/java/com/mindskip/xzs/controller/admin/EducationController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mindskip/xzs/domain/form/AddSubjectForm.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mindskip/xzs/domain/form/EditSubjectForm.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mindskip/xzs/domain/vo/DeptSubjectCascaderVO.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mindskip/xzs/repository/SubjectDeptMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mindskip/xzs/service/SubjectService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mindskip/xzs/service/impl/SubjectServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/SubjectDeptMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/mindskip/xzs/controller/admin/EducationController.java
@@ -6,7 +6,12 @@ import com.mindskip.xzs.domain.ExamPaperSubject; import com.mindskip.xzs.domain.Subject; import com.mindskip.xzs.domain.SubjectDept; import com.mindskip.xzs.domain.form.AddSubjectForm; import com.mindskip.xzs.domain.form.EditSubjectForm; import com.mindskip.xzs.domain.vo.CascaderDataVO; import com.mindskip.xzs.domain.vo.DeptSubjectCascaderVO; import com.mindskip.xzs.domain.vo.SubjectDeptVO; import com.mindskip.xzs.repository.DepartmentMapper; import com.mindskip.xzs.repository.SubjectDeptMapper; import com.mindskip.xzs.service.*; import com.mindskip.xzs.utility.PageInfoHelper; @@ -14,14 +19,16 @@ import com.mindskip.xzs.viewmodel.admin.education.SubjectPageRequestVM; import com.mindskip.xzs.viewmodel.admin.education.SubjectResponseVM; import com.github.pagehelper.PageInfo; import com.mindskip.xzs.vo.SubjectVO; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; import java.util.*; import java.util.stream.Collectors; @RestController("AdminEducationController") @@ -35,12 +42,26 @@ private final ExamPaperSubjectService examPaperSubjectService; private final ExamPaperDepartmentService examPaperDepartmentService; private final ExamPaperService examPaperService; private final DepartmentService departmentService; private final DepartmentMapper departmentMapper; @RequestMapping(value = "/subject/list", method = RequestMethod.POST) public RestResponse<List<Subject>> list() { List<Subject> subjects = subjectService.allSubject(); return RestResponse.ok(subjects); } @PostMapping("/subject/add") public RestResponse<Object> add(@RequestBody @Validated AddSubjectForm form) { subjectService.add(form); return RestResponse.ok(); } @PostMapping("/subject/edit") public RestResponse<Object> edit(@RequestBody @Validated EditSubjectForm form) { subjectService.edit(form); return RestResponse.ok(); } @RequestMapping(value = "/subject/select/dept/{deptId}", method = RequestMethod.GET) @@ -50,43 +71,70 @@ } @RequestMapping(value = "/subject/page", method = RequestMethod.POST) public RestResponse<PageInfo<SubjectResponseVM>> pageList(@RequestBody SubjectPageRequestVM model) { PageInfo<Subject> pageInfo = subjectService.page(model); PageInfo<SubjectResponseVM> page = PageInfoHelper.copyMap(pageInfo, item -> { SubjectResponseVM vo = new SubjectResponseVM(); BeanUtils.copyProperties(item, vo); List<SubjectDeptVO> subjectDeptVOS = subjectDeptMapper.deptBySubjectId(item.getId()); List<Integer> deptIds = subjectDeptVOS.stream().map(SubjectDeptVO::getDeptId).collect(Collectors.toList()); String deptNames = subjectDeptVOS.stream().map(SubjectDeptVO::getDeptName).collect(Collectors.joining("、")); vo.setDeptIds(deptIds); vo.setDeptNames(deptNames); return vo; }); return RestResponse.ok(page); public RestResponse<Object> pageList(@RequestBody SubjectPageRequestVM model) { List<CascaderDataVO> deptList = departmentMapper.list(); List<DeptSubjectCascaderVO> data = deptList.stream().map(dept -> { DeptSubjectCascaderVO deptCascaderVO = new DeptSubjectCascaderVO(); deptCascaderVO.setId(dept.getValue()); deptCascaderVO.setName(dept.getLabel()); deptCascaderVO.setParentId(dept.getParentId()); List<SubjectVO> subjectDeptVOS = subjectDeptMapper.getByDeptId(dept.getValue()); List<Long> subjectIds = subjectDeptVOS.stream().map(SubjectVO::getId).collect(Collectors.toList()); deptCascaderVO.setSubjectIds(subjectIds); String subjectNames = subjectDeptVOS.stream().map(SubjectVO::getSubjectName).collect(Collectors.joining(",")); deptCascaderVO.setSubjectNames(subjectNames); return deptCascaderVO; }).collect(Collectors.toList()); // 构建树 return RestResponse.ok(this.buildTree(data)); } @Transactional(rollbackFor = Exception.class) @RequestMapping(value = "/subject/edit", method = RequestMethod.POST) public RestResponse edit(@RequestBody @Valid SubjectEditRequestVM model) { Subject subject = modelMapper.map(model, Subject.class); if (model.getId() == null) { subject.setDeleted(false); subjectService.insertByFilter(subject); } else { subjectService.updateByIdFilter(subject); public List<DeptSubjectCascaderVO> buildTree(List<DeptSubjectCascaderVO> departments) { // 用于存储已经放入树的节点,以value为键 Map<Integer, DeptSubjectCascaderVO> map = new HashMap<>(); List<DeptSubjectCascaderVO> rootNodes = new ArrayList<>(); // 第一步:将所有节点放入map中,并初始化children列表 for (DeptSubjectCascaderVO dept : departments) { map.put(dept.getId(), dept); dept.setChildren(new ArrayList<>()); } // 处理部门 subjectDeptMapper.removeBySubjectId(subject.getId()); List<SubjectDept> subjectDeptList = model.getDeptIds().stream().map(deptId -> { SubjectDept subjectDept = new SubjectDept(); subjectDept.setSubjectId(subject.getId()); subjectDept.setDeptId(deptId); return subjectDept; }).collect(Collectors.toList()); subjectDeptMapper.add(subjectDeptList); return RestResponse.ok(); // 第二步:构建树形结构 for (DeptSubjectCascaderVO dept : departments) { if (dept.getParentId() == null) { // 假设顶级部门的parentId为null或0 rootNodes.add(dept); } else { DeptSubjectCascaderVO parent = map.get(dept.getParentId()); if (parent != null) { parent.getChildren().add(dept); } } } return rootNodes; } // @Transactional(rollbackFor = Exception.class) // @RequestMapping(value = "/subject/edit", method = RequestMethod.POST) // public RestResponse edit(@RequestBody @Valid SubjectEditRequestVM model) { // Subject subject = modelMapper.map(model, Subject.class); // if (model.getId() == null) { // subject.setDeleted(false); // subjectService.insertByFilter(subject); // } else { // subjectService.updateByIdFilter(subject); // } // // 处理部门 // subjectDeptMapper.removeBySubjectId(subject.getId()); // List<SubjectDept> subjectDeptList = model.getDeptIds().stream().map(deptId -> { // SubjectDept subjectDept = new SubjectDept(); // subjectDept.setSubjectId(subject.getId()); // subjectDept.setDeptId(deptId); // return subjectDept; // }).collect(Collectors.toList()); // subjectDeptMapper.add(subjectDeptList); // return RestResponse.ok(); // } @RequestMapping(value = "/subject/select/{id}", method = RequestMethod.POST) public RestResponse<SubjectEditRequestVM> select(@PathVariable Integer id) { Subject subject = subjectService.selectById(id); src/main/java/com/mindskip/xzs/domain/form/AddSubjectForm.java
New file @@ -0,0 +1,29 @@ package com.mindskip.xzs.domain.form; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** * @author:xp * @date:2024/7/8 14:32 */ @Data public class AddSubjectForm { /** * 部门ID * */ @NotNull(message = "请选择部门") private Integer deptId; /** * 课目名称 * */ @NotBlank(message = "请输入课目名称") private String subjectName; } src/main/java/com/mindskip/xzs/domain/form/EditSubjectForm.java
New file @@ -0,0 +1,30 @@ package com.mindskip.xzs.domain.form; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.List; /** * @author:xp * @date:2024/7/8 14:32 */ @Data public class EditSubjectForm { /** * 部门ID * */ @NotNull(message = "请选择部门") private Integer deptId; /** * 课目ids * */ private List<Integer> subjectIds; } src/main/java/com/mindskip/xzs/domain/vo/DeptSubjectCascaderVO.java
New file @@ -0,0 +1,46 @@ package com.mindskip.xzs.domain.vo; import com.mindskip.xzs.vo.SubjectVO; import lombok.Data; import java.util.List; /** * 级联选择器数据 * * @author:xp * @date:2024/7/7 20:50 */ @Data public class DeptSubjectCascaderVO { /** * 选中的值,id */ private Integer id; /** * 展示的内容 */ private String name; /** * 部门对应的课目列表 */ private List<SubjectVO> subjectList; private List<Long> subjectIds; private String subjectNames; /** * 父级 */ private Integer parentId; /** * 子级数据 */ private List<DeptSubjectCascaderVO> children; } src/main/java/com/mindskip/xzs/repository/SubjectDeptMapper.java
@@ -2,6 +2,7 @@ import com.mindskip.xzs.domain.SubjectDept; import com.mindskip.xzs.domain.vo.SubjectDeptVO; import com.mindskip.xzs.vo.SubjectVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -19,4 +20,19 @@ void removeBySubjectId(@Param("subjectId") Integer subjectId); List<SubjectDeptVO> deptBySubjectId(@Param("subjectId") Integer subjectId); /** * 获取部门下的课目 * * @param deptId * @return */ List<SubjectVO> getByDeptId(@Param("deptId") Integer deptId); /** * 根据删除部门所有课目 * * @param deptId */ void deleteByDeptId(@Param("deptId") Integer deptId); } src/main/java/com/mindskip/xzs/service/SubjectService.java
@@ -1,6 +1,8 @@ package com.mindskip.xzs.service; import com.mindskip.xzs.domain.Subject; import com.mindskip.xzs.domain.form.AddSubjectForm; import com.mindskip.xzs.domain.form.EditSubjectForm; import com.mindskip.xzs.viewmodel.admin.education.SubjectPageRequestVM; import com.github.pagehelper.PageInfo; import org.apache.ibatis.annotations.Param; @@ -28,4 +30,18 @@ * @return */ List<Subject> listByDeptId(Integer deptId); /** * 新增课目 * * @param form */ void add(AddSubjectForm form); /** * 修改部门课目 * * @param form */ void edit(EditSubjectForm form); } src/main/java/com/mindskip/xzs/service/impl/SubjectServiceImpl.java
@@ -2,9 +2,13 @@ import com.mindskip.xzs.context.WebContext; import com.mindskip.xzs.domain.Subject; import com.mindskip.xzs.domain.SubjectDept; import com.mindskip.xzs.domain.enums.RoleEnum; import com.mindskip.xzs.domain.form.AddSubjectForm; import com.mindskip.xzs.domain.form.EditSubjectForm; import com.mindskip.xzs.repository.BaseMapper; import com.mindskip.xzs.repository.DepartmentMapper; import com.mindskip.xzs.repository.SubjectDeptMapper; import com.mindskip.xzs.repository.SubjectMapper; import com.mindskip.xzs.service.SubjectService; import com.mindskip.xzs.viewmodel.admin.education.SubjectPageRequestVM; @@ -12,9 +16,11 @@ import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @Service public class SubjectServiceImpl extends BaseServiceImpl<Subject> implements SubjectService { @@ -22,12 +28,14 @@ private final SubjectMapper subjectMapper; private final WebContext webContext; private final DepartmentMapper departmentMapper; private final SubjectDeptMapper subjectDeptMapper; public SubjectServiceImpl(BaseMapper<Subject> baseMapper, SubjectMapper subjectMapper, WebContext webContext, DepartmentMapper departmentMapper) { public SubjectServiceImpl(BaseMapper<Subject> baseMapper, SubjectMapper subjectMapper, WebContext webContext, DepartmentMapper departmentMapper, SubjectDeptMapper subjectDeptMapper) { super(baseMapper); this.subjectMapper = subjectMapper; this.webContext = webContext; this.departmentMapper = departmentMapper; this.subjectDeptMapper = subjectDeptMapper; } @Override @@ -79,4 +87,34 @@ public List<Subject> listByDeptId(Integer deptId) { return subjectMapper.listByDeptId(deptId); } @Override @Transactional(rollbackFor = Exception.class) public void add(AddSubjectForm form) { Subject subject = new Subject(); subject.setName(form.getSubjectName()); subject.setDeleted(false); subjectMapper.insert(subject); SubjectDept subjectDept = new SubjectDept(); subjectDept.setDeptId(form.getDeptId()); subjectDept.setSubjectId(subject.getId()); List<SubjectDept> s = new ArrayList<>(1); s.add(subjectDept); subjectDeptMapper.add(s); } @Override @Transactional(rollbackFor = Exception.class) public void edit(EditSubjectForm form) { // 删除原先的课目,再新增 subjectDeptMapper.deleteByDeptId(form.getDeptId()); List<SubjectDept> toAddList = form.getSubjectIds().stream().map(subjectId -> { SubjectDept subjectDept = new SubjectDept(); subjectDept.setDeptId(form.getDeptId()); subjectDept.setSubjectId(subjectId); return subjectDept; }).collect(Collectors.toList()); subjectDeptMapper.add(toAddList); } } src/main/resources/mapper/SubjectDeptMapper.xml
@@ -25,4 +25,17 @@ WHERE tdq.subject_id = #{subjectId} </select> <select id="getByDeptId" resultType="com.mindskip.xzs.vo.SubjectVO"> SELECT s.id, s.name as subjectName FROM t_subject_dept sd INNER JOIN t_subject s ON sd.subject_id = s.id AND sd.dept_id = #{deptId} AND s.deleted = 0 </select> <delete id="deleteByDeptId"> DELETE FROM t_subject_dept WHERE dept_id = #{deptId} </delete> </mapper>