电商ERP需求说明书怎么写?订单、库存、财务三大链路的关键条目
简介这是一份电商ERP系统需求说明书的Word文档面向产品经理、系统分析师及ERP项目实施人员用于梳理电商业务核心流程与功能边界。文档仅包含1个docx文件大小约1.12MB但结构完整具备清晰目录导航可快速定位各个需求模块。内容覆盖项目背景、总体需求、主要业务流程重点展开采购系统需求供应商管理、采购计划与合同、单据审核查询统计和库房系统需求库房架构、商品管理、盘点并细化商品采购入库、销售出库等典型场景。读者可借此学习电商ERP需求文档的编写规范、模块划分方法也可作为撰写同类说明书的实践模板。当前已有142人学习浏览适合需要提升需求分析与文档撰写能力的相关人员。1. 电商ERP需求说明书与其追问选型不如先定义状态与边界电商ERP项目立项后团队最容易犯的错不是选错框架而是在需求评审会上反复讨论“按钮放左边还是右边”却没人回答“订单已支付但库存被释放时数据怎么兜底”。电商ERP系统需求说明书要解决的不是页面长相而是订单、库存、财务三条主链路的流转规则、角色边界和数据字典。它能阻止开发期每三天冒出一个“待确认”导致排期失控也能让测试不用靠猜来写用例。这份文档的价值在于把口头共识沉淀成可勾稽的条目。ERP实施顾问靠它拆模块、产品靠它画原型、后端靠它建表、测试靠它写用例。新手可以照章梳理流程老手则能借它审视那些常被忽略的状态抖动、对账时间差和数据权限范围。电商ERP系统需求说明书不是交差用的Word文件而是衡量项目是否具备开工条件的准绳。2. 盘点电商ERP需求说明书里的系统业务流程与角色权限矩阵2.1 电商ERP系统业务流程梳理的输入与输出电商ERP系统业务流程梳理的起点不是画泳道图而是收集业务事件。前台产生的订单创建、支付回调、退款申请仓库里的入库、移库、盘点财务侧的结算单、发票、成本调整这些都是流程的输入。需求说明书要做的是把这些事件按“动作、角色、条件、异常”四个维度落成一张主流程表而不是画一堆没人维护的流程图。流程节点动作要点角色前置条件异常与超时规则订单创建平台订单拉取或手动创建平台接口/客服商品上架且价格有效接口超时写入重试队列30分钟后自动补偿订单审核判定订单信息并决定是否拆单客服/运营订单状态为已支付收货地址缺失进入异常队列邮件通知配货生成出库单并锁定库存仓库管理员审核通过且库存可配库存不足生成缺货单按付款时间排序发货出库并回传物流单号仓库管理员配货完成且面单打印成功物流回传失败进入定时补传完成订单关闭并允许售后系统自动签收超过7天超时未结算转入财务异常对账单这张表的意义在于每行都能映射到功能需求编号。比如 R-ORD-001 对应订单创建R-ORD-002 对应订单审核后续开发、测试、验收都以这个编号为锚点。电商ERP系统业务流程的输出物不是一张好看的图而是行、列都可勾稽的表。需求说明书里每出现一个业务流程都应追问一句断点发生时默认动作是什么责任人是谁。2.2 角色与权限矩阵谁能建单、谁能拆单、谁能改价电商ERP系统需求说明书里如果只写“运营有订单权限”等于没写。订单操作包括查看全部订单、查看本店铺订单、修改收货人、手工拆单、改价、申请退款每项操作的业务影响完全不同。手工拆单会改变物流费用分摊改价直接影响财务对账金额所以权限必须同时定义功能和数据范围两个维度。功能点运营客服仓库管理员财务数据范围与审批说明订单查看全部店铺本店铺本仓全部客服不可见采购成本字段手工拆单允许不允许允许不允许拆单后运费自动重算提交审批改价允许不允许不允许允许改价超过500元需财务二次确认数据导出按店铺按店铺按仓库全量导出操作写入审计日志这张矩阵表最关键的列是最后一列“数据范围与审批说明”。它确定了开发的实现方向是建“角色-权限-数据范围”三张关联表还是引入 ABAC 模型做属性级控制。老系统迁移时权限矩阵最容易糊弄过去。让业务各自列出每天实际打开的菜单比问“你需要什么权限”更有效因为绝大多数角色说不清自己需要什么但能说清自己每天干什么。电商ERP里还有一个特有维度平台店铺ID。旗舰店、专营店如果权限不同需求说明书要明确把店铺ID作为数据过滤维度否则开发期会因为一张订单归属哪个店铺吵上两周。2.3 订单状态机电商ERP需求说明书里的核心数据设计订单状态机是电商ERP系统需求说明书里最有价值的一张定义表它决定了数据库字典表里的枚举值、前端按钮的显示逻辑、后端接口的校验规则。写清楚合法流转路径可以避免开发期每个人都凭直觉加一个状态。一个常见的反例是把“已支付”和“已审核”合并成一个状态结果拆单时数据对不上因为支付是资金维度审核是业务维度两者必须分开。// 电商ERP订单状态机定义简化版 const ORDER_FLOW { CREATED: { // 订单已创建未付款 allow: [PAID, CANCELED, CLOSED], onEnter: () lockStock(false) // 先锁定库存不扣减 }, PAID: { // 已付款等待审核 allow: [AUDITING, REFUNDING, CLOSED], onEnter: () { holdStock(); createFinancialRecord(); } }, AUDITING: { // 审核通过进入配货 allow: [PICKING, REJECTED, REFUNDING], onEnter: () generateOutboundOrder() } };这段代码定义了订单域内三个核心状态的合法流转方向。allow 数组就是状态流转规则的唯一事实来源前端按钮要不要置灰、后端接口要不要拦截、测试用例要不要写某条路径都从这份定义里推导。onEnter 里的动作是状态变更后的副作用比如锁定库存、生成财务记录、创建出库单这些副作用必须在需求说明书里列出来开发才知道状态变更不是改一个字段那么简单。电商ERP订单状态机还要考虑子状态。比如 PAID 下面可以挂 WAIT_SPLIT待拆单、WAIT_REVIEW风控审核中、WAIT_STOCK等待调拨子状态用 sub_status 字段存放不会污染主状态。很多系统在跑一段时间后订单状态变得不可维护原因是把业务分支塞进了主状态枚举里。需求说明书如果能定义主状态和子状态的分层关系就能避免这种腐化。另一个要点是状态编码要在数据库字典表里可配置而不是散落在代码常量里否则每次加状态都要发版。提示订单状态机的评审要拉上客服负责人。平台售后规则、超时关单时间、拦截发货这些业务约束都会反向影响状态定义别让后端自己拍板。3. 把订单、库存、财务写进电商ERP需求说明书的关键条目3.1 订单拆分、合并与赠品策略的条目写法电商ERP里的拆单逻辑比看上去复杂得多。预售品和现货品要拆成两个包裹不同仓库的商品要拆单单件商品超重也要拆。拆单后原订单和子订单的关系、运费如何分摊、退款时按哪个维度处理这些都要在需求说明书里逐个写清。用自然语言描述容易产生歧义常见做法是给每个需求一个结构化条目模板。- id: R-ORD-013 title: 已支付订单的自动拆单与手动拆单 priority: P0 scenario: 用户同时购买预售品和现货品时系统应在支付后根据子订单归属仓库 自动拆分为两张发货单运营也可以手工拆分同仓订单用于处理包装体积超限。 precondition: 订单状态为 PAID actions: - 根据 sku-仓库映射生成子订单 - 原订单状态保留子订单共享支付单号 - 拆单后运费按重量重新分摊 exception: - 子订单均未发货时可合并回原单 - 已发货子订单禁止合并提示具体差异原因 acceptance: - 每个子订单有独立出库单号 - 原单与所有子单金额之和保持一致这个 YAML 条目定义了需求的唯一编号、优先级、场景、前置条件和验收标准。P0 表示不做系统无法上线P1 可以后置一个版本P2 属于优化项。precondition 限制了触发时机避免开发把自动拆单做成下单时拆分。actions 列表描述系统要执行的动作序列exception 则定义了失败分支。写拆单需求时最容易被漏掉的是“子订单共享支付单号”如果不写这句财务对账时会把一笔支付拆成多笔差异永远对不平。赠品策略也是同类问题。满赠、阶梯赠、加价购都会生成额外子订单赠品要不要占库存、是否计入销售额、是否可退需求说明书要单独成条。常见做法是给赠品订单打上 order_typegift 标记在统计报表里默认排除。如果需求说明书只写一句“支持赠品”开发大概率把它做成普通商品后续数据口径直接乱掉。3.2 多仓库与虚拟库存需求说明书必须定义库存扣减时点库存是电商ERP里最容易扯皮的部分核心分歧点在于“下单时扣库存还是付款时扣库存”。下单锁定、付款扣减、发货扣减各有各的问题需求说明书必须确定一个而不是写“灵活配置”。“灵活配置”意味着把决策成本推给开发最后做出来的是一个没人敢调的四不像。-- 电商ERP库存流水表字段级数据字典示例 CREATE TABLE inventory_transaction ( id BIGINT PRIMARY KEY AUTO_INCREMENT, order_id VARCHAR(32) NOT NULL COMMENT 来源单据号, sku_id VARCHAR(32) NOT NULL COMMENT 商品SKU, warehouse_id VARCHAR(32) NOT NULL COMMENT 仓库ID, change_type ENUM(LOCK, UNLOCK, DEDUCT, RETURN, ADJUST) COMMENT LOCK下单锁定, DEDUCT发货扣减, RETURN售后退货, change_qty INT NOT NULL COMMENT 变动数量正数增加负数减少, before_qty INT NOT NULL COMMENT 变动前可用库存, after_qty INT NOT NULL COMMENT 变动后可用库存, created_at DATETIME NOT NULL, KEY idx_order (order_id, change_type), KEY idx_sku (sku_id, warehouse_id) );这个建表语句划定的是库存流水的字段级数据字典。change_type 枚举里把 LOCK、UNLOCK、DEDUCT 分开库存扣减时点一旦有争议查流水就能看出到底是在哪个环节扣的。需求说明书里应有一句不可争议的公式“可用库存 物理库存 - 已锁定 在途 - 待发货”。这句话确定了数据语义后续所有库存报表、超卖判断都以此为准。多仓场景里还要写清楚仓库间调拨的流程。A仓库存不足、B仓有余量订单要不要自动拆分发货调拨在途库存算不算可用库存这都属于电商ERP系统需求说明书需要覆盖的规则。业务上常见做法是调拨单生成时在途增加但可用不变收货后才计入物理库存。虚拟库存则应用于多店铺共用同一仓的场景店铺A和店铺B各自分配可售额度额度耗尽即停售补货建议由系统按近7天销量和安全库存阈值自动生成。这些业务策略不写进需求文档实现时就会变成开发按自己理解做出来的野逻辑。3.3 财务对账需求对账粒度决定了开发量级财务模块是电商ERP系统需求说明书里最容易被业务一句话带过、又最容易让项目延期的部分。“跟平台对账就行”这句话背后藏着订单级、资金级、费用级三个完全不同的维度。需求分析阶段必须明确对账粒度粒度越细接口数量和数据清洗的工作量越大。对账维度数据源对齐键差异类型处理方式订单级平台结算单 vs ERP订单平台订单号SKU金额差、数量差生成差异单标记人工处理收款级支付渠道流水 vs ERP收款记录支付流水号在途资金、时间差按T1快照对齐费用级平台账单佣金、广告费、技术服务费账单周期跨期分摊、重复扣款计入待摊费用并生成红蓝冲这张表直接在需求说明书里作为模板使用。订单级对账的对齐键写成“平台订单号SKU”是因为一个订单可能拆成多个包裹只有到SKU维度金额才具备可比性。收款级的在途资金指的是用户已付款但平台尚未结算给商家的部分这不是差异而是正常的时间差。费用级最容易出问题的是跨期分摊平台在7月扣了8月的广告费如果按扣费时间入账报表口径就乱了。对账模块还有个容易被忽略的规则对账快照时刻。ERP在23:59发货平台结算单次日凌晨才生成如果把这种时间差当差异去重会产生大量工单。常见做法是在需求说明书里规定每晚零点生成前一日全量对账快照之后的接口回写只算作第二天的数据。这个规则可以帮开发省掉一半的“对账失败”排查时间。数据结构上对账diff记录表需要有对账批次号和差异类型索引否则数据量上来后人工处理界面会卡到没法用。4. 电商ERP需求说明书的非功能需求、接口契约与数据迁移4.1 非功能需求怎么写才不会被开发吐槽“系统要支持高并发、大数据量”是需求说明书里最没用的废话。没有数字就没有验收标准开发做完也不知道自己算不算达标。非功能需求要落到场景和可测量的指标上哪怕是给一个阶段性基线也比空泛形容词有价值。电商ERP场景里的性能基线与前台商城完全不同更看重的是批处理吞吐量和后台查询的响应时间。场景基线指标说明订单列表查询1秒内返回默认查询近90天数据支持按店铺、状态、时间过滤库存扣减接口P95小于500ms锁定与扣减拆分为两条链路避免长事务平台订单拉取5分钟内同步从平台推送到达至ERP可见不超过5分钟报表导出10万行以上分页异步生成文件不占用接口请求线程这些数值不是拍脑袋定的而是按常见的订单量和团队规模给出的基线。需求说明书里写明“性能验收以测试环境数据量为基准线上高峰期监控同口径指标”开发和测试才有共同语言。安全方面收货人手机号、地址属于敏感字段必须加密存储且日志脱敏删除操作全部走软删除同时记录操作审计日志。可维护性方面订单状态、仓库类型、快递公司这类字典数据要能在后台配置需求说明书里应明确禁止在代码里硬编码枚举值硬编码会让运营每次加一个快递渠道都要求研发发版。4.2 接口需求与电商平台对接的字段级约定接口需求是需求说明书里最容易被糊弄的部分要么只写“对接天猫/京东订单接口”要么整篇粘贴平台文档。平台文档描述的是对方的规则需求说明书要定义的是双方约定字段命名、类型、是否可空、异常时谁负责重试。常见做法是把接口字段收敛成一张表再附一份JSON Schema防止前后端对字段语义各说各话。字段名类型必填说明platform_order_snstring(32)是平台订单号全局唯一对账对齐键order_statusinteger是平台侧状态码必须保留原值order_amountdecimal(10,2)是应付金额单位元含运费不含优惠pay_timedatetime否付款时间未支付订单为空receiver_mobilestring(20)是收货人手机号入库前脱敏sku_itemsarray是SKU明细列表含sku_id、数量、单价字段命名用 platform_order_sn 而不是 order_no是为了显式声明它来自平台侧且作为对账唯一键。还有一个隐含的坑一些开发团队在纠结 Vue 能不能做电商ERP管理系统实际上前端框架选型对工作量影响有限真正决定排期的是这份文档里的接口契约、状态机和数据字典。前端组件再花哨字段对不上也是白搭。后续代码实现时需求说明书里的字段名应该直接沿用为数据库列名减少一层映射关系接口入参校验都要和这份表保持一致。{ $schema: http://json-schema.org/draft-07/schema#, type: object, required: [platform_order_sn, order_status, order_amount], properties: { platform_order_sn: { type: string, maxLength: 32 }, order_status: { type: integer }, order_amount: { type: number, minimum: 0 }, pay_time: { type: [string, null], format: date-time }, receiver_mobile: { type: string, pattern: ^\\?[0-9\\-]{6,20}$ }, sku_items: { type: array, minItems: 1, items: { $ref: #/definitions/skuItem } } }, definitions: { skuItem: { type: object, required: [sku_id, quantity, price], properties: { sku_id: { type: string }, quantity: { type: integer, minimum: 1 }, price: { type: number } } } } }这个JSON Schema定义了订单同步接口的请求体结构。required 字段列出来的是必须校验的参数缺任何一个直接返回错误码。pay_time 允许 null 是因为未支付订单也会推送不能因为缺少付款时间就拒绝入库。receiver_mobile 的 pattern 校验拦截了脏数据避免客服拿着错号打电话。sku_items 里 minItems: 1 防止空明细订单入库。对多平台对接需求说明书要明确平台差异的处理策略字段映射、状态码翻译、重试间隔都做成可配置而不是为每个平台写一套独立逻辑。4.3 数据迁移与历史数据快照电商ERP系统切换时数据迁移是最容易被砍掉的需求章节。老系统里的历史订单、商品档案、客户余额如果不迁新系统上线后客服连查单都查不到如果全量迁移又会被脏数据拖垮。需求说明书的迁移章节要给出数据实体清单和清洗规则明确哪些数据是迁移的、哪些只保留查询快照。数据实体源系统字段新系统字段清洗规则校验方式商品档案category_codecategory_id按字典表映射无法映射的归入“其他”抽样比对1000条历史订单status_textorder_status remark非活跃状态统一收敛为CLOSED总量级与金额级核对客户余额balanceaccount_balance转入期初余额并生成期初凭证财务负责人签字确认历史订单的迁移是最容易翻车的。老系统里“已取消”可能有几十种写法“取消”“用户取消”“超时关单”“客服取消”如果不收敛新系统的统计报表会出现一堆“未知状态”。常见做法是迁移时全部收敛到 CANCELED 或 CLOSED 两个终止态原始文本写入 remark 字段原状态码存入扩展字段供审计不尝试翻译成新系统的活跃状态。旧脏数据一旦进入活跃流程会让新系统上线第一周的订单流转面目全非。迁移校验不能只看总行数金额求和、订单数、SKU明细数、售后单数加在一起对上了才敢说迁移基本可靠。注意数据迁移一定要在测试环境完整跑一遍并且保留迁移日志。生产环境迁移失败时没有日志就只能全量回滚那将意味着至少半天的业务中断。5. 用需求编号反查验收覆盖度电商ERP需求说明书的落地校验技巧需求说明书写完之后怎么确认它不是一本废纸答案是让每条需求都能被追踪。工作重点不是守着Word文档改措辞而是建立“需求条目 → 验收条目 → 测试用例”的映射关系。一条需求条目通常对应5到10条测试用例比如拆单需求至少要有自动拆单、手动拆单、退货合并、金额校验、仓库维度这五类用例。测试用例文档里引用需求编号评审时按编号检查覆盖度谁缺谁补一目了然。# 统计从需求说明书导出的纯文本中R-前缀编号唯一数 grep -oE R-(ORD|INV|FIN|PRM)-[0-9]{3} requirement.txt | sort -u req_ids.txt # 统计测试用例文档中引用到的需求编号 grep -oE R-(ORD|INV|FIN|PRM)-[0-9]{3} test_cases.txt | sort -u covered_ids.txt # 找出尚未被任何测试用例覆盖的需求编号 comm -23 req_ids.txt covered_ids.txt这段脚本里的编号规则按领域拆分ORD代表订单、INV代表库存、FIN代表财务、PRM代表商品后三位是流水号。前缀统一用大写避免正则匹配时漏掉。comm -23 输出的是只出现在第一个文件里的行也就是还没有用例覆盖的需求编号。每次迭代结束跑一遍脚本把输出结果交给测试负责人补用例比人肉翻文档可靠得多。这个检查动作本身也可以集成到CI流水线里需求文档变更时自动触发一次覆盖度报告。另一个实用技巧是在需求说明书首页放一张需求状态表状态只设“未开始、开发中、验收中、已验收”四档。之所以把“验收中”和“已验收”分开是因为很多项目的需求卡片在开发自测完就被人为改成“已完成”结果测试一跑全是问题。状态表加上日期和负责人两个字段评审会上对着表格逐行过进度就藏不住了。电商业务数据分析类需求也一样每条指标定义、统计维度、计算口径写清楚再进开发否则报表上线三天就会被业务质疑数据不对。最后交付的不只是 docx 文件还包括字段字典、状态机定义和需求编号清单这些才是后续迭代时真正会被翻阅的资产。每次跑完覆盖脚本把 comm 输出的一行行编号处理掉需求说明书的价值才算真正落地。本文还有配套的精品资源点击获取