From d57994cbc653a15548f61e4696905eb01ce4fdb9 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 28 八月 2026 20:17:41 +0800
Subject: [PATCH] feat: 选择产品添加产品大类选择
---
src/views/basicData/product/ProductSelectDialog.vue | 57 ++++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 44 insertions(+), 13 deletions(-)
diff --git a/src/views/basicData/product/ProductSelectDialog.vue b/src/views/basicData/product/ProductSelectDialog.vue
index 70dbb16..1586f58 100644
--- a/src/views/basicData/product/ProductSelectDialog.vue
+++ b/src/views/basicData/product/ProductSelectDialog.vue
@@ -2,11 +2,17 @@
<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-select v-model="query.topProductParentId" placeholder="閫夋嫨浜у搧澶х被" clearable @change="onSearch" style="width: 150px">
+ <el-option v-for="item in categoryList" :key="item.id" :label="item.label || item.productName" :value="item.id" />
+ </el-select>
</el-form-item>
- <el-form-item label="鍨嬪彿鍚嶇О">
- <el-input v-model="query.model" placeholder="杈撳叆鍨嬪彿鍚嶇О" clearable @keyup.enter="onSearch" />
+ <el-form-item label="浜у搧鍚嶇О">
+ <el-input v-model="query.productName" placeholder="杈撳叆浜у搧鍚嶇О" clearable @keyup.enter="onSearch" style="width: 150px" />
+ </el-form-item>
+
+ <el-form-item label="浜у搧鍨嬪彿">
+ <el-input v-model="query.model" placeholder="杈撳叆浜у搧鍨嬪彿" clearable @keyup.enter="onSearch" style="width: 150px" />
</el-form-item>
<el-form-item>
@@ -20,9 +26,10 @@
@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 prop="topProductName" label="浜у搧澶х被" min-width="120" />
+ <el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="140" />
+ <el-table-column prop="model" label="浜у搧鍨嬪彿" min-width="180" />
+ <el-table-column prop="unit" label="鍗曚綅" min-width="100" />
</el-table>
<div class="mt-3 flex justify-end">
@@ -32,10 +39,10 @@
</div>
<template #footer>
- <el-button @click="close()">鍙栨秷</el-button>
<el-button type="primary" :disabled="multipleSelection.length === 0" @click="onConfirm">
纭畾
</el-button>
+ <el-button @click="close()">鍙栨秷</el-button>
</template>
</el-dialog>
</template>
@@ -43,7 +50,8 @@
<script setup lang="ts">
import { computed, onMounted, reactive, ref, watch, nextTick } from "vue";
import { ElMessage } from "element-plus";
-import { productModelList } from '@/api/basicData/productModel'
+import { productModelList, productModelListByUrl } from '@/api/basicData/productModel'
+import { productTreeList } from '@/api/basicData/product'
export type ProductRow = {
id: number;
@@ -55,6 +63,8 @@
const props = defineProps<{
modelValue: boolean;
single?: boolean; // 鏄惁鍙兘閫夋嫨涓�涓紝榛樿false锛堝彲閫夋嫨澶氫釜锛�
+ topProductParentId?: number; // 涓�绾т骇鍝乮d
+ requestUrl?: string; // 鑷畾涔夋煡璇㈡帴鍙�
}>();
const emit = defineEmits(['update:modelValue', 'confirm']);
@@ -67,7 +77,19 @@
const query = reactive({
productName: "",
model: "",
+ topProductParentId: undefined as number | undefined,
});
+
+const categoryList = ref<any[]>([]);
+
+async function loadCategory() {
+ try {
+ const res = await productTreeList();
+ categoryList.value = res || [];
+ } catch (e) {
+ console.error("Failed to load product categories", e);
+ }
+}
const page = reactive({
pageNum: 1,
@@ -129,6 +151,7 @@
function onReset() {
query.productName = "";
query.model = "";
+ query.topProductParentId = props.topProductParentId;
page.pageNum = 1;
loadData();
}
@@ -154,14 +177,19 @@
loading.value = true;
try {
multipleSelection.value = []; // 缈婚〉/鎼滅储鍚庢竻绌洪�夋嫨鏇寸鍚堥鏈�
- const res: any = await productModelList({
+ const params = {
productName: query.productName.trim(),
model: query.model.trim(),
current: page.pageNum,
size: page.pageSize,
- });
- tableData.value = res.records;
- total.value = res.total;
+ topProductParentId: query.topProductParentId ?? props.topProductParentId,
+ };
+ const res: any = props.requestUrl
+ ? await productModelListByUrl(props.requestUrl, params)
+ : await productModelList(params);
+ const records = res?.records || res?.data?.records || res?.data || [];
+ tableData.value = Array.isArray(records) ? records : [];
+ total.value = Number(res?.total ?? res?.data?.total ?? tableData.value.length);
} finally {
loading.value = false;
}
@@ -171,10 +199,13 @@
watch(() => props.modelValue, (visible) => {
if (visible) {
multipleSelection.value = [];
+ query.topProductParentId = props.topProductParentId;
}
});
onMounted(() => {
- loadData()
+ query.topProductParentId = props.topProductParentId;
+ loadCategory();
+ loadData();
})
</script>
--
Gitblit v1.9.3