DaoSales 培训手册

出纳

面向出纳:收付款、银行对账、付款申请

今天要做什么

按节拍把每一笔钱打出去 / 收进来:每天清待付清单 + 扫回单落账,每周批量处理企微报销 + 清未匹配流水,每月做银行对账交会计复核。

每日(开班 10 分钟 + 日终 20 分钟)

  1. 打开出纳工作台「待付清单」Tab,按预计付款日升序看今天要打的款,核对收款方账户与金额。(见图 ①)
  2. 登入网银 / 支付宝逐笔汇款,下载每笔回单(PDF / 截图)。
  3. 切「快速记账」Tab,拖拽回单进上传区,系统 AI 识别金额 / 收款方 / 流水号,自动列候选的付款申请。(见图 ②)
  4. 确认候选后点「确认记账」——登记付款执行,自动把对应银行流水置「已匹配」。
  5. 客户打款到账:在客户收款列表按银行到账对单,按先进先出(FIFO)分配到未结发票。
  6. 日终切「今日流水」Tab,核对今日所有登记流水合计与网银明细一致;凭证编号列显示「未生成凭证」表示等待会计过账。(见图 ③)
日常入口:/dashboard/accounting/cashier/dashboard/accounting/payment-requests?status=approved/dashboard/accounting/payments

每周

  • 周三 / 周五供应商批量付款:在付款申请列表筛出状态「已审批」的申请,勾选今日计划付款的申请,网银批量汇款后逐笔扫回单入账。
  • 企微报销批量:从「待付清单」导出 CSV 交银行代发,回来填付款回单号批量标「已付」。
  • 未匹配银行流水清理:在银行对账页查状态为「未匹配」的银行流水长尾,手工关联付款执行或补付款申请。

每月

  • 月末 +1 日做银行对账:选一个银行账户新建对账单,填银行结单期末余额,点「自动匹配」对金额 / 日期,手工修差异,差异 = 0 后提交给会计复核。
  • 核对现金流预测看板,和下月预计到期付款申请总额比对,给财务经理调度资金。
  • 提前两天停接前月单据——月结冻结期禁止补录旧流水,差异留到下月反向。
cashier/nav-overview.jpg

权限红线(先看这 5 条)

  • 不做总账过账——「待过账 → 已过账」是会计的动作,出纳页面即便出现「批量过账」按钮点击也会被权限拒绝。
  • 不跳付款申请审批状态——申请不在「已审批 / 处理中 / 部分已付」三种状态时点「执行付款」系统会直接报错「付款申请必须已审批」。
  • 银行水单未到手不录——没有银行流水号的回单缺幂等键,事后对账会对不上;凭直觉预录会被会计打回。
  • 同一笔回单不重复执行——系统按「银行流水号 + 金额 + 日期」生成回单指纹,命中即拒;真要冲销走会计的冲销流程。
  • 不动采购 / 销售 / 人事单据——这些模块对出纳只读;付款申请必须由会计或财务经理先批准后才进入出纳视野。

Quickstart — 日常核心任务

2.1 执行付款申请(付款申请 → 已付)

付款申请经会计 / 经理批准变为「已审批」后,出纳按预计付款日安排网银汇款,并在系统登记执行。默认走延后过账路径——登记执行不直接生成凭证,等会计统一过账。

  1. 进付款申请列表,顶部筛状态「已审批」,按预计付款日升序挑今日计划付款单。(见图 ①)
  2. 点申请号进详情页,核对收款方账户、币种、金额与随附合同 / 发票一致。
  3. 网银完成汇款后回到详情页,点右上角「执行付款」按钮。
  4. 弹窗填付款金额(默认带出剩余未付金额)、付款日期(默认今天)、付款方式(银行转账 / 现金 / 支票 / 信用证)、银行流水号。
  5. 点回形针上传银行回单 PDF / 截图;若已登记对应银行流水,在下拉里选流水号做绑定。
  6. 点「确认」——系统登记付款执行并把申请状态推到「部分已付」或「待过账」。
cashier/payment-requests-list.jpg
何时不该做:银行未真正扣款不要点「执行付款」——一旦登记将触发会计过账流程,事后撤销必须让会计反向冲销,留下两条审计记录。超付金额(大于申请剩余额度)会命中「防超付检查」提示「另一笔执行已占用剩余额度」,别强改 DB 绕过——这是防并发双花的底线。
观测信号:
  1. 付款申请详情顶部状态徽标由「已审批」推进到「部分已付」或「待过账」。
  2. 「付款执行」卡片列表新增一行,执行号 {申请号}-P1-P2 递增。
  3. 弹 toast「付款已执行」;今日流水页凭证列显示「未生成凭证」(等会计过账后回填)。
技术追溯:payment_executions.execution_number = {request_number}-P{n}payment_executions.gl_status ∈ created/failed/not_applicable;触发器自动更新 payment_requests.paid_amount;若关联 bank_transactionsbank_transactions.status → matched
系统动作:cashierExecutePaymentAction(默认,skipAutoPost=true 暂不过账)、executePaymentAction(立即过账,少用)、uploadPaymentReceiptActionsearchBankTransactionsActiongetExchangeRateAction

2.2 扫回单快速匹配

手里有一沓网银回单,不想逐个翻申请号——出纳工作台的「快速记账」按回单自动匹配对应付款申请或报销单,回单扫完全部入账。回单指纹防重复。

  1. 打开出纳工作台,切「快速记账」Tab。(见图 ①)
  2. 把回单图片拖进上传区(PDF 截图都行),或在下方文本框粘贴「已付 XX 公司 5 万」之类的付款描述。
  3. 等「正在识别回单...」完成——系统 AI 提取金额 / 收款方 / 银行流水号 / 日期。
  4. 系统列候选付款申请,按金额 ± 日期 ± 收款方打分显示「精确匹配 / 高匹配 / 中等匹配」徽标;勾选正确的候选。
  5. 点「确认记账」——生成付款执行 + 审计行,回单指纹入库防重扫。
  6. 扫错回单:若命中相同指纹系统直接返回「该回单已记账」,不重复记账;真要撤销联系会计冲销对应凭证。
cashier/cashier-entry-idle.jpg
何时不该做:回单币种与候选付款申请不一致时弹「币种不匹配」早返回,不要硬匹配——走付款申请详情页的执行弹窗里手工填汇率。回单上没有银行流水号 / 水单号时没有幂等键,第二次扫会重复记账,此时先手工核对是否已登记再确认。
观测信号:
  1. 工作台顶部弹「已记账」绿色成功态,显示执行编号与(可能为空的)凭证编号。
  2. 切「今日流水」Tab 看到新行,时间 / 收款方 / 金额 / 来源(付款申请 / 报销)列全。
  3. 对应付款申请详情的付款执行卡新增一行。
技术追溯:cashier_executions.receipt_fingerprint = sha256(bankRef|amount|date)cashier_executions.journal_entry_id 可能为空(默认延后过账);bank_transactions.status='matched'
系统动作:parseReceiptAction(Qwen VL)、parseReceiptTextAction(文本模型)、matchReceiptActionconfirmPaymentAction

2.3 客户回款分配到发票

客户一次打款多张发票,按客户指示或默认先进先出(FIFO)分配到未结发票,更新应收账龄。

  1. 进客户收款列表,看到新到账的收款行,未分配的「未结金额」列有余额。(见图 ①)
  2. 点收款行打开分配弹窗——系统按客户列出未结发票,按发票日期升序预填 FIFO 分配。
  3. 按客户指示微调每行分配金额;可多选发票、可留余额作预付款。
  4. 点「确认分配」——更新各发票「已付金额」和状态;销售订单联动重算。
cashier/customer-payments-list.jpg
何时不该做:发票状态为「草稿」或「已作废」时不允许分配——会命中可付款状态校验被拒绝。客户明确指定冲特定发票时别偷懒按 FIFO——事后客户对账会要求按他要求的单对。
观测信号:
  1. 客户应收账龄报表对应客户行未结金额减少。
  2. 被核销发票详情的「已付金额」增加,未结余额递减;全额核销后状态变「已付」。
  3. 关联销售订单的已收合计同步增加。
技术追溯:payment_allocations 新增明细行;invoices.paid_amount / invoices.status 更新;sales_orders 通过 recalculateOrderStatus 联动。
系统动作:allocatePaymentgetPaymentAllocationSuggestionsgetCustomersWithOutstandingBalance

2.4 登记银行流水(导入 / 手工)

月中银行对账单 CSV 到手或零星手工流水,按银行账户登记进系统,后续作为匹配候选供执行付款 / 客户回款引用。

  1. 进银行对账列表,选目标银行账户进「对账 / 导入」入口。(见图 ①)
  2. 选「导入」:上传网银导出的 CSV / XLSX——系统按批次导入,按银行流水号去重。
  3. 选「手工」:填交易日、记账日、金额、流水号、描述、对手户名 / 账号。
  4. 导入后系统报告「已导入 / 重复 / 错误」三项数字——重复流水直接跳过(按「导入批次号 + 银行流水号」去重)。
  5. 导入后所有新流水默认状态「未匹配」,等待扫回单或对账时匹配。
cashier/bank-reconciliation-list.jpg
何时不该做:月结冻结期内别补录上月流水——冻结期写入会破坏上月账面差异,差异必须等解冻后走下月反向流水。导入 CSV 去重报告「重复」数字大于 0 属正常,不要强行重导——会产生孤儿流水。
观测信号:
  1. 银行对账页对应账户「最新流水数」列增加。
  2. 匹配页左栏「未匹配」银行流水列表出现新批次行。
  3. 导入结果对话框显示「已导入 / 重复 / 错误」三项数字。
技术追溯:bank_transactions 新增行,字段 transaction_date / value_date / amount / bank_reference / description / counterparty_name / counterparty_account / status / import_batch_id;返回 ImportBankStatementResult { imported, duplicates, errors, batchId }
系统动作:importBankStatementBatchcreateBankTransactionbankTransactionExists

2.5 月度银行对账

月末 +1 日,银行结单到位。出纳按账户逐个建对账单,差异 = 0 后提交会计复核。

  1. 进银行对账页,对每个银行账户点「新建对账」。(见图 ①)
  2. 填开始日、结束日、银行结单期末余额,保存后对账单状态为「草稿」。
  3. 进匹配工作台(双栏:左「银行流水」 / 右「账簿记账」),点「自动匹配」——系统按金额 + 日期 ± 3 天自动配对。
  4. 剩余的未匹配行手工处理:左栏选一行银行流水,右栏选对应账簿凭证,点「建立匹配」。
  5. 查「未匹配总计」:在途存款、未兑现支票、银行手续费分别登记。
  6. 差异(银行期末余额 − 账簿期末余额)= 0 后点「完成对账」——状态推到「已完成」,交会计复核变「已批准」。
何时不该做:差异 ≠ 0 不要强点「完成」——先查在途存款 / 未兑现支票 / 银行手续费是否漏登。已「完成」的对账不要手删——走「取消匹配」释放单笔匹配;真要整体反悔联系会计从「已批准」回退。
观测信号:
  1. 匹配工作台顶部「差异」数字随每次匹配递减,= 0 时「完成对账」按钮由灰变亮。
  2. 对账完成后,账户列表该账户「最近对账」列显示本次结束日与期末余额。
  3. 匹配过的银行流水状态由「已匹配」推到「已对账」。
技术追溯:bank_reconciliations.statusdraft → in_progress → completed → approved(草稿 → 进行中 → 已完成 → 已批准);bank_accounts.last_reconciled_date / last_reconciled_balance 更新;reconciliation_matches 记录 bank_tx ↔ journal_entry 多对多关系。
系统动作:createReconciliationautoMatchTransactionscreateMatchunmatchupdateReconciliationStatus

2.6 上传付款回单补齐

2.1 执行时若没随附回单(急单 / 回单后到),事后回付款执行行补传。

  1. 打开目标付款申请详情,在「付款执行」卡片找到缺回单的行。
  2. 点行内回形针图标上传 PDF / 截图——进「付款回单」存储桶。
  3. 上传完成后查看:点「查看回单」获取 10 分钟有效的签名 URL 预览。
cashier/cashier-pending.jpg
何时不该做:回单不是本笔付款的别随手传——后续会计过账看回单核对对手方 / 金额时会反查是否张冠李戴。存储桶命中同名文件会覆盖,改名上传。
观测信号:
  1. 付款执行行的回形针图标由灰变蓝,hover 显示文件名。
  2. 点「查看回单」在新标签打开签名 URL 的 PDF / 图片预览。
技术追溯:payment_executions.receipt_storage_path / receipt_file_name / receipt_mime_type 填充;签名 URL 有效期 600 秒。
系统动作:uploadPaymentReceiptActiongetReceiptSignedUrlAction

2.7 企微报销批量付款

企微报销经财务经理审批后进入出纳视野,通常一次处理 10-30 单,走银行代发工资通道而非逐笔汇款。

  1. 在出纳工作台「待付清单」Tab 看到「报销单」类型的待付项,状态「已审批」。(见图 ①)
  2. 点「导出 CSV」——按银行代发格式导出,交银行代发通道。
  3. 银行代发完成后,回来勾选已付报销单,点「标记已付」。
  4. 弹窗填付款回单号(如 E2E-REF-202604150001),点「确认」——批量回填付款回单号与付款日期。
cashier/cashier-pending.jpg
何时不该做:银行代发未收到到账回执前别点「标记已付」——事后报销人没收到钱回来找,要走财务侧撤销并重打。付款回单号填错也要走撤销——不要手改 DB。
观测信号:
  1. 待付清单对应报销单消失,移到今日流水 Tab 的付款流水。
  2. 报销模块该单状态推到「已付款」并显示付款日期。
  3. 弹 toast「已标记 N 单为已付」。
技术追溯:expense_claims.paid_at / payment_reference 填充;cashier_executions 新增行(source_type='expense_claim')。
系统动作:markExpenseClaimAsPaid、CSV 导出走 wecom-expense-pending.tsx 本地生成。

上下游交接契约

出纳是会计、销售、采购三条链的资金落地节点——上游审批完、下游等凭证或发票更新。字段缺失或状态跳步会直接让下游卡壳。

会计 / 财务经理 → 出纳:付款申请进入可执行

我做什么:打开出纳工作台「待付清单」按预计付款日筛今天要付的款,核对收款方 / 金额 / 币种无误后走 2.1 执行付款。

上游做什么:会计或财务经理在付款申请详情点「批准」,状态从「待审批」推到「已审批」;此时申请开始出现在出纳「待付清单」Tab。

缺失会回来找我:上游漏填收款方银行账户 → 出纳网银汇款时没对方账号;币种没填会计无法挂账;申请金额与合同 / 发票不一致 → 出纳发现后只能让会计改或驳回重批,不自己改 DB。

技术字段(给 IT / 会计交叉核对)

上游触发:approvePaymentRequestActionpayment_requests.status 推到 approved

冻结字段:requested_amount, currency, payee_name, payee_bank_account, payee_bank_name, payee_bank_branch。驳回动作:rejectPaymentRequestAction

出纳 → 会计:付款执行触发凭证

我做什么:在付款申请详情点「执行付款」,填金额 / 方式 / 流水号 / 回单;默认走延后过账路径(暂不过账,会计后续处理),登记后状态推到「待过账」等会计过账。

下游看到什么:会计在付款申请列表筛状态「待过账」的单,点「批量过账」生成会计凭证。

缺失会回来找我:没选出款银行账户 → 会计不知从哪张卡出的钱,凭证借贷科目错;回单缺失 → 审计追溯无凭证;总账状态标记为「失败」→ 会计手工补过账。

技术字段(给 IT / 会计交叉核对)

触发动作:cashierExecutePaymentAction(默认,skipAutoPost=true 延后过账)或 executePaymentAction(立即过账,少用)。

必传字段:requestId, amount, paymentDate, paymentMethod, paymentReference?, fromBankAccountId?, bankTransactionId?, receiptStoragePath?

触发钩子:onPaymentRequestExecuted → handleAccountingEvent() 生成 payment_executions + (可选)journal_entries

出纳 → 销售:客户回款已分配

我做什么:收到客户银行到账进银行流水表,按客户指示或先进先出把收款行分配到未结发票,更新应收。

下游看到什么:销售在订单详情「付款」Tab 看到新收款行(金额、方式、流水号、到账日);销售报表的已收 / 未收数字同步变化;企微推送「订单收款到账」卡片。

缺失会回来找我:回款没填银行流水号 → 月度对账时销售问「这笔是哪家客户付的」无据可查;分错发票(本该冲 A 发票冲了 B)→ 客户对账单不对,销售回来找出纳反分配重做。

技术字段(给 IT / 销售交叉核对)

触发动作:allocatePayment(内部写 payment_allocations)。

必传字段:paymentId, allocations[].invoiceId, allocations[].amount(总和 ≤ payments.amount)。

联动:invoices.paid_amount / statussales_orders.paid_amount(通过 recalculateOrderStatus)。

出纳 → 会计:银行对账完成待复核

我做什么:月末做 2.5 银行对账,差异 = 0 后把对账单状态推到「已完成」。

下游看到什么:会计在对账列表看到状态「已完成」的单进入复核队列,确认无误后推到「已批准」,期末余额写入银行账户的「最近对账日 / 最近对账余额」。

缺失会回来找我:未匹配银行流水过多 → 会计复核时要求补匹配或记银行手续费;银行期末余额与银行结单不一致 → 整单驳回重做。

技术字段(给 IT / 会计交叉核对)

触发动作:updateReconciliationStatus('completed')

必传字段:reconciliationId, closing_balance_bank, outstanding_deposits?, outstanding_checks?, bank_charges?

校验:variance = closing_balance_bank - closing_balance_book = 0

异常回滚

出纳自己不做冲销——付款执行一旦登记不可自行撤销。按下表走对应路径,会计侧冲销 / 银行匹配反向 / 重新扫回单各有不同前置。

症状 做什么 前置条件 / 后果
误执行付款(金额 / 收款方错) 联系会计走「冲销付款执行」生成反向凭证 出纳自己不能撤;付款执行行的总账状态标记为「已冲销」、银行流水绑定清空;付款申请状态推到「已冲销」
误关联银行流水(本该匹配 A 匹配了 B) 在银行对账匹配页该行点「取消匹配」 未过账前可做;银行流水状态回到「未匹配」,对账匹配行删除
扫错回单匹配错付款申请 再扫一次指纹命中即拒;真要撤走会计冲销流程 回单指纹防重;已记账只能走会计冲销
客户回款分错发票 在收款详情对应分配行点「反分配」,重建正确分配 发票未作废可反;联动发票「已付金额」重算
重复导入银行对账单 直接看导入结果「重复」数字即可 按「导入批次号 + 银行流水号」去重,重复行不入库——这是正常态
企微报销误标已付(回单号填错) 联系财务经理在报销侧走「撤销已付」 出纳不能自己改;报销单的付款日期 / 付款回单号由财务侧清空
银行对账差异不为 0 误点完成 联系会计从「已批准」回退到「进行中」 一旦「已批准」,银行账户的最近对账记录已写入,回退要会计权限
对应系统动作(IT 追溯)
  • reversePostedPaymentAction — 会计侧冲销已登记付款执行,生成反向凭证,payment_requests.status → posted_reversed
  • unmatchbank-matching.unmatch)— 取消 bank_tx ↔ journal_entry 匹配,bank_transactions.status → unmatched
  • accountantPostPaymentAction — 会计手工过账 gl_status='failed' 的遗留执行
  • batchPostPaymentAction — 会计批量把 paid_pending_posting 推到 posted(出纳无权)
  • updateReconciliationStatus — 对账状态机 draft/in_progress/completed/approved/cancelled;回退需会计权限
  • bankTransactionExists — 导入去重守卫,以 batch_id + bank_reference 为键
  • confirmPaymentAction — 幂等键命中直接返回已存在 execution,不重复记账

进阶功能

外币付款(含汇差 / 汇率锁定)

执行付款弹窗里除本币金额外可填付款币种、外币金额、汇率;系统带出实时汇率,出纳可手工覆盖。汇差 / 折算差由会计在 /dashboard/accounting/fx-gain-loss 统一处理,不是出纳范围。

系统动作:getExchangeRateActioncashierExecutePaymentAction(扩展字段 paymentCurrency / paymentAmountForeign / exchangeRate)。

搜索并绑定银行流水(执行付款弹窗内下拉)

大额付款 / 多笔合并汇款时,先导入银行流水,再在执行付款弹窗的「关联银行流水」下拉里按金额 ± 日期搜候选,选中后绑定;绑定后银行流水状态直接置「已匹配」,月末对账时自动识别。

系统动作:searchBankTransactionsAction(按金额 / 日期范围分页)。

出纳代申请快速付款

零星报销 / 供应商急单无人建付款申请时,出纳可自己建申请(来源类型「手工」)快速走审批流。也可从上游单据(报销 / 采购单 / 外协 / 里程碑)一键生成申请——字段自动带出。

系统动作:createQuickPaymentRequestActioncreatePaymentRequestActioncreateFromExpenseClaimActioncreateFromPurchaseOrderActioncreateFromOutsourceOrderActioncreateFromMilestoneActioncreateFromMilestonesAction

PDF 回单文本识别(省 token)

若回单是文本型 PDF(不是截图),走文本模型 parseReceiptTextAction(qwen-plus 文本模型,不传图)——比 Qwen VL 视觉识别省一半成本,速度快 2-3 倍。上传 PDF 时系统自动判断。

系统动作:parseReceiptTextAction(文本模型)vs parseReceiptAction(视觉模型)。

现金流预测看板(资金调度)

/dashboard/accounting/cash-flow-forecast 按未付申请 + 在途回款展望 7/14/30 天资金缺口。出纳给财务经理提供资金调度建议时用。

入口:/dashboard/accounting/cash-flow-forecast

今日流水导出 / 筛选

今日流水 Tab 按 Asia/Shanghai 截日。跨时区账套(私有部署多账套)要注意——切账套后看到的「今天」按该账套所在时区而非浏览器时区。

系统动作:getTodayLedgerAction

相关业务场景

出纳参与 6 大跨角色场景中的 4 条:标准成单流里做客户回款落地,采购付款流全程主导资金落地,月结流做银行对账,报销审批流做报销付款。不参与定制项目流与 QC 主链路。

  1. 标准成单流(询盘 → 报价 → 订单 → 发货 → 开票 → 回款): 出纳在回款环节落地——银行到账后走 2.3 分配到发票,更新应收;不参与前端客户 / 报价环节。 → 场景详解
  2. 定制家具项目流: 出纳不参与——项目排产 / BOM / 里程碑由跟单 / PMC 操作。项目按里程碑产生的付款申请进入出纳待付清单后,和普通付款申请一视同仁走 2.1。 → 场景(了解即可)
  3. 回款流: 出纳核心场景——银行到账 → 导入 / 手工登记银行流水 → 2.3 分配到发票 → 月末对账。 → 场景详解
  4. 采购付款流: 出纳核心场景——采购 RFQ / 采购订单审批通过 → 采购侧走「生成付款申请」→ 经理批准 → 出纳 2.1 执行付款。 → 场景详解
  5. 月结流: 出纳核心场景——月末 +1 日做 2.5 银行对账;冻结期禁手工调整;差异 = 0 后交会计复核推「已批准」。 → 场景详解
  6. 报销审批流: 出纳在末环节落地——财务经理批准后,2.7 批量付款或逐笔走 2.1;回单号回填报销单的付款回单号。 → 场景详解

外部协作入口

权限与范围

看得到什么(RLS 边界)

  • 当前组织下的所有付款申请 / 付款执行记录 / 出纳执行记录 / 客户收款 / 银行流水 / 银行对账单。
  • 当前账套(book_id)下的财务数据——多账套下不同账本隔离,切账套(右上账套切换器)后今日流水 / 待付清单都会变。
  • 发票、销售订单、报销单只读——不能改明细或状态,但能看全组织。

核心概念

  • 延后过账(skipAutoPost=true 暂不过账,会计后续处理) — 默认走 cashierExecutePaymentAction 登记付款执行后不直接生成会计凭证,状态停在「待过账」等会计过账。产品也暴露了 executePaymentAction(立即过账)但很少用——出纳培训默认走延后过账。
  • 回单指纹(receipt_fingerprint — 按「银行流水号 + 金额 + 日期」哈希生成的幂等键。同一回单再扫命中即拒,防重复记账的唯一防线(业务术语,详见术语表)。
  • 防超付检查(paid_not_exceed_requested CHECK 约束) — 付款申请表数据库层守卫:已付金额 ≤ 申请金额。并发双花命中 23514 SQLState,提示「另一笔执行已占用剩余额度」——刷新后重试即可。
  • 账套隔离键(book_id — 所有财务表都带,切账套后数据完全隔离。跨账套调账必须走账套切换器而非手动改 DB。
  • 工作流引擎 — 付款申请状态由 src/services/workflow-engine.ts 驱动,不在代码里写死。出纳只能触发「执行」transition,不能越权触发「审批 / 驳回 / 取消」。

术语表

付款申请 payment request
payment_requests.request_number(唯一)
付款执行 payment execution
payment_executions.execution_number = {request_number}-P{n}
付款申请状态 enum
草稿 draft | 已提交 submitted | 待审批 pending_approval | 已审批 approved | 已驳回 rejected | 处理中 processing | 部分已付 partially_paid | 已付 paid | 待过账 paid_pending_posting | 已过账 posted | 已冲销 posted_reversed | 已取消 cancelled
出纳可执行状态
approved | processing | partially_paid(已审批 / 处理中 / 部分已付;其他状态点「执行付款」早返回)
付款方式 enum
银行转账 bank_transfer | 现金 cash | 支票 check | 信用证 letter_of_credit
付款来源 source_type
手工 manual | 报销 expense_claim | 采购订单 purchase_order | 外协单 outsource_order | 供应商预付 supplier_advance | 付款通知单 debit_note | 其他应付 other_payable
回款(客户侧)
payments 表(客户收款)+ payment_allocations(分配到发票)
银行流水
bank_transactionstransaction_date / value_date / amount / bank_reference / counterparty_*
银行流水状态 enum
未匹配 unmatched | 已匹配 matched | 已对账 reconciled | 已忽略 ignored
银行对账 bank reconciliation
状态 bank_reconciliations.status ∈ 草稿 draft | 进行中 in_progress | 已完成 completed | 已批准 approved | 已取消 cancelled
对账匹配
reconciliation_matchesbank_transactions ↔ journal_entries 多对多)
回单指纹 receipt fingerprint
cashier_executions.receipt_fingerprint = sha256(bankRef|amount|date)——业务幂等键,系统按「银行流水号 + 金额 + 日期」生成哈希防重复记账
延后过账标志 skipAutoPost
cashierExecutePayment() 内部参数(默认 true 暂不过账,让会计后续过账)
已付金额 / 申请金额
payment_requests.paid_amount(累计已付)/ requested_amount(原始申请),受「防超付检查」约束:paid_amount ≤ requested_amount
差异 variance
银行对账差异 = closing_balance_bank − closing_balance_book(银行期末余额 − 账簿期末余额,= 0 方可「已完成」)
过账(出纳不做)
accountantPostPayment / batchPostPayment(会计专属,将「待过账」→ 「已过账」)
冲销
reversePostedPayment(会计专属,payment_requests.status → posted_reversed 已冲销)
核心执行动作
cashierExecutePaymentAction(默认,延后过账)/ executePaymentAction(立即过账)
快速记账动作
parseReceiptActionmatchReceiptActionconfirmPaymentAction
账套隔离键
book_id(所有财务表)

常见问题

点「执行付款」提示「付款申请必须已审批」怎么办?

付款申请的状态不在「已审批 / 处理中 / 部分已付」范围内。回列表看当前状态:「草稿 / 已提交 / 待审批」→ 让申请人或会计推进审批;「已驳回 / 已取消」→ 不再执行,通知申请人重建。不要改 DB 的 status 绕过——工作流引擎会记审计日志,破坏审批链。

超付金额提示「防超付检查」怎么处理?

这是数据库 CHECK 约束——并发下另一位出纳(或另一终端)已占用剩余额度。刷新付款申请详情页看「已付金额」实际值,调整本次执行金额;若真要超付,让申请人通过会计新建增量申请。系统不允许绕过。

同一回单扫了两次怎么办?

系统按回单指纹幂等拒绝(「银行流水号 + 金额 + 日期」哈希),第二次返回「该回单已记账」不重复记账,不用担心。若回单没有银行流水号(扫描件 OCR 失败等)则无指纹,此时要人工核对是否已登记再确认。

我能点「批量过账」吗?

不能。批量过账和单笔过账是会计的权限。出纳页面即使看到按钮也会被权限拒绝(出纳角色无「创建凭证」权限)。让会计日终统一过账即可。

延后过账和立即过账哪个用?

默认「延后过账」(cashierExecutePaymentActionskipAutoPost=true 暂不过账)——登记后状态停在「待过账」,会计日终统一过账,凭证质量高、可回头整笔复核。「立即过账」(executePaymentAction)很少用——适合小额零散(会计不想 review)或系统自动化场景。培训 / 日常工作只记住前者。

对账差异一直不为 0 怎么查?

三步:(1)在途存款(月末前账上有钱但银行还没到)登记到「在途存款」;(2)未兑现支票登记到「未兑现支票」;(3)银行手续费(扣款但账上没记)登记到「银行手续费」。仍差则逐行核对金额近的银行流水与账簿凭证,通常是日期跨月 / 币种 / 人工笔误。实在查不出让会计协查——不要强点「完成对账」。

外币付款汇率填错了怎么办?

执行付款弹窗填错汇率 → 本币折算金额错、凭证金额错。若还没过账(总账状态未到「已过账」),让会计冲销本笔执行,重新走一次。已过账的不要硬改——汇差走 /dashboard/accounting/fx-gain-loss 的调整流程,由会计处理。