| | |
| | | { |
| | | "name": "ruoyi", |
| | | "version": "3.7.0", |
| | | "description": "æµæ±çOPOæ°åå管çå¹³å°", |
| | | "description": "éå²å¤§å¦éå±å»é¢opo", |
| | | "author": "æµæ±äº¥å°æ¶ä¿¡æ¯ç§ææéå
¬å¸", |
| | | "license": "MIT", |
| | | "scripts": { |
| | |
| | | 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"> |
| | |
| | | SizeSelect, |
| | | Search, |
| | | RuoYiGit, |
| | | RuoYiDoc, |
| | | RuoYiDoc |
| | | }, |
| | | computed: { |
| | | ...mapGetters(["sidebar", "avatar", "device"]), |
| | |
| | | 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() { |
| | |
| | | // }, |
| | | clickMessage() { |
| | | this.$router.push({ |
| | | path: "/message", |
| | | |
| | | path: "/message" |
| | | }); |
| | | }, |
| | | toggleSideBar() { |
| | |
| | | this.$confirm("ç¡®å®æ³¨éå¹¶éåºç³»ç»åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | this.$store.dispatch("LogOut").then(() => { |
| | |
| | | }); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | } |
| | | }, |
| | | watch: { |
| | | badgeVal: function () { |
| | |
| | | },5000); |
| | | this.$once("hook:beforeDestroy",()=>{ |
| | | clearInterval(timer); |
| | | }) |
| | | }, |
| | | }, |
| | | }); |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | <style lang="scss" > |
| | |
| | | state: { |
| | | token: getToken(), |
| | | name: '', |
| | | sex:'', |
| | | avatar: '', |
| | | code: '', |
| | | msg: '', |
| | |
| | | }, |
| | | SET_NAME: (state, name) => { |
| | | state.name = name |
| | | }, |
| | | SET_SEX: (state, sex) => { |
| | | state.sex = sex |
| | | }, |
| | | SET_AVATAR: (state, avatar) => { |
| | | state.avatar = avatar |
| | |
| | | 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) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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ãjpgãpngãdocãdocxæ ¼å¼æä»¶ï¼å个æä»¶ä¸è¶
è¿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: "æç®è
åç´ç³»äº²å±èº«ä»½è¯ãæ·å£ç°¿ç¸å
³è¯æ" }, |
| | | { 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: "æç®è
åç´ç³»äº²å±èº«ä»½è¯ãæ·å£ç°¿ç¸å
³è¯æ", |
| | | 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('æä»¶æ ¼å¼ä¸æ¯æï¼è¯·ä¸ä¼ pdfãjpgãpngãdocædocxæ ¼å¼æä»¶'); |
| | | 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ï¼å®é
项ç®ä¸ä¸ºæå¡å¨è¿åçURL |
| | | }; |
| | | |
| | | 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> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // 模ææç®ç¡®è®¤API |
| | | const confirmationData = { |
| | | rows: [ |
| | | { |
| | | id: 1, |
| | | caseNo: 'QJ202312001', |
| | | donorName: 'å¼ ææ', |
| | | gender: '0', |
| | | age: '45', |
| | | diagnosis: 'éåé¢
èæä¼¤', |
| | | hospitalName: 'å京å¸ç¬¬ä¸äººæ°å»é¢', |
| | | confirmationStatus: '0', |
| | | confirmationTime: '', |
| | | assignee: 'çå»ç', |
| | | coordinator1: 'åè°åA', |
| | | coordinator2: 'åè°åB', |
| | | familyRemark: '' |
| | | }, |
| | | { |
| | | id: 2, |
| | | caseNo: 'QJ202312002', |
| | | donorName: 'æææ', |
| | | gender: '1', |
| | | age: '32', |
| | | diagnosis: 'èåºè¡', |
| | | hospitalName: '䏿µ·å¸ä¸å¿å»é¢', |
| | | confirmationStatus: '1', |
| | | confirmationTime: '2023-12-01 14:30:00', |
| | | assignee: 'æå»ç', |
| | | coordinator1: 'åè°åC', |
| | | coordinator2: 'åè°åD', |
| | | familyRemark: 'å®¶å±åææç®ï¼å·²ç¾ç½²ç¸å
³æä»¶' |
| | | }, |
| | | { |
| | | id: 3, |
| | | caseNo: 'QJ202312003', |
| | | donorName: 'çææ', |
| | | gender: '0', |
| | | age: '58', |
| | | diagnosis: 'å¿è骤ååèæä¼¤', |
| | | hospitalName: '广å·å¸äººæ°å»é¢', |
| | | confirmationStatus: '2', |
| | | confirmationTime: '2023-12-02 10:15:00', |
| | | assignee: 'å¼ å»ç', |
| | | coordinator1: 'åè°åE', |
| | | coordinator2: 'åè°åF', |
| | | 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); |
| | | } |
| | | }; |
| | |
| | | // è¡ç¹å»äºä»¶ |
| | | 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 } |
| | | }); |
| | | }, |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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="æ£è
ç¶æ" prop="patientStatus"> |
| | | <el-select |
| | | v-model="queryParams.patientStatus" |
| | | placeholder="è¯·éæ©æ£è
ç¶æ" |
| | | 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="æ£è
ç¶æ" |
| | | 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> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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="æ£è
ç¶æ" 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> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // 模æä¾è
ç»´æ¤API |
| | | 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: 'åè°åA', |
| | | 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: 'åè°åB', |
| | | 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: 'åè°åC', |
| | | 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: 'åè°åD', |
| | | 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, |
| | | 'æ£è
ç¶æ': 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); |
| | | }); |
| | | } |
| | |
| | | :rules="loginRules" |
| | | class="login-form" |
| | | > |
| | | <h3 class="title">æµæ±çOPOæ°åå管çå¹³å°</h3> |
| | | <h3 class="title">éå²å¤§å¦éå±å»é¢opo</h3> |
| | | <el-form-item prop="username"> |
| | | <el-input |
| | | v-model="loginForm.username" |
| | |
| | | <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 |
| | |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | /> |
| | | </el-select> |
| | | </el-col> |
| | | <el-col :span="2"> |
| | | <el-col :xs="24" :sm="24" :md="6"> |
| | | <div class="action-buttons"> |
| | | <el-button |
| | | type="primary" |
| | | @click="selectdatas" |
| | | icon="el-icon-search" |
| | | style="margin-left: 10px" |
| | | >æç´¢</el-button |
| | | @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"> |
| | | |
| | | <!-- æ°æ®æ¦è§åºå --> |
| | | <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: { |
| | | starttime: starttime, |
| | | endtime: endtime, |
| | | tempRecordState: '', |
| | | reporterno: reportervalue, |
| | | shen: searchAddress.shen, |
| | | shi: searchAddress.shi, |
| | | qu: searchAddress.qu, |
| | | city: city |
| | | } |
| | | params: { ...routeParams } |
| | | }" |
| | | class="stat-card-link" |
| | | > |
| | | <!-- params: { |
| | | tempRecordState: 0, |
| | | }, --> |
| | | <!-- @click="tobaseinfo0" --> |
| | | <el-card shadow="always" style="color: #566f94"> |
| | | <svg-icon icon-class="user" /> æ½å¨æç®ç´¯è®¡ï¼{{ |
| | | donateNumData.numberOfDonate |
| | | }} ä¾ |
| | | <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> |
| | | </router-link> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | |
| | | <el-col :xs="12" :sm="6" :md="3"> |
| | | <router-link |
| | | :to="{ |
| | | name: 'Medicalevaluation', |
| | | params: { |
| | | starttime: starttime, |
| | | endtime: endtime, |
| | | tempRecordState: '', |
| | | reporterno: reportervalue, |
| | | shen: searchAddress.shen, |
| | | shi: searchAddress.shi, |
| | | qu: searchAddress.qu, |
| | | city: city |
| | | } |
| | | params: { ...routeParams } |
| | | }" |
| | | class="stat-card-link" |
| | | > |
| | | <el-card |
| | | shadow="always" |
| | | style="color: #566f94" |
| | | @click="Tomedicalevalua" |
| | | > |
| | | <svg-icon icon-class="tool" /> 宿å»å¦è¯ä¼°ç´¯è®¡ï¼{{ |
| | | donateNumData.numberOfMedicalEvaluation |
| | | }} ä¾ |
| | | <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 :span="6"> |
| | | |
| | | <el-col :xs="12" :sm="6" :md="3"> |
| | | <router-link |
| | | :to="{ |
| | | name: 'Relativesconfirmation', |
| | | params: { |
| | | starttime: starttime, |
| | | endtime: endtime, |
| | | tempRecordState: '', |
| | | reporterno: reportervalue, |
| | | shen: searchAddress.shen, |
| | | shi: searchAddress.shi, |
| | | qu: searchAddress.qu, |
| | | city: city |
| | | } |
| | | params: { ...routeParams } |
| | | }" |
| | | class="stat-card-link" |
| | | > |
| | | <el-card shadow="always" style="color: #566f94"> |
| | | <svg-icon icon-class="checkbox" /> |
| | | å®æäº²å±ç¡®è®¤ç´¯è®¡ï¼{{ |
| | | donateNumData.numberOfRelativeConfirmation |
| | | }} ä¾ |
| | | <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 :span="6"> |
| | | |
| | | <el-col :xs="12" :sm="6" :md="3"> |
| | | <router-link |
| | | :to="{ |
| | | name: 'EthicalReview', |
| | | params: { |
| | | starttime: starttime, |
| | | endtime: endtime, |
| | | tempRecordState: '', |
| | | reporterno: reportervalue, |
| | | shen: searchAddress.shen, |
| | | shi: searchAddress.shi, |
| | | qu: searchAddress.qu, |
| | | city: city |
| | | } |
| | | params: { ...routeParams } |
| | | }" |
| | | class="stat-card-link" |
| | | > |
| | | <el-card shadow="always" style="color: #566f94"> |
| | | <svg-icon icon-class="education" /> |
| | | 宿伦ç审æ¥ç´¯è®¡ï¼{{ |
| | | donateNumData.numberOfEthicalReview |
| | | }} ä¾ |
| | | <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-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-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 :span="6"> |
| | | |
| | | <el-col :xs="12" :sm="6" :md="3"> |
| | | <router-link |
| | | :to="{ |
| | | name: 'Donationwitness', |
| | | params: { |
| | | starttime: starttime, |
| | | endtime: endtime, |
| | | tempRecordState: '', |
| | | reporterno: reportervalue, |
| | | shen: searchAddress.shen, |
| | | shi: searchAddress.shi, |
| | | qu: searchAddress.qu, |
| | | city: city |
| | | } |
| | | params: { ...routeParams } |
| | | }" |
| | | class="stat-card-link" |
| | | > |
| | | <el-card shadow="always" style="color: #566f94"> |
| | | <svg-icon icon-class="job" /> 宿è·åè§è¯ç´¯è®¡ï¼{{ |
| | | donateNumData.numberOfWitness |
| | | }} ä¾ |
| | | <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 :span="6"> |
| | | |
| | | <el-col :xs="12" :sm="6" :md="3"> |
| | | <router-link |
| | | :to="{ |
| | | name: 'Donatefinish', |
| | | params: { |
| | | starttime: starttime, |
| | | endtime: endtime, |
| | | tempRecordState: '', |
| | | reporterno: reportervalue, |
| | | shen: searchAddress.shen, |
| | | shi: searchAddress.shi, |
| | | qu: searchAddress.qu, |
| | | city: city |
| | | } |
| | | params: { ...routeParams } |
| | | }" |
| | | class="stat-card-link" |
| | | > |
| | | <el-card shadow="always" style="color: #566f94"> |
| | | <svg-icon icon-class="lock" /> æç®å®æç´¯è®¡ï¼{{ |
| | | donateNumData.numberOfCompletion |
| | | }} ä¾ |
| | | <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 :span="6"> |
| | | |
| | | <el-col :xs="12" :sm="6" :md="3"> |
| | | <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 |
| | | } |
| | | params: { ...routeParams, terminationcase: 1 } |
| | | }" |
| | | class="stat-card-link" |
| | | > |
| | | <el-card shadow="always" style="color: #566f94"> |
| | | <svg-icon icon-class="lock" /> æç®ç»æ¢ç´¯è®¡ï¼{{ |
| | | donateNumData.numberOfTerminated |
| | | }} ä¾ |
| | | <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-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 |
| | | > |
| | | <span style="margin-left: 30px;"> |
| | | </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: { |
| | | starttime: starttime, |
| | | endtime: endtime, |
| | | terminationcase: 1, |
| | | reporterno: reportervalue, |
| | | shen: searchAddress.shen, |
| | | shi: searchAddress.shi, |
| | | qu: searchAddress.qu, |
| | | city: city |
| | | } |
| | | params: { ...routeParams, terminationcase: 1 } |
| | | }" |
| | | > |
| | | <el-button type="primary" round>æç®è¿ç¨</el-button> |
| | | <el-button type="primary" size="small" 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 /> |
| | | </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) }}% |
| | | </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 /> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="metric-item"> |
| | | <div class="metric-title">å¹³åå¨å®äº§åºç</div> |
| | | <div class="metric-value"> |
| | | {{ (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 /> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="metric-item"> |
| | | <div class="metric-title">è·åå¨å®å©ç¨ç</div> |
| | | <div class="metric-value"> |
| | | {{ (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" |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="metric-item full-width"> |
| | | <div class="metric-title">å¨å®æç®åç±»å æ¯</div> |
| | | <div class="metric-breakdown"> |
| | | <span |
| | | >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" |
| | | {{ (qualirtData.dbddonateRate * 100).toFixed(2) }}%</span |
| | | > |
| | | <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" |
| | | <span |
| | | >DCD: |
| | | {{ (qualirtData.dcddonateRate * 100).toFixed(2) }}%</span |
| | | > |
| | | <el-row> |
| | | <span style="font-size: 14px">è·ååæ´»æ£ç</span> |
| | | </el-row> |
| | | <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) }}% |
| | | </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 /> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="metric-item"> |
| | | <div class="metric-title">è¾¹ç¼ä¾å¨å®æ¯ç</div> |
| | | <div class="metric-value"> |
| | | {{ (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 /> |
| | | </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-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"> |
| | | |
| | | <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 :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> |
| | | </div> |
| | | </div> |
| | | </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, |
| | |
| | | name: "home", |
| | | dicts: ["sys_messagestatus"], |
| | | components: { |
| | | RankChart, |
| | | OrganNumChart, |
| | | Li_area_select |
| | | }, |
| | |
| | | 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" }, |
| | |
| | | { 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: [ |
| | | { |
| | |
| | | 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 |
| | |
| | | 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); |
| | | }, |
| | | |
| | | resetArr(Arr) { |
| | | var hash = {}; |
| | | Arr = Arr.reduce(function(arr, current) { |
| | | hash[current.reporterno] |
| | | ? "" |
| | | : (hash[current.reporterno] = true && arr.push(current)); |
| | | return arr; |
| | | }, []); |
| | | return Arr; |
| | | // éç½®ç鿡件 |
| | | resetFilters() { |
| | | this.selecttime = [new Date(new Date().getFullYear(), 0), new Date()]; |
| | | this.reportervalue = ""; |
| | | this.city = ""; |
| | | this.getTimeList(); |
| | | this.selectdatas(); |
| | | }, |
| | | // tobaseinfo0(){ |
| | | // this.$router.push({path:'/Donatebaseinfo', query: {userid: 0 }}) |
| | | // }, |
| | | |
| | | // æ¶é´éæ©å¤ç |
| | | 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"); |
| | | } |
| | | }, |
| | | |
| | | // æç´¢æ°æ® |
| | | 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; |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | //è·åææ çæ§æ°æ® |
| | | 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) { |
| | | 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 { |
| | | 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; |
| | | // } |
| | | // }); |
| | | } |
| | | }); |
| | | }, |
| | | 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 = { |
| | | // è·åè´¨éææ æ°æ® |
| | | GetDonateOrganQuality() { |
| | | let param = { |
| | | starttime: this.starttime, |
| | | endtime: this.endtime, |
| | | city: this.city |
| | | }; |
| | | |
| | | getOrgansQuality(param).then(response => { |
| | | if (response.code === 200) { |
| | | this.qualirtData = response.data; |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // è·åç»è®¡æ°æ® |
| | | GetOrgDonateNumNew() { |
| | | 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; |
| | | } |
| | | |
| | | //æ½å¨æç® |
| | | // å¹¶è¡è·åææç»è®¡æ°æ® |
| | | Promise.all([ |
| | | listDonatebaseinfo(info).then(res => { |
| | | this.donateNumData.numberOfDonate = res.total; |
| | | }); |
| | | this.donateNumData.numberOfDonate = res.total || 0; |
| | | }), |
| | | |
| | | //å»å¦è¯ä¼° |
| | | listnewMedicalevaluation(info).then(res => { |
| | | this.donateNumData.numberOfMedicalEvaluation = res.total; |
| | | this.donateNumData.numberOfMedicalEvaluation = res.total || 0; |
| | | }), |
| | | //亲å±ç¡®è®¤ |
| | | listnewRelativesconfirmation(info).then(res => { |
| | | this.donateNumData.numberOfRelativeConfirmation = res.total; |
| | | }); |
| | | //伦çå®¡æ¥ |
| | | listnewEthicalreviewopinions(info).then(res => { |
| | | this.donateNumData.numberOfEthicalReview = res.total; |
| | | }), |
| | | //å¨å®æç® |
| | | listOrganallocation(info).then(res => { |
| | | this.donateNumData.numberOfDonatePeople = res.total; |
| | | }); |
| | | |
| | | //è·åè§è¯ |
| | | listnewRelativesconfirmation(info).then(res => { |
| | | 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 || 0; |
| | | }), |
| | | |
| | | listnewDonationwitness(info).then(res => { |
| | | this.donateNumData.numberOfWitness = res.total; |
| | | }); |
| | | this.donateNumData.numberOfWitness = res.total || 0; |
| | | }), |
| | | |
| | | listnewDonatecompletioninfo(info).then(res => { |
| | | this.donateNumData.numberOfCompletion = res.total; |
| | | }); |
| | | this.donateNumData.numberOfCompletion = res.total || 0; |
| | | }), |
| | | |
| | | //ç»æ¢ |
| | | info.terminationCase = 1; |
| | | listDonatebaseinfo(info).then(res => { |
| | | this.donateNumData.numberOfTerminated = res.total; |
| | | 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 = []; |
| | | reportlist.push({ reporterno: "", reportername: "å
¨é¨äººå" }); |
| | | let list = res.rows || []; |
| | | let reportlist = [{ reporterno: "", reportername: "å
¨é¨äººå" }]; |
| | | |
| | | list.forEach(element => { |
| | | if (element.reporterno && element.reportername) { |
| | | reportlist.push({ |
| | | reporterno: element.reporterno, |
| | | reportername: element.reportername |
| | | }); |
| | | }); |
| | | |
| | | if (reportlist != 0) { |
| | | reportlist = this.resetArr(reportlist); |
| | | this.reportlist = reportlist; |
| | | } |
| | | }); |
| | | |
| | | 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() |
| | |
| | | // 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; |
| | | } |
| | | b { |
| | | display: block; |
| | | color: #fff; |
| | | text-align: center; |
| | | transform: skewY(-20deg); |
| | | transform: skewX(-20deg); |
| | | |
| | | .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; |
| | | } |
| | | } |
| | | .box-num { |
| | | position: relative; |
| | | .box-num-main { |
| | | text-align: right; |
| | | padding-right: 70px; |
| | | .box-num-main-n { |
| | | color: #409eff; |
| | | font-size: 25px; |
| | | |
| | | .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; |
| | | } |
| | | |
| | | .header-subtitle { |
| | | font-size: 14px; |
| | | color: #909399; |
| | | } |
| | | } |
| | | .box-num-ex { |
| | | position: absolute; |
| | | bottom: 5px; |
| | | right: 10px; |
| | | width: 45px; |
| | | |
| | | :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 { |
| | | color: #409eff; |
| | | 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; |
| | | } |
| | | } |
| | | |
| | | .stat-info { |
| | | .stat-value { |
| | | font-size: 20px; |
| | | } |
| | | |
| | | .stat-title { |
| | | font-size: 12px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .metrics-grid { |
| | | grid-template-columns: 1fr; |
| | | gap: 12px; |
| | | } |
| | | ::v-deep .c-table-title { |
| | | .el-divider.el-divider--horizontal { |
| | | background-color: #95a1ec; |
| | | .el-divider__text.is-left { |
| | | color: #303133; |
| | | background: #fafafa; |
| | | } |
| | | } |
| | | .active { |
| | | .el-divider.el-divider--horizontal { |
| | | .el-divider__text.is-left { |
| | | color: #409eff; |
| | | |
| | | .metric-item { |
| | | padding: 12px; |
| | | |
| | | .metric-value { |
| | | font-size: 16px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // å¨ç»ææ |
| | | .fade-enter-active, |
| | | .fade-leave-active { |
| | | transition: opacity 0.5s ease; |
| | | } |
| | | .border-box-contaier { |
| | | height: 90px; |
| | | padding: 10px; |
| | | overflow: hidden; |
| | | box-sizing: border-box; |
| | | // background-color: #282c34; |
| | | |
| | | .fade-enter-from, |
| | | .fade-leave-to { |
| | | opacity: 0; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div class="register"> |
| | | <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form"> |
| | | <h3 class="title">æµæ±çOPOæ°åå管çå¹³å°</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" /> |
| | |
| | | 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, |