From a863e15f2cac29885cd8ca779013c2b18c2398d5 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期三, 21 十月 2026 15:09:09 +0800
Subject: [PATCH] feat: 增加平遥县盛达铸造厂

---
 src/views/procurementManagement/procurementReport/index.vue |  141 ++++++++++++++++++++++++++++------------------
 1 files changed, 85 insertions(+), 56 deletions(-)

diff --git a/src/views/procurementManagement/procurementReport/index.vue b/src/views/procurementManagement/procurementReport/index.vue
index 93eb7d9..e491a08 100644
--- a/src/views/procurementManagement/procurementReport/index.vue
+++ b/src/views/procurementManagement/procurementReport/index.vue
@@ -25,6 +25,22 @@
             style="width: 200px"
           />
         </el-form-item>
+        <el-form-item label="浜у搧瑙勬牸锛�">
+          <el-select
+            v-model="searchForm.specificationModel"
+            placeholder="璇烽�夋嫨浜у搧瑙勬牸"
+            clearable
+            filterable
+            style="width: 200px"
+          >
+            <el-option
+              v-for="m in modelOptions"
+              :key="m.value"
+              :label="m.label"
+              :value="m.value"
+            />
+          </el-select>
+        </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="handleSearch" :loading="loading">
             鏌ヨ
@@ -48,7 +64,7 @@
           <div class="summary-stats">
             <div class="stat-item">
               <span class="stat-label">閲囪喘鎬婚锛�</span>
-              <span class="stat-value">楼{{ businessSummaryStats.totalAmount.toLocaleString() }}</span>
+              <span class="stat-value">楼{{ formatStatAmount(businessSummaryStats.totalAmount) }}</span>
             </div>
             <div class="stat-item">
               <span class="stat-label">鍟嗗搧绉嶇被锛�</span>
@@ -56,7 +72,7 @@
             </div>
             <div class="stat-item">
               <span class="stat-label">閫�娆炬�婚锛�</span>
-              <span class="stat-value">{{ businessSummaryStats.returnAmount }}</span>
+              <span class="stat-value">楼{{ formatStatAmount(businessSummaryStats.returnAmount) }}</span>
             </div>
           </div>
         </div>
@@ -92,17 +108,41 @@
 // 鎼滅储琛ㄥ崟
 const searchForm = reactive({
   dateRange: [],
-  productCategory: ''
+  productCategory: '',
+  specificationModel: ''
 })
 
 // 浜у搧绫诲埆鏍戦�夐」
 const productOptions = ref([])
 
+// 浜у搧瑙勬牸閫夐」锛堟寜鎶ヨ〃瀹為檯鍑虹幇鐨勮鏍煎姩鎬佺敓鎴愶級
+const modelOptions = ref([])
+
 // 缁熻鏁版嵁
 const businessSummaryStats = ref({
   totalAmount: 0,
+  returnAmount: 0,
   productTypes: 0
 })
+
+// 鏁板�煎睍绀哄彛寰勶細鍚庣杩斿洖 6 浣嶅皬鏁帮紙濡� 211.970000銆伮�3,420,674.200000锛夛紝
+// 椤甸潰鎸夊悗绔疄闄呬綅鏁板睍绀哄嵆鍙紝涓嶅啀琛ラ綈 6 浣嶁�斺�斿浣欑殑缁撳熬 0 涓�寰嬪幓鎺夈��
+// maximumFractionDigits 淇濈暀 6锛屾槸涓轰簡鍏滀綇鍓嶇鑷繁 reduce 姹傚拰鏃剁殑娴偣灏炬暟锛堝 3420674.2000000002锛夈��
+const NUM_FMT = { maximumFractionDigits: 6 }
+
+// 鏁伴噺/閲戦缁熶竴鏍煎紡鍖栵細甯﹀崈鍒嗕綅锛屽幓鎺夌粨灏惧浣欑殑 0锛涚┖鍊兼寜 0 澶勭悊
+const formatNum = (val, prefix = '') => {
+  const num = parseFloat(val)
+  if (val === null || val === undefined || val === '' || Number.isNaN(num)) {
+    return `${prefix}0`
+  }
+  return `${prefix}${num.toLocaleString('zh-CN', NUM_FMT)}`
+}
+
+// 姹囨�婚噾棰濆睍绀�
+const formatStatAmount = (val) => {
+  return formatNum(val)
+}
 
 // 琛ㄦ牸鍒楅厤缃紙鏍规嵁鍚庣瀛楁瀹氫箟锛�
 const tableColumns = ref([
@@ -118,32 +158,24 @@
     label: '閲囪喘鏁伴噺',
     prop: 'purchaseNum',
     width: 120,
-    formatData: (val) => {
-      return val ? parseFloat(val).toLocaleString() : '0'
-    }
+    formatData: (val) => formatNum(val)
   },
   {
     label: '閫�璐ф暟閲�',
     prop: 'returnQuantity',
     width: 120,
-    formatData: (val) => {
-      return val ? parseFloat(val).toLocaleString() : '0'
-    }
+    formatData: (val) => formatNum(val)
   },
   {
     label: '閫�璐ч噾棰�',
     prop: 'returnAmount',
     width: 120,
-    formatData: (val) => {
-      return val ? `楼${parseFloat(val).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : '楼0.00'
-    }
+    formatData: (val) => formatNum(val, '楼')
   },
   {
     label: '閫�娆惧偍閲�',
     prop: 'purchaseAmount',
-    formatData: (val) => {
-      return val ? `楼${parseFloat(val).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : '楼0.00'
-    }
+    formatData: (val) => formatNum(val, '楼')
   },
   {
     label: '閲囪喘娆℃暟',
@@ -154,9 +186,7 @@
     label: '骞冲潎鍗曚环',
     prop: 'averagePrice',
     width: 120,
-    formatData: (val) => {
-      return val ? `楼${parseFloat(val).toFixed(2)}` : '楼0.00'
-    }
+    formatData: (val) => formatNum(val, '楼')
   },
   {
     label: '渚涘簲鍟嗗悕绉�',
@@ -224,51 +254,55 @@
   try {
     loading.value = true
     const params = {}
-    
+
     // 鏃堕棿鑼冨洿
     if (searchForm.dateRange && searchForm.dateRange.length === 2) {
       params.entryDateStart = searchForm.dateRange[0]
       params.entryDateEnd = searchForm.dateRange[1]
     }
-    
-    // 浜у搧绫诲埆
+
+    // 浜у搧澶х被
     if (searchForm.productCategory) {
       const categoryName = findNodeLabelById(productOptions.value, searchForm.productCategory)
       if (categoryName) {
         params.productCategory = categoryName
       }
     }
-    
-    // 鍒嗛〉鍙傛暟
-    params.current = page.current
-    params.size = page.size
+
+    // 鎶ヨ〃鎸夈�屼骇鍝佸ぇ绫�+瑙勬牸+渚涘簲鍟嗐�嶈仛鍚堬紝鏁版嵁閲忓皬锛屼竴娆″彇鍥炲悗鎸夎鏍兼湰鍦拌繃婊�
+    params.current = 1
+    params.size = 1000
 
     const res = await procurementBusinessSummaryListPage(params)
-    if (res && res.data) {
-      // 鍏煎鍚庣鍙兘鐩存帴杩斿洖鏁扮粍/鎴栬繑鍥炲垎椤靛璞�
-      businessSummaryData.value = Array.isArray(res.data) ? res.data : (res.data.records || [])
+    const payload = res && res.data !== undefined ? res.data : res
+    let rows = Array.isArray(payload) ? payload : ((payload && payload.records) || [])
 
-      if (!Array.isArray(res.data)) {
-        page.total = Number(res.data.total ?? 0)
-        page.current = Number(res.data.current ?? page.current)
-        page.size = Number(res.data.size ?? page.size)
-      }
-      
-      // 璁$畻缁熻鏁版嵁
-      if (businessSummaryData.value.length > 0) {
-        businessSummaryStats.value.totalAmount = businessSummaryData.value.reduce((sum, item) => {
-          return sum + (parseFloat(item.purchaseAmount) || 0)
-        }, 0)
-        businessSummaryStats.value.returnAmount = businessSummaryData.value.reduce((sum, item) => {
-          return sum + (parseFloat(item.returnAmount) || 0)
-        }, 0)
-      } else {
-        businessSummaryStats.value = {
-          totalAmount: 0,
-          productTypes: 0
-        }
-      }
+    // 瑙勬牸涓嬫媺閫夐」闅忓綋鍓嶆煡璇㈢粨鏋滃姩鎬佺敓鎴�
+    const specSet = []
+    rows.forEach((item) => {
+      const sp = item.specificationModel
+      if (sp && specSet.indexOf(sp) === -1) specSet.push(sp)
+    })
+    modelOptions.value = specSet.sort().map((sp) => ({ label: sp, value: sp }))
+
+    // 浜у搧瑙勬牸杩囨护
+    if (searchForm.specificationModel) {
+      rows = rows.filter((item) => item.specificationModel === searchForm.specificationModel)
     }
+
+    page.total = rows.length
+    if (page.current < 1) page.current = 1
+    const startIdx = (page.current - 1) * page.size
+    businessSummaryData.value = rows.slice(startIdx, startIdx + page.size)
+
+    // 缁熻鎸夊叏閲忚繃婊ょ粨鏋滃彛寰�
+    businessSummaryStats.value.totalAmount = rows.reduce((sum, item) => {
+      return sum + (parseFloat(item.purchaseAmount) || 0)
+    }, 0)
+    businessSummaryStats.value.returnAmount = rows.reduce((sum, item) => {
+      return sum + (parseFloat(item.returnAmount) || 0)
+    }, 0)
+    businessSummaryStats.value.productTypes = rows.length
   } catch (error) {
     console.error('鏌ヨ澶辫触:', error)
   } finally {
@@ -286,7 +320,8 @@
 const resetSearch = () => {
   Object.assign(searchForm, {
     dateRange: [],
-    productCategory: ''
+    productCategory: '',
+    specificationModel: ''
   })
   page.current = 1
   handleSearch()
@@ -314,7 +349,7 @@
 
 
 onMounted(() => {
-  // 鍒濆鍖栦骇鍝佺被鍒爲
+  // 鍒濆鍖栦骇鍝佺被鍒爲銆佷骇鍝佽鏍�
   getProductOptions()
   
   // 璁剧疆榛樿鏃堕棿鑼冨洿涓烘渶杩�30澶�
@@ -333,12 +368,6 @@
 </script>
 
 <style scoped>
-.app-container {
-  padding: 20px;
-  background-color: #f5f7fa;
-  min-height: 100vh;
-}
-
 .page-header {
   text-align: center;
   margin-bottom: 20px;

--
Gitblit v1.9.3