"""方案模板管理服务。""" 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)