From 4aa106fc8ea7b8a0013a1a05094a4618dce00cd4 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期三, 15 四月 2026 13:13:06 +0800
Subject: [PATCH] 新增产品定性下拉选项功能,优化产品选择对话框,调整字段布局和表格显示,提升用户交互体验

---
 src/views/basicData/product/ProductSelectDialog.vue |   53 ++++++++++++++++++++++++--
 src/api/basicData/productModel.js                   |    8 ++++
 2 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/src/api/basicData/productModel.js b/src/api/basicData/productModel.js
index f048f9e..c8882a0 100644
--- a/src/api/basicData/productModel.js
+++ b/src/api/basicData/productModel.js
@@ -6,4 +6,12 @@
         method: 'get',
         params: query
     })
+}
+
+/** 浜у搧瀹氭�э紙parentName锛変笅鎷夐�夐」 */
+export function getProductParentNames() {
+    return request({
+        url: '/basic/product/getParentNames',
+        method: 'get',
+    })
 }
\ No newline at end of file
diff --git a/src/views/basicData/product/ProductSelectDialog.vue b/src/views/basicData/product/ProductSelectDialog.vue
index b9a55aa..70ebdb6 100644
--- a/src/views/basicData/product/ProductSelectDialog.vue
+++ b/src/views/basicData/product/ProductSelectDialog.vue
@@ -1,8 +1,16 @@
 <template>
-  <el-dialog v-model="visible" title="閫夋嫨浜у搧" width="900px" destroy-on-close :close-on-click-modal="false">
+  <el-dialog v-model="visible" title="閫夋嫨浜у搧" width="60%" 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-form-item>
+
+      <el-form-item label="浜у搧瀹氭��">
+        <el-select v-model="query.parentName" placeholder="璇烽�夋嫨浜у搧瀹氭��" clearable filterable style="width: 200px"
+          @change="onSearch">
+          <el-option v-for="item in parentNameOptions" :key="item.id" :label="item.productName"
+            :value="item.productName" />
+        </el-select>
       </el-form-item>
 
       <el-form-item label="鍨嬪彿鍚嶇О">
@@ -16,11 +24,12 @@
     </el-form>
 
     <!-- 鍒楄〃 -->
-    <el-table ref="tableRef" v-loading="loading" :data="tableData" height="420" highlight-current-row row-key="id"
+    <el-table ref="tableRef" v-loading="loading" :data="tableData" height="500px" 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="parentName" label="浜у搧瀹氭��" min-width="120" show-overflow-tooltip />
       <el-table-column prop="model" label="鍨嬪彿鍚嶇О" min-width="200" />
       <el-table-column prop="thickness" label="鍘氬害" min-width="160" :formatter="formatThicknessTo15" />
     </el-table>
@@ -43,11 +52,12 @@
 <script setup lang="ts">
 import { computed, onMounted, reactive, ref, watch, nextTick } from "vue";
 import { ElMessage } from "element-plus";
-import { productModelList } from '@/api/basicData/productModel.js'
+import { productModelList, getProductParentNames } from '@/api/basicData/productModel.js'
 
 export type ProductRow = {
   id: number;
   productName: string;
+  parentName?: string;
   model: string;
   thickness?: string;
 };
@@ -66,8 +76,31 @@
 
 const query = reactive({
   productName: "",
+  parentName: "",
   model: "",
 });
+
+export type ParentNameOption = {
+  id: number;
+  parentId: number | null;
+  productName: string;
+  tenantId: number | null;
+};
+
+const parentNameOptions = ref<ParentNameOption[]>([]);
+
+function normalizeParentNameList(res: any): ParentNameOption[] {
+  const raw = res?.data;
+  const arr = Array.isArray(raw) ? raw : [];
+  return arr
+    .map((x: any) => ({
+      id: Number(x?.id),
+      parentId: x?.parentId ?? null,
+      productName: String(x?.productName ?? "").trim(),
+      tenantId: x?.tenantId ?? null,
+    }))
+    .filter((x) => x.productName !== "" && !Number.isNaN(x.id));
+}
 
 const page = reactive({
   pageNum: 1,
@@ -138,6 +171,7 @@
 
 function onReset() {
   query.productName = "";
+  query.parentName = "";
   query.model = "";
   page.pageNum = 1;
   loadData();
@@ -166,6 +200,7 @@
     multipleSelection.value = []; // 缈婚〉/鎼滅储鍚庢竻绌洪�夋嫨鏇寸鍚堥鏈�
     const res: any = await productModelList({
       productName: query.productName.trim(),
+      parentName: typeof query.parentName === "string" ? query.parentName.trim() : "",
       model: query.model.trim(),
       current: page.pageNum,
       size: page.pageSize,
@@ -184,7 +219,17 @@
   }
 });
 
+async function loadParentNameOptions() {
+  try {
+    const res: any = await getProductParentNames();
+    parentNameOptions.value = normalizeParentNameList(res);
+  } catch {
+    parentNameOptions.value = [];
+  }
+}
+
 onMounted(() => {
-  loadData()
+  loadParentNameOptions();
+  loadData();
 })
 </script>

--
Gitblit v1.9.3