|
|
@@ -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>
|
|
|
-
|
|
|
- <!-- 调整拖拽上传图标与文字在同一行、居中对齐 -->
|
|
|
- <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>
|
|
|
+
|
|
|
+ <!-- 附加分模块 -->
|
|
|
+ <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>
|
|
|
|
|
|
- <!-- 文件名称 -->
|
|
|
- <div class="upload-file-name" :title="file.name">
|
|
|
- {{ getShortFileName(file.name) }}
|
|
|
- </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 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>
|
|
|
- </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>
|
|
|
+ </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>
|