From 3df460667d74868d0a54fce12d5e881bbd6c0c1a Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期四, 17 九月 2026 17:11:18 +0800
Subject: [PATCH] 青岛维护统计

---
 src/views/statistics/utilization.vue |  657 ++++++++++++-----------------------------------------------
 1 files changed, 140 insertions(+), 517 deletions(-)

diff --git a/src/views/statistics/utilization.vue b/src/views/statistics/utilization.vue
index 51ea1c9..76c03b1 100644
--- a/src/views/statistics/utilization.vue
+++ b/src/views/statistics/utilization.vue
@@ -29,124 +29,56 @@
     <el-card style="margin-bottom: 20px;">
       <div slot="header" class="clearfix">
         <h3>2. 鍣ㄥ畼寮冪敤鍘熷洜鍒嗘瀽</h3>
-        <el-form :inline="true" style="float: right;">
-          <el-form-item label="鍣ㄥ畼绫诲瀷" style="margin-bottom: 0;">
-            <el-select
-              v-model="abandonQuery.organType"
-              placeholder="璇烽�夋嫨鍣ㄥ畼绫诲瀷"
-              clearable
-              size="mini"
-              style="width: 150px"
-              @change="handleAbandonQuery"
-            >
-              <el-option
-                v-for="item in organOptions"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              />
-            </el-select>
-          </el-form-item>
-        </el-form>
       </div>
       <EChartsWrapper
+        v-if="useMock"
         :id="'abandon-analysis-chart'"
         :options="abandonChartOptions"
         height="400px"
       />
+      <el-empty v-else description="鍚庣鏆傛湭鎻愪緵鍣ㄥ畼寮冪敤鍘熷洜缁熻鎺ュ彛"></el-empty>
     </el-card>
 
     <!-- 绗笁閮ㄥ垎锛氭瘡渚涗綋鍣ㄥ畼鑾峰彇鏁伴噺 -->
     <el-card>
       <div slot="header" class="clearfix">
         <h3>3. 姣忎緵浣撳櫒瀹樿幏鍙栨暟閲�</h3>
-        <el-form :inline="true" style="float: right;">
-          <el-form-item label="骞翠唤" style="margin-bottom: 0;">
-            <el-date-picker
-              v-model="perDonorQuery.year"
-              type="year"
-              placeholder="閫夋嫨骞翠唤"
-              value-format="yyyy"
-              size="mini"
-              style="width: 120px"
-              @change="handlePerDonorQuery"
-            />
-          </el-form-item>
-
-          <el-form-item label="鍣ㄥ畼绫诲瀷" style="margin-bottom: 0;">
-            <el-select
-              v-model="perDonorQuery.organType"
-              placeholder="璇烽�夋嫨鍣ㄥ畼绫诲瀷"
-              clearable
-              size="mini"
-              style="width: 150px"
-              @change="handlePerDonorQuery"
-            >
-              <el-option
-                v-for="item in organOptions"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              />
-            </el-select>
-          </el-form-item>
-        </el-form>
       </div>
 
-      <el-table
-        v-loading="loading"
-        :data="tableData"
-        style="width: 100%"
-        border
-        stripe
-      >
-        <el-table-column label="骞翠唤" prop="year" align="center"  />
-        <el-table-column label="渚涗綋濮撳悕" prop="donorName" align="center"  />
-        <el-table-column label="鑾峰彇鏁伴噺" prop="acquisitionCount" align="center" >
-          <template slot-scope="{ row }">
-            <el-tag :type="getCountTag(row.acquisitionCount)" size="small">
-              {{ row.acquisitionCount }}
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column label="鍏ㄨ倽" prop="liver" align="center"  />
-        <el-table-column label="宸﹀崐鑲�" prop="leftLiver" align="center"  />
-        <el-table-column label="鍙冲崐鑲�" prop="rightLiver" align="center"  />
-        <el-table-column label="蹇冭剰" prop="heart" align="center"  />
-        <el-table-column label="灏忚偁" prop="intestine" align="center"  />
-        <el-table-column label="鑳拌吅" prop="pancreas" align="center"  />
-        <el-table-column label="宸﹁偩" prop="leftKidney" align="center"  />
-        <el-table-column label="鍙宠偩" prop="rightKidney" align="center"  />
-        <el-table-column label="鍏ㄨ偤" prop="fullLung" align="center"  />
-        <el-table-column label="宸﹁偤" prop="leftLung" align="center"  />
-        <el-table-column label="鍙宠偤" prop="rightLung" align="center"  />
-        <el-table-column label="宸︾溂瑙掕啘" prop="leftCornea" align="center"  />
-        <el-table-column label="鍙崇溂瑙掕啘" prop="rightCornea" align="center"  />
-        <el-table-column label="鍦板尯" prop="region" align="center"  />
-        <el-table-column label="鎿嶄綔" align="center"  fixed="right">
-          <template slot-scope="{ row }">
-            <el-button
-              type="text"
-              size="mini"
-              @click="viewDonorDetail(row)"
-            >
-              璇︽儏
-            </el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <el-pagination
-        v-show="total > 0"
-        :total="total"
-        :page.sync="query.page"
-        :limit.sync="query.limit"
-        @current-change="handlePagination"
-        @size-change="handlePageSizeChange"
-        style="margin-top: 20px;"
-        layout="total, sizes, prev, pager, next, jumper"
-        :page-sizes="[10, 20, 50, 100]"
-      />
+      <template v-if="useMock">
+        <el-table
+          v-loading="loading"
+          :data="perDonorTable"
+          style="width: 100%"
+          border
+          stripe
+        >
+          <el-table-column label="骞翠唤" prop="year" align="center" />
+          <el-table-column label="渚涗綋濮撳悕" prop="donorName" align="center" />
+          <el-table-column label="鑾峰彇鏁伴噺" prop="acquisitionCount" align="center">
+            <template slot-scope="{ row }">
+              <el-tag :type="getCountTag(row.acquisitionCount)" size="small">
+                {{ row.acquisitionCount }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="鍏ㄨ倽" prop="liver" align="center" />
+          <el-table-column label="宸﹀崐鑲�" prop="leftLiver" align="center" />
+          <el-table-column label="鍙冲崐鑲�" prop="rightLiver" align="center" />
+          <el-table-column label="蹇冭剰" prop="heart" align="center" />
+          <el-table-column label="灏忚偁" prop="intestine" align="center" />
+          <el-table-column label="鑳拌吅" prop="pancreas" align="center" />
+          <el-table-column label="宸﹁偩" prop="leftKidney" align="center" />
+          <el-table-column label="鍙宠偩" prop="rightKidney" align="center" />
+          <el-table-column label="鍏ㄨ偤" prop="fullLung" align="center" />
+          <el-table-column label="宸﹁偤" prop="leftLung" align="center" />
+          <el-table-column label="鍙宠偤" prop="rightLung" align="center" />
+          <el-table-column label="宸︾溂瑙掕啘" prop="leftCornea" align="center" />
+          <el-table-column label="鍙崇溂瑙掕啘" prop="rightCornea" align="center" />
+          <el-table-column label="鍦板尯" prop="region" align="center" />
+        </el-table>
+      </template>
+      <el-empty v-else description="鍚庣鏆傛湭鎻愪緵姣忎緵浣撳櫒瀹樿幏鍙栨槑缁嗘帴鍙�"></el-empty>
     </el-card>
   </div>
 </template>
@@ -154,6 +86,10 @@
 <script>
 import FilterPanel from '@/components/charts/FilterPanel.vue';
 import EChartsWrapper from '@/components/charts/EChartsWrapper.vue';
+import { organType } from '@/api/businessApi';
+import { toTotalsList, toNum } from '@/utils/totals';
+import statisticsMode, { isStatisticsMock } from '@/utils/statisticsMode';
+import { COLORS, axisTooltip, grid, xAxis, yAxis, legend, barSeries } from '@/utils/chartStyle';
 
 export default {
   name: 'OrganUtilization',
@@ -167,8 +103,6 @@
       query: {
         region: [],
         monthRange: [],
-        ageRange: [],
-        chinaCategory: [],
         organType: null,
         page: 1,
         limit: 10
@@ -182,13 +116,13 @@
           type: 'select',
           multiple: true,
           options: [
-            { label: '闈掑矝鍦板尯', value: 'qingdao' },
-            { label: '鏃ョ収鍦板尯', value: 'rizhao' },
-            { label: '娴庡崡鍦板尯', value: 'jinan' },
-            { label: '鐑熷彴鍦板尯', value: 'yantai' },
-            { label: '濞佹捣鍦板尯', value: 'weihai' },
-            { label: '娼嶅潑鍦板尯', value: 'weifang' },
-            { label: '涓存矀鍦板尯', value: 'linyi' }
+            { label: '闈掑矝鍦板尯', value: '闈掑矝鍦板尯' },
+            { label: '鏃ョ収鍦板尯', value: '鏃ョ収鍦板尯' },
+            { label: '娴庡崡鍦板尯', value: '娴庡崡鍦板尯' },
+            { label: '鐑熷彴鍦板尯', value: '鐑熷彴鍦板尯' },
+            { label: '濞佹捣鍦板尯', value: '濞佹捣鍦板尯' },
+            { label: '娼嶅潑鍦板尯', value: '娼嶅潑鍦板尯' },
+            { label: '涓存矀鍦板尯', value: '涓存矀鍦板尯' }
           ],
           width: '300px'
         },
@@ -203,60 +137,19 @@
           width: '300px'
         },
         {
-          label: '骞撮緞娈�',
-          prop: 'ageRange',
-          type: 'select',
-          multiple: true,
-          options: [
-            { label: '<17宀�', value: '0-17' },
-            { label: '18-49宀�', value: '18-49' },
-            { label: '50-69宀�', value: '50-69' },
-            { label: '>69宀�', value: '70-100' }
-          ],
-          width: '200px'
-        },
-        {
-          label: '涓浗鍒嗙被',
-          prop: 'chinaCategory',
-          type: 'select',
-          multiple: true,
-          options: [
-            { label: '涓浗涓�绫�(DBD)', value: '1' },
-            { label: '涓浗浜岀被(DCD)', value: '2' },
-            { label: '涓浗涓夌被(DBCD)', value: '3' }
-          ],
-          width: '200px'
-        },
-        {
           label: '鍣ㄥ畼绫诲瀷',
           prop: 'organType',
           type: 'select',
           options: [
-            { label: '鍏ㄨ倽', value: 'liver' },
-            { label: '鑲捐剰', value: 'kidney' },
-            { label: '蹇冭剰', value: 'heart' },
-            { label: '鑲�', value: 'lung' },
-            { label: '鐪艰鑶�', value: 'cornea' }
+            { label: '鍏ㄨ倽', value: '鍏ㄨ倽' },
+            { label: '鑲捐剰', value: '鑲捐剰' },
+            { label: '蹇冭剰', value: '蹇冭剰' },
+            { label: '鑲�', value: '鑲�' },
+            { label: '鑳拌吅', value: '鑳拌吅' },
+            { label: '鐪艰鑶�', value: '鐪艰鑶�' }
           ],
           width: '200px'
         }
-      ],
-
-      // 鍣ㄥ畼閫夐」
-      organOptions: [
-        { label: '鍏ㄨ倽', value: 'liver' },
-        { label: '宸﹀崐鑲�', value: 'leftLiver' },
-        { label: '鍙冲崐鑲�', value: 'rightLiver' },
-        { label: '蹇冭剰', value: 'heart' },
-        { label: '灏忚偁', value: 'intestine' },
-        { label: '鑳拌吅', value: 'pancreas' },
-        { label: '宸﹁偩', value: 'leftKidney' },
-        { label: '鍙宠偩', value: 'rightKidney' },
-        { label: '鍏ㄨ偤', value: 'fullLung' },
-        { label: '宸﹁偤', value: 'leftLung' },
-        { label: '鍙宠偤', value: 'rightLung' },
-        { label: '宸︾溂瑙掕啘', value: 'leftCornea' },
-        { label: '鍙崇溂瑙掕啘', value: 'rightCornea' }
       ],
 
       // 鍔犺浇鐘舵��
@@ -264,322 +157,33 @@
 
       // 鍥捐〃閰嶇疆
       acquisitionChartOptions: {},
-      abandonChartOptions: {},
 
-      // 琛ㄦ牸鏁版嵁
-      tableData: [],
-      total: 0,
+      // 鍣ㄥ畼绫诲瀷鍒嗗竷鏁版嵁
+      organData: [],
 
-      // 寮冪敤鍒嗘瀽鏌ヨ鍙傛暟
-      abandonQuery: {
-        organType: null
-      },
-
-      // 姣忎緵浣撴煡璇㈠弬鏁�
-      perDonorQuery: {
-        year: '2024',
-        organType: null
-      },
-
-      // 妯℃嫙鏁版嵁
-      mockData: {
-        acquisition: [
-          {
-            month: '2024-01',
-            region: '闈掑矝鍦板尯',
-            liver: { acquisition: 8, transplant: 7 },
-            kidney: { acquisition: 12, transplant: 10 },
-            heart: { acquisition: 3, transplant: 3 },
-            lung: { acquisition: 5, transplant: 4 },
-            cornea: { acquisition: 20, transplant: 18 }
-          },
-          {
-            month: '2024-02',
-            region: '闈掑矝鍦板尯',
-            liver: { acquisition: 10, transplant: 9 },
-            kidney: { acquisition: 15, transplant: 13 },
-            heart: { acquisition: 4, transplant: 3 },
-            lung: { acquisition: 6, transplant: 5 },
-            cornea: { acquisition: 25, transplant: 22 }
-          },
-          {
-            month: '2024-01',
-            region: '鏃ョ収鍦板尯',
-            liver: { acquisition: 5, transplant: 4 },
-            kidney: { acquisition: 8, transplant: 7 },
-            heart: { acquisition: 2, transplant: 2 },
-            lung: { acquisition: 3, transplant: 2 },
-            cornea: { acquisition: 15, transplant: 13 }
-          }
-        ],
-        abandon: [
-          { name: '鍣ㄥ畼璐ㄩ噺涓嶅悎鏍�', value: 45 },
-          { name: '渚涗綋鐤剧梾', value: 25 },
-          { name: '杩愯緭闂', value: 15 },
-          { name: '鍙椾綋鍖归厤闂', value: 10 },
-          { name: '鍏朵粬鍘熷洜', value: 5 }
-        ],
-        table: [
-          {
-            id: 1,
-            year: '2024',
-            donorName: '寮犱笁',
-            acquisitionCount: 5,
-            liver: 1,
-            leftLiver: 0,
-            rightLiver: 0,
-            heart: 0,
-            intestine: 0,
-            pancreas: 0,
-            leftKidney: 1,
-            rightKidney: 1,
-            fullLung: 0,
-            leftLung: 0,
-            rightLung: 0,
-            leftCornea: 1,
-            rightCornea: 1,
-            region: '闈掑矝鍦板尯'
-          },
-          {
-            id: 2,
-            year: '2024',
-            donorName: '鏉庡洓',
-            acquisitionCount: 3,
-            liver: 0,
-            leftLiver: 0,
-            rightLiver: 0,
-            heart: 1,
-            intestine: 0,
-            pancreas: 0,
-            leftKidney: 0,
-            rightKidney: 0,
-            fullLung: 0,
-            leftLung: 1,
-            rightLung: 1,
-            leftCornea: 0,
-            rightCornea: 0,
-            region: '闈掑矝鍦板尯'
-          },
-          {
-            id: 3,
-            year: '2024',
-            donorName: '鐜嬩簲',
-            acquisitionCount: 6,
-            liver: 1,
-            leftLiver: 0,
-            rightLiver: 0,
-            heart: 0,
-            intestine: 0,
-            pancreas: 1,
-            leftKidney: 1,
-            rightKidney: 1,
-            fullLung: 0,
-            leftLung: 0,
-            rightLung: 0,
-            leftCornea: 1,
-            rightCornea: 1,
-            region: '鏃ョ収鍦板尯'
-          },
-          {
-            id: 4,
-            year: '2024',
-            donorName: '璧靛叚',
-            acquisitionCount: 4,
-            liver: 0,
-            leftLiver: 0,
-            rightLiver: 0,
-            heart: 0,
-            intestine: 0,
-            pancreas: 0,
-            leftKidney: 1,
-            rightKidney: 1,
-            fullLung: 0,
-            leftLung: 0,
-            rightLung: 0,
-            leftCornea: 1,
-            rightCornea: 1,
-            region: '娴庡崡鍦板尯'
-          },
-          {
-            id: 5,
-            year: '2023',
-            donorName: '閽变竷',
-            acquisitionCount: 3,
-            liver: 0,
-            leftLiver: 0,
-            rightLiver: 0,
-            heart: 1,
-            intestine: 0,
-            pancreas: 0,
-            leftKidney: 0,
-            rightKidney: 0,
-            fullLung: 1,
-            leftLung: 0,
-            rightLung: 1,
-            leftCornea: 0,
-            rightCornea: 0,
-            region: '鐑熷彴鍦板尯'
-          }
-        ]
-      }
+      // 鏃犳帴鍙i儴鍒嗙殑妯℃嫙鏁版嵁锛堜粎 mock 妯″紡灞曠ず锛�
+      abandonReasons: [
+        { name: '鍣ㄥ畼璐ㄩ噺涓嶅悎鏍�', value: 45 },
+        { name: '渚涗綋鐤剧梾', value: 25 },
+        { name: '杩愯緭闂', value: 15 },
+        { name: '鍙椾綋鍖归厤闂', value: 10 },
+        { name: '鍏朵粬鍘熷洜', value: 5 }
+      ],
+      perDonorTable: [
+        { id: 1, year: '2024', donorName: '寮犱笁', acquisitionCount: 5, liver: 1, leftLiver: 0, rightLiver: 0, heart: 0, intestine: 0, pancreas: 0, leftKidney: 1, rightKidney: 1, fullLung: 0, leftLung: 0, rightLung: 0, leftCornea: 1, rightCornea: 1, region: '闈掑矝鍦板尯' },
+        { id: 2, year: '2024', donorName: '鏉庡洓', acquisitionCount: 3, liver: 0, leftLiver: 0, rightLiver: 0, heart: 1, intestine: 0, pancreas: 0, leftKidney: 0, rightKidney: 0, fullLung: 0, leftLung: 1, rightLung: 1, leftCornea: 0, rightCornea: 0, region: '闈掑矝鍦板尯' },
+        { id: 3, year: '2024', donorName: '鐜嬩簲', acquisitionCount: 6, liver: 1, leftLiver: 0, rightLiver: 0, heart: 0, intestine: 0, pancreas: 1, leftKidney: 1, rightKidney: 1, fullLung: 0, leftLung: 0, rightLung: 0, leftCornea: 1, rightCornea: 1, region: '鏃ョ収鍦板尯' },
+        { id: 4, year: '2024', donorName: '璧靛叚', acquisitionCount: 4, liver: 0, leftLiver: 0, rightLiver: 0, heart: 0, intestine: 0, pancreas: 0, leftKidney: 1, rightKidney: 1, fullLung: 0, leftLung: 0, rightLung: 0, leftCornea: 1, rightCornea: 1, region: '娴庡崡鍦板尯' },
+        { id: 5, year: '2023', donorName: '閽变竷', acquisitionCount: 3, liver: 0, leftLiver: 0, rightLiver: 0, heart: 1, intestine: 0, pancreas: 0, leftKidney: 0, rightKidney: 0, fullLung: 1, leftLung: 0, rightLung: 1, leftCornea: 0, rightCornea: 0, region: '鐑熷彴鍦板尯' }
+      ]
     };
   },
-  created() {
-    this.loadData();
-  },
-  methods: {
-    // 鍔犺浇鏁版嵁
-    async loadData() {
-      this.loading = true;
-      try {
-        await new Promise(resolve => setTimeout(resolve, 500));
-
-        // 澶勭悊琛ㄦ牸鏁版嵁
-        let filteredData = [...this.mockData.table];
-
-        if (this.query.region.length > 0) {
-          filteredData = filteredData.filter(item =>
-            this.query.region.includes(item.region.replace('鍦板尯', '').toLowerCase())
-          );
-        }
-
-        if (this.query.monthRange && this.query.monthRange.length === 2) {
-          // 杩欓噷鍙互娣诲姞鏈堜唤绛涢�夐�昏緫
-        }
-
-        if (this.query.ageRange.length > 0) {
-          // 杩欓噷鍙互娣诲姞骞撮緞绛涢�夐�昏緫
-        }
-
-        if (this.query.chinaCategory.length > 0) {
-          // 杩欓噷鍙互娣诲姞涓浗鍒嗙被绛涢�夐�昏緫
-        }
-
-        if (this.query.organType) {
-          const organMap = { liver: 'liver', kidney: ['leftKidney', 'rightKidney'], heart: 'heart', lung: ['fullLung', 'leftLung', 'rightLung'], cornea: ['leftCornea', 'rightCornea'] };
-          const organProp = organMap[this.query.organType];
-          if (organProp) {
-            if (Array.isArray(organProp)) {
-              filteredData = filteredData.filter(item =>
-                organProp.some(prop => item[prop] > 0)
-              );
-            } else {
-              filteredData = filteredData.filter(item => item[organProp] > 0);
-            }
-          }
-        }
-
-        // 鍒嗛〉
-        const start = (this.query.page - 1) * this.query.limit;
-        this.tableData = filteredData.slice(start, start + this.query.limit);
-        this.total = filteredData.length;
-
-        // 鏇存柊鍥捐〃
-        this.updateCharts();
-
-      } catch (error) {
-        console.error('鍔犺浇鏁版嵁澶辫触:', error);
-        this.$message.error('鏁版嵁鍔犺浇澶辫触');
-      } finally {
-        this.loading = false;
-      }
+  computed: {
+    useMock() {
+      return isStatisticsMock();
     },
-
-    // 鏇存柊鍥捐〃
-    updateCharts() {
-      // 鑾峰彇绉绘缁熻鍥�
-      const regions = [...new Set(this.mockData.acquisition.map(item => item.region))];
-      const months = [...new Set(this.mockData.acquisition.map(item => item.month))];
-      const organTypes = ['liver', 'kidney', 'heart', 'lung', 'cornea'];
-      const organNames = ['鑲濊剰', '鑲捐剰', '蹇冭剰', '鑲�', '鐪艰鑶�'];
-
-      const seriesData = [];
-      const xAxisData = [];
-
-      // 鐢熸垚x杞存暟鎹�
-      months.forEach(month => {
-        regions.forEach(region => {
-          xAxisData.push(`${month}\n${region}`);
-        });
-      });
-
-      // 鐢熸垚绯诲垪鏁版嵁
-      organTypes.forEach((organType, index) => {
-        const data = [];
-        months.forEach(month => {
-          regions.forEach(region => {
-            const item = this.mockData.acquisition.find(d => d.month === month && d.region === region);
-            if (item) {
-              data.push(item[organType]?.acquisition || 0);
-            } else {
-              data.push(0);
-            }
-          });
-        });
-
-        seriesData.push({
-          name: `${organNames[index]}-鑾峰彇`,
-          type: 'bar',
-          stack: '鎬婚噺',
-          data: data,
-          itemStyle: this.getSeriesColor(index * 2)
-        });
-
-        const transplantData = [];
-        months.forEach(month => {
-          regions.forEach(region => {
-            const item = this.mockData.acquisition.find(d => d.month === month && d.region === region);
-            if (item) {
-              transplantData.push(item[organType]?.transplant || 0);
-            } else {
-              transplantData.push(0);
-            }
-          });
-        });
-
-        seriesData.push({
-          name: `${organNames[index]}-绉绘`,
-          type: 'bar',
-          stack: '鎬婚噺',
-          data: transplantData,
-          itemStyle: this.getSeriesColor(index * 2 + 1)
-        });
-      });
-
-      this.acquisitionChartOptions = {
-        tooltip: {
-          trigger: 'axis',
-          axisPointer: {
-            type: 'shadow'
-          }
-        },
-        legend: {
-          data: seriesData.map(item => item.name),
-          top: 20
-        },
-        grid: {
-          left: '3%',
-          right: '4%',
-          bottom: '3%',
-          containLabel: true
-        },
-        xAxis: {
-          type: 'category',
-          data: xAxisData,
-          axisLabel: {
-            interval: 0,
-            rotate: 45
-          }
-        },
-        yAxis: {
-          type: 'value',
-          name: '鏁伴噺(涓�)'
-        },
-        series: seriesData
-      };
-
-      // 寮冪敤鍒嗘瀽鍥�
-      this.abandonChartOptions = {
+    abandonChartOptions() {
+      return {
         tooltip: {
           trigger: 'item',
           formatter: '{a} <br/>{b} : {c} ({d}%)'
@@ -587,7 +191,7 @@
         legend: {
           orient: 'vertical',
           left: 'left',
-          data: this.mockData.abandon.map(item => item.name)
+          data: this.abandonReasons.map(item => item.name)
         },
         series: [
           {
@@ -595,7 +199,7 @@
             type: 'pie',
             radius: '55%',
             center: ['50%', '60%'],
-            data: this.mockData.abandon,
+            data: this.abandonReasons,
             emphasis: {
               itemStyle: {
                 shadowBlur: 10,
@@ -606,18 +210,65 @@
           }
         ]
       };
+    }
+  },
+  created() {
+    this.loadData();
+    // 鏁版嵁婧�(mock/鐪熷疄鎺ュ彛)鍒囨崲鏃堕噸鏂板姞杞�
+    this.$watch(() => statisticsMode.useMock, () => this.loadData());
+  },
+  methods: {
+    // 缁勮鏌ヨ鏉′欢
+    buildQuery() {
+      const q = {};
+      if (this.query.region && this.query.region.length) {
+        q.area = this.query.region.join(',');
+      }
+      if (this.query.monthRange && this.query.monthRange.length === 2) {
+        q.startTime = this.query.monthRange[0];
+        q.endTime = this.query.monthRange[1];
+      }
+      if (this.query.organType) {
+        q.organName = this.query.organType;
+      }
+      return q;
     },
 
-    // 鑾峰彇绯诲垪棰滆壊
-    getSeriesColor(index) {
-      const colors = [
-        '#409EFF', '#8cc5ff',  // 鑲濊剰
-        '#67C23A', '#95d475',  // 鑲捐剰
-        '#E6A23C', '#f3c96b',  // 蹇冭剰
-        '#F56C6C', '#f89898',  // 鑲�
-        '#909399', '#b1b3b8'   // 鐪艰鑶�
-      ];
-      return { color: colors[index % colors.length] };
+    // 鍔犺浇鏁版嵁
+    async loadData() {
+      this.loading = true;
+      try {
+        const q = this.buildQuery();
+        const typeRes = await organType(q);
+
+        this.organData = toTotalsList(typeRes).map(item => ({
+          name: item.organName || '鏈煡',
+          acquisition: toNum(item.getCount),
+          transplant: toNum(item.useCount)
+        }));
+
+        this.updateCharts();
+      } catch (error) {
+        console.error('鍔犺浇鏁版嵁澶辫触:', error);
+        this.$message.error('鏁版嵁鍔犺浇澶辫触');
+      } finally {
+        this.loading = false;
+      }
+    },
+
+    // 鏇存柊鍥捐〃
+    updateCharts() {
+      this.acquisitionChartOptions = {
+        tooltip: axisTooltip(),
+        legend: legend(['鑾峰彇鏁伴噺', '绉绘鏁伴噺']),
+        grid: grid(),
+        xAxis: xAxis(this.organData.map(item => item.name)),
+        yAxis: yAxis('鏁伴噺(涓�)'),
+        series: [
+          barSeries('鑾峰彇鏁伴噺', this.organData.map(item => item.acquisition), COLORS.blue),
+          barSeries('绉绘鏁伴噺', this.organData.map(item => item.transplant), COLORS.green)
+        ]
+      };
     },
 
     // 鑾峰彇鏁伴噺鏍囩
@@ -638,8 +289,6 @@
       this.query = {
         region: [],
         monthRange: [],
-        ageRange: [],
-        chinaCategory: [],
         organType: null,
         page: 1,
         limit: 10
@@ -647,42 +296,16 @@
       this.loadData();
     },
 
-    // 澶勭悊鍒嗛〉
-    handlePagination(page) {
-      this.query.page = page;
-      this.loadData();
-    },
-
-    // 澶勭悊鍒嗛〉澶у皬鍙樺寲
-    handlePageSizeChange(size) {
-      this.query.limit = size;
-      this.query.page = 1;
-      this.loadData();
-    },
-
-    // 澶勭悊寮冪敤鏌ヨ
-    handleAbandonQuery() {
-      // 杩欓噷鍙互鏍规嵁abandonQuery绛涢�夋暟鎹�
-      console.log('寮冪敤鏌ヨ:', this.abandonQuery);
-    },
-
-    // 澶勭悊姣忎緵浣撴煡璇�
-    handlePerDonorQuery() {
-      this.loadData();
-    },
-
     // 澶勭悊瀵煎嚭
     handleExport() {
       this.$message.info('瀵煎嚭鍔熻兘寮�鍙戜腑...');
-    },
-
-    // 鏌ョ湅鎹愮尞鑰呰鎯�
-    viewDonorDetail(row) {
-      this.$router.push({
-        path: '/donor/detail',
-        query: { id: row.id }
-      });
     }
   }
 };
 </script>
+
+<style scoped>
+.statistics-page {
+  padding: 20px;
+}
+</style>

--
Gitblit v1.9.3