@@ -1,56 +0,0 @@
|
|||||||
package com.yunhai.homeleave.enums;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 请假类型(历史 LeaveTypeEnum 语义:1 病假;2 事假及其他原因)。
|
|
||||||
*/
|
|
||||||
public enum LeaveTypeEnum {
|
|
||||||
SICK(1, "病假"),
|
|
||||||
PERSONAL(2, "事假及其他");
|
|
||||||
|
|
||||||
private final Integer id;
|
|
||||||
private final String name;
|
|
||||||
|
|
||||||
LeaveTypeEnum(Integer id, String name) {
|
|
||||||
this.id = id;
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String nameById(Integer id) {
|
|
||||||
for (LeaveTypeEnum type : list()) {
|
|
||||||
if (Objects.equals(type.getId(), id)) {
|
|
||||||
return type.getName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isValid(Integer id) {
|
|
||||||
return nameById(id) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<LeaveTypeEnum> list;
|
|
||||||
|
|
||||||
private static List<LeaveTypeEnum> list() {
|
|
||||||
if (list != null) {
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
list = new ArrayList<>();
|
|
||||||
for (LeaveTypeEnum type : EnumSet.allOf(LeaveTypeEnum.class)) {
|
|
||||||
list.add(type);
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -88,6 +88,6 @@ public interface IDictService {
|
|||||||
/** 请假类型排序:ids 按前端顺序(升序)重排 sortOrder */
|
/** 请假类型排序:ids 按前端顺序(升序)重排 sortOrder */
|
||||||
void sortLeaveTypes(String ids);
|
void sortLeaveTypes(String ids);
|
||||||
|
|
||||||
/** 按学校解析请假类型名称(本校优先、其次全局;未命中回退 null,调用方可再退枚举名) */
|
/** 按学校解析请假类型名称(本校优先、其次全局,含停用项;未命中返回 null) */
|
||||||
String resolveLeaveTypeName(Integer leaveType, Integer schId);
|
String resolveLeaveTypeName(Integer leaveType, Integer schId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import com.yunhai.homeleave.entity.LeaveReportBack;
|
|||||||
import com.yunhai.homeleave.entity.LeaveTime;
|
import com.yunhai.homeleave.entity.LeaveTime;
|
||||||
import com.yunhai.homeleave.enums.LeaveRegisterTypeEnum;
|
import com.yunhai.homeleave.enums.LeaveRegisterTypeEnum;
|
||||||
import com.yunhai.homeleave.enums.LeaveStatusEnum;
|
import com.yunhai.homeleave.enums.LeaveStatusEnum;
|
||||||
import com.yunhai.homeleave.enums.LeaveTypeEnum;
|
|
||||||
import com.yunhai.homeleave.model.BasePageResult;
|
import com.yunhai.homeleave.model.BasePageResult;
|
||||||
import com.yunhai.homeleave.model.UpFileVo;
|
import com.yunhai.homeleave.model.UpFileVo;
|
||||||
import com.yunhai.homeleave.model.bsch.SchClassDto;
|
import com.yunhai.homeleave.model.bsch.SchClassDto;
|
||||||
@@ -926,47 +925,19 @@ public class LeaveServiceImpl implements ILeaveService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** 请假类型校验:sys_dict(leave_type) 启用项(本校 + 全局),以字典配置为准 */
|
||||||
* 请假类型校验:sys_dict(leave_type) 启用项;字典完全未配置时回退固定枚举(1/2)。
|
|
||||||
*/
|
|
||||||
/** 取异常链最底层的真实原因文本(MySQL 错误在链尾) */
|
|
||||||
private static String rootMessage(Throwable e) {
|
|
||||||
Throwable r = e;
|
|
||||||
while (r.getCause() != null && r.getCause() != r) {
|
|
||||||
r = r.getCause();
|
|
||||||
}
|
|
||||||
return r.getClass().getSimpleName() + ": " + r.getMessage();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isValidLeaveType(Integer leaveType) {
|
private boolean isValidLeaveType(Integer leaveType) {
|
||||||
if (leaveType == null) {
|
if (leaveType == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
String key = String.valueOf(leaveType);
|
||||||
List<Map<String, Object>> options = dictService.getLeaveTypeOptions();
|
return dictService.getLeaveTypeOptions().stream()
|
||||||
if (!options.isEmpty()) {
|
.anyMatch(o -> key.equals(String.valueOf(o.get("k"))));
|
||||||
String key = String.valueOf(leaveType);
|
|
||||||
return options.stream().anyMatch(o -> key.equals(String.valueOf(o.get("k"))));
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
// 字典查询异常不阻断提交:回退固定枚举,并把最底层原因打出来便于排查
|
|
||||||
log.error("[isValidLeaveType] 请假类型字典查询失败, 回退枚举校验. cause={}", rootMessage(e), e);
|
|
||||||
}
|
|
||||||
return LeaveTypeEnum.isValid(leaveType);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 请假类型名称:sys_dict 优先,未命中回退固定枚举名(字典查询异常同样回退,不阻断列表) */
|
/** 请假类型名称:sys_dict(leave_type),本校优先、其次全局,含停用项;未命中返回 null */
|
||||||
private String leaveTypeName(Leave leave) {
|
private String leaveTypeName(Leave leave) {
|
||||||
try {
|
return dictService.resolveLeaveTypeName(leave.getLeaveType(), leave.getSchId());
|
||||||
String name = dictService.resolveLeaveTypeName(leave.getLeaveType(), leave.getSchId());
|
|
||||||
if (name != null) {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("[leaveTypeName] 请假类型字典查询失败, 回退枚举名. leaveType={}, cause={}",
|
|
||||||
leave.getLeaveType(), rootMessage(e), e);
|
|
||||||
}
|
|
||||||
return LeaveTypeEnum.nameById(leave.getLeaveType());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 销假时间段回传规范化(不连续合成单条;连续要求与请假时间段一一对应) */
|
/** 销假时间段回传规范化(不连续合成单条;连续要求与请假时间段一一对应) */
|
||||||
|
|||||||
@@ -76,6 +76,8 @@ class LeaveServiceImplClassCheckTest {
|
|||||||
rosterService = mock(RosterService.class);
|
rosterService = mock(RosterService.class);
|
||||||
CurrentBoaUser currentBoaUser = mock(CurrentBoaUser.class);
|
CurrentBoaUser currentBoaUser = mock(CurrentBoaUser.class);
|
||||||
when(currentBoaUser.get()).thenReturn(null); // 非校管理员
|
when(currentBoaUser.get()).thenReturn(null); // 非校管理员
|
||||||
|
// 请假类型只认 sys_dict(leave_type) 启用项(枚举已删除),mock 字典下发 key=1
|
||||||
|
when(dictService.getLeaveTypeOptions()).thenReturn(Collections.singletonList(dictOption("1", "病假")));
|
||||||
|
|
||||||
leaveService = new LeaveServiceImpl();
|
leaveService = new LeaveServiceImpl();
|
||||||
ReflectionTestUtils.setField(leaveService, "leaveRepository", leaveRepository);
|
ReflectionTestUtils.setField(leaveService, "leaveRepository", leaveRepository);
|
||||||
@@ -227,6 +229,13 @@ class LeaveServiceImplClassCheckTest {
|
|||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Map<String, Object> dictOption(String k, String v) {
|
||||||
|
Map<String, Object> m = new LinkedHashMap<>();
|
||||||
|
m.put("k", k);
|
||||||
|
m.put("v", v);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
private static RosterService.RosterEntry entry(Integer classId, String className) {
|
private static RosterService.RosterEntry entry(Integer classId, String className) {
|
||||||
RosterService.RosterEntry e = new RosterService.RosterEntry();
|
RosterService.RosterEntry e = new RosterService.RosterEntry();
|
||||||
e.studentId = STU_USER_ID;
|
e.studentId = STU_USER_ID;
|
||||||
|
|||||||
Reference in New Issue
Block a user