From 27cd042df9aca0383a49f3514bc21958dd890912 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 29 六月 2026 15:42:23 +0800
Subject: [PATCH] 银川 1.联调产品维护页面 2.添加IM即时通讯模块

---
 src/views/im/home/composables/useSelectedItems.ts |   75 +++++++++++++++++++++++++++++++++++++
 1 files changed, 75 insertions(+), 0 deletions(-)

diff --git a/src/views/im/home/composables/useSelectedItems.ts b/src/views/im/home/composables/useSelectedItems.ts
new file mode 100644
index 0000000..f8364b3
--- /dev/null
+++ b/src/views/im/home/composables/useSelectedItems.ts
@@ -0,0 +1,75 @@
+import { computed, type ComputedRef, type Ref } from 'vue'
+
+/**
+ * 涓夋�侀�夋嫨闈㈡澘鐨勩�屽凡閫夋暟 + 宸查�夐」鍒楄〃銆嶆淳鐢�
+ *
+ * - 涓夋�佷紭鍏堢骇锛堜笌 dialog-picker-contract 瀵归綈锛夛細hide > locked > disabled
+ *   - hide锛氭案杩滃墧闄わ紝涓嶈鏁� / 涓嶈繘宸查�夊垪琛�
+ *   - locked锛氶粯璁ゅ嬀閫� + 璁℃暟 + 浼樺厛鎺掑湪鍓嶉潰锛涘嵆浣胯澶栭儴濉炶繘 disabledIds 涔熻儨鍑�
+ *   - disabled锛氫粎杩囨护 selectedIds锛屼笉璁℃暟 / 涓嶈繘宸查�夊垪琛�
+ * - 椤哄簭锛歭ockedIds 鍦ㄥ墠锛宻electedIds 绱ч殢锛涙寜鏁扮粍椤哄簭鍗充负銆岀偣鍑婚『搴忋��
+ *
+ * FriendPickerPanel / GroupMemberPickerPanel 鍏辩敤锛岄伩鍏嶄袱渚� 25 琛屽悓鏋� computed 鍚勫啓涓�浠斤紱
+ * Panel 鍐呴儴鐨� isLocked / isDisabled / isSelected 绛夋ā鏉垮垽瀹氬嚱鏁颁粛鍚勮嚜缁存姢锛屾湰 composable 鍙壙鎷呮淳鐢熼噺
+ */
+export function useSelectedItems<T>(
+  selectedIds: () => readonly number[],
+  lockedIds: () => readonly number[],
+  disabledIds: () => readonly number[],
+  hideIds: () => readonly number[],
+  byId: ComputedRef<Map<number, T>> | Ref<Map<number, T>>
+): {
+  selectedCount: ComputedRef<number>
+  selectedItems: ComputedRef<T[]>
+} {
+  const hideSet = computed(() => new Set(hideIds()))
+  const disabledSet = computed(() => new Set(disabledIds()))
+
+  const selectedCount = computed(() => {
+    const merged = new Set<number>()
+    for (const id of selectedIds()) {
+      if (hideSet.value.has(id) || disabledSet.value.has(id)) {
+        continue
+      }
+      merged.add(id)
+    }
+    // locked 浠呰 hide 杩囨护锛涘绾﹂噷 locked 鑳滆繃 disabled锛岀‘淇濋攣瀹氶」濮嬬粓璁″叆
+    for (const id of lockedIds()) {
+      if (hideSet.value.has(id)) {
+        continue
+      }
+      merged.add(id)
+    }
+    return merged.size
+  })
+
+  const selectedItems = computed(() => {
+    const seen = new Set<number>()
+    const result: T[] = []
+    // locked 鍦ㄥ墠锛涗粎琚� hide 杩囨护
+    for (const id of lockedIds()) {
+      if (seen.has(id) || hideSet.value.has(id)) {
+        continue
+      }
+      const item = byId.value.get(id)
+      if (item) {
+        seen.add(id)
+        result.push(item)
+      }
+    }
+    // selectedIds 绱ч殢锛涢澶栬繃婊� disabled
+    for (const id of selectedIds()) {
+      if (seen.has(id) || disabledSet.value.has(id) || hideSet.value.has(id)) {
+        continue
+      }
+      const item = byId.value.get(id)
+      if (item) {
+        seen.add(id)
+        result.push(item)
+      }
+    }
+    return result
+  })
+
+  return { selectedCount, selectedItems }
+}

--
Gitblit v1.9.3