今天要做什么
按节拍把每一笔钱打出去 / 收进来:每天清待付清单 + 扫回单落账,每周批量处理企微报销 + 清未匹配流水,每月做银行对账交会计复核。
每日(开班 10 分钟 + 日终 20 分钟)
- 打开出纳工作台「待付清单」Tab,按预计付款日升序看今天要打的款,核对收款方账户与金额。(见图 ①)
- 登入网银 / 支付宝逐笔汇款,下载每笔回单(PDF / 截图)。
- 切「快速记账」Tab,拖拽回单进上传区,系统 AI 识别金额 / 收款方 / 流水号,自动列候选的付款申请。(见图 ②)
- 确认候选后点「确认记账」——登记付款执行,自动把对应银行流水置「已匹配」。
- 客户打款到账:在客户收款列表按银行到账对单,按先进先出(FIFO)分配到未结发票。
- 日终切「今日流水」Tab,核对今日所有登记流水合计与网银明细一致;凭证编号列显示「未生成凭证」表示等待会计过账。(见图 ③)
/dashboard/accounting/cashier、/dashboard/accounting/payment-requests?status=approved、/dashboard/accounting/payments。
每周
- 周三 / 周五供应商批量付款:在付款申请列表筛出状态「已审批」的申请,勾选今日计划付款的申请,网银批量汇款后逐笔扫回单入账。
- 企微报销批量:从「待付清单」导出 CSV 交银行代发,回来填付款回单号批量标「已付」。
- 未匹配银行流水清理:在银行对账页查状态为「未匹配」的银行流水长尾,手工关联付款执行或补付款申请。
每月
- 月末 +1 日做银行对账:选一个银行账户新建对账单,填银行结单期末余额,点「自动匹配」对金额 / 日期,手工修差异,差异 = 0 后提交给会计复核。
- 核对现金流预测看板,和下月预计到期付款申请总额比对,给财务经理调度资金。
- 提前两天停接前月单据——月结冻结期禁止补录旧流水,差异留到下月反向。
权限红线(先看这 5 条)
- 不做总账过账——「待过账 → 已过账」是会计的动作,出纳页面即便出现「批量过账」按钮点击也会被权限拒绝。
- 不跳付款申请审批状态——申请不在「已审批 / 处理中 / 部分已付」三种状态时点「执行付款」系统会直接报错「付款申请必须已审批」。
- 银行水单未到手不录——没有银行流水号的回单缺幂等键,事后对账会对不上;凭直觉预录会被会计打回。
- 同一笔回单不重复执行——系统按「银行流水号 + 金额 + 日期」生成回单指纹,命中即拒;真要冲销走会计的冲销流程。
- 不动采购 / 销售 / 人事单据——这些模块对出纳只读;付款申请必须由会计或财务经理先批准后才进入出纳视野。
Quickstart — 日常核心任务
2.1 执行付款申请(付款申请 → 已付)
付款申请经会计 / 经理批准变为「已审批」后,出纳按预计付款日安排网银汇款,并在系统登记执行。默认走延后过账路径——登记执行不直接生成凭证,等会计统一过账。
- 进付款申请列表,顶部筛状态「已审批」,按预计付款日升序挑今日计划付款单。(见图 ①)
- 点申请号进详情页,核对收款方账户、币种、金额与随附合同 / 发票一致。
- 网银完成汇款后回到详情页,点右上角「执行付款」按钮。
- 弹窗填付款金额(默认带出剩余未付金额)、付款日期(默认今天)、付款方式(银行转账 / 现金 / 支票 / 信用证)、银行流水号。
- 点回形针上传银行回单 PDF / 截图;若已登记对应银行流水,在下拉里选流水号做绑定。
- 点「确认」——系统登记付款执行并把申请状态推到「部分已付」或「待过账」。
- 付款申请详情顶部状态徽标由「已审批」推进到「部分已付」或「待过账」。
- 「付款执行」卡片列表新增一行,执行号
{申请号}-P1、-P2递增。 - 弹 toast「付款已执行」;今日流水页凭证列显示「未生成凭证」(等会计过账后回填)。
payment_executions.execution_number = {request_number}-P{n}、payment_executions.gl_status ∈ created/failed/not_applicable;触发器自动更新 payment_requests.paid_amount;若关联 bank_transactions,bank_transactions.status → matched。
cashierExecutePaymentAction(默认,skipAutoPost=true 暂不过账)、executePaymentAction(立即过账,少用)、uploadPaymentReceiptAction、searchBankTransactionsAction、getExchangeRateAction
2.2 扫回单快速匹配
手里有一沓网银回单,不想逐个翻申请号——出纳工作台的「快速记账」按回单自动匹配对应付款申请或报销单,回单扫完全部入账。回单指纹防重复。
- 打开出纳工作台,切「快速记账」Tab。(见图 ①)
- 把回单图片拖进上传区(PDF 截图都行),或在下方文本框粘贴「已付 XX 公司 5 万」之类的付款描述。
- 等「正在识别回单...」完成——系统 AI 提取金额 / 收款方 / 银行流水号 / 日期。
- 系统列候选付款申请,按金额 ± 日期 ± 收款方打分显示「精确匹配 / 高匹配 / 中等匹配」徽标;勾选正确的候选。
- 点「确认记账」——生成付款执行 + 审计行,回单指纹入库防重扫。
- 扫错回单:若命中相同指纹系统直接返回「该回单已记账」,不重复记账;真要撤销联系会计冲销对应凭证。
- 工作台顶部弹「已记账」绿色成功态,显示执行编号与(可能为空的)凭证编号。
- 切「今日流水」Tab 看到新行,时间 / 收款方 / 金额 / 来源(付款申请 / 报销)列全。
- 对应付款申请详情的付款执行卡新增一行。
cashier_executions.receipt_fingerprint = sha256(bankRef|amount|date);cashier_executions.journal_entry_id 可能为空(默认延后过账);bank_transactions.status='matched'。
parseReceiptAction(Qwen VL)、parseReceiptTextAction(文本模型)、matchReceiptAction、confirmPaymentAction
2.3 客户回款分配到发票
客户一次打款多张发票,按客户指示或默认先进先出(FIFO)分配到未结发票,更新应收账龄。
- 进客户收款列表,看到新到账的收款行,未分配的「未结金额」列有余额。(见图 ①)
- 点收款行打开分配弹窗——系统按客户列出未结发票,按发票日期升序预填 FIFO 分配。
- 按客户指示微调每行分配金额;可多选发票、可留余额作预付款。
- 点「确认分配」——更新各发票「已付金额」和状态;销售订单联动重算。
- 客户应收账龄报表对应客户行未结金额减少。
- 被核销发票详情的「已付金额」增加,未结余额递减;全额核销后状态变「已付」。
- 关联销售订单的已收合计同步增加。
payment_allocations 新增明细行;invoices.paid_amount / invoices.status 更新;sales_orders 通过 recalculateOrderStatus 联动。
allocatePayment、getPaymentAllocationSuggestions、getCustomersWithOutstandingBalance
2.4 登记银行流水(导入 / 手工)
月中银行对账单 CSV 到手或零星手工流水,按银行账户登记进系统,后续作为匹配候选供执行付款 / 客户回款引用。
- 进银行对账列表,选目标银行账户进「对账 / 导入」入口。(见图 ①)
- 选「导入」:上传网银导出的 CSV / XLSX——系统按批次导入,按银行流水号去重。
- 选「手工」:填交易日、记账日、金额、流水号、描述、对手户名 / 账号。
- 导入后系统报告「已导入 / 重复 / 错误」三项数字——重复流水直接跳过(按「导入批次号 + 银行流水号」去重)。
- 导入后所有新流水默认状态「未匹配」,等待扫回单或对账时匹配。
- 银行对账页对应账户「最新流水数」列增加。
- 匹配页左栏「未匹配」银行流水列表出现新批次行。
- 导入结果对话框显示「已导入 / 重复 / 错误」三项数字。
bank_transactions 新增行,字段 transaction_date / value_date / amount / bank_reference / description / counterparty_name / counterparty_account / status / import_batch_id;返回 ImportBankStatementResult { imported, duplicates, errors, batchId }。
importBankStatementBatch、createBankTransaction、bankTransactionExists
2.5 月度银行对账
月末 +1 日,银行结单到位。出纳按账户逐个建对账单,差异 = 0 后提交会计复核。
- 进银行对账页,对每个银行账户点「新建对账」。(见图 ①)
- 填开始日、结束日、银行结单期末余额,保存后对账单状态为「草稿」。
- 进匹配工作台(双栏:左「银行流水」 / 右「账簿记账」),点「自动匹配」——系统按金额 + 日期 ± 3 天自动配对。
- 剩余的未匹配行手工处理:左栏选一行银行流水,右栏选对应账簿凭证,点「建立匹配」。
- 查「未匹配总计」:在途存款、未兑现支票、银行手续费分别登记。
- 差异(银行期末余额 − 账簿期末余额)= 0 后点「完成对账」——状态推到「已完成」,交会计复核变「已批准」。
- 匹配工作台顶部「差异」数字随每次匹配递减,= 0 时「完成对账」按钮由灰变亮。
- 对账完成后,账户列表该账户「最近对账」列显示本次结束日与期末余额。
- 匹配过的银行流水状态由「已匹配」推到「已对账」。
bank_reconciliations.status 从 draft → in_progress → completed → approved(草稿 → 进行中 → 已完成 → 已批准);bank_accounts.last_reconciled_date / last_reconciled_balance 更新;reconciliation_matches 记录 bank_tx ↔ journal_entry 多对多关系。
createReconciliation、autoMatchTransactions、createMatch、unmatch、updateReconciliationStatus
2.6 上传付款回单补齐
2.1 执行时若没随附回单(急单 / 回单后到),事后回付款执行行补传。
- 打开目标付款申请详情,在「付款执行」卡片找到缺回单的行。
- 点行内回形针图标上传 PDF / 截图——进「付款回单」存储桶。
- 上传完成后查看:点「查看回单」获取 10 分钟有效的签名 URL 预览。
- 付款执行行的回形针图标由灰变蓝,hover 显示文件名。
- 点「查看回单」在新标签打开签名 URL 的 PDF / 图片预览。
payment_executions.receipt_storage_path / receipt_file_name / receipt_mime_type 填充;签名 URL 有效期 600 秒。
uploadPaymentReceiptAction、getReceiptSignedUrlAction
2.7 企微报销批量付款
企微报销经财务经理审批后进入出纳视野,通常一次处理 10-30 单,走银行代发工资通道而非逐笔汇款。
- 在出纳工作台「待付清单」Tab 看到「报销单」类型的待付项,状态「已审批」。(见图 ①)
- 点「导出 CSV」——按银行代发格式导出,交银行代发通道。
- 银行代发完成后,回来勾选已付报销单,点「标记已付」。
- 弹窗填付款回单号(如
E2E-REF-202604150001),点「确认」——批量回填付款回单号与付款日期。
- 待付清单对应报销单消失,移到今日流水 Tab 的付款流水。
- 报销模块该单状态推到「已付款」并显示付款日期。
- 弹 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 / 会计交叉核对)
上游触发:approvePaymentRequestAction 将 payment_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 / status、sales_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_reversedunmatch(bank-matching.unmatch)— 取消 bank_tx ↔ journal_entry 匹配,bank_transactions.status → unmatchedaccountantPostPaymentAction— 会计手工过账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 统一处理,不是出纳范围。
系统动作:getExchangeRateAction、cashierExecutePaymentAction(扩展字段 paymentCurrency / paymentAmountForeign / exchangeRate)。
搜索并绑定银行流水(执行付款弹窗内下拉)
大额付款 / 多笔合并汇款时,先导入银行流水,再在执行付款弹窗的「关联银行流水」下拉里按金额 ± 日期搜候选,选中后绑定;绑定后银行流水状态直接置「已匹配」,月末对账时自动识别。
系统动作:searchBankTransactionsAction(按金额 / 日期范围分页)。
出纳代申请快速付款
零星报销 / 供应商急单无人建付款申请时,出纳可自己建申请(来源类型「手工」)快速走审批流。也可从上游单据(报销 / 采购单 / 外协 / 里程碑)一键生成申请——字段自动带出。
系统动作:createQuickPaymentRequestAction、createPaymentRequestAction、createFromExpenseClaimAction、createFromPurchaseOrderAction、createFromOutsourceOrderAction、createFromMilestoneAction、createFromMilestonesAction。
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 主链路。
- 标准成单流(询盘 → 报价 → 订单 → 发货 → 开票 → 回款): 出纳在回款环节落地——银行到账后走 2.3 分配到发票,更新应收;不参与前端客户 / 报价环节。 → 场景详解
- 定制家具项目流: 出纳不参与——项目排产 / BOM / 里程碑由跟单 / PMC 操作。项目按里程碑产生的付款申请进入出纳待付清单后,和普通付款申请一视同仁走 2.1。 → 场景(了解即可)
- 回款流: 出纳核心场景——银行到账 → 导入 / 手工登记银行流水 → 2.3 分配到发票 → 月末对账。 → 场景详解
- 采购付款流: 出纳核心场景——采购 RFQ / 采购订单审批通过 → 采购侧走「生成付款申请」→ 经理批准 → 出纳 2.1 执行付款。 → 场景详解
- 月结流: 出纳核心场景——月末 +1 日做 2.5 银行对账;冻结期禁手工调整;差异 = 0 后交会计复核推「已批准」。 → 场景详解
- 报销审批流: 出纳在末环节落地——财务经理批准后,2.7 批量付款或逐笔走 2.1;回单号回填报销单的付款回单号。 → 场景详解
外部协作入口
/dashboard/accounting/cashier— 出纳工作台(待付清单 / 快速记账 / 今日流水)日常主页面。/dashboard/accounting/payment-requests— 付款申请工作队列,筛状态「已审批」挑今日付款。/dashboard/accounting/payments— 客户回款列表 + 先进先出分配。/dashboard/accounting/bank-reconciliation— 银行账户 + 对账工作台。/dashboard/accounting/ar-aging— 应收账龄,协助销售催款时用。/dashboard/accounting/ap-aging— 应付账龄,批量付款日优先级参考。/dashboard/accounting/cash-flow-forecast— 现金流预测,给财务经理做资金调度建议。/dashboard/wecom— 企微消息推送(付款到账通知、报销标记已付卡片)配置。
权限与范围
看得到什么(RLS 边界)
- 当前组织下的所有付款申请 / 付款执行记录 / 出纳执行记录 / 客户收款 / 银行流水 / 银行对账单。
- 当前账套(
book_id)下的财务数据——多账套下不同账本隔离,切账套(右上账套切换器)后今日流水 / 待付清单都会变。 - 发票、销售订单、报销单只读——不能改明细或状态,但能看全组织。
核心概念
- 延后过账(
skipAutoPost=true暂不过账,会计后续处理) — 默认走cashierExecutePaymentAction登记付款执行后不直接生成会计凭证,状态停在「待过账」等会计过账。产品也暴露了executePaymentAction(立即过账)但很少用——出纳培训默认走延后过账。 - 回单指纹(
receipt_fingerprint) — 按「银行流水号 + 金额 + 日期」哈希生成的幂等键。同一回单再扫命中即拒,防重复记账的唯一防线(业务术语,详见术语表)。 - 防超付检查(
paid_not_exceed_requestedCHECK 约束) — 付款申请表数据库层守卫:已付金额 ≤ 申请金额。并发双花命中 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_transactions(transaction_date / value_date / amount / bank_reference / counterparty_*)- 银行流水状态 enum
- 未匹配
unmatched| 已匹配matched| 已对账reconciled| 已忽略ignored - 银行对账 bank reconciliation
- 状态
bank_reconciliations.status ∈草稿draft| 进行中in_progress| 已完成completed| 已批准approved| 已取消cancelled - 对账匹配
reconciliation_matches(bank_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(立即过账)- 快速记账动作
parseReceiptAction→matchReceiptAction→confirmPaymentAction- 账套隔离键
book_id(所有财务表)
常见问题
点「执行付款」提示「付款申请必须已审批」怎么办?
付款申请的状态不在「已审批 / 处理中 / 部分已付」范围内。回列表看当前状态:「草稿 / 已提交 / 待审批」→ 让申请人或会计推进审批;「已驳回 / 已取消」→ 不再执行,通知申请人重建。不要改 DB 的 status 绕过——工作流引擎会记审计日志,破坏审批链。
超付金额提示「防超付检查」怎么处理?
这是数据库 CHECK 约束——并发下另一位出纳(或另一终端)已占用剩余额度。刷新付款申请详情页看「已付金额」实际值,调整本次执行金额;若真要超付,让申请人通过会计新建增量申请。系统不允许绕过。
同一回单扫了两次怎么办?
系统按回单指纹幂等拒绝(「银行流水号 + 金额 + 日期」哈希),第二次返回「该回单已记账」不重复记账,不用担心。若回单没有银行流水号(扫描件 OCR 失败等)则无指纹,此时要人工核对是否已登记再确认。
我能点「批量过账」吗?
不能。批量过账和单笔过账是会计的权限。出纳页面即使看到按钮也会被权限拒绝(出纳角色无「创建凭证」权限)。让会计日终统一过账即可。
延后过账和立即过账哪个用?
默认「延后过账」(cashierExecutePaymentAction,skipAutoPost=true 暂不过账)——登记后状态停在「待过账」,会计日终统一过账,凭证质量高、可回头整笔复核。「立即过账」(executePaymentAction)很少用——适合小额零散(会计不想 review)或系统自动化场景。培训 / 日常工作只记住前者。
对账差异一直不为 0 怎么查?
三步:(1)在途存款(月末前账上有钱但银行还没到)登记到「在途存款」;(2)未兑现支票登记到「未兑现支票」;(3)银行手续费(扣款但账上没记)登记到「银行手续费」。仍差则逐行核对金额近的银行流水与账簿凭证,通常是日期跨月 / 币种 / 人工笔误。实在查不出让会计协查——不要强点「完成对账」。
外币付款汇率填错了怎么办?
执行付款弹窗填错汇率 → 本币折算金额错、凭证金额错。若还没过账(总账状态未到「已过账」),让会计冲销本笔执行,重新走一次。已过账的不要硬改——汇差走 /dashboard/accounting/fx-gain-loss 的调整流程,由会计处理。