102 lines
4.1 KiB
Python
102 lines
4.1 KiB
Python
|
|
"""部门/分组管理服务。"""
|
||
|
|
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}
|