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/procurementLedger/index.vue       |  266 +++++++++++++++++++++++++++++
 src/views/procurementManagement/advancedPriceManagement/index.vue |  227 +++++++++++++++++--------
 2 files changed, 417 insertions(+), 76 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>
 
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 101e630..abe5ed9 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -225,6 +225,7 @@
                 v-model="form.supplierId"
                 placeholder="璇烽�夋嫨"
                 clearable
+                @change="handleSupplierChange"
               >
                 <el-option
                   v-for="item in supplierList"
@@ -485,6 +486,11 @@
 							</el-select>
 						</el-form-item>
 					</el-col>
+          <el-col :span="24">
+            <el-form-item label=" ">
+              <el-button type="warning" :disabled="!(productForm.productId && productForm.productModelId && productForm.taxRate)" @click="showPriceReference" icon="Search">鏌ョ湅鍘嗗彶閲囪喘浠锋牸鍙傝��</el-button>
+            </el-form-item>
+          </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
@@ -695,6 +701,83 @@
       </template>
     </el-dialog>
 
+    <!-- 鍘嗗彶閲囪喘浠锋牸鍙傝�冨脊绐� -->
+    <el-dialog
+      v-model="priceReferenceVisible"
+      :title="`鍘嗗彶閲囪喘浠锋牸鍙傝�� ${productForm.supplierName}-${productForm.productName}-${productForm.productModel}`"
+      width="1000px"
+      append-to-body
+    >
+      <el-table 
+        :data="priceReferenceData" 
+        border 
+        v-loading="priceReferenceLoading" 
+        :default-sort="{ prop: 'updateTime', order: 'descending' }"
+      >
+        <!-- <el-table-column label="鍟嗗搧淇℃伅" min-width="200">
+          <template #default="{ row }">
+            <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="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="瀹為檯浠锋牸(涓嶅惈绋�)" prop="actuallyPrice" width="150" align="right"/>
+        <el-table-column label="鎶樻墸淇℃伅" width="120" align="center">
+          <template #default="{ row }">
+            <div v-if="row.discountType">
+              <el-tag :type="getDiscountTagType(row.discountType)" size="small">
+                {{ getDiscountText(row.discountType) }}
+              </el-tag>
+              <div class="discount-value">{{ row.discountValue }}{{ row.discountType === 'percentage' ? '%' : '鍏�' }}</div>
+            </div>
+            <span v-else class="no-discount">鏃犳姌鎵�</span>
+          </template>
+        </el-table-column>
+        <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">
+              <el-icon color="#F56C6C"><Warning /></el-icon>
+            </div> -->
+          </template>
+        </el-table-column>
+        <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="100" align="center" fixed="right">
+          <template #default="{ row }">
+            <el-button type="success" link @click="selectPriceReference(row)">
+              <el-icon><Check /></el-icon>
+              寮曠敤
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <div class="pagination-container" style="margin-top: 20px; display: flex; justify-content: flex-end;">
+        <el-pagination
+          v-model:current-page="priceReferencePagination.current"
+          v-model:page-size="priceReferencePagination.size"
+          :page-sizes="[10, 20, 50]"
+          :total="priceReferenceTotal"
+          layout="total, sizes, prev, pager, next"
+          @size-change="handlePriceReferenceSizeChange"
+          @current-change="handlePriceReferenceCurrentChange"
+        />
+      </div>
+      <template #footer>
+        <el-button @click="priceReferenceVisible = false">鍏抽棴</el-button>
+      </template>
+    </el-dialog>
+
     <!-- 鎵爜鐧昏瀵硅瘽妗� -->
     <el-dialog
       v-model="scanDialogVisible"
@@ -793,7 +876,7 @@
 import { getToken } from "@/utils/auth";
 import pagination from "@/components/PIMTable/Pagination.vue";
 import { ref, onMounted, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
-import { Search } from "@element-plus/icons-vue";
+import { Search, Check } from "@element-plus/icons-vue";
 import { ElMessageBox } from "element-plus";
 import { userListNoPage } from "@/api/system/user.js";
 import {
@@ -834,6 +917,7 @@
 const fileList = ref([]);
 import useUserStore from "@/store/modules/user";
 import { modelList, productTreeList } from "@/api/basicData/product.js";
+import { listPage as listAdvancedPrice } from "@/api/procurementManagement/advancedPriceManagement.js";
 import dayjs from "dayjs";
 
 const userStore = useUserStore();
@@ -899,6 +983,9 @@
     taxExclusiveTotalPrice: "",
     invoiceType: "",
 		warnNum: "",
+    supplierName: "",
+    productName: "",
+    productModel: "",
   },
   productRules: {
     productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -920,6 +1007,139 @@
   },
 });
 const { productForm, productRules } = toRefs(productFormData);
+
+// 閲囪喘浠锋牸绠$悊鍙傝�冨脊绐�
+const priceReferenceVisible = ref(false);
+const priceReferenceLoading = ref(false);
+const priceReferenceData = ref([]);
+const priceReferenceTotal = ref(0);
+const priceReferencePagination = reactive({
+  current: 1,
+  size: 10
+});
+
+const calculateFinalPrice = (row) => {
+  let finalPrice = row.basePrice;
+  if (row.discountType === "percentage") {
+    finalPrice = row.basePrice * (1 - row.discountValue / 100);
+  } else if (row.discountType === "fixed") {
+    finalPrice = row.basePrice - row.discountValue;
+  }
+  let man = Math.max(finalPrice, 0);
+  return man.toFixed(2);
+};
+
+const getDiscountTagType = (discountType) => {
+  const typeMap = {
+    percentage: "success",
+    fixed: "warning",
+    tiered: "info",
+  };
+  return typeMap[discountType] || "info";
+};
+
+const getDiscountText = (discountType) => {
+  const textMap = {
+    percentage: "鐧惧垎姣�",
+    fixed: "鍥哄畾閲戦",
+  };
+  return textMap[discountType] || "鏈煡";
+};
+
+const getStatusType = (status) => {
+  const statusMap = {
+    active: "success",
+    pending: "warning",
+    expired: "info",
+  };
+  return statusMap[status] || "info";
+};
+
+const getStatusText = (status) => {
+  const statusMap = {
+    active: "鏈夋晥",
+    pending: "寰呯敓鏁�",
+    expired: "宸茶繃鏈�",
+  };
+  return statusMap[status] || "鏈煡";
+};
+
+const showPriceReference = () => {
+  if (form.value.supplierId) {
+    const supplier = supplierList.value.find((item) => item.id === form.value.supplierId);
+    if (supplier) {
+      productForm.value.supplierName = supplier.supplierName;
+    }
+  }
+  priceReferenceVisible.value = true;
+  handlePriceReferenceSearch();
+};
+
+const handlePriceReferenceSearch = () => {
+  priceReferenceLoading.value = true;
+  // 妯℃嫙鎼滅储鍙傛暟锛歱roductId 鏄犲皠涓� productName 鎴� ID锛岃繖閲屾牴鎹� advancedPriceManagement 鐨� API 纭畾鍙傛暟
+  // 鍋囪楂樼骇浠锋牸绠$悊鐨� listPage 鎺ユ敹 productId
+  const query = {
+    productId: productForm.value.productId,
+    supplierId: form.value.supplierId,
+    current: priceReferencePagination.current,
+    size: priceReferencePagination.size
+  };
+  listAdvancedPrice(query).then(res => {
+    console.log(res);
+    priceReferenceData.value = res.data.records;
+    priceReferenceTotal.value = res.data.total;
+    priceReferenceLoading.value = false;
+  }).catch(() => {
+    priceReferenceLoading.value = false;
+  });
+};
+
+const handlePriceReferenceSizeChange = (size) => {
+  priceReferencePagination.size = size;
+  handlePriceReferenceSearch();
+};
+
+const handlePriceReferenceCurrentChange = (page) => {
+  priceReferencePagination.current = page;
+  handlePriceReferenceSearch();
+};
+
+const selectPriceReference = (row) => {
+  // 璁$畻鍘嗗彶浠锋牸锛堜綔涓轰笉鍚◣鍗曚环锛夛細鍩虹浠锋牸 - 鎶樻墸
+  let taxExclusivePrice = row.basePrice;
+  if (row.discountType === "percentage") {
+    taxExclusivePrice = row.basePrice * (1 - row.discountValue / 100);
+  } else if (row.discountType === "fixed") {
+    taxExclusivePrice = row.basePrice - row.discountValue;
+  }
+  taxExclusivePrice = Number(Math.max(taxExclusivePrice, 0));
+
+  // 璁剧疆鏁伴噺涓� 1
+  if (!productForm.value.quantity) {
+    productForm.value.quantity = 1;
+  }
+
+  // 濡傛灉宸叉湁绋庣巼锛屽垯璁$畻鍚◣鍗曚环
+  if (productForm.value.taxRate) {
+    const taxRate = Number(productForm.value.taxRate);
+    productForm.value.taxInclusiveUnitPrice = (
+      taxExclusivePrice *
+      (1 + taxRate / 100)
+    ).toFixed(2);
+  } else {
+    // 濡傛灉娌℃湁绋庣巼锛屾殏鏃跺皢鍚◣鍗曚环璁句负涓嶅惈绋庝环鏍硷紝鎻愮ず鐢ㄦ埛閫夋嫨绋庣巼
+    productForm.value.taxInclusiveUnitPrice = taxExclusivePrice.toFixed(2);
+    proxy.$modal.msgWarning("璇烽�夋嫨绋庣巼浠ュ噯纭绠楀惈绋庝环鏍�");
+  }
+
+  // 鑷姩瑙﹀彂璁$畻閫昏緫锛堣绠楁�讳环绛夛級
+  mathNum();
+
+  priceReferenceVisible.value = false;
+  proxy.$modal.msgSuccess("宸插紩鐢ㄥ巻鍙蹭环鏍硷紙涓嶅惈绋庯級");
+};
+
 const upload = reactive({
   // 涓婁紶鐨勫湴鍧�
   url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
@@ -1135,13 +1355,38 @@
 };
 // 鎵撳紑浜у搧寮规
 const openProductForm = (type, row, index) => {
+  if(!form.value.supplierId){
+    proxy.$modal.msgWarning("璇烽�夋嫨渚涘簲鍟�");
+    return;
+  }
   productOperationType.value = type;
   productOperationIndex.value = index;
-  productForm.value = {};
+  productForm.value = {
+    supplierName: "",
+    productName: "",
+    productModel: "",
+  };
   proxy.resetForm("productFormRef");
   if (type === "edit") {
-    productForm.value = { ...row };
+    productForm.value = { 
+      ...row,
+      productName: row.productCategory || "",
+      productModel: row.specificationModel || ""
+    };
+    // 缂栬緫鏃讹紝鏍规嵁 productId 棰勫姞杞借鏍煎瀷鍙峰垪琛紝纭繚涓嬫媺妗嗘樉绀哄悕绉拌�岄潪 ID
+    if (productForm.value.productId) {
+      modelList({ id: productForm.value.productId }).then((res) => {
+        modelOptions.value = res;
+      });
+    }
   }
+  
+  // 纭繚渚涘簲鍟嗗悕绉板缁堝悓姝�
+  const supplier = supplierList.value.find((item) => item.id === form.value.supplierId);
+  if (supplier) {
+    productForm.value.supplierName = supplier.supplierName;
+  }
+  
   productFormVisible.value = true;
   getProductOptions();
 };
@@ -1153,11 +1398,14 @@
 const getModels = (value) => {
   if (value) {
     productForm.value.productCategory = findNodeById(productOptions.value, value) || "";
+    productForm.value.productName = productForm.value.productCategory;
+    productForm.value.productModelId = "";
     modelList({ id: value }).then((res) => {
       modelOptions.value = res;
     });
   } else {
     productForm.value.productCategory = "";
+    productForm.value.productName = "";
     modelOptions.value = [];
   }
 };
@@ -1165,12 +1413,24 @@
   const index = modelOptions.value.findIndex((item) => item.id === value);
   if (index !== -1) {
     productForm.value.specificationModel = modelOptions.value[index].model;
+    productForm.value.productModel = modelOptions.value[index].model;
     productForm.value.unit = modelOptions.value[index].unit;
   } else {
     productForm.value.specificationModel = null;
+    productForm.value.productModel = null;
     productForm.value.unit = null;
   }
 };
+const handleSupplierChange = (value) => {
+  const supplier = supplierList.value.find((item) => item.id === value);
+  if (supplier) {
+    form.value.supplierName = supplier.supplierName;
+    productForm.value.supplierName = supplier.supplierName;
+  } else {
+    form.value.supplierName = "";
+    productForm.value.supplierName = "";
+  }
+};
 const findNodeById = (nodes, productId) => {
   for (let i = 0; i < nodes.length; i++) {
     if (nodes[i].value === productId) {

--
Gitblit v1.9.3