From 781b8b3e072a4e00b1cee56f961280c753cbb460 Mon Sep 17 00:00:00 2001
From: zzw <228544128@qq.com>
Date: 星期二, 06 十月 2026 17:34:29 +0800
Subject: [PATCH] feat: add assigned scope to role permission settings

---
 HANDOFF.md                                                     |   27 +++++++++++++
 emergency-repair-web/src/views/system/RolePermissionDialog.vue |   43 +++++++++++++++++++--
 requirement/交接文件_2026.10.3.md                                  |   24 ++++++++++++
 requirement/改进20261003.txt                                     |    2 
 4 files changed, 91 insertions(+), 5 deletions(-)

diff --git a/HANDOFF.md b/HANDOFF.md
index bdd4431..194a830 100644
--- a/HANDOFF.md
+++ b/HANDOFF.md
@@ -826,3 +826,30 @@
 - 瀹屽伐鏌ラ槄鎺ュ彛褰撳墠涓�娆¤繑鍥炲叏閮ㄥ尮閰嶇粨鏋滐紝娌℃湁鍒嗛〉锛涙暟鎹噺杩涗竴姝ュ澶ф椂寤鸿澧炲姞鍒嗛〉鎴栧鍑虹瓥鐣ャ��
 - 涓嶈鎻愪氦 `.codex-run`銆丱ffice 閿佹枃浠舵垨 `emergency-repair-web/public/鏂板缓 鏂囨湰鏂囨。.txt`銆�
 - 鏈疆浠g爜銆侀渶姹傛枃浠跺拰浜ゆ帴璁板綍涓�骞舵彁浜ゅ苟鎺ㄩ�佸叕鍙� Git 浠撳簱 `main` 鍒嗘敮銆�
+
+## 21. 鏀跺熬蹇収锛�2026-10-06 鍛ㄤ竴锛岄渶姹� 21 鏉冮檺璁剧疆鑼冨洿鍒囨崲锛�
+
+**鏈疆瀹屾垚鍐呭**
+- 瑙掕壊绠$悊鈥滄潈闄愯缃�濆脊绐楀鍔犫�滃叏閮� / 宸茶缃�濆垏鎹紝浜や簰鏂瑰紡涓庘�滅敤鎴疯缃�濅繚鎸佷竴鑷淬��
+- 鈥滃叏閮ㄢ�濇樉绀哄畬鏁磋彍鍗曞強鎸夐挳鏉冮檺鏍戯紝淇濈暀鈥滃叏閫夆�濆拰鍘熸湁鏉冮檺鍙嶆樉銆�
+- 鈥滃凡璁剧疆鈥濅粎鏄剧ず褰撳墠瑙掕壊宸叉巿鏉冭妭鐐瑰強鍏剁埗绾ц矾寰勶紱娌℃湁宸茶缃潈闄愭椂鏄剧ず绌虹姸鎬佹彁绀恒��
+- 鍒囨崲鑼冨洿鏃朵細淇濈暀褰撳墠灏氭湭淇濆瓨鐨勫嬀閫夌姸鎬侊紝鍒囧洖鈥滃叏閮ㄢ�濆悗鎭㈠瀹屾暣鏍戝強褰撳墠閫変腑鏉冮檺銆�
+- 寮圭獥姣忔閲嶆柊鎵撳紑榛樿鍥炲埌鈥滃叏閮ㄢ�濄��
+
+**涓昏鏂囦欢**
+- `emergency-repair-web/src/views/system/RolePermissionDialog.vue`
+- `requirement/鏀硅繘20261003.txt`锛堣ˉ鍏呴渶姹� 21 鐨勮寖鍥村垏鎹㈠彛寰勶級
+
+**楠岃瘉缁撴灉**
+- 鍓嶇 `npm run build` 閫氳繃锛屼粎鏈夋棦鏈夊寘浣撶Н鍛婅銆�
+- `node .codex-run/verify-req21-22.js` 閫氳繃锛氬乏渚ф棤鈥滆彍鍗曟潈闄愮鐞嗏�濓紝瑙掕壊绠$悊瀛樺湪鈥滄潈闄愯缃�濄��
+- 鍏ㄩ儴瑙嗗浘鏄剧ず 119 涓閫夋銆�13 涓凡鍕鹃�夈��1 涓崐閫夛紱宸茶缃鍥炬樉绀� 14 涓妭鐐癸紝鍧囦负褰撳墠宸茶缃妭鐐规垨鐖剁骇璺緞锛涘垏鍥炲叏閮ㄥ悗鍕鹃�夌姸鎬佹仮澶嶏紝鏃犵綉缁滃紓甯搞��
+- 鎴浘锛歚.codex-run/role-permission-assigned-scope.png`銆�
+
+**褰撳墠杩愯鐘舵�侊紙2026-10-06锛�**
+- 鍓嶇 `http://localhost:8082`锛涘悗绔� `http://127.0.0.1:8091`锛汥M8 `127.0.0.1:5236`锛汦dge CDP `9222`銆�
+- 鐧诲綍 `admin / admin123`锛涙暟鎹簱 `SYSDBA/SYSDBA`锛屼笟鍔� schema `LX`銆�
+
+**鎺ユ墜娉ㄦ剰**
+- 涓嶈鎻愪氦 `.codex-run`銆丱ffice 閿佹枃浠舵垨 `emergency-repair-web/public/鏂板缓 鏂囨湰鏂囨。.txt`銆�
+- 鏈疆浠g爜銆侀渶姹傛枃浠跺拰浜ゆ帴璁板綍涓�骞舵彁浜ゅ苟鎺ㄩ�佸叕鍙� Git 浠撳簱 `main` 鍒嗘敮銆�
diff --git a/emergency-repair-web/src/views/system/RolePermissionDialog.vue b/emergency-repair-web/src/views/system/RolePermissionDialog.vue
index 7271f40..3180bb7 100644
--- a/emergency-repair-web/src/views/system/RolePermissionDialog.vue
+++ b/emergency-repair-web/src/views/system/RolePermissionDialog.vue
@@ -15,16 +15,21 @@
       <span class="selected-total">宸查�夋潈闄� {{ selectedRoleIds.length }} 涓�</span>
     </div>
     <div class="permission-toolbar">
-      <el-checkbox v-model="checkAll" @change="toggleAll">鍏ㄩ��</el-checkbox>
-      <span class="permission-tip">鑿滃崟鍜屾寜閽潈闄愬潎鍙嬀閫夛紝淇濆瓨鍚庡垏鎹㈣鑹蹭細鑷姩鍙嶆樉銆�</span>
+      <el-radio-group v-model="permissionScope" size="small" @change="handleScopeChange">
+        <el-radio-button label="all">鍏ㄩ儴</el-radio-button>
+        <el-radio-button label="assigned">宸茶缃�</el-radio-button>
+      </el-radio-group>
+      <el-checkbox v-if="permissionScope === 'all'" v-model="checkAll" @change="toggleAll">鍏ㄩ��</el-checkbox>
+      <span class="permission-tip">{{ permissionTip }}</span>
     </div>
     <div v-loading="loading" class="permission-tree">
       <el-tree
         ref="permissionTree"
-        :data="menus"
+        :data="displayMenus"
         node-key="id"
         show-checkbox
         default-expand-all
+        empty-text="璇ヨ鑹插皻鏈缃潈闄�"
         :render-content="renderContent"
         :props="{ label: 'name', children: 'children' }"
         @check="syncCheckAllState"
@@ -52,6 +57,7 @@
       loading: false,
       saving: false,
       checkAll: false,
+      permissionScope: 'all',
       selectedRoleIds: []
     }
   },
@@ -62,6 +68,23 @@
     },
     allMenuIds() {
       return this.flatMenus.map(item => String(item.id))
+    },
+    displayMenus() {
+      if (this.permissionScope === 'all') return this.menus
+      const assigned = new Set(this.selectedRoleIds.map(String))
+      const filterAssigned = nodes => (nodes || []).reduce((result, node) => {
+        const children = filterAssigned(node.children)
+        if (assigned.has(String(node.id)) || children.length) {
+          result.push({ ...node, children })
+        }
+        return result
+      }, [])
+      return filterAssigned(this.menus)
+    },
+    permissionTip() {
+      return this.permissionScope === 'all'
+        ? '鑿滃崟鍜屾寜閽潈闄愬潎鍙嬀閫夛紝淇濆瓨鍚庡垏鎹㈣鑹蹭細鑷姩鍙嶆樉銆�'
+        : '浠呮樉绀哄綋鍓嶈鑹插凡璁剧疆鐨勬潈闄愬強鍏剁埗绾ц妭鐐广��'
     }
   },
   watch: {
@@ -74,6 +97,7 @@
       if (!this.role || !this.role.id) return
       this.loading = true
       this.checkAll = false
+      this.permissionScope = 'all'
       this.selectedRoleIds = []
       Promise.all([
         api.get('/system/menu/tree'),
@@ -90,6 +114,15 @@
           this.syncCheckAllState()
         })
       }).finally(() => { this.loading = false })
+
+    },
+    handleScopeChange() {
+      this.selectedRoleIds = this.checkedMenuIds()
+      this.$nextTick(() => {
+        if (!this.$refs.permissionTree) return
+        this.$refs.permissionTree.setCheckedKeys(this.displayCheckedKeys(this.selectedRoleIds))
+        this.syncCheckAllState()
+      })
     },
     renderContent(h, { data }) {
       const label = data.menuType === 2 ? data.name + ' [鎸夐挳 ' + (data.permissions || '') + ']' : data.name
@@ -128,7 +161,9 @@
       return [...new Set([...(tree.getCheckedKeys(false) || []), ...(tree.getHalfCheckedKeys() || [])].map(String))]
     },
     syncCheckAllState() {
-      this.checkAll = this.checkedMenuIds().length === this.allMenuIds.length
+      const checked = this.checkedMenuIds()
+      this.selectedRoleIds = checked
+      this.checkAll = checked.length === this.allMenuIds.length
     },
     toggleAll() {
       if (!this.$refs.permissionTree) return
diff --git "a/requirement/\344\272\244\346\216\245\346\226\207\344\273\266_2026.10.3.md" "b/requirement/\344\272\244\346\216\245\346\226\207\344\273\266_2026.10.3.md"
index 0aae7c0..db32943 100644
--- "a/requirement/\344\272\244\346\216\245\346\226\207\344\273\266_2026.10.3.md"
+++ "b/requirement/\344\272\244\346\216\245\346\226\207\344\273\266_2026.10.3.md"
@@ -627,3 +627,27 @@
 - 瀹屽伐鏌ラ槄褰撳墠鍙睍绀哄凡鏈� `T_COMPLETION_INFO` 瀹屽伐濉姤璁板綍鐨勬淳宸ュ崟锛屽苟涓旀帴鍙f湭鍒嗛〉銆�
 - 鏈疆浠g爜銆侀渶姹傛枃浠跺拰浜ゆ帴璁板綍涓�骞舵彁浜ゅ苟鎺ㄩ�佸叕鍙� Git 浠撳簱 `main` 鍒嗘敮銆�
 - `.codex-run`銆丱ffice 閿佹枃浠跺強 `emergency-repair-web/public/鏂板缓 鏂囨湰鏂囨。.txt` 浠嶄负鏈湴涓存椂鏂囦欢锛屼笉搴旀彁浜ゃ��
+
+## 鍗佷簲銆�2026-10-06 鑱旇皟鏀跺熬锛堥渶姹� 21 鏉冮檺璁剧疆鑼冨洿鍒囨崲锛�
+
+| 搴忓彿 | 闇�姹傝ˉ鍏� | 鐘舵�� | 瀹炵幇涓庨獙璇� |
+| --- | --- | --- | --- |
+| 21 | 鏉冮檺璁剧疆澧炲姞鈥滃叏閮� / 宸茶缃�濆垏鎹� | 宸插畬鎴� | `RolePermissionDialog.vue` 澧炲姞鑼冨洿鍒囨崲锛涒�滃叏閮ㄢ�濇樉绀哄畬鏁磋彍鍗曞強鎸夐挳鏍戝苟鍙叏閫夛紝鈥滃凡璁剧疆鈥濅粎鏄剧ず褰撳墠瑙掕壊宸叉巿鏉冭妭鐐瑰拰鐖剁骇璺緞锛屽垏鎹㈡椂淇濈暀鏈繚瀛樺嬀閫夛紝閲嶆柊鎵撳紑榛樿鈥滃叏閮ㄢ�� |
+
+### 15.1 涓昏鍙樻洿鏂囦欢
+
+- `emergency-repair-web/src/views/system/RolePermissionDialog.vue`
+- `requirement/鏀硅繘20261003.txt`锛堣ˉ鍏呴渶姹� 21 鐨勮寖鍥村垏鎹㈠彛寰勶級
+
+### 15.2 楠岃瘉缁撴灉
+
+- 鍓嶇 `npm run build` 閫氳繃锛屼粎鏈夋棦鏈夊寘浣撶Н鍛婅銆�
+- `node .codex-run/verify-req21-22.js` 閫氳繃锛氬乏渚ф棤鈥滆彍鍗曟潈闄愮鐞嗏�濓紝瑙掕壊绠$悊瀛樺湪鈥滄潈闄愯缃�濄��
+- 鍏ㄩ儴瑙嗗浘鏄剧ず 119 涓閫夋銆�13 涓凡鍕鹃�夈��1 涓崐閫夛紱宸茶缃鍥炬樉绀� 14 涓妭鐐癸紝鍧囦负褰撳墠宸茶缃妭鐐规垨鐖剁骇璺緞锛涘垏鍥炲叏閮ㄥ悗鍕鹃�夌姸鎬佹仮澶嶏紝鏃犵綉缁滃紓甯搞��
+- 鎴浘锛歚.codex-run/role-permission-assigned-scope.png`銆�
+
+### 15.3 鎺ユ墜娉ㄦ剰
+
+- 褰撳墠杩愯锛氬墠绔� `http://localhost:8082`锛涘悗绔� `http://127.0.0.1:8091`锛汥M8 `127.0.0.1:5236`锛汦dge CDP `9222`銆傜櫥褰� `admin / admin123`銆�
+- 鏈疆浠g爜銆侀渶姹傛枃浠跺拰浜ゆ帴璁板綍涓�骞舵彁浜ゅ苟鎺ㄩ�佸叕鍙� Git 浠撳簱 `main` 鍒嗘敮銆�
+- `.codex-run`銆丱ffice 閿佹枃浠跺強 `emergency-repair-web/public/鏂板缓 鏂囨湰鏂囨。.txt` 浠嶄负鏈湴涓存椂鏂囦欢锛屼笉搴旀彁浜ゃ��
diff --git "a/requirement/\346\224\271\350\277\23320261003.txt" "b/requirement/\346\224\271\350\277\23320261003.txt"
index 25191e8..88aadd4 100644
--- "a/requirement/\346\224\271\350\277\23320261003.txt"
+++ "b/requirement/\346\224\271\350\277\23320261003.txt"
@@ -29,7 +29,7 @@
 19銆佹壙淇崟浣嶅簲璇ュ埌閮ㄩ棬琛ㄩ噷鎵綝EPT_TYPE鍒椾负cj鐨勮褰�
 
 20銆佽彍鍗曟潈闄愮鐞嗭紝鍙屾潈闄愮鐞嗗簲璇ュ垎2姝ワ紝 绗�1姝ヨ缃鎴锋潈闄愶紝绗�2姝ヨ缃鑹叉潈闄愶紝 鐩墠鐢ㄦ埛鏈韩鏄病鏈夌鎴风殑锛屾墍浠ヨ繖涓鎴锋潈闄愯缃氨娌″繀瑕佷簡锛屼繚鐣欒鑹叉潈闄愯缃氨鍙互浜嗭紝鏉冮檺妫�鏌ユ瑕佸弽鏄�
-21銆佽彍鍗曟潈闄愮鐞嗭紝杩欎釜鑿滃崟涓嶈锛屽湪瑙掕壊绠$悊澧炲姞涓�涓潈闄愯缃寜閽紝绫讳技鐢ㄦ埛璁剧疆閭d釜鎸夐挳閭f牱
+21銆佽彍鍗曟潈闄愮鐞嗭紝杩欎釜鑿滃崟涓嶈锛屽湪瑙掕壊绠$悊澧炲姞涓�涓潈闄愯缃寜閽紝绫讳技鐢ㄦ埛璁剧疆閭d釜鎸夐挳閭f牱锛屼篃璞$敤鎴疯缃鍔犱釜鍏ㄩ儴/宸茶缃殑鍒囨崲寮�鍏�
 22銆佺郴缁熺鐞嗕笅闈㈠鍔�2绾ц彍鍗曠粍鑺傜偣锛� 绯荤粺閰嶇疆锛堥櫎浜嗘潈闄愰厤缃�佹棩蹇楃鐞嗙鐞嗕笅闈㈠摢浜涜彍鍗曞锛屽叾浠栬彍鍗曟斁鍒扮郴缁熼厤缃笅闈級銆佹潈闄愰厤缃紙鐢ㄦ埛绠$悊銆佽鑹茬鐞嗐�佽彍鍗曠鐞嗭級銆佹棩蹇楃鐞嗭紙鐧诲綍鏃ュ織銆佹搷浣滄棩蹇椼�侀敊璇棩蹇楋級
    閿欒鏃ュ織涓烘柊澧炲姛鑳斤紝璁板綍绋嬪簭杩愯鍑虹幇鐨刡ug
 

--
Gitblit v1.9.1