fix(admin): merge-candidates by SKU/family; config dialog merge block always shown; cfg badge adjacency

- 修正合并同名候选匹配:此前用名称 3 段组键(含工艺段),工艺写法不同的
  同款(如 光板不打印 vs 单面印花(前印))全部漏配导致候选为空、合并同名
  区块被 v-if 隐藏 —— 用户看到的"checkbox 和搜索框被吞"即此因。
  改为 族归属精确匹配 或 款号(名称第 2 段,如 BRTF004)一致,全局跨分类;
  区块常显,无候选时空态提示
- 修左树「N 个配置」徽标错位:good-name-col 改 flex 布局,徽标紧贴名称
- 验证:admin typecheck + 22/22 + 构建绿;DB 实测 BRTF004 光板链接候选池
  恢复(单面印花(前印),同族 857)
This commit is contained in:
yeuimu
2026-08-29 02:16:35 +08:00
parent 6f2d836ef5
commit d625b40873
3 changed files with 32 additions and 14 deletions
+24 -9
View File
@@ -418,18 +418,26 @@ function findOgNodeById(rawId: string | number): any {
return found
}
/** 链接名的款号段(第 2 段,如 BRTF004);同款号 = 同款 */
function skuCodeOf(name: string | null | undefined): string {
return (name ?? '').split('-').map(s => s.trim())[1] ?? ''
}
function collectSiblings(ogNode: any): any[] {
const result: any[] = []
const myFamily = ogNode.familyId ? String(ogNode.familyId) : null
const mySku = skuCodeOf(ogNode.goodName ?? ogNode.label)
function traverse(nodes: any[]) {
for (const n of nodes) {
// 全局同款链接(跨分类):合并同名按名称组键匹配,
// 不局限于当前分类;含已配置的,勾选归族操作幂等
if (
n.isOG &&
String(n.rawId) !== String(ogNode.rawId) &&
sameOriginGroup(ogNode.goodName ?? ogNode.label, n.goodName ?? n.label)
) {
result.push(n)
// 全局同款链接(跨分类/跨工艺/跨物流):族归属精确匹配,或款号一致;
// 含已配置的,勾选归族操作幂等
if (n.isOG && String(n.rawId) !== String(ogNode.rawId)) {
const nFamily = n.familyId ? String(n.familyId) : null
const nSku = skuCodeOf(n.goodName ?? n.label)
const same = (myFamily && nFamily && myFamily === nFamily)
|| (Boolean(mySku) && Boolean(nSku) && mySku === nSku)
|| (!mySku && sameOriginGroup(ogNode.goodName ?? ogNode.label, n.goodName ?? n.label))
if (same) result.push(n)
}
if (n.children?.length) traverse(n.children)
}
@@ -1566,7 +1574,14 @@ onMounted(() => loadAll())
font-size: 13px; line-height: 1.4; cursor: pointer;
max-width: calc(100% - 40px);
}
.good-name-col { flex: 1; min-width: 0; overflow: hidden; }
.good-name-col {
flex: 1; min-width: 0; overflow: hidden;
display: flex; align-items: center; gap: 6px;
}
.good-name-col > .el-tooltip__trigger {
min-width: 0; overflow: hidden;
display: inline-flex; align-items: center; gap: 4px;
}
.gv-merged-badge {
margin-left: 4px;
padding: 0 5px;