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 = """
生成机型模板
"""
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)