"""迁移 014: 导入 PPT 配置数据。""" import os import json import logging logger = logging.getLogger(__name__) # 配置目录(已迁移到 insurance 模块内) CONFIG_DIR = os.path.join(os.path.dirname(__file__), "..", "ppt", "config") def _read_json_file(filepath): try: with open(filepath, "r", encoding="utf-8") as f: return json.load(f) except Exception: return None def _read_json_files_in_dir(dirpath): results = [] if not os.path.isdir(dirpath): return results for root, _, files in os.walk(dirpath): for fname in files: if fname.endswith(".json"): data = _read_json_file(os.path.join(root, fname)) if data is not None: results.append(data) return results def migrate(): """迁移入口。""" from insurance.db.compat import db from insurance.models.ppt_config import PptCompany, PptProduct, PptTemplate, PptBundle # 公司 companies_dir = os.path.join(CONFIG_DIR, "companies") count = 0 for d in _read_json_files_in_dir(companies_dir): if not d.get("id") or PptCompany.query.get(d["id"]): continue db.session.add(PptCompany( id=d["id"], display_name=d.get("displayName", ""), aliases_json=json.dumps(d.get("aliases", []), ensure_ascii=False), tenant_id=d.get("tenantId", "default"), knowledge_directories_json=json.dumps(d.get("knowledgeDirectories", []), ensure_ascii=False), evidence_ranking_json=json.dumps(d.get("evidenceRanking", []), ensure_ascii=False), company_intro=d.get("companyIntro", ""), company_highlights_json=json.dumps(d.get("companyHighlights", []), ensure_ascii=False), )) count += 1 db.session.commit() logger.info(f"[migrate_014] 导入 {count} 家公司") # 产品 products_dir = os.path.join(CONFIG_DIR, "products") count = 0 for d in _read_json_files_in_dir(products_dir): if not d.get("id") or PptProduct.query.get(d["id"]): continue db.session.add(PptProduct( id=d["id"], company_id=d.get("companyId", ""), plan_type=d.get("planType", "savings"), display_name=d.get("displayName", ""), aliases_json=json.dumps(d.get("aliases", []), ensure_ascii=False), required_modules_json=json.dumps(d.get("requiredModules", []), ensure_ascii=False), )) count += 1 db.session.commit() logger.info(f"[migrate_014] 导入 {count} 个产品") # 模板 templates_dir = os.path.join(CONFIG_DIR, "templates") count = 0 for d in _read_json_files_in_dir(templates_dir): if not d.get("id") or PptTemplate.query.get(d["id"]): continue db.session.add(PptTemplate( id=d["id"], plan_type=d.get("planType", "savings"), style_preset=d.get("stylePreset", "broker"), source_template_asset_id=d.get("sourceTemplateAssetId"), clone_ready=d.get("cloneReady", False), clone_renderer=d.get("cloneRenderer"), required_page_types_json=json.dumps(d.get("requiredPageTypes", []), ensure_ascii=False), )) count += 1 db.session.commit() logger.info(f"[migrate_014] 导入 {count} 个模板") # Bundle bundles_dir = os.path.join(CONFIG_DIR, "bundles") count = 0 for d in _read_json_files_in_dir(bundles_dir): if not d.get("id") or PptBundle.query.get(d["id"]): continue db.session.add(PptBundle( id=d["id"], display_name=d.get("displayName", ""), products_json=json.dumps(d.get("products", []), ensure_ascii=False), template_family=d.get("templateFamily", "bundle"), status=d.get("status", "active"), modules_json=json.dumps(d.get("modules", []), ensure_ascii=False), )) count += 1 db.session.commit() logger.info(f"[migrate_014] 导入 {count} 个 Bundle")