From 9d408b549b899631db29af772ee4e96f4c49a91c Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期四, 25 十二月 2025 15:53:56 +0800
Subject: [PATCH] 相关推送

---
 src/assets/logo/logo1.png                         |    0 
 src/store/modules/user.js                         |    5 
 src/views/business/maintain/mockMaintenanceApi.js |  575 ++++++
 vue.config.js                                     |    4 
 src/views/business/affirm/mockConfirmationApi.js  |  174 ++
 src/assets/images/yisna.jpg                       |    0 
 src/layout/components/Navbar.vue                  |   63 
 src/views/business/affirm/index.vue               |  428 +++++
 src/assets/logo/logo.png                          |    0 
 src/views/project/indexstatistics/index.vue       | 1744 +++++++++-----------
 src/views/business/maintain/index.vue             |  484 +++++
 src/views/register.vue                            |    2 
 src/views/business/assess/index.vue               |    6 
 src/views/login.vue                               |    2 
 src/assets/logo/OPO_Logo1.png                     |    0 
 src/views/business/affirm/affirmInfo.vue          |  727 ++++++++
 src/views/business/maintain/maintainInfo.vue      |  878 ++++++++++
 package.json                                      |    2 
 src/assets/logo/OPO_Logo.png                      |    0 
 src/assets/images/079.jpg!list1x.v2               |    0 
 src/assets/images/yisn.jpg                        |    0 
 21 files changed, 4,088 insertions(+), 1,006 deletions(-)

diff --git a/package.json b/package.json
index e01c9c9..88982f5 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "ruoyi",
   "version": "3.7.0",
-  "description": "娴欐睙鐪丱PO鏁板瓧鍖栫鐞嗗钩鍙�",
+  "description": "闈掑矝澶у闄勫睘鍖婚櫌opo",
   "author": "娴欐睙浜ュ皵鏃朵俊鎭鎶�鏈夐檺鍏徃",
   "license": "MIT",
   "scripts": {
diff --git "a/src/assets/images/079.jpg\041list1x.v2" "b/src/assets/images/079.jpg\041list1x.v2"
new file mode 100644
index 0000000..b24b5d0
--- /dev/null
+++ "b/src/assets/images/079.jpg\041list1x.v2"
Binary files differ
diff --git a/src/assets/images/yisn.jpg b/src/assets/images/yisn.jpg
new file mode 100644
index 0000000..e684b30
--- /dev/null
+++ b/src/assets/images/yisn.jpg
Binary files differ
diff --git a/src/assets/images/yisna.jpg b/src/assets/images/yisna.jpg
new file mode 100644
index 0000000..ac4c561
--- /dev/null
+++ b/src/assets/images/yisna.jpg
Binary files differ
diff --git a/src/assets/logo/OPO_Logo.png b/src/assets/logo/OPO_Logo.png
index d8375f0..3eeb31f 100644
--- a/src/assets/logo/OPO_Logo.png
+++ b/src/assets/logo/OPO_Logo.png
Binary files differ
diff --git a/src/assets/logo/OPO_Logo1.png b/src/assets/logo/OPO_Logo1.png
new file mode 100644
index 0000000..d8375f0
--- /dev/null
+++ b/src/assets/logo/OPO_Logo1.png
Binary files differ
diff --git a/src/assets/logo/logo.png b/src/assets/logo/logo.png
index e263760..3eeb31f 100644
--- a/src/assets/logo/logo.png
+++ b/src/assets/logo/logo.png
Binary files differ
diff --git a/src/assets/logo/logo1.png b/src/assets/logo/logo1.png
new file mode 100644
index 0000000..e263760
--- /dev/null
+++ b/src/assets/logo/logo1.png
Binary files differ
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index 166cfcd..583172c 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -45,7 +45,14 @@
         trigger="click"
       >
         <div class="avatar-wrapper">
-          <img :src="avatar" class="user-avatar" />
+          <img
+            :src="
+              sex == 1
+                ? require('@/assets/images/yisn.jpg')
+                : require('@/assets/images/yisna.jpg')
+            "
+            class="user-avatar"
+          />
           <i class="el-icon-caret-bottom" />
         </div>
         <el-dropdown-menu slot="dropdown">
@@ -85,7 +92,7 @@
     SizeSelect,
     Search,
     RuoYiGit,
-    RuoYiDoc,
+    RuoYiDoc
   },
   computed: {
     ...mapGetters(["sidebar", "avatar", "device"]),
@@ -96,41 +103,41 @@
       set(val) {
         this.$store.dispatch("settings/changeSetting", {
           key: "showSettings",
-          value: val,
+          value: val
         });
-      },
+      }
     },
     topNav: {
       get() {
         return this.$store.state.settings.topNav;
-      },
-    },
+      }
+    }
   },
   data() {
     return {
       isBadgeHidden: true,
       badgeVal: 0,
+      sex: this.$store.state.user.sex
     };
   },
   mounted() {
     // this.returs();
   },
   methods: {
-//     async returs() {
-//       await listSystemmessageCount()
-//         .then((res) => {
-//           this.badgeVal = res.data;
-// console.log('璺�');
-//           if (this.badgeVal > 0) {
-//             this.isBadgeHidden = false;
-//           }
-//         })
-//         .catch((error) => {});
-//     },
+    //     async returs() {
+    //       await listSystemmessageCount()
+    //         .then((res) => {
+    //           this.badgeVal = res.data;
+    // console.log('璺�');
+    //           if (this.badgeVal > 0) {
+    //             this.isBadgeHidden = false;
+    //           }
+    //         })
+    //         .catch((error) => {});
+    //     },
     clickMessage() {
       this.$router.push({
-        path: "/message",
-     
+        path: "/message"
       });
     },
     toggleSideBar() {
@@ -140,7 +147,7 @@
       this.$confirm("纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�", "鎻愮ず", {
         confirmButtonText: "纭畾",
         cancelButtonText: "鍙栨秷",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
           this.$store.dispatch("LogOut").then(() => {
@@ -148,21 +155,21 @@
           });
         })
         .catch(() => {});
-    },
+    }
   },
   watch: {
-    badgeVal: function () {
+    badgeVal: function() {
       const timer = setInterval(() => {
         this.returs();
-      },5000);
-      this.$once("hook:beforeDestroy",()=>{
+      }, 5000);
+      this.$once("hook:beforeDestroy", () => {
         clearInterval(timer);
-      })
-    },
-  },
+      });
+    }
+  }
 };
 </script>
-<style lang="scss" >
+<style lang="scss">
 .el-badge {
   .el-badge__content.is-fixed {
     top: 13px !important ;
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index 3ec749b..7056b3e 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -9,6 +9,7 @@
   state: {
     token: getToken(),
     name: '',
+    sex:'',
     avatar: '',
     code: '',
     msg: '',
@@ -31,6 +32,9 @@
     },
     SET_NAME: (state, name) => {
       state.name = name
+    },
+    SET_SEX: (state, sex) => {
+      state.sex = sex
     },
     SET_AVATAR: (state, avatar) => {
       state.avatar = avatar
@@ -93,6 +97,7 @@
             commit('SET_ROLES', ['ROLE_DEFAULT'])
           }
           commit('SET_NAME', user.userName)
+          commit('SET_SEX', user.sex)
           commit('SET_ROLESor', user.roles)
           commit('SET_AVATAR', avatar)
           resolve(res)
diff --git a/src/views/business/affirm/affirmInfo.vue b/src/views/business/affirm/affirmInfo.vue
new file mode 100644
index 0000000..d07df06
--- /dev/null
+++ b/src/views/business/affirm/affirmInfo.vue
@@ -0,0 +1,727 @@
+<template>
+  <div class="confirmation-detail">
+    <el-card class="detail-card">
+      <!-- 鍩虹淇℃伅 -->
+      <div slot="header" class="clearfix">
+        <span class="detail-title">鎹愮尞纭鍩烘湰淇℃伅</span>
+        <el-button
+          v-if="$route.query.confirm"
+          type="primary"
+          style="float: right; padding: 3px 0"
+          @click="handleSave"
+        >
+          淇濆瓨纭淇℃伅
+        </el-button>
+      </div>
+
+      <el-form :model="form" ref="form" label-width="120px">
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
+              <el-input v-model="form.caseNo" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
+              <el-input v-model="form.donorName" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鎬у埆" prop="gender">
+              <el-select
+                v-model="form.gender"
+                :disabled="!isEdit"
+                style="width: 100%"
+              >
+                <el-option label="鐢�" value="0" />
+                <el-option label="濂�" value="1" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="骞撮緞" prop="age">
+              <el-input v-model="form.age" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鐤剧梾璇婃柇" prop="diagnosis">
+              <el-input v-model="form.diagnosis" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鎵�鍦ㄥ尰鐤楁満鏋�" prop="hospitalName">
+              <el-input v-model="form.hospitalName" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="鍗忚皟鍛�1" prop="coordinator1">
+              <el-input v-model="form.coordinator1" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鍗忚皟鍛�2" prop="coordinator2">
+              <el-input v-model="form.coordinator2" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="涓氬姟浜哄憳" prop="assignee">
+              <el-input v-model="form.assignee" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="纭鐘舵��" prop="confirmationStatus">
+              <el-select
+                v-model="form.confirmationStatus"
+                :disabled="!isEdit"
+                style="width: 100%"
+              >
+                <el-option label="鏈‘璁�" value="0" />
+                <el-option label="瀹跺睘纭" value="1" />
+                <el-option label="涓嶅悓鎰忔崘鐚�" value="2" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="纭鏃堕棿" prop="confirmationTime">
+              <el-date-picker
+                v-model="form.confirmationTime"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                style="width: 100%"
+                :disabled="!isEdit"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item label="瀹跺睘鎰忚澶囨敞" prop="familyRemark">
+          <el-input
+            type="textarea"
+            :rows="3"
+            v-model="form.familyRemark"
+            :readonly="!isEdit"
+            placeholder="璁板綍瀹跺睘鐨勬剰瑙佸拰娌熼�氭儏鍐�"
+          />
+        </el-form-item>
+      </el-form>
+    </el-card>
+
+    <!-- 闄勪欢鍒楄〃 -->
+    <el-card class="attachment-card">
+      <div slot="header" class="clearfix">
+        <span class="detail-title">鐩稿叧闄勪欢涓婁紶</span>
+        <el-button
+          v-if="isEdit"
+          type="primary"
+          size="mini"
+          @click="handleSaveAll"
+          :loading="saveLoading"
+        >
+          淇濆瓨鎵�鏈夐檮浠�
+        </el-button>
+      </div>
+
+      <!-- 闄勪欢绫诲瀷閫夐」鍗� -->
+      <el-tabs v-model="activeAttachmentType" type="card">
+        <el-tab-pane
+          v-for="type in attachmentTypes"
+          :key="type.value"
+          :label="type.label"
+          :name="type.value"
+        >
+          <div class="attachment-upload-section">
+            <div class="upload-header">
+              <span class="upload-title">{{ type.label }}</span>
+              <el-tooltip content="鐐瑰嚮涓婁紶璇ョ被鍨嬮檮浠�" placement="top">
+                <el-button
+                  size="mini"
+                  type="primary"
+                  icon="el-icon-plus"
+                  @click="openUploadDialog(type.value)"
+                  :disabled="!isEdit"
+                >
+                  娣诲姞闄勪欢
+                </el-button>
+              </el-tooltip>
+            </div>
+
+            <!-- 闄勪欢鍒楄〃 -->
+            <el-table
+              :data="getAttachmentsByType(type.value)"
+              v-loading="attachmentLoading"
+              style="width: 100%; margin-top: 15px;"
+            >
+              <el-table-column label="鏂囦欢鍚嶇О" min-width="200">
+                <template slot-scope="scope">
+                  <div class="file-info">
+                    <i
+                      class="el-icon-document"
+                      style="margin-right: 8px; color: #409EFF;"
+                    ></i>
+                    <span>{{ scope.row.fileName }}</span>
+                  </div>
+                </template>
+              </el-table-column>
+
+              <el-table-column label="鏂囦欢澶у皬" width="100" align="center">
+                <template slot-scope="scope">
+                  <span>{{ formatFileSize(scope.row.fileSize) }}</span>
+                </template>
+              </el-table-column>
+
+              <el-table-column label="涓婁紶鏃堕棿" width="160" align="center">
+                <template slot-scope="scope">
+                  <span>{{ parseTime(scope.row.uploadTime) }}</span>
+                </template>
+              </el-table-column>
+
+              <el-table-column label="涓婁紶浜�" width="100" align="center">
+                <template slot-scope="scope">
+                  <span>{{ scope.row.uploader }}</span>
+                </template>
+              </el-table-column>
+
+              <el-table-column
+                label="鎿嶄綔"
+                width="120"
+                align="center"
+                v-if="isEdit"
+              >
+                <template slot-scope="scope">
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-view"
+                    @click="handlePreview(scope.row)"
+                    >棰勮</el-button
+                  >
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-delete"
+                    style="color: #F56C6C;"
+                    @click="handleRemoveAttachment(scope.row, type.value)"
+                    >鍒犻櫎</el-button
+                  >
+                </template>
+              </el-table-column>
+
+              <el-table-column label="鎿嶄綔" width="80" align="center" v-else>
+                <template slot-scope="scope">
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-view"
+                    @click="handlePreview(scope.row)"
+                    >棰勮</el-button
+                  >
+                </template>
+              </el-table-column>
+            </el-table>
+
+            <div
+              v-if="getAttachmentsByType(type.value).length === 0"
+              class="empty-attachment"
+            >
+              <el-empty description="鏆傛棤闄勪欢" :image-size="80"></el-empty>
+            </div>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+    </el-card>
+    <el-dialog
+      :title="`涓婁紶${getCurrentTypeLabel}闄勪欢`"
+      :visible.sync="uploadDialogVisible"
+      width="500px"
+      :close-on-click-modal="false"
+    >
+      <el-upload
+        ref="uploadRef"
+        class="upload-demo"
+        drag
+        action="#"
+        multiple
+        :file-list="tempFileList"
+        :before-upload="beforeUpload"
+        :on-change="handleFileChange"
+        :on-remove="handleTempRemove"
+        :auto-upload="false"
+        :http-request="handleHttpRequest"
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+        <div class="el-upload__tip" slot="tip">
+          鏀寔涓婁紶pdf銆乯pg銆乸ng銆乨oc銆乨ocx鏍煎紡鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB
+        </div>
+      </el-upload>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="uploadDialogVisible = false">鍙栨秷</el-button>
+        <el-button
+          type="primary"
+          @click="submitUpload"
+          :loading="uploadLoading"
+          :disabled="tempFileList.length === 0"
+        >
+          纭涓婁紶
+        </el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getConfirmationDetail,
+  updateConfirmation
+} from "./mockConfirmationApi";
+
+export default {
+  name: "ConfirmationDetail",
+  data() {
+    return {
+      // 鏄惁缂栬緫妯″紡
+      isEdit: false,
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: undefined,
+        caseNo: "",
+        donorName: "",
+        gender: "",
+        age: "",
+        diagnosis: "",
+        hospitalName: "",
+        coordinator1: "",
+        coordinator2: "",
+        assignee: "",
+        confirmationStatus: "0",
+        confirmationTime: "",
+        familyRemark: ""
+      },
+      // 闄勪欢鍒楄〃
+      // 闄勪欢鐩稿叧鏁版嵁
+      activeAttachmentType: "1",
+      attachmentLoading: false,
+      uploadDialogVisible: false,
+      uploadLoading: false,
+      saveLoading: false,
+      tempFileList: [],
+      currentUploadType: "",
+
+      // 闄勪欢绫诲瀷瀹氫箟
+      attachmentTypes: [
+        { value: "1", label: "浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃" },
+        { value: "2", label: "浜轰綋鍣ㄥ畼鎹愮尞浜插睘纭鐧昏琛�" },
+        { value: "3", label: "鎹愮尞鑰呭強鐩寸郴浜插睘韬唤璇併�佹埛鍙g翱鐩稿叧璇佹槑" },
+        { value: "4", label: "鍏皯韬晠鍚庝汉浣撳櫒瀹橈紙瑙掕啘锛夐仐浣撴崘鐚憡鐭ヤ功" },
+        { value: "5", label: "鑴戞浜″垽瀹氱煡鎯呭悓鎰忎功" },
+        { value: "6", label: "蹇冩浜″垽瀹氱煡鎯呭悓鎰忎功" }
+      ],
+
+      // 闄勪欢鍒楄〃鏁版嵁
+      attachmentList: [
+        // 妯℃嫙鏁版嵁 - 瀹為檯椤圭洰涓粠鎺ュ彛鑾峰彇
+        {
+          id: 1,
+          type: "1",
+          typeName: "浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃",
+          fileName: "娼滃湪鎹愮尞鑰呯櫥璁拌〃_202312001.pdf",
+          fileSize: 2548321,
+          uploadTime: "2023-12-01 10:30:00",
+          uploader: "寮犱笁",
+          fileUrl: "/attachments/1.pdf"
+        },
+        {
+          id: 2,
+          type: "1",
+          typeName: "浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃",
+          fileName: "琛ュ厖璇存槑.docx",
+          fileSize: 512345,
+          uploadTime: "2023-12-01 14:20:00",
+          uploader: "鏉庡洓",
+          fileUrl: "/attachments/2.docx"
+        }
+      ]
+    };
+  },
+  computed: {
+    isEdit() {
+      return this.$route.query.confirm === "true";
+    },
+    getCurrentTypeLabel() {
+      const type = this.attachmentTypes.find(
+        t => t.value === this.currentUploadType
+      );
+      return type ? type.label : "";
+    }
+  },
+  created() {
+    const id = this.$route.query.id;
+    this.isEdit = this.$route.query.confirm === "true";
+    if (id) {
+      this.getDetail(id);
+    }
+    this.getAttachmentList();
+  },
+  methods: {
+    // 鑾峰彇璇︽儏
+    getDetail(id) {
+      getConfirmationDetail(id).then(response => {
+        if (response.code === 200) {
+          this.form = response.data;
+        }
+      });
+    },
+    // 鑾峰彇闄勪欢鍒楄〃
+    getAttachmentList() {
+      this.attachmentLoading = true;
+      // 妯℃嫙闄勪欢鏁版嵁
+      this.attachmentList = [
+        {
+          id: 1,
+          type: "1",
+          typeName: "浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃",
+          fileName: "娼滃湪鎹愮尞鑰呯櫥璁拌〃_202312001.pdf",
+          uploadTime: "2023-12-01 10:30:00",
+          uploader: "寮犱笁",
+          fileSize: "2.5MB",
+          fileUrl: "/attachments/1.pdf"
+        },
+        {
+          id: 2,
+          type: "2",
+          typeName: "浜轰綋鍣ㄥ畼鎹愮尞浜插睘纭鐧昏琛�",
+          fileName: "浜插睘纭鐧昏琛╛202312001.pdf",
+          uploadTime: "2023-12-01 14:20:00",
+          uploader: "鏉庡洓",
+          fileSize: "1.8MB",
+          fileUrl: "/attachments/2.pdf"
+        },
+        {
+          id: 3,
+          type: "3",
+          typeName: "鎹愮尞鑰呭強鐩寸郴浜插睘韬唤璇併�佹埛鍙g翱鐩稿叧璇佹槑",
+          fileName: "韬唤璇佹槑_202312001.zip",
+          uploadTime: "2023-12-01 16:45:00",
+          uploader: "鐜嬩簲",
+          fileSize: "5.2MB",
+          fileUrl: "/attachments/3.zip"
+        },
+        {
+          id: 4,
+          type: "4",
+          typeName: "鍏皯韬晠鍚庝汉浣撳櫒瀹橈紙瑙掕啘锛夐仐浣撴崘鐚憡鐭ヤ功",
+          fileName: "鎹愮尞鍛婄煡涔202312001.pdf",
+          uploadTime: "2023-12-02 09:15:00",
+          uploader: "寮犱笁",
+          fileSize: "1.2MB",
+          fileUrl: "/attachments/4.pdf"
+        },
+        {
+          id: 5,
+          type: "5",
+          typeName: "鑴戞浜″垽瀹氱煡鎯呭悓鎰忎功",
+          fileName: "鑴戞浜″垽瀹氬悓鎰忎功_202312001.pdf",
+          uploadTime: "2023-12-02 11:30:00",
+          uploader: "鏉庡洓",
+          fileSize: "0.8MB",
+          fileUrl: "/attachments/5.pdf"
+        },
+        {
+          id: 6,
+          type: "6",
+          typeName: "蹇冩浜″垽瀹氱煡鎯呭悓鎰忎功",
+          fileName: "蹇冩浜″垽瀹氬悓鎰忎功_202312001.pdf",
+          uploadTime: "2023-12-02 13:20:00",
+          uploader: "鐜嬩簲",
+          fileSize: "0.9MB",
+          fileUrl: "/attachments/6.pdf"
+        }
+      ];
+      this.attachmentLoading = false;
+    },
+    // 涓嬭浇闄勪欢
+    handleDownload(row) {
+      // 瀹為檯椤圭洰涓繖閲岃皟鐢ㄦ枃浠朵笅杞芥帴鍙�
+      this.$message.success(`涓嬭浇鏂囦欢: ${row.fileName}`);
+      console.log("涓嬭浇鏂囦欢:", row.fileUrl);
+    },
+    // 淇濆瓨纭淇℃伅
+    handleSave() {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          updateConfirmation(this.form).then(response => {
+            if (response.code === 200) {
+              this.$message.success("淇濆瓨鎴愬姛");
+              this.isEdit = false;
+              this.$router.push("/case/confirmation");
+            }
+          });
+        }
+      });
+    },
+ // 鏍规嵁绫诲瀷鑾峰彇闄勪欢
+    getAttachmentsByType(type) {
+      return this.attachmentList.filter(item => item.type === type);
+    },
+
+    // 鎵撳紑涓婁紶瀵硅瘽妗�
+    openUploadDialog(type) {
+      this.currentUploadType = type;
+      this.tempFileList = [];
+      this.uploadDialogVisible = true;
+      this.$nextTick(() => {
+        if (this.$refs.uploadRef) {
+          this.$refs.uploadRef.clearFiles();
+        }
+      });
+    },
+
+    // 涓婁紶鍓嶆牎楠�
+    beforeUpload(file) {
+      const allowedTypes = [
+        'application/pdf',
+        'image/jpeg',
+        'image/png',
+        'application/msword',
+        'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
+      ];
+
+      const maxSize = 10 * 1024 * 1024; // 10MB
+
+      // 鏍¢獙鏂囦欢绫诲瀷
+      const isTypeOk = allowedTypes.includes(file.type) ||
+                      file.name.endsWith('.pdf') ||
+                      file.name.endsWith('.jpg') ||
+                      file.name.endsWith('.jpeg') ||
+                      file.name.endsWith('.png') ||
+                      file.name.endsWith('.doc') ||
+                      file.name.endsWith('.docx');
+
+      if (!isTypeOk) {
+        this.$message.error('鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼爌df銆乯pg銆乸ng銆乨oc鎴杁ocx鏍煎紡鏂囦欢');
+        return false;
+      }
+
+      // 鏍¢獙鏂囦欢澶у皬
+      if (file.size > maxSize) {
+        this.$message.error('鏂囦欢澶у皬涓嶈兘瓒呰繃10MB');
+        return false;
+      }
+
+      return true;
+    },
+
+    // 鏂囦欢閫夋嫨鍙樺寲
+    handleFileChange(file, fileList) {
+      this.tempFileList = fileList;
+    },
+
+    // 绉婚櫎涓存椂鏂囦欢
+    handleTempRemove(file, fileList) {
+      this.tempFileList = fileList;
+    },
+
+    // 鑷畾涔変笂浼犺姹�
+    handleHttpRequest(options) {
+      // 妯℃嫙涓婁紶杩囩▼
+      return new Promise((resolve, reject) => {
+        this.uploadLoading = true;
+
+        // 妯℃嫙涓婁紶寤惰繜
+        setTimeout(() => {
+          const newAttachment = {
+            id: Date.now(),
+            type: this.currentUploadType,
+            typeName: this.getCurrentTypeLabel,
+            fileName: options.file.name,
+            fileSize: options.file.size,
+            uploadTime: new Date().toISOString(),
+            uploader: '褰撳墠鐢ㄦ埛', // 瀹為檯椤圭洰涓粠鐢ㄦ埛淇℃伅鑾峰彇
+            fileUrl: URL.createObjectURL(options.file) // 涓存椂URL锛屽疄闄呴」鐩腑涓烘湇鍔″櫒杩斿洖鐨刄RL
+          };
+
+          this.attachmentList.push(newAttachment);
+          this.uploadLoading = false;
+          resolve({ code: 200, data: newAttachment });
+        }, 1500);
+      });
+    },
+
+    // 鎻愪氦涓婁紶
+    async submitUpload() {
+      if (this.tempFileList.length === 0) {
+        this.$message.warning('璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢');
+        return;
+      }
+
+      try {
+        // 渚濇涓婁紶鎵�鏈夋枃浠�
+        for (const file of this.tempFileList) {
+          await this.$refs.uploadRef.submit();
+        }
+
+        this.$message.success('鏂囦欢涓婁紶鎴愬姛');
+        this.uploadDialogVisible = false;
+        this.tempFileList = [];
+      } catch (error) {
+        this.$message.error('鏂囦欢涓婁紶澶辫触');
+        console.error('涓婁紶澶辫触:', error);
+      }
+    },
+
+    // 鍒犻櫎闄勪欢
+    handleRemoveAttachment(attachment, type) {
+      this.$confirm('纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        const index = this.attachmentList.findIndex(item => item.id === attachment.id);
+        if (index !== -1) {
+          this.attachmentList.splice(index, 1);
+          this.$message.success('闄勪欢鍒犻櫎鎴愬姛');
+
+          // 瀹為檯椤圭洰涓皟鐢ㄥ垹闄ゆ帴鍙�
+          // this.deleteAttachment(attachment.id);
+        }
+      }).catch(() => {});
+    },
+
+    // 棰勮闄勪欢
+    handlePreview(attachment) {
+      // 瀹為檯椤圭洰涓牴鎹枃浠剁被鍨嬭皟鐢ㄤ笉鍚岀殑棰勮鏂瑰紡
+      if (attachment.fileName.endsWith('.pdf')) {
+        // PDF棰勮
+        window.open(attachment.fileUrl, '_blank');
+      } else if (attachment.fileName.match(/\.(jpg|jpeg|png)$/i)) {
+        // 鍥剧墖棰勮
+        this.$alert(`<img src="${attachment.fileUrl}" style="max-width: 100%;" alt="${attachment.fileName}">`,
+          '鍥剧墖棰勮', {
+            dangerouslyUseHTMLString: true,
+            customClass: 'image-preview-dialog'
+          });
+      } else {
+        // 鍏朵粬鏂囦欢绫诲瀷鎻愮ず涓嬭浇
+        this.$message.info('璇ユ枃浠剁被鍨嬫殏涓嶆敮鎸佸湪绾块瑙堬紝璇蜂笅杞藉悗鏌ョ湅');
+      }
+    },
+
+    // 淇濆瓨鎵�鏈夐檮浠朵俊鎭�
+    handleSaveAll() {
+      this.saveLoading = true;
+
+      // 妯℃嫙淇濆瓨杩囩▼
+      setTimeout(() => {
+        this.$message.success('闄勪欢淇℃伅淇濆瓨鎴愬姛');
+        this.saveLoading = false;
+
+        // 瀹為檯椤圭洰涓皟鐢ㄤ繚瀛樻帴鍙�
+        // this.saveAttachments();
+      }, 1000);
+    },
+
+    // 鏂囦欢澶у皬鏍煎紡鍖�
+    formatFileSize(size) {
+      if (size === 0) return '0 B';
+      const k = 1024;
+      const sizes = ['B', 'KB', 'MB', 'GB'];
+      const i = Math.floor(Math.log(size) / Math.log(k));
+      return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
+    },
+
+    // 鏃堕棿鏍煎紡鍖�
+    parseTime(time) {
+      if (!time) return '';
+      const date = new Date(time);
+      return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
+    }
+  }
+};
+</script>
+
+<style scoped>
+.confirmation-detail {
+  padding: 20px;
+}
+
+.detail-card {
+  margin-bottom: 20px;
+}
+
+.attachment-card {
+  margin-bottom: 20px;
+}
+
+.detail-title {
+  font-size: 16px;
+  font-weight: bold;
+}
+
+.fixed-width .el-button {
+  margin: 0 5px;
+}
+.confirmation-detail {
+  padding: 20px;
+}
+
+.detail-card {
+  margin-bottom: 20px;
+}
+
+.attachment-card {
+  margin-bottom: 20px;
+}
+
+.detail-title {
+  font-size: 16px;
+  font-weight: bold;
+}
+
+.attachment-upload-section {
+  padding: 10px;
+}
+
+.upload-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 15px;
+}
+
+.upload-title {
+  font-size: 14px;
+  font-weight: 600;
+  color: #303133;
+}
+
+.file-info {
+  display: flex;
+  align-items: center;
+}
+
+.empty-attachment {
+  text-align: center;
+  padding: 40px 0;
+  color: #909399;
+}
+
+/* 鍥剧墖棰勮瀵硅瘽妗嗘牱寮� */
+:deep(.image-preview-dialog) {
+  width: auto;
+  max-width: 90vw;
+}
+
+:deep(.image-preview-dialog .el-message-box__content) {
+  text-align: center;
+}
+</style>
diff --git a/src/views/business/affirm/index.vue b/src/views/business/affirm/index.vue
new file mode 100644
index 0000000..d9854d8
--- /dev/null
+++ b/src/views/business/affirm/index.vue
@@ -0,0 +1,428 @@
+<template>
+  <div class="confirmation-list">
+    <!-- 鏌ヨ鏉′欢 -->
+    <el-card class="search-card">
+      <el-form
+        :model="queryParams"
+        ref="queryForm"
+        :inline="true"
+        label-width="100px"
+      >
+        <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
+          <el-input
+            v-model="queryParams.donorName"
+            placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
+            clearable
+            style="width: 200px"
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="鎵�鍦ㄥ尰鐤楁満鏋�" prop="hospitalName">
+          <el-input
+            v-model="queryParams.hospitalName"
+            placeholder="璇疯緭鍏ュ尰鐤楁満鏋�"
+            clearable
+            style="width: 200px"
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="涓氬姟浜哄憳" prop="assignee">
+          <el-input
+            v-model="queryParams.assignee"
+            placeholder="璇疯緭鍏ヤ笟鍔′汉鍛�"
+            clearable
+            style="width: 200px"
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="纭鐘舵��" prop="confirmationStatus">
+          <el-select
+            v-model="queryParams.confirmationStatus"
+            placeholder="璇烽�夋嫨纭鐘舵��"
+            clearable
+            style="width: 200px"
+          >
+            <el-option label="鏈‘璁�" value="0" />
+            <el-option label="瀹跺睘纭" value="1" />
+            <el-option label="涓嶅悓鎰忔崘鐚�" value="2" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="纭鏃堕棿" prop="confirmationTimeRange">
+          <el-date-picker
+            v-model="queryParams.confirmationTimeRange"
+            type="daterange"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+            value-format="yyyy-MM-dd"
+            style="width: 240px"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" @click="handleQuery"
+            >鎼滅储</el-button
+          >
+          <el-button icon="el-icon-refresh" @click="resetQuery">閲嶇疆</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+
+    <!-- 鎿嶄綔鎸夐挳 -->
+    <el-card class="tool-card">
+      <el-row :gutter="10">
+        <el-col :span="16">
+          <el-button type="primary" icon="el-icon-plus" @click="handleCreate"
+            >鏂板纭</el-button
+          >
+          <el-button
+            type="success"
+            icon="el-icon-edit"
+            :disabled="single"
+            @click="handleUpdate"
+            >淇敼</el-button
+          >
+          <el-button
+            type="danger"
+            icon="el-icon-delete"
+            :disabled="multiple"
+            @click="handleDelete"
+            >鍒犻櫎</el-button
+          >
+          <el-button
+            type="warning"
+            icon="el-icon-download"
+            @click="handleExport"
+            >瀵煎嚭</el-button
+          >
+        </el-col>
+        <el-col :span="8" style="text-align: right">
+          <el-tooltip content="鍒锋柊" placement="top">
+            <el-button icon="el-icon-refresh" circle @click="getList" />
+          </el-tooltip>
+        </el-col>
+      </el-row>
+    </el-card>
+
+    <!-- 鏁版嵁琛ㄦ牸 -->
+    <el-card>
+      <el-table
+        v-loading="loading"
+        :data="confirmationList"
+        @selection-change="handleSelectionChange"
+        @row-click="handleRowClick"
+      >
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column
+          label="妗堜緥缂栧彿"
+          align="center"
+          prop="caseNo"
+          width="120"
+        />
+        <el-table-column
+          label="娼滃湪鎹愮尞鑰呭鍚�"
+          align="center"
+          prop="donorName"
+          width="120"
+        />
+        <el-table-column label="鎬у埆" align="center" prop="gender" width="80">
+          <template slot-scope="scope">
+            <dict-tag
+              :options="dict.type.sys_user_sex"
+              :value="parseInt(scope.row.gender)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="骞撮緞" align="center" prop="age" width="80" />
+        <el-table-column
+          label="鐤剧梾璇婃柇"
+          align="center"
+          prop="diagnosis"
+          min-width="180"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鎵�鍦ㄥ尰鐤楁満鏋�"
+          align="center"
+          prop="hospitalName"
+          width="150"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="纭鐘舵��"
+          align="center"
+          prop="confirmationStatus"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <el-tag :type="statusFilter(scope.row.confirmationStatus)">
+              {{ statusTextFilter(scope.row.confirmationStatus) }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="纭鏃堕棿"
+          align="center"
+          prop="confirmationTime"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <span>{{
+              scope.row.confirmationTime
+                ? parseTime(scope.row.confirmationTime, "{y}-{m}-{d}")
+                : "-"
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="涓氬姟浜哄憳"
+          align="center"
+          prop="assignee"
+          width="100"
+        />
+        <el-table-column
+          label="鍗忚皟鍛�1"
+          align="center"
+          prop="coordinator1"
+          width="100"
+        />
+        <el-table-column
+          label="鍗忚皟鍛�2"
+          align="center"
+          prop="coordinator2"
+          width="100"
+        />
+        <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          width="120"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-view"
+              @click.stop="handleView(scope.row)"
+              >璇︽儏</el-button
+            >
+            <el-button
+              v-if="scope.row.confirmationStatus === '0'"
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click.stop="handleConfirm(scope.row)"
+              >纭</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 鍒嗛〉缁勪欢 -->
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-card>
+  </div>
+</template>
+
+<script>
+import { listConfirmation, delConfirmation, exportConfirmation } from "./mockConfirmationApi";
+import Pagination from "@/components/Pagination";
+
+export default {
+  name: "ConfirmationList",
+  components: { Pagination },
+  dicts: ["sys_user_sex"],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鎹愮尞纭琛ㄦ牸鏁版嵁
+      confirmationList: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        donorName: undefined,
+        hospitalName: undefined,
+        assignee: undefined,
+        confirmationStatus: undefined,
+        confirmationTimeRange: []
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 鐘舵�佽繃婊ゅ櫒
+    statusFilter(status) {
+      const statusMap = {
+        "0": "warning", // 鏈‘璁�
+        "1": "success", // 瀹跺睘纭
+        "2": "danger" // 涓嶅悓鎰忔崘鐚�
+      };
+      return statusMap[status] || "info";
+    },
+    statusTextFilter(status) {
+      const statusMap = {
+        "0": "鏈‘璁�",
+        "1": "瀹跺睘纭",
+        "2": "涓嶅悓鎰忔崘鐚�"
+      };
+      return statusMap[status] || "鏈煡";
+    },
+    // 鏌ヨ鎹愮尞纭鍒楄〃
+    getList() {
+      this.loading = true;
+      listConfirmation(this.queryParams)
+        .then(response => {
+          if (response.code === 200) {
+            this.confirmationList = response.data.rows;
+            this.total = response.data.total;
+          } else {
+            this.$message.error("鑾峰彇鏁版嵁澶辫触");
+          }
+          this.loading = false;
+        })
+        .catch(error => {
+          console.error("鑾峰彇鎹愮尞纭鍒楄〃澶辫触:", error);
+          this.loading = false;
+          this.$message.error("鑾峰彇鏁版嵁澶辫触");
+        });
+    },
+    // 鎼滅储鎸夐挳鎿嶄綔
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    // 閲嶇疆鎸夐挳鎿嶄綔
+    resetQuery() {
+      this.$refs.queryForm.resetFields();
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    // 琛岀偣鍑讳簨浠�
+    handleRowClick(row) {
+      this.$router.push({
+        path: "/case/affirmInfo",
+        query: { id: row.id }
+      });
+    },
+    // 鏌ョ湅璇︽儏
+    handleView(row) {
+      this.$router.push({
+        path: "/case/affirmInfo",
+        query: { id: row.id }
+      });
+    },
+    // 纭鎿嶄綔
+    handleConfirm(row) {
+      this.$router.push({
+        path: "/case/affirmInfo",
+        query: { id: row.id, confirm: true }
+      });
+    },
+    // 鏂板鎸夐挳鎿嶄綔
+    handleCreate() {
+      this.$router.push("/case/confirmation/add");
+    },
+    // 淇敼鎸夐挳鎿嶄綔
+    handleUpdate() {
+      const id = this.ids[0];
+      this.$router.push({
+        path: "/case/confirmation/edit",
+        query: { id: id }
+      });
+    },
+    // 鍒犻櫎鎸夐挳鎿嶄綔
+    handleDelete() {
+      const ids = this.ids;
+      this.$confirm("鏄惁纭鍒犻櫎閫変腑鐨勬暟鎹」锛�", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(() => {
+          return delConfirmation(ids);
+        })
+        .then(response => {
+          if (response.code === 200) {
+            this.$message.success("鍒犻櫎鎴愬姛");
+            this.getList();
+          }
+        })
+        .catch(() => {});
+    },
+    // 瀵煎嚭鎸夐挳鎿嶄綔
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm("鏄惁纭瀵煎嚭鎵�鏈夌‘璁ゆ暟鎹紵", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(() => {
+          this.loading = true;
+          return exportConfirmation(queryParams);
+        })
+        .then(response => {
+          if (response.code === 200) {
+            this.$message.success("瀵煎嚭鎴愬姛");
+            // 瀹為檯椤圭洰涓繖閲屽鐞嗘枃浠朵笅杞�
+          }
+          this.loading = false;
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+    // 鏃堕棿鏍煎紡鍖�
+    parseTime(time, pattern) {
+      if (!time) return "";
+      const date = new Date(time);
+      return `${date.getFullYear()}-${(date.getMonth() + 1)
+        .toString()
+        .padStart(2, "0")}-${date
+        .getDate()
+        .toString()
+        .padStart(2, "0")}`;
+    }
+  }
+};
+</script>
+
+<style scoped>
+.confirmation-list {
+  padding: 20px;
+}
+
+.search-card {
+  margin-bottom: 20px;
+}
+
+.tool-card {
+  margin-bottom: 20px;
+}
+
+.fixed-width .el-button {
+  margin: 0 5px;
+}
+</style>
diff --git a/src/views/business/affirm/mockConfirmationApi.js b/src/views/business/affirm/mockConfirmationApi.js
new file mode 100644
index 0000000..d0d7626
--- /dev/null
+++ b/src/views/business/affirm/mockConfirmationApi.js
@@ -0,0 +1,174 @@
+// 妯℃嫙鎹愮尞纭API
+const confirmationData = {
+  rows: [
+    {
+      id: 1,
+      caseNo: 'QJ202312001',
+      donorName: '寮犳煇鏌�',
+      gender: '0',
+      age: '45',
+      diagnosis: '閲嶅瀷棰呰剳鎹熶激',
+      hospitalName: '鍖椾含甯傜涓�浜烘皯鍖婚櫌',
+      confirmationStatus: '0',
+      confirmationTime: '',
+      assignee: '鐜嬪尰鐢�',
+      coordinator1: '鍗忚皟鍛楢',
+      coordinator2: '鍗忚皟鍛楤',
+      familyRemark: ''
+    },
+    {
+      id: 2,
+      caseNo: 'QJ202312002',
+      donorName: '鏉庢煇鏌�',
+      gender: '1',
+      age: '32',
+      diagnosis: '鑴戝嚭琛�',
+      hospitalName: '涓婃捣甯備腑蹇冨尰闄�',
+      confirmationStatus: '1',
+      confirmationTime: '2023-12-01 14:30:00',
+      assignee: '鏉庡尰鐢�',
+      coordinator1: '鍗忚皟鍛楥',
+      coordinator2: '鍗忚皟鍛楧',
+      familyRemark: '瀹跺睘鍚屾剰鎹愮尞锛屽凡绛剧讲鐩稿叧鏂囦欢'
+    },
+    {
+      id: 3,
+      caseNo: 'QJ202312003',
+      donorName: '鐜嬫煇鏌�',
+      gender: '0',
+      age: '58',
+      diagnosis: '蹇冭剰楠ゅ仠鍚庤剳鎹熶激',
+      hospitalName: '骞垮窞甯備汉姘戝尰闄�',
+      confirmationStatus: '2',
+      confirmationTime: '2023-12-02 10:15:00',
+      assignee: '寮犲尰鐢�',
+      coordinator1: '鍗忚皟鍛楨',
+      coordinator2: '鍗忚皟鍛楩',
+      familyRemark: '瀹跺睘缁忚�冭檻鍚庡喅瀹氫笉鍚屾剰鎹愮尞'
+    }
+  ],
+  total: 3
+};
+
+// 鑾峰彇鎹愮尞纭鍒楄〃
+export function listConfirmation(params) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const { pageNum, pageSize, donorName, hospitalName, confirmationStatus } = params;
+      let filteredData = confirmationData.rows;
+
+      // 妯℃嫙绛涢��
+      if (donorName) {
+        filteredData = filteredData.filter(item =>
+          item.donorName.includes(donorName)
+        );
+      }
+
+      if (hospitalName) {
+        filteredData = filteredData.filter(item =>
+          item.hospitalName.includes(hospitalName)
+        );
+      }
+
+      if (confirmationStatus) {
+        filteredData = filteredData.filter(item =>
+          item.confirmationStatus === confirmationStatus
+        );
+      }
+
+      const start = (pageNum - 1) * pageSize;
+      const end = start + pageSize;
+      const pageData = filteredData.slice(start, end);
+
+      resolve({
+        code: 200,
+        data: {
+          rows: pageData,
+          total: filteredData.length
+        }
+      });
+    }, 500);
+  });
+}
+
+// 鑾峰彇鎹愮尞纭璇︽儏
+export function getConfirmationDetail(id) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const detail = confirmationData.rows.find(item => item.id == id);
+      resolve({
+        code: 200,
+        data: detail || {}
+      });
+    }, 300);
+  });
+}
+
+// 鏇存柊鎹愮尞纭淇℃伅
+export function updateConfirmation(data) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const index = confirmationData.rows.findIndex(item => item.id === data.id);
+      if (index !== -1) {
+        confirmationData.rows[index] = { ...confirmationData.rows[index], ...data };
+      }
+      resolve({ code: 200, message: '鏇存柊鎴愬姛' });
+    }, 300);
+  });
+}
+
+// 鍒犻櫎鎹愮尞纭
+export function delConfirmation(ids) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      confirmationData.rows = confirmationData.rows.filter(
+        item => !ids.includes(item.id)
+      );
+      confirmationData.total = confirmationData.rows.length;
+      resolve({ code: 200, message: '鍒犻櫎鎴愬姛' });
+    }, 300);
+  });
+}
+
+// 瀵煎嚭鎹愮尞纭鏁版嵁
+export function exportConfirmation(params) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      resolve({
+        code: 200,
+        data: {
+          downloadUrl: '/download/confirmation_export.xlsx'
+        },
+        message: '瀵煎嚭鎴愬姛'
+      });
+    }, 1000);
+  });
+}
+// 闄勪欢鐩稿叧API鎺ュ彛
+export const attachmentApi = {
+  // 鑾峰彇妗堜緥闄勪欢鍒楄〃
+  getAttachments(caseId) {
+    return request.get(`/api/attachments/case/${caseId}`);
+  },
+
+  // 涓婁紶闄勪欢
+  uploadAttachment(data) {
+    const formData = new FormData();
+    formData.append('file', data.file);
+    formData.append('caseId', data.caseId);
+    formData.append('type', data.type);
+    return request.post('/api/attachments/upload', formData, {
+      headers: { 'Content-Type': 'multipart/form-data' }
+    });
+  },
+
+  // 鍒犻櫎闄勪欢
+  deleteAttachment(attachmentId) {
+    return request.delete(`/api/attachments/${attachmentId}`);
+  },
+
+  // 鎵归噺淇濆瓨闄勪欢淇℃伅
+  saveAttachments(attachments) {
+    return request.post('/api/attachments/batch-save', attachments);
+  }
+};
diff --git a/src/views/business/assess/index.vue b/src/views/business/assess/index.vue
index 1ca3ea8..a8c37d7 100644
--- a/src/views/business/assess/index.vue
+++ b/src/views/business/assess/index.vue
@@ -376,18 +376,18 @@
     // 琛岀偣鍑讳簨浠�
     handleRowClick(row) {
       this.$router.push({
-        path: "/case/assessment/detail",
+        path: "/case/assessInfo",
         query: { id: row.id }
       });
     },
     // 鏌ョ湅璇︽儏
     handleView(row) {
-      this.$router.push({ path: "/organ/assessInfo", query: { id: row.id } });
+      this.$router.push({ path: "/case/assessInfo", query: { id: row.id } });
     },
     // 杩涜璇勪及
     handleAssess(row) {
       this.$router.push({
-        path: "/case/assessment/detail",
+        path: "/case/assessInfo",
         query: { id: row.id, assess: true }
       });
     },
diff --git a/src/views/business/maintain/index.vue b/src/views/business/maintain/index.vue
new file mode 100644
index 0000000..37fa8c6
--- /dev/null
+++ b/src/views/business/maintain/index.vue
@@ -0,0 +1,484 @@
+<template>
+  <div class="maintenance-list">
+    <!-- 鏌ヨ鏉′欢 -->
+    <el-card class="search-card">
+      <el-form
+        :model="queryParams"
+        ref="queryForm"
+        :inline="true"
+        label-width="100px"
+      >
+        <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
+          <el-input
+            v-model="queryParams.donorName"
+            placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
+            clearable
+            style="width: 200px"
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="鎵�鍦ㄥ尰鐤楁満鏋�" prop="hospitalName">
+          <el-input
+            v-model="queryParams.hospitalName"
+            placeholder="璇疯緭鍏ュ尰鐤楁満鏋�"
+            clearable
+            style="width: 200px"
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="鍖荤枟缁勪汉鍛�" prop="medicalStaff">
+          <el-input
+            v-model="queryParams.medicalStaff"
+            placeholder="璇疯緭鍏ュ尰鐤楃粍浜哄憳"
+            clearable
+            style="width: 200px"
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="鎮h�呯姸鎬�" prop="patientStatus">
+          <el-select
+            v-model="queryParams.patientStatus"
+            placeholder="璇烽�夋嫨鎮h�呯姸鎬�"
+            clearable
+            style="width: 200px"
+          >
+            <el-option label="DCD" value="1" />
+            <el-option label="DBD" value="2" />
+            <el-option label="DBCD" value="3" />
+            <el-option label="宸插畬鎴愭崘鐚�" value="4" />
+            <el-option label="鏈畬鎴愭崘鐚�" value="5" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="褰曞叆鏃堕棿" prop="recordTimeRange">
+          <el-date-picker
+            v-model="queryParams.recordTimeRange"
+            type="daterange"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+            value-format="yyyy-MM-dd"
+            style="width: 240px"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" @click="handleQuery"
+            >鎼滅储</el-button
+          >
+          <el-button icon="el-icon-refresh" @click="resetQuery">閲嶇疆</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+
+    <!-- 鎿嶄綔鎸夐挳 -->
+    <el-card class="tool-card">
+      <el-row :gutter="10">
+        <el-col :span="16">
+          <!-- <el-button type="primary" icon="el-icon-plus" @click="handleCreate"
+            >鏂板缁存姢</el-button
+          > -->
+          <el-button
+            type="success"
+            icon="el-icon-edit"
+            :disabled="single"
+            @click="handleUpdate"
+            >淇敼</el-button
+          >
+          <el-button
+            type="danger"
+            icon="el-icon-delete"
+            :disabled="multiple"
+            @click="handleDelete"
+            >鍒犻櫎</el-button
+          >
+          <el-button
+            type="warning"
+            icon="el-icon-download"
+            @click="handleExport"
+            >瀵煎嚭</el-button
+          >
+        </el-col>
+        <el-col :span="8" style="text-align: right">
+          <el-tooltip content="鍒锋柊" placement="top">
+            <el-button icon="el-icon-refresh" circle @click="getList" />
+          </el-tooltip>
+        </el-col>
+      </el-row>
+    </el-card>
+
+    <!-- 鏁版嵁琛ㄦ牸 -->
+    <el-card>
+      <el-table
+        v-loading="loading"
+        :data="maintenanceList"
+        @selection-change="handleSelectionChange"
+        @row-click="handleRowClick"
+      >
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column
+          label="妗堜緥缂栧彿"
+          align="center"
+          prop="caseNo"
+          width="120"
+        />
+        <el-table-column
+          label="娼滃湪鎹愮尞鑰呭鍚�"
+          align="center"
+          prop="donorName"
+          width="120"
+        />
+        <el-table-column label="鎬у埆" align="center" prop="gender" width="80">
+          <template slot-scope="scope">
+            <dict-tag
+              :options="dict.type.sys_user_sex"
+              :value="parseInt(scope.row.gender)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="骞撮緞" align="center" prop="age" width="80" />
+        <el-table-column
+          label="鐤剧梾璇婃柇"
+          align="center"
+          prop="diagnosis"
+          min-width="180"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鎵�鍦ㄥ尰鐤楁満鏋�"
+          align="center"
+          prop="hospitalName"
+          width="150"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鎮h�呯姸鎬�"
+          align="center"
+          prop="patientStatus"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <el-tag :type="statusFilter(scope.row.patientStatus)">
+              {{ statusTextFilter(scope.row.patientStatus) }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鍏ラ櫌鏃堕棿"
+          align="center"
+          prop="admissionTime"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <span>{{
+              scope.row.admissionTime
+                ? parseTime(scope.row.admissionTime, "{y}-{m}-{d}")
+                : "-"
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鍑洪櫌鏃堕棿"
+          align="center"
+          prop="dischargeTime"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <span>{{
+              scope.row.dischargeTime
+                ? parseTime(scope.row.dischargeTime, "{y}-{m}-{d}")
+                : "-"
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鏈�鏂板煿鍏荤粨鏋�"
+          align="center"
+          prop="latestCultureResult"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <el-tag
+              :type="scope.row.latestCultureResult === '闃存��' ? 'success' : 'danger'"
+              effect="plain"
+            >
+              {{ scope.row.latestCultureResult || '鏈娴�' }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鎶ょ悊鏍告煡琛ㄥ綍鍏ユ椂闂�"
+          align="center"
+          prop="lastRecordTime"
+          width="140"
+        >
+          <template slot-scope="scope">
+            <span>{{
+              scope.row.lastRecordTime
+                ? parseTime(scope.row.lastRecordTime, "{y}-{m}-{d} {h}:{i}")
+                : "-"
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鍗忚皟鍛�"
+          align="center"
+          prop="coordinator"
+          width="100"
+        />
+        <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          width="180"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-view"
+              @click.stop="handleView(scope.row)"
+              >璇︽儏</el-button
+            >
+            <!-- <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click.stop="handleRecord(scope.row)"
+              >褰曞叆鏍告煡</el-button
+            >
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-document"
+              @click.stop="handleRecordList(scope.row)"
+              >璁板綍鏌ヨ</el-button
+            > -->
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 鍒嗛〉缁勪欢 -->
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-card>
+  </div>
+</template>
+
+<script>
+import { listMaintenance, delMaintenance, exportMaintenance } from "./mockMaintenanceApi";
+import Pagination from "@/components/Pagination";
+
+export default {
+  name: "MaintenanceList",
+  components: { Pagination },
+  dicts: ["sys_user_sex"],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 渚涜�呯淮鎶よ〃鏍兼暟鎹�
+      maintenanceList: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        donorName: undefined,
+        hospitalName: undefined,
+        medicalStaff: undefined,
+        patientStatus: undefined,
+        recordTimeRange: []
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 鐘舵�佽繃婊ゅ櫒
+    statusFilter(status) {
+      const statusMap = {
+        "1": "primary",   // DCD
+        "2": "warning",   // DBD
+        "3": "info",       // DBCD
+        "4": "success",    // 宸插畬鎴愭崘鐚�
+        "5": "danger"      // 鏈畬鎴愭崘鐚�
+      };
+      return statusMap[status] || "info";
+    },
+    statusTextFilter(status) {
+      const statusMap = {
+        "1": "DCD",
+        "2": "DBD",
+        "3": "DBCD",
+        "4": "宸插畬鎴愭崘鐚�",
+        "5": "鏈畬鎴愭崘鐚�"
+      };
+      return statusMap[status] || "鏈煡";
+    },
+    // 鏌ヨ渚涜�呯淮鎶ゅ垪琛�
+    getList() {
+      this.loading = true;
+      listMaintenance(this.queryParams)
+        .then(response => {
+          if (response.code === 200) {
+            this.maintenanceList = response.data.rows;
+            this.total = response.data.total;
+          } else {
+            this.$message.error("鑾峰彇鏁版嵁澶辫触");
+          }
+          this.loading = false;
+        })
+        .catch(error => {
+          console.error("鑾峰彇渚涜�呯淮鎶ゅ垪琛ㄥけ璐�:", error);
+          this.loading = false;
+          this.$message.error("鑾峰彇鏁版嵁澶辫触");
+        });
+    },
+    // 鎼滅储鎸夐挳鎿嶄綔
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    // 閲嶇疆鎸夐挳鎿嶄綔
+    resetQuery() {
+      this.$refs.queryForm.resetFields();
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    // 琛岀偣鍑讳簨浠�
+    handleRowClick(row) {
+      this.$router.push({
+        path: "/case/maintainInfo",
+        query: { id: row.id }
+      });
+    },
+    // 鏌ョ湅璇︽儏
+    handleView(row) {
+      this.$router.push({
+        path: "/case/maintainInfo",
+        query: { id: row.id }
+      });
+    },
+    // 褰曞叆鎶ょ悊鏍告煡
+    handleRecord(row) {
+      this.$router.push({
+        path: "/case/maintenance/record",
+        query: { id: row.id, maintenanceId: row.maintenanceId }
+      });
+    },
+    // 鏌ョ湅璁板綍鍒楄〃
+    handleRecordList(row) {
+      this.$router.push({
+        path: "/case/maintenance/records",
+        query: { id: row.id, maintenanceId: row.maintenanceId }
+      });
+    },
+    // 鏂板鎸夐挳鎿嶄綔
+    handleCreate() {
+      this.$router.push("/case/maintenance/add");
+    },
+    // 淇敼鎸夐挳鎿嶄綔
+    handleUpdate() {
+      const id = this.ids[0];
+      this.$router.push({
+        path: "/case/maintenance/edit",
+        query: { id: id }
+      });
+    },
+    // 鍒犻櫎鎸夐挳鎿嶄綔
+    handleDelete() {
+      const ids = this.ids;
+      this.$confirm("鏄惁纭鍒犻櫎閫変腑鐨勬暟鎹」锛�", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(() => {
+          return delMaintenance(ids);
+        })
+        .then(response => {
+          if (response.code === 200) {
+            this.$message.success("鍒犻櫎鎴愬姛");
+            this.getList();
+          }
+        })
+        .catch(() => {});
+    },
+    // 瀵煎嚭鎸夐挳鎿嶄綔
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm("鏄惁纭瀵煎嚭鎵�鏈夌淮鎶ゆ暟鎹紵", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(() => {
+          this.loading = true;
+          return exportMaintenance(queryParams);
+        })
+        .then(response => {
+          if (response.code === 200) {
+            this.$message.success("瀵煎嚭鎴愬姛");
+          }
+          this.loading = false;
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+    // 鏃堕棿鏍煎紡鍖�
+    parseTime(time, pattern) {
+      if (!time) return "";
+      const date = new Date(time);
+      if (pattern) {
+        return pattern.replace(/{(\w+)}/g, (match, p) => {
+          switch(p) {
+            case 'y': return date.getFullYear();
+            case 'm': return (date.getMonth() + 1).toString().padStart(2, '0');
+            case 'd': return date.getDate().toString().padStart(2, '0');
+            case 'h': return date.getHours().toString().padStart(2, '0');
+            case 'i': return date.getMinutes().toString().padStart(2, '0');
+            default: return match;
+          }
+        });
+      }
+      return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, "0")}-${date.getDate().toString().padStart(2, "0")}`;
+    }
+  }
+};
+</script>
+
+<style scoped>
+.maintenance-list {
+  padding: 20px;
+}
+
+.search-card {
+  margin-bottom: 20px;
+}
+
+.tool-card {
+  margin-bottom: 20px;
+}
+
+.fixed-width .el-button {
+  margin: 0 5px;
+}
+</style>
diff --git a/src/views/business/maintain/maintainInfo.vue b/src/views/business/maintain/maintainInfo.vue
new file mode 100644
index 0000000..3f88144
--- /dev/null
+++ b/src/views/business/maintain/maintainInfo.vue
@@ -0,0 +1,878 @@
+<template>
+  <div class="maintenance-detail">
+    <!-- 鍩虹淇℃伅 -->
+    <el-card class="detail-card">
+      <div slot="header" class="clearfix">
+        <span class="detail-title">渚涜�呭熀鏈俊鎭�</span>
+        <el-button
+          v-if="isEdit"
+          type="primary"
+          style="float: right; padding: 3px 0"
+          @click="handleSave"
+        >
+          淇濆瓨淇℃伅
+        </el-button>
+      </div>
+
+      <el-form :model="form" ref="form" label-width="120px">
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
+              <el-input v-model="form.caseNo" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
+              <el-input v-model="form.donorName" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鎬у埆" prop="gender">
+              <el-select v-model="form.gender" :disabled="!isEdit" style="width: 100%">
+                <el-option label="鐢�" value="0" />
+                <el-option label="濂�" value="1" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="骞撮緞" prop="age">
+              <el-input v-model="form.age" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鐤剧梾璇婃柇" prop="diagnosis">
+              <el-input v-model="form.diagnosis" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鎵�鍦ㄥ尰鐤楁満鏋�" prop="hospitalName">
+              <el-input v-model="form.hospitalName" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="鎮h�呯姸鎬�" prop="patientStatus">
+              <el-select v-model="form.patientStatus" :disabled="!isEdit" style="width: 100%">
+                <el-option label="DCD" value="1" />
+                <el-option label="DBD" value="2" />
+                <el-option label="DBCD" value="3" />
+                <el-option label="宸插畬鎴愭崘鐚�" value="4" />
+                <el-option label="鏈畬鎴愭崘鐚�" value="5" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鏈畬鎴愬師鍥�" prop="incompleteReason" v-if="form.patientStatus === '5'">
+              <el-input
+                v-model="form.incompleteReason"
+                :readonly="!isEdit"
+                placeholder="璇疯緭鍏ユ湭瀹屾垚鎹愮尞鐨勫師鍥�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="鍏ラ櫌鏃堕棿" prop="admissionTime">
+              <el-date-picker
+                v-model="form.admissionTime"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                style="width: 100%"
+                :disabled="!isEdit"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鍑洪櫌鏃堕棿" prop="dischargeTime">
+              <el-date-picker
+                v-model="form.dischargeTime"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                style="width: 100%"
+                :disabled="!isEdit"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鍗忚皟鍛�" prop="coordinator">
+              <el-input v-model="form.coordinator" :readonly="!isEdit" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="琛�鍨�" prop="bloodType">
+              <el-select v-model="form.bloodType" :disabled="!isEdit" style="width: 100%">
+                <el-option label="A鍨�" value="A" />
+                <el-option label="B鍨�" value="B" />
+                <el-option label="O鍨�" value="O" />
+                <el-option label="AB鍨�" value="AB" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="RH鍥犲瓙" prop="rhFactor">
+              <el-select v-model="form.rhFactor" :disabled="!isEdit" style="width: 100%">
+                <el-option label="闃虫��" value="positive" />
+                <el-option label="闃存��" value="negative" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item label="鐗规畩鐥呭彶" prop="specialMedicalHistory">
+          <el-input
+            type="textarea"
+            :rows="3"
+            v-model="form.specialMedicalHistory"
+            :readonly="!isEdit"
+            placeholder="璁板綍鐗规畩鐥呭彶淇℃伅"
+          />
+        </el-form-item>
+      </el-form>
+    </el-card>
+
+    <!-- 鍩瑰吇缁撴灉璁板綍 -->
+ <!-- 鍩瑰吇缁撴灉璁板綍 -->
+    <el-card class="culture-card">
+      <div slot="header" class="clearfix">
+        <span class="detail-title">鍩瑰吇缁撴灉璁板綍</span>
+        <el-button
+          type="primary"
+          size="mini"
+          icon="el-icon-plus"
+          @click="handleAddCulture"
+        >
+          鏂板鍩瑰吇璁板綍
+        </el-button>
+      </div>
+
+      <el-table :data="cultureList" v-loading="cultureLoading">
+        <el-table-column label="鍩瑰吇绫诲瀷" align="center" prop="cultureType" width="120">
+          <template slot-scope="scope">
+            <dict-tag :options="cultureTypeOptions" :value="scope.row.cultureType" />
+          </template>
+        </el-table-column>
+        <el-table-column label="閲囨牱鏃堕棿" align="center" prop="sampleTime" width="160" />
+        <el-table-column label="鍩瑰吇缁撴灉" align="center" prop="result" width="100">
+          <template slot-scope="scope">
+            <el-tag :type="scope.row.result === '闃存��' ? 'success' : 'danger'" effect="plain">
+              {{ scope.row.result }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="鑿岀" align="center" prop="bacteria" width="120" />
+        <el-table-column label="鑽晱缁撴灉" align="center" prop="drugSensitivity" min-width="150" show-overflow-tooltip />
+        <el-table-column label="妫�娴嬫満鏋�" align="center" prop="testingInstitution" width="120" />
+        <el-table-column label="鎿嶄綔" align="center" width="180" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="handleEditCulture(scope.row)"
+            >缂栬緫</el-button>
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              style="color: #F56C6C;"
+              @click="handleDeleteCulture(scope.row)"
+            >鍒犻櫎</el-button>
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-view"
+              @click="handleViewCulture(scope.row)"
+            >璇︽儏</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 鍒嗛〉缁勪欢 -->
+      <pagination
+        v-show="cultureTotal > 0"
+        :total="cultureTotal"
+        :page.sync="cultureQueryParams.pageNum"
+        :limit.sync="cultureQueryParams.pageSize"
+        @pagination="getCultureList"
+      />
+    </el-card>
+
+    <!-- 鎶ょ悊鏍告煡璁板綍 -->
+    <el-card class="record-card">
+      <div slot="header" class="clearfix">
+        <span class="detail-title">鎶ょ悊鏍告煡璁板綍</span>
+        <el-button
+          type="primary"
+          size="mini"
+          icon="el-icon-plus"
+          @click="handleAddRecord"
+        >
+          鏂板鏍告煡璁板綍
+        </el-button>
+      </div>
+
+      <el-table :data="recordList" v-loading="recordLoading">
+        <el-table-column label="鏍告煡鏃堕棿" align="center" prop="recordTime" width="160" />
+        <el-table-column label="鏍告煡浜�" align="center" prop="recorder" width="100" />
+        <el-table-column label="浣撴俯(鈩�)" align="center" prop="temperature"  />
+        <el-table-column label="蹇冪巼(娆�/鍒�)" align="center" prop="heartRate"  />
+        <el-table-column label="琛�鍘�(mmHg)" align="center" prop="bloodPressure" width="160" />
+        <el-table-column label="鍛煎惛(娆�/鍒�)" align="center" prop="respirationRate"  />
+        <el-table-column label="琛�姘чケ鍜屽害(%)" align="center" prop="oxygenSaturation" width="160" />
+        <el-table-column label="灏块噺(ml/h)" align="center" prop="urineOutput"  />
+        <el-table-column label="鎿嶄綔" align="center" width="200" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="handleEditRecord(scope.row)"
+            >缂栬緫</el-button>
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              style="color: #F56C6C;"
+              @click="handleDeleteRecord(scope.row)"
+            >鍒犻櫎</el-button>
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-view"
+              @click="handleViewRecord(scope.row)"
+            >璇︽儏</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 鍒嗛〉缁勪欢 -->
+      <pagination
+        v-show="recordTotal > 0"
+        :total="recordTotal"
+        :page.sync="recordQueryParams.pageNum"
+        :limit.sync="recordQueryParams.pageSize"
+        @pagination="getRecordList"
+      />
+    </el-card>
+
+    <!-- 鍩瑰吇璁板綍缂栬緫瀵硅瘽妗� -->
+    <el-dialog
+      :title="cultureDialogTitle"
+      :visible.sync="cultureDialogVisible"
+      width="700px"
+      :close-on-click-modal="false"
+    >
+      <el-form :model="cultureForm" ref="cultureForm" :rules="cultureRules" label-width="120px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鍩瑰吇绫诲瀷" prop="cultureType">
+              <el-select v-model="cultureForm.cultureType" placeholder="璇烽�夋嫨鍩瑰吇绫诲瀷" style="width: 100%">
+                <el-option
+                  v-for="item in cultureTypeOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="閲囨牱鏃堕棿" prop="sampleTime">
+              <el-date-picker
+                v-model="cultureForm.sampleTime"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                placeholder="閫夋嫨閲囨牱鏃堕棿"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鍩瑰吇缁撴灉" prop="result">
+              <el-select v-model="cultureForm.result" placeholder="璇烽�夋嫨鍩瑰吇缁撴灉" style="width: 100%">
+                <el-option label="闃存��" value="闃存��" />
+                <el-option label="闃虫��" value="闃虫��" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鑿岀" prop="bacteria">
+              <el-input v-model="cultureForm.bacteria" placeholder="璇疯緭鍏ユ娴嬪埌鐨勮弻绉�" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item label="鑽晱缁撴灉" prop="drugSensitivity">
+          <el-input
+            type="textarea"
+            :rows="3"
+            v-model="cultureForm.drugSensitivity"
+            placeholder="璇疯緭鍏ヨ嵂鏁忚瘯楠岀粨鏋�"
+          />
+        </el-form-item>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="妫�娴嬫満鏋�" prop="testingInstitution">
+              <el-input v-model="cultureForm.testingInstitution" placeholder="璇疯緭鍏ユ娴嬫満鏋�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏍囨湰绫诲瀷" prop="specimenType">
+              <el-input v-model="cultureForm.specimenType" placeholder="璇疯緭鍏ユ爣鏈被鍨�" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item label="澶囨敞" prop="remarks">
+          <el-input
+            type="textarea"
+            :rows="2"
+            v-model="cultureForm.remarks"
+            placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+          />
+        </el-form-item>
+      </el-form>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="cultureDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="handleSaveCulture" :loading="cultureSaveLoading">淇濆瓨</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 鎶ょ悊鏍告煡璁板綍缂栬緫瀵硅瘽妗� -->
+    <el-dialog
+      :title="recordDialogTitle"
+      :visible.sync="recordDialogVisible"
+      width="800px"
+      :close-on-click-modal="false"
+    >
+      <el-form :model="recordForm" ref="recordForm" :rules="recordRules" label-width="120px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鏍告煡鏃堕棿" prop="recordTime">
+              <el-date-picker
+                v-model="recordForm.recordTime"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                placeholder="閫夋嫨鏍告煡鏃堕棿"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏍告煡浜�" prop="recorder">
+              <el-input v-model="recordForm.recorder" placeholder="璇疯緭鍏ユ牳鏌ヤ汉濮撳悕" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="浣撴俯(鈩�)" prop="temperature">
+              <el-input-number
+                v-model="recordForm.temperature"
+                :min="30" :max="45" :step="0.1"
+                controls-position="right"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="蹇冪巼(娆�/鍒�)" prop="heartRate">
+              <el-input-number
+                v-model="recordForm.heartRate"
+                :min="0" :max="200"
+                controls-position="right"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鍛煎惛(娆�/鍒�)" prop="respirationRate">
+              <el-input-number
+                v-model="recordForm.respirationRate"
+                :min="0" :max="60"
+                controls-position="right"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="琛�鍘�(mmHg)" prop="bloodPressure">
+              <el-input v-model="recordForm.bloodPressure" placeholder="鏍煎紡锛氭敹缂╁帇/鑸掑紶鍘�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="琛�姘чケ鍜屽害(%)" prop="oxygenSaturation">
+              <el-input-number
+                v-model="recordForm.oxygenSaturation"
+                :min="0" :max="100"
+                controls-position="right"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="灏块噺(ml/h)" prop="urineOutput">
+              <el-input-number
+                v-model="recordForm.urineOutput"
+                :min="0" :max="1000"
+                controls-position="right"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="涓績闈欒剦鍘�" prop="cvp">
+              <el-input-number
+                v-model="recordForm.cvp"
+                :min="0" :max="20" :step="0.1"
+                controls-position="right"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item label="澶囨敞" prop="remarks">
+          <el-input
+            type="textarea"
+            :rows="3"
+            v-model="recordForm.remarks"
+            placeholder="璇疯緭鍏ユ牳鏌ュ娉ㄤ俊鎭�"
+          />
+        </el-form-item>
+      </el-form>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="recordDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="handleSaveRecord" :loading="recordSaveLoading">淇濆瓨</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getMaintenanceDetail, updateMaintenance } from "./mockMaintenanceApi";
+import { listCultureResults, addCultureResult, updateCultureResult, deleteCultureResult } from "./mockMaintenanceApi";
+import { listNursingRecords, addNursingRecord, updateNursingRecord, deleteNursingRecord } from "./mockMaintenanceApi";
+import Pagination from "@/components/Pagination";
+
+export default {
+ name: "MaintenanceDetail",
+  components: { Pagination },
+  data() {
+    return {
+      isEdit: false,
+      form: {
+        id: undefined,
+        caseNo: '',
+        donorName: '',
+        gender: '',
+        age: '',
+        diagnosis: '',
+        hospitalName: '',
+        patientStatus: '1',
+        admissionTime: '',
+        dischargeTime: '',
+        coordinator: '',
+        bloodType: '',
+        rhFactor: '',
+        specialMedicalHistory: '',
+        incompleteReason: ''
+      },
+
+      // 鍩瑰吇缁撴灉鐩稿叧鏁版嵁
+      cultureList: [],
+      cultureLoading: false,
+      cultureTotal: 0,
+      cultureQueryParams: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      cultureDialogVisible: false,
+      cultureDialogTitle: '',
+      cultureSaveLoading: false,
+      cultureForm: {
+        id: undefined,
+        cultureType: '',
+        sampleTime: '',
+        result: '闃存��',
+        bacteria: '',
+        drugSensitivity: '',
+        testingInstitution: '',
+        specimenType: '',
+        remarks: ''
+      },
+      cultureRules: {
+        cultureType: [{ required: true, message: '璇烽�夋嫨鍩瑰吇绫诲瀷', trigger: 'change' }],
+        sampleTime: [{ required: true, message: '璇烽�夋嫨閲囨牱鏃堕棿', trigger: 'change' }],
+        result: [{ required: true, message: '璇烽�夋嫨鍩瑰吇缁撴灉', trigger: 'change' }]
+      },
+      cultureTypeOptions: [
+        { value: '1', label: '琛�鍩瑰吇' },
+        { value: '2', label: '鐥板煿鍏�' },
+        { value: '3', label: '灏垮煿鍏�' },
+        { value: '4', label: '浼ゅ彛鍒嗘硨鐗�' },
+        { value: '5', label: '鑴戣剨娑插煿鍏�' },
+        { value: '6', label: '鍏朵粬' }
+      ],
+
+      // 鎶ょ悊鏍告煡璁板綍鐩稿叧鏁版嵁
+      recordList: [],
+      recordLoading: false,
+      recordTotal: 0,
+      recordQueryParams: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      recordDialogVisible: false,
+      recordDialogTitle: '',
+      recordSaveLoading: false,
+      recordForm: {
+        id: undefined,
+        recordTime: '',
+        recorder: '',
+        temperature: 36.5,
+        heartRate: 80,
+        bloodPressure: '120/80',
+        respirationRate: 18,
+        oxygenSaturation: 98,
+        urineOutput: 50,
+        cvp: 8,
+        remarks: ''
+      },
+      recordRules: {
+        recordTime: [{ required: true, message: '璇烽�夋嫨鏍告煡鏃堕棿', trigger: 'change' }],
+        recorder: [{ required: true, message: '璇疯緭鍏ユ牳鏌ヤ汉', trigger: 'blur' }],
+        temperature: [{ required: true, message: '璇疯緭鍏ヤ綋娓�', trigger: 'blur' }]
+      }
+    };
+  },
+ created() {
+    const id = this.$route.query.id;
+    this.isEdit = this.$route.query.edit === 'true';
+    if (id) {
+      this.getDetail(id);
+      this.getCultureList();
+      this.getRecordList();
+    }
+  },
+  methods: {
+     // 鑾峰彇璇︽儏
+    getDetail(id) {
+      getMaintenanceDetail(id).then(response => {
+        if (response.code === 200) {
+          this.form = response.data;
+        }
+      });
+    },
+
+    // 鍩瑰吇璁板綍鐩稿叧鏂规硶
+    getCultureList() {
+      this.cultureLoading = true;
+      listCultureResults(this.form.id, this.cultureQueryParams).then(response => {
+        if (response.code === 200) {
+          this.cultureList = response.data.rows;
+          this.cultureTotal = response.data.total;
+        }
+        this.cultureLoading = false;
+      }).catch(() => {
+        this.cultureLoading = false;
+      });
+    },
+
+    handleAddCulture() {
+      this.cultureDialogTitle = '鏂板鍩瑰吇璁板綍';
+      this.cultureForm = {
+        id: undefined,
+        cultureType: '',
+        sampleTime: '',
+        result: '闃存��',
+        bacteria: '',
+        drugSensitivity: '',
+        testingInstitution: '',
+        specimenType: '',
+        remarks: ''
+      };
+      this.cultureDialogVisible = true;
+      this.$nextTick(() => {
+        this.$refs.cultureForm && this.$refs.cultureForm.clearValidate();
+      });
+    },
+
+    handleEditCulture(row) {
+      this.cultureDialogTitle = '缂栬緫鍩瑰吇璁板綍';
+      this.cultureForm = { ...row };
+      this.cultureDialogVisible = true;
+      this.$nextTick(() => {
+        this.$refs.cultureForm && this.$refs.cultureForm.clearValidate();
+      });
+    },
+
+    handleViewCulture(row) {
+      this.$alert(`
+        <div>
+          <p><strong>鍩瑰吇绫诲瀷锛�</strong>${this.getCultureTypeLabel(row.cultureType)}</p>
+          <p><strong>閲囨牱鏃堕棿锛�</strong>${row.sampleTime}</p>
+          <p><strong>鍩瑰吇缁撴灉锛�</strong>${row.result}</p>
+          <p><strong>鑿岀锛�</strong>${row.bacteria || '鏃�'}</p>
+          <p><strong>鑽晱缁撴灉锛�</strong>${row.drugSensitivity || '鏃�'}</p>
+          <p><strong>妫�娴嬫満鏋勶細</strong>${row.testingInstitution}</p>
+        </div>
+      `, '鍩瑰吇璁板綍璇︽儏', {
+        dangerouslyUseHTMLString: true,
+        customClass: 'detail-dialog'
+      });
+    },
+
+    handleSaveCulture() {
+      this.$refs.cultureForm.validate(valid => {
+        if (valid) {
+          this.cultureSaveLoading = true;
+          const api = this.cultureForm.id ? updateCultureResult : addCultureResult;
+          const requestData = {
+            ...this.cultureForm,
+            maintenanceId: this.form.id
+          };
+
+          api(requestData).then(response => {
+            if (response.code === 200) {
+              this.$message.success(this.cultureForm.id ? '淇敼鎴愬姛' : '鏂板鎴愬姛');
+              this.cultureDialogVisible = false;
+              this.getCultureList();
+            }
+            this.cultureSaveLoading = false;
+          }).catch(() => {
+            this.cultureSaveLoading = false;
+          });
+        }
+      });
+    },
+
+    handleDeleteCulture(row) {
+      this.$confirm('纭畾瑕佸垹闄よ繖鏉″煿鍏昏褰曞悧锛�', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteCultureResult(row.id).then(response => {
+          if (response.code === 200) {
+            this.$message.success('鍒犻櫎鎴愬姛');
+            this.getCultureList();
+          }
+        });
+      }).catch(() => {});
+    },
+
+    getCultureTypeLabel(value) {
+      const type = this.cultureTypeOptions.find(item => item.value === value);
+      return type ? type.label : '鏈煡';
+    },
+
+    // 鎶ょ悊鏍告煡璁板綍鐩稿叧鏂规硶
+    getRecordList() {
+      this.recordLoading = true;
+      listNursingRecords(this.form.id, this.recordQueryParams).then(response => {
+        if (response.code === 200) {
+          this.recordList = response.data.rows;
+          this.recordTotal = response.data.total;
+        }
+        this.recordLoading = false;
+      }).catch(() => {
+        this.recordLoading = false;
+      });
+    },
+
+    handleAddRecord() {
+      this.recordDialogTitle = '鏂板鎶ょ悊鏍告煡璁板綍';
+      this.recordForm = {
+        id: undefined,
+        recordTime: new Date().toISOString().replace('T', ' ').substring(0, 19),
+        recorder: '褰撳墠鐢ㄦ埛', // 瀹為檯椤圭洰涓粠鐢ㄦ埛淇℃伅鑾峰彇
+        temperature: 36.5,
+        heartRate: 80,
+        bloodPressure: '120/80',
+        respirationRate: 18,
+        oxygenSaturation: 98,
+        urineOutput: 50,
+        cvp: 8,
+        remarks: ''
+      };
+      this.recordDialogVisible = true;
+      this.$nextTick(() => {
+        this.$refs.recordForm && this.$refs.recordForm.clearValidate();
+      });
+    },
+
+    handleEditRecord(row) {
+      this.recordDialogTitle = '缂栬緫鎶ょ悊鏍告煡璁板綍';
+      this.recordForm = { ...row };
+      this.recordDialogVisible = true;
+      this.$nextTick(() => {
+        this.$refs.recordForm && this.$refs.recordForm.clearValidate();
+      });
+    },
+
+    handleViewRecord(row) {
+      this.$alert(`
+        <div>
+          <p><strong>鏍告煡鏃堕棿锛�</strong>${row.recordTime}</p>
+          <p><strong>鏍告煡浜猴細</strong>${row.recorder}</p>
+          <p><strong>鐢熷懡浣撳緛锛�</strong></p>
+          <ul>
+            <li>浣撴俯锛�${row.temperature}鈩�</li>
+            <li>蹇冪巼锛�${row.heartRate}娆�/鍒�</li>
+            <li>琛�鍘嬶細${row.bloodPressure}mmHg</li>
+            <li>鍛煎惛锛�${row.respirationRate}娆�/鍒�</li>
+            <li>琛�姘чケ鍜屽害锛�${row.oxygenSaturation}%</li>
+            <li>灏块噺锛�${row.urineOutput}ml/h</li>
+          </ul>
+          <p><strong>澶囨敞锛�</strong>${row.remarks || '鏃�'}</p>
+        </div>
+      `, '鎶ょ悊鏍告煡璁板綍璇︽儏', {
+        dangerouslyUseHTMLString: true,
+        customClass: 'detail-dialog'
+      });
+    },
+
+    handleSaveRecord() {
+      this.$refs.recordForm.validate(valid => {
+        if (valid) {
+          this.recordSaveLoading = true;
+          const api = this.recordForm.id ? updateNursingRecord : addNursingRecord;
+          const requestData = {
+            ...this.recordForm,
+            maintenanceId: this.form.id
+          };
+
+          api(requestData).then(response => {
+            if (response.code === 200) {
+              this.$message.success(this.recordForm.id ? '淇敼鎴愬姛' : '鏂板鎴愬姛');
+              this.recordDialogVisible = false;
+              this.getRecordList();
+            }
+            this.recordSaveLoading = false;
+          }).catch(() => {
+            this.recordSaveLoading = false;
+          });
+        }
+      });
+    },
+
+    handleDeleteRecord(row) {
+      this.$confirm('纭畾瑕佸垹闄よ繖鏉℃姢鐞嗘牳鏌ヨ褰曞悧锛�', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteNursingRecord(row.id).then(response => {
+          if (response.code === 200) {
+            this.$message.success('鍒犻櫎鎴愬姛');
+            this.getRecordList();
+          }
+        });
+      }).catch(() => {});
+    },
+
+    // 淇濆瓨鍩烘湰淇℃伅
+    handleSave() {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          updateMaintenance(this.form).then(response => {
+            if (response.code === 200) {
+              this.$message.success("淇濆瓨鎴愬姛");
+              this.isEdit = false;
+            }
+          });
+        }
+      });
+    }
+  }
+};
+</script>
+
+<style scoped>
+.maintenance-detail {
+  padding: 20px;
+}
+
+.detail-card {
+  margin-bottom: 20px;
+}
+
+.culture-card {
+  margin-bottom: 20px;
+}
+
+.record-card {
+  margin-bottom: 20px;
+}
+
+.detail-title {
+  font-size: 16px;
+  font-weight: bold;
+}
+.maintenance-detail {
+  padding: 20px;
+}
+
+.detail-card {
+  margin-bottom: 20px;
+}
+
+.culture-card {
+  margin-bottom: 20px;
+}
+
+.record-card {
+  margin-bottom: 20px;
+}
+
+.detail-title {
+  font-size: 16px;
+  font-weight: bold;
+}
+
+.fixed-width .el-button {
+  margin: 0 2px;
+}
+
+/* 璇︽儏瀵硅瘽妗嗘牱寮� */
+:deep(.detail-dialog) {
+  width: 500px;
+}
+
+:deep(.detail-dialog .el-message-box__content) {
+  line-height: 1.8;
+}
+
+:deep(.detail-dialog ul) {
+  margin: 10px 0;
+  padding-left: 20px;
+}
+
+:deep(.detail-dialog li) {
+  margin-bottom: 5px;
+}
+</style>
diff --git a/src/views/business/maintain/mockMaintenanceApi.js b/src/views/business/maintain/mockMaintenanceApi.js
new file mode 100644
index 0000000..7a4f8e3
--- /dev/null
+++ b/src/views/business/maintain/mockMaintenanceApi.js
@@ -0,0 +1,575 @@
+// 妯℃嫙渚涜�呯淮鎶PI
+const maintenanceData = {
+  rows: [
+    {
+      id: 1,
+      maintenanceId: 'WH202312001',
+      caseNo: 'QJ202312001',
+      donorName: '寮犳煇鏌�',
+      gender: '0',
+      age: '45',
+      diagnosis: '閲嶅瀷棰呰剳鎹熶激',
+      hospitalName: '鍖椾含甯傜涓�浜烘皯鍖婚櫌',
+      patientStatus: '1',
+      admissionTime: '2023-12-01 08:00:00',
+      dischargeTime: '',
+      coordinator: '鍗忚皟鍛楢',
+      latestCultureResult: '闃存��',
+      lastRecordTime: '2023-12-03 14:30:00',
+      bloodType: 'A',
+      rhFactor: 'positive',
+      specialMedicalHistory: '鏃犵壒娈婄梾鍙�',
+      incompleteReason: ''
+    },
+    {
+      id: 2,
+      maintenanceId: 'WH202312002',
+      caseNo: 'QJ202312002',
+      donorName: '鏉庢煇鏌�',
+      gender: '1',
+      age: '32',
+      diagnosis: '鑴戝嚭琛�',
+      hospitalName: '涓婃捣甯備腑蹇冨尰闄�',
+      patientStatus: '2',
+      admissionTime: '2023-11-28 10:30:00',
+      dischargeTime: '',
+      coordinator: '鍗忚皟鍛楤',
+      latestCultureResult: '闃虫��',
+      lastRecordTime: '2023-12-03 16:20:00',
+      bloodType: 'B',
+      rhFactor: 'positive',
+      specialMedicalHistory: '楂樿鍘嬬梾鍙�5骞�',
+      incompleteReason: ''
+    },
+    {
+      id: 3,
+      maintenanceId: 'WH202312003',
+      caseNo: 'QJ202312003',
+      donorName: '鐜嬫煇鏌�',
+      gender: '0',
+      age: '58',
+      diagnosis: '蹇冭剰楠ゅ仠鍚庤剳鎹熶激',
+      hospitalName: '骞垮窞甯備汉姘戝尰闄�',
+      patientStatus: '4',
+      admissionTime: '2023-11-25 09:15:00',
+      dischargeTime: '2023-12-02 14:00:00',
+      coordinator: '鍗忚皟鍛楥',
+      latestCultureResult: '闃存��',
+      lastRecordTime: '2023-12-02 10:00:00',
+      bloodType: 'O',
+      rhFactor: 'negative',
+      specialMedicalHistory: '绯栧翱鐥呭彶10骞�',
+      incompleteReason: ''
+    },
+    {
+      id: 4,
+      maintenanceId: 'WH202312004',
+      caseNo: 'QJ202312004',
+      donorName: '璧垫煇鏌�',
+      gender: '1',
+      age: '29',
+      diagnosis: '浜ら�氫簨鏁呴鑴戞崯浼�',
+      hospitalName: '娣卞湷甯備腑蹇冨尰闄�',
+      patientStatus: '5',
+      admissionTime: '2023-12-01 15:45:00',
+      dischargeTime: '2023-12-04 11:20:00',
+      coordinator: '鍗忚皟鍛楧',
+      latestCultureResult: '闃存��',
+      lastRecordTime: '2023-12-03 09:15:00',
+      bloodType: 'AB',
+      rhFactor: 'positive',
+      specialMedicalHistory: '鏃�',
+      incompleteReason: '瀹跺睘涓存椂鏀瑰彉鍐冲畾'
+    }
+  ],
+  total: 4
+};
+
+// 鎶ょ悊鏍告煡璁板綍鏁版嵁
+const nursingRecordsData = {
+  rows: [
+    {
+      id: 1,
+      maintenanceId: 'WH202312001',
+      recordTime: '2023-12-03 08:00:00',
+      recorder: '寮犳姢澹�',
+      temperature: '36.5',
+      heartRate: '78',
+      bloodPressure: '120/80',
+      respirationRate: '18',
+      oxygenSaturation: '98',
+      urineOutput: '50',
+      consciousness: '娓呴啋',
+      pupilLeft: '2.5mm',
+      pupilRight: '2.5mm',
+      lightReflexLeft: '鐏垫晱',
+      lightReflexRight: '鐏垫晱',
+      ventilatorMode: 'SIMV',
+      fio2: '40%',
+      peep: '5cmH2O',
+      cvp: '8mmHg',
+      bloodSugar: '5.6',
+      remarks: '鐢熷懡浣撳緛骞崇ǔ'
+    },
+    {
+      id: 2,
+      maintenanceId: 'WH202312001',
+      recordTime: '2023-12-03 12:00:00',
+      recorder: '鏉庢姢澹�',
+      temperature: '36.8',
+      heartRate: '82',
+      bloodPressure: '118/76',
+      respirationRate: '16',
+      oxygenSaturation: '99',
+      urineOutput: '45',
+      consciousness: '娓呴啋',
+      pupilLeft: '2.5mm',
+      pupilRight: '2.5mm',
+      lightReflexLeft: '鐏垫晱',
+      lightReflexRight: '鐏垫晱',
+      ventilatorMode: 'SIMV',
+      fio2: '40%',
+      peep: '5cmH2O',
+      cvp: '9mmHg',
+      bloodSugar: '5.8',
+      remarks: '鎯呭喌绋冲畾'
+    }
+  ],
+  total: 2
+};
+
+// 鍩瑰吇缁撴灉鏁版嵁
+const cultureResultsData = {
+  rows: [
+    {
+      id: 1,
+      maintenanceId: 'WH202312001',
+      cultureType: '1',
+      sampleTime: '2023-12-01 10:00:00',
+      result: '闃存��',
+      bacteria: '',
+      drugSensitivity: '',
+      testingInstitution: '妫�楠岀',
+      specimenType: '琛�娑�',
+      collectionMethod: '闈欒剦閲囪'
+    },
+    {
+      id: 2,
+      maintenanceId: 'WH202312001',
+      cultureType: '2',
+      sampleTime: '2023-12-02 14:30:00',
+      result: '闃虫��',
+      bacteria: '鑲虹値鍏嬮浄浼弻',
+      drugSensitivity: '瀵瑰ご瀛㈢被鏁忔劅锛屽闈掗湁绱犺�愯嵂',
+      testingInstitution: '寰敓鐗╁',
+      specimenType: '鐥版恫',
+      collectionMethod: '娣遍儴鍜崇棸'
+    },
+    {
+      id: 3,
+      maintenanceId: 'WH202312002',
+      cultureType: '1',
+      sampleTime: '2023-12-03 09:15:00',
+      result: '闃虫��',
+      bacteria: '閲戦粍鑹茶憽钀勭悆鑿�',
+      drugSensitivity: '瀵逛竾鍙ら湁绱犳晱鎰�',
+      testingInstitution: '妫�楠岀',
+      specimenType: '琛�娑�',
+      collectionMethod: '涓績闈欒剦閲囪'
+    }
+  ],
+  total: 3
+};
+
+// 鑾峰彇渚涜�呯淮鎶ゅ垪琛�
+export function listMaintenance(params) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const { pageNum = 1, pageSize = 10, donorName, hospitalName, patientStatus, medicalStaff } = params;
+
+      // 娣辨嫹璐濇暟鎹伩鍏嶆薄鏌�
+      let filteredData = JSON.parse(JSON.stringify(maintenanceData.rows));
+
+      // 妯℃嫙绛涢�夐�昏緫
+      if (donorName) {
+        filteredData = filteredData.filter(item =>
+          item.donorName && item.donorName.includes(donorName)
+        );
+      }
+
+      if (hospitalName) {
+        filteredData = filteredData.filter(item =>
+          item.hospitalName && item.hospitalName.includes(hospitalName)
+        );
+      }
+
+      if (patientStatus) {
+        filteredData = filteredData.filter(item => item.patientStatus === patientStatus);
+      }
+
+      if (medicalStaff) {
+        filteredData = filteredData.filter(item =>
+          item.coordinator && item.coordinator.includes(medicalStaff)
+        );
+      }
+
+      // 鍒嗛〉澶勭悊
+      const start = (pageNum - 1) * pageSize;
+      const end = start + pageSize;
+      const pageData = filteredData.slice(start, end);
+
+      resolve({
+        code: 200,
+        data: {
+          rows: pageData,
+          total: filteredData.length,
+          pageNum: parseInt(pageNum),
+          pageSize: parseInt(pageSize)
+        },
+        message: '鑾峰彇鎴愬姛'
+      });
+    }, 500);
+  });
+}
+
+// 鑾峰彇渚涜�呯淮鎶よ鎯�
+export function getMaintenanceDetail(id) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const detail = maintenanceData.rows.find(item => item.id == id);
+      if (detail) {
+        resolve({
+          code: 200,
+          data: detail,
+          message: '鑾峰彇鎴愬姛'
+        });
+      } else {
+        resolve({
+          code: 404,
+          data: null,
+          message: '鏁版嵁涓嶅瓨鍦�'
+        });
+      }
+    }, 300);
+  });
+}
+
+// 鏇存柊渚涜�呯淮鎶や俊鎭�
+export function updateMaintenance(data) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const index = maintenanceData.rows.findIndex(item => item.id === data.id);
+      if (index !== -1) {
+        maintenanceData.rows[index] = { ...maintenanceData.rows[index], ...data };
+        resolve({
+          code: 200,
+          message: '鏇存柊鎴愬姛',
+          data: maintenanceData.rows[index]
+        });
+      } else {
+        resolve({
+          code: 404,
+          message: '鏁版嵁涓嶅瓨鍦�',
+          data: null
+        });
+      }
+    }, 300);
+  });
+}
+
+// 鍒犻櫎渚涜�呯淮鎶�
+export function delMaintenance(ids) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const originalLength = maintenanceData.rows.length;
+      maintenanceData.rows = maintenanceData.rows.filter(
+        item => !ids.includes(item.id)
+      );
+      maintenanceData.total = maintenanceData.rows.length;
+
+      if (maintenanceData.rows.length < originalLength) {
+        resolve({
+          code: 200,
+          message: '鍒犻櫎鎴愬姛',
+          data: { deletedCount: originalLength - maintenanceData.rows.length }
+        });
+      } else {
+        resolve({
+          code: 404,
+          message: '鏈壘鍒拌鍒犻櫎鐨勬暟鎹�',
+          data: null
+        });
+      }
+    }, 300);
+  });
+}
+
+
+
+
+
+
+
+// 瀵煎嚭渚涜�呯淮鎶ゆ暟鎹�
+export function exportMaintenance(params) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      // 妯℃嫙瀵煎嚭鏁版嵁澶勭悊
+      const exportData = maintenanceData.rows.map(item => ({
+        '妗堜緥缂栧彿': item.caseNo,
+        '鎹愮尞鑰呭鍚�': item.donorName,
+        '鎬у埆': item.gender === '0' ? '鐢�' : '濂�',
+        '骞撮緞': item.age,
+        '鐤剧梾璇婃柇': item.diagnosis,
+        '鍖荤枟鏈烘瀯': item.hospitalName,
+        '鎮h�呯姸鎬�': getPatientStatusText(item.patientStatus),
+        '鍏ラ櫌鏃堕棿': item.admissionTime,
+        '鍑洪櫌鏃堕棿': item.dischargeTime || '',
+        '鏈�鏂板煿鍏荤粨鏋�': item.latestCultureResult,
+        '鍗忚皟鍛�': item.coordinator
+      }));
+
+      resolve({
+        code: 200,
+        data: {
+          downloadUrl: '/download/maintenance_export.xlsx',
+          fileName: `渚涜�呯淮鎶ゆ暟鎹甠${new Date().toISOString().split('T')[0]}.xlsx`,
+          recordCount: exportData.length
+        },
+        message: '瀵煎嚭鎴愬姛'
+      });
+    }, 1000);
+  });
+}
+
+// 宸ュ叿鍑芥暟
+function getPatientStatusText(status) {
+  const statusMap = {
+    '1': 'DCD',
+    '2': 'DBD',
+    '3': 'DBCD',
+    '4': '宸插畬鎴愭崘鐚�',
+    '5': '鏈畬鎴愭崘鐚�'
+  };
+  return statusMap[status] || '鏈煡';
+}
+
+// 鎵归噺鎿嶄綔
+export function batchUpdateMaintenance(updateData) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const { ids, updateFields } = updateData;
+      let successCount = 0;
+
+      maintenanceData.rows.forEach(item => {
+        if (ids.includes(item.id)) {
+          Object.assign(item, updateFields);
+          successCount++;
+        }
+      });
+
+      resolve({
+        code: 200,
+        data: { successCount, totalCount: ids.length },
+        message: `鎴愬姛鏇存柊${successCount}鏉¤褰昤
+      });
+    }, 500);
+  });
+}
+// 鍩瑰吇缁撴灉鐩稿叧API
+export function listCultureResults(maintenanceId, params = {}) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const { pageNum = 1, pageSize = 10 } = params;
+
+      let filteredData = cultureResultsData.rows.filter(item =>
+        item.maintenanceId === maintenanceId
+      );
+
+      // 鎸夐噰鏍锋椂闂村�掑簭鎺掑垪
+      filteredData.sort((a, b) => new Date(b.sampleTime) - new Date(a.sampleTime));
+
+      const start = (pageNum - 1) * pageSize;
+      const end = start + pageSize;
+      const pageData = filteredData.slice(start, end);
+
+      resolve({
+        code: 200,
+        data: {
+          rows: pageData,
+          total: filteredData.length,
+          pageNum: parseInt(pageNum),
+          pageSize: parseInt(pageSize)
+        },
+        message: '鑾峰彇鎴愬姛'
+      });
+    }, 300);
+  });
+}
+
+export function addCultureResult(cultureData) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const newCulture = {
+        id: Date.now(),
+        ...cultureData,
+        createTime: new Date().toISOString()
+      };
+
+      cultureResultsData.rows.unshift(newCulture);
+      cultureResultsData.total = cultureResultsData.rows.length;
+
+      resolve({
+        code: 200,
+        data: newCulture,
+        message: '鏂板鎴愬姛'
+      });
+    }, 300);
+  });
+}
+
+export function updateCultureResult(cultureData) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const index = cultureResultsData.rows.findIndex(item => item.id === cultureData.id);
+      if (index !== -1) {
+        cultureResultsData.rows[index] = {
+          ...cultureResultsData.rows[index],
+          ...cultureData,
+          updateTime: new Date().toISOString()
+        };
+        resolve({
+          code: 200,
+          data: cultureResultsData.rows[index],
+          message: '鏇存柊鎴愬姛'
+        });
+      } else {
+        resolve({
+          code: 404,
+          data: null,
+          message: '鏁版嵁涓嶅瓨鍦�'
+        });
+      }
+    }, 300);
+  });
+}
+
+export function deleteCultureResult(id) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const index = cultureResultsData.rows.findIndex(item => item.id === id);
+      if (index !== -1) {
+        cultureResultsData.rows.splice(index, 1);
+        cultureResultsData.total = cultureResultsData.rows.length;
+        resolve({
+          code: 200,
+          message: '鍒犻櫎鎴愬姛'
+        });
+      } else {
+        resolve({
+          code: 404,
+          message: '鏁版嵁涓嶅瓨鍦�'
+        });
+      }
+    }, 300);
+  });
+}
+
+// 鎶ょ悊鏍告煡璁板綍鐩稿叧API
+export function listNursingRecords(maintenanceId, params = {}) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const { pageNum = 1, pageSize = 10 } = params;
+
+      let filteredData = nursingRecordsData.rows.filter(item =>
+        item.maintenanceId === maintenanceId
+      );
+
+      // 鎸夎褰曟椂闂村�掑簭鎺掑垪
+      filteredData.sort((a, b) => new Date(b.recordTime) - new Date(a.recordTime));
+
+      const start = (pageNum - 1) * pageSize;
+      const end = start + pageSize;
+      const pageData = filteredData.slice(start, end);
+
+      resolve({
+        code: 200,
+        data: {
+          rows: pageData,
+          total: filteredData.length,
+          pageNum: parseInt(pageNum),
+          pageSize: parseInt(pageSize)
+        },
+        message: '鑾峰彇鎴愬姛'
+      });
+    }, 300);
+  });
+}
+
+export function addNursingRecord(recordData) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const newRecord = {
+        id: Date.now(),
+        ...recordData,
+        createTime: new Date().toISOString()
+      };
+
+      nursingRecordsData.rows.unshift(newRecord);
+      nursingRecordsData.total = nursingRecordsData.rows.length;
+
+      resolve({
+        code: 200,
+        data: newRecord,
+        message: '鏂板鎴愬姛'
+      });
+    }, 300);
+  });
+}
+
+export function updateNursingRecord(recordData) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const index = nursingRecordsData.rows.findIndex(item => item.id === recordData.id);
+      if (index !== -1) {
+        nursingRecordsData.rows[index] = {
+          ...nursingRecordsData.rows[index],
+          ...recordData,
+          updateTime: new Date().toISOString()
+        };
+        resolve({
+          code: 200,
+          data: nursingRecordsData.rows[index],
+          message: '鏇存柊鎴愬姛'
+        });
+      } else {
+        resolve({
+          code: 404,
+          data: null,
+          message: '鏁版嵁涓嶅瓨鍦�'
+        });
+      }
+    }, 300);
+  });
+}
+
+export function deleteNursingRecord(id) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      const index = nursingRecordsData.rows.findIndex(item => item.id === id);
+      if (index !== -1) {
+        nursingRecordsData.rows.splice(index, 1);
+        nursingRecordsData.total = nursingRecordsData.rows.length;
+        resolve({
+          code: 200,
+          message: '鍒犻櫎鎴愬姛'
+        });
+      } else {
+        resolve({
+          code: 404,
+          message: '鏁版嵁涓嶅瓨鍦�'
+        });
+      }
+    }, 300);
+  });
+}
diff --git a/src/views/login.vue b/src/views/login.vue
index aac1184..3b6c14a 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -6,7 +6,7 @@
       :rules="loginRules"
       class="login-form"
     >
-      <h3 class="title">娴欐睙鐪丱PO鏁板瓧鍖栫鐞嗗钩鍙�</h3>
+      <h3 class="title">闈掑矝澶у闄勫睘鍖婚櫌opo</h3>
       <el-form-item prop="username">
         <el-input
           v-model="loginForm.username"
diff --git a/src/views/project/indexstatistics/index.vue b/src/views/project/indexstatistics/index.vue
index fc284ba..5f24a80 100644
--- a/src/views/project/indexstatistics/index.vue
+++ b/src/views/project/indexstatistics/index.vue
@@ -1,40 +1,38 @@
 <template>
-  <div class="app-container" style="background-color: #f2f2f2; color: #fff">
-    <el-card shadow="always" style="color: #566f94">
-      <el-row :gutter="8">
-        <el-col :span="8">
+  <div class="app-container">
+    <!-- 绛涢�夋潯浠跺崱鐗� -->
+    <el-card class="filter-card">
+      <el-row :gutter="16">
+        <el-col :xs="24" :sm="8" :md="6">
           <el-date-picker
             v-model="selecttime"
             type="monthrange"
             range-separator="鑷�"
-            start-placeholder="寮�濮嬫湀浠斤紙榛樿鏈勾搴︼級"
+            start-placeholder="寮�濮嬫湀浠�"
             end-placeholder="缁撴潫鏈堜唤"
+            style="width: 100%"
             value-format="yyyy-MM-dd"
             @change="getTimeList"
-            style="width: 100%"
-          >
-          </el-date-picker>
+          />
         </el-col>
-        <el-col :span="6">
+        <el-col :xs="24" :sm="8" :md="6">
           <el-select
-            style="width: 100%"
             v-model="reportervalue"
             placeholder="璇烽�夋嫨鎶ュ憡浜�"
+            style="width: 100%"
           >
             <el-option
               v-for="item in reportlist"
               :key="item.index"
               :label="item.reportername"
               :value="item.reporterno"
-            >
-            </el-option>
+            />
           </el-select>
         </el-col>
-        <el-col :span="6">
+        <el-col :xs="24" :sm="8" :md="6">
           <el-select
             v-model="city"
             placeholder="璇烽�夋嫨鎵�灞炲湴甯�"
-            @change="getprovincedata"
             style="width: 100%"
           >
             <el-option
@@ -42,581 +40,382 @@
               :key="item.value"
               :label="item.label"
               :value="item.value"
-            >
-            </el-option>
+            />
           </el-select>
         </el-col>
-        <el-col :span="2">
-          <el-button
-            type="primary"
-            @click="selectdatas"
-            icon="el-icon-search"
-            style="margin-left: 10px"
-            >鎼滅储</el-button
-          >
+        <el-col :xs="24" :sm="24" :md="6">
+          <div class="action-buttons">
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              @click="selectdatas"
+            >
+              鎼滅储
+            </el-button>
+            <el-button icon="el-icon-refresh" @click="resetFilters">
+              閲嶇疆
+            </el-button>
+          </div>
         </el-col>
       </el-row>
     </el-card>
-    <div style="display: flex;">
-      <div style="width: 76%;">
-        <el-row
-          :gutter="10"
-          style="font-size: 18px; font-weight: bold;  margin-top: 10px"
-        >
-          <el-col :span="6">
-            <router-link
-              :to="{
-                name: 'Donatebaseinfo',
-                params: {
-                  starttime: starttime,
-                  endtime: endtime,
-                  tempRecordState: '',
-                  reporterno: reportervalue,
-                  shen: searchAddress.shen,
-                  shi: searchAddress.shi,
-                  qu: searchAddress.qu,
-                  city: city
-                }
-              }"
-            >
-              <!-- params: {
-              tempRecordState: 0,
-            }, -->
-              <!-- @click="tobaseinfo0" -->
-              <el-card shadow="always" style="color: #566f94">
-                <svg-icon icon-class="user" />&nbsp;&nbsp; 娼滃湪鎹愮尞绱锛歿{
-                  donateNumData.numberOfDonate
-                }}&nbsp; 渚�
-              </el-card>
-            </router-link>
-          </el-col>
-          <el-col :span="6">
-            <router-link
-              :to="{
-                name: 'Medicalevaluation',
-                params: {
-                  starttime: starttime,
-                  endtime: endtime,
-                  tempRecordState: '',
-                  reporterno: reportervalue,
-                  shen: searchAddress.shen,
-                  shi: searchAddress.shi,
-                  qu: searchAddress.qu,
-                  city: city
-                }
-              }"
-            >
-              <el-card
-                shadow="always"
-                style="color: #566f94"
-                @click="Tomedicalevalua"
-              >
-                <svg-icon icon-class="tool" />&nbsp;&nbsp; 瀹屾垚鍖诲璇勪及绱锛歿{
-                  donateNumData.numberOfMedicalEvaluation
-                }}&nbsp; 渚�
-              </el-card>
-            </router-link>
-          </el-col>
-          <el-col :span="6">
-            <router-link
-              :to="{
-                name: 'Relativesconfirmation',
-                params: {
-                  starttime: starttime,
-                  endtime: endtime,
-                  tempRecordState: '',
-                  reporterno: reportervalue,
-                  shen: searchAddress.shen,
-                  shi: searchAddress.shi,
-                  qu: searchAddress.qu,
-                  city: city
-                }
-              }"
-            >
-              <el-card shadow="always" style="color: #566f94">
-                <svg-icon icon-class="checkbox" />&nbsp;&nbsp;
-                瀹屾垚浜插睘纭绱锛歿{
-                  donateNumData.numberOfRelativeConfirmation
-                }}&nbsp; 渚�
-              </el-card>
-            </router-link>
-          </el-col>
-          <el-col :span="6">
-            <router-link
-              :to="{
-                name: 'EthicalReview',
-                params: {
-                  starttime: starttime,
-                  endtime: endtime,
-                  tempRecordState: '',
-                  reporterno: reportervalue,
-                  shen: searchAddress.shen,
-                  shi: searchAddress.shi,
-                  qu: searchAddress.qu,
-                  city: city
-                }
-              }"
-            >
-              <el-card shadow="always" style="color: #566f94">
-                <svg-icon icon-class="education" />&nbsp;&nbsp;
-                瀹屾垚浼︾悊瀹℃煡绱锛歿{
-                  donateNumData.numberOfEthicalReview
-                }}&nbsp; 渚�
-              </el-card>
-            </router-link>
-          </el-col>
-        </el-row>
-        <el-row
-          :gutter="10"
-          style="margin-top: 10px; font-size: 18px;  font-weight: bold"
-        >
-          <el-col :span="6">
-            <el-card shadow="always" style="color: #566f94">
-              <svg-icon icon-class="druid" />&nbsp;&nbsp; 瀹屾垚鍣ㄥ畼鍒嗛厤绱锛歿{
-                donateNumData.numberOfDonatePeople
-              }}&nbsp; 涓�
-              <!-- donateNumData.numberOfOrgans -->
+
+    <!-- 鏁版嵁姒傝鍖哄煙 -->
+    <el-card class="overview-card">
+      <template #header>
+        <div class="card-header">
+          <span class="header-title">鏁版嵁姒傝</span>
+          <span class="header-subtitle">瀹炴椂缁熻鎸囨爣</span>
+        </div>
+      </template>
+
+      <el-row :gutter="16">
+        <!-- 绗竴琛岀粺璁″崱鐗� -->
+        <el-col :xs="12" :sm="6" :md="3">
+          <router-link
+            :to="{
+              name: 'Donatebaseinfo',
+              params: { ...routeParams }
+            }"
+            class="stat-card-link"
+          >
+            <el-card class="stat-card" shadow="hover">
+              <div class="stat-content">
+                <div class="stat-icon" style="background-color: #409EFF;">
+                  <svg-icon icon-class="user" />
+                </div>
+                <div class="stat-info">
+                  <div class="stat-value">
+                    {{ donateNumData.numberOfDonate }}
+                  </div>
+                  <div class="stat-title">涓婃姤妗堜緥绱</div>
+                </div>
+              </div>
             </el-card>
-          </el-col>
-          <el-col :span="6">
-            <router-link
-              :to="{
-                name: 'Donationwitness',
-                params: {
-                  starttime: starttime,
-                  endtime: endtime,
-                  tempRecordState: '',
-                  reporterno: reportervalue,
-                  shen: searchAddress.shen,
-                  shi: searchAddress.shi,
-                  qu: searchAddress.qu,
-                  city: city
-                }
-              }"
-            >
-              <el-card shadow="always" style="color: #566f94">
-                <svg-icon icon-class="job" />&nbsp;&nbsp; 瀹屾垚鑾峰彇瑙佽瘉绱锛歿{
-                  donateNumData.numberOfWitness
-                }}&nbsp; 渚�
-              </el-card>
-            </router-link>
-          </el-col>
-          <el-col :span="6">
-            <router-link
-              :to="{
-                name: 'Donatefinish',
-                params: {
-                  starttime: starttime,
-                  endtime: endtime,
-                  tempRecordState: '',
-                  reporterno: reportervalue,
-                  shen: searchAddress.shen,
-                  shi: searchAddress.shi,
-                  qu: searchAddress.qu,
-                  city: city
-                }
-              }"
-            >
-              <el-card shadow="always" style="color: #566f94">
-                <svg-icon icon-class="lock" />&nbsp;&nbsp; 鎹愮尞瀹屾垚绱锛歿{
-                  donateNumData.numberOfCompletion
-                }}&nbsp; 渚�
-              </el-card>
-            </router-link>
-          </el-col>
-          <el-col :span="6">
-            <router-link
-              @click.native="closeBaseInfoTab"
-              :to="{
-                name: 'Donatebaseinfo',
-                params: {
-                  starttime: starttime,
-                  endtime: endtime,
-                  terminationcase: 1,
-                  reporterno: reportervalue,
-                  shen: searchAddress.shen,
-                  shi: searchAddress.shi,
-                  qu: searchAddress.qu,
-                  city: city
-                }
-              }"
-            >
-              <el-card shadow="always" style="color: #566f94">
-                <svg-icon icon-class="lock" />&nbsp;&nbsp; 鎹愮尞缁堟绱锛歿{
-                  donateNumData.numberOfTerminated
-                }}&nbsp; 渚�
-              </el-card>
-            </router-link>
-          </el-col>
-        </el-row>
-        <el-row style="margin-top: 10px; " :gutter="5">
-          <el-col :span="12">
-            <el-card
-              shadow="always"
-              style="padding: 0; font-weight: bold; height: 640px"
-              ref="statisticsCard"
-            >
-              <el-row style="margin-bottom: 20px">
-                <span style="font-size: 18px; color: #566f94; font-weight: bold"
-                  >鎸囨爣鏁版嵁鍒嗘瀽</span
+          </router-link>
+        </el-col>
+
+        <el-col :xs="12" :sm="6" :md="3">
+          <router-link
+            :to="{
+              name: 'Medicalevaluation',
+              params: { ...routeParams }
+            }"
+            class="stat-card-link"
+          >
+            <el-card class="stat-card" shadow="hover">
+              <div class="stat-content">
+                <div class="stat-icon" style="background-color: #67C23A;">
+                  <svg-icon icon-class="tool" />
+                </div>
+                <div class="stat-info">
+                  <div class="stat-value">
+                    {{ donateNumData.numberOfMedicalEvaluation }}
+                  </div>
+                  <div class="stat-title">鎹愮尞妗堜緥绱</div>
+                </div>
+              </div>
+            </el-card>
+          </router-link>
+        </el-col>
+
+        <el-col :xs="12" :sm="6" :md="3">
+          <router-link
+            :to="{
+              name: 'Relativesconfirmation',
+              params: { ...routeParams }
+            }"
+            class="stat-card-link"
+          >
+            <el-card class="stat-card" shadow="hover">
+              <div class="stat-content">
+                <div class="stat-icon" style="background-color: #E6A23C;">
+                  <svg-icon icon-class="checkbox" />
+                </div>
+                <div class="stat-info">
+                  <div class="stat-value">
+                    {{ donateNumData.numberOfRelativeConfirmation }}
+                  </div>
+                  <div class="stat-title">渚涗綋杞繍绱</div>
+                </div>
+              </div>
+            </el-card>
+          </router-link>
+        </el-col>
+
+        <el-col :xs="12" :sm="6" :md="3">
+          <router-link
+            :to="{
+              name: 'EthicalReview',
+              params: { ...routeParams }
+            }"
+            class="stat-card-link"
+          >
+            <el-card class="stat-card" shadow="hover">
+              <div class="stat-content">
+                <div class="stat-icon" style="background-color: #F56C6C;">
+                  <svg-icon icon-class="education" />
+                </div>
+                <div class="stat-info">
+                  <div class="stat-value">
+                    {{ donateNumData.numberOfEthicalReview }}
+                  </div>
+                  <div class="stat-title">浜插睘纭绱</div>
+                </div>
+              </div>
+            </el-card>
+          </router-link>
+        </el-col>
+
+        <!-- 绗簩琛岀粺璁″崱鐗� -->
+        <el-col :xs="12" :sm="6" :md="3">
+          <el-card class="stat-card" shadow="hover">
+            <div class="stat-content">
+              <div class="stat-icon" style="background-color: #909399;">
+                <svg-icon icon-class="druid" />
+              </div>
+              <div class="stat-info">
+                <div class="stat-value">
+                  {{ donateNumData.numberOfDonatePeople }}
+                </div>
+                <div class="stat-title">瀹屾垚浼︾悊瀹℃煡绱</div>
+              </div>
+            </div>
+          </el-card>
+        </el-col>
+
+        <el-col :xs="12" :sm="6" :md="3">
+          <router-link
+            :to="{
+              name: 'Donationwitness',
+              params: { ...routeParams }
+            }"
+            class="stat-card-link"
+          >
+            <el-card class="stat-card" shadow="hover">
+              <div class="stat-content">
+                <div class="stat-icon" style="background-color: #B37FEB;">
+                  <svg-icon icon-class="job" />
+                </div>
+                <div class="stat-info">
+                  <div class="stat-value">
+                    {{ donateNumData.numberOfWitness }}
+                  </div>
+                  <div class="stat-title">瀹屾垚鍣ㄥ畼鍒嗛厤绱</div>
+                </div>
+              </div>
+            </el-card>
+          </router-link>
+        </el-col>
+
+        <el-col :xs="12" :sm="6" :md="3">
+          <router-link
+            :to="{
+              name: 'Donatefinish',
+              params: { ...routeParams }
+            }"
+            class="stat-card-link"
+          >
+            <el-card class="stat-card" shadow="hover">
+              <div class="stat-content">
+                <div class="stat-icon" style="background-color: #FF85C0;">
+                  <svg-icon icon-class="lock" />
+                </div>
+                <div class="stat-info">
+                  <div class="stat-value">
+                    {{ donateNumData.numberOfCompletion }}
+                  </div>
+                  <div class="stat-title">瀹屾垚鑾峰彇绱</div>
+                </div>
+              </div>
+            </el-card>
+          </router-link>
+        </el-col>
+
+        <el-col :xs="12" :sm="6" :md="3">
+          <router-link
+            :to="{
+              name: 'Donatebaseinfo',
+              params: { ...routeParams, terminationcase: 1 }
+            }"
+            class="stat-card-link"
+          >
+            <el-card class="stat-card" shadow="hover">
+              <div class="stat-content">
+                <div class="stat-icon" style="background-color: #5DC8EF;">
+                  <svg-icon icon-class="lock" />
+                </div>
+                <div class="stat-info">
+                  <div class="stat-value">
+                    {{ donateNumData.numberOfTerminated }}
+                  </div>
+                  <div class="stat-title">鎹愮尞缁堟绱</div>
+                </div>
+              </div>
+            </el-card>
+          </router-link>
+        </el-col>
+      </el-row>
+    </el-card>
+
+    <!-- 鎸囨爣鍒嗘瀽鍖哄煙 -->
+    <el-row :gutter="16" class="analysis-section">
+      <el-col :xs="24" :lg="12">
+        <el-card class="chart-card">
+          <template #header>
+            <div class="card-header">
+              <span>鎸囨爣鏁版嵁鍒嗘瀽</span>
+              <router-link
+                :to="{
+                  name: 'DonationProcess',
+                  params: { ...routeParams, terminationcase: 1 }
+                }"
+              >
+                <el-button type="primary" size="small" round
+                  >鎹愮尞杩涚▼</el-button
                 >
-                <span style="margin-left: 30px;">
-                  <router-link
-                    :to="{
-                      name: 'DonationProcess',
-                      params: {
-                        starttime: starttime,
-                        endtime: endtime,
-                        terminationcase: 1,
-                        reporterno: reportervalue,
-                        shen: searchAddress.shen,
-                        shi: searchAddress.shi,
-                        qu: searchAddress.qu,
-                        city: city
-                      }
-                    }"
-                  >
-                    <el-button type="primary" round>鎹愮尞杩涚▼</el-button>
-                  </router-link>
-                </span>
-              </el-row>
-              <el-row :gutter="3">
-                <el-col :span="8" style="text-align: center">
-                  <el-card
-                    shadow="always"
-                    style="padding: 0; margin: 0; width: 100%; color: #566f94"
-                  >
-                    鍣ㄥ畼鎹愮尞杞寲鐜�<br />
-                    {{ (qualirtData.donateTransferRate * 100).toFixed(2) }}%
-                  </el-card>
-                </el-col>
-                <el-col :span="8" style="text-align: center">
-                  <el-card
-                    shadow="always"
-                    style="padding: 0; margin: 0; width: 100%; color: #566f94"
-                  >
-                    骞冲潎鍣ㄥ畼浜у嚭鐜�<br />
-                    {{ (qualirtData.organProductionRate * 100).toFixed(2) }}%
-                  </el-card>
-                </el-col>
-                <el-col :span="8" style="text-align: center">
-                  <el-card
-                    shadow="always"
-                    style="padding: 0; margin: 0; width: 100%; color: #566f94"
-                  >
-                    鑾峰彇鍣ㄥ畼鍒╃敤鐜�<br />
-                    {{ (qualirtData.organUsedRate * 100).toFixed(2) }}%
-                  </el-card>
-                </el-col>
-              </el-row>
-              <el-row :gutter="3" style="margin-top: 5px">
-                <el-col :span="24" style="text-align: center">
-                  <el-card shadow="always" style="padding: 0; color: #566f94">
-                    <el-row> 鍣ㄥ畼鎹愮尞鍒嗙被鍗犳瘮 </el-row>
-                    <el-row :gutter="10" style="margin-top: 10px">
-                      <el-col :span="8" style="text-align: center"
-                        >DBD:
-                        {{ (qualirtData.dbddonateRate * 100).toFixed(2) }}%
-                      </el-col>
-                      <el-col :span="8" style="text-align: center">
-                        DCD:
-                        {{ (qualirtData.dcddonateRate * 100).toFixed(2) }}%
-                      </el-col>
-                      <el-col :span="8" style="text-align: center">
-                        DBCD:
-                        {{ (qualirtData.dbcddonateRate * 100).toFixed(2) }}%
-                      </el-col>
-                    </el-row>
-                  </el-card>
-                </el-col>
-              </el-row>
-              <el-row :gutter="3" style="margin-top: 5px">
-                <el-col :span="12" style="text-align: center; color: #566f94">
-                  <el-card
-                    shadow="always"
-                    style="padding: 0; margin: 0; width: 100%; color: #566f94"
-                  >
-                    <el-row>
-                      <span style="font-size: 14px"> 鑾峰彇鍓嶆椿妫�鐜�</span>
-                    </el-row>
-                    {{
-                      (qualirtData.organBeforeGetCheckRate * 100).toFixed(2)
-                    }}%
-                  </el-card>
-                </el-col>
-                <el-col :span="12" style="text-align: center">
-                  <el-card
-                    shadow="always"
-                    style="padding: 0; margin: 0; width: 100%; color: #566f94"
-                  >
-                    <el-row>
-                      <span style="font-size: 14px">鑾峰彇鍚庢椿妫�鐜�</span>
-                    </el-row>
-                    {{ (qualirtData.organAfterGetCheckRate * 100).toFixed(2) }}%
-                  </el-card>
-                </el-col>
-              </el-row>
-              <el-row :gutter="3" style="margin-top: 5px">
-                <el-col :span="12" style="text-align: center">
-                  <el-card
-                    shadow="always"
-                    style="padding: 0; margin: 0; width: 100%; color: #566f94"
-                  >
-                    <span style="font-size: 14px">杈圭紭渚涘櫒瀹樻瘮鐜�</span><br />
-                    {{ (qualirtData.marginOrganRate * 100).toFixed(2) }}%
-                  </el-card>
-                </el-col>
-                <el-col :span="12" style="text-align: center">
-                  <el-card
-                    shadow="always"
-                    style="padding: 0; margin: 0; width: 100%; color: #566f94"
-                  >
-                    <span style="font-size: 14px"
-                      >鍣ㄥ畼淇濆瓨娑茬梾鍘熻弻鍩瑰吇闃虫�х巼</span
-                    ><br />
-                    {{ (qualirtData.germPositiveRate * 100).toFixed(2) }}%
-                  </el-card>
-                </el-col>
-              </el-row>
-              <el-row :gutter="3" style="margin-top: 5px">
-                <el-col :span="24" style="text-align: center">
-                  <el-card shadow="always" style="padding: 0; color: #566f94">
-                    <el-row> 绉绘鍣ㄥ畼鍘熷彂鎬ф棤鍔熻兘鍙戠敓鐜� </el-row>
-                    <el-row :gutter="10" style="margin-top: 10px">
-                      <el-row>
-                        <el-col :span="6" style="text-align: center">
-                          鎬诲彂鐢熺巼<br />
-                          {{ (qualirtData.totalPNFRate * 100).toFixed(2) }}%
-                        </el-col>
-                        <el-col :span="6" style="text-align: center">
-                          DBD<br />
-                          {{ (qualirtData.dbdpnfrate * 100).toFixed(2) }}%
-                        </el-col>
-                        <el-col :span="6" style="text-align: center">
-                          DCD<br />
-                          {{ (qualirtData.dcdpnfrate * 100).toFixed(2) }}%
-                        </el-col>
-                        <el-col :span="6" style="text-align: center">
-                          DBCD<br />
-                          {{ (qualirtData.dbcdpnfrate * 100).toFixed(2) }}%
-                        </el-col>
-                      </el-row>
-                    </el-row>
-                  </el-card>
-                </el-col>
-              </el-row>
-              <el-row :gutter="3" style="margin-top: 5px">
-                <el-col :span="24" style="text-align: center">
-                  <el-card shadow="always" style="padding: 0; color: #566f94">
-                    <el-row> 绉绘鍣ㄥ畼鏈悗鍔熻兘寤惰繜鎬ф仮澶嶅彂鐢熺巼 </el-row>
-                    <el-row :gutter="10" style="margin-top: 10px">
-                      <el-row>
-                        <el-col :span="6" style="text-align: center">
-                          鎬诲彂鐢熺巼<br />{{
-                            (qualirtData.totalDGFRate * 100).toFixed(2)
-                          }}%
-                        </el-col>
-                        <el-col :span="6" style="text-align: center">
-                          DBD<br />{{
-                            (qualirtData.dbddgfrate * 100).toFixed(2)
-                          }}%
-                        </el-col>
-                        <el-col :span="6" style="text-align: center">
-                          DCD<br />{{
-                            (qualirtData.dcddgfrate * 100).toFixed(2)
-                          }}%
-                        </el-col>
-                        <el-col :span="6" style="text-align: center">
-                          DBCD<br />{{
-                            (qualirtData.dbcddgfrate * 100).toFixed(2)
-                          }}%
-                        </el-col>
-                      </el-row>
-                    </el-row>
-                  </el-card>
-                </el-col>
-              </el-row>
-            </el-card>
-          </el-col>
-          <el-col :span="12">
-            <el-card shadow="always" style="height: 640px" ref="organChartCard">
-              <OrganNumChart :cdata="organData" :CommonOrgan="CommonOrgan" />
-            </el-card>
-            <!-- <el-col :span="7">
-        <el-card shadow="always" style="height: 640px" ref="orgNumberCard">
-          <el-row style="margin-bottom: 20px">
-            <el-col :span="14">
-              <span style="font-size: 18px; color: #566f94; font-weight: bold"
-                >鍚勫湴鍖哄尰闄㈡渚嬫暟鎹�</span
-              >
-            </el-col>
-
-          </el-row>
-          <el-row>
-
-          </el-row>
-          <dv-scroll-board
-            :config="config"
-            style="width: 100%; height: 540px"
-          />
-        </el-card>
-      </el-col> -->
-          </el-col>
-        </el-row>
-      </div>
-      <div style="width: 24%; margin-top: 10px; padding-left: 10px; ">
-        <el-card
-          class="box-card"
-          style="padding: 0; font-weight: bold; height: 780px; "
-        >
-          <div slot="header" class="clearfix">
-            <span style="font-size: 18px; color: #566f94; font-weight: bold"
-              >娑堟伅鍒楄〃</span
-            >
-            <el-button
-              v-if="ReadState == 1"
-              style="float: right; padding: 6px "
-              type="danger"
-              plain
-              @click="FnReadState"
-              >鏌ョ湅鏈娑堟伅</el-button
-            >
-            <el-button
-              v-else
-              style="float: right; padding: 6px "
-              type="info"
-              plain
-              @click="FnReadState"
-              >鏌ョ湅宸茶娑堟伅</el-button
-            >
-          </div>
-          <div style="height: 606px;overflow: auto;">
-            <el-table :data="tableData" v-loading="loading" style="width: 100%">
-              <el-table-column label="閫氱煡鏃ユ湡">
-                <template slot-scope="scope">
-                  <i class="el-icon-time"></i>
-                  <span style="margin-left: 10px">{{
-                    scope.row.createTime
-                  }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="姒傝">
-                <template slot-scope="scope">
-                  <el-popover trigger="hover" placement="top">
-                    <div class="dialog-class" style="margin: 20px;">
-                      <div>{{ scope.row.messagecontent }}</div>
-                      <div style=" height: 100px;margin-top: 40px;">
-                        <span>{{ "澶勭悊浜猴細" + scope.row.sendusername }}</span>
-                        <div>{{ "澶勭悊鏃堕棿锛�" + scope.row.updateTime }}</div>
-                      </div>
-                      <div style="text-align: right; ; margin: 0">
-                        <el-button
-                          type="primary"
-                          size="mini"
-                          @click="clickMessageDetailed(scope.row)"
-                          >纭畾</el-button
-                        >
-                      </div>
-                    </div>
-                    <div slot="reference" class="name-wrapper">
-                      <el-tag size="medium">{{
-                        scope.row.messagetitle
-                      }}</el-tag>
-                    </div>
-                  </el-popover>
-                </template>
-              </el-table-column>
-              <el-table-column label="鐘舵��" align="center" prop="paystatus">
-                <template slot-scope="scope">
-                  <dict-tag
-                    :options="dict.type.sys_messagestatus"
-                    :value="scope.row.isread"
-                  />
-                </template>
-              </el-table-column>
-            </el-table>
-          </div>
-
-          <pagination
-            v-show="total > 0"
-            :total="total"
-            :page.sync="searchData.pageNum"
-            :limit.sync="searchData.pageSize"
-            @pagination="GetMessageList"
-          />
-        </el-card>
+              </router-link>
+            </div>
+          </template>
+<div class="metrics-wrapper">
+  <div class="metrics-grid">
+    <div class="metric-item">
+      <div class="metric-title">鍣ㄥ畼鎹愮尞杞寲鐜�</div>
+      <div class="metric-value">
+        {{ (qualirtData.donateTransferRate * 100).toFixed(2) }}%
       </div>
     </div>
+
+    <div class="metric-item">
+      <div class="metric-title">骞冲潎鍣ㄥ畼浜у嚭鐜�</div>
+      <div class="metric-value">
+        {{ (qualirtData.organProductionRate * 100).toFixed(2) }}%
+      </div>
+    </div>
+
+    <div class="metric-item">
+      <div class="metric-title">鑾峰彇鍣ㄥ畼鍒╃敤鐜�</div>
+      <div class="metric-value">
+        {{ (qualirtData.organUsedRate * 100).toFixed(2) }}%
+      </div>
+    </div>
+
+    <div class="metric-item full-width">
+      <div class="metric-title">鍣ㄥ畼鎹愮尞鍒嗙被鍗犳瘮</div>
+      <div class="metric-breakdown">
+        <span
+          >DBD:
+          {{ (qualirtData.dbddonateRate * 100).toFixed(2) }}%</span
+        >
+        <span
+          >DCD:
+          {{ (qualirtData.dcddonateRate * 100).toFixed(2) }}%</span
+        >
+        <span
+          >DBCD:
+          {{ (qualirtData.dbcddonateRate * 100).toFixed(2) }}%</span
+        >
+      </div>
+    </div>
+
+    <div class="metric-item">
+      <div class="metric-title">鑾峰彇鍓嶆椿妫�鐜�</div>
+      <div class="metric-value">
+        {{ (qualirtData.organBeforeGetCheckRate * 100).toFixed(2) }}%
+      </div>
+    </div>
+
+    <div class="metric-item">
+      <div class="metric-title">鑾峰彇鍚庢椿妫�鐜�</div>
+      <div class="metric-value">
+        {{ (qualirtData.organAfterGetCheckRate * 100).toFixed(2) }}%
+      </div>
+    </div>
+
+    <div class="metric-item">
+      <div class="metric-title">杈圭紭渚涘櫒瀹樻瘮鐜�</div>
+      <div class="metric-value">
+        {{ (qualirtData.marginOrganRate * 100).toFixed(2) }}%
+      </div>
+    </div>
+
+    <div class="metric-item">
+      <div class="metric-title">鍣ㄥ畼淇濆瓨娑茬梾鍘熻弻鍩瑰吇闃虫�х巼</div>
+      <div class="metric-value">
+        {{ (qualirtData.germPositiveRate * 100).toFixed(2) }}%
+      </div>
+    </div>
+
+    <div class="metric-item full-width">
+      <div class="metric-title">绉绘鍣ㄥ畼鍘熷彂鎬ф棤鍔熻兘鍙戠敓鐜�</div>
+      <div class="metric-breakdown">
+        <span
+          >鎬�: {{ (qualirtData.totalPNFRate * 100).toFixed(2) }}%</span
+        >
+        <span
+          >DBD: {{ (qualirtData.dbdpnfrate * 100).toFixed(2) }}%</span
+        >
+        <span
+          >DCD: {{ (qualirtData.dcdpnfrate * 100).toFixed(2) }}%</span
+        >
+        <span
+          >DBCD: {{ (qualirtData.dbcdpnfrate * 100).toFixed(2) }}%</span
+        >
+      </div>
+    </div>
+
+    <div class="metric-item full-width">
+      <div class="metric-title">绉绘鍣ㄥ畼鏈悗鍔熻兘寤惰繜鎬ф仮澶嶅彂鐢熺巼</div>
+      <div class="metric-breakdown">
+        <span
+          >鎬�: {{ (qualirtData.totalDGFRate * 100).toFixed(2) }}%</span
+        >
+        <span
+          >DBD: {{ (qualirtData.dbddgfrate * 100).toFixed(2) }}%</span
+        >
+        <span
+          >DCD: {{ (qualirtData.dcddgfrate * 100).toFixed(2) }}%</span
+        >
+        <span
+          >DBCD: {{ (qualirtData.dbcddgfrate * 100).toFixed(2) }}%</span
+        >
+      </div>
+    </div>
+  </div>
+</div>
+        </el-card>
+      </el-col>
+
+      <el-col :xs="24" :lg="12">
+        <el-card class="chart-card">
+          <template #header>
+            <div class="card-header">
+              <span>鍣ㄥ畼鏁伴噺缁熻</span>
+            </div>
+          </template>
+          <OrganNumChart :cdata="organData" :CommonOrgan="CommonOrgan" />
+        </el-card>
+      </el-col>
+    </el-row>
   </div>
 </template>
 
 <script>
-import {
-  listMedicalevaluation,
-  listnewMedicalevaluation, //閫氳繃VO鑾峰彇
-  getMedicalevaluation,
-  delMedicalevaluation,
-  addMedicalevaluation,
-  updateMedicalevaluation,
-  exportMedicalevaluation
-} from "@/api/project/medicalevaluation";
-import {
-  listRelativesconfirmation,
-  getRelativesconfirmation,
-  delRelativesconfirmation,
-  addRelativesconfirmation,
-  updateRelativesconfirmation,
-  listnewRelativesconfirmation,
-  // exportRelativesconfirmation,
-  updatedonatorno,
-  updateDonateNumber,
-  downloadconfirmationinfo
-} from "@/api/project/relativesconfirmation";
-import {
-  listEthicalreviewopinions,
-  getEthicalreviewopinions,
-  delEthicalreviewopinions,
-  addEthicalreviewopinions,
-  updateEthicalreviewopinions,
-  listnewEthicalreviewopinions
-} from "@/api/project/ethicalreviewopinions";
-import {
-  getByInfoId,
-  listDonationwitness,
-  getDonationwitness,
-  delDonationwitness,
-  addDonationwitness,
-  updateDonationwitness,
-  listnewDonationwitness,
-  downloadwitnessinfo
-} from "@/api/project/donationwitness";
-import {
-  getDonatecompletioninfo,
-  listnewDonatecompletioninfo,
-  addDonatecompletioninfo,
-  updateDonatecompletioninfo,
-  listDonatecompletioninfo,
-  downloadcompletioninfo
-} from "@/api/project/donatecompletioninfo";
-
-import { listOrganallocation } from "@/api/project/organallocation";
-
-import RankChart from "./components/rankbarchart";
-import request from '@/utils/request'
-import OrganNumChart from "./components/organnumchart";
-import { listDonatebaseinfo } from "@/api/project/donatebaseinfo";
-import dayjs from "dayjs";
-import {
-  getOrgansQuality,
-  getAllOrganInfo,
-  getDonateNumber,
-  getcountByRecordState,
-  getOrgansOfHospital,
-  getNumberOfOrgan,
-  getOrgansOfHospitalByMonth,
-  getDonateorganSum
-} from "@/api/project/donateorgan";
 import { getUserProfile } from "@/api/system/user";
+import { listDonatebaseinfo } from "@/api/project/donatebaseinfo";
+import { listnewMedicalevaluation } from "@/api/project/medicalevaluation";
+import { listnewRelativesconfirmation } from "@/api/project/relativesconfirmation";
+import { listnewEthicalreviewopinions } from "@/api/project/ethicalreviewopinions";
+import { listOrganallocation } from "@/api/project/organallocation";
+import { listnewDonationwitness } from "@/api/project/donationwitness";
+import { listnewDonatecompletioninfo } from "@/api/project/donatecompletioninfo";
+import {
+  getDonateorganSum,
+  getOrgansOfHospitalByMonth,
+  getOrgansQuality
+} from "@/api/project/donateorgan";
+import OrganNumChart from "./components/organnumchart";
+import dayjs from "dayjs";
 import {
   listSystemmessageList,
   listSystemmessageCount,
@@ -637,7 +436,6 @@
   name: "home",
   dicts: ["sys_messagestatus"],
   components: {
-    RankChart,
     OrganNumChart,
     Li_area_select
   },
@@ -645,13 +443,11 @@
   data() {
     return {
       city: "",
-      reportno: "",
+      reportervalue: "",
       selecttime: [new Date(new Date().getFullYear(), 0), new Date()],
-      year: "閫夋嫨骞翠唤",
-      isloading: false,
-      maxHeight: 0,
-      areaJson: "/project/dict/treeselect", // 鎻愬墠瀛樺偍鍦板潃鏁版嵁鎺ュ彛
-      CommonOrgan: null,
+      starttime: dayjs().format("YYYY-01-01 00:00:00"),
+      endtime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+
       provinceData: [
         { label: "鍏ㄩ儴鍦板競", value: "" },
         { label: "鏉窞甯�", value: "1" },
@@ -666,24 +462,8 @@
         { label: "鍙板窞甯�", value: "A" },
         { label: "涓芥按甯�", value: "B" }
       ],
-      ReadState: 1,
-      searchData: {
-        del_flag: 0,
-        receiveuserno: "",
-        isread: null,
-        pageNum: 1,
-        pageSize: 10
-      },
-      total: 0,
-      loading: false,
-      value: "",
-      userID: "",
-      //鏃堕棿閫夐」
-      timeoption: "",
-      //璧峰鏃堕棿
-      starttime: this.$moment().format("YYYY-01-01 00:00:00"),
-      //缁撴潫鏃堕棿
-      endtime: this.$moment().format("YYYY-MM-DD HH:mm:ss"),
+
+      reportlist: [],
 
       organData: [
         {
@@ -842,54 +622,42 @@
           address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1516 寮�"
         }
       ],
-      //缁熻鎸囨爣鏁版嵁
       qualirtData: {
         dbcddgfrate: 0,
-        //dbcd鎹愮尞鍒嗙被鍗犳瘮
         dbcddonateRate: 0,
         dbcdpnfrate: 0,
         dbddgfrate: 0,
-        //dbd鎹愮尞鍒嗙被鍗犳瘮
         dbddonateRate: 0,
         dbdpnfrate: 0,
         dcddgfrate: 0,
-        //dcd鎹愮尞鍒嗙被鍗犳瘮
-        dcddonateRate: 0,
         dcddonateRate: 0,
         dcdpnfrate: 0,
-        //鎹愮尞杞寲鐜�
         donateTransferRate: 0,
-        //鐥呭師鑿岄槼鎬х巼
         germPositiveRate: 0,
-        //杈圭紭鍣ㄥ畼姣旂巼
         marginOrganRate: 0,
         organAfterGetCheckRate: 0,
         organBeforeGetCheckRate: 0,
-        //鍣ㄥ畼浜у嚭鐜�
         organProductionRate: 0,
-        //鍣ㄥ畼鍒╃敤鐜�
         organUsedRate: 0,
         totalDGFRate: 0,
         totalPNFRate: 0
       },
-      //鎹愮尞绱鏁伴噺
+
       donateNumData: {
-        //鎹愮尞瀹屾垚鏁伴噺
         numberOfCompletion: 0,
-        //娼滃湪鎹愮尞鐧昏鏁伴噺
         numberOfDonate: 0,
-        //浼︾悊瀹℃煡鏁伴噺
         numberOfEthicalReview: 0,
-        //鍖诲璇勪及鏁伴噺
         numberOfMedicalEvaluation: 0,
-        //鍣ㄥ畼鍒嗛厤鏁伴噺
         numberOfOrgans: 0,
-        //瀹跺睘纭鏁伴噺
         numberOfRelativeConfirmation: 0,
-        //鑾峰彇瑙佽瘉鏁伴噺
         numberOfWitness: 0,
-        //缁堟鏁伴噺
-        numberOfTerminated: 0
+        numberOfTerminated: 0,
+        numberOfDonatePeople: 0
+      },
+
+      CommonOrgan: {
+        countSum: 1,
+        abandonCountSum: 0
       },
       config: {
         ...DEF_TABLE_CONFIG
@@ -912,361 +680,181 @@
     this.$nextTick(() => {
       this.GetDonateOrganNum();
       this.GetDonateOrganQuality();
-      //  this.GetDonateNum();
-      this.value = "鏉窞甯�";
       this.GetOrgDonateNumNew();
       this.GetOrgDonateNum();
-      this.getAddressData();
     });
   },
   methods: {
-    getprovincedata() {},
+    // 鑾峰彇鐢ㄦ埛淇℃伅
     GetUser() {
-      this.loading = true;
       getUserProfile()
         .then(res => {
-          this.searchData.receiveuserno = res.data.userName;
-          this.GetMessageList();
+          this.userInfo = res.data;
         })
         .catch(error => {
-          this.$message.error(error);
+          console.error("鑾峰彇鐢ㄦ埛淇℃伅澶辫触:", error);
         });
     },
-    GetMessageList() {
-      listSystemmessageList(this.searchData).then(res => {
-        if (res.code == 200) {
-          this.tableData = res.rows;
-          this.loading = false;
-          this.total = res.total;
-        }
-      });
-    },
-    // 鎻愬墠缂撳瓨鏁版嵁
-    getAddressData() {
-      var that = this;
-      request({
-        url: that.areaJson,
-        method: "get",
-      }).then(function (response) {
-        if (response.code === 200) {
-          //鑾峰彇鍦板潃
-          let addressArray = response.data;
-          this.$store.commit('updateMyData', addressArray);
-        }
-      });
-    },
-    // 纭畾宸茶
-    clickMessageDetailed(item) {
-      let data = item;
-      if (data.isread == 0) {
-        item.isread = 1;
-        updateSystemmessage(item)
-          .then(res => {
-            this.$message.success("宸茶");
-            this.GetMessageList();
-          })
-          .catch(error => {});
-      } else {
-        this.$message.info("姝ゆ秷鎭凡璇�");
-      }
-    },
-    // 鍒囨崲璇诲彇鐘舵��
-    FnReadState() {
-      if (this.ReadState == 1) {
-        this.searchData.isread = 0;
-        this.ReadState = 0;
-        this.GetMessageList();
-      } else {
-        this.searchData.isread = 1;
-        this.ReadState = 1;
-        this.GetMessageList();
-      }
-    },
-    get_unix_time(dateStr) {
-      var newstr = dateStr.replace(/-/g, "/");
-      var date = new Date(newstr);
-      var time_str = date.getTime().toString();
-      return time_str.substr(0, 10);
+
+    // 閲嶇疆绛涢�夋潯浠�
+    resetFilters() {
+      this.selecttime = [new Date(new Date().getFullYear(), 0), new Date()];
+      this.reportervalue = "";
+      this.city = "";
+      this.getTimeList();
+      this.selectdatas();
     },
 
-    resetArr(Arr) {
-      var hash = {};
-      Arr = Arr.reduce(function(arr, current) {
-        hash[current.reporterno]
-          ? ""
-          : (hash[current.reporterno] = true && arr.push(current));
-        return arr;
-      }, []);
-      return Arr;
+    // 鏃堕棿閫夋嫨澶勭悊
+    getTimeList(e) {
+      if (this.selecttime && this.selecttime.length === 2) {
+        this.starttime = this.selecttime[0] + " 00:00:00";
+        let endDate = new Date(this.selecttime[1]);
+        endDate.setMonth(endDate.getMonth() + 1);
+        endDate.setDate(0);
+        this.endtime = dayjs(endDate).format("YYYY-MM-DD 23:59:59");
+      } else {
+        this.starttime = dayjs().format("YYYY-01-01 00:00:00");
+        this.endtime = dayjs().format("YYYY-MM-DD HH:mm:ss");
+      }
     },
-    // tobaseinfo0(){
-    //   this.$router.push({path:'/Donatebaseinfo', query: {userid: 0 }})
-    // },
+
+    // 鎼滅储鏁版嵁
     selectdatas() {
       this.GetDonateOrganNum();
       this.GetDonateOrganQuality();
-      //  this.GetDonateNum();
       this.GetOrgDonateNumNew();
       this.GetOrgDonateNum();
     },
-    getTimeList(e) {
-      if (this.selecttime != 0) {
-        this.endtime = this.selecttime[1];
-        this.starttime = this.selecttime[0];
-        // if (this.endtime == this.starttime) {
-        let num = Number(this.endtime.slice(5, 7));
-        if (num < 9) {
-          let mon = Number(this.endtime.slice(6, 7));
 
-          this.endtime =
-            this.endtime.slice(0, 5) +
-            "0" +
-            (mon + 1) +
-            "-" +
-            "01" +
-            " " +
-            "00" +
-            ":" +
-            "00" +
-            ":" +
-            "00";
-        }
-        // this.endtime=this.endtime.slice(0,5)骞�
-        else if (num >= 10) {
-          this.endtime =
-            this.endtime.slice(0, 5) +
-            (num + 1) +
-            "-" +
-            "01" +
-            " " +
-            "00" +
-            ":" +
-            "00" +
-            ":" +
-            "00";
-        } else {
-          this.endtime =
-            this.endtime.slice(0, 5) +
-            "10" +
-            "-" +
-            "01" +
-            " " +
-            "00" +
-            ":" +
-            "00" +
-            ":" +
-            "00";
-        }
-        this.starttime = this.starttime + " " + "00" + ":" + "00" + ":" + "00";
-        // }
-      } else {
-        this.starttime = "1998-01-01 00:00:00";
-        this.endtime = "2998-01-01 00:00:00";
-      }
-    },
-    Tobaseinfo() {
-      this.$router.push("../../donatebaseinfo/index.vue");
-    },
-    Tomedicalevalua() {
-      this.$router.push("../../medicalevaluation/index.vue");
-    },
-    getyearvalue() {
-      console.log("year de  value:", this.year);
-    },
-    handlerInput(e) {
-      console.log("鍏ㄧ渷瀵艰褰撳墠鎵�閫夊勾浠斤細", e);
-    },
-    //鑾峰彇鍣ㄥ畼鎹愮尞鏁伴噺
+    // 鑾峰彇鍣ㄥ畼鏁伴噺缁熻
     GetDonateOrganNum() {
       let param = {
         starttime: this.starttime,
         endtime: this.endtime,
         city: this.city
-
-        // repoterno:'015'
       };
 
-      if (this.reportervalue != "") {
+      if (this.reportervalue) {
         param.reporterno = this.reportervalue;
       }
-      console.log(param, "param");
+
       getDonateorganSum(param).then(response => {
-        /*
-        let list = this.organData.map((item) => item);
-        for (let i = 0; i < list.length; i++) {
-          let k = list[i].key;
-        }
-        this.organData = list;
-      */
-        let list = response.data.organInfoVOList;
-        this.CommonOrgan = response.data;
-        for (let i = 0; i < this.organData.length; i++) {
-          let ii = list.findIndex(
-            item => item.organNo == this.organData[i].code
-          );
-          if (ii > -1) {
-            this.organData[i].value = list[ii].count;
-            this.organData[i].value1 = list[ii].abandonCount;
-          }
+        if (response.code === 200) {
+          // this.CommonOrgan = response.data || {
+          //   countSum: 1,
+          //   abandonCountSum: 0
+          // };
+          // let list = response.data.organInfoVOList || [];
+          // this.organData.forEach(item => {
+          //   const found = list.find(organ => organ.organNo === item.code);
+          //   if (found) {
+          //     item.value = found.count || 0;
+          //     item.value1 = found.abandonCount || 0;
+          //   }
+          // });
         }
       });
     },
-    //鑾峰彇鎸囨爣鐩戞帶鏁版嵁
+
+    // 鑾峰彇璐ㄩ噺鎸囨爣鏁版嵁
     GetDonateOrganQuality() {
-      let starttime = this.selecttime.length > 0 ? this.selecttime[0] : "";
-      let endtime =
-        this.selecttime.length > 0
-          ? this.$moment(this.selecttime[1])
-              .add(1, "month")
-              .add(-1, "days")
-              .format("YYYY-MM-DD")
-          : "";
-
       let param = {
         starttime: this.starttime,
         endtime: this.endtime,
         city: this.city
-        // repoterno:'015'
       };
+
       getOrgansQuality(param).then(response => {
-        if (response.code == 200) {
+        if (response.code === 200) {
           this.qualirtData = response.data;
-        } else {
-          console.log("鑾峰彇鎸囨爣鐩戞帶鏁版嵁澶辫触锛�");
         }
       });
     },
-    //鑾峰彇绱鎹愮尞淇℃伅鏁版嵁
-    GetDonateNum() {
-      let param = {
-        pageNum: 1,
-        pageSize: 10,
-        starttime: this.starttime,
-        endtime: this.endtime,
-        reportno: this.reportervalue,
-        city: this.city
-        // residenceprovince: this.$refs.areaSelect.getSheng(),
-        // residencecity: this.$refs.areaSelect.getShi(),
-        // residencetown: this.$refs.areaSelect.getQu(),
-      };
-      // getcountByRecordState(param).then(res=>{
-      //   console.log('dawdwadwadwad',res);
-      //    if (res.code == 200) {
-      //     this.donateNumData = res.data;
-      //     this.donateNumData.numberOfDonatePeople =
-      //       res.data.numberOfDonatePeople;
-      //     console.log("this.donateNumData", this.donateNumData);
-      //   } else {
-      //   }
-      // })
-      // getDonateNumber;
 
-      // getDonateNumber(param).then((response) => {
-      //   console.log("鑾峰彇绱鎹愮尞淇℃伅鏁版嵁", response.code, response.data);
-      //   if (response.code == 200) {
-      //     //鍏堟敞閿�鐨勬暟鎹�
-      //     // this.donateNumData = response.data;
-      //     this.donateNumData.numberOfDonate = response.data.numberOfDonate;
-
-      //     this.donateNumData.numberOfMedicalEvaluation=response.data.numberOfMedicalEvaluation;
-
-      //     this.donateNumData.numberOfRelativeConfirmation=response.data.numberOfRelativeConfirmation;
-
-      //     this.donateNumData.numberOfEthicalReview=response.data.numberOfEthicalReview;
-
-      //     this.donateNumData.numberOfWitness=response.data.numberOfWitness;
-
-      //     this.donateNumData.numberOfCompletion=response.data.numberOfCompletion;
-
-      //     this.donateNumData.numberOfTerminated =
-      //       response.data.numberOfTerminated;
-
-      //     this.donateNumData.numberOfDonatePeople =
-      //       response.data.numberOfDonatePeople;
-      //     console.log("this.donateNumData", this.donateNumData);
-      //   } else {
-      //   }
-      // });
-    },
+    // 鑾峰彇缁熻鏁版嵁
     GetOrgDonateNumNew() {
-      // let starttime = this.selecttime.length > 0 ? this.$moment(this.selecttime[0]).format("YYYY-MM-DD 00:00:01") : "";
-      // let endtime =
-      //   this.selecttime.length > 0
-      //     ? this.$moment(this.selecttime[1])
-      //         .add(1, "month")
-      //         .add(-1, "days")
-      //         .format("YYYY-MM-DD")
-      //     : "";
-
-      let info = {
+      const info = {
         starttime: this.starttime,
         endtime: this.endtime
-
-        // residenceprovince: this.$refs.areaSelect.getSheng(),
-        // residencecity: this.$refs.areaSelect.getShi(),
-        // residencetown: this.$refs.areaSelect.getQu(),
       };
-      if (this.reportervalue != "") {
+
+      if (this.reportervalue) {
         info.reporterno = this.reportervalue;
       }
-      if (this.city != "") {
+      if (this.city) {
         info.city = this.city;
       }
 
-      //娼滃湪鎹愮尞
-      listDonatebaseinfo(info).then(res => {
-        this.donateNumData.numberOfDonate = res.total;
-      });
+      // 骞惰鑾峰彇鎵�鏈夌粺璁℃暟鎹�
+      Promise.all([
+        listDonatebaseinfo(info).then(res => {
+          this.donateNumData.numberOfDonate = res.total || 0;
+        }),
 
-      //鍖诲璇勪及
-      listnewMedicalevaluation(info).then(res => {
-        this.donateNumData.numberOfMedicalEvaluation = res.total;
-      }),
-        //浜插睘纭
+        listnewMedicalevaluation(info).then(res => {
+          this.donateNumData.numberOfMedicalEvaluation = res.total || 0;
+        }),
+
         listnewRelativesconfirmation(info).then(res => {
-          this.donateNumData.numberOfRelativeConfirmation = res.total;
-        });
-      //浼︾悊瀹℃煡
-      listnewEthicalreviewopinions(info).then(res => {
-        this.donateNumData.numberOfEthicalReview = res.total;
-      }),
-        //鍣ㄥ畼鎹愮尞
+          this.donateNumData.numberOfRelativeConfirmation = res.total || 0;
+        }),
+
+        listnewEthicalreviewopinions(info).then(res => {
+          this.donateNumData.numberOfEthicalReview = res.total || 0;
+        }),
+
         listOrganallocation(info).then(res => {
-          this.donateNumData.numberOfDonatePeople = res.total;
-        });
+          this.donateNumData.numberOfDonatePeople = res.total || 0;
+        }),
 
-      //鑾峰彇瑙佽瘉
-      listnewDonationwitness(info).then(res => {
-        this.donateNumData.numberOfWitness = res.total;
-      });
+        listnewDonationwitness(info).then(res => {
+          this.donateNumData.numberOfWitness = res.total || 0;
+        }),
 
-      listnewDonatecompletioninfo(info).then(res => {
-        this.donateNumData.numberOfCompletion = res.total;
-      });
+        listnewDonatecompletioninfo(info).then(res => {
+          this.donateNumData.numberOfCompletion = res.total || 0;
+        }),
 
-      //缁堟
-      info.terminationCase = 1;
-      listDonatebaseinfo(info).then(res => {
-        this.donateNumData.numberOfTerminated = res.total;
-      });
-
-      listDonatebaseinfo({}).then(res => {
-        let list = res.rows;
-        let reportlist = [];
-        reportlist.push({ reporterno: "", reportername: "鍏ㄩ儴浜哄憳" });
-        list.forEach(element => {
-          reportlist.push({
-            reporterno: element.reporterno,
-            reportername: element.reportername
-          });
-        });
-
-        if (reportlist != 0) {
-          reportlist = this.resetArr(reportlist);
-          this.reportlist = reportlist;
-        }
+        listDonatebaseinfo({ ...info, terminationCase: 1 }).then(res => {
+          this.donateNumData.numberOfTerminated = res.total || 0;
+        })
+      ]).then(() => {
+        this.loadReportList();
       });
     },
+
+    // 鍔犺浇鎶ュ憡浜哄垪琛�
+    loadReportList() {
+      listDonatebaseinfo({}).then(res => {
+        let list = res.rows || [];
+        let reportlist = [{ reporterno: "", reportername: "鍏ㄩ儴浜哄憳" }];
+
+        list.forEach(element => {
+          if (element.reporterno && element.reportername) {
+            reportlist.push({
+              reporterno: element.reporterno,
+              reportername: element.reportername
+            });
+          }
+        });
+
+        this.reportlist = this.resetArr(reportlist);
+      });
+    },
+
+    // 鏁扮粍鍘婚噸
+    resetArr(Arr) {
+      const hash = {};
+      return Arr.reduce((arr, current) => {
+        if (!hash[current.reporterno]) {
+          hash[current.reporterno] = true;
+          arr.push(current);
+        }
+        return arr;
+      }, []);
+    },
+
     //鑾峰彇鍖婚櫌鏈烘瀯鎹愮尞鏁伴噺
     GetOrgDonateNum() {
       // let time1 =  new Date(this.starttime).getTime()
@@ -1343,83 +931,299 @@
       // this.$tab.closePage(obj);
     }
   },
-  computed: {},
+  computed: {
+    routeParams() {
+      return {
+        starttime: this.starttime,
+        endtime: this.endtime,
+        tempRecordState: "",
+        reporterno: this.reportervalue,
+        shen: this.searchAddress?.shen || "",
+        shi: this.searchAddress?.shi || "",
+        qu: this.searchAddress?.qu || "",
+        city: this.city
+      };
+    }
+  },
   watch: {}
 };
 </script>
 
 <style lang="scss" scoped>
-.c-home {
-  .box-title {
-    width: 100%;
-    span {
-      display: block;
-      width: 130px;
-      height: 25px;
-      -webkit-transform: skew(20deg);
-      -moz-transform: skew(20deg);
-      -o-transform: skew(20deg);
-      background: #0a459f;
-      line-height: 25px;
-      align-self: center;
-      border: 1px transparent solid;
-      border-image: linear-gradient(#070a17, #7be6fc) 10 10;
-      border-image: linear-gradient(#070a17, #7be6fc) 10 10;
-      border-image: linear-gradient(#070a17, #7be6fc) 10 10;
-      margin: 0 auto;
+.app-container {
+  padding: 20px;
+  background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+  min-height: 100vh;
+}
+
+.filter-card {
+  margin-bottom: 24px;
+  border-radius: 12px;
+  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
+  border: none;
+  background: rgba(255, 255, 255, 0.95);
+
+  :deep(.el-card__body) {
+    padding: 20px;
+  }
+}
+
+.overview-card {
+  margin-bottom: 24px;
+  border-radius: 12px;
+  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
+  border: none;
+  background: rgba(255, 255, 255, 0.95);
+
+  .card-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+
+    .header-title {
+      font-size: 18px;
+      font-weight: 600;
+      color: #303133;
     }
-    b {
-      display: block;
-      color: #fff;
-      text-align: center;
-      transform: skewY(-20deg);
-      transform: skewX(-20deg);
+
+    .header-subtitle {
+      font-size: 14px;
+      color: #909399;
     }
   }
-  .box-num {
-    position: relative;
-    .box-num-main {
-      text-align: right;
-      padding-right: 70px;
-      .box-num-main-n {
-        color: #409eff;
-        font-size: 25px;
+
+  :deep(.el-card__body) {
+    padding: 20px;
+  }
+}
+.metrics-wrapper {     // 宸︿晶鍐呭鍖哄煙鍥哄畾 320px锛屾孩鍑鸿嚜鍔ㄦ粴鍔�
+  height: 590px;       // 鍜屽彸渚у浘琛ㄩ粯璁ら珮涓�鏍凤紝涔熷彲浠ユ敼鎴� 350 / 400 鈥�
+  overflow-y: auto;
+  padding-right: 4px;  // 鐣欎竴鐐规粴鍔ㄦ潯浣嶇疆锛岄伩鍏嶆枃瀛楄创杈�
+}
+.chart-card {
+  border-radius: 12px;
+  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
+  border: none;
+  background: rgba(255, 255, 255, 0.95);
+  height: 100%;
+
+  .card-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+
+    span {
+      font-size: 16px;
+      font-weight: 600;
+      color: #303133;
+    }
+  }
+
+  :deep(.el-card__body) {
+    padding: 20px;
+  }
+}
+
+.stat-card-link {
+  text-decoration: none;
+  display: block;
+
+  &:hover {
+    text-decoration: none;
+  }
+}
+
+.stat-card {
+  border-radius: 8px;
+  transition: all 0.3s ease;
+  border: none;
+  margin-bottom: 16px;
+  background: linear-gradient(135deg, #fff 60%, #f8f9fa 100%);
+
+  &:hover {
+    transform: translateY(-2px);
+    box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
+  }
+
+  .stat-content {
+    display: flex;
+    align-items: center;
+    padding: 16px;
+  }
+
+  .stat-icon {
+    width: 48px;
+    height: 48px;
+    border-radius: 8px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-right: 12px;
+
+    .svg-icon {
+      font-size: 24px;
+      color: white;
+    }
+  }
+
+  .stat-info {
+    flex: 1;
+
+    .stat-value {
+      font-size: 24px;
+      font-weight: bold;
+      color: #303133;
+      margin-bottom: 4px;
+    }
+
+    .stat-title {
+      font-size: 14px;
+      color: #606266;
+      line-height: 1.4;
+    }
+  }
+}
+
+.metrics-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+  gap: 16px;
+  margin-top: 16px;
+}
+
+.metric-item {
+  background: linear-gradient(135deg, #fafdff 0%, #e3f0ff 100%);
+  border-radius: 8px;
+  padding: 16px;
+  text-align: center;
+  transition: all 0.3s ease;
+
+  &:hover {
+    transform: translateY(-1px);
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+  }
+
+  &.full-width {
+    grid-column: 1 / -1;
+  }
+
+  .metric-title {
+    font-size: 12px;
+    color: #606266;
+    margin-bottom: 8px;
+    font-weight: 500;
+  }
+
+  .metric-value {
+    font-size: 18px;
+    font-weight: bold;
+    color: #303133;
+  }
+
+  .metric-breakdown {
+    display: flex;
+    justify-content: space-around;
+    flex-wrap: wrap;
+    gap: 8px;
+
+    span {
+      font-size: 12px;
+      color: #606266;
+      background: rgba(255, 255, 255, 0.7);
+      padding: 4px 8px;
+      border-radius: 4px;
+    }
+  }
+}
+
+.action-buttons {
+  display: flex;
+  gap: 12px;
+  justify-content: flex-end;
+
+  @media (max-width: 768px) {
+    justify-content: stretch;
+
+    .el-button {
+      flex: 1;
+    }
+  }
+}
+
+.analysis-section {
+  margin-top: 24px;
+
+}
+
+// 鍝嶅簲寮忚皟鏁�
+@media (max-width: 1200px) {
+  .metrics-grid {
+    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
+  }
+}
+
+@media (max-width: 768px) {
+  .app-container {
+    padding: 12px;
+  }
+
+  .filter-card,
+  .overview-card,
+  .chart-card {
+    margin-bottom: 16px;
+
+    :deep(.el-card__body) {
+      padding: 16px;
+    }
+  }
+
+  .stat-card .stat-content {
+    padding: 12px;
+
+    .stat-icon {
+      width: 40px;
+      height: 40px;
+      margin-right: 8px;
+
+      .svg-icon {
+        font-size: 20px;
       }
     }
-    .box-num-ex {
-      position: absolute;
-      bottom: 5px;
-      right: 10px;
-      width: 45px;
 
-      span {
-        color: #409eff;
+    .stat-info {
+      .stat-value {
+        font-size: 20px;
+      }
+
+      .stat-title {
         font-size: 12px;
       }
     }
   }
-}
-::v-deep .c-table-title {
-  .el-divider.el-divider--horizontal {
-    background-color: #95a1ec;
-    .el-divider__text.is-left {
-      color: #303133;
-      background: #fafafa;
-    }
+
+  .metrics-grid {
+    grid-template-columns: 1fr;
+    gap: 12px;
   }
-  .active {
-    .el-divider.el-divider--horizontal {
-      .el-divider__text.is-left {
-        color: #409eff;
-      }
+
+  .metric-item {
+    padding: 12px;
+
+    .metric-value {
+      font-size: 16px;
     }
   }
 }
-.border-box-contaier {
-  height: 90px;
-  padding: 10px;
-  overflow: hidden;
-  box-sizing: border-box;
-  // background-color: #282c34;
+
+// 鍔ㄧ敾鏁堟灉
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.5s ease;
+}
+
+.fade-enter-from,
+.fade-leave-to {
+  opacity: 0;
 }
 </style>
diff --git a/src/views/register.vue b/src/views/register.vue
index fb7adaa..941d1e2 100644
--- a/src/views/register.vue
+++ b/src/views/register.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="register">
     <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
-      <h3 class="title">娴欐睙鐪丱PO鏁板瓧鍖栫鐞嗗钩鍙�</h3>
+      <h3 class="title">闈掑矝澶у闄勫睘鍖婚櫌opo</h3>
       <el-form-item prop="username">
         <el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="璐﹀彿">
           <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
diff --git a/vue.config.js b/vue.config.js
index 84302f4..51f078a 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -33,8 +33,8 @@
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        // target:`http://localhost:8080`,
-        target:`http://192.168.100.10:8080`,
+        target:`http://localhost:8080`,
+        // target:`http://192.168.100.10:8080`,
         // target:`http://192.168.100.137:8080`,
         // target: `https://slb.hospitalstar.com:9093`,
         changeOrigin: true,

--
Gitblit v1.9.3