T+2 对账与卡授权、请款的核查
目标
读取休市日表,按营业日重新计算 T+2 结算日并找出日期错误的成交;从四个方向核对成交账簿和结算账簿;按原因拆分未结算项并计算金额;完整解释银行卡授权与清算之间的差异,并找出重复扣款。
为什么重要
证券的 T+2 与银行卡的授权、清算属于不同领域,但结构相同:一件事情被分成两个事件,中间存在持续状态;如果不监控该状态,就会造成资金损失。本练习将分别完整走一遍这两种结构。
本练习强制执行的四点都是实际现场规则。将休市日作为数据维护——如果硬编码,每次指定临时节假日都需要部署;一旦部署延迟,当周就会发生事故。对账要逐笔、双向进行——只比较总额时,两个方向的差异会互相抵消。按原因拆分未结算项——合并统计后无法确定负责部门,最终无人处理。通过幂等键查找重复扣款——使用授权编号永远找不到。
本次事件如下。结算团队反馈 9 月第二周的未结算余额是平时的三倍,同一周还集中出现了某家商户的重复扣款投诉。基准日期为 2026-09-16。
营业日计算规则如下。从成交日的次日开始逐日向前,只有既不是星期六或星期日,也不在 holidays 表中的日期才计为营业日,第二个营业日即为结算日。休市日必须从 holidays 表读取——如果硬编码,就完全错过了本练习的重点。
步骤
- 创建
/root/cap/settle,原样运行答案中的生成器,生成/root/cap/settle/settle.db、/root/cap/settle/auth.jsonl、/root/cap/settle/capture.jsonl。 - 读取
holidays表,按营业日重新计算 T+2。在/root/cap/settle/calendar.txt中写入trades=、holidays=、bad_settle_date=、settle_on_nonbusiness=;在/root/cap/settle/baddate.csv中写入trade_id,trade_date,recorded_settle_date,correct_settle_date。 - 核对
trades和settlements。在/root/cap/settle/recon.txt中写八行:trades=、settlements=、amount_matched=、amount_mismatch=、amount_mismatch_total=、missing_settlement=、orphan_settlement=、orphan_amount=;在/root/cap/settle/amountdiff.csv中写入trade_id,trade_amount,settled_amount,diff。 - 找出结算日在
2026-09-16之前但尚未完成结算的成交,在/root/cap/settle/fails.csv中按trade_id,settle_date,amount,settlement_status写入,并在/root/cap/settle/fails.txt中写入fail_count=、fail_amount=、no_record=、pending=、failed=。如果完全没有结算记录,状态写为none。 - 在
/root/cap/settle/auth.txt中写八行:auths=、captures=、approved=、voided=、declined=、full_capture=、partial_capture=、no_capture=。 - 在
/root/cap/settle/orphan.csv中按auth_id,merchant,amount,ts写入没有清算记录的 approved 授权,并在/root/cap/settle/orphan.txt中写入no_capture_count=、no_capture_amount=、partial_count=、partial_remaining_amount=。 - 按
idempotency_key分组,找出包含至少两笔授权的键,在/root/cap/settle/dupcharge.csv中按idempotency_key,auth_ids,charged_amount写入,并在/root/cap/settle/dupcharge.txt中写入dup_keys=、double_charged_amount=。auth_ids使用竖线(|)连接。 - 在
/root/cap/settle/report.md中编写报告。需要## 무슨 일이 있었나、## 결제일 계산、## 대사 결과、## 미결제、## 카드 승인과 매입、## 무엇을 고쳐야 하나六个章节。
参考
- 使用
sqlite3 -readonly file读取数据库。在 Python 中使用sqlite3.connect('file:...?mode=ro', uri=True)。 - 所有金额均为整数韩元。若使用浮点数处理,总和会产生细微偏差,导致评分失败。
YYYY-MM-DD格式的日期字符串可以直接相互比较,结果仍然准确。- 常见错误 1:第 2 步将休市日硬编码。还必须统计表中包含多少个日期。
- 常见错误 2:第 4 步遗漏日期条件。把结算日尚未到来的交易也统计进去,会使余额膨胀。
- 常见错误 3:第 7 步将两笔授权的金额全部相加。第一笔是正常扣款,因此只有第二笔及之后的授权才属于重复扣款。
创建成交、结算账簿和银行卡日志
创建 /root/cap/settle,原样运行答案中的生成器,生成 /root/cap/settle/settle.db、/root/cap/settle/auth.jsonl、/root/cap/settle/capture.jsonl。
原样运行生成器后,会创建一个 sqlite 数据库和两个 JSONL 文件。更改随机种子会导致结果与评分值不符。
按营业日 T+2 验证结算日
读取 holidays 表,按营业日重新计算 T+2。在 /root/cap/settle/calendar.txt 中写入 trades=、holidays=、bad_settle_date=、settle_on_nonbusiness=;在 /root/cap/settle/baddate.csv 中写入 trade_id,trade_date,recorded_settle_date,correct_settle_date。
不要在代码中硬编码休市日,应从 holidays 表读取。跳过周末和休市日,计数两个营业日即可。
双向核对成交账簿和结算账簿
核对 trades 和 settlements。在 /root/cap/settle/recon.txt 中写八行:trades=、settlements=、amount_matched=、amount_mismatch=、amount_mismatch_total=、missing_settlement=、orphan_settlement=、orphan_amount=;在 /root/cap/settle/amountdiff.csv 中写入 trade_id,trade_amount,settled_amount,diff。
分别统计四个方向。只比较笔数总计时,两个方向的差异会互相抵消。
按原因拆分未结算项
找出结算日在 2026-09-16 之前但尚未完成结算的成交,在 /root/cap/settle/fails.csv 中按 trade_id,settle_date,amount,settlement_status 写入,并在 /root/cap/settle/fails.txt 中写入 fail_count=、fail_amount=、no_record=、pending=、failed=。如果完全没有结算记录,状态写为 none。
基准日期为 2026-09-16。只处理结算日在该日期之前的成交;完全没有结算记录的交易也属于未结算。
按原因解释授权与清算的差异
在 /root/cap/settle/auth.txt 中写八行:auths=、captures=、approved=、voided=、declined=、full_capture=、partial_capture=、no_capture=。
计算每笔授权对应的清算金额合计,并分为三类——合计为 0 表示没有清算;低于授权金额表示部分清算;等于或高于授权金额表示全额清算。
计算无清算授权与部分清算余额
在 /root/cap/settle/orphan.csv 中按 auth_id,merchant,amount,ts 写入没有清算记录的 approved 授权,并在 /root/cap/settle/orphan.txt 中写入 no_capture_count=、no_capture_amount=、partial_count=、partial_remaining_amount=。
已撤销或被拒绝的授权不应包含在这里。仅处理 status 为 approved 但没有清算记录的授权。
通过幂等键查找重复扣款
按 idempotency_key 分组,找出包含至少两笔授权的键,在 /root/cap/settle/dupcharge.csv 中按 idempotency_key,auth_ids,charged_amount 写入,并在 /root/cap/settle/dupcharge.txt 中写入 dup_keys=、double_charged_amount=。auth_ids 使用竖线(|)连接。
按 auth_id 分组不会得到任何结果。按 idempotency_key 分组,查找包含至少两笔授权的键。重复扣款金额是第二笔及之后授权对应的清算金额。
编写结算对账报告
在 /root/cap/settle/report.md 中编写报告。需要 ## 무슨 일이 있었나、## 결제일 계산、## 대사 결과、## 미결제、## 카드 승인과 매입、## 무엇을 고쳐야 하나 六个章节。
需要六个章节。对账章节必须包含两个方向的数字;措施章节必须提及营业日计算和幂等键。