From 45b6df5b9cba3cab3f0a3001dc7b7d9729923ba4 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期六, 18 七月 2026 11:22:11 +0800
Subject: [PATCH] fix: 销售和采购新增产品修改

---
 src/views/procurementManagement/procurementLedger/index.vue |   46 +++++++++++----
 src/views/basicData/product/ProductSelectDialog.vue         |   11 ++-
 src/views/salesManagement/salesLedger/index.vue             |   66 +++++++++++----------
 3 files changed, 73 insertions(+), 50 deletions(-)

diff --git a/src/views/basicData/product/ProductSelectDialog.vue b/src/views/basicData/product/ProductSelectDialog.vue
index ad27baa..590f8ca 100644
--- a/src/views/basicData/product/ProductSelectDialog.vue
+++ b/src/views/basicData/product/ProductSelectDialog.vue
@@ -2,11 +2,11 @@
   <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" style="width: 200px" />
       </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" style="width: 200px" />
       </el-form-item>
 
       <el-form-item>
@@ -20,9 +20,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">
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 685a8aa..e2d340b 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -277,20 +277,22 @@
       @cancel="closeProductDia">
       <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef">
         <el-row :gutter="30">
-          <el-col :span="24">
-            <el-form-item label="浜у搧澶х被锛�" prop="productId">
-              <el-tree-select v-model="productForm.productId" placeholder="璇烽�夋嫨" clearable filterable check-strictly
-                @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" />
+          <el-col :span="12">
+            <el-form-item label="浜у搧澶х被锛�" prop="productCategory">
+              <el-input v-model="productForm.productCategory"
+                        placeholder="鐐瑰嚮閫夋嫨"
+                        readonly
+                        @click="showProductSelectDialog = true"
+                        style="cursor:pointer" />
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="24">
+          <el-col :span="12">
             <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
-              <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" filterable clearable
-                @change="getProductModel">
-                <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
-              </el-select>
+              <el-input v-model="productForm.specificationModel"
+                        placeholder="鐐瑰嚮閫夋嫨"
+                        readonly
+                        @click="showProductSelectDialog = true"
+                        style="cursor:pointer" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -372,6 +374,9 @@
         </el-row>-->
       </el-form>
     </FormDialog>
+    <ProductSelectDialog v-model="showProductSelectDialog"
+                         @confirm="handleProductSelect"
+                         single />
     <FileList v-if="fileListDialogVisible" v-model:visible="fileListDialogVisible" record-type="purchase_ledger"
       :record-id="recordId" />
     <Detail ref="detailRef" />
@@ -445,6 +450,7 @@
 const fileList = ref([]);
 import useUserStore from "@/store/modules/user";
 import { modelList, productTreeList } from "@/api/basicData/product.js";
+import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
 import dayjs from "dayjs";
 import FileUpload from "@/components/AttachmentUpload/file/index.vue";
 import { tableAmountFormatter, formatDecimal, buildAmountSummaryFormat } from '@/utils/numberFormat';
@@ -648,6 +654,7 @@
 
 // 浜у搧琛ㄥ崟寮规鏁版嵁
 const productFormVisible = ref(false);
+const showProductSelectDialog = ref(false);
 const productOperationType = ref("");
 const productOperationIndex = ref("");
 const currentId = ref("");
@@ -668,8 +675,8 @@
     isChecked: false,
   },
   productRules: {
-    productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    productCategory: [{ required: true, message: "璇烽�夋嫨浜у搧澶х被", trigger: "change" }],
+    productModelId: [{ required: true, message: "璇烽�夋嫨瑙勬牸鍨嬪彿", trigger: "change" }],
     unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     taxInclusiveUnitPrice: [
@@ -1257,6 +1264,19 @@
     await nextTick();
   }
 };
+
+// ProductSelectDialog 閫変腑鍥炶皟
+const handleProductSelect = (products) => {
+  if (!products || !products.length) return;
+  const p = products[0];
+  productForm.value.productId = p.productId;
+  productForm.value.productCategory = p.productName || '';
+  productForm.value.productModelId = p.id;
+  productForm.value.specificationModel = p.model || '';
+  productForm.value.unit = p.unit || '';
+  showProductSelectDialog.value = false;
+};
+
 const getProductOptions = () => {
   return productTreeList().then(res => {
     productOptions.value = convertIdToValue(res);
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 1a0f0a5..23c7438 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -605,35 +605,22 @@
                :rules="productRules"
                ref="productFormRef">
         <el-row :gutter="30">
-          <el-col :span="24">
-            <el-form-item label="浜у搧澶х被锛�"
-                          prop="productCategory">
-              <el-tree-select v-model="productForm.productCategory"
-                              placeholder="璇烽�夋嫨"
-                              clearable
-                              filterable
-                              check-strictly
-                              @change="getModels"
-                              :data="productOptions"
-                              :render-after-expand="false"
-                              style="width: 100%" />
+          <el-col :span="12">
+            <el-form-item label="浜у搧澶х被锛�" prop="productCategory">
+              <el-input v-model="productForm.productCategory"
+                        placeholder="鐐瑰嚮閫夋嫨"
+                        readonly
+                        @click="showProductSelectDialog = true"
+                        style="cursor:pointer" />
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="24">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�"
-                          prop="productModelId">
-              <el-select v-model="productForm.productModelId"
-                         placeholder="璇烽�夋嫨"
-                         clearable
-                         @change="getProductModel"
-                         filterable>
-                <el-option v-for="item in modelOptions"
-                           :key="item.id"
-                           :label="item.model"
-                           :value="item.id" />
-              </el-select>
+          <el-col :span="12">
+            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
+              <el-input v-model="productForm.specificationModel"
+                        placeholder="鐐瑰嚮閫夋嫨"
+                        readonly
+                        @click="showProductSelectDialog = true"
+                        style="cursor:pointer" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -758,6 +745,9 @@
         </el-row>
       </el-form>
     </FormDialog>
+    <ProductSelectDialog v-model="showProductSelectDialog"
+                         @confirm="handleProductSelect"
+                         single />
     <!-- 瀵煎叆寮圭獥 -->
     <FormDialog v-model="importUpload.open"
                 :title="importUpload.title"
@@ -1085,6 +1075,7 @@
     buildAmountSummaryFormat,
   } from "@/utils/numberFormat";
   import ImageUpload from "@/components/AttachmentUpload/image/index.vue";
+  import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
   import { getCurrentDate } from "@/utils/index.js";
   import { listCustomer } from "@/api/basicData/customer.js";
 
@@ -1113,6 +1104,7 @@
   const total = ref(0);
   const fileList = ref([]);
   const deliveryFileList = ref([]);
+  const showProductSelectDialog = ref(false);
 
   // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
   const operationType = ref("");
@@ -1155,7 +1147,9 @@
   const currentId = ref("");
   const productFormData = reactive({
     productForm: {
+      productId: "",
       productCategory: "",
+      productModelId: "",
       specificationModel: "",
       unit: "",
       quantity: "",
@@ -1167,11 +1161,8 @@
       isProduction: false,
     },
     productRules: {
-      productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      specificationModel: [
-        { required: true, message: "璇烽�夋嫨", trigger: "change" },
-      ],
+      productCategory: [{ required: true, message: "璇烽�夋嫨浜у搧澶х被", trigger: "change" }],
+      productModelId: [{ required: true, message: "璇烽�夋嫨瑙勬牸鍨嬪彿", trigger: "change" }],
       unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
       quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
       taxInclusiveUnitPrice: [
@@ -1503,6 +1494,17 @@
     }
     return formattedNumber(row, column, cellValue);
   };
+  // ProductSelectDialog 閫変腑鍥炶皟
+  const handleProductSelect = (products) => {
+    if (!products || !products.length) return;
+    const p = products[0];
+    productForm.value.productId = p.productId;
+    productForm.value.productCategory = p.productName || '';
+    productForm.value.productModelId = p.id;
+    productForm.value.specificationModel = p.model || '';
+    productForm.value.unit = p.unit || '';
+    showProductSelectDialog.value = false;
+  };
   // 鑾峰彇tree瀛愭暟鎹�
   const getModels = value => {
     productForm.value.productCategory = findNodeById(productOptions.value, value);

--
Gitblit v1.9.3