From 0c03027d7f238bf5beb98e85463f53f0bd92bbaa Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期一, 20 四月 2026 17:56:01 +0800
Subject: [PATCH] 青岛维护
---
src/views/business/appear/index.vue | 1483 ++++++++++++++++++++--
src/views/OfficeRelated/conference/index.vue | 1007 +++++++++++++--
src/views/business/transfer/index.vue | 286 ++++
src/views/business/transfer/TransportEdit.vue | 100 +
src/views/business/appear/caseDetail.vue | 914 ++++++++-----
5 files changed, 3,046 insertions(+), 744 deletions(-)
diff --git a/src/views/OfficeRelated/conference/index.vue b/src/views/OfficeRelated/conference/index.vue
index bc55057..30ec96d 100644
--- a/src/views/OfficeRelated/conference/index.vue
+++ b/src/views/OfficeRelated/conference/index.vue
@@ -128,7 +128,10 @@
prop="organizerName"
label="缁勭粐鑰�"
width="120"
- />
+ ><template #default="scope">
+ <span>{{ scope.organizerName || scope.createBy }}</span>
+ </template>
+ </el-table-column>
<el-table-column
align="center"
prop="locationName"
@@ -270,35 +273,98 @@
</div>
<!-- 浼氳绾闄勪欢灞曠ず -->
- <div
- class="minutes-attachments"
- v-if="
- currentRecord.recordattachment &&
- parseAttachments(currentRecord.recordattachment).length > 0
- "
- >
- <el-divider content-position="left">浼氳绾闄勪欢</el-divider>
- <div class="attachment-list">
+ <div class="detail-attachments">
+ <div
+ v-if="parseAttachments(currentRecord.recordattachment).length > 0"
+ class="attachment-grid"
+ >
<div
v-for="file in parseAttachments(currentRecord.recordattachment)"
:key="file.id || file.name"
- class="attachment-item"
+ class="attachment-card"
>
- <el-link
- type="primary"
- :href="file.url"
- target="_blank"
- class="file-link"
- >
- <i
- :class="getFileIcon(file.type || file.name)"
- style="margin-right: 8px;"
- ></i>
- {{ file.name }}
- <span class="file-size" v-if="file.size"
- >({{ formatFileSize(file.size) }})</span
+ <template v-if="isImageFile(file)">
+ <!-- 鍥剧墖浣跨敤 el-image 棰勮 -->
+ <el-image
+ class="image-attachment"
+ :src="getFileUrl(file)"
+ :preview-src-list="getImagePreviewList(file)"
+ fit="cover"
+ :style="{ width: imageSize, height: imageSize }"
+ lazy
>
- </el-link>
+ <div slot="error" class="image-error">
+ <i class="el-icon-picture-outline"></i>
+ <span>鍔犺浇澶辫触</span>
+ </div>
+ <div slot="placeholder" class="image-loading">
+ <i class="el-icon-loading"></i>
+ </div>
+ </el-image>
+ <div class="image-info">
+ <div class="file-name" :title="file.name">
+ {{ file.name }}
+ </div>
+ <div class="file-actions">
+ <el-button
+ type="text"
+ size="mini"
+ @click="handleDownload(file)"
+ icon="el-icon-download"
+ title="涓嬭浇"
+ />
+ <el-button
+ type="text"
+ size="mini"
+ @click="handlePreview(file)"
+ icon="el-icon-view"
+ title="棰勮"
+ />
+ </div>
+ </div>
+ </template>
+
+ <template v-else>
+ <!-- 闈炲浘鐗囨枃浠朵繚鎸佸師鏈夋牱寮� -->
+ <el-card shadow="hover" class="file-card">
+ <div class="file-content">
+ <i
+ :class="getFileIcon(file.type || file.name)"
+ class="file-icon"
+ ></i>
+ <div class="file-info">
+ <div class="file-name" :title="file.name">
+ {{ file.name }}
+ </div>
+ <div class="file-meta">
+ <span class="file-type">{{
+ getFileTypeText(file)
+ }}</span>
+ <span class="file-size" v-if="file.size">
+ {{ formatFileSize(file.size) }}
+ </span>
+ </div>
+ </div>
+ </div>
+ <div class="file-actions" v-if="file.url">
+ <el-button
+ type="text"
+ size="mini"
+ @click="handleDownload(file)"
+ >
+ 涓嬭浇
+ </el-button>
+ <el-button
+ v-if="canPreview(file)"
+ type="text"
+ size="mini"
+ @click="handlePreview(file)"
+ >
+ 棰勮
+ </el-button>
+ </div>
+ </el-card>
+ </template>
</div>
</div>
</div>
@@ -393,6 +459,7 @@
</el-descriptions-item>
<!-- 浼氳闄勪欢 -->
+ 鎴戠悊瑙f偍鐨勯渶姹傦紝鎮ㄥ笇鏈涘皢浼氳闄勪欢涓殑鍥剧墖鏂囦欢浠l-image鐨勯瑙堝浘褰㈠紡灞曠ず锛屽叾浠栨枃浠剁被鍨嬩繚鎸佸師鏈夌殑灞曠ず鏂瑰紡銆傝鎴戜慨鏀硅繖閮ㄥ垎浠g爜锛�
<el-descriptions-item label="浼氳闄勪欢" :span="2">
<div class="detail-attachments">
<div
@@ -402,37 +469,94 @@
"
class="attachment-grid"
>
+ <!-- 鍥剧墖闄勪欢 - 浣跨敤 el-image 棰勮褰㈠紡 -->
<div
v-for="file in parseAttachments(currentRecord.attachment)"
:key="file.id || file.name"
class="attachment-card"
>
- <el-card shadow="hover" class="file-card">
- <div class="file-content">
- <i
- :class="getFileIcon(file.type || file.name)"
- class="file-icon"
- ></i>
- <div class="file-info">
- <div class="file-name" :title="file.name">
- {{ file.name }}
- </div>
- <div class="file-meta">
- <span class="file-size" v-if="file.size">{{
- formatFileSize(file.size)
- }}</span>
- </div>
+ <template v-if="isImageFile(file)">
+ <!-- 鍥剧墖浣跨敤 el-image 棰勮 -->
+ <el-image
+ class="image-attachment"
+ :src="getFileUrl(file)"
+ :preview-src-list="getImagePreviewList(file)"
+ fit="cover"
+ :style="{ width: imageSize, height: imageSize }"
+ lazy
+ >
+ <div slot="error" class="image-error">
+ <i class="el-icon-picture-outline"></i>
+ <span>鍔犺浇澶辫触</span>
+ </div>
+ <div slot="placeholder" class="image-loading">
+ <i class="el-icon-loading"></i>
+ </div>
+ </el-image>
+ <div class="image-info">
+ <div class="file-name" :title="file.name">
+ {{ file.name }}
+ </div>
+ <div class="file-actions">
+ <el-button
+ type="text"
+ size="mini"
+ @click="handleDownload(file)"
+ icon="el-icon-download"
+ title="涓嬭浇"
+ />
+ <el-button
+ type="text"
+ size="mini"
+ @click="handlePreview(file)"
+ icon="el-icon-view"
+ title="棰勮"
+ />
</div>
</div>
- <div class="file-actions" v-if="file.url">
- <el-button
- type="text"
- size="mini"
- @click="handleDownload(file)"
- >涓嬭浇</el-button
- >
- </div>
- </el-card>
+ </template>
+
+ <template v-else>
+ <!-- 闈炲浘鐗囨枃浠朵繚鎸佸師鏈夋牱寮� -->
+ <el-card shadow="hover" class="file-card">
+ <div class="file-content">
+ <i
+ :class="getFileIcon(file.type || file.name)"
+ class="file-icon"
+ ></i>
+ <div class="file-info">
+ <div class="file-name" :title="file.name">
+ {{ file.name }}
+ </div>
+ <div class="file-meta">
+ <span class="file-type">{{
+ getFileTypeText(file)
+ }}</span>
+ <span class="file-size" v-if="file.size">
+ {{ formatFileSize(file.size) }}
+ </span>
+ </div>
+ </div>
+ </div>
+ <div class="file-actions" v-if="file.url">
+ <el-button
+ type="text"
+ size="mini"
+ @click="handleDownload(file)"
+ >
+ 涓嬭浇
+ </el-button>
+ <el-button
+ v-if="canPreview(file)"
+ type="text"
+ size="mini"
+ @click="handlePreview(file)"
+ >
+ 棰勮
+ </el-button>
+ </div>
+ </el-card>
+ </template>
</div>
</div>
<div v-else class="no-attachment">
@@ -474,7 +598,7 @@
<el-dialog
:title="`${isEditing ? '缂栬緫' : '鏂板'}浼氳`"
:visible.sync="editDialogVisible"
- width="700px"
+ width="800px"
:before-close="handleEditClose"
>
<el-form
@@ -502,16 +626,16 @@
</el-select>
</el-form-item>
- <el-form-item label="浼氳鍦扮偣" prop="locationId">
+ <el-form-item label="浼氳鍦扮偣" prop="locationName">
<el-select
- v-model="editForm.locationId"
+ v-model="editForm.locationName"
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="绗竴浼氳瀹�" />
+ <el-option label="绗簩浼氳瀹�" value="绗簩浼氳瀹�" />
+ <el-option label="绗笁浼氳瀹�" value="绗笁浼氳瀹�" />
+ <el-option label="绾夸笂浼氳" value="绾夸笂浼氳" />
</el-select>
</el-form-item>
@@ -573,47 +697,84 @@
/>
</el-form-item>
+ <!-- 淇敼浼氳闄勪欢閮ㄥ垎 -->
<el-form-item label="浼氳闄勪欢">
- <div class="attachment-upload-section">
- <div class="upload-tip">涓婁紶浼氳鐩稿叧璧勬枡鏂囦欢</div>
- <el-upload
- class="attachment-upload"
- action="#"
- :auto-upload="false"
- :on-change="handleAttachmentChange"
- :file-list="editForm.attachmentFiles"
- :limit="10"
- multiple
- >
- <el-button size="small" type="primary" icon="el-icon-upload">
- 涓婁紶浼氳闄勪欢
- </el-button>
- <div slot="tip" class="el-upload__tip">
- 鏀寔鏂囨。銆佸浘鐗囩瓑鏍煎紡锛屽崟涓枃浠朵笉瓒呰繃20MB
- </div>
- </el-upload>
- <div
- v-if="
- editForm.attachmentFiles && editForm.attachmentFiles.length > 0
- "
- class="uploaded-files"
- >
- <div
- v-for="(file, index) in editForm.attachmentFiles"
- :key="file.uid || index"
- class="file-item"
+ <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
>
- <span class="file-name">{{ file.name }}</span>
- <el-button
- type="text"
- size="mini"
- @click="handleRemoveAttachmentFile(index)"
- style="color: #F56C6C;"
- >
- 鍒犻櫎
- </el-button>
- </div>
</div>
+
+ <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
+ <UploadAttachment
+ ref="uploadAttachment"
+ :file-list="attachmentFileList"
+ :limit="attachmentLimit"
+ :accept="attachmentAccept"
+ @change="handleAttachmentChange"
+ @upload-success="handleAttachmentUploadSuccess"
+ @upload-error="handleAttachmentUploadError"
+ @remove="handleAttachmentRemove"
+ />
+ </div>
+
+ <!-- 浼氳闄勪欢鍒楄〃 -->
+ <div
+ class="attachment-list"
+ v-if="editForm.attachment && editForm.attachment.length > 0"
+ >
+ <div class="list-title">
+ 宸蹭笂浼犻檮浠� ({{ editForm.attachment.length }})
+ </div>
+ <el-table
+ :data="editForm.attachment"
+ style="width: 100%"
+ size="small"
+ border
+ >
+ <el-table-column label="鏂囦欢鍚�" min-width="200">
+ <template #default="scope">
+ <i
+ class="el-icon-document"
+ style="margin-right: 8px; color: #409EFF;"
+ ></i>
+ <span class="file-name">{{ scope.row.name }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢绫诲瀷" width="100">
+ <template #default="scope">
+ <el-tag size="small">{{
+ getFileType(scope.row.name)
+ }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢澶у皬" width="100">
+ <template #default="scope">
+ <span>{{ formatFileSize(scope.row.size) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="200">
+ <template #default="scope">
+ <el-button
+ size="mini"
+ type="primary"
+ @click="handlePreviewAttachment(scope.row)"
+ >
+ 棰勮
+ </el-button>
+ <el-button
+ size="mini"
+ type="danger"
+ @click="handleRemoveMeetingAttachment(scope.$index)"
+ >
+ 鍒犻櫎
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
</div>
</el-form-item>
@@ -633,25 +794,86 @@
</div>
</el-form-item>
+ <!-- 淇敼浼氳绾闄勪欢閮ㄥ垎 -->
<el-form-item label="绾闄勪欢">
- <div class="attachment-upload-section">
- <div class="upload-tip">涓婁紶涓庝細璁邯瑕佺浉鍏崇殑琛ュ厖鏉愭枡</div>
- <el-upload
- class="minutes-upload"
- action="#"
- :auto-upload="false"
- :on-change="handleMinutesAttachmentChange"
- :file-list="editForm.recordattachmentFiles"
- :limit="5"
- multiple
+ <div class="attachment-section">
+ <div class="attachment-header">
+ <i class="el-icon-paperclip"></i>
+ <span class="attachment-title">绾闄勪欢涓婁紶</span>
+ <span class="attachment-tip"
+ >鏀寔涓婁紶涓庣邯瑕佺浉鍏崇殑琛ュ厖鏉愭枡 (鏈�澶歿{
+ minutesAttachmentLimit
+ }}涓�)</span
+ >
+ </div>
+
+ <UploadAttachment
+ ref="uploadMinutesAttachment"
+ :file-list="minutesAttachmentFileList"
+ :limit="minutesAttachmentLimit"
+ :accept="minutesAttachmentAccept"
+ @change="handleMinutesAttachmentChange"
+ @upload-success="handleMinutesUploadSuccess"
+ @upload-error="handleMinutesUploadError"
+ @remove="handleMinutesAttachmentRemove"
+ />
+ </div>
+
+ <div
+ class="attachment-list"
+ v-if="
+ editForm.recordattachment && editForm.recordattachment.length > 0
+ "
+ >
+ <div class="list-title">
+ 宸蹭笂浼犵邯瑕侀檮浠� ({{ editForm.recordattachment.length }})
+ </div>
+ <el-table
+ :data="editForm.recordattachment"
+ style="width: 100%"
+ size="small"
+ border
>
- <el-button size="small" type="primary" icon="el-icon-upload">
- 涓婁紶绾闄勪欢
- </el-button>
- <div slot="tip" class="el-upload__tip">
- 鏀寔鍥剧墖銆佹枃妗g瓑鏍煎紡锛屽崟涓枃浠朵笉瓒呰繃10MB
- </div>
- </el-upload>
+ <el-table-column label="鏂囦欢鍚�" min-width="200">
+ <template #default="scope">
+ <i
+ class="el-icon-document"
+ style="margin-right: 8px; color: #409EFF;"
+ ></i>
+ <span class="file-name">{{ scope.row.name }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢绫诲瀷" width="100">
+ <template #default="scope">
+ <el-tag size="small">{{
+ getFileType(scope.row.name)
+ }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢澶у皬" width="100">
+ <template #default="scope">
+ <span>{{ formatFileSize(scope.row.size) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="200">
+ <template #default="scope">
+ <el-button
+ size="mini"
+ type="primary"
+ @click="handlePreviewMinutesAttachment(scope.row)"
+ >
+ 棰勮
+ </el-button>
+ <el-button
+ size="mini"
+ type="danger"
+ @click="handleRemoveMinutesAttachment(scope.$index)"
+ >
+ 鍒犻櫎
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
</div>
</el-form-item>
@@ -672,6 +894,13 @@
</el-button>
</span>
</el-dialog>
+ <!-- 鏂囦欢棰勮寮圭獥 -->
+ <FilePreviewDialog
+ :visible="previewVisible"
+ :file="currentPreviewFile"
+ @close="previewVisible = false"
+ @download="handleDownload"
+ />
</div>
</template>
@@ -684,9 +913,15 @@
meetingDel,
exporremeeting
} from "@/api/officeManagementApi";
-
+import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
+import dayjs from "dayjs";
export default {
name: "MeetingManagement",
+ components: {
+ UploadAttachment,
+ FilePreviewDialog
+ },
data() {
return {
// 鏌ヨ鍙傛暟
@@ -716,6 +951,7 @@
isEditing: false,
// 琛ㄦ牸鏁版嵁
tableData: [],
+ imageSize: "100px", // 鍥剧墖鏄剧ず澶у皬
// 缂栬緫琛ㄥ崟鏁版嵁
editForm: this.getDefaultFormData(),
// 琛ㄥ崟楠岃瘉瑙勫垯
@@ -742,7 +978,24 @@
reminderMinutes: [
{ required: true, message: "璇疯緭鍏ユ彁鍓嶆彁閱掓椂闂�", trigger: "blur" }
]
- }
+ },
+ // 闄勪欢鐩稿叧閰嶇疆
+ attachmentLimit: 10,
+ minutesAttachmentLimit: 5,
+ attachmentAccept:
+ ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.zip,.rar",
+ minutesAttachmentAccept: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx",
+
+ // 鏂囦欢棰勮鐩稿叧
+ previewVisible: false,
+ currentPreviewFile: null,
+
+ // 闄勪欢鏂囦欢鍒楄〃
+ attachmentFileList: [],
+ minutesAttachmentFileList: [],
+
+ // 缂栬緫琛ㄥ崟鏁版嵁 - 淇敼榛樿鍊�
+ editForm: this.getDefaultFormData()
};
},
mounted() {
@@ -783,7 +1036,111 @@
this.loading = false;
}
},
+ // 淇敼鑾峰彇鏂囦欢绫诲瀷鏂规硶
+ 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"];
+ const zipTypes = ["zip", "rar"];
+ if (imageTypes.includes(extension)) return "image";
+ if (pdfTypes.includes(extension)) return "pdf";
+ if (officeTypes.includes(extension)) return "office";
+ if (zipTypes.includes(extension)) return "archive";
+ return "other";
+ },
+ // 鍒ゆ柇鏄惁涓哄浘鐗囨枃浠�
+ isImageFile(file) {
+ if (!file || !file.name) return false;
+ const imageExtensions = [
+ "jpg",
+ "jpeg",
+ "png",
+ "gif",
+ "bmp",
+ "webp",
+ "svg"
+ ];
+ const extension = file.name
+ .split(".")
+ .pop()
+ .toLowerCase();
+ return imageExtensions.includes(extension);
+ },
+
+ // 鑾峰彇鏂囦欢URL
+ getFileUrl(file) {
+ return file.url || file.path || file.fileUrl || "";
+ },
+
+ // 鑾峰彇鍥剧墖棰勮鍒楄〃
+ getImagePreviewList(file) {
+ const url = this.getFileUrl(file);
+ if (!url) return [];
+ return [url];
+ },
+ // 鑾峰彇鏂囦欢绫诲瀷鏂囨湰
+ getFileTypeText(file) {
+ if (!file.name) return "鏂囦欢";
+ const ext = file.name
+ .split(".")
+ .pop()
+ .toLowerCase();
+ const typeMap = {
+ pdf: "PDF鏂囨。",
+ doc: "Word鏂囨。",
+ docx: "Word鏂囨。",
+ xls: "Excel琛ㄦ牸",
+ xlsx: "Excel琛ㄦ牸",
+ ppt: "PPT婕旂ず",
+ pptx: "PPT婕旂ず",
+ zip: "鍘嬬缉鍖�",
+ rar: "鍘嬬缉鍖�",
+ txt: "鏂囨湰鏂囨。",
+ jpg: "鍥剧墖",
+ jpeg: "鍥剧墖",
+ png: "鍥剧墖",
+ gif: "鍥剧墖"
+ };
+ return typeMap[ext] || "鏂囦欢";
+ },
+
+ // 鍒ゆ柇鏂囦欢鏄惁鍙互棰勮
+ canPreview(file) {
+ if (!file.name) return false;
+ const previewableExtensions = ["pdf", "jpg", "jpeg", "png", "gif", "txt"];
+ const extension = file.name
+ .split(".")
+ .pop()
+ .toLowerCase();
+ return previewableExtensions.includes(extension);
+ },
+
+ // 鏂囦欢棰勮
+ handlePreview(file) {
+ this.currentPreviewFile = {
+ fileName: file.name,
+ fileUrl: this.getFileUrl(file),
+ fileType: this.getFileType(file.name)
+ };
+ this.previewVisible = true;
+ },
+ // 闄勪欢杞崲涓轰笂浼犳枃浠跺垪琛�
+ parseAttachmentToFileList(attachments) {
+ if (!attachments || !Array.isArray(attachments)) return [];
+ return attachments.map((item, index) => ({
+ uid: item.id || `attachment-${index}-${Date.now()}`,
+ name: item.name || item.fileName,
+ url: item.url || item.path || item.fileUrl,
+ size: item.size,
+ status: "success"
+ }));
+ },
// 鑾峰彇鏂囦欢鍥炬爣
getFileIcon(fileName) {
if (!fileName) return "el-icon-document";
@@ -917,9 +1274,9 @@
}
},
- // 鏍煎紡鍖栨枃浠跺ぇ灏�
+ // 鏂囦欢澶у皬鏍煎紡鍖�
formatFileSize(bytes) {
- if (!bytes) return "0 B";
+ if (!bytes || bytes === 0) return "0 B";
const k = 1024;
const sizes = ["B", "KB", "MB", "GB"];
const i = Math.floor(Math.log(bytes) / Math.log(k));
@@ -950,7 +1307,20 @@
try {
const response = await meetingInfo(id);
if (response.code === 200) {
- this.currentRecord = response.data || {};
+ const data = response.data || {};
+ // 瑙f瀽闄勪欢
+ if (data.attachment && typeof data.attachment === "string") {
+ data.attachment = this.parseAttachments(data.attachment);
+ }
+ if (
+ data.recordattachment &&
+ typeof data.recordattachment === "string"
+ ) {
+ data.recordattachment = this.parseAttachments(
+ data.recordattachment
+ );
+ }
+ this.currentRecord = data;
this.detailDialogVisible = true;
} else {
this.$message.error(response.msg || "鑾峰彇璇︽儏澶辫触");
@@ -965,6 +1335,8 @@
handleAdd() {
this.isEditing = false;
this.editForm = this.getDefaultFormData();
+ this.attachmentFileList = [];
+ this.minutesAttachmentFileList = [];
this.editDialogVisible = true;
this.$nextTick(() => {
this.$refs.editForm && this.$refs.editForm.clearValidate();
@@ -977,21 +1349,26 @@
const response = await meetingInfo(id);
if (response.code === 200) {
this.isEditing = true;
- this.currentRecord = response.data || {};
- this.editForm = { ...response.data };
+ const data = response.data || {};
// 瑙f瀽闄勪欢
- if (this.editForm.attachment) {
- this.editForm.attachmentFiles = this.parseAttachments(
- this.editForm.attachment
+ if (data.attachment) {
+ data.attachment = this.parseAttachments(data.attachment);
+ this.attachmentFileList = this.parseAttachmentToFileList(
+ data.attachment
);
}
- if (this.editForm.recordattachment) {
- this.editForm.recordattachmentFiles = this.parseAttachments(
- this.editForm.recordattachment
+ if (data.recordattachment) {
+ data.recordattachment = this.parseAttachments(
+ data.recordattachment
+ );
+ this.minutesAttachmentFileList = this.parseAttachmentToFileList(
+ data.recordattachment
);
}
+ this.currentRecord = data;
+ this.editForm = { ...data };
this.editDialogVisible = true;
this.detailDialogVisible = false;
this.$nextTick(() => {
@@ -1070,33 +1447,156 @@
}
},
- // 鏂囦欢涓婁紶澶勭悊
- handleAttachmentChange(file, fileList) {
- this.editForm.attachmentFiles = fileList;
+ // 闄勪欢鍙樺寲澶勭悊
+ handleAttachmentChange(fileList) {
+ this.attachmentFileList = fileList;
},
- handleMinutesAttachmentChange(file, fileList) {
- this.editForm.recordattachmentFiles = fileList;
+ handleMinutesAttachmentChange(fileList) {
+ this.minutesAttachmentFileList = fileList;
+ },
+ // 闄勪欢涓婁紶鎴愬姛澶勭悊
+ handleAttachmentUploadSuccess({ file, fileList, response }) {
+ if (response && response.code === 200) {
+ if (!this.editForm.attachment) {
+ this.editForm.attachment = [];
+ }
+
+ console.log(file, "file");
+ console.log(response, "response");
+
+ const attachmentObj = {
+ name: file.name,
+ url: response.data || file.url,
+ fileName: file.name,
+ size: file.size || 0,
+ type: this.getFileExtension(file.name),
+ createTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+ };
+ console.log(this.editForm.attachment, "this.editForm.attachment");
+
+ this.editForm.attachment.push(attachmentObj);
+ console.log(this.editForm.attachment, "this.editForm.attachment");
+
+ this.$message.success("浼氳闄勪欢涓婁紶鎴愬姛");
+ }
+ },
+ handleMinutesUploadSuccess({ file, fileList, response }) {
+ if (response && response.code === 200) {
+ if (!this.editForm.recordattachment) {
+ this.editForm.recordattachment = [];
+ }
+
+ const attachmentObj = {
+ name: file.name,
+ url: response.data || file.url,
+ fileName: file.name,
+ size: file.size || 0,
+ type: this.getFileExtension(file.name),
+ createTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+ };
+ this.editForm.recordattachment.push(attachmentObj);
+ this.$message.success("绾闄勪欢涓婁紶鎴愬姛");
+ }
+ },
+ // 闄勪欢涓婁紶閿欒澶勭悊
+ handleAttachmentUploadError({ file, fileList, error }) {
+ console.error("浼氳闄勪欢涓婁紶澶辫触:", error);
+ this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
},
- // 鍒犻櫎宸蹭笂浼犵殑鏂囦欢
- handleRemoveAttachmentFile(index) {
- this.editForm.attachmentFiles.splice(index, 1);
+ handleMinutesUploadError({ file, fileList, error }) {
+ console.error("绾闄勪欢涓婁紶澶辫触:", error);
+ this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+ },
+ // 闄勪欢绉婚櫎澶勭悊
+ handleAttachmentRemove(file) {
+ if (file.url && this.editForm.attachment) {
+ const index = this.editForm.attachment.findIndex(
+ item =>
+ item.url === file.url ||
+ item.path === file.url ||
+ item.fileUrl === file.url
+ );
+ if (index > -1) {
+ this.editForm.attachment.splice(index, 1);
+ }
+ }
},
+ handleMinutesAttachmentRemove(file) {
+ if (file.url && this.editForm.recordattachment) {
+ const index = this.editForm.recordattachment.findIndex(
+ item =>
+ item.url === file.url ||
+ item.path === file.url ||
+ item.fileUrl === file.url
+ );
+ if (index > -1) {
+ this.editForm.recordattachment.splice(index, 1);
+ }
+ }
+ },
+ // 鎵嬪姩鍒犻櫎闄勪欢
+ handleRemoveMeetingAttachment(index) {
+ if (this.editForm.attachment && this.editForm.attachment[index]) {
+ this.editForm.attachment.splice(index, 1);
+ this.attachmentFileList.splice(index, 1);
+ this.$message.success("浼氳闄勪欢鍒犻櫎鎴愬姛");
+ }
+ },
+
+ handleRemoveMinutesAttachment(index) {
+ if (
+ this.editForm.recordattachment &&
+ this.editForm.recordattachment[index]
+ ) {
+ this.editForm.recordattachment.splice(index, 1);
+ this.minutesAttachmentFileList.splice(index, 1);
+ this.$message.success("绾闄勪欢鍒犻櫎鎴愬姛");
+ }
+ },
+ // 鏂囦欢棰勮
+ handlePreviewAttachment(file) {
+ this.currentPreviewFile = {
+ fileName: file.name || file.fileName,
+ fileUrl: file.url || file.path || file.fileUrl,
+ fileType: this.getFileType(file.name)
+ };
+ this.previewVisible = true;
+ },
+
+ handlePreviewMinutesAttachment(file) {
+ this.currentPreviewFile = {
+ fileName: file.name || file.fileName,
+ fileUrl: file.url || file.path || file.fileUrl,
+ fileType: this.getFileType(file.name)
+ };
+ this.previewVisible = true;
+ },
// 鏂囦欢涓嬭浇
handleDownload(file) {
if (file.url) {
const link = document.createElement("a");
link.href = file.url;
- link.download = file.name;
+ link.download = file.name || file.fileName || "download";
+ link.style.display = "none";
+ document.body.appendChild(link);
link.click();
- this.$message.success(`寮�濮嬩笅杞�: ${file.name}`);
+ document.body.removeChild(link);
+ this.$message.success("寮�濮嬩笅杞芥枃浠�");
} else {
- this.$message.warning("鏂囦欢鍦板潃涓嶅瓨鍦�");
+ this.$message.warning("鏂囦欢鍦板潃涓嶅瓨鍦紝鏃犳硶涓嬭浇");
}
},
-
+ // 鑾峰彇鏂囦欢鎵╁睍鍚�
+ getFileExtension(filename) {
+ if (!filename) return "";
+ return filename
+ .split(".")
+ .pop()
+ .toLowerCase();
+ },
// 淇濆瓨璁板綍
async handleSave() {
try {
@@ -1113,34 +1613,55 @@
}
}
+ // 妫�鏌ユ槸鍚︽湁鏈笂浼犲畬鎴愮殑鏂囦欢
+ const pendingFiles = [
+ ...this.attachmentFileList.filter(item => item.status !== "success"),
+ ...this.minutesAttachmentFileList.filter(
+ item => item.status !== "success"
+ )
+ ];
+
+ if (pendingFiles.length > 0) {
+ this.$message.warning(
+ "杩樻湁鏂囦欢鏈笂浼犲畬鎴愶紝璇峰厛涓婁紶鎵�鏈夋枃浠舵垨绉婚櫎鏈笂浼犵殑鏂囦欢"
+ );
+ return;
+ }
+
this.saveLoading = true;
- // 澶勭悊闄勪欢
+ // 鍑嗗鏁版嵁
const formData = { ...this.editForm };
- if (formData.attachmentFiles) {
+ // 澶勭悊闄勪欢涓篔SON瀛楃涓�
+ if (formData.attachment && Array.isArray(formData.attachment)) {
formData.attachment = JSON.stringify(
- formData.attachmentFiles.map(file => ({
- name: file.name,
- url: file.url || "",
- size: file.size || 0,
- type: file.type || file.name.split(".").pop()
+ formData.attachment.map(item => ({
+ name: item.name || item.fileName,
+ url: item.url || item.path || item.fileUrl,
+ size: item.size || 0,
+ type:
+ item.type || this.getFileExtension(item.name || item.fileName)
}))
);
}
- if (formData.recordattachmentFiles) {
+ if (
+ formData.recordattachment &&
+ Array.isArray(formData.recordattachment)
+ ) {
formData.recordattachment = JSON.stringify(
- formData.recordattachmentFiles.map(file => ({
- name: file.name,
- url: file.url || "",
- size: file.size || 0,
- type: file.type || file.name.split(".").pop()
+ formData.recordattachment.map(item => ({
+ name: item.name || item.fileName,
+ url: item.url || item.path || item.fileUrl,
+ size: item.size || 0,
+ type:
+ item.type || this.getFileExtension(item.name || item.fileName)
}))
);
}
- // 娓呯悊鏂囦欢鍒楄〃瀛楁
+ // 娓呯悊涓存椂瀛楁
delete formData.attachmentFiles;
delete formData.recordattachmentFiles;
@@ -1179,6 +1700,8 @@
this.editDialogVisible = false;
this.currentRecord = {};
this.editForm = this.getDefaultFormData();
+ this.attachmentFileList = [];
+ this.minutesAttachmentFileList = [];
this.$nextTick(() => {
this.$refs.editForm && this.$refs.editForm.clearValidate();
});
@@ -1216,7 +1739,7 @@
console.log("鎺掑簭鍙樺寲:", sort);
},
- // 鑾峰彇榛樿琛ㄥ崟鏁版嵁
+ // 榛樿琛ㄥ崟鏁版嵁
getDefaultFormData() {
return {
id: null,
@@ -1227,19 +1750,14 @@
endTime: "",
summary: "",
content: "",
- attachment: null,
- attachmentFiles: [],
- status: 1, // 榛樿寰呭紑濮�
- isRecurring: 0,
- recurringPattern: null,
- parentMeetingId: null,
- reminderMinutes: 30,
+ attachment: [], // 鏀逛负鏁扮粍
recordcontent: "",
- recordattachment: null,
- recordattachmentFiles: [],
+ recordattachment: [], // 鏀逛负鏁扮粍
recorderBy: "",
remark: "",
- approvalStatus: 0 // 榛樿寰呭鏍�
+ status: 1,
+ reminderMinutes: 30,
+ approvalStatus: 0
};
}
}
@@ -1247,6 +1765,170 @@
</script>
<style scoped>
+.meeting-management {
+ padding: 20px;
+}
+
+.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;
+}
+/* 鍥剧墖闄勪欢鏍峰紡 */
+.image-attachment {
+ border-radius: 4px;
+ border: 1px solid #ebeef5;
+ cursor: pointer;
+ transition: all 0.3s;
+ margin-bottom: 8px;
+}
+
+.image-attachment:hover {
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+ transform: translateY(-2px);
+}
+
+.image-info {
+ text-align: center;
+ padding: 4px 0;
+}
+
+.image-info .file-name {
+ font-size: 12px;
+ color: #606266;
+ margin-bottom: 4px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ max-width: 100px;
+}
+
+.image-info .file-actions {
+ display: flex;
+ justify-content: center;
+ gap: 8px;
+}
+
+.image-loading,
+.image-error {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+ color: #909399;
+ font-size: 12px;
+}
+
+.image-loading i,
+.image-error i {
+ font-size: 20px;
+ margin-bottom: 4px;
+}
+
+/* 鏂囦欢鍗$墖鏍峰紡 */
+.file-card {
+ width: 100%;
+ min-height: 60px;
+ margin-bottom: 8px;
+}
+
+.file-content {
+ display: flex;
+ align-items: center;
+}
+
+.file-icon {
+ font-size: 24px;
+ margin-right: 12px;
+ color: #409eff;
+ flex-shrink: 0;
+}
+
+.file-info {
+ flex: 1;
+ min-width: 0;
+}
+
+.file-name {
+ font-size: 13px;
+ font-weight: 500;
+ margin-bottom: 4px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.file-meta {
+ display: flex;
+ justify-content: space-between;
+ font-size: 12px;
+ color: #909399;
+}
+
+.file-actions {
+ margin-top: 8px;
+ text-align: right;
+}
+
+/* 闄勪欢缃戞牸甯冨眬 */
+.attachment-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
+ gap: 16px;
+}
+
+.attachment-card {
+ display: flex;
+ flex-direction: column;
+}
+
+/* 鍝嶅簲寮忚皟鏁� */
+@media (max-width: 768px) {
+ .attachment-grid {
+ grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
+ gap: 12px;
+ }
+
+ .image-attachment {
+ width: 80px !important;
+ height: 80px !important;
+ }
+}
+.file-name {
+ font-size: 13px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+/* 鍏朵粬鏍峰紡淇濇寔涓嶅彉 */
.meeting-management {
padding: 20px;
}
@@ -1276,6 +1958,7 @@
.attachment-item {
margin-bottom: 8px;
}
+
.minutes-content {
margin-bottom: 16px;
}
@@ -1291,6 +1974,7 @@
margin: 0 -20px;
}
}
+
/* 鍝嶅簲寮忚璁� */
@media (max-width: 768px) {
.page-header {
@@ -1304,6 +1988,7 @@
justify-content: space-between;
}
}
+
/* 鏂板闄勪欢鐩稿叧鏍峰紡 */
.attachment-upload-section {
border: 1px solid #ebeef5;
diff --git a/src/views/business/appear/caseDetail.vue b/src/views/business/appear/caseDetail.vue
index 2c9d4b5..362085c 100644
--- a/src/views/business/appear/caseDetail.vue
+++ b/src/views/business/appear/caseDetail.vue
@@ -13,10 +13,7 @@
caseData.name || "-"
}}</el-descriptions-item>
<el-descriptions-item label="鎬у埆">
- <dict-tag
- :options="dict.type.sys_user_sex"
- :value="caseData.sex ? parseInt(caseData.sex) : ''"
- />
+ <dict-tag :options="dict.type.sys_user_sex" :value="caseData.sex" />
</el-descriptions-item>
<el-descriptions-item label="骞撮緞">
{{ caseData.age || "-"
@@ -130,6 +127,12 @@
<el-descriptions-item label="閮ㄩ棬鍚嶇О">{{
caseData.deptName || "-"
}}</el-descriptions-item>
+ <el-descriptions-item label="閮ㄩ棬缂栧彿">{{
+ caseData.deptNo || "-"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="涓婃姤鍖婚櫌">{{
+ caseData.toHospital || "-"
+ }}</el-descriptions-item>
</el-descriptions>
</el-card>
@@ -160,7 +163,7 @@
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="鎶ュ憡鏃堕棿">{{
- formatDateTime(caseData.reporttime)
+ formatDateTime(caseData.createTime)
}}</el-descriptions-item>
<el-descriptions-item label="鏄惁缁堟妗堜緥">
{{ caseData.terminationCase === "1" ? "宸茬粓姝�" : "杩涜涓�" }}
@@ -169,46 +172,112 @@
</el-card>
<!-- 闄勪欢淇℃伅妯″潡 -->
- <el-card class="detail-section" v-if="attachmentList.length > 0">
+ <el-card
+ class="detail-section"
+ v-if="caseData.annexfilesList && caseData.annexfilesList.length > 0"
+ >
<div slot="header" class="section-header">
<span class="section-title">闄勪欢淇℃伅</span>
</div>
- <el-table :data="attachmentList" style="width: 100%">
- <el-table-column label="鏂囦欢鍚�" width="300">
- <template slot-scope="scope">
- <i class="el-icon-document" style="margin-right: 8px;"></i>
- <span>{{ scope.row.fileName }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鏂囦欢绫诲瀷" width="120">
- <template slot-scope="scope">
- <el-tag size="small">{{ scope.row.fileType }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="澶у皬" width="100">
- <template slot-scope="scope">
- <span>{{ formatFileSize(scope.row.fileSize) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="涓婁紶鏃堕棿" width="180">
- <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
- >
- </template>
- </el-table-column>
- </el-table>
+ <div class="detail-attachments">
+ <div class="attachment-grid">
+ <div
+ v-for="file in caseData.annexfilesList"
+ :key="file.id || file.fileName"
+ class="attachment-card"
+ >
+ <template v-if="isImageFile(file.fileName || file.path)">
+ <!-- 鍥剧墖浣跨敤 el-image 棰勮 -->
+ <el-image
+ class="image-attachment"
+ :src="getFileUrl(file)"
+ :preview-src-list="getImagePreviewList(file)"
+ fit="cover"
+ :style="{ width: '120px', height: '120px' }"
+ lazy
+ >
+ <div slot="error" class="image-error">
+ <i class="el-icon-picture-outline"></i>
+ <span>鍔犺浇澶辫触</span>
+ </div>
+ <div slot="placeholder" class="image-loading">
+ <i class="el-icon-loading"></i>
+ </div>
+ </el-image>
+ <div class="image-info">
+ <div class="file-name" :title="file.fileName">
+ {{ file.fileName }}
+ </div>
+ <div class="file-actions">
+ <el-button
+ type="text"
+ size="mini"
+ @click="handleDownload(file)"
+ icon="el-icon-download"
+ title="涓嬭浇"
+ />
+ <el-button
+ type="text"
+ size="mini"
+ @click="handlePreview(file)"
+ icon="el-icon-view"
+ title="棰勮"
+ />
+ </div>
+ </div>
+ </template>
+
+ <template v-else>
+ <!-- 闈炲浘鐗囨枃浠朵娇鐢ㄥ崱鐗囨牱寮� -->
+ <el-card shadow="hover" class="file-card">
+ <div class="file-content">
+ <i :class="getFileIcon(file.fileName)" class="file-icon"></i>
+ <div class="file-info">
+ <div class="file-name" :title="file.fileName">
+ {{ file.fileName }}
+ </div>
+ <div class="file-meta">
+ <span class="file-type">{{
+ getFileTypeText(file.fileName)
+ }}</span>
+ <span v-if="file.createTime" class="file-time">
+ {{ formatDateTime(file.createTime) }}
+ </span>
+ </div>
+ </div>
+ </div>
+ <div class="file-actions">
+ <el-button
+ type="text"
+ size="mini"
+ @click="handleDownload(file)"
+ >
+ 涓嬭浇
+ </el-button>
+ <el-button
+ v-if="canPreview(file.fileName)"
+ type="text"
+ size="mini"
+ @click="handlePreview(file)"
+ >
+ 棰勮
+ </el-button>
+ </div>
+ </el-card>
+ </template>
+ </div>
+ </div>
+ </div>
+ </el-card>
+
+ <!-- 澶囨敞淇℃伅 -->
+ <el-card class="detail-section" v-if="caseData.remark">
+ <div slot="header" class="section-header">
+ <span class="section-title">澶囨敞淇℃伅</span>
+ </div>
+ <div class="remark-content">
+ {{ caseData.remark }}
+ </div>
</el-card>
<!-- 瀹℃壒淇℃伅妯″潡锛堢姸鎬佷负宸插悓鎰忔垨宸查┏鍥炴椂鏄剧ず锛� -->
@@ -225,133 +294,108 @@
{{ caseData.reportStatus === "3" ? "宸插悓鎰�" : "宸查┏鍥�" }}
</el-tag>
</el-descriptions-item>
- <el-descriptions-item label="瀹℃壒鏃堕棿">{{
- formatDateTime(caseData.updateTime)
- }}</el-descriptions-item>
<el-descriptions-item label="瀹℃壒浜�">{{
caseData.updateBy || "-"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="瀹℃壒鏃堕棿">{{
+ formatDateTime(caseData.updateTime)
}}</el-descriptions-item>
<el-descriptions-item label="瀹℃壒鎰忚">{{
caseData.remark || "鏃�"
}}</el-descriptions-item>
</el-descriptions>
</el-card>
-
- <!-- PDF棰勮寮圭獥 -->
- <el-dialog
- :title="previewTitle"
- :append-to-body="true"
- :visible.sync="pdfPreviewVisible"
- width="90%"
- top="5vh"
- :close-on-click-modal="true"
- class="pdf-preview-dialog"
- @close="handlePdfDialogClose"
+ <el-card
+ class="detail-section"
+ v-if="
+ caseData.isTransport == '2' &&
+ caseData.serviceTransport &&
+ caseData.serviceTransport.length > 0
+ "
>
- <div class="pdf-preview-container" v-loading="pdfLoading">
- <!-- PDF鎺у埗宸ュ叿鏍� -->
- <div class="pdf-toolbar">
- <el-button-group>
- <el-button
- size="mini"
- @click="changePage(currentPage - 1)"
- :disabled="currentPage <= 1"
- icon="el-icon-arrow-left"
- >
- 涓婁竴椤�
- </el-button>
- <el-button size="mini" disabled>
- 绗� {{ currentPage }} 椤� / 鍏� {{ pageCount }} 椤�
- </el-button>
- <el-button
- size="mini"
- @click="changePage(currentPage + 1)"
- :disabled="currentPage >= pageCount"
- icon="el-icon-arrow-right"
- >
- 涓嬩竴椤�
- </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="downloadPdf(currentFile)"
- icon="el-icon-download"
- >
- 涓嬭浇
- </el-button>
- </div>
-
- <!-- PDF娓叉煋鍖哄煙 -->
- <div class="pdf-viewport">
- <pdf
- ref="pdf"
- :src="pdfUrl"
- :page="currentPage"
- :rotate="pageRotate"
- @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 slot="header" class="section-header">
+ <span class="section-title">杞繍淇℃伅</span>
+ <el-button
+ v-if="caseData.reportStatus === '3'"
+ type="primary"
+ size="small"
+ icon="el-icon-truck"
+ @click="handleViewTransport"
+ >
+ 鏌ョ湅杞繍璇︽儏
+ </el-button>
</div>
- </el-dialog>
- <!-- 鍥剧墖棰勮寮圭獥 -->
- <el-dialog
- :append-to-body="true"
- :title="previewTitle"
- :visible.sync="imagePreviewVisible"
- width="60%"
- top="10vh"
- :close-on-click-modal="true"
+ <el-descriptions :column="2" border>
+ <el-descriptions-item
+ v-for="transport in caseData.serviceTransport"
+ :key="transport.id"
+ >
+ <!-- 杞繍鍗曞垪琛� -->
+ <div class="transport-info">
+ <div class="transport-item">
+ <strong>杞繍鍗曞彿:</strong> {{ transport.reportId || "-" }}
+ </div>
+ <div class="transport-item">
+ <strong>鎮h�呭鍚�:</strong> {{ transport.patName || "-" }}
+ </div>
+ <div class="transport-item">
+ <strong>鍑哄彂鍦扮偣:</strong>
+ {{ transport.transportStartPlace || "-" }}
+ </div>
+ <div class="transport-item">
+ <strong>鍑哄彂鏃堕棿:</strong>
+ {{ formatDateTime(transport.transportStartTime) }}
+ </div>
+ <div class="transport-item">
+ <strong>杞繍鐘舵��:</strong>
+ <el-tag :type="getTransportStatusTag(transport)" size="small">
+ {{ getTransportStatusText(transport) }}
+ </el-tag>
+ </div>
+ <div class="transport-item">
+ <strong>璐熻矗鍗忚皟鍛�:</strong> {{ transport.contactPerson || "-" }}
+ </div>
+ <div class="transport-item" v-if="transport.remark">
+ <strong>澶囨敞:</strong> {{ transport.remark }}
+ </div>
+ </div>
+ </el-descriptions-item>
+ </el-descriptions>
+ </el-card>
+
+ <!-- 鏃犺浆杩愪俊鎭絾闇�瑕佽浆杩愮殑鎻愮ず -->
+ <el-card
+ class="detail-section"
+ v-else-if="caseData.isTransport === '2' && caseData.reportStatus === '3'"
>
- <div class="image-preview-container">
- <img :src="previewUrl" alt="棰勮鍥剧墖" class="preview-image" />
+ <div slot="header" class="section-header">
+ <span class="section-title">杞繍淇℃伅</span>
+ <el-button
+ type="primary"
+ size="small"
+ icon="el-icon-truck"
+ @click="handleCreateTransport"
+ >
+ 鍒涘缓杞繍鍗�
+ </el-button>
</div>
- </el-dialog>
- <!-- 涓嶆敮鎸侀瑙堢殑鏂囦欢绫诲瀷 -->
- <el-dialog
- :title="previewTitle"
- :visible.sync="unsupportedPreviewVisible"
- width="400px"
- :close-on-click-modal="true"
- >
- <div class="unsupported-preview">
- <el-alert
- title="璇ユ枃浠舵牸寮忎笉鏀寔鍦ㄧ嚎棰勮锛岃涓嬭浇鍚庢煡鐪�"
- type="warning"
- show-icon
- :closable="false"
- />
- <div style="text-align: center; margin-top: 20px;">
- <el-button type="primary" @click="handleDownload(currentFile)">
- <i class="el-icon-download"></i> 涓嬭浇鏂囦欢
- </el-button>
- </div>
- </div>
- </el-dialog>
+ <el-alert
+ title="璇ユ渚嬮渶瑕佽浆杩愶紝浣嗗皻鏈垱寤鸿浆杩愬崟"
+ type="warning"
+ description="璇风偣鍑讳笂鏂规寜閽垱寤鸿浆杩愬崟"
+ show-icon
+ :closable="false"
+ />
+ </el-card>
+ <!-- 鏂囦欢棰勮寮圭獥 -->
+ <FilePreviewDialog
+ :visible="previewVisible"
+ :file="currentPreviewFile"
+ @close="previewVisible = false"
+ @download="handleDownload"
+ />
<div class="detail-footer" v-if="showtitle">
<el-button @click="handleClose">鍏抽棴</el-button>
@@ -361,11 +405,13 @@
<script>
import pdf from "vue-pdf";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
export default {
name: "CaseDetail",
components: {
- pdf
+ pdf,
+ FilePreviewDialog
},
props: {
caseData: {
@@ -378,52 +424,29 @@
}
},
dicts: ["sys_user_sex", "sys_BloodType"],
- filters: {
- statusFilter(status) {
- const statusMap = {
- "0": "warning",
- "1": "success",
- "2": "danger"
- };
- return statusMap[status];
- },
- statusTextFilter(status) {
- const statusMap = {
- "0": "寰呭鎵�",
- "1": "宸查�氳繃",
- "2": "宸查┏鍥�"
- };
- return statusMap[status];
- }
- },
data() {
return {
- // 棰勮鐩稿叧鏁版嵁锛堜繚鎸佸師鏈変唬鐮侊級
- pdfPreviewVisible: false,
- imagePreviewVisible: false,
- unsupportedPreviewVisible: false,
- pdfLoading: false,
- pdfUrl: "",
- currentPage: 1,
- pageCount: 0,
- scale: 100,
- pageRotate: 0,
- previewTitle: "",
- previewUrl: "",
- currentFile: null,
+ // 棰勮鐩稿叧
+ previewVisible: false,
+ currentPreviewFile: null,
- // 闄勪欢鍒楄〃
- attachmentList: []
+ // 鍥剧墖棰勮鐩稿叧
+ imagePreviewUrls: []
};
},
- watch: {
- caseData: {
- immediate: true,
- handler(newVal) {
- if (newVal && newVal.annexfilesList) {
- this.loadAttachments(newVal.annexfilesList);
- }
+ computed: {
+ // 鏀堕泦鎵�鏈夊浘鐗嘦RL鐢ㄤ簬棰勮
+ allImageUrls() {
+ if (
+ !this.caseData.annexfilesList ||
+ !Array.isArray(this.caseData.annexfilesList)
+ ) {
+ return [];
}
+ return this.caseData.annexfilesList
+ .filter(file => this.isImageFile(file.fileName || file.path))
+ .map(file => this.getFileUrl(file))
+ .filter(url => url);
}
},
methods: {
@@ -431,37 +454,10 @@
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);
+ formatDateTime(dateTime) {
+ if (!dateTime) return "-";
+ return dateTime.replace("T", " ").substring(0, 19);
},
// 鏍煎紡鍖栨棩鏈�
@@ -469,7 +465,75 @@
if (!dateString) return "-";
return dateString.split("T")[0];
},
+ getTransportStatusTag(transport) {
+ if (!transport.transitStatus) return "info";
+ switch (transport.transitStatus.toString()) {
+ case "1":
+ return "warning"; // 寰呰浆杩�
+ case "2":
+ return "primary"; // 杞繍涓�
+ case "3":
+ return "success"; // 杞繍瀹屾垚
+ case "4":
+ return "danger"; // 杞繍鍙栨秷
+ case "5":
+ return "info"; // 鏆傚瓨
+ default:
+ return "info";
+ }
+ },
+ /** 鑾峰彇杞繍鐘舵�佹枃鏈� */
+ getTransportStatusText(transport) {
+ if (!transport.transitStatus) return "鏈煡";
+ switch (transport.transitStatus.toString()) {
+ case "1":
+ return "寰呰浆杩�";
+ case "2":
+ return "杞繍涓�";
+ case "3":
+ return "杞繍瀹屾垚";
+ case "4":
+ return "杞繍鍙栨秷";
+ case "5":
+ return "鏆傚瓨";
+ default:
+ return "鏈煡";
+ }
+ },
+
+ /** 鏌ョ湅杞繍璇︽儏 */
+ handleViewTransport() {
+ if (
+ this.caseData.serviceTransport &&
+ this.caseData.serviceTransport.length > 0
+ ) {
+ const transport = this.caseData.serviceTransport[0];
+ this.$router.push({
+ path: "/business/transport/detail",
+ query: {
+ id: transport.id,
+ caseNo: this.caseData.caseNo
+ }
+ });
+ }
+ },
+
+ /** 鍒涘缓杞繍鍗� */
+ handleCreateTransport() {
+ this.$router.push({
+ path: "/business/transport/create",
+ query: {
+ caseId: this.caseData.id,
+ caseNo: this.caseData.caseNo,
+ patName: this.caseData.name,
+ age: this.caseData.age,
+ sex: this.caseData.sex,
+ diagnosisname: this.caseData.diagnosisname,
+ treatmentHospitalName: this.caseData.treatmenthospitalname
+ }
+ });
+ },
// 鑾峰彇瀹屾暣鎴风睄鍦板潃
getFullRegisterAddress() {
const {
@@ -550,113 +614,127 @@
return typeMap[type] || type || "-";
},
- // 鏂囦欢棰勮鐩稿叧鏂规硶锛堜繚鎸佸師鏈変唬鐮侊級
+ // 鏂囦欢澶勭悊鐩稿叧鏂规硶
+ isImageFile(fileName) {
+ if (!fileName) return false;
+ const imageExtensions = [
+ "jpg",
+ "jpeg",
+ "png",
+ "gif",
+ "bmp",
+ "webp",
+ "svg"
+ ];
+ const extension = fileName
+ .split(".")
+ .pop()
+ .toLowerCase();
+ return imageExtensions.includes(extension);
+ },
+
+ getFileUrl(file) {
+ return file.path || file.fileUrl || "";
+ },
+
+ getImagePreviewList(file) {
+ // 杩斿洖鎵�鏈夊浘鐗囩殑URL鍒楄〃锛屽疄鐜扮偣鍑讳换鎰忓浘鐗囨煡鐪嬫墍鏈夊浘鐗�
+ return this.allImageUrls;
+ },
+
+ getFileIcon(fileName) {
+ if (!fileName) return "el-icon-document";
+ const ext = fileName
+ .split(".")
+ .pop()
+ .toLowerCase();
+ const iconMap = {
+ pdf: "el-icon-document",
+ doc: "el-icon-document",
+ docx: "el-icon-document",
+ xls: "el-icon-document",
+ xlsx: "el-icon-document",
+ jpg: "el-icon-picture",
+ jpeg: "el-icon-picture",
+ png: "el-icon-picture",
+ gif: "el-icon-picture"
+ };
+ return iconMap[ext] || "el-icon-document";
+ },
+
+ getFileTypeText(fileName) {
+ if (!fileName) return "鏂囦欢";
+ const ext = fileName
+ .split(".")
+ .pop()
+ .toLowerCase();
+ const typeMap = {
+ pdf: "PDF鏂囨。",
+ doc: "Word鏂囨。",
+ docx: "Word鏂囨。",
+ xls: "Excel琛ㄦ牸",
+ xlsx: "Excel琛ㄦ牸",
+ jpg: "鍥剧墖",
+ jpeg: "鍥剧墖",
+ png: "鍥剧墖",
+ gif: "鍥剧墖"
+ };
+ return typeMap[ext] || "鏂囦欢";
+ },
+
+ canPreview(fileName) {
+ if (!fileName) return false;
+ const previewableExtensions = ["pdf", "jpg", "jpeg", "png", "gif"];
+ const extension = fileName
+ .split(".")
+ .pop()
+ .toLowerCase();
+ return previewableExtensions.includes(extension);
+ },
+
+ // 鏂囦欢棰勮
+ handlePreview(file) {
+ this.currentPreviewFile = {
+ fileName: file.fileName,
+ fileUrl: this.getFileUrl(file),
+ fileType: this.getFileType(file.fileName)
+ };
+ this.previewVisible = true;
+ },
+
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"];
+
if (imageTypes.includes(extension)) return "image";
if (pdfTypes.includes(extension)) return "pdf";
+ if (officeTypes.includes(extension)) return "office";
return "other";
},
- handlePreview(file) {
- this.currentFile = file;
- this.previewTitle = `棰勮 - ${file.fileName}`;
- this.previewUrl = file.fileUrl;
- const fileType = this.getFileType(file.fileName);
-
- switch (fileType) {
- case "pdf":
- this.previewPdf(file);
- break;
- case "image":
- this.previewImage(file);
- break;
- default:
- this.previewUnsupported(file);
- break;
- }
- },
-
- previewPdf(file) {
- this.pdfPreviewVisible = true;
- this.pdfLoading = true;
- this.currentPage = 1;
- this.scale = 100;
- this.pageRotate = 0;
- this.pdfUrl = file.fileUrl;
- },
-
- loadPdfHandler() {
- this.pdfLoading = false;
- this.currentPage = 1;
- },
-
- pdfErrorHandler(error) {
- console.error("PDF鍔犺浇澶辫触:", error);
- this.pdfLoading = false;
- this.$message.error("PDF鏂囦欢鍔犺浇澶辫触锛岃灏濊瘯涓嬭浇鍚庢煡鐪�");
- this.pdfPreviewVisible = false;
- },
-
- changePage(newPage) {
- if (newPage < 1 || newPage > this.pageCount) return;
- this.currentPage = newPage;
- },
-
- zoomIn() {
- if (this.scale >= 200) return;
- this.scale += 10;
- },
-
- zoomOut() {
- if (this.scale <= 50) return;
- this.scale -= 10;
- },
-
- resetZoom() {
- this.scale = 100;
- },
-
- previewImage(file) {
- this.imagePreviewVisible = true;
- },
-
- previewUnsupported(file) {
- this.unsupportedPreviewVisible = true;
- },
-
- handlePdfDialogClose() {
- this.pdfUrl = "";
- this.currentPage = 1;
- this.pageCount = 0;
- },
-
+ // 鏂囦欢涓嬭浇
handleDownload(file) {
- const link = document.createElement("a");
- link.href = file.fileUrl;
- link.download = file.fileName;
- link.style.display = "none";
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- this.$message.success("寮�濮嬩笅杞芥枃浠�");
- },
+ const fileUrl = this.getFileUrl(file);
+ const fileName = file.fileName;
- downloadPdf(file) {
- this.handleDownload(file);
- },
-
- formatFileSize(bytes) {
- if (bytes === 0) return "0 B";
- const k = 1024;
- const sizes = ["B", "KB", "MB", "GB"];
- const i = Math.floor(Math.log(bytes) / Math.log(k));
- return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
+ 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("鏂囦欢璺緞涓嶅瓨鍦紝鏃犳硶涓嬭浇");
+ }
}
}
};
@@ -667,83 +745,144 @@
padding: 0 20px;
}
-/* PDF棰勮瀵硅瘽妗嗘牱寮� */
-.pdf-preview-dialog {
- margin-top: 5vh !important;
+.detail-section {
+ margin-bottom: 16px;
}
-.pdf-preview-dialog >>> .el-dialog {
- min-height: 80vh;
- display: flex;
- flex-direction: column;
-}
-
-.pdf-preview-dialog >>> .el-dialog__body {
- flex: 1;
- padding: 0;
- display: flex;
- flex-direction: column;
-}
-
-.pdf-preview-container {
- display: flex;
- flex-direction: column;
- height: 100%;
-}
-
-/* PDF宸ュ叿鏍忔牱寮� */
-.pdf-toolbar {
- padding: 15px 20px;
- background: #f5f7fa;
- border-bottom: 1px solid #ebeef5;
+.section-header {
display: flex;
justify-content: space-between;
align-items: center;
- flex-wrap: wrap;
- gap: 10px;
}
-.zoom-controls {
- margin: 0 15px;
+.section-title {
+ font-size: 16px;
+ font-weight: bold;
+ color: #303133;
}
-/* PDF瑙嗗浘鍖哄煙鏍峰紡 */
-.pdf-viewport {
- flex: 1;
- overflow: auto;
- padding: 20px;
- background: #f8f9fa;
+/* 闄勪欢鏍峰紡 */
+.detail-attachments {
+ padding: 10px 0;
+}
+
+.attachment-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
+ gap: 16px;
+}
+
+.attachment-card {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+/* 鍥剧墖闄勪欢鏍峰紡 */
+.image-attachment {
+ border-radius: 4px;
+ border: 1px solid #ebeef5;
+ cursor: pointer;
+ transition: all 0.3s;
+ margin-bottom: 8px;
+}
+
+.image-attachment:hover {
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+ transform: translateY(-2px);
+}
+
+.image-info {
+ text-align: center;
+ width: 100%;
+}
+
+.image-info .file-name {
+ font-size: 12px;
+ color: #606266;
+ margin-bottom: 4px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ max-width: 120px;
+}
+
+.image-info .file-actions {
display: flex;
justify-content: center;
- align-items: flex-start;
+ gap: 8px;
}
-/* 鍥剧墖棰勮鏍峰紡 */
-.image-preview-container {
+.image-loading,
+.image-error {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+ color: #909399;
+ font-size: 12px;
+}
+
+.image-loading i,
+.image-error i {
+ font-size: 20px;
+ margin-bottom: 4px;
+}
+
+/* 鏂囦欢鍗$墖鏍峰紡 */
+.file-card {
+ width: 100%;
+ min-height: 60px;
+ margin-bottom: 8px;
+}
+
+.file-content {
+ display: flex;
+ align-items: center;
+ padding: 8px;
+}
+
+.file-icon {
+ font-size: 24px;
+ margin-right: 12px;
+ color: #409eff;
+ flex-shrink: 0;
+}
+
+.file-info {
+ flex: 1;
+ min-width: 0;
+}
+
+.file-name {
+ font-size: 13px;
+ font-weight: 500;
+ margin-bottom: 4px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.file-meta {
+ display: flex;
+ justify-content: space-between;
+ font-size: 12px;
+ color: #909399;
+}
+
+.file-actions {
text-align: center;
- padding: 20px;
+ padding: 8px;
+ border-top: 1px solid #f0f0f0;
}
-.preview-image {
- max-width: 100%;
- max-height: 70vh;
- box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
- .pdf-toolbar {
- flex-direction: column;
- gap: 10px;
- }
-
- .zoom-controls {
- margin: 10px 0;
- }
-
- .pdf-preview-dialog {
- width: 95% !important;
- }
+/* 澶囨敞鏍峰紡 */
+.remark-content {
+ padding: 12px;
+ line-height: 1.6;
+ color: #606266;
+ white-space: pre-line;
}
.detail-footer {
@@ -758,4 +897,19 @@
background-color: #f5f7fa;
font-weight: bold;
}
+/* 杞繍淇℃伅鏍峰紡 */
+.transport-info {
+ padding: 10px;
+}
+
+.transport-item {
+ margin-bottom: 8px;
+ line-height: 1.6;
+}
+
+.transport-item strong {
+ display: inline-block;
+ width: 100px;
+ color: #606266;
+}
</style>
diff --git a/src/views/business/appear/index.vue b/src/views/business/appear/index.vue
index 550ecda..4c578c3 100644
--- a/src/views/business/appear/index.vue
+++ b/src/views/business/appear/index.vue
@@ -67,6 +67,7 @@
</el-row>
<!-- 鏁版嵁琛ㄦ牸 -->
+ <!-- 鏁版嵁琛ㄦ牸 -->
<el-table
v-loading="loading"
:data="caseList"
@@ -74,12 +75,18 @@
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column
+ label="妗堜緥缂栧彿"
+ align="center"
+ prop="caseNo"
+ width="150"
+ fixed
+ />
+ <el-table-column
label="涓婃姤鏃堕棿"
align="center"
prop="reporttime"
width="160"
/>
-
<el-table-column
label="鎹愮尞鑰呭鍚�"
align="center"
@@ -87,27 +94,23 @@
width="100"
/>
<el-table-column label="鎬у埆" align="center" prop="sex" width="80">
- <template slot-scope="scope">
- <dict-tag
- :options="dict.type.sys_user_sex"
- :value="parseInt(scope.row.sex)"
- />
+ <template #default="scope">
+ <dict-tag :options="dict.type.sys_user_sex" :value="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">
+ <template #default="scope">
<dict-tag
:options="dict.type.sys_BloodType"
- :value="scope.row.bloodtype"
+ :value="scope.row.bloodType"
/>
</template>
</el-table-column>
-
<el-table-column
label="GCS璇勫垎"
align="center"
- prop="gscScore"
+ prop="gcsScore"
width="80"
show-overflow-tooltip
/>
@@ -130,9 +133,16 @@
prop="reportStatus"
width="100"
>
- <template slot-scope="scope">
+ <template #default="scope">
<el-tag :type="scope.row.reportStatus | statusFilter">
{{ scope.row.reportStatus | statusTextFilter }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="杞繍鐘舵��" align="center" width="100">
+ <template #default="scope">
+ <el-tag :type="getTransportStatusTag(scope.row)">
+ {{ getTransportStatusText(scope.row) }}
</el-tag>
</template>
</el-table-column>
@@ -141,9 +151,9 @@
align="center"
fixed="right"
class-name="small-padding fixed-width"
- width="200"
+ width="350"
>
- <template slot-scope="scope">
+ <template #default="scope">
<el-button
size="mini"
type="text"
@@ -151,15 +161,37 @@
@click="handleDetail(scope.row)"
>璇︽儏</el-button
>
-
+ <el-button
+ size="mini"
+ type="text"
+ icon="el-icon-edit"
+ @click="handleEdit(scope.row)"
+ v-if="
+ scope.row.reportStatus !== '3' &&
+ scope.row.reportStatus !== '4' &&
+ scope.row.delFlag === 0
+ "
+ >缂栬緫</el-button
+ >
<el-button
size="mini"
type="text"
icon="el-icon-check"
@click="handleApprove(scope.row)"
- v-if="scope.row.reportStatus === '2'"
+ v-if="scope.row.reportStatus === '2' && scope.row.delFlag === 0"
>瀹℃壒</el-button
>
+ <el-button
+ size="mini"
+ type="text"
+ icon="el-icon-truck"
+ :type="shouldShowTransportButton(scope.row) ? 'primary' : 'text'"
+ @click="handleTransport(scope.row)"
+ v-if="shouldShowTransportButton(scope.row)"
+ :disabled="!canGoToTransport(scope.row)"
+ >
+ {{ getTransportButtonText(scope.row) }}
+ </el-button>
</template>
</el-table-column>
</el-table>
@@ -237,26 +269,709 @@
<el-button type="primary" @click="submitApprove">纭畾</el-button>
</div>
</el-dialog>
+
+ <!-- 鏂板/缂栬緫妗堜緥寮规 -->
+ <el-dialog
+ :title="`${isEditing ? '缂栬緫' : '鏂板'}妗堜緥`"
+ :visible.sync="editOpen"
+ width="68%"
+ append-to-body
+ :close-on-click-modal="false"
+ @close="handleEditClose"
+ >
+ <el-form
+ ref="editForm"
+ :model="editForm"
+ :rules="editRules"
+ label-width="120px"
+ >
+ <!-- 鍩烘湰淇℃伅 -->
+ <el-card class="form-section" shadow="never">
+ <div slot="header" class="section-header">
+ <i
+ class="el-icon-user"
+ style="color: #409EFF; margin-right: 8px;"
+ ></i>
+ <span>鍩烘湰淇℃伅</span>
+ </div>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
+ <el-input
+ v-model="editForm.caseNo"
+ placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎹愮尞鑰呭鍚�" prop="name">
+ <el-input
+ v-model="editForm.name"
+ placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鎬у埆" prop="sex">
+ <el-select
+ v-model="editForm.sex"
+ placeholder="璇烽�夋嫨鎬у埆"
+ style="width: 100%"
+ >
+ <el-option label="鐢�" value="0" />
+ <el-option label="濂�" value="1" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="骞撮緞" prop="age">
+ <el-input-number
+ v-model="editForm.age"
+ :min="0"
+ :max="120"
+ placeholder="璇疯緭鍏ュ勾榫�"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="骞撮緞鍗曚綅" prop="ageunit">
+ <el-select
+ v-model="editForm.ageunit"
+ placeholder="璇烽�夋嫨骞撮緞鍗曚綅"
+ style="width: 100%"
+ >
+ <el-option label="宀�" value="year" />
+ <el-option label="鏈�" value="month" />
+ <el-option label="澶�" value="day" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="琛�鍨�" prop="bloodType">
+ <el-select
+ v-model="editForm.bloodType"
+ placeholder="璇烽�夋嫨琛�鍨�"
+ style="width: 100%"
+ >
+ <el-option label="A鍨�" value="A" />
+ <el-option label="B鍨�" value="B" />
+ <el-option label="O鍨�" value="O" />
+ <el-option label="AB鍨�" value="AB" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="Rh闃存��" prop="rhYin">
+ <el-radio-group v-model="editForm.rhYin">
+ <el-radio label="0">鍚�</el-radio>
+ <el-radio label="1">鏄�</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鍑虹敓鏃ユ湡" prop="birthday">
+ <el-date-picker
+ v-model="editForm.birthday"
+ type="date"
+ placeholder="閫夋嫨鍑虹敓鏃ユ湡"
+ value-format="yyyy-MM-dd"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="璇佷欢绫诲瀷" prop="idcardtype">
+ <el-select
+ v-model="editForm.idcardtype"
+ placeholder="璇烽�夋嫨璇佷欢绫诲瀷"
+ style="width: 100%"
+ >
+ <el-option label="韬唤璇�" value="1" />
+ <el-option label="鎶ょ収" value="2" />
+ <el-option label="鍐涘畼璇�" value="3" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="璇佷欢鍙风爜" prop="idcardno">
+ <el-input
+ v-model="editForm.idcardno"
+ placeholder="璇疯緭鍏ヨ瘉浠跺彿鐮�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="姘戞棌" prop="nation">
+ <el-input v-model="editForm.nation" placeholder="璇疯緭鍏ユ皯鏃�" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鍥界睄" prop="nationality">
+ <el-input
+ v-model="editForm.nationality"
+ placeholder="璇疯緭鍏ュ浗绫�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="绫嶈疮" prop="nativeplace">
+ <el-input
+ v-model="editForm.nativeplace"
+ placeholder="璇疯緭鍏ョ睄璐�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="瀛﹀巻" prop="education">
+ <el-input
+ v-model="editForm.education"
+ placeholder="璇疯緭鍏ュ鍘�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鑱屼笟" prop="occupation">
+ <el-input
+ v-model="editForm.occupation"
+ placeholder="璇疯緭鍏ヨ亴涓�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
+ <el-input
+ v-model="editForm.phone"
+ 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-location-information"
+ style="color: #67C23A; margin-right: 8px;"
+ ></i>
+ <span>鍦板潃淇℃伅</span>
+ </div>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鎴风睄鍦板潃鐪�">
+ <el-input
+ v-model="editForm.registerprovincename"
+ placeholder="璇疯緭鍏ユ埛绫嶅湴鍧�鐪�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎴风睄鍦板潃甯�">
+ <el-input
+ v-model="editForm.registercityname"
+ placeholder="璇疯緭鍏ユ埛绫嶅湴鍧�甯�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鎴风睄琛楅亾">
+ <el-input
+ v-model="editForm.registertownname"
+ placeholder="璇疯緭鍏ユ埛绫嶈閬�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎴风睄绀惧尯">
+ <el-input
+ v-model="editForm.registercommunityname"
+ placeholder="璇疯緭鍏ユ埛绫嶇ぞ鍖�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-form-item label="鎴风睄璇︾粏鍦板潃" prop="registeraddress">
+ <el-input
+ v-model="editForm.registeraddress"
+ type="textarea"
+ :rows="2"
+ placeholder="璇疯緭鍏ヨ缁嗙殑鎴风睄鍦板潃"
+ />
+ </el-form-item>
+
+ <el-divider>鐜颁綇鍦板潃</el-divider>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鐜颁綇鍦板潃鐪�">
+ <el-input
+ v-model="editForm.residenceprovincename"
+ placeholder="璇疯緭鍏ョ幇浣忓湴鍧�鐪�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鐜颁綇鍦板潃甯�/鍖�">
+ <el-input
+ v-model="editForm.residencecountyname"
+ placeholder="璇疯緭鍏ョ幇浣忓湴鍧�甯�/鍖�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鐜颁綇鍦板潃琛楅亾">
+ <el-input
+ v-model="editForm.residencetownname"
+ placeholder="璇疯緭鍏ョ幇浣忓湴鍧�琛楅亾"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鐜颁綇鍦板潃绀惧尯">
+ <el-input
+ v-model="editForm.residencecommunityname"
+ placeholder="璇疯緭鍏ョ幇浣忓湴鍧�绀惧尯"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-form-item label="鐜颁綇璇︾粏鍦板潃" prop="residenceaddress">
+ <el-input
+ v-model="editForm.residenceaddress"
+ type="textarea"
+ :rows="2"
+ placeholder="璇疯緭鍏ヨ缁嗙殑鐜颁綇鍦板潃"
+ />
+ </el-form-item>
+ </el-card>
+
+ <!-- 鍖荤枟淇℃伅 -->
+ <el-card class="form-section" shadow="never">
+ <div slot="header" class="section-header">
+ <i
+ class="el-icon-first-aid-kit"
+ style="color: #E6A23C; margin-right: 8px;"
+ ></i>
+ <span>鍖荤枟淇℃伅</span>
+ </div>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname">
+ <el-input
+ v-model="editForm.diagnosisname"
+ placeholder="璇疯緭鍏ョ柧鐥呰瘖鏂悕绉�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="GCS璇勫垎" prop="gcsScore">
+ <el-input
+ v-model="editForm.gcsScore"
+ placeholder="璇疯緭鍏CS璇勫垎"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-form-item label="鐥呮儏姒傚喌" prop="illnessoverview">
+ <el-input
+ v-model="editForm.illnessoverview"
+ type="textarea"
+ :rows="3"
+ placeholder="璇疯緭鍏ョ梾鎯呮鍐�"
+ maxlength="500"
+ show-word-limit
+ />
+ </el-form-item>
+
+ <el-form-item label="鐥呬汉鐘跺喌" prop="patientstate">
+ <el-input
+ v-model="editForm.patientstate"
+ type="textarea"
+ :rows="2"
+ placeholder="璇疯緭鍏ョ梾浜虹姸鍐�"
+ maxlength="200"
+ show-word-limit
+ />
+ </el-form-item>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="浼犳煋鐥呮儏鍐�" prop="infectious">
+ <el-input
+ v-model="editForm.infectious"
+ placeholder="璇疯緭鍏ヤ紶鏌撶梾鎯呭喌"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="浼犳煋鐥呭叾浠栬鏄�">
+ <el-input
+ v-model="editForm.infectiousOther"
+ placeholder="璇疯緭鍏ヤ紶鏌撶梾鍏朵粬璇存槑"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-form-item label="鏄惁闇�瑕佽浆杩�" prop="isTransport">
+ <el-radio-group v-model="editForm.isTransport">
+ <el-radio label="1">涓嶉渶瑕�</el-radio>
+ <el-radio label="2">闇�瑕�</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-card>
+
+ <!-- 鍖婚櫌淇℃伅 -->
+ <el-card class="form-section" shadow="never">
+ <div slot="header" class="section-header">
+ <i
+ class="el-icon-office-building"
+ style="color: #909399; 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="editForm.treatmenthospitalname"
+ placeholder="璇疯緭鍏ユ不鐤楀尰闄㈠悕绉�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="娌荤枟绉戝" prop="treatmentdeptname">
+ <el-input
+ v-model="editForm.treatmentdeptname"
+ placeholder="璇疯緭鍏ユ不鐤楃瀹ゅ悕绉�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="浣忛櫌鍙�" prop="inpatientno">
+ <el-input
+ v-model="editForm.inpatientno"
+ placeholder="璇疯緭鍏ヤ綇闄㈠彿"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName">
+ <el-input
+ v-model="editForm.deptName"
+ placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="閮ㄩ棬缂栧彿" prop="deptNo">
+ <el-input
+ v-model="editForm.deptNo"
+ placeholder="璇疯緭鍏ラ儴闂ㄧ紪鍙�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="涓婃姤鍖婚櫌" prop="toHospital">
+ <el-input
+ v-model="editForm.toHospital"
+ 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-s-data"
+ style="color: #F56C6C; margin-right: 8px;"
+ ></i>
+ <span>涓婃姤淇℃伅</span>
+ </div>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鎶ュ憡鑰呭鍚�" prop="infoName">
+ <el-input
+ v-model="editForm.infoName"
+ placeholder="璇疯緭鍏ユ姤鍛婅�呭鍚�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎶ュ憡鑰呯紪鍙�" prop="infoNo">
+ <el-input
+ v-model="editForm.infoNo"
+ placeholder="璇疯緭鍏ユ姤鍛婅�呯紪鍙�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鎶ュ憡鑰呯數璇�" prop="reporterphone">
+ <el-input
+ v-model="editForm.reporterphone"
+ placeholder="璇疯緭鍏ユ姤鍛婅�呰仈绯荤數璇�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鍗忚皟鍛樺鍚�" prop="coordinatorName">
+ <el-input
+ v-model="editForm.coordinatorName"
+ placeholder="璇疯緭鍏ュ崗璋冨憳濮撳悕"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鍗忚皟鍛樼紪鍙�" prop="coordinatorNo">
+ <el-input
+ v-model="editForm.coordinatorNo"
+ placeholder="璇疯緭鍏ュ崗璋冨憳缂栧彿"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鏄惁缁堟妗堜緥" prop="terminationCase">
+ <el-radio-group v-model="editForm.terminationCase">
+ <el-radio label="0">杩涜涓�</el-radio>
+ <el-radio label="1">宸茬粓姝�</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-form-item label="涓婃姤鐘舵��" prop="reportStatus">
+ <el-select
+ v-model="editForm.reportStatus"
+ placeholder="璇烽�夋嫨涓婃姤鐘舵��"
+ style="width: 100%"
+ :disabled="isEditing"
+ >
+ <el-option label="宸蹭笂鎶�" value="1" />
+ <el-option label="宸查槄璇�" value="2" />
+ <el-option label="宸插悓鎰�" value="3" />
+ <el-option label="宸查┏鍥�" value="4" />
+ </el-select>
+ </el-form-item>
+ </el-card>
+
+ <!-- 闄勪欢淇℃伅 -->
+ <el-card class="form-section" shadow="never">
+ <div slot="header" class="section-header">
+ <i
+ class="el-icon-folder"
+ style="color: #409EFF; 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="editForm.annexfilesList && editForm.annexfilesList.length > 0"
+ >
+ <div class="list-title">
+ 宸蹭笂浼犻檮浠� ({{ editForm.annexfilesList.length }})
+ </div>
+ <el-table
+ :data="editForm.annexfilesList"
+ style="width: 100%"
+ size="small"
+ border
+ >
+ <el-table-column label="鏂囦欢鍚�" min-width="200">
+ <template #default="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 #default="scope">
+ <el-tag size="small">{{
+ getFileType(scope.row.fileName)
+ }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍒涘缓鏃堕棿" width="160">
+ <template #default="scope">
+ <span>{{ formatDateTime(scope.row.createTime) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="澶囨敞"
+ min-width="150"
+ show-overflow-tooltip
+ >
+ <template #default="scope">
+ <span>{{ scope.row.remart || "鏃�" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="200" fixed="right">
+ <template #default="scope">
+ <el-button
+ size="mini"
+ type="primary"
+ @click="handlePreview(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: #67C23A; margin-right: 8px;"
+ ></i>
+ <span>澶囨敞淇℃伅</span>
+ </div>
+ <el-form-item prop="remark">
+ <el-input
+ v-model="editForm.remark"
+ type="textarea"
+ :rows="4"
+ placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+ maxlength="500"
+ show-word-limit
+ />
+ </el-form-item>
+ </el-card>
+ </el-form>
+
+ <div slot="footer" class="dialog-footer">
+ <el-button @click="handleEditClose">鍙栨秷</el-button>
+ <el-button type="primary" :loading="saveLoading" @click="handleSave"
+ >淇濆瓨</el-button
+ >
+ </div>
+ </el-dialog>
+
+ <!-- 鏂囦欢棰勮寮圭獥 -->
+ <FilePreviewDialog
+ :visible="previewVisible"
+ :file="currentPreviewFile"
+ @close="previewVisible = false"
+ @download="handleDownload"
+ />
</div>
</template>
<script>
import CaseDetail from "./caseDetail";
+import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
import {
donateList,
donateInfo,
donateDel,
- donateEdit
+ donateEdit,
+ donateAdd
} from "@/api/businessApi/index";
+import dayjs from "dayjs";
export default {
name: "CaseList",
- components: { CaseDetail },
+ components: {
+ CaseDetail,
+ UploadAttachment,
+ FilePreviewDialog
+ },
dicts: ["sys_user_sex", "sys_BloodType"],
data() {
return {
// 閬僵灞�
loading: false,
+ saveLoading: false,
// 閫変腑鏁扮粍
ids: [],
// 闈炲崟涓鐢�
@@ -271,22 +986,14 @@
detailOpen: false,
// 瀹℃壒寮规鏄惁鏄剧ず
approveOpen: false,
+ // 缂栬緫寮规鏄惁鏄剧ず
+ editOpen: false,
+ // 缂栬緫鐘舵��
+ isEditing: false,
// 璇︽儏寮规鏍囬
detailTitle: "",
// 褰撳墠鎿嶄綔鐨勬渚�
currentCase: {},
- // 鎬у埆閫夐」
- genderOptions: [
- { value: "0", label: "鐢�" },
- { value: "1", label: "濂�" }
- ],
- // 琛�鍨嬮�夐」
- bloodTypeOptions: [
- { value: "A", label: "A鍨�" },
- { value: "B", label: "B鍨�" },
- { value: "O", label: "O鍨�" },
- { value: "AB", label: "AB鍨�" }
- ],
// 鏌ヨ鍙傛暟
queryParams: {
pageNum: 1,
@@ -309,7 +1016,36 @@
approveOpinion: [
{ required: true, message: "璇疯緭鍏ュ鎵规剰瑙�", trigger: "blur" }
]
- }
+ },
+ // 缂栬緫琛ㄥ崟
+ editForm: this.getDefaultFormData(),
+ // 琛ㄥ崟楠岃瘉瑙勫垯
+ editRules: {
+ caseNo: [
+ { required: true, message: "璇疯緭鍏ユ渚嬬紪鍙�", trigger: "blur" }
+ ],
+ name: [
+ { required: true, message: "璇疯緭鍏ユ崘鐚�呭鍚�", trigger: "blur" }
+ ],
+ sex: [{ required: true, message: "璇烽�夋嫨鎬у埆", trigger: "change" }],
+ age: [{ required: true, message: "璇疯緭鍏ュ勾榫�", trigger: "blur" }],
+ diagnosisname: [
+ { required: true, message: "璇疯緭鍏ョ柧鐥呰瘖鏂�", trigger: "blur" }
+ ],
+ treatmenthospitalname: [
+ { required: true, message: "璇疯緭鍏ユ不鐤楀尰闄�", trigger: "blur" }
+ ],
+ reportStatus: [
+ { required: true, message: "璇烽�夋嫨涓婃姤鐘舵��", trigger: "change" }
+ ]
+ },
+ // 闄勪欢鐩稿叧閰嶇疆
+ attachmentLimit: 10,
+ attachmentAccept: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx",
+ attachmentFileList: [],
+ // 棰勮鐩稿叧
+ previewVisible: false,
+ currentPreviewFile: null
};
},
filters: {
@@ -346,66 +1082,199 @@
} catch (error) {
console.error("鑾峰彇妗堜緥鍒楄〃澶辫触:", error);
this.$modal.msgError("鑾峰彇妗堜緥鍒楄〃澶辫触");
- // 妯℃嫙鏁版嵁
- this.caseList = this.getMockData();
- this.total = this.caseList.length;
+ this.caseList = [];
+ this.total = 0;
} finally {
this.loading = false;
}
},
-
- /** 妯℃嫙鏁版嵁 */
- getMockData() {
- return [
- {
- id: 1,
- caseNo: "DON20241219001",
- name: "寮犱笁",
- sex: "0",
- age: 38,
- bloodType: "A",
- gscScore: "1",
- diagnosisname:
- "鑴戝浼ゅ鑷磋剳姝讳骸锛岀粡鎶㈡晳鏃犳晥瀹e竷鑴戞浜°�傚灞炲悓鎰忓櫒瀹樻崘鐚��",
- treatmenthospitalname: "闈掑矝澶у闄勫睘鍖婚櫌",
- reportStatus: "2",
- reporttime: "2024-12-19 09:30:00",
- reportername: "鏉庡尰鐢�",
- idcardno: "370203198510123456",
- nation: "姹夋棌",
- phone: "13800138000",
- registeraddress: "灞变笢鐪侀潚宀涘競甯傚崡鍖洪娓腑璺�100鍙�",
- inpatientno: "ZY20241219001",
- treatmentdeptname: "绁炵粡澶栫",
- doctorname: "鐜嬩富浠�",
- infectious: "鏃�",
- illnessoverview:
- "鎮h�呭洜浜ら�氫簨鏁呭鑷翠弗閲嶈剳澶栦激锛岀粡鎶㈡晳鏃犳晥瀹e竷鑴戞浜°��",
- hospitalLevel: "涓夌骇鐢茬瓑",
- contactperson: "寮犳姢澹�",
- contactphone: "13900139000",
- hospitalAddress: "灞变笢鐪侀潚宀涘競甯傚崡鍖烘睙鑻忚矾1鍙�"
- },
- {
- id: 2,
- caseNo: "DON20241218001",
- name: "鏉庡洓",
- sex: "0",
- age: 45,
- bloodType: "O",
- gscScore: "3",
- diagnosisname: "鎬ユ�у績鑲屾姝伙紝蹇冭剰鍔熻兘琛扮",
- treatmenthospitalname: "闈掑矝甯傜珛鍖婚櫌",
- reportStatus: "3",
- reporttime: "2024-12-18 14:20:00",
- approvetime: "2024-12-18 16:30:00",
- reportername: "鍒樺尰鐢�",
- approvername: "瀹℃牳涓撳憳A",
- approveopinion: "璧勬枡榻愬叏锛岀鍚堟崘鐚潯浠讹紝鍚屾剰閫氳繃銆�"
- }
- ];
+ // 杞繍------------------
+ /** 鍒ゆ柇鏄惁闇�瑕佹樉绀鸿浆杩愭寜閽� */
+ shouldShowTransportButton(row) {
+ // 鍙湁宸插悓鎰忕殑妗堜緥鎵嶈兘杩涜杞繍鎿嶄綔
+ // return row.reportStatus == "3" && row.delFlag == 0;
+ return row.reportStatus != "4";
},
+ /** 鍒ゆ柇鏄惁鍙互璺宠浆鍒拌浆杩愬崟 */
+ canGoToTransport(row) {
+ // 闇�瑕佽浆杩愶紙isTransport === "2"锛変笖娌℃湁杞繍淇℃伅锛坰erviceTransport涓嶅瓨鍦ㄦ垨涓虹┖鏁扮粍锛�
+ return row.isTransport == "2" && row.serviceTransport;
+ },
+
+ /** 鑾峰彇杞繍鎸夐挳鏂囨湰 */
+ getTransportButtonText(row) {
+ if (row.isTransport == "2") {
+ if (
+ row.serviceTransport &&
+ Array.isArray(row.serviceTransport) &&
+ row.serviceTransport.length > 0
+ ) {
+ return "鏌ョ湅杞繍鍗�";
+ } else {
+ return "鍓嶅線杞繍鍗�";
+ }
+ }
+ return "杞繍";
+ },
+
+ /** 鑾峰彇杞繍鐘舵�佹爣绛炬牱寮� */
+ getTransportStatusTag(row) {
+ if (row.isTransport === "1") {
+ return "info"; // 涓嶉渶瑕佽浆杩�
+ }
+ if (
+ row.serviceTransport &&
+ Array.isArray(row.serviceTransport) &&
+ row.serviceTransport.length > 0
+ ) {
+ // 鏍规嵁杞繍鍗曠姸鎬佹樉绀轰笉鍚岄鑹�
+ const transport = row.serviceTransport[0];
+ if (transport.transitStatus) {
+ switch (transport.transitStatus.toString()) {
+ case "1":
+ return "warning"; // 寰呰浆杩�
+ case "2":
+ return "primary"; // 杞繍涓�
+ case "3":
+ return "success"; // 杞繍瀹屾垚
+ case "4":
+ return "danger"; // 杞繍鍙栨秷
+ case "5":
+ return "info"; // 鏆傚瓨
+ default:
+ return "info";
+ }
+ }
+ return "primary"; // 鏈夎浆杩愪俊鎭絾鏃犵姸鎬�
+ }
+ return "danger"; // 闇�瑕佽浆杩愪絾鏃犺浆杩愪俊鎭�
+ },
+
+ /** 鑾峰彇杞繍鐘舵�佹枃鏈� */
+ getTransportStatusText(row) {
+ if (row.isTransport === "1") {
+ return "鏃犻渶杞繍";
+ }
+ if (
+ row.serviceTransport &&
+ Array.isArray(row.serviceTransport) &&
+ row.serviceTransport.length > 0
+ ) {
+ const transport = row.serviceTransport[0];
+ if (transport.transitStatus) {
+ switch (transport.transitStatus.toString()) {
+ case "1":
+ return "寰呰浆杩�";
+ case "2":
+ return "杞繍涓�";
+ case "3":
+ return "杞繍瀹屾垚";
+ case "4":
+ return "杞繍鍙栨秷";
+ case "5":
+ return "鏆傚瓨";
+ default:
+ return "鏈夎浆杩愬崟";
+ }
+ }
+ return "鏈夎浆杩愬崟";
+ }
+ return "闇�杞繍";
+ },
+
+ /** 澶勭悊杞繍鎿嶄綔 */
+ async handleTransport(row) {
+ try {
+ // 鍏堣幏鍙栨渶鏂扮殑妗堜緥淇℃伅
+ const caseData = row;
+
+ if (caseData.isTransport == "2") {
+ if (
+ caseData.serviceTransport &&
+ Array.isArray(caseData.serviceTransport) &&
+ caseData.serviceTransport.length > 0
+ ) {
+ // 宸叉湁杞繍鍗曪紝璺宠浆鍒拌浆杩愬崟璇︽儏椤�
+ const transport = caseData.serviceTransport[0];
+ this.goToTransportDetail(transport.id, row.caseNo);
+ } else {
+ // 娌℃湁杞繍鍗曪紝璺宠浆鍒板垱寤鸿浆杩愬崟椤甸潰
+ this.goToCreateTransport(row);
+ }
+ } else {
+ this.$message.warning("璇ユ渚嬩笉闇�瑕佽浆杩�");
+ }
+ } catch (error) {
+ console.error("鑾峰彇妗堜緥淇℃伅澶辫触:", error);
+ this.$message.error("鑾峰彇妗堜緥淇℃伅澶辫触");
+ }
+ },
+
+ /** 璺宠浆鍒板垱寤鸿浆杩愬崟椤甸潰 */
+ goToCreateTransport(caseData) {
+ // 杩欓噷鍙互璺宠浆鍒板垱寤鸿浆杩愬崟鐨勯〉闈�
+ // 鏂瑰紡1锛氬湪鏂伴〉闈㈡墦寮�
+ this.$router.push({
+ path: "/report/transfer",
+ query: {
+ autoCreate: "true",
+ caseId: caseData.id,
+ caseNo: caseData.caseNo,
+ patName: caseData.name,
+ age: caseData.age,
+ sex: caseData.sex,
+ diagnosisname: caseData.diagnosisname,
+ treatmentHospitalName: caseData.treatmenthospitalname
+ }
+ });
+
+ // 鏂瑰紡2锛氬湪褰撳墠椤甸潰鎵撳紑寮规锛堟帹鑽愶級
+ // this.openTransportDialog(caseData);
+ },
+
+ /** 鎵撳紑杞繍鍗曞脊妗� */
+ openTransportDialog(caseData) {
+ this.$modal.confirm({
+ title: "鍒涘缓杞繍鍗�",
+ message: `鎮ㄥ皢鍒涘缓妗堜緥銆�${caseData.caseNo} - ${caseData.name}銆戠殑杞繍鍗曪紝鏄惁缁х画锛焋,
+ confirmButtonText: "鍓嶅線鍒涘缓",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ beforeClose: (action, instance, done) => {
+ if (action === "confirm") {
+ // 璺宠浆鍒拌浆杩愬崟鍒涘缓椤甸潰
+ this.$router.push({
+ path: "/report/transfer",
+ query: {
+ caseId: caseData.id,
+ caseNo: caseData.caseNo,
+ patName: caseData.name,
+ age: caseData.age,
+ sex: caseData.sex,
+ diagnosisname: caseData.diagnosisname,
+ treatmentHospitalName: caseData.treatmenthospitalname
+ }
+ });
+ done();
+ } else {
+ done();
+ }
+ }
+ });
+ },
+
+ /** 璺宠浆鍒拌浆杩愬崟璇︽儏椤� */
+ goToTransportDetail(transportId, caseNo) {
+ this.$router.push({
+ path: "/report/transfer",
+ query: {
+ id: transportId,
+ caseNo: caseNo
+ }
+ });
+ },
+ // ---------------------------------end
// 澶氶�夋閫変腑鏁版嵁
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
@@ -421,85 +1290,99 @@
/** 閲嶇疆鎸夐挳鎿嶄綔 */
resetQuery() {
- this.resetForm("queryForm");
- this.handleQuery();
+ this.queryParams = {
+ pageNum: 1,
+ pageSize: 10,
+ caseNo: undefined,
+ name: undefined,
+ reportStatus: undefined
+ };
+ this.getList();
},
/** 璇︽儏鎸夐挳鎿嶄綔 */
async handleDetail(row) {
try {
- // 鍏堣幏鍙栨渚嬭鎯�
- const response = await donateInfo(row.id);
- this.currentCase = response.data || response || row;
+ this.currentCase = row;
- // 濡傛灉鐘舵�佹槸"宸蹭笂鎶�"(1)锛屽垯浣跨敤瀹屾暣鏁版嵁鏇存柊涓�"宸查槄璇�"(2)
+ // 濡傛灉鐘舵�佹槸"宸蹭笂鎶�"(1)锛屽垯鏇存柊涓�"宸查槄璇�"(2)
if (this.currentCase.reportStatus === "1") {
try {
- // 浣跨敤瀹屾暣鐨勬渚嬫暟鎹綔涓烘洿鏂板熀纭�锛岀‘淇濇墍鏈夊瓧娈甸兘琚繚鐣�
const updateData = {
- ...this.currentCase, // 灞曞紑鎵�鏈夌幇鏈夊瓧娈�
- reportStatus: "2", // 鏇存柊鐘舵�佷负宸查槄璇�
- updateTime: new Date()
- .toISOString()
- .replace("T", " ")
- .substring(0, 19),
- updateBy: "褰撳墠鐢ㄦ埛" // 娣诲姞鏇存柊浜轰俊鎭�
+ ...this.currentCase,
+ reportStatus: "2",
+ updateTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+ updateBy: this.$store.state.user?.name || "褰撳墠鐢ㄦ埛"
};
await donateEdit(updateData);
-
- // 鏇存柊鏈湴鏁版嵁鍜屽綋鍓嶆樉绀虹殑鏁版嵁
this.currentCase.reportStatus = "2";
this.currentCase.updateTime = updateData.updateTime;
- row.reportStatus = "2"; // 鏇存柊鍒楄〃涓殑鐘舵��
-
+ row.reportStatus = "2";
this.$modal.msgSuccess("鐘舵�佸凡鏇存柊涓哄凡闃呰");
} catch (updateError) {
console.error("鐘舵�佹洿鏂板け璐�:", updateError);
- this.$modal.msgError("鐘舵�佹洿鏂板け璐ワ紝浣嗗皢缁х画鏄剧ず璇︽儏");
- // 鏇存柊澶辫触鏃讹紝缁х画浣跨敤鍘熷鐘舵�佹樉绀鸿鎯�
}
}
this.detailTitle = `妗堜緥璇︽儏 - ${this.currentCase.caseNo ||
row.caseNo}`;
this.detailOpen = true;
+ console.log(this.currentCase, "this.currentCase");
} catch (error) {
console.error("鑾峰彇妗堜緥璇︽儏澶辫触:", error);
- // 濡傛灉鑾峰彇璇︽儏澶辫触锛屼娇鐢ㄨ鏁版嵁浣滀负鍚庡
this.currentCase = row;
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 handleEdit(row) {
+ try {
+ const response = await donateInfo(row.id);
+ if (response.code === 200 || response.data) {
+ this.isEditing = true;
+ const data = response.data || response;
+
+ // 澶勭悊闄勪欢
+ if (data.annexfilesList) {
+ this.attachmentFileList = this.parseAttachmentToFileList(
+ data.annexfilesList
+ );
+ } else {
+ this.attachmentFileList = [];
+ }
+
+ this.currentCase = data;
+ this.editForm = { ...data };
+ this.editOpen = true;
+ this.$nextTick(() => {
+ this.$refs.editForm && this.$refs.editForm.clearValidate();
+ });
+ } else {
+ this.$message.error(response.msg || "鑾峰彇璁板綍澶辫触");
+ }
+ } catch (error) {
+ console.error("鑾峰彇璁板綍澶辫触:", error);
+ this.$modal.msgError("鑾峰彇璁板綍澶辫触");
+ }
+ },
+
+ /** 鏂板鎸夐挳鎿嶄綔 */
+ handleAdd() {
+ this.isEditing = false;
+ this.editForm = this.getDefaultFormData();
+ this.attachmentFileList = [];
+ this.editOpen = true;
+ this.$nextTick(() => {
+ this.$refs.editForm && this.$refs.editForm.clearValidate();
+ });
},
/** 瀹℃壒鎸夐挳鎿嶄綔 */
async handleApprove(row) {
try {
- // 鍏堣幏鍙栨渚嬭鎯呮暟鎹紝纭繚鏈夊畬鏁存暟鎹�
const response = await donateInfo(row.id);
this.currentCase = response.data || response || row;
@@ -516,7 +1399,6 @@
this.approveOpen = true;
} catch (error) {
console.error("鑾峰彇妗堜緥璇︽儏澶辫触:", error);
- // 濡傛灉鑾峰彇璇︽儏澶辫触锛屼娇鐢ㄨ鏁版嵁浣滀负鍚庡
this.currentCase = row;
this.approveForm.id = row.id;
this.approveForm.approveResult = "3";
@@ -531,31 +1413,20 @@
try {
const valid = await this.$refs.approveForm.validate();
if (valid) {
- // 浣跨敤瀹屾暣鐨勬渚嬫暟鎹綔涓哄熀纭�锛岀‘淇濇墍鏈夊瓧娈甸兘琚繚鐣�
const approveData = {
- ...this.currentCase, // 灞曞紑鎵�鏈夌幇鏈夊瓧娈�
+ ...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: "褰撳墠鐢ㄦ埛"
+ remark: this.approveForm.approveOpinion,
+ approvername: this.$store.state.user?.name || "褰撳墠鐢ㄦ埛",
+ approvetime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+ updateTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+ updateBy: this.$store.state.user?.name || "褰撳墠鐢ㄦ埛"
};
-
- // 绉婚櫎鍙兘涓嶉渶瑕佺殑瀛楁锛堟牴鎹疄闄匒PI闇�姹傝皟鏁达級
- delete approveData.createTime; // 鍒涘缓鏃堕棿涓嶅簲琚洿鏂�
- delete approveData.createBy; // 鍒涘缓浜轰笉搴斿彉
await donateEdit(approveData);
this.$modal.msgSuccess("瀹℃壒鎴愬姛");
this.approveOpen = false;
- this.getList(); // 閲嶆柊鍔犺浇鍒楄〃
+ this.getList();
}
} catch (error) {
console.error("瀹℃壒澶辫触:", error);
@@ -563,11 +1434,6 @@
this.$modal.msgError("瀹℃壒澶辫触");
}
}
- },
-
- /** 鏂板鎸夐挳鎿嶄綔 */
- handleAdd() {
- this.$router.push("/case/add");
},
/** 鍒犻櫎鎸夐挳鎿嶄綔 */
@@ -586,41 +1452,328 @@
this.$modal.msgError("鍒犻櫎澶辫触");
}
}
+ },
+
+ /** 鑾峰彇榛樿琛ㄥ崟鏁版嵁 */
+ getDefaultFormData() {
+ return {
+ id: undefined,
+ caseNo: undefined,
+ name: undefined,
+ sex: undefined,
+ age: undefined,
+ ageunit: "year",
+ bloodType: undefined,
+ rhYin: "0",
+ birthday: undefined,
+ idcardtype: "1",
+ idcardno: undefined,
+ nation: undefined,
+ nationality: undefined,
+ nativeplace: undefined,
+ education: undefined,
+ occupation: undefined,
+ phone: undefined,
+ // 鎴风睄鍦板潃
+ registerprovincename: undefined,
+ registercityname: undefined,
+ registertownname: undefined,
+ registercommunityname: undefined,
+ registeraddress: undefined,
+ // 鐜颁綇鍦板潃
+ residenceprovincename: undefined,
+ residencecountyname: undefined,
+ residencetownname: undefined,
+ residencecommunityname: undefined,
+ residenceaddress: undefined,
+ // 鍖荤枟淇℃伅
+ diagnosisname: undefined,
+ illnessoverview: undefined,
+ patientstate: undefined,
+ gcsScore: undefined,
+ infectious: undefined,
+ infectiousOther: undefined,
+ isTransport: "1",
+ // 鍖婚櫌淇℃伅
+ treatmenthospitalname: undefined,
+ treatmentdeptname: undefined,
+ inpatientno: undefined,
+ deptName: undefined,
+ deptNo: undefined,
+ toHospital: undefined,
+ // 涓婃姤淇℃伅
+ infoName: undefined,
+ infoNo: undefined,
+ reporterphone: undefined,
+ coordinatorName: undefined,
+ coordinatorNo: undefined,
+ terminationCase: "0",
+ reportStatus: "1", // 榛樿宸蹭笂鎶�
+ // 闄勪欢
+ annexfilesList: [],
+ // 鍏朵粬
+ remark: undefined,
+ createBy: undefined,
+ createTime: undefined,
+ updateBy: undefined,
+ updateTime: undefined,
+ delFlag: 0
+ };
+ },
+
+ /** 闄勪欢杞崲 */
+ parseAttachmentToFileList(attachments) {
+ if (!attachments || !Array.isArray(attachments)) return [];
+ return attachments.map((item, index) => ({
+ uid: item.id || `attachment-${index}-${Date.now()}`,
+ name: item.fileName,
+ url: item.path || item.fileUrl,
+ status: "success",
+ raw: item
+ }));
+ },
+
+ /** 闄勪欢鍙樺寲澶勭悊 */
+ handleAttachmentChange(fileList) {
+ this.attachmentFileList = fileList;
+ },
+
+ /** 闄勪欢涓婁紶鎴愬姛澶勭悊 */
+ handleUploadSuccess({ file, fileList, response }) {
+ if (response && response.code === 200) {
+ if (!this.editForm.annexfilesList) {
+ this.editForm.annexfilesList = [];
+ }
+ 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"),
+ remart: file.raw?.remart || "",
+ caseNo: this.editForm.caseNo
+ };
+
+ this.editForm.annexfilesList.push(attachmentObj);
+ this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+ }
+ },
+
+ /** 闄勪欢涓婁紶閿欒澶勭悊 */
+ handleUploadError({ file, fileList, error }) {
+ console.error("闄勪欢涓婁紶澶辫触:", error);
+ this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+ },
+
+ /** 闄勪欢绉婚櫎澶勭悊 */
+ handleAttachmentRemove(file) {
+ if (file.url && this.editForm.annexfilesList) {
+ const index = this.editForm.annexfilesList.findIndex(
+ item => item.path === file.url || item.fileUrl === file.url
+ );
+ if (index > -1) {
+ this.editForm.annexfilesList.splice(index, 1);
+ }
+ }
+ },
+
+ /** 鎵嬪姩鍒犻櫎闄勪欢 */
+ handleRemoveAttachment(index) {
+ this.editForm.annexfilesList.splice(index, 1);
+ this.attachmentFileList.splice(index, 1);
+ this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+ },
+
+ /** 鏂囦欢棰勮 */
+ 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"];
+
+ if (imageTypes.includes(extension)) return "image";
+ if (pdfTypes.includes(extension)) return "pdf";
+ if (officeTypes.includes(extension)) return "office";
+ return "other";
+ },
+
+ /** 鑾峰彇鏂囦欢鎵╁睍鍚� */
+ getFileExtension(filename) {
+ if (!filename) return "";
+ return filename
+ .split(".")
+ .pop()
+ .toLowerCase();
+ },
+
+ /** 鏃ユ湡鏃堕棿鏍煎紡鍖� */
+ formatDateTime(dateTime) {
+ if (!dateTime) return "";
+ return dayjs(dateTime).format("YYYY-MM-DD HH:mm:ss");
+ },
+
+ /** 鍏抽棴缂栬緫瀵硅瘽妗� */
+ handleEditClose() {
+ this.editOpen = false;
+ this.currentCase = {};
+ this.editForm = this.getDefaultFormData();
+ this.attachmentFileList = [];
+ this.$nextTick(() => {
+ this.$refs.editForm && this.$refs.editForm.clearValidate();
+ });
+ },
+
+ /** 淇濆瓨琛ㄥ崟 */
+ async handleSave() {
+ try {
+ 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;
+
+ const requestData = { ...this.editForm };
+ let response;
+
+ if (this.isEditing) {
+ response = await donateEdit(requestData);
+ } else {
+ // 鏂板鏃惰缃垱寤轰俊鎭�
+ requestData.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
+ requestData.createBy = this.$store.state.user?.name || "褰撳墠鐢ㄦ埛";
+ response = await donateAdd(requestData);
+ }
+
+ if (response.code === 200) {
+ this.$message.success(this.isEditing ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
+ this.handleEditClose();
+ this.getList();
+ } else {
+ this.$message.error(response.msg || "鎿嶄綔澶辫触");
+ }
+ } catch (error) {
+ console.error("淇濆瓨澶辫触:", error);
+ this.$message.error("鎿嶄綔澶辫触锛岃绋嶅悗閲嶈瘯");
+ } finally {
+ this.saveLoading = false;
+ }
}
}
};
</script>
<style scoped>
+.app-container {
+ padding: 20px;
+}
+
.filter-card {
margin-bottom: 20px;
}
+
.mb8 {
margin-bottom: 8px;
}
-/* 璇︽儏椤甸潰鏍峰紡浼樺寲 */
-.case-detail-container {
- max-height: 70vh;
- overflow-y: auto;
- padding: 0 10px;
-}
-.detail-section {
+/* 琛ㄥ崟鍖哄煙鏍峰紡 */
+.form-section {
margin-bottom: 16px;
}
.section-header {
display: flex;
- justify-content: space-between;
align-items: center;
-}
-
-.section-title {
- font-size: 16px;
font-weight: bold;
color: #303133;
}
+.dialog-footer {
+ text-align: right;
+ 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;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
/* 瀹℃壒寮规鏍峰紡 */
.approve-dialog >>> .el-dialog__body {
padding: 0;
diff --git a/src/views/business/transfer/TransportEdit.vue b/src/views/business/transfer/TransportEdit.vue
index e27c247..996f8cd 100644
--- a/src/views/business/transfer/TransportEdit.vue
+++ b/src/views/business/transfer/TransportEdit.vue
@@ -7,6 +7,31 @@
:close-on-click-modal="false"
@close="handleClose"
>
+ <!-- 妗堜緥淇℃伅灞曠ず鍖哄煙 -->
+ <div v-if="selectedCase && !isEdit" class="selected-case-info">
+ <el-alert
+ title="鍏宠仈妗堜緥淇℃伅"
+ type="success"
+ :closable="false"
+ style="margin-bottom: 16px;"
+ />
+ <el-card shadow="never" class="case-info-card">
+ <el-descriptions :column="2" border>
+ <el-descriptions-item label="妗堜緥缂栧彿">{{ selectedCase.caseNo }}</el-descriptions-item>
+ <el-descriptions-item label="鎮h�呭鍚�">{{ selectedCase.name }}</el-descriptions-item>
+ <el-descriptions-item label="鎬у埆">
+ <dict-tag
+ :options="dict.type.sys_user_sex"
+ :value="selectedCase.sex"
+ />
+ </el-descriptions-item>
+ <el-descriptions-item label="骞撮緞">{{ selectedCase.age }}</el-descriptions-item>
+ <el-descriptions-item label="鐤剧梾璇婃柇">{{ selectedCase.diagnosisname }}</el-descriptions-item>
+ <el-descriptions-item label="娌荤枟鍖婚櫌">{{ selectedCase.treatmenthospitalname }}</el-descriptions-item>
+ </el-descriptions>
+ </el-card>
+ </div>
+
<el-form
ref="editForm"
:model="formData"
@@ -34,7 +59,8 @@
<el-form-item label="妗堜緥缂栧彿" prop="caseNo">
<el-input
v-model="formData.caseNo"
- placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
+ :disabled="true"
+ placeholder="鑷姩浠庢渚嬭幏鍙�"
/>
</el-form-item>
</el-col>
@@ -45,7 +71,8 @@
<el-form-item label="鎮h�呭鍚�" prop="patName">
<el-input
v-model="formData.patName"
- placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
+ :disabled="true"
+ placeholder="鑷姩浠庢渚嬭幏鍙�"
/>
</el-form-item>
</el-col>
@@ -53,6 +80,7 @@
<el-form-item label="鎬у埆" prop="sex">
<el-select
v-model="formData.sex"
+ :disabled="true"
placeholder="璇烽�夋嫨鎬у埆"
style="width: 100%"
>
@@ -70,7 +98,8 @@
v-model="formData.age"
:min="0"
:max="120"
- placeholder="璇疯緭鍏ュ勾榫�"
+ :disabled="true"
+ placeholder="鑷姩浠庢渚嬭幏鍙�"
style="width: 100%"
/>
</el-form-item>
@@ -79,7 +108,8 @@
<el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname">
<el-input
v-model="formData.diagnosisname"
- placeholder="璇疯緭鍏ョ柧鐥呰瘖鏂悕绉�"
+ :disabled="true"
+ placeholder="鑷姩浠庢渚嬭幏鍙�"
/>
</el-form-item>
</el-col>
@@ -98,7 +128,8 @@
<el-form-item label="娌荤枟鍖婚櫌" prop="treatmentHospitalName">
<el-input
v-model="formData.treatmentHospitalName"
- placeholder="璇疯緭鍏ユ不鐤楀尰闄㈠悕绉�"
+ :disabled="true"
+ placeholder="鑷姩浠庢渚嬭幏鍙�"
/>
</el-form-item>
</el-col>
@@ -372,6 +403,7 @@
UploadAttachment,
FilePreviewDialog
},
+ dicts: ["sys_user_sex", "sys_BloodType"],
props: {
editOpen: {
type: Boolean,
@@ -384,6 +416,10 @@
isEdit: {
type: Boolean,
default: false
+ },
+ selectedCase: {
+ type: Object,
+ default: null
}
},
data() {
@@ -428,9 +464,18 @@
watch: {
editOpen(val) {
if (val) {
- this.formData = this.isEdit
- ? { ...this.getDefaultFormData(), ...this.transportData }
- : this.getDefaultFormData();
+ if (this.isEdit) {
+ // 缂栬緫妯″紡锛屼娇鐢ㄤ紶鍏ョ殑杞繍鍗曟暟鎹�
+ this.formData = { ...this.getDefaultFormData(), ...this.transportData };
+ } else {
+ // 鏂板妯″紡
+ this.formData = this.getDefaultFormData();
+
+ // 濡傛灉鏈夐�変腑鐨勬渚嬶紝鐢ㄦ渚嬩俊鎭~鍏呰〃鍗�
+ if (this.selectedCase) {
+ this.fillFormWithCaseData(this.selectedCase);
+ }
+ }
this.initAttachmentList();
@@ -438,6 +483,15 @@
this.$refs.editForm && this.$refs.editForm.clearValidate();
});
}
+ },
+
+ selectedCase: {
+ handler(newVal) {
+ if (newVal && !this.isEdit) {
+ this.fillFormWithCaseData(newVal);
+ }
+ },
+ deep: true
}
},
methods: {
@@ -472,6 +526,23 @@
updateBy: undefined,
updateTime: undefined,
delFlag: 0
+ };
+ },
+
+ /** 鐢ㄦ渚嬫暟鎹~鍏呰〃鍗� */
+ fillFormWithCaseData(caseData) {
+ this.formData = {
+ ...this.formData,
+ caseNo: caseData.caseNo || '',
+ patName: caseData.name || '',
+ sex: caseData.sex || '',
+ age: caseData.age || '',
+ diagnosisname: caseData.diagnosisname || '',
+ treatmentHospitalName: caseData.treatmenthospitalname || '',
+ treatmentDeptName: caseData.treatmentdeptname || '',
+ // 鍙互璁剧疆涓�浜涢粯璁ゅ��
+ transportStartPlace: caseData.treatmenthospitalname || '',
+ contactPerson: caseData.coordinatorName || ''
};
},
@@ -526,7 +597,7 @@
createTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
transportId: this.formData.id,
delFlag: 0,
- caseNo:this.formData.caseNo
+ caseNo: this.formData.caseNo
};
this.formData.annexfilesList.push(attachmentObj);
@@ -709,13 +780,12 @@
font-size: 13px;
}
-.file-path {
- font-size: 12px;
- color: #909399;
+/* 妗堜緥淇℃伅灞曠ず鏍峰紡 */
+.selected-case-info {
+ margin-bottom: 20px;
}
-::v-deep .el-card__header {
- background: #f5f7fa;
- border-bottom: 1px solid #ebeef5;
+.case-info-card {
+ border-left: 4px solid #67c23a;
}
</style>
diff --git a/src/views/business/transfer/index.vue b/src/views/business/transfer/index.vue
index 9c33c9e..39faefb 100644
--- a/src/views/business/transfer/index.vue
+++ b/src/views/business/transfer/index.vue
@@ -281,11 +281,120 @@
@close="detailOpen = false"
/>
</el-dialog>
+
+ <!-- 妗堜緥閫夋嫨瀵硅瘽妗� -->
+ <el-dialog
+ title="閫夋嫨杞繍妗堜緥"
+ :visible.sync="selectCaseOpen"
+ width="900px"
+ append-to-body
+ :close-on-click-modal="false"
+ >
+ <div class="case-select-container">
+ <el-card class="search-card">
+ <el-form :model="caseQueryParams" inline>
+ <el-form-item label="妗堜緥缂栧彿">
+ <el-input
+ v-model="caseQueryParams.caseNo"
+ placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
+ clearable
+ style="width: 180px"
+ />
+ </el-form-item>
+ <el-form-item label="鎮h�呭鍚�">
+ <el-input
+ v-model="caseQueryParams.patName"
+ placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
+ clearable
+ style="width: 150px"
+ />
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" icon="el-icon-search" @click="searchCaseList"
+ >鎼滅储</el-button
+ >
+ <el-button icon="el-icon-refresh" @click="resetCaseSearch"
+ >閲嶇疆</el-button
+ >
+ </el-form-item>
+ </el-form>
+ </el-card>
+
+ <el-card>
+ <el-table
+ v-loading="caseLoading"
+ :data="availableCaseList"
+ @row-click="handleCaseSelect"
+ highlight-current-row
+ style="width: 100%"
+ >
+ <el-table-column label="妗堜緥缂栧彿" prop="caseNo" width="150" align="center" />
+ <el-table-column label="鎮h�呭鍚�" prop="name" width="120" align="center" />
+ <el-table-column label="鎬у埆" width="80" align="center">
+ <template slot-scope="scope">
+ <dict-tag
+ :options="dict.type.sys_user_sex"
+ :value="scope.row.sex"
+ />
+ </template>
+ </el-table-column>
+ <el-table-column label="骞撮緞" prop="age" width="80" align="center" />
+ <el-table-column label="琛�鍨�" width="80" align="center">
+ <template slot-scope="scope">
+ <dict-tag
+ :options="dict.type.sys_BloodType"
+ :value="scope.row.bloodType"
+ />
+ </template>
+ </el-table-column>
+ <el-table-column label="鐤剧梾璇婃柇" prop="diagnosisname" min-width="200" show-overflow-tooltip />
+ <el-table-column label="娌荤枟鍖婚櫌" prop="treatmenthospitalname" width="150" />
+ <el-table-column label="鏄惁宸茶浆杩�" width="100" align="center">
+ <template slot-scope="scope">
+ <el-tag
+ :type="hasTransport(scope.row) ? 'danger' : 'success'"
+ size="small"
+ >
+ {{ hasTransport(scope.row) ? '宸茶浆杩�' : '鍙浆杩�' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="80" align="center">
+ <template slot-scope="scope">
+ <el-button
+ type="text"
+ size="mini"
+ @click="selectCase(scope.row)"
+ :disabled="hasTransport(scope.row)"
+ >
+ 閫夋嫨
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <!-- 鍒嗛〉 -->
+ <pagination
+ v-show="caseTotal > 0"
+ :total="caseTotal"
+ :page.sync="caseQueryParams.pageNum"
+ :limit.sync="caseQueryParams.pageSize"
+ @pagination="searchCaseList"
+ />
+ </el-card>
+ </div>
+
+ <div slot="footer" class="dialog-footer">
+ <el-button @click="selectCaseOpen = false">鍙栨秷</el-button>
+ </div>
+ </el-dialog>
+
<!-- 鏂板锛氫慨鏀瑰脊妗� -->
<transport-edit
:edit-open="editOpen"
:transport-data="currentTransport"
:is-edit="isEditing"
+ :selected-case="selectedCase"
@update:edit-open="editOpen = $event"
@close="handleEditClose"
@save-success="handleSaveSuccess"
@@ -318,7 +427,8 @@
transportAdd,
transportEdit,
transportDelete,
- transportInfo
+ transportInfo,
+ donateList
} from "@/api/businessApi/index";
import TransportDetail from "./transportDetail";
import TransportEdit from "./TransportEdit";
@@ -329,6 +439,7 @@
dicts: ["sys_user_sex", "sys_BloodType"],
data() {
return {
+
// 閬僵灞�
loading: false,
// 閫変腑鏁扮粍
@@ -341,10 +452,12 @@
showSearch: true,
// 鎬绘潯鏁�
total: 0,
- // 杞繍鍗曡〃鏍兼暟鎹� - 鐩存帴浣跨敤鍚庣杩斿洖鐨勬暟鎹粨鏋�
+ // 杞繍鍗曡〃鏍兼暟鎹�
transportList: [],
// 璇︽儏寮规鏄惁鏄剧ず
detailOpen: false,
+ // 妗堜緥閫夋嫨寮规鏄惁鏄剧ず
+ selectCaseOpen: false,
// 鎿嶄綔纭寮规鏄惁鏄剧ず
actionOpen: false,
// 鏂板锛氫慨鏀瑰脊妗嗙浉鍏虫暟鎹�
@@ -366,28 +479,42 @@
pendingTransports: 0,
completedTransports: 0
},
- // 鏌ヨ鍙傛暟锛堝畬鍏ㄩ�傞厤鍚庣鎺ュ彛锛�
+ // 鏌ヨ鍙傛暟
queryParams: {
pageNum: 1,
pageSize: 10,
- caseNo: undefined, // 妗堜緥缂栧彿
- patName: undefined, // 鎮h�呭鍚�
- transitStatus: undefined, // 杞繍鐘舵�侊細1寰呰浆杩� 2杞繍涓� 3杞繍瀹屾垚 4杞繍鍙栨秷 5鏆傚瓨
- searchValue: undefined, // 鎼滅储鍊�
- params: {} // 鍏朵粬鍙傛暟瀵硅薄
+ caseNo: undefined,
+ patName: undefined,
+ transitStatus: undefined,
+ searchValue: undefined,
+ params: {}
+ },
+ // 妗堜緥閫夋嫨鐩稿叧
+ caseLoading: false,
+ availableCaseList: [],
+ caseTotal: 0,
+ selectedCase: null,
+ caseQueryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ caseNo: undefined,
+ patName: undefined,
+ // 鍙煡璇㈠凡鍚屾剰涓旈渶瑕佽浆杩愮殑妗堜緥
+ // reportStatus: "3", // 宸插悓鎰�
+ isTransport: "2" // 闇�瑕佽浆杩�
}
};
},
created() {
this.getList();
+ this.checkAutoCreate();
},
methods: {
- /** 鏌ヨ杞繍鍗曞垪琛� - 鐩存帴浣跨敤鍚庣鏁版嵁缁撴瀯 */
+ /** 鏌ヨ杞繍鍗曞垪琛� */
async getList() {
this.loading = true;
try {
- // 鏋勫缓绗﹀悎鍚庣鎺ュ彛鐨勮姹傚弬鏁� [1,2](@ref)
const requestParams = {
pageNum: this.queryParams.pageNum,
pageSize: this.queryParams.pageSize,
@@ -397,20 +524,15 @@
searchValue: this.queryParams.searchValue
};
- // 澶勭悊鏃堕棿鑼冨洿鍙傛暟 [5](@ref)
if (this.dateRange && this.dateRange.length === 2) {
requestParams.transportStartTime = this.dateRange.join(",");
}
- // 璋冪敤姝e紡鎺ュ彛 [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();
} else {
this.$modal.msgError(response.msg || "鑾峰彇杞繍鍗曞垪琛ㄥけ璐�");
@@ -421,6 +543,109 @@
} finally {
this.loading = false;
}
+ },
+ checkAutoCreate() {
+ const query = this.$route.query;
+ if (query.autoCreate === 'true') {
+ // 鑷姩鎵撳紑妗堜緥閫夋嫨寮规
+ this.selectCaseOpen = true;
+ this.resetCaseSearch();
+
+ // 濡傛灉鏈夌壒瀹氱殑妗堜緥缂栧彿锛屽彲浠ラ鍏堟悳绱�
+ if (query.caseNo) {
+ this.caseQueryParams.caseNo = query.caseNo;
+ this.searchCaseList();
+ }
+ }
+ },
+ /** 鎼滅储鍙敤妗堜緥 */
+ async searchCaseList() {
+ this.caseLoading = true;
+ try {
+ const response = await donateList(this.caseQueryParams);
+ if (response.code === 200) {
+ this.availableCaseList = response.rows || response.data || [];
+ this.caseTotal = response.total || 0;
+ } else {
+ this.$modal.msgError(response.msg || "鑾峰彇妗堜緥鍒楄〃澶辫触");
+ }
+ } catch (error) {
+ console.error("鑾峰彇妗堜緥鍒楄〃澶辫触:", error);
+ this.$modal.msgError("鑾峰彇妗堜緥鍒楄〃澶辫触");
+ } finally {
+ this.caseLoading = false;
+ }
+ },
+
+ /** 閲嶇疆妗堜緥鎼滅储 */
+ resetCaseSearch() {
+ this.caseQueryParams = {
+ pageNum: 1,
+ pageSize: 10,
+ caseNo: undefined,
+ patName: undefined,
+ // reportStatus: "3",
+ isTransport: "2"
+ };
+ this.searchCaseList();
+ },
+
+ /** 鍒ゆ柇妗堜緥鏄惁宸叉湁杞繍鍗� */
+ hasTransport(caseData) {
+ // 妫�鏌ユ渚嬫槸鍚︽湁杞繍淇℃伅
+ if (caseData.serviceTransport &&
+ Array.isArray(caseData.serviceTransport) &&
+ caseData.serviceTransport.length > 0) {
+ return true;
+ }
+ return false;
+ },
+
+ /** 閫夋嫨妗堜緥 */
+ selectCase(caseData) {
+ if (this.hasTransport(caseData)) {
+ this.$message.warning("璇ユ渚嬪凡鏈夎浆杩愬崟锛岃閫夋嫨鍏朵粬妗堜緥");
+ return;
+ }
+
+ this.selectedCase = caseData;
+ this.selectCaseOpen = false;
+
+ // 鎵撳紑杞繍鍗曠紪杈戦〉闈紝骞朵紶鍏ラ�変腑鐨勬渚�
+ this.currentTransport = this.convertCaseToTransport(caseData);
+ this.isEditing = false;
+ this.editOpen = true;
+ },
+
+ /** 灏嗘渚嬩俊鎭浆鎹负杞繍鍗曟牸寮� */
+ convertCaseToTransport(caseData) {
+ return {
+ caseNo: caseData.caseNo,
+ patName: caseData.name,
+ sex: caseData.sex,
+ age: caseData.age,
+ diagnosisname: caseData.diagnosisname,
+ treatmentHospitalName: caseData.treatmenthospitalname,
+ treatmentDeptName: caseData.treatmentdeptname,
+ // 鍏朵粬瀛楁鍙互鏍规嵁闇�瑕佷粠妗堜緥涓幏鍙�
+ transportStartPlace: caseData.treatmenthospitalname || '',
+ contactPerson: caseData.coordinatorName || '',
+ transitStatus: 1, // 榛樿寰呰浆杩�
+ // 娓呯┖鍏朵粬瀛楁
+ id: undefined,
+ reportId: undefined,
+ transportStartTime: undefined,
+ doctor: undefined,
+ doctorPhone: undefined,
+ nurse: undefined,
+ nursePhone: undefined,
+ driver: undefined,
+ driverPhone: undefined,
+ icuDoctor: undefined,
+ icuDoctorPhone: undefined,
+ annexfilesList: [],
+ remark: undefined
+ };
},
/** 鑾峰彇鐘舵�佹爣绛剧被鍨� */
@@ -496,20 +721,24 @@
handleUpdate(row) {
this.currentTransport = row || {};
this.isEditing = true;
+ this.selectedCase = null; // 缂栬緫鏃朵笉浼犲叆妗堜緥淇℃伅
this.editOpen = true;
},
/** 鏂板缓杞繍鍗� */
handleAdd() {
+ // 鎵撳紑妗堜緥閫夋嫨寮规
+ this.selectCaseOpen = true;
+ this.selectedCase = null;
this.currentTransport = {};
- this.isEditing = false;
- this.editOpen = true;
+ this.resetCaseSearch(); // 閲嶇疆骞舵悳绱㈡渚�
},
/** 淇敼寮规鍏抽棴澶勭悊 */
handleEditClose() {
this.editOpen = false;
this.currentTransport = {};
+ this.selectedCase = null;
},
/** 淇濆瓨鎴愬姛澶勭悊 */
@@ -533,7 +762,7 @@
this.actionOpen = true;
},
- /** 纭鎿嶄綔 - 浣跨敤鍚庣鍘熷鏁版嵁缁撴瀯 [4](@ref) */
+ /** 纭鎿嶄綔 */
async confirmAction() {
try {
let requestData = {
@@ -546,12 +775,11 @@
requestData.transitStatus = 3; // 璁剧疆涓鸿浆杩愬畬鎴�
}
- // 鐩存帴浼犻�掑悗绔渶瑕佺殑鍙傛暟 [8](@ref)
const response = await transportEdit(requestData);
if (response.code === 200) {
this.$modal.msgSuccess(`${this.actionText}杞繍鎴愬姛`);
- this.getList(); // 鍒锋柊鍒楄〃
+ this.getList();
} else {
this.$modal.msgError(response.msg || `${this.actionText}杞繍澶辫触`);
}
@@ -562,7 +790,7 @@
this.actionOpen = false;
},
- /** 鍒犻櫎鎸夐挳鎿嶄綔 - 浣跨敤鍚庣鍘熷ID [1](@ref) */
+ /** 鍒犻櫎鎸夐挳鎿嶄綔 */
async handleDelete(row) {
const ids = row.reportId || row.id || this.ids;
@@ -575,7 +803,7 @@
if (response.code === 200) {
this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- this.getList(); // 鍒锋柊鍒楄〃
+ this.getList();
} else {
this.$modal.msgError(response.msg || "鍒犻櫎澶辫触");
}
@@ -589,7 +817,6 @@
/** 瀵煎嚭鎸夐挳鎿嶄綔 */
handleExport() {
- // 鐩存帴浣跨敤鍚庣鍙傛暟缁撴瀯杩涜瀵煎嚭 [5](@ref)
this.download(
"system/transport/export",
{
@@ -597,12 +824,25 @@
},
`transport_${new Date().getTime()}.xlsx`
);
+ },
+
+ // 鐐瑰嚮琛岄�夋嫨妗堜緥
+ handleCaseSelect(row) {
+ this.selectCase(row);
}
}
};
</script>
<style scoped>
+.case-select-container {
+ max-height: 600px;
+ overflow: auto;
+}
+
+.search-card {
+ margin-bottom: 20px;
+}
.filter-card {
margin-bottom: 20px;
}
--
Gitblit v1.9.3