From 0453b4d1e92d7a4779ad70857891b17ced6abe2e Mon Sep 17 00:00:00 2001
From: ZN <zhang_12370@163.com>
Date: 星期六, 28 三月 2026 15:45:08 +0800
Subject: [PATCH] 同步华玺砂浆 同步
---
src/views/procurementManagement/advancedPriceManagement/index.vue | 227 ++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 154 insertions(+), 73 deletions(-)
diff --git a/src/views/procurementManagement/advancedPriceManagement/index.vue b/src/views/procurementManagement/advancedPriceManagement/index.vue
index 597b39b..d66c2c8 100644
--- a/src/views/procurementManagement/advancedPriceManagement/index.vue
+++ b/src/views/procurementManagement/advancedPriceManagement/index.vue
@@ -8,7 +8,7 @@
</el-form-item>
<el-form-item label="渚涘簲鍟嗭細">
<el-select v-model="searchForm.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" clearable style="width: 200px">
- <el-option v-for="supplier in supplierList" :key="supplier.id" :label="supplier.name" :value="supplier.id" />
+ <el-option v-for="supplier in supplierList" :key="supplier.id" :label="supplier.supplierName" :value="supplier.id" />
</el-select>
</el-form-item>
<el-form-item>
@@ -31,10 +31,10 @@
<el-icon><Plus /></el-icon>
鏂板浠锋牸
</el-button>
- <el-button type="success" @click="openBatchDiscountDialog">
+ <!-- <el-button type="success" @click="openBatchDiscountDialog">
<el-icon><Discount /></el-icon>
鎵归噺鎶樻墸
- </el-button>
+ </el-button> -->
<el-button type="info" @click="exportData">
<el-icon><Download /></el-icon>
瀵煎嚭鏁版嵁
@@ -62,17 +62,16 @@
<div class="product-info">
<div class="product-name">{{ row.productName }}</div>
<div class="product-spec">{{ row.specification }}</div>
- <div class="product-code">缂栫爜: {{ row.productCode }}</div>
</div>
</template>
</el-table-column>
- <el-table-column label="渚涘簲鍟�" prop="supplierName" width="150" />
- <el-table-column label="鍩虹浠锋牸" width="120" align="right">
+ <el-table-column label="渚涘簲鍟�" prop="supplierName" width="200" />
+ <el-table-column label="鍩虹浠锋牸(涓嶅惈绋�)" width="150" align="right">
<template #default="{ row }">
<span class="price-text">楼{{ row.basePrice }}</span>
</template>
</el-table-column>
- <el-table-column label="鎶樻墸淇℃伅" width="150">
+ <el-table-column label="鎶樻墸淇℃伅" width="120" align="center">
<template #default="{ row }">
<div v-if="row.discountType">
<el-tag :type="getDiscountTagType(row.discountType)" size="small">
@@ -83,9 +82,12 @@
<span v-else class="no-discount">鏃犳姌鎵�</span>
</template>
</el-table-column>
- <el-table-column label="瀹為檯浠锋牸" width="120" align="right">
+ <!-- <el-table-column label="瀹為檯浠锋牸(涓嶅惈绋�)" prop="actuallyPrice" width="150" align="right"> -->
+ <!-- </el-table-column> -->
+ <el-table-column label="瀹為檯浠锋牸(涓嶅惈绋�)" width="150" align="right">
<template #default="{ row }">
- <span class="final-price">楼{{ calculateFinalPrice(row) }}</span>
+ <!-- <span class="final-price">楼{{ calculateFinalPrice(row) }}</span> -->
+ <span class="final-price" >楼{{ row.actuallyPrice?row.actuallyPrice:row.basePrice }}</span>
</template>
</el-table-column>
<el-table-column label="浠锋牸鎺у埗" width="120">
@@ -103,13 +105,14 @@
<el-table-column label="鐘舵��" width="100" align="center">
<template #default="{ row }">
<el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
- <div v-if="isPriceWarning(row)" class="warning-indicator">
+ <!-- <div v-if="isPriceWarning(row)" class="warning-indicator">
<el-icon color="#F56C6C"><Warning /></el-icon>
- </div>
+ </div> -->
</template>
</el-table-column>
- <el-table-column label="鐢熸晥鏃堕棿" prop="effectiveTime" width="180" />
- <el-table-column label="鏇存柊鏃堕棿" prop="updateTime" width="180" sortable />
+ <el-table-column label="鐢熸晥鏃堕棿" prop="effectiveTime" width="100" align="center" />
+ <el-table-column label="鏇存柊鏃堕棿" prop="updateTime" width="160" sortable align="center" />
+ <el-table-column label="澶囨敞" width="200" prop="remark" align="center" show-overflow-tooltip />
<el-table-column label="鎿嶄綔" width="250" align="center" fixed="right">
<template #default="{ row }">
<el-button type="primary" link @click="openDialog('edit', row)">
@@ -143,38 +146,65 @@
<el-form :model="formData" :rules="formRules" ref="formRef" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="鍟嗗搧鍚嶇О" prop="productName">
- <el-select v-model="formData.productName" placeholder="璇烽�夋嫨鍟嗗搧" style="width: 100%" filterable>
- <el-option v-for="product in productList" :key="product.id" :label="product.name" :value="product.name" />
- </el-select>
+ <el-form-item label="鍟嗗搧鍚嶇О" prop="productId">
+ <el-tree-select
+ v-model="formData.productId"
+ placeholder="璇烽�夋嫨鍟嗗搧"
+ clearable
+ filterable
+ check-strictly
+ @change="getModels"
+ :data="productOptions"
+ :props="{ label: 'productName', value: 'id', children: 'children' }"
+ node-key="id"
+ :render-after-expand="false"
+ style="width: 100%"
+ />
</el-form-item>
</el-col>
- <el-col :span="12">
- <el-form-item label="鍟嗗搧缂栫爜" prop="productCode">
- <el-input v-model="formData.productCode" placeholder="璇疯緭鍏ュ晢鍝佺紪鐮�" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="瑙勬牸鍨嬪彿" prop="specification">
- <el-input v-model="formData.specification" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟�" prop="supplierName">
- <el-select v-model="formData.supplierName" placeholder="璇烽�夋嫨渚涘簲鍟�" style="width: 100%">
- <el-option v-for="supplier in supplierList" :key="supplier.id" :label="supplier.name" :value="supplier.name" />
+ <el-select
+ v-model="formData.specification"
+ placeholder="璇烽�夋嫨"
+ clearable
+ @change="getProductModel"
+ >
+ <el-option
+ v-for="item in modelOptions"
+ :key="item.id"
+ :label="item.model"
+ :value="item.id"
+ />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="渚涘簲鍟�" prop="supplierId">
+ <el-select
+ v-model="formData.supplierId"
+ placeholder="璇烽�夋嫨渚涘簲鍟�"
+ clearable
+ @change="handleSupplierChange"
+ >
+ <el-option
+ v-for="item in supplierList"
+ :key="item.id"
+ :label="item.supplierName"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
<el-col :span="12">
<el-form-item label="鍩虹浠锋牸" prop="basePrice">
<el-input-number v-model="formData.basePrice" :min="0" :precision="2" placeholder="璇疯緭鍏ュ熀纭�浠锋牸" style="width: 100%" />
</el-form-item>
</el-col>
+ </el-row>
+ <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="鍗曚綅">
<el-input v-model="formData.unit" placeholder="璇疯緭鍏ュ崟浣�" />
@@ -185,7 +215,7 @@
<!-- 鎶樻墸璁剧疆 -->
<el-divider content-position="left">鎶樻墸璁剧疆</el-divider>
<el-row :gutter="20">
- <el-col :span="8">
+ <el-col :span="12">
<el-form-item label="鎶樻墸绫诲瀷">
<el-select v-model="formData.discountType" placeholder="璇烽�夋嫨鎶樻墸绫诲瀷" style="width: 100%">
<el-option label="鏃犳姌鎵�" value="" />
@@ -194,10 +224,11 @@
</el-select>
</el-form-item>
</el-col>
- <el-col :span="8">
- <el-form-item label="鎶樻墸鍊�" v-if="formData.discountType && formData.discountType !== 'tiered'">
+ <el-col :span="12">
+ <el-form-item label="鎶樻墸鍊�">
<el-input-number
v-model="formData.discountValue"
+ :disabled="!(formData.discountType && formData.discountType !== 'tiered')"
:min="0"
:max="formData.discountType === 'percentage' ? 100 : undefined"
:precision="2"
@@ -206,10 +237,11 @@
/>
</el-form-item>
</el-col>
- <el-col :span="8">
+ <el-col :span="12">
<el-form-item label="鎶樻墸鏈夋晥鏈�">
<el-date-picker
v-model="formData.discountEndTime"
+ :disabled="!(formData.discountType && formData.discountType !== 'tiered')"
type="datetime"
placeholder="閫夋嫨缁撴潫鏃堕棿"
style="width: 100%"
@@ -221,19 +253,14 @@
<!-- 浠锋牸鎺у埗 -->
<el-divider content-position="left">浠锋牸鎺у埗</el-divider>
<el-row :gutter="20">
- <el-col :span="8">
+ <el-col :span="12">
<el-form-item label="鏈�浣庝环鏍�">
<el-input-number v-model="formData.minPrice" :min="0" :precision="2" placeholder="鏈�浣庝环鏍�" style="width: 100%" />
</el-form-item>
</el-col>
- <el-col :span="8">
+ <el-col :span="12">
<el-form-item label="鏈�楂樹环鏍�">
<el-input-number v-model="formData.maxPrice" :min="0" :precision="2" placeholder="鏈�楂樹环鏍�" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="棰勮闃堝��(%)">
- <el-input-number v-model="formData.warningThreshold" :min="0" :max="100" :precision="1" placeholder="棰勮闃堝��" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
@@ -334,12 +361,14 @@
<script setup>
import {ref, reactive, computed, onMounted, getCurrentInstance} from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
+import { productTreeList, modelList } from "@/api/basicData/product.js";
import {
Search, Refresh, Plus, Discount, Setting, Download, Delete, Edit,
- Warning
} from '@element-plus/icons-vue'
import { listPage, update, del, add } from '@/api/procurementManagement/advancedPriceManagement'
-
+import {
+ getOptions,
+} from "@/api/procurementManagement/procurementLedger.js";
// 鍝嶅簲寮忔暟鎹�
const loading = ref(false)
const submitLoading = ref(false)
@@ -347,6 +376,8 @@
const batchDiscountVisible = ref(false)
const priceControlVisible = ref(false)
const dialogType = ref('add')
+const productOptions = ref([]);
+const modelOptions = ref([]);
const selectedRows = ref([])
const formRef = ref()
@@ -367,10 +398,12 @@
// 琛ㄥ崟鏁版嵁
const formData = reactive({
+ productId: null,
productName: '',
- productCode: '',
specification: '',
+ supplierId: null,
supplierName: '',
+ specificationId: null,
basePrice: 0,
unit: '',
discountType: '',
@@ -405,24 +438,18 @@
// 琛ㄥ崟楠岃瘉瑙勫垯
const formRules = {
- productName: [{ required: true, message: '璇烽�夋嫨鍟嗗搧鍚嶇О', trigger: 'change' }],
- productCode: [{ required: true, message: '璇疯緭鍏ュ晢鍝佺紪鐮�', trigger: 'blur' }],
- supplierName: [{ required: true, message: '璇烽�夋嫨渚涘簲鍟�', trigger: 'change' }],
+ productId: [{ required: true, message: '璇烽�夋嫨鍟嗗搧鍚嶇О', trigger: 'change' }],
+ supplierId: [{ required: true, message: '璇烽�夋嫨渚涘簲鍟�', trigger: 'change' }],
basePrice: [{ required: true, message: '璇疯緭鍏ュ熀纭�浠锋牸', trigger: 'blur' }],
effectiveTime: [{ required: true, message: '璇烽�夋嫨鐢熸晥鏃堕棿', trigger: 'change' }],
reason: [{ required: true, message: '璇烽�夋嫨璋冧环鍘熷洜', trigger: 'change' }]
}
-const supplierList = ref([
- { id: 1, name: '浼樿川浜旈噾渚涘簲鍟�' },
- { id: 2, name: '閽㈡潗璐告槗鍏徃' },
- { id: 3, name: '寤烘潗鎵瑰彂鍟�' }
-])
+getOptions().then((res) => {
+ supplierList.value = res.data;
+ });
-const productList = ref([
- { id: 1, name: '楂樺己搴﹁灪鏍�' },
- { id: 2, name: '涓嶉攬閽㈢' },
- { id: 3, name: '閾濆悎閲戝瀷鏉�' }
+const supplierList = ref([
])
@@ -434,7 +461,8 @@
} else if (row.discountType === 'fixed') {
finalPrice = row.basePrice - row.discountValue
}
- return Math.max(finalPrice, 0)
+ let man = Math.max(finalPrice, 0)
+ return man.toFixed(2)
}
const getDiscountTagType = (discountType) => {
@@ -454,6 +482,39 @@
return textMap[discountType] || '鏈煡'
}
+const getProductOptions = () => {
+ productTreeList().then((res) => {
+ productOptions.value = res;
+ });
+};
+
+const findNodeById = (data, id) => {
+ for (const item of data) {
+ if (item.id === id) return item;
+ if (item.children) {
+ const found = findNodeById(item.children, id);
+ if (found) return found;
+ }
+ }
+ return null;
+};
+
+const getModels = (value) => {
+ if (value) {
+ const selectedProduct = findNodeById(productOptions.value, value);
+ if (selectedProduct) {
+ formData.productName = selectedProduct.productName;
+ }
+ modelList({ id: value }).then((res) => {
+ modelOptions.value = res;
+ });
+ formData.specification = "";
+ } else {
+ formData.productName = "";
+ modelOptions.value = [];
+ }
+};
+
const getStatusType = (status) => {
const statusMap = {
active: 'success',
@@ -461,6 +522,27 @@
expired: 'info'
}
return statusMap[status] || 'info'
+}
+
+const getProductModel = (value) => {
+ const index = modelOptions.value.findIndex((item) => item.id === value);
+ if (index !== -1) {
+ formData.specification = modelOptions.value[index].model;
+ formData.specificationId = modelOptions.value[index].id;
+ formData.unit = modelOptions.value[index].unit;
+ } else {
+ formData.specification = null;
+ formData.specificationId = null;
+ formData.unit = null;
+ }
+};
+
+const handleSupplierChange = (value) => {
+ const supplier = supplierList.value.find(supplier => supplier.id === value)
+ if (supplier) {
+ formData.supplierId = supplier.id
+ formData.supplierName = supplier.supplierName
+ }
}
const getStatusText = (status) => {
@@ -471,13 +553,6 @@
}
return statusMap[status] || '鏈煡'
}
-
-const isPriceWarning = (row) => {
- if (!row.priceControl) return false
- const finalPrice = calculateFinalPrice(row)
- return finalPrice < row.priceControl.minPrice || finalPrice > row.priceControl.maxPrice
-}
-
const handleSearch = () => {
loading.value = true
@@ -501,10 +576,14 @@
const openDialog = (type, row = {}) => {
dialogType.value = type
if (type === 'edit' && row.id) {
+ // 澶嶅埗琛屾暟鎹埌琛ㄥ崟
Object.assign(formData, {
...row,
- minPrice: row.priceControl?.minPrice,
- maxPrice: row.priceControl?.maxPrice,
+ // 鍏煎涓ょ鏁版嵁缁撴瀯锛氬钩閾虹殑瀛楁鎴栧祵濂楀湪 priceControl 涓殑瀛楁
+ minPrice: row.minPrice ?? row.priceControl?.minPrice,
+ maxPrice: row.maxPrice ?? row.priceControl?.maxPrice,
+ // 纭繚鎶樻墸鏈夋晥鏈熶篃琚祴鍊� (濡傛灉 row.discountEndTime 瀛樺湪鐨勮瘽)
+ discountEndTime: row.discountEndTime || row.discountEndTime,
tieredDiscount: row.tieredDiscount || []
})
} else {
@@ -515,9 +594,10 @@
const resetFormData = () => {
Object.assign(formData, {
+ productId: null,
productName: '',
- productCode: '',
specification: '',
+ supplierId: null,
supplierName: '',
basePrice: 0,
unit: '',
@@ -543,13 +623,13 @@
})
}
-const removeTieredRow = (index) => {
- formData.tieredDiscount.splice(index, 1)
-}
-
const handleSubmit = async () => {
if (!formRef.value) return
-
+ formData.actuallyPrice = Number(calculateFinalPrice(formData))
+ if( formData.discountType === ''){
+ formData.discountEndTime = '2099-12-31 23:59:59'
+ }
+
try {
await formRef.value.validate()
submitLoading.value = true
@@ -677,6 +757,7 @@
// 鐢熷懡鍛ㄦ湡
onMounted(() => {
handleSearch()
+ getProductOptions()
})
</script>
--
Gitblit v1.9.3