xiaweibo 2 месяцев назад
Родитель
Сommit
e944e79a2e

+ 1 - 0
src/views/production-safety/safetyAssessment/evaluationDepartment/components/EvaluationDepartmentAdvancedPerson.vue

@@ -690,6 +690,7 @@
           deptNames: res.deptName, // 部门端接口返回的是 deptName,不是 deptNames
           createdUserName: res.deptUserName || '-', // 部门端可能没有创建人字段,使用部门用户名
           createdAt: res.createdAt,
+          isAdvancedGroup: res.isAdvancedGroup,
         };
         // 保存部门ID、考核表ID和部门用户ID,用于提交时使用
         deptId.value = res.deptId;

+ 17 - 8
src/views/production-safety/safetyAssessment/evaluationDepartment/components/EvaluationDepartmentFeedback.vue

@@ -47,13 +47,11 @@
               <span class="required-star">*</span>自评得分
             </template>
             <template #default="scope">
-              <el-input-number
-                v-model="scope.row.selfScore"
-                :min="0"
-                :max="99999"
-                :precision="0"
-                :step="1"
+              <el-input
+                :model-value="scope.row.selfScore"
                 placeholder="请输入自评得分"
+                maxlength="5"
+                @update:model-value="(v) => handleSelfScoreInput(scope.row, v)"
                 @blur="handleScoreBlur"
               />
             </template>
@@ -70,7 +68,7 @@
               />
             </template>
           </el-table-column>
-          <el-table-column label="复核不通过原因" prop="reviewRejectReson" min-width="220"></el-table-column>
+          <el-table-column v-if="reviewRejectReson" label="复核不通过原因" prop="reviewRejectReson" min-width="220"></el-table-column>
         </el-table>
       </div>
     </div>
@@ -138,6 +136,17 @@
     }, 0);
   };
 
+  // 自评得分输入:仅允许数字,范围 0-99999
+  const handleSelfScoreInput = (row: { selfScore?: number | null }, v: string | number) => {
+    const str = String(v ?? '').replace(/\D/g, '');
+    if (str === '') {
+      row.selfScore = undefined as unknown as number;
+      return;
+    }
+    const num = Math.min(Number(str), 99999);
+    row.selfScore = num;
+  };
+
   // 自评得分失去焦点时触发(用于强制更新合计行)
   const handleScoreBlur = () => {
     // 触发响应式更新,让合计行重新计算
@@ -301,7 +310,7 @@
           evaluationItem: score.exProgram || '', // 考核项目
           evaluationContent: score.exContent || '', // 考核内容
           scoringMethod: score.scoringWay || '', // 评分方式
-          selfScore: score.selfScore || 0, // 自评得分
+          selfScore: score.selfScore, // 自评得分
           materialDescription: score.attachments || '', // 资料说明(使用附件字段,字符串)
           reviewRejectReson: score.reviewRejectReson || '', // 复核不通过原因
           attachmentFileList: parseAttachmentsToFileList(score.attachments || ''), // 对应的附件文件列表

+ 85 - 11
src/views/production-safety/safetyAssessment/evaluationSystem/components/EvaluationSystemFeedback.vue

@@ -48,7 +48,7 @@
           <el-table-column label="加减分项" prop="scoreType" min-width="120" />
           <el-table-column label="自评得分" prop="selfScore" min-width="120">
             <template #default="scope">
-              {{ scope.row.selfScore === 0 || scope.row.selfScore === null || scope.row.selfScore === undefined ? '' : scope.row.selfScore }}
+              {{ scope.row.selfScore }}
             </template>
           </el-table-column>
           <el-table-column label="资料说明" prop="materialDescription" min-width="200">
@@ -77,10 +77,10 @@
             </template>
           </el-table-column>
           <el-table-column label="复核人姓名" prop="reviewUserName" min-width="120" />
-          <el-table-column label="复核得分" prop="reviewScore" min-width="180">
+          <el-table-column label="复核得分" prop="reviewScore" min-width="200">
             <template #default="scope">
               <el-input-number
-                v-if="scope.row.isReviewInput"
+                v-if="!isAudit && scope.row.isReviewInput"
                 v-model="scope.row.reviewScore"
                 :min="0"
                 :max="99999"
@@ -89,19 +89,19 @@
                 placeholder="请输入复核得分"
                 @blur="handleScoreBlur"
               />
-              <span v-else>{{ scope.row.reviewScore === 0 || scope.row.reviewScore === null || scope.row.reviewScore === undefined ? '' : scope.row.reviewScore }}</span>
+              <span v-else>{{ scope.row.reviewScore }}</span>
             </template>
           </el-table-column>
           <el-table-column label="复核不通过原因" prop="reviewRejectReson" min-width="220">
             <template #default="scope">
               <el-input
-                v-if="isSelfApproveButton"
+                v-if="!isAudit && isSelfApproveButton"
                 v-model="scope.row.reviewRejectReson"
                 type="textarea"
                 :rows="2"
                 placeholder="请输入复核不通过原因"
               />
-              <span v-else>{{ scope.row.reviewRejectReson || '-' }}</span>
+              <span v-else>{{ scope.row.reviewRejectReson}}</span>
             </template>
           </el-table-column>
         </el-table>
@@ -112,6 +112,8 @@
     <el-button @click="router.back()">取消</el-button>
     <el-button v-if="!isAudit && isSelfApproveButton" @click="openRejectDialog('review')">复核不通过</el-button>
     <el-button v-if="isAudit" @click="openRejectDialog('approve')">审核不通过</el-button>
+    <el-button v-if="!isAudit && isSelfApproveButton" type="primary" @click="handleSubmitItem">保存</el-button>
+
     <el-button v-if="!isFromDeptView" type="primary" @click="handleSubmit">{{ getSubmitButtonText }}</el-button>
   </footer>
 
@@ -185,7 +187,7 @@
     if (isSelfApproveButton.value) {
       return '提交';
     }
-    return '复核提交';
+    return '保存';
   });
 
   // 拒绝原因弹窗相关
@@ -480,9 +482,9 @@
           evaluationItem: score.exProgram || '', // 考核项目
           evaluationContent: score.exContent || '', // 考核内容
           scoringMethod: score.scoringWay || '', // 评分方式
-          selfScore: score.selfScore || 0, // 自评得分
+          selfScore: score.selfScore, // 自评得分
           reviewUserName: score.reviewUserName || '-', // 复核人姓名(从详情顶层获取)
-          reviewScore: score.reviewScore || 0, // 复核得分
+          reviewScore: score.reviewScore, // 复核得分
           reviewRejectReson: score.reviewRejectReson || '', // 复核不通过原因
           materialDescription: score.attachments || '', // 资料说明(使用附件字段,字符串)
           attachmentFileList: parseAttachmentsToFileList(score.attachments || ''), // 资料说明对应的附件文件列表
@@ -575,8 +577,8 @@
           ElMessage.success('复核同意操作成功');
         } else {
           // isSelfApproveButton 为 false,调用提交接口
-          await updateSecurityExamineIssueReviewAgree(submitData);
-          ElMessage.success('复核提交成功');
+          await updateSecurityExamineIssueReviewSubmit(submitData);
+          ElMessage.success('保存成功');
         }
       }
       router.back();
@@ -585,6 +587,78 @@
       ElMessage.error(e?.message || '提交失败,请重试');
     }
   };
+  const handleSubmitItem = async () => {
+    const res = await handleValidate();
+    if (!res) return;
+    try {
+      if (!detailData.value) {
+        ElMessage.error('数据加载失败,请刷新后重试');
+        return;
+      }
+
+      // 使用详情原始数据,更新复核得分、加减分项及资料说明附件
+      const updatedScores =
+        (await Promise.all(
+          (detailData.value.scores || []).map(async (score: any) => {
+            const item = evaluationItems.value.find((row) => row.id === score.id);
+
+            // 处理资料说明附件:将 UploadFiles 返回的文件列表转换为逗号分隔的 URL 字符串
+            let attachments = score.attachments || '';
+            if (item && Array.isArray(item.attachmentFileList)) {
+              const existingFiles: string[] = [];
+              const newFiles: any[] = [];
+
+              item.attachmentFileList.forEach((file: any) => {
+                if (file.fileUrl && !file.file) {
+                  existingFiles.push(file.fileUrl);
+                } else {
+                  newFiles.push(file);
+                }
+              });
+
+              let uploadedUrls: string[] = [];
+              if (newFiles.length > 0) {
+                const uploadedFiles = await formatAttachmentList(newFiles);
+                uploadedUrls = uploadedFiles
+                  .map((f: any) => f.fileUrl || f.url || '')
+                  .filter((url: string) => url);
+              }
+
+              attachments = [...existingFiles, ...uploadedUrls].filter((url) => url).join(',');
+            }
+
+            return {
+              ...score,
+              reviewScore: item ? Number(item.reviewScore) || 0 : score.reviewScore || 0,
+              reviewRejectReson: item ? item.reviewRejectReson || '' : score.reviewRejectReson || '',
+              isAdd: item
+                ? item.isAdd !== undefined
+                  ? item.isAdd
+                  : item.selfScore >= 0
+                    ? 1
+                    : 0
+                : score.isAdd !== undefined
+                  ? score.isAdd
+                  : score.selfScore >= 0
+                    ? 1
+                    : 0,
+              attachments,
+            };
+          }),
+        )) || [];
+
+      const submitData = {
+        ...detailData.value,
+        scores: updatedScores,
+      };
+      await updateSecurityExamineIssueReviewSubmit(submitData);
+      ElMessage.success('保存成功');
+      router.back();
+    } catch (e: any) {
+      console.error('提交失败:', e);
+      ElMessage.error(e?.message || '提交失败,请重试');
+    }
+  };
 
   const confirmReject = async () => {
     if (!rejectReason.value || !rejectReason.value.trim()) {

+ 1 - 1
src/views/production-safety/safetyAssessment/evaluationSystem/evaluationSystem.vue

@@ -546,7 +546,7 @@
       getTableData();
     } catch (e) {
       console.error('下发失败:', e);
-      ElMessage.error('下发失败,请重试');
+      ElMessage.error(e?.data || '下发失败,请重试');
     }
   };