ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

海外版外卖结算:账本归属与导出字段设计

海外版外卖结算:账本归属与导出字段设计 中东市区综合运营商做海外版外卖结算卡点经常不是「会不会出报表」。要问账本落在谁的 schema、能否按字段目录导出、币种与订单归属是否可复现。数据若只在实施方笔记本里的 CSV结算完成了账仍不在自己库。下文从 ledger 分录、托管范围和导出契约说明归属怎么设计。示意为教学用途。不写源码怎么选。归属问题先写成库对象「账不在自己库」的技术形态通常是结算结果只存在报表服务内存或只有实施方只读副本。订单在业务库分录在别处对账靠邮件附件。海外版外卖结算应让客户 DBA 能指出ledger schema 的 owner 角色是谁。币种、城站、商户结算行必须是表字段而不是导出脚本里的硬编码。模块目录树分录、导出、托管overseas-wm-ledger/ ├── takeout-order/ # 业务单不存会计分录 ├── ledger-core/ │ ├── journal-writer/ │ ├── account-chart/ │ └── fx-snapshot/ ├── export-job/ │ ├── field-catalog/ │ └── dump-runner/ ├── custody-scope/ │ ├── schema-owner.yaml │ └── grant-matrix.yaml ├── mid-shared/ │ └── admin-console/ └── ops-ae/ └── daily-export.cron订单域禁止直接 UPDATE 会计科目它只发「应付/实付」领域事件。custody-scope把「谁是 schema owner」写成配置避免口头说「数据是你们的」。导出与记账分进程避免高峰下单时跑全量 dump 锁 journal。技术栈列表示意记账Javajournal-writer 单写者避免多实例抢凭证号科目YAML 会计科目表发布时校验借贷平衡模板汇率下单瞬间快照进fx_snapshot禁止隔夜用即期价重算历史导出命令行 job输出 UTF-8 CSV / Parquet字段来自 catalog库MySQL 8ledger独立 schema备份集与订单库同级调度cron 或 k8s CronJob失败进死信而不是静默跳过分录与订单归属字段# ledger-core/account-chart/ae-takeout.yaml示意chart_id:ae_takeout_v3currency_default:AEDaccounts:-code:1101name:user_cash_clearing-code:2201name:merchant_payable-code:5101name:delivery_costposting_templates:-event:ORDER_PAIDlines:-account:1101dc:Damount_from:user_paid-account:2201dc:Camount_from:merchant_due模板里没有「抽成口号」只有科目与借贷。金额来自订单事件里的分项而不是报表临时列。每条 journal 必须带order_no、city_code、currency_code、fx_snapshot_id。缺fx_snapshot_id的分录应拒绝入账否则跨阿联酋与沙特站点无法复现。金额用最小货币单位例如 AED 的 fils禁止DECIMAL与汇率当场相乘后四舍五入两次。入账前校验模板借贷合计为零不平衡的事件进死信不写半边分录。城市与法人主体要分字段city_code管运营范围legal_entity管出账主体。只按城市汇总、不按主体切分税务导出仍会对不齐。导出字段目录能 dump 才算归属# export-job/field-catalog/settlement-v1.yaml示意export_id:settlement_daily_v1owner_schema:ledgercolumns:-name:journal_id-name:order_no-name:city_code-name:currency_code-name:fx_snapshot_id-name:account_code-name:dc-name:amount_minor-name:merchant_id-name:posted_atfilters:-tenant_id-posted_at_range专项定制预算应买「字段目录 可重复 dump」而不是买一张好看的后台屏。客户侧若不能按posted_at_range自己跑 job账本只是演示。字段增删走 catalog 版本禁止实施方在服务器上改SELECT *临时脚本。托管范围与授权# custody-scope/grant-matrix.yaml示意schema:ledgerowner_role:customer_dbagrants:-role:app_journalpriv:[SELECT,INSERT]-role:vendor_supportpriv:[SELECT]expire_days:14forbidden:-DROP TABLE-GRANT OPTION to vendor_support# ops-ae/daily-export.cron 调用示意java-jarexport-job.jar\--catalogsettlement_daily_v1\--from$DAY00:00--to$DAY23:59\--out/data/export/ledger-$DAY.csv sha256sum /data/export/ledger-$DAY.csv/data/export/ledger-$DAY.sha256vendor_support只读且限期避免结算长期依赖实施方账号。导出文件带哈希便于客户把文件收进自己的对象存储而不是留在实施方跳板机。通道对账单怎么对碰PSP 周期账单是外部事实ledger 是内部事实二者用psp_event_id或通道结算批次号对碰。对不上的差额进recon_gap表禁止直接改已过账 journal。改历史分录会让导出哈希链断裂归属验收立刻失败。日报 CSV 给财务Parquet 给数仓两份必须来自同一 catalog 版本。报表容器可以停job 仍能出数才说明账不绑在某个大屏进程上。中东多时区不要用服务器本地时区切日posted_at统一存 UTC导出再按站点日历切。成品怎么用这套边界光合同城海外版外卖按成品交付时结算模块应能指出 ledger schema 与导出目录。中东多城运营可共享中台登录与权限但分录仍按city_code过滤避免把迪拜与利雅得揉成一本糊涂账。不要把本篇写成源码包如何挑选问的是账本对象与 dump 契约。验收清单SHOW GRANTS能看到customer_dba对ledger.*的 DDL 权实施账号无 GRANT OPTION任意已入账order_no可按 catalog 导出全部分录字段不少改汇率后历史分录的amount_minor不变停掉报表容器export-job 仍能出 CSVvendor_support过期后 SELECT 失败同一order_no不会出现借贷不平衡的已过账行新科目版本不改写历史chart_id无实施方值守时昨日 dump 仍能在客户环境跑通日切、时区与不可改历史中东站点常用日历与 UTC 日切不一致导出必须显式传入日历规则。夏令时切换若存在禁止用「加三小时」这种硬编码。已过账行的posted_at不因事后改时区配置而移动。需要更正时走冲正分录生成新journal_id并在导出中成对出现。这才能在客户自己的库里复盘而不是请实施方「帮你改昨天那份表」。市区综合运营商多城并行时每个city_code绑定自己的日历不要共用一台机的系统时区。账本归属还有一个容易漏的点对象存储里的 dump 是否用客户侧的访问密钥。文件在客户桶、密钥在实施方等价于账仍不在自己手里。哈希文件应与 CSV 一同归档抽查某一天即可证明未被事后改写。海外版外卖结算的定制预算优先买目录、权限和可重复 job而不是买更炫的图表。图表可以后补没有 catalog 的图表只是另一次不可复现导出。币种字段缺失时 job 应失败禁止默默按 AED 填上导致沙特站点错账。recon_gap只能通过新的冲正分录关闭不允许 UPDATE 原 journal 的金额。关闭时记录通道账单批次号方便下一次抽查。长期敞开的 gap 说明通道对账无人认领账本归属只完成了一半。中东运营可以把 gap 条数当成结算健康指标而不是再加一张手工总表。导出 job 对 gap0 的日期打警告但不阻断 dump以免财务拿不到原始分录。技术小结海外版外卖结算的归属落在独立 ledger schema、钉扎汇率快照、版本化导出字段以及可过期的实施方只读授权。订单事件进分录分录进 dumpdump 进客户存储三者缺一后台有结算菜单也不等于账在自己库。journal-writer 保持单写者凭证号连续才便于和通道账单对碰。多实例抢号会导致同一order_no两条贷方导出时无法解释。科目表版本升级只影响新事件旧分录仍指向入账时的chart_id。科目代码一旦入账就视为稳定码改名只改展示不改account_code。财务对碰依赖代码而不是中文科目名翻译或阿语标签变化不得打乱导出。merchant_id是经营主体legal_entity是出账主体二者不要合成一列。专项定制若要加新导出列先改 catalog 再改 job禁止在服务器改一次性 SQL。客户 DBA 应能在无实施方值守时跑通昨日 dump这才叫账本可交接。对象存储的路径按tenant_id/city_code/date分层避免多城文件互相覆盖。覆盖发生时哈希还在但财务打开的是另一座城的分录归属争议会立刻出现。job 成功应以客户桶的对象存在为准而不是以实施方终端打印「导出完成」为准。
返回列表