From 631c8f37b449b09d19345b76400a39abdb7800f6 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期四, 15 一月 2026 15:48:42 +0800
Subject: [PATCH] api封装档案、上报、转运接入
---
src/views/business/transfer/TransportEdit.vue | 598 ++++++++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 504 insertions(+), 94 deletions(-)
diff --git a/src/views/business/transfer/TransportEdit.vue b/src/views/business/transfer/TransportEdit.vue
index 227f050..a42de59 100644
--- a/src/views/business/transfer/TransportEdit.vue
+++ b/src/views/business/transfer/TransportEdit.vue
@@ -7,7 +7,12 @@
:close-on-click-modal="false"
@close="handleClose"
>
- <el-form ref="editForm" :model="formData" :rules="formRules" label-width="120px">
+ <el-form
+ ref="editForm"
+ :model="formData"
+ :rules="formRules"
+ label-width="120px"
+ >
<!-- 鍩虹淇℃伅 -->
<el-card class="form-section" shadow="never">
<div slot="header" class="section-header">
@@ -17,28 +22,42 @@
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="杞繍鍗曞彿" prop="id">
- <el-input v-model="formData.id" :disabled="isEdit" placeholder="绯荤粺鑷姩鐢熸垚" />
+ <el-form-item label="杞繍鍗曞彿" prop="reportId">
+ <el-input
+ v-model="formData.reportId"
+ :disabled="isEdit"
+ placeholder="绯荤粺鑷姩鐢熸垚"
+ />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="浣忛櫌鍙�" prop="caseNo">
- <el-input v-model="formData.caseNo" placeholder="璇疯緭鍏ヤ綇闄㈠彿" />
+ <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
+ <el-input
+ v-model="formData.caseNo"
+ placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
+ />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
- <el-input v-model="formData.donorName" placeholder="璇疯緭鍏ユ崘鐚�呭鍚�" />
+ <el-form-item label="鎮h�呭鍚�" prop="patName">
+ <el-input
+ v-model="formData.patName"
+ placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
+ />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="鎬у埆" prop="gender">
- <el-select v-model="formData.gender" placeholder="璇烽�夋嫨鎬у埆" style="width: 100%">
- <el-option label="鐢�" value="鐢�" />
- <el-option label="濂�" value="濂�" />
+ <el-form-item label="鎬у埆" prop="sex">
+ <el-select
+ v-model="formData.sex"
+ placeholder="璇烽�夋嫨鎬у埆"
+ style="width: 100%"
+ >
+ <el-option label="鐢�" value="1" />
+ <el-option label="濂�" value="2" />
</el-select>
</el-form-item>
</el-col>
@@ -57,8 +76,38 @@
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="鐤剧梾璇婃柇" prop="diagnosis">
- <el-input v-model="formData.diagnosis" placeholder="璇疯緭鍏ョ柧鐥呰瘖鏂�" />
+ <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname">
+ <el-input
+ v-model="formData.diagnosisname"
+ placeholder="璇疯緭鍏ョ柧鐥呰瘖鏂悕绉�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-card>
+
+ <!-- 鍖婚櫌淇℃伅 -->
+ <el-card class="form-section" shadow="never">
+ <div slot="header" class="section-header">
+ <i class="el-icon-office-building" style="color: #67C23A; margin-right: 8px;"></i>
+ <span>鍖婚櫌淇℃伅</span>
+ </div>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="娌荤枟鍖婚櫌" prop="treatmentHospitalName">
+ <el-input
+ v-model="formData.treatmentHospitalName"
+ placeholder="璇疯緭鍏ユ不鐤楀尰闄㈠悕绉�"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="娌荤枟绉戝" prop="treatmentDeptName">
+ <el-input
+ v-model="formData.treatmentDeptName"
+ placeholder="璇疯緭鍏ユ不鐤楃瀹ゅ悕绉�"
+ />
</el-form-item>
</el-col>
</el-row>
@@ -67,93 +116,228 @@
<!-- 杞繍淇℃伅 -->
<el-card class="form-section" shadow="never">
<div slot="header" class="section-header">
- <i class="el-icon-location-information" style="color: #67C23A; margin-right: 8px;"></i>
+ <i class="el-icon-location-information" style="color: #E6A23C; margin-right: 8px;"></i>
<span>杞繍淇℃伅</span>
</div>
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="鍑哄彂鍖婚櫌" prop="hospitalName">
- <el-input v-model="formData.hospitalName" placeholder="璇疯緭鍏ュ嚭鍙戝尰闄�" />
+ <el-form-item label="鍑哄彂鍦扮偣" prop="transportStartPlace">
+ <el-input
+ v-model="formData.transportStartPlace"
+ placeholder="璇疯緭鍏ュ嚭鍙戝湴鐐�"
+ />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="鐩殑鍖婚櫌" prop="destinationHospital">
- <el-input v-model="formData.destinationHospital" placeholder="璇疯緭鍏ョ洰鐨勫尰闄�" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁″垝杞繍鏃堕棿" prop="transportTime">
+ <el-form-item label="鍑哄彂鏃堕棿" prop="transportStartTime">
<el-date-picker
- v-model="formData.transportTime"
+ v-model="formData.transportStartTime"
type="datetime"
- placeholder="閫夋嫨杞繍鏃堕棿"
+ placeholder="閫夋嫨鍑哄彂鏃堕棿"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
</el-col>
+ </el-row>
+
+ <el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="璐熻矗鍗忚皟鍛�" prop="coordinator">
- <el-input v-model="formData.coordinator" placeholder="璇疯緭鍏ュ崗璋冨憳濮撳悕" />
+ <el-form-item label="杞繍鐘舵��" prop="transitStatus">
+ <el-select
+ v-model="formData.transitStatus"
+ placeholder="璇烽�夋嫨杞繍鐘舵��"
+ style="width: 100%"
+ >
+ <el-option label="寰呰浆杩�" :value="1" />
+ <el-option label="杞繍涓�" :value="2" />
+ <el-option label="杞繍瀹屾垚" :value="3" />
+ <el-option label="杞繍鍙栨秷" :value="4" />
+ <el-option label="鏆傚瓨" :value="5" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="璐熻矗鍗忚皟鍛�" prop="contactPerson">
+ <el-input
+ v-model="formData.contactPerson"
+ placeholder="璇疯緭鍏ュ崗璋冨憳濮撳悕"
+ />
</el-form-item>
</el-col>
</el-row>
-
- <el-form-item label="鍑哄彂鍦扮偣" prop="departureLocation">
- <el-input v-model="formData.departureLocation" placeholder="璇疯緭鍏ヨ缁嗗嚭鍙戝湴鐐�" />
- </el-form-item>
</el-card>
- <!-- 鍥㈤槦鎴愬憳 -->
+ <!-- 鍖绘姢浜哄憳淇℃伅 -->
<el-card class="form-section" shadow="never">
<div slot="header" class="section-header">
- <i class="el-icon-user" style="color: #E6A23C; margin-right: 8px;"></i>
- <span>鍥㈤槦鎴愬憳</span>
+ <i class="el-icon-user" style="color: #F56C6C; margin-right: 8px;"></i>
+ <span>鍖绘姢浜哄憳淇℃伅</span>
</div>
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="鎬ヨ瘖绉戝尰鐢�" prop="emergencyDoctor">
- <el-input v-model="formData.emergencyDoctor" placeholder="璇疯緭鍏ユ�ヨ瘖绉戝尰鐢�" />
+ <el-form-item label="鎬ヨ瘖绉戝尰鐢�" prop="doctor">
+ <el-input
+ v-model="formData.doctor"
+ placeholder="璇疯緭鍏ユ�ヨ瘖绉戝尰鐢�"
+ />
</el-form-item>
</el-col>
+ <el-col :span="12">
+ <el-form-item label="鍖荤敓鐢佃瘽" prop="doctorPhone">
+ <el-input
+ v-model="formData.doctorPhone"
+ placeholder="璇疯緭鍏ュ尰鐢熸墜鏈哄彿"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="鎶ゅ+" prop="nurse">
<el-input v-model="formData.nurse" placeholder="璇疯緭鍏ユ姢澹鍚�" />
</el-form-item>
</el-col>
+ <el-col :span="12">
+ <el-form-item label="鎶ゅ+鐢佃瘽" prop="nursePhone">
+ <el-input
+ v-model="formData.nursePhone"
+ placeholder="璇疯緭鍏ユ姢澹墜鏈哄彿"
+ />
+ </el-form-item>
+ </el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="鍙告満" prop="driver">
- <el-input v-model="formData.driver" placeholder="璇疯緭鍏ュ徃鏈哄鍚�" />
+ <el-form-item label="椹鹃┒鍛�" prop="driver">
+ <el-input
+ v-model="formData.driver"
+ placeholder="璇疯緭鍏ラ┚椹跺憳濮撳悕"
+ />
</el-form-item>
</el-col>
<el-col :span="12">
+ <el-form-item label="椹鹃┒鍛樼數璇�" prop="driverPhone">
+ <el-input
+ v-model="formData.driverPhone"
+ placeholder="璇疯緭鍏ラ┚椹跺憳鎵嬫満鍙�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
<el-form-item label="ICU璇勪及鍖荤敓" prop="icuDoctor">
- <el-input v-model="formData.icuDoctor" placeholder="璇疯緭鍏CU鍖荤敓" />
+ <el-input
+ v-model="formData.icuDoctor"
+ placeholder="璇疯緭鍏CU璇勪及鍖荤敓"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="ICU鍖荤敓鐢佃瘽" prop="icuDoctorPhone">
+ <el-input
+ v-model="formData.icuDoctorPhone"
+ placeholder="璇疯緭鍏CU鍖荤敓鎵嬫満鍙�"
+ />
</el-form-item>
</el-col>
</el-row>
</el-card>
+ <!-- 闄勪欢淇℃伅 -->
+ <el-card class="form-section" shadow="never">
+ <div slot="header" class="section-header">
+ <i class="el-icon-folder" style="color: #909399; margin-right: 8px;"></i>
+ <span>闄勪欢淇℃伅</span>
+ </div>
+
+ <div class="attachment-section">
+ <div class="attachment-header">
+ <i class="el-icon-paperclip"></i>
+ <span class="attachment-title">闄勪欢涓婁紶</span>
+ <span class="attachment-tip">鏀寔涓婁紶妫�楠屾姤鍛婂崟绛夋枃浠� (鏈�澶歿{ attachmentLimit }}涓�)</span>
+ </div>
+
+ <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
+ <UploadAttachment
+ ref="uploadAttachment"
+ :file-list="attachmentFileList"
+ :limit="attachmentLimit"
+ :accept="attachmentAccept"
+ @change="handleAttachmentChange"
+ @upload-success="handleUploadSuccess"
+ @upload-error="handleUploadError"
+ @remove="handleAttachmentRemove"
+ />
+ </div>
+
+ <!-- 闄勪欢鍒楄〃 -->
+ <div class="attachment-list" v-if="formData.annexfilesList && formData.annexfilesList.length > 0">
+ <div class="list-title">宸蹭笂浼犻檮浠� ({{ formData.annexfilesList.length }})</div>
+ <el-table :data="formData.annexfilesList" style="width: 100%" size="small">
+ <el-table-column label="鏂囦欢鍚�" min-width="200">
+ <template slot-scope="scope">
+ <i class="el-icon-document" style="margin-right: 8px; color: #409EFF;"></i>
+ <span class="file-name">{{ scope.row.fileName }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢绫诲瀷" width="100">
+ <template slot-scope="scope">
+ <el-tag size="small">{{ getFileType(scope.row.fileName) }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍒涘缓鏃堕棿" width="160">
+ <template slot-scope="scope">
+ <span>{{ formatDateTime(scope.row.createTime) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="180">
+ <template slot-scope="scope">
+ <el-button
+ size="mini"
+ type="primary"
+ @click="handlePreview(scope.row)"
+ >
+ 棰勮
+ </el-button>
+ <el-button
+ size="mini"
+ type="success"
+ @click="handleDownload(scope.row)"
+ >
+ 涓嬭浇
+ </el-button>
+ <el-button
+ size="mini"
+ type="danger"
+ @click="handleRemoveAttachment(scope.$index)"
+ >
+ 鍒犻櫎
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </el-card>
+
<!-- 澶囨敞淇℃伅 -->
<el-card class="form-section" shadow="never">
<div slot="header" class="section-header">
- <i class="el-icon-edit" style="color: #909399; margin-right: 8px;"></i>
+ <i class="el-icon-edit" style="color: #409EFF; margin-right: 8px;"></i>
<span>澶囨敞淇℃伅</span>
</div>
- <el-form-item prop="remarks">
+ <el-form-item prop="remark">
<el-input
- v-model="formData.remarks"
+ v-model="formData.remark"
type="textarea"
:rows="4"
- placeholder="璇疯緭鍏ヨ浆杩愬娉ㄤ俊鎭�"
+ placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
maxlength="500"
show-word-limit
/>
@@ -165,12 +349,29 @@
<el-button @click="handleClose">鍙栨秷</el-button>
<el-button type="primary" :loading="saveLoading" @click="handleSave">淇濆瓨</el-button>
</div>
+
+ <!-- 鏂囦欢棰勮寮圭獥 -->
+ <FilePreviewDialog
+ :visible="previewVisible"
+ :file="currentPreviewFile"
+ @close="previewVisible = false"
+ @download="handleDownload"
+ />
</el-dialog>
</template>
<script>
+import { transportAdd, transportEdit } from "@/api/businessApi/index";
+import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
+import dayjs from "dayjs";
+
export default {
name: "TransportEdit",
+ components: {
+ UploadAttachment,
+ FilePreviewDialog
+ },
props: {
editOpen: {
type: Boolean,
@@ -188,34 +389,38 @@
data() {
return {
saveLoading: false,
+ // 棰勮鐩稿叧
+ previewVisible: false,
+ currentPreviewFile: null,
+ // 闄勪欢鐩稿叧閰嶇疆
+ attachmentLimit: 10,
+ attachmentAccept: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx",
+ attachmentFileList: [],
+ // 琛ㄥ崟鏁版嵁
formData: this.getDefaultFormData(),
formRules: {
caseNo: [
- { required: true, message: '璇疯緭鍏ヤ綇闄㈠彿', trigger: 'blur' }
+ { required: true, message: "璇疯緭鍏ユ渚嬬紪鍙�", trigger: "blur" }
],
- donorName: [
- { required: true, message: '璇疯緭鍏ユ崘鐚�呭鍚�', trigger: 'blur' }
+ patName: [
+ { required: true, message: "璇疯緭鍏ユ偅鑰呭鍚�", trigger: "blur" }
],
- gender: [
- { required: true, message: '璇烽�夋嫨鎬у埆', trigger: 'change' }
+ sex: [{ required: true, message: "璇烽�夋嫨鎬у埆", trigger: "change" }],
+ age: [{ required: true, message: "璇疯緭鍏ュ勾榫�", trigger: "blur" }],
+ diagnosisname: [
+ { required: true, message: "璇疯緭鍏ョ柧鐥呰瘖鏂悕绉�", trigger: "blur" }
],
- age: [
- { required: true, message: '璇疯緭鍏ュ勾榫�', trigger: 'blur' }
+ treatmentHospitalName: [
+ { required: true, message: "璇疯緭鍏ユ不鐤楀尰闄㈠悕绉�", trigger: "blur" }
],
- diagnosis: [
- { required: true, message: '璇疯緭鍏ョ柧鐥呰瘖鏂�', trigger: 'blur' }
+ transportStartPlace: [
+ { required: true, message: "璇疯緭鍏ュ嚭鍙戝湴鐐�", trigger: "blur" }
],
- hospitalName: [
- { required: true, message: '璇疯緭鍏ュ嚭鍙戝尰闄�', trigger: 'blur' }
+ transportStartTime: [
+ { required: true, message: "璇烽�夋嫨鍑哄彂鏃堕棿", trigger: "change" }
],
- destinationHospital: [
- { required: true, message: '璇疯緭鍏ョ洰鐨勫尰闄�', trigger: 'blur' }
- ],
- transportTime: [
- { required: true, message: '璇烽�夋嫨杞繍鏃堕棿', trigger: 'change' }
- ],
- coordinator: [
- { required: true, message: '璇疯緭鍏ヨ礋璐e崗璋冨憳', trigger: 'blur' }
+ contactPerson: [
+ { required: true, message: "璇疯緭鍏ヨ礋璐e崗璋冨憳", trigger: "blur" }
]
}
};
@@ -223,9 +428,11 @@
watch: {
editOpen(val) {
if (val) {
- this.formData = this.isEdit ?
- { ...this.transportData } :
- this.getDefaultFormData();
+ this.formData = this.isEdit
+ ? { ...this.getDefaultFormData(), ...this.transportData }
+ : this.getDefaultFormData();
+
+ this.initAttachmentList();
this.$nextTick(() => {
this.$refs.editForm && this.$refs.editForm.clearValidate();
@@ -234,32 +441,179 @@
}
},
methods: {
+ /** 鑾峰彇榛樿琛ㄥ崟鏁版嵁 */
getDefaultFormData() {
return {
- id: '',
- caseNo: '',
- donorName: '',
- gender: '',
- age: null,
- diagnosis: '',
- hospitalName: '',
- destinationHospital: '',
- transportTime: '',
- coordinator: '',
- departureLocation: '',
- emergencyDoctor: '',
- nurse: '',
- driver: '',
- icuDoctor: '',
- remarks: '',
- status: 'pending',
- statusText: '寰呭嚭鍙�'
+ id: undefined,
+ reportId: undefined,
+ caseNo: undefined,
+ patName: undefined,
+ sex: undefined,
+ age: undefined,
+ diagnosisname: undefined,
+ treatmentHospitalName: undefined,
+ treatmentDeptName: undefined,
+ transportStartPlace: undefined,
+ transportStartTime: undefined,
+ contactPerson: undefined,
+ transitStatus: 1,
+ doctor: undefined,
+ doctorPhone: undefined,
+ nurse: undefined,
+ nursePhone: undefined,
+ driver: undefined,
+ driverPhone: undefined,
+ icuDoctor: undefined,
+ icuDoctorPhone: undefined,
+ annexfilesList: [],
+ remark: undefined,
+ createBy: undefined,
+ createTime: undefined,
+ updateBy: undefined,
+ updateTime: undefined,
+ delFlag: 0
};
},
+ /** 鍒濆鍖栭檮浠跺垪琛� */
+ initAttachmentList() {
+ if (this.isEdit && this.transportData.annexfilesList) {
+ this.formData.annexfilesList = [...this.transportData.annexfilesList];
+ this.attachmentFileList = this.transportData.annexfilesList.map(item => ({
+ uid: item.id || Math.random(),
+ name: item.fileName,
+ url: item.path || item.fileUrl,
+ status: 'success'
+ }));
+ } else {
+ this.formData.annexfilesList = [];
+ this.attachmentFileList = [];
+ }
+ },
+
+ /** 闄勪欢鍙樺寲澶勭悊 */
+ handleAttachmentChange(fileList) {
+ this.attachmentFileList = fileList;
+ },
+
+ /** 闄勪欢绉婚櫎澶勭悊 */
+ handleAttachmentRemove(file) {
+ if (file.url) {
+ const index = this.formData.annexfilesList.findIndex(item =>
+ item.path === file.url || item.fileUrl === file.url
+ );
+ if (index > -1) {
+ this.formData.annexfilesList.splice(index, 1);
+ }
+ }
+ },
+
+ /** 鎵嬪姩鍒犻櫎闄勪欢 */
+ handleRemoveAttachment(index) {
+ this.formData.annexfilesList.splice(index, 1);
+ this.attachmentFileList.splice(index, 1);
+ this.$message.success('闄勪欢鍒犻櫎鎴愬姛');
+ },
+
+ /** 涓婁紶鎴愬姛澶勭悊 */
+ handleUploadSuccess({ file, fileList, response }) {
+ if (response.code === 200) {
+ const attachmentObj = {
+ fileName: file.name,
+ path: response.data || file.url,
+ fileUrl: response.data || file.url,
+ type: this.getFileExtension(file.name),
+ createTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+ transportId: this.formData.id,
+ delFlag: 0,
+ caseNo:this.formData.caseNo
+ };
+
+ this.formData.annexfilesList.push(attachmentObj);
+ this.$message.success('鏂囦欢涓婁紶鎴愬姛');
+ }
+ },
+
+ /** 涓婁紶閿欒澶勭悊 */
+ handleUploadError({ file, fileList, error }) {
+ console.error('闄勪欢涓婁紶澶辫触:', error);
+ this.$message.error('鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯');
+ },
+
+ /** 鏂囦欢棰勮 */
+ handlePreview(file) {
+ this.currentPreviewFile = {
+ fileName: file.fileName,
+ fileUrl: file.path || file.fileUrl,
+ fileType: this.getFileType(file.fileName)
+ };
+ this.previewVisible = true;
+ },
+
+ /** 鏂囦欢涓嬭浇 */
+ handleDownload(file) {
+ const fileUrl = file.path || file.fileUrl;
+ const fileName = file.fileName;
+
+ if (fileUrl) {
+ const link = document.createElement('a');
+ link.href = fileUrl;
+ link.download = fileName;
+ link.style.display = 'none';
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ this.$message.success('寮�濮嬩笅杞芥枃浠�');
+ } else {
+ this.$message.warning('鏂囦欢璺緞涓嶅瓨鍦紝鏃犳硶涓嬭浇');
+ }
+ },
+
+ /** 鑾峰彇鏂囦欢绫诲瀷 */
+ getFileType(fileName) {
+ if (!fileName) return 'other';
+
+ const extension = fileName.split('.').pop().toLowerCase();
+ const imageTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'];
+ const pdfTypes = ['pdf'];
+ const officeTypes = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'];
+
+ if (imageTypes.includes(extension)) return 'image';
+ if (pdfTypes.includes(extension)) return 'pdf';
+ if (officeTypes.includes(extension)) return 'office';
+ return 'other';
+ },
+
+ /** 鑾峰彇鏂囦欢鎵╁睍鍚� */
+ getFileExtension(filename) {
+ return filename.split('.').pop().toLowerCase();
+ },
+
+ /** 鏃ユ湡鏃堕棿鏍煎紡鍖� */
+ formatDateTime(dateTime) {
+ if (!dateTime) return '';
+
+ try {
+ const date = new Date(dateTime);
+ if (isNaN(date.getTime())) return dateTime;
+
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+ const hours = String(date.getHours()).padStart(2, '0');
+ const minutes = String(date.getMinutes()).padStart(2, '0');
+ const seconds = String(date.getSeconds()).padStart(2, '0');
+
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+ } catch (error) {
+ return dateTime;
+ }
+ },
+
handleClose() {
- this.$emit('update:editOpen', false);
- this.$emit('close');
+ this.$emit("update:editOpen", false);
+ this.$emit("close");
+ this.previewVisible = false;
},
async handleSave() {
@@ -267,18 +621,33 @@
const valid = await this.$refs.editForm.validate();
if (!valid) return;
+ const pendingFiles = this.attachmentFileList.filter(item => item.status !== 'success');
+ if (pendingFiles.length > 0) {
+ this.$message.warning('杩樻湁鏂囦欢鏈笂浼犲畬鎴愶紝璇峰厛涓婁紶鎵�鏈夋枃浠舵垨绉婚櫎鏈笂浼犵殑鏂囦欢');
+ return;
+ }
+
this.saveLoading = true;
- // 妯℃嫙API璋冪敤
- await new Promise(resolve => setTimeout(resolve, 1000));
+ const requestData = { ...this.formData };
+ let response;
- this.$message.success(this.isEdit ? '淇敼鎴愬姛' : '鏂板缓鎴愬姛');
- this.handleClose();
- this.$emit('save-success');
+ if (this.isEdit) {
+ response = await transportEdit(requestData);
+ } else {
+ response = await transportAdd(requestData);
+ }
+ if (response.code === 200) {
+ this.$message.success(this.isEdit ? "淇敼鎴愬姛" : "鏂板缓鎴愬姛");
+ this.handleClose();
+ this.$emit("save-success");
+ } else {
+ this.$message.error(response.msg || "鎿嶄綔澶辫触");
+ }
} catch (error) {
- console.error('淇濆瓨澶辫触:', error);
- this.$message.error('鎿嶄綔澶辫触');
+ console.error("淇濆瓨澶辫触:", error);
+ this.$message.error("鎿嶄綔澶辫触锛岃绋嶅悗閲嶈瘯");
} finally {
this.saveLoading = false;
}
@@ -304,6 +673,47 @@
padding: 20px 0 0;
}
+.attachment-section {
+ margin-bottom: 16px;
+}
+
+.attachment-header {
+ display: flex;
+ align-items: center;
+ margin-bottom: 16px;
+ padding: 8px 0;
+ border-bottom: 1px solid #ebeef5;
+}
+
+.attachment-title {
+ font-weight: bold;
+ margin: 0 8px;
+}
+
+.attachment-tip {
+ font-size: 12px;
+ color: #909399;
+}
+
+.attachment-list {
+ margin-top: 16px;
+}
+
+.list-title {
+ font-weight: bold;
+ margin-bottom: 12px;
+ color: #303133;
+}
+
+.file-name {
+ font-size: 13px;
+}
+
+.file-path {
+ font-size: 12px;
+ color: #909399;
+}
+
::v-deep .el-card__header {
background: #f5f7fa;
border-bottom: 1px solid #ebeef5;
--
Gitblit v1.9.3