error data

This commit is contained in:
2026-08-19 14:37:55 +08:00
parent 1f7705546d
commit 72baf66d59
10 changed files with 54 additions and 29 deletions
@@ -64,8 +64,8 @@ public interface SchTeacherGroupRepository extends JpaRepository<SchTeacherGroup
* 适用场景:全局删除(如教师彻底注销)
*/
@Modifying
@Query("DELETE FROM SchTeacherGroup g WHERE g.teaId IN :teaIds")
int deleteByTeaIdIn(@Param("teaIds") List<Integer> teaIds);
@Query("DELETE FROM SchTeacherGroup g WHERE g.teaId IN :teaIds AND g.groupId = :groupId")
int deleteByGroupIdAndTeaIds(@Param("teaIds") List<Integer> teaIds,Integer groupId);
/**
* 根据 teaId 列表和学校 ID 删除关联(推荐)
@@ -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");
@@ -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<Map<String, Object>> handleDException(DException ex) {
Map<String, Object> 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<Map<String, Object>> handleValidationExceptions(MethodArgumentNotValidException ex) {
List<String> msgList = new ArrayList<>();
@@ -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<SelectIntVO> toTeacherGroupSelect() {
return schTeacherService.toTeacherGroupSelect(UserContext.getSchId());
@@ -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<Integer, String> toIdAndNameMap(Integer schId);
@@ -24,7 +24,7 @@ public interface ISyncUserBaseService {
BoaUser editTeacher(SchTeacherDTO teacher);
void deleteTeacherList(List<SchTeacherDTO> teacherList);
void deleteTeachers(List<Integer> teaIds,Integer groupId);
}
@@ -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
@@ -98,9 +98,9 @@ public class SyncUserBaseService implements ISyncUserBaseService {
return YschBaseOpenApi.editUser(teacher.getTeaId(),user);
}
public void deleteTeacherList(List<SchTeacherDTO> teacherList){
for (SchTeacherDTO teacher :teacherList) {
YschBaseOpenApi.deleteUser(teacher.getTeaId(),teacher.getGroupId());
public void deleteTeachers(List<Integer> teaIds,Integer groupId){
for (Integer teaId :teaIds) {
YschBaseOpenApi.deleteUser(teaId,groupId);
}
}
@@ -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<Integer> 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<Integer> 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<Integer> 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);
}
// 清除缓存
@@ -133,18 +133,18 @@ public class SchTeacherLogService {
}
@Async("logExecutor")
public void deleteTeacherLogs(UserContext.UserInfo user, List<SchTeacher> teachers) {
public void deleteTeacherLogs(UserContext.UserInfo user, List<SchTeacher> teachers,String groupName) {
try {
LocalDateTime now = LocalDateTime.now();
List<OperationLogRecord> 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);
}