package com.mindskip.xzs.controller.admin; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.mindskip.xzs.base.BaseApiController; import com.mindskip.xzs.base.RestResponse; import com.mindskip.xzs.domain.ExamPaperSubject; import com.mindskip.xzs.domain.Subject; 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.repository.SubjectMapper; import com.mindskip.xzs.service.*; import com.mindskip.xzs.viewmodel.admin.education.SubjectEditRequestVM; import com.mindskip.xzs.viewmodel.admin.education.SubjectPageRequestVM; import com.mindskip.xzs.vo.SubjectVO; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @RestController("AdminEducationController") @RequestMapping(value = "/api/admin/education") @RequiredArgsConstructor public class EducationController extends BaseApiController { private final SubjectService subjectService; private final SubjectMapper subjectMapper; private final SubjectDeptMapper subjectDeptMapper; private final QuestionSubjectService questionSubjectService; 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() { List subjects = subjectService.allSubject(); return RestResponse.ok(subjects); } @PostMapping("/subject/add") public RestResponse add(@RequestBody @Validated AddSubjectForm form) { return subjectService.add(form); } @PostMapping("/subject/save") public RestResponse save(@RequestBody @Validated Subject form) { form.setDeleted(Boolean.FALSE); try { subjectMapper.insert(form); } catch (Exception e) { return RestResponse.fail(500, "课目名不能重复"); } return RestResponse.ok(); } @PostMapping("/subject/edit") public RestResponse edit(@RequestBody @Validated EditSubjectForm form) { subjectService.edit(form); return RestResponse.ok(); } @PostMapping("/subject/edit1") @Transactional(rollbackFor = Exception.class) public RestResponse edit1(@RequestBody Subject form) { form.setDeleted(Boolean.FALSE); try { subjectService.updateById(form); } catch (Exception e) { return RestResponse.fail(500, "课目名不能重复"); } return RestResponse.ok(); } @RequestMapping(value = "/subject/select/dept/{deptId}", method = RequestMethod.GET) public RestResponse> listByDeptId(@PathVariable("deptId") Integer deptId) { List subjects = subjectService.listByDeptId(deptId); return RestResponse.ok(subjects); } @RequestMapping(value = "/subject/page1", method = RequestMethod.POST) public RestResponse page(@RequestBody SubjectPageRequestVM model) { PageInfo page = PageHelper.startPage(model.getPageIndex(), model.getPageSize(), "id desc").doSelectPageInfo(() -> departmentMapper.page1(model)); return RestResponse.ok(page); } @RequestMapping(value = "/subject/page", method = RequestMethod.POST) public RestResponse pageList(@RequestBody SubjectPageRequestVM model) { List deptList = departmentMapper.list(); List data = deptList.stream().map(dept -> { DeptSubjectCascaderVO deptCascaderVO = new DeptSubjectCascaderVO(); deptCascaderVO.setId(dept.getValue()); deptCascaderVO.setName(dept.getLabel()); deptCascaderVO.setParentId(dept.getParentId()); List subjectDeptVOS = subjectDeptMapper.getByDeptId(dept.getValue()); List 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)); } public List buildTree(List departments) { // 用于存储已经放入树的节点,以value为键 Map map = new HashMap<>(); List rootNodes = new ArrayList<>(); // 第一步:将所有节点放入map中,并初始化children列表 for (DeptSubjectCascaderVO dept : departments) { map.put(dept.getId(), dept); dept.setChildren(new ArrayList<>()); } // 第二步:构建树形结构 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 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 select(@PathVariable Integer id) { Subject subject = subjectService.selectById(id); SubjectEditRequestVM vm = modelMapper.map(subject, SubjectEditRequestVM.class); List subjectDeptVOS = subjectDeptMapper.deptBySubjectId(id); List deptIds = subjectDeptVOS.stream().map(SubjectDeptVO::getDeptId).collect(Collectors.toList()); vm.setDeptIds(deptIds); return RestResponse.ok(vm); } @Transactional(rollbackFor = Exception.class) @RequestMapping(value = "/subject/delete/{id}", method = RequestMethod.POST) public RestResponse delete(@PathVariable Integer id) { subjectService.deleteById(id); questionSubjectService.removeSubjectId(id); Integer[] ids = examPaperSubjectService.getBySubjectId(id) .stream().map(ExamPaperSubject::getExamPaperId).toArray(Integer[]::new); if (ids.length > 0) { examPaperService.removeByIds(ids); examPaperDepartmentService.removeByExamPaperIds(ids); } examPaperSubjectService.removeBySubjectId(id); return RestResponse.ok(); } }