fix(admin): block re-config for family-configured links
按用户反馈:族已配置后不允许再配置(撤回上一轮的「再配置」入口): - 「配置」按钮仅在本链接及其同款族均未配置时显示(configuredCount 与 familyConfiguredCount 均为 0),族已配置的链接只显示「同款已配置」徽标 - openConfigModal 增加统一拦截(按钮与右树拖拽两条路径都覆盖): 已配置/族已配置的链接弹出警告并阻止打开配置弹窗,避免产生官网 不可见的冗余商品 - 文档同步:撤回「再配置」语义,恢复拦截说明 已核实 PLTF004(族 786)实际仅 1 个官网商品,「四个配置」是右树 族聚合徽标造成的观感误解;149 个族无一跨分类,左树一族一行计数无误。 验证:admin vue-tsc 干净 + vitest 22/22 绿
This commit is contained in:
@@ -449,6 +449,11 @@ function collectSiblings(ogNode: any): any[] {
|
|||||||
|
|
||||||
function openConfigModal(og: any, dropTarget: any) {
|
function openConfigModal(og: any, dropTarget: any) {
|
||||||
const ogNode = findOgNodeById(og.rawId)
|
const ogNode = findOgNodeById(og.rawId)
|
||||||
|
// 族已配置 → 不允许再配置(按钮隐藏 + 拖拽拦截):公开契约一族一款,重复配置只产生官网不可见的冗余商品
|
||||||
|
if (ogNode && (ogNode.configuredCount > 0 || ogNode.familyConfiguredCount > 0)) {
|
||||||
|
ElMessage.warning('同款已配置为官网商品,不允许重复配置;如需调整请在左侧编辑对应商品')
|
||||||
|
return
|
||||||
|
}
|
||||||
configOG.value = { ...og, familyId: og.familyId ?? ogNode?.familyId ?? null }
|
configOG.value = { ...og, familyId: og.familyId ?? ogNode?.familyId ?? null }
|
||||||
configDropTarget.value = dropTarget
|
configDropTarget.value = dropTarget
|
||||||
configSiblings.value = ogNode ? collectSiblings(ogNode) : []
|
configSiblings.value = ogNode ? collectSiblings(ogNode) : []
|
||||||
@@ -1246,7 +1251,7 @@ onMounted(() => loadAll())
|
|||||||
<span
|
<span
|
||||||
v-else-if="data.familyConfiguredCount > 0"
|
v-else-if="data.familyConfiguredCount > 0"
|
||||||
class="og-badge og-badge--ok"
|
class="og-badge og-badge--ok"
|
||||||
:title="`同款族 ${data.familyCode || ''} 已配置为官网商品,本链接自身未单独配置`"
|
:title="`同款族 ${data.familyCode || ''} 已配置为官网商品,本链接无需再配置`"
|
||||||
>同款已配置</span>
|
>同款已配置</span>
|
||||||
<span
|
<span
|
||||||
v-else-if="data.familyId"
|
v-else-if="data.familyId"
|
||||||
@@ -1279,11 +1284,11 @@ onMounted(() => loadAll())
|
|||||||
@click.stop="locateInLeftTree(data.rawId)"
|
@click.stop="locateInLeftTree(data.rawId)"
|
||||||
/>
|
/>
|
||||||
<el-button
|
<el-button
|
||||||
v-if="!data.configuredCount"
|
v-if="!data.configuredCount && !data.familyConfiguredCount"
|
||||||
size="small" type="primary" link class="og-config-btn"
|
size="small" type="primary" link class="og-config-btn"
|
||||||
:title="data.familyConfiguredCount > 0 ? '同款已配置为官网商品,点此可将本款再配置到其他国家/分类' : '配置为官网商品(可勾选同款链接归入同一族)'"
|
title="配置为官网商品(可勾选同款链接归入同一族)"
|
||||||
@click.stop="openConfigFromRightTree(data)"
|
@click.stop="openConfigFromRightTree(data)"
|
||||||
>{{ data.familyConfiguredCount > 0 ? '再配置' : '配置' }}</el-button>
|
>配置</el-button>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="og-cat-node">
|
<div v-else class="og-cat-node">
|
||||||
<span>{{ data.label }}</span>
|
<span>{{ data.label }}</span>
|
||||||
|
|||||||
@@ -168,10 +168,10 @@ curl -X POST /product-families/organize -H "$AUTH" # 后台「整理
|
|||||||
如 BRTF004)或族归属跨分类匹配,同款不同工艺/物流/仓库均在列(含已配置链接),
|
如 BRTF004)或族归属跨分类匹配,同款不同工艺/物流/仓库均在列(含已配置链接),
|
||||||
支持搜索过滤;无候选时显示空态提示。
|
支持搜索过滤;无候选时显示空态提示。
|
||||||
- 右树徽标语义(**族感知**,公开契约一族一款):**已配置 N**(绿,本链接已配置为官网商品,
|
- 右树徽标语义(**族感知**,公开契约一族一款):**已配置 N**(绿,本链接已配置为官网商品,
|
||||||
N=国数)/ **同款已配置**(绿,本链接未单独建商品但所属族已配置)/ **成族**(蓝,已归族且全族
|
N=国数)/ **同款已配置**(绿,本链接未单独建商品但所属族已配置,无需再配)/ **成族**(蓝,
|
||||||
未配置)/ **未配置**(橙);「定位到官网商品」在自身或同族已配置时出现(按 主链接 → 同族 →
|
已归族且全族未配置)/ **未配置**(橙);「定位到官网商品」在自身或同族已配置时出现(按
|
||||||
旧副源顺序定位并高亮),「配置」在本链接未单独建商品时可用;族已配置时按钮文案为
|
主链接 → 同族 → 旧副源顺序定位并高亮);「配置」按钮仅在本链接及其同款族均未配置时出现,
|
||||||
「再配置」(供调整归族/再配置到其他国家分类,注意会产生官网不可见的冗余商品);
|
拖拽到左侧分类/国家的路径同样被拦截(提示同款已配置、不允许重复配置);
|
||||||
- 族分组头部计数与「仅未配置」筛选同样按族语义(族已配置 → 计入已配置)。
|
- 族分组头部计数与「仅未配置」筛选同样按族语义(族已配置 → 计入已配置)。
|
||||||
- **左树一族一行**(国家/品类模式):同款多条配置只显示排序最前的一条,名称旁
|
- **左树一族一行**(国家/品类模式):同款多条配置只显示排序最前的一条,名称旁
|
||||||
「N 个配置」徽标悬浮列出其余配置(可打开编辑),分组头部计数仍按全部商品统计。
|
「N 个配置」徽标悬浮列出其余配置(可打开编辑),分组头部计数仍按全部商品统计。
|
||||||
@@ -179,9 +179,8 @@ curl -X POST /product-families/organize -H "$AUTH" # 后台「整理
|
|||||||
- 页面组件化:`GoodsView.vue` 拆出 `components/` 下的 GoodsEditDialog(编辑弹窗)、
|
- 页面组件化:`GoodsView.vue` 拆出 `components/` 下的 GoodsEditDialog(编辑弹窗)、
|
||||||
GoodsConfigDialog(配置弹窗)、CustomGoodDialog(自定义商品)、TagFilterPopover(标签筛选弹层)。
|
GoodsConfigDialog(配置弹窗)、CustomGoodDialog(自定义商品)、TagFilterPopover(标签筛选弹层)。
|
||||||
|
|
||||||
> 注意:历史上每族多点「配置」会产生多个同名的官网商品(重复项可手动删除)。曾按"族已配置
|
> 注意:公开契约一族一款,同款(同族)已配置后**不允许再配置**——配置按钮隐藏、拖拽路径拦截,
|
||||||
> 拦截配置入口"处理过,现已撤回:族已配置的链接徽标显示「同款已配置」、按钮为「再配置」,
|
> 避免产生官网不可见的冗余商品;历史重复商品(如早期 DG120/AUTM003 测试期间产生的)仍建议清理。
|
||||||
> 入口保留供调整归族/加配国家,重复产生的冗余商品建议清理。
|
|
||||||
|
|
||||||
**链接级标签(自动派生 + 人工修正,2026-08 规则改版)**:
|
**链接级标签(自动派生 + 人工修正,2026-08 规则改版)**:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user