请假类型
build / build-push (push) Successful in 35s

This commit is contained in:
wanghu
2026-09-23 15:55:09 +08:00
parent bdcd986d52
commit 134c4f5aad
4 changed files with 16 additions and 92 deletions
@@ -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;