From d8c936e4381a75d8d1a4dd0f642b99827457a0fe Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 02 四月 2026 13:48:08 +0800
Subject: [PATCH] 军泰伟业 1.军泰伟业-库存管理增加库位 2.军泰伟业-销售产品增加物料号字段 3.军泰伟业-产品维护增加录入时间和修改时间的展示 4.军泰伟业-发货不需要审核流程了

---
 src/views/salesManagement/salesQuotation/index.vue |  173 +++++++++++++++++++++------------------------------------
 1 files changed, 63 insertions(+), 110 deletions(-)

diff --git a/src/views/salesManagement/salesQuotation/index.vue b/src/views/salesManagement/salesQuotation/index.vue
index 87439ea..24147ae 100644
--- a/src/views/salesManagement/salesQuotation/index.vue
+++ b/src/views/salesManagement/salesQuotation/index.vue
@@ -229,40 +229,14 @@
           </template>
           <div class="form-content">
             <el-table :data="form.products" border style="width: 100%" class="product-table" v-if="form.products.length > 0">
-            <el-table-column prop="product" label="浜у搧鍚嶇О" width="200">
+            <el-table-column prop="product" label="浜у搧鍚嶇О" width="220">
               <template #default="scope">
-                <el-form-item :prop="`products.${scope.$index}.productId`" class="product-table-form-item">
-                  <el-tree-select
-                    v-model="scope.row.productId"
-                    placeholder="璇烽�夋嫨"
-                    clearable
-                    check-strictly
-                    @change="getModels($event, scope.row)"
-                    :data="productOptions"
-                    :render-after-expand="false"
-                    style="width: 100%"
-                  />
-                </el-form-item>
+                <span>{{ scope.row.product || scope.row.productName || '--' }}</span>
               </template>
             </el-table-column>
-            <el-table-column prop="specification" label="鍥剧焊缂栧彿" width="200">
+            <el-table-column prop="specification" label="鍥剧焊缂栧彿" width="220">
               <template #default="scope">
-                <el-form-item :prop="`products.${scope.$index}.specificationId`" class="product-table-form-item">
-                  <el-select
-                    v-model="scope.row.specificationId"
-                    placeholder="璇烽�夋嫨"
-                    clearable
-                    @change="getProductModel($event, scope.row)"
-                    style="width: 100%"
-                  >
-                    <el-option
-                      v-for="item in scope.row.modelOptions || []"
-                      :key="item.id"
-                      :label="item.model"
-                      :value="item.id"
-                    />
-                  </el-select>
-                </el-form-item>
+                <span>{{ scope.row.specification || '--' }}</span>
               </template>
             </el-table-column>
             <el-table-column prop="unit" label="鍗曚綅">
@@ -275,7 +249,7 @@
             <el-table-column prop="unitPrice" label="鍗曚环">
               <template #default="scope">
                 <el-form-item :prop="`products.${scope.$index}.unitPrice`" class="product-table-form-item">
-                  <el-input-number v-model="scope.row.unitPrice" :min="0" :precision="2" style="width: 100%" />
+                  <el-input-number v-model="scope.row.unitPrice" :min="0.01" :precision="2" :step="0.01" style="width: 100%" />
                 </el-form-item>
               </template>
             </el-table-column>
@@ -313,6 +287,12 @@
       </el-form>
       </div>
     </FormDialog>
+
+    <ProductSelectDialog
+      v-model="productSelectVisible"
+      :single="true"
+      @confirm="handleProductSelectConfirm"
+    />
 
     <!-- 鏌ョ湅璇︽儏瀵硅瘽妗� -->
     <el-dialog v-model="viewDialogVisible" title="鎶ヤ环璇︽儏" width="800px">
@@ -359,6 +339,7 @@
 import { Search, Document, UserFilled, Box, EditPen, Plus, ArrowRight, Delete } from '@element-plus/icons-vue'
 import Pagination from '@/components/PIMTable/Pagination.vue'
 import FormDialog from '@/components/Dialog/FormDialog.vue'
+import ProductSelectDialog from '@/views/basicData/product/ProductSelectDialog.vue'
 import {getQuotationList,addQuotation,updateQuotation,deleteQuotation} from '@/api/salesManagement/salesQuotation.js'
 import {userListNoPage} from "@/api/system/user.js";
 import {customerList} from "@/api/salesManagement/salesLedger.js";
@@ -374,7 +355,6 @@
 
 const quotationList = ref([])
 const productOptions = ref([]);
-const modelOptions = ref([]);
 const pagination = reactive({
   total: 3,
   currentPage: 1,
@@ -383,6 +363,8 @@
 
 const dialogVisible = ref(false)
 const viewDialogVisible = ref(false)
+const productSelectVisible = ref(false)
+const activeProductIndex = ref(-1)
 const dialogTitle = ref('鏂板鎶ヤ环')
 const form = reactive({
   quotationNo: '',
@@ -541,65 +523,6 @@
 	}
 	return null;
 }
-const getModels = (value, row) => {
-	if (!row) return;
-	// 濡傛灉娓呯┖閫夋嫨锛屽垯娓呯┖鐩稿叧瀛楁
-	if (!value) {
-		row.productId = '';
-		row.product = '';
-		row.modelOptions = [];
-		row.specificationId = '';
-		row.specification = '';
-		row.unit = '';
-		return;
-	}
-	// 鏇存柊 productId锛坴-model 宸茬粡鑷姩鏇存柊锛岃繖閲岀‘淇濅竴鑷存�э級
-	row.productId = value;
-	// 鎵惧埌瀵瑰簲鐨� label 骞惰祴鍊肩粰 row.product
-	const label = findNodeById(productOptions.value, value);
-	if (label) {
-		row.product = label;
-	}
-	// 鑾峰彇瑙勬牸鍨嬪彿鍒楄〃锛岃缃埌褰撳墠琛岀殑 modelOptions
-	modelList({ id: value }).then((res) => {
-		row.modelOptions = res || [];
-	});
-};
-const getProductModel = (value, row) => {
-	if (!row) return;
-	// 濡傛灉娓呯┖閫夋嫨锛屽垯娓呯┖鐩稿叧瀛楁
-	if (!value) {
-		row.specificationId = '';
-		row.specification = '';
-		row.unit = '';
-		return;
-	}
-	// 鏇存柊 specificationId锛坴-model 宸茬粡鑷姩鏇存柊锛岃繖閲岀‘淇濅竴鑷存�э級
-	row.specificationId = value;
-	const modelOptions = row.modelOptions || [];
-	const index = modelOptions.findIndex((item) => item.id === value);
-	if (index !== -1) {
-		row.specification = modelOptions[index].model;
-		row.unit = modelOptions[index].unit;
-	} else {
-		row.specification = '';
-		row.unit = '';
-	}
-};
-const findNodeById = (nodes, productId) => {
-	for (let i = 0; i < nodes.length; i++) {
-		if (nodes[i].value === productId) {
-			return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥� label
-		}
-		if (nodes[i].children && nodes[i].children.length > 0) {
-			const foundLabel = findNodeById(nodes[i].children, productId);
-			if (foundLabel) {
-				return foundLabel; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖 label
-			}
-		}
-	}
-	return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
 const handleView = (row) => {
   // 鍙鍒堕渶瑕佺殑瀛楁锛岄伩鍏嶅皢缁勪欢寮曠敤鏀惧叆鍝嶅簲寮忓璞�
   currentQuotation.value = {
@@ -755,23 +678,51 @@
 }
 
 const addProduct = () => {
-  form.products.push({
-    productId: '',
-    product: '',
-    productName: '',
-    specificationId: '',
-    specification: '',
-    quantity: 1,
-    unit: '',
-    unitPrice: 0,
-    amount: 0,
-    modelOptions: [] // 涓烘瘡琛屾坊鍔犵嫭绔嬬殑瑙勬牸鍨嬪彿鍒楄〃
-  })
+  activeProductIndex.value = -1
+  productSelectVisible.value = true
 }
 
 const removeProduct = (index) => {
   form.products.splice(index, 1)
   calculateSubtotal()
+}
+
+const handleProductSelectConfirm = (rows) => {
+  if (!rows || rows.length === 0 || activeProductIndex.value < 0) {
+    if (!rows || rows.length === 0) {
+      return
+    }
+    const selected = rows[0]
+    form.products.push({
+      productId: selected.id,
+      product: selected.productName || '',
+      productName: selected.productName || '',
+      specificationId: selected.id,
+      specification: selected.model || '',
+      quantity: 1,
+      unit: selected.unit || '',
+    unitPrice: 0.01,
+      amount: 0,
+      modelOptions: [],
+    })
+    calculateSubtotal()
+    activeProductIndex.value = -1
+    return
+  }
+
+  const row = form.products[activeProductIndex.value]
+  if (!row) {
+    return
+  }
+
+  const selected = rows[0]
+  row.productId = selected.id
+  row.product = selected.productName || ''
+  row.productName = selected.productName || ''
+  row.specificationId = selected.id
+  row.specification = selected.model || ''
+  row.unit = selected.unit || row.unit || ''
+  calculateAmount(row)
 }
 
 const calculateAmount = (product) => {
@@ -801,15 +752,17 @@
         return
       }
 
-      // 瀹℃壒浜哄繀濉牎楠�
-      const hasEmptyApprover = approverNodes.value.some(node => !node.userId)
-      if (hasEmptyApprover) {
-        ElMessage.error('璇蜂负鎵�鏈夊鎵硅妭鐐归�夋嫨瀹℃壒浜猴紒')
+      const hasInvalidPrice = form.products.some(product => Number(product.unitPrice) <= 0)
+      if (hasInvalidPrice) {
+        ElMessage.error('鍗曚环蹇呴』澶т簬0')
         return
       }
-      
-      // 鏀堕泦鎵�鏈夎妭鐐圭殑瀹℃壒浜篿d
-      form.approveUserIds = approverNodes.value.map(node => node.userId).join(',')
+
+      // 鏀堕泦鎵�鏈夎妭鐐圭殑瀹℃壒浜篿d锛屽厑璁镐负绌�
+      form.approveUserIds = approverNodes.value
+        .map(node => node.userId)
+        .filter(userId => userId !== null && userId !== undefined && userId !== '')
+        .join(',')
       
       // 璁$畻鎵�鏈変骇鍝佺殑鍗曚环鎬诲拰
       form.totalAmount = form.products.reduce((sum, product) => {

--
Gitblit v1.9.3