6.1 KiB
6.1 KiB
财务数据通道方案:网银流水标准导入模板(P1)
- 提出:研学调度中枢(反向上报触发,2026-08-28)
- 执行:项目Bot(方案/验收/协调)→ 全栈Bot(开发)
- 背景:酣客现金流2.2万 vs 短债350万 = 全年最大风险,现金流监控空窗(不直连,靠手工)
一、ERP连通可行性结论(已完成摸底,2026-08-28)
| 检查项 | 结果 |
|---|---|
| ERP网关容器 | 活着(erp-gateway Up 4 days,127.0.0.1:8300) |
| ERP真实数据库 | 不可达:SQL Server 211.149.143.215 连接超时(pymssql OperationalError 20009) |
| ERP API 端点 | /stats/monthly、/cashflow 等全部 000/500 |
| erp_sync cron | 2026-08-19 已 PAUSED(#PAUSED-20260819) |
| kpi_values erp源数据 | 0 条(从未同步成功) |
| data_source_config | 12条ERP源配置存在但全部空转 |
结论:ERP连通短期无望(真实ERP库在外部网络不可达),走方案②网银流水标准导入模板。
二、现状盘点(基础设施大部分已就绪)
| 已有资产 | 状态 |
|---|---|
| voucher_details 表(凭证明细) | ✅ 已建,0行。字段:voucher_no/voucher_date/subject_code/subject_name/debit_amount/credit_amount/summary/new_standard_category/period |
| import_logs 表(导入日志) | ✅ 已建,0行。字段:filename/batch/total_rows/success_rows/failed_rows/errors/period/import_type/created_by |
| VoucherDetail 模型 | ✅ 已注册(app/models/__init__.py:614) |
| /api/cma/cash/balance | ✅ 现金余额(手工基线) |
| /api/cma/cash/dashboard | ✅ 现金流看板 |
| /api/cma/cash/gap-forecast | ✅ 缺口预测 |
| /api/cma/cash/plans | ✅ 收付款计划 |
| DataManage.vue Excel导入tab | ✅ 已有(import-excel-smart,KPI导入) |
| 现金流KPI(EXT_202-208各店现金等) | ✅ 存在,2026-06有数据(手工Excel导入) |
缺口(本次开发内容):无凭证/网银流水导入API、无校验规则(借贷平衡/期间合计/结转行识别)、无前端流水导入界面、现金流余额不自动更新。
三、开发内容(全栈Bot执行)
3.1 导入模板定义(xlsx)
模板列(与 voucher_details 字段对齐):
| 列名 | 字段 | 必填 | 说明 |
|---|---|---|---|
| 凭证日期 | voucher_date | ✅ | YYYY-MM-DD 或 日期格式 |
| 凭证号 | voucher_no | ✅ | 字符串 |
| 科目编码 | subject_code | ✅ | 如 1002(银行存款) |
| 科目名称 | subject_name | ✅ | 如 银行存款-工行 |
| 借方金额 | debit_amount | 二选一 | 无则0 |
| 贷方金额 | credit_amount | 二选一 | 无则0 |
| 摘要 | summary | 可选 | 结转行识别依据 |
生成模板文件:backend/scripts/templates/网银流水导入模板.xlsx(含表头+1行示例)。
3.2 新入库接口 POST /api/cma/cash/import/vouchers
入参:multipart file + entity_id(Depends get_entity_id)+ period(可选,默认从文件名/日期提取)
处理流程:
- 解析xlsx(openpyxl/pandas)
- 逐行校验:日期可解析、科目编码/名称非空、金额为数字且≥0、借贷不全为0
- 校验规则(核心):
- 借贷平衡:Σ借方 = Σ贷方(容差 0.01),不平衡返回错误+差额
- 期间合计:按 period 汇总借方/贷方合计(用于对账展示)
- 结转行识别:摘要含"结转"或科目名称含"本年利润/结转" → 标记 carry_forward=True,不参与现金流计算
- 写入 voucher_details(batch = 文件名_时间戳),period 从日期列提取
- 写 import_logs(total/success/failed/errors 明细)
- 现金流联动:计算货币资金类科目(科目编码 1001/1002 开头)期末余额 → 调用 set_current_cash_balance → 同步更新 EXT_现金类KPI 实际值(写入 kpi_values,source_type=ledger)→ 看板可见
返回:{success, total, success_rows, failed_rows, errors[], 借贷平衡校验, 期间合计, 结转行数, 现金余额}
3.3 校验规则实现细节
- 借贷平衡容差:|Σ借-Σ贷| <= 0.01 通过
- 期间合计:返回 {period: {debit_total, credit_total}} 供对账
- 结转行识别:summary LIKE '%结转%' OR subject_name LIKE '%本年利润%' OR subject_name LIKE '%结转%'
- 失败行收集:{行号, 原因} 数组,不中断整体导入(部分成功模式)
3.4 前端:CashPlan.vue 增加"网银流水导入"tab
- el-tab-pane "流水导入":上传xlsx → 调 import/vouchers → 显示校验结果(借贷平衡✅/❌、期间合计、成功/失败行、错误明细)→ 成功提示
- 注意:项目已知 el-dialog 坑,弹窗用 MyDialog;交互组件用原生 button
- 导入成功后刷新 cash dashboard(现金余额更新可见)
3.5 财务Bot自助入库流程(文档)
文档:docs/财务Bot网银流水自助入库流程.md
- 每月出纳导出网银流水 → 按模板整理xlsx
- 财务Bot调 POST /api/cma/cash/import/vouchers(curl 或脚本)
- 校验通过 → 入库 → 现金余额自动更新 → 看板可见
- 校验失败 → 按错误明细修正后重导
四、验收标准(铁律七:不验证=没做)
- ERP可行性结论 ✅(已有:ERP库不可达,走②)
- 模板文件存在:ls backend/scripts/templates/网银流水导入模板.xlsx
- 校验规则跑通:构造测试xlsx(含借贷不平衡、结转行、正常行)实测三种规则
- 入库接口可用:curl 导入 → SELECT voucher_details 有数据 → import_logs 有记录
- 现金流联动:导入后 GET /api/cma/cash/balance 现金余额=货币资金科目余额,dashboard可见
- 前端:CashPlan.vue 有"流水导入"tab,上传可导入
- 文档:财务Bot自助入库流程文档存在
- 无回归:/health 正常,已有cash端点正常
五、开发约束
- 代码库:/root/cma-management(后端 FastAPI + 前端 Vue3)
- 后端重启:systemctl restart cma-backend(禁止手动起 uvicorn)
- 前端部署:npm run build → cp -rf dist/* /var/www/cma/
- 完成后 git add 关键目录(backend/app/ frontend/src/)+ commit + push
- 数据库:MySQL cma 库,多租户 entity_id 隔离