|
|
@@ -20,6 +20,7 @@ import {
|
|
|
type Ref,
|
|
|
h,
|
|
|
ref,
|
|
|
+ computed,
|
|
|
toRaw,
|
|
|
reactive,
|
|
|
onMounted
|
|
|
@@ -202,6 +203,38 @@ export function useReplenisher(tableRef: Ref) {
|
|
|
const loadingShopTree = ref(false);
|
|
|
const selectedDeviceIds = ref<Set<string>>(new Set());
|
|
|
const origBoundDeviceIds = ref<Set<string>>(new Set());
|
|
|
+ const shopSearchKeyword = ref("");
|
|
|
+
|
|
|
+ // 按搜索词过滤门店
|
|
|
+ const filteredShopTree = computed(() => {
|
|
|
+ const kw = shopSearchKeyword.value.trim().toLowerCase();
|
|
|
+ if (!kw) return shopDeviceTree.value;
|
|
|
+ return shopDeviceTree.value.filter(
|
|
|
+ s => s.name.toLowerCase().includes(kw) || s.address.toLowerCase().includes(kw)
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
+ // 全部设备是否已选中
|
|
|
+ const allDevicesCount = computed(() =>
|
|
|
+ shopDeviceTree.value.reduce((sum, s) => sum + s.devices.length, 0)
|
|
|
+ );
|
|
|
+ const isAllSelected = computed(() =>
|
|
|
+ allDevicesCount.value > 0 && selectedDeviceIds.value.size === allDevicesCount.value
|
|
|
+ );
|
|
|
+
|
|
|
+ function toggleSelectAll() {
|
|
|
+ if (isAllSelected.value) {
|
|
|
+ selectedDeviceIds.value = new Set();
|
|
|
+ } else {
|
|
|
+ const all = new Set<string>();
|
|
|
+ shopDeviceTree.value.forEach(s => s.devices.forEach(d => all.add(d.deviceId)));
|
|
|
+ selectedDeviceIds.value = all;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function resetShopSearch() {
|
|
|
+ shopSearchKeyword.value = "";
|
|
|
+ }
|
|
|
|
|
|
async function openBindDialog(row: ReplenisherFormItem) {
|
|
|
currentReplenisher.value = row;
|
|
|
@@ -595,6 +628,12 @@ export function useReplenisher(tableRef: Ref) {
|
|
|
toggleShopSelectAll,
|
|
|
getShopSelectState,
|
|
|
handleConfirmBind,
|
|
|
+ shopSearchKeyword,
|
|
|
+ filteredShopTree,
|
|
|
+ allDevicesCount,
|
|
|
+ isAllSelected,
|
|
|
+ toggleSelectAll,
|
|
|
+ resetShopSearch,
|
|
|
handleSizeChange,
|
|
|
handleCurrentChange
|
|
|
};
|