Files
order_site/apps/frontend/src/pages/admin/cost-center/CostConfigPanel.tsx
T
yml2213 55a3e0df9c refactor(admin-ui): 成本中心导航收敛为 4 个固定 Tab
原结构是「4 个来源 Tab(内容只有一句提示语)× 6 个内容 Tab」,
且来源 Tab 会增删内容 Tab:选「自动发货」后标准商品/渠道映射/发单价格直接消失,
切换来源还会强制跳转。用户反馈「逻辑不顺、很多 tab 没必要」。

- 来源改为工具栏 Segmented:只筛数据,不改变导航;Tab 永远 4 个
  标准商品 / 渠道映射 / 成本配置 / 成本异常;
- 自动发货 SKU、发单价格、人工 SKU 配置合并为「成本配置」,
  选「全部」时给三个入口卡片,选具体来源时直接渲染对应面板;
- 自动发货 SKU 原本是标准商品的同数据子集(同一个接口 + carrierType),
  合并后不再有重复入口;
- 渠道映射在自动发货/人工来源下改为说明性提示,不再展示空表;
- 异常徽标改用当前来源的计数,不再出现「徽标 10 万、列表几百条」;
- refreshAll 改为按 queryKey 前缀失效,修好漏刷
  (诊断、未归一队列、人工 SKU 等 5 个查询);
- 删除 Context 里 12 个从未被读取的字段(products/versions/exceptions 等
  空数组与 loading 常量),注释改为与实现一致;
- 「生效发单价格」改名「生效成本版本」——它统计的是全部 active 版本,
  按来源过滤后叫发单价格会误导。

验证:后端 786 测试、前端 lint/typecheck/test/build 通过。
2026-10-25 13:55:36 +08:00

74 lines
2.6 KiB
TypeScript

/**
* 成本配置:按来源展示「成本怎么算」。
*
* 三个来源的成本形态完全不同,所以这里不做统一表格,而是按来源切换:
* 自动发货 → 上游 SKU 采购价(按 aff:<skuCode> 归一)
* 接单平台 → 接单模板发单金额(只读核对,改价去接单模板页)
* 人工客服 → 内部 SKU 的履约渠道与消耗积分
*
* 来源在页面顶部工具栏统一选择;选「全部」时这里给出三个入口,
* 避免把三套配置竖着堆在一页里。
*/
import { Button, Card, Col, Row, Space, Typography } from 'antd'
import { AffiliateSkuPanel } from './AffiliateSkuPanel'
import { useCostCenter } from './CostCenterContext'
import { ManualSkuConfigPanel } from './ManualSkuConfigPanel'
import { WorkOrderPricePanel } from './WorkOrderPricePanel'
import type { CostScope } from './shared'
const CONFIG_ENTRIES: Array<{
key: Exclude<CostScope, 'all'>
title: string
description: string
}> = [
{
key: 'affiliate_dash',
title: '自动发货采购价',
description: '按上游货源 SKU 配采购成本,订单项直接按 aff:<skuCode> 归一,不走渠道映射。',
},
{
key: 'work_order',
title: '接单平台发单金额',
description: '接单模板 → 发单金额的当前生效版本,只读核对;改价请改模板后重新同步。',
},
{
key: 'manual',
title: '人工客服 SKU 消耗',
description: '内部 SKU 的履约渠道与消耗积分;积分填 0 表示成本不固定,确认履约时手填。',
},
]
export default function CostConfigPanel() {
const { scope, setScope } = useCostCenter()
if (scope === 'affiliate_dash') return <AffiliateSkuPanel />
if (scope === 'work_order') return <WorkOrderPricePanel />
if (scope === 'manual') return <ManualSkuConfigPanel />
return (
<Space direction="vertical" size={12} style={{ width: '100%' }}>
<Typography.Text type="secondary">
成本配置按来源分开维护,选择一个来源查看;也可以在页面顶部直接切换来源。
</Typography.Text>
<Row gutter={[12, 12]}>
{CONFIG_ENTRIES.map((entry) => (
<Col xs={24} xl={8} key={entry.key}>
<Card
size="small"
title={entry.title}
extra={
<Button size="small" type="primary" onClick={() => setScope(entry.key)}>
去配置
</Button>
}
>
<Typography.Text type="secondary">{entry.description}</Typography.Text>
</Card>
</Col>
))}
</Row>
</Space>
)
}