xiangpei
2024-07-08 d69a9a79a82c8a2f93efcd2b43b0a03ca57a031c
课目重构
5个文件已修改
3个文件已添加
304 ■■■■ 已修改文件
src/main/java/com/mindskip/xzs/controller/admin/EducationController.java 114 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/form/AddSubjectForm.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/form/EditSubjectForm.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/vo/DeptSubjectCascaderVO.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/repository/SubjectDeptMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/SubjectService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/impl/SubjectServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/SubjectDeptMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | 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>