提交代码
This commit is contained in:
1 parent
62c953ab72
commit
f71eada96c
5 files changed
+462
-341
No files matched your search
+15
-1
@@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
+15
-7
@@ -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>
|
||||
@@ -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>
|
||||
Reference in new issue
Block a user