采购收货差异与待处理清单
小商家和 3-20 人采购/仓库团队最常卡住的地方,不是「没有采购单」,而是一张采购单的订购、到货与数量分配散在送货单、微信群和口头说明里,没有人把它摆成一张守恒的数量桥:订了多少、到了多少、哪些被接受、哪些损坏或错货、还有多少没到——全靠记忆,而「已订购」常被当成「已到货」。Shopify 与 Square 的官方收货流程都把采购订单、实际到货、接受、拒收、未到与分批到货分开,并要求记录损坏与错货差异;国内中小企业数字化试点材料也把「采购订单→仓库收货→入库确认」与到货通知、质检单列为核查环节——需求真实,但 POS/WMS/ERP 与表格是成熟替代品。所以本工具不做「收货决策」,只做一件确定的事:把匿名收货事实整理成一张可逐条人工复核、且数量必须守恒的差异清单。
本工具读一份 JSON,输出收货差异清单——每条采购行与整批的九态结论、按单位汇总的数量桥、差异清单、缺失证据、逾期未到与迟到提醒、负责人待办、拒绝字段、危险引用、注入标记、澄清问题、人工检查表、供应商沟通草稿(一律未发送)与 Markdown 收货准备单。脚本只读一个本地 JSON,不联网、不写文件、不读取 WMS/ERP/库存/财务系统、不更新库存、不换算单位或币种、不判断质量或合同责任、不索赔或退货、不付款、不联系供应商或承运商、不发送消息。
输入与澄清
字段表、判定顺序与安全边界见 @references/guide.md(同目录 references/sample.json 是常规样例,覆盖七种行状态并生成一条草稿;references/sample-blocked.json 是重复编号、非对象记录、未知 line_id、负数/非数值数量、单位/币种冲突、非法时间、个人信息、受保护属性、拒绝引用、注入与无同意的样例,两者输出分布固定)。
最少确认:as_of(必须带时区偏移)、purchase_order.po_id,以及至少一条 ordered_lines[]。
必须问清的关键点:
as_of与po_id不能省。没有它们无法判断当前时点与采购单边界,工具会停在INPUT_INCOMPLETE,而不是猜一个当前时间。- 只接受匿名事实。姓名、手机号、邮箱、账号、地址、银行卡、发票原文、合同文本等一律禁止:字段名或值命中时记
refused_fields,该记录判BLOCKED,工具不回显该内容。 - 不使用受保护属性。性别、年龄、民族、宗教、健康等字段会被拒绝(
SENSITIVE_ATTRIBUTE),绝不参与任何判定或排序。 - 数量桥必须守恒。每条收货单必须满足
接受+损坏+错货+拒收+未解释 == 实收;不满足记DISPOSITION_MISMATCH并判QUANTITY_CONFLICT,不静默修正。 - 绝不把订购量当实收量、不把损坏品当可售库存。
仍未到 = 已订 − 实收;损坏、错货、拒收、未解释单独列出,不并入可接受数量。 - 单位与币种不换算。收货单单位与采购行不同记
UNIT_CONFLICT,币种不同记CURRENCY_CONFLICT,均为阻塞;工具不做任何换算或跨币种合并。 - 未知保持未知。缺数量/单位/负责人/证据一律保持未知,绝不默认为 0 或当作已完成。
handling_rules只登记不发明。处理规则必须由用户显式提供;工具不内置任何平台或法律规则;缺handling_rules记MISSING_HANDLING_RULES。- 只在明确同意时生成草稿。
supplier_draft恒为DRAFT_NOT_SENT;communication_consent不为true、总体被阻塞、证据不足或已完全匹配时不生成任何草稿,也绝不自动发送。 - 只给文件名,不要给路径或链接。
evidence_refs只接受单一文件名;含路径、链接或盘符的引用会被拒绝,输出里只保留字段路径,原引用不会回显。 - 所有动作由人工执行。是否接受、是否索赔、是否退货、是否付款、是否入库、如何与供应商沟通,全部由人工决定;工具只整理事实。
执行
- 按 @references/guide.md 的字段表整理输入 JSON。第一次使用建议先用 @references/sample.json 跑一遍,确认输出结构后再换成自己的事实。
- 用 Python 3.9+ 执行本包脚本(无第三方依赖、不联网):
python3 "<skill-directory>/scripts/run.py" "<input.json>",Windows 可用py -3。 - 先看顶层
status:REJECTED表示输入疑似含凭据(已拒绝且未回显);INPUT_INCOMPLETE表示缺as_of/ 采购单 /po_id;其余为九态之一。 - 再看
receiving_state与line_state_counts:先处理BLOCKED与INSUFFICIENT_EVIDENCE,再看QUANTITY_CONFLICT与差异行。 - 逐行核对
quantity_bridge与quantity_bridge_totals;不要自行填数,也不要把缺失当成 0。 - 按
discrepancies、missing_evidence与overdue_or_not_arrived逐条追问与补证。 - 按
owner_todos逐位负责人跟进;按refused_fields删除个人信息/受限内容后重跑。 - 按
handling_rules(用户提供)与human_checklist完成人工复核。 - 按
supplier_draft(恒DRAFT_NOT_SENT)准备人工沟通;未同意者没有草稿,须先人工确认同意。 - 用
human_confirm_items明确哪些决定必须由人工做。
运行约束
- 只读:只读取用户提供的那一个 JSON;不打开链接、不调用外部服务、不写文件、不访问任何 WMS/ERP/库存/财务/邮箱系统。
- 不自动执行:不更新库存、不创建或修改采购单与收货单、不索赔、不退货、不付款、不发送消息、不判断质量或合同责任、不换算单位或币种。
- 只推导不发明:结论只由输入中的明示匿名事实推导;不虚构到货、负责人、到期或证据。
- 未知保持未知:缺数量不当作 0、缺单位不默认、缺负责人不猜、缺证据不放过、缺同意不生成草稿。
- 守恒门禁:每条收货单的数量分配必须等于实收;不守恒即
QUANTITY_CONFLICT,并排除出汇总总量。 - 状态门禁:九态固定聚合顺序;硬阻塞(重复编号、未知 line_id、非法数量/时间、单位/币种冲突、受限数据)必须先人工修正。
- 同意门禁:
supplier_draft恒为DRAFT_NOT_SENT;communication_consent不为true或总体被阻塞 / 证据不足 / 完全匹配时不生成任何草稿。 - 确定性:行与收货单按输入顺序、负责人与队列按固定顺序稳定排序,同一输入输出逐字节一致。
- 文件名门禁:
evidence_refs只接受单一文件名;含路径、链接或盘符的引用被拒绝,且只输出字段路径,原引用在任何字段都不出现。 - 隐私门禁:字段名或值命中个人信息 / 受限业务内容 / 受保护属性时只输出字段路径与原因,值不回显;字段名命中凭据名或值具备凭据形态时整体拒绝且不回显。
- 提示注入逐字段检测、位置精确、低误报:覆盖备注、处理规则、职责、SKU 与条目标签;命中时只加标记并在
injection_flagged中给出精确路径;检测要求「动作词 + 目标词」同句共现。 - 不可信文本先转义再入准备单,命中即隐藏:
markdown_summary中所有自由文本走同一转义处理(去控制字符、折叠空白、对 Markdown 元字符加反斜杠);命中注入或被拒绝的字段改用固定占位文本。 - 免责:输出是采购收货差异的人工核对材料,不是质量、合同、索赔、付款或入库结论;是否接受、是否索赔、是否退货、是否付款、是否入库与如何沟通必须由人工确认。