From 64585261c4c3a434d0579e89ac116ae85ef41d71 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Thu, 27 Nov 2025 17:13:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E8=B4=A6=E5=8F=B7=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E6=A0=87=E8=AF=86=E5=9B=9E=E5=A1=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lawrisk/api/auth.py | 1 + lawrisk/api/v2.py | 24 +++++++ lawrisk/services/auth_service.py | 15 ++++- static/super_admin.html | 110 +++++++++++++++++++++++++++++-- 4 files changed, 143 insertions(+), 7 deletions(-) diff --git a/lawrisk/api/auth.py b/lawrisk/api/auth.py index 6c44a24..eaeff25 100644 --- a/lawrisk/api/auth.py +++ b/lawrisk/api/auth.py @@ -55,6 +55,7 @@ def _scrub_user_payload(user: Dict[str, Any]) -> Dict[str, Any]: "name": user.get("service_department_name"), "code": user.get("service_department_code"), "region_id": user.get("service_department_region_id"), + "region_name": user.get("service_department_region_name"), "parent_id": user.get("service_department_parent_id"), "phone": user.get("service_department_phone"), "role": user.get("department_role"), diff --git a/lawrisk/api/v2.py b/lawrisk/api/v2.py index 963a2e7..96dacdf 100644 --- a/lawrisk/api/v2.py +++ b/lawrisk/api/v2.py @@ -275,11 +275,23 @@ def admin_create_user(): return jsonify({"success": False, "message": "用户名和密码均不能为空"}), 400 parent_department_id = (payload.get("parent_department_id") or "").strip() or None service_department_id = (payload.get("service_department_id") or "").strip() or None + region_id = (payload.get("region_id") or "").strip() or None department_phone = (payload.get("department_phone") or "").strip() or None # 如果未显式绑定部门,则为该用户创建一个同名单位,并按父级决定层级 created_department: Optional[Dict[str, Any]] = None if not service_department_id: + # 未显式指定区域时,继承父级部门的区域 + if not region_id and parent_department_id: + try: + parent_dept = next( + (dept for dept in list_service_departments() if str(dept.get("id")) == parent_department_id), + None + ) + if parent_dept: + region_id = parent_dept.get("region_id") + except Exception: + region_id = None try: dept_name = (payload.get("display_name") or username).strip() or username dept_code = username.upper() @@ -288,6 +300,7 @@ def admin_create_user(): code=dept_code, phone=department_phone, parent_id=parent_department_id, + region_id=region_id, ) service_department_id = created_department.get("id") except Exception as exc: @@ -303,6 +316,7 @@ def admin_create_user(): service_department_id=service_department_id, department_role=payload.get("department_role"), parent_department_id=parent_department_id, + service_department_region_id=region_id, service_department_phone=department_phone, ) return jsonify({"success": True, "data": {"user": user, "department": created_department}}) @@ -508,6 +522,16 @@ def admin_create_service_department(): "description": payload.get("description"), "grade": grade, } + if not kwargs["region_id"] and kwargs["parent_id"]: + try: + parent_dept = next( + (dept for dept in list_service_departments() if str(dept.get("id")) == kwargs["parent_id"]), + None + ) + if parent_dept: + kwargs["region_id"] = parent_dept.get("region_id") + except Exception: + kwargs["region_id"] = None try: department = create_service_department(name, code=code_token, **kwargs) department_id = department.get("id") diff --git a/lawrisk/services/auth_service.py b/lawrisk/services/auth_service.py index bb4f0a6..9b928af 100644 --- a/lawrisk/services/auth_service.py +++ b/lawrisk/services/auth_service.py @@ -279,6 +279,7 @@ def _public_user_payload(user: Dict[str, Any]) -> Dict[str, Any]: "phone": user.get("service_department_phone"), "parent_id": user.get("service_department_parent_id"), "region_id": user.get("service_department_region_id"), + "region_name": user.get("service_department_region_name"), "role": user.get("department_role"), } created_at = user.get("created_at") @@ -322,9 +323,11 @@ def get_user_by_username(username: str) -> Optional[Dict[str, Any]]: sd.code AS service_department_code, sd.phone AS service_department_phone, sd.parent_id AS service_department_parent_id, - sd.region_id AS service_department_region_id + sd.region_id AS service_department_region_id, + r.name AS service_department_region_name FROM auth_users au LEFT JOIN service_departments sd ON sd.id = au.service_department_id + LEFT JOIN regions r ON r.id = sd.region_id WHERE au.username = %s LIMIT 1 """, @@ -359,9 +362,11 @@ def get_user_by_id(user_id: str) -> Optional[Dict[str, Any]]: sd.code AS service_department_code, sd.phone AS service_department_phone, sd.parent_id AS service_department_parent_id, - sd.region_id AS service_department_region_id + sd.region_id AS service_department_region_id, + r.name AS service_department_region_name FROM auth_users au LEFT JOIN service_departments sd ON sd.id = au.service_department_id + LEFT JOIN regions r ON r.id = sd.region_id WHERE au.id = %s LIMIT 1 """, @@ -394,9 +399,11 @@ def list_users(include_inactive: bool = False) -> List[Dict[str, Any]]: sd.code AS service_department_code, sd.phone AS service_department_phone, sd.parent_id AS service_department_parent_id, - sd.region_id AS service_department_region_id + sd.region_id AS service_department_region_id, + r.name AS service_department_region_name FROM auth_users au LEFT JOIN service_departments sd ON sd.id = au.service_department_id + LEFT JOIN regions r ON r.id = sd.region_id {where_clause} ORDER BY au.created_at DESC """ @@ -419,6 +426,7 @@ def create_user( service_department_id: Optional[str] = None, department_role: Optional[str] = None, parent_department_id: Optional[str] = None, + service_department_region_id: Optional[str] = None, service_department_phone: Optional[str] = None, ) -> Dict[str, Any]: username_clean = (username or "").strip().lower() @@ -436,6 +444,7 @@ def create_user( code=dept_code, phone=(service_department_phone or "").strip() or None, parent_id=(parent_department_id or "").strip() or None, + region_id=(service_department_region_id or "").strip() or None, ) dept_token = created.get("id") except Exception as exc: diff --git a/static/super_admin.html b/static/super_admin.html index e904acf..4760181 100644 --- a/static/super_admin.html +++ b/static/super_admin.html @@ -1185,6 +1185,7 @@ 用户名 显示名 部门 + 区域 角色 创建时间 操作 @@ -1214,6 +1215,11 @@ + + @@ -2676,6 +2772,7 @@ function showEditModal(nodeData) { return { name: formData.get('name'), phone: formData.get('phone'), + region_id: formData.get('region_id'), description: formData.get('description') // 编辑时不修改grade,grade根据层级自动计算 }; @@ -2702,6 +2799,11 @@ function showEditModal(nodeData) { +