提交代码

This commit is contained in:
zlwu committed 2025-08-21 20:05:42 +08:00
1 parent 62c953ab72
commit f71eada96c
5 files changed
+462 -341

No files matched your search

@@ -59,6 +59,20 @@ public class XskhAssessmentApprovalVo implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
/**
* 数据统计开始时间
*/
@ExcelProperty(value = "数据统计开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataStartTime;
/**
* 数据统计结束时间
*/
@ExcelProperty(value = "数据统计结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataEndTime;
/**
* 学生ID
*/
@@ -218,4 +232,4 @@ public class XskhAssessmentApprovalVo implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
}
@@ -38,6 +38,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="scheduleName" column="schedule_name"/>
<result property="startTime" column="start_time"/>
<result property="endTime" column="end_time"/>
<result property="dataStartTime" column="data_start_time"/>
<result property="dataEndTime" column="data_end_time"/>
<result property="studentId" column="student_id"/>
<result property="studentNo" column="student_no"/>
<result property="studentName" column="student_name"/>
@@ -66,10 +68,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 查询班主任班级下的考核申请列表 -->
<select id="selectTeacherClassApplications" resultMap="XskhAssessmentApprovalResultVo">
SELECT
SELECT
a.id,
a.schedule_id,
s.schedule_name,
s.start_time,
s.end_time,
s.data_start_time,
s.data_end_time,
a.student_id,
a.student_no,
a.student_name,
@@ -104,10 +110,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
LEFT JOIN sys_user u ON a.teacher_approval_by = u.user_id
WHERE a.deleted = 0
AND a.class_id IN (
SELECT id
FROM xg_class_msg
WHERE class_teacher_id = #{teacherId}
AND deleted = 0
SELECT id
FROM xg_class_msg
WHERE class_teacher_id = #{teacherId}
AND deleted = 0
AND class_status = '1'
)
<if test="scheduleId != null">
@@ -128,12 +134,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 根据ID查询考核申请详细信息(包含考核计划信息) -->
<select id="selectApprovalDetailById" resultMap="XskhAssessmentApprovalResultVo">
SELECT
SELECT
a.id,
a.schedule_id,
s.schedule_name,
s.start_time,
s.end_time,
s.data_start_time,
s.data_end_time,
a.student_id,
a.student_no,
a.student_name,
@@ -172,4 +180,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND a.tenant_id = '000000'
</select>
</mapper>
</mapper>
+5 -1
View File
@@ -142,6 +142,10 @@ export interface XskhAssessmentApprovalForm extends BaseEntity {
startTime?: string;
/** 结束时间 */
endTime?: string;
/** 数据统计开始时间 */
dataStartTime?: string;
/** 数据统计结束时间 */
dataEndTime?: string;
/** 自评得分 */
selfScore?: number;
/** 班主任评分 */
@@ -408,4 +412,4 @@ export interface AssessmentScheduleOption {
status: string;
/** 状态名称 */
statusName: string;
}
}
@@ -374,6 +374,8 @@
:indicator-name="currentIndicatorData.indicatorName"
:student-id="form.studentId"
:schedule-id="form.scheduleId"
:start-time="form.startTime"
:end-time="form.endTime"
:data-start-time="form.dataStartTime"
:data-end-time="form.dataEndTime"
/>
@@ -1076,6 +1078,9 @@ const openDialog = async (id?: string | number, title?: string, schedule?: Asses
if (schedule) {
form.value.dataStartTime = schedule.dataStartTime;
form.value.dataEndTime = schedule.dataEndTime;
form.value.startTime = schedule.startTime;
form.value.endTime = schedule.endTime;
form.value.scheduleName = schedule.scheduleName;
console.log('重新设置时间字段 - dataStartTime:', form.value.dataStartTime);
console.log('重新设置时间字段 - dataEndTime:', form.value.dataEndTime);
}
@@ -1143,6 +1148,9 @@ const openDialog = async (id?: string | number, title?: string, schedule?: Asses
form.value.dataEndTime = schedule.dataEndTime;
console.log('重新设置时间字段 - dataStartTime:', form.value.dataStartTime);
console.log('重新设置时间字段 - dataEndTime:', form.value.dataEndTime);
form.value.startTime = schedule.startTime;
form.value.endTime = schedule.endTime;
form.value.scheduleName = schedule.scheduleName;
}
// 确保自评得分列表正确回显
@@ -1438,7 +1446,9 @@ const handleViewIndicatorData = (row: XskhAssessmentSelfScoreForm) => {
indicatorId: currentIndicatorData.indicatorId,
indicatorName: currentIndicatorData.indicatorName,
dataStartTime: form.value.dataStartTime,
dataEndTime: form.value.dataEndTime
dataEndTime: form.value.dataEndTime,
startTime: form.value.startTime,
endTime: form.value.endTime
});
indicatorDataDialogRef.value?.openDialog();
});
@@ -1,352 +1,382 @@
<template>
<el-dialog :title="dialog.title" v-model="dialog.visible" width="1400px" append-to-body destroy-on-close :class="{ 'view-mode': isViewMode }">
<!-- 页面加载效果 -->
<div
v-loading="pageLoading"
element-loading-text="正在加载考核申请数据..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
>
<el-form ref="assessmentApprovalFormRef" :model="form" :rules="rules" label-width="120px">
<!-- 上部分:基础信息 -->
<el-card class="mb-4" shadow="never">
<template #header>
<div class="card-header">
<span>基础信息</span>
</div>
</template>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="考核计划名称">
<div class="info-display">{{ form.scheduleName || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="学号">
<div class="info-display">{{ form.studentNo || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="学生姓名">
<div class="info-display">{{ form.studentName || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="学院名称">
<div class="info-display">{{ form.collegeName || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="专业名称">
<div class="info-display">{{ form.majorName || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="班级名称">
<div class="info-display">{{ form.className || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="开始时间">
<div class="info-display">{{ form.startTime || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="结束时间">
<div class="info-display">{{ form.endTime || '暂无' }}</div>
</el-form-item>
<div>
<el-dialog :title="dialog.title" v-model="dialog.visible" width="1400px" append-to-body destroy-on-close :class="{ 'view-mode': isViewMode }">
<!-- 页面加载效果 -->
<div
v-loading="pageLoading"
element-loading-text="正在加载考核申请数据..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
>
<el-form ref="assessmentApprovalFormRef" :model="form" :rules="rules" label-width="120px">
<!-- 上部分:基础信息 -->
<el-card class="mb-4" shadow="never">
<template #header>
<div class="card-header">
<span>基础信息</span>
</div>
</template>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="考核计划名称">
<div class="info-display">{{ form.scheduleName || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="学号">
<div class="info-display">{{ form.studentNo || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="学生姓名">
<div class="info-display">{{ form.studentName || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="学院名称">
<div class="info-display">{{ form.collegeName || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="专业名称">
<div class="info-display">{{ form.majorName || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="班级名称">
<div class="info-display">{{ form.className || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="开始时间">
<div class="info-display">{{ form.startTime || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="结束时间">
<div class="info-display">{{ form.endTime || '暂无' }}</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
<!-- 中间部分:指标模块和附加分模块 -->
<el-row :gutter="20" class="mb-4">
<!-- 指标模块 -->
<el-col :span="24">
<el-card shadow="never">
<template #header>
<div class="card-header">
<span>指标模块</span>
</div>
</template>
<el-table :data="form.selfScoreList" border style="width: 100%">
<el-table-column label="指标名称" prop="indicatorName" min-width="120">
<template #default="scope">
<div class="indicator-name-cell">
<span>{{ scope.row.indicatorName }}</span>
<el-button
type="info"
size="small"
:icon="View"
circle
@click="handleViewIndicatorData(scope.row)"
title="查看学生数据"
class="indicator-data-btn"
/>
</div>
</template>
</el-table-column>
<el-table-column label="指标编码" prop="indicatorCode" min-width="100" />
<el-table-column label="指标说明" prop="description" min-width="150" show-overflow-tooltip />
<el-table-column label="最高分值" prop="maxScore" min-width="80" />
<el-table-column label="自评得分" width="100">
<template #default="scope">
<div class="score-display">
{{ scope.row.selfScore || '0' }}
</div>
</template>
</el-table-column>
<el-table-column label="自评备注" min-width="120">
<template #default="scope">
<div class="remark-display">
{{ scope.row.selfRemark || '暂无备注' }}
</div>
</template>
</el-table-column>
<el-table-column label="班主任评分" width="100">
<template #default="scope">
<div v-if="isViewMode" class="score-display">
{{ scope.row.teacherScore || '0' }}
</div>
<el-input
v-else
v-model="scope.row.teacherScore"
type="number"
:min="0"
:max="scope.row.maxScore"
:step="0.1"
@input="calculateTotalScore"
style="width: 100%"
/>
</template>
</el-table-column>
<el-table-column label="班主任备注" min-width="120">
<template #default="scope">
<div v-if="isViewMode" class="remark-display">
{{ scope.row.teacherRemark || '暂无备注' }}
</div>
<el-input v-else v-model="scope.row.teacherRemark" type="textarea" :rows="2" />
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
</el-card>
<!-- 中间部分:指标模块和附加分模块 -->
<el-row :gutter="20" class="mb-4">
<!-- 指标模块 -->
<el-col :span="24">
<el-card shadow="never">
<template #header>
<div class="card-header">
<span>指标模块</span>
</div>
</template>
<el-table :data="form.selfScoreList" border style="width: 100%">
<el-table-column label="指标名称" prop="indicatorName" min-width="120" />
<el-table-column label="指标编码" prop="indicatorCode" min-width="100" />
<el-table-column label="指标说明" prop="description" min-width="150" show-overflow-tooltip />
<el-table-column label="最高分值" prop="maxScore" min-width="80" />
<el-table-column label="自评得分" width="100">
<template #default="scope">
<div class="score-display">
{{ scope.row.selfScore || '0' }}
</div>
</template>
</el-table-column>
<el-table-column label="自评备注" min-width="120">
<template #default="scope">
<div class="remark-display">
{{ scope.row.selfRemark || '暂无备注' }}
</div>
</template>
</el-table-column>
<el-table-column label="班主任评分" width="100">
<template #default="scope">
<div v-if="isViewMode" class="score-display">
{{ scope.row.teacherScore || '0' }}
</div>
<el-input
v-else
v-model="scope.row.teacherScore"
type="number"
:min="0"
:max="scope.row.maxScore"
:step="0.1"
@input="calculateTotalScore"
style="width: 100%"
/>
</template>
</el-table-column>
<el-table-column label="班主任备注" min-width="120">
<template #default="scope">
<div v-if="isViewMode" class="remark-display">
{{ scope.row.teacherRemark || '暂无备注' }}
</div>
<el-input v-else v-model="scope.row.teacherRemark" type="textarea" :rows="2" />
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
<!-- 附加分模块 -->
<el-card shadow="never" class="mb-4">
<template #header>
<div class="card-header">
<span>附加分模块</span>
</div>
</template>
<div v-for="(item, index) in form.bonusApprovalList" :key="index" class="bonus-item mb-3">
<el-card shadow="hover">
<template #header>
<div class="bonus-item-header">
<span>附加分项目 {{ index + 1 }}</span>
</div>
</template>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="项目名称">
<div class="info-display">{{ item.bonusName || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="附加分值">
<div class="score-display">{{ item.bonusScore || '0' }}</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附加分内容">
<div class="remark-display">{{ item.bonusContent || '暂无内容' }}</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件">
<div class="attachment-upload-container">
<el-upload
:file-list="item.fileList || []"
class="upload-demo"
drag
list-type="picture-card"
:on-preview="(file) => handleFilePreview(file, item)"
:action="uploadAction"
:headers="uploadHeaders"
:data="uploadData"
:auto-upload="true"
:before-upload="(file) => handleBeforeUpload(file, item)"
:on-success="(response, file) => handleUploadSuccess(response, file, item)"
:on-error="(error, file) => handleUploadError(error, file, item)"
:on-remove="(file) => handleRemoveAttachmentConfirm(file, item)"
:on-change="(file, fileList) => handleFileChange(file, fileList, item)"
multiple
:limit="15"
:show-file-list="true"
accept="image/*,video/*,.pdf,.doc,.docx,.txt"
:disabled="isViewMode"
>
<template #tip>
<div class="el-upload__tip">支持图片、视频、PDF、Word文档等格式,单个文件大小不超过10MB,最多上传15个文件。</div>
</template>
<!-- 附加分模块 -->
<el-card shadow="never" class="mb-4">
<template #header>
<div class="card-header">
<span>附加分模块</span>
</div>
</template>
<div v-for="(item, index) in form.bonusApprovalList" :key="index" class="bonus-item mb-3">
<el-card shadow="hover">
<template #header>
<div class="bonus-item-header">
<span>附加分项目 {{ index + 1 }}</span>
</div>
</template>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="项目名称">
<div class="info-display">{{ item.bonusName || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="附加分值">
<div class="score-display">{{ item.bonusScore || '0' }}</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附加分内容">
<div class="remark-display">{{ item.bonusContent || '暂无内容' }}</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件">
<div class="attachment-upload-container">
<el-upload
:file-list="item.fileList || []"
class="upload-demo"
drag
list-type="picture-card"
:on-preview="(file) => handleFilePreview(file, item)"
:action="uploadAction"
:headers="uploadHeaders"
:data="uploadData"
:auto-upload="true"
:before-upload="(file) => handleBeforeUpload(file, item)"
:on-success="(response, file) => handleUploadSuccess(response, file, item)"
:on-error="(error, file) => handleUploadError(error, file, item)"
:on-remove="(file) => handleRemoveAttachmentConfirm(file, item)"
:on-change="(file, fileList) => handleFileChange(file, fileList, item)"
multiple
:limit="15"
:show-file-list="true"
accept="image/*,video/*,.pdf,.doc,.docx,.txt"
:disabled="isViewMode"
>
<template #tip>
<div class="el-upload__tip">支持图片、视频、PDF、Word文档等格式,单个文件大小不超过10MB,最多上传15个文件。</div>
</template>
<!-- 调整拖拽上传图标与文字在同一行、居中对齐 -->
<div class="el-upload-dragger1">
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</div>
<!-- 自定义文件卡片缩略图(含文件名) -->
<template #file="{ file }">
<div class="upload-file-card">
<!-- 缩略图区域 -->
<div class="upload-file-thumb">
<image-preview
v-if="isImageFile(file) && file.url"
:src="getFileOssId(file)"
class="upload-thumb-image"
:isOssId="true"
/>
<div v-else class="upload-file-placeholder">
<el-icon><Document /></el-icon>
<span class="file-ext">{{ getFileExt(file.name) }}</span>
</div>
<!-- loading 遮罩只在上传中显示 -->
<div v-if="file.status === 'uploading'" class="upload-file-loading">
<el-icon class="is-loading"><Loading /></el-icon>
<span class="loading-text">上传中...</span>
</div>
</div>
<!-- 文件名称 -->
<div class="upload-file-name" :title="file.name">
{{ getShortFileName(file.name) }}
</div>
<!-- 操作按钮区域 - 固定在文件名下方 -->
<div class="upload-file-card-actions" v-if="file.status && file.status !== 'ready'">
<el-button-group size="small">
<el-button
type="success"
@click.stop="handleDownloadAttachment(file)"
title="下载"
:disabled="file.status !== 'success'"
>
<el-icon><Download /></el-icon>
</el-button>
<el-button v-if="!isViewMode" type="danger" @click.stop="handleRemoveAttachmentConfirm(file, item)" title="删除">
<el-icon><Delete /></el-icon>
</el-button>
</el-button-group>
</div>
<!-- 调整拖拽上传图标与文字在同一行、居中对齐 -->
<div class="el-upload-dragger1">
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</div>
</template>
</el-upload>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核状态">
<div v-if="isViewMode" class="info-display">
<el-tag :type="getBonusStatusTagType(item.status)">
{{ getBonusStatusText(item.status) }}
</el-tag>
</div>
<el-select v-else v-model="item.status" @change="handleBonusStatusChange(item)" style="width: 100%">
<el-option label="待审核" value="1" />
<el-option label="审核通过" value="2" />
<el-option label="审核拒绝" value="3" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核得分">
<div v-if="isViewMode" class="score-display">
{{ item.approvalScore || '0' }}
</div>
<el-input
v-else
v-model="item.approvalScore"
type="number"
:min="0"
:step="0.1"
@input="handleBonusScoreChange(item)"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核备注">
<div v-if="isViewMode" class="remark-display">
{{ item.approvalRemark || '暂无备注' }}
</div>
<el-input v-else v-model="item.approvalRemark" type="textarea" :rows="2" />
</el-form-item>
</el-col>
</el-row>
</el-card>
</div>
</el-card>
<!-- 下部分:得分统计 -->
<el-card shadow="never">
<template #header>
<div class="card-header">
<span>得分统计</span>
<!-- 自定义文件卡片缩略图(含文件名) -->
<template #file="{ file }">
<div class="upload-file-card">
<!-- 缩略图区域 -->
<div class="upload-file-thumb">
<image-preview
v-if="isImageFile(file) && file.url"
:src="getFileOssId(file)"
class="upload-thumb-image"
:isOssId="true"
/>
<div v-else class="upload-file-placeholder">
<el-icon><Document /></el-icon>
<span class="file-ext">{{ getFileExt(file.name) }}</span>
</div>
<!-- loading 遮罩只在上传中显示 -->
<div v-if="file.status === 'uploading'" class="upload-file-loading">
<el-icon class="is-loading"><Loading /></el-icon>
<span class="loading-text">上传中...</span>
</div>
</div>
<!-- 文件名称 -->
<div class="upload-file-name" :title="file.name">
{{ getShortFileName(file.name) }}
</div>
<!-- 操作按钮区域 - 固定在文件名下方 -->
<div class="upload-file-card-actions" v-if="file.status && file.status !== 'ready'">
<el-button-group size="small">
<el-button
type="success"
@click.stop="handleDownloadAttachment(file)"
title="下载"
:disabled="file.status !== 'success'"
>
<el-icon><Download /></el-icon>
</el-button>
<el-button v-if="!isViewMode" type="danger" @click.stop="handleRemoveAttachmentConfirm(file, item)" title="删除">
<el-icon><Delete /></el-icon>
</el-button>
</el-button-group>
</div>
</div>
</template>
</el-upload>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核状态">
<div v-if="isViewMode" class="info-display">
<el-tag :type="getBonusStatusTagType(item.status)">
{{ getBonusStatusText(item.status) }}
</el-tag>
</div>
<el-select v-else v-model="item.status" @change="handleBonusStatusChange(item)" style="width: 100%">
<el-option label="待审核" value="1" />
<el-option label="审核通过" value="2" />
<el-option label="审核拒绝" value="3" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核得分">
<div v-if="isViewMode" class="score-display">
{{ item.approvalScore || '0' }}
</div>
<el-input
v-else
v-model="item.approvalScore"
type="number"
:min="0"
:step="0.1"
@input="handleBonusScoreChange(item)"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核备注">
<div v-if="isViewMode" class="remark-display">
{{ item.approvalRemark || '暂无备注' }}
</div>
<el-input v-else v-model="item.approvalRemark" type="textarea" :rows="2" />
</el-form-item>
</el-col>
</el-row>
</el-card>
</div>
</template>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="自评总得分">
<div class="total-score-display">
{{ form.selfScore || '0' }}
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="班主任评分">
<div class="total-score-display">
{{ form.teacherScore || '0' }}
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="总得分">
<div class="total-score-display">
{{ form.totalScore || '0' }}
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="考核状态">
<el-tag :type="getStatusTagType(form.status)">
{{ getStatusText(form.status) }}
</el-tag>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="自评备注">
<div class="remark-display" :class="{ 'empty-remark': !form.selfRemark }">
{{ form.selfRemark || '暂无备注' }}
</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="班主任审核备注">
<div v-if="isViewMode" class="remark-display">
{{ form.teacherApprovalRemark || '暂无备注' }}
</div>
<el-input v-else v-model="form.teacherApprovalRemark" type="textarea" :rows="3" />
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</div>
<template #footer>
<div class="dialog-footer">
<el-button type="success" @click="handleApprove" v-if="!isViewMode">审核通过</el-button>
<el-button @click="cancel">取 消</el-button>
</el-card>
<!-- 下部分:得分统计 -->
<el-card shadow="never">
<template #header>
<div class="card-header">
<span>得分统计</span>
</div>
</template>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="自评总得分">
<div class="total-score-display">
{{ form.selfScore || '0' }}
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="班主任评分">
<div class="total-score-display">
{{ form.teacherScore || '0' }}
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="总得分">
<div class="total-score-display">
{{ form.totalScore || '0' }}
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="考核状态">
<el-tag :type="getStatusTagType(form.status)">
{{ getStatusText(form.status) }}
</el-tag>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="自评备注">
<div class="remark-display" :class="{ 'empty-remark': !form.selfRemark }">
{{ form.selfRemark || '暂无备注' }}
</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="班主任审核备注">
<div v-if="isViewMode" class="remark-display">
{{ form.teacherApprovalRemark || '暂无备注' }}
</div>
<el-input v-else v-model="form.teacherApprovalRemark" type="textarea" :rows="3" />
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</div>
</template>
</el-dialog>
<template #footer>
<div class="dialog-footer">
<el-button type="success" @click="handleApprove" v-if="!isViewMode">审核通过</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
<!-- 指标数据详情弹窗 -->
<IndicatorDataDialog
ref="indicatorDataDialogRef"
:indicator-id="currentIndicatorData.indicatorId"
:indicator-name="currentIndicatorData.indicatorName"
:student-id="form.studentId"
:schedule-id="form.scheduleId"
:data-start-time="form.dataStartTime"
:data-end-time="form.dataEndTime"
/>
</div>
</template>
<script setup name="AssessmentApprovalForm" lang="ts">
import { ref, reactive, toRefs, getCurrentInstance, ComponentInternalInstance, computed } from 'vue';
import { ref, reactive, toRefs, getCurrentInstance, ComponentInternalInstance, computed, nextTick, defineAsyncComponent } from 'vue';
import ElMessage from 'element-plus/es/components/message/index';
import ElMessageBox from 'element-plus/es/components/message-box/index';
import ElLoading from 'element-plus/es/components/loading/index';
import { UploadFilled, Document, Loading, Download, Delete } from '@element-plus/icons-vue';
import { UploadFilled, Document, Loading, Download, Delete, View } from '@element-plus/icons-vue';
import { getToken } from '@/utils/auth';
import ImagePreview from '@/components/ImagePreview/index.vue';
import { getAssessmentApproval, approveAssessmentApplication } from '@/api/xskh/assessmentApproval/assessmentApproval';
// 动态导入IndicatorDataDialog组件
const IndicatorDataDialog = defineAsyncComponent(() => import('../assessmentApplication/IndicatorDataDialog.vue'));
import {
XskhAssessmentApprovalForm,
XskhAssessmentSelfScoreForm,
@@ -379,10 +409,17 @@ declare global {
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const assessmentApprovalFormRef = ref();
const indicatorDataDialogRef = ref();
// 页面加载状态
const pageLoading = ref(false);
// 当前指标数据
const currentIndicatorData = reactive({
indicatorId: undefined as string | number | undefined,
indicatorName: ''
});
const dialog = reactive({
visible: false,
title: ''
@@ -420,6 +457,8 @@ const initFormData: XskhAssessmentApprovalForm = {
scheduleName: undefined,
startTime: undefined,
endTime: undefined,
dataStartTime: undefined,
dataEndTime: undefined,
selfScore: 0,
teacherScore: 0,
totalScore: 0,
@@ -980,6 +1019,40 @@ const handleApprove = async () => {
});
};
/** 查看指标数据 */
const handleViewIndicatorData = (row: XskhAssessmentSelfScoreForm) => {
console.log('点击查看指标数据:', {
indicatorId: row.indicatorId,
indicatorName: row.indicatorName,
currentIndicatorId: currentIndicatorData.indicatorId,
dataStartTime: form.value.dataStartTime,
dataEndTime: form.value.dataEndTime
});
// 直接设置新的指标数据
currentIndicatorData.indicatorId = row.indicatorId;
currentIndicatorData.indicatorName = row.indicatorName || '';
console.log('设置新的指标数据:', {
indicatorId: currentIndicatorData.indicatorId,
indicatorName: currentIndicatorData.indicatorName,
dataStartTime: form.value.dataStartTime,
dataEndTime: form.value.dataEndTime
});
// 使用nextTick确保DOM更新后再打开弹窗
nextTick(() => {
// 再次确认数据已更新
console.log('准备打开弹窗,当前指标数据:', {
indicatorId: currentIndicatorData.indicatorId,
indicatorName: currentIndicatorData.indicatorName,
dataStartTime: form.value.dataStartTime,
dataEndTime: form.value.dataEndTime
});
indicatorDataDialogRef.value?.openDialog();
});
};
/** 取消按钮 */
const cancel = () => {
dialog.visible = false;
@@ -1387,4 +1460,16 @@ defineExpose({
:deep(.el-loading-spinner) {
color: #409eff !important;
}
/* 指标名称单元格样式 */
.indicator-name-cell {
display: flex;
align-items: center;
gap: 8px;
}
.indicator-data-btn {
flex-shrink: 0;
margin-left: 4px;
}
</style>