ソースを参照

修改工单评分

ouyj 3 ヶ月 前
コミット
8e405ab2b8
1 ファイル変更282 行追加85 行削除
  1. 282 85
      ygtx-ui/src/views/gxt/orderScore/index.vue

+ 282 - 85
ygtx-ui/src/views/gxt/orderScore/index.vue

@@ -485,7 +485,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item :label="'得分明细 (' + (isMixedZeroNonZeroInspectionTypes() ? '最少可评总分: ' : '可自评总分: ') + (getSelfEvaluationTotalScore() === 0 ? '未规定' : getSelfEvaluationTotalScore().toFixed(2) + '分') + ', 已自评总分: ' + getSelfEvaluatedTotalScore().toFixed(2) + '分)'">
+        <el-form-item :label="'得分明细 (' + (isMixedZeroNonZeroInspectionTypesForSelfEvaluation() ? '最少可评总分: ' : '可自评总分: ') + (getSelfEvaluationTotalScore() === 0 ? '未规定' : getSelfEvaluationTotalScore().toFixed(2) + '分') + ', 已自评总分: ' + getSelfEvaluatedTotalScore().toFixed(2) + '分)'">
           <el-table :data="selfEvaluationForm.scorePersonList" border style="width: 100%;">
             <el-table-column label="检修员" align="center" prop="nickName"  style="width: 33%;">
               <template #default="scope">
@@ -500,6 +500,7 @@
                   :min="0.01" 
                   :max="100"
                   :step="0.01"
+                  :precision="2"
                   @change="updateTotalScore(scope.row)"/>
               </template>
             </el-table-column>
@@ -680,7 +681,7 @@
             </el-form-item>
           </el-col>-->
           <!-- 退回理由 - 仅在维修工单显示 -->
-          <el-col :span="24">
+<!--          <el-col :span="24">
             <el-form-item
                 label="退回理由"
                 prop="scoreReturnReason">
@@ -694,12 +695,12 @@
                   @input="onReturnReasonInput"
               />
             </el-form-item>
-          </el-col>
+          </el-col>-->
         </el-row>
         <el-row :gutter="20" v-if="reviewForm.orderType === 2">
           <el-col :span="12">
             <el-form-item label="分项完成系数">
-              <el-input-number 
+<!--              <el-input-number
                 v-model="reviewForm.itemCompletionFactor" 
                 :min="0" 
                 :max="1" 
@@ -708,6 +709,15 @@
                 controls-position="right"
                 :disabled="!isItemCompletionFactorEditable"
                 @change="calculateMaintenanceReviewScores"
+              />-->
+              <el-input-number
+                  v-model="reviewForm.itemCompletionFactor"
+                  :min="0"
+                  :max="1"
+                  :step="0.1"
+                  style="width: 100%"
+                  controls-position="right"
+                  @change="calculateMaintenanceReviewScores"
               />
             </el-form-item>
           </el-col>
@@ -778,22 +788,27 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item label="得分明细">
+        <el-form-item :label="'得分明细 (' + (isMixedZeroNonZeroInspectionTypesForReview() ? '最少可评总分: ' : '可复评总分: ') + (getReviewEvaluationTotalScore() === 0 ? '未规定' : getReviewEvaluationTotalScore().toFixed(2) + '分') + ', 已复评总分: ' + getReviewedTotalScore().toFixed(2) + '分)'">
           <el-table :data="reviewForm.scorePersonList" border style="width: 100%;">
-            <el-table-column label="检修员" align="center" prop="nickName"  style="width: 50%;">
+            <el-table-column label="检修员" align="center" prop="nickName"  style="width: 33%;">
               <template #default="scope">
                 <span>{{ scope.row.nickName }}<span v-if="scope.row.isLeader == 1"> (工作负责人)</span></span>
               </template>
             </el-table-column>
-            <el-table-column label="检修工分" align="center" prop="selfScore"  style="width: 50%;">
+            <el-table-column label="检修工分" align="center" prop="selfScore"  style="width: 33%;">
               <template #default="scope">
                 <span>{{ scope.row.selfScore !== null && scope.row.selfScore !== undefined ? parseFloat(scope.row.selfScore).toFixed(2) : '' }}</span>
               </template>
             </el-table-column>
-            <el-table-column label="复评得分" align="center" prop="reviewScore"  style="width: 50%;">
+            <el-table-column label="复评得分" align="center" prop="reviewScore"  style="width: 33%;">
               <template #default="scope">
-<!--                <el-input v-model="scope.row.reviewScore" style="width: 100%;" :readonly="isEditScore"/>-->
-                <el-input v-model="scope.row.reviewScore" style="width: 100%;" readonly="readonly"/>
+                <el-input-number 
+                  v-model="scope.row.reviewScore" 
+                  style="width: 100%;" 
+                  :min="0.01" 
+                  :max="100"
+                  :step="0.01"
+                  @change="updateReviewTotalScore(scope.row)"/>
               </template>
             </el-table-column>
             <!-- 额外工分和工单得分 - 仅当维修工单且有额外工作总结时显示 -->
@@ -1756,7 +1771,7 @@ function handleMaintenanceTypeChangeForSelfEvaluation() {
     // 维保工单
     calculateMaintenanceScores();
   }*/
-  clearSelfScores();
+  //clearSelfScores();
   if (selfEvaluationForm.value.orderType === 1) {
     // 如果额外工作总结有值,重新计算总分
     if (selfEvaluationForm.value.extraWork && selfEvaluationForm.value.extraWork.trim() !== '') {
@@ -1788,6 +1803,25 @@ function updateTotalScore(row) {
   }
 }
 
+/** 更新复评总分(复评得分+额外工分) */
+function updateReviewTotalScore(row) {
+  if (row.reviewScore !== null && row.reviewScore !== undefined && 
+      row.extraScore !== null && row.extraScore !== undefined) {
+    // 计算总分,保留两位小数
+    const total = parseFloat((parseFloat(row.reviewScore) + parseFloat(row.extraScore)).toFixed(2));
+    row.totalScore = total;
+  } else if (row.reviewScore !== null && row.reviewScore !== undefined) {
+    // 如果额外工分为null或undefined,只显示复评得分
+    row.totalScore = parseFloat(row.reviewScore.toFixed(2));
+  } else if (row.extraScore !== null && row.extraScore !== undefined) {
+    // 如果复评得分为null或undefined,只显示额外工分
+    row.totalScore = parseFloat(row.extraScore.toFixed(2));
+  } else {
+    // 都为null或undefined,则总分为null
+    row.totalScore = null;
+  }
+}
+
 /** 处理额外工作总结变化 */
 function handleExtraWorkChange() {
   // 如果额外工作总结为空,清空额外工分和总分的值
@@ -1982,22 +2016,30 @@ function handleReview(row) {
       reviewForm.value.initialItemCompletionFactor = data.itemCompletionFactor;
     }
     
-    // 设置复评得分默认值为检修工分
+    // 初始化复评得分,默认使用自评得分作为初始值
     if (reviewForm.value.scorePersonList && reviewForm.value.scorePersonList.length > 0) {
       reviewForm.value.scorePersonList.forEach(person => {
-        // 如果复评得分为空,则使用检修工分作为默认值
-        if (!person.reviewScore && person.selfScore) {
-          person.reviewScore = person.selfScore;
-        }
-        if(person.reviewScore){
+        // 如果复评得分为空,则使用自评得分作为默认值
+        if(person.reviewScore === null || person.reviewScore === undefined || person.reviewScore === ''){
+          // 使用自评得分作为默认值
+          if(person.selfScore !== null && person.selfScore !== undefined && person.selfScore !== '') {
+            person.reviewScore = parseFloat(person.selfScore).toFixed(2);
+          } else {
+            person.reviewScore = null;
+          }
+        } else {
+          // 如果复评得分已有值,则格式化为两位小数
           person.reviewScore = parseFloat(person.reviewScore).toFixed(2);
         }
 
         // 如果是维修工单且有额外工分,或维保工单且包含其他/其它选项且有额外工分,则计算总分
-        if (person.extraScore !== null && person.extraScore !== undefined){
+        // 注意:复评阶段额外工分为只读,不应当修改
+        if (person.extraScore !== null && person.extraScore !== undefined && person.reviewScore !== null && person.reviewScore !== undefined){
           person.totalScore = parseFloat((parseFloat(person.reviewScore) + parseFloat(person.extraScore)).toFixed(2));
-        }else{
-          person.totalScore = person.reviewScore;
+        }else if(person.reviewScore !== null && person.reviewScore !== undefined){
+          person.totalScore = parseFloat(person.reviewScore);
+        } else {
+          person.totalScore = null;
         }
       });
     }
@@ -2077,7 +2119,7 @@ function handleModifyType() {
   }
 }
 
-// 监听检修类型变化,自动计算得分
+// 监听检修类型变化
 function handleMaintenanceTypeChange() {
   if (reviewForm.value.orderType === 1 && isMaintenanceTypeEditable.value) {
     // 维修工单且检修类型可编辑时,检查是否需要显示修改理由
@@ -2086,8 +2128,9 @@ function handleMaintenanceTypeChange() {
     } else {
       showModifyReason.value = false;
     }
+    // 不再自动计算复评得分,因为现在是手动输入
     // 计算维修工单复评得分
-    calculateRepairReviewScores();
+    //calculateRepairReviewScores();
   }
 }
 
@@ -2132,7 +2175,7 @@ function calculateRepairReviewScores() {
 
   // 计算基础分
   const baseScore = totalScore / personCount;
-  
+
   // 设置得分
   reviewForm.value.scorePersonList.forEach(person => {
     if (person.isLeader == 1) {
@@ -2144,7 +2187,7 @@ function calculateRepairReviewScores() {
   });
 }
 
-// 计算维保工单复评得分
+// 监听分项完成系数变化
 function calculateMaintenanceReviewScores() {
   // 检查是否需要显示修改理由
   if (reviewForm.value.initialItemCompletionFactor !== undefined && 
@@ -2153,22 +2196,22 @@ function calculateMaintenanceReviewScores() {
   } else {
     showModifyReason.value = false;
   }
-
-  if (reviewForm.value.scorePersonList.length === 0) return;
+  // 不再自动计算复评得分,因为现在是手动输入
+  /*if (reviewForm.value.scorePersonList.length === 0) return;
   const personCount = reviewForm.value.scorePersonList.length+
       (parseInt(reviewForm.value.wwryNum) || 0) +
       (parseInt(reviewForm.value.wlryNum) || 0);
-  
+
   // 获取分项完成系数,默认为1
   const completionFactor = reviewForm.value.itemCompletionFactor || 1;
-  
+
   // 获取选中的维保项目(现在是多选)
   const selectedInspectionTypes = reviewForm.value.inspectionType || [];
-  
+
   // 计算所有选中维保项目的总分值
   let totalScoreFromDB = 0; // 默认值
   isEditScore.value = false;
-  
+
   if (Array.isArray(selectedInspectionTypes) && selectedInspectionTypes.length > 0) {
     selectedInspectionTypes.forEach(typeId => {
       const selectedType = inspectionTypeOptions.value.find(item => item.inspectionTypeId.toString() === typeId);
@@ -2178,10 +2221,10 @@ function calculateMaintenanceReviewScores() {
       }
     });
   }
-  
+
   // 计算基础分:基础分 = (所有选中维保类型组合的总得分 * 分项完成系数) / 组员人数
   const baseScore = (totalScoreFromDB * completionFactor) / personCount;
-  
+
   // 设置得分
   reviewForm.value.scorePersonList.forEach(person => {
     if (person.isLeader == 1) {
@@ -2190,7 +2233,7 @@ function calculateMaintenanceReviewScores() {
     } else {
       person.reviewScore = baseScore.toFixed(2);
     }
-  });
+  });*/
 }
 
 /** 关闭复评对话框 */
@@ -2228,8 +2271,12 @@ function submitReturn() {
         confirmStatus: reviewForm.value.confirmStatus,
         finalCoefficient: reviewForm.value.finalCoefficient
       };*/
-      
-      review(reviewForm.value).then(response => {
+      // 在提交前将数组格式的inspectionType转换为字符串格式
+      const submitData = { ...reviewForm.value };
+      if (Array.isArray(submitData.inspectionType)) {
+        submitData.inspectionType = submitData.inspectionType.join(',');
+      }
+      review(submitData).then(response => {
         proxy.$modal.msgSuccess("退回成功");
         reviewDialogVisible.value = false;
         getList();
@@ -2261,7 +2308,14 @@ function onReturnReasonInput() {
 function submitReview() {
   proxy.$refs["reviewRef"].validate(valid => {
     if (valid) {
-      // 对于维修工单,如果检修类型被修改但未填写修改理由,则提示错误
+      // 验证评分规则
+      const validation = validateReviewScoringRules();
+      if (!validation.valid) {
+        proxy.$modal.msgError(validation.message);
+        return;
+      }
+      
+      /*// 对于维修工单,如果检修类型被修改但未填写修改理由,则提示错误
       if (reviewForm.value.orderType === 1 && 
           isMaintenanceTypeEditable.value && 
           reviewForm.value.maintenanceType !== reviewForm.value.initialMaintenanceType &&
@@ -2277,7 +2331,7 @@ function submitReview() {
           !reviewForm.value.modifyReason) {
         proxy.$modal.msgError("修改了分项完成系数,请填写修改理由");
         return;
-      }
+      }*/
       
       // 验证质量系数不为空(仅维修工单)
       /*if (reviewForm.value.orderType === 1 && (!reviewForm.value.finalCoefficient || reviewForm.value.finalCoefficient === null)) {
@@ -2748,9 +2802,9 @@ function clearSelfScores() {
   }
 }
 
-/** 获取维修工单总分 */
-function getRepairTotalScore() {
-  const maintenanceType = selfEvaluationForm.value.maintenanceType;
+/** 获取维修工单总分 - 通用函数 */
+function getRepairTotalScore(formValue) {
+  const maintenanceType = formValue.maintenanceType;
   if (!maintenanceType) {
     return 0;
   }
@@ -2769,15 +2823,15 @@ function getRepairTotalScore() {
   return parseFloat(scoreMatch[1]);
 }
 
-/** 获取维保工单总分 */
-function getMaintenanceTotalScore() {
-  if (selfEvaluationForm.value.scorePersonList.length === 0) return 0;
+/** 获取维保工单总分 - 通用函数 */
+function getMaintenanceTotalScore(formValue) {
+  if (formValue.scorePersonList.length === 0) return 0;
   
   // 获取分项完成系数,默认为1
-  const completionFactor = selfEvaluationForm.value.itemCompletionFactor || 1;
+  const completionFactor = formValue.itemCompletionFactor || 1;
   
   // 获取选中的维保项目(现在是多选)
-  const selectedInspectionTypes = selfEvaluationForm.value.inspectionType || [];
+  const selectedInspectionTypes = formValue.inspectionType || [];
   
   // 计算所有选中维保项目的总分值
   let totalScoreFromDB = 0; // 默认值
@@ -2795,37 +2849,111 @@ function getMaintenanceTotalScore() {
   return totalScoreFromDB * completionFactor;
 }
 
-/** 获取工单总分 */
-function getTotalScore() {
-  if (selfEvaluationForm.value.orderType === 1) {
+/** 获取工单总分 - 通用函数 */
+function getTotalScore(formValue) {
+  if (formValue.orderType === 1) {
     // 维修工单
-    return getRepairTotalScore();
+    return getRepairTotalScore(formValue);
   } else {
     // 维保工单
-    return getMaintenanceTotalScore();
+    return getMaintenanceTotalScore(formValue);
   }
 }
 
-/** 验证评分规则 */
-function validateScoringRules() {
-  const scorePersonList = selfEvaluationForm.value.scorePersonList;
+/** 获取自评工单总分 */
+function getTotalScoreForSelfEvaluation() {
+  return getTotalScore(selfEvaluationForm.value);
+}
+
+/** 获取复评工单总分 */
+function getTotalScoreForReview() {
+  return getTotalScore(reviewForm.value);
+}
+
+
+/** 获取维修工单总分 - 用于验证 */
+function getRepairTotalScoreForValidation() {
+  // 从维护类型选项中获取当前选中的类型
+  let currentMaintenanceType = null;
+  let currentForm = null;
+
+  if (selfEvaluationForm.value && selfEvaluationForm.value.maintenanceType) {
+    currentForm = selfEvaluationForm.value;
+    currentMaintenanceType = selfEvaluationForm.value.maintenanceType;
+  } else if (reviewForm.value && reviewForm.value.maintenanceType) {
+    currentForm = reviewForm.value;
+    currentMaintenanceType = reviewForm.value.maintenanceType;
+  }
+
+  if (!currentMaintenanceType) {
+    return 0;
+  }
+
+  const selectedType = maintenanceTypeOptions.value.find(item => item.value === currentMaintenanceType);
+  if (!selectedType) {
+    return 0;
+  }
+
+  // 获取分值
+  const scoreMatch = selectedType.label.match(/\((\d+(\.\d+)?)分\)/);
+  if (!scoreMatch) {
+    return 0;
+  }
+
+  return parseFloat(scoreMatch[1]);
+}
+
+/** 获取维保工单总分 - 用于验证 */
+function getMaintenanceTotalScoreForValidation(inspectionType, itemCompletionFactor) {
+  // 获取分项完成系数,默认为1
+  const completionFactor = itemCompletionFactor || 1;
+
+  // 获取选中的维保项目(现在是多选)
+  const selectedInspectionTypes = inspectionType || [];
+
+  // 计算所有选中维保项目的总分值
+  let totalScoreFromDB = 0; // 默认值
+
+  if (Array.isArray(selectedInspectionTypes) && selectedInspectionTypes.length > 0) {
+    selectedInspectionTypes.forEach(typeId => {
+      const selectedType = inspectionTypeOptions.value.find(item => item.inspectionTypeId.toString() === typeId);
+      if (selectedType && selectedType.score) {
+        totalScoreFromDB += selectedType.score;
+      }
+    });
+  }
+
+  // 计算总分:总分 = 所有选中维保类型组合的总得分 * 分项完成系数
+  return totalScoreFromDB * completionFactor;
+}
+
+/** 验证评分规则 - 通用函数 */
+function validateScoringRulesCommon(formValue) {
+  const { scorePersonList, orderType, inspectionType, itemCompletionFactor, wwryNum, wlryNum } = formValue;
+  
   if (!scorePersonList || scorePersonList.length === 0) {
     return { valid: true, message: '' };
   }
 
   // 获取工单总分
-  const totalScore = getTotalScore();
+  const totalScore = getTotalScore(formValue);
   
   // 计算总得分
-  let totalSelfScore = 0;
+  let totalScoreValue = 0;
   let hasEmptyScore = false;
   let leaderScore = null;
   
+  // 根据当前验证的类型确定使用哪个字段
+  // 如果是复评验证,使用reviewScore;如果是自评验证,使用selfScore
+  const isReviewValidation = formValue === reviewForm.value;
+  const scoreFieldKey = isReviewValidation ? 'reviewScore' : 'selfScore';
+  
   for (const person of scorePersonList) {
-    if (person.selfScore === null || person.selfScore === undefined || person.selfScore === '') {
+    const scoreField = person[scoreFieldKey];
+    if (scoreField === null || scoreField === undefined || scoreField === '') {
       hasEmptyScore = true;
     } else {
-      const score = parseFloat(person.selfScore);
+      const score = parseFloat(scoreField);
       if (!isNaN(score)) {
         // 检查得分是否大于0
         if (score <= 0) {
@@ -2834,7 +2962,7 @@ function validateScoringRules() {
             message: `每个人的得分必须大于0(${person.nickName}的得分为${score})` 
           };
         }
-        totalSelfScore += score;
+        totalScoreValue += score;
         if (person.isLeader == 1) {  // 工作负责人
           leaderScore = score;
         }
@@ -2849,7 +2977,6 @@ function validateScoringRules() {
       message: '部分人员未评分'
     };
   }
-  
   // 如果总分为0,则评分无上限
   if (totalScore === 0) {
     // 检查工作负责人得分-0.5后是否小于等于0
@@ -2866,9 +2993,9 @@ function validateScoringRules() {
   }
   
   // 对于维保工单且多选维保类型的情况,需要特殊处理
-  if (selfEvaluationForm.value.orderType === 2 && Array.isArray(selfEvaluationForm.value.inspectionType) && selfEvaluationForm.value.inspectionType.length > 1) {
+  if (orderType === 2 && Array.isArray(inspectionType) && inspectionType.length > 1) {
     // 获取选中的维保类型
-    const selectedInspectionTypes = selfEvaluationForm.value.inspectionType || [];
+    const selectedInspectionTypes = inspectionType || [];
     
     // 计算所有选中维保类型的总分值
     let minScoreFromDB = 0; // 最低分值(非零)
@@ -2890,18 +3017,18 @@ function validateScoringRules() {
     // 如果存在零分且存在非零分的情况
     if (hasZeroScore && minScoreFromDB > 0) {
       // 获取分项完成系数
-      const completionFactor = selfEvaluationForm.value.itemCompletionFactor || 1;
+      const completionFactor = itemCompletionFactor || 1;
       // 计算最低理论总分(非零项的总分 * 分项完成系数 + 0.5)
       const minExpectedTotal = (minScoreFromDB * completionFactor) + 0.5;
       
       // 总得分必须至少等于最低理论总分
-      if (totalSelfScore < minExpectedTotal - 0.01) {  // 使用0.01作为容差
-        return { 
-          valid: false, 
-          message: `总得分不得低于 ${minExpectedTotal.toFixed(2)} 分(当前:${totalSelfScore.toFixed(2)} 分)` 
+      /*if (totalSelfScore < minExpectedTotal - 0.01) {  // 使用0.01作为容差
+        return {
+          valid: false,
+          message: `总得分不得低于 ${minExpectedTotal.toFixed(2)} 分(当前:${totalSelfScore.toFixed(2)} 分)`
         };
-      }
-      
+      }*/
+
       // 检查工作负责人得分-0.5后是否小于等于0
       if (leaderScore !== null) {
         const leaderScoreAfterReduction = leaderScore - 0.5;
@@ -2919,12 +3046,20 @@ function validateScoringRules() {
   
   // 计算理论总分(总分+0.5)
   const expectedTotal = totalScore + 0.5;
-  
+
   // 总得分必须等于总分+0.5
-  if (Math.abs(totalSelfScore - expectedTotal) > 0.01) {  // 使用0.01作为容差
-    return { 
-      valid: false, 
-      message: `总得分必须等于 ${expectedTotal.toFixed(2)} 分(当前:${totalSelfScore.toFixed(2)} 分)` 
+  /*if (Math.abs(totalSelfScore - expectedTotal) > 0.01) {  // 使用0.01作为容差
+    return {
+      valid: false,
+      message: `总得分必须等于 ${expectedTotal.toFixed(2)} 分(当前:${totalSelfScore.toFixed(2)} 分)`
+    };
+  }*/
+  console.log("totalScoreValue",totalScoreValue)
+  console.log("expectedTotal",expectedTotal)
+  if (totalScoreValue - expectedTotal > 0.01) {  // 使用0.01作为容差
+    return {
+      valid: false,
+      message: `总得分必须小于等于 ${expectedTotal.toFixed(2)} 分(当前:${totalScoreValue.toFixed(2)} 分)`
     };
   }
   
@@ -2942,17 +3077,38 @@ function validateScoringRules() {
   return { valid: true, message: '' };
 }
 
-/** 获取可自评总分 */
-function getSelfEvaluationTotalScore() {
+/** 验证自评评分规则 */
+function validateScoringRules() {
+  return validateScoringRulesCommon(selfEvaluationForm.value);
+}
+
+/** 验证复评评分规则 */
+function validateReviewScoringRules() {
+  return validateScoringRulesCommon(reviewForm.value);
+}
+
+/** 获取工单总分 - 用于验证 */
+function getTotalScoreForValidation(orderType, inspectionType, itemCompletionFactor, formValue) {
+  if (orderType === 1) {
+    // 维修工单
+    return getRepairTotalScoreForValidation(formValue);
+  } else {
+    // 维保工单
+    return getMaintenanceTotalScoreForValidation(inspectionType, itemCompletionFactor);
+  }
+}
+
+/** 获取可评总分 - 通用函数 */
+function getEvaluationTotalScore(formValue) {
   // 获取工单总分
-  const totalScore = getTotalScore();
+  const totalScore = getTotalScore(formValue);
   
   // 如果总分为0,返回0
   if (totalScore === 0) {
     // 特殊处理:对于维保工单且多选维保类型的情况,如果存在零分和非零分的混合情况
-    if (selfEvaluationForm.value.orderType === 2 && Array.isArray(selfEvaluationForm.value.inspectionType) && selfEvaluationForm.value.inspectionType.length > 1) {
+    if (formValue.orderType === 2 && Array.isArray(formValue.inspectionType) && formValue.inspectionType.length > 1) {
       // 获取选中的维保类型
-      const selectedInspectionTypes = selfEvaluationForm.value.inspectionType || [];
+      const selectedInspectionTypes = formValue.inspectionType || [];
       
       // 计算所有选中维保类型的非零分值
       let minScoreFromDB = 0; // 非零分值总和
@@ -2973,7 +3129,7 @@ function getSelfEvaluationTotalScore() {
       
       // 如果存在零分且存在非零分的情况,返回非零分的总和加上工作负责人的0.5分
       if (hasZeroScore && minScoreFromDB > 0) {
-        const completionFactor = selfEvaluationForm.value.itemCompletionFactor || 1;
+        const completionFactor = formValue.itemCompletionFactor || 1;
         return (minScoreFromDB * completionFactor) + 0.5;
       }
     }
@@ -2984,13 +3140,23 @@ function getSelfEvaluationTotalScore() {
   return totalScore + 0.5;
 }
 
-/** 判断是否为多选维保类型且存在零分和非零分混合的情况 */
-function isMixedZeroNonZeroInspectionTypes() {
-  if (selfEvaluationForm.value.orderType === 2 && 
-      Array.isArray(selfEvaluationForm.value.inspectionType) && 
-      selfEvaluationForm.value.inspectionType.length > 1) {
+/** 获取可自评总分 */
+function getSelfEvaluationTotalScore() {
+  return getEvaluationTotalScore(selfEvaluationForm.value);
+}
+
+/** 获取复评可评总分 */
+function getReviewEvaluationTotalScore() {
+  return getEvaluationTotalScore(reviewForm.value);
+}
+
+/** 判断是否为多选维保类型且存在零分和非零分混合的情况 - 通用函数 */
+function isMixedZeroNonZeroInspectionTypes(formValue) {
+  if (formValue.orderType === 2 && 
+      Array.isArray(formValue.inspectionType) && 
+      formValue.inspectionType.length > 1) {
     
-    const selectedInspectionTypes = selfEvaluationForm.value.inspectionType || [];
+    const selectedInspectionTypes = formValue.inspectionType || [];
     let hasZeroScore = false;
     let hasNonZeroScore = false;
     
@@ -3013,6 +3179,37 @@ function isMixedZeroNonZeroInspectionTypes() {
   return false;
 }
 
+/** 判断自评中是否为多选维保类型且存在零分和非零分混合的情况 */
+function isMixedZeroNonZeroInspectionTypesForSelfEvaluation() {
+  return isMixedZeroNonZeroInspectionTypes(selfEvaluationForm.value);
+}
+
+/** 判断复评中是否为多选维保类型且存在零分和非零分混合的情况 */
+function isMixedZeroNonZeroInspectionTypesForReview() {
+  return isMixedZeroNonZeroInspectionTypes(reviewForm.value);
+}
+
+/** 获取已复评总分 */
+function getReviewedTotalScore() {
+  const scorePersonList = reviewForm.value.scorePersonList;
+  if (!scorePersonList || scorePersonList.length === 0) {
+    return 0;
+  }
+  
+  let totalReviewScore = 0;
+  
+  for (const person of scorePersonList) {
+    if (person.reviewScore !== null && person.reviewScore !== undefined && person.reviewScore !== '') {
+      const score = parseFloat(person.reviewScore);
+      if (!isNaN(score)) {
+        totalReviewScore += score;
+      }
+    }
+  }
+  
+  return totalReviewScore;
+}
+
 /** 检查维保类型是否包含'其他'或'其它'选项 */
 function hasOtherOrQitaInspectionType() {
   // 检查当前上下文中的表单对象,优先检查selfEvaluationForm