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" /> 娼滃湪鎹愮尞绱锛歿{
- donateNumData.numberOfDonate
- }} 渚�
- </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" /> 瀹屾垚鍖诲璇勪及绱锛歿{
- donateNumData.numberOfMedicalEvaluation
- }} 渚�
- </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" />
- 瀹屾垚浜插睘纭绱锛歿{
- donateNumData.numberOfRelativeConfirmation
- }} 渚�
- </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" />
- 瀹屾垚浼︾悊瀹℃煡绱锛歿{
- donateNumData.numberOfEthicalReview
- }} 渚�
- </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" /> 瀹屾垚鍣ㄥ畼鍒嗛厤绱锛歿{
- donateNumData.numberOfDonatePeople
- }} 涓�
- <!-- 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" /> 瀹屾垚鑾峰彇瑙佽瘉绱锛歿{
- donateNumData.numberOfWitness
- }} 渚�
- </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" /> 鎹愮尞瀹屾垚绱锛歿{
- donateNumData.numberOfCompletion
- }} 渚�
- </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" /> 鎹愮尞缁堟绱锛歿{
- donateNumData.numberOfTerminated
- }} 渚�
- </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