一条货从进厂到回款,二期系统怎么接住
二期不是"再加几个销售页面",而是把工厂的采购收货、加工、成品库存、销售交付、应收核销、经营复盘接成一条可追溯的主线。这份材料只讲三件事:系统长什么样、主链路怎么走、哪些地方做错会返工。
口径声明(先看这一条)
事实源优先级:v2-beta/需求/00—08 + 附录-规则对照表(带决策号 D-xxx)> 本讲解 > 原型页面本身。原型是演示数据,不是接口契约——页面上的数字都是编的,只为了让每一档状态都看得见,代表不了表结构。每一节右下角都给出「出处」与可点开的「原型页面」。
一期已经跑通的部分,二期不重建
先把"哪些已经存在"划清楚,二期只在其上做加法,避免重做交易闭环。
交易闭环(一期已有)
企业入驻、农户供应商、采购订单、全额付款、农户反向开票、整单退款与红冲。
基础能力(一期已有)
账号与组织、企业商品档案、附件、消息、操作留痕、导入导出任务、角色与数据范围。
一期没有的(研发注意)
没有加工生产、没有成品库存、没有企业销售业务;另外没有企业充值功能、也没有独立资金账户模块——资金账户的余额与授权信息并入企业资料页展示。
工厂自有采购,一路走到销售回款
二期聚焦一条主线:采购收货 → 加工 → 成品库存 → 销售交付 → 应收核销 → 经营复盘。
① 货处理到哪一步
哪一车、哪一批、洗了几锅、烘了几炉。
② 每批产出多少
入库多少斤、作废多少斤、出干率多少。
③ 哪些库存能卖
可用/加工占用/销售占用/待处理,各多少斤。
④ 钱收回来没有
已验收多少、已核销多少、还欠多少、逾期几户。
P0 做什么、P1 放什么、明确不做什么
范围蔓延是二期最大的风险,这三行先对齐。
| 范围 | 内容 |
|---|---|
| P0 必做 | 收果过磅与验收、来源批次与追溯、加工单与产出入库、鲜果/半成品库存、销售订单与交付、客户验收与货权转移、应收与人工核销、基础成本与经营看板、销售日报表、企业供应商采购。 |
| P1 后续 | 共同成本分摊与完整财务成本、销售正向开票与销售侧税务闭环、客户自助与跨企业协同、委托加工与代发货、设备接入与烘干曲线、AI 分拣与行情预测、复杂承运商与物流接口、动态工艺路线。 |
| 明确不做 | 不重建一期采购结算/付款/反向开票/退款红冲;不做企业充值;不接银行/支付宝/ERP 自动对账;不做自动退款(只自动生成退款记录);不做客户自助账号;P0 不做离线暂存。 |
四个端不新增,但职责要分清
端名称沿用一期:后台管理端、企业端、业务小程序、自然人端。
| 端 | 二期职责 | 原型现状 |
|---|---|---|
| 业务小程序 | 现场与经营者主入口:收果过磅、加工记录、产出入库、库存、销售、交付验收、收款核销、售后。 | 51 页,二期主场(本讲解所有原型链接都指这里) |
| 企业端 | 管理与财务分析:客户与账期、成本核算、应收台账、销售退款查阅、售后查阅、复杂批量与导出。 | E02—E08/E14/E15 尚未落原型(需求已定,页面还没做) |
| 后台管理端 | 平台级:商品品类、计量单位等基础数据;新增 1 个二级菜单「销售日报表」。 | 已新增 admin/sales_daily_report.html |
| 自然人端 | 本期不涉及改动。 | 保持一期原样 |
先想对象,再想页面;批次永不合并
三个对象不能混:来源批次是库存、加工单不是库存、产出批次是新的库存。
| 对象 | 含义 | 是不是库存余额 |
|---|---|---|
来源批次 SRC- | 验收后形成的鲜果实物数量,保留到农户/供应商的追溯关系。 | 是 |
加工单 JF- | 一次加工任务:连接多个来源批次与多个产出批次,记录清洗/杀青与烘干两组记录。 | 不是 |
产出批次 OUT- | 加工后的实物结果,按商品入库后才能销售。 | 是 |
一个对象一个家
每类对象只有一个详情页入口,别处只能"带上下文直达",不得并列开第二个菜单或第二个入口。
货这条线
采购订单 → 收果过磅 → 来源批次 → 加工单 → 产出批次 → 库存;钱这条线:销售订单 → 出库 → 验收 → 应收 → 收款/核销;售后是独立对象。
同一批货,六个量分别存、互不覆盖
这是二期最容易做错、也最容易在对账时暴露的地方。
| 量 | 产生节点 | 用途 |
|---|---|---|
| 到货量 | 收果过磅 | 验收数量之和的上限 |
| 验收入库量 | 验收分流 | 形成来源批次的入库基准 |
| 出库量 | 出库确认 | 库存扣减基准(加工侧以产出为扣减时点) |
| 签收量 | 发运签收 | 物流事实,不产生收入 |
| 验收量 | 客户验收 | 收入与应收基准 |
| 退货量 | 售后 | 冲减对应已交付验收数量,按处置结论决定是否回补库存 |
老板不看电脑,现场不能靠背菜单
易用性是 P0 约束,不是"以后优化"。
手机端是能力全集
深度分析(多期对比、多维交叉、复盘下钻、趋势)在手机端属 P0,按「摘要 → 主题 → 指标 → 明细」四层进入;口径与规则配置仍留电脑端(D-056)。
每页先回答"现在怎么样、下一步做什么"
详情页顶部常驻状态与下一步;列表行内只给这一行该做的那件事。
只采最小必要字段
能带出的默认值一律带出,能留空的留空;未测就显示「未测」,不用默认值补齐。
待办只推需要人决策的事
清洗中、烘干中这类过程状态不产生待办。
一条货从进厂到回款,11 个节点
带底色的是二期新增对象;采购订单与收款是复用一期能力。
收果过磅:保存不产生可用量
过磅记的是"称重事实",验收提交才形成来源批次。
- 两种现实都要支持:①档口/企业送车到厂——车到之前没有采购单;②工厂下乡收农户果——现场开采购单、面对面支付,到厂复磅记差额。
- 一张过磅单可挂多张采购单,每张单指定本次到货的商品行与数量;一张采购单也能分多次到货。
- 状态四档:待关联 → 待验收 → 已验收 → 已作废。
- 称重与接收分开:毛重/皮重/净重是称重事实,接收量是唯一进库存的量,不能互相覆盖。
- 验收只有两类:接收/不收(企业线未开单叫拒收、农户线已付款叫报废)。
加工:两组记录互不配对,完工才扣鲜果
加工主线只有两段:清洗/杀青 → 烘干/干燥;数量只有两层:整单投入 + 各次产出。
① 开单即开工
按「批次 × 商品」勾选、填各批投料量,提交即进入加工中;没有"先建空单再填投入量"这一步。
② 两组互不配对
清洗/杀青(按锅)与烘干(按炉)各自独立增录;没有洗杀记录也能录炉,只提醒并挂「待补记录」标记。
③ 出炉只记时间
重量与入库/作废在分拣装袋称完之后,到「产出」页签按整单录入:可分多次、同商品累加、整单一个 OUT- 号。
库存:一个加法等式,管住一货两卖
在库 = 可用 + 待处理 + 加工占用 + 销售占用。
- 预分配只锁不扣:销售订单确认时锁定数量,在库不变;实际出库才扣减。
- 加工占用优先于销售占用:同一份数量同一时刻只能被一条占用持有;提交时服务端原子校验,冲突返回最新可用量。
- 不接受静默抢占:系统不会自动取消已确认的销售承诺。
- 库存操作是商品级动作:在某个商品下的批次列表底部,四个动作——库存盘点(盘盈/盘亏)、冻结/解冻、报废;用户不选批次,系统按先进先出落批。
- 鲜果超时提醒:鲜果形态下有批次超过阈值时,页面上出现"N 批鲜果已超过 24 小时 · 共 X 斤 + 去开加工单",只提醒不拦截。
销售订单:六档状态,统计只认"已完成"
状态是跨端公共契约,页面可以按端展示,服务端推进规则必须统一。
| 状态 | 什么时候进 | 这一档的意思 |
|---|---|---|
| 草稿 | 点「保存草稿」 | 不占库存、不计统计,可随时改 |
| 已确认 | 点「确认订单」 | 库存已占好(只锁不扣),还没出库 |
| 履行中 | 第一次出库 | 开始发货,还有一部分没出完 |
| 部分交付 | 客户签收了一部分 | 一部分已交到客户手上 |
| 全部交付 | 计划量全部出库并签收 | 货都发出去了,等客户验收 |
| 已完成 | 客户把签收的量验完/未交付部分被终止 | 统计只认这一个完成态;应收按已验收量算 |
交付:四段事实,界面上两段动作
合并的是操作步骤,不是数据——出库量、签收量、验收量仍然分开存。
| 四段事实 | 界面呈现 | 关键规则 |
|---|---|---|
| 出库 | 第 1 段(可操作,可多次) | 实际出库才扣库存;分几次发货就登记几次,每次生成一张交付单 |
| 发运签收 | 第 2 段(一次提交) | 登记实收量(默认=出库量),少收自动记一条差异 |
| 客户验收 | 登记验收量 + 质量复检结果 + 外部凭证;有凭证才生成应收 | |
| 货权转移 | 结果标记,不是操作 | 客户验收完成后自动标记,同时生成应收 |
应收与核销:订单金额 ≠ 收入
收入与应收只由"已验收 + 货权转移 + 有外部凭证"的量产生。
应收成立三条件
客户验收完成 + 货权转移 + 至少一项外部凭证(纸质签收单/现场照片/客户微信确认截图任选其一)。缺凭证只记「待确认交付」,不计应收、不计收入。
收款核销一步提交
页头「+ 收款登记」与行内「去核销」打开同一张表;一次提交落一条收款记录 + 若干条核销记录,数据分开存、可分别作废,没有"待核对"中间态。
必填只有四项
付款方(=客户,从客户里选、不可手填)/收款金额/收款时间/关联订单;凭证是上传控件,非必填。
调整 ≠ 退款
「调整金额」=客户还没付钱、这笔确定收不回来时人工填;「退款」=售后触发、系统自动生成记录。两者都不改写原应收金额。
售后:只有两种类型
仅退款(货不回)/退货退款(货回厂);账务按"客户付没付过钱"自动分叉。
| 类型 | 货 | 库存影响 | 账务(自动) | 人工步骤 |
|---|---|---|---|---|
| 仅退款 | 不回 | 无 | 未付款 → 冲减应收;已付款 → 自动生成退款记录、状态即已退 | 0 步 |
| 退货退款 | 回厂 | 收货时选回补库存/报废(二选一) | 先按退货数量冲减应收,其中已收走的部分自动生成退款记录 | 1 步 |
经营看板:五个主题、四层进入、算不出来就说原因
看板回答老板四个问题:赚不赚钱、钱收回来没有、货有没有被占住、哪里要出事。
五个主题
赚 / 钱 / 货 / 效率 / 风险。
四层 + 深度分析
摘要 → 主题 → 指标 → 明细下钻;多期对比与趋势在手机端也是 P0。
成本方向不可逆
成本是采集与分摊出来的,毛利 = 收入 − 成本;禁止用"收入 − 毛利"反推成本。
算不出来就说原因
数据缺失、口径不一致、分母不足时显示「暂不能计算 + 原因」,不填 0、不填 100%。
销售订单与开单:超出必须拦,不许静默改小
页面:M13 销售订单列表/详情 + M14 开销售单。这条是现场真报过的 bug。
- 列表顶部只有四个筛选(草稿/待发货/待交付/待收款);草稿行的按钮就叫「编辑」,点行进编辑页;出过一件货的单没有这个按钮,行内只剩「继续出库」。
- 开单页底部三个按钮层级定死:绿色实心「确认订单」> 白底描边「保存草稿」> 淡红无边框「取消订单」。
- 草稿随便改;已确认但一件没出库的也能改,改完重算占用,占不满整单拒绝、原样占回来。
Math.min(用户写的, 还能办的量):用户写 60、系统按 40 记账,还回一句"已出库"——屏幕上显示一个数、账上是另一个数。同一条规矩也管"终止剩余部分"和"确认订单占用"。交付单:一条红条 + 五个结论(附一条最容易做错的澄清)
页面:M15 交付单详情。
- 页顶一条红字提示条:「有 N 处待处理差异,共 X 斤 · 点这里去处理 ›」。
- 每处差异是红底「待处理」+ 橙色实心按钮,不能做成白底橙字那种"看着像说明文字"的样子(上一版就是因为太像说明而没人看见)。
- 差异结论只有五个(代码里就这一个数组):补交 / 折让 / 退货 / 拒收 / 损耗认定;结论在本页关闭,不新建"差异单"对象、不新建页面。
应收与核销:一张表、四格、两个不同的"钱"
页面:M18 应收与核销 + 应收明细。
- 页头「+ 收款登记」和行内「去核销」打开的是同一张表;一次提交落一条收款记录 + 若干条核销记录,没有"待核对"中间态。
- 必填四项:付款方(选客户,不能手填)/收款金额/收款时间/关联订单;凭证是上传控件,不是文本框。
- 四格一行:应收 / 已核销 / 调整 / 未收,颜色与下面占比条一一对应;未收为 0 时不点亮红底。
售后:两类型、三条出路、一句话红线
页面:M19 售后 + M19A 售后列表。
- 类型下拉只有两项:退货退款 / 仅退款;页内三条出路:确认、改数字、驳回(就地展开"驳回原因(必填)")。
- 仅退款那一单,页面上根本不出现"已到厂""已处置"这两个量;退货退款才有第二段,处置只有回补库存 / 报废。
- 列表状态词只有一套:待确认/待收货/待处置/已结束(驳回是终态,归「已结束」档);列表、售后单顶部、销售单的「售后」页签都读同一处口径。
加工单:三页签、两组记录、一个完工按钮
页面:加工单列表 + 加工单(M05 与 M22 已合并成一页)。
- 列表页只有三个页签:加工中 / 干果待入库 / 已完成;行内"下一步"按状态给「继续记录 / 去录产出 / 看单」。
- 单页头部三个页签:清洗/杀青(N)|烘干(N)|产出(X 斤),右侧一个小按钮「补录」。
- 「完工」按钮不满足条件时置灰、文字后面带括号写原因(如"全部出炉后才可完工"),条件满足才变成可点。
库存:四个量、一条提醒、四个动作
页面:M11 库存 + M12 库存详情。
- 三层:形态(鲜果/干果)→ 商品 → 批次;形态汇总一行四个量,在库=四者之和。
- 超时鲜果提醒条只在鲜果形态且有超时批次时出现,没有就不显示。
- 「库存操作」在商品下的批次列表底部:库存盘点(盘盈/盘亏)、冻结/解冻、报废;用户不选批次,系统按先进先出落批;盘亏、报废要审批,冻结解冻不审批。
过磅与批次:称重 ≠ 接收,合批不等于并批
页面:M03 收果过磅 + M04 来源批次详情。
- 一张过磅单可挂多张采购单,逐行填"本次到货量 + 收下/不要";保存过磅不产生可用量,提交验收才生成来源批次。
- 毛重/皮重/净重与接收量分开保存,缺项显示「未测」;校验超出时提示"接收+拒收合计超过本次到货量,先改数量"。
- 编号必须可区分:
SRC-来源批次、JF-加工单、OUT-产出批次。
权限、状态、数据范围:三类问题三种处理
混在一起做,要么泄密、要么现场有按钮点不动还不知道为什么。
| 问题类型 | 处理方式 | 例子 |
|---|---|---|
| 权限(用户不该用) | 隐藏入口、不提示"无权限" | 销售经办看不到成本页;成本、毛利、采购价、客户价、账期、信用额度、银行账号按敏感字段单独授权 |
| 状态(有权限但当下不能用) | 灰显 + 一句原因 | 产出还没入库 → 按钮灰显并写"还没入库,暂不能销售" |
| 数据范围(能进功能但只看部分数据) | 列表直接过滤、不提示存在 | 配"本人数据"的人只看得到自己建的客户与销售单 |
- 底部 tab 与一级菜单固定显示、不隐藏;"按权限隐藏"只作用于页内入口、按钮与页签。
- 鉴权必须在服务端查询层执行,前端隐藏只是体验层。
- 超管是权限全集基线:二期新增权限自动纳入其范围——一期若把超管权限写成固定枚举或位图,必须改成能与新增权限合并的结构,否则企业主登录后看不到经营看板、而且不报错。
幂等、并发,以及"改字段要广播"
这一条不是理论——本轮真的因为改字段、跨模块不报错地错了一次。
- 保存类动作必须幂等:现场弱网连点两次「提交出炉」→ 只能生成一炉;连点两次收款提交 → 只能落一条收款记录 + 对应核销。
- 数量类操作服务端原子校验:占用、出库、投料冲突时返回最新可用量,不允许负库存。
- P0 不做离线暂存:断网就是保存失败,别做本地队列。
voucher(一段文字)改成 vouchers(附件数组),看板还在读旧字段 → "已上传凭证的费用占比"显示 0%(应为 12.6%)、"缺凭证记暂估"也判错,而且全程不报错。术语红线:这些词一个都不许活下来
词还在,说明旧对象或旧状态还藏在代码里。
| 禁用/旧词 | 现行说法 |
|---|---|
| 等级、定级、待定级、等级复检结果 | 按商品入库与作废量;质量复检结果(合格与否 + 异常说明) |
| 争议、争议冻结、争议关闭四结论、赔付 | 仅退款/退货退款;当场不认的量叫拒收(少退) |
| 退款登记(手工) | 售后确认后自动生成退款记录,状态即已退 |
| 应收调整(人工流程) | 应收行内的「调整金额」 |
| 已了结 | 界面上不出现(内部标记叫"不用再动",也不显示) |
| 算不出逾期/暂不能判断逾期 | 未设置账期 |
| 到货登记(界面旧名) | 收果过磅("到货登记"只作文档与对象名) |
| 收果入库 | 不要用;"入库"只作为结果或状态出现 |
node v2-beta/tools/check-doc-consistency.js 必须跑出"没有发现残留口径";页面上的旧名由 structure-check.js 一并守卫。原型能点 ≠ 生产能用
这是演示的边界,别当需求做,也别当接口契约用。
原型里还没有的
产出录入的更正入口、M11 成本层按权限展开、库存动作表单的凭证——需求写了、原型没做,按需求排期。
演示数据
订单、客户、批次、金额都是编的;演示数据存在浏览器本地,乱了在入口页点「重置演示数据」。
看板的示意部分
趋势图与交叉表仍是示意(样本不足 6 个月);K29 净垫资在演示里是按采购单日期+付款状态估算的。
电脑端
企业端二期页(E02—E08/E14/E15)还没落原型——需求已定,页面还没有,别拿一期页面当二期实现依据。
页面与端归属:一个对象一个家
业务小程序 5 个底部 tab;企业端与后台只新增必要入口;自然人端本期不动。
| tab | 承载对象与"家" |
|---|---|
| 首页 | M01 首页(待办 + 经营概览两态)、M20 经营看板、待办全量页 |
| 采购 | 采购订单列表(农户/企业供应商两类来源)+ 一期采购订单详情(含收货与验收) |
| 销售 | M13 销售订单列表与详情、M14 开销售单、M15 交付单、M19/M19A 售后 |
| 加工 | 加工单列表、M05 加工单(含 M22 加工记录作业页) |
| 我的 | 一期已有页面 + M25 我的客户(页内入口,不新增 tab) |
| 无 tab | M03 收果过磅、M04 来源批次、M11 库存、M12 库存详情、M18 应收与核销(+明细)、费用录入/列表/详情 |
研发开工速查:以加工单为范式
一个模块要写到"研发拿到能直接开工、不用来问",就照这张表的结构写。
| 页签 | 页内动作 | 前置/校验 | 结果 |
|---|---|---|---|
| 清洗/杀青 | 「+ 加一锅」「出锅」 | 开煮时间必填(默认当前、精确到秒);出锅不得早于开煮 | 记录卡:这条在煮 → 已出锅 |
| 烘干 | 「+ 加一个炉」「出炉」 | 装炉时间必填;出炉只记时间、不填重量 | 所有炉都出炉 → 单状态转「干果待入库」 |
| 产出 | 「+ 录入一次」 | 至少一炉已出炉;入库+作废 ≤ 整单投入;称重时间必填 | 入库即刻进可用库存、可被订单占用;作废只留痕 |
| 补录(按钮) | 抽屉「提交这几条」 | 洗杀行开煮时间必填、炉行装炉时间必填 | 一次提交多条;每次打开都是空表 |
| 产出页底部 | 「完工」 | 锅都出锅 + 炉都出炉 + 已录产出 | 状态转已完成;此刻一次性扣掉整单投入的鲜果 |
node v2-beta/demo/structure-check.js(结构)/node v2-beta/demo/selfcheck.js(数据层)/node v2-beta/demo/page-selfcheck.js 与 _selfcheck/check-*.cjs(真浏览器端到端)/node v2-beta/tools/check-doc-consistency.js(口径)。改完必跑,不通过不许说"改完了"。
原型:加工单 ↗
还没收口的清单(截至 2026-09-21)
先说清楚,免得研发按原型做出错的东西。
| # | 事项 | 状态 |
|---|---|---|
| 1 | 企业端二期页(E02—E08/E14/E15)落原型 | 未做(需求已定) |
| 2 | M11 成本层按权限展开 | 需求有、原型没有 |
| 3 | 库存动作表单的凭证 | 需求有、原型没有 |
| 4 | 售后「去给结论」跳 M19 带单号 | 未做(缺 ?rt=) |
| 5 | M11 默认排序改成"鲜果按等待时长倒序" | 与需求不一致 |
| 6 | 看板趋势图/交叉表(现为示意) | 待真实样本 |
| 7 | 口径自检词表补「待检/在制/分组」 | 待补 |
| 8 | 5 个一期历史稿零入链 | 待定去留 |
需求/附录-规则对照表(规则 → 文档 → 原型 → 验收点,一行一条),再查 需求分析/二期决策台账;仍不清的,带"哪个端、哪个页面/入口、哪个对象"来问。一页速记:十二条
贴工位上用;每条都能在上面某一节找到展开。
货与量
- 批次永不合并;加工单不是库存余额
- 六个量分别存、差异单列、互不覆盖
- 可用 = 在库 − 待处理 − 加工占用 − 销售占用,不允许负库存
钱
- 订单金额 ≠ 收入;收入只由"已验收 + 有凭证"的量产生
- 核销累计 + 调整 ≤ 有效应收;超出进未分配款
- 账期只在客户上填,没填就是「未设置账期」
状态
- 状态由事实驱动,不由按钮驱动:签收≠验收、出库≠到账、完工≠可销售
- 更正必须留原值/新值/原因/操作人/时间,不静默重算
- "终止""驳回"是结束方式与终态,不是新状态
实现
- 超出必须拦住并报出上限,禁止静默改小
- 保存幂等、数量原子校验;P0 不做离线暂存
- 改字段/状态词=跨模块影响,必须广播并跑对方自检