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