原结构是「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 通过。
74 lines
2.6 KiB
TypeScript
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>
|
|
)
|
|
}
|