# 商品中心与价格系统深度分析报告 > **文档目的**: 基于ChatGPT对话内容,结合项目现有文档和代码实现,系统梳理商品管理、价格策略、组织权限的核心架构,识别差距并提出最优解决方案。 > > **创建日期**: 2026-03-22 > > **参考来源**: `chatgpt-vs-2026-03-22T03-06-04-110Z.md` --- ## 目录 1. [核心概念梳理](#1-核心概念梳理) 2. [现有架构分析](#2-现有架构分析) 3. [差距识别与问题诊断](#3-差距识别与问题诊断) 4. [最优解决方案](#4-最优解决方案) 5. [实施步骤](#5-实施步骤) 6. [风险评估与应对](#6-风险评估与应对) 7. [附录](#7-附录) --- ## 1. 核心概念梳理 ### 1.1 商品映射 vs 商品刊登 | 维度 | 商品映射(Mapping) | 商品刊登(Listing/Publish) | |------|---------------------|----------------------------| | **本质** | 关系绑定 | 创建商品 + 发布到平台 | | **动作** | 不创建新商品 | 创建新Listing | | **方向** | 双向绑定 | 单向(系统→平台) | | **触发时机** | 已有商品需要统一管理 | 新品上架、批量铺货 | | **结果** | 系统知道"平台SKU = 主SKU" | 平台新增商品 | | **用途** | 统一库存、利润分析、AI调价 | 上新、自动铺货、跨平台分发 | **核心判断公式**: > 这个动作有没有在平台创建新商品? > - 有 → 刊登 > - 没有 → 映射 **业务流程对比**: ``` 场景1:已有店铺商品 → 用「映射」 平台已有商品 → 抓取 → 绑定到系统SKU → 完成映射 用途:统一管理库存、做利润分析、AI调价 场景2:要卖新产品 → 用「刊登」 选品 → AI生成内容 → 发布到平台 → 创建Listing 用途:上新、自动铺货、跨平台分发 ``` ### 1.2 价格归属问题 **核心结论**: > ❌ 价格绝对不属于商品(SKU)本身 > ✅ 价格属于:"渠道 + 场景 + Listing" **价格多场景示例**: ``` 场景1:跨平台价格不同 同一个SKU: - Amazon:$19.99 - TikTok:$17.99 - Shopify:$21.99 原因:手续费不同、流量成本不同、用户价格敏感度不同 场景2:同平台同店铺价格不同(AB测试/不同引流) 同一个SKU,在同一个TikTok店铺: - Listing A:$19.99(自然流量) - Listing B:$15.99(广告引流) - Listing C:$12.99(清库存) 原因:AB测试、不同标题/人群、不同投放策略、不同活动入口 ``` ### 1.3 三层价格体系 ``` ┌─────────────────────────────────────────┐ │ 1️⃣ 基准价层(Base Price Layer) │ │ SKU.base_price = 99 │ │ SKU.cost_price = 40 │ │ 用途:统一锚点、人工理解 │ └──────────────┬──────────────────────────┘ │ ↓ ┌─────────────────────────────────────────┐ │ 2️⃣ 策略层(Strategy Layer) │ │ PriceStrategy: │ │ - scope: 平台/店铺/Listing │ │ - type: multiplier/fixed/dynamic │ │ - value: 1.1 │ │ 用途:规则定义、批量控制 │ └──────────────┬──────────────────────────┘ │ ↓ ┌─────────────────────────────────────────┐ │ 3️⃣ Listing层(Final Price Layer) │ │ PlatformListing: │ │ - price(最终成交价) │ │ - strategy_id │ │ - override_price(手动覆盖) │ │ 用途:真正赚钱的地方 │ └─────────────────────────────────────────┘ ``` **最终价格计算公式**: ``` 最终价格 = override_price || strategy计算结果 || AI计算结果 ``` **三层价格体系示例**: ``` 主SKU: SKU-001(蓝牙耳机) ├── TikTok主店(东南亚) → 基准价 $99 → 策略: × 1.0 = $99 ├── TikTok美国店(美国) → 基准价 $99 → 策略: × 1.1 = $109 ├── Shopee旗舰店(马来) → 基准价 $99 → 策略: × 0.9 = $89 ├── Shopify独立站(全球) → 基准价 $99 → 策略: × 1.15 = $114 └── B2B批发(国内) → 基准价 $99 → 策略: × 0.5 = $50 ``` ### 1.4 组织权限模型 **核心原则**: > ❗ 权限 = 能做什么(Permission) > ❗ 数据范围 = 能操作谁的数据(Scope) > 👉 两者必须同时存在 **多租户层级结构**: ``` 平台(Platform) ↓ 商户/公司(Tenant/Organization) ↓ 组织结构(Org Tree) ├── 部门A(主管) │ ├── 组A1(组长) │ │ ├── 员工1 │ │ └── 员工2 │ └── 组A2(组长) │ └── 员工3 └── 部门B(主管) └── ... ``` **Scope(数据范围)定义**: ```typescript type DataScope = | 'SELF' // 只看自己 | 'TEAM' // 看自己组 | 'DEPT' // 看自己部门 | 'ORG' // 看整个公司 | 'ALL'; // 全平台(超管) ``` **角色权限设计**: | 角色 | 描述 | 权限范围 | |------|------|----------| | **owner** | 拥有者 | 删除店铺、管理授权、管理成员、所有权限 | | **admin** | 管理员 | 管理商品、管理价格、管理订单、不可删除店铺 | | **operator** | 运营 | 刊登、改价、查看数据 | | **viewer** | 只读 | 查看数据、不可操作 | ### 1.5 授权模型 **核心原则**: > ❗ 授权属于店铺,不属于用户 > ❗ 店铺属于主体(Owner),用户只是被授权使用 **店铺授权结构**: ``` Organization(公司) ↓ Shop(店铺) ↓ Auth(授权) ↑ User(使用者) ``` **授权类型**: | 类型 | 适用平台 | 存储内容 | |------|----------|----------| | **API授权** | Shopify、Amazon | access_token, refresh_token, expire_time | | **Agent授权** | TikTok、Shopee | cookies, proxy, device_id, user_agent | **授权状态机**: ``` INIT → AUTHORIZED → EXPIRED → INVALID → ERROR ``` ### 1.6 商品三层模型 ``` SPU(产品层) ↓ SKU(库存单元层) ↓ Listing(平台商品层) ``` **SPU(产品层)**: ```typescript Product (SPU) { id: string; name: string; // 蓝牙耳机 brand: string; category_id: string; attributes: JSON; // 通用属性 } ``` **SKU(库存单元)**: ```typescript ProductSKU { id: string; spu_id: string; sku_code: string; attributes: JSON; // {"color": "red", "size": "XL"} cost_price: number; // 成本价 base_price: number; // 基准价(参考用) weight: number; } ``` **PlatformListing(平台商品层)**: ```typescript PlatformListing { id: string; sku_id: string; shop_id: string; platform: string; platform_listing_id: string; title: string; price: number; // 最终销售价 stock: number; status: string; } ``` --- ## 2. 现有架构分析 ### 2.1 项目现有数据模型 基于 `docs/01_Architecture/03_Domain_Model.md`: | 实体 | 现有字段 | 缺失关键点 | |------|----------|------------| | **Product** | id, merchant_id, store_id, name, sku, price, stock | ❌ 无SPU/SKU分层、❌ 价格不应在SKU层 | | **Store** | id, merchant_id, name, platform, platform_shop_id | ✅ 基本完整,⚠️ 缺少org_id归属 | | **User** | id, merchant_id, role, status | ❌ 无Team归属、❌ 无Scope | | **Order** | id, user_id, merchant_id, total_amount, status | ⚠️ 缺少shop_id关联 | | **Inventory** | id, product_id, merchant_id, warehouse_id, quantity | ⚠️ 缺少SKU级别库存 | ### 2.2 项目现有权限设计 基于 `docs/02_Backend/07_RBAC_Design.md`: | 维度 | 现有实现 | 评估 | |------|----------|------| | 角色定义 | ADMIN/MANAGER/OPERATOR/FINANCE/SOURCING/LOGISTICS/ANALYST | ✅ 完整 | | 权限定义 | CREATE/READ/UPDATE/DELETE/APPROVE/EXPORT/IMPORT | ✅ 完整 | | 租户隔离 | tenantId字段过滤 | ✅ 已实现 | | 店铺隔离 | shopId字段过滤 | ⚠️ 部分实现 | | **组织层级** | ❌ 无Team/Department结构 | 🔴 **缺失** | | **数据范围** | ❌ 无Scope概念 | 🔴 **缺失** | | **层级继承** | ❌ 无parent_id树结构 | 🔴 **缺失** | ### 2.3 项目现有商品闭环 基于 `docs/00_Business/Business_ClosedLoops/01_Product.md`: | 闭环 | 状态 | 缺失点 | |------|------|--------| | 数据采集与清洗 | ✅ 已定义 | - | | 商品刊登 | ✅ 已定义 | ⚠️ 缺少Listing实体 | | SKU变体与结构 | ✅ 已定义 | ⚠️ 缺少映射表 | | 多平台商品管理 | ✅ 已定义 | ⚠️ 缺少价格策略层 | | 商品主数据 | ✅ 已定义 | ⚠️ 缺少属性标准化 | ### 2.4 项目现有服务编排 基于 `docs/01_Architecture/04_Service_Map.md`: | 服务闭环 | 状态 | 评估 | |----------|------|------| | 权限校验闭环 | ✅ 已定义 | ⚠️ 缺少Scope校验 | | 商户管理闭环 | ✅ 已定义 | ✅ 完整 | | 店铺管理闭环 | ✅ 已定义 | ⚠️ 缺少授权管理 | | 多租户数据隔离 | ✅ 已定义 | ⚠️ 缺少组织层级 | ### 2.5 项目现有状态机 基于 `docs/01_Architecture/06_State_Machine.md`: | 实体 | 状态定义 | 评估 | |------|----------|------| | Product | DRAFT → PENDING_APPROVAL → ACTIVE → INACTIVE → DISCONTINUED | ⚠️ 缺少Listing状态 | | Store | PENDING → ACTIVE → INACTIVE → SUSPENDED | ✅ 完整 | | Order | PENDING → PAID → SPLIT → PROCESSING → SHIPPED → COMPLETED → REFUNDED → CANCELLED | ✅ 完整 | --- ## 3. 差距识别与问题诊断 ### 3.1 🔴 严重问题(必须修复) #### 问题1:价格存储在SKU层 **现状**: ```typescript Product.price = 99 // ❌ 错误设计 ``` **后果**: - 一改价格 → 全平台全乱 - 无法做AB测试 - 无法做利润分析 - AI无法决策 **影响范围**:商品管理、价格策略、利润计算、AI调价 #### 问题2:缺少SPU/SKU分层 **现状**: ```typescript // 只有Product,无SPU/SKU区分 Product { id, name, sku, price } ``` **后果**: - 无法管理变体(颜色/尺寸) - 跨平台SKU映射困难 - 库存管理混乱 **影响范围**:商品管理、库存管理、订单归集 #### 问题3:缺少Listing实体 **现状**:无PlatformListing表 **后果**: - 无法支持"一个SKU → 多个Listing" - 无法实现同店铺多价格 - 无法做AB测试 **影响范围**:多平台管理、价格策略、刊登系统 #### 问题4:缺少组织层级 **现状**: ```typescript User { merchant_id, role } // 无team_id ``` **后果**: - 组长看不到下属数据 - 无法实现部门管理 - 无法支持代运营场景 **影响范围**:权限系统、数据隔离、团队协作 ### 3.2 🟡 中等问题(建议修复) #### 问题5:缺少价格策略表 **现状**:前端有UI,后端无表 **后果**: - 策略无法持久化 - 无法批量调价 - AI调价无基础 **影响范围**:价格管理、AI调价 #### 问题6:缺少SKU映射表 **现状**:前端有UI,后端无表 **后果**: - 映射关系无法存储 - 订单无法归集 - 库存无法统一 **影响范围**:多平台管理、库存同步 #### 问题7:缺少操作归因 **现状**:有OperationLog但无target_user_id **后果**: - 无法追踪"谁帮谁操作" - 无法做绩效分析 - 审计不完整 **影响范围**:审计系统、绩效分析 #### 问题8:缺少属性标准化体系 **现状**:无Attribute表 **后果**: - 不同平台类目不同 - AI生成依赖结构化数据 - 映射会失败 **影响范围**:商品管理、AI生成、跨平台刊登 ### 3.3 🟢 轻微问题(可后续优化) - 缺少类目映射系统 - 缺少单位/货币统一管理 - 缺少数据快照/回滚能力 - 缺少并发控制机制 - 缺少幂等性保证 --- ## 4. 最优解决方案 ### 4.1 数据模型重构方案 #### 4.1.1 商品三层模型 ```sql -- SPU(产品层) CREATE TABLE cf_spu ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, brand VARCHAR(100), category_id VARCHAR(36), description TEXT, main_image VARCHAR(500), status ENUM('draft', 'active', 'inactive', 'archived') DEFAULT 'draft', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_tenant (tenant_id), INDEX idx_category (category_id) ); -- SKU(库存单元层) CREATE TABLE cf_sku ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, spu_id VARCHAR(36) NOT NULL, sku_code VARCHAR(100) NOT NULL, name VARCHAR(255), attributes JSON, -- {"color": "red", "size": "XL"} cost_price DECIMAL(10,2) NOT NULL, -- 成本价 base_price DECIMAL(10,2), -- 基准价(参考用) weight DECIMAL(10,3), status ENUM('draft', 'active', 'inactive', 'archived') DEFAULT 'draft', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_tenant_sku (tenant_id, sku_code), INDEX idx_spu (spu_id), INDEX idx_tenant (tenant_id) ); -- PlatformListing(平台商品层) CREATE TABLE cf_platform_listing ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, sku_id VARCHAR(36) NOT NULL, shop_id VARCHAR(36) NOT NULL, platform ENUM('tiktok', 'shopee', 'lazada', 'shopify', 'woocommerce', 'b2b', 'custom') NOT NULL, platform_listing_id VARCHAR(100), -- 平台商品ID platform_sku VARCHAR(100), -- 平台SKU title VARCHAR(500), price DECIMAL(10,2) NOT NULL, -- 最终销售价 original_price DECIMAL(10,2), currency VARCHAR(10) DEFAULT 'USD', stock INT DEFAULT 0, status ENUM('draft', 'pending', 'active', 'inactive', 'error') DEFAULT 'draft', sync_status ENUM('synced', 'syncing', 'error', 'never') DEFAULT 'never', last_sync_at TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_sku (sku_id), INDEX idx_shop (shop_id), INDEX idx_platform_listing (platform, platform_listing_id), INDEX idx_tenant (tenant_id) ); ``` #### 4.1.2 价格策略模型 ```sql -- 价格策略表 CREATE TABLE cf_price_strategy ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, name VARCHAR(100) NOT NULL, scope ENUM('global', 'platform', 'shop', 'listing') NOT NULL, target_id VARCHAR(36), -- 平台ID/店铺ID/ListingID strategy_type ENUM('multiplier', 'fixed', 'dynamic', 'range') NOT NULL, strategy_value DECIMAL(10,4), -- 倍率或固定值 min_price DECIMAL(10,2), max_price DECIMAL(10,2), profit_rate_min DECIMAL(5,4), -- 最低利润率 is_active BOOLEAN DEFAULT TRUE, priority INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_tenant (tenant_id), INDEX idx_scope_target (scope, target_id) ); -- 价格变更日志 CREATE TABLE cf_price_change_log ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, listing_id VARCHAR(36) NOT NULL, old_price DECIMAL(10,2), new_price DECIMAL(10,2), change_type ENUM('manual', 'strategy', 'ai', 'sync') NOT NULL, strategy_id VARCHAR(36), reason VARCHAR(500), operator_id VARCHAR(36), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_listing (listing_id), INDEX idx_tenant (tenant_id), INDEX idx_created (created_at) ); ``` #### 4.1.3 SKU映射模型 ```sql -- SKU映射表 CREATE TABLE cf_sku_mapping ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, master_sku_id VARCHAR(36) NOT NULL, -- 主SKU listing_id VARCHAR(36) NOT NULL, -- 平台Listing mapping_type ENUM('auto', 'manual') DEFAULT 'manual', confidence DECIMAL(5,4), -- 自动映射置信度 status ENUM('active', 'inactive') DEFAULT 'active', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_sku_listing (master_sku_id, listing_id), INDEX idx_tenant (tenant_id) ); ``` #### 4.1.4 组织层级模型 ```sql -- 组织/公司表 CREATE TABLE cf_organization ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, type ENUM('company', 'department', 'team') NOT NULL, parent_id VARCHAR(36), -- 支持层级 level INT DEFAULT 0, -- 层级深度 path VARCHAR(500), -- 路径:/org1/org2/org3 manager_id VARCHAR(36), -- 负责人 status ENUM('active', 'inactive') DEFAULT 'active', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_tenant (tenant_id), INDEX idx_parent (parent_id), INDEX idx_path (path) ); -- 用户组织关系 CREATE TABLE cf_user_organization ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, user_id VARCHAR(36) NOT NULL, org_id VARCHAR(36) NOT NULL, role ENUM('manager', 'member') DEFAULT 'member', data_scope ENUM('self', 'team', 'dept', 'org', 'all') DEFAULT 'self', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_user_org (user_id, org_id), INDEX idx_tenant (tenant_id), INDEX idx_org (org_id) ); -- 店铺归属(挂到组织) ALTER TABLE cf_store ADD COLUMN org_id VARCHAR(36); ALTER TABLE cf_store ADD INDEX idx_org (org_id); ``` #### 4.1.5 授权模型 ```sql -- 店铺授权表 CREATE TABLE cf_shop_auth ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, shop_id VARCHAR(36) NOT NULL, auth_type ENUM('api', 'agent') NOT NULL, -- API类 access_token TEXT, refresh_token TEXT, expire_time TIMESTAMP, -- Agent类 cookies JSON, proxy VARCHAR(255), device_id VARCHAR(100), user_agent VARCHAR(500), -- 通用 status ENUM('init', 'authorized', 'expired', 'invalid', 'error') DEFAULT 'init', last_refresh_at TIMESTAMP, raw_data JSON, -- 原始返回(兼容) created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_shop (shop_id), INDEX idx_tenant (tenant_id) ); -- 用户店铺关系 CREATE TABLE cf_user_shop ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, user_id VARCHAR(36) NOT NULL, shop_id VARCHAR(36) NOT NULL, role ENUM('owner', 'admin', 'operator', 'viewer') DEFAULT 'operator', permissions JSON, -- 细粒度权限 status ENUM('active', 'inactive') DEFAULT 'active', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_user_shop (user_id, shop_id), INDEX idx_tenant (tenant_id), INDEX idx_shop (shop_id) ); ``` #### 4.1.6 属性标准化模型 ```sql -- 属性定义表 CREATE TABLE cf_attribute ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, name VARCHAR(100) NOT NULL, -- 颜色 / 尺寸 / 材质 code VARCHAR(50) NOT NULL, -- color / size type ENUM('enum', 'string', 'number') NOT NULL, is_required BOOLEAN DEFAULT FALSE, sort_order INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_tenant_code (tenant_id, code), INDEX idx_tenant (tenant_id) ); -- 属性值表 CREATE TABLE cf_attribute_value ( id VARCHAR(36) PRIMARY KEY, attribute_id VARCHAR(36) NOT NULL, value VARCHAR(100) NOT NULL, -- 红 / 蓝 / XL sort_order INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_attribute (attribute_id) ); -- SKU属性绑定 CREATE TABLE cf_sku_attribute ( id VARCHAR(36) PRIMARY KEY, sku_id VARCHAR(36) NOT NULL, attribute_id VARCHAR(36) NOT NULL, value VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_sku_attr (sku_id, attribute_id), INDEX idx_sku (sku_id) ); -- 类目映射表 CREATE TABLE cf_category_mapping ( id VARCHAR(36) PRIMARY KEY, tenant_id VARCHAR(36) NOT NULL, platform ENUM('tiktok', 'shopee', 'lazada', 'shopify', 'woocommerce', 'amazon') NOT NULL, platform_category_id VARCHAR(100) NOT NULL, platform_category_name VARCHAR(255), internal_category_id VARCHAR(36) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_platform_category (platform, platform_category_id), INDEX idx_tenant (tenant_id) ); ``` ### 4.2 服务层设计 #### 4.2.1 价格服务(PricingService) ```typescript /** * 价格服务 - 所有价格计算必须通过此服务 * 禁止在Controller或前端直接计算价格 */ interface PricingService { calculatePrice(skuId: string, shopId: string): Promise; applyStrategy(listingId: string, strategyId: string): Promise; overridePrice(listingId: string, price: number, reason: string): Promise; getPriceHistory(listingId: string, period: DateRange): Promise; suggestPrice(skuId: string, platform: Platform): Promise; batchApplyStrategy(skuIds: string[], strategyId: string): Promise; } interface PriceSuggestion { suggestedPrice: number; confidence: number; factors: { cost: number; competitorPrice?: number; demandLevel: 'low' | 'medium' | 'high'; profitRate: number; }; } interface BatchResult { success: number; failed: number; errors: Array<{ id: string; reason: string }>; } ``` #### 4.2.2 映射服务(MappingService) ```typescript /** * SKU映射服务 - 管理主SKU与平台Listing的映射关系 */ interface MappingService { createMapping(masterSkuId: string, listingId: string, type: 'auto' | 'manual'): Promise; autoMap(skuId: string, platform: Platform): Promise; validateMapping(mappingId: string): Promise; getMappingByListing(listingId: string): Promise; getMappingsBySku(skuId: string): Promise; batchMap(mappings: Array<{ skuId: string; listingId: string }>): Promise; } ``` #### 4.2.3 数据范围服务(DataScopeService) ```typescript /** * 数据范围服务 - 所有数据访问必须通过此服务校验 */ interface DataScopeService { getUserScope(userId: string): Promise; getAccessibleShopIds(userId: string): Promise; getAccessibleUserIds(userId: string): Promise; checkDataAccess(userId: string, targetShopId: string): Promise; getOrgTree(orgId: string): Promise; buildScopeQuery(userId: string, baseQuery: QueryBuilder): Promise; } interface DataScope { scope: 'self' | 'team' | 'dept' | 'org' | 'all'; orgIds: string[]; shopIds: string[]; userIds: string[]; } ``` #### 4.2.4 刊登服务(ListingService) ```typescript /** * 刊登服务 - 管理商品到平台的刊登流程 */ interface ListingService { createDraft(skuId: string, shopId: string, data: ListingDraftData): Promise; publishDraft(draftId: string): Promise; syncToListing(listingId: string): Promise; batchPublish(draftIds: string[]): Promise; getListingStatus(listingId: string): Promise; } interface PublishResult { success: boolean; platformListingId?: string; error?: string; } ``` ### 4.3 API设计 #### 4.3.1 商品API ```yaml # SPU管理 GET /api/v1/spu # SPU列表 POST /api/v1/spu # 创建SPU GET /api/v1/spu/:id # SPU详情 PUT /api/v1/spu/:id # 更新SPU DELETE /api/v1/spu/:id # 删除SPU # SKU管理 GET /api/v1/spu/:spuId/sku # SKU列表 POST /api/v1/spu/:spuId/sku # 创建SKU GET /api/v1/sku/:id # SKU详情 PUT /api/v1/sku/:id # 更新SKU DELETE /api/v1/sku/:id # 删除SKU # Listing管理 GET /api/v1/listing # Listing列表(支持多筛选) POST /api/v1/listing # 创建Listing(刊登) GET /api/v1/listing/:id # Listing详情 PUT /api/v1/listing/:id # 更新Listing DELETE /api/v1/listing/:id # 删除Listing POST /api/v1/listing/:id/sync # 同步到平台 POST /api/v1/listing/batch # 批量操作 ``` #### 4.3.2 价格API ```yaml # 价格策略 GET /api/v1/price-strategy # 策略列表 POST /api/v1/price-strategy # 创建策略 PUT /api/v1/price-strategy/:id # 更新策略 DELETE /api/v1/price-strategy/:id # 删除策略 POST /api/v1/price-strategy/:id/apply # 应用策略 # 价格操作 GET /api/v1/listing/:id/price # 获取价格 PUT /api/v1/listing/:id/price # 修改价格 GET /api/v1/listing/:id/price/history # 价格历史 POST /api/v1/listing/:id/price/suggest # AI建议价 ``` #### 4.3.3 映射API ```yaml GET /api/v1/sku-mapping # 映射列表 POST /api/v1/sku-mapping # 创建映射 DELETE /api/v1/sku-mapping/:id # 删除映射 POST /api/v1/sku-mapping/auto # 自动映射 POST /api/v1/sku-mapping/validate # 验证映射 ``` #### 4.3.4 组织API ```yaml # 组织管理 GET /api/v1/organization # 组织列表 POST /api/v1/organization # 创建组织 GET /api/v1/organization/:id # 组织详情 PUT /api/v1/organization/:id # 更新组织 DELETE /api/v1/organization/:id # 删除组织 GET /api/v1/organization/:id/tree # 组织树 # 用户组织关系 GET /api/v1/user-organization # 用户组织关系 POST /api/v1/user-organization # 分配用户到组织 PUT /api/v1/user-organization/:id # 更新关系 DELETE /api/v1/user-organization/:id # 移除关系 # 数据范围 GET /api/v1/data-scope # 获取当前用户数据范围 GET /api/v1/data-scope/shops # 可访问店铺 GET /api/v1/data-scope/users # 可管理用户 ``` #### 4.3.5 授权API ```yaml # 店铺授权 GET /api/v1/shop-auth # 授权列表 POST /api/v1/shop-auth # 创建授权 GET /api/v1/shop-auth/:id # 授权详情 DELETE /api/v1/shop-auth/:id # 删除授权 POST /api/v1/shop-auth/:id/refresh # 刷新授权 # OAuth流程 GET /api/v1/auth/:platform/start # 开始OAuth GET /api/v1/auth/:platform/callback # OAuth回调 # Agent授权 POST /api/v1/auth/agent/login # Agent登录 POST /api/v1/auth/agent/cookie # 上传Cookie ``` ### 4.4 前端改造方案 #### 4.4.1 页面结构调整 ``` 商品中心(新一级菜单) ├── 商品管理(SPU/SKU) │ ├── SPU列表 │ ├── SKU列表 │ └── 商品详情 ├── 平台商品(Listing) │ ├── Listing列表 │ ├── 刊登管理 │ └── 同步状态 ├── 价格策略 │ ├── 策略列表 │ ├── 策略配置 │ └── 价格历史 └── SKU映射 ├── 映射列表 └── 自动映射 组织管理(新一级菜单) ├── 组织架构 │ ├── 组织树 │ └── 成员管理 ├── 店铺管理 │ ├── 店铺列表 │ └── 授权管理 └── 权限配置 ├── 角色管理 └── 数据范围 ``` #### 4.4.2 关键组件设计 ```typescript interface ProductListPage { filters: { platform?: Platform[]; shopIds?: string[]; status?: ProductStatus; category?: string; search?: string; }; view: 'spu' | 'sku' | 'listing'; actions: { batchEdit: () => void; batchSync: () => void; export: () => void; }; } interface PriceStrategyEditor { basePrice: number; strategies: PriceStrategy[]; calculatedPrices: Map; onStrategyChange: (strategy: PriceStrategy) => void; onApply: () => void; } interface DataScopeSelector { currentScope: DataScope; orgTree: OrganizationNode[]; onScopeChange: (scope: DataScope) => void; } interface ListingPriceEditor { listingId: string; currentPrice: number; basePrice: number; strategyPrice: number; onPriceChange: (price: number, reason: string) => void; } ``` #### 4.4.3 操作日志增强 ```typescript interface OperationLog { id: string; tenant_id: string; user_id: string; shop_id: string; action: string; target_id: string; target_user_id?: string; // 新增:操作归属用户 before: JSON; after: JSON; ip: string; device: string; created_at: Timestamp; } ``` --- ## 5. 实施步骤 ### 5.1 阶段一:数据模型迁移(预计3天) #### 任务清单 | 任务ID | 任务描述 | 优先级 | 预计时间 | |--------|----------|--------|----------| | DB-001 | 创建cf_spu表 | P0 | 0.5天 | | DB-002 | 创建cf_sku表 | P0 | 0.5天 | | DB-003 | 创建cf_platform_listing表 | P0 | 0.5天 | | DB-004 | 创建cf_price_strategy表 | P0 | 0.5天 | | DB-005 | 创建cf_sku_mapping表 | P1 | 0.5天 | | DB-006 | 创建cf_organization表 | P1 | 0.5天 | | DB-007 | 创建cf_user_organization表 | P1 | 0.5天 | | DB-008 | 创建cf_shop_auth表 | P1 | 0.5天 | | DB-009 | 创建cf_user_shop表 | P1 | 0.5天 | | DB-010 | 创建cf_attribute表 | P2 | 0.5天 | | DB-011 | 创建cf_attribute_value表 | P2 | 0.5天 | | DB-012 | 创建cf_sku_attribute表 | P2 | 0.5天 | | DB-013 | 创建cf_category_mapping表 | P2 | 0.5天 | | DB-014 | 数据迁移脚本(Product→SPU/SKU/Listing) | P0 | 1天 | #### 数据迁移策略 ```sql -- Step 1: 迁移现有Product到SPU INSERT INTO cf_spu (id, tenant_id, name, status, created_at) SELECT id, merchant_id, name, status, created_at FROM cf_product; -- Step 2: 创建默认SKU(每个SPU一个) INSERT INTO cf_sku (id, tenant_id, spu_id, sku_code, name, cost_price, base_price, status, created_at) SELECT UUID() as id, merchant_id as tenant_id, id as spu_id, sku as sku_code, name, price * 0.4 as cost_price, -- 假设成本为售价40% price as base_price, status, created_at FROM cf_product; -- Step 3: 创建默认Listing(关联到店铺) INSERT INTO cf_platform_listing (id, tenant_id, sku_id, shop_id, platform, price, stock, status, created_at) SELECT UUID() as id, p.merchant_id as tenant_id, s.id as sku_id, p.store_id as shop_id, st.platform, p.price, p.stock, p.status, p.created_at FROM cf_product p JOIN cf_sku s ON s.spu_id = p.id JOIN cf_store st ON st.id = p.store_id; -- Step 4: 创建默认价格策略 INSERT INTO cf_price_strategy (id, tenant_id, name, scope, strategy_type, strategy_value, is_active) SELECT UUID() as id, merchant_id as tenant_id, '默认策略' as name, 'global' as scope, 'multiplier' as strategy_type, 1.0 as strategy_value, TRUE as is_active FROM cf_merchant; ``` ### 5.2 阶段二:服务层实现(预计5天) #### 任务清单 | 任务ID | 任务描述 | 优先级 | 预计时间 | |--------|----------|--------|----------| | SVC-001 | PricingService实现 | P0 | 1天 | | SVC-002 | MappingService实现 | P0 | 1天 | | SVC-003 | DataScopeService实现 | P0 | 1天 | | SVC-004 | ListingService实现 | P1 | 1天 | | SVC-005 | OrganizationService实现 | P1 | 0.5天 | | SVC-006 | AuthService实现 | P1 | 0.5天 | #### 服务层实现原则 1. **所有业务逻辑必须在Service层** 2. **Controller只负责请求/响应和权限校验** 3. **禁止跨Domain直接操作数据库** 4. **所有状态变更必须通过STATE_MACHINE** ### 5.3 阶段三:API层实现(预计3天) #### 任务清单 | 任务ID | 任务描述 | 优先级 | 预计时间 | |--------|----------|--------|----------| | API-001 | 商品API实现 | P0 | 1天 | | API-002 | 价格API实现 | P0 | 1天 | | API-003 | 映射API实现 | P1 | 0.5天 | | API-004 | 组织API实现 | P1 | 0.5天 | ### 5.4 阶段四:前端改造(预计5天) #### 任务清单 | 任务ID | 任务描述 | 优先级 | 预计时间 | |--------|----------|--------|----------| | FE-001 | 商品管理页面重构 | P0 | 1天 | | FE-002 | Listing管理页面 | P0 | 1天 | | FE-003 | 价格策略页面 | P0 | 1天 | | FE-004 | 组织架构页面 | P1 | 1天 | | FE-005 | 授权管理页面 | P1 | 0.5天 | | FE-006 | 数据范围选择器组件 | P1 | 0.5天 | ### 5.5 阶段五:测试与验证(预计2天) #### 任务清单 | 任务ID | 任务描述 | 优先级 | 预计时间 | |--------|----------|--------|----------| | TEST-001 | 单元测试编写 | P0 | 0.5天 | | TEST-002 | 集成测试编写 | P0 | 0.5天 | | TEST-003 | 数据迁移验证 | P0 | 0.5天 | | TEST-004 | 权限系统验证 | P0 | 0.5天 | ### 5.6 总体进度安排 ``` 阶段一:数据模型迁移 ████████░░░░░░░░░░░░ Day 1-3 阶段二:服务层实现 ░░░░░░░░████████░░░░ Day 4-8 阶段三:API层实现 ░░░░░░░░░░░░░░██████ Day 9-11 阶段四:前端改造 ░░░░████████░░░░░░░░ Day 12-16 阶段五:测试与验证 ░░░░░░░░░░░░░░░░████ Day 17-18 ``` **预计总工期**:**18天**(可并行压缩至12天) --- ## 6. 风险评估与应对 ### 6.1 技术风险 #### 风险1:数据迁移数据丢失 **风险等级**:🔴 高 **影响**:历史商品数据丢失,影响业务连续性 **应对措施**: 1. 迁移前完整备份现有数据 2. 编写迁移验证脚本,对比迁移前后数据量 3. 保留原Product表6个月,设置只读 4. 分批迁移,每批验证后再进行下一批 **回滚方案**: ```sql -- 回滚脚本示例 DROP TABLE IF EXISTS cf_spu, cf_sku, cf_platform_listing; RESTORE TABLE cf_product FROM backup; ``` #### 风险2:权限系统重构影响现有用户 **风险等级**:🟡 中 **影响**:现有用户权限丢失或混乱 **应对措施**: 1. 为现有用户自动创建默认组织关系 2. 保留原有role字段作为fallback 3. 灰度发布,先在测试环境验证 4. 提供权限迁移工具,支持手动调整 #### 风险3:价格计算逻辑变更导致价格错误 **风险等级**:🔴 高 **影响**:商品价格错误,影响销售和利润 **应对措施**: 1. 所有价格变更记录日志 2. 价格计算服务增加单元测试覆盖 3. 上线前进行价格对比验证 4. 提供价格回滚功能 ### 6.2 业务风险 #### 风险4:用户不适应新操作流程 **风险等级**:🟡 中 **影响**:用户投诉,使用效率下降 **应对措施**: 1. 提供详细的操作文档和视频教程 2. 保留旧版入口1个月过渡期 3. 收集用户反馈,快速迭代优化 4. 提供在线客服支持 #### 风险5:多平台同步延迟 **风险等级**:🟡 中 **影响**:数据不一致,影响运营决策 **应对措施**: 1. 增加同步状态监控和告警 2. 提供手动同步入口 3. 记录同步日志,便于排查 4. 设置合理的同步频率和重试机制 ### 6.3 性能风险 #### 风险6:组织层级查询性能问题 **风险等级**:🟡 中 **影响**:权限校验慢,影响系统响应 **应对措施**: 1. 使用path字段优化层级查询 2. 缓存用户Scope信息 3. 定期更新层级缓存 4. 限制组织层级深度(建议不超过5层) ```typescript // Scope缓存示例 const userScopeCache = new Map(); async function getUserScope(userId: string): Promise { if (userScopeCache.has(userId)) { return userScopeCache.get(userId)!; } const scope = await calculateUserScope(userId); userScopeCache.set(userId, scope); return scope; } ``` ### 6.4 风险矩阵 | 风险 | 等级 | 概率 | 影响 | 应对优先级 | |------|------|------|------|------------| | 数据迁移丢失 | 🔴 高 | 低 | 极高 | P0 | | 价格计算错误 | 🔴 高 | 中 | 极高 | P0 | | 权限系统混乱 | 🟡 中 | 中 | 高 | P1 | | 用户不适应 | 🟡 中 | 高 | 中 | P2 | | 同步延迟 | 🟡 中 | 中 | 中 | P2 | | 性能问题 | 🟡 中 | 低 | 中 | P3 | --- ## 7. 附录 ### 7.1 术语对照表 | 术语 | 英文 | 说明 | |------|------|------| | 商品映射 | Product Mapping | 绑定系统SKU与平台商品的关系 | | 商品刊登 | Product Listing | 创建新商品并发布到平台 | | 基准价 | Base Price | SKU层的参考价格锚点 | | 策略层 | Strategy Layer | 价格规则定义层 | | Listing层 | Listing Layer | 最终销售价格层 | | 数据范围 | Data Scope | 用户可访问的数据边界 | | 组织层级 | Organization Hierarchy | 公司/部门/团队的树形结构 | ### 7.2 参考文档 - [Domain_Model.md](../01_Architecture/03_Domain_Model.md) - [RBAC_Design.md](../02_Backend/07_RBAC_Design.md) - [Service_Map.md](../01_Architecture/04_Service_Map.md) - [State_Machine.md](../01_Architecture/06_State_Machine.md) - [Product.md](../00_Business/Business_ClosedLoops/01_Product.md) - [project-specific-rules.md](../.trae/rules/project-specific-rules.md) ### 7.3 变更记录 | 日期 | 版本 | 变更内容 | 作者 | |------|------|----------|------| | 2026-03-22 | 1.0 | 初始版本,完整分析报告 | AI | --- *本报告基于ChatGPT对话内容和项目现有文档综合分析生成,如有疑问请参考原始文档。*