From 2078a3318d44bfeb7b3dc9771679bf35940928d5 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 23 一月 2026 16:01:12 +0800
Subject: [PATCH] Merge branch 'dev_New' of http://114.132.189.42:9002/r/product-inventory-management into dev_New

---
 src/views/basicData/product/ProductSelectDialog.vue |  113 ++++++++++++++++++++++++++++++++------------------------
 1 files changed, 65 insertions(+), 48 deletions(-)

diff --git a/src/views/basicData/product/ProductSelectDialog.vue b/src/views/basicData/product/ProductSelectDialog.vue
index 246cd88..70dbb16 100644
--- a/src/views/basicData/product/ProductSelectDialog.vue
+++ b/src/views/basicData/product/ProductSelectDialog.vue
@@ -1,28 +1,12 @@
 <template>
-  <el-dialog
-      v-model="visible"
-      title="閫夋嫨浜у搧"
-      width="900px"
-      destroy-on-close
-      :close-on-click-modal="false"
-  >
+  <el-dialog v-model="visible" title="閫夋嫨浜у搧" width="900px" destroy-on-close :close-on-click-modal="false">
     <el-form :inline="true" :model="query" class="mb-2">
       <el-form-item label="浜у搧澶х被">
-        <el-input
-            v-model="query.productName"
-            placeholder="杈撳叆浜у搧澶х被"
-            clearable
-            @keyup.enter="onSearch"
-        />
+        <el-input v-model="query.productName" placeholder="杈撳叆浜у搧澶х被" clearable @keyup.enter="onSearch" />
       </el-form-item>
 
       <el-form-item label="鍨嬪彿鍚嶇О">
-        <el-input
-            v-model="query.model"
-            placeholder="杈撳叆鍨嬪彿鍚嶇О"
-            clearable
-            @keyup.enter="onSearch"
-        />
+        <el-input v-model="query.model" placeholder="杈撳叆鍨嬪彿鍚嶇О" clearable @keyup.enter="onSearch" />
       </el-form-item>
 
       <el-form-item>
@@ -32,32 +16,19 @@
     </el-form>
 
     <!-- 鍒楄〃 -->
-    <el-table
-        v-loading="loading"
-        :data="tableData"
-        height="420"
-        highlight-current-row
-        row-key="id"
-        @selection-change="handleSelectionChange"
-    >
+    <el-table ref="tableRef" v-loading="loading" :data="tableData" height="420" highlight-current-row row-key="id"
+      @selection-change="handleSelectionChange" @select="handleSelect">
       <el-table-column type="selection" width="55" />
-      <el-table-column type="index" label="#" width="60"/>
-      <el-table-column prop="productName" label="浜у搧澶х被" min-width="160"/>
-      <el-table-column prop="model" label="鍨嬪彿鍚嶇О" min-width="200"/>
-      <el-table-column prop="unit" label="鍗曚綅" min-width="160"/>
+      <el-table-column type="index" label="搴忓彿" width="60" />
+      <el-table-column prop="productName" label="浜у搧澶х被" min-width="160" />
+      <el-table-column prop="model" label="鍨嬪彿鍚嶇О" min-width="200" />
+      <el-table-column prop="unit" label="鍗曚綅" min-width="160" />
     </el-table>
 
     <div class="mt-3 flex justify-end">
-      <el-pagination
-          background
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="total"
-          v-model:page-size="page.pageSize"
-          v-model:current-page="page.pageNum"
-          :page-sizes="[10, 20, 50, 100]"
-          @size-change="onPageChange"
-          @current-change="onPageChange"
-      />
+      <el-pagination background layout="total, sizes, prev, pager, next, jumper" :total="total"
+        v-model:page-size="page.pageSize" v-model:current-page="page.pageNum" :page-sizes="[10, 20, 50, 100]"
+        @size-change="onPageChange" @current-change="onPageChange" />
     </div>
 
     <template #footer>
@@ -70,9 +41,9 @@
 </template>
 
 <script setup lang="ts">
-import {computed, onMounted, reactive, ref, watch} from "vue";
-import {ElMessage} from "element-plus";
-import {productModelList} from '@/api/basicData/productModel'
+import { computed, onMounted, reactive, ref, watch, nextTick } from "vue";
+import { ElMessage } from "element-plus";
+import { productModelList } from '@/api/basicData/productModel'
 
 export type ProductRow = {
   id: number;
@@ -83,6 +54,7 @@
 
 const props = defineProps<{
   modelValue: boolean;
+  single?: boolean; // 鏄惁鍙兘閫夋嫨涓�涓紝榛樿false锛堝彲閫夋嫨澶氫釜锛�
 }>();
 
 const emit = defineEmits(['update:modelValue', 'confirm']);
@@ -105,14 +77,48 @@
 const loading = ref(false);
 const tableData = ref<ProductRow[]>([]);
 const total = ref(0);
-const multipleSelection = ref<ProductRow[]>([])
+const multipleSelection = ref<ProductRow[]>([]);
+const tableRef = ref();
 
 function close() {
   visible.value = false;
 }
 
 const handleSelectionChange = (val: ProductRow[]) => {
-  multipleSelection.value = val
+  if (props.single && val.length > 1) {
+    // 濡傛灉闄愬埗涓哄崟涓�夋嫨锛屽彧淇濈暀鏈�鍚庝竴涓�変腑鐨�
+    const lastSelected = val[val.length - 1];
+    multipleSelection.value = [lastSelected];
+    // 娓呯┖琛ㄦ牸閫変腑鐘舵�侊紝鐒跺悗閲嶆柊閫変腑鏈�鍚庝竴涓�
+    nextTick(() => {
+      if (tableRef.value) {
+        tableRef.value.clearSelection();
+        tableRef.value.toggleRowSelection(lastSelected, true);
+      }
+    });
+  } else {
+    multipleSelection.value = val;
+  }
+}
+
+// 澶勭悊鍗曚釜閫夋嫨
+const handleSelect = (selection: ProductRow[], row: ProductRow) => {
+  if (props.single) {
+    // 濡傛灉闄愬埗涓哄崟涓紝娓呯┖鍏朵粬閫夋嫨锛屽彧淇濈暀褰撳墠琛�
+    if (selection.includes(row)) {
+      // 閫変腑褰撳墠琛屾椂锛屾竻绌哄叾浠栭�変腑
+      multipleSelection.value = [row];
+      nextTick(() => {
+        if (tableRef.value) {
+          tableData.value.forEach((item) => {
+            if (item.id !== row.id) {
+              tableRef.value.toggleRowSelection(item, false);
+            }
+          });
+        }
+      });
+    }
+  }
 }
 
 function onSearch() {
@@ -136,7 +142,11 @@
     ElMessage.warning("璇烽�夋嫨涓�鏉′骇鍝�");
     return;
   }
-  emit("confirm", multipleSelection.value);
+  if (props.single && multipleSelection.value.length > 1) {
+    ElMessage.warning("鍙兘閫夋嫨涓�涓骇鍝�");
+    return;
+  }
+  emit("confirm", props.single ? [multipleSelection.value[0]] : multipleSelection.value);
   close();
 }
 
@@ -144,7 +154,7 @@
   loading.value = true;
   try {
     multipleSelection.value = []; // 缈婚〉/鎼滅储鍚庢竻绌洪�夋嫨鏇寸鍚堥鏈�
-    const res = await productModelList({
+    const res: any = await productModelList({
       productName: query.productName.trim(),
       model: query.model.trim(),
       current: page.pageNum,
@@ -157,6 +167,13 @@
   }
 }
 
+// 鐩戝惉寮圭獥鎵撳紑锛岄噸缃�夋嫨
+watch(() => props.modelValue, (visible) => {
+  if (visible) {
+    multipleSelection.value = [];
+  }
+});
+
 onMounted(() => {
   loadData()
 })

--
Gitblit v1.9.3