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