🐛 修复评分-1空值、结算单号跳转与小程序用户数据权限组织选择
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1409,9 +1409,10 @@
|
||||
<el-form-item label="自评得分" :required="isOfflineScore">
|
||||
<el-input
|
||||
v-if="isOfflineScore"
|
||||
v-model="currentScore.selfScore"
|
||||
:model-value="formatScoreValue(currentScore.selfScore)"
|
||||
maxlength="10"
|
||||
:disabled="readonly"
|
||||
placeholder="请输入自评得分"
|
||||
@input="handleOfflineSelfScoreInput"
|
||||
@blur="recalculateOfflineScore"
|
||||
>
|
||||
@@ -2489,8 +2490,14 @@ export default {
|
||||
];
|
||||
const rows = categoryMap.map((category, index) => {
|
||||
const details = this.getScoreCategoryDetails(category.categoryCode);
|
||||
let selfScore = details.reduce((sum, item) => sum + Number(item.selfScore || 0), 0);
|
||||
let reviewScore = details.reduce((sum, item) => sum + Number(item.reviewScore || 0), 0);
|
||||
const sumCategoryScore = prop =>
|
||||
details.reduce((sum, item) => {
|
||||
if (this.isBlankScore(item[prop])) return sum;
|
||||
const value = Number(item[prop]);
|
||||
return sum + (Number.isFinite(value) ? value : 0);
|
||||
}, 0);
|
||||
let selfScore = sumCategoryScore('selfScore');
|
||||
let reviewScore = sumCategoryScore('reviewScore');
|
||||
// 暂定:加分/减分合计最高按 15 分计(分类汇总展示封顶后值)
|
||||
if (category.categoryCode === 'plus') {
|
||||
selfScore = Math.min(selfScore, HARDCODED_MAX_PLUS_SCORE);
|
||||
@@ -4552,6 +4559,9 @@ export default {
|
||||
quantificationId: score.quantificationId ? String(score.quantificationId) : '',
|
||||
evaluateMode: score.evaluateMode === 'offline' ? 'offline' : 'online',
|
||||
nextEvaluateDate: score.nextEvaluateDate || '',
|
||||
selfScore: this.normalizeScoreInputValue(score.selfScore),
|
||||
reviewScore: this.normalizeScoreInputValue(score.reviewScore),
|
||||
finalScore: this.normalizeScoreInputValue(score.finalScore),
|
||||
applyCreditLimit: this.normalizeOptionalAmount(
|
||||
score.applyCreditLimit === undefined
|
||||
? this.archiveForm.applyCreditLimit
|
||||
@@ -4565,6 +4575,8 @@ export default {
|
||||
details: (score.details || []).map(detail => ({
|
||||
...detail,
|
||||
scoreInput: this.normalizeScoreInputValue(detail.scoreInput),
|
||||
selfScore: this.normalizeScoreInputValue(detail.selfScore),
|
||||
reviewScore: this.normalizeScoreInputValue(detail.reviewScore),
|
||||
})),
|
||||
};
|
||||
},
|
||||
@@ -5345,7 +5357,9 @@ export default {
|
||||
return this.getScoreDetailCategoryCode(detail) === 'basic';
|
||||
},
|
||||
getSignedScore(detail, prop) {
|
||||
const score = Number(detail[prop] || 0);
|
||||
if (this.isBlankScore(detail[prop])) return '';
|
||||
const score = Number(detail[prop]);
|
||||
if (!Number.isFinite(score)) return '';
|
||||
return this.isMinusScoreDetail(detail) && score > 0 ? -score : score;
|
||||
},
|
||||
getScoreItemFullScore(detail = {}) {
|
||||
@@ -5419,7 +5433,12 @@ export default {
|
||||
const basicDetails = this.getScoreCategoryDetailsByList(details, 'basic');
|
||||
const plusDetails = this.getScoreCategoryDetailsByList(details, 'plus');
|
||||
const minusDetails = this.getScoreCategoryDetailsByList(details, 'minus');
|
||||
const sumScore = (list, prop) => list.reduce((sum, item) => sum + Number(item[prop] || 0), 0);
|
||||
const sumScore = (list, prop) =>
|
||||
list.reduce((sum, item) => {
|
||||
if (this.isBlankScore(item[prop])) return sum;
|
||||
const value = Number(item[prop]);
|
||||
return sum + (Number.isFinite(value) ? value : 0);
|
||||
}, 0);
|
||||
const rawPlusSelf = sumScore(plusDetails, 'selfScore');
|
||||
const rawPlusReview = sumScore(plusDetails, 'reviewScore');
|
||||
const rawMinusSelf = sumScore(minusDetails, 'selfScore');
|
||||
@@ -5434,33 +5453,51 @@ export default {
|
||||
const hasReviewScore = details.some(
|
||||
item => !this.isBlankScore(item.reviewScore)
|
||||
);
|
||||
// 线下模式允许手工改自评得分:有手工值时优先采用,否则回退明细合计
|
||||
// 线下模式允许手工改自评得分:有手工值时优先采用,否则回退明细合计;-1 视为未填
|
||||
const isOffline = String(score.evaluateMode || '') === 'offline';
|
||||
const hasManualSelfScore = isOffline && !this.isBlankScore(score.selfScore);
|
||||
const hasFilledDetail = details.some(item => {
|
||||
if (this.isScoreTypeDetail(item)) {
|
||||
const input = String(item.scoreInput ?? '').trim();
|
||||
return input !== '' && input !== '-' && input !== '.';
|
||||
}
|
||||
return !this.isBlankScore(item.selectedOption);
|
||||
});
|
||||
const manualSelfScore = Number(score.selfScore);
|
||||
const selfScore =
|
||||
isOffline && Number.isFinite(manualSelfScore) && String(score.selfScore ?? '').trim() !== ''
|
||||
? manualSelfScore
|
||||
: computedSelfScore;
|
||||
hasManualSelfScore && Number.isFinite(manualSelfScore) ? manualSelfScore : computedSelfScore;
|
||||
const finalScore = hasReviewScore ? reviewScore : selfScore;
|
||||
const fullMark = this.getScoreFullMark(details);
|
||||
const scoreRate =
|
||||
fullMark > 0 ? Math.max(0, Math.min(100, (finalScore / fullMark) * 100)) : 0;
|
||||
const standard = this.matchCreditStandard(score, scoreRate);
|
||||
const hasStandards = (score.standards || []).some(item => item && item.creditLevel);
|
||||
score.selfScore = Number(Number(selfScore).toFixed(2));
|
||||
// 线下未手工填写且明细未实际填报时保留空,避免默认写出 -1/0
|
||||
const keepOfflineScoreBlank = isOffline && !hasManualSelfScore && !hasFilledDetail;
|
||||
score.selfScore = keepOfflineScoreBlank ? '' : Number(Number(selfScore).toFixed(2));
|
||||
score.reviewScore = Number(reviewScore.toFixed(2));
|
||||
score.finalScore = Number(Number(finalScore).toFixed(2));
|
||||
score.scoreRate = Number(scoreRate.toFixed(2));
|
||||
score.finalScore =
|
||||
keepOfflineScoreBlank && !hasReviewScore ? '' : Number(Number(finalScore).toFixed(2));
|
||||
score.scoreRate = keepOfflineScoreBlank && !hasReviewScore ? '' : Number(scoreRate.toFixed(2));
|
||||
if (hasStandards) {
|
||||
score.creditLevel = standard?.creditLevel || '';
|
||||
score.maxCreditLimit = standard
|
||||
? this.calculateCreditLimitByStandard(standard, scoreRate)
|
||||
: '';
|
||||
score.creditLevel = keepOfflineScoreBlank && !hasReviewScore ? '' : standard?.creditLevel || '';
|
||||
score.maxCreditLimit =
|
||||
keepOfflineScoreBlank && !hasReviewScore
|
||||
? ''
|
||||
: standard
|
||||
? this.calculateCreditLimitByStandard(standard, scoreRate)
|
||||
: '';
|
||||
}
|
||||
return score;
|
||||
},
|
||||
isBlankScore(value) {
|
||||
return value === undefined || value === null || String(value).trim() === '';
|
||||
return (
|
||||
value === undefined ||
|
||||
value === null ||
|
||||
value === -1 ||
|
||||
value === '-1' ||
|
||||
String(value).trim() === ''
|
||||
);
|
||||
},
|
||||
hasIncompleteBasicScoreDetail(details = []) {
|
||||
return this.getScoreCategoryDetailsByList(details, 'basic').some(item => {
|
||||
@@ -5968,6 +6005,27 @@ export default {
|
||||
this.currentScore.evaluateMode = mode === 'offline' ? 'offline' : 'online';
|
||||
if (this.isOfflineScore) {
|
||||
this.expandedScoreCategoryKeys = [];
|
||||
// 切到线下且明细尚未实际填报时清空自评,避免沿用线上合计或 -1 哨兵值
|
||||
const hasFilledDetail = (this.currentScore.details || []).some(item => {
|
||||
if (this.isScoreTypeDetail(item)) {
|
||||
const input = String(item.scoreInput ?? '').trim();
|
||||
return input !== '' && input !== '-' && input !== '.';
|
||||
}
|
||||
return !this.isBlankScore(item.selectedOption);
|
||||
});
|
||||
if (!hasFilledDetail || this.isBlankScore(this.currentScore.selfScore)) {
|
||||
this.currentScore.selfScore = '';
|
||||
}
|
||||
if (!hasFilledDetail || this.isBlankScore(this.currentScore.finalScore)) {
|
||||
this.currentScore.finalScore = '';
|
||||
}
|
||||
if (!hasFilledDetail) {
|
||||
this.currentScore.scoreRate = '';
|
||||
this.currentScore.creditLevel = '';
|
||||
this.currentScore.maxCreditLimit = '';
|
||||
}
|
||||
} else {
|
||||
this.calculateScore(this.currentScore);
|
||||
}
|
||||
},
|
||||
handleOfflineSelfScoreInput(value) {
|
||||
@@ -5981,6 +6039,19 @@ export default {
|
||||
},
|
||||
recalculateOfflineScore() {
|
||||
if (!this.isOfflineScore) return;
|
||||
if (this.isBlankScore(this.currentScore.selfScore)) {
|
||||
this.currentScore.selfScore = '';
|
||||
const hasReviewScore = (this.currentScore.details || []).some(
|
||||
item => !this.isBlankScore(item.reviewScore)
|
||||
);
|
||||
if (!hasReviewScore) {
|
||||
this.currentScore.finalScore = '';
|
||||
}
|
||||
this.currentScore.scoreRate = '';
|
||||
this.currentScore.creditLevel = '';
|
||||
this.currentScore.maxCreditLimit = '';
|
||||
return;
|
||||
}
|
||||
const selfScore = Number(this.currentScore.selfScore);
|
||||
if (!Number.isFinite(selfScore)) return;
|
||||
this.currentScore.selfScore = Number(selfScore.toFixed(2));
|
||||
|
||||
Reference in New Issue
Block a user