"""对外法定报表适配 — 数据库迁移 补充资产负债表科目(资产/负债/所有者权益),按新30号准则经营/投资/筹资分类打标 """ import sys, os sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from app.database import get_engine from sqlalchemy import text import logging logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s") logger = logging.getLogger("migrate_statutory") # (科目编码, 科目名称, 上级, 级别, 类别, 新30号准则分类) # 新30号准则分类: operating经营类 / investing投资类 / financing筹资类 / equity权益 BALANCE_SHEET_SUBJECTS = [ # ── 资产类 (category=asset) ── ('1001', '库存现金', None, 1, 'asset', 'operating'), ('1002', '银行存款', None, 1, 'asset', 'operating'), ('1012', '其他货币资金', None, 1, 'asset', 'operating'), ('1101', '交易性金融资产', None, 1, 'asset', 'investing'), ('1122', '应收账款', None, 1, 'asset', 'operating'), ('1123', '预付账款', None, 1, 'asset', 'operating'), ('1131', '应收股利', None, 1, 'asset', 'investing'), ('1221', '其他应收款', None, 1, 'asset', 'operating'), ('1405', '库存商品', None, 1, 'asset', 'operating'), ('1501', '持有至到期投资', None, 1, 'asset', 'investing'), ('1511', '长期股权投资', None, 1, 'asset', 'investing'), ('1601', '固定资产', None, 1, 'asset', 'operating'), ('1602', '累计折旧', '1601', 2, 'asset', 'operating'), ('1701', '无形资产', None, 1, 'asset', 'operating'), # ── 负债类 (category=liability) ── ('2001', '短期借款', None, 1, 'liability', 'financing'), ('2202', '应付账款', None, 1, 'liability', 'operating'), ('2203', '预收账款', None, 1, 'liability', 'operating'), ('2211', '应付职工薪酬', None, 1, 'liability', 'operating'), ('2221', '应交税费', None, 1, 'liability', 'operating'), ('2241', '其他应付款', None, 1, 'liability', 'operating'), ('2501', '长期借款', None, 1, 'liability', 'financing'), ('2502', '应付债券', None, 1, 'liability', 'financing'), # ── 所有者权益类 (category=equity) ── ('4001', '实收资本', None, 1, 'equity', 'equity'), ('4002', '资本公积', None, 1, 'equity', 'equity'), ('4103', '本年利润', None, 1, 'equity', 'equity'), ('4104', '利润分配', None, 1, 'equity', 'equity'), ] def run(): engine = get_engine() with engine.connect() as conn: inserted = 0 for row in BALANCE_SHEET_SUBJECTS: res = conn.execute(text(""" INSERT IGNORE INTO subjects (subject_code, subject_name, parent_code, level, category, new_standard_category, is_active) VALUES (:code, :name, :parent, :level, :cat, :ns_cat, 1) """), {"code": row[0], "name": row[1], "parent": row[2], "level": row[3], "cat": row[4], "ns_cat": row[5]}) inserted += res.rowcount conn.commit() logger.info(f"✅ 插入 {inserted} 条资产负债表科目(已有则跳过)") total = conn.execute(text("SELECT count(*) FROM subjects")).scalar() by_cat = conn.execute(text( "SELECT category, count(*) FROM subjects GROUP BY category ORDER BY category" )).fetchall() dist = {r[0]: r[1] for r in by_cat} logger.info(f"✅ subjects 表当前共 {total} 条,分类分布: {dist}") if __name__ == "__main__": run()