宿舍专业设置为null,学生、外校的导出数据优化

This commit is contained in:
Qi 2025-06-09 15:33:35 +08:00
parent 0b27a5cb42
commit e0d11a649d
8 changed files with 177 additions and 37 deletions

View File

@ -189,7 +189,40 @@ public class JeecgController<T, S extends IService<T>> {
String groupName = nameResolverService.getGroupName(groupId);
groupNameField.set(item, groupName);
}
// --- 学科描述映射 --- (新增部分)
Field majorIdField = null;
Field majorIdDescriptionField = null;
try {
majorIdField = item.getClass().getDeclaredField("majorId");
majorIdDescriptionField = item.getClass().getDeclaredField("majorIdDescription");
} catch (NoSuchFieldException e) {
// 字段不存在
}
if (majorIdField != null && majorIdDescriptionField != null) {
majorIdField.setAccessible(true);
majorIdDescriptionField.setAccessible(true);
Integer majorId = (Integer) majorIdField.get(item);
// 调用映射方法
String majorDescription = mapMajorIdToDescription(majorId);
majorIdDescriptionField.set(item, majorDescription);
}
// --- 是否第一次阅卷 --- (新增部分)
Field checkedField = null;
Field checkedDescriptionField = null;
try {
checkedField = item.getClass().getDeclaredField("checked");
checkedDescriptionField = item.getClass().getDeclaredField("checkedDescription");
} catch (NoSuchFieldException e) {
// 字段不存在
}
if (checkedField != null && checkedDescriptionField != null) {
checkedField.setAccessible(true);
checkedDescriptionField.setAccessible(true);
Integer checked = (Integer) checkedField.get(item);
// 调用映射方法
String checkedDescription = StatusMappingUtil.mapChecked(checked);
checkedDescriptionField.set(item, checkedDescription);
}
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
@ -380,18 +413,24 @@ public class JeecgController<T, S extends IService<T>> {
// ===== 状态描述反向映射 =====
// 性别反向映射
applyReverseMapping(item, "sexDescription", "sex", StatusMappingUtil::reverseMapSex);
// // 性别反向映射
// applyReverseMapping(item, "sexDescription", "sex", StatusMappingUtil::reverseMapSex);
//
// // 车辆状态反向映射
// applyReverseMapping(item, "carStatusDescription", "carStatus", StatusMappingUtil::reverseMapCarStatus);
//
// // 住宿状态反向映射
// applyReverseMapping(item, "dormitoryStatusDescription", "dormitoryStatus", StatusMappingUtil::reverseMapDormitoryStatus);
//
// // 一般状态反向映射
// applyReverseMapping(item, "statusDescription", "status", StatusMappingUtil::reverseMapStatus);
// 车辆状态反向映射
applyReverseMapping(item, "carStatusDescription", "carStatus", StatusMappingUtil::reverseMapCarStatus);
// 住宿状态反向映射
applyReverseMapping(item, "dormitoryStatusDescription", "dormitoryStatus", StatusMappingUtil::reverseMapDormitoryStatus);
// 一般状态反向映射
applyReverseMapping(item, "statusDescription", "status", StatusMappingUtil::reverseMapStatus);
// ===== 状态描述反向映射带存在性判断 =====
applyReverseMappingIfExists(item, "sexDescription", "sex", s -> String.valueOf(StatusMappingUtil.reverseMapSex(s)));
applyReverseMappingIfExists(item, "carStatusDescription", "carStatus", s -> String.valueOf(StatusMappingUtil.reverseMapCarStatus(s)));
applyReverseMappingIfExists(item, "dormitoryStatusDescription", "dormitoryStatus", s -> String.valueOf(StatusMappingUtil.reverseMapDormitoryStatus(s)));
applyReverseMappingIfExists(item, "statusDescription", "status", s -> String.valueOf(StatusMappingUtil.reverseMapStatus(s)));
// 宿舍名称反查 ID
// Field dormNameField = getField(item, "dormitoryName");
// Field dormIdField = getField(item, "dormitoryId");
@ -450,17 +489,46 @@ public class JeecgController<T, S extends IService<T>> {
}
}
private void applyReverseMapping(Object item, String descFieldName, String codeFieldName, Function<String, Integer> mapper) throws IllegalAccessException {
Field descField = getField(item, descFieldName);
Field codeField = getField(item, codeFieldName);
if (descField != null && codeField != null) {
String desc = (String) descField.get(item);
if (desc != null && !desc.isEmpty()) {
Integer code = mapper.apply(desc);
codeField.set(item, code);
// private void applyReverseMapping(Object item, String descFieldName, String codeFieldName, Function<String, Integer> mapper) throws IllegalAccessException {
// Field descField = getField(item, descFieldName);
// Field codeField = getField(item, codeFieldName);
// if (descField != null && codeField != null) {
// String desc = (String) descField.get(item);
// if (desc != null && !desc.isEmpty()) {
// Integer code = mapper.apply(desc);
// codeField.set(item, code);
// }
// }
// }
private void applyReverseMappingIfExists(T item, String fromField, String toField, Function<String, String> mappingFunc) {
try {
Field descField = getField(item, fromField);
Field targetField = getField(item, toField);
if (descField != null && targetField != null) {
descField.setAccessible(true);
targetField.setAccessible(true);
Object rawValue = descField.get(item);
if (rawValue instanceof String && rawValue != null) {
String mapped = mappingFunc.apply((String) rawValue);
targetField.set(item, mapped);
}
}
} catch (Exception e) {
log.warn("映射字段失败: " + fromField + "" + toField, e);
}
}
// 新增的映射方法可放在工具类中
private static String mapMajorIdToDescription(Integer majorId) {
if (majorId == null) return "";
switch (majorId) {
case 1: return "语文";
case 4: return "地理";
case 7: return "历史";
case 8: return "政治";
// 添加其他学科的映射关系
default: return "";
}
}
}

View File

@ -20,6 +20,11 @@ public class StatusMappingUtil {
return dormitoryStatus == 1 ? "" : "";
}
// 住宿状态映射
public static String mapChecked(Integer checked) {
if (checked == null) return "未知";
return checked == 1 ? "" : "";
}
// 住宿状态映射
public static String mapStatus(Integer status) {
if (status == null) return "";
return status == 0 ? "已报到" : "未报到";

View File

@ -78,6 +78,18 @@ public class CeesDormitoryInfoController extends JeecgController<CeesDormitoryIn
@ApiOperation(value="宿舍信息表-添加", notes="宿舍信息表-添加")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody CeesDormitoryInfo ceesDormitoryInfo) {
String dormitory = ceesDormitoryInfo.getDormitory();
if (dormitory != null && dormitory.contains("公寓")) {
int index = dormitory.indexOf("公寓");
// 截取公寓前面的楼名 + 公寓
String apartment = dormitory.substring(0, index + 2);
// 截取公寓后面的房间号
String dormitoryRoom = dormitory.substring(index + 2);
ceesDormitoryInfo.setApartment(apartment);
ceesDormitoryInfo.setDormitoryRoom(dormitoryRoom);
}
ceesDormitoryInfoService.save(ceesDormitoryInfo);
return Result.OK("添加成功!");
}

View File

@ -1,9 +1,6 @@
package org.jeecg.modules.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ -57,6 +54,12 @@ public class CeesDormitoryInfo implements Serializable {
@Excel(name = "宿舍信息", width = 15)
@ApiModelProperty(value = "宿舍信息")
private String dormitory;
@ApiModelProperty(value = "公寓信息")
private String apartment;
@ApiModelProperty(value = "宿舍信息")
private String dormitoryRoom;
/**男/女*/
@Excel(name = "男/女", width = 15)
@ApiModelProperty(value = "男/女")
@ -72,6 +75,7 @@ public class CeesDormitoryInfo implements Serializable {
/**
*该宿舍所属学科
*/
@TableField(updateStrategy = FieldStrategy.IGNORED)
@ApiModelProperty(value = "学科id")
private Integer majorId;
/**专业id*/

View File

@ -107,8 +107,12 @@ public class CeesLocalTeacher implements Serializable {
@ApiModelProperty(value = "状态0正常 1禁用")
private Integer status;
/**是否第一次阅卷*/
@Excel(name = "是否第一次阅卷", width = 15)
// @Excel(name = "是否第一次阅卷", width = 15)
@ApiModelProperty(value = "是否第一次阅卷")
private Integer checked;
@Excel(name = "是否第一次阅卷", width = 15)
@ApiModelProperty(value = "是否第一次阅卷")
@TableField(exist = false)
private String checkedDescription;
}

View File

@ -91,9 +91,13 @@ public class Student implements Serializable {
@ApiModelProperty(value = "手机号")
private String phone;
/**是否第一次阅卷*/
@Excel(name = "是否第一次阅卷", width = 15)
// @Excel(name = "是否第一次阅卷", width = 15)
@ApiModelProperty(value = "是否第一次阅卷")
private Integer checked;
@Excel(name = "是否第一次阅卷", width = 15)
@ApiModelProperty(value = "是否第一次阅卷")
@TableField(exist = false)
private String checkedDescription;
/**组id*/
// @Excel(name = "组id", width = 15)
@ApiModelProperty(value = "组id")

View File

@ -109,15 +109,14 @@ public class CeesDormitoryInfoServiceImpl extends ServiceImpl<CeesDormitoryInfoM
}
// 2. 解析学科ID
Object majorIdObj = webData.get("majorId");
if (majorIdObj == null) {
return Result.error("缺少学科ID");
}
Integer majorId;
Integer majorId = null;
if (majorIdObj != null && !"".equals(majorIdObj.toString())) {
try {
majorId = Integer.valueOf(majorIdObj.toString());
} catch (Exception e) {
return Result.error("学科ID格式错误");
}
}
// 3. 批量更新
UpdateWrapper<CeesDormitoryInfo> updateWrapper = new UpdateWrapper<>();
updateWrapper.in("id", userIds);
@ -150,4 +149,44 @@ public class CeesDormitoryInfoServiceImpl extends ServiceImpl<CeesDormitoryInfoM
.collect(Collectors.toList());
}
// 提取公寓信息的方法
private String extractApartmentInfo(String fullDormitory) {
if (fullDormitory == null || fullDormitory.isEmpty()) {
return "";
}
// 使用正则表达式匹配"数字+公寓"的模式
java.util.regex.Matcher matcher = java.util.regex.Pattern.compile("\\d+公寓")
.matcher(fullDormitory);
if (matcher.find()) {
return matcher.group();
}
// 如果匹配失败尝试匹配不带数字的公寓
if (fullDormitory.contains("公寓")) {
return fullDormitory.substring(0, fullDormitory.indexOf("公寓") + 2);
}
return fullDormitory;
}
// 提取宿舍房间信息的方法
private String extractDormitoryRoom(String fullDormitory, String apartment) {
if (fullDormitory == null || fullDormitory.isEmpty()) {
return "";
}
// 如果有公寓信息则去掉公寓部分
if (apartment != null && !apartment.isEmpty()) {
// 确保公寓信息是以中文"公寓"结尾
if (apartment.endsWith("公寓")) {
return fullDormitory.replaceFirst(apartment, "").trim();
}
}
// 如果没有公寓信息或公寓信息格式不正确返回原字符串
return fullDormitory;
}
}

View File

@ -125,6 +125,7 @@ public class CeesWaiTeacherServiceImpl extends ServiceImpl<CeesWaiTeacherMapper,
String dormitoryName = req.getParameter("dormitoryName");
String groupName = req.getParameter("groupName");
QueryWrapper<CeesWaiTeacher> queryWrapper = QueryGenerator.initQueryWrapper(ceesWaiTeacher, req.getParameterMap());
// 3. 处理 dormitoryName 模糊查询逻辑
if (StringUtils.isNotBlank(dormitoryName)) {
// 3.1 先查询匹配的宿舍ID列表
@ -140,7 +141,8 @@ public class CeesWaiTeacherServiceImpl extends ServiceImpl<CeesWaiTeacherMapper,
queryWrapper.in("dormitory_id", dormitoryIds);
} else {
// 无匹配宿舍时返回空结果
queryWrapper.isNull("dormitory_id"); // .eq("1", "0")
// 使用一个不可能满足的条件来返回空结果
queryWrapper.in("dormitory_id", "impossible_id_" + UUID.randomUUID());
}
}
// 3. 处理 groupName 模糊查询
@ -155,7 +157,9 @@ public class CeesWaiTeacherServiceImpl extends ServiceImpl<CeesWaiTeacherMapper,
if (!groupIds.isEmpty()) {
queryWrapper.in("group_id", groupIds);
} else {
queryWrapper.isNull("group_id");
// 没有匹配的宿舍设置永假条件返回空结果
// 使用一个不可能满足的条件来返回空结果
queryWrapper.in("group_id", "impossible_id_" + UUID.randomUUID());
}
}