diff --git a/src/main/java/com/yunhai/bschclassmanage/Repository/SchTeacherGroupRepository.java b/src/main/java/com/yunhai/bschclassmanage/Repository/SchTeacherGroupRepository.java index 2864189..dd86364 100644 --- a/src/main/java/com/yunhai/bschclassmanage/Repository/SchTeacherGroupRepository.java +++ b/src/main/java/com/yunhai/bschclassmanage/Repository/SchTeacherGroupRepository.java @@ -64,8 +64,8 @@ public interface SchTeacherGroupRepository extends JpaRepository teaIds); + @Query("DELETE FROM SchTeacherGroup g WHERE g.teaId IN :teaIds AND g.groupId = :groupId") + int deleteByGroupIdAndTeaIds(@Param("teaIds") List teaIds,Integer groupId); /** * 根据 teaId 列表和学校 ID 删除关联(推荐) diff --git a/src/main/java/com/yunhai/bschclassmanage/aspect/ControllerUserContextAspect.java b/src/main/java/com/yunhai/bschclassmanage/aspect/ControllerUserContextAspect.java index d46575d..443f824 100644 --- a/src/main/java/com/yunhai/bschclassmanage/aspect/ControllerUserContextAspect.java +++ b/src/main/java/com/yunhai/bschclassmanage/aspect/ControllerUserContextAspect.java @@ -130,6 +130,7 @@ public class ControllerUserContextAspect { if (boaUser != null) { UserContext.setUserId(boaUser.getId()); UserContext.setUserName(boaUser.getName() != null ? boaUser.getName() : "unknown"); + UserContext.setSchId(boaUser.getSchool()==null?null:boaUser.getSchool().getId()); log.debug("UserContext set from parameter/session: id={}, name={}", boaUser.getId(), boaUser.getName()); } else { UserContext.setUserName("anonymous"); diff --git a/src/main/java/com/yunhai/bschclassmanage/controller/Handler/ValidationExceptionHandler.java b/src/main/java/com/yunhai/bschclassmanage/controller/Handler/ValidationExceptionHandler.java index d716d33..969572a 100644 --- a/src/main/java/com/yunhai/bschclassmanage/controller/Handler/ValidationExceptionHandler.java +++ b/src/main/java/com/yunhai/bschclassmanage/controller/Handler/ValidationExceptionHandler.java @@ -1,6 +1,9 @@ package com.yunhai.bschclassmanage.controller.Handler; +import com.yunhai.platform.utils.exception.DException; import com.yunhai.platform.utils.exception.ErrorCode; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; @@ -13,9 +16,24 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +@Order(Ordered.HIGHEST_PRECEDENCE) @RestControllerAdvice public class ValidationExceptionHandler { + /** + * 兜底 DException:平台 GlobalExceptionHandler 只返回 code/msg,会丢掉 data。 + * 本项目优先捕获,把业务异常里的 data(如导入错误列表)透传给前端。 + */ + @ExceptionHandler(DException.class) + public ResponseEntity> handleDException(DException ex) { + Map response = new LinkedHashMap<>(); + response.put("code", ex.getCode() != null ? ex.getCode().getCode() : ErrorCode.CUSTOM.getCode()); + response.put("msg", ex.getMessage()); + response.put("data", ex.getData()); + response.put("timeNow", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + return new ResponseEntity<>(response, HttpStatus.OK); + } + @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity> handleValidationExceptions(MethodArgumentNotValidException ex) { List msgList = new ArrayList<>(); diff --git a/src/main/java/com/yunhai/bschclassmanage/controller/api/SchTeacherController.java b/src/main/java/com/yunhai/bschclassmanage/controller/api/SchTeacherController.java index bd4b868..4702406 100644 --- a/src/main/java/com/yunhai/bschclassmanage/controller/api/SchTeacherController.java +++ b/src/main/java/com/yunhai/bschclassmanage/controller/api/SchTeacherController.java @@ -60,12 +60,6 @@ public class SchTeacherController extends BaseController { schTeacherService.saveTeacher(UserContext.getCurrentUser(),model); } - @PostMapping("delete/{ids}") - public void deleteTeacher(@PathVariable String ids ) { - schTeacherService.deleteTeacher(UserContext.getCurrentUser(),ids); - } - - @PostMapping("moveGroup") public void moveGroup(@Valid @RequestBody TeaTransferGroupDTO model) { schTeacherService.moveGroup(UserContext.getCurrentUser(),model); @@ -76,6 +70,11 @@ public class SchTeacherController extends BaseController { schTeacherService.setTeacherStatus(UserContext.getCurrentUser(),ids,status); } + @PostMapping("delete") + public void deleteTeacher(String ids ,Integer groupId) { + schTeacherService.deleteTeacher(UserContext.getCurrentUser(),ids,groupId); + } + @GetMapping("groupSelect") // 当前用户 public List toTeacherGroupSelect() { return schTeacherService.toTeacherGroupSelect(UserContext.getSchId()); diff --git a/src/main/java/com/yunhai/bschclassmanage/service/ISchTeacherService.java b/src/main/java/com/yunhai/bschclassmanage/service/ISchTeacherService.java index 5218e39..7984c96 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/ISchTeacherService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/ISchTeacherService.java @@ -29,7 +29,7 @@ public interface ISchTeacherService { void saveTeacher(UserContext.UserInfo user, SchTeacherDTO dto); - void deleteTeacher(UserContext.UserInfo user,String ids); + void deleteTeacher(UserContext.UserInfo user,String ids,Integer groupId); Map toIdAndNameMap(Integer schId); diff --git a/src/main/java/com/yunhai/bschclassmanage/service/ISyncUserBaseService.java b/src/main/java/com/yunhai/bschclassmanage/service/ISyncUserBaseService.java index 7260eb6..ca00fb7 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/ISyncUserBaseService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/ISyncUserBaseService.java @@ -24,7 +24,7 @@ public interface ISyncUserBaseService { BoaUser editTeacher(SchTeacherDTO teacher); - void deleteTeacherList(List teacherList); + void deleteTeachers(List teaIds,Integer groupId); } diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/SchTeacherService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/SchTeacherService.java index abc697d..11f1de3 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/SchTeacherService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/SchTeacherService.java @@ -273,8 +273,8 @@ public class SchTeacherService implements ISchTeacherService { @Override @Transactional(rollbackFor = Exception.class) - public void deleteTeacher(UserContext.UserInfo user, String ids) { - infoService.deleteTeacher(user, ids); + public void deleteTeacher(UserContext.UserInfo user, String ids,Integer groupId) { + infoService.deleteTeacher(user, ids,groupId); } @Override diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/sync/SyncUserBaseService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/sync/SyncUserBaseService.java index 07bc6f9..55d2bd3 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/sync/SyncUserBaseService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/sync/SyncUserBaseService.java @@ -98,9 +98,9 @@ public class SyncUserBaseService implements ISyncUserBaseService { return YschBaseOpenApi.editUser(teacher.getTeaId(),user); } - public void deleteTeacherList(List teacherList){ - for (SchTeacherDTO teacher :teacherList) { - YschBaseOpenApi.deleteUser(teacher.getTeaId(),teacher.getGroupId()); + public void deleteTeachers(List teaIds,Integer groupId){ + for (Integer teaId :teaIds) { + YschBaseOpenApi.deleteUser(teaId,groupId); } } diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/teacher/SchTeacherInfoService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/teacher/SchTeacherInfoService.java index a3bc294..4e8efca 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/teacher/SchTeacherInfoService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/teacher/SchTeacherInfoService.java @@ -151,7 +151,7 @@ public class SchTeacherInfoService { cacheService.clearTeacherCache(schId); } - public void deleteTeacher(UserContext.UserInfo user, String ids) { + public void deleteTeacher(UserContext.UserInfo user, String ids,Integer groupId) { if (StringUtils.isBlank(ids)) { throw new DException("教师ID列表不能为空"); } @@ -180,26 +180,33 @@ public class SchTeacherInfoService { } // 校验班主任/副班主任(SchClass.firstTeacherId/secondTeacherId 存的是 teaId) - List teacherTeaIds = teachers.stream() - .map(SchTeacher::getTeaId) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - if (!teacherTeaIds.isEmpty()) { - long classCount = schClassRepository.countByFirstTeacherIdInOrSecondTeacherIdInAndSchId(teacherTeaIds, schId); - if (classCount > 0) { - throw new DException("选中的教师中有 " + classCount + " 个班级的班主任/副班主任,请先更换"); + if(teachers.size()==1) + { + List teacherTeaIds = teachers.stream() + .map(SchTeacher::getTeaId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + if (!teacherTeaIds.isEmpty()) { + long classCount = schClassRepository.countByFirstTeacherIdInOrSecondTeacherIdInAndSchId(teacherTeaIds, schId); + if (classCount > 0) { + throw new DException("选中的教师中有 " + classCount + " 个班级的班主任/副班主任,请先更换"); + } } } + String groupName=comSchTreeService.getTeaGroupName(schId,groupId); + // 删除关联组关系(先异步日志,再删除) List teaIds = teachers.stream() .map(SchTeacher::getTeaId) .filter(Objects::nonNull) .collect(Collectors.toList()); + if (!teaIds.isEmpty()) { // 异步记录删除日志(由 LogService 处理) - logService.deleteTeacherLogs(user, teachers); - schTeacherGroupRepository.deleteByTeaIdIn(teaIds); + logService.deleteTeacherLogs(user, teachers,groupName); + syncUserBaseService.deleteTeachers(teaIds,groupId); + schTeacherGroupRepository.deleteByGroupIdAndTeaIds(teaIds,groupId); } // 清除缓存 diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/teacher/SchTeacherLogService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/teacher/SchTeacherLogService.java index 5c67454..899788f 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/teacher/SchTeacherLogService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/teacher/SchTeacherLogService.java @@ -133,18 +133,18 @@ public class SchTeacherLogService { } @Async("logExecutor") - public void deleteTeacherLogs(UserContext.UserInfo user, List teachers) { + public void deleteTeacherLogs(UserContext.UserInfo user, List teachers,String groupName) { try { LocalDateTime now = LocalDateTime.now(); List logs = new ArrayList<>(); for (SchTeacher teacher : teachers) { - OperationLogRecord log = logService.buildLogRecord(user, LogModule.TEACHER, "删除[" + teacher.getName() + "] 教师成功", now); + OperationLogRecord log = logService.buildLogRecord(user, LogModule.TEACHER, "删除["+groupName+"-" + teacher.getName() + "] 教师成功", now); logs.add(log); } if (logs != null && !logs.isEmpty()) { logService.saveAllLogAsync(logs); } - log.debug("操作人:{},删除教师日志:{}", user.getUserName(), JSON.toJSONString(teachers)); + log.debug("操作人:{},删除教师日志:{}", groupName+"-"+user.getUserName(), JSON.toJSONString(teachers)); } catch (Exception e) { log.error("操作人:" + user.getUserName() + ",删除教师日志失败: {}", e.getMessage(), e); }