baodan/api/insurance/admin/department_service.py

102 lines
4.1 KiB
Python
Raw Normal View History

"""部门/分组管理服务。"""
from insurance.db.compat import db
from insurance.models.department import Department
class DepartmentService:
"""部门/分组管理业务逻辑。"""
def list_departments(self) -> dict:
"""获取部门列表。"""
departments = db.session.query(Department).order_by(Department.sort_order).all()
return {"code": 0, "data": [d.to_dict() for d in departments]}
def get_department_tree(self) -> dict:
"""获取部门树形结构。"""
departments = db.session.query(Department).order_by(Department.sort_order).all()
dept_list = [d.to_dict() for d in departments]
# 构建树形结构
dept_map = {d["id"]: d for d in dept_list}
tree = []
for dept in dept_list:
if dept["parent_id"] == 0:
tree.append(dept)
elif dept["parent_id"] in dept_map:
parent = dept_map[dept["parent_id"]]
if "children" not in parent:
parent["children"] = []
parent["children"].append(dept)
return {"code": 0, "data": tree}
def create_department(self, data: dict) -> dict:
"""创建部门。"""
# 检查编码是否已存在
existing = db.session.query(Department).filter_by(code=data.get("code")).first()
if existing:
return {"code": 1006, "message": "部门编码已存在", "data": None}
department = Department(
name=data.get("name", ""),
code=data.get("code", ""),
parent_id=data.get("parent_id", 0),
description=data.get("description", ""),
sort_order=data.get("sort_order", 0),
)
db.session.add(department)
db.session.commit()
from insurance.utils.audit import log_operation
log_operation("system", "create", "department", str(department.id), {"name": department.name})
return {"code": 0, "data": {"id": department.id}}
def update_department(self, dept_id: int, data: dict) -> dict:
"""更新部门。"""
department = db.session.query(Department).filter_by(id=dept_id).first()
if not department:
return {"code": 1005, "message": "部门不存在", "data": None}
# 检查编码是否已被其他部门使用
if "code" in data and data["code"] != department.code:
existing = db.session.query(Department).filter_by(code=data["code"]).first()
if existing:
return {"code": 1006, "message": "部门编码已存在", "data": None}
for key in ("name", "code", "parent_id", "description", "sort_order"):
if key in data:
setattr(department, key, data[key])
db.session.commit()
from insurance.utils.audit import log_operation
log_operation("system", "update", "department", str(dept_id), {"name": department.name})
return {"code": 0, "message": "success", "data": None}
def delete_department(self, dept_id: int) -> dict:
"""删除部门。"""
department = db.session.query(Department).filter_by(id=dept_id).first()
if not department:
return {"code": 1005, "message": "部门不存在", "data": None}
# 检查是否有子部门
children_count = db.session.query(Department).filter_by(parent_id=dept_id).count()
if children_count > 0:
return {"code": 1010, "message": "该部门下有子部门,无法删除", "data": None}
# 检查是否有用户属于该部门
from insurance.models.wecom_user import WeComUserMapping
users_count = db.session.query(WeComUserMapping).filter_by(department=department.name).count()
if users_count > 0:
return {"code": 1011, "message": "该部门下有用户,无法删除", "data": None}
db.session.delete(department)
db.session.commit()
from insurance.utils.audit import log_operation
log_operation("system", "delete", "department", str(dept_id), {"name": department.name})
return {"code": 0, "message": "success", "data": None}