| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // 䏿¥æ¡ä¾æ°å¢ |
| | | export function donateAdd(data) { |
| | | return request({ |
| | | url: '/project/donatebaseinforeport/add', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // 䏿¥æ¡ä¾ä¿®æ¹ |
| | | export function donateEdit(data) { |
| | | return request({ |
| | | url: '/project/donatebaseinforeport/edit', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | // 䏿¥æ¡ä¾å表 |
| | | export function donateList(data) { |
| | | return request({ |
| | | url: '/project/donatebaseinforeport/list', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ¡ä¾è¯¦æ
|
| | | export function donateInfo(id) { |
| | | return request({ |
| | | url: '/project/donatebaseinforeport/getInfo/' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // å é¤ |
| | | export function donateDel(id) { |
| | | return request({ |
| | | url: '/project/donatebaseinforeport/remove/' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | export * from "./affirm"; |
| | | export * from "./allocation"; |
| | | export * from "./appear"; |
| | | export * from "./assess"; |
| | | export * from "./course"; |
| | | export * from "./ethicalReview"; |
| | | export * from "./decide"; |
| | | export * from "./GetWitness"; |
| | | export * from "./maintain"; |
| | | export * from "./OrganUtilization"; |
| | | export * from "./transfer"; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // 䏿¥æ¡ä¾æ°å¢ |
| | | export function transportAdd(data) { |
| | | return request({ |
| | | url: '/project/transport/add', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // 䏿¥æ¡ä¾ä¿®æ¹ |
| | | export function transportEdit(data) { |
| | | return request({ |
| | | url: '/project/transport/edit', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | // 䏿¥æ¡ä¾å表 |
| | | export function transportList(data) { |
| | | return request({ |
| | | url: '/project/transport/list', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ¡ä¾è¯¦æ
|
| | | export function transportInfo(id) { |
| | | return request({ |
| | | url: '/project/transport/getInfo/' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // å é¤ |
| | | export function transportDel(id) { |
| | | return request({ |
| | | url: '/project/transport/remove/' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-dialog |
| | | class="file-preview-dialog" |
| | | :title="previewTitle" |
| | | :visible.sync="previewVisible" |
| | | width="80%" |
| | | top="5vh" |
| | | :close-on-click-modal="true" |
| | | append-to-body |
| | | @close="handleClose" |
| | | > |
| | | <!-- å è½½ç¶æ --> |
| | | <div v-if="loading" class="preview-loading"> |
| | | <i class="el-icon-loading" style="font-size: 40px; margin-bottom: 16px;"></i> |
| | | <span>æä»¶å è½½ä¸...</span> |
| | | </div> |
| | | |
| | | <!-- å¾çé¢è§ --> |
| | | <div v-else-if="fileType === 'image'" class="preview-container"> |
| | | <div class="image-toolbar"> |
| | | <el-button-group> |
| | | <el-button size="mini" @click="zoomImageIn" :disabled="imageScale >= 300"> |
| | | <i class="el-icon-zoom-in"></i> æ¾å¤§ |
| | | </el-button> |
| | | <el-button size="mini" disabled>{{ imageScale }}%</el-button> |
| | | <el-button size="mini" @click="zoomImageOut" :disabled="imageScale <= 50"> |
| | | <i class="el-icon-zoom-out"></i> ç¼©å° |
| | | </el-button> |
| | | <el-button size="mini" @click="resetImageZoom"> |
| | | <i class="el-icon-refresh-left"></i> éç½® |
| | | </el-button> |
| | | </el-button-group> |
| | | |
| | | <el-button size="mini" type="success" @click="handleDownload"> |
| | | <i class="el-icon-download"></i> ä¸è½½ |
| | | </el-button> |
| | | </div> |
| | | |
| | | <div class="image-viewport"> |
| | | <img |
| | | :src="fileUrl" |
| | | alt="é¢è§å¾ç" |
| | | class="preview-image" |
| | | :style="{ transform: `scale(${imageScale / 100})` }" |
| | | @load="handleImageLoad" |
| | | /> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- PDFé¢è§ --> |
| | | <div v-else-if="fileType === 'pdf'" class="preview-container pdf-preview"> |
| | | <div class="pdf-toolbar"> |
| | | <el-button-group> |
| | | <el-button |
| | | size="mini" |
| | | @click="changePage(currentPage - 1)" |
| | | :disabled="currentPage <= 1" |
| | | > |
| | | <i class="el-icon-arrow-left"></i> ä¸ä¸é¡µ |
| | | </el-button> |
| | | <el-button size="mini" disabled> |
| | | 第 {{ currentPage }} 页 / å
± {{ pageCount }} 页 |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | | @click="changePage(currentPage + 1)" |
| | | :disabled="currentPage >= pageCount" |
| | | > |
| | | <i class="el-icon-arrow-right"></i> ä¸ä¸é¡µ |
| | | </el-button> |
| | | </el-button-group> |
| | | |
| | | <el-button-group class="zoom-controls"> |
| | | <el-button size="mini" @click="zoomOut" :disabled="scale <= 50"> |
| | | <i class="el-icon-zoom-out"></i> ç¼©å° |
| | | </el-button> |
| | | <el-button size="mini" disabled> {{ scale }}% </el-button> |
| | | <el-button size="mini" @click="zoomIn" :disabled="scale >= 200"> |
| | | <i class="el-icon-zoom-in"></i> æ¾å¤§ |
| | | </el-button> |
| | | <el-button size="mini" @click="resetZoom"> |
| | | <i class="el-icon-refresh-left"></i> éç½® |
| | | </el-button> |
| | | </el-button-group> |
| | | |
| | | <el-button |
| | | size="mini" |
| | | type="success" |
| | | @click="handleDownload" |
| | | > |
| | | <i class="el-icon-download"></i> ä¸è½½ |
| | | </el-button> |
| | | </div> |
| | | |
| | | <div class="pdf-content" v-loading="pdfLoading"> |
| | | <pdf |
| | | ref="pdf" |
| | | :src="pdfUrl" |
| | | :page="currentPage" |
| | | @num-pages="pageCount = $event" |
| | | @page-loaded="currentPage = $event" |
| | | @loaded="loadPdfHandler" |
| | | @error="pdfErrorHandler" |
| | | :style="{ |
| | | width: scale + '%', |
| | | transform: 'scale(' + scale / 100 + ')', |
| | | transformOrigin: '0 0' |
| | | }" |
| | | ></pdf> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- Officeææ¡£é¢è§ --> |
| | | <div v-else-if="fileType === 'office'" class="preview-container office-preview"> |
| | | <div class="office-toolbar"> |
| | | <el-alert |
| | | title="Officeææ¡£é¢è§æç¤º" |
| | | description="建议ä¸è½½åä½¿ç¨æ¬å°Office软件æ¥ç以è·å¾æä½³ä½éª" |
| | | type="info" |
| | | show-icon |
| | | :closable="false" |
| | | /> |
| | | <el-button size="mini" type="success" @click="handleDownload"> |
| | | <i class="el-icon-download"></i> ä¸è½½ææ¡£ |
| | | </el-button> |
| | | </div> |
| | | |
| | | <div class="office-content"> |
| | | <iframe |
| | | :src="`https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(fileUrl)}`" |
| | | width="100%" |
| | | height="600px" |
| | | frameborder="0" |
| | | ></iframe> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- 䏿¯æé¢è§çæä»¶ç±»å --> |
| | | <div v-else class="preview-container unsupported-preview"> |
| | | <el-alert |
| | | title="该æä»¶æ ¼å¼ä¸æ¯æå¨çº¿é¢è§" |
| | | :description="`æä»¶ç±»å: ${getFileExtension(fileName)}`" |
| | | type="warning" |
| | | show-icon |
| | | :closable="false" |
| | | /> |
| | | |
| | | <div class="unsupported-actions"> |
| | | <el-button type="primary" @click="handleDownload"> |
| | | <i class="el-icon-download"></i> ä¸è½½æä»¶ |
| | | </el-button> |
| | | <el-button @click="handleClose">å
³é</el-button> |
| | | </div> |
| | | |
| | | <div class="file-info"> |
| | | <p><strong>æä»¶å:</strong> {{ fileName }}</p> |
| | | <p><strong>æä»¶ç±»å:</strong> {{ getFileExtension(fileName) }}</p> |
| | | </div> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | import pdf from "vue-pdf"; |
| | | |
| | | export default { |
| | | name: "FilePreviewDialog", |
| | | components: { |
| | | pdf |
| | | }, |
| | | props: { |
| | | visible: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | file: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | // é¢è§æ§å¶ |
| | | previewVisible: this.visible, |
| | | // å è½½ç¶æ |
| | | loading: false, |
| | | pdfLoading: false, |
| | | // æä»¶ä¿¡æ¯ |
| | | fileUrl: "", |
| | | fileName: "", |
| | | fileType: "", |
| | | // PDFç¸å
³ |
| | | currentPage: 1, |
| | | pageCount: 0, |
| | | scale: 100, |
| | | pageRotate: 0, |
| | | // å¾çç¸å
³ |
| | | imageScale: 100 |
| | | }; |
| | | }, |
| | | computed: { |
| | | previewTitle() { |
| | | return `æä»¶é¢è§ - ${this.fileName}`; |
| | | }, |
| | | pdfUrl() { |
| | | return this.fileUrl; |
| | | } |
| | | }, |
| | | watch: { |
| | | visible(newVal) { |
| | | this.previewVisible = newVal; |
| | | if (newVal) { |
| | | this.initPreview(); |
| | | } |
| | | }, |
| | | previewVisible(newVal) { |
| | | this.$emit('update:visible', newVal); |
| | | if (!newVal) { |
| | | this.handleClose(); |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | /** åå§åé¢è§ */ |
| | | initPreview() { |
| | | if (!this.file) return; |
| | | |
| | | this.fileName = this.file.fileName || this.file.name || "æªç¥æä»¶"; |
| | | this.fileUrl = this.file.fileUrl || this.file.path || this.file.url; |
| | | this.fileType = this.getFileType(this.fileName); |
| | | |
| | | this.loading = true; |
| | | |
| | | // éç½®ç¶æ |
| | | this.currentPage = 1; |
| | | this.scale = 100; |
| | | this.imageScale = 100; |
| | | this.pageCount = 0; |
| | | |
| | | // 模æå è½½å»¶è¿ |
| | | setTimeout(() => { |
| | | this.loading = false; |
| | | if (this.fileType === "pdf") { |
| | | this.pdfLoading = true; |
| | | } |
| | | }, 300); |
| | | }, |
| | | |
| | | /** è·åæä»¶ç±»å */ |
| | | getFileType(fileName) { |
| | | if (!fileName) return "other"; |
| | | |
| | | const extension = fileName.split('.').pop().toLowerCase(); |
| | | const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"]; |
| | | const pdfTypes = ["pdf"]; |
| | | const officeTypes = ["doc", "docx", "xls", "xlsx", "ppt", "pptx"]; |
| | | |
| | | if (imageTypes.includes(extension)) return "image"; |
| | | if (pdfTypes.includes(extension)) return "pdf"; |
| | | if (officeTypes.includes(extension)) return "office"; |
| | | return "other"; |
| | | }, |
| | | |
| | | /** è·åæä»¶æ©å±å */ |
| | | getFileExtension(filename) { |
| | | return filename.split('.').pop().toLowerCase() || "æªç¥"; |
| | | }, |
| | | |
| | | /** PDFå è½½å®æ */ |
| | | loadPdfHandler() { |
| | | this.pdfLoading = false; |
| | | this.currentPage = 1; |
| | | }, |
| | | |
| | | /** PDFå è½½é误 */ |
| | | pdfErrorHandler(error) { |
| | | console.error("PDFå 载失败:", error); |
| | | this.pdfLoading = false; |
| | | this.$message.error("PDFæä»¶å 载失败ï¼è¯·å°è¯ä¸è½½åæ¥ç"); |
| | | this.previewVisible = false; |
| | | }, |
| | | |
| | | /** å¾çå è½½å®æ */ |
| | | handleImageLoad() { |
| | | this.loading = false; |
| | | }, |
| | | |
| | | /** æ¹åPDF页ç */ |
| | | changePage(newPage) { |
| | | if (newPage < 1 || newPage > this.pageCount) return; |
| | | this.currentPage = newPage; |
| | | }, |
| | | |
| | | /** PDFæ¾å¤§ */ |
| | | zoomIn() { |
| | | if (this.scale >= 200) { |
| | | this.$message.info("å·²æ¾å¤§å°æå¤§æ¯ä¾"); |
| | | return; |
| | | } |
| | | this.scale += 10; |
| | | }, |
| | | |
| | | /** PDFç¼©å° */ |
| | | zoomOut() { |
| | | if (this.scale <= 50) { |
| | | this.$message.info("已缩å°å°æå°æ¯ä¾"); |
| | | return; |
| | | } |
| | | this.scale -= 10; |
| | | }, |
| | | |
| | | /** PDFéç½®ç¼©æ¾ */ |
| | | resetZoom() { |
| | | this.scale = 100; |
| | | }, |
| | | |
| | | /** å¾çæ¾å¤§ */ |
| | | zoomImageIn() { |
| | | if (this.imageScale >= 300) { |
| | | this.$message.info("å·²æ¾å¤§å°æå¤§æ¯ä¾"); |
| | | return; |
| | | } |
| | | this.imageScale += 20; |
| | | }, |
| | | |
| | | /** å¾çç¼©å° */ |
| | | zoomImageOut() { |
| | | if (this.imageScale <= 50) { |
| | | this.$message.info("已缩å°å°æå°æ¯ä¾"); |
| | | return; |
| | | } |
| | | this.imageScale -= 20; |
| | | }, |
| | | |
| | | /** å¾çéç½®ç¼©æ¾ */ |
| | | resetImageZoom() { |
| | | this.imageScale = 100; |
| | | }, |
| | | |
| | | /** ä¸è½½æä»¶ */ |
| | | handleDownload() { |
| | | if (!this.fileUrl) { |
| | | this.$message.warning("æä»¶è·¯å¾ä¸åå¨ï¼æ æ³ä¸è½½"); |
| | | return; |
| | | } |
| | | |
| | | const link = document.createElement("a"); |
| | | link.href = this.fileUrl; |
| | | link.download = this.fileName; |
| | | link.style.display = "none"; |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | document.body.removeChild(link); |
| | | |
| | | this.$message.success("å¼å§ä¸è½½æä»¶"); |
| | | }, |
| | | |
| | | /** å
³éå¯¹è¯æ¡ */ |
| | | handleClose() { |
| | | this.previewVisible = false; |
| | | this.$emit("close"); |
| | | |
| | | // æ¸
çèµæº |
| | | if (this.fileUrl && this.fileUrl.startsWith("blob:")) { |
| | | URL.revokeObjectURL(this.fileUrl); |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .file-preview-dialog { |
| | | .preview-loading { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | height: 400px; |
| | | color: #909399; |
| | | } |
| | | |
| | | .preview-container { |
| | | display: flex; |
| | | flex-direction: column; |
| | | height: 70vh; |
| | | } |
| | | |
| | | /* å·¥å
·æ éç¨æ ·å¼ */ |
| | | .image-toolbar, |
| | | .pdf-toolbar, |
| | | .office-toolbar { |
| | | padding: 15px 20px; |
| | | background: #f5f7fa; |
| | | border-bottom: 1px solid #ebeef5; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | gap: 10px; |
| | | } |
| | | |
| | | /* å¾çé¢è§æ ·å¼ */ |
| | | .image-viewport { |
| | | flex: 1; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | overflow: auto; |
| | | padding: 20px; |
| | | background: #f8f9fa; |
| | | } |
| | | |
| | | .preview-image { |
| | | max-width: 100%; |
| | | max-height: 100%; |
| | | transition: transform 0.3s ease; |
| | | box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); |
| | | } |
| | | |
| | | /* PDFé¢è§æ ·å¼ */ |
| | | .pdf-content { |
| | | flex: 1; |
| | | overflow: auto; |
| | | padding: 20px; |
| | | background: #f8f9fa; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: flex-start; |
| | | } |
| | | |
| | | /* Officeé¢è§æ ·å¼ */ |
| | | .office-content { |
| | | flex: 1; |
| | | padding: 20px; |
| | | background: #f8f9fa; |
| | | } |
| | | |
| | | /* 䏿¯æé¢è§çæ ·å¼ */ |
| | | .unsupported-preview { |
| | | padding: 40px 20px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .unsupported-actions { |
| | | margin: 30px 0; |
| | | } |
| | | |
| | | .unsupported-actions .el-button { |
| | | margin: 0 10px; |
| | | } |
| | | |
| | | .file-info { |
| | | text-align: left; |
| | | max-width: 400px; |
| | | margin: 0 auto; |
| | | padding: 20px; |
| | | background: #f5f7fa; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .file-info p { |
| | | margin: 8px 0; |
| | | } |
| | | } |
| | | |
| | | /* å¯¹è¯æ¡æ ·å¼è°æ´ */ |
| | | :deep(.el-dialog) { |
| | | margin-top: 5vh !important; |
| | | } |
| | | |
| | | :deep(.el-dialog__body) { |
| | | padding: 0; |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | .file-preview-dialog { |
| | | :deep(.el-dialog) { |
| | | width: 95% !important; |
| | | } |
| | | |
| | | .preview-container { |
| | | .image-toolbar, |
| | | .pdf-toolbar, |
| | | .office-toolbar { |
| | | flex-direction: column; |
| | | gap: 10px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div class="upload-attachment"> |
| | | <el-upload |
| | | action="#" |
| | | ref="upload" |
| | | :action="uploadAction" |
| | | :headers="headers" |
| | | :file-list="fileList" |
| | | :auto-upload="false" |
| | | :multiple="true" |
| | | :limit="limit" |
| | | :accept="accept" |
| | | :on-exceed="handleExceed" |
| | | :on-change="handleFileChange" |
| | | :on-remove="handleFileRemove" |
| | | multiple |
| | | :on-success="handleUploadSuccess" |
| | | :on-error="handleUploadError" |
| | | :before-upload="beforeUpload" |
| | | > |
| | | <el-button size="small" type="primary">ç¹å»ä¸ä¼ </el-button> |
| | | <div slot="tip" class="el-upload__tip">æ¯æjpgãpngãpdfãdocãdocxçæ ¼å¼ï¼å个æä»¶ä¸è¶
è¿10MB</div> |
| | | <el-button slot="trigger" size="small" type="primary">éåæä»¶</el-button> |
| | | <el-button |
| | | style="margin-left: 10px;" |
| | | size="small" |
| | | type="success" |
| | | @click="submitUpload" |
| | | :disabled="fileList.length === 0" |
| | | > |
| | | ä¸ä¼ å°æå¡å¨ |
| | | </el-button> |
| | | <div slot="tip" class="el-upload__tip"> |
| | | 请ä¸ä¼ {{ accept }} æ ¼å¼çæä»¶ï¼å个æä»¶ä¸è¶
è¿10MBï¼æå¤å¯ä¸ä¼ {{ limit }}个æä»¶ |
| | | </div> |
| | | </el-upload> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getToken } from "@/utils/auth"; |
| | | |
| | | export default { |
| | | name: "UploadAttachment", |
| | | props: { |
| | | // æä»¶å表 |
| | | fileList: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | // ä¸ä¼ æ°ééå¶ |
| | | limit: { |
| | | type: Number, |
| | | default: 10 |
| | | }, |
| | | // æ¥åçæä»¶ç±»å |
| | | accept: { |
| | | type: String, |
| | | default: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx" |
| | | }, |
| | | // ä¸ä¼ å°å |
| | | uploadUrl: { |
| | | type: String, |
| | | default: process.env.VUE_APP_BASE_API + "/common/upload" |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | uploadAction: process.env.VUE_APP_BASE_API + "/common/upload", |
| | | headers: { |
| | | Authorization: "Bearer " + getToken() |
| | | } |
| | | }; |
| | | }, |
| | | methods: { |
| | | /** æä»¶éæ©åå */ |
| | | handleFileChange(file, fileList) { |
| | | this.$emit('change', fileList); |
| | | }, |
| | | |
| | | /** æä»¶ç§»é¤ */ |
| | | handleFileRemove(file, fileList) { |
| | | this.$emit('change', fileList); |
| | | this.$emit('remove', file); |
| | | }, |
| | | |
| | | /** ä¸ä¼ æåå¤ç */ |
| | | handleUploadSuccess(response, file, fileList) { |
| | | if (response.code === 200) { |
| | | file.url = response.data || response.url; |
| | | this.$message.success('æä»¶ä¸ä¼ æå'); |
| | | this.$emit('upload-success', { |
| | | file, |
| | | fileList, |
| | | response |
| | | }); |
| | | } else { |
| | | this.$message.error(response.msg || 'æä»¶ä¸ä¼ 失败'); |
| | | } |
| | | }, |
| | | |
| | | /** ä¸ä¼ é误å¤ç */ |
| | | handleUploadError(err, file, fileList) { |
| | | console.error('ä¸ä¼ 失败:', err); |
| | | this.$message.error('æä»¶ä¸ä¼ 失败ï¼è¯·éè¯'); |
| | | this.$emit('upload-error', { |
| | | file, |
| | | fileList, |
| | | error: err |
| | | }); |
| | | }, |
| | | |
| | | /** ä¸ä¼ åæ ¡éª */ |
| | | beforeUpload(file) { |
| | | // æ£æ¥æä»¶ç±»å |
| | | const allowedTypes = this.accept.split(',').map(type => type.trim().toLowerCase()); |
| | | const fileExtension = '.' + file.name.split('.').pop().toLowerCase(); |
| | | |
| | | if (!allowedTypes.includes(fileExtension) && !allowedTypes.includes(fileExtension.substring(1))) { |
| | | this.$message.error(`䏿¯æçæä»¶æ ¼å¼: ${fileExtension}`); |
| | | return false; |
| | | } |
| | | |
| | | // æ£æ¥æä»¶å¤§å° (10MBéå¶) |
| | | const isLt10M = file.size / 1024 / 1024 < 10; |
| | | if (!isLt10M) { |
| | | this.$message.error('æä»¶å¤§å°ä¸è½è¶
è¿ 10MB!'); |
| | | return false; |
| | | } |
| | | |
| | | return true; |
| | | }, |
| | | |
| | | /** æä»¶æ°éè¶
åºéå¶ */ |
| | | handleExceed(files, fileList) { |
| | | this.$message.warning(`æå¤åªè½ä¸ä¼ ${this.limit} 个æä»¶ï¼å½åéæ©äº ${files.length} 个æä»¶`); |
| | | }, |
| | | |
| | | /** æå¨æäº¤ä¸ä¼ */ |
| | | submitUpload() { |
| | | if (this.fileList.length === 0) { |
| | | this.$message.warning('请å
éæ©è¦ä¸ä¼ çæä»¶'); |
| | | return; |
| | | } |
| | | |
| | | this.$refs.upload.submit(); |
| | | }, |
| | | |
| | | /** æ¸
空æä»¶å表 */ |
| | | clearFiles() { |
| | | this.$refs.upload.clearFiles(); |
| | | }, |
| | | |
| | | /** è·åå½åæä»¶å表 */ |
| | | getFileList() { |
| | | return this.fileList; |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .upload-attachment { |
| | | width: 100%; |
| | | } |
| | | |
| | | ::v-deep .el-upload { |
| | | display: block; |
| | | } |
| | | |
| | | ::v-deep .el-upload__tip { |
| | | margin-top: 8px; |
| | | font-size: 12px; |
| | | color: #909399; |
| | | } |
| | | </style> |
| | |
| | | topbarRouters:state => state.permission.topbarRouters, |
| | | defaultRoutes:state => state.permission.defaultRoutes, |
| | | sidebarRouters:state => state.permission.sidebarRouters, |
| | | |
| | | // ä¼å
æ§è¡ |
| | | bloodTypeOptions: state => [ |
| | | { |
| | | value: 0, |
| | | label: "è¯é³ä¼å
", |
| | | raw: { |
| | | cssClass: "", |
| | | listClass: "" |
| | | } |
| | | export default getters |
| | | }, |
| | | { |
| | | value: 1, |
| | | label: "æåä¼å
", |
| | | raw: { |
| | | cssClass: "", |
| | | listClass: "" |
| | | } |
| | | }, |
| | | { |
| | | value: 0, |
| | | label: "è¯é³ä¼å
", |
| | | raw: { |
| | | cssClass: "", |
| | | listClass: "" |
| | | } |
| | | }, |
| | | { |
| | | value: 1, |
| | | label: "æåä¼å
", |
| | | raw: { |
| | | cssClass: "", |
| | | listClass: "" |
| | | } |
| | | } |
| | | ] |
| | | }; |
| | | export default getters; |
| | |
| | | <span class="section-title">åºæ¬ä¿¡æ¯</span> |
| | | </div> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="æç®ç¼å·">{{ |
| | | caseData.donorNo |
| | | <el-descriptions-item label="æ¡ä¾ç¼å·">{{ |
| | | caseData.caseNo || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æç®è
å§å">{{ |
| | | caseData.donorName |
| | | caseData.name || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ§å«"> |
| | | <dict-tag :options="genderOptions" :value="caseData.gender" /> |
| | | <dict-tag |
| | | :options="dict.type.sys_user_sex" |
| | | :value="caseData.sex ? parseInt(caseData.sex) : ''" |
| | | /> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å¹´é¾" |
| | | >{{ caseData.age }}å²</el-descriptions-item |
| | | > |
| | | <el-descriptions-item label="å¹´é¾"> |
| | | {{ caseData.age || "-" |
| | | }}{{ |
| | | caseData.ageunit ? `(${getAgeUnitText(caseData.ageunit)})` : "" |
| | | }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¡å"> |
| | | <dict-tag :options="bloodTypeOptions" :value="caseData.bloodType" /> |
| | | <dict-tag |
| | | :options="dict.type.sys_BloodType" |
| | | :value="caseData.bloodType" |
| | | /> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="Rhé´æ§"> |
| | | {{ |
| | | caseData.rhYin === "1" ? "æ¯" : caseData.rhYin === "0" ? "å¦" : "-" |
| | | }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä»¶ç±»å"> |
| | | {{ getIdCardTypeText(caseData.idcardtype) }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä»¶å·ç ">{{ |
| | | caseData.idCardNo |
| | | caseData.idcardno || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ°æ">{{ |
| | | caseData.nation |
| | | caseData.nation || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="å½ç±">{{ |
| | | caseData.nationality || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç±è´¯">{{ |
| | | caseData.nativeplace || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="å¦å">{{ |
| | | caseData.education || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="èä¸">{{ |
| | | caseData.occupation || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="åºçæ¥æ">{{ |
| | | formatDate(caseData.birthday) |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="èç³»çµè¯">{{ |
| | | caseData.phone |
| | | caseData.phone || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ä½å" :span="2">{{ |
| | | caseData.address |
| | | }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | |
| | | <!-- å°åä¿¡æ¯æ¨¡å --> |
| | | <el-card class="detail-section"> |
| | | <div slot="header" class="section-header"> |
| | | <span class="section-title">å°åä¿¡æ¯</span> |
| | | </div> |
| | | <el-descriptions :column="1" border> |
| | | <el-descriptions-item label="æ·ç±å°å"> |
| | | {{ getFullRegisterAddress() }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="ç°ä½å°å"> |
| | | {{ getFullResidenceAddress() }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | |
| | |
| | | <span class="section-title">å»çä¿¡æ¯</span> |
| | | </div> |
| | | <el-descriptions :column="1" border> |
| | | <el-descriptions-item label="ç¾ç
è¯æ">{{ |
| | | caseData.diagnosis |
| | | <el-descriptions-item label="ç¾ç
è¯æåç§°">{{ |
| | | caseData.diagnosisname || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ä½é¢å·">{{ |
| | | caseData.inpatientNo |
| | | <el-descriptions-item label="ç
æ
æ¦åµ">{{ |
| | | caseData.illnessoverview || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æå¨ç§å®¤">{{ |
| | | caseData.departmentName |
| | | <el-descriptions-item label="ç
人ç¶åµ">{{ |
| | | caseData.patientstate || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="主治å»ç">{{ |
| | | caseData.doctorName |
| | | <el-descriptions-item label="GCSè¯å">{{ |
| | | caseData.gcsScore || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ä¼ æç
æ
åµ">{{ |
| | | caseData.infectiousDisease || "æ " |
| | | caseData.infectious || "æ " |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="å»çè®°å½">{{ |
| | | caseData.medicalRecord |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="ä¼ æç
å
¶ä»è¯´æ" |
| | | v-if="caseData.infectiousOther" |
| | | >{{ caseData.infectiousOther }}</el-descriptions-item |
| | | > |
| | | <el-descriptions-item label="æ¯å¦éè¦è½¬è¿"> |
| | | {{ caseData.isTransport === "2" ? "éè¦" : "ä¸éè¦" }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | |
| | |
| | | <span class="section-title">å»é¢ä¿¡æ¯</span> |
| | | </div> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="å»é¢åç§°">{{ |
| | | caseData.hospitalName |
| | | <el-descriptions-item label="æ²»çå»é¢åç§°">{{ |
| | | caseData.treatmenthospitalname || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="å»é¢çº§å«">{{ |
| | | caseData.hospitalLevel |
| | | <el-descriptions-item label="æ²»çç§å®¤åç§°">{{ |
| | | caseData.treatmentdeptname || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="è系人">{{ |
| | | caseData.contactPerson |
| | | <el-descriptions-item label="ä½é¢å·">{{ |
| | | caseData.inpatientno || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="èç³»çµè¯">{{ |
| | | caseData.contactPhone |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="å»é¢å°å" :span="2">{{ |
| | | caseData.hospitalAddress |
| | | <el-descriptions-item label="é¨é¨åç§°">{{ |
| | | caseData.deptName || "-" |
| | | }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | |
| | | <!-- éä»¶ä¿¡æ¯æ¨¡å --> |
| | | <!-- 䏿¥ä¿¡æ¯æ¨¡å --> |
| | | <el-card class="detail-section"> |
| | | <div slot="header" class="section-header"> |
| | | <span class="section-title">䏿¥ä¿¡æ¯</span> |
| | | </div> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="æ¥åè
å§å">{{ |
| | | caseData.infoName || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ¥åè
ç¼å·">{{ |
| | | caseData.infoNo || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ¥åè
èç³»çµè¯">{{ |
| | | caseData.reporterphone || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="åè°åå§å">{{ |
| | | caseData.coordinatorName || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="åè°åç¼å·">{{ |
| | | caseData.coordinatorNo || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="䏿¥ç¶æ"> |
| | | <el-tag :type="getStatusType(caseData.reportStatus)"> |
| | | {{ getStatusText(caseData.reportStatus) }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="æ¥åæ¶é´">{{ |
| | | formatDateTime(caseData.reporttime) |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ¯å¦ç»æ¢æ¡ä¾"> |
| | | {{ caseData.terminationCase === "1" ? "å·²ç»æ¢" : "è¿è¡ä¸" }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | |
| | | <!-- éä»¶ä¿¡æ¯æ¨¡å --> |
| | | <el-card class="detail-section" v-if="attachmentList.length > 0"> |
| | | <div slot="header" class="section-header"> |
| | | <span class="section-title">éä»¶ä¿¡æ¯</span> |
| | | <el-button type="text" icon="el-icon-upload" @click="handleUpload" |
| | | >ä¸ä¼ éä»¶</el-button |
| | | > |
| | | </div> |
| | | <el-table :data="attachmentList" style="width: 100%"> |
| | | <el-table-column label="æä»¶å" width="300"> |
| | |
| | | @click="handleDownload(scope.row)" |
| | | >ä¸è½½</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="danger" |
| | | @click="handleDelete(scope.row)" |
| | | >å é¤</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | |
| | | <!-- 审æ¹ä¿¡æ¯æ¨¡åï¼å¦æï¼ --> |
| | | <el-card class="detail-section" v-if="caseData.status !== '0'"> |
| | | <!-- 审æ¹ä¿¡æ¯æ¨¡åï¼ç¶æä¸ºå·²åææå·²é©³åæ¶æ¾ç¤ºï¼ --> |
| | | <el-card |
| | | class="detail-section" |
| | | v-if="caseData.reportStatus === '3' || caseData.reportStatus === '4'" |
| | | > |
| | | <div slot="header" class="section-header"> |
| | | <span class="section-title">审æ¹ä¿¡æ¯</span> |
| | | </div> |
| | | <el-descriptions :column="1" border> |
| | | <el-descriptions-item label="审æ¹ç»æ"> |
| | | <el-tag :type="caseData.status | statusFilter"> |
| | | {{ caseData.status | statusTextFilter }} |
| | | <el-tag :type="caseData.reportStatus === '3' ? 'success' : 'danger'"> |
| | | {{ caseData.reportStatus === "3" ? "å·²åæ" : "已驳å" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å®¡æ¹æ¶é´">{{ |
| | | caseData.approveTime |
| | | formatDateTime(caseData.updateTime) |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="审æ¹äºº">{{ |
| | | caseData.approverName |
| | | caseData.updateBy || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="å®¡æ¹æè§">{{ |
| | | caseData.approveOpinion |
| | | caseData.remark || "æ " |
| | | }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | |
| | | default: true |
| | | } |
| | | }, |
| | | dicts: ["sys_user_sex", "sys_BloodType"], |
| | | filters: { |
| | | statusFilter(status) { |
| | | const statusMap = { |
| | |
| | | }, |
| | | data() { |
| | | return { |
| | | activeTab: "basic", |
| | | genderOptions: [ |
| | | { value: "0", label: "ç·" }, |
| | | { value: "1", label: "女" } |
| | | ], |
| | | bloodTypeOptions: [ |
| | | { value: "A", label: "Aå" }, |
| | | { value: "B", label: "Bå" }, |
| | | { value: "O", label: "Oå" }, |
| | | { value: "AB", label: "ABå" } |
| | | ], |
| | | |
| | | // éä»¶ç¸å
³æ°æ® |
| | | attachmentList: [ |
| | | { |
| | | id: 1, |
| | | fileName: "æç®è
身份è¯.jpg", |
| | | fileType: "jpg", |
| | | fileSize: 1024000, |
| | | uploadTime: "2024-12-19 10:30:00", |
| | | fileUrl: "https://img95.699pic.com/photo/40142/8262.jpg_wh860.jpg" |
| | | }, |
| | | { |
| | | id: 2, |
| | | fileName: "å»çè¯æè¯æ.pdf", |
| | | fileType: "pdf", |
| | | fileSize: 2048000, |
| | | uploadTime: "2024-12-19 11:20:00", |
| | | fileUrl: |
| | | "http://192.168.100.10:8080/profile/upload/2025/12/19/(å´é¾8.7)æ¯æ¥å·¥ä½æ»ç»1766131266142.pdf" |
| | | }, |
| | | { |
| | | id: 3, |
| | | fileName: "æ£éªæ¥åå.jpg", |
| | | fileType: "docx", |
| | | fileSize: 512000, |
| | | uploadTime: "2024-12-19 14:15:00", |
| | | fileUrl: "https://img95.699pic.com/photo/40019/3490.jpg_wh860.jpg" |
| | | } |
| | | ], |
| | | |
| | | // PDFé¢è§ç¸å
³æ°æ® |
| | | // é¢è§ç¸å
³æ°æ®ï¼ä¿æåæä»£ç ï¼ |
| | | pdfPreviewVisible: false, |
| | | imagePreviewVisible: false, |
| | | unsupportedPreviewVisible: false, |
| | | pdfLoading: false, |
| | | pdfUrl: "", |
| | | currentPage: 1, |
| | | pageCount: 0, |
| | | scale: 100, |
| | | pageRotate: 0, |
| | | |
| | | // å¾çé¢è§ç¸å
³ |
| | | imagePreviewVisible: false, |
| | | |
| | | // 䏿¯æé¢è§ç¸å
³ |
| | | unsupportedPreviewVisible: false, |
| | | |
| | | // éç¨é¢è§æ°æ® |
| | | previewTitle: "", |
| | | previewUrl: "", |
| | | currentFile: null |
| | | currentFile: null, |
| | | |
| | | // éä»¶å表 |
| | | attachmentList: [] |
| | | }; |
| | | }, |
| | | watch: { |
| | | caseData: { |
| | | immediate: true, |
| | | handler(newVal) { |
| | | if (newVal && newVal.annexfilesList) { |
| | | this.loadAttachments(newVal.annexfilesList); |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | handleClose() { |
| | | this.$emit("close"); |
| | | }, |
| | | |
| | | // è·åæä»¶ç±»å |
| | | // å è½½éä»¶ |
| | | loadAttachments(annexfilesList) { |
| | | if (!annexfilesList || !Array.isArray(annexfilesList)) { |
| | | this.attachmentList = []; |
| | | return; |
| | | } |
| | | |
| | | this.attachmentList = annexfilesList.map((file, index) => ({ |
| | | id: index + 1, |
| | | fileName: file.fileName || `éä»¶${index + 1}`, |
| | | fileType: this.getFileExtension(file.fileUrl || ""), |
| | | fileSize: file.fileSize || 0, |
| | | uploadTime: file.uploadTime || this.formatDateTime(new Date()), |
| | | fileUrl: file.fileUrl || "" |
| | | })); |
| | | }, |
| | | |
| | | // è·åæä»¶æ©å±å |
| | | getFileExtension(filename) { |
| | | return ( |
| | | filename |
| | | .split(".") |
| | | .pop() |
| | | ?.toLowerCase() || "unknown" |
| | | ); |
| | | }, |
| | | |
| | | // æ ¼å¼åæ¥ææ¶é´ |
| | | formatDateTime(dateString) { |
| | | if (!dateString) return "-"; |
| | | return dateString.replace("T", " ").substring(0, 19); |
| | | }, |
| | | |
| | | // æ ¼å¼åæ¥æ |
| | | formatDate(dateString) { |
| | | if (!dateString) return "-"; |
| | | return dateString.split("T")[0]; |
| | | }, |
| | | |
| | | // è·å宿´æ·ç±å°å |
| | | getFullRegisterAddress() { |
| | | const { |
| | | registerprovincename, |
| | | registercityname, |
| | | registertownname, |
| | | registercommunityname, |
| | | registeraddress |
| | | } = this.caseData; |
| | | const addressParts = [ |
| | | registerprovincename, |
| | | registercityname, |
| | | registertownname, |
| | | registercommunityname, |
| | | registeraddress |
| | | ]; |
| | | return addressParts.filter(part => part).join("") || "-"; |
| | | }, |
| | | |
| | | // è·å宿´ç°ä½å°å |
| | | getFullResidenceAddress() { |
| | | const { |
| | | residenceprovincename, |
| | | residencecountyname, |
| | | residencetownname, |
| | | residencecommunityname, |
| | | residenceaddress |
| | | } = this.caseData; |
| | | const addressParts = [ |
| | | residenceprovincename, |
| | | residencecountyname, |
| | | residencetownname, |
| | | residencecommunityname, |
| | | residenceaddress |
| | | ]; |
| | | return addressParts.filter(part => part).join("") || "-"; |
| | | }, |
| | | |
| | | // è·åç¶æææ¬ |
| | | getStatusText(status) { |
| | | const statusMap = { |
| | | "1": "已䏿¥", |
| | | "2": "å·²é
读", |
| | | "3": "å·²åæ", |
| | | "4": "已驳å" |
| | | }; |
| | | return statusMap[status] || "æªç¥ç¶æ"; |
| | | }, |
| | | |
| | | // è·åç¶æç±»å |
| | | getStatusType(status) { |
| | | const statusMap = { |
| | | "1": "info", |
| | | "2": "warning", |
| | | "3": "success", |
| | | "4": "danger" |
| | | }; |
| | | return statusMap[status] || "info"; |
| | | }, |
| | | |
| | | // è·åå¹´é¾åä½ææ¬ |
| | | getAgeUnitText(unit) { |
| | | const unitMap = { |
| | | year: "å²", |
| | | month: "æ", |
| | | day: "天" |
| | | }; |
| | | return unitMap[unit] || unit; |
| | | }, |
| | | |
| | | // è·åè¯ä»¶ç±»åææ¬ |
| | | getIdCardTypeText(type) { |
| | | const typeMap = { |
| | | "1": "身份è¯", |
| | | "2": "æ¤ç
§", |
| | | "3": "åå®è¯" |
| | | }; |
| | | return typeMap[type] || type || "-"; |
| | | }, |
| | | |
| | | // æä»¶é¢è§ç¸å
³æ¹æ³ï¼ä¿æåæä»£ç ï¼ |
| | | getFileType(fileName) { |
| | | const extension = fileName |
| | | .split(".") |
| | |
| | | .toLowerCase(); |
| | | const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"]; |
| | | const pdfTypes = ["pdf"]; |
| | | |
| | | if (imageTypes.includes(extension)) return "image"; |
| | | if (pdfTypes.includes(extension)) return "pdf"; |
| | | return "other"; |
| | | }, |
| | | |
| | | // æä»¶é¢è§ä¸»å
¥å£ |
| | | handlePreview(file) { |
| | | this.currentFile = file; |
| | | this.previewTitle = `é¢è§ - ${file.fileName}`; |
| | |
| | | } |
| | | }, |
| | | |
| | | // PDFé¢è§æ¹æ³ |
| | | previewPdf(file) { |
| | | this.pdfPreviewVisible = true; |
| | | this.pdfLoading = true; |
| | |
| | | this.pdfUrl = file.fileUrl; |
| | | }, |
| | | |
| | | // PDFå è½½å®æåè° |
| | | loadPdfHandler() { |
| | | this.pdfLoading = false; |
| | | this.currentPage = 1; |
| | | }, |
| | | |
| | | // PDFå è½½é误å¤ç |
| | | pdfErrorHandler(error) { |
| | | console.error("PDFå 载失败:", error); |
| | | this.pdfLoading = false; |
| | |
| | | this.pdfPreviewVisible = false; |
| | | }, |
| | | |
| | | // 翻页åè½ |
| | | changePage(newPage) { |
| | | if (newPage < 1 || newPage > this.pageCount) return; |
| | | this.currentPage = newPage; |
| | | }, |
| | | |
| | | // 缩æ¾åè½ |
| | | zoomIn() { |
| | | if (this.scale >= 200) { |
| | | this.$message.info("å·²æ¾å¤§å°æå¤§æ¯ä¾"); |
| | | return; |
| | | } |
| | | if (this.scale >= 200) return; |
| | | this.scale += 10; |
| | | }, |
| | | |
| | | zoomOut() { |
| | | if (this.scale <= 50) { |
| | | this.$message.info("已缩å°å°æå°æ¯ä¾"); |
| | | return; |
| | | } |
| | | if (this.scale <= 50) return; |
| | | this.scale -= 10; |
| | | }, |
| | | |
| | |
| | | this.scale = 100; |
| | | }, |
| | | |
| | | // å¾çé¢è§æ¹æ³ |
| | | previewImage(file) { |
| | | this.imagePreviewVisible = true; |
| | | }, |
| | | |
| | | // 䏿¯æé¢è§çæä»¶ç±»å |
| | | previewUnsupported(file) { |
| | | this.unsupportedPreviewVisible = true; |
| | | }, |
| | | |
| | | // PDFå¯¹è¯æ¡å
³éå¤ç |
| | | handlePdfDialogClose() { |
| | | this.pdfUrl = ""; |
| | | this.currentPage = 1; |
| | | this.pageCount = 0; |
| | | }, |
| | | |
| | | // æä»¶ä¸è½½ |
| | | handleDownload(file) { |
| | | const link = document.createElement("a"); |
| | | link.href = file.fileUrl; |
| | |
| | | this.$message.success("å¼å§ä¸è½½æä»¶"); |
| | | }, |
| | | |
| | | // ä¸ç¨PDFä¸è½½æ¹æ³ |
| | | downloadPdf(file) { |
| | | this.handleDownload(file); |
| | | }, |
| | | |
| | | // æä»¶å é¤ |
| | | handleDelete(file) { |
| | | this.$confirm("ç¡®å®è¦å é¤è¿ä¸ªéä»¶åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }).then(() => { |
| | | this.attachmentList = this.attachmentList.filter( |
| | | item => item.id !== file.id |
| | | ); |
| | | this.$message.success("å 餿å"); |
| | | }); |
| | | }, |
| | | |
| | | // ä¸ä¼ éä»¶ |
| | | handleUpload() { |
| | | this.$message.info("ä¸ä¼ åè½å¾
å®ç°"); |
| | | }, |
| | | |
| | | // æ ¼å¼åæä»¶å¤§å° |
| | | formatFileSize(bytes) { |
| | | if (bytes === 0) return "0 B"; |
| | | const k = 1024; |
| | |
| | | :inline="true" |
| | | class="demo-form-inline" |
| | | > |
| | | <el-form-item label="æç®ç¼å·" prop="donorNo"> |
| | | <el-form-item label="æ¡ä¾ç¼å·" prop="caseNo"> |
| | | <el-input |
| | | v-model="queryParams.donorNo" |
| | | placeholder="请è¾å
¥æç®ç¼å·" |
| | | v-model="queryParams.caseNo" |
| | | placeholder="请è¾å
¥æ¡ä¾ç¼å·" |
| | | clearable |
| | | style="width: 200px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="æç®è
å§å" prop="donorName"> |
| | | <el-form-item label="æç®è
å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.donorName" |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | clearable |
| | | style="width: 200px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¡ä¾ç¶æ" prop="status"> |
| | | <el-form-item label="æ¡ä¾ç¶æ" prop="reportStatus"> |
| | | <el-select |
| | | v-model="queryParams.status" |
| | | v-model="queryParams.reportStatus" |
| | | placeholder="è¯·éæ©ç¶æ" |
| | | clearable |
| | | style="width: 200px" |
| | | > |
| | | <el-option label="å
¨é¨" value="" /> |
| | | <el-option label="å¾
审æ¹" value="0" /> |
| | | <el-option label="å·²éè¿" value="1" /> |
| | | <el-option label="å·²ç»æ¢" value="2" /> |
| | | <el-option label="å·²é
读" value="2" /> |
| | | <el-option label="å·²åæ" value="3" /> |
| | | <el-option label="已驳å" value="4" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | |
| | | |
| | | <!-- æä½æé®åºå --> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <!-- <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="el-icon-plus" @click="handleAdd" |
| | | >æ°å¢æ¡ä¾</el-button |
| | | > |
| | | </el-col> |
| | | </el-col> --> |
| | | |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | |
| | | @selection-change="handleSelectionChange" |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <!-- <el-table-column label="åºå·" type="index" width="60" align="center"/> |
| | | <el-table-column label="æç®ç¼å·" align="center" prop="donorNo" width="140"/> --> |
| | | <el-table-column |
| | | label="䏿¥æ¶é´" |
| | | align="center" |
| | | prop="reportTime" |
| | | prop="reporttime" |
| | | width="160" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="æç®è
å§å" |
| | | align="center" |
| | | prop="donorName" |
| | | prop="name" |
| | | width="100" |
| | | /> |
| | | <el-table-column label="æ§å«" align="center" prop="gender" width="80"> |
| | | <el-table-column label="æ§å«" align="center" prop="sex" width="80"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="genderOptions" :value="scope.row.gender" /> |
| | | <dict-tag |
| | | :options="dict.type.sys_user_sex" |
| | | :value="parseInt(scope.row.sex)" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¹´é¾" align="center" prop="age" width="80" /> |
| | | <el-table-column label="è¡å" align="center" prop="bloodType" width="80"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="bloodTypeOptions" :value="scope.row.bloodType" /> |
| | | <dict-tag |
| | | :options="dict.type.sys_BloodType" |
| | | :value="scope.row.bloodtype" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | |
| | | <el-table-column |
| | | label="ç¾ç
è¯æ" |
| | | align="center" |
| | | prop="diagnosis" |
| | | prop="diagnosisname" |
| | | min-width="200" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="䏿¥å»é¢" |
| | | label="æ²»çå»é¢" |
| | | align="center" |
| | | prop="hospitalName" |
| | | prop="treatmenthospitalname" |
| | | width="150" |
| | | /> |
| | | <el-table-column label="ç¶æ" align="center" prop="status" width="100"> |
| | | <el-table-column |
| | | label="ç¶æ" |
| | | align="center" |
| | | prop="reportStatus" |
| | | width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="scope.row.status | statusFilter"> |
| | | {{ scope.row.status | statusTextFilter }} |
| | | <el-tag :type="scope.row.reportStatus | statusFilter"> |
| | | {{ scope.row.reportStatus | statusTextFilter }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | type="text" |
| | | icon="el-icon-check" |
| | | @click="handleApprove(scope.row)" |
| | | v-if="scope.row.status === '0'" |
| | | v-if="scope.row.reportStatus === '2'" |
| | | >审æ¹</el-button |
| | | > |
| | | </template> |
| | |
| | | </el-dialog> |
| | | |
| | | <!-- 审æ¹å¼¹æ¡ --> |
| | | <!-- 审æ¹å¼¹æ¡ä¼å --> |
| | | <el-dialog |
| | | title="æ¡ä¾å®¡æ¹" |
| | | :visible.sync="approveOpen" |
| | |
| | | > |
| | | <el-form-item label="审æ¹ç»æ" prop="approveResult"> |
| | | <el-radio-group v-model="approveForm.approveResult"> |
| | | <el-radio label="1">éè¿</el-radio> |
| | | <el-radio label="2">ç»æ¢</el-radio> |
| | | <el-radio label="3">åæ</el-radio> |
| | | <el-radio label="4">驳å</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="å®¡æ¹æè§" prop="approveOpinion"> |
| | | <el-input |
| | | type="textarea" |
| | | v-model="approveForm.approveOpinion" |
| | | placeholder="请è¾å
¥è¯¦ç»çå®¡æ¹æè§ï¼å
æ¬éè¿æç»æ¢ççç±" |
| | | placeholder="请è¾å
¥è¯¦ç»çå®¡æ¹æè§ï¼å
æ¬éè¿æé©³åççç±" |
| | | :rows="6" |
| | | maxlength="500" |
| | | show-word-limit |
| | |
| | | |
| | | <script> |
| | | import CaseDetail from "./caseDetail"; |
| | | import CaseDetailPreview from "./CaseDetailPreview"; |
| | | import { |
| | | donateList, |
| | | donateInfo, |
| | | donateDel, |
| | | donateEdit |
| | | } from "@/api/businessApi/index"; |
| | | |
| | | export default { |
| | | name: "CaseList", |
| | | components: { CaseDetail, CaseDetailPreview }, |
| | | |
| | | components: { CaseDetail }, |
| | | dicts: ["sys_user_sex", "sys_BloodType"], |
| | | data() { |
| | | return { |
| | | // é®ç½©å± |
| | |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | donorNo: undefined, |
| | | donorName: undefined, |
| | | status: undefined |
| | | caseNo: undefined, |
| | | name: undefined, |
| | | reportStatus: undefined |
| | | }, |
| | | // 审æ¹è¡¨å |
| | | approveForm: { |
| | | caseId: null, |
| | | approveResult: "1", |
| | | id: null, |
| | | approveResult: "3", |
| | | approveOpinion: "" |
| | | }, |
| | | // 审æ¹è¡¨åéªè¯ |
| | |
| | | }; |
| | | }, |
| | | filters: { |
| | | statusFilter(status) { |
| | | statusFilter(reportStatus) { |
| | | const statusMap = { |
| | | "0": "warning", // å¾
å®¡æ¹ |
| | | "1": "success", // å·²éè¿ |
| | | "2": "danger" // å·²ç»æ¢ |
| | | "1": "info", // 已䏿¥ |
| | | "2": "warning", // å·²é
读ï¼å¾
审æ¹ï¼ |
| | | "3": "success", // å·²åæ |
| | | "4": "danger" // 已驳å |
| | | }; |
| | | return statusMap[status]; |
| | | return statusMap[reportStatus] || "info"; |
| | | }, |
| | | statusTextFilter(status) { |
| | | statusTextFilter(reportStatus) { |
| | | const statusMap = { |
| | | "0": "å¾
审æ¹", |
| | | "1": "å·²éè¿", |
| | | "2": "å·²ç»æ¢" |
| | | "1": "已䏿¥", |
| | | "2": "å·²é
读", |
| | | "3": "å·²åæ", |
| | | "4": "已驳å" |
| | | }; |
| | | return statusMap[status]; |
| | | return statusMap[reportStatus] || "æªç¥ç¶æ"; |
| | | } |
| | | }, |
| | | created() { |
| | |
| | | }, |
| | | methods: { |
| | | /** æ¥è¯¢æ¡ä¾å表 */ |
| | | getList() { |
| | | async getList() { |
| | | this.loading = true; |
| | | // 模æAPIè°ç¨å»¶è¿ |
| | | setTimeout(() => { |
| | | // æµè¯æ°æ® |
| | | this.caseList = [ |
| | | try { |
| | | const response = await donateList(this.queryParams); |
| | | this.caseList = response.rows || response.data || []; |
| | | this.total = response.total || this.caseList.length; |
| | | } catch (error) { |
| | | console.error("è·åæ¡ä¾å表失败:", error); |
| | | this.$modal.msgError("è·åæ¡ä¾å表失败"); |
| | | // æ¨¡ææ°æ® |
| | | this.caseList = this.getMockData(); |
| | | this.total = this.caseList.length; |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | |
| | | /** æ¨¡ææ°æ® */ |
| | | getMockData() { |
| | | return [ |
| | | { |
| | | id: 1, |
| | | donorNo: "DON20241219001", |
| | | donorName: "å¼ ä¸", |
| | | gender: "2", |
| | | caseNo: "DON20241219001", |
| | | name: "å¼ ä¸", |
| | | sex: "0", |
| | | age: 38, |
| | | bloodType: "A", |
| | | gscScore:'1', |
| | | diagnosis: |
| | | gscScore: "1", |
| | | diagnosisname: |
| | | "èå¤ä¼¤å¯¼è´èæ»äº¡ï¼ç»æ¢ææ æå®£å¸èæ»äº¡ãå®¶å±åæå¨å®æç®ã", |
| | | hospitalName: "éå²å¤§å¦éå±å»é¢", |
| | | status: "0", |
| | | reportTime: "2024-12-19 09:30:00", |
| | | reporterName: "æå»ç", |
| | | idCardNo: "370203198510123456", |
| | | treatmenthospitalname: "éå²å¤§å¦éå±å»é¢", |
| | | reportStatus: "2", |
| | | reporttime: "2024-12-19 09:30:00", |
| | | reportername: "æå»ç", |
| | | idcardno: "370203198510123456", |
| | | nation: "æ±æ", |
| | | phone: "13800138000", |
| | | address: "å±±ä¸çéå²å¸å¸ååºé¦æ¸¯ä¸è·¯100å·", |
| | | inpatientNo: "ZY20241219001", |
| | | departmentName: "ç¥ç»å¤ç§", |
| | | doctorName: "ç主任", |
| | | infectiousDisease: "æ ", |
| | | medicalRecord: |
| | | registeraddress: "å±±ä¸çéå²å¸å¸ååºé¦æ¸¯ä¸è·¯100å·", |
| | | inpatientno: "ZY20241219001", |
| | | treatmentdeptname: "ç¥ç»å¤ç§", |
| | | doctorname: "ç主任", |
| | | infectious: "æ ", |
| | | illnessoverview: |
| | | "æ£è
å 交éäºæ
导è´ä¸¥éèå¤ä¼¤ï¼ç»æ¢ææ æå®£å¸èæ»äº¡ã", |
| | | hospitalLevel: "ä¸çº§ç²ç", |
| | | contactPerson: "å¼ æ¤å£«", |
| | | contactPhone: "13900139000", |
| | | contactperson: "å¼ æ¤å£«", |
| | | contactphone: "13900139000", |
| | | hospitalAddress: "å±±ä¸çéå²å¸å¸ååºæ±èè·¯1å·" |
| | | }, |
| | | { |
| | | id: 2, |
| | | donorNo: "DON20241218001", |
| | | donorName: "æå", |
| | | gender: "1", |
| | | caseNo: "DON20241218001", |
| | | name: "æå", |
| | | sex: "0", |
| | | age: 45, |
| | | bloodType: "O", |
| | | gscScore:'3', |
| | | diagnosis: "æ¥æ§å¿èæ¢æ»ï¼å¿èåè½è¡°ç«", |
| | | hospitalName: "éå²å¸ç«å»é¢", |
| | | status: "1", |
| | | reportTime: "2024-12-18 14:20:00", |
| | | approveTime: "2024-12-18 16:30:00", |
| | | reporterName: "åå»ç", |
| | | approverName: "å®¡æ ¸ä¸åA", |
| | | approveOpinion: "èµæé½å
¨ï¼ç¬¦åæç®æ¡ä»¶ï¼åæéè¿ã" |
| | | }, |
| | | { |
| | | id: 3, |
| | | donorNo: "DON20241217001", |
| | | donorName: "çäº", |
| | | gender: "2", |
| | | age: 52, |
| | | bloodType: "B", |
| | | gscScore:'6', |
| | | diagnosis: "é¢
å
åºè¡ï¼èå¹²åè½ä¸§å¤±", |
| | | hospitalName: "éå²ç¼ç§å»é¢", |
| | | status: "2", |
| | | reportTime: "2024-12-17 10:15:00", |
| | | approveTime: "2024-12-17 14:20:00", |
| | | reporterName: "éå»ç", |
| | | approverName: "å®¡æ ¸ä¸åB", |
| | | approveOpinion: "å®¶å±åæä¹¦ä¸å®æ´ï¼éè¡¥å
ææåéæ°æäº¤ã" |
| | | }, |
| | | { |
| | | id: 4, |
| | | donorNo: "DON20241216001", |
| | | donorName: "èµµå
", |
| | | gender: "1", |
| | | age: 28, |
| | | bloodType: "AB", |
| | | gscScore:'10', |
| | | diagnosis: "éåé¢
èæä¼¤ï¼å¤å¨å®åè½è¡°ç«", |
| | | hospitalName: "éå²å¿ç«¥å»é¢", |
| | | status: "0", |
| | | reportTime: "2024-12-16 16:45:00", |
| | | reporterName: "åå»ç" |
| | | gscScore: "3", |
| | | diagnosisname: "æ¥æ§å¿èæ¢æ»ï¼å¿èåè½è¡°ç«", |
| | | treatmenthospitalname: "éå²å¸ç«å»é¢", |
| | | reportStatus: "3", |
| | | reporttime: "2024-12-18 14:20:00", |
| | | approvetime: "2024-12-18 16:30:00", |
| | | reportername: "åå»ç", |
| | | approvername: "å®¡æ ¸ä¸åA", |
| | | approveopinion: "èµæé½å
¨ï¼ç¬¦åæç®æ¡ä»¶ï¼åæéè¿ã" |
| | | } |
| | | ]; |
| | | this.total = this.caseList.length; |
| | | this.loading = false; |
| | | }, 500); |
| | | }, |
| | | |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map(item => item.id); |
| | | this.single = selection.length !== 1; |
| | | this.multiple = !selection.length; |
| | | }, |
| | | |
| | | /** æç´¢æé®æä½ */ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | |
| | | /** éç½®æé®æä½ */ |
| | | resetQuery() { |
| | | this.resetForm("queryForm"); |
| | | this.handleQuery(); |
| | | }, |
| | | |
| | | /** 详æ
æé®æä½ */ |
| | | handleDetail(row) { |
| | | this.currentCase = row; |
| | | this.detailTitle = `æ¡ä¾è¯¦æ
- ${row.donorNo}`; |
| | | async handleDetail(row) { |
| | | try { |
| | | // å
è·åæ¡ä¾è¯¦æ
|
| | | const response = await donateInfo(row.id); |
| | | this.currentCase = response.data || response || row; |
| | | |
| | | // å¦æç¶ææ¯"已䏿¥"(1)ï¼å使ç¨å®æ´æ°æ®æ´æ°ä¸º"å·²é
读"(2) |
| | | if (this.currentCase.reportStatus === "1") { |
| | | try { |
| | | // 使ç¨å®æ´çæ¡ä¾æ°æ®ä½ä¸ºæ´æ°åºç¡ï¼ç¡®ä¿ææå段é½è¢«ä¿ç |
| | | const updateData = { |
| | | ...this.currentCase, // å±å¼ææç°æå段 |
| | | reportStatus: "2", // æ´æ°ç¶æä¸ºå·²é
读 |
| | | updateTime: new Date() |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19), |
| | | updateBy: "å½åç¨æ·" // æ·»å æ´æ°äººä¿¡æ¯ |
| | | }; |
| | | |
| | | await donateEdit(updateData); |
| | | |
| | | // æ´æ°æ¬å°æ°æ®åå½åæ¾ç¤ºçæ°æ® |
| | | this.currentCase.reportStatus = "2"; |
| | | this.currentCase.updateTime = updateData.updateTime; |
| | | row.reportStatus = "2"; // æ´æ°å表ä¸çç¶æ |
| | | |
| | | this.$modal.msgSuccess("ç¶æå·²æ´æ°ä¸ºå·²é
读"); |
| | | } catch (updateError) { |
| | | console.error("ç¶ææ´æ°å¤±è´¥:", updateError); |
| | | this.$modal.msgError("ç¶ææ´æ°å¤±è´¥ï¼ä½å°ç»§ç»æ¾ç¤ºè¯¦æ
"); |
| | | // æ´æ°å¤±è´¥æ¶ï¼ç»§ç»ä½¿ç¨åå§ç¶ææ¾ç¤ºè¯¦æ
|
| | | } |
| | | } |
| | | |
| | | this.detailTitle = `æ¡ä¾è¯¦æ
- ${this.currentCase.caseNo || |
| | | row.caseNo}`; |
| | | this.detailOpen = true; |
| | | }, |
| | | // å¨ç¶ç»ä»¶ä¸æ´æ°å®¡æ¹æ¹æ³ |
| | | handleApprove(row) { |
| | | } catch (error) { |
| | | console.error("è·åæ¡ä¾è¯¦æ
失败:", error); |
| | | // 妿è·å详æ
失败ï¼ä½¿ç¨è¡æ°æ®ä½ä¸ºåå¤ |
| | | this.currentCase = row; |
| | | this.approveForm.caseId = row.id; |
| | | this.approveForm.approveResult = "1"; |
| | | this.detailTitle = `æ¡ä¾è¯¦æ
- ${row.caseNo}`; |
| | | this.detailOpen = true; |
| | | |
| | | // å³ä½¿è·å详æ
失败ï¼ä¹å°è¯æ´æ°ç¶æï¼ä½¿ç¨è¡æ°æ®ï¼ |
| | | if (row.reportStatus === "1") { |
| | | try { |
| | | const updateData = { |
| | | id: row.id, |
| | | reportStatus: "2", |
| | | updateTime: new Date() |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19), |
| | | updateBy: "å½åç¨æ·" |
| | | // 注æï¼è¿éåªè½ä¼ éé¨ååæ®µï¼å 为详æ
è·åå¤±è´¥äº |
| | | }; |
| | | |
| | | await donateEdit(updateData); |
| | | row.reportStatus = "2"; |
| | | this.currentCase.reportStatus = "2"; |
| | | this.$modal.msgSuccess("ç¶æå·²æ´æ°ä¸ºå·²é
读"); |
| | | } catch (updateError) { |
| | | console.error("ç¶ææ´æ°å¤±è´¥:", updateError); |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | |
| | | /** å®¡æ¹æé®æä½ */ |
| | | async handleApprove(row) { |
| | | try { |
| | | // å
è·åæ¡ä¾è¯¦æ
æ°æ®ï¼ç¡®ä¿æå®æ´æ°æ® |
| | | const response = await donateInfo(row.id); |
| | | this.currentCase = response.data || response || row; |
| | | |
| | | this.approveForm.id = row.id; |
| | | this.approveForm.approveResult = "3"; |
| | | this.approveForm.approveOpinion = ""; |
| | | |
| | | this.$nextTick(() => { |
| | | if (this.$refs.approveForm) { |
| | | this.$refs.approveForm.clearValidate(); |
| | | } |
| | | }); |
| | | |
| | | this.approveOpen = true; |
| | | } catch (error) { |
| | | console.error("è·åæ¡ä¾è¯¦æ
失败:", error); |
| | | // 妿è·å详æ
失败ï¼ä½¿ç¨è¡æ°æ®ä½ä¸ºåå¤ |
| | | this.currentCase = row; |
| | | this.approveForm.id = row.id; |
| | | this.approveForm.approveResult = "3"; |
| | | this.approveForm.approveOpinion = ""; |
| | | this.approveOpen = true; |
| | | this.$modal.msgError("è·å详æ
失败ï¼ä½å·²æå¼å®¡æ¹çªå£"); |
| | | } |
| | | }, |
| | | |
| | | /** æäº¤å®¡æ¹ */ |
| | | submitApprove() { |
| | | this.$refs["approveForm"].validate(valid => { |
| | | async submitApprove() { |
| | | try { |
| | | const valid = await this.$refs.approveForm.validate(); |
| | | if (valid) { |
| | | // 模æå®¡æ¹æäº¤ |
| | | // 使ç¨å®æ´çæ¡ä¾æ°æ®ä½ä¸ºåºç¡ï¼ç¡®ä¿ææå段é½è¢«ä¿ç |
| | | const approveData = { |
| | | ...this.currentCase, // å±å¼ææç°æå段 |
| | | reportStatus: this.approveForm.approveResult, |
| | | approveOpinion: this.approveForm.approveOpinion, |
| | | approvername: "å½åç¨æ·", // å®é
项ç®ä¸åºè¯¥è·åå½åç»å½ç¨æ· |
| | | approvetime: new Date() |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19), |
| | | updateTime: new Date() |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19), |
| | | updateBy: "å½åç¨æ·" |
| | | }; |
| | | |
| | | // ç§»é¤å¯è½ä¸éè¦çåæ®µï¼æ ¹æ®å®é
APIéæ±è°æ´ï¼ |
| | | delete approveData.createTime; // å建æ¶é´ä¸åºè¢«æ´æ° |
| | | delete approveData.createBy; // å建人ä¸åºå |
| | | |
| | | await donateEdit(approveData); |
| | | this.$modal.msgSuccess("å®¡æ¹æå"); |
| | | this.approveOpen = false; |
| | | // æ´æ°æ¡ä¾ç¶æ |
| | | const caseItem = this.caseList.find( |
| | | item => item.id === this.approveForm.caseId |
| | | ); |
| | | if (caseItem) { |
| | | caseItem.status = this.approveForm.approveResult; |
| | | caseItem.approveTime = new Date().toLocaleString(); |
| | | caseItem.approverName = "å½åç¨æ·"; |
| | | caseItem.approveOpinion = this.approveForm.approveOpinion; |
| | | this.getList(); // éæ°å è½½å表 |
| | | } |
| | | } catch (error) { |
| | | console.error("审æ¹å¤±è´¥:", error); |
| | | if (error !== "cancel") { |
| | | this.$modal.msgError("审æ¹å¤±è´¥"); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | /** æ°å¢æé®æä½ */ |
| | | handleAdd() { |
| | | this.$router.push("/case/add"); |
| | | }, |
| | | |
| | | /** å é¤æé®æä½ */ |
| | | handleDelete(row) { |
| | | async handleDelete(row) { |
| | | const ids = row.id || this.ids; |
| | | this.$modal |
| | | .confirm('æ¯å¦ç¡®è®¤å é¤ä½é¢å·ä¸º"' + ids + '"çæ°æ®é¡¹ï¼') |
| | | .then(() => { |
| | | // 模æå é¤æä½ |
| | | this.caseList = this.caseList.filter(item => !ids.includes(item.id)); |
| | | this.total = this.caseList.length; |
| | | try { |
| | | await this.$modal.confirm( |
| | | 'æ¯å¦ç¡®è®¤å 餿¡ä¾ç¼å·ä¸º"' + ids + '"çæ°æ®é¡¹ï¼' |
| | | ); |
| | | await donateDel(ids); |
| | | this.$modal.msgSuccess("å 餿å"); |
| | | }) |
| | | .catch(() => {}); |
| | | this.getList(); |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | console.error("å é¤å¤±è´¥:", error); |
| | | this.$modal.msgError("å é¤å¤±è´¥"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }; |
| | |
| | | <el-option label="æªå®ææç®" value="5" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å½å
¥æ¶é´" prop="recordTimeRange"> |
| | | <el-form-item label="æ¡£æ¡å½å
¥æ¶é´" prop="recordTimeRange"> |
| | | <el-date-picker |
| | | v-model="queryParams.recordTimeRange" |
| | | type="daterange" |
| | |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | <!-- <el-table-column |
| | | label="æ¤çæ ¸æ¥è¡¨å½å
¥æ¶é´" |
| | | align="center" |
| | | prop="lastRecordTime" |
| | |
| | | : "-" |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> --> |
| | | <el-table-column |
| | | label="åè°å" |
| | | align="center" |
| | |
| | | :close-on-click-modal="false" |
| | | @close="handleClose" |
| | | > |
| | | <el-form ref="editForm" :model="formData" :rules="formRules" label-width="120px"> |
| | | <el-form |
| | | ref="editForm" |
| | | :model="formData" |
| | | :rules="formRules" |
| | | label-width="120px" |
| | | > |
| | | <!-- åºç¡ä¿¡æ¯ --> |
| | | <el-card class="form-section" shadow="never"> |
| | | <div slot="header" class="section-header"> |
| | |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="转è¿åå·" prop="id"> |
| | | <el-input v-model="formData.id" :disabled="isEdit" placeholder="ç³»ç»èªå¨çæ" /> |
| | | <el-form-item label="转è¿åå·" prop="reportId"> |
| | | <el-input |
| | | v-model="formData.reportId" |
| | | :disabled="isEdit" |
| | | placeholder="ç³»ç»èªå¨çæ" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ä½é¢å·" prop="caseNo"> |
| | | <el-input v-model="formData.caseNo" placeholder="请è¾å
¥ä½é¢å·" /> |
| | | <el-form-item label="æ¡ä¾ç¼å·" prop="caseNo"> |
| | | <el-input |
| | | v-model="formData.caseNo" |
| | | placeholder="请è¾å
¥æ¡ä¾ç¼å·" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æç®è
å§å" prop="donorName"> |
| | | <el-input v-model="formData.donorName" placeholder="请è¾å
¥æç®è
å§å" /> |
| | | <el-form-item label="æ£è
å§å" prop="patName"> |
| | | <el-input |
| | | v-model="formData.patName" |
| | | placeholder="请è¾å
¥æ£è
å§å" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ§å«" prop="gender"> |
| | | <el-select v-model="formData.gender" placeholder="è¯·éæ©æ§å«" style="width: 100%"> |
| | | <el-option label="ç·" value="ç·" /> |
| | | <el-option label="女" value="女" /> |
| | | <el-form-item label="æ§å«" prop="sex"> |
| | | <el-select |
| | | v-model="formData.sex" |
| | | placeholder="è¯·éæ©æ§å«" |
| | | style="width: 100%" |
| | | > |
| | | <el-option label="ç·" value="1" /> |
| | | <el-option label="女" value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç¾ç
è¯æ" prop="diagnosis"> |
| | | <el-input v-model="formData.diagnosis" placeholder="请è¾å
¥ç¾ç
è¯æ" /> |
| | | <el-form-item label="ç¾ç
è¯æ" prop="diagnosisname"> |
| | | <el-input |
| | | v-model="formData.diagnosisname" |
| | | placeholder="请è¾å
¥ç¾ç
è¯æåç§°" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-card> |
| | | |
| | | <!-- å»é¢ä¿¡æ¯ --> |
| | | <el-card class="form-section" shadow="never"> |
| | | <div slot="header" class="section-header"> |
| | | <i class="el-icon-office-building" style="color: #67C23A; margin-right: 8px;"></i> |
| | | <span>å»é¢ä¿¡æ¯</span> |
| | | </div> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ²»çå»é¢" prop="treatmentHospitalName"> |
| | | <el-input |
| | | v-model="formData.treatmentHospitalName" |
| | | placeholder="请è¾å
¥æ²»çå»é¢åç§°" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ²»çç§å®¤" prop="treatmentDeptName"> |
| | | <el-input |
| | | v-model="formData.treatmentDeptName" |
| | | placeholder="请è¾å
¥æ²»çç§å®¤åç§°" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | <!-- 转è¿ä¿¡æ¯ --> |
| | | <el-card class="form-section" shadow="never"> |
| | | <div slot="header" class="section-header"> |
| | | <i class="el-icon-location-information" style="color: #67C23A; margin-right: 8px;"></i> |
| | | <i class="el-icon-location-information" style="color: #E6A23C; margin-right: 8px;"></i> |
| | | <span>转è¿ä¿¡æ¯</span> |
| | | </div> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="åºåå»é¢" prop="hospitalName"> |
| | | <el-input v-model="formData.hospitalName" placeholder="请è¾å
¥åºåå»é¢" /> |
| | | <el-form-item label="åºåå°ç¹" prop="transportStartPlace"> |
| | | <el-input |
| | | v-model="formData.transportStartPlace" |
| | | placeholder="请è¾å
¥åºåå°ç¹" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç®çå»é¢" prop="destinationHospital"> |
| | | <el-input v-model="formData.destinationHospital" placeholder="请è¾å
¥ç®çå»é¢" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="计åè½¬è¿æ¶é´" prop="transportTime"> |
| | | <el-form-item label="åºåæ¶é´" prop="transportStartTime"> |
| | | <el-date-picker |
| | | v-model="formData.transportTime" |
| | | v-model="formData.transportStartTime" |
| | | type="datetime" |
| | | placeholder="éæ©è½¬è¿æ¶é´" |
| | | placeholder="éæ©åºåæ¶é´" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è´è´£åè°å" prop="coordinator"> |
| | | <el-input v-model="formData.coordinator" placeholder="请è¾å
¥åè°åå§å" /> |
| | | <el-form-item label="转è¿ç¶æ" prop="transitStatus"> |
| | | <el-select |
| | | v-model="formData.transitStatus" |
| | | placeholder="è¯·éæ©è½¬è¿ç¶æ" |
| | | style="width: 100%" |
| | | > |
| | | <el-option label="å¾
转è¿" :value="1" /> |
| | | <el-option label="转è¿ä¸" :value="2" /> |
| | | <el-option label="转è¿å®æ" :value="3" /> |
| | | <el-option label="转è¿åæ¶" :value="4" /> |
| | | <el-option label="æå" :value="5" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è´è´£åè°å" prop="contactPerson"> |
| | | <el-input |
| | | v-model="formData.contactPerson" |
| | | placeholder="请è¾å
¥åè°åå§å" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-form-item label="åºåå°ç¹" prop="departureLocation"> |
| | | <el-input v-model="formData.departureLocation" placeholder="请è¾å
¥è¯¦ç»åºåå°ç¹" /> |
| | | </el-form-item> |
| | | </el-card> |
| | | |
| | | <!-- å¢éæå --> |
| | | <!-- 廿¤äººåä¿¡æ¯ --> |
| | | <el-card class="form-section" shadow="never"> |
| | | <div slot="header" class="section-header"> |
| | | <i class="el-icon-user" style="color: #E6A23C; margin-right: 8px;"></i> |
| | | <span>å¢éæå</span> |
| | | <i class="el-icon-user" style="color: #F56C6C; margin-right: 8px;"></i> |
| | | <span>廿¤äººåä¿¡æ¯</span> |
| | | </div> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ¥è¯ç§å»ç" prop="emergencyDoctor"> |
| | | <el-input v-model="formData.emergencyDoctor" placeholder="请è¾å
¥æ¥è¯ç§å»ç" /> |
| | | <el-form-item label="æ¥è¯ç§å»ç" prop="doctor"> |
| | | <el-input |
| | | v-model="formData.doctor" |
| | | placeholder="请è¾å
¥æ¥è¯ç§å»ç" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å»ççµè¯" prop="doctorPhone"> |
| | | <el-input |
| | | v-model="formData.doctorPhone" |
| | | placeholder="请è¾å
¥å»çææºå·" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ¤å£«" prop="nurse"> |
| | | <el-input v-model="formData.nurse" placeholder="请è¾å
¥æ¤å£«å§å" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ¤å£«çµè¯" prop="nursePhone"> |
| | | <el-input |
| | | v-model="formData.nursePhone" |
| | | placeholder="请è¾å
¥æ¤å£«ææºå·" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="叿º" prop="driver"> |
| | | <el-input v-model="formData.driver" placeholder="请è¾å
¥å¸æºå§å" /> |
| | | <el-form-item label="驾驶å" prop="driver"> |
| | | <el-input |
| | | v-model="formData.driver" |
| | | placeholder="请è¾å
¥é©¾é©¶åå§å" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="驾驶åçµè¯" prop="driverPhone"> |
| | | <el-input |
| | | v-model="formData.driverPhone" |
| | | placeholder="请è¾å
¥é©¾é©¶åææºå·" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ICUè¯ä¼°å»ç" prop="icuDoctor"> |
| | | <el-input v-model="formData.icuDoctor" placeholder="请è¾å
¥ICUå»ç" /> |
| | | <el-input |
| | | v-model="formData.icuDoctor" |
| | | placeholder="请è¾å
¥ICUè¯ä¼°å»ç" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ICUå»ççµè¯" prop="icuDoctorPhone"> |
| | | <el-input |
| | | v-model="formData.icuDoctorPhone" |
| | | placeholder="请è¾å
¥ICUå»çææºå·" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-card> |
| | | |
| | | <!-- éä»¶ä¿¡æ¯ --> |
| | | <el-card class="form-section" shadow="never"> |
| | | <div slot="header" class="section-header"> |
| | | <i class="el-icon-folder" style="color: #909399; margin-right: 8px;"></i> |
| | | <span>éä»¶ä¿¡æ¯</span> |
| | | </div> |
| | | |
| | | <div class="attachment-section"> |
| | | <div class="attachment-header"> |
| | | <i class="el-icon-paperclip"></i> |
| | | <span class="attachment-title">éä»¶ä¸ä¼ </span> |
| | | <span class="attachment-tip">æ¯æä¸ä¼ æ£éªæ¥ååçæä»¶ (æå¤{{ attachmentLimit }}个)</span> |
| | | </div> |
| | | |
| | | <!-- ä½¿ç¨ UploadAttachment ç»ä»¶ --> |
| | | <UploadAttachment |
| | | ref="uploadAttachment" |
| | | :file-list="attachmentFileList" |
| | | :limit="attachmentLimit" |
| | | :accept="attachmentAccept" |
| | | @change="handleAttachmentChange" |
| | | @upload-success="handleUploadSuccess" |
| | | @upload-error="handleUploadError" |
| | | @remove="handleAttachmentRemove" |
| | | /> |
| | | </div> |
| | | |
| | | <!-- éä»¶å表 --> |
| | | <div class="attachment-list" v-if="formData.annexfilesList && formData.annexfilesList.length > 0"> |
| | | <div class="list-title">å·²ä¸ä¼ éä»¶ ({{ formData.annexfilesList.length }})</div> |
| | | <el-table :data="formData.annexfilesList" style="width: 100%" size="small"> |
| | | <el-table-column label="æä»¶å" min-width="200"> |
| | | <template slot-scope="scope"> |
| | | <i class="el-icon-document" style="margin-right: 8px; color: #409EFF;"></i> |
| | | <span class="file-name">{{ scope.row.fileName }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä»¶ç±»å" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-tag size="small">{{ getFileType(scope.row.fileName) }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å建æ¶é´" width="160"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatDateTime(scope.row.createTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" width="180"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="primary" |
| | | @click="handlePreview(scope.row)" |
| | | > |
| | | é¢è§ |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="success" |
| | | @click="handleDownload(scope.row)" |
| | | > |
| | | ä¸è½½ |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="danger" |
| | | @click="handleRemoveAttachment(scope.$index)" |
| | | > |
| | | å é¤ |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </el-card> |
| | | |
| | | <!-- 夿³¨ä¿¡æ¯ --> |
| | | <el-card class="form-section" shadow="never"> |
| | | <div slot="header" class="section-header"> |
| | | <i class="el-icon-edit" style="color: #909399; margin-right: 8px;"></i> |
| | | <i class="el-icon-edit" style="color: #409EFF; margin-right: 8px;"></i> |
| | | <span>夿³¨ä¿¡æ¯</span> |
| | | </div> |
| | | <el-form-item prop="remarks"> |
| | | <el-form-item prop="remark"> |
| | | <el-input |
| | | v-model="formData.remarks" |
| | | v-model="formData.remark" |
| | | type="textarea" |
| | | :rows="4" |
| | | placeholder="请è¾å
¥è½¬è¿å¤æ³¨ä¿¡æ¯" |
| | | placeholder="请è¾å
¥å¤æ³¨ä¿¡æ¯" |
| | | maxlength="500" |
| | | show-word-limit |
| | | /> |
| | |
| | | <el-button @click="handleClose">åæ¶</el-button> |
| | | <el-button type="primary" :loading="saveLoading" @click="handleSave">ä¿å</el-button> |
| | | </div> |
| | | |
| | | <!-- æä»¶é¢è§å¼¹çª --> |
| | | <FilePreviewDialog |
| | | :visible="previewVisible" |
| | | :file="currentPreviewFile" |
| | | @close="previewVisible = false" |
| | | @download="handleDownload" |
| | | /> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | import { transportAdd, transportEdit } from "@/api/businessApi/index"; |
| | | import UploadAttachment from "@/components/UploadAttachment"; |
| | | import FilePreviewDialog from "@/components/FilePreviewDialog"; |
| | | import dayjs from "dayjs"; |
| | | |
| | | export default { |
| | | name: "TransportEdit", |
| | | components: { |
| | | UploadAttachment, |
| | | FilePreviewDialog |
| | | }, |
| | | props: { |
| | | editOpen: { |
| | | type: Boolean, |
| | |
| | | data() { |
| | | return { |
| | | saveLoading: false, |
| | | // é¢è§ç¸å
³ |
| | | previewVisible: false, |
| | | currentPreviewFile: null, |
| | | // éä»¶ç¸å
³é
ç½® |
| | | attachmentLimit: 10, |
| | | attachmentAccept: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx", |
| | | attachmentFileList: [], |
| | | // è¡¨åæ°æ® |
| | | formData: this.getDefaultFormData(), |
| | | formRules: { |
| | | caseNo: [ |
| | | { required: true, message: '请è¾å
¥ä½é¢å·', trigger: 'blur' } |
| | | { required: true, message: "请è¾å
¥æ¡ä¾ç¼å·", trigger: "blur" } |
| | | ], |
| | | donorName: [ |
| | | { required: true, message: '请è¾å
¥æç®è
å§å', trigger: 'blur' } |
| | | patName: [ |
| | | { required: true, message: "请è¾å
¥æ£è
å§å", trigger: "blur" } |
| | | ], |
| | | gender: [ |
| | | { required: true, message: 'è¯·éæ©æ§å«', trigger: 'change' } |
| | | sex: [{ required: true, message: "è¯·éæ©æ§å«", trigger: "change" }], |
| | | age: [{ required: true, message: "请è¾å
¥å¹´é¾", trigger: "blur" }], |
| | | diagnosisname: [ |
| | | { required: true, message: "请è¾å
¥ç¾ç
è¯æåç§°", trigger: "blur" } |
| | | ], |
| | | age: [ |
| | | { required: true, message: '请è¾å
¥å¹´é¾', trigger: 'blur' } |
| | | treatmentHospitalName: [ |
| | | { required: true, message: "请è¾å
¥æ²»çå»é¢åç§°", trigger: "blur" } |
| | | ], |
| | | diagnosis: [ |
| | | { required: true, message: '请è¾å
¥ç¾ç
è¯æ', trigger: 'blur' } |
| | | transportStartPlace: [ |
| | | { required: true, message: "请è¾å
¥åºåå°ç¹", trigger: "blur" } |
| | | ], |
| | | hospitalName: [ |
| | | { required: true, message: '请è¾å
¥åºåå»é¢', trigger: 'blur' } |
| | | transportStartTime: [ |
| | | { required: true, message: "è¯·éæ©åºåæ¶é´", trigger: "change" } |
| | | ], |
| | | destinationHospital: [ |
| | | { required: true, message: '请è¾å
¥ç®çå»é¢', trigger: 'blur' } |
| | | ], |
| | | transportTime: [ |
| | | { required: true, message: 'è¯·éæ©è½¬è¿æ¶é´', trigger: 'change' } |
| | | ], |
| | | coordinator: [ |
| | | { required: true, message: '请è¾å
¥è´è´£åè°å', trigger: 'blur' } |
| | | contactPerson: [ |
| | | { required: true, message: "请è¾å
¥è´è´£åè°å", trigger: "blur" } |
| | | ] |
| | | } |
| | | }; |
| | |
| | | watch: { |
| | | editOpen(val) { |
| | | if (val) { |
| | | this.formData = this.isEdit ? |
| | | { ...this.transportData } : |
| | | this.getDefaultFormData(); |
| | | this.formData = this.isEdit |
| | | ? { ...this.getDefaultFormData(), ...this.transportData } |
| | | : this.getDefaultFormData(); |
| | | |
| | | this.initAttachmentList(); |
| | | |
| | | this.$nextTick(() => { |
| | | this.$refs.editForm && this.$refs.editForm.clearValidate(); |
| | |
| | | } |
| | | }, |
| | | methods: { |
| | | /** è·åé»è®¤è¡¨åæ°æ® */ |
| | | getDefaultFormData() { |
| | | return { |
| | | id: '', |
| | | caseNo: '', |
| | | donorName: '', |
| | | gender: '', |
| | | age: null, |
| | | diagnosis: '', |
| | | hospitalName: '', |
| | | destinationHospital: '', |
| | | transportTime: '', |
| | | coordinator: '', |
| | | departureLocation: '', |
| | | emergencyDoctor: '', |
| | | nurse: '', |
| | | driver: '', |
| | | icuDoctor: '', |
| | | remarks: '', |
| | | status: 'pending', |
| | | statusText: 'å¾
åºå' |
| | | id: undefined, |
| | | reportId: undefined, |
| | | caseNo: undefined, |
| | | patName: undefined, |
| | | sex: undefined, |
| | | age: undefined, |
| | | diagnosisname: undefined, |
| | | treatmentHospitalName: undefined, |
| | | treatmentDeptName: undefined, |
| | | transportStartPlace: undefined, |
| | | transportStartTime: undefined, |
| | | contactPerson: undefined, |
| | | transitStatus: 1, |
| | | doctor: undefined, |
| | | doctorPhone: undefined, |
| | | nurse: undefined, |
| | | nursePhone: undefined, |
| | | driver: undefined, |
| | | driverPhone: undefined, |
| | | icuDoctor: undefined, |
| | | icuDoctorPhone: undefined, |
| | | annexfilesList: [], |
| | | remark: undefined, |
| | | createBy: undefined, |
| | | createTime: undefined, |
| | | updateBy: undefined, |
| | | updateTime: undefined, |
| | | delFlag: 0 |
| | | }; |
| | | }, |
| | | |
| | | /** åå§åéä»¶å表 */ |
| | | initAttachmentList() { |
| | | if (this.isEdit && this.transportData.annexfilesList) { |
| | | this.formData.annexfilesList = [...this.transportData.annexfilesList]; |
| | | this.attachmentFileList = this.transportData.annexfilesList.map(item => ({ |
| | | uid: item.id || Math.random(), |
| | | name: item.fileName, |
| | | url: item.path || item.fileUrl, |
| | | status: 'success' |
| | | })); |
| | | } else { |
| | | this.formData.annexfilesList = []; |
| | | this.attachmentFileList = []; |
| | | } |
| | | }, |
| | | |
| | | /** éä»¶ååå¤ç */ |
| | | handleAttachmentChange(fileList) { |
| | | this.attachmentFileList = fileList; |
| | | }, |
| | | |
| | | /** éä»¶ç§»é¤å¤ç */ |
| | | handleAttachmentRemove(file) { |
| | | if (file.url) { |
| | | const index = this.formData.annexfilesList.findIndex(item => |
| | | item.path === file.url || item.fileUrl === file.url |
| | | ); |
| | | if (index > -1) { |
| | | this.formData.annexfilesList.splice(index, 1); |
| | | } |
| | | } |
| | | }, |
| | | |
| | | /** æå¨å é¤éä»¶ */ |
| | | handleRemoveAttachment(index) { |
| | | this.formData.annexfilesList.splice(index, 1); |
| | | this.attachmentFileList.splice(index, 1); |
| | | this.$message.success('éä»¶å 餿å'); |
| | | }, |
| | | |
| | | /** ä¸ä¼ æåå¤ç */ |
| | | handleUploadSuccess({ file, fileList, response }) { |
| | | if (response.code === 200) { |
| | | const attachmentObj = { |
| | | fileName: file.name, |
| | | path: response.data || file.url, |
| | | fileUrl: response.data || file.url, |
| | | type: this.getFileExtension(file.name), |
| | | createTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), |
| | | transportId: this.formData.id, |
| | | delFlag: 0, |
| | | caseNo:this.formData.caseNo |
| | | }; |
| | | |
| | | this.formData.annexfilesList.push(attachmentObj); |
| | | this.$message.success('æä»¶ä¸ä¼ æå'); |
| | | } |
| | | }, |
| | | |
| | | /** ä¸ä¼ é误å¤ç */ |
| | | handleUploadError({ file, fileList, error }) { |
| | | console.error('éä»¶ä¸ä¼ 失败:', error); |
| | | this.$message.error('æä»¶ä¸ä¼ 失败ï¼è¯·éè¯'); |
| | | }, |
| | | |
| | | /** æä»¶é¢è§ */ |
| | | handlePreview(file) { |
| | | this.currentPreviewFile = { |
| | | fileName: file.fileName, |
| | | fileUrl: file.path || file.fileUrl, |
| | | fileType: this.getFileType(file.fileName) |
| | | }; |
| | | this.previewVisible = true; |
| | | }, |
| | | |
| | | /** æä»¶ä¸è½½ */ |
| | | handleDownload(file) { |
| | | const fileUrl = file.path || file.fileUrl; |
| | | const fileName = file.fileName; |
| | | |
| | | if (fileUrl) { |
| | | const link = document.createElement('a'); |
| | | link.href = fileUrl; |
| | | link.download = fileName; |
| | | link.style.display = 'none'; |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | document.body.removeChild(link); |
| | | this.$message.success('å¼å§ä¸è½½æä»¶'); |
| | | } else { |
| | | this.$message.warning('æä»¶è·¯å¾ä¸åå¨ï¼æ æ³ä¸è½½'); |
| | | } |
| | | }, |
| | | |
| | | /** è·åæä»¶ç±»å */ |
| | | getFileType(fileName) { |
| | | if (!fileName) return 'other'; |
| | | |
| | | const extension = fileName.split('.').pop().toLowerCase(); |
| | | const imageTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']; |
| | | const pdfTypes = ['pdf']; |
| | | const officeTypes = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx']; |
| | | |
| | | if (imageTypes.includes(extension)) return 'image'; |
| | | if (pdfTypes.includes(extension)) return 'pdf'; |
| | | if (officeTypes.includes(extension)) return 'office'; |
| | | return 'other'; |
| | | }, |
| | | |
| | | /** è·åæä»¶æ©å±å */ |
| | | getFileExtension(filename) { |
| | | return filename.split('.').pop().toLowerCase(); |
| | | }, |
| | | |
| | | /** æ¥ææ¶é´æ ¼å¼å */ |
| | | formatDateTime(dateTime) { |
| | | if (!dateTime) return ''; |
| | | |
| | | try { |
| | | const date = new Date(dateTime); |
| | | if (isNaN(date.getTime())) return dateTime; |
| | | |
| | | const year = date.getFullYear(); |
| | | const month = String(date.getMonth() + 1).padStart(2, '0'); |
| | | const day = String(date.getDate()).padStart(2, '0'); |
| | | const hours = String(date.getHours()).padStart(2, '0'); |
| | | const minutes = String(date.getMinutes()).padStart(2, '0'); |
| | | const seconds = String(date.getSeconds()).padStart(2, '0'); |
| | | |
| | | return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; |
| | | } catch (error) { |
| | | return dateTime; |
| | | } |
| | | }, |
| | | |
| | | handleClose() { |
| | | this.$emit('update:editOpen', false); |
| | | this.$emit('close'); |
| | | this.$emit("update:editOpen", false); |
| | | this.$emit("close"); |
| | | this.previewVisible = false; |
| | | }, |
| | | |
| | | async handleSave() { |
| | |
| | | const valid = await this.$refs.editForm.validate(); |
| | | if (!valid) return; |
| | | |
| | | const pendingFiles = this.attachmentFileList.filter(item => item.status !== 'success'); |
| | | if (pendingFiles.length > 0) { |
| | | this.$message.warning('è¿ææä»¶æªä¸ä¼ 宿ï¼è¯·å
ä¸ä¼ æææä»¶æç§»é¤æªä¸ä¼ çæä»¶'); |
| | | return; |
| | | } |
| | | |
| | | this.saveLoading = true; |
| | | |
| | | // 模æAPIè°ç¨ |
| | | await new Promise(resolve => setTimeout(resolve, 1000)); |
| | | const requestData = { ...this.formData }; |
| | | let response; |
| | | |
| | | this.$message.success(this.isEdit ? 'ä¿®æ¹æå' : 'æ°å»ºæå'); |
| | | if (this.isEdit) { |
| | | response = await transportEdit(requestData); |
| | | } else { |
| | | response = await transportAdd(requestData); |
| | | } |
| | | |
| | | if (response.code === 200) { |
| | | this.$message.success(this.isEdit ? "ä¿®æ¹æå" : "æ°å»ºæå"); |
| | | this.handleClose(); |
| | | this.$emit('save-success'); |
| | | |
| | | this.$emit("save-success"); |
| | | } else { |
| | | this.$message.error(response.msg || "æä½å¤±è´¥"); |
| | | } |
| | | } catch (error) { |
| | | console.error('ä¿å失败:', error); |
| | | this.$message.error('æä½å¤±è´¥'); |
| | | console.error("ä¿å失败:", error); |
| | | this.$message.error("æä½å¤±è´¥ï¼è¯·ç¨åéè¯"); |
| | | } finally { |
| | | this.saveLoading = false; |
| | | } |
| | |
| | | padding: 20px 0 0; |
| | | } |
| | | |
| | | .attachment-section { |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | .attachment-header { |
| | | display: flex; |
| | | align-items: center; |
| | | margin-bottom: 16px; |
| | | padding: 8px 0; |
| | | border-bottom: 1px solid #ebeef5; |
| | | } |
| | | |
| | | .attachment-title { |
| | | font-weight: bold; |
| | | margin: 0 8px; |
| | | } |
| | | |
| | | .attachment-tip { |
| | | font-size: 12px; |
| | | color: #909399; |
| | | } |
| | | |
| | | .attachment-list { |
| | | margin-top: 16px; |
| | | } |
| | | |
| | | .list-title { |
| | | font-weight: bold; |
| | | margin-bottom: 12px; |
| | | color: #303133; |
| | | } |
| | | |
| | | .file-name { |
| | | font-size: 13px; |
| | | } |
| | | |
| | | .file-path { |
| | | font-size: 12px; |
| | | color: #909399; |
| | | } |
| | | |
| | | ::v-deep .el-card__header { |
| | | background: #f5f7fa; |
| | | border-bottom: 1px solid #ebeef5; |
| | |
| | | :inline="true" |
| | | label-width="80px" |
| | | > |
| | | <el-form-item label="转è¿åå·" prop="transportNo"> |
| | | <el-input |
| | | v-model="queryParams.transportNo" |
| | | placeholder="请è¾å
¥è½¬è¿åå·" |
| | | clearable |
| | | style="width: 200px" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ä½é¢å·" prop="caseNo"> |
| | | <el-form-item label="æ¡ä¾ç¼å·" prop="caseNo"> |
| | | <el-input |
| | | v-model="queryParams.caseNo" |
| | | placeholder="请è¾å
¥ä½é¢å·" |
| | | placeholder="请è¾å
¥æ¡ä¾ç¼å·" |
| | | clearable |
| | | style="width: 200px" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="æç®è
å§å" prop="donorName"> |
| | | <el-form-item label="æ£è
å§å" prop="patName"> |
| | | <el-input |
| | | v-model="queryParams.donorName" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | v-model="queryParams.patName" |
| | | placeholder="请è¾å
¥æ£è
å§å" |
| | | clearable |
| | | style="width: 200px" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="转è¿ç¶æ" prop="status"> |
| | | <el-form-item label="转è¿ç¶æ" prop="transitStatus"> |
| | | <el-select |
| | | v-model="queryParams.status" |
| | | v-model="queryParams.transitStatus" |
| | | placeholder="转è¿ç¶æ" |
| | | clearable |
| | | style="width: 200px" |
| | | > |
| | | <el-option label="å
¨é¨" value="" /> |
| | | <el-option label="å¾
åºå" value="pending" /> |
| | | <el-option label="转è¿ä¸" value="transporting" /> |
| | | <el-option label="已宿" value="completed" /> |
| | | <el-option label="已忶" value="cancelled" /> |
| | | <el-option label="å¾
转è¿" :value="1" /> |
| | | <el-option label="转è¿ä¸" :value="2" /> |
| | | <el-option label="转è¿å®æ" :value="3" /> |
| | | <el-option label="转è¿åæ¶" :value="4" /> |
| | | <el-option label="æå" :value="5" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´"> |
| | |
| | | ></right-toolbar> |
| | | </el-row> |
| | | |
| | | <!-- æ°æ®è¡¨æ ¼ --> |
| | | <!-- æ°æ®è¡¨æ ¼ - ç´æ¥ä½¿ç¨å端è¿åçæ°æ®ç»æ --> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="transportList" |
| | |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="åºå·" type="index" width="60" align="center" /> |
| | | <el-table-column label="转è¿åå·" align="center" prop="id" width="140" /> |
| | | <el-table-column |
| | | label="ä½é¢å·" |
| | | label="转è¿åå·" |
| | | align="center" |
| | | prop="reportId" |
| | | width="140" |
| | | /> |
| | | <el-table-column |
| | | label="æ¡ä¾ç¼å·" |
| | | align="center" |
| | | prop="caseNo" |
| | | width="140" |
| | | /> |
| | | <el-table-column label="æç®è
ä¿¡æ¯" align="center" width="180"> |
| | | <el-table-column label="æ£è
ä¿¡æ¯" align="center" width="260"> |
| | | <template slot-scope="scope"> |
| | | <div class="donor-info"> |
| | | <div class="donor-name">{{ scope.row.donorName }}</div> |
| | | <div class="donor-name">{{ scope.row.patName }}</div> |
| | | <div class="donor-details"> |
| | | {{ scope.row.gender }} | {{ scope.row.age }}å² |
| | | <dict-tag |
| | | :options="dict.type.sys_user_sex" |
| | | :value="parseInt(scope.row.sex)" |
| | | /> |
| | | | {{ scope.row.age }}å² |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | <el-table-column |
| | | label="ç¾ç
è¯æ" |
| | | align="center" |
| | | prop="diagnosis" |
| | | prop="diagnosisname" |
| | | min-width="200" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="å»çæºæ" |
| | | label="æ²»çå»é¢" |
| | | align="center" |
| | | prop="hospitalName" |
| | | prop="treatmentHospitalName" |
| | | width="150" |
| | | /> |
| | | <el-table-column |
| | | label="计åè½¬è¿æ¶é´" |
| | | align="center" |
| | | prop="transportTime" |
| | | prop="transportStartTime" |
| | | width="160" |
| | | /> |
| | | <el-table-column |
| | | label="è´è´£åè°å" |
| | | align="center" |
| | | prop="coordinator" |
| | | prop="contactPerson" |
| | | width="100" |
| | | /> |
| | | <el-table-column |
| | | label="转è¿ç¶æ" |
| | | align="center" |
| | | prop="status" |
| | | prop="transitStatus" |
| | | width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="scope.row.status | statusFilter"> |
| | | {{ scope.row.statusText }} |
| | | <el-tag :type="getStatusTagType(scope.row.transitStatus)"> |
| | | {{ getStatusText(scope.row.transitStatus) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | type="text" |
| | | icon="el-icon-video-play" |
| | | @click="handleStartTransport(scope.row)" |
| | | v-if="scope.row.status === 'pending'" |
| | | v-if="scope.row.transitStatus === 1" |
| | | >å¼å§è½¬è¿</el-button |
| | | > |
| | | <el-button |
| | |
| | | type="text" |
| | | icon="el-icon-check" |
| | | @click="handleCompleteTransport(scope.row)" |
| | | v-if="scope.row.status === 'transporting'" |
| | | v-if="scope.row.transitStatus === 2" |
| | | >å®æè½¬è¿</el-button |
| | | > |
| | | </template> |
| | |
| | | append-to-body |
| | | > |
| | | <div class="action-confirm"> |
| | | <p>ç¡®å®è¦{{ actionText }}转è¿å "{{ currentTransport.id }}" åï¼</p> |
| | | <p> |
| | | ç¡®å®è¦{{ actionText }}转è¿å "{{ |
| | | currentTransport.reportId || currentTransport.id |
| | | }}" åï¼ |
| | | </p> |
| | | </div> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="actionOpen = false">å æ¶</el-button> |
| | |
| | | |
| | | <script> |
| | | import { |
| | | listTransport, |
| | | getTransport, |
| | | delTransport, |
| | | updateTransportStatus |
| | | } from "@/api/system/business"; |
| | | transportList, |
| | | transportAdd, |
| | | transportEdit, |
| | | transportDelete, |
| | | transportInfo |
| | | } from "@/api/businessApi/index"; |
| | | import TransportDetail from "./transportDetail"; |
| | | import TransportEdit from "./TransportEdit"; |
| | | |
| | | export default { |
| | | name: "TransportList", |
| | | components: { TransportDetail, TransportEdit }, |
| | | dicts: ["sys_user_sex", "sys_BloodType"], |
| | | data() { |
| | | return { |
| | | // é®ç½©å± |
| | |
| | | showSearch: true, |
| | | // æ»æ¡æ° |
| | | total: 0, |
| | | // 转è¿åè¡¨æ ¼æ°æ® |
| | | // 转è¿åè¡¨æ ¼æ°æ® - ç´æ¥ä½¿ç¨å端è¿åçæ°æ®ç»æ |
| | | transportList: [], |
| | | // 详æ
å¼¹æ¡æ¯å¦æ¾ç¤º |
| | | detailOpen: false, |
| | |
| | | pendingTransports: 0, |
| | | completedTransports: 0 |
| | | }, |
| | | // æ¥è¯¢åæ° |
| | | // æ¥è¯¢åæ°ï¼å®å
¨éé
å端æ¥å£ï¼ |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | transportNo: undefined, |
| | | caseNo: undefined, |
| | | donorName: undefined, |
| | | status: undefined |
| | | caseNo: undefined, // æ¡ä¾ç¼å· |
| | | patName: undefined, // æ£è
å§å |
| | | transitStatus: undefined, // 转è¿ç¶æï¼1å¾
è½¬è¿ 2转è¿ä¸ 3转è¿å®æ 4转è¿åæ¶ 5æå |
| | | searchValue: undefined, // æç´¢å¼ |
| | | params: {} // å
¶ä»åæ°å¯¹è±¡ |
| | | } |
| | | }; |
| | | }, |
| | | filters: { |
| | | statusFilter(status) { |
| | | const statusMap = { |
| | | pending: "warning", |
| | | transporting: "primary", |
| | | completed: "success", |
| | | cancelled: "danger" |
| | | }; |
| | | return statusMap[status]; |
| | | } |
| | | }, |
| | | created() { |
| | | this.getList(); |
| | | }, |
| | | methods: { |
| | | /** æ¥è¯¢è½¬è¿åå表 */ |
| | | getList() { |
| | | /** æ¥è¯¢è½¬è¿åå表 - ç´æ¥ä½¿ç¨åç«¯æ°æ®ç»æ */ |
| | | async getList() { |
| | | this.loading = true; |
| | | // 模æAPIè°ç¨å»¶è¿ |
| | | setTimeout(() => { |
| | | // æµè¯æ°æ® |
| | | this.transportList = [ |
| | | { |
| | | id: "T20241217001", |
| | | caseNo: "DON20241216001", |
| | | donorName: "å¼ ä¸", |
| | | gender: "ç·", |
| | | age: 38, |
| | | diagnosis: |
| | | "èå¤ä¼¤å¯¼è´èæ»äº¡ï¼ç»æ¢ææ æå®£å¸èæ»äº¡ãå®¶å±åæå¨å®æç®ã", |
| | | hospitalName: "éå²éæ¹å»é¢", |
| | | transportTime: "2024-12-17 14:30:00", |
| | | coordinator: "å¼ å»ç", |
| | | createTime: "2024-12-16 09:30:00", |
| | | status: "pending", |
| | | statusText: "å¾
åºå", |
| | | departureLocation: "éå²å¸ç«å»é¢æ¥è¯ç§", |
| | | destinationHospital: "éå²éæ¹å»é¢", |
| | | emergencyDoctor: "çå»ç", |
| | | nurse: "ææ¤å£«", |
| | | driver: "åå¸å
", |
| | | icuDoctor: "èµµå»ç", |
| | | contacts: [ |
| | | { role: "åè°åçµè¯", phone: "13800138000" }, |
| | | { role: "æ¥è¯å»ççµè¯", phone: "13800138001" }, |
| | | { role: "æ¤å£«çµè¯", phone: "13800138002" }, |
| | | { role: "叿ºçµè¯", phone: "13800138003" }, |
| | | { role: "ICUå»ççµè¯", phone: "13800138004" } |
| | | ], |
| | | remarks: "éè¦åå¤å¼å¸æºçæ¥æè®¾å¤" |
| | | }, |
| | | { |
| | | id: "T20241217002", |
| | | caseNo: "DON20241216002", |
| | | donorName: "æå", |
| | | gender: "女", |
| | | age: 45, |
| | | diagnosis: "èæ¢æ»ï¼èå¹²åè½ä¸§å¤±", |
| | | hospitalName: "éå²å¤§å¦éå±å»é¢", |
| | | transportTime: "2024-12-17 16:00:00", |
| | | coordinator: "æå»ç", |
| | | createTime: "2024-12-16 11:20:00", |
| | | status: "transporting", |
| | | statusText: "转è¿ä¸", |
| | | departureLocation: "éå²å¤§å¦éå±å»é¢ICU", |
| | | destinationHospital: "éå²å¨å®ç§»æ¤ä¸å¿", |
| | | currentLocation: "éå²å¸ååºé¦æ¸¯ä¸è·¯", |
| | | estimatedTime: "30åé" |
| | | }, |
| | | { |
| | | id: "T20241216003", |
| | | caseNo: "DON20241215001", |
| | | donorName: "çäº", |
| | | gender: "ç·", |
| | | age: 52, |
| | | diagnosis: "å¿è骤åï¼å¤å¨å®åè½è¡°ç«", |
| | | hospitalName: "éå²å¸ç«å»é¢", |
| | | transportTime: "2024-12-16 10:15:00", |
| | | coordinator: "çå»ç", |
| | | createTime: "2024-12-15 14:45:00", |
| | | status: "completed", |
| | | statusText: "已宿", |
| | | departureLocation: "éå²å¸ç«å»é¢å¿å
ç§", |
| | | destinationHospital: "éå²å¨å®ç§»æ¤ä¸å¿", |
| | | completedTime: "2024-12-16 12:30:00", |
| | | distance: "15å
Ž", |
| | | duration: "2å°æ¶15åé" |
| | | }, |
| | | { |
| | | id: "T20241216004", |
| | | caseNo: "DON20241214001", |
| | | donorName: "èµµå
", |
| | | gender: "女", |
| | | age: 29, |
| | | diagnosis: "æ¥æ§èè¡°ç«", |
| | | hospitalName: "éå²ç§å¤§å»é¢", |
| | | transportTime: "2024-12-16 08:30:00", |
| | | coordinator: "èµµå»ç", |
| | | createTime: "2024-12-14 16:20:00", |
| | | status: "cancelled", |
| | | statusText: "已忶", |
| | | cancelReason: "å®¶å±ä¸´æ¶æ¹åå³å®" |
| | | |
| | | try { |
| | | // æå»ºç¬¦åå端æ¥å£ç请æ±åæ° [1,2](@ref) |
| | | const requestParams = { |
| | | pageNum: this.queryParams.pageNum, |
| | | pageSize: this.queryParams.pageSize, |
| | | caseNo: this.queryParams.caseNo, |
| | | patName: this.queryParams.patName, |
| | | transitStatus: this.queryParams.transitStatus, |
| | | searchValue: this.queryParams.searchValue |
| | | }; |
| | | |
| | | // å¤çæ¶é´èå´åæ° [5](@ref) |
| | | if (this.dateRange && this.dateRange.length === 2) { |
| | | requestParams.transportStartTime = this.dateRange.join(","); |
| | | } |
| | | ]; |
| | | |
| | | // è°ç¨æ£å¼æ¥å£ [3](@ref) |
| | | const response = await transportList(requestParams); |
| | | |
| | | if (response.code === 200) { |
| | | // ç´æ¥ä½¿ç¨å端è¿åçæ°æ®ç»æï¼ä¸è¿è¡è½¬æ¢ [8](@ref) |
| | | this.transportList = response.rows || response.data || []; |
| | | this.total = response.total || 0; |
| | | |
| | | // æ´æ°ç»è®¡æ°æ® |
| | | this.updateStats(); |
| | | this.total = this.transportList.length; |
| | | } else { |
| | | this.$modal.msgError(response.msg || "è·å转è¿åå表失败"); |
| | | } |
| | | } catch (error) { |
| | | console.error("è·å转è¿åå表失败:", error); |
| | | this.$modal.msgError("ç½ç»è¯·æ±å¤±è´¥ï¼è¯·ç¨åéè¯"); |
| | | } finally { |
| | | this.loading = false; |
| | | }, 500); |
| | | } |
| | | }, |
| | | |
| | | /** è·åç¶ææ ç¾ç±»å */ |
| | | getStatusTagType(transitStatus) { |
| | | const statusMap = { |
| | | 1: "warning", // å¾
è½¬è¿ |
| | | 2: "primary", // 转è¿ä¸ |
| | | 3: "success", // 转è¿å®æ |
| | | 4: "danger", // 转è¿åæ¶ |
| | | 5: "info" // æå |
| | | }; |
| | | return statusMap[transitStatus] || "info"; |
| | | }, |
| | | |
| | | /** è·åç¶æææ¬ */ |
| | | getStatusText(transitStatus) { |
| | | const statusMap = { |
| | | 1: "å¾
转è¿", |
| | | 2: "转è¿ä¸", |
| | | 3: "转è¿å®æ", |
| | | 4: "转è¿åæ¶", |
| | | 5: "æå" |
| | | }; |
| | | return statusMap[transitStatus] || "æªç¥ç¶æ"; |
| | | }, |
| | | |
| | | // æ´æ°ç»è®¡æ°æ® |
| | | updateStats() { |
| | | this.stats.totalTransports = this.transportList.length; |
| | | this.stats.pendingTransports = this.transportList.filter( |
| | | item => item.status === "pending" |
| | | item => item.transitStatus === 1 |
| | | ).length; |
| | | this.stats.completedTransports = this.transportList.filter( |
| | | item => item.status === "completed" |
| | | item => item.transitStatus === 3 |
| | | ).length; |
| | | }, |
| | | |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map(item => item.id); |
| | | this.ids = selection.map(item => item.reportId || item.id); |
| | | this.single = selection.length !== 1; |
| | | this.multiple = !selection.length; |
| | | }, |
| | |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | |
| | | /** éç½®æé®æä½ */ |
| | | resetQuery() { |
| | | this.dateRange = []; |
| | | this.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | caseNo: undefined, |
| | | patName: undefined, |
| | | transitStatus: undefined, |
| | | searchValue: undefined |
| | | }; |
| | | this.getList(); |
| | | }, |
| | | |
| | | /** 详æ
æé®æä½ */ |
| | | handleDetail(row) { |
| | | this.currentTransport = row; |
| | | this.detailTitle = `转è¿å详æ
- ${row.reportId || row.id}`; |
| | | this.detailOpen = true; |
| | | }, |
| | | |
| | | /** ä¿®æ¹æé®æä½ */ |
| | | handleUpdate(row) { |
| | | this.currentTransport = row || {}; |
| | |
| | | handleSaveSuccess() { |
| | | this.getList(); // éæ°å è½½å表 |
| | | }, |
| | | /** éç½®æé®æä½ */ |
| | | resetQuery() { |
| | | this.dateRange = []; |
| | | this.resetForm("queryForm"); |
| | | this.handleQuery(); |
| | | }, |
| | | |
| | | /** 详æ
æé®æä½ */ |
| | | handleDetail(row) { |
| | | this.currentTransport = row; |
| | | this.detailTitle = `转è¿å详æ
- ${row.id}`; |
| | | this.detailOpen = true; |
| | | }, |
| | | |
| | | /** å¼å§è½¬è¿æä½ */ |
| | | handleStartTransport(row) { |
| | | async handleStartTransport(row) { |
| | | this.currentTransport = row; |
| | | this.actionTitle = "å¼å§è½¬è¿"; |
| | | this.actionText = "å¼å§"; |
| | |
| | | }, |
| | | |
| | | /** å®æè½¬è¿æä½ */ |
| | | handleCompleteTransport(row) { |
| | | async handleCompleteTransport(row) { |
| | | this.currentTransport = row; |
| | | this.actionTitle = "å®æè½¬è¿"; |
| | | this.actionText = "宿"; |
| | | this.actionOpen = true; |
| | | }, |
| | | |
| | | /** 确认æä½ */ |
| | | confirmAction() { |
| | | const index = this.transportList.findIndex( |
| | | item => item.id === this.currentTransport.id |
| | | ); |
| | | if (index !== -1) { |
| | | /** 确认æä½ - 使ç¨å端åå§æ°æ®ç»æ [4](@ref) */ |
| | | async confirmAction() { |
| | | try { |
| | | let requestData = { |
| | | id: this.currentTransport.id || this.currentTransport.reportId |
| | | }; |
| | | |
| | | if (this.actionText === "å¼å§") { |
| | | this.transportList[index].status = "transporting"; |
| | | this.transportList[index].statusText = "转è¿ä¸"; |
| | | requestData.transitStatus = 2; // 设置为转è¿ä¸ |
| | | } else if (this.actionText === "宿") { |
| | | this.transportList[index].status = "completed"; |
| | | this.transportList[index].statusText = "已宿"; |
| | | this.transportList[index].completedTime = new Date().toLocaleString(); |
| | | requestData.transitStatus = 3; // 设置为转è¿å®æ |
| | | } |
| | | |
| | | // æ´æ°ç»è®¡æ°æ® |
| | | this.updateStats(); |
| | | // ç´æ¥ä¼ éå端éè¦çåæ° [8](@ref) |
| | | const response = await transportEdit(requestData); |
| | | |
| | | this.$modal.msgSuccess(`${this.actionText}æå`); |
| | | if (response.code === 200) { |
| | | this.$modal.msgSuccess(`${this.actionText}è½¬è¿æå`); |
| | | this.getList(); // å·æ°å表 |
| | | } else { |
| | | this.$modal.msgError(response.msg || `${this.actionText}转è¿å¤±è´¥`); |
| | | } |
| | | } catch (error) { |
| | | console.error(`${this.actionText}转è¿å¤±è´¥:`, error); |
| | | this.$modal.msgError("æä½å¤±è´¥ï¼è¯·ç¨åéè¯"); |
| | | } |
| | | this.actionOpen = false; |
| | | }, |
| | | |
| | | /** å é¤æé®æä½ - 使ç¨å端åå§ID [1](@ref) */ |
| | | async handleDelete(row) { |
| | | const ids = row.reportId || row.id || this.ids; |
| | | |
| | | |
| | | |
| | | |
| | | /** å é¤æé®æä½ */ |
| | | handleDelete(row) { |
| | | const ids = row.id || this.ids; |
| | | this.$modal |
| | | .confirm('æ¯å¦ç¡®è®¤å é¤è½¬è¿åç¼å·ä¸º"' + ids + '"çæ°æ®é¡¹ï¼') |
| | | .then(() => { |
| | | // 模æå é¤æä½ |
| | | this.transportList = this.transportList.filter( |
| | | item => !ids.includes(item.id) |
| | | try { |
| | | await this.$modal.confirm( |
| | | 'æ¯å¦ç¡®è®¤å é¤è½¬è¿åç¼å·ä¸º"' + ids + '"çæ°æ®é¡¹ï¼' |
| | | ); |
| | | this.total = this.transportList.length; |
| | | this.updateStats(); |
| | | |
| | | const response = await transportDelete(ids); |
| | | |
| | | if (response.code === 200) { |
| | | this.$modal.msgSuccess("å 餿å"); |
| | | }) |
| | | .catch(() => {}); |
| | | this.getList(); // å·æ°å表 |
| | | } else { |
| | | this.$modal.msgError(response.msg || "å é¤å¤±è´¥"); |
| | | } |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | console.error("å é¤å¤±è´¥:", error); |
| | | this.$modal.msgError("å é¤å¤±è´¥ï¼è¯·ç¨åéè¯"); |
| | | } |
| | | } |
| | | }, |
| | | |
| | | /** å¯¼åºæé®æä½ */ |
| | | handleExport() { |
| | | // ç´æ¥ä½¿ç¨åç«¯åæ°ç»æè¿è¡å¯¼åº [5](@ref) |
| | | this.download( |
| | | "system/transport/export", |
| | | { |
| | |
| | | } |
| | | |
| | | .donor-info { |
| | | text-align: left; |
| | | text-align: center; |
| | | display: flex; |
| | | justify-content: center |
| | | } |
| | | |
| | | .donor-name { |
| | |
| | | } |
| | | |
| | | .donor-details { |
| | | font-size: 12px; |
| | | color: #909399; |
| | | margin-left: 5px; |
| | | font-size: 16px; |
| | | color: #093ca4; |
| | | display: flex; |
| | | } |
| | | |
| | | .mb8 { |
| | |
| | | <!-- åºç¡ä¿¡æ¯æ¨¡å --> |
| | | <el-card class="detail-section"> |
| | | <div slot="header" class="section-header"> |
| | | <i class="el-icon-document" style="color: #409EFF; margin-right: 8px;"></i> |
| | | <i |
| | | class="el-icon-document" |
| | | style="color: #409EFF; margin-right: 8px;" |
| | | ></i> |
| | | <span class="section-title">åºç¡ä¿¡æ¯</span> |
| | | </div> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="转è¿åå·">{{ transportData.id }}</el-descriptions-item> |
| | | <el-descriptions-item label="ä½é¢å·">{{ transportData.caseNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="æç®è
å§å">{{ transportData.donorName }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ§å«">{{ transportData.gender }}</el-descriptions-item> |
| | | <el-descriptions-item label="å¹´é¾">{{ transportData.age }}å²</el-descriptions-item> |
| | | <el-descriptions-item label="ç¾ç
è¯æ">{{ transportData.diagnosis }}</el-descriptions-item> |
| | | <el-descriptions-item label="åºåå»é¢">{{ transportData.hospitalName }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç®çå»é¢">{{ transportData.destinationHospital }}</el-descriptions-item> |
| | | <el-descriptions-item label="计åè½¬è¿æ¶é´">{{ transportData.transportTime }}</el-descriptions-item> |
| | | <el-descriptions-item label="è´è´£åè°å">{{ transportData.coordinator }}</el-descriptions-item> |
| | | <el-descriptions-item label="转è¿åå·">{{ |
| | | transportData.reportId || transportData.id |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ¡ä¾ç¼å·">{{ |
| | | transportData.caseNo |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ£è
å§å">{{ |
| | | transportData.patName |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ§å«"> |
| | | <dict-tag |
| | | :options="dict.type.sys_user_sex" |
| | | :value="parseInt(transportData.sex)" |
| | | /> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å¹´é¾" |
| | | >{{ transportData.age }}å²</el-descriptions-item |
| | | > |
| | | <el-descriptions-item label="ç¾ç
è¯æ">{{ |
| | | transportData.diagnosisname |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ²»çå»é¢">{{ |
| | | transportData.treatmentHospitalName |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ²»çç§å®¤">{{ |
| | | transportData.treatmentDeptName |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="åºåå°ç¹">{{ |
| | | transportData.transportStartPlace |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="计åè½¬è¿æ¶é´">{{ |
| | | transportData.transportStartTime |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="è´è´£åè°å">{{ |
| | | transportData.contactPerson |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="转è¿ç¶æ"> |
| | | <el-tag :type="transportData.status | statusFilter"> |
| | | {{ transportData.statusText }} |
| | | <el-tag :type="getStatusTagType(transportData.transitStatus)"> |
| | | {{ getStatusText(transportData.transitStatus) }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å建æ¶é´">{{ transportData.createTime }}</el-descriptions-item> |
| | | <el-descriptions-item label="宿æ¶é´" v-if="transportData.completedTime"> |
| | | {{ transportData.completedTime }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å建æ¶é´">{{ |
| | | transportData.createTime |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ´æ°æ¶é´">{{ |
| | | transportData.updateTime |
| | | }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | |
| | | <!-- 转è¿è¯¦æ
模å --> |
| | | <el-card class="detail-section"> |
| | | <div slot="header" class="section-header"> |
| | | <i class="el-icon-location-information" style="color: #67C23A; margin-right: 8px;"></i> |
| | | <i |
| | | class="el-icon-location-information" |
| | | style="color: #67C23A; margin-right: 8px;" |
| | | ></i> |
| | | <span class="section-title">转è¿è¯¦æ
</span> |
| | | </div> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="åºåå°ç¹">{{ transportData.departureLocation }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç®çå°">{{ transportData.destinationHospital }}</el-descriptions-item> |
| | | <el-descriptions-item label="å½åä½ç½®" v-if="transportData.currentLocation"> |
| | | {{ transportData.currentLocation }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="é¢è®¡å°è¾¾æ¶é´" v-if="transportData.estimatedTime"> |
| | | {{ transportData.estimatedTime }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="转è¿è·ç¦»" v-if="transportData.distance"> |
| | | {{ transportData.distance }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è½¬è¿æ¶é¿" v-if="transportData.duration"> |
| | | {{ transportData.duration }} |
| | | <el-descriptions-item label="åºåå°ç¹">{{ |
| | | transportData.transportStartPlace |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç®çå»é¢">{{ |
| | | transportData.treatmentHospitalName |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ²»çç§å®¤">{{ |
| | | transportData.treatmentDeptName |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="åºåæ¶é´">{{ |
| | | transportData.transportStartTime |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="转è¿ç¶æ"> |
| | | <el-tag :type="getStatusTagType(transportData.transitStatus)"> |
| | | {{ getStatusText(transportData.transitStatus) }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | |
| | | <!-- å¢éæå模å --> |
| | | <!-- 廿¤äººåä¿¡æ¯æ¨¡å --> |
| | | <el-card class="detail-section"> |
| | | <div slot="header" class="section-header"> |
| | | <i class="el-icon-user" style="color: #E6A23C; margin-right: 8px;"></i> |
| | | <span class="section-title">å¢éæå</span> |
| | | <span class="section-title">廿¤äººåä¿¡æ¯</span> |
| | | </div> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="åè°å">{{ transportData.coordinator }}</el-descriptions-item> |
| | | <el-descriptions-item label="åè°åçµè¯">{{ getContactPhone("åè°åçµè¯") }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ¥è¯ç§å»ç" v-if="transportData.emergencyDoctor"> |
| | | {{ transportData.emergencyDoctor }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="æ¥è¯å»ççµè¯">{{ getContactPhone("æ¥è¯å»ççµè¯") }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ¤å£«" v-if="transportData.nurse">{{ transportData.nurse }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ¤å£«çµè¯">{{ getContactPhone("æ¤å£«çµè¯") }}</el-descriptions-item> |
| | | <el-descriptions-item label="叿º" v-if="transportData.driver">{{ transportData.driver }}</el-descriptions-item> |
| | | <el-descriptions-item label="叿ºçµè¯">{{ getContactPhone("叿ºçµè¯") }}</el-descriptions-item> |
| | | <el-descriptions-item label="ICUè¯ä¼°å»ç" v-if="transportData.icuDoctor"> |
| | | {{ transportData.icuDoctor }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="ICUå»ççµè¯">{{ getContactPhone("ICUå»ççµè¯") }}</el-descriptions-item> |
| | | <el-descriptions-item label="åè°å">{{ |
| | | transportData.contactPerson |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="åè°åçµè¯">{{ |
| | | transportData.contactPhone || "æªå¡«å" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ¥è¯ç§å»ç">{{ |
| | | transportData.doctor |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ¥è¯å»ççµè¯">{{ |
| | | transportData.doctorPhone |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ¤å£«">{{ |
| | | transportData.nurse |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ¤å£«çµè¯">{{ |
| | | transportData.nursePhone |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="驾驶å">{{ |
| | | transportData.driver |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="驾驶åçµè¯">{{ |
| | | transportData.driverPhone |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ICUè¯ä¼°å»ç">{{ |
| | | transportData.icuDoctor |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ICUå»ççµè¯">{{ |
| | | transportData.icuDoctorPhone |
| | | }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | |
| | | <!-- éä»¶ä¿¡æ¯æ¨¡å --> |
| | | <el-card class="detail-section" v-if="attachmentList.length > 0"> |
| | | <el-card |
| | | class="detail-section" |
| | | v-if=" |
| | | transportData.annexfilesList && transportData.annexfilesList.length > 0 |
| | | " |
| | | > |
| | | <div slot="header" class="section-header"> |
| | | <i class="el-icon-folder" style="color: #F56C6C; margin-right: 8px;"></i> |
| | | <i |
| | | class="el-icon-folder" |
| | | style="color: #F56C6C; margin-right: 8px;" |
| | | ></i> |
| | | <span class="section-title">éä»¶ä¿¡æ¯</span> |
| | | </div> |
| | | <el-table :data="attachmentList" style="width: 100%"> |
| | |
| | | </el-table-column> |
| | | <el-table-column label="æä»¶ç±»å" width="120"> |
| | | <template slot-scope="scope"> |
| | | <el-tag size="small">{{ scope.row.fileType }}</el-tag> |
| | | <el-tag size="small">{{ scope.row.type }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="大å°" width="100"> |
| | | <el-table-column label="æä»¶å°å" min-width="200" show-overflow-tooltip> |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatFileSize(scope.row.fileSize) }}</span> |
| | | <span>{{ scope.row.path }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ä¸ä¼ æ¶é´" width="180"> |
| | | <el-table-column label="æä½" width="200"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row.uploadTime }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½"> |
| | | <template slot-scope="scope"> |
| | | <el-button size="mini" @click="handlePreview(scope.row)">é¢è§</el-button> |
| | | <el-button size="mini" type="success" @click="handleDownload(scope.row)">ä¸è½½</el-button> |
| | | <el-button size="mini" type="danger" @click="handleDelete(scope.row)">å é¤</el-button> |
| | | <el-button size="mini" @click="handlePreview(scope.row)" |
| | | >é¢è§</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="success" |
| | | @click="handleDownload(scope.row)" |
| | | >ä¸è½½</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | |
| | | <!-- 夿³¨ä¿¡æ¯æ¨¡å --> |
| | | <el-card class="detail-section" v-if="transportData.remarks"> |
| | | <el-card class="detail-section" v-if="transportData.remark"> |
| | | <div slot="header" class="section-header"> |
| | | <i class="el-icon-edit" style="color: #909399; margin-right: 8px;"></i> |
| | | <span class="section-title">夿³¨ä¿¡æ¯</span> |
| | | </div> |
| | | <div class="remarks-content"> |
| | | {{ transportData.remarks }} |
| | | {{ transportData.remark }} |
| | | </div> |
| | | </el-card> |
| | | |
| | | <!-- é¢è§å¼¹çªï¼ä¿æä¸åï¼ --> |
| | | <!-- PDFé¢è§å¼¹çª --> |
| | | <el-dialog |
| | | :title="previewTitle" |
| | |
| | | @close="handlePdfDialogClose" |
| | | > |
| | | <div class="pdf-preview-container" v-loading="pdfLoading"> |
| | | <!-- PDFæ§å¶å·¥å
·æ --> |
| | | <div class="pdf-toolbar"> |
| | | <el-button-group> |
| | | <el-button |
| | |
| | | </el-button> |
| | | </div> |
| | | |
| | | <!-- PDF渲æåºå --> |
| | | <div class="pdf-viewport"> |
| | | <pdf |
| | | ref="pdf" |
| | |
| | | |
| | | <script> |
| | | import pdf from "vue-pdf"; |
| | | import UploadAttachment from "@/components/UploadAttachment"; |
| | | |
| | | export default { |
| | | name: "TransportDetail", |
| | | components: { |
| | | pdf |
| | | }, |
| | | components: { |
| | | UploadAttachment |
| | | }, |
| | | dicts: ["sys_user_sex"], |
| | | props: { |
| | | transportData: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | } |
| | | }, |
| | | filters: { |
| | | statusFilter(status) { |
| | | const statusMap = { |
| | | pending: "warning", |
| | | transporting: "primary", |
| | | completed: "success", |
| | | cancelled: "danger" |
| | | }; |
| | | return statusMap[status]; |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | // éä»¶ç¸å
³æ°æ® |
| | | attachmentList: [ |
| | | { |
| | | id: 1, |
| | | fileName: "转è¿äº¤æ¥å.jpg", |
| | | fileType: "docx", |
| | | fileSize: 102400, |
| | | uploadTime: "2024-12-19 10:30:00", |
| | | fileUrl: "https://img95.699pic.com/photo/40142/8262.jpg_wh860.jpg" |
| | | }, |
| | | { |
| | | id: 2, |
| | | fileName: "å»çè®°å½.pdf", |
| | | fileType: "pdf", |
| | | fileSize: 2048000, |
| | | uploadTime: "2024-12-19 11:20:00", |
| | | fileUrl: "http://192.168.100.10:8080/profile/upload/2025/12/19/(å´é¾8.7)æ¯æ¥å·¥ä½æ»ç»1766131266142.pdf" |
| | | }, |
| | | { |
| | | id: 3, |
| | | fileName: "æ£è
ç
§ç.jpg", |
| | | fileType: "jpg", |
| | | fileSize: 512000, |
| | | uploadTime: "2024-12-19 14:15:00", |
| | | fileUrl: "https://img95.699pic.com/photo/40019/3490.jpg_wh860.jpg" |
| | | } |
| | | ], |
| | | attachmentList: [], |
| | | // PDFé¢è§ç¸å
³æ°æ® |
| | | pdfPreviewVisible: false, |
| | | pdfLoading: false, |
| | |
| | | pageCount: 0, |
| | | scale: 100, |
| | | pageRotate: 0, |
| | | |
| | | // å¾çé¢è§ç¸å
³ |
| | | imagePreviewVisible: false, |
| | | |
| | | // 䏿¯æé¢è§ç¸å
³ |
| | | unsupportedPreviewVisible: false, |
| | | |
| | | // éç¨é¢è§æ°æ® |
| | | previewTitle: "", |
| | | previewUrl: "", |
| | | currentFile: null |
| | | }; |
| | | }, |
| | | methods: { |
| | | // è·åèç³»æ¹å¼ |
| | | getContactPhone(role) { |
| | | if (this.transportData.contacts) { |
| | | const contact = this.transportData.contacts.find( |
| | | item => item.role === role |
| | | ); |
| | | return contact ? contact.phone : "æªå¡«å"; |
| | | } |
| | | return "æªå¡«å"; |
| | | watch: { |
| | | transportData: { |
| | | handler(newVal) { |
| | | this.transformAttachmentData(newVal.annexfilesList); |
| | | }, |
| | | immediate: true, |
| | | deep: true |
| | | } |
| | | }, |
| | | methods: { |
| | | /** 转æ¢éä»¶æ°æ® */ |
| | | transformAttachmentData(annexfilesList) { |
| | | if (!annexfilesList || !Array.isArray(annexfilesList)) { |
| | | this.attachmentList = []; |
| | | return; |
| | | } |
| | | |
| | | this.attachmentList = annexfilesList; |
| | | // this.attachmentList = annexfilesList.map((fileUrl, index) => { |
| | | // const fileName = this.getFileNameFromUrl(fileUrl); |
| | | // return { |
| | | // id: index + 1, |
| | | // fileName: fileName, |
| | | // fileType: this.getFileType(fileName), |
| | | // fileUrl: fileUrl |
| | | // }; |
| | | // }); |
| | | }, |
| | | |
| | | /** ä»URL䏿åæä»¶å */ |
| | | getFileNameFromUrl(url) { |
| | | if (!url) return "æªç¥æä»¶"; |
| | | return url.split("/").pop() || "æªç¥æä»¶"; |
| | | }, |
| | | |
| | | /** è·åç¶ææ ç¾ç±»å */ |
| | | getStatusTagType(transitStatus) { |
| | | const statusMap = { |
| | | 1: "warning", // å¾
è½¬è¿ |
| | | 2: "primary", // 转è¿ä¸ |
| | | 3: "success", // 转è¿å®æ |
| | | 4: "danger", // 转è¿åæ¶ |
| | | 5: "info" // æå |
| | | }; |
| | | return statusMap[transitStatus] || "info"; |
| | | }, |
| | | |
| | | /** è·åç¶æææ¬ */ |
| | | getStatusText(transitStatus) { |
| | | const statusMap = { |
| | | 1: "å¾
转è¿", |
| | | 2: "转è¿ä¸", |
| | | 3: "转è¿å®æ", |
| | | 4: "转è¿åæ¶", |
| | | 5: "æå" |
| | | }; |
| | | return statusMap[transitStatus] || "æªç¥ç¶æ"; |
| | | }, |
| | | |
| | | // å
³éå¼¹æ¡ |
| | | handleClose() { |
| | | this.$emit("close"); |
| | | }, |
| | | |
| | | // è·åæä»¶ç±»å |
| | | getFileType(fileName) { |
| | | const extension = fileName |
| | |
| | | handlePreview(file) { |
| | | this.currentFile = file; |
| | | this.previewTitle = `é¢è§ - ${file.fileName}`; |
| | | this.previewUrl = file.fileUrl; |
| | | this.previewUrl = file.path; |
| | | const fileType = this.getFileType(file.fileName); |
| | | console.log(this.previewUrl, "this.previewUrl"); |
| | | |
| | | switch (fileType) { |
| | | case "pdf": |
| | |
| | | this.currentPage = 1; |
| | | this.scale = 100; |
| | | this.pageRotate = 0; |
| | | this.pdfUrl = file.fileUrl; |
| | | this.pdfUrl = file.path; |
| | | }, |
| | | |
| | | // PDFå è½½å®æåè° |
| | |
| | | // æä»¶ä¸è½½ |
| | | handleDownload(file) { |
| | | const link = document.createElement("a"); |
| | | link.href = file.fileUrl; |
| | | link.href = file.path; |
| | | link.download = file.fileName; |
| | | link.style.display = "none"; |
| | | document.body.appendChild(link); |
| | |
| | | this.handleDownload(file); |
| | | }, |
| | | |
| | | // æä»¶å é¤ |
| | | handleDelete(file) { |
| | | this.$confirm("ç¡®å®è¦å é¤è¿ä¸ªéä»¶åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }).then(() => { |
| | | this.attachmentList = this.attachmentList.filter( |
| | | item => item.id !== file.id |
| | | ); |
| | | this.$message.success("å 餿å"); |
| | | }); |
| | | }, |
| | | |
| | | formatFileSize(bytes) { |
| | | if (!bytes) return "æªç¥å¤§å°"; |
| | | if (bytes === 0) return "0 B"; |
| | | const k = 1024; |
| | | const sizes = ["B", "KB", "MB", "GB"]; |
| | |
| | | white-space: pre-line; |
| | | } |
| | | |
| | | /* PDFé¢è§ç¸å
³æ ·å¼ä¿æä¸å */ |
| | | /* PDFé¢è§ç¸å
³æ ·å¼ */ |
| | | .pdf-preview-dialog { |
| | | margin-top: 5vh !important; |
| | | } |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ä½é¢å·" |
| | | label="æ¡ä¾ç¼å·" |
| | | align="center" |
| | | prop="donorno" |
| | | prop="caseNo" |
| | | width="200" |
| | | /> |
| | | <el-table-column label="å§å" align="center" prop="name" width="100" /> |
| | |
| | | label="å»çæºæ" |
| | | align="center" |
| | | prop="treatmenthospitalname" |
| | | /> |
| | | <el-table-column |
| | | label="GSCè¯å" |
| | | align="center" |
| | | prop="gcsScore" |
| | | /> |
| | | <el-table-column label="è¡å" align="center" prop="bloodtype" width="100"> |
| | | <template slot-scope="scope"> |
| | |
| | | > |
| | | <el-row style="margin-top: 40px"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä½é¢å·" prop="donorno"> |
| | | <el-input v-model="form.donorno" disabled /> |
| | | <el-form-item label="æ¡ä¾ç¼å·" prop="caseNo"> |
| | | <el-input v-model="form.caseNo" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | |
| | | > |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä½é¢å·" prop="inpatientno"> |
| | | <el-input v-model="form.inpatientno" placeholder="ä½é¢å·" /> |
| | | <el-form-item label="æ¡ä¾ç¼å·" prop="inpatientno"> |
| | | <el-input v-model="form.inpatientno" placeholder="æ¡ä¾ç¼å·" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="16"> |
| | |
| | | <!-- <div style="padding-right: 60px; margin-top: 20px"> |
| | | <el-row> |
| | | <el-form-item label="éä»¶" align="left" prop="annexfile"> |
| | | <annex-upload ref="annex" :infoid="form.id" :donorno="form.donorno" :flowname="flowname" |
| | | <annex-upload ref="annex" :infoid="form.id" :caseNo="form.caseNo" :flowname="flowname" |
| | | :annexno="annexno" /> |
| | | </el-form-item> |
| | | </el-row> |
| | |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | donorno: null, |
| | | caseNo: null, |
| | | recordstate: null, |
| | | // treatmenthospitalno: null, |
| | | treatmenthospitalname: null, |
| | |
| | | bloodtype: "0", |
| | | inpatientno: null, |
| | | rhyin: "0", |
| | | donorno: null, |
| | | caseNo: null, |
| | | donationcategory: null, |
| | | illnessoverview: null, |
| | | diseasetype: [], |
| | |
| | | ], |
| | | |
| | | inpatientno: [ |
| | | { required: true, message: "è¾å
¥ä½é¢å·", trigger: "blur" } |
| | | { required: true, message: "è¾å
¥æ¡ä¾ç¼å·", trigger: "blur" } |
| | | ], |
| | | diagnosisname: [ |
| | | { required: true, message: "ç¾ç
è¯æä¸è½ä¸ºç©º", trigger: "blur" } |
| | |
| | | bloodtype: "0", |
| | | inpatientno: null, |
| | | rhyin: 0, |
| | | donorno: null, |
| | | caseNo: null, |
| | | donationcategory: null, |
| | | illnessoverview: null, |
| | | diseasetype: [], |
| | |
| | | // "2" |
| | | recordstate: null, |
| | | treatmenthospitalname: null, |
| | | donorno: null, |
| | | caseNo: null, |
| | | acquisitiontissueno: null, |
| | | reportername: null, |
| | | reporttime: null, |
| | |
| | | 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, |