From a7dc7b230fcc6abc6ee5a7bfadb90789b03d2ca8 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期一, 07 九月 2026 16:45:37 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro2.0' into dev_pro2.0

---
 src/views/mes/md/item/components/select-dialog.vue |   79 +++++++++++++++++++++++++++++++++------
 1 files changed, 67 insertions(+), 12 deletions(-)

diff --git a/src/views/mes/md/item/components/select-dialog.vue b/src/views/mes/md/item/components/select-dialog.vue
index 30622bf..61f3fd1 100644
--- a/src/views/mes/md/item/components/select-dialog.vue
+++ b/src/views/mes/md/item/components/select-dialog.vue
@@ -5,7 +5,7 @@
 
   import { nextTick, ref } from "vue";
 
-  import { CommonStatusEnum } from "../../../../../packages/constants/src";
+  import { CommonStatusEnum } from "@vben/constants";
 
   import { Card, message, Modal } from "ant-design-vue";
 
@@ -26,6 +26,7 @@
   const selectedRows = ref<MesMdItemApi.Item[]>([]); // 宸查�夌墿鏂欏垪琛�
   const selectedItemTypeId = ref<number>(); // 褰撳墠绛涢�夊垎绫荤紪鍙�
   const preSelectedIds = ref<number[]>([]); // 棰勯�夌墿鏂欑紪鍙峰垪琛�
+  const productIds = ref<number[]>([]); // 闄愬畾鍙�夌殑鐗╂枡缂栧彿鍒楄〃锛堜负绌哄垯涓嶉檺鍒讹級
   const typeTreeRef = ref<InstanceType<typeof MdItemTypeTree>>(); // 鐗╂枡鍒嗙被鏍�
 
   /** 鑾峰彇褰撳墠琛ㄦ牸鏁版嵁 */
@@ -66,11 +67,38 @@
     selectedRows.value = getMultipleSelectedRows();
   }
 
+  /** 涓婃鍗曞嚮琛岀棔杩癸紝鐢ㄤ簬鍚炴帀鍙屽嚮瑙﹀彂鐨勭浜屾 click锛岄伩鍏�"閫変簡鍙堝彇娑�" */
+  let lastClick = { rowId: undefined as number | undefined, time: 0 };
+
+  /** 鍗曞嚮琛岋細澶氶�夌洿鎺ュ垏鎹㈠嬀閫夛紱鍗曢�夌敱 radioConfig.trigger='row' 澶勭悊 */
+  async function handleCellClick({
+    row,
+    column,
+  }: {
+    row: MesMdItemApi.Item;
+    column?: { type?: string };
+  }) {
+    // 鐐瑰嚮鍕鹃�夊垪鑷韩鐢� checkbox 鎺т欢澶勭悊锛岄伩鍏嶄簩娆″垏鎹�
+    if (column?.type === "checkbox") {
+      return;
+    }
+    if (!multiple.value) {
+      return;
+    }
+    const rowId = row.id;
+    const now = Date.now();
+    if (lastClick.rowId === rowId && now - lastClick.time < 300) {
+      lastClick.time = 0;
+      return;
+    }
+    lastClick = { rowId, time: now };
+    await toggleMultipleRow(row);
+  }
+
   /** 澶勭悊琛屽弻鍑� */
   async function handleCellDblclick({ row }: { row: MesMdItemApi.Item }) {
     if (multiple.value) {
-      await toggleMultipleRow(row);
-      return;
+      return; // 澶氶�夌敱鍗曞嚮 cellClick 鍒囨崲锛屽弻鍑讳笉鍐嶉噸澶嶅鐞�
     }
     selectedRows.value = [row];
     await gridApi.grid.setRadioRow(row);
@@ -83,18 +111,20 @@
     gridApi.query();
   }
 
-  /** 鍥炴樉棰勯�夌墿鏂� */
+  /** 鍥炴樉棰勯�夌墿鏂欙細褰撳墠椤电洿鎺ュ嬀閫夛紝璺ㄩ〉棰勯�夋敞鍐屼负 reserve锛岀炕椤靛悗鑷姩鍥炴樉 */
   async function applyPreSelection() {
     if (preSelectedIds.value.length === 0) {
       return;
     }
     const rows = getTableRows();
+    const currentIds = new Set(
+      rows.filter((row) => row.id != null).map((row) => row.id),
+    );
     for (const row of rows) {
-      if (
-        row.id === undefined ||
-        row.id === null ||
-        !preSelectedIds.value.includes(row.id)
-      ) {
+      if (row.id === undefined || row.id === null) {
+        continue;
+      }
+      if (!preSelectedIds.value.includes(row.id)) {
         continue;
       }
       if (multiple.value) {
@@ -106,6 +136,21 @@
       }
     }
     if (multiple.value) {
+      // 鎷夊彇涓嶅湪褰撳墠椤电殑棰勯�夌墿鏂欏畬鏁存暟鎹紝娉ㄥ唽涓� checkbox reserve锛堢炕椤靛悗鑷姩鍕鹃�夛級
+      const missingIds = preSelectedIds.value.filter(
+        (id) => !currentIds.has(id),
+      );
+      if (missingIds.length > 0) {
+        const result = await getItemPage({
+          pageNo: 1,
+          pageSize: 200,
+          ids: missingIds.join(","),
+        } as never);
+        const fullRows = result?.list as MesMdItemApi.Item[] | undefined;
+        if (fullRows && fullRows.length > 0) {
+          await gridApi.grid.setCheckboxReserve(fullRows, true);
+        }
+      }
       selectedRows.value = getMultipleSelectedRows();
     }
   }
@@ -130,13 +175,21 @@
       proxyConfig: {
         ajax: {
           query: async ({ page }, formValues) => {
-            return await getItemPage({
+            const params: Record<string, unknown> = {
               pageNo: page.currentPage,
               pageSize: page.pageSize,
               ...formValues,
               itemTypeId: selectedItemTypeId.value,
               status: CommonStatusEnum.ENABLE,
-            });
+            };
+            // 闄愬畾鍙�夌墿鏂欒寖鍥�
+            if (productIds.value.length > 0) {
+              // 鍚庣鍒嗛〉姣忛〉鏉℃暟涓婇檺涓� 200锛岀櫧鍚嶅崟鍦烘櫙涓�娆℃媺鍙栧敖閲忓鐨勫彲閫夌墿鏂�
+              params.pageSize = 200;
+              params.ids = productIds.value.join(',');
+            }
+            const result = await getItemPage(params as never);
+            return result;
           },
         },
       },
@@ -150,6 +203,7 @@
       },
     } as VxeTableGridOptions<MesMdItemApi.Item>,
     gridEvents: {
+      cellClick: handleCellClick,
       cellDblclick: handleCellDblclick,
       checkboxAll: handleCheckboxSelectChange,
       checkboxChange: handleCheckboxSelectChange,
@@ -173,11 +227,12 @@
   /** 鎵撳紑鐗╂枡閫夋嫨寮圭獥 */
   async function openModal(
     selectedIds?: number[],
-    options?: { multiple?: boolean }
+    options?: { multiple?: boolean; productIds?: number[] }
   ) {
     open.value = true;
     multiple.value = options?.multiple ?? true;
     preSelectedIds.value = selectedIds || [];
+    productIds.value = options?.productIds || [];
     await nextTick();
     gridApi.setGridOptions({
       columns: useItemSelectGridColumns(multiple.value),

--
Gitblit v1.9.3