feat: 网银流水导入模板+现金流联动(财务数据通道P1)

This commit is contained in:
Hermes CI Fix
2026-08-28 09:59:07 +08:00
parent b9c624fd7e
commit 3bc68fa1c6
9 changed files with 1050 additions and 6 deletions
@@ -0,0 +1,76 @@
"""生成网银流水标准导入模板 xlsx — 列: 凭证日期/凭证号/科目编码/科目名称/借方金额/贷方金额/摘要
用法: python scripts/gen_voucher_import_template.py
输出: backend/scripts/templates/网银流水导入模板.xlsx(表头 + 1行示例)
"""
import os
import sys
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils import get_column_letter
OUT_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "templates", "网银流水导入模板.xlsx")
HEADERS = ["凭证日期", "凭证号", "科目编码", "科目名称", "借方金额", "贷方金额", "摘要"]
# 1行示例(借贷平衡)
EXAMPLE = ["2026-08-01", "记-001", "1002", "银行存款-工行", 50000, 0, "收到客户回款"]
# 附赠一行结转示例行(注释说明用,不写入数据行)
def main():
os.makedirs(os.path.dirname(OUT_PATH), exist_ok=True)
wb = Workbook()
ws = wb.active
ws.title = "网银流水"
# 表头样式
header_font = Font(bold=True, color="FFFFFF")
header_fill = PatternFill("solid", fgColor="409EFF")
for col, h in enumerate(HEADERS, start=1):
cell = ws.cell(row=1, column=col, value=h)
cell.font = header_font
cell.fill = header_fill
cell.alignment = Alignment(horizontal="center", vertical="center")
for col, val in enumerate(EXAMPLE, start=1):
cell = ws.cell(row=2, column=col, value=val)
cell.alignment = Alignment(horizontal="center" if col in (1, 3, 5, 6) else "left")
# 列宽
widths = [14, 12, 12, 22, 12, 12, 30]
for i, w in enumerate(widths, start=1):
ws.column_dimensions[get_column_letter(i)].width = w
# 说明sheet
note = wb.create_sheet("填写说明")
notes = [
["网银流水标准导入模板 — 填写说明"],
[""],
["1. 列说明(与凭证明细表 voucher_details 对齐):"],
[" 凭证日期: YYYY-MM-DD(必填,用于提取期间period)"],
[" 凭证号: 字符串(必填,如 记-001 / 银收-20260801-001"],
[" 科目编码: 必填,如 1001库存现金 / 1002银行存款"],
[" 科目名称: 必填,如 银行存款-工行 / 库存现金"],
[" 借方金额: 数字,无则留空或0(与贷方二选一)"],
[" 贷方金额: 数字,无则留空或0(与借方二选一)"],
[" 摘要: 可选,含'结转'或科目名含'本年利润'的行将标记为结转行,不参与现金流计算"],
[""],
["2. 三校验规则(导入时自动执行):"],
[" ① 借贷平衡: 全文件Σ借方 = Σ贷方(容差0.01),不平衡将提示差额"],
[" ② 期间合计: 按期间(YYYY-MM)汇总借贷合计,供对账"],
[" ③ 结转行识别: 摘要含'结转' 或 科目名含'本年利润'/'结转' → carry_forward标记"],
[""],
["3. 现金流联动:货币资金科目(1001/1002开头)期末余额自动更新现金余额与EXT_现金类KPI、F_CASH_SAFETY现金安全垫"],
["4. 示例行(第2行)请删除后填入真实流水;不要修改表头列名"],
]
for row in notes:
note.append(row)
note.column_dimensions["A"].width = 90
wb.save(OUT_PATH)
print(f"模板已生成: {OUT_PATH}")
if __name__ == "__main__":
sys.exit(main())