今天要做什么
按节拍跑采购:每天催欠交采购单、收供应商报价、核对昨日到货;每周刷补货预警与付款里程碑;每月算到岸成本与供应商评分。
每日(开班约 20 分钟)
- 打开采购单列表,看状态为「已发送 / 已确认 / 部分到货」且预计到货日临近的采购单,电话或企微催欠交。
- 打开询价单列表:已发送的询价单全部供应商都回了没;过期仍缺报价的置为「已过期」。
- 打开供应商报价列表:「已收到」的新报价进入比对流程,逐条转「审核中」决定接受或拒绝。
- 核对昨日收货单:质检暂扣的批次协同库管放行;异常数量在当班内处理,不隔天。
- 新到供应商发票走三单匹配;已匹配的提交审批流。
/dashboard/purchasing/purchase-orders、/dashboard/purchasing/rfq、/dashboard/purchasing/supplier-quotations、/dashboard/purchasing/goods-receipts、/dashboard/purchasing/purchase-invoices。
每周
- 周一刷补货预警与批量采购机会——按建议供应商发询价单或直接下采购单。
- 周三查采购单付款里程碑,到期前一周生成付款申请给出纳。
- 周五盘退货链路:状态为「已发出退货 / 供应商已收退货」仍未闭环的,逐条推进到「已开借项冲抵」。
每月
- 月初对本月进口采购单做到岸成本分摊(运费 / 关税 / 报关费),摊到批次单位成本。
- 月中把本月已开借项冲抵的退货转借项通知单,对接应付冲账。
- 月底刷新供应商评分指标(准时率 / 不良率 / 交期)并补录评分卡;低分供应商主档置为「停用」。
权限红线(先看这 5 条)
- 供应商主档未建且未评审的,不能直接下采购单——必须先走供应商准入、AI 风险评估过关。
- 三单不匹配的发票(匹配状态不是「已匹配」)不能过账付款——系统会拦住提交。
- 已全部收货的采购单不能撤——错收只能走退货 + 借项通知单冲销。
- 超金额阈值的采购单必须走审批——没有「跳过审批」开关;审批中的采购单不能改行项。
- 销售 / 会计 / 人事模块只读或不可见;跨账套数据由账套自动隔离。
Quickstart — 日常核心任务
2.1 发布询价单(RFQ)
库管红色预警、销售新订单缺料、工程 BOM 缺件、或对现有采购单谈判涨价;需要群发多家供应商询价。
- 左侧导航「采购 → 询价」进入询价单列表,右上角点「新建询价单」。(见图 ①)
- 在弹窗勾选要询价的供应商(多选);填响应截止日、要求到货日。(见图 ②)
- 选币种(以付款币种为准,非本位币会自动记汇率);填交货地址、备注。(见图 ③)
- 保存草稿 → 回详情页逐行加明细(产品、数量、规格)。
- 检查无误后点「发送」——状态从「草稿」推进到「已发出」,每个供应商自动建一行响应记录(状态为「待回复」)。
- 询价单列表顶部出现新行,单号
RFQ-前缀。 - 详情页状态徽标变「已发出」,显示发送时间戳。
- 供应商响应表出现 N 行(每家一行),状态「待回复」。
rfqs.status='sent'、rfqs.sent_at、rfqs.deadline;rfq_suppliers.status ∈ {pending, quoted, declined, no_response}。
createRfqAction、addRfqItemAction、updateRfqItemAction、deleteRfqItemAction、sendRfqAction、updateRfqAction、cancelRfqAction
2.2 接收并比对供应商报价
供应商回复邮件、电话报价或平台回执到;录入供应商报价明细,多家对比决定下单对象。
- 询价单详情页点「录入响应」,选回复的供应商、填明细价格。(见图 ①)
- 或进供应商报价列表点「新建」独立录入——选询价单 + 供应商,逐行加价格、交期、有效期。(见图 ②)
- 回询价单详情切到「对比矩阵」Tab——按产品 × 供应商看最低价与最短交期,系统自动标「最低价」。(见图 ③)
- 决定中标:把目标报价从「已收到」推到「审核中」,再推到「已接受」;其他同询价单的报价推到「已拒绝」。
- 供应商报价列表顶部出现新行,单号
SQ-前缀。 - 对比矩阵按产品高亮「最低价」单元格。
- 接受的报价详情页状态徽标变「已接受」,其他报价变「已拒绝」。
supplier_quotations.sq_number、supplier_quotations.status、valid_until、lead_time_days、total_amount;RFQ 矩阵返回 isLowest 标志。
recordSupplierResponse、createSupplierQuotationAction、addSQLineItemAction、updateSQLineItemAction、reorderSQLineItemsAction、updateQuotationStatusAction、compareQuotationsAction、getRfqMatrixAction
2.3 中标 → 生成采购单
比对完成,决定下单。三条入口:询价单授标(推荐)、供应商报价转采购单(已单对单谈定)、销售订单「生成采购单」(按供应商聚合缺料)。
- 询价单授标:在询价单详情页勾选中标的报价行,点「生成采购单」。(见图 ①)
- 弹窗按供应商分组预览采购单草稿(含价格、交期、税率),点「确认」批量生成草稿采购单。
- 报价侧转采购单:已接受的报价详情页有「生成采购单」按钮,价格和交期自动回填。(见图 ②)
- 销售订单侧缺料补单:订单详情点「生成采购单」,按供应商分组聚合缺料,批量创建草稿采购单并回链源销售订单。(见图 ③)
- 采购单列表顶部出现 N 行(按分组数),单号
PO-前缀,状态「草稿」。 - 原询价单状态推进到「已授标」,中标报价变「已接受」、落选报价变「已拒绝」。
- 由销售订单生成的采购单详情页显示关联销售订单链接。
purchase_orders.supplier_quotation_id / sales_order_id / po_number;purchase_orders.currency / exchange_rate / base_total;rfqs.awarded_at。
awardQuotationAction、preparePoSelectionAction、createPoFromQuotation、convertToPurchaseOrderAction、preparePOFromSOAction、createPOsFromSOAction、createFullPurchaseOrder
2.4 采购单审批 + 发给供应商
草稿采购单金额超阈值需审批;金额内可直接发供应商确认。发出后就是正式订单,改金额代价很高。
- 打开草稿采购单详情页,核对供应商、仓库、币种、汇率、行项、税率、付款条款。(见图 ①)
- 行项要调就点行内编辑,保存后整单金额自动重算。
- 超阈值时点「提交审批」——状态变「待审批」,推送审批人企微卡片。
- 审批通过后(或金额内直接)点「发送给供应商」——状态推到「已发送」,供应商回签后推到「已确认」。(见图 ②)
- 付款里程碑 Tab 点「生成里程碑」,按付款条款拆分(如预付 30 / 到货 60 / 质保 10)。
- 采购单状态徽标按「草稿 → 待审批 → 已批准 → 已发送 → 已确认」推进。
- 审批历史 Tab 出现一行(操作人、时间、评论)。
- 付款里程碑 Tab 出现 N 行,合计 = 采购单本位币合计。
purchase_orders.status、order_date / expected_date;po_milestones.due_date / status;workflow workflow_state_id。
updatePurchaseOrderAction、addPOLineItemAction、updatePOLineItemAction、deletePOLineItemAction、reorderPOLineItemsAction、submitPurchaseOrderForApprovalAction、updatePOStatus、executePOTransitionAction、getPOWorkflowState、getPOAvailableTransitions、getPOAuditTrail、generatePOMilestonesAction、getPOMilestonesAction、updatePOMilestoneAction
2.5 跟催到货 + 确认收货
供应商发货、货到码头、仓库报到货;按采购单行项录实收数量,系统自动建收货单并写入库存。
- 采购单详情点「收货」按钮——采购单状态必须在「已发送 / 已确认 / 部分到货」才可收。(见图 ①)
- 弹窗按行项填实收数量(不能超订单数量);有批次物料必须填批号,否则库存记不上批次。
- 点「确认收货」——系统写收货单(单号
GR-前缀)、触发库存变动、原子调库存。 - 启用质检的仓,新批次默认「暂扣」;质检通过后在收货单详情或采购单上点「质检通过」,或协同库管「强制放行」。(见图 ②)
- 全部收完后采购单状态自动从「已发送 / 已确认」推到「已全部到货」;部分收推到「部分到货」。
- 收货单列表顶部出现新行,单号
GR-前缀,显示收货日期。 - 采购单行项「已收 / 总量」列更新;采购单状态按进度推「部分到货 / 已全部到货」。
- 库存模块出现入库记录;批次表出现新批次(启用质检时状态「暂扣」)。
goods_receipts.receipt_number、goods_receipts.receipt_date;purchase_order_items.received_qty;stock_movements.movement_type='receipt';stock_batches.status。
getGoodsReceiptData、listGoodsReceiptsForPage、receiveItems、forceReleaseBatchAction、confirmPurchaseInspectionAction
2.6 三单匹配 + 采购发票过账
供应商开票到财务;录入采购发票、导入采购单行项、跑三单匹配(采购单 × 收货单 × 发票的数量 + 单价),通过后过账写总账。
- 采购发票列表点「新建」,选供应商、关联采购单,填供应商发票号与日期。(见图 ①)
- 详情页点「从采购单导入行项」——按采购单实收量拉进发票明细(避免手工录错)。(见图 ②)
- 点「计算三单匹配」——系统按价差容差比对数量和单价。
- 匹配状态变「已匹配」时点「提交审批」→ 审批通过后点「过账」——写总账、标记过账时间和过账人。
- 发现已过账的发票错了:走「撤销」(含总账反记账),不要改单价后重过账。
- 采购发票列表顶部出现新行,单号
PI-前缀,匹配状态从「未匹配」推到「已匹配」。 - 过账成功后状态徽标变「已过账」,显示过账时间和过账人。
- 会计总账出现应付 / 暂估 / 采购费用的凭证分录。
purchase_invoices.status、match_status ∈ {unmatched, partial_match, matched, over_matched}、price_variance、paid_amount / balance_due、posted_at / posted_by。
getPurchaseInvoicesByPOAction、createPurchaseInvoiceAction、importItemsFromPOAction、addPILineItemAction、updatePILineItemAction、deletePILineItemAction、reorderPILineItemsAction、calculateThreeWayMatchAction、getThreeWayMatchAction、submitPurchaseInvoiceAction、approvePurchaseInvoiceAction、postPurchaseInvoiceAction、cancelPurchaseInvoiceAction
2.7 付款申请(向出纳)
到付款里程碑到期日或发票到期日,发付款申请给出纳;出纳放款后回录付款记录。
- 采购单详情切到「付款」Tab,点「申请付款」——输入金额、选里程碑(单个 / 多个批量)、填银行信息。(见图 ①)
- 按里程碑批量:选多个未履约的里程碑行点「批量申请」。
- 提交后系统推送出纳企微卡片「采购付款申请」,状态走出纳侧工作流。
- 出纳放款后回采购单付款 Tab 点「录入付款」——填实付金额、付款日、银行流水号。
- 申请错建且未放款:在付款 Tab 点错行的「删除」回滚。
- 采购单顶部「已付 / 合计」数字推进。
- 付款申请列表出现新行,状态「待放款」(出纳侧)。
- 放款后里程碑行状态变「已付」。
purchase_orders.paid_amount;payment_requests.status(出纳侧);po_milestones.status。
getPOPaymentSummaryAction、getPOPaymentsAction、getPOPaymentRequestsAction、createPOPaymentRequestAction、createMilestonePRAction、createMilestonesPRAction、recordPOPaymentAction、deletePOPaymentAction
2.8 采购退货 + 借项通知单
来料不合格、数量超发、或客户退货转退供应商——走退货链路,退完生成借项通知单冲销应付。
- 退货列表点「新建退货」,选源采购单(必须在「已确认」及以上)——按采购单行项勾选要退的量。(见图 ①)
- 填退货原因(质量 / 数量 / 其他);保存草稿。
- 按链路推进:「草稿 → 已提交 → 已批准 → 已发出退货 → 供应商已收退货 → 已开借项冲抵」。每步点对应按钮,需批准人操作的等审批。(见图 ②)
- 到达「已开借项冲抵」后进借项单列表点「基于退货建借项」——自动从退货单拉数据生成借项草稿。
- 借项单推到「已开出」,再点「应用」冲销目标采购发票——减少应付余额。
- 退货列表顶部出现新行,单号
PR-前缀,状态按链路推进。 - 借项单列表出现新行,单号
DN-前缀,状态在「草稿 / 已开出 / 已应用 / 已撤销」之间。 - 被冲销的采购发票详情页「未结金额」减少对应已应用金额。
purchase_returns.pr_number / status / total;debit_notes.status、applied_amount;purchase_invoices.balance_due 递减。
createPurchaseReturnAction、submitPurchaseReturnAction、approvePurchaseReturnAction、shipPurchaseReturnAction、receiveBySupplierAction、creditPurchaseReturnAction、cancelPurchaseReturnAction、updatePurchaseReturnAction、deletePurchaseReturnAction、executePurchaseReturnTransitionAction、getPurchaseReturnAvailableTransitions、getPurchaseReturnAuditTrail、createDebitNoteAction、createFromPurchaseReturnAction、issueDebitNoteAction、applyDebitNoteAction、cancelDebitNoteAction
2.9 到岸成本分摊
进口采购单收货完成后,把运费、关税、报关费、保险费摊到单位成本;摊完库存估值与采购单平均成本同步刷新。
- 到岸成本列表点「新建」——按月 / 按航次建凭证。(见图 ①)
- 勾选关联采购单(必须已「部分到货 / 已全部到货」,收货单完成才能分摊)。(见图 ②)
- 添加费用行:运费 / 关税 / 报关费 / 保险费 / 其他;每行填金额和摊销方式(按金额 / 按重量 / 按数量)。
- 保存草稿后点「提交」——系统把费用按规则分摊到批次单位成本与库存估值。
- 错算且未提交:点「删除」;已提交需反写成本:点「撤销」(不可直接删除)。
- 凭证列表顶部出现新行,状态在「草稿 / 已提交 / 已撤销」之间。
- 关联采购单的平均成本刷新;库存估值表同步重算。
- 批次单位成本等额增加(含摊销的运费 / 关税)。
landed_cost_vouchers.status;stock_batches.unit_cost;inventory_valuation。
getLandedCostVouchers、getLandedCostVouchersPaginated、getLandedCostDetails、getPurchaseOrdersForLandedCost、createLandedCostAction、submitLandedCostAction、cancelLandedCostAction、deleteLandedCostAction
2.10 供应商评分 + 主档维护
月底刷新评分卡(准时率 / 不良率 / 交期 / 响应),配合主档更新状态;新增供应商或更新产品挂靠在此做。
- 供应商列表维护主档——新增 / 导入 / 产品挂靠;每个供应商详情有 AI 风险评估 Tab。(见图 ①)
- 评分卡列表点「新建评分」,选供应商 + 评分周期。(见图 ②)
- 点「重算指标」——系统从采购单 / 收货单 / 发票历史聚合准时率 / 不良率 / 平均交期天数。
- 按指标给 4 项打分:质量 / 交期 / 价格 / 响应,保存生成综合分。
- 对比多家供应商:勾选 2+ 行点「对比」——同周期指标并列查看;低分的主档置为「停用」。
- 供应商列表主档出现 / 更新行,状态标签正确。
- 评分卡列表新增行,4 项分数 + 综合分显示。
- 历史趋势 Tab 可看到同供应商多周期对比曲线。
suppliers.status ∈ {active, inactive}、payment_terms、preferred_currency、lead_time_days、rating;supplier_scorecards.overall_score、quality_score、delivery_score、price_score、response_score。
getSuppliers、getSupplier、getSupplierStats、getSupplierOrders、createSupplier、updateSupplier、updateSupplierFromForm、deleteSupplier、importSuppliers、listSupplierProductsAction、addSupplierProductAction、updateSupplierProductAction、deleteSupplierProductAction、getSupplierRiskAction、getSupplierEvaluationAction、getScorecards、createScorecardAction、updateScorecardAction、deleteScorecardAction、recalculateMetricsAction、compareSuppliersAction
上下游交接契约
采购居链路中游:上游接库管预警 / 销售缺料 / 生产 BOM / 财务口径;下游交库管收货、财务应付、出纳付款、销售 / 跟单交期回执。状态每推一步,下游动作跟着跑。
采购 → 库管 / 质检:到货入库
我做什么:采购单详情点「收货」,按行项录实收数量;批次物料填批号;点「确认收货」生成收货单。启用质检的仓新批次「暂扣」,等质检放行。
下游看到什么:库管在仓库模块看到入库单,批次 / 序号落库;质检在品控看板看到「暂扣」批次排队质检。
缺失会回来找我:没填批号 → 库管无法追溯;实收数量 > 采购单数量 → 系统拒收;采购单状态不对(不在「已发送 / 已确认 / 部分到货」)→ 收不进去。
技术字段(给 IT/库管交叉核对)
触发动作:receiveItems(PO 侧);库存侧走 adjust_stock_atomic(receipt)
必传字段:purchaseOrderId, items[].itemId, items[].receivedQty, items[].batchNumber?, items[].warehouseId
采购 → 会计:应付挂账
我做什么:采购发票详情点「计算三单匹配」,「已匹配」后提交审批 → 点「过账」写总账。借项单走「应用」冲销目标发票。
下游看到什么:会计在 /dashboard/accounting 看到应付凭证(应付 / 暂估 / 采购费用分录);借项单冲销后发票未结金额递减。
缺失会回来找我:匹配状态不是「已匹配」→ 会计不接受过账;供应商发票号缺失 → 应付无法关联外部发票;币种 / 汇率缺失 → 会计挂不上本位币。
技术字段(给 IT/会计交叉核对)
触发动作:postPurchaseInvoiceAction、applyDebitNoteAction
必传字段:purchaseInvoiceId, supplier_invoice_number, invoice_date, currency, exchange_rate, total_amount, tax_amount, match_status='matched'
采购 → 出纳:付款申请
我做什么:采购单付款 Tab 点「申请付款」,输入金额、选里程碑、填供应商银行信息;多里程碑走批量申请。
下游看到什么:出纳在付款申请列表看到新行(状态「待放款」);放款后回采购单付款 Tab 录付款记录,采购单已付金额增加。
缺失会回来找我:银行信息缺失 → 出纳无法转账。已付 + 本次申请 > 合同金额 → 超付校验拒。币种 / 金额对不上发票 → 出纳反复核对。
技术字段(给 IT/出纳交叉核对)
触发动作:createPOPaymentRequestAction、createMilestonePRAction、createMilestonesPRAction;出纳回录 recordPOPaymentAction
必传字段:purchaseOrderId, amount, currency, milestoneId?, bankAccountInfo, paymentDate?, reference?
库管 / 销售 / 生产 → 采购:补货需求
我看到什么:库管补货预警发来红色提醒 + 建议供应商;销售确认的订单缺料清单触发「由订单生成采购单」;生产 BOM 缺件推送采购任务。
我做什么:按需求建询价单或直接下采购单;由销售订单生成采购单时在订单详情点「生成采购单」,按供应商分组批量创建草稿采购单(回链源销售订单)。
缺失会回来找我:补货预警未选建议供应商 → 仍要自己选;销售订单行项数量未确认 → 下的采购单数量对不上;BOM 缺物料挂靠 → 找不到可询价的供应商。
技术字段(给 IT/跨模块交叉核对)
触发动作:getReorderRecommendationsAction、preparePOFromSOAction、createPOsFromSOAction
必传字段:salesOrderId, items[].productVariantId, items[].quantity, items[].supplierId;reorder:warehouseId, reorderPoint, preferredSupplierId
采购 → 销售 / 跟单:到货 / 交期回执
我做什么:采购单状态从「已发送」推到「已确认」(供应商回签)、「部分到货 / 已全部到货」(收货推进);审计轨迹每步记录。
下游看到什么:销售 / 跟单在销售订单详情看到关联采购单状态变化与预计到货日更新;PMC 据此排产。
缺失会回来找我:预计到货日未更新 → 跟单无法排产;采购单状态不推进 → 销售以为还没下单;审计轨迹缺失 → 合规审查被驳。
技术字段(给 IT/跟单交叉核对)
触发动作:updatePOStatus、executePOTransitionAction、getPOAuditTrail
必传字段:purchaseOrderId, toStatus ∈ {confirmed, partial, received, cancelled}, expected_date?, note?
异常回滚
误操作不要改 DB。按下表选对应入口按业务规则回滚。
| 症状 | 做什么 | 前置条件 / 后果 |
|---|---|---|
| 询价单错发(供应商选错 / 明细漏行) | 询价单详情点「撤销」(「已发出」改「已取消」) | 已「授标」不可撤;重发需建新询价单 |
| 报价录错金额 / 供应商撤回报价 | 报价详情改状态到「已拒绝」;草稿态可直接删 | 「已接受」后锁定——需走采购单撤销链路 |
| 采购单错签(供应商错 / 数量错) | 采购单详情走工作流把状态改到「已取消」 | 仅「已发送 / 已确认」可撤;「已全部到货」终态不可撤,改走 2.8 退货 |
| 采购单审批中发现行项错 | 详情点「撤回审批」返回「草稿」,改完重新提交 | 「待审批」不可直接改行项;改完要重走审批 |
| 重复收货 / 收错批次 | 无独立撤收货动作——建反向退货或找库管反向调整库存 | 收货产生的库存变动保留审计轨迹;不要硬改批次数据 |
| 质检通过误签 | 无反向动作——走退货闭环处理 + 审计日志留证 | 质检通过确认仅前向设置(通过 / 不通过),没有撤回入口 |
| 采购发票录错 | 发票详情点「撤销」(「草稿 / 已提交 / 已匹配 / 已批准 / 已过账」都可撤;已过账撤销含总账反记账) | 已「已应用」的借项单需先撤应付冲抵 |
| 付款申请错建(未放款) | 采购单付款 Tab 点「删除」对应申请行 | 出纳未放款;已放款须走 2.8 退货 + 借项单冲销 |
| 退货单错建 | 草稿点「删除」;「已提交」及之后点「撤销」 | 「已开借项冲抵」终态不可撤;需对齐借项单应用状态 |
| 到岸成本摊错 | 草稿点「删除」;「已提交」点「撤销」(反写成本) | 跨期已进月结走财务调整,不自己改后台数据 |
| 借项单错发 | 借项单详情点「撤销」 | 仅非「已应用」状态可撤;已应用先反冲应付再撤 |
| 供应商误删 | 主档把状态改回「启用」(软删) | 外键关联(未结采购单 / 发票)阻止硬删;硬删动作会做存在性预检 |
对应系统动作(IT 追溯)
cancelRfqAction— 撤sentRFQ(awarded不可撤)updateQuotationStatusAction— SQ 改rejected;deleteSupplierQuotationAction仅草稿无 PO 关联updatePOStatus(cancelled)/executePOTransitionAction— 撤sent/confirmedPOcancelPurchaseInvoiceAction— 撤 PI;posted撤含 GL 反记账deletePOPaymentAction— 删未放款的付款记录deletePurchaseReturnAction/cancelPurchaseReturnAction— 草稿删 / 已提交撤;credited不可撤deleteLandedCostAction/cancelLandedCostAction— 草稿删 / 已提交撤(反写成本)cancelDebitNoteAction— 撤 DN,applied先反冲updateSupplier(status=inactive) — 软删供应商;deleteSupplier受 FK 约束forceReleaseBatchAction— QC hold 批次强制放行(协同库管),写放行原因到审计
进阶功能
补货建议 + 批量采购机会
补货引擎按 reorder_point / 销量 / 在途 计算推荐采购量;批量机会聚合同供应商多 SKU 合并询价,省运费和议价。周一固定跑一次。
系统动作:getReorderRecommendationsAction、getBulkOpportunitiesAction。
AI 供应商评估
供应商详情页有「AI 评估」Tab,综合 supplier_scorecards、历史交期、质量事件、财务数据产出风险评级与改进建议。适合新供应商准入 / 年度复审用。
系统动作:getSupplierRiskAction、getSupplierEvaluationAction、getSupplierPerformanceByMaterialType。
SO→PO 聚合生成
销售订单详情点「生成采购单」——系统按供应商分组聚合缺料,批量创建 draft PO 并回链 sales_order_id。入口在销售订单而非采购列表,需跨模块培训。
系统动作:preparePOFromSOAction、createPOsFromSOAction。
工作流状态推进 / 审计追溯
PO / PR / DN 状态机统一走 src/services/workflow-engine.ts。详情页右上「可用操作」下拉显示当前可用 transition;每次变更都写 workflow_audit_trail。
系统动作:executePOTransitionAction、executePurchaseReturnTransitionAction、getPOAvailableTransitions、getPurchaseReturnAvailableTransitions、getPOAuditTrail、getPurchaseReturnAuditTrail。
供应商-产品挂靠 + 导入
每个产品可挂多家供应商(supplier_products),记录供应商物料号、MOQ、交期、参考价。新供应商批量录入走「导入供应商」CSV 模板。
系统动作:listSupplierProductsAction、addSupplierProductAction、updateSupplierProductAction、deleteSupplierProductAction、importSuppliers。
批次 / QC hold 强制放行
QC 启用仓的新批次默认 hold,产线急用料时协同库管走「强制放行」,填放行原因写审计;不绕过 QC 链路。
系统动作:forceReleaseBatchAction、confirmPurchaseInspectionAction。
相关业务场景
采购参与 6 大跨角色场景中的 5 条核心链路;「标准成单流」仅在销售缺料时被动出 PO;「报销审批流」作为申请人。
- 标准成单流(询盘 → 报价 → 订单 → 发货 → 开票): 采购不主动参与。销售转单后若缺料,会在 SO 详情触发 SO→PO,采购接力按供应商分组下单。 → 场景(缺料时参与)
- 定制家具项目流: 采购按项目 BOM 发 RFQ、比对 SQ、下 PO;收货后摊到岸成本;项目结束复盘供应商表现。 → 场景详解
- 回款流:采购不参与客户侧回款——仅关注下游出纳的放款节奏,以便按 PO 付款节点申请付款。 → 场景(了解即可)
- 采购付款流: 采购全链路主导——RFQ → SQ → PO → GR → PI(三单匹配)→ 付款申请 → DN 冲销。Quickstart 任务全覆盖。 → 场景详解
- 月结流: 采购负责月初到岸成本分摊、月中退货转借项、月底供应商评分;会计端结账由财务主导。 → 场景详解
-
报销审批流:采购作为申请人(出差、供应商考察等)走
/dashboard/expenses;非采购核心动作。 → 场景(作为申请人)
外部协作入口
/dashboard/wecom— 企微推送(PO 发出、到货提醒、付款申请、供应商评分提醒)配置。/dashboard/settings/email— 邮件网关与模板(发 RFQ / PO 给供应商用)。/dashboard/reports— 采购报表(月度采购额、供应商占比、交期异常)。/dashboard/inventory/reorder-alerts— 库管端补货预警入口。/dashboard/inventory/stock— 库管端在库数据,核对在途与可用库存。/dashboard/accounting/payments— 出纳付款看板,跟踪付款申请状态。/dashboard/manual— 系统内置使用手册(补充参考)。
权限与范围
看得到什么(RLS 边界)
- 当前
organization_id下的所有rfqs/supplier_quotations/purchase_orders/goods_receipts/purchase_invoices/purchase_returns/debit_notes/landed_cost_vouchers。 - 当前
book_id下的财务数据——多账套下不同账本隔离,切账套后看到的数据会变。 - 供应商主档(
suppliers)与评分卡(supplier_scorecards)全组织可见。
核心概念
book_id— 账套隔离键。所有财务相关表(PO / PI / DN / Landed cost)带book_id,切账套后数据完全隔离。切账套在右上角账套切换器。organization_id— 租户隔离键。多租户场景下跨组织数据通过 RLS 隔离。- 工作流引擎(
src/services/workflow-engine.ts)——PO / PR / DN 状态机统一走该引擎,transition 由 DB 配置,不在代码里写死;审计轨迹自动写入workflow_audit_trail。 - 三单匹配(
calculateThreeWayMatchAction)——PO × GR × PI 数量与单价比对,容差由variance_tolerance_percent控制;match_status决定是否可过账。
术语表
- 询价单 RFQ
rfqs.rfq_number(带deadline/currency/source_quote_id/source_inquiry_id)- RFQ 供应商响应
rfq_suppliers.status ∈ {pending, quoted, declined, no_response}- 供应商报价 SQ
supplier_quotations.sq_number(含valid_until/lead_time_days/total_amount)- SQ 状态 enum
received | under_review | accepted | rejected | expired- 采购单 PO
purchase_orders.po_number(PO-YYYYMM-NNNN)- PO 状态 enum
draft | pending_approval | approved | sent | confirmed | partial | received | cancelled | rejected- 收货单 GR
goods_receipts.receipt_number(触发stock_movements.movement_type='receipt')- 采购发票 PI
purchase_invoices.pi_number(带match_status/price_variance)- 三单匹配状态
unmatched | partial_match | matched | over_matched- 退货单 PR
purchase_returns.pr_number;状态draft → submitted → approved → shipped → received_by_supplier → credited- 借项通知单 DN
debit_notes(status ∈ {draft, issued, applied, cancelled}、applied_amount)- 到岸成本凭证
landed_cost_vouchers(status ∈ {draft, submitted, cancelled})- 供应商评分卡
supplier_scorecards(quality_score/delivery_score/price_score/response_score/overall_score)- 付款里程碑
po_milestones(预付 / 到货 / 质保三段due_date/status)- 可收 PO 状态
RECEIVABLE_PO_STATUSES = {sent, confirmed, partial}(receiveItems前置)- 可付 PO 状态
PAYABLE_PO_STATUSES = {confirmed, partial, received}(付款申请前置)- SO→PO 链路
purchase_orders.sales_order_id(preparePOFromSOAction聚合缺料)- 核心授标动作
awardQuotationAction(RFQ→awarded + SQ→accepted/rejected)- 核心收货动作
receiveItems(写 GR +adjust_stock_atomic(receipt))- 核心过账动作
postPurchaseInvoiceAction(match_status=matched时写 GL)- 账套隔离键
book_id(所有财务表)
常见问题
PO 发出后供应商说单价错了怎么改?
sent 后不要直接改 DB 单价——会破坏审计链。两种方案:(a)走工作流把 PO 撤到 cancelled,重建新 PO;(b)收货后按差额走 T8 退货 + 借项通知单冲销应付。金额往下调优先用 DN;金额往上调必须走新 PO。
三单匹配一直 partial_match 怎么办?
通常是数量或单价偏差超 variance_tolerance_percent。先核对 GR 实收 vs PI 行项数量(供应商少发 / 多发);再核单价是否含了运费或税。调整 PI 行项价格或等下一批补货补齐 GR,再重跑匹配;不要硬提交 partial_match,会让会计账对不上。
GR 收错了怎么撤?
目前没有独立撤 GR 的 action。两条路:(a)建反向退货单把多收 / 错收的退回供应商;(b)找库管在仓库模块走 adjustStock 反冲库存(留审计原因)。错收数量很小时优先 (b) 省链路;批次 / 整托错收走 (a)。
供应商未评审就要下单怎么办?
不能绕过。先找采购经理 / 财务走供应商准入流程——填主档 + AI 风险评估 + 法务审核;评分卡第一次可先给保守分。急单可申请临时准入(status=active 但 notes 标临时),后续补齐资质。
SO→PO 生成的 PO 能改数量吗?
生成的是 draft PO,发出前随便改行项(数量、单价、供应商都可换);改完后 PO 与 SO 的链接仍在(sales_order_id 不变)。一旦 sent,改数量走 T4 「审批后改」链路或撤销重下。
到岸成本分摊后库存成本飘了?
先核对凭证里的分摊方式(按金额 / 按重量 / 按数量)是否匹配物料——重物按重量、小杂按金额;如果 PO 混了重物和轻货按数量摊会偏。摊错了点「撤销」反写成本,改分摊方式重新提交。
为什么看不到其他采购员的 PO?
RLS 按 organization_id 隔离——同组织内采购互相可见(除非管理员配了 owner_id 过滤)。看不到说明账套 book_id 不同(右上切账套)或该 PO 属于其他组织。
供应商要求修改 PO 付款条款怎么办?
付款条款改会影响里程碑金额和到期日。draft 状态直接改;sent 后需走 PO 工作流撤回或生成修订版(带 notes 关联原 PO)。里程碑已部分履约的走单独调整单,不要删重建。