import json from fastapi import APIRouter, Depends, Request, Form from fastapi.responses import HTMLResponse, RedirectResponse from sqlalchemy import text # 新增这一行 from sqlalchemy.orm import Session from database import SessionLocal from services.template_builder import build_estimate_packet router = APIRouter(prefix="/admin/template", tags=["template"]) def get_db(): db = SessionLocal() try: yield db finally: db.close() @router.get("/preview", response_class=HTMLResponse) def preview_template( request: Request, base_template_id: int, db: Session = Depends(get_db) ): packet = build_estimate_packet(db, base_template_id) json_data = { "templateId": base_template_id, "template": packet } # ------- HTML 渲染 ------- html = f"""

模板预览(Template ID:{base_template_id})

""" for step in packet: html += f"""

Step {step['step']} - {step['stepName']}

""" for prop in step["properties"]: html += f"""
{prop['name']} {"(多选)" if prop.get("isMulti") else ""} {"(必填)" if prop.get("required") else ""}
    """ for v in prop["values"]: html += f"""
  • {v['valueText']} {"✅" if v.get("isNormal") else "❌"}
  • """ html += "
" html += "
" html += f"""

JSON 输出

{json.dumps(json_data, ensure_ascii=False, indent=2)}
        
""" return html # ---------------- 页面 ---------------- @router.get("/generate", response_class=HTMLResponse) def generate_page(request: Request, db: Session = Depends(get_db)): machines = db.execute(text(""" SELECT machine_id, brand_name, name FROM t_machine ORDER BY brand_name, name LIMIT 200 """)).fetchall() templates = [ (99181, "iPhone 国行基础模板"), (99198, "安卓通用模板"), (99197, "折叠屏模板"), ] # ✅ 从 step1_attr 读取所有可补充的属性 step1_attrs = db.execute(text(""" SELECT attr_key, attr_name, MIN(sort_order) AS sort_order FROM step1_attr GROUP BY attr_key, attr_name ORDER BY sort_order """)).fetchall() html = """

生成机型模板

① 选择机型

② 选择基础模板

③ Step1 补充配置(从 step1_attr 读取,逗号分隔)

""" # ✅ 动态输出所有属性输入框 for a in step1_attrs: html += f"""
{a.attr_name}({a.attr_key}):
""" html += """
""" return html @router.get("/generate1", response_class=HTMLResponse) def generate_page(request: Request, db: Session = Depends(get_db)): machines = db.execute(text(""" SELECT machine_id, brand_name, name FROM t_machine ORDER BY brand_name, name LIMIT 200 """)).fetchall() templates = [ (99181, "iPhone 国行基础模板"), (99198, "安卓通用模板"), (99197, "折叠屏模板"), ] html = """

生成机型模板

① 选择机型

② 选择基础模板

③ Step1 补充配置(手动输入,逗号分隔)

容量(capacity):


颜色(color):


保修(warranty):


""" return html @router.post("/generate") def generate_submit( request: Request, machine_id: int = Form(...), base_template_id: int = Form(...), db: Session = Depends(get_db) ): form = request._form # FastAPI 已解析 # 1️⃣ 基础模板(step1_attr + release_option) packet = build_estimate_packet(db, base_template_id) # 2️⃣ 补充 step1(人工输入) step1 = packet[0]["properties"] # 所有 manual_xxx manual_inputs = {} for k, v in form.items(): if k.startswith("manual_"): manual_inputs[k.replace("manual_", "")] = v # 读取 step1_attr 的定义(用于取 attr_name) attr_map = db.execute(text(""" SELECT attr_key, attr_name FROM step1_attr GROUP BY attr_key, attr_name """)).fetchall() attr_name_map = {a.attr_key: a.attr_name for a in attr_map} for attr_key, value_str in manual_inputs.items(): if not value_str: continue values = [x.strip() for x in value_str.split(",") if x.strip()] if not values: continue step1.append({ "id": attr_key, "name": attr_name_map.get(attr_key, attr_key), "required": False, "isMulti": False, "values": [ { "valueId": f"manual_{attr_key}_{v}", "valueText": v, "isNormal": True } for v in values ] }) # 3️⃣ 保存模板 db.execute(text(""" INSERT INTO machine_temp(machine_id, temp_type, estimate_packet) VALUES (:mid, '00', :json) ON DUPLICATE KEY UPDATE estimate_packet=:json """), { "mid": machine_id, "json": json.dumps({ "templateId": base_template_id, "template": packet }, ensure_ascii=False) }) db.commit() return RedirectResponse("/admin/template/generate", status_code=302)