fix(menu): 修复两级菜单结构和嵌套问题

1. 菜单类型默认值改为 TOP_LEFT(顶部一级+左侧二级)
2. 二级菜单 component 设为空字符串避免嵌套布局
3. 前端和后端菜单数据同步更新

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-06-12 20:02:47 +08:00
1 parent e6350d5e33
commit 7f7979679f
29 files changed
+720 -200

No files matched your search

-1
View File
@@ -1 +0,0 @@
91694
+14 -14
View File
@@ -30,7 +30,7 @@ STATIC_MENU_TREE = [
"id": "CEL00000000000000000000000000001",
"name": "CellStorage",
"path": "cell-storage",
"component": "/index/index",
"component": "",
"meta": {
"title": "细胞存储",
"icon": "ri:test-tube-line",
@@ -80,7 +80,7 @@ STATIC_MENU_TREE = [
"id": "RSC00000000000000000000000000001",
"name": "ResearchDonation",
"path": "research-donation",
"component": "/index/index",
"component": "",
"meta": {
"title": "科研捐赠",
"icon": "ri:hand-heart-line",
@@ -116,7 +116,7 @@ STATIC_MENU_TREE = [
"id": "PIL00000000000000000000000000001",
"name": "PilotService",
"path": "pilot-service",
"component": "/index/index",
"component": "",
"meta": {
"title": "中试服务",
"icon": "ri:flask-line",
@@ -145,7 +145,7 @@ STATIC_MENU_TREE = [
"id": "BEX00000000000000000000000000001",
"name": "BasicExperiment",
"path": "basic-experiment",
"component": "/index/index",
"component": "",
"meta": {
"title": "基础实验",
"icon": "ri:flask-line",
@@ -193,7 +193,7 @@ STATIC_MENU_TREE = [
"id": "MKT00000000000000000000000000001",
"name": "MarketInfo",
"path": "market-info",
"component": "/index/index",
"component": "",
"meta": {
"title": "市场基础信息",
"icon": "ri:price-tag-3-line",
@@ -291,7 +291,7 @@ STATIC_MENU_TREE = [
"id": "CLI00000000000000000000000000001",
"name": "ClinicalApplication",
"path": "clinical-application",
"component": "/index/index",
"component": "",
"meta": {
"title": "临床应用",
"icon": "ri:heart-pulse-line",
@@ -386,7 +386,7 @@ STATIC_MENU_TREE = [
"id": "PRM00000000000000000000000000001",
"name": "ProductionManage",
"path": "production",
"component": "/index/index",
"component": "",
"meta": {
"title": "生产管理",
"icon": "grid",
@@ -433,7 +433,7 @@ STATIC_MENU_TREE = [
"id": "PRB00000000000000000000000000001",
"name": "ProductionBase",
"path": "production-base",
"component": "/index/index",
"component": "",
"meta": {
"title": "生产基础信息",
"icon": "ri:tools-line",
@@ -503,7 +503,7 @@ STATIC_MENU_TREE = [
"id": "QCM00000000000000000000000000001",
"name": "QualityManage",
"path": "quality-manage",
"component": "/index/index",
"component": "",
"meta": {
"title": "质检管理",
"icon": "ri:shield-check-line",
@@ -561,7 +561,7 @@ STATIC_MENU_TREE = [
"id": "QCB00000000000000000000000000001",
"name": "QualityBase",
"path": "quality-base",
"component": "/index/index",
"component": "",
"meta": {
"title": "质检基础信息",
"icon": "ri:clipboard-line",
@@ -624,7 +624,7 @@ STATIC_MENU_TREE = [
"id": "SYSB000000000000000000000000000001",
"name": "SystemBase",
"path": "system-base",
"component": "/index/index",
"component": "",
"meta": {
"title": "系统基础信息",
"icon": "ri:archive-line",
@@ -660,7 +660,7 @@ STATIC_MENU_TREE = [
"id": "OPS00000000000000000000000000001",
"name": "Operations",
"path": "operations",
"component": "/index/index",
"component": "",
"meta": {
"title": "运营支撑",
"icon": "operation",
@@ -709,7 +709,7 @@ STATIC_MENU_TREE = [
"id": "SYSM000000000000000000000000000001",
"name": "SystemManage",
"path": "system",
"component": "/index/index",
"component": "",
"meta": {
"title": "系统管理",
"icon": "ri:settings-3-line",
@@ -780,7 +780,7 @@ STATIC_MENU_TREE = [
"id": "WKF00000000000000000000000000001",
"name": "Workflow",
"path": "workflow",
"component": "/index/index",
"component": "",
"meta": {
"title": "工作流管理",
"icon": "workflow",
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_services_web_auth_roles_py", "label": "web_auth_roles.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L1"}, {"id": "services_web_auth_roles_map_role_name_to_web", "label": "_map_role_name_to_web()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L16"}, {"id": "services_web_auth_roles_resolve_web_role_for_user", "label": "resolve_web_role_for_user()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L28"}, {"id": "services_web_auth_roles_iter_user_menu_perm_codes", "label": "iter_user_menu_perm_codes()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L56"}, {"id": "services_web_auth_roles_rationale_1", "label": "Web \u7ba1\u7406\u7aef\u767b\u5f55\uff1a\u57fa\u4e8e V0.3 sys_user / sys_user_role / sys_role \u7684\u89d2\u8272\u4e0e\u83dc\u5355\u6743\u9650\u89e3\u6790", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L1"}, {"id": "services_web_auth_roles_rationale_17", "label": "\u5c06 sys_role.role_name \u6620\u5c04\u4e3a web-admin \u4f7f\u7528\u7684 role \u5b57\u7b26\u4e32\u3002", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L17"}, {"id": "services_web_auth_roles_rationale_29", "label": "\u6839\u636e\u7528\u6237\u5173\u8054\u89d2\u8272\u89e3\u6790 Web \u7aef role\uff08admin / super_admin\uff09\u3002", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L29"}, {"id": "services_web_auth_roles_rationale_57", "label": "\u7528\u6237\u901a\u8fc7\u89d2\u8272\u5173\u8054\u5f97\u5230\u7684\u83dc\u5355\u6743\u9650\u6807\u8bc6\uff08sys_menu.perms\uff0c\u7a7a\u5219\u9000\u56de\u83dc\u5355 id\uff09\u3002 \u6ce8\uff1a\u4e00\u7ea7\u83dc\u5355\uff08market\u3001production\u3001quali", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L57"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_services_web_auth_roles_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_services_web_auth_roles_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_services_web_auth_roles_py", "target": "sqlalchemy_orm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_services_web_auth_roles_py", "target": "app_core_config", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_services_web_auth_roles_py", "target": "app_models_models", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_services_web_auth_roles_py", "target": "services_web_auth_roles_map_role_name_to_web", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L16", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_services_web_auth_roles_py", "target": "services_web_auth_roles_resolve_web_role_for_user", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L28", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_services_web_auth_roles_py", "target": "services_web_auth_roles_iter_user_menu_perm_codes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py", "source_location": "L56", "weight": 1.0}, {"source": "services_web_auth_roles_resolve_web_role_for_user", "target": "services_web_auth_roles_map_role_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "label": "menu.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L1"}, {"id": "api_menu_get_menu_list", "label": "get_menu_list()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L834"}, {"id": "api_menu_rationale_1", "label": "\u8fd0\u8425\u7aef\u83dc\u5355\u63a5\u53e3\uff08\u4e0e web-admin \u524d\u7aef\u9759\u6001\u8def\u7531 sqxp.ts \u5bf9\u9f50\uff0c5 \u4e2a\u4e00\u7ea7\u83dc\u5355\u5206\u7ec4\uff09", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "target": "fastapi", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "target": "app_core_menu_guard", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "target": "app_core_response", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "target": "api_menu_get_menu_list", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L834", "weight": 1.0}, {"source": "api_menu_rationale_1", "target": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "api_menu_get_menu_list", "callee": "success_response", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L836"}]}
+3 -3
View File
@@ -1451,9 +1451,9 @@
"models_qc_param_bizqctaskresult",
"models_qc_param_py",
"services_web_auth_roles_rationale_1",
"services_web_auth_roles_rationale_14",
"services_web_auth_roles_rationale_26",
"services_web_auth_roles_rationale_54",
"services_web_auth_roles_rationale_17",
"services_web_auth_roles_rationale_29",
"services_web_auth_roles_rationale_57",
"services_workflow_engine_rationale_1"
],
"3": [
+38 -38
View File
@@ -21229,11 +21229,11 @@
"label": "get_menu_list()",
"file_type": "code",
"source_file": "api/menu.py",
"source_location": "L777"
"source_location": "L834"
},
{
"id": "api_menu_rationale_1",
"label": "\u8fd0\u8425\u7aef\u83dc\u5355\u63a5\u53e3\uff08\u4e0e web-admin \u524d\u7aef\u9759\u6001\u8def\u7531 sqxp.ts \u5bf9\u9f50\uff0c13 \u4e2a\u4e00\u7ea7\u83dc\u5355\uff09",
"label": "\u8fd0\u8425\u7aef\u83dc\u5355\u63a5\u53e3\uff08\u4e0e web-admin \u524d\u7aef\u9759\u6001\u8def\u7531 sqxp.ts \u5bf9\u9f50\uff0c5 \u4e2a\u4e00\u7ea7\u83dc\u5355\u5206\u7ec4\uff09",
"file_type": "rationale",
"source_file": "api/menu.py",
"source_location": "L1"
@@ -25457,21 +25457,21 @@
"label": "_map_role_name_to_web()",
"file_type": "code",
"source_file": "services/web_auth_roles.py",
"source_location": "L13"
"source_location": "L16"
},
{
"id": "services_web_auth_roles_resolve_web_role_for_user",
"label": "resolve_web_role_for_user()",
"file_type": "code",
"source_file": "services/web_auth_roles.py",
"source_location": "L25"
"source_location": "L28"
},
{
"id": "services_web_auth_roles_iter_user_menu_perm_codes",
"label": "iter_user_menu_perm_codes()",
"file_type": "code",
"source_file": "services/web_auth_roles.py",
"source_location": "L53"
"source_location": "L56"
},
{
"id": "services_web_auth_roles_rationale_1",
@@ -25481,25 +25481,25 @@
"source_location": "L1"
},
{
"id": "services_web_auth_roles_rationale_14",
"id": "services_web_auth_roles_rationale_17",
"label": "\u5c06 sys_role.role_name \u6620\u5c04\u4e3a web-admin \u4f7f\u7528\u7684 role \u5b57\u7b26\u4e32\u3002",
"file_type": "rationale",
"source_file": "services/web_auth_roles.py",
"source_location": "L14"
"source_location": "L17"
},
{
"id": "services_web_auth_roles_rationale_26",
"id": "services_web_auth_roles_rationale_29",
"label": "\u6839\u636e\u7528\u6237\u5173\u8054\u89d2\u8272\u89e3\u6790 Web \u7aef role\uff08admin / super_admin\uff09\u3002",
"file_type": "rationale",
"source_file": "services/web_auth_roles.py",
"source_location": "L26"
"source_location": "L29"
},
{
"id": "services_web_auth_roles_rationale_54",
"label": "\u7528\u6237\u901a\u8fc7\u89d2\u8272\u5173\u8054\u5f97\u5230\u7684\u83dc\u5355\u6743\u9650\u6807\u8bc6\uff08sys_menu.perms\uff0c\u7a7a\u5219\u9000\u56de\u83dc\u5355 id\uff09\u3002",
"id": "services_web_auth_roles_rationale_57",
"label": "\u7528\u6237\u901a\u8fc7\u89d2\u8272\u5173\u8054\u5f97\u5230\u7684\u83dc\u5355\u6743\u9650\u6807\u8bc6\uff08sys_menu.perms\uff0c\u7a7a\u5219\u9000\u56de\u83dc\u5355 id\uff09\u3002 \u6ce8\uff1a\u4e00\u7ea7\u83dc\u5355\uff08market\u3001production\u3001quali",
"file_type": "rationale",
"source_file": "services/web_auth_roles.py",
"source_location": "L54"
"source_location": "L57"
},
{
"id": "services_protocol_payment_installment_py",
@@ -80490,7 +80490,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "api/menu.py",
"source_location": "L777",
"source_location": "L834",
"weight": 1.0
},
{
@@ -92181,7 +92181,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L13",
"source_location": "L16",
"weight": 1.0
},
{
@@ -92190,7 +92190,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L25",
"source_location": "L28",
"weight": 1.0
},
{
@@ -92199,7 +92199,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L53",
"source_location": "L56",
"weight": 1.0
},
{
@@ -92208,7 +92208,7 @@
"relation": "calls",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L47",
"source_location": "L50",
"weight": 1.0
},
{
@@ -92221,30 +92221,30 @@
"weight": 1.0
},
{
"source": "services_web_auth_roles_rationale_14",
"source": "services_web_auth_roles_rationale_17",
"target": "services_web_auth_roles_map_role_name_to_web",
"relation": "rationale_for",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L14",
"source_location": "L17",
"weight": 1.0
},
{
"source": "services_web_auth_roles_rationale_26",
"source": "services_web_auth_roles_rationale_29",
"target": "services_web_auth_roles_resolve_web_role_for_user",
"relation": "rationale_for",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L26",
"source_location": "L29",
"weight": 1.0
},
{
"source": "services_web_auth_roles_rationale_54",
"source": "services_web_auth_roles_rationale_57",
"target": "services_web_auth_roles_iter_user_menu_perm_codes",
"relation": "rationale_for",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L54",
"source_location": "L57",
"weight": 1.0
},
{
@@ -151477,7 +151477,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_14",
"source": "services_web_auth_roles_rationale_17",
"target": "models_models_sysmenu",
"relation": "uses",
"confidence": "INFERRED",
@@ -151486,7 +151486,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_26",
"source": "services_web_auth_roles_rationale_29",
"target": "models_models_sysmenu",
"relation": "uses",
"confidence": "INFERRED",
@@ -151495,7 +151495,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_54",
"source": "services_web_auth_roles_rationale_57",
"target": "models_models_sysmenu",
"relation": "uses",
"confidence": "INFERRED",
@@ -151513,7 +151513,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_14",
"source": "services_web_auth_roles_rationale_17",
"target": "models_models_sysrole",
"relation": "uses",
"confidence": "INFERRED",
@@ -151522,7 +151522,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_26",
"source": "services_web_auth_roles_rationale_29",
"target": "models_models_sysrole",
"relation": "uses",
"confidence": "INFERRED",
@@ -151531,7 +151531,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_54",
"source": "services_web_auth_roles_rationale_57",
"target": "models_models_sysrole",
"relation": "uses",
"confidence": "INFERRED",
@@ -151549,7 +151549,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_14",
"source": "services_web_auth_roles_rationale_17",
"target": "models_models_sysrolemenu",
"relation": "uses",
"confidence": "INFERRED",
@@ -151558,7 +151558,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_26",
"source": "services_web_auth_roles_rationale_29",
"target": "models_models_sysrolemenu",
"relation": "uses",
"confidence": "INFERRED",
@@ -151567,7 +151567,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_54",
"source": "services_web_auth_roles_rationale_57",
"target": "models_models_sysrolemenu",
"relation": "uses",
"confidence": "INFERRED",
@@ -151585,7 +151585,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_14",
"source": "services_web_auth_roles_rationale_17",
"target": "models_models_sysuserrole",
"relation": "uses",
"confidence": "INFERRED",
@@ -151594,7 +151594,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_26",
"source": "services_web_auth_roles_rationale_29",
"target": "models_models_sysuserrole",
"relation": "uses",
"confidence": "INFERRED",
@@ -151603,7 +151603,7 @@
"weight": 0.8
},
{
"source": "services_web_auth_roles_rationale_54",
"source": "services_web_auth_roles_rationale_57",
"target": "models_models_sysuserrole",
"relation": "uses",
"confidence": "INFERRED",
@@ -175288,7 +175288,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "api/menu.py",
"source_location": "L779",
"source_location": "L836",
"weight": 1.0
},
{
@@ -190128,7 +190128,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "services/web_auth_roles.py",
"source_location": "L44",
"source_location": "L47",
"weight": 1.0
},
{
@@ -190138,7 +190138,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "services/web_auth_roles.py",
"source_location": "L92",
"source_location": "L99",
"weight": 1.0
},
{
+3 -3
View File
@@ -1,7 +1,7 @@
# Graph Report - app (2026-06-12)
## Corpus Check
- 189 files · ~201,737 words
- 189 files · ~201,863 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
@@ -238,7 +238,7 @@ Nodes (2): _auto_fill_create_dept_id(), ORM before_insert 钩子:当 create_de
### Community 38 - "Community 38"
Cohesion: 0.67
Nodes (2): get_menu_list(), 运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,13 个一级菜单)
Nodes (2): get_menu_list(), 运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,5 个一级菜单分组)
### Community 39 - "Community 39"
Cohesion: 1.0
@@ -279,7 +279,7 @@ Nodes (1): 发送催单通知给配送员 Args: del
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 37`** (4 nodes): `_auto_fill_create_dept_id()`, `get_db()`, `database.py`, `ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 38`** (3 nodes): `get_menu_list()`, `menu.py`, `运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,13 个一级菜单)`
- **Thin community `Community 38`** (3 nodes): `get_menu_list()`, `menu.py`, `运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,5 个一级菜单分组)`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 39`** (2 nodes): `context.py`, `请求级别的用户上下文变量 通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
+2 -2
View File
@@ -60,8 +60,8 @@
<div id="stats">3596 nodes &middot; 16321 edges &middot; 53 communities</div>
</div>
<script>
const RAW_NODES = [{"id": "init_py", "label": "__init__.py", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 41, "community_name": "Community 41", "source_file": "__init__.py", "file_type": "code", "degree": 0}, {"id": "main_py", "label": "main.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "main.py", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 7}, {"id": "app_main_lifespan", "label": "lifespan()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "lifespan()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_error_json", "label": "_error_json()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "_error_json()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 3}, {"id": "app_main_sqlalchemy_exception_handler", "label": "sqlalchemy_exception_handler()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "sqlalchemy_exception_handler()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_unhandled_exception_handler", "label": "unhandled_exception_handler()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "unhandled_exception_handler()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 5}, {"id": "app_main_mask_secret", "label": "_mask_secret()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "_mask_secret()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_root", "label": "root()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "root()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_health_check", "label": "health_check()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "health_check()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_rationale_81", "label": "\u6570\u636e\u5e93\u5f02\u5e38\uff1a\u8fd4\u56de JSON \u5e76\u4fdd\u7559 CORS \u5934\uff0c\u907f\u514d\u6d4f\u89c8\u5668\u53ea\u62a5\u8de8\u57df\u9519\u8bef", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "\u6570\u636e\u5e93\u5f02\u5e38\uff1a\u8fd4\u56de JSON \u5e76\u4fdd\u7559 CORS \u5934\uff0c\u907f\u514d\u6d4f\u89c8\u5668\u53ea\u62a5\u8de8\u57df\u9519\u8bef", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "rationale", "degree": 3}, {"id": "app_main_rationale_92", "label": "\u672a\u6355\u83b7\u5f02\u5e38\uff1a\u7edf\u4e00 JSON 500\uff0c\u786e\u4fdd\u8de8\u57df\u573a\u666f\u4e0b\u4ecd\u6709 Access-Control-Allow-Origin", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "\u672a\u6355\u83b7\u5f02\u5e38\uff1a\u7edf\u4e00 JSON 500\uff0c\u786e\u4fdd\u8de8\u57df\u573a\u666f\u4e0b\u4ecd\u6709 Access-Control-Allow-Origin", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "rationale", "degree": 3}, {"id": "tasks_init_py", "label": "__init__.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 7, "community_name": "Community 7", "source_file": "tasks/__init__.py", "file_type": "code", "degLine truncated
const RAW_EDGES = [{"from": "main_py", "to": "app_main_lifespan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_error_json", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_sqlalchemy_exception_handler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_unhandled_exception_handler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_mask_secret", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_root", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_health_check", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_lifespan", "to": "core_login_crypto_ensure_initialized", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_lifespan", "to": "tasks_init_init_scheduled_tasks", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_lifespan", "to": "tasks_init_shutdown_scheduler", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_error_json", "to": "app_main_sqlalchemy_exception_handler", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_error_json", "to": "app_main_unhandled_exception_handler", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_sqlalchemy_exception_handler", "to": "app_main_rationale_81", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_sqlalchemy_exception_handler", "to": "exception", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_unhandled_exception_handler", "to": "app_main_rationale_92", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_unhandled_exception_handler", "to": "exception", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_unhandled_exception_handler", "to": "str", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_81", "to": "core_api_request_log_middleware_apirequestlogmiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_81", "to": "core_api_crypto_middleware_apicryptomiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_92", "to": "core_api_request_log_middleware_apirequestlogmiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_92", "to": "core_api_crypto_middleware_apicryptomiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "tasks_init_py", "to": "tasks_init_init_scheduled_tasks", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "tasks_init_py", "to": "tasks_init_shutdown_scheduler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_redis_session_enabled", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_get_redis_client", "labeLine truncated
const RAW_NODES = [{"id": "init_py", "label": "__init__.py", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 41, "community_name": "Community 41", "source_file": "__init__.py", "file_type": "code", "degree": 0}, {"id": "main_py", "label": "main.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "main.py", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 7}, {"id": "app_main_lifespan", "label": "lifespan()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "lifespan()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_error_json", "label": "_error_json()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "_error_json()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 3}, {"id": "app_main_sqlalchemy_exception_handler", "label": "sqlalchemy_exception_handler()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "sqlalchemy_exception_handler()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_unhandled_exception_handler", "label": "unhandled_exception_handler()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "unhandled_exception_handler()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 5}, {"id": "app_main_mask_secret", "label": "_mask_secret()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "_mask_secret()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_root", "label": "root()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "root()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_health_check", "label": "health_check()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "health_check()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_rationale_81", "label": "\u6570\u636e\u5e93\u5f02\u5e38\uff1a\u8fd4\u56de JSON \u5e76\u4fdd\u7559 CORS \u5934\uff0c\u907f\u514d\u6d4f\u89c8\u5668\u53ea\u62a5\u8de8\u57df\u9519\u8bef", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "\u6570\u636e\u5e93\u5f02\u5e38\uff1a\u8fd4\u56de JSON \u5e76\u4fdd\u7559 CORS \u5934\uff0c\u907f\u514d\u6d4f\u89c8\u5668\u53ea\u62a5\u8de8\u57df\u9519\u8bef", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "rationale", "degree": 3}, {"id": "app_main_rationale_92", "label": "\u672a\u6355\u83b7\u5f02\u5e38\uff1a\u7edf\u4e00 JSON 500\uff0c\u786e\u4fdd\u8de8\u57df\u573a\u666f\u4e0b\u4ecd\u6709 Access-Control-Allow-Origin", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "\u672a\u6355\u83b7\u5f02\u5e38\uff1a\u7edf\u4e00 JSON 500\uff0c\u786e\u4fdd\u8de8\u57df\u573a\u666f\u4e0b\u4ecd\u6709 Access-Control-Allow-Origin", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "rationale", "degree": 3}, {"id": "tasks_init_py", "label": "__init__.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 7, "community_name": "Community 7", "source_file": "tasks/__init__.py", "file_type": "code", "degLine truncated
const RAW_EDGES = [{"from": "main_py", "to": "app_main_lifespan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_error_json", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_sqlalchemy_exception_handler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_unhandled_exception_handler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_mask_secret", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_root", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_health_check", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_lifespan", "to": "core_login_crypto_ensure_initialized", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_lifespan", "to": "tasks_init_init_scheduled_tasks", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_lifespan", "to": "tasks_init_shutdown_scheduler", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_error_json", "to": "app_main_sqlalchemy_exception_handler", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_error_json", "to": "app_main_unhandled_exception_handler", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_sqlalchemy_exception_handler", "to": "app_main_rationale_81", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_sqlalchemy_exception_handler", "to": "exception", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_unhandled_exception_handler", "to": "app_main_rationale_92", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_unhandled_exception_handler", "to": "exception", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_unhandled_exception_handler", "to": "str", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_81", "to": "core_api_request_log_middleware_apirequestlogmiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_81", "to": "core_api_crypto_middleware_apicryptomiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_92", "to": "core_api_request_log_middleware_apirequestlogmiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_92", "to": "core_api_crypto_middleware_apicryptomiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "tasks_init_py", "to": "tasks_init_init_scheduled_tasks", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "tasks_init_py", "to": "tasks_init_shutdown_scheduler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_redis_session_enabled", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_get_redis_client", "labeLine truncated
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 638}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 529}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 283}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 208}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 191}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 186}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 133}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 129}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 128}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 122}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 119}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 119}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 110}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 107}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 94}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 92}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 54}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 35}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 35}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 31}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 28}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 21}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 21}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 20}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 17}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 13}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 13}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 13}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 12}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 12}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 12}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 11}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 10}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 8}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 8}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 7}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 4}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 4}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 3}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 2}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 2}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 1}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 1}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 1}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 1}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 1}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 1}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 1}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 1}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 1}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 1}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 1}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 1}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 0}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 0}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 0}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 0}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 0}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 0}];
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
+55 -55
View File
@@ -26818,19 +26818,19 @@
"label": "get_menu_list()",
"file_type": "code",
"source_file": "api/menu.py",
"source_location": "L777",
"source_location": "L834",
"id": "api_menu_get_menu_list",
"community": 38,
"norm_label": "get_menu_list()"
},
{
"label": "\u8fd0\u8425\u7aef\u83dc\u5355\u63a5\u53e3\uff08\u4e0e web-admin \u524d\u7aef\u9759\u6001\u8def\u7531 sqxp.ts \u5bf9\u9f50\uff0c13 \u4e2a\u4e00\u7ea7\u83dc\u5355\uff09",
"label": "\u8fd0\u8425\u7aef\u83dc\u5355\u63a5\u53e3\uff08\u4e0e web-admin \u524d\u7aef\u9759\u6001\u8def\u7531 sqxp.ts \u5bf9\u9f50\uff0c5 \u4e2a\u4e00\u7ea7\u83dc\u5355\u5206\u7ec4\uff09",
"file_type": "rationale",
"source_file": "api/menu.py",
"source_location": "L1",
"id": "api_menu_rationale_1",
"community": 38,
"norm_label": "\u8fd0\u8425\u7aef\u83dc\u5355\u63a5\u53e3(\u4e0e web-admin \u524d\u7aef\u9759\u6001\u8def\u7531 sqxp.ts \u5bf9\u9f50,13 \u4e2a\u4e00\u7ea7\u83dc\u5355)"
"norm_label": "\u8fd0\u8425\u7aef\u83dc\u5355\u63a5\u53e3(\u4e0e web-admin \u524d\u7aef\u9759\u6001\u8def\u7531 sqxp.ts \u5bf9\u9f50,5 \u4e2a\u4e00\u7ea7\u83dc\u5355\u5206\u7ec4)"
},
{
"label": "pilot_delivery.py",
@@ -32146,7 +32146,7 @@
"label": "_map_role_name_to_web()",
"file_type": "code",
"source_file": "services/web_auth_roles.py",
"source_location": "L13",
"source_location": "L16",
"id": "services_web_auth_roles_map_role_name_to_web",
"community": 10,
"norm_label": "_map_role_name_to_web()"
@@ -32155,7 +32155,7 @@
"label": "resolve_web_role_for_user()",
"file_type": "code",
"source_file": "services/web_auth_roles.py",
"source_location": "L25",
"source_location": "L28",
"id": "services_web_auth_roles_resolve_web_role_for_user",
"community": 10,
"norm_label": "resolve_web_role_for_user()"
@@ -32164,7 +32164,7 @@
"label": "iter_user_menu_perm_codes()",
"file_type": "code",
"source_file": "services/web_auth_roles.py",
"source_location": "L53",
"source_location": "L56",
"id": "services_web_auth_roles_iter_user_menu_perm_codes",
"community": 0,
"norm_label": "iter_user_menu_perm_codes()"
@@ -32182,8 +32182,8 @@
"label": "\u5c06 sys_role.role_name \u6620\u5c04\u4e3a web-admin \u4f7f\u7528\u7684 role \u5b57\u7b26\u4e32\u3002",
"file_type": "rationale",
"source_file": "services/web_auth_roles.py",
"source_location": "L14",
"id": "services_web_auth_roles_rationale_14",
"source_location": "L17",
"id": "services_web_auth_roles_rationale_17",
"community": 2,
"norm_label": "\u5c06 sys_role.role_name \u6620\u5c04\u4e3a web-admin \u4f7f\u7528\u7684 role \u5b57\u7b26\u4e32\u3002"
},
@@ -32191,19 +32191,19 @@
"label": "\u6839\u636e\u7528\u6237\u5173\u8054\u89d2\u8272\u89e3\u6790 Web \u7aef role\uff08admin / super_admin\uff09\u3002",
"file_type": "rationale",
"source_file": "services/web_auth_roles.py",
"source_location": "L26",
"id": "services_web_auth_roles_rationale_26",
"source_location": "L29",
"id": "services_web_auth_roles_rationale_29",
"community": 2,
"norm_label": "\u6839\u636e\u7528\u6237\u5173\u8054\u89d2\u8272\u89e3\u6790 web \u7aef role(admin / super_admin)\u3002"
},
{
"label": "\u7528\u6237\u901a\u8fc7\u89d2\u8272\u5173\u8054\u5f97\u5230\u7684\u83dc\u5355\u6743\u9650\u6807\u8bc6\uff08sys_menu.perms\uff0c\u7a7a\u5219\u9000\u56de\u83dc\u5355 id\uff09\u3002",
"label": "\u7528\u6237\u901a\u8fc7\u89d2\u8272\u5173\u8054\u5f97\u5230\u7684\u83dc\u5355\u6743\u9650\u6807\u8bc6\uff08sys_menu.perms\uff0c\u7a7a\u5219\u9000\u56de\u83dc\u5355 id\uff09\u3002 \u6ce8\uff1a\u4e00\u7ea7\u83dc\u5355\uff08market\u3001production\u3001quali",
"file_type": "rationale",
"source_file": "services/web_auth_roles.py",
"source_location": "L54",
"id": "services_web_auth_roles_rationale_54",
"source_location": "L57",
"id": "services_web_auth_roles_rationale_57",
"community": 2,
"norm_label": "\u7528\u6237\u901a\u8fc7\u89d2\u8272\u5173\u8054\u5f97\u5230\u7684\u83dc\u5355\u6743\u9650\u6807\u8bc6(sys_menu.perms,\u7a7a\u5219\u9000\u56de\u83dc\u5355 id)\u3002"
"norm_label": "\u7528\u6237\u901a\u8fc7\u89d2\u8272\u5173\u8054\u5f97\u5230\u7684\u83dc\u5355\u6743\u9650\u6807\u8bc6(sys_menu.perms,\u7a7a\u5219\u9000\u56de\u83dc\u5355 id)\u3002 \u6ce8:\u4e00\u7ea7\u83dc\u5355(market\u3001production\u3001quali"
},
{
"label": "protocol_payment_installment.py",
@@ -43894,7 +43894,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "api/menu.py",
"source_location": "L779",
"source_location": "L836",
"weight": 1.0,
"_src": "api_menu_get_menu_list",
"_tgt": "core_response_success_response",
@@ -82570,7 +82570,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "services/web_auth_roles.py",
"source_location": "L44",
"source_location": "L47",
"weight": 1.0,
"_src": "services_web_auth_roles_resolve_web_role_for_user",
"_tgt": "str",
@@ -82582,7 +82582,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "services/web_auth_roles.py",
"source_location": "L92",
"source_location": "L99",
"weight": 1.0,
"_src": "services_web_auth_roles_iter_user_menu_perm_codes",
"_tgt": "str",
@@ -87479,10 +87479,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_14",
"_src": "services_web_auth_roles_rationale_17",
"_tgt": "models_models_sysrole",
"source": "models_models_sysrole",
"target": "services_web_auth_roles_rationale_14",
"target": "services_web_auth_roles_rationale_17",
"confidence_score": 0.5
},
{
@@ -87491,10 +87491,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_26",
"_src": "services_web_auth_roles_rationale_29",
"_tgt": "models_models_sysrole",
"source": "models_models_sysrole",
"target": "services_web_auth_roles_rationale_26",
"target": "services_web_auth_roles_rationale_29",
"confidence_score": 0.5
},
{
@@ -87503,10 +87503,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_54",
"_src": "services_web_auth_roles_rationale_57",
"_tgt": "models_models_sysrole",
"source": "models_models_sysrole",
"target": "services_web_auth_roles_rationale_54",
"target": "services_web_auth_roles_rationale_57",
"confidence_score": 0.5
},
{
@@ -87671,10 +87671,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_14",
"_src": "services_web_auth_roles_rationale_17",
"_tgt": "models_models_sysuserrole",
"source": "models_models_sysuserrole",
"target": "services_web_auth_roles_rationale_14",
"target": "services_web_auth_roles_rationale_17",
"confidence_score": 0.5
},
{
@@ -87683,10 +87683,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_26",
"_src": "services_web_auth_roles_rationale_29",
"_tgt": "models_models_sysuserrole",
"source": "models_models_sysuserrole",
"target": "services_web_auth_roles_rationale_26",
"target": "services_web_auth_roles_rationale_29",
"confidence_score": 0.5
},
{
@@ -87695,10 +87695,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_54",
"_src": "services_web_auth_roles_rationale_57",
"_tgt": "models_models_sysuserrole",
"source": "models_models_sysuserrole",
"target": "services_web_auth_roles_rationale_54",
"target": "services_web_auth_roles_rationale_57",
"confidence_score": 0.5
},
{
@@ -87803,10 +87803,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_14",
"_src": "services_web_auth_roles_rationale_17",
"_tgt": "models_models_sysrolemenu",
"source": "models_models_sysrolemenu",
"target": "services_web_auth_roles_rationale_14",
"target": "services_web_auth_roles_rationale_17",
"confidence_score": 0.5
},
{
@@ -87815,10 +87815,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_26",
"_src": "services_web_auth_roles_rationale_29",
"_tgt": "models_models_sysrolemenu",
"source": "models_models_sysrolemenu",
"target": "services_web_auth_roles_rationale_26",
"target": "services_web_auth_roles_rationale_29",
"confidence_score": 0.5
},
{
@@ -87827,10 +87827,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_54",
"_src": "services_web_auth_roles_rationale_57",
"_tgt": "models_models_sysrolemenu",
"source": "models_models_sysrolemenu",
"target": "services_web_auth_roles_rationale_54",
"target": "services_web_auth_roles_rationale_57",
"confidence_score": 0.5
},
{
@@ -87995,10 +87995,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_14",
"_src": "services_web_auth_roles_rationale_17",
"_tgt": "models_models_sysmenu",
"source": "models_models_sysmenu",
"target": "services_web_auth_roles_rationale_14",
"target": "services_web_auth_roles_rationale_17",
"confidence_score": 0.5
},
{
@@ -88007,10 +88007,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_26",
"_src": "services_web_auth_roles_rationale_29",
"_tgt": "models_models_sysmenu",
"source": "models_models_sysmenu",
"target": "services_web_auth_roles_rationale_26",
"target": "services_web_auth_roles_rationale_29",
"confidence_score": 0.5
},
{
@@ -88019,10 +88019,10 @@
"source_file": "services/web_auth_roles.py",
"source_location": "L10",
"weight": 0.8,
"_src": "services_web_auth_roles_rationale_54",
"_src": "services_web_auth_roles_rationale_57",
"_tgt": "models_models_sysmenu",
"source": "models_models_sysmenu",
"target": "services_web_auth_roles_rationale_54",
"target": "services_web_auth_roles_rationale_57",
"confidence_score": 0.5
},
{
@@ -216489,7 +216489,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "api/menu.py",
"source_location": "L777",
"source_location": "L834",
"weight": 1.0,
"_src": "api_menu_py",
"_tgt": "api_menu_get_menu_list",
@@ -227889,7 +227889,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L13",
"source_location": "L16",
"weight": 1.0,
"_src": "services_web_auth_roles_py",
"_tgt": "services_web_auth_roles_map_role_name_to_web",
@@ -227901,7 +227901,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L25",
"source_location": "L28",
"weight": 1.0,
"_src": "services_web_auth_roles_py",
"_tgt": "services_web_auth_roles_resolve_web_role_for_user",
@@ -227913,7 +227913,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L53",
"source_location": "L56",
"weight": 1.0,
"_src": "services_web_auth_roles_py",
"_tgt": "services_web_auth_roles_iter_user_menu_perm_codes",
@@ -227937,7 +227937,7 @@
"relation": "calls",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L47",
"source_location": "L50",
"weight": 1.0,
"_src": "services_web_auth_roles_resolve_web_role_for_user",
"_tgt": "services_web_auth_roles_map_role_name_to_web",
@@ -227949,36 +227949,36 @@
"relation": "rationale_for",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L14",
"source_location": "L17",
"weight": 1.0,
"_src": "services_web_auth_roles_rationale_14",
"_src": "services_web_auth_roles_rationale_17",
"_tgt": "services_web_auth_roles_map_role_name_to_web",
"source": "services_web_auth_roles_map_role_name_to_web",
"target": "services_web_auth_roles_rationale_14",
"target": "services_web_auth_roles_rationale_17",
"confidence_score": 1.0
},
{
"relation": "rationale_for",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L26",
"source_location": "L29",
"weight": 1.0,
"_src": "services_web_auth_roles_rationale_26",
"_src": "services_web_auth_roles_rationale_29",
"_tgt": "services_web_auth_roles_resolve_web_role_for_user",
"source": "services_web_auth_roles_resolve_web_role_for_user",
"target": "services_web_auth_roles_rationale_26",
"target": "services_web_auth_roles_rationale_29",
"confidence_score": 1.0
},
{
"relation": "rationale_for",
"confidence": "EXTRACTED",
"source_file": "services/web_auth_roles.py",
"source_location": "L54",
"source_location": "L57",
"weight": 1.0,
"_src": "services_web_auth_roles_rationale_54",
"_src": "services_web_auth_roles_rationale_57",
"_tgt": "services_web_auth_roles_iter_user_menu_perm_codes",
"source": "services_web_auth_roles_iter_user_menu_perm_codes",
"target": "services_web_auth_roles_rationale_54",
"target": "services_web_auth_roles_rationale_57",
"confidence_score": 1.0
},
{
+2 -2
View File
@@ -165,7 +165,7 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/api/qc_sms_notification.py": 1780326875.7886882,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation_sample_collection.py": 1780457788.2998126,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/operations.py": 1779685679.1959367,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py": 1781232758.2748463,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py": 1781264533.3076127,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_delivery.py": 1779655584.820777,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/admin.py": 1779882001.7516146,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/env_detect.py": 1781145712.2433698,
@@ -184,7 +184,7 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/services/workflow_callback.py": 1778727966.7277644,
"/Users/wuzilong/work/00code/zkxw/backend/app/services/qc_work_order_fee_summary.py": 1781248273.0896494,
"/Users/wuzilong/work/00code/zkxw/backend/app/services/workflow_engine.py": 1778634664.6293883,
"/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py": 1778775532.8878627,
"/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py": 1781264627.3503358,
"/Users/wuzilong/work/00code/zkxw/backend/app/services/protocol_payment_installment.py": 1781076733.062029,
"/Users/wuzilong/work/00code/zkxw/backend/app/services/protocol_pay_mode_switch.py": 1781076762.2225447,
"/Users/wuzilong/work/00code/zkxw/backend/app/ws/__init__.py": 1778578258.105995
@@ -0,0 +1,499 @@
# 菜单结构调整实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 将 14 个一级菜单重组为 5 个一级菜单(市场、生产、质检、运营支撑、系统管理),新增菜单记录到 sys_menu 表并支持角色权限控制。
**Architecture:** 采用方案 A(一级菜单独立权限),每个新一级菜单设置独立 `perms`(如 `menu:market`),前端改造菜单组件支持两级菜单结构(顶部一级 + 左侧二级),后端同步改造菜单接口。
**Tech Stack:** Vue 3 + Element Plus + Pinia + FastAPI + SQLAlchemy
---
## 变更范围总览
| 层级 | 文件 | 变更类型 |
|------|------|----------|
| 前端路由 | `web-admin/src/router/modules/sqxp.ts` | 结构调整 |
| 前端菜单组件 | `web-admin/src/components/core/layouts/art-menus/*` | 支持两级结构 |
| 前端状态 | `web-admin/src/store/modules/menu.ts`, `setting.ts` | 新增一级菜单状态 |
| 后端菜单接口 | `backend/app/api/menu.py` | 新增一级菜单数据 |
| 后端权限服务 | `backend/app/services/web_auth_roles.py` | 支持一级菜单权限过滤 |
| 数据库 | `sys_menu` 表 | 新增 5 个一级菜单记录 |
---
## Task 1: 后端 - 更新菜单接口数据
**Files:**
- Modify: `backend/app/api/menu.py:10-773`
- [ ] **Step 1: 添加新一级菜单定义**
在 `STATIC_MENU_TREE` 开头添加 5 个新一级菜单:
```python
# 新增一级菜单定义(放在 STATIC_MENU_TREE 最前面)
TOP_MENU_MARKET = {
"id": "TOP00000000000000000000000000001",
"name": "MarketTop",
"path": "/market",
"component": "/index/index",
"meta": {
"title": "市场",
"icon": "ri:shopping-cart-line",
"keepAlive": False,
"isTopMenu": True,
"menuCode": "menu:market",
},
"children": [
# 细胞存储、科研捐赠、中试服务、基础实验、市场基础信息、临床应用
],
}
TOP_MENU_PRODUCTION = {
"id": "TOP00000000000000000000000000002",
"name": "ProductionTop",
"path": "/production-group",
"component": "/index/index",
"meta": {
"title": "生产",
"icon": "ri:factory-line",
"keepAlive": False,
"isTopMenu": True,
"menuCode": "menu:production",
},
"children": [
# 生产管理、生产基础信息
],
}
TOP_MENU_QUALITY = {
"id": "TOP00000000000000000000000000003",
"name": "QualityTop",
"path": "/quality-group",
"component": "/index/index",
"meta": {
"title": "质检",
"icon": "ri:shield-check-line",
"keepAlive": False,
"isTopMenu": True,
"menuCode": "menu:quality",
},
"children": [
# 质检管理、质检基础信息
],
}
TOP_MENU_OPERATIONS = {
"id": "TOP00000000000000000000000000004",
"name": "OperationsTop",
"path": "/operations-group",
"component": "/index/index",
"meta": {
"title": "运营支撑",
"icon": "ri:settings-3-line",
"keepAlive": False,
"isTopMenu": True,
"menuCode": "menu:operations",
},
"children": [
# 系统基础信息、运营支撑
],
}
TOP_MENU_SYSTEM = {
"id": "TOP00000000000000000000000000005",
"name": "SystemTop",
"path": "/system-manage",
"component": "/index/index",
"meta": {
"title": "系统管理",
"icon": "ri:server-line",
"keepAlive": False,
"isTopMenu": True,
"menuCode": "menu:system-manage",
},
"children": [
# 系统管理、工作流管理
],
}
```
- [ ] **Step 2: 调整原有菜单到新父级下**
将现有 14 个一级菜单作为二级菜单,重新分配 parent_id 和 path:
| 原菜单 | 新父级 | 新 path |
|--------|--------|---------|
| 细胞存储 | TOP00000000000000000000000000001 | `/market/cell-storage` |
| 科研捐赠 | TOP00000000000000000000000000001 | `/market/research-donation` |
| 中试服务 | TOP00000000000000000000000000001 | `/market/pilot-service` |
| 基础实验 | TOP00000000000000000000000000001 | `/market/basic-experiment` |
| 市场基础信息 | TOP00000000000000000000000000001 | `/market/market-info` |
| 临床应用 | TOP00000000000000000000000000002 | `/production-group/clinical-application` |
| 生产管理 | TOP00000000000000000000000000002 | `/production-group/production` |
| 生产基础信息 | TOP00000000000000000000000000002 | `/production-group/production-base` |
| 质检管理 | TOP00000000000000000000000000003 | `/quality-group/quality-manage` |
| 质检基础信息 | TOP00000000000000000000000000003 | `/quality-group/quality-base` |
| 系统基础信息 | TOP00000000000000000000000000004 | `/operations-group/system-base` |
| 运营支撑 | TOP00000000000000000000000000004 | `/operations-group/operations` |
| 系统管理 | TOP00000000000000000000000000005 | `/system-manage/system` |
| 工作流管理 | TOP00000000000000000000000000005 | `/system-manage/workflow` |
- [ ] **Step 3: 更新 STATIC_MENU_TREE 结构**
将 STATIC_MENU_TREE 改为只包含 5 个新一级菜单,每个一级菜单的 children 包含对应的原菜单作为二级菜单。
- [ ] **Step 4: Commit**
```bash
git add backend/app/api/menu.py
git commit -m "feat(menu): 重构菜单为5个一级分组菜单结构"
```
---
## Task 2: 后端 - 更新权限服务支持一级菜单过滤
**Files:**
- Modify: `backend/app/services/web_auth_roles.py`
- [ ] **Step 1: 添加一级菜单权限码常量**
```python
# 一级菜单权限码
TOP_MENU_PERMS = {"menu:market", "menu:production", "menu:quality", "menu:operations", "menu:system-manage"}
```
- [ ] **Step 2: 确保 iter_user_menu_perm_codes 返回一级菜单 perms**
当前 `iter_user_menu_perm_codes` 通过 `sys_role_menu → sys_menu` 查询用户拥有的菜单权限。一级菜单的 `perms`(如 `menu:market`)已经在 sys_menu 表中定义,因此无需修改查询逻辑。只需确保 sys_menu 表中有这 5 个一级菜单的记录(Task 3 处理)。
- [ ] **Step 3: Commit**
```bash
git add backend/app/services/web_auth_roles.py
git commit -m "feat(auth): 支持一级菜单权限码过滤"
```
---
## Task 3: 数据库 - 插入一级菜单数据到 sys_menu
**Files:**
- Create: `docs/sql/menu_restructuring.sql`
- [ ] **Step 1: 编写 SQL 插入脚本**
创建 SQL 脚本,包含 5 个一级菜单的 INSERT 语句(menu_type = 'M' 表示目录):
```sql
-- 一级菜单
INSERT INTO sys_menu (id, menu_name, parent_id, menu_type, path, component, perms, is_frame, visible, status, tenant_no, order_num, create_by, create_dept_id, create_time, update_by, update_time, del_flag) VALUES
('TOP00000000000000000000000000001', '市场', '0', 'M', '/market', '/index/index', 'menu:market', 1, '1', '1', 'zkxw', 1, 'system', '', NOW(), 'system', NOW(), 0),
('TOP00000000000000000000000000002', '生产', '0', 'M', '/production-group', '/index/index', 'menu:production', 1, '1', '1', 'zkxw', 2, 'system', '', NOW(), 'system', NOW(), 0),
('TOP00000000000000000000000000003', '质检', '0', 'M', '/quality-group', '/index/index', 'menu:quality', 1, '1', '1', 'zkxw', 3, 'system', '', NOW(), 'system', NOW(), 0),
('TOP00000000000000000000000000004', '运营支撑', '0', 'M', '/operations-group', '/index/index', 'menu:operations', 1, '1', '1', 'zkxw', 4, 'system', '', NOW(), 'system', NOW(), 0),
('TOP00000000000000000000000000005', '系统管理', '0', 'M', '/system-manage', '/index/index', 'menu:system-manage', 1, '1', '1', 'zkxw', 5, 'system', '', NOW(), 'system', NOW(), 0);
```
- [ ] **Step 2: Commit**
```bash
git add docs/sql/menu_restructuring.sql
git commit -m "feat(db): 添加5个一级菜单到sys_menu表"
```
---
## Task 4: 前端 - 改造 sqxp.ts 路由结构
**Files:**
- Modify: `web-admin/src/router/modules/sqxp.ts:1-1264`
- [ ] **Step 1: 添加新一级菜单定义**
在文件开头添加 5 个新一级菜单(与后端对应):
```typescript
// 新一级菜单
const MARKET_TOP_MENU: AppRouteRecord = {
id: 'TOP00000000000000000000000000001',
name: 'MarketTop',
path: '/market',
component: '/index/index',
meta: {
title: '市场',
icon: 'ri:shopping-cart-line',
keepAlive: false,
isTopMenu: true,
roles: ['admin'],
menuCode: 'menu:market'
},
children: [
// 细胞存储、科研捐赠、中试服务、基础实验、市场基础信息、临床应用
]
}
const PRODUCTION_TOP_MENU: AppRouteRecord = {
id: 'TOP00000000000000000000000000002',
name: 'ProductionTop',
path: '/production-group',
component: '/index/index',
meta: {
title: '生产',
icon: 'ri:factory-line',
keepAlive: false,
isTopMenu: true,
roles: ['admin'],
menuCode: 'menu:production'
},
children: [
// 临床应用、生产管理、生产基础信息
]
}
const QUALITY_TOP_MENU: AppRouteRecord = {
id: 'TOP00000000000000000000000000003',
name: 'QualityTop',
path: '/quality-group',
component: '/index/index',
meta: {
title: '质检',
icon: 'ri:shield-check-line',
keepAlive: false,
isTopMenu: true,
roles: ['admin'],
menuCode: 'menu:quality'
},
children: [
// 质检管理、质检基础信息
]
}
const OPERATIONS_TOP_MENU: AppRouteRecord = {
id: 'TOP00000000000000000000000000004',
name: 'OperationsTop',
path: '/operations-group',
component: '/index/index',
meta: {
title: '运营支撑',
icon: 'ri:settings-3-line',
keepAlive: false,
isTopMenu: true,
roles: ['admin'],
menuCode: 'menu:operations'
},
children: [
// 系统基础信息、运营支撑
]
}
const SYSTEM_TOP_MENU: AppRouteRecord = {
id: 'TOP00000000000000000000000000005',
name: 'SystemTop',
path: '/system-manage',
component: '/index/index',
meta: {
title: '系统管理',
icon: 'ri:server-line',
keepAlive: false,
isTopMenu: true,
roles: ['admin'],
menuCode: 'menu:system-manage'
},
children: [
// 系统管理、工作流管理
]
}
```
- [ ] **Step 2: 将原有 14 个菜单作为二级菜单移动到对应一级菜单下**
将细胞存储、科研捐赠、中试服务、基础实验、市场基础信息移到 MARKET_TOP_MENU.children 下;
将临床应用移到 PRODUCTION_TOP_MENU.children 下;
以此类推。
- [ ] **Step 3: 更新 export 导出**
将 sqxpAdminRoutes 改为只包含 5 个新一级菜单。
- [ ] **Step 4: Commit**
```bash
git add web-admin/src/router/modules/sqxp.ts
git commit -m "feat(router): 重构路由为5个一级菜单分组"
```
---
## Task 5: 前端 - 改造菜单组件支持两级结构
**Files:**
- Modify: `web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue`
- Modify: `web-admin/src/components/core/layouts/art-menus/art-mixed-menu/index.vue`
- Modify: `web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue`
- [ ] **Step 1: 识别当前活跃的一级菜单**
新增逻辑:根据当前路由路径判断所属的一级菜单,提取出 `activeTopMenuId`。
```typescript
// 在组件中添加 computed
const activeTopMenuId = computed(() => {
const path = route.path
// 从路径中提取一级菜单 path,如 /market/cell-storage → /market
const topPath = '/' + path.split('/')[1]
return topPath
})
```
- [ ] **Step 2: 分离一级菜单和二级菜单数据**
```typescript
// 过滤出一级菜单(isTopMenu: true)
const topMenus = computed(() => {
return props.list.filter(item => item.meta?.isTopMenu)
})
// 根据活跃的一级菜单获取二级菜单
const subMenus = computed(() => {
const active = topMenus.value.find(item => item.path === activeTopMenuId.value)
return active?.children || []
})
```
- [ ] **Step 3: 修改模板**
水平菜单只显示一级菜单,点击后更新 activeTopMenuId,并触发侧边栏显示对应的二级菜单。
- [ ] **Step 4: Commit**
```bash
git add web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue
git add web-admin/src/components/core/layouts/art-menus/art-mixed-menu/index.vue
git commit -m "feat(menu): 改造顶部菜单支持两级结构"
```
---
## Task 6: 前端 - 改造侧边栏组件
**Files:**
- Modify: `web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue`
- [ ] **Step 1: 修改菜单列表计算逻辑**
当前 `menuList` computed 根据 `isTopLeftMenu` 或 `isDualMenu` 返回对应子菜单。改为:
- 当存在活跃一级菜单时,返回该一级菜单的 children
- 否则返回完整菜单列表(兼容一级菜单页面)
```typescript
const menuList = computed(() => {
const menuStore = useMenuStore()
const allMenus = menuStore.menuList
if (!isTopLeftMenu.value && !isDualMenu.value) {
return allMenus
}
// 处理 iframe 路径
if (isIframe(route.path)) {
return findIframeMenuList(route.path, allMenus)
}
// 一级菜单页面直接返回空
if (route.meta.isFirstLevel) {
return []
}
// 返回当前一级菜单的子菜单
const topPath = '/' + route.path.split('/')[1]
const currentTopMenu = allMenus.find(menu =>
menu.meta?.isTopMenu && menu.path === topPath
)
if (currentTopMenu?.children) {
return currentTopMenu.children.filter((child: AppRouteRecord) => !child.meta?.isHide)
}
return []
})
```
- [ ] **Step 2: Commit**
```bash
git add web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue
git commit -m "feat(menu): 改造侧边栏显示二级菜单"
```
---
## Task 7: 前端 - 更新菜单状态管理
**Files:**
- Modify: `web-admin/src/store/modules/menu.ts`
- Modify: `web-admin/src/store/modules/setting.ts`
- [ ] **Step 1: 在 menu.ts 中添加活跃一级菜单状态**
```typescript
/** 活跃的一级菜单路径 */
const activeTopMenuPath = ref('')
/** 设置活跃一级菜单 */
const setActiveTopMenuPath = (path: string) => {
activeTopMenuPath.value = path
}
```
- [ ] **Step 2: Commit**
```bash
git add web-admin/src/store/modules/menu.ts
git commit -m "feat(store): 添加一级菜单活跃状态管理"
```
---
## Task 8: 测试验证
- [ ] **Step 1: 启动后端服务**
```bash
cd backend && ./start-local.sh
```
- [ ] **Step 2: 启动前端服务**
```bash
cd web-admin && pnpm dev
```
- [ ] **Step 3: 验证菜单显示**
1. 登录管理端
2. 检查顶部是否显示 5 个一级菜单
3. 点击一级菜单,检查左侧是否显示对应的二级菜单
4. 验证权限控制:没有 `menu:market` 权限的角色不应看到「市场」菜单
- [ ] **Step 4: Commit**
```bash
git add -A
git commit -m "test: 验证菜单结构调整功能"
```
---
## 执行方式
**Two execution options:**
**1. Subagent-Driven (recommended)** - I dispatch a fresh subagent per task, review between tasks, fast iteration
**2. Inline Execution** - Execute tasks in this session using executing-plans, batch execution with checkpoints
**Which approach?**
+24 -15
View File
@@ -3652,14 +3652,14 @@
"label": "logSidebarMenu()",
"file_type": "code",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L158"
"source_location": "L159"
},
{
"id": "art_sidebar_menu_index_if",
"label": "if()",
"file_type": "code",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L249"
"source_location": "L271"
},
{
"id": "components_core_layouts_art_menus_art_sidebar_menu_widget_sidebarsubmenu_vue",
@@ -8720,14 +8720,14 @@
"label": "fetchQcMaterialLinkedTaskUsages()",
"file_type": "code",
"source_file": "api/qc-material-usage.ts",
"source_location": "L87"
"source_location": "L84"
},
{
"id": "api_qc_material_usage_fetchmyqcmaterialusagelist",
"label": "fetchMyQcMaterialUsageList()",
"file_type": "code",
"source_file": "api/qc-material-usage.ts",
"source_location": "L93"
"source_location": "L90"
},
{
"id": "api_qc_material_ts",
@@ -21844,7 +21844,7 @@
},
{
"source": "components_core_layouts_art_menus_art_sidebar_menu_index_vue",
"target": "components_core_layouts_art_menus_art_sidebar_menu_widget_sidebarsubmenu_vue",
"target": "users_wuzilong_work_00code_zkxw_web_admin_src_types_router",
"relation": "imports_from",
"confidence": "EXTRACTED",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
@@ -21853,7 +21853,7 @@
},
{
"source": "components_core_layouts_art_menus_art_sidebar_menu_index_vue",
"target": "users_wuzilong_work_00code_zkxw_web_admin_src_hooks_core_usecommon",
"target": "components_core_layouts_art_menus_art_sidebar_menu_widget_sidebarsubmenu_vue",
"relation": "imports_from",
"confidence": "EXTRACTED",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
@@ -21862,20 +21862,29 @@
},
{
"source": "components_core_layouts_art_menus_art_sidebar_menu_index_vue",
"target": "core",
"target": "users_wuzilong_work_00code_zkxw_web_admin_src_hooks_core_usecommon",
"relation": "imports_from",
"confidence": "EXTRACTED",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L144",
"weight": 1.0
},
{
"source": "components_core_layouts_art_menus_art_sidebar_menu_index_vue",
"target": "core",
"relation": "imports_from",
"confidence": "EXTRACTED",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L145",
"weight": 1.0
},
{
"source": "components_core_layouts_art_menus_art_sidebar_menu_index_vue",
"target": "art_sidebar_menu_index_logsidebarmenu",
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L158",
"source_location": "L159",
"weight": 1.0
},
{
@@ -21884,7 +21893,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L249",
"source_location": "L271",
"weight": 1.0
},
{
@@ -21893,7 +21902,7 @@
"relation": "calls",
"confidence": "EXTRACTED",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L250",
"source_location": "L272",
"weight": 1.0
},
{
@@ -28859,7 +28868,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "api/qc-material-usage.ts",
"source_location": "L87",
"source_location": "L84",
"weight": 1.0
},
{
@@ -28868,7 +28877,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "api/qc-material-usage.ts",
"source_location": "L93",
"source_location": "L90",
"weight": 1.0
},
{
@@ -43273,7 +43282,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "api/qc-material-usage.ts",
"source_location": "L81",
"source_location": "L78",
"weight": 1.0
},
{
@@ -43283,7 +43292,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "api/qc-material-usage.ts",
"source_location": "L88",
"source_location": "L85",
"weight": 1.0
},
{
@@ -43293,7 +43302,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "api/qc-material-usage.ts",
"source_location": "L103",
"source_location": "L100",
"weight": 1.0
},
{
+1 -1
View File
@@ -1,7 +1,7 @@
# Graph Report - src (2026-06-12)
## Corpus Check
- Large corpus: 704 files · ~444,651 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
- Large corpus: 704 files · ~444,888 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
## Summary
- 2103 nodes · 2742 edges · 53 communities detected
+13 -13
View File
@@ -4696,7 +4696,7 @@
"label": "logSidebarMenu()",
"file_type": "code",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L158",
"source_location": "L159",
"id": "art_sidebar_menu_index_logsidebarmenu",
"community": 52,
"norm_label": "logsidebarmenu()"
@@ -4705,7 +4705,7 @@
"label": "if()",
"file_type": "code",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L249",
"source_location": "L271",
"id": "art_sidebar_menu_index_if",
"community": 52,
"norm_label": "if()"
@@ -11212,7 +11212,7 @@
"label": "fetchQcMaterialLinkedTaskUsages()",
"file_type": "code",
"source_file": "api/qc-material-usage.ts",
"source_location": "L87",
"source_location": "L84",
"id": "api_qc_material_usage_fetchqcmateriallinkedtaskusages",
"community": 0,
"norm_label": "fetchqcmateriallinkedtaskusages()"
@@ -11221,7 +11221,7 @@
"label": "fetchMyQcMaterialUsageList()",
"file_type": "code",
"source_file": "api/qc-material-usage.ts",
"source_location": "L93",
"source_location": "L90",
"id": "api_qc_material_usage_fetchmyqcmaterialusagelist",
"community": 0,
"norm_label": "fetchmyqcmaterialusagelist()"
@@ -27756,7 +27756,7 @@
"relation": "imports_from",
"confidence": "EXTRACTED",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L142",
"source_location": "L143",
"weight": 1.0,
"_src": "components_core_layouts_art_menus_art_sidebar_menu_index_vue",
"_tgt": "components_core_layouts_art_menus_art_sidebar_menu_widget_sidebarsubmenu_vue",
@@ -27768,7 +27768,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L158",
"source_location": "L159",
"weight": 1.0,
"_src": "components_core_layouts_art_menus_art_sidebar_menu_index_vue",
"_tgt": "art_sidebar_menu_index_logsidebarmenu",
@@ -27780,7 +27780,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L249",
"source_location": "L271",
"weight": 1.0,
"_src": "components_core_layouts_art_menus_art_sidebar_menu_index_vue",
"_tgt": "art_sidebar_menu_index_if",
@@ -27792,7 +27792,7 @@
"relation": "calls",
"confidence": "EXTRACTED",
"source_file": "components/core/layouts/art-menus/art-sidebar-menu/index.vue",
"source_location": "L250",
"source_location": "L272",
"weight": 1.0,
"_src": "art_sidebar_menu_index_if",
"_tgt": "art_sidebar_menu_index_logsidebarmenu",
@@ -39648,7 +39648,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "api/qc-material-usage.ts",
"source_location": "L87",
"source_location": "L84",
"weight": 1.0,
"_src": "api_qc_material_usage_ts",
"_tgt": "api_qc_material_usage_fetchqcmateriallinkedtaskusages",
@@ -39660,7 +39660,7 @@
"relation": "contains",
"confidence": "EXTRACTED",
"source_file": "api/qc-material-usage.ts",
"source_location": "L93",
"source_location": "L90",
"weight": 1.0,
"_src": "api_qc_material_usage_ts",
"_tgt": "api_qc_material_usage_fetchmyqcmaterialusagelist",
@@ -39685,7 +39685,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "api/qc-material-usage.ts",
"source_location": "L81",
"source_location": "L78",
"weight": 1.0,
"_src": "api_qc_material_usage_fetchqcmaterialrequisitionoptions",
"_tgt": "process_processroutetab_get",
@@ -39697,7 +39697,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "api/qc-material-usage.ts",
"source_location": "L88",
"source_location": "L85",
"weight": 1.0,
"_src": "api_qc_material_usage_fetchqcmateriallinkedtaskusages",
"_tgt": "process_processroutetab_get",
@@ -39709,7 +39709,7 @@
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "api/qc-material-usage.ts",
"source_location": "L103",
"source_location": "L100",
"weight": 1.0,
"_src": "api_qc_material_usage_fetchmyqcmaterialusagelist",
"_tgt": "process_processroutetab_get",
+17 -17
View File
@@ -17,13 +17,13 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/common/index.ts": 1778582068.0254738,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/directive/directive.d.ts": 1778582068.026978,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/api/api.d.ts": 1778582068.0246184,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1781246166.8389935,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1781246095.71424,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1781262668.3419724,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1781262660.342241,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/store/index.ts": 1778582068.0293276,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/router/index.ts": 1780480414.9574106,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/locales/index.ts": 1778582068.004279,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/config/pilot-biz-type.ts": 1781080088.8866432,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/config/setting.ts": 1778582067.9954739,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/config/setting.ts": 1781261966.3458033,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/config/index.ts": 1780480414.9542737,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/config/modules/component.ts": 1778582067.9943824,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/config/modules/festival.ts": 1778582067.9949014,
@@ -109,7 +109,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-drag-verify/index.vue": 1780480414.9471714,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-wang-editor/index.vue": 1780480414.9483848,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-button-table/index.vue": 1780480414.9469068,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/widget/art-icon-button/index.vue": 1779525781.578175,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/widget/art-icon-button/index.vue": 1781261966.3424845,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-bar-chart-card/index.vue": 1779525781.5786,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-data-list-card/index.vue": 1779525781.5789726,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-timeline-list-card/index.vue": 1779525781.5793364,
@@ -151,10 +151,10 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue": 1780480414.9528105,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-chat-window/index.vue": 1780480414.949035,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-page-content/index.vue": 1780480414.9517472,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue": 1779525781.5938804,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue": 1781265024.879481,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/widget/HorizontalSubmenu.vue": 1779525781.5942907,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-mixed-menu/index.vue": 1779525781.5947194,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue": 1780480414.950054,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-mixed-menu/index.vue": 1781265047.1098888,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue": 1781265171.7087455,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/widget/SidebarSubmenu.vue": 1780480414.9512155,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-fireworks-effect/index.vue": 1779525781.5963395,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-global-search/index.vue": 1780480414.949282,
@@ -162,8 +162,8 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-fast-enter/index.vue": 1779525781.5979466,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-screen-lock/index.vue": 1780480414.9519973,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-breadcrumb/index.vue": 1779525781.5987902,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-header-bar/index.vue": 1780480414.949582,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue": 1780540514.104913,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-header-bar/index.vue": 1781261966.333767,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue": 1781261966.3381455,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-header-bar/widget/UserProfileDialog.vue": 1780540511.8256087,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/theme/theme-svg/index.vue": 1779525781.6001027,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/views/result/ArtResultPage.vue": 1779525781.6004124,
@@ -176,7 +176,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/text-effect/art-festival-text-scroll/index.vue": 1779525781.6024969,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/base/art-svg-icon/index.vue": 1780480414.9462214,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/base/art-back-to-top/index.vue": 1780480414.9458482,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/base/art-logo/index.vue": 1780480414.9460301,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/base/art-logo/index.vue": 1781261966.3224938,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/media/art-video-player/index.vue": 1779525781.6045322,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/media/art-cutter-img/index.vue": 1779525781.6051006,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-transport-form-section/index.vue": 1781071871.112025,
@@ -215,8 +215,8 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/leave.ts": 1778666177.2933538,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-reception-check-item.ts": 1779007909.2933023,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production.ts": 1779790323.3656075,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/infusion-schedule-handover.ts": 1780455576.8827417,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts": 1779968240.1929023,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/infusion-schedule-handover.ts": 1781265180.640469,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts": 1781265180.6784458,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-third-party-item.ts": 1779017836.101254,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/env-detect-record.ts": 1781145722.88074,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts": 1780478965.1159081,
@@ -241,7 +241,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/env-detect-item.ts": 1781145721.2792275,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts": 1779692910.5154753,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-stock-check.ts": 1781160560.139552,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts": 1781231486.6247969,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts": 1781265180.7528677,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts": 1781160507.2869322,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-sms-notification.ts": 1780326875.7881882,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/system.ts": 1779790323.5636237,
@@ -350,7 +350,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process/ProcessRouteTab.vue": 1779864199.4381752,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-category/index.vue": 1779864070.4019275,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-category/OutputTypeTab.vue": 1779864078.964701,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/index/index.vue": 1779525781.6949234,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/index/index.vue": 1781261760.654956,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/index.vue": 1781248364.9092808,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderSingleCard.vue": 1781248310.590171,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderFeeSummaryBar.vue": 1781247653.7613583,
@@ -358,7 +358,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderTaskSubList.vue": 1781245816.5224924,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/OutboundQcViewDialog.vue": 1781247706.6829572,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderCardList.vue": 1781245766.0003755,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue": 1781248366.9077792,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue": 1781248391.8761723,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception-check-item/index.vue": 1779857055.2939715,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/lab-test-item/index.vue": 1779864504.1085482,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/lab-test-item/ThirdPartyCompanyTab.vue": 1779864511.579237,
@@ -436,7 +436,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/index.ts": 1778582068.0218356,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/worktab.ts": 1780480414.9568844,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/table.ts": 1779257771.098434,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/menu.ts": 1780480414.9564605,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/menu.ts": 1781265272.7543552,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/setting.ts": 1778582068.0225098,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/user.ts": 1780540187.1384017,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/routesAlias.ts": 1778582068.0211735,
@@ -449,7 +449,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/RoutePermissionValidator.ts": 1778582068.0127926,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/index.ts": 1778582068.0138035,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/IframeRouteManager.ts": 1778582068.0121944,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts": 1781232757.2242923,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts": 1781264931.192182,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/index.ts": 1780480414.9561174,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/exception.ts": 1780480414.9559598,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/routes/staticRoutes.ts": 1780480414.9562852,
@@ -44,7 +44,12 @@ export function saveInfusionScheduleOutboundHandover(
remark?: string
cells: { cellProductId: string; remark?: string }[]
qcMaterials: { materialId: string; qty: number; remark?: string }[]
paperMaterials: { paperName: string; copies: number; attachmentUrl: string; remark?: string }[]
paperMaterials: {
paperName: string
copies: number
attachmentUrl: string
remark?: string
}[]
}
handover: {
handoverUserId: string
+11 -11
View File
@@ -4,7 +4,7 @@ import type {
OutboundQcDetailPatient,
OutboundQcDetailInfusionPlan,
OutboundQcDetailInfusionSchedule,
OutboundQcDetailProduct,
OutboundQcDetailProduct
} from '@/api/qc-work-order'
type PageList<T> = {
@@ -45,7 +45,7 @@ export type {
OutboundQcDetailPatient,
OutboundQcDetailInfusionPlan,
OutboundQcDetailInfusionSchedule,
OutboundQcDetailProduct,
OutboundQcDetailProduct
}
export type OutboundReviewInfo = {
@@ -165,13 +165,13 @@ export function fetchOutboundReleaseReviewList(params?: {
}) {
return request.get<PageList<OutboundReleaseReview>>({
url: '/web/admin/pilot-release-reviews',
params,
params
})
}
export function fetchOutboundReleaseReviewDetail(scheduleId: string) {
return request.get<OutboundReleaseReviewDetail>({
url: `/web/admin/pilot-release-reviews/${scheduleId}/detail`,
url: `/web/admin/pilot-release-reviews/${scheduleId}/detail`
})
}
@@ -185,7 +185,7 @@ export function submitOutboundReleaseReview(
) {
return request.put<OutboundReleaseReview>({
url: `/web/admin/pilot-release-reviews/${scheduleId}/review`,
data,
data
})
}
@@ -197,32 +197,32 @@ export function batchReviewOutboundRelease(data: {
}) {
return request.put<void>({
url: '/web/admin/pilot-release-reviews/batch-review',
data,
data
})
}
export function fetchOutboundReleaseMaterial(scheduleId: string) {
return request.get<OutboundReleaseMaterialDetail>({
url: `/web/admin/pilot-release-reviews/${scheduleId}/outbound-materials`,
url: `/web/admin/pilot-release-reviews/${scheduleId}/outbound-materials`
})
}
export function fetchReleaseReviewList(params: { scheduleId: string }) {
return request.get<any>({
url: `/web/admin/pilot-release-reviews/${params.scheduleId}/detail`,
url: `/web/admin/pilot-release-reviews/${params.scheduleId}/detail`
})
}
export function updateReleaseReview(data: { id: string; reviewConclusion: string }) {
return request.put<any>({
url: `/web/admin/pilot-release-reviews/${data.id}/review`,
data: { reviewConclusion: data.reviewConclusion },
data: { reviewConclusion: data.reviewConclusion }
})
}
export function deleteReleaseReview(data: { id: string }) {
return request.delete<any>({
url: `/web/admin/pilot-release-reviews/${data.id}`,
url: `/web/admin/pilot-release-reviews/${data.id}`
})
}
@@ -237,6 +237,6 @@ export function saveOutboundReleaseMaterial(
) {
return request.put<OutboundReleaseMaterialDetail>({
url: `/web/admin/pilot-release-reviews/${scheduleId}/outbound-materials`,
data,
data
})
}
+1 -4
View File
@@ -74,10 +74,7 @@ export function fetchQcMaterialUsageList(params?: {
})
}
export function fetchQcMaterialRequisitionOptions(params?: {
keyword?: string
limit?: number
}) {
export function fetchQcMaterialRequisitionOptions(params?: { keyword?: string; limit?: number }) {
return request.get<QcMaterialRequisitionOption[]>({
url: '/web/admin/qc-material-requisition-options',
params
+1 -1
View File
@@ -28,7 +28,7 @@ import { SystemThemeEnum, MenuThemeEnum, MenuTypeEnum, ContainerWidthEnum } from
*/
export const SETTING_DEFAULT_CONFIG = {
/** 菜单类型 */
menuType: MenuTypeEnum.LEFT,
menuType: MenuTypeEnum.TOP_LEFT,
/** 菜单展开宽度 */
menuOpenWidth: 230,
/** 菜单是否展开 */
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_horizontal_menu_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_horizontal_menu_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_horizontal_menu_widget_horizontalsubmenu_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue", "source_location": "L29", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_horizontal_menu_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_store_modules_setting", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue", "source_location": "L30", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_infusion_schedule_handover_ts", "label": "infusion-schedule-handover.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/infusion-schedule-handover.ts", "source_location": "L1"}, {"id": "api_infusion_schedule_handover_fetchinfusionscheduleoutboundhandover", "label": "fetchInfusionScheduleOutboundHandover()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/infusion-schedule-handover.ts", "source_location": "L34"}, {"id": "api_infusion_schedule_handover_saveinfusionscheduleoutboundhandover", "label": "saveInfusionScheduleOutboundHandover()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/infusion-schedule-handover.ts", "source_location": "L40"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_infusion_schedule_handover_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_http", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/infusion-schedule-handover.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_infusion_schedule_handover_ts", "target": "api_infusion_schedule_handover_fetchinfusionscheduleoutboundhandover", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/infusion-schedule-handover.ts", "source_location": "L34", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_infusion_schedule_handover_ts", "target": "api_infusion_schedule_handover_saveinfusionscheduleoutboundhandover", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/infusion-schedule-handover.ts", "source_location": "L40", "weight": 1.0}], "raw_calls": [{"caller_nid": "api_infusion_schedule_handover_fetchinfusionscheduleoutboundhandover", "callee": "get", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/infusion-schedule-handover.ts", "source_location": "L35"}, {"caller_nid": "api_infusion_schedule_handover_saveinfusionscheduleoutboundhandover", "callee": "put", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/infusion-schedule-handover.ts", "source_location": "L65"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_usage_ts", "label": "qc-material-usage.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L1"}, {"id": "api_qc_material_usage_fetchqcmaterialusagelist", "label": "fetchQcMaterialUsageList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L61"}, {"id": "api_qc_material_usage_fetchqcmaterialrequisitionoptions", "label": "fetchQcMaterialRequisitionOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L77"}, {"id": "api_qc_material_usage_fetchqcmateriallinkedtaskusages", "label": "fetchQcMaterialLinkedTaskUsages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L84"}, {"id": "api_qc_material_usage_fetchmyqcmaterialusagelist", "label": "fetchMyQcMaterialUsageList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L90"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_usage_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_http", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_usage_ts", "target": "api_qc_material_usage_fetchqcmaterialusagelist", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L61", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_usage_ts", "target": "api_qc_material_usage_fetchqcmaterialrequisitionoptions", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L77", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_usage_ts", "target": "api_qc_material_usage_fetchqcmateriallinkedtaskusages", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L84", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_usage_ts", "target": "api_qc_material_usage_fetchmyqcmaterialusagelist", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L90", "weight": 1.0}], "raw_calls": [{"caller_nid": "api_qc_material_usage_fetchqcmaterialusagelist", "callee": "get", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L71"}, {"caller_nid": "api_qc_material_usage_fetchqcmaterialrequisitionoptions", "callee": "get", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L78"}, {"caller_nid": "api_qc_material_usage_fetchqcmateriallinkedtaskusages", "callee": "get", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L85"}, {"caller_nid": "api_qc_material_usage_fetchmyqcmaterialusagelist", "callee": "get", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material-usage.ts", "source_location": "L100"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_work_order_qcworkorderprotocolpaymentpanel_vue", "label": "QcWorkOrderProtocolPaymentPanel.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_mixed_menu_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-mixed-menu/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_outbound_release_review_ts", "label": "outbound-release-review.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L1"}, {"id": "api_outbound_release_review_fetchoutboundreleasereviewlist", "label": "fetchOutboundReleaseReviewList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L154"}, {"id": "api_outbound_release_review_fetchoutboundreleasereviewdetail", "label": "fetchOutboundReleaseReviewDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L172"}, {"id": "api_outbound_release_review_submitoutboundreleasereview", "label": "submitOutboundReleaseReview()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L178"}, {"id": "api_outbound_release_review_batchreviewoutboundrelease", "label": "batchReviewOutboundRelease()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L192"}, {"id": "api_outbound_release_review_fetchoutboundreleasematerial", "label": "fetchOutboundReleaseMaterial()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L204"}, {"id": "api_outbound_release_review_fetchreleasereviewlist", "label": "fetchReleaseReviewList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L210"}, {"id": "api_outbound_release_review_updatereleasereview", "label": "updateReleaseReview()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L216"}, {"id": "api_outbound_release_review_deletereleasereview", "label": "deleteReleaseReview()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L223"}, {"id": "api_outbound_release_review_saveoutboundreleasematerial", "label": "saveOutboundReleaseMaterial()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L229"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_outbound_release_review_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_http", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_outbound_release_review_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_outbound_release_review_ts", "target": "api_outbound_release_review_fetchoutboundreleasereviewlist", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L154", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_outbound_release_review_ts", "target": "api_outbound_release_review_fetchoutboundreleasereviewdetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L172", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_outbound_release_review_ts", "target": "api_outbound_release_review_submitoutboundreleasereview", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L178", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_outbound_release_review_ts", "target": "api_outbound_release_review_batchreviewoutboundrelease", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L192", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_outbound_release_review_ts", "target": "api_outbound_release_review_fetchoutboundreleasematerial", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts", "source_location": "L204", "wLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_store_modules_menu_ts", "label": "menu.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/menu.ts", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_store_modules_menu_ts", "target": "pinia", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/menu.ts", "source_location": "L31", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_store_modules_menu_ts", "target": "vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/menu.ts", "source_location": "L32", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_store_modules_menu_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_types_router", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/menu.ts", "source_location": "L33", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_store_modules_menu_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/menu.ts", "source_location": "L34", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_store_modules_menu_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_router", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/menu.ts", "source_location": "L35", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L1"}, {"id": "art_sidebar_menu_index_logsidebarmenu", "label": "logSidebarMenu()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L159"}, {"id": "art_sidebar_menu_index_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L271"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_index_vue", "target": "pinia", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L135", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_store_modules_setting", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L136", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_enums_appenum", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L137", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_store_modules_menu", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L138", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_navigation", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L139", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_navigation", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L140", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_router_sidebar_menu_filter", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L141", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_types_router", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L142", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_widget_sidebarsubmenu_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue", "source_location": "L143", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_menus_art_sidebar_menu_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_hooks_core_usecommon", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_router_modules_sqxp_ts", "label": "sqxp.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_router_modules_sqxp_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_types_router", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
+19 -19
View File
@@ -13,7 +13,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'TOP00000000000000000000000000001',
name: 'Market',
path: '/market',
component: '/index/index',
component: '',
meta: {
title: '市场',
icon: 'ri:shopping-cart-line',
@@ -28,7 +28,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'CEL00000000000000000000000000001',
name: 'CellStorage',
path: 'cell-storage',
component: '/index/index',
component: '',
meta: {
title: '细胞存储',
icon: 'ri:test-tube-line',
@@ -172,7 +172,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'RSC00000000000000000000000000001',
name: 'ResearchDonation',
path: 'research-donation',
component: '/index/index',
component: '',
meta: {
title: '科研捐赠',
icon: 'ri:hand-heart-line',
@@ -222,7 +222,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'PIL00000000000000000000000000001',
name: 'PilotService',
path: 'pilot-service',
component: '/index/index',
component: '',
meta: {
title: '中试服务',
icon: 'ri:flask-line',
@@ -288,7 +288,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'BEX00000000000000000000000000001',
name: 'BasicExperiment',
path: 'basic-experiment',
component: '/index/index',
component: '',
meta: {
title: '基础实验',
icon: 'ri:flask-line',
@@ -340,7 +340,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'MKT00000000000000000000000000001',
name: 'MarketInfo',
path: 'market-info',
component: '/index/index',
component: '',
meta: {
title: '市场基础信息',
icon: 'ri:price-tag-3-line',
@@ -540,7 +540,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'TOP00000000000000000000000000002',
name: 'Production',
path: '/production-group',
component: '/index/index',
component: '',
meta: {
title: '生产',
icon: 'ri:factory-line',
@@ -555,7 +555,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'CLI00000000000000000000000000001',
name: 'ClinicalApplication',
path: 'clinical-application',
component: '/index/index',
component: '',
meta: {
title: '临床应用',
icon: 'ri:heart-pulse-line',
@@ -660,7 +660,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'PRM00000000000000000000000000001',
name: 'ProductionManage',
path: 'production',
component: '/index/index',
component: '',
meta: {
title: '生产管理',
icon: 'grid',
@@ -732,7 +732,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'PRB00000000000000000000000000001',
name: 'ProductionBase',
path: 'production-base',
component: '/index/index',
component: '',
meta: {
title: '生产基础信息',
icon: 'ri:tools-line',
@@ -844,7 +844,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'TOP00000000000000000000000000003',
name: 'Quality',
path: '/quality-group',
component: '/index/index',
component: '',
meta: {
title: '质检',
icon: 'ri:shield-check-line',
@@ -859,7 +859,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'QCM00000000000000000000000000001',
name: 'QualityManage',
path: 'quality-manage',
component: '/index/index',
component: '',
meta: {
title: '质检管理',
icon: 'ri:shield-check-line',
@@ -952,7 +952,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'QCB00000000000000000000000000001',
name: 'QualityBase',
path: 'quality-base',
component: '/index/index',
component: '',
meta: {
title: '质检基础信息',
icon: 'ri:clipboard-line',
@@ -1041,7 +1041,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'TOP00000000000000000000000000004',
name: 'OperationsGroup',
path: '/operations-group',
component: '/index/index',
component: '',
meta: {
title: '运营支撑',
icon: 'ri:settings-3-line',
@@ -1056,7 +1056,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'SYSB000000000000000000000000000001',
name: 'SystemBase',
path: 'system-base',
component: '/index/index',
component: '',
meta: {
title: '系统基础信息',
icon: 'ri:archive-line',
@@ -1105,7 +1105,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'OPS00000000000000000000000000001',
name: 'Operations',
path: 'operations',
component: '/index/index',
component: '',
meta: {
title: '运营支撑',
icon: 'operation',
@@ -1148,7 +1148,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'TOP00000000000000000000000000005',
name: 'SystemManageGroup',
path: '/system-manage',
component: '/index/index',
component: '',
meta: {
title: '系统管理',
icon: 'ri:server-line',
@@ -1163,7 +1163,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'SYSM000000000000000000000000000001',
name: 'SystemManage',
path: 'system',
component: '/index/index',
component: '',
meta: {
title: '系统管理',
icon: 'ri:settings-3-line',
@@ -1263,7 +1263,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
id: 'WKF00000000000000000000000000001',
name: 'Workflow',
path: 'workflow',
component: '/index/index',
component: '',
meta: {
title: '工作流管理',
icon: 'workflow',