From 4b3f8e5bcb537b8fd53695046da56efa44e98c85 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 17 九月 2025 15:24:00 +0800
Subject: [PATCH] 采购报表前端页面

---
 src/views/procurementManagement/procurementReport/index.vue |  847 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 847 insertions(+), 0 deletions(-)

diff --git a/src/views/procurementManagement/procurementReport/index.vue b/src/views/procurementManagement/procurementReport/index.vue
new file mode 100644
index 0000000..a12b4ba
--- /dev/null
+++ b/src/views/procurementManagement/procurementReport/index.vue
@@ -0,0 +1,847 @@
+<template>
+  <div class="app-container">
+    <!-- 鎶ヨ〃閫夋嫨鍣� -->
+    <el-card class="report-selector" shadow="never">
+      <el-tabs v-model="activeReport" @tab-change="handleReportChange">
+        <el-tab-pane label="閲囪喘璁㈠崟鎵ц姹囨�昏〃" name="orderSummary">
+          <template #label>
+            <span class="tab-label">
+              <el-icon><Document /></el-icon>
+              閲囪喘璁㈠崟鎵ц姹囨�昏〃
+            </span>
+          </template>
+        </el-tab-pane>
+        <el-tab-pane label="閲囪喘璁㈠崟鎵ц鏄庣粏琛�" name="orderDetail">
+          <template #label>
+            <span class="tab-label">
+              <el-icon><List /></el-icon>
+              閲囪喘璁㈠崟鎵ц鏄庣粏琛�
+            </span>
+          </template>
+        </el-tab-pane>
+        <el-tab-pane label="閲囪喘涓氬姟姹囨�昏〃" name="businessSummary">
+          <template #label>
+            <span class="tab-label">
+              <el-icon><TrendCharts /></el-icon>
+              閲囪喘涓氬姟姹囨�昏〃
+            </span>
+          </template>
+        </el-tab-pane>
+        <el-tab-pane label="渚涘簲鍟嗕緵璐ф眹鎬昏〃" name="supplierSummary">
+          <template #label>
+            <span class="tab-label">
+              <el-icon><Shop /></el-icon>
+              渚涘簲鍟嗕緵璐ф眹鎬昏〃
+            </span>
+          </template>
+        </el-tab-pane>
+      </el-tabs>
+    </el-card>
+
+    <!-- 鏌ヨ鏉′欢 -->
+    <el-card class="search-card" shadow="never">
+      <el-form :model="searchForm" :inline="true" class="search-form">
+        <el-form-item label="鏃堕棿鑼冨洿锛�">
+          <el-date-picker
+            v-model="searchForm.dateRange"
+            type="daterange"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            style="width: 240px"
+          />
+        </el-form-item>
+        <el-form-item label="渚涘簲鍟嗭細" v-if="activeReport === 'supplierSummary'">
+          <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-select>
+        </el-form-item>
+        <el-form-item label="鍟嗗搧绫诲埆锛�" v-if="activeReport === 'businessSummary'">
+          <el-select v-model="searchForm.categoryId" placeholder="璇烽�夋嫨鍟嗗搧绫诲埆" clearable style="width: 200px">
+            <el-option
+              v-for="category in categoryList"
+              :key="category.id"
+              :label="category.name"
+              :value="category.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleSearch" :loading="loading">
+            <el-icon><Search /></el-icon>
+            鏌ヨ
+          </el-button>
+          <el-button @click="resetSearch">
+            <el-icon><Refresh /></el-icon>
+            閲嶇疆
+          </el-button>
+          <el-button type="success" @click="exportReport">
+            <el-icon><Download /></el-icon>
+            瀵煎嚭
+          </el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+
+    <!-- 鎶ヨ〃鍐呭 -->
+    <el-card class="report-content" shadow="never">
+      <!-- 閲囪喘璁㈠崟鎵ц姹囨�昏〃 -->
+      <div v-if="activeReport === 'orderSummary'" class="report-section">
+        <div class="section-header">
+          <h3>閲囪喘璁㈠崟鎵ц姹囨�昏〃</h3>
+          <div class="summary-stats">
+            <div class="stat-item">
+              <span class="stat-label">鎬昏鍗曟暟锛�</span>
+              <span class="stat-value">{{ orderSummaryStats.totalOrders }}</span>
+            </div>
+            <div class="stat-item">
+              <span class="stat-label">鎬婚噾棰濓細</span>
+              <span class="stat-value">楼{{ orderSummaryStats.totalAmount.toLocaleString() }}</span>
+            </div>
+            <div class="stat-item">
+              <span class="stat-label">瀹屾垚鐜囷細</span>
+              <span class="stat-value">{{ orderSummaryStats.completionRate }}%</span>
+            </div>
+          </div>
+        </div>
+        
+        <el-table :data="orderSummaryData" border v-loading="loading" stripe>
+          <el-table-column label="璁㈠崟缂栧彿" prop="orderNo" width="180" fixed="left" />
+          <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="150" />
+          <el-table-column label="璁㈠崟鏃ユ湡" prop="orderDate" width="120" />
+          <el-table-column label="璁″垝浜ゆ湡" prop="plannedDelivery" width="120" />
+          <el-table-column label="瀹為檯浜ゆ湡" prop="actualDelivery" width="120" />
+          <el-table-column label="璁㈠崟閲戦" prop="orderAmount" width="120">
+            <template #default="{ row }">楼{{ row.orderAmount.toLocaleString() }}</template>
+          </el-table-column>
+          <el-table-column label="宸蹭粯閲戦" prop="paidAmount" width="120">
+            <template #default="{ row }">楼{{ row.paidAmount.toLocaleString() }}</template>
+          </el-table-column>
+          <el-table-column label="瀹屾垚鐘舵��" prop="status" width="100">
+            <template #default="{ row }">
+              <el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="瀹屾垚鐜�" prop="completionRate" width="100">
+            <template #default="{ row }">{{ row.completionRate }}%</template>
+          </el-table-column>
+          <el-table-column label="寤惰繜澶╂暟" prop="delayDays" width="100">
+            <template #default="{ row }">
+              <span :class="{ 'delay-text': row.delayDays > 0 }">{{ row.delayDays }}</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+
+      <!-- 閲囪喘璁㈠崟鎵ц鏄庣粏琛� -->
+      <div v-if="activeReport === 'orderDetail'" class="report-section">
+        <div class="section-header">
+          <h3>閲囪喘璁㈠崟鎵ц鏄庣粏琛�</h3>
+          <div class="summary-stats">
+            <div class="stat-item">
+              <span class="stat-label">鏄庣粏鏉℃暟锛�</span>
+              <span class="stat-value">{{ orderDetailStats.totalItems }}</span>
+            </div>
+            <div class="stat-item">
+              <span class="stat-label">宸叉敹璐э細</span>
+              <span class="stat-value">{{ orderDetailStats.receivedItems }}</span>
+            </div>
+            <div class="stat-item">
+              <span class="stat-label">寰呮敹璐э細</span>
+              <span class="stat-value">{{ orderDetailStats.pendingItems }}</span>
+            </div>
+          </div>
+        </div>
+        
+        <el-table :data="orderDetailData" border v-loading="loading" stripe>
+          <el-table-column label="璁㈠崟缂栧彿" prop="orderNo" width="150" fixed="left" />
+          <el-table-column label="鍟嗗搧缂栫爜" prop="productCode" width="120" />
+          <el-table-column label="鍟嗗搧鍚嶇О" prop="productName" width="200" />
+          <el-table-column label="瑙勬牸鍨嬪彿" prop="specification" width="150" />
+          <el-table-column label="鍗曚綅" prop="unit" width="80" />
+          <el-table-column label="璁″垝鏁伴噺" prop="plannedQuantity" width="100" />
+          <el-table-column label="宸叉敹璐ф暟閲�" prop="receivedQuantity" width="120" />
+          <el-table-column label="寰呮敹璐ф暟閲�" prop="pendingQuantity" width="120" />
+          <el-table-column label="鍗曚环" prop="unitPrice" width="100">
+            <template #default="{ row }">楼{{ row.unitPrice.toFixed(2) }}</template>
+          </el-table-column>
+          <el-table-column label="灏忚" prop="subtotal" width="120">
+            <template #default="{ row }">楼{{ row.subtotal.toLocaleString() }}</template>
+          </el-table-column>
+          <el-table-column label="鏀惰揣鐘舵��" prop="status" width="100">
+            <template #default="{ row }">
+              <el-tag :type="getReceiptStatusType(row.status)">{{ getReceiptStatusText(row.status) }}</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏈�鍚庢敹璐ф棩鏈�" prop="lastReceiptDate" width="120" />
+        </el-table>
+      </div>
+
+      <!-- 閲囪喘涓氬姟姹囨�昏〃 -->
+      <div v-if="activeReport === 'businessSummary'" class="report-section">
+        <div class="section-header">
+          <h3>閲囪喘涓氬姟姹囨�昏〃</h3>
+          <div class="summary-stats">
+            <div class="stat-item">
+              <span class="stat-label">閲囪喘鎬婚锛�</span>
+              <span class="stat-value">楼{{ businessSummaryStats.totalAmount.toLocaleString() }}</span>
+            </div>
+            <div class="stat-item">
+              <span class="stat-label">鍟嗗搧绉嶇被锛�</span>
+              <span class="stat-value">{{ businessSummaryStats.productTypes }}</span>
+            </div>
+            <div class="stat-item">
+              <span class="stat-label">渚涘簲鍟嗘暟锛�</span>
+              <span class="stat-value">{{ businessSummaryStats.supplierCount }}</span>
+            </div>
+          </div>
+        </div>
+        
+        <el-table :data="businessSummaryData" border v-loading="loading" stripe>
+          <el-table-column label="鍟嗗搧绫诲埆" prop="category" width="150" fixed="left" />
+          <el-table-column label="鍟嗗搧缂栫爜" prop="productCode" width="120" />
+          <el-table-column label="鍟嗗搧鍚嶇О" prop="productName" width="200" />
+          <el-table-column label="瑙勬牸鍨嬪彿" prop="specification" width="150" />
+          <el-table-column label="閲囪喘鏁伴噺" prop="purchaseQuantity" width="120" />
+          <el-table-column label="閲囪喘閲戦" prop="purchaseAmount" width="120">
+            <template #default="{ row }">楼{{ row.purchaseAmount.toLocaleString() }}</template>
+          </el-table-column>
+          <el-table-column label="骞冲潎鍗曚环" prop="avgPrice" width="100">
+            <template #default="{ row }">楼{{ row.avgPrice.toFixed(2) }}</template>
+          </el-table-column>
+          <el-table-column label="閲囪喘娆℃暟" prop="purchaseCount" width="100" />
+          <el-table-column label="涓昏渚涘簲鍟�" prop="mainSupplier" width="150" />
+          <el-table-column label="鏈�鍚庨噰璐棩鏈�" prop="lastPurchaseDate" width="120" />
+        </el-table>
+      </div>
+
+      <!-- 渚涘簲鍟嗕緵璐ф眹鎬昏〃 -->
+      <div v-if="activeReport === 'supplierSummary'" class="report-section">
+        <div class="section-header">
+          <h3>渚涘簲鍟嗕緵璐ф眹鎬昏〃</h3>
+          <div class="summary-stats">
+            <div class="stat-item">
+              <span class="stat-label">渚涘簲鍟嗘�绘暟锛�</span>
+              <span class="stat-value">{{ supplierSummaryStats.totalSuppliers }}</span>
+            </div>
+            <div class="stat-item">
+              <span class="stat-label">渚涜揣鎬婚锛�</span>
+              <span class="stat-value">楼{{ supplierSummaryStats.totalAmount.toLocaleString() }}</span>
+            </div>
+            <div class="stat-item">
+              <span class="stat-label">骞冲潎璇勫垎锛�</span>
+              <span class="stat-value">{{ supplierSummaryStats.avgRating.toFixed(1) }}</span>
+            </div>
+          </div>
+        </div>
+        
+        <el-table :data="supplierSummaryData" border v-loading="loading" stripe>
+          <el-table-column label="渚涘簲鍟嗙紪鐮�" prop="supplierCode" width="120" fixed="left" />
+          <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="200" />
+          <el-table-column label="鑱旂郴浜�" prop="contactPerson" width="120" />
+          <el-table-column label="鑱旂郴鐢佃瘽" prop="phone" width="130" />
+          <el-table-column label="渚涜揣璁㈠崟鏁�" prop="orderCount" width="120" />
+          <el-table-column label="渚涜揣閲戦" prop="supplyAmount" width="120">
+            <template #default="{ row }">楼{{ row.supplyAmount.toLocaleString() }}</template>
+          </el-table-column>
+          <el-table-column label="宸蹭粯閲戦" prop="paidAmount" width="120">
+            <template #default="{ row }">楼{{ row.paidAmount.toLocaleString() }}</template>
+          </el-table-column>
+          <el-table-column label="鏈粯閲戦" prop="unpaidAmount" width="120">
+            <template #default="{ row }">楼{{ row.unpaidAmount.toLocaleString() }}</template>
+          </el-table-column>
+          <el-table-column label="鎸夋椂浜よ揣鐜�" prop="onTimeRate" width="120">
+            <template #default="{ row }">{{ row.onTimeRate }}%</template>
+          </el-table-column>
+          <el-table-column label="璐ㄩ噺璇勫垎" prop="qualityRating" width="100">
+            <template #default="{ row }">
+              <el-rate v-model="row.qualityRating" disabled show-score text-color="#ff9900" />
+            </template>
+          </el-table-column>
+          <el-table-column label="鍚堜綔鐘舵��" prop="status" width="100">
+            <template #default="{ row }">
+              <el-tag :type="getSupplierStatusType(row.status)">{{ getSupplierStatusText(row.status) }}</el-tag>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted } from 'vue'
+import { ElMessage } from 'element-plus'
+import { Document, List, TrendCharts, Shop, Search, Refresh, Download } from '@element-plus/icons-vue'
+
+// 鍝嶅簲寮忔暟鎹�
+const loading = ref(false)
+const activeReport = ref('orderSummary')
+
+// 鎼滅储琛ㄥ崟
+const searchForm = reactive({
+  dateRange: [],
+  supplierId: '',
+  categoryId: ''
+})
+
+// 渚涘簲鍟嗗垪琛�
+const supplierList = ref([
+  { id: 1, name: '姹熻嫃鍗庤仈鐢靛瓙绉戞妧鏈夐檺鍏徃' },
+  { id: 2, name: '涓婃捣绮惧瘑鏈烘鍒堕�犳湁闄愬叕鍙�' },
+  { id: 3, name: '娣卞湷鏅鸿兘璁惧鏈夐檺鍏徃' },
+  { id: 4, name: '鍖椾含鏂版潗鏂欑鎶�鏈夐檺鍏徃' },
+  { id: 5, name: '骞垮窞鐢靛瓙鍏冨櫒浠舵湁闄愬叕鍙�' }
+])
+
+// 鍟嗗搧绫诲埆鍒楄〃
+const categoryList = ref([
+  { id: 1, name: '鐢靛瓙鍏冨櫒浠�' },
+  { id: 2, name: '鏈烘璁惧' },
+  { id: 3, name: '鍘熸潗鏂�' },
+  { id: 4, name: '鍔炲叕鐢ㄥ搧' },
+  { id: 5, name: '鍖呰鏉愭枡' }
+])
+
+// 缁熻鏁版嵁
+const orderSummaryStats = ref({
+  totalOrders: 156,
+  totalAmount: 2580000,
+  completionRate: 87.5
+})
+
+const orderDetailStats = ref({
+  totalItems: 1248,
+  receivedItems: 1089,
+  pendingItems: 159
+})
+
+const businessSummaryStats = ref({
+  totalAmount: 2580000,
+  productTypes: 89,
+  supplierCount: 25
+})
+
+const supplierSummaryStats = ref({
+  totalSuppliers: 25,
+  totalAmount: 2580000,
+  avgRating: 4.2
+})
+
+// 閲囪喘璁㈠崟鎵ц姹囨�昏〃鏁版嵁
+const orderSummaryData = ref([
+  {
+    orderNo: 'PO20241201001',
+    supplierName: '姹熻嫃鍗庤仈鐢靛瓙绉戞妧鏈夐檺鍏徃',
+    orderDate: '2024-12-01',
+    plannedDelivery: '2024-12-15',
+    actualDelivery: '2024-12-14',
+    orderAmount: 125000,
+    paidAmount: 100000,
+    status: 'completed',
+    completionRate: 100,
+    delayDays: -1
+  },
+  {
+    orderNo: 'PO20241201002',
+    supplierName: '涓婃捣绮惧瘑鏈烘鍒堕�犳湁闄愬叕鍙�',
+    orderDate: '2024-12-02',
+    plannedDelivery: '2024-12-20',
+    actualDelivery: '2024-12-22',
+    orderAmount: 280000,
+    paidAmount: 140000,
+    status: 'partial',
+    completionRate: 75,
+    delayDays: 2
+  },
+  {
+    orderNo: 'PO20241201003',
+    supplierName: '娣卞湷鏅鸿兘璁惧鏈夐檺鍏徃',
+    orderDate: '2024-12-03',
+    plannedDelivery: '2024-12-25',
+    actualDelivery: '',
+    orderAmount: 180000,
+    paidAmount: 0,
+    status: 'pending',
+    completionRate: 0,
+    delayDays: 0
+  },
+  {
+    orderNo: 'PO20241201004',
+    supplierName: '鍖椾含鏂版潗鏂欑鎶�鏈夐檺鍏徃',
+    orderDate: '2024-12-04',
+    plannedDelivery: '2024-12-18',
+    actualDelivery: '2024-12-18',
+    orderAmount: 95000,
+    paidAmount: 95000,
+    status: 'completed',
+    completionRate: 100,
+    delayDays: 0
+  },
+  {
+    orderNo: 'PO20241201005',
+    supplierName: '骞垮窞鐢靛瓙鍏冨櫒浠舵湁闄愬叕鍙�',
+    orderDate: '2024-12-05',
+    plannedDelivery: '2024-12-28',
+    actualDelivery: '',
+    orderAmount: 220000,
+    paidAmount: 0,
+    status: 'pending',
+    completionRate: 0,
+    delayDays: 0
+  }
+])
+
+// 閲囪喘璁㈠崟鎵ц鏄庣粏琛ㄦ暟鎹�
+const orderDetailData = ref([
+  {
+    orderNo: 'PO20241201001',
+    productCode: 'EL001',
+    productName: '鐢甸樆鍣� 1K惟 卤5%',
+    specification: '1/4W 纰宠啘鐢甸樆',
+    unit: '涓�',
+    plannedQuantity: 1000,
+    receivedQuantity: 1000,
+    pendingQuantity: 0,
+    unitPrice: 0.15,
+    subtotal: 150,
+    status: 'completed',
+    lastReceiptDate: '2024-12-14'
+  },
+  {
+    orderNo: 'PO20241201001',
+    productCode: 'EL002',
+    productName: '鐢靛鍣� 100渭F',
+    specification: '25V 閾濈數瑙g數瀹�',
+    unit: '涓�',
+    plannedQuantity: 500,
+    receivedQuantity: 500,
+    pendingQuantity: 0,
+    unitPrice: 0.85,
+    subtotal: 425,
+    status: 'completed',
+    lastReceiptDate: '2024-12-14'
+  },
+  {
+    orderNo: 'PO20241201002',
+    productCode: 'ME001',
+    productName: '绮惧瘑杞存壙',
+    specification: '6205-2RS 娣辨矡鐞冭酱鎵�',
+    unit: '涓�',
+    plannedQuantity: 200,
+    receivedQuantity: 150,
+    pendingQuantity: 50,
+    unitPrice: 25.5,
+    subtotal: 5100,
+    status: 'partial',
+    lastReceiptDate: '2024-12-20'
+  },
+  {
+    orderNo: 'PO20241201002',
+    productCode: 'ME002',
+    productName: '涓嶉攬閽㈣灪涓�',
+    specification: 'M8脳20 304涓嶉攬閽�',
+    unit: '涓�',
+    plannedQuantity: 1000,
+    receivedQuantity: 1000,
+    pendingQuantity: 0,
+    unitPrice: 0.8,
+    subtotal: 800,
+    status: 'completed',
+    lastReceiptDate: '2024-12-20'
+  },
+  {
+    orderNo: 'PO20241201003',
+    productCode: 'SM001',
+    productName: '鏅鸿兘浼犳劅鍣�',
+    specification: '娓╁害浼犳劅鍣� DS18B20',
+    unit: '涓�',
+    plannedQuantity: 300,
+    receivedQuantity: 0,
+    pendingQuantity: 300,
+    unitPrice: 12.5,
+    subtotal: 3750,
+    status: 'pending',
+    lastReceiptDate: ''
+  }
+])
+
+// 閲囪喘涓氬姟姹囨�昏〃鏁版嵁
+const businessSummaryData = ref([
+  {
+    category: '鐢靛瓙鍏冨櫒浠�',
+    productCode: 'EL001',
+    productName: '鐢甸樆鍣� 1K惟 卤5%',
+    specification: '1/4W 纰宠啘鐢甸樆',
+    purchaseQuantity: 5000,
+    purchaseAmount: 750,
+    avgPrice: 0.15,
+    purchaseCount: 8,
+    mainSupplier: '姹熻嫃鍗庤仈鐢靛瓙绉戞妧鏈夐檺鍏徃',
+    lastPurchaseDate: '2024-12-01'
+  },
+  {
+    category: '鐢靛瓙鍏冨櫒浠�',
+    productCode: 'EL002',
+    productName: '鐢靛鍣� 100渭F',
+    specification: '25V 閾濈數瑙g數瀹�',
+    purchaseQuantity: 2500,
+    purchaseAmount: 2125,
+    avgPrice: 0.85,
+    purchaseCount: 6,
+    mainSupplier: '姹熻嫃鍗庤仈鐢靛瓙绉戞妧鏈夐檺鍏徃',
+    lastPurchaseDate: '2024-12-01'
+  },
+  {
+    category: '鏈烘璁惧',
+    productCode: 'ME001',
+    productName: '绮惧瘑杞存壙',
+    specification: '6205-2RS 娣辨矡鐞冭酱鎵�',
+    purchaseQuantity: 800,
+    purchaseAmount: 20400,
+    avgPrice: 25.5,
+    purchaseCount: 4,
+    mainSupplier: '涓婃捣绮惧瘑鏈烘鍒堕�犳湁闄愬叕鍙�',
+    lastPurchaseDate: '2024-12-02'
+  },
+  {
+    category: '鏈烘璁惧',
+    productCode: 'ME002',
+    productName: '涓嶉攬閽㈣灪涓�',
+    specification: 'M8脳20 304涓嶉攬閽�',
+    purchaseQuantity: 5000,
+    purchaseAmount: 4000,
+    avgPrice: 0.8,
+    purchaseCount: 12,
+    mainSupplier: '涓婃捣绮惧瘑鏈烘鍒堕�犳湁闄愬叕鍙�',
+    lastPurchaseDate: '2024-12-02'
+  },
+  {
+    category: '鏅鸿兘璁惧',
+    productCode: 'SM001',
+    productName: '鏅鸿兘浼犳劅鍣�',
+    specification: '娓╁害浼犳劅鍣� DS18B20',
+    purchaseQuantity: 1200,
+    purchaseAmount: 15000,
+    avgPrice: 12.5,
+    purchaseCount: 5,
+    mainSupplier: '娣卞湷鏅鸿兘璁惧鏈夐檺鍏徃',
+    lastPurchaseDate: '2024-12-03'
+  }
+])
+
+// 渚涘簲鍟嗕緵璐ф眹鎬昏〃鏁版嵁
+const supplierSummaryData = ref([
+  {
+    supplierCode: 'SUP001',
+    supplierName: '姹熻嫃鍗庤仈鐢靛瓙绉戞妧鏈夐檺鍏徃',
+    contactPerson: '寮犵粡鐞�',
+    phone: '0512-88888888',
+    orderCount: 45,
+    supplyAmount: 850000,
+    paidAmount: 680000,
+    unpaidAmount: 170000,
+    onTimeRate: 95,
+    qualityRating: 4.5,
+    status: 'active'
+  },
+  {
+    supplierCode: 'SUP002',
+    supplierName: '涓婃捣绮惧瘑鏈烘鍒堕�犳湁闄愬叕鍙�',
+    contactPerson: '鏉庢��',
+    phone: '021-66666666',
+    orderCount: 32,
+    supplyAmount: 1200000,
+    paidAmount: 900000,
+    unpaidAmount: 300000,
+    onTimeRate: 88,
+    qualityRating: 4.2,
+    status: 'active'
+  },
+  {
+    supplierCode: 'SUP003',
+    supplierName: '娣卞湷鏅鸿兘璁惧鏈夐檺鍏徃',
+    contactPerson: '鐜嬪伐绋嬪笀',
+    phone: '0755-77777777',
+    orderCount: 28,
+    supplyAmount: 680000,
+    paidAmount: 400000,
+    unpaidAmount: 280000,
+    onTimeRate: 92,
+    qualityRating: 4.3,
+    status: 'active'
+  },
+  {
+    supplierCode: 'SUP004',
+    supplierName: '鍖椾含鏂版潗鏂欑鎶�鏈夐檺鍏徃',
+    contactPerson: '闄堝崥澹�',
+    phone: '010-55555555',
+    orderCount: 18,
+    supplyAmount: 320000,
+    paidAmount: 250000,
+    unpaidAmount: 70000,
+    onTimeRate: 85,
+    qualityRating: 4.0,
+    status: 'active'
+  },
+  {
+    supplierCode: 'SUP005',
+    supplierName: '骞垮窞鐢靛瓙鍏冨櫒浠舵湁闄愬叕鍙�',
+    contactPerson: '鍒樼粡鐞�',
+    phone: '020-44444444',
+    orderCount: 22,
+    supplyAmount: 480000,
+    paidAmount: 200000,
+    unpaidAmount: 280000,
+    onTimeRate: 78,
+    qualityRating: 3.8,
+    status: 'warning'
+  }
+])
+
+// 鏂规硶
+const handleReportChange = (tabName) => {
+  activeReport.value = tabName
+  handleSearch()
+}
+
+const handleSearch = () => {
+  loading.value = true
+  // 妯℃嫙API璋冪敤
+  setTimeout(() => {
+    loading.value = false
+    ElMessage.success('鏌ヨ瀹屾垚')
+  }, 1000)
+}
+
+const resetSearch = () => {
+  Object.assign(searchForm, {
+    dateRange: [],
+    supplierId: '',
+    categoryId: ''
+  })
+  handleSearch()
+}
+
+const exportReport = () => {
+  ElMessage.success('瀵煎嚭鍔熻兘寮�鍙戜腑...')
+}
+
+// 鐘舵�佺浉鍏虫柟娉�
+const getStatusType = (status) => {
+  const statusMap = {
+    completed: 'success',
+    partial: 'warning',
+    pending: 'info'
+  }
+  return statusMap[status] || 'info'
+}
+
+const getStatusText = (status) => {
+  const statusMap = {
+    completed: '宸插畬鎴�',
+    partial: '閮ㄥ垎瀹屾垚',
+    pending: '寰呮墽琛�'
+  }
+  return statusMap[status] || '鏈煡'
+}
+
+const getReceiptStatusType = (status) => {
+  const statusMap = {
+    completed: 'success',
+    partial: 'warning',
+    pending: 'info'
+  }
+  return statusMap[status] || 'info'
+}
+
+const getReceiptStatusText = (status) => {
+  const statusMap = {
+    completed: '宸叉敹璐�',
+    partial: '閮ㄥ垎鏀惰揣',
+    pending: '寰呮敹璐�'
+  }
+  return statusMap[status] || '鏈煡'
+}
+
+const getSupplierStatusType = (status) => {
+  const statusMap = {
+    active: 'success',
+    warning: 'warning',
+    inactive: 'info'
+  }
+  return statusMap[status] || 'info'
+}
+
+const getSupplierStatusText = (status) => {
+  const statusMap = {
+    active: '姝e父鍚堜綔',
+    warning: '闇�鍏虫敞',
+    inactive: '鏆傚仠鍚堜綔'
+  }
+  return statusMap[status] || '鏈煡'
+}
+
+onMounted(() => {
+  // 璁剧疆榛樿鏃堕棿鑼冨洿涓烘渶杩�30澶�
+  const endDate = new Date()
+  const startDate = new Date()
+  startDate.setDate(startDate.getDate() - 30)
+  
+  searchForm.dateRange = [
+    startDate.toISOString().split('T')[0],
+    endDate.toISOString().split('T')[0]
+  ]
+})
+</script>
+
+<style scoped>
+.app-container {
+  padding: 20px;
+  background-color: #f5f7fa;
+  min-height: 100vh;
+}
+
+.page-header {
+  text-align: center;
+  margin-bottom: 20px;
+  padding: 20px;
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  border-radius: 10px;
+  color: white;
+}
+
+.page-header h2 {
+  margin: 0 0 10px 0;
+  font-size: 28px;
+  font-weight: 600;
+}
+
+.page-header p {
+  margin: 0;
+  font-size: 16px;
+  opacity: 0.9;
+}
+
+.report-selector {
+  margin-bottom: 20px;
+  border-radius: 8px;
+}
+
+.tab-label {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.search-card {
+  margin-bottom: 20px;
+  border-radius: 8px;
+}
+
+.search-form {
+  margin-bottom: 0;
+}
+
+.report-content {
+  border-radius: 8px;
+}
+
+.report-section {
+  min-height: 400px;
+}
+
+.section-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+  padding-bottom: 15px;
+  border-bottom: 2px solid #e4e7ed;
+}
+
+.section-header h3 {
+  margin: 0;
+  font-size: 20px;
+  font-weight: 600;
+  color: #303133;
+}
+
+.summary-stats {
+  display: flex;
+  gap: 30px;
+}
+
+.stat-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.stat-label {
+  font-size: 14px;
+  color: #606266;
+  margin-bottom: 5px;
+}
+
+.stat-value {
+  font-size: 18px;
+  font-weight: 600;
+  color: #409EFF;
+}
+
+.delay-text {
+  color: #F56C6C;
+  font-weight: 600;
+}
+
+:deep(.el-table) {
+  border-radius: 8px;
+  overflow: hidden;
+}
+
+:deep(.el-table th) {
+  background-color: #f8f9fa;
+  color: #606266;
+  font-weight: 600;
+}
+
+:deep(.el-table--striped .el-table__body tr.el-table__row--striped td) {
+  background-color: #fafafa;
+}
+
+:deep(.el-tabs__header) {
+  margin-bottom: 0;
+}
+
+:deep(.el-tabs__nav-wrap) {
+  padding: 0 20px;
+}
+
+:deep(.el-tabs__item) {
+  font-size: 16px;
+  font-weight: 500;
+}
+
+:deep(.el-tabs__item.is-active) {
+  color: #409EFF;
+}
+
+:deep(.el-rate) {
+  display: flex;
+  align-items: center;
+}
+
+:deep(.el-rate__text) {
+  margin-left: 8px;
+  font-size: 14px;
+  color: #606266;
+}
+</style>

--
Gitblit v1.9.3