fix(admin,api): always show family composition badge N条链接·M个配置

按用户反馈(PLTM006 明明能查到配置数却不显示):左树徽标此前只在
同分类内 ≥2 个配置时才出现,单配置族一行上什么都不显示,而右树同族
链接都挂着绿色已配置徽标,两边数字对不上,反复造成「配置数没显示」
的误解。

- goods API:GOOD_INCLUDE 的 family 带 _count.originGoods,
  GoodDto.originGood.family 增加 memberCount(族成员链接数)
- admin:distinctByFamily 记录 linkCount;一族一行的徽标常显
  「N 条链接 · M 个配置」(链接数=族成员数,配置数=该族官网商品数),
  悬浮仍列出全部配置可打开
- 文档同步徽标语义

效果:PLTM006 行显示「4 条链接 · 1 个配置」(真值:4 条链接仅配了
1 个官网商品);PLTF026 的「4 条链接 · 4 个配置」同屏可对比,其中
4 个配置为历史同国家重复配置,建议另行清理。

验证:admin vue-tsc 干净 + vitest 22/22;api goods spec 18/18;
Prisma _count 查询实测返回 originGoods=4
This commit is contained in:
yeuimu
2026-08-30 03:07:16 +08:00
parent 5d089bdb43
commit a756c8c3c8
5 changed files with 22 additions and 9 deletions
+1 -1
View File
@@ -360,7 +360,7 @@ export interface OriginGood {
sizeRowCount?: number
packageRowCount?: number
productCode?: string | null
family?: { familyId: string; familyCode: string | null; familyName: string } | null
family?: { familyId: string; familyCode: string | null; familyName: string; memberCount?: number } | null
}
// Origin Goods Tree types
+6 -3
View File
@@ -216,7 +216,8 @@ const filteredGoods = computed(() => {
})
/** 左树一族只显示一行:同款(同 familyId)多条配置保留代表行(排序最前),
* 其余配置计数挂在 configCount,悬浮徽标可查看并打开 */
* 构成常显在徽标上:「N 条链接 · M 个配置」(链接数=族成员数,配置数=该族官网商品数),
* 悬浮徽标可查看全部配置并打开 */
function distinctByFamily(nodes: any[]): any[] {
const seen = new Set<string>()
return nodes.map(n => {
@@ -230,6 +231,8 @@ function distinctByFamily(nodes: any[]): any[] {
String(m.raw?.originGood?.family?.familyId ?? '') === fid)
n.configCount = siblings.length
n.familyConfigs = siblings
n.linkCount = siblings.find(m => m.raw?.originGood?.family?.memberCount != null)
?.raw.originGood.family.memberCount ?? null
return n
}).filter(Boolean)
}
@@ -1170,14 +1173,14 @@ onMounted(() => loadAll())
<span v-if="data.mergedCount > 1" class="gv-merged-badge">×{{ data.mergedCount }}</span>
</el-tooltip>
<el-popover
v-if="data.configCount > 1"
v-if="data.linkCount || data.configCount > 1"
placement="bottom-start"
:width="380"
trigger="click"
popper-class="cfg-pop-popper"
>
<template #reference>
<span class="cfg-badge" :title="`同款共 ${data.configCount} 个配置`" @click.stop>{{ data.configCount }} 个配置</span>
<span class="cfg-badge" :title="`同款共 ${data.linkCount ?? data.configCount} 条链接 · ${data.configCount} 个官网配置`" @click.stop>{{ data.linkCount ? `${data.linkCount} 条链接 · ` : '' }}{{ data.configCount }} 个配置</span>
</template>
<div class="cfg-pop-list">
<div v-for="c in (data.familyConfigs || [])" :key="c.goodId" class="cfg-pop-row">