升鲜宝B2B订货商城后端开发文档(一)---升鲜宝生鲜配送供应链管理系统(源代码开发支持服务)

升鲜宝B2B订货商城后端开发文档

订单模块分离 + 客户通知/Banner/购物车/商城装修最终修正版

|--------|---------------------------------------------------|
| 项目 | 内容 |
| 文档版本 | V2.1 修正版 |
| 适用对象 | 后端开发、前端开发、测试、实施、产品经理 |
| 技术栈建议 | Spring Boot + MyBatis-Plus + MySQL 8.0 + Redis |
| 核心边界 | B2B商城只负责客户订货入口、展示、价格、购物车、装修和提交前校验;客户订单统一交给OMS订单模块 |
| 商品口径 | B2B商城走公司商品体系,sku_unit_id = pms_goods_sku_unit.id |
| 库存口径 | 公司库存与成本由wms_模块处理,主核算字段为product_sku_id + unit_id |

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 本文档按最新确认口径重新整理:客户订单不属于B2B商城后端内部实现,统一由升鲜宝OMS订单模块承接;B2B商城只在提交前完成登录、价格、购物车、起订量、可见范围等校验,然后调用OMS提交接口。客户通知使用shop_notice / shop_notice_type,Banner使用mall_banner系列表,购物车使用现有oms_shop_cart并建议统一命名为oms_order_cart。 |

目录

  1. 业务定位与边界

  2. B2B订货商城后台菜单与功能模块

  3. 前台客户订货端功能

  4. 登录、价格与下单权限规则

  5. 数据库表结构与E-R关系

  6. 商城装修、Banner与客户通知

  7. 购物车与OMS订单模块集成

  8. 后端接口与Service设计

  9. 索引、缓存、权限与安全

  10. 重构迁移步骤与验收清单

1. 业务定位与边界

B2B订货商城是升鲜宝面向B端客户的在线订货入口,核心任务是让客户浏览公司商品、查看默认价或专属价、加入购物车、使用常购/收藏/订货模板,并在登录后提交订货请求。

|---------------|-----------------------------------------|----------------------------|
| 对象 | 正确边界 | 不能混用的模块 |
| B2B订货商城 | B端客户订货入口;商品展示、客户价格、购物车、装修、通知、提交前校验 | 不能直接写客户订单主从表;不能使用门店会员商城订单表 |
| OMS订单模块 | 统一生成与管理客户订单、审核、发货、签收、对账相关订单数据 | B2B商城只调用提交接口,不自己维护订单状态机 |
| 公司商品体系 pms_ | B2B商城商品来源;sku_unit_id代表公司销售商品最小粒度 | 不能用门店商品规格ID作为B2B商品主字段 |
| 公司库存/成本 wms_ | 发货扣库存和成本核算;主字段为product_sku_id + unit_id | 不能把cwms_当成公司库存 |
| 客户自用进销存 cwms_ | B2B客户自己的轻量库存/进销存 | 不代表供应链公司库存 |
| 门店会员商城/POS | 门店卖给会员/消费者;走门店商品体系 | 不能和B2B客户订货商城混用 |

图1 B2B订货商城与商品、价格、购物车、OMS、WMS的边界关系

1.1 最重要的开发口径

|------------|-------------------------------------------------------------|
| 规则 | 说明 |
| B2B商城商品主字段 | sku_unit_id = pms_goods_sku_unit.id,代表公司商品中心销售商品最小粒度。 |
| 客户未登录 | 可浏览商品、搜索商品、查看分类、查看默认价/公开价;不能显示客户特殊价或价格组价;不能加入购物车和提交订单。 |
| 客户已登录 | 按客户ID、客户账号、价格组、客户特殊价计算专属价;允许购物车、订货模板、常购、收藏、提交订单。 |
| 订单归属 | 客户订单统一由OMS订单模块维护;B2B商城只负责"提交订单前"的业务校验和请求组装。 |
| 库存归属 | B2B前台可展示可售/库存提示,但公司库存成本核算在wms_,按product_sku_id + unit_id处理。 |

2. B2B订货商城后台菜单与功能模块

|----------|----------|-------------------------------------------------|-------------------------------------------------------------------------|
| 一级菜单 | 二级功能 | 后端职责 | 主要表 |
| B2B订货商城 | 首页装修 | 维护首页页面、组件、商品楼层、快捷入口,发布后给客户订货端读取 | 建议新增 b2b_mall_page / b2b_mall_page_component |
| B2B订货商城 | Banner管理 | 复用商城Banner表,按banner_type=1作为客户Banner,支持价格组或客户范围 | mall_banner / mall_banner_info / mall_banner_shop |
| B2B订货商城 | 客户通知 | 复用客户通知表,按notice_category=1作为B端客户通知/公告 | shop_notice / shop_notice_type |
| B2B订货商城 | 商品展示配置 | 控制可订货商品、推荐商品、分类展示、商品排序、上下架展示 | pms_goods_sku_unit / cus_customer_grade_price / mall_banner_info |
| B2B订货商城 | 客户价格 | 客户特殊价、价格组价、分类规则、起订量、有效期 | cus_customer_price / cus_customer_grade_price / cus_customer_grade_rule |
| B2B订货商城 | 购物车 | 客户购物车增删改查、选中状态、重算价格、提交前校验 | oms_shop_cart 或 oms_order_cart |
| B2B订货商城 | 常购/收藏/模板 | 提高复购效率,快速加入购物车 | cus_often_buy / cus_goods_favorite / cus_order_template |
| B2B订货商城 | 订单提交入口 | 调用OMS提交接口,不维护订单主从表 | OMS服务接口 |

2.1 后台菜单建议

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| B2B订货商城 ├── 商城首页装修 │ ├── 页面管理 │ ├── 组件管理 │ ├── 商品楼层 │ └── 发布记录 ├── Banner管理 │ ├── Banner列表 │ ├── Banner商品明细 │ └── Banner客户/价格组范围 ├── 客户通知 │ ├── 通知类型 │ └── 通知内容 ├── 商品展示 │ ├── 可订货商品 │ ├── 推荐商品 │ └── 商品排序 ├── 客户价格 │ ├── 客户特殊价 │ ├── 价格组价 │ └── 分类毛利率规则 ├── 购物车管理 ├── 常购/收藏/订货模板 └── 商城设置 ├── 默认价格显示 ├── 登录与下单规则 ├── 库存显示规则 └── 缓存刷新 |

3. 前台客户订货端功能

|------------|----------|----------|--------------------------------------|
| 功能 | 匿名客户 | 登录客户 | 说明 |
| 首页 | 可访问 | 可访问 | 首页聚合Banner、通知、分类、推荐商品、商品楼层。匿名只展示默认价。 |
| 商品分类/搜索 | 可访问 | 可访问 | 按公司商品体系pms_查询,返回sku_unit_id。 |
| 商品详情 | 可查看默认价 | 可查看专属价 | 登录后根据客户价引擎计算价格、起订量、可见范围。 |
| 购物车 | 不可使用 | 可使用 | 未登录点击加入购物车时返回401或提示登录。 |
| 常购/收藏/订货模板 | 不可使用 | 可使用 | 这些都依赖客户身份和客户账号。 |
| 提交订单 | 不可使用 | 可使用 | B2B商城调用OMS提交接口。 |
| 客户通知 | 可查看公开公告 | 可查看客户通知 | notice_category=1;必要时按shop_id或价格组过滤。 |

4. 登录、价格与下单权限规则

图2 B2B商城登录、价格、购物车、订单提交流程

4.1 价格显示规则

|-----------|----------|--------------|-------------|---------------------------------------------------------------------|
| 客户状态 | 展示价格 | 是否可加入购物车 | 是否可提交订单 | 取价逻辑 |
| 未登录 | 默认价/公开价 | 否 | 否 | 只读取pms_goods_sku_unit.unit_price或B2B默认价,不查询cus_customer_price和价格组价。 |
| 已登录 | 客户专属价 | 是 | 是 | 客户特殊价 > 价格组商品价 > 分类规则计算价 > 默认价。 |
| 账号禁用/客户禁用 | 不显示专属价 | 否 | 否 | 登录态存在也必须校验客户和账号状态。 |

4.2 价格优先级

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| price = null if exists cus_customer_price where trade_id = customerId and sku_unit_id = skuUnitId: price = customerSpecialPrice else if exists cus_customer_grade_price where customer_grade_id = customerGradeId and sku_unit_id = skuUnitId and date valid: price = gradeProductPrice else if exists cus_customer_grade_rule by category: price = calculateByRule(defaultPrice, addprice_type, addprice_ratio, price_ratio, sale_rate) else: price = pms_goods_sku_unit.unit_price 未登录时:只允许返回默认价,不进入客户价引擎。 提交前:无论购物车保存了什么价格,都必须重新调用价格引擎。 |

5. 数据库表结构与E-R关系

图3 商品、客户价格、购物车、OMS提交关系

5.1 表清单总览

|--------|----------------------------------------------------------------------|-------------------------------|----------------------------|
| 分类 | 表名 | 现状/建议 | 用途 |
| 商品展示 | pms_goods / pms_goods_sku / pms_goods_sku_unit | 复用现有 | 公司商品体系,B2B商城商品来源。 |
| 价格 | cus_customer_price | 复用现有 | 客户特殊价。 |
| 价格 | cus_customer_grade_price / cus_customer_grade_rule | 复用现有 | 价格组商品价和分类规则。 |
| Banner | mall_banner / mall_banner_info / mall_banner_shop | 复用现有 | B2B客户Banner,banner_type=1。 |
| 客户通知 | shop_notice / shop_notice_type | 复用现有 | B端客户通知,notice_category=1。 |
| 购物车 | oms_shop_cart | 复用现有,建议统一命名/视图为oms_order_cart | 客户购物车。 |
| 常用订货 | cus_goods_favorite / cus_often_buy | 复用现有 | 收藏和常购商品。 |
| 订货模板 | cus_order_template / cus_order_template_info | 复用现有 | 客户订货模板。 |
| 商城装修 | b2b_mall_page / b2b_mall_page_component / b2b_mall_component_product | 建议新增 | 补齐低代码首页装修能力。 |
| 订单 | oms_order_bill / oms_order_bill_info | 不属于B2B商城内部表 | 只作为OMS接口输出结果和查询关联。 |

5.2 pms_goods_sku_unit:公司销售商品最小粒度

|--------------------------------|------------|---------------------------------|
| 字段 | 说明 | B2B商城使用方式 |
| id | 公司商品规格单位ID | B2B商城商品主字段sku_unit_id。 |
| product_sku_id | 公司商品SKU ID | 用于关联pms_goods_sku,并在提交OMS时一并传递。 |
| unit_id | 销售单位ID | 用于商品单位展示、起订量、购物车数量单位。 |
| unit_price | 统一订货价/默认价 | 未登录时可显示默认价;登录后作为兜底价。 |
| purchase_price / cost_price | 采购价/成本价 | B2B前台不直接展示,可用于后台分析或OMS成本快照。 |
| recommend_price | 推荐指导价 | 可作为划线价或参考价,但要与实际价格引擎区分。 |
| plu / container_load / presell | PLU、装箱量、预售 | 可用于称重、装箱量提示、预售展示。 |

5.3 cus_customer_price:客户特殊价

|---------------|------------|---------------------------|
| 字段 | 说明 | B2B规则 |
| trade_id | 客户ID | 登录后按当前客户匹配。 |
| sku_unit_id | 公司销售商品最小粒度 | 与pms_goods_sku_unit.id匹配。 |
| product_alias | 客户商品别名 | 商品列表可优先显示别名。 |
| unit_price | 客户特殊销售价 | 价格优先级最高。 |
| before_price | 折前价 | 用于前端展示原价。 |
| nunit_price | 不含税价 | 用于税价分离场景。 |
| limit_min | 起订量 | 加入购物车和提交前必须校验。 |

5.4 cus_customer_grade_price / cus_customer_grade_rule:价格组价格

|--------------------------|-----------------------------------------------------------------------------------------------|-----------------------------|
| | 关键字段 | 说明 |
| cus_customer_grade_price | customer_grade_id, sku_unit_id, unit_price, start_time, end_time, limit_min | 客户没有特殊价时按价格组商品价取价。 |
| cus_customer_grade_rule | customer_grade_id, product_category_id, addprice_type, addprice_ratio, price_ratio, sale_rate | 没有价格组商品价时,可按分类毛利率或直接加价规则计算。 |

5.5 oms_shop_cart / oms_order_cart:B2B购物车

|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| 当前数据库检索到的购物车表为oms_shop_cart。为了业务命名更清晰,建议代码层统一称为oms_order_cart,数据库可采用"先建视图兼容、后续迁移改名"的方式。不要使用mall_shop_cart作为B2B客户购物车,因为mall_shop_cart更容易与门店会员/POS体系混淆。 |

|------------------------------------------|------------|-----------------------------------|
| 字段 | 说明 | 开发说明 |
| id | 购物车主键 | 建议雪花ID。 |
| shop_id | 客户ID | 虽然注释为店铺id,但B2B商城应按客户ID理解。 |
| shop_account_id | 客户子账号ID | 用于区分同一个B2B客户下不同账号。 |
| sku_unit_id | 公司销售商品最小粒度 | 购物车商品主字段,关联pms_goods_sku_unit.id。 |
| product_sku_id / unit_id | 兼容字段 | 可冗余保存,便于OMS和库存换算。 |
| qty | 数量/净重 | 购物车数量,必须大于0,并满足起订量。 |
| unit_price | 购物车保存价格 | 仅作当时展示快照,提交前必须重新算价。 |
| amount | 金额 | unit_price * qty,提交前重算。 |
| gross_weight / peel_weight | 毛重/去皮 | 生鲜称重场景可用。 |
| pre_auxiliaryunit_id / pre_auxiliary_num | 辅助单位/数量 | 支持箱、件、斤等双单位展示。 |
| presell | 是否预售 | 用于预售商品校验。 |
| container_load | 装箱量 | 用于整箱、装箱提示。 |

6. 商城装修、Banner与客户通知

图4 商城装修、Banner、客户通知E-R关系

6.1 Banner复用现有表

|------------------|---------------------------------------------------------------------------------------------------|-------------------------------------------------------|
| 表名 | 关键字段 | B2B使用规则 |
| mall_banner | banner_code, banner_name, banner_image, url, start_date, end_date, banner_type, customer_grade_id | banner_type=1表示客户Banner;customer_grade_id可用于价格组定向展示。 |
| mall_banner_info | banner_code, sku_unit_id, unit_price | Banner关联商品,sku_unit_id必须是公司商品体系pms_goods_sku_unit.id。 |
| mall_banner_shop | banner_code, shop_id | 可用于指定客户可见;如果不指定客户,则按价格组或公开规则展示。 |

6.2 客户通知复用 shop_notice

|------------------|------------------------------------------------------------------------|-------------------------------------------------|
| 表名 | 关键字段 | B2B使用规则 |
| shop_notice_type | id, notice_type_name, notice_category | notice_category=1表示客户通知类型。 |
| shop_notice | notice_type_id, shop_id, subject, content, read_count, notice_category | notice_category=1表示客户通知;shop_id可为空表示公共通知,或指定客户。 |

|----------------------------------------------------------------------------------------------|
| B2B客户通知优先使用shop_notice / shop_notice_type,不再使用sys_notice作为B2B客户公告主表。sys_notice只适合后台系统内部用户通知。 |

6.3 商城装修建议新增轻量表

|----------------------------|---------------------------------|----------|
| 建议表 | 用途 | 是否必须 |
| b2b_mall_page | 定义B2B商城首页、分类页、专题页等页面版本。 | 建议新增 |
| b2b_mall_page_component | 定义页面组件,如Banner组件、分类导航、商品楼层、公告条。 | 建议新增 |
| b2b_mall_component_product | 组件绑定商品,用sku_unit_id作为商品字段。 | 建议新增 |

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| CREATE TABLE b2b_mall_page ( id BIGINT NOT NULL COMMENT '主键ID', page_code VARCHAR(64) NOT NULL COMMENT '页面编码,如HOME', page_name VARCHAR(100) NOT NULL COMMENT '页面名称', page_type TINYINT NOT NULL DEFAULT 1 COMMENT '页面类型 1首页 2专题页 3分类页', publish_status TINYINT NOT NULL DEFAULT 0 COMMENT '发布状态 0草稿 1已发布 2停用', version INT NOT NULL DEFAULT 1 COMMENT '版本号', enabled TINYINT NOT NULL DEFAULT 1, del_flag TINYINT NOT NULL DEFAULT 0, sort_code INT NOT NULL DEFAULT 1, creator BIGINT DEFAULT NULL, create_date BIGINT DEFAULT NULL, updater BIGINT DEFAULT NULL, update_date BIGINT DEFAULT NULL, remark VARCHAR(255) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_b2b_mall_page_code (page_code) ) COMMENT='B2B商城装修页面表'; CREATE TABLE b2b_mall_page_component ( id BIGINT NOT NULL COMMENT '主键ID', page_id BIGINT NOT NULL COMMENT '页面ID=b2b_mall_page.id', component_code VARCHAR(64) DEFAULT NULL COMMENT '组件编码', component_type VARCHAR(50) NOT NULL COMMENT '组件类型 banner/notice/category/product_floor/quick_entry', component_name VARCHAR(100) DEFAULT NULL COMMENT '组件名称', config_json JSON DEFAULT NULL COMMENT '组件配置JSON', sort_code INT NOT NULL DEFAULT 1, enabled TINYINT NOT NULL DEFAULT 1, del_flag TINYINT NOT NULL DEFAULT 0, creator BIGINT DEFAULT NULL, create_date BIGINT DEFAULT NULL, updater BIGINT DEFAULT NULL, update_date BIGINT DEFAULT NULL, remark VARCHAR(255) DEFAULT NULL, PRIMARY KEY (id), KEY idx_b2b_component_page (page_id, sort_code) ) COMMENT='B2B商城装修组件表'; CREATE TABLE b2b_mall_component_product ( id BIGINT NOT NULL COMMENT '主键ID', component_id BIGINT NOT NULL COMMENT '组件ID=b2b_mall_page_component.id', sku_unit_id BIGINT NOT NULL COMMENT '公司销售商品最小粒度=pms_goods_sku_unit.id', sort_code INT NOT NULL DEFAULT 1, enabled TINYINT NOT NULL DEFAULT 1, del_flag TINYINT NOT NULL DEFAULT 0, creator BIGINT DEFAULT NULL, create_date BIGINT DEFAULT NULL, updater BIGINT DEFAULT NULL, update_date BIGINT DEFAULT NULL, remark VARCHAR(255) DEFAULT NULL, PRIMARY KEY (id), KEY idx_b2b_component_product (component_id, sort_code), KEY idx_b2b_component_sku_unit (sku_unit_id) ) COMMENT='B2B商城组件商品关联表'; |

7. 购物车与OMS订单模块集成

B2B订货商城不直接创建客户订单主表和明细表。客户点击提交订单时,商城后端只负责将购物车商品转换为OMS订单提交DTO,并调用OMS订单模块服务。

|----------|-------------------------------------------------------|----------------------------------------|
| 步骤 | B2B商城职责 | OMS职责 |
| 1. 购物车选择 | 读取客户购物车、选中商品、数量、辅助单位 | 无 |
| 2. 提交前校验 | 校验登录、客户状态、商品可见、起订量、预售、价格有效性 | 无 |
| 3. 重算价格 | 调用客户价格引擎重算unit_price、amount | 无 |
| 4. 组装DTO | 生成OmsOrderSubmitDTO,包含customerId、skuUnitId、qty、price等 | 接收DTO |
| 5. 提交订单 | 调用OmsOrderSubmitService.submitFromB2bMall(dto) | 生成oms_order_bill / oms_order_bill_info |
| 6. 清理购物车 | OMS返回成功后删除/失效已提交购物车项 | 返回订单号和结果 |

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| public interface B2bMallCheckoutService { B2bCheckoutPreviewVO preview(B2bCheckoutPreviewDTO dto); OmsOrderSubmitResultVO submitToOms(B2bSubmitOrderDTO dto); } public interface OmsOrderSubmitService { OmsOrderSubmitResultVO submitFromB2bMall(OmsB2bOrderSubmitDTO dto); } // B2B商城提交时必须传递幂等号,防止重复点击生成重复订单。 // idempotentKey = customerId + shopAccountId + cartVersion + requestNo |

8. 后端接口与Service设计

8.1 客户端API

|----------------------------------------|----------|-------------------------------|-------------------------|
| 接口 | 登录要求 | 说明 | 主要Service |
| GET /api/b2b/mall/home | 否 | 首页聚合:Banner、通知、分类、商品楼层、默认/客户价 | B2bMallHomeService |
| GET /api/b2b/mall/products | 否 | 商品列表;匿名默认价,登录客户价 | B2bProductQueryService |
| GET /api/b2b/mall/products/{skuUnitId} | 否 | 商品详情 | B2bProductQueryService |
| GET /api/b2b/mall/notices | 否/可选 | 客户通知列表;登录后可按客户过滤 | B2bNoticeService |
| POST /api/b2b/mall/cart/add | 是 | 加入购物车 | B2bCartService |
| PUT /api/b2b/mall/cart/items/{id} | 是 | 修改数量、辅助数量、选中状态 | B2bCartService |
| DELETE /api/b2b/mall/cart/items/{id} | 是 | 删除购物车行 | B2bCartService |
| POST /api/b2b/mall/checkout/preview | 是 | 提交前预览、重算价格 | B2bMallCheckoutService |
| POST /api/b2b/mall/checkout/submit | 是 | 调用OMS提交订单 | B2bMallCheckoutService |
| GET /api/b2b/mall/favorites | 是 | 收藏商品 | B2bFavoriteService |
| GET /api/b2b/mall/often-buy | 是 | 常购商品 | B2bOftenBuyService |
| GET /api/b2b/mall/templates | 是 | 订货模板 | B2bOrderTemplateService |

8.2 管理端API

|--------------------------------------------|------------------------|
| 接口 | 说明 |
| GET /api/admin/b2b/mall/pages | 商城装修页面分页 |
| POST /api/admin/b2b/mall/pages | 新增装修页面 |
| PUT /api/admin/b2b/mall/pages/{id}/publish | 发布装修页面并刷新缓存 |
| GET /api/admin/b2b/mall/banners | Banner管理,复用mall_banner |
| GET /api/admin/b2b/mall/notices | 客户通知管理,复用shop_notice |
| GET /api/admin/b2b/mall/products | 可订货商品展示配置 |
| POST /api/admin/b2b/mall/cache/refresh | 刷新首页、商品、价格缓存 |

8.3 Service拆分建议

|--------------------------|----------------------------------|
| Service | 职责 |
| B2bMallHomeService | 首页聚合、匿名/登录上下文识别、缓存读取。 |
| B2bMallDecorationService | 页面、组件、商品楼层管理;发布与回滚。 |
| B2bBannerService | Banner查询和后台维护;过滤banner_type=1。 |
| B2bNoticeService | 客户通知查询和后台维护;过滤notice_category=1。 |
| B2bProductQueryService | 商品列表、详情、搜索;组合商品、价格、库存提示。 |
| B2bCustomerPriceService | 价格引擎:特殊价、价格组价、规则价、默认价。 |
| B2bCartService | 购物车增删改查、价格重算、失效商品处理。 |
| B2bCheckoutService | 提交前预览、幂等、调用OMS。 |
| B2bFavoriteService | 收藏商品。 |
| B2bOftenBuyService | 常购商品。 |
| B2bOrderTemplateService | 订货模板。 |

9. 索引、缓存、权限与安全

9.1 索引建议

|--------------------------------|---------------------------------------------------------------------------|---------------|
| | 建议索引 | 说明 |
| mall_banner | (banner_type, enabled, del_flag, start_date, end_date) | 首页Banner高频查询。 |
| mall_banner_info | (banner_code, sku_unit_id) | Banner关联商品。 |
| mall_banner_shop | (banner_code, shop_id) | 按客户过滤Banner。 |
| shop_notice | (notice_category, shop_id, enabled, del_flag, create_date) | 客户通知列表。 |
| shop_notice_type | (notice_category, enabled, del_flag) | 客户通知类型。 |
| oms_shop_cart / oms_order_cart | (shop_id, shop_account_id, sku_unit_id, enabled, del_flag) | 客户购物车唯一与查询。 |
| cus_customer_price | (trade_id, sku_unit_id, enabled, del_flag) | 客户特殊价。 |
| cus_customer_grade_price | (customer_grade_id, sku_unit_id, enabled, del_flag, start_time, end_time) | 价格组价。 |
| b2b_mall_page_component | (page_id, enabled, del_flag, sort_code) | 装修组件。 |
| b2b_mall_component_product | (component_id, sku_unit_id, enabled, del_flag) | 商品楼层。 |

9.2 缓存建议

|---------------------------------------------------|--------|----------------------------|
| 缓存Key | 内容 | 失效时机 |
| b2b:home:{customerGradeId}:{customerId or public} | 首页聚合数据 | 装修发布、Banner变更、通知变更、商品楼层变更。 |
| b2b:price:{customerId}:{skuUnitId} | 客户商品价格 | 客户价、价格组价、客户价格组变更。 |
| b2b:product:list:{hashQuery} | 商品列表 | 商品上下架、价格变更、分类变更。 |
| b2b:notice:{customerId} | 客户通知列表 | 通知新增、修改、禁用。 |

9.3 权限与安全规则

|--------|---------------------------------------------------------------|
| 场景 | 规则 |
| 匿名浏览 | 只允许GET类商品/首页/通知公共数据;不得暴露客户价、账单、订单、模板。 |
| 购物车 | 必须登录;校验客户账号状态和商品可订货状态。 |
| 提交订单 | 必须登录;必须重算价格;必须幂等;必须调用OMS。 |
| 客户通知 | notice_category=1;可根据shop_id或价格组过滤可见范围。 |
| Banner | banner_type=1;可按customer_grade_id和mall_banner_shop.shop_id过滤。 |
| 数据权限 | B2B客户只能访问自己的购物车、模板、常购、收藏、通知和价格。 |

10. 重构迁移步骤与验收清单

10.1 推荐迁移步骤

|---------------|----------------------------------------------------------|-------------------------------------------|
| 阶段 | 工作内容 | 风险控制 |
| 第1阶段:口径统一 | 代码中明确B2B商城=客户订货入口,订单=OMS,商品=公司sku_unit_id。 | 所有接口DTO统一字段名skuUnitId。 |
| 第2阶段:购物车兼容 | 现有oms_shop_cart保留;新增视图或代码别名oms_order_cart。 | 不要一次性改表名影响旧功能。 |
| 第3阶段:通知修正 | B2B客户通知改用shop_notice/shop_notice_type,notice_category=1。 | 旧文档中sys_notice的B2B公告逻辑废弃。 |
| 第4阶段:Banner修正 | Banner使用mall_banner系列,banner_type=1。 | 商品明细sku_unit_id必须指向pms_goods_sku_unit.id。 |
| 第5阶段:装修补表 | 新增b2b_mall_page等轻量装修表。 | 先做首页,后扩展专题页。 |
| 第6阶段:OMS集成 | B2B提交订单改为调用OMS服务。 | 必须使用幂等号,防重复订单。 |
| 第7阶段:缓存与索引 | 补索引、首页缓存、价格缓存。 | 价格提交前必须重算,不能只信缓存。 |

10.2 开发验收清单

|---------|----------------------------------------------------|
| 验收项 | 必须满足 |
| 匿名商品浏览 | 未登录可看商品和默认价,但不能加入购物车和提交订单。 |
| 登录客户价格 | 登录后能按客户特殊价、价格组价、默认价正确返回。 |
| 客户通知 | shop_notice.notice_category=1的数据能在B2B商城展示。 |
| Banner | mall_banner.banner_type=1的数据能在B2B商城展示,并支持价格组/客户过滤。 |
| 购物车 | oms_shop_cart/oms_order_cart可按客户和子账号隔离。 |
| 提交订单 | B2B商城不直接写oms_order_bill;必须调用OMS服务。 |
| 价格重算 | 提交前价格必须重新计算,购物车保存价只能作为快照。 |
| 字段口径 | B2B商品主字段必须为sku_unit_id=pms_goods_sku_unit.id。 |
| 模块边界 | 不得使用mall_shop_order作为B2B客户订单。 |
| 库存边界 | 不得把cwms_作为公司库存;公司库存/成本由wms_处理。 |

附录A:DTO示例

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| public class B2bProductListVO { private Long skuUnitId; private Long productSkuId; private Long unitId; private String goodsName; private String skuName; private String unitName; private String imageUrl; private BigDecimal defaultPrice; private BigDecimal salePrice; private String priceType; // DEFAULT / CUSTOMER_SPECIAL / CUSTOMER_GRADE / RULE private BigDecimal minOrderQty; private Boolean canOrder; private Boolean loginRequired; } public class B2bCartItemDTO { private Long skuUnitId; private BigDecimal qty; private Long auxiliaryUnitId; private BigDecimal auxiliaryQty; } public class OmsB2bOrderSubmitDTO { private Long customerId; private Long customerAccountId; private String source; // B2B_MALL private String idempotentKey; private List<OmsB2bOrderSubmitItemDTO> items; } |

附录B:关键SQL示例

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| -- B2B客户Banner SELECT * FROM mall_banner WHERE banner_type = 1 AND enabled = 1 AND del_flag = 0 AND (start_date IS NULL OR start_date <= :now) AND (end_date IS NULL OR end_date >= :now) AND (customer_grade_id IS NULL OR customer_grade_id = :customerGradeId) ORDER BY sort_code ASC; -- B2B客户通知 SELECT n.* FROM shop_notice n WHERE n.notice_category = 1 AND n.enabled = 1 AND n.del_flag = 0 AND (n.shop_id = 0 OR n.shop_id = :customerId) ORDER BY n.sort_code ASC, n.create_date DESC; -- 客户购物车 SELECT * FROM oms_shop_cart WHERE shop_id = :customerId AND shop_account_id = :customerAccountId AND enabled = 1 AND del_flag = 0 ORDER BY update_date DESC; |

|--------------------------------------------------------------------------------------------------------------------------------------|
| 最终结论:B2B订货商城是客户订货入口,不是订单中心。它复用公司商品pms_、客户价格cus_、Banner mall_banner、客户通知shop_notice、购物车oms_shop_cart/oms_order_cart,并通过OMS提交接口生成客户订单。 |

相关推荐
升鲜宝供应链及收银系统源代码服务1 天前
【研究与学习】悦厚系统商品模块功能设计与数据字典文档(一)---升鲜宝生鲜配送供应链管理系统
生鲜配送源代码·供应链源代码·生鲜供应链源代码·竞品研究与学习·生鲜配送软件系统排名
升鲜宝供应链及收银系统源代码服务1 天前
【研究与学习】易订货商品模块设计分析文档字段级数据字典 + 表关系 + 单位换算 + 价格/库存/促销链路(一)---升鲜宝生鲜配送供应链管理系统
生鲜配送源代码·供应链源代码·生鲜供应链源代码·竞品学习与研究·供应链源代码出售
升鲜宝供应链及收银系统源代码服务2 天前
【研究与学习】菜小秘后台 SaaS 租户运营控制、费用管理系统数据字典及功能设计方案详细文档(一)---升鲜宝生鲜配送供应链管理系统
生鲜配送·生鲜配送源代码·供应链源码·收银系统源代码·农批系统·分拣系统源代码
升鲜宝供应链及收银系统源代码服务4 天前
升鲜宝云仓供应链管理系统 数据库数据字典设计 (一)---升鲜宝生鲜配送供应链管理系统
java·生鲜配送源代码·供应链源代码·生鲜供应链源代码·企业erp源代码·云仓供应链管理系统
升鲜宝供应链及收银系统源代码服务14 天前
升鲜宝后端 API 与手机端 API 开发说明(一)---升鲜宝生鲜配送供应链管理系统重构版
生鲜配送源代码·生鲜供应链管理系统·升鲜宝生鲜配送源代码·后端app与手机端
升鲜宝供应链及收银系统源代码服务16 天前
通用明细列表控件设计与开发文档(一)---升鲜宝生鲜配送供应链管理软件重构方案
重构·生鲜配送·生鲜配送源代码·供应链源代码·生鲜供应链源代码·企业erp源代码
升鲜宝供应链及收银系统源代码服务16 天前
管理类软件通用高级查询组件(一)---升鲜宝生鲜配送供应链管理软件重构方案
java·重构·生鲜配送源代码·供应链源代码·生鲜供应链源代码
升鲜宝供应链及收银系统源代码服务19 天前
升鲜宝 生鲜配送供应链管理系统,订单模块OMS 重构版 MySQL DDL详尽说明文档与重构说明
生鲜配送·生鲜配送源代码·供应链源代码·生鲜供应链源代码·企业erp源代码·升鲜宝供应链源代码
升鲜宝供应链及收银系统源代码服务20 天前
OMS 订单模块重构正式文档(一)---升鲜宝生鲜配送供应链管理系统
java·开发语言·重构·生鲜配送源代码·生鲜供应链源代码