From c3576dff24adbb52cf807c100afb63399e16f813 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期四, 11 九月 2025 09:36:45 +0800
Subject: [PATCH] 测试完成

---
 src/views/sfstatistics/percentage/index.vue |  496 ++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 397 insertions(+), 99 deletions(-)

diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
index a9288cf..42425ee 100644
--- a/src/views/sfstatistics/percentage/index.vue
+++ b/src/views/sfstatistics/percentage/index.vue
@@ -1,37 +1,6 @@
 <template>
   <div class="Questionnairemanagement">
-    <!-- 宸︿晶鏍� -->
-    <!-- <div class="sidecolumn">
-      <div class="sidecolumn-top">
-        <div class="top-wj">鎮h�呰寖鍥�</div>
-      </div>
-
-      <div class="bottom-fl">
-        <el-tabs
-          tab-position="right"
-          v-model="activeName"
-          @tab-click="handleClick"
-        >
-          <el-tab-pane label="鍏ㄩ儴" name="first"></el-tab-pane>
-          <el-tab-pane label="浣忛櫌" name="bhospitalized"></el-tab-pane>
-          <el-tab-pane label="鍦ㄩ櫌" name="Inhospital"></el-tab-pane>
-          <el-tab-pane label="闂ㄨ瘖" name="outpatient"></el-tab-pane>
-          <el-tab-pane label="浣撴" name="physical"></el-tab-pane>
-        </el-tabs>
-      </div>
-    </div> -->
-    <!-- 鍙充晶鏁版嵁 -->
     <div class="leftvlue">
-      <!-- <div class="leftvlue-top">
-        <el-tabs v-model="topactiveName" @tab-click="tophandleClick">
-          <el-tab-pane name="Local">
-            <span class="mulsz" slot="label">鎸夊嚭闄㈢梾鍖虹粺璁� </span>
-          </el-tab-pane>
-          <el-tab-pane name="sharing">
-            <span class="mulsz" slot="label">鎸夊嚭闄㈢瀹ょ粺璁� </span>
-          </el-tab-pane>
-        </el-tabs>
-      </div> -->
       <div class="leftvlue-bg">
         <el-row :gutter="20">
           <!--鏍囩鏁版嵁-->
@@ -44,12 +13,6 @@
               v-show="showSearch"
               label-width="98px"
             >
-              <!-- <el-form-item label="璐d换鍖荤敓" prop="userName">
-                <el-input
-                  v-model="queryParams.drname"
-                  placeholder="璇疯緭鍏ヤ富娌诲尰鐢�"
-                ></el-input>
-              </el-form-item> -->
               <el-form-item label="缁熻绫诲瀷" prop="userName">
                 <el-select
                   v-model="queryParams.statisticaltype"
@@ -86,7 +49,7 @@
                   size="medium"
                   multiple
                   filterable
-                  placeholder="璇烽�夋嫨绉戝"
+                  placeholder="璇烽�夋嫨璇鹃缁�"
                 >
                   <el-option
                     v-for="item in flatArraydept"
@@ -153,6 +116,14 @@
                   @click="handleExport"
                   >瀵煎嚭</el-button
                 >
+                <el-button
+                  type="primary"
+                  plain
+                  icon="el-icon-data-line"
+                  size="medium"
+                  @click="showChartDialog"
+                  >缁熻瓒嬪娍鍥�</el-button
+                >
               </el-col>
             </el-form>
             <el-table
@@ -180,8 +151,8 @@
                       align="center"
                     />
                     <el-table-column
-                      label="绉戝"
-                       width="120"
+                      label="璇鹃缁�"
+                      width="120"
                       prop="deptname"
                       align="center"
                     />
@@ -216,7 +187,7 @@
                     </el-table-column>
                     <el-table-column align="center" label="棣栨鍑洪櫌闅忚">
                       <el-table-column
-                        label="搴旈殢璁�"
+                        label="闇�闅忚"
                         align="center"
                         key="needFollowUp"
                         prop="needFollowUp"
@@ -302,7 +273,7 @@
                     </el-table-column>
                     <el-table-column align="center" label="鍐嶆鍑洪櫌闅忚">
                       <el-table-column
-                        label="搴旈殢璁�"
+                        label="闇�闅忚"
                         align="center"
                         key="needFollowUpAgain"
                         prop="needFollowUpAgain"
@@ -379,7 +350,7 @@
                 :show-overflow-tooltip="true"
               />
               <el-table-column
-                label="绉戝"
+                label="璇鹃缁�"
                 align="center"
                 key="deptname"
                 prop="deptname"
@@ -411,7 +382,7 @@
               </el-table-column>
               <el-table-column align="center" label="棣栨鍑洪櫌闅忚">
                 <el-table-column
-                  label="搴旈殢璁�"
+                  label="闇�闅忚"
                   align="center"
                   key="needFollowUp"
                   prop="needFollowUp"
@@ -495,7 +466,7 @@
               </el-table-column>
               <el-table-column align="center" label="鍐嶆鍑洪櫌闅忚">
                 <el-table-column
-                  label="搴旈殢璁�"
+                  label="闇�闅忚"
                   align="center"
                   key="needFollowUpAgain"
                   prop="needFollowUpAgain"
@@ -572,6 +543,26 @@
         </el-row>
       </div>
     </div>
+    <!-- 缁熻瓒嬪娍鍥惧脊绐� -->
+    <el-dialog
+      title="闅忚缁熻瓒嬪娍鍥�"
+      :visible.sync="chartDialogVisible"
+      width="80%"
+      :close-on-click-modal="false"
+    >
+      <div class="chart-container">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <div class="chart-title">闅忚鐘舵�佸垎甯�</div>
+            <div id="pieChart" style="width: 100%; height: 400px"></div>
+          </el-col>
+          <el-col :span="12">
+            <div class="chart-title">闅忚瓒嬪娍鍒嗘瀽</div>
+            <div id="barLineChart" style="width: 100%; height: 400px"></div>
+          </el-col>
+        </el-row>
+      </div>
+    </el-dialog>
     <el-dialog
       title="鏈強鏃堕殢璁挎偅鑰呮湇鍔�"
       :visible.sync="SeedetailsVisible"
@@ -851,6 +842,9 @@
       // 閬僵灞�
       loading: false,
       Seedloading: false,
+      chartDialogVisible: false,
+      pieChart: null,
+      barLineChart: null,
       // 閫変腑鏁扮粍
       ids: [],
       // 闈炲崟涓鐢�
@@ -872,7 +866,7 @@
           value: 1,
         },
         {
-          label: "绉戝缁熻",
+          label: "璇鹃缁勭粺璁�",
           value: 2,
         },
       ],
@@ -907,7 +901,7 @@
       postOptions: [],
       // 瑙掕壊閫夐」
       roleOptions: [],
-      // 瀛樺偍鎵�鏈夌瀹や唬鐮�
+      // 瀛樺偍鎵�鏈夎棰樼粍浠g爜
       allDeptCodes: [],
       // 瀛樺偍鎵�鏈夌梾鍖轰唬鐮�
       allWardCodes: [],
@@ -923,51 +917,7 @@
       sidecolumnval: "", //绫诲埆鎼滅储
       propss: { multiple: true },
       SeedetailsVisible: false,
-      options: [
-        {
-          value: 1,
-          label: "鐩戞祴璇勪及",
-        },
-        {
-          value: 2,
-          label: "鍑洪櫌闅忚",
-        },
-        {
-          value: 3,
-          label: "闂ㄨ瘖闅忚",
-        },
-        {
-          value: 4,
-          label: "瀹f暀鍏虫��",
-        },
-        {
-          value: 5,
-          label: "澶嶈瘖绠$悊",
-        },
-
-        {
-          value: 7,
-          label: "鎮h�呮姤鍛�",
-        },
-
-        {
-          value: 9,
-          label: "浣撴闅忚",
-        },
-
-        {
-          value: 11,
-          label: "褰卞儚闅忚",
-        },
-        {
-          value: 12,
-          label: "蹇冪數闅忚",
-        },
-        {
-          value: 13,
-          label: "涓撶梾闅忚",
-        },
-      ],
+      options: store.getters.tasktypes,
       pickerOptions: {
         disabledDate(time) {
           return time.getTime() < Date.now() - 3600 * 1000 * 24;
@@ -988,7 +938,7 @@
         dateRange: [],
         statisticaltype: 1,
         leavehospitaldistrictcodes: ["all"], // 榛樿閫変腑鍏ㄩ儴鐥呭尯
-        deptcodes: [], // 榛樿閫変腑鍏ㄩ儴绉戝
+        deptcodes: [], // 榛樿閫変腑鍏ㄩ儴璇鹃缁�
       },
       // 鍒椾俊鎭�
       columns: [
@@ -1014,7 +964,7 @@
       // 澶勭悊鏌ヨ鍙傛暟
       const params = {
         ...this.queryParams,
-        // 濡傛灉閫夋嫨浜�"鍏ㄩ儴"锛屽垯浼犳墍鏈夌梾鍖�/绉戝浠g爜
+        // 濡傛灉閫夋嫨浜�"鍏ㄩ儴"锛屽垯浼犳墍鏈夌梾鍖�/璇鹃缁勪唬鐮�
         leavehospitaldistrictcodes:
           this.queryParams.leavehospitaldistrictcodes.includes("all")
             ? this.allWardCodes
@@ -1041,7 +991,7 @@
 
     // 澶勭悊琛岀偣鍑诲睍寮�
     handleRowClick(row) {
-      console.log(row,'row');
+      console.log(row, "row");
 
       // 濡傛灉宸茬粡灞曞紑鍒欐敹璧�
       if (this.expands.includes(this.getRowKey(row))) {
@@ -1051,7 +1001,7 @@
       // 澶勭悊鏌ヨ鍙傛暟
       const params = {
         ...this.queryParams,
-        // 濡傛灉閫夋嫨浜�"鍏ㄩ儴"锛屽垯浼犳墍鏈夌梾鍖�/绉戝浠g爜
+        // 濡傛灉閫夋嫨浜�"鍏ㄩ儴"锛屽垯浼犳墍鏈夌梾鍖�/璇鹃缁勪唬鐮�
         leavehospitaldistrictcodes: [row.leavehospitaldistrictcode],
         drcode: "1",
       };
@@ -1080,16 +1030,16 @@
         tagid: row.tagid,
       };
     },
-    // 鑾峰彇绉戝鏍�
+    // 鑾峰彇璇鹃缁勬爲
     getDeptTree() {
-      // 绉戝鍒楄〃
+      // 璇鹃缁勫垪琛�
       this.flatArraydept = store.getters.belongDepts.map((dept) => {
         return {
           label: dept.deptName,
           value: dept.deptCode,
         };
       });
-      // 瀛樺偍鎵�鏈夌瀹や唬鐮�
+      // 瀛樺偍鎵�鏈夎棰樼粍浠g爜
       this.allDeptCodes = store.getters.belongDepts.map(
         (dept) => dept.deptCode
       );
@@ -1301,6 +1251,354 @@
         `user_${new Date().getTime()}.xlsx`
       );
     },
+    // 鏄剧ず鍥捐〃寮圭獥
+
+    showChartDialog() {
+      this.chartDialogVisible = true;
+      this.$nextTick(() => {
+        this.initPieChart();
+        this.initBarLineChart();
+      });
+    },
+    // 鍦╩ethods涓慨鏀圭粺璁℃柟娉�
+    showChartDialog() {
+      this.chartDialogVisible = true;
+      this.$nextTick(() => {
+        console.log(this.userList, "this.userList");
+
+        this.initCharts();
+      });
+    },
+
+    // 鏂板鍒濆鍖栧浘琛ㄦ柟娉�
+    initCharts() {
+      this.initPieChart();
+      this.initBarLineChart();
+    },
+
+    // 鍒濆鍖栭ゼ鍥�
+initPieChart() {
+  const echarts = require("echarts");
+  const pieDom = document.getElementById("pieChart");
+  if (!pieDom) return;
+
+  if (this.pieChart) {
+    this.pieChart.dispose();
+  }
+
+  this.pieChart = echarts.init(pieDom);
+
+  // 璁$畻楗煎浘鏁版嵁
+  const followUpData = {
+    pending: 0,
+    success: 0,
+    fail: 0,
+  };
+
+  this.userList.forEach((item) => {
+    followUpData.pending += item.pendingFollowUp || 0;
+    followUpData.success += item.followUpSuccess || 0;
+    followUpData.fail += item.followUpFail || 0;
+  });
+
+  // 浣跨敤鏇寸編瑙傜殑棰滆壊鏂规
+  const pieOption = {
+    title: {
+      text: "闅忚鐘舵�佸垎甯�",
+      left: "center",
+      textStyle: {
+        color: '#333',
+        fontSize: 16
+      }
+    },
+    tooltip: {
+      trigger: "item",
+      formatter: "{a} <br/>{b}: {c} ({d}%)",
+    },
+    legend: {
+      orient: "vertical",
+      left: "left",
+      data: ["寰呴殢璁�", "闅忚鎴愬姛", "闅忚澶辫触"],
+      textStyle: {
+        color: '#666'
+      }
+    },
+    color: ['#FF9D4D', '#36B37E', '#FF5C5C'], // 鏂扮殑閰嶈壊鏂规
+    series: [
+      {
+        name: "闅忚鐘舵��",
+        type: "pie",
+        radius: ["40%", "70%"],
+        avoidLabelOverlap: true,
+        itemStyle: {
+          borderRadius: 10,
+          borderColor: "#fff",
+          borderWidth: 2
+        },
+        label: {
+          show: true,
+          formatter: "{b}: {c} ({d}%)",
+          color: '#333'
+        },
+        emphasis: {
+          label: {
+            show: true,
+            fontSize: "18",
+            fontWeight: "bold"
+          },
+          itemStyle: {
+            shadowBlur: 10,
+            shadowOffsetX: 0,
+            shadowColor: 'rgba(0, 0, 0, 0.5)'
+          }
+        },
+        data: [
+          {
+            value: followUpData.pending,
+            name: "寰呴殢璁�"
+          },
+          {
+            value: followUpData.success,
+            name: "闅忚鎴愬姛"
+          },
+          {
+            value: followUpData.fail,
+            name: "闅忚澶辫触"
+          }
+        ]
+      }
+    ]
+  };
+
+  this.pieChart.setOption(pieOption);
+  window.addEventListener("resize", this.resizePieChart);
+},
+
+// 鍒濆鍖栨煴鐘舵姌绾垮浘
+initBarLineChart() {
+  const echarts = require("echarts");
+  const barDom = document.getElementById("barLineChart");
+  if (!barDom) return;
+
+  if (this.barLineChart) {
+    this.barLineChart.dispose();
+  }
+
+  this.barLineChart = echarts.init(barDom);
+
+  // 鍑嗗鏁版嵁
+  const categories = this.userList.map(
+    (item) => item.leavehospitaldistrictname || item.deptname
+  );
+
+  const dischargeData = this.userList.map(
+    (item) => item.dischargeCount || 0
+  );
+  const followUpData = this.userList.map(
+    (item) => item.followUpNeeded || 0
+  );
+
+  // 鏂板涓ゆ潯鎶樼嚎鏁版嵁
+ const followUpRateData = this.userList.map(item => {
+    if (!item.followUpRate) return 0;
+    // 鍘绘帀鐧惧垎鍙峰苟杞负鏁板瓧
+    const rateStr = String(item.followUpRate).replace('%', '');
+    return parseFloat(rateStr) || 0;
+  });
+
+  const timelyRateData = this.userList.map(item =>
+    item.rate ? (Number(item.rate) * 100).toFixed(2) : 0
+  );
+
+  const option = {
+    title: {
+      text: "璇鹃缁�/鐥呭尯闅忚瓒嬪娍",
+      left: "center",
+      textStyle: {
+        color: '#333',
+        fontSize: 16
+      }
+    },
+    tooltip: {
+      trigger: "axis",
+      axisPointer: {
+        type: "cross",
+        crossStyle: {
+          color: "#999",
+        },
+      },
+    },
+    legend: {
+      data: ["鍑洪櫌浜烘", "搴旈殢璁夸汉娆�", "闅忚鐜�(%)", "鍙婃椂鐜�(%)"],
+      top: "bottom",
+      textStyle: {
+        color: '#666'
+      }
+    },
+    color: ['#5470C6', '#91CC75', '#EE6666', '#9A60B4'], // 鏂板绱壊鐢ㄤ簬鍙婃椂鐜�
+    xAxis: {
+      type: "category",
+      data: categories,
+      axisLabel: {
+        interval: 0,
+        rotate: 30,
+        color: '#666'
+      },
+      axisLine: {
+        lineStyle: {
+          color: '#ddd'
+        }
+      }
+    },
+    yAxis: [
+      {
+        type: "value",
+        name: "浜烘",
+        min: 0,
+        axisLabel: {
+          color: '#666'
+        },
+        axisLine: {
+          lineStyle: {
+            color: '#ddd'
+          }
+        },
+        splitLine: {
+          lineStyle: {
+            color: '#f0f0f0'
+          }
+        }
+      },
+      {
+        type: "value",
+        name: "鐧惧垎姣�(%)",
+        min: 0,
+        max: 100,
+        axisLabel: {
+          color: '#666',
+          formatter: '{value}%'
+        },
+        axisLine: {
+          lineStyle: {
+            color: '#ddd'
+          }
+        },
+        splitLine: {
+          show: false
+        }
+      }
+    ],
+    series: [
+      {
+        name: "鍑洪櫌浜烘",
+        type: "bar",
+        barWidth: "25%",
+        data: dischargeData,
+        itemStyle: {
+          borderRadius: [4, 4, 0, 0]
+        }
+      },
+      {
+        name: "搴旈殢璁夸汉娆�",
+        type: "bar",
+        barWidth: "25%",
+        data: followUpData,
+        itemStyle: {
+          borderRadius: [4, 4, 0, 0]
+        }
+      },
+      {
+        name: "闅忚鐜�(%)",
+        type: "line",
+        yAxisIndex: 1,
+        data: followUpRateData,
+        symbolSize: 8,
+        lineStyle: {
+          width: 3
+        },
+        markLine: {
+          silent: true,
+          data: [{
+            yAxis: 80,
+            lineStyle: {
+              color: '#EE6666',
+              type: 'dashed'
+            },
+            // label: {
+            //   position: 'end',
+            //   formatter: '鐩爣80%'
+            // }
+          }]
+        }
+      },
+      {
+        name: "鍙婃椂鐜�(%)",
+        type: "line",
+        yAxisIndex: 1,
+        data: timelyRateData,
+        symbolSize: 8,
+        lineStyle: {
+          width: 3,
+          type: 'dotted' // 浣跨敤铏氱嚎鍖哄垎
+        },
+        markLine: {
+          silent: true,
+          data: [{
+            yAxis: 90,
+            lineStyle: {
+              color: '#9A60B4',
+              type: 'dashed'
+            },
+            // label: {
+            //   position: 'end',
+            //   formatter: '鐩爣90%'
+            // }
+          }]
+        }
+      }
+    ],
+    grid: {
+      top: '15%',
+      left: '3%',
+      right: '4%',
+      bottom: '15%',
+      containLabel: true
+    }
+  };
+
+  this.barLineChart.setOption(option);
+  window.addEventListener("resize", this.resizeBarLineChart);
+},
+
+    // 鍥捐〃鍝嶅簲寮忚皟鏁存柟娉�
+    resizePieChart() {
+      if (this.pieChart) {
+        this.pieChart.resize();
+      }
+    },
+
+    resizeBarLineChart() {
+      if (this.barLineChart) {
+        this.barLineChart.resize();
+      }
+    },
+
+    // 鍦ㄧ粍浠堕攢姣佹椂娓呯悊
+    beforeDestroy() {
+      // 绉婚櫎浜嬩欢鐩戝惉
+      window.removeEventListener("resize", this.resizePieChart);
+      window.removeEventListener("resize", this.resizeBarLineChart);
+
+      // 閿�姣佸浘琛ㄥ疄渚�
+      if (this.pieChart) {
+        this.pieChart.dispose();
+        this.pieChart = null;
+      }
+      if (this.barLineChart) {
+        this.barLineChart.dispose();
+        this.barLineChart = null;
+      }
+    },
   },
 };
 </script>

--
Gitblit v1.9.3