提交代码

This commit is contained in:
zlwu committed 2025-09-08 22:51:54 +08:00
1 parent 59c666a6f4
commit 21856615db
9 files changed
+504 -133

No files matched your search

@@ -23,6 +23,8 @@ import org.dromara.xg.domain.vo.StudentOptionVo;
import org.dromara.xg.domain.bo.StudentOptionBo; import org.dromara.xg.domain.bo.StudentOptionBo;
import org.dromara.xg.service.IXgDormApplicationService; import org.dromara.xg.service.IXgDormApplicationService;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import java.util.Map;
import java.util.HashMap;
/** /**
* 学生宿舍申请单表(调宿+退宿) * 学生宿舍申请单表(调宿+退宿)
@@ -113,4 +115,26 @@ public class XgDormApplicationController extends BaseController {
return toAjax(xgDormApplicationService.deleteWithValidByIds(List.of(ids), true)); return toAjax(xgDormApplicationService.deleteWithValidByIds(List.of(ids), true));
} }
/**
* 获取二级学院审批人列表
*
* @param collegeId 学院ID
*/
@SaCheckPermission("dormApplication:dormApplication:list")
@GetMapping("/getCollegeApprovers")
public R<List<Map<String, Object>>> getCollegeApprovers(@RequestParam Long collegeId) {
List<Map<String, Object>> approvers = xgDormApplicationService.getCollegeApprovers(collegeId);
return R.ok(approvers);
}
/**
* 获取学工处审批人列表
*/
@SaCheckPermission("dormApplication:dormApplication:list")
@GetMapping("/getStudentAffairsApprovers")
public R<List<Map<String, Object>>> getStudentAffairsApprovers() {
List<Map<String, Object>> approvers = xgDormApplicationService.getStudentAffairsApprovers();
return R.ok(approvers);
}
} }
@@ -343,4 +343,15 @@ public class XgDormBedStudentController extends BaseController {
return R.ok(currentDormInfo); return R.ok(currentDormInfo);
} }
/**
* 根据床位ID获取该床位的学生信息
* 包含学生基本信息、学院、专业、班级等信息
*/
@SaCheckPermission("dormBedStudent:dormBedStudent:list")
@GetMapping("/bedStudentInfo/{bedId}")
public R<Object> getBedStudentInfo(@NotNull(message = "床位ID不能为空") @PathVariable Long bedId) {
Object bedStudentInfo = xgDormBedStudentService.getBedStudentInfo(bedId);
return R.ok(bedStudentInfo);
}
} }
@@ -236,4 +236,47 @@ public interface XgDormBedStudentMapper extends BaseMapperPlus<XgDormBedStudent,
""") """)
Map<String, Object> selectCurrentDormInfo(@Param("studentId") Long studentId); Map<String, Object> selectCurrentDormInfo(@Param("studentId") Long studentId);
/**
* 根据床位ID获取该床位的学生信息
* 包含学生基本信息、学院、专业、班级等信息
*
* @param bedId 床位ID
* @return 床位学生信息
*/
@Select("""
SELECT
bs.student_id,
bs.bed_id,
-- 学生基本信息
s.student_no,
s.name as student_name,
s.gender,
s.phone,
-- 班级信息
c.class_name,
-- 学院信息
d.dept_name as college_name,
-- 专业信息
major.dept_name as major_name
FROM xg_dorm_bed_student bs
INNER JOIN xg_student_msg s ON bs.student_id = s.id AND s.deleted = 0
LEFT JOIN xg_class_msg c ON s.class_id = c.id AND c.deleted = 0
LEFT JOIN sys_dept d ON c.college_id = d.dept_id AND d.del_flag = '0'
LEFT JOIN sys_dept major ON c.major_id = major.dept_id AND major.del_flag = '0'
WHERE bs.bed_id = #{bedId}
AND bs.student_id IS NOT NULL
AND bs.status = '0'
AND bs.deleted = '0'
AND s.student_status = '1'
LIMIT 1
""")
Map<String, Object> selectBedStudentInfo(@Param("bedId") Long bedId);
} }
@@ -9,6 +9,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 学生宿舍申请单表(调宿+退宿)Service接口 * 学生宿舍申请单表(调宿+退宿)Service接口
@@ -77,4 +78,19 @@ public interface IXgDormApplicationService {
*/ */
TableDataInfo<StudentOptionVo> getStudentOptions(StudentOptionBo bo, PageQuery pageQuery); TableDataInfo<StudentOptionVo> getStudentOptions(StudentOptionBo bo, PageQuery pageQuery);
/**
* 获取二级学院审批人列表
*
* @param collegeId 学院ID
* @return 审批人列表
*/
List<Map<String, Object>> getCollegeApprovers(Long collegeId);
/**
* 获取学工处审批人列表
*
* @return 审批人列表
*/
List<Map<String, Object>> getStudentAffairsApprovers();
} }
@@ -251,4 +251,13 @@ public interface IXgDormBedStudentService {
* @return 当前宿舍信息 * @return 当前宿舍信息
*/ */
Object getCurrentDormInfo(Long studentId); Object getCurrentDormInfo(Long studentId);
/**
* 根据床位ID获取该床位的学生信息
* 包含学生基本信息、学院、专业、班级等信息
*
* @param bedId 床位ID
* @return 床位学生信息
*/
Object getBedStudentInfo(Long bedId);
} }
@@ -30,7 +30,12 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysDeptMapper;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.mapper.SysUserRoleMapper;
import org.dromara.system.mapper.SysRoleMapper;
import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysDept;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.SysRole;
import org.dromara.xg.mapper.XgStudentManagerMapper; import org.dromara.xg.mapper.XgStudentManagerMapper;
import org.dromara.xg.mapper.XgStudentManagerSourceMapper; import org.dromara.xg.mapper.XgStudentManagerSourceMapper;
import org.dromara.xg.mapper.XgClassMsgMapper; import org.dromara.xg.mapper.XgClassMsgMapper;
@@ -64,6 +69,9 @@ public class XgDormApplicationServiceImpl implements IXgDormApplicationService {
private final XgDormBedStudentMapper xgDormBedStudentMapper; private final XgDormBedStudentMapper xgDormBedStudentMapper;
// 添加权限过滤需要的依赖 // 添加权限过滤需要的依赖
private final SysDeptMapper sysDeptMapper; private final SysDeptMapper sysDeptMapper;
private final SysUserMapper sysUserMapper;
private final SysUserRoleMapper sysUserRoleMapper;
private final SysRoleMapper sysRoleMapper;
private final XgStudentManagerMapper xgStudentManagerMapper; private final XgStudentManagerMapper xgStudentManagerMapper;
private final XgStudentManagerSourceMapper xgStudentManagerSourceMapper; private final XgStudentManagerSourceMapper xgStudentManagerSourceMapper;
private final XgClassMsgMapper xgClassMsgMapper; private final XgClassMsgMapper xgClassMsgMapper;
@@ -493,4 +501,112 @@ public class XgDormApplicationServiceImpl implements IXgDormApplicationService {
return TableDataInfo.build(result); return TableDataInfo.build(result);
} }
/**
* 获取二级学院审批人列表
*
* @param collegeId 学院ID
* @return 审批人列表
*/
@Override
public List<Map<String, Object>> getCollegeApprovers(Long collegeId) {
try {
// 查询角色key为'ejxyssgly'的角色ID
LambdaQueryWrapper<SysRole> roleWrapper = new LambdaQueryWrapper<>();
roleWrapper.eq(SysRole::getRoleKey, "ejxyssgly");
SysRole role = sysRoleMapper.selectOne(roleWrapper);
if (role == null) {
log.warn("未找到角色key为'ejxyssgly'的角色");
return new ArrayList<>();
}
// 通过角色ID查询用户角色关系表
LambdaQueryWrapper<org.dromara.system.domain.SysUserRole> userRoleWrapper = new LambdaQueryWrapper<>();
userRoleWrapper.eq(org.dromara.system.domain.SysUserRole::getRoleId, role.getRoleId());
List<org.dromara.system.domain.SysUserRole> userRoles = sysUserRoleMapper.selectList(userRoleWrapper);
if (userRoles.isEmpty()) {
return new ArrayList<>();
}
// 获取用户ID列表
List<Long> userIds = userRoles.stream()
.map(org.dromara.system.domain.SysUserRole::getUserId)
.collect(Collectors.toList());
// 查询用户信息,过滤指定学院的用户
LambdaQueryWrapper<SysUser> userWrapper = new LambdaQueryWrapper<>();
userWrapper.in(SysUser::getUserId, userIds)
.eq(SysUser::getDeptId, collegeId)
.eq(SysUser::getStatus, "0"); // 只查询启用状态的用户
List<SysUser> users = sysUserMapper.selectList(userWrapper);
// 转换为Map格式返回
return users.stream().map(user -> {
Map<String, Object> approver = MapUtil.newHashMap();
approver.put("userId", user.getUserId());
approver.put("userName", user.getUserName());
approver.put("nickName", user.getNickName());
approver.put("deptId", user.getDeptId());
return approver;
}).collect(Collectors.toList());
} catch (Exception e) {
log.error("获取二级学院审批人列表失败", e);
return new ArrayList<>();
}
}
/**
* 获取学工处审批人列表
*
* @return 审批人列表
*/
@Override
public List<Map<String, Object>> getStudentAffairsApprovers() {
try {
// 查询角色key为'xscxsxxgly'的角色ID
LambdaQueryWrapper<SysRole> roleWrapper = new LambdaQueryWrapper<>();
roleWrapper.eq(SysRole::getRoleKey, "xscxsxxgly");
SysRole role = sysRoleMapper.selectOne(roleWrapper);
if (role == null) {
log.warn("未找到角色key为'xscxsxxgly'的角色");
return new ArrayList<>();
}
// 通过角色ID查询用户角色关系表
LambdaQueryWrapper<org.dromara.system.domain.SysUserRole> userRoleWrapper = new LambdaQueryWrapper<>();
userRoleWrapper.eq(org.dromara.system.domain.SysUserRole::getRoleId, role.getRoleId());
List<org.dromara.system.domain.SysUserRole> userRoles = sysUserRoleMapper.selectList(userRoleWrapper);
if (userRoles.isEmpty()) {
return new ArrayList<>();
}
// 获取用户ID列表
List<Long> userIds = userRoles.stream()
.map(org.dromara.system.domain.SysUserRole::getUserId)
.collect(Collectors.toList());
// 查询用户信息
LambdaQueryWrapper<SysUser> userWrapper = new LambdaQueryWrapper<>();
userWrapper.in(SysUser::getUserId, userIds)
.eq(SysUser::getStatus, "0"); // 只查询启用状态的用户
List<SysUser> users = sysUserMapper.selectList(userWrapper);
// 转换为Map格式返回
return users.stream().map(user -> {
Map<String, Object> approver = MapUtil.newHashMap();
approver.put("userId", user.getUserId());
approver.put("userName", user.getUserName());
approver.put("nickName", user.getNickName());
approver.put("deptId", user.getDeptId());
return approver;
}).collect(Collectors.toList());
} catch (Exception e) {
log.error("获取学工处审批人列表失败", e);
return new ArrayList<>();
}
}
} }
@@ -2568,4 +2568,63 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService {
} }
} }
/**
* 根据床位ID获取该床位的学生信息
* 包含学生基本信息、学院、专业、班级等信息
*
* @param bedId 床位ID
* @return 床位学生信息
*/
@Override
public Object getBedStudentInfo(Long bedId) {
try {
log.info("开始获取床位学生信息,床位ID: {}", bedId);
if (bedId == null) {
log.warn("床位ID为空,无法获取学生信息");
return null;
}
// 使用SQL关联查询,获取床位学生信息
Map<String, Object> studentInfo = baseMapper.selectBedStudentInfo(bedId);
if (studentInfo == null || studentInfo.isEmpty()) {
log.warn("床位ID: {} 未找到学生信息", bedId);
return null;
}
// 组装返回结果
Map<String, Object> result = new LinkedHashMap<>();
// 学生基本信息
result.put("studentId", studentInfo.get("student_id"));
result.put("studentNo", studentInfo.get("student_no"));
result.put("studentName", studentInfo.get("student_name"));
result.put("gender", studentInfo.get("gender"));
result.put("phone", studentInfo.get("phone"));
// 学院、专业、班级信息
result.put("collegeName", studentInfo.get("college_name"));
result.put("majorName", studentInfo.get("major_name"));
result.put("className", studentInfo.get("class_name"));
// 床位信息
result.put("bedId", studentInfo.get("bed_id"));
log.info("获取床位学生信息成功,床位ID: {}, 学生信息: {}({})-{}-{}-{}",
bedId,
result.get("studentName"),
result.get("studentNo"),
result.get("collegeName"),
result.get("majorName"),
result.get("className"));
return result;
} catch (Exception e) {
log.error("获取床位学生信息失败,床位ID: {}", bedId, e);
return null;
}
}
} }
+225 -132
View File
@@ -84,75 +84,25 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<!-- 学生信息和床位信息显示在整行 -->
<!-- 学生基础信息展示 --> <el-row v-if="form.studentId" :gutter="16">
<div v-if="form.studentId" class="student-info-display"> <el-col :span="24">
<div class="info-subtitle">学生基础信息</div> <div class="selected-student-info">
<el-row :gutter="16"> <div class="student-info-inline">
<el-col :span="4"> <div class="info-text">
<div class="info-item"> 学生信息:{{ form.studentName || '-' }} / {{ form.studentNo || '-' }} / {{ form.collegeName || '-' }} /
<span class="info-label">学生姓名:</span> {{ form.majorName || '-' }} / {{ form.className || '-' }} / {{ form.studentPhone || '-' }}
<span class="info-value">{{ form.studentName || '-' }}</span> </div>
</div> </div>
</el-col> <div class="dorm-info-inline" v-if="form.currentCampusName || form.currentBuildingName || form.currentRoomNo || form.currentBedNo">
<el-col :span="4"> <div class="info-text">
<div class="info-item"> 床位信息:{{ form.currentCampusName || '-' }} / {{ form.currentBuildingName || '-' }} / {{ form.currentRoomNo || '-' }} /
<span class="info-label">学号:</span> {{ form.currentBedNo || '-' }}
<span class="info-value">{{ form.studentNo || '-' }}</span> </div>
</div> </div>
</el-col> </div>
<el-col :span="4"> </el-col>
<div class="info-item"> </el-row>
<span class="info-label">班级名称:</span>
<span class="info-value">{{ form.className || '-' }}</span>
</div>
</el-col>
<el-col :span="4">
<div class="info-item">
<span class="info-label">联系电话:</span>
<span class="info-value">{{ form.studentPhone || '-' }}</span>
</div>
</el-col>
<el-col :span="4">
<div class="info-item">
<span class="info-label">专业名称:</span>
<span class="info-value">{{ form.majorName || '-' }}</span>
</div>
</el-col>
<el-col :span="4">
<div class="info-item">
<span class="info-label">学院名称:</span>
<span class="info-value">{{ form.collegeName || '-' }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="4">
<div class="info-item">
<span class="info-label">校区:</span>
<span class="info-value">{{ form.currentCampusName || '-' }}</span>
</div>
</el-col>
<el-col :span="4">
<div class="info-item">
<span class="info-label">宿舍楼:</span>
<span class="info-value">{{ form.currentBuildingName || '-' }}</span>
</div>
</el-col>
<el-col :span="4">
<div class="info-item">
<span class="info-label">房间号:</span>
<span class="info-value">{{ form.currentRoomNo || '-' }}</span>
</div>
</el-col>
<el-col :span="4">
<div class="info-item">
<span class="info-label">床位号:</span>
<span class="info-value">{{ form.currentBedNo || '-' }}</span>
</div>
</el-col>
</el-row>
</div>
</el-form> </el-form>
</div> </div>
</div> </div>
@@ -256,7 +206,7 @@
</el-col> </el-col>
</el-row> </el-row>
<!-- 目标床位号、紧急联系人、紧急电话一行 --> <!-- 目标床位号 -->
<el-row :gutter="16"> <el-row :gutter="16">
<el-col :span="6"> <el-col :span="6">
<el-form-item label="目标床位号" prop="targetBedId"> <el-form-item label="目标床位号" prop="targetBedId">
@@ -272,39 +222,34 @@
> >
<el-option v-for="bed in targetBedOptions" :key="bed.id" :label="bed.bedNo || bed.bedName" :value="bed.id" /> <el-option v-for="bed in targetBedOptions" :key="bed.id" :label="bed.bedNo || bed.bedName" :value="bed.id" />
</el-select> </el-select>
<!-- 目标床位学生信息显示在床位选择下方 -->
<div v-if="form.targetBedId && form.targetBedStudentName" class="target-bed-student-inline-info">
<div class="student-info-text">
学生信息:{{ form.targetBedStudentName || '-' }} / {{ form.targetBedStudentNo || '-' }} /
{{ form.targetBedStudentCollegeName || '-' }} / {{ form.targetBedStudentMajorName || '-' }} /
{{ form.targetBedStudentClassName || '-' }}
</div>
</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="18">
<el-form-item label="紧急联系人" prop="emergencyContact"> <el-form-item label="申请原因" prop="reasonDetail">
<el-input v-model="form.emergencyContact" placeholder="请输入紧急联系人" /> <el-input v-model="form.reasonDetail" placeholder="请输入详细的申请原因" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="紧急电话" prop="emergencyPhone">
<el-input v-model="form.emergencyPhone" placeholder="请输入紧急联系电话" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
<!-- 退宿申请时的紧急联系人、紧急电话 --> <!-- 退宿申请时的申请原因 -->
<div v-else> <div v-else>
<el-row :gutter="16"> <el-row :gutter="16">
<el-col :span="8"> <el-col :span="24">
<el-form-item label="紧急联系人" prop="emergencyContact"> <el-form-item label="申请原因" prop="reasonDetail">
<el-input v-model="form.emergencyContact" placeholder="请输入紧急联系人" /> <el-input v-model="form.reasonDetail" placeholder="请输入详细的申请原因" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="紧急电话" prop="emergencyPhone">
<el-input v-model="form.emergencyPhone" placeholder="请输入紧急联系电话" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
<el-form-item label="申请原因" prop="reasonDetail">
<el-input v-model="form.reasonDetail" type="textarea" :rows="3" placeholder="请输入详细的申请原因" />
</el-form-item>
<el-form-item label="上传附件"> <el-form-item label="上传附件">
<div class="attachment-upload-container"> <div class="attachment-upload-container">
<el-upload <el-upload
@@ -519,10 +464,15 @@ const form = reactive<any>({
targetRoomNo: '', targetRoomNo: '',
targetBedId: '', targetBedId: '',
targetBedNo: '', targetBedNo: '',
// 目标床位学生信息
targetBedStudentId: '',
targetBedStudentName: '',
targetBedStudentNo: '',
targetBedStudentCollegeName: '',
targetBedStudentMajorName: '',
targetBedStudentClassName: '',
applyTime: '', applyTime: '',
reasonDetail: '', reasonDetail: '',
emergencyContact: '',
emergencyPhone: '',
attachmentOssIds: '', attachmentOssIds: '',
applicationStatus: 'draft', applicationStatus: 'draft',
approvalOpinion: '', approvalOpinion: '',
@@ -924,22 +874,21 @@ const handleStartWorkFlow = async (data: DormApplicationForm) => {
let xgcsprIds: number[] = []; let xgcsprIds: number[] = [];
try { try {
// 获取二级学院审批人(role_key为'ejxyssgly'的角色) // 获取二级学院审批人
const ejxysprResponse = await request({ const ejxysprResponse = await request({
url: '/system/user/listByRoleKey', url: '/dormApplication/dormApplication/getCollegeApprovers',
method: 'get', method: 'get',
params: { roleKey: 'ejxyssgly', collegeId: data.collegeId } params: { collegeId: data.collegeId }
}); });
if (ejxysprResponse && ejxysprResponse.data) { if (ejxysprResponse && ejxysprResponse.data) {
ejxysprIds = ejxysprResponse.data.map((user: any) => user.userId); ejxysprIds = ejxysprResponse.data.map((user: any) => user.userId);
console.log('获取到二级学院审批人列表:', ejxysprIds); console.log('获取到二级学院审批人列表:', ejxysprIds);
} }
// 获取学工处审批人(role_key为'xscxsxxgly'的角色) // 获取学工处审批人
const xgcsprResponse = await request({ const xgcsprResponse = await request({
url: '/system/user/listByRoleKey', url: '/dormApplication/dormApplication/getStudentAffairsApprovers',
method: 'get', method: 'get'
params: { roleKey: 'xscxsxxgly' }
}); });
if (xgcsprResponse && xgcsprResponse.data) { if (xgcsprResponse && xgcsprResponse.data) {
xgcsprIds = xgcsprResponse.data.map((user: any) => user.userId); xgcsprIds = xgcsprResponse.data.map((user: any) => user.userId);
@@ -1087,11 +1036,21 @@ const getDormApplicationInfo = async (id: string | number) => {
// 设置状态字段映射 // 设置状态字段映射
form.status = applicationInfo.applicationStatus; form.status = applicationInfo.applicationStatus;
// 如果有学生ID,则获取学生信息 // 如果有学生ID,则获取学生信息并添加到选项中
if (applicationInfo.studentId) { if (applicationInfo.studentId) {
await getStudentInfo(applicationInfo.studentId); await getStudentInfo(applicationInfo.studentId);
// 将当前学生添加到学生选项列表中,确保下拉框能正确显示
await addCurrentStudentToOptions(applicationInfo.studentId);
} }
// 如果有目标学生ID,则将目标学生添加到选项中
if (applicationInfo.targetStudentId) {
await addCurrentTargetStudentToOptions(applicationInfo.targetStudentId);
}
// 加载目标宿舍级联选项数据(修改时必须调用)
await loadTargetCascadeOptionsForUpdate();
// 处理附件数据 // 处理附件数据
await handleAttachmentData(); await handleAttachmentData();
} else { } else {
@@ -1349,6 +1308,13 @@ const handleStudentChange = async (value: string | number) => {
form.targetRoomNo = ''; form.targetRoomNo = '';
form.targetBedId = ''; form.targetBedId = '';
form.targetBedNo = ''; form.targetBedNo = '';
// 清空目标床位学生信息
form.targetBedStudentId = '';
form.targetBedStudentName = '';
form.targetBedStudentNo = '';
form.targetBedStudentCollegeName = '';
form.targetBedStudentMajorName = '';
form.targetBedStudentClassName = '';
} }
}; };
@@ -1402,6 +1368,42 @@ const handleStudentSelectVisibleChange = (visible: boolean) => {
} }
}; };
// 将当前学生添加到学生选项列表中(用于数据回显)
const addCurrentStudentToOptions = async (studentId: string | number) => {
try {
console.log('将当前学生添加到选项列表,学生ID:', studentId);
const response = await getStudentMsg(studentId);
if (response.code === 200 && response.data) {
const studentInfo = response.data;
// 检查是否已存在该学生
const existingStudent = studentOptions.value.find((student) => student.id === studentId);
if (!existingStudent) {
// 将学生信息添加到选项列表
const studentOption: StudentOptionVO = {
id: studentInfo.id,
name: studentInfo.name || '',
studentNo: studentInfo.studentNo || '',
gender: studentInfo.gender || '',
phone: studentInfo.phone || '',
collegeId: studentInfo.collegeId,
collegeName: studentInfo.collegeName || '',
majorId: studentInfo.majorId,
majorName: studentInfo.majorName || '',
classId: studentInfo.classId,
className: studentInfo.className || ''
};
studentOptions.value = [studentOption];
console.log('当前学生已添加到选项列表:', studentOption);
}
}
} catch (error) {
console.error('添加当前学生到选项列表失败:', error);
}
};
// ==================== 目标学生选择相关方法 ==================== // ==================== 目标学生选择相关方法 ====================
// 目标学生下拉框远程搜索 // 目标学生下拉框远程搜索
@@ -1445,6 +1447,42 @@ const handleTargetStudentSelectVisibleChange = (visible: boolean) => {
} }
}; };
// 将当前目标学生添加到目标学生选项列表中(用于数据回显)
const addCurrentTargetStudentToOptions = async (targetStudentId: string | number) => {
try {
console.log('将当前目标学生添加到选项列表,学生ID:', targetStudentId);
const response = await getStudentMsg(targetStudentId);
if (response.code === 200 && response.data) {
const studentInfo = response.data;
// 检查是否已存在该学生
const existingStudent = targetStudentOptions.value.find((student) => student.id === targetStudentId);
if (!existingStudent) {
// 将学生信息添加到目标学生选项列表
const studentOption: StudentOptionVO = {
id: studentInfo.id,
name: studentInfo.name || '',
studentNo: studentInfo.studentNo || '',
gender: studentInfo.gender || '',
phone: studentInfo.phone || '',
collegeId: studentInfo.collegeId,
collegeName: studentInfo.collegeName || '',
majorId: studentInfo.majorId,
majorName: studentInfo.majorName || '',
classId: studentInfo.classId,
className: studentInfo.className || ''
};
targetStudentOptions.value = [studentOption];
console.log('当前目标学生已添加到选项列表:', studentOption);
}
}
} catch (error) {
console.error('添加当前目标学生到选项列表失败:', error);
}
};
// 加载初始目标学生数据 // 加载初始目标学生数据
const loadInitialTargetStudents = async () => { const loadInitialTargetStudents = async () => {
targetStudentLoading.value = true; targetStudentLoading.value = true;
@@ -1525,6 +1563,9 @@ const clearTargetDormInfo = () => {
form.targetBedId = ''; form.targetBedId = '';
form.targetBedNo = ''; form.targetBedNo = '';
// 清空目标床位学生信息
clearTargetBedStudentInfo();
// 清空选项 // 清空选项
targetBuildingOptions.value = []; targetBuildingOptions.value = [];
targetRoomOptions.value = []; targetRoomOptions.value = [];
@@ -1687,7 +1728,7 @@ const loadTargetBedOptions = async (roomId: string | number) => {
}; };
// 目标床位选择变化处理 // 目标床位选择变化处理
const handleTargetBedChange = (bedId: string | number) => { const handleTargetBedChange = async (bedId: string | number) => {
if (bedId) { if (bedId) {
// 设置床位名称 // 设置床位名称
const selectedBed = targetBedOptions.value.find((bed) => bed.id === bedId); const selectedBed = targetBedOptions.value.find((bed) => bed.id === bedId);
@@ -1695,9 +1736,14 @@ const handleTargetBedChange = (bedId: string | number) => {
form.targetBedId = bedId; form.targetBedId = bedId;
form.targetBedNo = selectedBed.bedNo || selectedBed.bedName; form.targetBedNo = selectedBed.bedNo || selectedBed.bedName;
} }
// 获取该床位的学生信息
await getTargetBedStudentInfo(bedId);
} else { } else {
form.targetBedId = ''; form.targetBedId = '';
form.targetBedNo = ''; form.targetBedNo = '';
// 清空目标床位学生信息
clearTargetBedStudentInfo();
} }
}; };
@@ -1715,6 +1761,11 @@ const loadTargetCascadeOptionsForUpdate = async () => {
// 如果有房间ID,加载床位选项 // 如果有房间ID,加载床位选项
if (form.targetRoomId) { if (form.targetRoomId) {
await loadTargetBedOptions(form.targetRoomId); await loadTargetBedOptions(form.targetRoomId);
// 如果有床位ID,加载床位学生信息
if (form.targetBedId) {
await getTargetBedStudentInfo(form.targetBedId);
}
} }
} }
} }
@@ -1723,6 +1774,46 @@ const loadTargetCascadeOptionsForUpdate = async () => {
} }
}; };
// 获取目标床位的学生信息
const getTargetBedStudentInfo = async (bedId: string | number) => {
try {
console.log('开始获取目标床位学生信息,床位ID:', bedId);
const response = await request({
url: `/dormBedStudent/dormBedStudent/bedStudentInfo/${bedId}`,
method: 'get'
});
if (response.code === 200 && response.data) {
const studentInfo = response.data;
console.log('获取到的目标床位学生信息:', studentInfo);
// 填充目标床位学生信息
form.targetBedStudentId = studentInfo.studentId || '';
form.targetBedStudentName = studentInfo.studentName || '';
form.targetBedStudentNo = studentInfo.studentNo || '';
form.targetBedStudentCollegeName = studentInfo.collegeName || '';
form.targetBedStudentMajorName = studentInfo.majorName || '';
form.targetBedStudentClassName = studentInfo.className || '';
} else {
console.warn('该床位暂无学生信息');
clearTargetBedStudentInfo();
}
} catch (error) {
console.error('获取目标床位学生信息失败:', error);
clearTargetBedStudentInfo();
}
};
// 清空目标床位学生信息
const clearTargetBedStudentInfo = () => {
form.targetBedStudentId = '';
form.targetBedStudentName = '';
form.targetBedStudentNo = '';
form.targetBedStudentCollegeName = '';
form.targetBedStudentMajorName = '';
form.targetBedStudentClassName = '';
};
// 初始化页面数据 // 初始化页面数据
const initPageData = () => { const initPageData = () => {
// 重置表单数据 // 重置表单数据
@@ -1759,10 +1850,15 @@ const initPageData = () => {
targetRoomNo: '', targetRoomNo: '',
targetBedId: '', targetBedId: '',
targetBedNo: '', targetBedNo: '',
// 目标床位学生信息
targetBedStudentId: '',
targetBedStudentName: '',
targetBedStudentNo: '',
targetBedStudentCollegeName: '',
targetBedStudentMajorName: '',
targetBedStudentClassName: '',
applyTime: routeParams.value.id ? '' : new Date().toISOString().slice(0, 19).replace('T', ' '), applyTime: routeParams.value.id ? '' : new Date().toISOString().slice(0, 19).replace('T', ' '),
reasonDetail: '', reasonDetail: '',
emergencyContact: '',
emergencyPhone: '',
attachmentOssIds: '', attachmentOssIds: '',
applicationStatus: 'draft', applicationStatus: 'draft',
approvalOpinion: '', approvalOpinion: '',
@@ -1804,9 +1900,10 @@ const submitCallback = async () => {
onMounted(() => { onMounted(() => {
nextTick(async () => { nextTick(async () => {
routeParams.value = (proxy as any).$route.query; routeParams.value = (proxy as any).$route.query;
initPageData(); // 先加载目标校区选项,确保级联数据回显时能找到对应的名称
// 加载目标校区选项
await loadTargetCampusOptions(); await loadTargetCampusOptions();
// 然后初始化页面数据(包含数据回显)
initPageData();
}); });
}); });
</script> </script>
@@ -1917,11 +2014,29 @@ onMounted(() => {
padding-top: 8px; padding-top: 8px;
} }
/* 学生基础信息展示样式(在学生选择区域内) */ /* 选择学生下方的学生信息显示样式 */
.student-info-display { .selected-student-info {
margin-top: 16px; margin-top: 0px;
padding-top: 12px; margin-bottom: 8px;
border-top: 1px solid #e9ecef; }
.selected-student-info .student-info-inline,
.selected-student-info .dorm-info-inline,
.target-bed-student-inline-info {
margin-bottom: 8px;
padding: 8px 12px;
background: #f8f9fa;
border-radius: 4px;
border: 1px solid #e9ecef;
}
.selected-student-info .student-info-inline .info-text,
.selected-student-info .dorm-info-inline .info-text,
.target-bed-student-inline-info .student-info-text {
font-size: 12px;
color: #606266;
line-height: 1.4;
word-break: break-word;
} }
.info-subtitle { .info-subtitle {
@@ -1933,30 +2048,6 @@ onMounted(() => {
border-bottom: 1px solid #f0f0f0; border-bottom: 1px solid #f0f0f0;
} }
.student-info-display .info-item {
display: flex;
align-items: center;
margin-bottom: 8px;
padding: 4px 0;
}
.student-info-display .info-label {
color: #606266;
font-weight: 500;
margin-right: 8px;
white-space: nowrap;
font-size: 13px;
min-width: 80px;
}
.student-info-display .info-value {
color: #303133;
font-weight: 400;
flex: 1;
word-break: break-all;
font-size: 13px;
}
.info-title { .info-title {
font-size: 16px; font-size: 16px;
font-weight: 600; font-weight: 600;
@@ -2279,4 +2370,6 @@ onMounted(() => {
min-height: 32px !important; min-height: 32px !important;
padding: 4px 12px !important; padding: 4px 12px !important;
} }
/* 目标床位学生信息内联显示样式 - 已合并到选择学生信息样式中 */
</style> </style>
+1 -1
View File
@@ -328,7 +328,7 @@ const handleAdd = () => {
const handleUpdate = async (row?: DormApplicationVO) => { const handleUpdate = async (row?: DormApplicationVO) => {
const _id = row?.id || ids.value[0]; const _id = row?.id || ids.value[0];
proxy.$router.push({ proxy.$router.push({
path: `/xg/xsjcxx/xssssq/dormEdit/index`, path: `/xg/xsjcxx/xssssq/dialog`,
query: { query: {
id: _id, id: _id,
type: 'update' type: 'update'