123 lines
4.5 KiB
Python
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)
|