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 @Modifying
@Query("DELETE FROM SchTeacherGroup g WHERE g.teaId IN :teaIds") @Query("DELETE FROM SchTeacherGroup g WHERE g.teaId IN :teaIds AND g.groupId = :groupId")
int deleteByTeaIdIn(@Param("teaIds") List<Integer> teaIds); int deleteByGroupIdAndTeaIds(@Param("teaIds") List<Integer> teaIds,Integer groupId);
/** /**
* 根据 teaId 列表和学校 ID 删除关联(推荐) * 根据 teaId 列表和学校 ID 删除关联(推荐)
@@ -130,6 +130,7 @@ public class ControllerUserContextAspect {
if (boaUser != null) { if (boaUser != null) {
UserContext.setUserId(boaUser.getId()); UserContext.setUserId(boaUser.getId());
UserContext.setUserName(boaUser.getName() != null ? boaUser.getName() : "unknown"); 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()); log.debug("UserContext set from parameter/session: id={}, name={}", boaUser.getId(), boaUser.getName());
} else { } else {
UserContext.setUserName("anonymous"); UserContext.setUserName("anonymous");
@@ -1,6 +1,9 @@
package com.yunhai.bschclassmanage.controller.Handler; package com.yunhai.bschclassmanage.controller.Handler;
import com.yunhai.platform.utils.exception.DException;
import com.yunhai.platform.utils.exception.ErrorCode; 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.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotReadableException;
@@ -13,9 +16,24 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
@Order(Ordered.HIGHEST_PRECEDENCE)
@RestControllerAdvice @RestControllerAdvice
public class ValidationExceptionHandler { 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) @ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, Object>> handleValidationExceptions(MethodArgumentNotValidException ex) { public ResponseEntity<Map<String, Object>> handleValidationExceptions(MethodArgumentNotValidException ex) {
List<String> msgList = new ArrayList<>(); List<String> msgList = new ArrayList<>();
@@ -60,12 +60,6 @@ public class SchTeacherController extends BaseController {
schTeacherService.saveTeacher(UserContext.getCurrentUser(),model); schTeacherService.saveTeacher(UserContext.getCurrentUser(),model);
} }
@PostMapping("delete/{ids}")
public void deleteTeacher(@PathVariable String ids ) {
schTeacherService.deleteTeacher(UserContext.getCurrentUser(),ids);
}
@PostMapping("moveGroup") @PostMapping("moveGroup")
public void moveGroup(@Valid @RequestBody TeaTransferGroupDTO model) { public void moveGroup(@Valid @RequestBody TeaTransferGroupDTO model) {
schTeacherService.moveGroup(UserContext.getCurrentUser(),model); schTeacherService.moveGroup(UserContext.getCurrentUser(),model);
@@ -76,6 +70,11 @@ public class SchTeacherController extends BaseController {
schTeacherService.setTeacherStatus(UserContext.getCurrentUser(),ids,status); schTeacherService.setTeacherStatus(UserContext.getCurrentUser(),ids,status);
} }
@PostMapping("delete")
public void deleteTeacher(String ids ,Integer groupId) {
schTeacherService.deleteTeacher(UserContext.getCurrentUser(),ids,groupId);
}
@GetMapping("groupSelect") // 当前用户 @GetMapping("groupSelect") // 当前用户
public List<SelectIntVO> toTeacherGroupSelect() { public List<SelectIntVO> toTeacherGroupSelect() {
return schTeacherService.toTeacherGroupSelect(UserContext.getSchId()); return schTeacherService.toTeacherGroupSelect(UserContext.getSchId());
@@ -29,7 +29,7 @@ public interface ISchTeacherService {
void saveTeacher(UserContext.UserInfo user, SchTeacherDTO dto); 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); Map<Integer, String> toIdAndNameMap(Integer schId);
@@ -24,7 +24,7 @@ public interface ISyncUserBaseService {
BoaUser editTeacher(SchTeacherDTO teacher); 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 @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteTeacher(UserContext.UserInfo user, String ids) { public void deleteTeacher(UserContext.UserInfo user, String ids,Integer groupId) {
infoService.deleteTeacher(user, ids); infoService.deleteTeacher(user, ids,groupId);
} }
@Override @Override
@@ -98,9 +98,9 @@ public class SyncUserBaseService implements ISyncUserBaseService {
return YschBaseOpenApi.editUser(teacher.getTeaId(),user); return YschBaseOpenApi.editUser(teacher.getTeaId(),user);
} }
public void deleteTeacherList(List<SchTeacherDTO> teacherList){ public void deleteTeachers(List<Integer> teaIds,Integer groupId){
for (SchTeacherDTO teacher :teacherList) { for (Integer teaId :teaIds) {
YschBaseOpenApi.deleteUser(teacher.getTeaId(),teacher.getGroupId()); YschBaseOpenApi.deleteUser(teaId,groupId);
} }
} }
@@ -151,7 +151,7 @@ public class SchTeacherInfoService {
cacheService.clearTeacherCache(schId); 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)) { if (StringUtils.isBlank(ids)) {
throw new DException("教师ID列表不能为空"); throw new DException("教师ID列表不能为空");
} }
@@ -180,6 +180,8 @@ public class SchTeacherInfoService {
} }
// 校验班主任/副班主任(SchClass.firstTeacherId/secondTeacherId 存的是 teaId) // 校验班主任/副班主任(SchClass.firstTeacherId/secondTeacherId 存的是 teaId)
if(teachers.size()==1)
{
List<Integer> teacherTeaIds = teachers.stream() List<Integer> teacherTeaIds = teachers.stream()
.map(SchTeacher::getTeaId) .map(SchTeacher::getTeaId)
.filter(Objects::nonNull) .filter(Objects::nonNull)
@@ -190,16 +192,21 @@ public class SchTeacherInfoService {
throw new DException("选中的教师中有 " + classCount + " 个班级的班主任/副班主任,请先更换"); throw new DException("选中的教师中有 " + classCount + " 个班级的班主任/副班主任,请先更换");
} }
} }
}
String groupName=comSchTreeService.getTeaGroupName(schId,groupId);
// 删除关联组关系(先异步日志,再删除) // 删除关联组关系(先异步日志,再删除)
List<Integer> teaIds = teachers.stream() List<Integer> teaIds = teachers.stream()
.map(SchTeacher::getTeaId) .map(SchTeacher::getTeaId)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!teaIds.isEmpty()) { if (!teaIds.isEmpty()) {
// 异步记录删除日志(由 LogService 处理) // 异步记录删除日志(由 LogService 处理)
logService.deleteTeacherLogs(user, teachers); logService.deleteTeacherLogs(user, teachers,groupName);
schTeacherGroupRepository.deleteByTeaIdIn(teaIds); syncUserBaseService.deleteTeachers(teaIds,groupId);
schTeacherGroupRepository.deleteByGroupIdAndTeaIds(teaIds,groupId);
} }
// 清除缓存 // 清除缓存
@@ -133,18 +133,18 @@ public class SchTeacherLogService {
} }
@Async("logExecutor") @Async("logExecutor")
public void deleteTeacherLogs(UserContext.UserInfo user, List<SchTeacher> teachers) { public void deleteTeacherLogs(UserContext.UserInfo user, List<SchTeacher> teachers,String groupName) {
try { try {
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
List<OperationLogRecord> logs = new ArrayList<>(); List<OperationLogRecord> logs = new ArrayList<>();
for (SchTeacher teacher : teachers) { 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); logs.add(log);
} }
if (logs != null && !logs.isEmpty()) { if (logs != null && !logs.isEmpty()) {
logService.saveAllLogAsync(logs); logService.saveAllLogAsync(logs);
} }
log.debug("操作人:{},删除教师日志:{}", user.getUserName(), JSON.toJSONString(teachers)); log.debug("操作人:{},删除教师日志:{}", groupName+"-"+user.getUserName(), JSON.toJSONString(teachers));
} catch (Exception e) { } catch (Exception e) {
log.error("操作人:" + user.getUserName() + ",删除教师日志失败: {}", e.getMessage(), e); log.error("操作人:" + user.getUserName() + ",删除教师日志失败: {}", e.getMessage(), e);
} }