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