baodan/api/insurance/admin/template_service.py

123 lines
4.5 KiB
Python

"""方案模板管理服务。"""
import os
import json
from flask import current_app
from insurance.db.compat import db
from insurance.models.template import ProposalTemplate
class TemplateService:
"""方案模板管理业务逻辑。"""
def list_templates(self, params: dict) -> dict:
"""获取模板列表。"""
query = db.session.query(ProposalTemplate)
if params.get("insurance_type"):
query = query.filter(ProposalTemplate.insurance_type == params["insurance_type"])
total = query.count()
items = query.offset((params["page"] - 1) * params["page_size"]).limit(params["page_size"]).all()
return {
"code": 0,
"data": {
"total": total,
"items": [t.to_dict() for t in items],
},
}
def get_template(self, template_id: str) -> dict:
"""获取单个模板详情。"""
template_id_int = int(template_id.replace("template-", ""))
template = db.session.query(ProposalTemplate).filter_by(id=template_id_int).first()
if not template:
return {"code": 1005, "message": "模板不存在", "data": None}
return {"code": 0, "data": template.to_dict()}
def create_template(self, data: dict) -> dict:
"""创建模板。"""
template = ProposalTemplate(
name=data.get("name", ""),
description=data.get("description", ""),
insurance_type=data.get("insurance_type", ""),
file_path=data.get("file_path", ""),
file_type=data.get("file_type", "pdf"),
placeholders=json.dumps(data.get("placeholders", [])),
is_default=data.get("is_default", False),
)
db.session.add(template)
db.session.commit()
from insurance.utils.audit import log_operation
log_operation("system", "create", "template", str(template.id), {"name": template.name})
return {"code": 0, "data": {"id": f"template-{template.id}"}}
def update_template(self, template_id: str, data: dict) -> dict:
"""更新模板。"""
template_id_int = int(template_id.replace("template-", ""))
template = db.session.query(ProposalTemplate).filter_by(id=template_id_int).first()
if not template:
return {"code": 1005, "message": "模板不存在", "data": None}
for key in ("name", "description", "insurance_type", "file_path", "file_type", "is_default"):
if key in data:
setattr(template, key, data[key])
if "placeholders" in data:
template.placeholders = json.dumps(data["placeholders"])
db.session.commit()
from insurance.utils.audit import log_operation
log_operation("system", "update", "template", template_id, {"name": template.name})
return {"code": 0, "message": "success", "data": None}
def delete_template(self, template_id: str) -> dict:
"""删除模板。"""
template_id_int = int(template_id.replace("template-", ""))
template = db.session.query(ProposalTemplate).filter_by(id=template_id_int).first()
if not template:
return {"code": 1005, "message": "模板不存在", "data": None}
# 删除文件
if template.file_path and os.path.exists(template.file_path):
try:
os.remove(template.file_path)
except Exception:
pass
db.session.delete(template)
db.session.commit()
from insurance.utils.audit import log_operation
log_operation("system", "delete", "template", template_id, {"name": template.name})
return {"code": 0, "message": "success", "data": None}
def upload_template(self, file, data: dict) -> dict:
"""上传模板文件。"""
if not file:
return {"code": 1001, "message": "请选择文件", "data": None}
# 保存文件
upload_dir = os.path.join(current_app.config.get("UPLOAD_DIR", "uploads"), "templates")
os.makedirs(upload_dir, exist_ok=True)
filename = file.filename
file_path = os.path.join(upload_dir, filename)
file.save(file_path)
# 获取文件类型
file_type = "pdf"
if filename.endswith(".docx"):
file_type = "docx"
elif filename.endswith(".doc"):
file_type = "doc"
# 创建模板记录
data["file_path"] = file_path
data["file_type"] = file_type
return self.create_template(data)