diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentInfoVo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentInfoVo.java index 7d5af5fc..a5eeb097 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentInfoVo.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentInfoVo.java @@ -47,17 +47,17 @@ public class ZsjyEnrollmentInfoVo implements Serializable { private String idCard; /** - * 性别(0-男 1-女) + * 性别(M/F 或 0/1) */ @ExcelProperty(value = "性别", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_gender") + @ExcelDictFormat(readConverterExp = "M=男,F=女,0=男,1=女,2=女") private String gender; /** * 是否住校(0-否 1-是) */ @ExcelProperty(value = "是否住校", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_yes_no") + @ExcelDictFormat(readConverterExp = "0=否,1=是,Y=是,N=否") private Integer isBoarding; /** diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentProcessVo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentProcessVo.java index 9d042ed6..98f7d293 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentProcessVo.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentProcessVo.java @@ -229,11 +229,26 @@ public class ZsjyEnrollmentProcessVo implements Serializable { */ private String gender; + /** + * 学院名称 - 从enrollment_info表获取 + */ + private String collegeName; + /** * 专业名称 - 从enrollment_info表获取 */ private String majorName; + /** + * 报考专业 - 从enrollment_info表获取 + */ + private String appliedMajor; + + /** + * 专业代码 - 从enrollment_info表获取 + */ + private String majorCode; + /** * 是否住校(0-否 1-是)- 从enrollment_info表获取 */ diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentRegisterExportVo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentRegisterExportVo.java index 140b21f8..979637e0 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentRegisterExportVo.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentRegisterExportVo.java @@ -35,6 +35,6 @@ public class ZsjyEnrollmentRegisterExportVo implements Serializable { @ExcelProperty(value = "预交学费") private String prepaidTuitionFlag; - @ExcelProperty(value = "备注(时间、经办人)") + @ExcelProperty(value = "录取时间") private String remarkInfo; } diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyEnrollmentProcessServiceImpl.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyEnrollmentProcessServiceImpl.java index 4d8b2584..3babe347 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyEnrollmentProcessServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyEnrollmentProcessServiceImpl.java @@ -465,24 +465,26 @@ public class ZsjyEnrollmentProcessServiceImpl implements IZsjyEnrollmentProcessS } private String buildRegisterRemark(ZsjyEnrollmentProcessVo item) { - if (StringUtils.isNotBlank(item.getRemark())) { - return item.getRemark(); + Date admissionTime = resolveAdmissionTime(item); + if (admissionTime == null) { + return ""; } - StringBuilder remark = new StringBuilder(); - Date remarkTime = item.getPaymentConfirmTime() != null ? item.getPaymentConfirmTime() - : (item.getAdmissionTime() != null ? item.getAdmissionTime() : item.getFinalAuditTime()); - if (remarkTime != null) { - remark.append(new SimpleDateFormat("M.d").format(remarkTime)); + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(admissionTime); + } + + /** + * 解析录取时间:优先录取完成时间,其次录取处理、最终确认、缴费确认时间 + */ + private Date resolveAdmissionTime(ZsjyEnrollmentProcessVo item) { + if (item.getCompletionTime() != null) { + return item.getCompletionTime(); } - String handler = StringUtils.blankToDefault(item.getAdmissionUserName(), - StringUtils.blankToDefault(item.getFinalAuditUserName(), - StringUtils.blankToDefault(item.getInfoAuditUserName(), item.getCurrentHandlerName()))); - if (StringUtils.isNotBlank(handler)) { - if (!remark.isEmpty()) { - remark.append(" "); - } - remark.append(handler); + if (item.getAdmissionTime() != null) { + return item.getAdmissionTime(); } - return remark.toString(); + if (item.getFinalAuditTime() != null) { + return item.getFinalAuditTime(); + } + return item.getPaymentConfirmTime(); } } diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyEnrollmentProcessMapper.xml b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyEnrollmentProcessMapper.xml index b1451a1e..efd44742 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyEnrollmentProcessMapper.xml +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyEnrollmentProcessMapper.xml @@ -77,7 +77,10 @@ + + + @@ -144,7 +147,13 @@ COALESCE(p.create_time, ei.create_time) as create_time, COALESCE(p.update_by, ei.update_by) as update_by, COALESCE(p.update_time, ei.update_time) as update_time, - ei.gender, ei.applied_major as majorName, ei.is_boarding as isBoarding, ei.exam_region as province + ei.gender, + ei.collage_name as collegeName, + ei.applied_major as majorName, + ei.applied_major as appliedMajor, + ei.major_code as majorCode, + ei.is_boarding as isBoarding, + ei.exam_region as province FROM zsjy_enrollment_info ei LEFT JOIN zsjy_enrollment_process p ON ei.id = p.enrollment_id AND p.deleted = '0' WHERE ei.deleted = '0' diff --git a/web/src/views/zsjy/enrollmentStatistics/components/StudentDetailDialog.vue b/web/src/views/zsjy/enrollmentStatistics/components/StudentDetailDialog.vue index eee2773c..ba42cd8e 100644 --- a/web/src/views/zsjy/enrollmentStatistics/components/StudentDetailDialog.vue +++ b/web/src/views/zsjy/enrollmentStatistics/components/StudentDetailDialog.vue @@ -11,7 +11,7 @@ {{ studentData.studentName || studentData.name || '-' }} {{ formatIdCard(studentData.idCard) }} - {{ studentData.gender === 'M' ? '男' : '女' }} + {{ formatGender(studentData.gender, studentData.idCard) }} {{ formatDate(studentData.birthDate) }} {{ studentData.phone1 || '-' }} {{ studentData.phone2 || '-' }} @@ -54,6 +54,9 @@ + {{ + studentData.collegeName || studentData.college_name || studentData.collage_name || '-' + }} {{ studentData.majorName || studentData.appliedMajor || '-' }} {{ studentData.majorCode || '-' }} {{ studentData.uniformSize || '-' }} @@ -166,13 +169,6 @@ const dialogVisible = computed({ } }); -// 判断学生是否已完成 -const isStudentCompleted = computed(() => { - const isCompleted = props.studentData.isCompleted; - // 显式检查字符串和数字类型的值 - return String(isCompleted) === '1'; -}); - // 格式化身份证号(隐藏中间部分) const formatIdCard = (idCard: string | undefined) => { if (!idCard) return '-'; @@ -182,6 +178,24 @@ const formatIdCard = (idCard: string | undefined) => { return idCard; }; +// 判断学生是否已完成 +const isStudentCompleted = computed(() => { + const isCompleted = props.studentData.isCompleted; + return String(isCompleted) === '1'; +}); + +const formatGender = (gender?: string, idCard?: string) => { + if (gender === 'M' || gender === '0') return '男'; + if (gender === 'F' || gender === '1') return '女'; + if (idCard && idCard.length >= 17) { + const code = parseInt(idCard.charAt(16), 10); + if (!Number.isNaN(code)) { + return code % 2 === 0 ? '女' : '男'; + } + } + return gender || '-'; +}; + // 格式化日期 const formatDate = (date: string | Date | undefined) => { if (!date) return '-'; diff --git a/web/src/views/zsjy/enrollmentStatistics/index.vue b/web/src/views/zsjy/enrollmentStatistics/index.vue index 9cb10e90..eabaf748 100644 --- a/web/src/views/zsjy/enrollmentStatistics/index.vue +++ b/web/src/views/zsjy/enrollmentStatistics/index.vue @@ -116,17 +116,17 @@ @@ -174,6 +174,7 @@ import { EnrollmentProcessVO, getEnrollmentProcess } from '@/api/zsjy/enrollmentProcess'; +import { getEnrollmentInfo } from '@/api/zsjy/enrollment'; import { listDept } from '@/api/system/dept'; import type { DeptVO } from '@/api/system/dept/types'; import StudentDetailDialog from './components/StudentDetailDialog.vue'; @@ -511,59 +512,67 @@ const handleExport = () => { const handleView = async (row: EnrollmentProcessVO) => { detailLoading.value = true; try { - let processData: any = {}; + let processData: any = { ...row }; - // 如果是从报名信息表里直接获取的数据(可能没有流程ID) if (row.id) { const res = await getEnrollmentProcess(row.id); - if (res && res.code === 200) { - processData = res.data; - } else { - // 回退到使用行数据 - processData = { ...row }; + if (res && res.code === 200 && res.data) { + processData = { ...processData, ...res.data }; + } + } + + const enrollmentId = processData.enrollmentId || row.enrollmentId; + if (enrollmentId) { + const infoRes = await getEnrollmentInfo(enrollmentId); + if (infoRes?.code === 200 && infoRes.data) { + const info = infoRes.data; + processData = { + ...processData, + ...info, + studentName: processData.studentName || info.name, + collegeName: info.collegeName || processData.collegeName, + majorName: info.appliedMajor || processData.majorName, + appliedMajor: info.appliedMajor || processData.appliedMajor, + applicationTime: info.applicationTime || processData.applicationTime + }; } - } else { - // 使用行数据(可能是从enrollment_info表里直接获取的) - processData = { ...row }; } - // 处理完成状态,确保它是字符串类型 if (processData.isCompleted !== undefined) { processData.isCompleted = String(processData.isCompleted); } - // 处理缴费状态,确保它不为空 if (processData.paymentStatus === undefined || processData.paymentStatus === null) { - processData.paymentStatus = '0'; // 默认为未缴费 + processData.paymentStatus = '0'; } - // 设置当前流程数据 currentStudent.value = processData; - - // 打开详情对话框 detailDialogVisible.value = true; } catch (error) { console.error('获取流程详情失败:', error); - // 即使获取详情失败,也尝试使用行数据显示 - const processData = { ...row }; - - // 处理完成状态,确保它是字符串类型 - if (processData.isCompleted !== undefined) { - processData.isCompleted = String(processData.isCompleted); - } - - // 处理缴费状态,确保它不为空 - if (processData.paymentStatus === undefined || processData.paymentStatus === null) { - processData.paymentStatus = '0'; // 默认为未缴费 - } - - currentStudent.value = processData; + currentStudent.value = { + ...row, + isCompleted: row.isCompleted !== undefined ? String(row.isCompleted) : undefined, + paymentStatus: row.paymentStatus ?? '0' + }; detailDialogVisible.value = true; } finally { detailLoading.value = false; } }; +const formatGender = (gender?: string, idCard?: string) => { + if (gender === 'M' || gender === '0') return '男'; + if (gender === 'F' || gender === '1') return '女'; + if (idCard && idCard.length >= 17) { + const code = parseInt(idCard.charAt(16), 10); + if (!Number.isNaN(code)) { + return code % 2 === 0 ? '女' : '男'; + } + } + return gender || '-'; +}; + // 格式化身份证号(隐藏中间部分) const formatIdCard = (row: any) => { if (!row.idCard) return '';