|
|
@@ -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
|