fix(sideBarUserInfo): 修复奖衔展示错误的问题 bug-93

This commit is contained in:
woody 2025-05-12 09:51:11 +08:00
parent 905f2ea14c
commit f5bb9fe310
1 changed files with 31 additions and 54 deletions

View File

@ -53,17 +53,14 @@
<!--! 用户卡片信息 -->
<div class="awardscard">
<!-- NEW: Awards Sprint Text -->
<div
v-if="awards.tarAwardsName && sprintProgress"
class="awards-progress-summary"
>
<div v-if="awards.tarAwardsName" class="awards-progress-summary">
<span class="descriptive-text">当前距离</span>
<span class="highlight-name">
{{ awards.tarAwardsName }}
</span>
<span class="descriptive-text">奖衔,小区仅需</span>
<span class="highlight-pv">
{{ sprintProgress.gapText }}
{{ sprintProgress.achieved }}
</span>
</div>
@ -153,10 +150,7 @@
</div>
</div>
<!-- NEW: Awards Sprint Progress Bar -->
<div
v-if="awards.tarAwardsName && sprintProgress"
class="progress-wrapper"
>
<div v-if="awards.tarAwardsName" class="progress-wrapper">
<div class="progress-wrapper__label">奖衔冲刺</div>
<div class="sprint-progress-container">
<div
@ -164,8 +158,8 @@
:style="{ width: sprintProgress.percentageString }"
></div>
<div class="sprint-progress-text">
已完成 {{ sprintProgress.actualAchievedText }} / 目标
{{ sprintProgress.targetText }}
已完成 {{ awards.sumRealPv }} / 目标
{{ sprintProgress.target }}
</div>
</div>
</div>
@ -207,59 +201,42 @@ export default {
},
...mapGetters(["userInfo"]),
sprintProgress() {
const awardsData = this.awards || {}; // Handle case where awards might be null/undefined initially
const targetPvStr = awardsData.targetPv;
const sumRealPvStr = awardsData.sumRealPv; // User comment: ""
if (
typeof targetPvStr === "undefined" ||
typeof sumRealPvStr === "undefined"
) {
return {
percentageString: "0%",
actualAchievedText: "0.00",
targetText: "0.00",
gapText: "0.00",
};
}
const targetPvStr = this.awards?.targetPv;
const sumRealPvStr = this.awards?.sumRealPv; // ""
const targetPv = parseFloat(targetPvStr);
const gapPv = parseFloat(sumRealPvStr); // sumRealPv is the gap
const sumRealPv = parseFloat(sumRealPvStr);
let actualAchievedPv = 0;
let achievedPv = 0;
let percentage = 0;
const numericTargetPv = Math.max(0, isNaN(targetPv) ? 0 : targetPv);
const numericTargetPv =
Math.floor((isNaN(targetPv) ? 0 : targetPv) * 100) / 100;
if (numericTargetPv > 0) {
actualAchievedPv =
numericTargetPv - (isNaN(gapPv) ? numericTargetPv : gapPv);
actualAchievedPv = Math.max(0, actualAchievedPv);
actualAchievedPv = Math.min(actualAchievedPv, numericTargetPv);
percentage = (actualAchievedPv / numericTargetPv) * 100;
} else if (numericTargetPv === 0) {
if (!isNaN(gapPv) && gapPv <= 0) {
actualAchievedPv = 0;
percentage = 100;
} else {
actualAchievedPv = 0;
percentage = 0;
}
if (!isNaN(targetPv) && targetPv > 0) {
// sumRealPv targetPv - sumRealPv
achievedPv = targetPv - (isNaN(sumRealPv) ? 0 : sumRealPv);
achievedPv = Math.max(0, Math.min(achievedPv, targetPv));
percentage = (sumRealPvStr / targetPv) * 100;
} else if (
!isNaN(targetPv) &&
targetPv === 0 &&
!isNaN(sumRealPv) &&
sumRealPv <= 0
) {
// 000100%
achievedPv = 0;
percentage = 100;
}
const clampedPercentage = Math.min(
100,
Math.max(0, isNaN(percentage) ? 0 : percentage)
);
const clampedPercentage = Math.min(100, Math.max(0, percentage));
return {
percentageString: `${Math.floor(clampedPercentage)}%`,
actualAchievedText: (Math.floor(actualAchievedPv * 100) / 100).toFixed(
2
),
targetText: numericTargetPv.toFixed(2),
gapText: (Math.floor((isNaN(gapPv) ? 0 : gapPv) * 100) / 100).toFixed(
2
),
achieved: (Math.floor(achievedPv * 100) / 100).toFixed(2),
target: numericTargetPv.toFixed(2),
rawPercentage: clampedPercentage,
};
},
},