Kaynağa Gözat

提交代码

zlwu 1 yıl önce
ebeveyn
işleme
f71eada96c

+ 15 - 1
backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhAssessmentApprovalVo.java

@@ -59,6 +59,20 @@ public class XskhAssessmentApprovalVo implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date endTime;
     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
      * 学生ID
      */
      */
@@ -218,4 +232,4 @@ public class XskhAssessmentApprovalVo implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
     private Date updateTime;
 
 
-}
+}

+ 15 - 7
backend/ruoyi-modules/ruoyi-xskh/src/main/resources/mapper/xskh/XskhAssessmentApprovalMapper.xml

@@ -38,6 +38,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="scheduleName" column="schedule_name"/>
         <result property="scheduleName" column="schedule_name"/>
         <result property="startTime" column="start_time"/>
         <result property="startTime" column="start_time"/>
         <result property="endTime" column="end_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="studentId" column="student_id"/>
         <result property="studentNo" column="student_no"/>
         <result property="studentNo" column="student_no"/>
         <result property="studentName" column="student_name"/>
         <result property="studentName" column="student_name"/>
@@ -66,10 +68,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
 
     <!-- 查询班主任班级下的考核申请列表 -->
     <!-- 查询班主任班级下的考核申请列表 -->
     <select id="selectTeacherClassApplications" resultMap="XskhAssessmentApprovalResultVo">
     <select id="selectTeacherClassApplications" resultMap="XskhAssessmentApprovalResultVo">
-        SELECT 
+        SELECT
             a.id,
             a.id,
             a.schedule_id,
             a.schedule_id,
             s.schedule_name,
             s.schedule_name,
+            s.start_time,
+            s.end_time,
+            s.data_start_time,
+            s.data_end_time,
             a.student_id,
             a.student_id,
             a.student_no,
             a.student_no,
             a.student_name,
             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
         LEFT JOIN sys_user u ON a.teacher_approval_by = u.user_id
         WHERE a.deleted = 0
         WHERE a.deleted = 0
         AND a.class_id IN (
         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'
             AND class_status = '1'
         )
         )
         <if test="scheduleId != null">
         <if test="scheduleId != null">
@@ -128,12 +134,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
 
     <!-- 根据ID查询考核申请详细信息(包含考核计划信息) -->
     <!-- 根据ID查询考核申请详细信息(包含考核计划信息) -->
     <select id="selectApprovalDetailById" resultMap="XskhAssessmentApprovalResultVo">
     <select id="selectApprovalDetailById" resultMap="XskhAssessmentApprovalResultVo">
-        SELECT 
+        SELECT
             a.id,
             a.id,
             a.schedule_id,
             a.schedule_id,
             s.schedule_name,
             s.schedule_name,
             s.start_time,
             s.start_time,
             s.end_time,
             s.end_time,
+            s.data_start_time,
+            s.data_end_time,
             a.student_id,
             a.student_id,
             a.student_no,
             a.student_no,
             a.student_name,
             a.student_name,
@@ -172,4 +180,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         AND a.tenant_id = '000000'
         AND a.tenant_id = '000000'
     </select>
     </select>
 
 
-</mapper> 
+</mapper>

+ 5 - 1
web/src/api/xskh/assessmentApproval/types.ts

@@ -142,6 +142,10 @@ export interface XskhAssessmentApprovalForm extends BaseEntity {
   startTime?: string;
   startTime?: string;
   /** 结束时间 */
   /** 结束时间 */
   endTime?: string;
   endTime?: string;
+  /** 数据统计开始时间 */
+  dataStartTime?: string;
+  /** 数据统计结束时间 */
+  dataEndTime?: string;
   /** 自评得分 */
   /** 自评得分 */
   selfScore?: number;
   selfScore?: number;
   /** 班主任评分 */
   /** 班主任评分 */
@@ -408,4 +412,4 @@ export interface AssessmentScheduleOption {
   status: string;
   status: string;
   /** 状态名称 */
   /** 状态名称 */
   statusName: string;
   statusName: string;
-} 
+}

+ 11 - 1
web/src/views/xskh/assessmentApplication/AssessmentApplicationForm.vue

@@ -374,6 +374,8 @@
     :indicator-name="currentIndicatorData.indicatorName"
     :indicator-name="currentIndicatorData.indicatorName"
     :student-id="form.studentId"
     :student-id="form.studentId"
     :schedule-id="form.scheduleId"
     :schedule-id="form.scheduleId"
+    :start-time="form.startTime"
+    :end-time="form.endTime"
     :data-start-time="form.dataStartTime"
     :data-start-time="form.dataStartTime"
     :data-end-time="form.dataEndTime"
     :data-end-time="form.dataEndTime"
   />
   />
@@ -1076,6 +1078,9 @@ const openDialog = async (id?: string | number, title?: string, schedule?: Asses
         if (schedule) {
         if (schedule) {
           form.value.dataStartTime = schedule.dataStartTime;
           form.value.dataStartTime = schedule.dataStartTime;
           form.value.dataEndTime = schedule.dataEndTime;
           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('重新设置时间字段 - dataStartTime:', form.value.dataStartTime);
           console.log('重新设置时间字段 - dataEndTime:', form.value.dataEndTime);
           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;
             form.value.dataEndTime = schedule.dataEndTime;
             console.log('重新设置时间字段 - dataStartTime:', form.value.dataStartTime);
             console.log('重新设置时间字段 - dataStartTime:', form.value.dataStartTime);
             console.log('重新设置时间字段 - dataEndTime:', form.value.dataEndTime);
             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,
       indicatorId: currentIndicatorData.indicatorId,
       indicatorName: currentIndicatorData.indicatorName,
       indicatorName: currentIndicatorData.indicatorName,
       dataStartTime: form.value.dataStartTime,
       dataStartTime: form.value.dataStartTime,
-      dataEndTime: form.value.dataEndTime
+      dataEndTime: form.value.dataEndTime,
+      startTime: form.value.startTime,
+      endTime: form.value.endTime
     });
     });
     indicatorDataDialogRef.value?.openDialog();
     indicatorDataDialogRef.value?.openDialog();
   });
   });

+ 416 - 331
web/src/views/xskh/assessmentApproval/AssessmentApprovalForm.vue

@@ -1,352 +1,382 @@
 <template>
 <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-col>
           </el-row>
           </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>
 
 
-                            <!-- 文件名称 -->
-                            <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>
-                          </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>
             </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>
       </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>
 </template>
 
 
 <script setup name="AssessmentApprovalForm" lang="ts">
 <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 ElMessage from 'element-plus/es/components/message/index';
 import ElMessageBox from 'element-plus/es/components/message-box/index';
 import ElMessageBox from 'element-plus/es/components/message-box/index';
 import ElLoading from 'element-plus/es/components/loading/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 { getToken } from '@/utils/auth';
 import ImagePreview from '@/components/ImagePreview/index.vue';
 import ImagePreview from '@/components/ImagePreview/index.vue';
 import { getAssessmentApproval, approveAssessmentApplication } from '@/api/xskh/assessmentApproval/assessmentApproval';
 import { getAssessmentApproval, approveAssessmentApplication } from '@/api/xskh/assessmentApproval/assessmentApproval';
+// 动态导入IndicatorDataDialog组件
+const IndicatorDataDialog = defineAsyncComponent(() => import('../assessmentApplication/IndicatorDataDialog.vue'));
 import {
 import {
   XskhAssessmentApprovalForm,
   XskhAssessmentApprovalForm,
   XskhAssessmentSelfScoreForm,
   XskhAssessmentSelfScoreForm,
@@ -379,10 +409,17 @@ declare global {
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
 
 const assessmentApprovalFormRef = ref();
 const assessmentApprovalFormRef = ref();
+const indicatorDataDialogRef = ref();
 
 
 // 页面加载状态
 // 页面加载状态
 const pageLoading = ref(false);
 const pageLoading = ref(false);
 
 
+// 当前指标数据
+const currentIndicatorData = reactive({
+  indicatorId: undefined as string | number | undefined,
+  indicatorName: ''
+});
+
 const dialog = reactive({
 const dialog = reactive({
   visible: false,
   visible: false,
   title: ''
   title: ''
@@ -420,6 +457,8 @@ const initFormData: XskhAssessmentApprovalForm = {
   scheduleName: undefined,
   scheduleName: undefined,
   startTime: undefined,
   startTime: undefined,
   endTime: undefined,
   endTime: undefined,
+  dataStartTime: undefined,
+  dataEndTime: undefined,
   selfScore: 0,
   selfScore: 0,
   teacherScore: 0,
   teacherScore: 0,
   totalScore: 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 = () => {
 const cancel = () => {
   dialog.visible = false;
   dialog.visible = false;
@@ -1387,4 +1460,16 @@ defineExpose({
 :deep(.el-loading-spinner) {
 :deep(.el-loading-spinner) {
   color: #409eff !important;
   color: #409eff !important;
 }
 }
+
+/* 指标名称单元格样式 */
+.indicator-name-cell {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.indicator-data-btn {
+  flex-shrink: 0;
+  margin-left: 4px;
+}
 </style>
 </style>