Skip to content

Commit bf771bd

Browse files
committed
fix:去除0资历的成就统计
1 parent 4912ffd commit bf771bd

5 files changed

Lines changed: 104 additions & 46 deletions

File tree

src/components/cj/achievement-count.vue

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
</div>
1010
</template>
1111
<script>
12-
import { getAchievementsTotal } from "@/service/achievement";
12+
import { getAchievementPointsV2 } from "@/service/achievement";
13+
import {
14+
normalizeCountableAchievementMetadata,
15+
summarizeVisibleAchievements,
16+
} from "@/utils/achievement-statistics";
1317
1418
export default {
1519
name: "AchievementCount",
@@ -26,10 +30,11 @@ export default {
2630
};
2731
},
2832
created() {
29-
// 获取成就统计信息
30-
getAchievementsTotal().then((data) => {
31-
data = data.data;
32-
this.count = data.data.count;
33+
// 统一从 v2 点数元数据派生数量,零资历成就不进入统计。
34+
getAchievementPointsV2().then((response) => {
35+
const metadata = normalizeCountableAchievementMetadata(response.data?.data?.points || {});
36+
this.count = summarizeVisibleAchievements(metadata);
37+
this.$store.commit("SET_STATE", { key: "achievementMetadata", value: metadata });
3338
this.$store.commit("SET_STATE", { key: "generalTotal", value: ~~this.count["general"] });
3439
this.$store.commit("SET_STATE", { key: "armorTotal", value: ~~this.count["armor"] });
3540
});

src/components/cj/sidebar.vue

Lines changed: 19 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,15 @@
4848
<template #default="{ data }">
4949
<router-link class="el-tree-node__label" :to="menu_url(data)">
5050
<span class="u-name" v-text="data.name"></span>
51-
<em v-if="data.achievements_count" class="u-count">
51+
<em v-if="getMenuAchievementCount(data)" class="u-count">
5252
(<span v-if="currentRole">{{
5353
`${
5454
uncompleted
55-
? data.achievements_count +
56-
~~data.own_achievements_count -
57-
getMenuCompleted(data)
55+
? Math.max(0, getMenuAchievementCount(data) - getMenuCompleted(data))
5856
: getMenuCompleted(data)
5957
}/`
6058
}}</span>
61-
<span>{{ `${data.achievements_count + ~~data.own_achievements_count}` }}</span
62-
>)
59+
<span>{{ getMenuAchievementCount(data) }}</span>)
6360
</em>
6461
</router-link>
6562
</template>
@@ -74,7 +71,8 @@ import RoleSelect from "@/components/common/role-select.vue";
7471
import bus from "@/store/bus";
7572
import User from "@jx3box/jx3box-common/js/user";
7673
import { showSchoolIcon } from "@jx3box/jx3box-common/js/utils";
77-
import { flattenDeep, cloneDeep, omit } from "lodash";
74+
import { omit } from "lodash";
75+
import { collectMenuAchievementIds } from "@/utils/achievement-statistics";
7876
export default {
7977
name: "Sidebar",
8078
props: ["sidebar"],
@@ -127,6 +125,9 @@ export default {
127125
achievementsVirtual() {
128126
return this.$store.state.achievementsVirtual;
129127
},
128+
achievementMetadata() {
129+
return this.$store.state.achievementMetadata;
130+
},
130131
selectedGeneral: {
131132
get() {
132133
return this.sidebar.general;
@@ -152,7 +153,7 @@ export default {
152153
},
153154
total({ menus }) {
154155
const numList = menus.map((data) => {
155-
return data.achievements_count + data.own_achievements_count;
156+
return this.getMenuAchievementCount(data);
156157
});
157158
return numList.reduce((acc, cur) => {
158159
return acc + cur;
@@ -224,44 +225,21 @@ export default {
224225
},
225226
},
226227
methods: {
227-
getLastAchievement(achievements = []) {
228-
// 娓告垙瑙掕壊
229-
// 姣斿浼犲姛锛屽彧鍙栨渶鍚庝竴涓紶鍔?00娆$殑ID浣滀负鏄惁瀹屾垚鐨勪緷鎹?
230-
if (!Array.isArray(achievements)) return [];
231-
return achievements.map((achievement) => {
232-
if (Array.isArray(achievement)) {
233-
// 姣斿浼犲姛锛屽彧鍙栨渶鍚庝竴涓紶鍔?00娆$殑ID浣滀负鏄惁瀹屾垚鐨勪緷鎹?
234-
const lastOne = achievement?.[achievement.length - 1];
235-
return lastOne;
236-
} else {
237-
return achievement;
238-
}
228+
getMenuAchievementIds(data) {
229+
return collectMenuAchievementIds(data).filter((id) => {
230+
const item = this.achievementMetadata[id];
231+
return item?.visible && item.general === this.sidebar.general;
239232
});
240233
},
234+
getMenuAchievementCount(data) {
235+
return this.getMenuAchievementIds(data).length;
236+
},
241237
getMenuCompleted(data, achievementsVirtual, achievements) {
242-
const newData = cloneDeep(data);
243-
const newDataAchievements = this.isVirtual
244-
? flattenDeep(newData.achievements)
245-
: this.getLastAchievement(newData.achievements);
246-
newData.all_achievements = newData.children
247-
? Array.from(
248-
new Set(
249-
newDataAchievements.concat(
250-
flattenDeep(
251-
newData.children.map((item) => {
252-
return this.isVirtual
253-
? item.achievements
254-
: this.getLastAchievement(item.achievements);
255-
})
256-
)
257-
)
258-
)
259-
)
260-
: newDataAchievements;
261238
const list = this.isVirtual
262239
? achievementsVirtual || this.achievementsVirtual
263240
: achievements || this.achievements;
264-
return newData.all_achievements.filter((item) => list.includes(item + ""))?.length;
241+
const completedIds = new Set((list || []).map(String));
242+
return this.getMenuAchievementIds(data).filter((id) => completedIds.has(id)).length;
265243
},
266244
filterNode(value, data) {
267245
if (!value) return true;
@@ -338,7 +316,7 @@ export default {
338316
// return;
339317
// }
340318
341-
getMenus({ general }).then(
319+
getMenus({ general, client: this.$store.state.client }).then(
342320
(data) => {
343321
data = data.data;
344322
if (data.code === 200) {

src/service/achievement.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ export function getAchievementPoints(general) {
6161
});
6262
}
6363

64+
// 获取成就点数及常规/五甲、可见/隐藏元数据。
65+
export function getAchievementPointsV2() {
66+
return $.get(`/api/node/v2/achievement/points`, {
67+
params: {
68+
client,
69+
},
70+
});
71+
}
72+
6473
// 获取菜单下成就
6574
export function getMenuAchievements(sub, detail, params) {
6675
let url = `/api/cms/helper/achievements/${sub}`;

src/store/cj.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const store = {
1313
achievements: [],
1414
generalTotal: 0,
1515
armorTotal: 0,
16+
achievementMetadata: {},
1617
onlyUncompleted: false,
1718
achievementsVirtual: [],
1819
viewAchievementsName: null,
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
function appendAchievementIds(value, target) {
2+
if (Array.isArray(value)) {
3+
value.forEach((item) => appendAchievementIds(item, target));
4+
return;
5+
}
6+
7+
if (value === null || value === undefined || value === "") return;
8+
target.add(String(value));
9+
}
10+
11+
function walkMenuNode(node, target) {
12+
if (!node || typeof node !== "object") return;
13+
appendAchievementIds(node.achievements || [], target);
14+
(node.children || []).forEach((child) => walkMenuNode(child, target));
15+
}
16+
17+
export function collectMenuAchievementIds(menu) {
18+
const ids = new Set();
19+
const roots = Array.isArray(menu) ? menu : [menu];
20+
roots.forEach((root) => walkMenuNode(root, ids));
21+
return [...ids];
22+
}
23+
24+
export function normalizeCountableAchievementMetadata(points) {
25+
return Object.entries(points || {}).reduce((metadata, [id, tuple]) => {
26+
if (!Array.isArray(tuple) || tuple.length < 3) return metadata;
27+
28+
const point = Number(tuple[0]);
29+
const general = Number(tuple[1]);
30+
const visible = Number(tuple[2]);
31+
if (!Number.isFinite(point) || point <= 0 || ![0, 1, 2, 3].includes(general) || ![0, 1].includes(visible)) {
32+
return metadata;
33+
}
34+
35+
metadata[String(id)] = {
36+
point,
37+
general,
38+
visible: visible === 1,
39+
};
40+
return metadata;
41+
}, {});
42+
}
43+
44+
export function summarizeVisibleAchievements(metadata) {
45+
const count = {
46+
general: 0,
47+
general_point: 0,
48+
armor: 0,
49+
armor_point: 0,
50+
};
51+
52+
Object.values(metadata || {}).forEach((item) => {
53+
if (!item.visible) return;
54+
if (item.general === 1) {
55+
count.general += 1;
56+
count.general_point += item.point;
57+
}
58+
if (item.general === 2) {
59+
count.armor += 1;
60+
count.armor_point += item.point;
61+
}
62+
});
63+
64+
return count;
65+
}

0 commit comments

Comments
 (0)