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, "折叠屏模板"), ] html = """

生成机型模板

① 选择机型

② 选择基础模板

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

容量(capacity):


颜色(color):


保修(warranty):


""" return html @router.post("/generate") def generate_submit( machine_id: int = Form(...), base_template_id: int = Form(...), capacity: str = Form(""), color: str = Form(""), warranty: str = Form(""), db: Session = Depends(get_db) ): # 1️⃣ 基础模板(step1_attr + release_option) packet = build_estimate_packet(db, base_template_id) # 2️⃣ 补充 step1(人工输入) step1 = packet[0]["properties"] def append_property(key, name, values): if not values: return step1.append({ "id": key, "name": name, "required": False, "isMulti": False, "values": [ { "valueId": f"manual_{v.strip()}", "valueText": v.strip(), "isNormal": True } for v in values.split(",") if v.strip() ] }) append_property("capacity", "容量", capacity) append_property("color", "颜色", color) append_property("warranty", "保修", warranty) # 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)