From c4599aa279fd2f90b741608392e056fbae2282d5 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期四, 20 八月 2026 17:16:54 +0800
Subject: [PATCH] 各表单布局调整
---
vue.config.js | 6
src/views/business/transfer/TransportEdit.vue | 389 +-
src/views/business/course/ccss.vue | 577 +++
src/views/business/ethicalReview/ethicalReviewInfo.vue | 198
src/views/business/course/components/DeathJudgmentStage.vue | 330 -
src/views/business/GetWitness/GetWitnessInfo.vue | 776 ++--
src/views/business/OrganUtilization/OrganUtilizationInfo.vue | 744 ++-
src/views/business/decide/DecideInfo copy.vue | 2
src/components/assessInfoComponents/OrganAssessmentForm.vue | 28
src/views/business/course/components/OrganProcurementStage.vue | 1044 +----
src/components/CaseBasicInfo/index.vue | 2
src/views/business/affirm/affirmInfo.vue | 145
src/views/business/maintain/maintainInfo.vue | 71
管理端8.20.zip | 0
src/views/business/followupVisit/info.vue | 372 +
src/views/business/assess/assessInfo.vue | 93
src/views/business/course/components/MedicalAssessmentStage.vue | 72
src/views/business/course/components/DonationConfirmStage.vue | 674 +--
src/views/business/course/components/OrganAllocationStage.vue | 426 --
src/views/business/decide/DecideInfo.vue | 315 +
src/views/business/course/components/OrganUtilizationStage.vue | 2050 +++--------
src/views/business/course/components/DonorMaintenanceStage.vue | 206 -
src/views/business/course/index.vue | 17
src/views/business/course/components/EthicalReviewStage.vue | 1193 ++++---
src/views/business/allocation/allocationInfo.vue | 136
src/views/business/course/components/readonlyDescriptionsMixin.js | 36
26 files changed, 4,551 insertions(+), 5,351 deletions(-)
diff --git a/src/components/CaseBasicInfo/index.vue b/src/components/CaseBasicInfo/index.vue
index 1fa9b10..1e688ae 100644
--- a/src/components/CaseBasicInfo/index.vue
+++ b/src/components/CaseBasicInfo/index.vue
@@ -422,7 +422,7 @@
<style scoped>
.basic-info-card {
- margin-bottom: 20px;
+ margin-bottom: 5px;
}
.clearfix::after {
diff --git a/src/components/assessInfoComponents/OrganAssessmentForm.vue b/src/components/assessInfoComponents/OrganAssessmentForm.vue
index bccb24d..aa91fb8 100644
--- a/src/components/assessInfoComponents/OrganAssessmentForm.vue
+++ b/src/components/assessInfoComponents/OrganAssessmentForm.vue
@@ -4,6 +4,7 @@
<!-- 娣诲姞璇勪及鏃堕棿瀛楁 -->
<el-form-item label="璇勪及鏃堕棿">
<el-date-picker
+ v-if="!readonly"
v-model="formData.assessmentTime"
type="datetime"
placeholder="閫夋嫨璇勪及鏃堕棿"
@@ -12,25 +13,29 @@
:default-value="new Date()"
style="width: 100%"
/>
+ <span v-else>{{ formData.assessmentTime || '-' }}</span>
</el-form-item>
<!-- 鍙妯″紡涓嬫樉绀鸿瘎浼版椂闂� -->
<el-form-item label="鍔熻兘鐘舵��">
- <el-select v-model="formData.functionStatus">
+ <el-select v-if="!readonly" v-model="formData.functionStatus">
<el-option label="姝e父" value="1" />
<el-option label="杞诲害寮傚父" value="2" />
<el-option label="閲嶅害寮傚父" value="3" />
<el-option label="鏃犳硶璇勪及" value="4" />
</el-select>
+ <span v-else>{{ getFunctionStatusLabel(formData.functionStatus) }}</span>
</el-form-item>
<el-form-item label="璇勪及鎰忚">
<el-input
+ v-if="!readonly"
type="textarea"
v-model="formData.assessmentOpinion"
:rows="4"
placeholder="璇疯緭鍏ヨ瘎浼版剰瑙�"
/>
+ <span v-else class="ro-text">{{ formData.assessmentOpinion || '-' }}</span>
</el-form-item>
<!-- 闄勪欢涓婁紶鍖哄煙 -->
@@ -44,8 +49,9 @@
>
</div>
- <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
+ <!-- 浣跨敤 UploadAttachment 缁勪欢锛堝彧璇绘�侀殣钘忎笂浼犲叆鍙o紝浠呭睍绀哄凡涓婁紶闄勪欢锛� -->
<UploadAttachment
+ v-if="!readonly"
ref="uploadAttachment"
:file-list="attachmentFileList"
:limit="attachmentLimit"
@@ -366,6 +372,16 @@
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
+ // 鍔熻兘鐘舵�� label 鏄犲皠锛堝彧璇绘�佸睍绀猴級
+ getFunctionStatusLabel(value) {
+ const map = {
+ "1": "姝e父",
+ "2": "杞诲害寮傚父",
+ "3": "閲嶅害寮傚父",
+ "4": "鏃犳硶璇勪及"
+ };
+ return map[value] || "-";
+ },
// 淇濆瓨璇勪及
handleSave() {
// 楠岃瘉蹇呰瀛楁
@@ -664,6 +680,14 @@
display: inline-block;
min-width: 200px;
}
+.ro-text {
+ display: inline-block;
+ color: #303133;
+ font-size: 14px;
+ line-height: 32px;
+ white-space: pre-wrap;
+ word-break: break-word;
+}
::v-deep .el-upload__tip {
font-size: 12px;
color: #909399;
diff --git a/src/views/business/GetWitness/GetWitnessInfo.vue b/src/views/business/GetWitness/GetWitnessInfo.vue
index d42c8bd..48c1e5e 100644
--- a/src/views/business/GetWitness/GetWitnessInfo.vue
+++ b/src/views/business/GetWitness/GetWitnessInfo.vue
@@ -1,129 +1,113 @@
<template>
<div class="organ-procurement-detail">
- <case-basic-info :case-id="caseId" :show-attachment="true" />
+ <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
<!-- 鍩烘湰淇℃伅 -->
- <el-card class="detail-card">
+ <el-card class="detail-card paper-card">
<div slot="header" class="clearfix">
<span class="detail-title">鍣ㄥ畼鑾峰彇鍩烘湰淇℃伅</span>
</div>
- <el-form :model="form" ref="form" :rules="rules" label-width="120px">
+ <el-form :model="form" ref="form" :rules="rules" label-width="120px" class="paper-form">
<!-- 鎵嬫湳鐩稿叧淇℃伅 -->
<el-divider content-position="left">鎵嬫湳淇℃伅</el-divider>
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="鎵嬫湳鍖荤敓" prop="operationdoctor">
- <el-input v-model="form.operationdoctor" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鎵嬫湳寮�濮嬫椂闂�" prop="operationbegtime">
- <el-date-picker
- v-model="form.operationbegtime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鎵嬫湳缁撴潫鏃堕棿" prop="operationendtime">
- <el-date-picker
- v-model="form.operationendtime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="鎵嬫湳鍖荤敓" prop="operationdoctor" class="col-1-3">
+ <el-input v-model="form.operationdoctor" />
+ </el-form-item>
+ <el-form-item label="鎵嬫湳寮�濮嬫椂闂�" prop="operationbegtime" class="col-1-3">
+ <el-date-picker
+ v-model="form.operationbegtime"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ <el-form-item label="鎵嬫湳缁撴潫鏃堕棿" prop="operationendtime" class="col-1-3">
+ <el-date-picker
+ v-model="form.operationendtime"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </div>
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item
- label="鑵逛富鍔ㄨ剦鎻掔鏃堕棿"
- prop="abdominalaortacannulatime"
- >
- <el-date-picker
- v-model="form.abdominalaortacannulatime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item
- label="鑵逛富鍔ㄨ剦鐏屾敞鏃堕棿"
- prop="abdominalaortaperfusiontime"
- >
- <el-date-picker
- v-model="form.abdominalaortaperfusiontime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item
+ label="鑵逛富鍔ㄨ剦鎻掔鏃堕棿"
+ prop="abdominalaortacannulatime"
+ class="col-1-3"
+ >
+ <el-date-picker
+ v-model="form.abdominalaortacannulatime"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ <el-form-item
+ label="鑵逛富鍔ㄨ剦鐏屾敞鏃堕棿"
+ prop="abdominalaortaperfusiontime"
+ class="col-1-3"
+ >
+ <el-date-picker
+ v-model="form.abdominalaortaperfusiontime"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </div>
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="闂ㄩ潤鑴夋彃绠℃椂闂�" prop="portalveincannulatime">
- <el-date-picker
- v-model="form.portalveincannulatime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="闂ㄩ潤鑴夌亴娉ㄦ椂闂�" prop="portalveinperfusiontime">
- <el-date-picker
- v-model="form.portalveinperfusiontime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="闂ㄩ潤鑴夋彃绠℃椂闂�" prop="portalveincannulatime" class="col-1-3">
+ <el-date-picker
+ v-model="form.portalveincannulatime"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ <el-form-item label="闂ㄩ潤鑴夌亴娉ㄦ椂闂�" prop="portalveinperfusiontime" class="col-1-3">
+ <el-date-picker
+ v-model="form.portalveinperfusiontime"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </div>
<!-- 鍗忚皟鍛樹俊鎭� -->
<el-divider content-position="left">鍗忚皟鍛樹俊鎭�</el-divider>
- <el-row :gutter="20">
+ <div class="form-row">
<!-- <el-col :span="8">
<el-form-item label="鍗忚皟鍛樺鍚�" prop="coordinatorName">
<el-input v-model="form.coordinatorName" />
</el-form-item>
</el-col> -->
- <el-col :span="8">
- <el-form-item label="杩涙墜鏈鏃堕棿" prop="coordinatorInOperating">
- <el-date-picker
- v-model="form.coordinatorInOperating"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍑烘墜鏈鏃堕棿" prop="coordinatorOutOperating">
- <el-date-picker
- v-model="form.coordinatorOutOperating"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <el-form-item label="杩涙墜鏈鏃堕棿" prop="coordinatorInOperating" class="col-1-3">
+ <el-date-picker
+ v-model="form.coordinatorInOperating"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ <el-form-item label="鍑烘墜鏈鏃堕棿" prop="coordinatorOutOperating" class="col-1-3">
+ <el-date-picker
+ v-model="form.coordinatorOutOperating"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </div>
- <el-row :gutter="20">
+ <div class="form-row">
<!-- <el-col :span="8">
<el-form-item label="鍗忚皟鍛樼瀛�" prop="coordinatorSign">
<el-input v-model="form.coordinatorSign" />
@@ -139,57 +123,45 @@
/>
</el-form-item>
</el-col> -->
- <el-col :span="8">
- <el-form-item label="鏄惁榛樺搥缂呮��" prop="isspendremember">
- <el-select v-model="form.isspendremember" style="width: 100%">
- <el-option label="鏄�" :value="1" />
- <el-option label="鍚�" :value="0" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鎭㈠閬椾綋浠" prop="isrestoreremains">
- <el-select v-model="form.isrestoreremains" style="width: 100%">
- <el-option label="鏄�" :value="1" />
- <el-option label="鍚�" :value="0" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
+ <el-form-item label="鏄惁榛樺搥缂呮��" prop="isspendremember" class="col-1-3">
+ <el-select v-model="form.isspendremember" style="width: 100%">
+ <el-option label="鏄�" :value="1" />
+ <el-option label="鍚�" :value="0" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鎭㈠閬椾綋浠" prop="isrestoreremains" class="col-1-3">
+ <el-select v-model="form.isrestoreremains" style="width: 100%">
+ <el-option label="鏄�" :value="1" />
+ <el-option label="鍚�" :value="0" />
+ </el-select>
+ </el-form-item>
+ </div>
<!-- 璐熻矗浜轰俊鎭� -->
<el-divider content-position="left">璐熻矗浜轰俊鎭�</el-divider>
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="璐熻矗浜哄鍚�" prop="responsibleusername">
- <el-input v-model="form.responsibleusername" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍗忚皟鍛樹竴" prop="coordinatedusernameo">
- <el-input v-model="form.coordinatedusernameo" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet">
- <el-input v-model="form.coordinatedusernamet" />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="璐熻矗浜哄鍚�" prop="responsibleusername" class="col-1-3">
+ <el-input v-model="form.responsibleusername" />
+ </el-form-item>
+ <el-form-item label="鍗忚皟鍛樹竴" prop="coordinatedusernameo" class="col-1-3">
+ <el-input v-model="form.coordinatedusernameo" />
+ </el-form-item>
+ <el-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet" class="col-1-3">
+ <el-input v-model="form.coordinatedusernamet" />
+ </el-form-item>
+ </div>
<!-- 鑾峰彇鏈烘瀯淇℃伅 -->
<el-divider content-position="left">鑾峰彇鏈烘瀯淇℃伅</el-divider>
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="鑾峰彇鏈烘瀯鍚嶇О" prop="gainhospitalname">
- <el-input
- v-model="form.gainhospitalname"
- placeholder="璇疯緭鍏ヨ幏鍙栨満鏋勫悕绉�"
- />
- </el-form-item>
- </el-col>
+ <div class="form-row">
+ <el-form-item label="鑾峰彇鏈烘瀯鍚嶇О" prop="gainhospitalname" class="col-1-3">
+ <el-input
+ v-model="form.gainhospitalname"
+ placeholder="璇疯緭鍏ヨ幏鍙栨満鏋勫悕绉�"
+ />
+ </el-form-item>
<!-- <el-col :span="8">
<el-form-item label="鎹愮尞缂栧彿" prop="gainhospitalno">
<el-input
@@ -198,7 +170,7 @@
/>
</el-form-item>
</el-col> -->
- </el-row>
+ </div>
</el-form>
</el-card>
@@ -425,42 +397,30 @@
<span class="detail-title">鐩稿叧闄勪欢</span>
</div>
- <!-- 涓婁紶鍖哄煙锛堟棤鍒嗙被閫夋嫨锛岀敱Tab鎺у埗锛� -->
- <div class="upload-wrapper">
- <UploadAttachment
- ref="uploadAttachment"
- :file-list="attachmentFileList"
- :limit="attachmentLimit"
- :accept="attachmentAccept"
- :multiple="true"
- @change="handleAttachmentChange"
- @upload-success="handleUploadSuccess"
- @upload-error="handleUploadError"
- @remove="handleAttachmentRemove"
- />
- <div style="font-size:12px; color:#909399; margin-top:4px;">
- 褰撳墠涓婁紶鍒嗙被锛�<el-tag size="small" type="info">{{
- activeTab === "鏈垎绫�" ? "鏈垎绫�" : activeTab
- }}</el-tag>
- 锛堝垏鎹� Tab 鍙敼鍙樹笂浼犲垎绫伙級
- </div>
- </div>
-
<!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず锛屾敮鎸佷慨鏀瑰垎绫� -->
- <div class="attachment-list" v-if="attachments && attachments.length > 0">
- <el-tabs v-model="activeTab" type="border-card">
- <el-tab-pane
- v-for="category in categories"
- :key="category"
- :label="category + '(' + getCategoryCount(category) + ')'"
- :name="category"
- >
- <el-table
- :data="getCategoryFiles(category)"
- style="width: 100%"
- size="small"
- border
+ <el-tabs v-model="activeTab" type="border-card">
+ <el-tab-pane
+ v-for="category in categories"
+ :key="category"
+ :label="category + '(' + getCategoryCount(category) + ')'"
+ :name="category"
+ >
+ <div style="margin-bottom: 10px; text-align: right;">
+ <el-button
+ size="mini"
+ type="primary"
+ icon="el-icon-plus"
+ @click="openUploadDialog(category)"
>
+ 娣诲姞闄勪欢
+ </el-button>
+ </div>
+ <el-table
+ :data="getCategoryFiles(category)"
+ style="width: 100%"
+ size="small"
+ border
+ >
<el-table-column label="鏂囦欢鍚�" min-width="180">
<template #default="scope">
<i
@@ -521,15 +481,15 @@
>
</template>
</el-table-column>
- </el-table>
- </el-tab-pane>
- </el-tabs>
- </div>
-
- <!-- 鏃犻檮浠舵椂鏄剧ず -->
- <div v-else style="text-align:center; padding:20px; color:#909399;">
- 鏆傛棤闄勪欢锛岃涓婁紶
- </div>
+ </el-table>
+ <div
+ v-if="getCategoryFiles(category).length === 0"
+ style="text-align:center; padding:20px; color:#909399;"
+ >
+ 鏆傛棤闄勪欢
+ </div>
+ </el-tab-pane>
+ </el-tabs>
</el-card>
<div style="text-align: center; margin: 30px 0;">
<el-button type="primary" @click="handleSave" :loading="saveLoading">
@@ -631,45 +591,68 @@
</div>
</el-dialog>
- <!-- 鏂囦欢棰勮寮圭獥 -->
+ <!-- 涓婁紶瀵硅瘽妗� -->
<el-dialog
- :title="filePreviewTitle"
- :visible.sync="filePreviewVisible"
- width="800px"
- @close="filePreviewVisible = false"
+ :title="`涓婁紶${currentUploadCategory}闄勪欢`"
+ :visible.sync="uploadDialogVisible"
+ width="480px"
+ :close-on-click-modal="false"
>
- <div v-if="currentPreviewFile">
- <div v-if="currentPreviewFile.fileType === 'image'">
- <img
- :src="currentPreviewFile.fileUrl"
- style="max-width: 100%; max-height: 500px;"
- />
+ <el-upload
+ ref="uploadRef"
+ class="upload-demo"
+ drag
+ :action="uploadAction"
+ :headers="headers"
+ multiple
+ :file-list="tempFileList"
+ :before-upload="beforeUpload"
+ :on-change="handleFileChange"
+ :on-remove="handleTempRemove"
+ :on-success="handleUploadSuccess"
+ :auto-upload="false"
+ >
+ <i class="el-icon-upload"></i>
+ <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+ <div class="el-upload__tip" slot="tip">
+ 鏀寔涓婁紶pdf銆乯pg銆乸ng銆乨oc銆乨ocx鏍煎紡鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB
</div>
- <div v-else-if="currentPreviewFile.fileType === 'pdf'">
- <iframe
- :src="currentPreviewFile.fileUrl"
- width="100%"
- height="500px"
- ></iframe>
- </div>
- <div v-else>
- <p>涓嶆敮鎸侀瑙堟鏂囦欢绫诲瀷锛岃涓嬭浇鏌ョ湅</p>
- </div>
- </div>
+ </el-upload>
+
+ <span slot="footer" class="dialog-footer">
+ <el-button @click="uploadDialogVisible = false">鍙栨秷</el-button>
+ <el-button
+ type="primary"
+ @click="submitUpload"
+ :loading="uploadLoading"
+ :disabled="tempFileList.length === 0"
+ >
+ 纭涓婁紶
+ </el-button>
+ </span>
</el-dialog>
+
+ <!-- 鏂囦欢棰勮寮圭獥 -->
+ <FilePreviewDialog
+ :visible="previewVisible"
+ :file="currentPreviewFile"
+ @close="previewVisible = false"
+ @download="handleDownload"
+ />
</div>
</template>
<script>
import { witnessList, witnessadd, witnessedit } from "@/api/businessApi";
-import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
import CaseBasicInfo from "@/components/CaseBasicInfo";
+import { getToken } from "@/utils/auth";
import dayjs from "dayjs";
export default {
name: "OrganProcurementDetail",
components: {
- UploadAttachment,
+ FilePreviewDialog,
CaseBasicInfo
},
dicts: [
@@ -779,19 +762,22 @@
},
// 闄勪欢鏁版嵁
attachments: [],
- attachmentFileList: [],
- // 闄勪欢鐩稿叧閰嶇疆
- attachmentLimit: 10,
- attachmentAccept:
- ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt",
+ // 涓婁紶鐩稿叧
+ uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+ headers: {
+ Authorization: "Bearer " + getToken()
+ },
+ uploadDialogVisible: false,
+ uploadLoading: false,
+ tempFileList: [],
+ currentUploadCategory: "",
// 缂栬緫瀵硅瘽妗�
editDialogVisible: false,
currentRecord: {},
currentEditIndex: -1,
// 鏂囦欢棰勮鐩稿叧
- filePreviewVisible: false,
- currentPreviewFile: null,
- filePreviewTitle: ""
+ previewVisible: false,
+ currentPreviewFile: null
};
},
computed: {
@@ -847,22 +833,6 @@
// 鑾峰彇鍣ㄥ畼瀛楀吀
organDict() {
return this.dict.type.sys_Organ || [];
- }
- },
- watch: {
- // 鐩戝惉闄勪欢鏁版嵁鍙樺寲
- attachments: {
- handler(newAttachments) {
- this.attachmentFileList = newAttachments.map(item => ({
- uid: item.id || Math.random(),
- name: item.fileName,
- fileSize: item.fileSize,
- url: item.path || item.fileUrl,
- uploadTime: item.uploadTime,
- status: "success"
- }));
- },
- deep: true
}
},
created() {
@@ -934,19 +904,8 @@
fileType: item.fileType || "" // 榛樿绌哄瓧绗︿覆琛ㄧず鏈垎绫�
}));
this.form.attachments = this.attachments;
- // 鍚屾 attachmentFileList
- this.attachmentFileList = this.attachments.map(item => ({
- uid: item.id || Math.random(),
- name: item.fileName,
- url: item.path || item.fileUrl,
- fileSize: item.fileSize,
- uploadTime: item.uploadTime,
- status: "success",
- raw: item
- }));
} else {
this.attachments = [];
- this.attachmentFileList = [];
}
// 澶勭悊鎹愮尞鍣ㄥ畼瀛楁
@@ -1382,133 +1341,157 @@
this.handleConfirmProcurement();
},
- // 闄勪欢鐩稿叧鏂规硶
- /** 闄勪欢鍙樺寲澶勭悊 */
- handleAttachmentChange(fileList) {
- this.attachmentFileList = fileList;
+ // ===== 闄勪欢鐩稿叧鏂规硶 =====
+ // 鎵撳紑涓婁紶瀵硅瘽妗�
+ openUploadDialog(category) {
+ this.currentUploadCategory = category;
+ this.tempFileList = [];
+ this.uploadDialogVisible = true;
+ this.$nextTick(() => {
+ if (this.$refs.uploadRef) {
+ this.$refs.uploadRef.clearFiles();
+ }
+ });
},
- /** 闄勪欢绉婚櫎澶勭悊 */
- handleAttachmentRemove(file) {
- // 鐩存帴璋冪敤鏂扮殑鍒犻櫎鏂规硶
- if (file.raw) {
- this.handleRemoveAttachmentByFile(file.raw);
- } else if (file.url) {
- const target = this.attachments.find(
- item => item.path === file.url || item.fileUrl === file.url
- );
- if (target) {
- this.handleRemoveAttachmentByFile(target);
- }
- }
-},
-
- /** 涓婁紶鎴愬姛澶勭悊 */
- handleUploadSuccess({ file, fileList, response }) {
- if (response.code === 200) {
- // 鏍规嵁褰撳墠婵�娲荤殑 Tab 鍐冲畾鍒嗙被锛堟湭鍒嗙被 Tab 瀵瑰簲绌哄瓧绗︿覆锛�
- const category = this.activeTab === '鏈垎绫�' ? '' : this.activeTab;
- const attachmentObj = {
- fileName: file.name,
- path: response.fileUrl || file.url,
- fileUrl: response.fileUrl || file.url,
- fileType: category, // 鍏抽敭锛氳褰曞垎绫�
- fileSize: file.size,
- uploadTime: dayjs().format('YYYY-MM-DD HH:mm:ss')
- };
-
- if (!Array.isArray(this.attachments)) {
- this.attachments = [];
- }
- this.attachments.push(attachmentObj);
- this.attachmentFileList = fileList;
- this.$message.success('鏂囦欢涓婁紶鎴愬姛');
- }
-},
-// 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
-getCategoryCount(category) {
- return this.attachments.filter(item => {
- const type = item.fileType || '';
- if (category === '鏈垎绫�') {
- return !this.presetCategories.includes(type);
- }
- return type === category;
- }).length;
-},
-
-// 鑾峰彇鏌愬垎绫荤殑鏂囦欢鍒楄〃
-getCategoryFiles(category) {
- return this.attachments.filter(item => {
- const type = item.fileType || '';
- if (category === '鏈垎绫�') {
- return !this.presetCategories.includes(type);
- }
- return type === category;
- });
-},
-
-// 鏇存柊闄勪欢鍒嗙被锛堜笅鎷変慨鏀规椂瑙﹀彂锛�
-updateAttachmentCategory(row, newVal) {
- const target = this.attachments.find(item => item === row);
- if (target) {
- target.fileType = newVal; // 鍙兘涓虹┖瀛楃涓�
- // 鍚屾鏇存柊 attachmentFileList
- const fileItem = this.attachmentFileList.find(
- f => f.raw === row || f.url === row.fileUrl
- );
- if (fileItem) {
- fileItem.raw.fileType = newVal;
- fileItem.fileType = newVal || '鏈垎绫�';
- }
- // 濡傛灉褰撳墠婵�娲荤殑tab娌℃湁鏂囦欢浜嗭紝鑷姩鍒囨崲鍒扮涓�涓湁鏂囦欢鐨則ab
- const currentTabHasFiles = this.getCategoryFiles(this.activeTab).length > 0;
- if (!currentTabHasFiles) {
- const firstCategory = this.categories[0];
- if (firstCategory) this.activeTab = firstCategory;
- }
- }
-},
-
-// 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
-handleRemoveAttachmentByFile(file) {
- const index = this.attachments.findIndex(item => item === file);
- if (index > -1) {
- this.attachments.splice(index, 1);
- // 鍚屾鍒犻櫎 attachmentFileList
- const fileIndex = this.attachmentFileList.findIndex(
- f => f.raw === file || f.url === file.fileUrl
- );
- if (fileIndex > -1) {
- this.attachmentFileList.splice(fileIndex, 1);
- }
- this.$message.success('闄勪欢鍒犻櫎鎴愬姛');
- }
-},
- /** 涓婁紶閿欒澶勭悊 */
- handleUploadError({ file, fileList, error }) {
- console.error("闄勪欢涓婁紶澶辫触:", error);
- this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+ // 涓婁紶鍓嶆牎楠�
+ beforeUpload(file) {
+ const allowedTypes = [
+ "application/pdf",
+ "image/jpeg",
+ "image/png",
+ "application/msword",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+ ];
+ const maxSize = 10 * 1024 * 1024;
+ const isTypeOk =
+ allowedTypes.includes(file.type) ||
+ file.name.endsWith(".pdf") ||
+ file.name.endsWith(".jpg") ||
+ file.name.endsWith(".jpeg") ||
+ file.name.endsWith(".png") ||
+ file.name.endsWith(".doc") ||
+ file.name.endsWith(".docx");
+ if (!isTypeOk) {
+ this.$message.error("鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼爌df銆乯pg銆乸ng銆乨oc鎴杁ocx鏍煎紡鏂囦欢");
+ return false;
+ }
+ if (file.size > maxSize) {
+ this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
+ return false;
+ }
+ return true;
},
- /** 鎵嬪姩鍒犻櫎闄勪欢 */
- handleRemoveAttachment(index) {
- this.attachments.splice(index, 1);
- this.attachmentFileList.splice(index, 1);
- this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+ // 鏂囦欢閫夋嫨鍙樺寲
+ handleFileChange(file, fileList) {
+ this.tempFileList = fileList;
},
- /** 鏂囦欢棰勮 */
+ // 涓存椂绉婚櫎
+ handleTempRemove(file, fileList) {
+ this.tempFileList = fileList;
+ },
+
+ // 涓婁紶鎴愬姛澶勭悊
+ handleUploadSuccess(response, file, fileList) {
+ if (response.code !== 200) {
+ this.$message.error(response.msg || "涓婁紶澶辫触");
+ return;
+ }
+ // 鏈垎绫诲搴旂┖瀛楃涓诧紝涓庡睍绀�/淇濆瓨閫昏緫涓�鑷�
+ const category = this.currentUploadCategory === "鏈垎绫�" ? "" : this.currentUploadCategory;
+ const attachmentObj = {
+ fileName: file.name,
+ path: response.fileUrl || response.url || response.data || file.url,
+ fileUrl: response.fileUrl || response.url || response.data || file.url,
+ fileType: category,
+ fileSize: file.size,
+ uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+ };
+ if (!Array.isArray(this.attachments)) {
+ this.attachments = [];
+ }
+ this.attachments.push(attachmentObj);
+ this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+ this.uploadLoading = false;
+ this.uploadDialogVisible = false;
+ this.tempFileList = [];
+ },
+
+ // 鎻愪氦涓婁紶
+ submitUpload() {
+ if (this.tempFileList.length === 0) {
+ this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
+ return;
+ }
+ this.uploadLoading = true;
+ this.$refs.uploadRef.submit();
+ },
+
+ // 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
+ getCategoryCount(category) {
+ return this.attachments.filter(item => {
+ const type = item.fileType || "";
+ if (category === "鏈垎绫�") {
+ return !this.presetCategories.includes(type);
+ }
+ return type === category;
+ }).length;
+ },
+
+ // 鑾峰彇鏌愬垎绫荤殑鏂囦欢鍒楄〃
+ getCategoryFiles(category) {
+ return this.attachments.filter(item => {
+ const type = item.fileType || "";
+ if (category === "鏈垎绫�") {
+ return !this.presetCategories.includes(type);
+ }
+ return type === category;
+ });
+ },
+
+ // 鏇存柊闄勪欢鍒嗙被锛堜笅鎷変慨鏀规椂瑙﹀彂锛�
+ updateAttachmentCategory(row, newVal) {
+ const target = this.attachments.find(item => item === row);
+ if (target) {
+ target.fileType = newVal;
+ const currentTabHasFiles = this.getCategoryFiles(this.activeTab).length > 0;
+ if (!currentTabHasFiles) {
+ const firstCategory = this.categories[0];
+ if (firstCategory) this.activeTab = firstCategory;
+ }
+ }
+ },
+
+ // 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
+ handleRemoveAttachmentByFile(file) {
+ this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning"
+ })
+ .then(() => {
+ const index = this.attachments.findIndex(item => item === file);
+ if (index > -1) {
+ this.attachments.splice(index, 1);
+ this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+ }
+ })
+ .catch(() => {});
+ },
+
+ // 鏂囦欢棰勮
handlePreview(file) {
this.currentPreviewFile = {
fileName: file.fileName,
fileUrl: file.path || file.fileUrl,
fileType: this.getFileType(file.fileName)
};
- this.filePreviewTitle = file.fileName;
- this.filePreviewVisible = true;
+ this.previewVisible = true;
},
- /** 鏂囦欢涓嬭浇 */
+ // 鏂囦欢涓嬭浇
handleDownload(file) {
const fileUrl = file.path || file.fileUrl;
const fileName = file.fileName;
@@ -1767,4 +1750,73 @@
margin-bottom: 10px;
}
}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+ padding: 16px;
+}
+
+.paper-form {
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
+
+.paper-form >>> .form-row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+ flex: 0 0 33.3333%;
+ display: flex;
+ margin: 0;
+ background: #fff;
+ border-right: 1px solid #d0d3db;
+ border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+ display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+ flex: 0 0 120px;
+ width: 120px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #ecf5ff;
+ border-right: 1px solid #d0d3db;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
+}
</style>
diff --git a/src/views/business/OrganUtilization/OrganUtilizationInfo.vue b/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
index 839a358..6e2cff4 100644
--- a/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
+++ b/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
@@ -1,49 +1,41 @@
<template>
<div class="organ-utilization-detail">
- <case-basic-info :case-id="caseId" :show-attachment="true" />
- <el-form :model="form" ref="form" :rules="rules" label-width="120px">
+ <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
+ <el-form :model="form" ref="form" :rules="rules" label-width="120px" class="paper-form">
<!-- 鍩烘湰淇℃伅 -->
- <el-card class="detail-card">
+ <el-card class="detail-card paper-card">
<div slot="header" class="clearfix">
<span class="detail-title">鍣ㄥ畼鍒╃敤鍩烘湰淇℃伅</span>
</div>
- <el-row :gutter="20">
- <el-col :span="6">
- <el-form-item label="璐熻矗浜�" prop="responsibleusername">
- <el-input
- v-model="form.responsibleusername"
- placeholder="璇疯緭鍏ヨ礋璐d汉濮撳悕"
- />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="鍗忚皟鍛樹竴" prop="coordinatedusernameo">
- <el-input
- v-model="form.coordinatedusernameo"
- placeholder="璇疯緭鍏ュ崗璋冨憳涓�濮撳悕"
- />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet">
- <el-input
- v-model="form.coordinatedusernamet"
- placeholder="璇疯緭鍏ュ崗璋冨憳浜屽鍚�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="瀹屾垚鏃堕棿" prop="completetime">
- <el-date-picker
- v-model="form.completetime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="璐熻矗浜�" prop="responsibleusername" class="col-1-3">
+ <el-input
+ v-model="form.responsibleusername"
+ placeholder="璇疯緭鍏ヨ礋璐d汉濮撳悕"
+ />
+ </el-form-item>
+ <el-form-item label="鍗忚皟鍛樹竴" prop="coordinatedusernameo" class="col-1-3">
+ <el-input
+ v-model="form.coordinatedusernameo"
+ placeholder="璇疯緭鍏ュ崗璋冨憳涓�濮撳悕"
+ />
+ </el-form-item>
+ <el-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet" class="col-1-3">
+ <el-input
+ v-model="form.coordinatedusernamet"
+ placeholder="璇疯緭鍏ュ崗璋冨憳浜屽鍚�"
+ />
+ </el-form-item>
+ <el-form-item label="瀹屾垚鏃堕棿" prop="completetime" class="col-1-3">
+ <el-date-picker
+ v-model="form.completetime"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </div>
<!-- <el-row :gutter="20">
<el-col :span="12">
@@ -63,48 +55,42 @@
</el-col>
</el-row> -->
</el-card>
- <el-card class="detail-card">
+ <el-card class="detail-card paper-card">
<div slot="header" class="clearfix">
<span class="detail-title">閬椾綋鎹愮尞淇℃伅</span>
</div>
- <el-row :gutter="20">
- <el-col :span="6">
- <el-form-item align="left" label="閬椾綋鎺ユ敹" prop="isbodydonation">
- <el-radio-group v-model="form.isbodydonation">
- <el-radio
- v-for="dict in dict.type.sys_0_1 || []"
- :key="dict.value"
- :label="dict.value"
- >{{ dict.label }}</el-radio
- >
- </el-radio-group>
- </el-form-item>
- </el-col>
-
- <el-col :span="8">
- <el-form-item align="left" label="鎺ユ敹瀹跺睘" prop="relationname">
- <el-input
- v-model="form.relationname"
- placeholder="璇疯緭鍏ユ帴鏀跺灞�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="涓庢崘鐚�呭叧绯�" prop="signfamilyrelations">
- <el-select
- v-model="form.signfamilyrelations"
- placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
+ <div class="form-row">
+ <el-form-item align="left" label="閬椾綋鎺ユ敹" prop="isbodydonation" class="col-1-3">
+ <el-radio-group v-model="form.isbodydonation">
+ <el-radio
+ v-for="dict in dict.type.sys_0_1 || []"
+ :key="dict.value"
+ :label="dict.value"
+ >{{ dict.label }}</el-radio
>
- <el-option
- v-for="dict in dict.type.sys_FamilyRelation || []"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
+ </el-radio-group>
+ </el-form-item>
+
+ <el-form-item align="left" label="鎺ユ敹瀹跺睘" prop="relationname" class="col-1-3">
+ <el-input
+ v-model="form.relationname"
+ placeholder="璇疯緭鍏ユ帴鏀跺灞�"
+ />
+ </el-form-item>
+ <el-form-item label="涓庢崘鐚�呭叧绯�" prop="signfamilyrelations" class="col-1-3">
+ <el-select
+ v-model="form.signfamilyrelations"
+ placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
+ >
+ <el-option
+ v-for="dict in dict.type.sys_FamilyRelation || []"
+ :key="dict.value"
+ :label="dict.label"
+ :value="dict.value"
+ ></el-option>
+ </el-select>
+ </el-form-item>
+ </div>
</el-card>
</el-form>
<!-- 鍣ㄥ畼鍒╃敤璁板綍閮ㄥ垎 - 鏁村悎鍙楄�呰鎯� -->
@@ -164,14 +150,14 @@
<div class="recipient-header">
<span class="recipient-title">鍙楄�呰缁嗕俊鎭�</span>
<el-tag
- v-if="scope.row.transplantstate === '1'"
+ v-if="scope.row.transplantstate == '1'"
type="success"
size="small"
>
宸茬Щ妞�
</el-tag>
<el-tag
- v-else-if="scope.row.transplantstate === '0'"
+ v-else-if="scope.row.transplantstate == '0'"
type="warning"
size="small"
>
@@ -297,7 +283,7 @@
<!-- 绉绘淇℃伅閮ㄥ垎 -->
<div
class="form-section"
- v-if="scope.row.transplantstate === '1'"
+ v-if="scope.row.transplantstate == '1'"
>
<h4 class="section-title">绉绘淇℃伅</h4>
<el-row :gutter="20">
@@ -326,7 +312,7 @@
<!-- 鏈Щ妞嶅師鍥� -->
<div
class="form-section"
- v-if="scope.row.transplantstate === '0'"
+ v-if="scope.row.transplantstate == '0'"
>
<h4 class="section-title">鏈Щ妞嶄俊鎭�</h4>
<el-row :gutter="20">
@@ -473,110 +459,98 @@
<span class="detail-title">鐩稿叧闄勪欢</span>
</div>
- <!-- 涓婁紶鍖哄煙锛堟棤鍒嗙被閫夋嫨锛岀敱Tab鎺у埗锛� -->
- <div class="upload-wrapper">
- <UploadAttachment
- ref="uploadAttachment"
- :file-list="attachmentFileList"
- :limit="attachmentLimit"
- :accept="attachmentAccept"
- :multiple="true"
- @change="handleAttachmentChange"
- @upload-success="handleUploadSuccess"
- @upload-error="handleUploadError"
- @remove="handleAttachmentRemove"
- />
- <div style="font-size:12px; color:#909399; margin-top:4px;">
- 褰撳墠涓婁紶鍒嗙被锛�<el-tag size="small" type="info">{{
- activeTab === "鏈垎绫�" ? "鏈垎绫�" : activeTab
- }}</el-tag>
- 锛堝垏鎹� Tab 鍙敼鍙樹笂浼犲垎绫伙級
- </div>
- </div>
-
<!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず锛屾敮鎸佷慨鏀瑰垎绫� -->
- <div class="attachment-list" v-if="attachments && attachments.length > 0">
- <el-tabs v-model="activeTab" type="border-card">
- <el-tab-pane
- v-for="category in categories"
- :key="category"
- :label="category + '(' + getCategoryCount(category) + ')'"
- :name="category"
- >
- <el-table
- :data="getCategoryFiles(category)"
- style="width: 100%"
- size="small"
- border
+ <el-tabs v-model="activeTab" type="border-card">
+ <el-tab-pane
+ v-for="category in categories"
+ :key="category"
+ :label="category + '(' + getCategoryCount(category) + ')'"
+ :name="category"
+ >
+ <div style="margin-bottom: 10px; text-align: right;">
+ <el-button
+ size="mini"
+ type="primary"
+ icon="el-icon-plus"
+ @click="openUploadDialog(category)"
>
- <el-table-column label="鏂囦欢鍚�" min-width="180">
- <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="150">
- <template #default="scope">
- <el-select
- v-model="scope.row.fileType"
- size="small"
- @change="updateAttachmentCategory(scope.row, $event)"
- placeholder="閫夋嫨鍒嗙被"
- >
- <el-option label="鍘熻〃鎷嶇収" value="鍘熻〃鎷嶇収" />
- <el-option label="鎺ュ彈纭涔�" value="鎺ュ彈纭涔�" />
- <el-option label="寮冪敤璇存槑" value="寮冪敤璇存槑" />
- <el-option label="鎹愮尞璇佷功鐓х墖" value="鎹愮尞璇佷功鐓х墖" />
- <el-option label="鏈垎绫�" value="" />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鏂囦欢绫诲瀷" width="100">
- <template #default="scope">
- <el-tag size="small">{{
- getFileTypeText(scope.row.fileName)
- }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="涓婁紶鏃堕棿" width="160">
- <template #default="scope">
- <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鏂囦欢澶у皬" width="120">
- <template #default="scope">
- <span>{{ formatFileSize(scope.row.fileSize) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="180" fixed="right">
- <template #default="scope">
- <el-button
- size="mini"
- type="primary"
- @click="handlePreview(scope.row)"
- >棰勮</el-button
- >
- <el-button
- size="mini"
- type="danger"
- @click="handleRemoveAttachmentByFile(scope.row)"
- >鍒犻櫎</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </el-tab-pane>
- </el-tabs>
- </div>
-
- <!-- 鏃犻檮浠舵椂鏄剧ず -->
- <div v-else style="text-align:center; padding:20px; color:#909399;">
- 鏆傛棤闄勪欢锛岃涓婁紶
- </div>
+ 娣诲姞闄勪欢
+ </el-button>
+ </div>
+ <el-table
+ :data="getCategoryFiles(category)"
+ style="width: 100%"
+ size="small"
+ border
+ >
+ <el-table-column label="鏂囦欢鍚�" min-width="180">
+ <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="150">
+ <template #default="scope">
+ <el-select
+ v-model="scope.row.fileType"
+ size="small"
+ @change="updateAttachmentCategory(scope.row, $event)"
+ placeholder="閫夋嫨鍒嗙被"
+ >
+ <el-option label="鍘熻〃鎷嶇収" value="鍘熻〃鎷嶇収" />
+ <el-option label="鎺ュ彈纭涔�" value="鎺ュ彈纭涔�" />
+ <el-option label="寮冪敤璇存槑" value="寮冪敤璇存槑" />
+ <el-option label="鎹愮尞璇佷功鐓х墖" value="鎹愮尞璇佷功鐓х墖" />
+ <el-option label="鏈垎绫�" value="" />
+ </el-select>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢绫诲瀷" width="100">
+ <template #default="scope">
+ <el-tag size="small">{{
+ getFileTypeText(scope.row.fileName)
+ }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="涓婁紶鏃堕棿" width="160">
+ <template #default="scope">
+ <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢澶у皬" width="120">
+ <template #default="scope">
+ <span>{{ formatFileSize(scope.row.fileSize) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="180" fixed="right">
+ <template #default="scope">
+ <el-button
+ size="mini"
+ type="primary"
+ @click="handlePreview(scope.row)"
+ >棰勮</el-button
+ >
+ <el-button
+ size="mini"
+ type="danger"
+ @click="handleRemoveAttachmentByFile(scope.row)"
+ >鍒犻櫎</el-button
+ >
+ </template>
+ </el-table-column>
+ </el-table>
+ <div
+ v-if="getCategoryFiles(category).length == 0"
+ style="text-align:center; padding:20px; color:#909399;"
+ >
+ 鏆傛棤闄勪欢
+ </div>
+ </el-tab-pane>
+ </el-tabs>
</el-card>
<div style="text-align: center; margin: 30px 0;">
<el-button type="primary" @click="handleSave" :loading="saveLoading">
@@ -590,6 +564,47 @@
瀹屾垚鍒╃敤
</el-button>
</div>
+ <!-- 涓婁紶瀵硅瘽妗� -->
+ <el-dialog
+ :title="`涓婁紶${currentUploadCategory}闄勪欢`"
+ :visible.sync="uploadDialogVisible"
+ width="480px"
+ :close-on-click-modal="false"
+ >
+ <el-upload
+ ref="uploadRef"
+ class="upload-demo"
+ drag
+ :action="uploadAction"
+ :headers="headers"
+ multiple
+ :file-list="tempFileList"
+ :before-upload="beforeUpload"
+ :on-change="handleFileChange"
+ :on-remove="handleTempRemove"
+ :on-success="handleUploadSuccess"
+ :auto-upload="false"
+ >
+ <i class="el-icon-upload"></i>
+ <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+ <div class="el-upload__tip" slot="tip">
+ 鏀寔涓婁紶pdf銆乯pg銆乸ng銆乨oc銆乨ocx鏍煎紡鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB
+ </div>
+ </el-upload>
+
+ <span slot="footer" class="dialog-footer">
+ <el-button @click="uploadDialogVisible = false">鍙栨秷</el-button>
+ <el-button
+ type="primary"
+ @click="submitUpload"
+ :loading="uploadLoading"
+ :disabled="tempFileList.length == 0"
+ >
+ 纭涓婁紶
+ </el-button>
+ </span>
+ </el-dialog>
+
<!-- 鏂囦欢棰勮瀵硅瘽妗� -->
<FilePreviewDialog
:visible="filePreviewVisible"
@@ -606,15 +621,14 @@
completionadd,
completionedit
} from "@/api/businessApi";
-import UploadAttachment from "@/components/UploadAttachment"; // 鏂板瀵煎叆
-import FilePreviewDialog from "@/components/FilePreviewDialog"; // 鏂板瀵煎叆
+import FilePreviewDialog from "@/components/FilePreviewDialog";
import CaseBasicInfo from "@/components/CaseBasicInfo";
-import dayjs from "dayjs"; // 鏂板瀵煎叆锛岀敤浜庢椂闂村鐞�
+import { getToken } from "@/utils/auth";
+import dayjs from "dayjs";
export default {
name: "OrganUtilizationDetail",
components: {
- UploadAttachment,
FilePreviewDialog,
CaseBasicInfo
},
@@ -714,13 +728,17 @@
editDialogVisible: false,
currentRecord: {},
currentEditIndex: -1,
- // 闄勪欢鐩稿叧閰嶇疆 - 鏂板
- attachmentFileList: [],
- attachmentLimit: 10,
- attachmentAccept:
- ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt",
+ // 涓婁紶鐩稿叧
+ uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+ headers: {
+ Authorization: "Bearer " + getToken()
+ },
+ uploadDialogVisible: false,
+ uploadLoading: false,
+ tempFileList: [],
+ currentUploadCategory: "",
- // 鏂囦欢棰勮鐩稿叧 - 鏂板
+ // 鏂囦欢棰勮鐩稿叧
filePreviewVisible: false,
currentPreviewFile: null,
currentFollowup: {},
@@ -733,15 +751,21 @@
return JSON.parse(sessionStorage.getItem("user") || "{}");
},
categories() {
- // 濮嬬粓杩斿洖鎵�鏈夐璁惧垎绫� + 鏈垎绫伙紝鍗充娇娌℃湁鏁版嵁涔熸樉绀�
- const allCategories = ['鍘熻〃鎷嶇収', '鎺ュ彈纭涔�', '寮冪敤璇存槑', '鎹愮尞璇佷功鐓х墖', '鏈垎绫�'];
- return allCategories;
+ // 濮嬬粓杩斿洖鎵�鏈夐璁惧垎绫� + 鏈垎绫伙紝鍗充娇娌℃湁鏁版嵁涔熸樉绀�
+ const allCategories = [
+ "鍘熻〃鎷嶇収",
+ "鎺ュ彈纭涔�",
+ "寮冪敤璇存槑",
+ "鎹愮尞璇佷功鐓х墖",
+ "鏈垎绫�"
+ ];
+ return allCategories;
},
// 宸茬Щ妞嶆暟閲�
transplantedCount() {
if (!this.utilizationData.serviceDonatecomporganList) return 0;
return this.utilizationData.serviceDonatecomporganList.filter(
- record => record.transplantstate === "1"
+ record => record.transplantstate == "1"
).length;
},
// 鍞竴鍖婚櫌鏁伴噺
@@ -776,22 +800,6 @@
created() {
this.initData();
},
- watch: {
- // 鐩戝惉闄勪欢鏁版嵁鍙樺寲 - 鏂板
- attachments: {
- handler(newAttachments) {
- this.attachmentFileList = newAttachments.map(item => ({
- uid: item.id || Math.random(),
- name: item.fileName,
- fileSize: item.fileSize,
- url: item.path || item.fileUrl,
- uploadTime: item.uploadTime,
- status: "success"
- }));
- },
- deep: true
- }
- },
methods: {
// 鍒濆鍖栨暟鎹�
initData() {
@@ -825,9 +833,9 @@
});
targetNos.forEach(no => {
- const existing = records.find(r => r.organno === no);
+ const existing = records.find(r => r.organno == no);
if (existing) {
- if (existing.delFlag === 1) existing.delFlag = 0;
+ if (existing.delFlag == 1) existing.delFlag = 0;
} else {
// 浣跨敤鍒涘缓鏂规硶锛岃嚜鍔ㄥ寘鍚� delFlag:0
this.createOrganRecord(no);
@@ -843,11 +851,7 @@
this.loading = true;
try {
const response = await completionList({ infoid: this.caseId });
- if (
- response.code === 200 &&
- response.data &&
- response.data.length > 0
- ) {
+ if (response.code == 200 && response.data && response.data.length > 0) {
const data = response.data[0];
if (!data.completeState || data.completeState == 1) {
data.completeState = "2";
@@ -872,9 +876,10 @@
? data.serviceDonatecomporganList.map(record => ({
...record,
transplanttime: record.transplanttime || "",
- transplantstate: record.transplantstate
- ? record.transplantstate.toString()
- : "1"
+ transplantstate:
+ record.transplantstate != null
+ ? record.transplantstate.toString()
+ : "1"
}))
: [];
}
@@ -889,19 +894,8 @@
fileType: item.fileType || "" // 榛樿绌哄瓧绗︿覆琛ㄧず鏈垎绫�
}));
this.form.attachments = this.attachments;
- // 鍚屾 attachmentFileList
- this.attachmentFileList = this.attachments.map(item => ({
- uid: item.id || Math.random(),
- name: item.fileName,
- url: item.path || item.fileUrl,
- fileSize: item.fileSize,
- uploadTime: item.uploadTime,
- status: "success",
- raw: item
- }));
} else {
this.attachments = [];
- this.attachmentFileList = [];
}
this.$message.success("鏁版嵁鍔犺浇鎴愬姛");
@@ -956,9 +950,9 @@
// 3. 鏂板鎴栨仮澶嶈褰曪紙鏃犻渶寮圭獥锛�
targetOrganNos.forEach(no => {
- const existing = records.find(r => r.organno === no);
+ const existing = records.find(r => r.organno == no);
if (existing) {
- if (existing.delFlag === 1) {
+ if (existing.delFlag == 1) {
existing.delFlag = 0; // 鎭㈠鏄剧ず
}
} else {
@@ -1073,6 +1067,7 @@
const organName = this.getOrganLabel(organValue);
this.utilizationData.serviceDonatecomporganList.push({
+ infoid: this.caseId,
organname: organName,
organno: organValue,
caseNo: "",
@@ -1107,19 +1102,19 @@
// 鏍规嵁瀛楀吀value鑾峰彇label
getOrganLabel(organValue) {
- const dictItem = this.organDict.find(item => item.value === organValue);
+ const dictItem = this.organDict.find(item => item.value == organValue);
return dictItem ? dictItem.label : organValue;
},
// 绉绘鐘舵�佸彉鍖栧鐞�
handleTransplantStatusChange(row, status) {
- if (status === "0") {
+ if (status == "0") {
// 濡傛灉鐘舵�佷负鏈Щ妞嶏紝娓呴櫎鐩稿叧瀛楁
// row.transplanttime = "";
// row.transplantdoct = "";
// row.hospitalno = "";
// row.hospitalname = "";
- } else if (status === "1") {
+ } else if (status == "1") {
// 濡傛灉鐘舵�佷负宸茬Щ妞嶏紝鑷姩璁剧疆绉绘鏃堕棿涓哄綋鍓嶆椂闂�
if (!row.transplanttime) {
row.transplanttime = new Date().toISOString().split("T")[0];
@@ -1158,12 +1153,12 @@
// 鍣ㄥ畼琛屾牱寮�
getOrganRowClassName({ row }) {
if (
- row.transplantstate === "1" &&
+ row.transplantstate == "1" &&
(!row.hospitalno || !row.name || !row.transplanttime)
) {
return "warning-row";
}
- if (row.transplantstate === "0" && !row.abandonreason) {
+ if (row.transplantstate == "0" && !row.abandonreason) {
return "warning-row";
}
return "";
@@ -1226,7 +1221,7 @@
const apiMethod = this.form.id ? completionedit : completionadd;
const response = await apiMethod(saveData);
- if (response.code === 200) {
+ if (response.code == 200) {
this.$message.success("淇濆瓨鎴愬姛");
if (!this.form.id && response.data && response.data.id) {
this.form.id = response.data.id;
@@ -1251,7 +1246,7 @@
async handleSaveUtilization() {
if (
!this.utilizationData.serviceDonatecomporganList ||
- this.utilizationData.serviceDonatecomporganList.length === 0
+ this.utilizationData.serviceDonatecomporganList.length == 0
) {
this.$message.warning("璇峰厛娣诲姞鍒╃敤璁板綍");
return;
@@ -1269,7 +1264,7 @@
const response = await completionedit(saveData);
- if (response.code === 200) {
+ if (response.code == 200) {
this.$message.success("鍒╃敤璁板綍淇濆瓨鎴愬姛");
} else {
this.$message.error(
@@ -1289,9 +1284,9 @@
// 妫�鏌ュ埄鐢ㄨ褰曟槸鍚﹀畬鏁�
const incompleteRecords = this.utilizationData.serviceDonatecomporganList.filter(
record => {
- if (record.transplantstate === "1") {
+ if (record.transplantstate == "1") {
return !record.hospitalno || !record.name || !record.transplanttime;
- } else if (record.transplantstate === "0") {
+ } else if (record.transplantstate == "0") {
return !record.abandonreason;
}
return false;
@@ -1329,7 +1324,7 @@
const response = await completionedit(saveData);
- if (response.code === 200) {
+ if (response.code == 200) {
this.$message.success("鍣ㄥ畼鍒╃敤宸插畬鎴�");
} else {
this.$message.error(
@@ -1371,7 +1366,7 @@
// 鑾峰彇鍣ㄥ畼鍚嶇О
const organRecord = this.utilizationData.serviceDonatecomporganList.find(
- item => item.organno === this.currentFollowup.organNo
+ item => item.organno == this.currentFollowup.organNo
);
const organName = organRecord ? organRecord.organname : "";
@@ -1386,7 +1381,7 @@
if (this.isEditingFollowup) {
// 鏇存柊鐜版湁璁板綍
const index = this.followupData.records.findIndex(
- item => item.id === this.currentFollowup.id
+ item => item.id == this.currentFollowup.id
);
if (index !== -1) {
this.followupData.records[index] = {
@@ -1403,53 +1398,107 @@
this.saveLoading = false;
}, 1000);
},
- /** 闄勪欢鍙樺寲澶勭悊 */
- handleAttachmentChange(fileList) {
- this.attachmentFileList = fileList;
+ // ==== 闄勪欢鐩稿叧鏂规硶 ====
+ // 鎵撳紑涓婁紶瀵硅瘽妗�
+ openUploadDialog(category) {
+ this.currentUploadCategory = category;
+ this.tempFileList = [];
+ this.uploadDialogVisible = true;
+ this.$nextTick(() => {
+ if (this.$refs.uploadRef) {
+ this.$refs.uploadRef.clearFiles();
+ }
+ });
},
- /** 闄勪欢绉婚櫎澶勭悊 */
- handleAttachmentRemove(file) {
- if (file.url) {
- const index = this.attachments.findIndex(
- item => item.path === file.url || item.fileUrl === file.url
+ // 涓婁紶鍓嶆牎楠�
+ beforeUpload(file) {
+ const allowedTypes = [
+ "application/pdf",
+ "image/jpeg",
+ "image/png",
+ "application/msword",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+ ];
+ const maxSize = 10 * 1024 * 1024;
+ const isTypeOk =
+ allowedTypes.includes(file.type) ||
+ file.name.endsWith(".pdf") ||
+ file.name.endsWith(".jpg") ||
+ file.name.endsWith(".jpeg") ||
+ file.name.endsWith(".png") ||
+ file.name.endsWith(".doc") ||
+ file.name.endsWith(".docx");
+ if (!isTypeOk) {
+ this.$message.error(
+ "鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼爌df銆乯pg銆乸ng銆乨oc鎴杁ocx鏍煎紡鏂囦欢"
);
- if (index > -1) {
- this.attachments.splice(index, 1);
- this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
- }
+ return false;
}
+ if (file.size > maxSize) {
+ this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
+ return false;
+ }
+ return true;
},
- /** 涓婁紶鎴愬姛澶勭悊 */
- handleUploadSuccess({ file, fileList, response }) {
- if (response.code === 200) {
- // 鏍规嵁褰撳墠婵�娲荤殑 Tab 鍐冲畾鍒嗙被锛堟湭鍒嗙被 Tab 瀵瑰簲绌哄瓧绗︿覆锛�
- const category = this.activeTab === "鏈垎绫�" ? "" : this.activeTab;
- const attachmentObj = {
- fileName: file.name,
- path: response.fileUrl || file.url,
- fileUrl: response.fileUrl || file.url,
- fileType: category, // 鍏抽敭锛氳褰曞垎绫�
- fileSize: file.size,
- uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
- };
- if (!Array.isArray(this.attachments)) {
- this.attachments = [];
- }
- this.attachments.push(attachmentObj);
- this.attachmentFileList = fileList; // 淇濇寔鍚屾
- this.$message.success("鏂囦欢涓婁紶鎴愬姛");
- }
+ // 鏂囦欢閫夋嫨鍙樺寲
+ handleFileChange(file, fileList) {
+ this.tempFileList = fileList;
},
+
+ // 涓存椂绉婚櫎
+ handleTempRemove(file, fileList) {
+ this.tempFileList = fileList;
+ },
+
+ // 涓婁紶鎴愬姛澶勭悊
+ handleUploadSuccess(response, file, fileList) {
+ if (response.code !== 200) {
+ this.$message.error(response.msg || "涓婁紶澶辫触");
+ return;
+ }
+ // 鏈垎绫诲搴旂┖瀛楃涓诧紝涓庡睍绀�/淇濆瓨閫昏緫涓�鑷�
+ const category =
+ this.currentUploadCategory == "鏈垎绫�"
+ ? ""
+ : this.currentUploadCategory;
+ const attachmentObj = {
+ fileName: file.name,
+ path: response.fileUrl || response.url || response.data || file.url,
+ fileUrl: response.fileUrl || response.url || response.data || file.url,
+ fileType: category,
+ fileSize: file.size,
+ uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+ };
+ if (!Array.isArray(this.attachments)) {
+ this.attachments = [];
+ }
+ this.attachments.push(attachmentObj);
+ this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+ this.uploadLoading = false;
+ this.uploadDialogVisible = false;
+ this.tempFileList = [];
+ },
+
+ // 鎻愪氦涓婁紶
+ submitUpload() {
+ if (this.tempFileList.length == 0) {
+ this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
+ return;
+ }
+ this.uploadLoading = true;
+ this.$refs.uploadRef.submit();
+ },
+
// 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
getCategoryCount(category) {
return this.attachments.filter(item => {
const type = item.fileType || "";
- if (category === "鏈垎绫�") {
+ if (category == "鏈垎绫�") {
return !this.presetCategories.includes(type);
}
- return type === category;
+ return type == category;
}).length;
},
@@ -1457,27 +1506,18 @@
getCategoryFiles(category) {
return this.attachments.filter(item => {
const type = item.fileType || "";
- if (category === "鏈垎绫�") {
+ if (category == "鏈垎绫�") {
return !this.presetCategories.includes(type);
}
- return type === category;
+ return type == category;
});
},
// 鏇存柊闄勪欢鍒嗙被锛堜笅鎷変慨鏀规椂瑙﹀彂锛�
updateAttachmentCategory(row, newVal) {
- const target = this.attachments.find(item => item === row);
+ const target = this.attachments.find(item => item == row);
if (target) {
- target.fileType = newVal; // 鍙兘涓虹┖瀛楃涓�
- // 鍚屾鏇存柊 attachmentFileList
- const fileItem = this.attachmentFileList.find(
- f => f.raw === row || f.url === row.fileUrl
- );
- if (fileItem) {
- fileItem.raw.fileType = newVal;
- fileItem.fileType = newVal || "鏈垎绫�";
- }
- // 濡傛灉褰撳墠婵�娲荤殑tab娌℃湁鏂囦欢浜嗭紝鑷姩鍒囨崲鍒扮涓�涓湁鏂囦欢鐨則ab
+ target.fileType = newVal;
const currentTabHasFiles =
this.getCategoryFiles(this.activeTab).length > 0;
if (!currentTabHasFiles) {
@@ -1489,32 +1529,22 @@
// 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
handleRemoveAttachmentByFile(file) {
- const index = this.attachments.findIndex(item => item === file);
- if (index > -1) {
- this.attachments.splice(index, 1);
- // 鍚屾鍒犻櫎 attachmentFileList
- const fileIndex = this.attachmentFileList.findIndex(
- f => f.raw === file || f.url === file.fileUrl
- );
- if (fileIndex > -1) {
- this.attachmentFileList.splice(fileIndex, 1);
- }
- this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
- }
- },
- /** 涓婁紶閿欒澶勭悊 */
- handleUploadError({ file, fileList, error }) {
- console.error("闄勪欢涓婁紶澶辫触:", error);
- this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+ this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning"
+ })
+ .then(() => {
+ const index = this.attachments.findIndex(item => item == file);
+ if (index > -1) {
+ this.attachments.splice(index, 1);
+ this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+ }
+ })
+ .catch(() => {});
},
- /** 鎵嬪姩鍒犻櫎闄勪欢 */
- handleRemoveAttachment(index) {
- // 鐩存帴璋冪敤鏂扮殑鍒犻櫎鏂规硶
- this.handleRemoveAttachmentByFile(file.raw || file);
- },
-
- /** 鏂囦欢棰勮 */
+ // 鏂囦欢棰勮
handlePreview(file) {
this.currentPreviewFile = {
fileName: file.fileName,
@@ -1523,7 +1553,8 @@
};
this.filePreviewVisible = true;
},
- /** 鏂囦欢涓嬭浇 */
+
+ // 鏂囦欢涓嬭浇
handleDownloadAttachment(file) {
const fileUrl = file.path || file.fileUrl;
const fileName = file.fileName;
@@ -1610,7 +1641,7 @@
/** 鏍煎紡鍖栨枃浠跺ぇ灏� */
formatFileSize(bytes) {
- if (!bytes || bytes === 0) 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));
@@ -2033,4 +2064,73 @@
padding: 10px 15px;
}
}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+ padding: 16px;
+}
+
+.paper-form {
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
+
+.paper-form >>> .form-row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+ flex: 0 0 33.3333%;
+ display: flex;
+ margin: 0;
+ background: #fff;
+ border-right: 1px solid #d0d3db;
+ border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+ display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+ flex: 0 0 120px;
+ width: 120px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #ecf5ff;
+ border-right: 1px solid #d0d3db;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
+}
</style>
diff --git a/src/views/business/affirm/affirmInfo.vue b/src/views/business/affirm/affirmInfo.vue
index 55cbfcc..ea684f4 100644
--- a/src/views/business/affirm/affirmInfo.vue
+++ b/src/views/business/affirm/affirmInfo.vue
@@ -1,47 +1,28 @@
<template>
<div class="confirmation-detail">
- <case-basic-info :case-id="caseId" :show-attachment="true" />
+ <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
- <el-card class="detail-card">
+ <el-card class="detail-card paper-card">
<!-- 鍩虹淇℃伅 -->
<div slot="header" class="clearfix">
<span class="detail-title">鎹愮尞纭淇℃伅</span>
- <!-- <el-button
- type="primary"
- style="float: right;margin-left: 20px;"
- @click="handleSave"
- :loading="saveLoading"
- >
- 淇濆瓨纭淇℃伅
- </el-button>
- <el-button
- type="success"
- style="float: right;margin-left: 20px;"
- @click="accomplish"
- :loading="saveLoading"
- >
- 纭瀹屾垚
- </el-button> -->
+
</div>
- <el-form :model="form" ref="form" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="鍗忚皟鍛�1" prop="coordinatedusernameo">
- <el-input v-model="form.coordinatedusernameo" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍗忚皟鍛�2" prop="coordinatedusernamet">
- <el-input v-model="form.coordinatedusernamet" />
- </el-form-item>
- </el-col>
+ <el-form :model="form" ref="form" label-width="120px" class="paper-form">
+ <div class="form-row">
+ <el-form-item label="鍗忚皟鍛�1" prop="coordinatedusernameo" class="col-1-3">
+ <el-input v-model="form.coordinatedusernameo" />
+ </el-form-item>
+ <el-form-item label="鍗忚皟鍛�2" prop="coordinatedusernamet" class="col-1-3">
+ <el-input v-model="form.coordinatedusernamet" />
+ </el-form-item>
<!-- <el-col :span="8">
<el-form-item label="涓氬姟浜哄憳" prop="responsibleusername">
<el-input v-model="form.responsibleusername" />
</el-form-item>
</el-col> -->
- </el-row>
+ </div>
<!-- <el-row :gutter="20">
<el-col :span="8">
@@ -66,7 +47,7 @@
style="margin-bottom: 15px;"
>
</el-alert>
- <el-row style="margin-top: 15px;">
+ <div style="margin-top: 15px;">
<el-button
style="float: right; margin-bottom: 5px;"
type="primary"
@@ -76,7 +57,7 @@
>
娣诲姞鍏朵粬瀹跺睘
</el-button>
- </el-row>
+ </div>
<el-table :data="familyMemberList" size="small" border>
<el-table-column label="搴忓彿" width="60" align="center">
<template slot-scope="scope">
@@ -143,8 +124,8 @@
</el-table-column>
</el-table>
- <el-row>
- <el-form-item label-width="100px" label="鎹愮尞鍐冲畾">
+ <div class="form-row">
+ <el-form-item label-width="100px" label="鎹愮尞鍐冲畾" class="col-full">
<el-checkbox-group v-model="organdecision">
<el-checkbox
v-for="item in organselection"
@@ -160,16 +141,18 @@
style="margin-top: 10px; width: 300px;"
></el-input>
</el-form-item>
- </el-row>
+ </div>
- <el-form-item label="瀹跺睘鎰忚澶囨敞" prop="relativeRemark">
- <el-input
- type="textarea"
- :rows="3"
- v-model="form.relativeRemark"
- placeholder="璁板綍瀹跺睘鐨勬剰瑙佸拰娌熼�氭儏鍐�"
- />
- </el-form-item>
+ <div class="form-row">
+ <el-form-item label="瀹跺睘鎰忚澶囨敞" prop="relativeRemark" class="col-full">
+ <el-input
+ type="textarea"
+ :rows="3"
+ v-model="form.relativeRemark"
+ placeholder="璁板綍瀹跺睘鐨勬剰瑙佸拰娌熼�氭儏鍐�"
+ />
+ </el-form-item>
+ </div>
</el-form>
</el-card>
@@ -635,6 +618,9 @@
},
getAttachmentsByType(type) {
+ console.log(type);
+ console.log(this.attachmentData[type]);
+
return this.attachmentData[type] || [];
},
@@ -703,6 +689,8 @@
uploader: "褰撳墠鐢ㄦ埛"
};
this.attachmentData[this.currentUploadType].push(newAttachment);
+ console.log(this.attachmentData,'this.attachmentData');
+
this.updateAssessannexField();
this.$message.success("涓婁紶鎴愬姛");
this.uploadLoading = false;
@@ -1082,4 +1070,73 @@
font-size: 13px;
color: #606266;
}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+ padding: 16px;
+}
+
+.paper-form {
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
+
+.paper-form >>> .form-row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+ flex: 0 0 33.3333%;
+ display: flex;
+ margin: 0;
+ background: #fff;
+ border-right: 1px solid #d0d3db;
+ border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+ display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+ flex: 0 0 120px;
+ width: 120px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #ecf5ff;
+ border-right: 1px solid #d0d3db;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
+}
</style>
diff --git a/src/views/business/allocation/allocationInfo.vue b/src/views/business/allocation/allocationInfo.vue
index 1ab3aab..4be4f21 100644
--- a/src/views/business/allocation/allocationInfo.vue
+++ b/src/views/business/allocation/allocationInfo.vue
@@ -1,43 +1,36 @@
<template>
<div class="organ-allocation-detail">
- <case-basic-info :case-id="caseId" :show-attachment="true" />
+ <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
<!-- 鍩烘湰淇℃伅閮ㄥ垎 -->
- <el-card class="detail-card">
+ <el-card class="detail-card paper-card">
<div slot="header" class="clearfix">
<span class="detail-title">鍣ㄥ畼鍒嗛厤鍩烘湰淇℃伅</span>
</div>
- <el-form :model="form" ref="form" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍒嗛厤鐘舵��" prop="allocationStatus">
- <el-select v-model="form.allocationStatus" placeholder="璇烽�夋嫨鍒嗛厤鐘舵��">
- <el-option v-for="dict in dict.type.organ_allocation_status || []" :key="dict.value" :label="dict.label"
- :value="dict.value"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍒嗛厤鏃堕棿" prop="allocationTime">
- <el-date-picker v-model="form.allocationTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%" :disabled="form.allocationStatus == '1'" />
- </el-form-item>
- </el-col>
- </el-row>
+ <el-form :model="form" ref="form" :rules="rules" label-width="120px" class="paper-form">
+ <div class="form-row">
+ <el-form-item label="鍒嗛厤鐘舵��" prop="allocationStatus" class="col-half">
+ <el-select v-model="form.allocationStatus" placeholder="璇烽�夋嫨鍒嗛厤鐘舵��">
+ <el-option v-for="dict in dict.type.organ_allocation_status || []" :key="dict.value" :label="dict.label"
+ :value="dict.value"></el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鍒嗛厤鏃堕棿" prop="allocationTime" class="col-half">
+ <el-date-picker v-model="form.allocationTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%" :disabled="form.allocationStatus == '1'" />
+ </el-form-item>
+ </div>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璐熻矗浜�" prop="registrationName">
+ <div class="form-row">
+ <el-form-item label="璐熻矗浜�" prop="registrationName" class="col-half">
<el-input v-model="form.registrationName" />
- </el-form-item>
- </el-col>
-
- </el-row>
+ </el-form-item>
+ </div>
</el-form>
</el-card>
<!-- 鍣ㄥ畼鍒嗛厤璁板綍閮ㄥ垎 -->
- <el-card class="allocation-card">
+ <el-card class="allocation-card paper-card">
<div slot="header" class="clearfix">
<span class="detail-title">鍣ㄥ畼鍒嗛厤璁板綍</span>
<div style="float: right;">
@@ -45,10 +38,9 @@
</div>
</div>
- <el-form ref="allocationForm" :rules="allocationRules" :model="allocationData" label-position="right">
- <el-row>
- <el-col>
- <el-form-item label-width="100px" label="鍒嗛厤鍣ㄥ畼">
+ <el-form ref="allocationForm" :rules="allocationRules" :model="allocationData" label-position="right" class="paper-form">
+ <div class="form-row">
+ <el-form-item label-width="100px" label="鍒嗛厤鍣ㄥ畼" class="col-full">
<el-checkbox-group v-model="selectedOrgans" @change="handleOrganSelectionChange">
<el-checkbox v-for="dict in dict.type.sys_Organ || []" :key="dict.value" :label="dict.value"
:disabled="form.allocationStatus == '1'">
@@ -57,13 +49,11 @@
</el-checkbox-group>
<el-input v-if="showOtherInput" v-model="otherOrganInput" placeholder="璇疯緭鍏ュ叾浠栧櫒瀹樺悕绉�"
style="margin-top: 10px; width: 300px;" :disabled="form.allocationStatus == '1'" />
- </el-form-item>
- </el-col>
- </el-row>
+ </el-form-item>
+ </div>
- <el-row>
- <el-col>
- <el-form-item>
+ <div class="form-row">
+ <el-form-item class="col-full">
<el-table :data="displayOrgans" v-loading="loading" border style="width: 100%"
:row-class-name="getOrganRowClassName">
<el-table-column label="搴忓彿" type="index" width="60" align="center" fixed></el-table-column>
@@ -202,8 +192,7 @@
</el-table-column>
</el-table>
</el-form-item>
- </el-col>
- </el-row>
+ </div>
<!-- 鍒嗛厤缁熻淇℃伅 -->
<!-- <div
@@ -1887,4 +1876,73 @@
font-size: 11px;
}
}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+ padding: 16px;
+}
+
+.paper-form {
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
+
+.paper-form >>> .form-row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+ flex: 0 0 33.3333%;
+ display: flex;
+ margin: 0;
+ background: #fff;
+ border-right: 1px solid #d0d3db;
+ border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+ display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+ flex: 0 0 120px;
+ width: 120px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #ecf5ff;
+ border-right: 1px solid #d0d3db;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
+}
</style>
diff --git a/src/views/business/assess/assessInfo.vue b/src/views/business/assess/assessInfo.vue
index 5a06c99..ecad7c4 100644
--- a/src/views/business/assess/assessInfo.vue
+++ b/src/views/business/assess/assessInfo.vue
@@ -1,23 +1,25 @@
<template>
<div class="assessment-detail">
<!-- 鍩虹妗堜緥淇℃伅 -->
- <case-basic-info :case-id="caseId" :show-attachment="true" />
+ <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
- <el-card class="organ-assessment-card">
+ <el-card class="organ-assessment-card paper-card">
<div slot="header" class="clearfix">
<span>鍣ㄥ畼璇勪及琛�</span>
</div>
<!-- 鎹愮尞鍐冲畾琛ㄥ崟 -->
- <el-form>
- <el-form-item label-width="100px" label="鎹愮尞鍐冲畾">
- <el-checkbox-group v-model="organdecisionValues" @change="handleOrganDecisionChange" :disabled="!isEdit">
- <el-checkbox v-for="dict in dict.type.sys_Organ" :key="dict.value" :label="dict.value">{{ dict.label }}
- </el-checkbox>
- </el-checkbox-group>
- <el-input v-if="showOtherInput" v-model="organdecisionOther" placeholder="璇疯緭鍏ュ叾浠栨崘鐚喅瀹氱殑鍏蜂綋鍐呭"
- style="margin-top: 10px; width: 300px;" :readonly="!isEdit" @input="handleOtherDecisionInput"></el-input>
- </el-form-item>
+ <el-form class="paper-form">
+ <div class="form-row">
+ <el-form-item label-width="100px" label="鎹愮尞鍐冲畾" class="col-full">
+ <el-checkbox-group v-model="organdecisionValues" @change="handleOrganDecisionChange" :disabled="!isEdit">
+ <el-checkbox v-for="dict in dict.type.sys_Organ" :key="dict.value" :label="dict.value">{{ dict.label }}
+ </el-checkbox>
+ </el-checkbox-group>
+ <el-input v-if="showOtherInput" v-model="organdecisionOther" placeholder="璇疯緭鍏ュ叾浠栨崘鐚喅瀹氱殑鍏蜂綋鍐呭"
+ style="margin-top: 10px; width: 300px;" :readonly="!isEdit" @input="handleOtherDecisionInput"></el-input>
+ </el-form-item>
+ </div>
</el-form>
<!-- 鍣ㄥ畼璇勪及琛ㄦ牸 -->
@@ -1547,4 +1549,73 @@
margin-bottom: 10px;
}
}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+ padding: 16px;
+}
+
+.paper-form {
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
+
+.paper-form >>> .form-row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+ flex: 0 0 33.3333%;
+ display: flex;
+ margin: 0;
+ background: #fff;
+ border-right: 1px solid #d0d3db;
+ border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+ display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+ flex: 0 0 120px;
+ width: 120px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #ecf5ff;
+ border-right: 1px solid #d0d3db;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
+}
</style>
diff --git a/src/views/business/course/ccss.vue b/src/views/business/course/ccss.vue
new file mode 100644
index 0000000..36f1e5a
--- /dev/null
+++ b/src/views/business/course/ccss.vue
@@ -0,0 +1,577 @@
+<!--
+ 浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃锛堢焊璐ㄨ〃鏍奸锛�
+ 姣忎竴椤癸細鏍囬鏍�(鐏板簳) + 鍐呭鏍�(鐧藉簳)锛岃鍒楃敤杈规鎷兼垚瀹屾暣缃戞牸锛屽儚绾歌川鐧昏琛ㄣ��
+ 甯冨眬妯″紡锛�
+ col-1-3 涓夊垎涔嬩竴鍒楋紙3鍒楀苟鍒楋級
+ col-half 浜屽垎涔嬩竴鍒楋紙2鍒楋級
+ col-2-3 涓夊垎涔嬩簩鍒楋紙闈炲绉�2鍒楋級
+ col-full 婊¤锛堝閫�/鍗曢��/涓婁紶锛�
+-->
+<template>
+ <div class="donor-register">
+ <!-- 鏍囬鍖� -->
+ <div class="register-header">
+ <h2 class="register-title">浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃</h2>
+ <p class="register-tip">锛� <span class="required-star">*</span> 锛変负蹇呴』濉啓鐨勯」</p>
+ </div>
+
+ <el-card class="register-card" shadow="never">
+ <el-form
+ ref="registerForm"
+ :model="form"
+ :rules="rules"
+ label-width="120px"
+ class="register-form"
+ >
+ <!-- 绗�1琛岋細鐪佷唤 / 鎵�鍦ㄥ尰鐤楁満鏋� / 绉戝 -->
+ <div class="form-row">
+ <el-form-item label="鐪佷唤" prop="province" class="col-1-3">
+ <el-input v-model="form.province" placeholder="璇疯緭鍏ョ渷浠�" />
+ </el-form-item>
+ <el-form-item label="鎵�鍦ㄥ尰鐤楁満鏋�" prop="treatmentHospitalName" class="col-1-3">
+ <el-input v-model="form.treatmentHospitalName" placeholder="璇疯緭鍏ユ墍鍦ㄥ尰鐤楁満鏋�" />
+ </el-form-item>
+ <el-form-item label="绉戝" class="col-1-3">
+ <el-input v-model="form.department" placeholder="璇疯緭鍏ョ瀹�" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�2琛岋細鎹愮尞缂栧彿 / 棣栬瘖鍖荤枟鏈烘瀯 / 绉戝 -->
+ <div class="form-row">
+ <el-form-item label="鎹愮尞缂栧彿" class="col-1-3">
+ <el-input v-model="form.donationNo" placeholder="鐢辩渷鎹愮尞鍘熷琛ㄤ俊鎭敓鎴�" disabled />
+ </el-form-item>
+ <el-form-item label="棣栬瘖鍖荤枟鏈烘瀯" prop="firstTreatmentHospitalName" class="col-1-3">
+ <el-input v-model="form.firstTreatmentHospitalName" placeholder="璇疯緭鍏ラ璇婂尰鐤楁満鏋�" />
+ </el-form-item>
+ <el-form-item label="绉戝" class="col-1-3">
+ <el-input v-model="form.firstDepartment" placeholder="璇疯緭鍏ョ瀹�" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�3琛岋細濮撳悕 / 鎬у埆 / 璇佷欢鍙风爜 -->
+ <div class="form-row">
+ <el-form-item label="濮撳悕" prop="name" class="col-1-3">
+ <el-input v-model="form.name" placeholder="璇疯緭鍏ュ鍚�" />
+ </el-form-item>
+ <el-form-item label="鎬у埆" prop="sex" class="col-1-3">
+ <el-radio-group v-model="form.sex">
+ <el-radio label="1">鐢�</el-radio>
+ <el-radio label="2">濂�</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ <el-form-item label="璇佷欢鍙风爜" prop="idCardNo" class="col-1-3">
+ <el-input v-model="form.idCardNo" placeholder="璇疯緭鍏ヨ瘉浠跺彿鐮�" maxlength="18" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�4琛岋細鍥界睄 / 璇佷欢绫诲瀷 / 鍑虹敓鏃ユ湡 -->
+ <div class="form-row">
+ <el-form-item label="鍥界睄" prop="nationality" class="col-1-3">
+ <el-select v-model="form.nationality" placeholder="璇烽�夋嫨鍥界睄" style="width: 100%">
+ <el-option v-for="dict in nationalityOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="璇佷欢绫诲瀷" prop="idCardType" class="col-1-3">
+ <el-select v-model="form.idCardType" placeholder="璇烽�夋嫨璇佷欢绫诲瀷" style="width: 100%">
+ <el-option v-for="dict in idCardTypeOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鍑虹敓鏃ユ湡" prop="birthDate" class="col-1-3">
+ <el-date-picker v-model="form.birthDate" type="date" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨鍑虹敓鏃ユ湡" style="width: 100%" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�5琛岋細浣忓潃锛堢渷甯傚尯鑱斿姩 + 璇︾粏鍦板潃锛屾弧琛岋級 -->
+ <div class="form-row">
+ <el-form-item label="浣忓潃" prop="addressArr" class="col-full">
+ <el-cascader v-model="form.addressArr" :options="regionData" :props="{ expandTrigger: 'hover' }" placeholder="璇烽�夋嫨鐪�/甯�/鍖�" style="width: 280px" />
+ <el-input v-model="form.addressDetail" placeholder="xx璺痻x鍙穢x瀹わ紙鍚岃瘉浠舵墍鍐欏湴鍧�涓�鑷达級" style="flex: 1; margin-left: 10px" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�6琛岋細鐜板眳浣忓湴锛堟弧琛岋級 -->
+ <div class="form-row">
+ <el-form-item label="鐜板眳浣忓湴" prop="currentAddressArr" class="col-full">
+ <el-cascader v-model="form.currentAddressArr" :options="regionData" :props="{ expandTrigger: 'hover' }" placeholder="璇烽�夋嫨鐪�/甯�/鍖�" style="width: 280px" />
+ <el-input v-model="form.currentAddressDetail" placeholder="xx璺痻x鍙穢x瀹�" style="flex: 1; margin-left: 10px" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�7琛岋細琛�鍨�+RH / 浣忛櫌鍙� / 鐤剧梾璇婃柇 -->
+ <div class="form-row">
+ <el-form-item label="琛�鍨�" prop="bloodType" class="col-1-3">
+ <el-select v-model="form.bloodType" placeholder="璇烽�夋嫨" style="flex: 1">
+ <el-option label="A" value="A" />
+ <el-option label="B" value="B" />
+ <el-option label="AB" value="AB" />
+ <el-option label="O" value="O" />
+ </el-select>
+ <el-select v-model="form.rhType" placeholder="璇烽�夋嫨" style="flex: 1; margin-left: 8px">
+ <el-option label="RH闃虫��" value="1" />
+ <el-option label="RH闃存��" value="2" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="浣忛櫌鍙�" prop="hospitalNo" class="col-1-3">
+ <el-input v-model="form.hospitalNo" placeholder="璇疯緭鍏ヤ綇闄㈠彿" />
+ </el-form-item>
+ <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisName" class="col-1-3">
+ <el-input v-model="form.diagnosisName" placeholder="璇疯緭鍏ョ柧鐥呰瘖鏂�" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�8琛岋細鐤剧梾绫诲瀷锛堟弧琛屽閫夛級 -->
+ <div class="form-row">
+ <el-form-item label="鐤剧梾绫诲瀷" prop="diseaseType" class="col-full">
+ <el-checkbox-group v-model="form.diseaseType">
+ <el-checkbox v-for="item in diseaseTypeOptions" :key="item" :label="item">{{ item }}</el-checkbox>
+ </el-checkbox-group>
+ <el-input v-if="form.diseaseType.includes('鍏朵粬')" v-model="form.diseaseTypeOther" placeholder="璇疯緭鍏ュ叾浠栫柧鐥呯被鍨�" style="width: 300px; margin-left: 10px" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�9琛岋細浼犳煋鐥呮儏鎯呭喌锛堟弧琛屽閫夛級 -->
+ <div class="form-row">
+ <el-form-item label="浼犳煋鐥呮儏鎯呭喌" prop="infectiousDisease" class="col-full">
+ <el-checkbox-group v-model="form.infectiousDisease">
+ <el-checkbox v-for="item in infectiousOptions" :key="item" :label="item">{{ item }}</el-checkbox>
+ </el-checkbox-group>
+ <el-input v-if="form.infectiousDisease.includes('鍏朵粬')" v-model="form.infectiousDiseaseOther" placeholder="濡傛湁璇峰嬀閫夋垨濉啓鐩稿簲椤�" style="width: 300px; margin-left: 10px" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�10琛岋細鐥呬汉鐘跺喌锛堟弧琛屽閫夛級 -->
+ <div class="form-row">
+ <el-form-item label="鐥呬汉鐘跺喌" prop="patientStatus" class="col-full">
+ <el-checkbox-group v-model="form.patientStatus">
+ <el-checkbox label="娣卞害鏄忚糠">娣卞害鏄忚糠</el-checkbox>
+ <el-checkbox label="鏃犺嚜涓诲懠鍚�">鏃犺嚜涓诲懠鍚�</el-checkbox>
+ </el-checkbox-group>
+ </el-form-item>
+ </div>
+
+ <!-- 绗�11琛岋細鍏朵粬鎯呭喌锛堟弧琛屽閫夛級 -->
+ <div class="form-row">
+ <el-form-item label="鍏朵粬鎯呭喌" prop="otherSituation" class="col-full">
+ <el-checkbox-group v-model="form.otherSituation">
+ <el-checkbox v-for="item in otherSituationOptions" :key="item" :label="item">{{ item }}</el-checkbox>
+ </el-checkbox-group>
+ </el-form-item>
+ </div>
+
+ <!-- 绗�12琛岋細鏈汉鎹愮尞鎰忔効(2/3) + 鐧昏缂栧彿(1/3) -->
+ <div class="form-row">
+ <el-form-item label="鏈汉鎹愮尞鎰忔効" prop="donationWill" class="col-2-3">
+ <el-radio-group v-model="form.donationWill">
+ <el-radio label="1">蹇楁効鐧昏鍚屾剰</el-radio>
+ <el-radio label="2">涔﹂潰鍚屾剰锛堥仐灞烇級</el-radio>
+ <el-radio label="3">鏈〃绀轰笉鍚屾剰</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ <el-form-item label="鐧昏缂栧彿" class="col-1-3">
+ <el-link type="primary" :underline="false" @click="handleGetRegisterNo">
+ {{ form.registerNo || '蹇楁効鐧昏鍚屾剰鑾峰彇蹇楁効鐧昏淇℃伅' }}
+ </el-link>
+ </el-form-item>
+ </div>
+
+ <!-- 绗�13琛岋細浜插睘鍏崇郴鐘跺喌锛堟弧琛屽閫夛級 -->
+ <div class="form-row">
+ <el-form-item label="浜插睘鍏崇郴鐘跺喌" prop="relativeRelation" class="col-full">
+ <el-checkbox-group v-model="form.relativeRelation">
+ <el-checkbox v-for="item in relativeRelationOptions" :key="item" :label="item">{{ item }}</el-checkbox>
+ </el-checkbox-group>
+ <el-input v-if="form.relativeRelation.includes('鍏朵粬')" v-model="form.relativeRelationOther" placeholder="璇疯緭鍏ュ叾浠栦翰灞炲叧绯�" style="width: 300px; margin-left: 10px" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�14琛岋細涓昏浜插睘锛堢瀛楋級(1/2) + 涓庢綔鍦ㄦ崘鐚�呭叧绯�(1/2) -->
+ <div class="form-row">
+ <el-form-item label="涓昏浜插睘锛堢瀛楋級" prop="mainRelativeName" class="col-half">
+ <el-input v-model="form.mainRelativeName" placeholder="璇疯緭鍏ヤ富瑕佷翰灞炲鍚�" />
+ </el-form-item>
+ <el-form-item label="涓庢綔鍦ㄦ崘鐚�呭叧绯�" prop="mainRelativeRelation" class="col-half">
+ <el-select v-model="form.mainRelativeRelation" placeholder="璇烽�夋嫨鍏崇郴" style="width: 100%">
+ <el-option label="閰嶅伓" value="閰嶅伓" />
+ <el-option label="瀛愬コ" value="瀛愬コ" />
+ <el-option label="鐖朵翰" value="鐖朵翰" />
+ <el-option label="姣嶄翰" value="姣嶄翰" />
+ <el-option label="鍏朵粬" value="鍏朵粬" />
+ </el-select>
+ </el-form-item>
+ </div>
+
+ <!-- 绗�15琛岋細淇℃伅鏉ユ簮锛堟弧琛屽崟閫夛級 -->
+ <div class="form-row">
+ <el-form-item label="淇℃伅鏉ユ簮" prop="infoSource" class="col-full">
+ <el-radio-group v-model="form.infoSource">
+ <el-radio v-for="item in infoSourceOptions" :key="item" :label="item">{{ item }}</el-radio>
+ </el-radio-group>
+ <el-input v-if="form.infoSource === '鍏朵粬淇℃伅鏉ユ簮'" v-model="form.infoSourceOther" placeholder="璇疯緭鍏ュ叾浠栦俊鎭潵婧�" style="width: 300px; margin-left: 10px" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�16琛岋細浜轰綋鍣ㄥ畼鑾峰彇缁勭粐锛堟弧琛岋紝鍙垹闄ゆ爣绛撅級 -->
+ <div class="form-row">
+ <el-form-item label="浜轰綋鍣ㄥ畼鑾峰彇缁勭粐" prop="opoOrg" class="col-full">
+ <el-tag v-if="form.opoOrg" closable type="info" @close="form.opoOrg = ''">{{ form.opoOrg }}</el-tag>
+ <el-button v-else type="text" icon="el-icon-plus" @click="form.opoOrg = '闈掑矝澶у闄勫睘鍖婚櫌'">閫夋嫨鑾峰彇缁勭粐</el-button>
+ </el-form-item>
+ </div>
+
+ <!-- 绗�17琛岋細鐧昏琛紙婊¤涓婁紶锛� -->
+ <div class="form-row">
+ <el-form-item label="鐧昏琛�" prop="registerFormFile" class="col-full">
+ <el-upload action="#" :auto-upload="false" :file-list="form.registerFormFile" list-type="picture-card" :on-change="(f, fl) => handleUploadChange('registerFormFile', f, fl)" :on-remove="(f, fl) => handleUploadRemove('registerFormFile', f, fl)" accept=".jpg,.jpeg,.png,.pdf">
+ <el-button size="small" type="success" icon="el-icon-upload2">涓婁紶鍥剧墖</el-button>
+ </el-upload>
+ <span class="upload-tip">璇蜂笂浼犮�婁汉浣撳櫒瀹樻綔鍦ㄦ崘鐚�呯櫥璁拌〃銆嬶紙鍘熷绛惧瓧琛級锛屽繀濉��</span>
+ </el-form-item>
+ </div>
+
+ <!-- 绗�18琛岋細璇佷欢鐓э紙婊¤涓婁紶锛� -->
+ <div class="form-row">
+ <el-form-item label="璇佷欢鐓�" prop="idPhotoFile" class="col-full">
+ <el-upload action="#" :auto-upload="false" :file-list="form.idPhotoFile" list-type="picture-card" :on-change="(f, fl) => handleUploadChange('idPhotoFile', f, fl)" :on-remove="(f, fl) => handleUploadRemove('idPhotoFile', f, fl)" accept=".jpg,.jpeg,.png,.pdf">
+ <el-button size="small" type="success" icon="el-icon-upload2">涓婁紶鍥剧墖</el-button>
+ </el-upload>
+ <span class="upload-tip">璇蜂笂浼犳綔鍦ㄦ崘鐚�呮硶瀹氳韩浠借瘉浠剁収鐗囨垨澶嶅嵃浠讹紝蹇呭~銆�</span>
+ </el-form-item>
+ </div>
+
+ <!-- 绗�19琛岋細鐤剧梾璇婃柇璧勬枡锛堟弧琛屼笂浼狅級 -->
+ <div class="form-row">
+ <el-form-item label="鐤剧梾璇婃柇璧勬枡" prop="diagnosisFile" class="col-full">
+ <el-upload action="#" :auto-upload="false" :file-list="form.diagnosisFile" list-type="picture-card" :on-change="(f, fl) => handleUploadChange('diagnosisFile', f, fl)" :on-remove="(f, fl) => handleUploadRemove('diagnosisFile', f, fl)" accept=".jpg,.jpeg,.png,.pdf">
+ <el-button size="small" type="success" icon="el-icon-upload2">涓婁紶鍥剧墖</el-button>
+ </el-upload>
+ <span class="upload-tip">璇蜂笂浼犳綔鍦ㄦ崘鐚�呯柧鐥呰瘖鏂祫鏂欙紙澶嶅嵃浠讹級绛夈��</span>
+ </el-form-item>
+ </div>
+
+ <!-- 绗�20琛岋細鎶ュ憡浜� / 鑱旂郴鐢佃瘽 / 鎶ュ憡鏃ユ湡 -->
+ <div class="form-row">
+ <el-form-item label="鎶ュ憡浜�" prop="reporter" class="col-1-3">
+ <el-input v-model="form.reporter" placeholder="璇疯緭鍏ユ姤鍛婁汉" />
+ </el-form-item>
+ <el-form-item label="鑱旂郴鐢佃瘽" prop="reportPhone" class="col-1-3">
+ <el-input v-model="form.reportPhone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" maxlength="11" />
+ </el-form-item>
+ <el-form-item label="鎶ュ憡鏃ユ湡" prop="reportDate" class="col-1-3">
+ <el-date-picker v-model="form.reportDate" type="date" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨鎶ュ憡鏃ユ湡" style="width: 100%" />
+ </el-form-item>
+ </div>
+
+ <!-- 绗�21琛岋細涓鍘熷洜锛堟弧琛屽閫夛級 -->
+ <div class="form-row">
+ <el-form-item label="涓鍘熷洜" prop="stopReason" class="col-full">
+ <el-checkbox-group v-model="form.stopReason">
+ <el-checkbox v-for="item in stopReasonOptions" :key="item" :label="item">{{ item }}</el-checkbox>
+ </el-checkbox-group>
+ <el-input v-if="form.stopReason.includes('鍏朵粬涓鍘熷洜')" v-model="form.stopReasonOther" placeholder="璇疯緭鍏ュ叾浠栦腑姝㈠師鍥�" style="width: 300px; margin-left: 10px" />
+ </el-form-item>
+ </div>
+ </el-form>
+ </el-card>
+
+ <!-- 搴曢儴鎿嶄綔鎸夐挳 -->
+ <div class="register-footer">
+ <el-button type="primary" :loading="saveLoading" @click="handleSave">淇濆瓨</el-button>
+ <el-button type="success" :loading="submitLoading" @click="handleSubmit">鎻愪氦淇℃伅</el-button>
+ </div>
+ </div>
+</template>
+
+<script>
+import { regionData } from "element-china-area-data";
+
+export default {
+ name: "PotentialDonorRegister",
+ data() {
+ return {
+ // 鐪佸競鍖鸿仈鍔ㄦ暟鎹簮
+ regionData,
+ saveLoading: false,
+ submitLoading: false,
+
+ // 涓嬫媺/澶氶�� 閫夐」
+ nationalityOptions: [
+ { value: "1", label: "涓浗澶ч檰" },
+ { value: "2", label: "涓浗棣欐腐" },
+ { value: "3", label: "涓浗婢抽棬" },
+ { value: "4", label: "涓浗鍙版咕" },
+ { value: "5", label: "鍏朵粬" }
+ ],
+ idCardTypeOptions: [
+ { value: "1", label: "灞呮皯韬唤璇�" },
+ { value: "2", label: "鎶ょ収" },
+ { value: "3", label: "鍐涘畼璇�" },
+ { value: "4", label: "鍏朵粬" }
+ ],
+ diseaseTypeOptions: ["鑴戣绠″", "鑴戝浼�", "缂鸿缂烘哀鎬ц剳鐥�", "鑴戣偪鐦�", "蹇冭绠$柧鐥�", "鍏朵粬"],
+ infectiousOptions: ["涔欒倽", "涓欒倽", "姊呮瘨", "鑹炬粙鐥�", "鍏朵粬"],
+ otherSituationOptions: ["浜ら�氫簨鏁�", "鍒戜簨妗堜欢", "宸ヤ激浜嬫晠", "鍏朵粬鎰忓浜嬫晠"],
+ relativeRelationOptions: ["閰嶅伓", "瀛愬コ", "鐖朵翰", "姣嶄翰", "鍏朵粬"],
+ infoSourceOptions: ["绾㈠崄瀛椾細", "鍖荤枟鏈烘瀯", "浜插睘", "浜ら��", "鍏畨", "鍏朵粬淇℃伅鏉ユ簮"],
+ stopReasonOptions: ["浜插睘鍙嶅", "缁忔不鐤楃梾鎯呭ソ杞�", "閿欒繃鎹愮尞鏃舵満", "鍏朵粬涓鍘熷洜"],
+
+ form: {
+ // 绗�1琛�
+ province: "灞变笢鐪�",
+ treatmentHospitalName: "闈掑矝澶у闄勫睘鍖婚櫌",
+ department: "鎬ヨ瘖绉�",
+ // 绗�2琛�
+ donationNo: "SD-2026-00258",
+ firstTreatmentHospitalName: "闈掑矝甯傚競绔嬪尰闄�",
+ firstDepartment: "绁炵粡澶栫",
+ // 绗�3琛�
+ name: "寮犱笁",
+ sex: "1",
+ idCardNo: "370202198805151234",
+ // 绗�4琛�
+ nationality: "1",
+ idCardType: "1",
+ birthDate: "1988-05-15",
+ // 绗�5琛� 浣忓潃锛堝北涓滅渷闈掑矝甯傚競鍖楀尯锛�
+ addressArr: ["370000", "370200", "370203"],
+ addressDetail: "浜烘皯璺�123鍙�5鍙锋ゼ201瀹�",
+ // 绗�6琛� 鐜板眳浣忓湴锛堝悓涓婏級
+ currentAddressArr: ["370000", "370200", "370203"],
+ currentAddressDetail: "鍙颁笢璺�88鍙�3鍗曞厓602瀹�",
+ // 绗�7琛�
+ bloodType: "A",
+ rhType: "1",
+ hospitalNo: "20260815-032",
+ diagnosisName: "鑴戝嚭琛�",
+ // 绗�8琛�
+ diseaseType: ["鑴戣绠″"],
+ diseaseTypeOther: "",
+ // 绗�9琛�
+ infectiousDisease: ["涔欒倽"],
+ infectiousDiseaseOther: "",
+ // 绗�10琛�
+ patientStatus: ["娣卞害鏄忚糠"],
+ // 绗�11琛�
+ otherSituation: ["浜ら�氫簨鏁�"],
+ // 绗�12琛�
+ donationWill: "1",
+ registerNo: "ZYDJ-2026-00258",
+ // 绗�13琛�
+ relativeRelation: ["閰嶅伓"],
+ relativeRelationOther: "",
+ // 绗�14琛�
+ mainRelativeName: "鏉庡洓",
+ mainRelativeRelation: "閰嶅伓",
+ // 绗�15琛�
+ infoSource: "鍖荤枟鏈烘瀯",
+ infoSourceOther: "",
+ // 绗�16琛�
+ opoOrg: "闈掑矝澶у闄勫睘鍖婚櫌",
+ // 绗�17~19琛� 鏂囦欢锛堝亣鏁版嵁锛屼粎鐢ㄤ簬灞曠ず宸蹭笂浼犵缉鐣ュ浘锛�
+ registerFormFile: [{ name: "鐧昏琛�.jpg", url: "https://picsum.photos/200/200?random=8" }],
+ idPhotoFile: [{ name: "韬唤璇�.jpg", url: "https://picsum.photos/200/200?random=9" }],
+ diagnosisFile: [{ name: "璇婃柇璇佹槑.jpg", url: "https://picsum.photos/200/200?random=10" }],
+ // 绗�20琛�
+ reporter: "鐜嬪崗璋冨憳",
+ reportPhone: "18661808259",
+ reportDate: "2026-08-20",
+ // 绗�21琛�
+ stopReason: [],
+ stopReasonOther: ""
+ },
+ rules: {
+ province: [{ required: true, message: "璇疯緭鍏ョ渷浠�", trigger: "blur" }],
+ treatmentHospitalName: [{ required: true, message: "璇疯緭鍏ユ墍鍦ㄥ尰鐤楁満鏋�", trigger: "blur" }],
+ firstTreatmentHospitalName: [{ required: true, message: "璇疯緭鍏ラ璇婂尰鐤楁満鏋�", trigger: "blur" }],
+ name: [{ required: true, message: "璇疯緭鍏ュ鍚�", trigger: "blur" }],
+ sex: [{ required: true, message: "璇烽�夋嫨鎬у埆", trigger: "change" }],
+ idCardNo: [{ required: true, message: "璇疯緭鍏ヨ瘉浠跺彿鐮�", trigger: "blur" }],
+ nationality: [{ required: true, message: "璇烽�夋嫨鍥界睄", trigger: "change" }],
+ idCardType: [{ required: true, message: "璇烽�夋嫨璇佷欢绫诲瀷", trigger: "change" }],
+ birthDate: [{ required: true, message: "璇烽�夋嫨鍑虹敓鏃ユ湡", trigger: "change" }],
+ addressArr: [{ required: true, message: "璇烽�夋嫨浣忓潃鐪�/甯�/鍖�", trigger: "change" }],
+ currentAddressArr: [{ required: true, message: "璇烽�夋嫨鐜板眳浣忓湴鐪�/甯�/鍖�", trigger: "change" }],
+ bloodType: [{ required: true, message: "璇烽�夋嫨琛�鍨�", trigger: "change" }],
+ hospitalNo: [{ required: true, message: "璇疯緭鍏ヤ綇闄㈠彿", trigger: "blur" }],
+ diagnosisName: [{ required: true, message: "璇疯緭鍏ョ柧鐥呰瘖鏂�", trigger: "blur" }],
+ donationWill: [{ required: true, message: "璇烽�夋嫨鏈汉鎹愮尞鎰忔効", trigger: "change" }],
+ relativeRelation: [{ required: true, message: "璇烽�夋嫨浜插睘鍏崇郴鐘跺喌", trigger: "change" }],
+ mainRelativeName: [{ required: true, message: "璇疯緭鍏ヤ富瑕佷翰灞炲鍚�", trigger: "blur" }],
+ mainRelativeRelation: [{ required: true, message: "璇烽�夋嫨涓庢綔鍦ㄦ崘鐚�呭叧绯�", trigger: "change" }],
+ infoSource: [{ required: true, message: "璇烽�夋嫨淇℃伅鏉ユ簮", trigger: "change" }],
+ registerFormFile: [{ required: true, message: "璇蜂笂浼犵櫥璁拌〃", trigger: "change" }],
+ idPhotoFile: [{ required: true, message: "璇蜂笂浼犺瘉浠剁収", trigger: "change" }],
+ diagnosisFile: [{ required: true, message: "璇蜂笂浼犵柧鐥呰瘖鏂祫鏂�", trigger: "change" }],
+ reporter: [{ required: true, message: "璇疯緭鍏ユ姤鍛婁汉", trigger: "blur" }],
+ reportPhone: [
+ { required: true, message: "璇疯緭鍏ヨ仈绯荤數璇�", trigger: "blur" },
+ { pattern: /^1[3-9]\d{9}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙�", trigger: "blur" }
+ ],
+ reportDate: [{ required: true, message: "璇烽�夋嫨鎶ュ憡鏃ユ湡", trigger: "change" }]
+ }
+ };
+ },
+ methods: {
+ // 鏂囦欢涓婁紶鍙樺寲
+ handleUploadChange(field, file, fileList) {
+ this.form[field] = fileList;
+ this.$refs.registerForm.validateField(field);
+ },
+ handleUploadRemove(field, file, fileList) {
+ this.form[field] = fileList;
+ this.$refs.registerForm.validateField(field);
+ },
+
+ // 蹇楁効鐧昏缂栧彿锛堝崰浣嶏級
+ handleGetRegisterNo() {
+ this.form.registerNo = "ZYDJ-" + Date.now();
+ this.$message.success("宸茶幏鍙栧織鎰跨櫥璁扮紪鍙�");
+ },
+
+ // 淇濆瓨锛堢函鍓嶇鍋囨暟鎹紝涓嶈皟鍚庣锛�
+ handleSave() {
+ this.saveLoading = true;
+ setTimeout(() => {
+ this.saveLoading = false;
+ this.$message.success("淇濆瓨鎴愬姛锛堝亣鏁版嵁锛屾湭鎻愪氦鍚庣锛�");
+ }, 500);
+ },
+
+ // 鎻愪氦锛堢函鍓嶇鍋囨暟鎹紝涓嶈皟鍚庣锛�
+ handleSubmit() {
+ this.submitLoading = true;
+ setTimeout(() => {
+ this.submitLoading = false;
+ this.$message.success("鎻愪氦鎴愬姛锛堝亣鏁版嵁锛屾湭鎻愪氦鍚庣锛�");
+ }, 500);
+ }
+ }
+};
+</script>
+
+<style scoped>
+.donor-register {
+ padding: 20px;
+}
+
+/* 鏍囬鍖� */
+.register-header {
+ text-align: center;
+ margin-bottom: 20px;
+}
+.register-title {
+ font-size: 20px;
+ font-weight: bold;
+ color: #303133;
+ margin: 0 0 8px 0;
+}
+.register-tip {
+ font-size: 13px;
+ color: #909399;
+ margin: 0;
+}
+.required-star {
+ color: #f56c6c;
+}
+
+.register-card {
+ margin-bottom: 20px;
+}
+.register-card >>> .el-card__body {
+ padding: 16px;
+}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍稿績鏍峰紡 ===== */
+/* 瀹瑰櫒鍙敾銆屼笂銆佸乏銆嶄袱鏉″杈规锛岄厤鍚堟瘡涓崟鍏冩牸鐨勩�屽彸銆佷笅銆嶈竟妗嗘嫾鎴愬畬鏁寸綉鏍� */
+.register-form {
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
+
+/* 姣忎竴琛屼负 flex 琛岋紝鑷甫涓婅竟妗嗕繚璇佺綉鏍艰繛缁�� */
+.register-form >>> .form-row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #d0d3db;
+}
+
+/* 鍗曞厓鏍硷細榛樿涓夊垎涔嬩竴鍒楋紝鐢诲彸銆佷笅涓ゆ潯杈� */
+.register-form >>> .el-form-item {
+ flex: 0 0 33.3333%;
+ display: flex;
+ margin: 0;
+ background: #fff;
+ border-right: 1px solid #d0d3db;
+ border-bottom: 1px solid #d0d3db;
+}
+.register-form >>> .el-form-item::after,
+.register-form >>> .el-form-item::before {
+ display: none;
+}
+
+/* 鍒楀鎺у埗 */
+.register-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.register-form >>> .col-half { flex: 0 0 50%; }
+.register-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.register-form >>> .col-full { flex: 0 0 100%; }
+
+/* 鏍囬鏍硷細鐏板簳銆佸眳涓�佸姞绮楋紝鍙宠竟涓�鏉″垎闅旂嚎 */
+.register-form >>> .el-form-item__label {
+ flex: 0 0 120px;
+ width: 120px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #ecf5ff;
+ border-right: 1px solid #d0d3db;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-all;
+}
+/* 蹇呭~椤规槦鍙风孩鑹� */
+.register-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
+}
+
+/* 鍐呭鏍硷細鐧藉簳銆佸瀭鐩村眳涓�佽嚜閫傚簲鍐呭 */
+.register-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
+}
+
+/* 鏍¢獙鍑洪敊鏃舵爣棰樻牸涓嶅彉绾紝浠呭唴瀹瑰尯鏂囧瓧鎻愮ず鍗冲彲 */
+.register-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label {
+ background: #ecf5ff;
+}
+
+/* 涓婁紶鎻愮ず鏂囧瓧 */
+.upload-tip {
+ font-size: 12px;
+ color: #909399;
+ margin-left: 12px;
+}
+
+/* 搴曢儴鎸夐挳 */
+.register-footer {
+ text-align: center;
+ margin: 20px 0;
+}
+.register-footer .el-button {
+ min-width: 120px;
+ margin: 0 10px;
+}
+</style>
diff --git a/src/views/business/course/components/DeathJudgmentStage.vue b/src/views/business/course/components/DeathJudgmentStage.vue
index b71bcf0..e4a5555 100644
--- a/src/views/business/course/components/DeathJudgmentStage.vue
+++ b/src/views/business/course/components/DeathJudgmentStage.vue
@@ -1,6 +1,6 @@
<template>
<div class="death-judgment-detail">
- <!-- <case-basic-info :case-id="caseId" :show-attachment="true" /> -->
+ <!-- <case-basic-info :case-id="caseId" :show-attachment="true":column="3" /> -->
<!-- 鍏叡淇℃伅妯″潡锛堢嫭绔嬫樉绀猴級 -->
<!-- 鍒ゅ畾绫诲瀷鏍囩椤� -->
@@ -56,65 +56,15 @@
<span class="detail-title">鑴戞浜″垽瀹氫俊鎭�</span>
</div>
- <el-form :model="form" ref="brainForm" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="姝讳骸鍘熷洜" prop="deathreason">
- <el-input v-model="form.deathreason" :readonly="!isEdit" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="姝讳骸鏃堕棿" prop="deathtime">
- <el-date-picker
- v-model="form.deathtime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- :disabled="!isEdit"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="deathjudgedocto">
- <el-input v-model="form.deathjudgedocto" :readonly="!isEdit" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="deathjudgedoctt">
- <el-input v-model="form.deathjudgedoctt" :readonly="!isEdit" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓">
- <div
- v-for="(doctor, index) in brainExtraDoctors"
- :key="index"
- style="display: flex; align-items: center; margin-bottom: 8px;"
- >
- <el-input
- v-model="brainExtraDoctors[index]"
- placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
- style="flex: 1; margin-right: 10px;"
- :readonly="!isEdit"
- />
- <el-button
- v-if="isEdit"
- type="danger"
- icon="el-icon-minus"
- circle
- size="mini"
- @click="removeBrainDoctor(index)"
- />
- </div>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
+ <el-descriptions title="鑴戞浜″垽瀹氫俊鎭�" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="姝讳骸鍘熷洜">{{ form.deathreason || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="姝讳骸鏃堕棿">{{ form.deathtime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍒ゅ畾鍖荤敓涓�">{{ form.deathjudgedocto || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍒ゅ畾鍖荤敓浜�">{{ form.deathjudgedoctt || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍏朵粬鍒ゅ畾鍖荤敓">
+ {{ brainExtraDoctors.filter(d => d && d.trim()).join('銆�') || '-' }}
+ </el-descriptions-item>
+ </el-descriptions>
<!-- 鑴戞浜¤瘎浼拌〃闄勪欢 -->
<div class="attachment-section">
@@ -131,21 +81,6 @@
:name="type.value"
>
<div class="attachment-upload-section">
- <div class="upload-header">
- <span class="upload-title">{{ type.label }}</span>
- <el-tooltip content="鐐瑰嚮涓婁紶璇ョ被鍨嬭瘎浼拌〃" placement="top">
- <el-button
- size="mini"
- type="primary"
- icon="el-icon-plus"
- @click="openUploadDialog(type.value)"
- :disabled="!isEdit"
- >
- 娣诲姞璇勪及琛�
- </el-button>
- </el-tooltip>
- </div>
-
<!-- 闄勪欢鍒楄〃 -->
<el-table
:data="getAttachmentsByType(type.value)"
@@ -190,7 +125,7 @@
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="180" align="center">
+ <el-table-column label="鎿嶄綔" width="140" align="center">
<template slot-scope="scope">
<el-button
size="mini"
@@ -205,15 +140,6 @@
icon="el-icon-download"
@click="handleDownload(scope.row)"
>涓嬭浇</el-button
- >
- <el-button
- v-if="isEdit"
- size="mini"
- type="text"
- icon="el-icon-delete"
- style="color: #F56C6C;"
- @click="handleRemoveAttachment(scope.row)"
- >鍒犻櫎</el-button
>
</template>
</el-table-column>
@@ -238,99 +164,17 @@
<el-card v-else class="detail-card">
<div slot="header" class="clearfix">
<span class="detail-title">蹇冩浜″垽瀹氫俊鎭�</span>
- <el-button
- v-if="isEdit"
- style="float: right; margin-left: 10px;"
- type="success"
- @click="handleSave"
- :loading="saveLoading"
- >
- 淇濆瓨淇℃伅
- </el-button>
- <el-button
- v-else
- style="float: right; margin-left: 10px;"
- type="primary"
- @click="handleEdit"
- >
- 缂栬緫淇℃伅
- </el-button>
</div>
- <el-form :model="form" ref="heartForm" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="蹇冩浜″師鍥�" prop="heartdeathreason">
- <el-input v-model="form.heartdeathreason" :readonly="!isEdit" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="蹇冩浜″垽瀹氬畬鎴愭椂闂�" prop="heartdeathtime">
- <el-date-picker
- v-model="form.heartdeathtime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- :disabled="!isEdit"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="heartdeathjudgedocto">
- <el-input
- v-model="form.heartdeathjudgedocto"
- :readonly="!isEdit"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="heartdeathjudgedoctt">
- <el-input
- v-model="form.heartdeathjudgedoctt"
- :readonly="!isEdit"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓">
- <div
- v-for="(doctor, index) in heartExtraDoctors"
- :key="index"
- style="display: flex; align-items: center; margin-bottom: 8px;"
- >
- <el-input
- v-model="heartExtraDoctors[index]"
- placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
- style="flex: 1; margin-right: 10px;"
- :readonly="!isEdit"
- />
- <el-button
- v-if="isEdit"
- type="danger"
- icon="el-icon-minus"
- circle
- size="mini"
- @click="removeHeartDoctor(index)"
- />
- </div>
- <el-button
- v-if="isEdit"
- type="primary"
- icon="el-icon-plus"
- size="small"
- @click="addHeartDoctor"
- >
- 娣诲姞鍖荤敓
- </el-button>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
+ <el-descriptions title="蹇冩浜″垽瀹氫俊鎭�" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="蹇冩浜″師鍥�">{{ form.heartdeathreason || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="蹇冩浜″垽瀹氬畬鎴愭椂闂�">{{ form.heartdeathtime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍒ゅ畾鍖荤敓涓�">{{ form.heartdeathjudgedocto || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍒ゅ畾鍖荤敓浜�">{{ form.heartdeathjudgedoctt || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍏朵粬鍒ゅ畾鍖荤敓">
+ {{ heartExtraDoctors.filter(d => d && d.trim()).join('銆�') || '-' }}
+ </el-descriptions-item>
+ </el-descriptions>
<!-- 蹇冩浜¤瘎浼拌〃闄勪欢 -->
<div class="attachment-section">
@@ -347,21 +191,6 @@
:name="type.value"
>
<div class="attachment-upload-section">
- <div class="upload-header">
- <span class="upload-title">{{ type.label }}</span>
- <el-tooltip content="鐐瑰嚮涓婁紶璇ョ被鍨嬭瘎浼拌〃" placement="top">
- <el-button
- size="mini"
- type="primary"
- icon="el-icon-plus"
- @click="openHeartDeathUploadDialog(type.value)"
- :disabled="!isEdit"
- >
- 娣诲姞璇勪及琛�
- </el-button>
- </el-tooltip>
- </div>
-
<!-- 蹇冩浜¢檮浠跺垪琛� -->
<el-table
:data="getHeartDeathAttachmentsByType(type.value)"
@@ -406,7 +235,7 @@
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="180" align="center">
+ <el-table-column label="鎿嶄綔" width="140" align="center">
<template slot-scope="scope">
<el-button
size="mini"
@@ -421,15 +250,6 @@
icon="el-icon-download"
@click="handleDownload(scope.row)"
>涓嬭浇</el-button
- >
- <el-button
- v-if="isEdit"
- size="mini"
- type="text"
- icon="el-icon-delete"
- style="color: #F56C6C;"
- @click="handleRemoveHeartDeathAttachment(scope.row)"
- >鍒犻櫎</el-button
>
</template>
</el-table-column>
@@ -449,112 +269,6 @@
</el-tabs>
</div>
</el-card>
- <!-- 搴曢儴鎿嶄綔鎸夐挳 -->
- <div style="text-align: center; margin: 30px 0;">
- <el-button
- v-if="isEdit"
- type="primary"
- @click="handleSave"
- :loading="saveLoading"
- >
- 淇濆瓨淇℃伅
- </el-button>
- <el-button
- v-if="isEdit"
- type="success"
- @click="accomplish"
- :loading="saveLoading"
- >
- 瀹屾垚鍒ゅ畾
- </el-button>
- </div>
- <!-- 涓婁紶瀵硅瘽妗嗭紙鑴戞浜★級 -->
- <el-dialog
- :title="`涓婁紶${getCurrentBrainDeathTypeLabel}璇勪及琛╜"
- :visible.sync="uploadDialogVisible"
- width="500px"
- :close-on-click-modal="false"
- >
- <el-upload
- ref="uploadRef"
- class="upload-demo"
- drag
- :action="uploadAction"
- :headers="headers"
- multiple
- :file-list="tempFileList"
- :before-upload="beforeUpload"
- :on-change="handleFileChange"
- :on-remove="handleTempRemove"
- :on-success="handleUploadSuccess"
- :auto-upload="false"
- >
- <i class="el-icon-upload"></i>
- <div class="el-upload__text">
- 灏嗚瘎浼拌〃鏂囦欢鎷栧埌姝ゅ锛屾垨<em>鐐瑰嚮涓婁紶</em>
- </div>
- <div class="el-upload__tip" slot="tip">
- 鏀寔涓婁紶pdf銆乯pg銆乸ng銆乨oc銆乨ocx銆亁ls銆亁lsx鏍煎紡鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB
- </div>
- </el-upload>
-
- <div slot="footer" class="dialog-footer">
- <el-button @click="uploadDialogVisible = false">鍙栨秷</el-button>
- <el-button
- type="primary"
- @click="submitUpload"
- :loading="uploadLoading"
- :disabled="tempFileList.length === 0"
- >
- 纭涓婁紶
- </el-button>
- </div>
- </el-dialog>
-
- <!-- 涓婁紶瀵硅瘽妗嗭紙蹇冩浜★級 -->
- <el-dialog
- :title="`涓婁紶${getCurrentHeartDeathTypeLabel}璇勪及琛╜"
- :visible.sync="heartDeathUploadDialogVisible"
- width="500px"
- :close-on-click-modal="false"
- >
- <el-upload
- ref="heartDeathUploadRef"
- class="upload-demo"
- drag
- :action="uploadAction"
- :headers="headers"
- multiple
- :file-list="tempHeartDeathFileList"
- :before-upload="beforeUpload"
- :on-change="handleHeartDeathFileChange"
- :on-remove="handleHeartDeathTempRemove"
- :on-success="handleHeartDeathUploadSuccess"
- :auto-upload="false"
- >
- <i class="el-icon-upload"></i>
- <div class="el-upload__text">
- 灏嗚瘎浼拌〃鏂囦欢鎷栧埌姝ゅ锛屾垨<em>鐐瑰嚮涓婁紶</em>
- </div>
- <div class="el-upload__tip" slot="tip">
- 鏀寔涓婁紶pdf銆乯pg銆乸ng銆乨oc銆乨ocx銆亁ls銆亁lsx鏍煎紡鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB
- </div>
- </el-upload>
-
- <div slot="footer" class="dialog-footer">
- <el-button @click="heartDeathUploadDialogVisible = false"
- >鍙栨秷</el-button
- >
- <el-button
- type="primary"
- @click="submitHeartDeathUpload"
- :loading="heartDeathUploadLoading"
- :disabled="tempHeartDeathFileList.length === 0"
- >
- 纭涓婁紶
- </el-button>
- </div>
- </el-dialog>
<!-- 闄勪欢棰勮 -->
<FilePreviewDialog
:visible="previewVisible"
@@ -574,10 +288,12 @@
import { getToken } from "@/utils/auth";
import CaseBasicInfo from "@/components/CaseBasicInfo";
import FilePreviewDialog from "@/components/FilePreviewDialog";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
export default {
name: "DeathJudgmentDetail",
components: { CaseBasicInfo, FilePreviewDialog },
+ mixins: [readonlyDescriptionsMixin],
props: {
infoid: {
type: String,
diff --git a/src/views/business/course/components/DonationConfirmStage.vue b/src/views/business/course/components/DonationConfirmStage.vue
index 2320f4c..11fa1c2 100644
--- a/src/views/business/course/components/DonationConfirmStage.vue
+++ b/src/views/business/course/components/DonationConfirmStage.vue
@@ -1,194 +1,90 @@
<template>
<div class="confirmation-detail">
+ <!-- <case-basic-info :case-id="caseId" :show-attachment="true":column="3" /> -->
<el-card class="detail-card">
- <!-- 鍩虹淇℃伅 -->
<div slot="header" class="clearfix">
<span class="detail-title">鎹愮尞纭淇℃伅</span>
-
</div>
- <el-form :model="form" ref="form" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="鍗忚皟鍛�1" prop="coordinatedusernameo">
- <el-input v-model="form.coordinatedusernameo" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍗忚皟鍛�2" prop="coordinatedusernamet">
- <el-input v-model="form.coordinatedusernamet" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="涓氬姟浜哄憳" prop="responsibleusername">
- <el-input v-model="form.responsibleusername" />
- </el-form-item>
- </el-col>
- </el-row>
+ <el-descriptions title="鍗忚皟鍛樹俊鎭�" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="鍗忚皟鍛�1">{{ form.coordinatedusernameo || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍗忚皟鍛�2">{{ form.coordinatedusernamet || '-' }}</el-descriptions-item>
+ </el-descriptions>
- <el-row :gutter="20">
- <!-- <el-col :span="8">
- <el-form-item label="纭鐘舵��" prop="relativeconfirmationsign">
- <el-select
- v-model="form.relativeconfirmationsign"
- style="width: 100%"
+ <el-descriptions title="鎹愮尞鍐冲畾" :column="descriptionColumn" border size="small" style="margin-top: 16px;">
+ <el-descriptions-item label="鎹愮尞鍐冲畾">
+ <template v-if="organdecision && organdecision.length">
+ <el-tag v-for="(item, i) in organdecision" :key="i" size="small" style="margin-right: 8px;">{{ item }}</el-tag>
+ </template>
+ <template v-else>-</template>
+ </el-descriptions-item>
+ <el-descriptions-item v-if="organdecision && organdecision.includes('鍏朵粬')" label="鍏朵粬鎹愮尞鍐冲畾">
+ {{ organdecisionOther || '-' }}
+ </el-descriptions-item>
+ </el-descriptions>
- >
- <el-option label="鏈‘璁�" value="0" />
- <el-option label="瀹跺睘纭" value="1" />
- <el-option label="涓嶅悓鎰忔崘鐚�" value="2" />
- </el-select>
- </el-form-item>
- </el-col> -->
- <el-col :span="8">
- <el-form-item label="绛惧瓧鏃堕棿" prop="signdate">
- <el-date-picker
- v-model="form.signdate"
- type="datetime"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <!-- <el-col :span="8">
- <el-form-item label="琛�鍨�" prop="bloodtype">
- <el-input v-model="form.bloodtype" />
- </el-form-item>
- </el-col> -->
- </el-row>
+ <el-descriptions title="瀹跺睘鎰忚澶囨敞" :column="1" border size="small" style="margin-top: 16px;">
+ <el-descriptions-item label="瀹跺睘鎰忚澶囨敞">{{ form.relativeRemark || '-' }}</el-descriptions-item>
+ </el-descriptions>
+ </el-card>
- <!-- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="璇佷欢鍙风爜" prop="idcardno">
- <el-input v-model="form.idcardno" />
- </el-form-item>
- </el-col>
- </el-row> -->
+ <!-- 浜插睘纭淇℃伅 -->
+ <el-card class="detail-card">
+ <div slot="header" class="clearfix">
+ <span class="detail-title">浜插睘纭淇℃伅</span>
+ </div>
- <!-- 浜插睘淇℃伅 -->
- <!-- 浜插睘淇℃伅 -->
- <el-divider content-position="left">浜插睘纭淇℃伅</el-divider>
-
- <el-row :gutter="20">
- <el-col :span="6">
- <el-form-item label="浜插睘濮撳悕" prop="relativeconfirmationsignname">
- <el-input
- v-model="form.relativeconfirmationsignname"
- placeholder="璇疯緭鍏ヤ翰灞炲鍚�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="涓庢崘璧犺�呭叧绯�" prop="signfamilyrelations">
- <el-select
- v-model="form.signfamilyrelations"
- placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
- >
- <el-option
- v-for="dict in dict.type.sys_FamilyRelation || []"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="浜插睘韬唤璇�" prop="relativeidcardno">
- <el-input
- v-model="form.relativeidcardno"
- placeholder="璇疯緭鍏ヤ翰灞炶瘉浠跺彿鐮�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="浜插睘鐢佃瘽" prop="relativephone">
- <el-input
- v-model="form.relativephone"
- placeholder="璇疯緭鍏ヤ翰灞炶仈绯荤數璇�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row style="margin-bottom: 10px;">
- <!-- <el-button
- type="primary"
- size="mini"
- icon="el-icon-plus"
- @click="openOtherFamilyDialog()"
- >
- 娣诲姞鍏朵粬瀹跺睘
- </el-button> -->
- </el-row>
- <el-table :data="otherFamilyList" size="small" border>
- <el-table-column label="濮撳悕" prop="name" />
- <el-table-column label="涓庢崘璧犺�呭叧绯�" prop="relation">
- <template slot-scope="scope">
- <dict-tag
- :options="dict.type.sys_FamilyRelation"
- :value="scope.row.relation"
- />
- </template>
- </el-table-column>
- <el-table-column label="鑱旂郴鐢佃瘽" prop="phone" />
-
- <el-table-column label="鎿嶄綔" width="120" align="center">
- <template slot-scope="scope">
- <el-button
- size="mini"
- type="text"
- @click="editOtherFamily(scope.$index)"
- >
- 缂栬緫
- </el-button>
- <el-button
- size="mini"
- type="text"
- style="color:red"
- @click="deleteOtherFamily(scope.$index)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- <el-row>
- <el-form-item label-width="100px" label="鎹愮尞鍐冲畾">
- <el-checkbox-group v-model="organdecision">
- <el-checkbox
- v-for="item in organselection"
- :key="item"
- :label="item"
- >{{ item }}
- </el-checkbox>
- </el-checkbox-group>
- <el-input
- v-if="organdecision.includes('鍏朵粬')"
- v-model="organdecisionOther"
- placeholder="璇疯緭鍏ュ叾浠栨崘鐚喅瀹氱殑鍏蜂綋鍐呭"
- style="margin-top: 10px; width: 300px;"
- ></el-input>
- </el-form-item>
- </el-row>
-
- <el-form-item label="瀹跺睘鎰忚澶囨敞" prop="relativeRemark">
- <el-input
- type="textarea"
- :rows="3"
- v-model="form.relativeRemark"
- placeholder="璁板綍瀹跺睘鐨勬剰瑙佸拰娌熼�氭儏鍐�"
- />
- </el-form-item>
- </el-form>
+ <el-table :data="familyMemberList" size="small" border>
+ <el-table-column label="搴忓彿" width="60" align="center">
+ <template slot-scope="scope">
+ {{ scope.$index + 1 }}
+ </template>
+ </el-table-column>
+ <el-table-column label="濮撳悕" prop="name" min-width="120">
+ <template slot-scope="scope">
+ <span :class="{ 'main-family': scope.$index === 0 }">{{
+ scope.row.name
+ }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="涓庢崘璧犺�呭叧绯�" prop="relation" min-width="140">
+ <template slot-scope="scope">
+ <dict-tag
+ :options="dict.type.sys_FamilyRelation"
+ :value="scope.row.relation"
+ />
+ </template>
+ </el-table-column>
+ <el-table-column label="韬唤璇佸彿" prop="idcard" min-width="180">
+ <template slot-scope="scope">
+ <span v-if="scope.$index === 0">{{ scope.row.idcard }}</span>
+ <span v-else style="color: #909399;">-</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鑱旂郴鐢佃瘽" prop="phone" min-width="130">
+ <template slot-scope="scope">
+ <span v-if="scope.$index === 0">{{ scope.row.phone }}</span>
+ <span v-else style="color: #909399;">-</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="绫诲瀷" width="70" align="center">
+ <template slot-scope="scope">
+ <el-tag v-if="scope.$index === 0" type="warning" size="small"
+ >涓昏</el-tag
+ >
+ <el-tag v-else type="info" size="small">鍏朵粬</el-tag>
+ </template>
+ </el-table-column>
+ </el-table>
</el-card>
<!-- 闄勪欢淇℃伅 - 鎸夌被鍨嬪垎绫� -->
<el-card class="attachment-card">
<div slot="header" class="clearfix">
- <span class="detail-title">鐩稿叧闄勪欢涓婁紶</span>
+ <span class="detail-title">鐩稿叧闄勪欢</span>
</div>
- <!-- 闄勪欢绫诲瀷閫夐」鍗� -->
<el-tabs v-model="activeAttachmentType" type="card">
<el-tab-pane
v-for="type in attachmentTypes"
@@ -197,21 +93,6 @@
:name="type.value"
>
<div class="attachment-section">
- <div class="attachment-header">
- <span class="upload-title">{{ type.label }}</span>
- <el-tooltip content="鐐瑰嚮涓婁紶璇ョ被鍨嬮檮浠�" placement="top">
- <!-- <el-button
- size="mini"
- type="primary"
- icon="el-icon-plus"
- @click="openUploadDialog(type.value)"
- >
- 娣诲姞闄勪欢
- </el-button> -->
- </el-tooltip>
- </div>
-
- <!-- 褰撳墠绫诲瀷鐨勯檮浠跺垪琛� -->
<div class="attachment-list">
<el-table
:data="getAttachmentsByType(type.value)"
@@ -229,7 +110,7 @@
</template>
</el-table-column>
- <el-table-column label="鏂囦欢绫诲瀷" width="100" align="center">
+ <el-table-column label="鏂囦欢绫诲瀷" width="90" align="center">
<template slot-scope="scope">
<el-tag size="small">{{
getFileType(scope.row.fileName)
@@ -237,19 +118,19 @@
</template>
</el-table-column>
- <el-table-column label="鏂囦欢澶у皬" width="100" align="center">
+ <el-table-column label="鏂囦欢澶у皬" width="90" align="center">
<template slot-scope="scope">
<span>{{ formatFileSize(scope.row.fileSize) }}</span>
</template>
</el-table-column>
- <el-table-column label="涓婁紶鏃堕棿" width="160" align="center">
+ <el-table-column label="涓婁紶鏃堕棿" width="155" align="center">
<template slot-scope="scope">
<span>{{ formatDateTime(scope.row.uploadTime) }}</span>
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="150" align="center">
+ <el-table-column label="鎿嶄綔" width="80" align="center">
<template slot-scope="scope">
<el-button
size="mini"
@@ -258,18 +139,10 @@
>
棰勮
</el-button>
- <el-button
- size="mini"
- type="danger"
- @click="handleRemoveAttachment(type.value, scope.$index)"
- >
- 鍒犻櫎
- </el-button>
</template>
</el-table-column>
</el-table>
- <!-- 绌虹姸鎬佹彁绀� -->
<div
v-if="getAttachmentsByType(type.value).length === 0"
class="empty-attachment"
@@ -284,78 +157,6 @@
</el-tab-pane>
</el-tabs>
</el-card>
- <!-- 鍏朵粬瀹跺睘寮圭獥 -->
- <el-dialog
- :title="isEditOtherFamily ? '缂栬緫鍏朵粬瀹跺睘' : '娣诲姞鍏朵粬瀹跺睘'"
- :visible.sync="otherFamilyDialogVisible"
- width="400px"
- >
- <el-form :model="currentOtherFamily" label-width="100px">
- <el-form-item label="濮撳悕" prop="name">
- <el-input v-model="currentOtherFamily.name" />
- </el-form-item>
-
- <el-form-item label="鍏崇郴" prop="relation">
- <el-select v-model="currentOtherFamily.relation" style="width:100%">
- <el-option
- v-for="dict in dict.type.sys_FamilyRelation"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
-
- <el-form-item label="鐢佃瘽" prop="phone">
- <el-input v-model="currentOtherFamily.phone" />
- </el-form-item>
- </el-form>
-
- <span slot="footer">
- <el-button @click="otherFamilyDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="saveOtherFamily">纭畾</el-button>
- </span>
- </el-dialog>
- <!-- 涓婁紶瀵硅瘽妗� -->
- <el-dialog
- :title="`涓婁紶${getCurrentTypeLabel}闄勪欢`"
- :visible.sync="uploadDialogVisible"
- width="500px"
- :close-on-click-modal="false"
- >
- <el-upload
- ref="uploadRef"
- class="upload-demo"
- drag
- :action="uploadAction"
- :headers="headers"
- multiple
- :file-list="tempFileList"
- :before-upload="beforeUpload"
- :on-change="handleFileChange"
- :on-remove="handleTempRemove"
- :on-success="handleUploadSuccess"
- :auto-upload="false"
- >
- <i class="el-icon-upload"></i>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <div class="el-upload__tip" slot="tip">
- 鏀寔涓婁紶pdf銆乯pg銆乸ng銆乨oc銆乨ocx鏍煎紡鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB
- </div>
- </el-upload>
-
- <span slot="footer" class="dialog-footer">
- <el-button @click="uploadDialogVisible = false">鍙栨秷</el-button>
- <el-button
- type="primary"
- @click="submitUpload"
- :loading="uploadLoading"
- :disabled="tempFileList.length === 0"
- >
- 纭涓婁紶
- </el-button>
- </span>
- </el-dialog>
<!-- 鏂囦欢棰勮寮圭獥 -->
<FilePreviewDialog
@@ -372,6 +173,7 @@
import FilePreviewDialog from "@/components/FilePreviewDialog";
import CaseBasicInfo from "@/components/CaseBasicInfo";
import { getToken } from "@/utils/auth";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
export default {
name: "ConfirmationDetail",
@@ -379,20 +181,18 @@
FilePreviewDialog,
CaseBasicInfo
},
- props: {
+ mixins: [readonlyDescriptionsMixin],
+ dicts: ["sys_FamilyRelation"],
+ props: {
infoid: {
type: String,
default: true
}
},
- dicts: ["sys_FamilyRelation"],
data() {
return {
caseId: null,
-
- // 鏄惁缂栬緫妯″紡
isEdit: false,
- // 琛ㄥ崟鏁版嵁
form: {
id: undefined,
infoid: undefined,
@@ -412,29 +212,28 @@
relativeidcardno: "",
relativephone: "",
relativeRemark: "",
- assessannex: "", // JSON瀛楃涓插瓨鍌ㄦ墍鏈夐檮浠�
- otherFamilyMembers: "" // 鉁� 鏂板
+ assessannex: "",
+ otherFamilyMembers: ""
},
+ // 缁熶竴浜插睘鍒楄〃锛堢涓�鏉′负涓昏浜插睘锛屽叾浣欎负鍏朵粬浜插睘锛�
+ familyMemberList: [],
+ // 褰撳墠缂栬緫鐨勫灞烇紙寮圭獥鐢級
+ currentFamilyMember: {
+ name: "",
+ relation: "",
+ phone: "",
+ idcard: "",
+ isMain: false
+ },
+ isEditFamilyMember: false,
+ editFamilyMemberIndex: -1,
+ familyDialogVisible: false,
+ familyDialogTitle: "娣诲姞瀹跺睘",
+
uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
headers: {
Authorization: "Bearer " + getToken()
},
- // 鍏朵粬瀹跺睘琛ㄦ牸鏁版嵁
- otherFamilyList: [],
-
- // 褰撳墠缂栬緫鐨勫叾浠栧灞烇紙寮圭獥鐢級
- currentOtherFamily: {
- name: "",
- relation: "",
- phone: ""
- },
-
- // 鏄惁缂栬緫妯″紡锛堝叾浠栧灞烇級
- isEditOtherFamily: false,
- editOtherFamilyIndex: -1,
-
- // 鍏朵粬瀹跺睘寮圭獥
- otherFamilyDialogVisible: false,
organdecision: [],
organdecisionOther: "",
organselection: [
@@ -447,21 +246,16 @@
"鐪艰鑶�",
"鍏朵粬"
],
- // 鍔犺浇鐘舵��
loading: false,
saveLoading: false,
- // 闄勪欢鐩稿叧鏁版嵁
activeAttachmentType: "1",
attachmentLoading: false,
uploadDialogVisible: false,
uploadLoading: false,
tempFileList: [],
currentUploadType: "",
- // 棰勮鐩稿叧
previewVisible: false,
currentPreviewFile: null,
-
- // 闄勪欢绫诲瀷瀹氫箟
attachmentTypes: [
{ value: "1", label: "浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃" },
{ value: "2", label: "浜轰綋鍣ㄥ畼鎹愮尞浜插睘纭鐧昏琛�" },
@@ -470,10 +264,8 @@
{ value: "5", label: "鑴戞浜″垽瀹氱煡鎯呭悓鎰忎功" },
{ value: "6", label: "蹇冩浜″垽瀹氱煡鎯呭悓鎰忎功" }
],
-
- // 闄勪欢鏁版嵁缁撴瀯 - 鎸夌被鍨嬪垎寮�瀛樺偍
attachmentData: {
- "1": [], // 绫诲瀷1鐨勯檮浠跺垪琛�
+ "1": [],
"2": [],
"3": [],
"4": [],
@@ -491,19 +283,17 @@
}
},
created() {
+ this.infoid = this.infoid;
this.caseId = this.infoid;
-
if (this.infoid) {
this.getDetail(this.infoid);
}
},
methods: {
- // 鑾峰彇璇︽儏
async getDetail(infoid) {
this.loading = true;
try {
const response = await relativesList({ infoid });
-
if (response.code === 200) {
this.handleDetailData(response);
} else {
@@ -517,11 +307,8 @@
}
},
- // 澶勭悊璇︽儏鏁版嵁
handleDetailData(response) {
let detailData = null;
-
- // 鏍规嵁鎺ュ彛瀹為檯杩斿洖鐨勬暟鎹粨鏋勮繘琛岃皟鏁�
if (response.data) {
if (Array.isArray(response.data)) {
detailData = response.data[0] || {};
@@ -535,22 +322,11 @@
} else {
detailData = response;
}
- // 澶勭悊鍏朵粬瀹跺睘鏁版嵁
- if (detailData.otherFamilyMembers) {
- try {
- this.otherFamilyList =
- typeof detailData.otherFamilyMembers === "string"
- ? JSON.parse(detailData.otherFamilyMembers)
- : detailData.otherFamilyMembers || [];
- } catch (e) {
- this.otherFamilyList = [];
- }
- }
- // 鏄犲皠瀛楁鍒拌〃鍗�
+
this.form = {
...this.form,
id: detailData.id || this.$route.query.id,
- infoid: detailData.infoid || infoid,
+ infoid: detailData.infoid || this.infoid,
caseNo: detailData.caseNo || "",
name: detailData.name || "",
sex: detailData.sex || "",
@@ -571,19 +347,44 @@
assessannex: detailData.assessannex || ""
};
- // 澶勭悊鎹愮尞鍐冲畾鏁版嵁
+ // 鍒濆鍖栧灞炲垪琛�
+ this.familyMemberList = [];
+ if (detailData.relativeconfirmationsignname) {
+ this.familyMemberList.push({
+ name: detailData.relativeconfirmationsignname,
+ relation: detailData.signfamilyrelations || "",
+ phone: detailData.relativephone || "",
+ idcard: detailData.relativeidcardno || ""
+ });
+ }
+ if (detailData.otherFamilyMembers) {
+ try {
+ const otherMembers =
+ typeof detailData.otherFamilyMembers === "string"
+ ? JSON.parse(detailData.otherFamilyMembers)
+ : detailData.otherFamilyMembers || [];
+ otherMembers.forEach(member => {
+ this.familyMemberList.push({
+ name: member.name,
+ relation: member.relation,
+ phone: member.phone || "",
+ idcard: member.idcard || ""
+ });
+ });
+ } catch (e) {
+ console.warn("瑙f瀽鍏朵粬瀹跺睘鏁版嵁澶辫触:", e);
+ }
+ }
+
if (detailData.organdecision) {
this.organdecision = Array.isArray(detailData.organdecision)
? detailData.organdecision
: detailData.organdecision.split(",");
}
- console.log(this.organdecision, "this.organdecision");
- // 澶勭悊闄勪欢鏁版嵁 - 浠巃ssessannex瀛楁瑙f瀽JSON骞舵寜绫诲瀷鍒嗙被
this.processAssessannexData();
},
- // 澶勭悊assessannex瀛楁鏁版嵁骞舵寜绫诲瀷鍒嗙被
processAssessannexData() {
if (this.form.assessannex) {
try {
@@ -591,16 +392,12 @@
typeof this.form.assessannex === "string"
? JSON.parse(this.form.assessannex)
: this.form.assessannex;
-
- // 娓呯┖鐜版湁鏁版嵁
Object.keys(this.attachmentData).forEach(key => {
this.attachmentData[key] = [];
});
-
- // 鎸夌被鍨嬪垎绫诲瓨鍌�
if (Array.isArray(annexData)) {
annexData.forEach(attachment => {
- const type = attachment.type || "1"; // 榛樿鍒扮涓�绉嶇被鍨�
+ const type = attachment.type || "1";
if (this.attachmentData[type]) {
this.attachmentData[type].push(attachment);
}
@@ -612,12 +409,13 @@
}
},
- // 鏍规嵁绫诲瀷鑾峰彇闄勪欢鍒楄〃
getAttachmentsByType(type) {
+ console.log(type);
+ console.log(this.attachmentData[type]);
+
return this.attachmentData[type] || [];
},
- // 鎵撳紑涓婁紶瀵硅瘽妗�
openUploadDialog(type) {
this.currentUploadType = type;
this.tempFileList = [];
@@ -629,7 +427,6 @@
});
},
- // 涓婁紶鍓嶆牎楠孾7](@ref)
beforeUpload(file) {
const allowedTypes = [
"application/pdf",
@@ -638,10 +435,7 @@
"application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
];
-
- const maxSize = 10 * 1024 * 1024; // 10MB
-
- // 鏍¢獙鏂囦欢绫诲瀷
+ const maxSize = 10 * 1024 * 1024;
const isTypeOk =
allowedTypes.includes(file.type) ||
file.name.endsWith(".pdf") ||
@@ -650,29 +444,23 @@
file.name.endsWith(".png") ||
file.name.endsWith(".doc") ||
file.name.endsWith(".docx");
-
if (!isTypeOk) {
this.$message.error(
"鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼爌df銆乯pg銆乸ng銆乨oc鎴杁ocx鏍煎紡鏂囦欢"
);
return false;
}
-
- // 鏍¢獙鏂囦欢澶у皬
if (file.size > maxSize) {
this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
return false;
}
-
return true;
},
- // 鏂囦欢閫夋嫨鍙樺寲
handleFileChange(file, fileList) {
this.tempFileList = fileList;
},
- // 绉婚櫎涓存椂鏂囦欢
handleTempRemove(file, fileList) {
this.tempFileList = fileList;
},
@@ -682,7 +470,6 @@
this.$message.error(response.msg || "涓婁紶澶辫触");
return;
}
-
const newAttachment = {
id: Date.now(),
fileName: file.name,
@@ -693,10 +480,10 @@
uploadTime: this.getCurrentTime(),
uploader: "褰撳墠鐢ㄦ埛"
};
-
this.attachmentData[this.currentUploadType].push(newAttachment);
- this.updateAssessannexField();
+ console.log(this.attachmentData,'this.attachmentData');
+ this.updateAssessannexField();
this.$message.success("涓婁紶鎴愬姛");
this.uploadLoading = false;
this.uploadDialogVisible = false;
@@ -708,12 +495,10 @@
this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
return;
}
-
this.uploadLoading = true;
- this.$refs.uploadRef.submit(); // 鉁� 鍙皟鐢ㄤ竴娆�
+ this.$refs.uploadRef.submit();
},
- // 鍒犻櫎闄勪欢
handleRemoveAttachment(type, index) {
this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
confirmButtonText: "纭畾",
@@ -724,69 +509,157 @@
if (this.attachmentData[type] && this.attachmentData[type][index]) {
this.attachmentData[type].splice(index, 1);
this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
- this.updateAssessannexField(); // 鏇存柊瀛樺偍瀛楁
+ this.updateAssessannexField();
}
})
.catch(() => {});
},
- openOtherFamilyDialog(index) {
- this.isEditOtherFamily = typeof index === "number";
- this.editOtherFamilyIndex = index || -1;
- this.currentOtherFamily = this.isEditOtherFamily
- ? { ...this.otherFamilyList[index] }
- : { name: "", relation: "", phone: "" };
+ // 瀹跺睘鎿嶄綔鏂规硶
+ openFamilyDialog(isMain) {
+ this.isEditFamilyMember = false;
+ this.editFamilyMemberIndex = -1;
+ this.familyDialogTitle = "娣诲姞鍏朵粬瀹跺睘";
- this.otherFamilyDialogVisible = true;
+ // 濡傛灉杩樻病鏈変换浣曞灞烇紝鍒欐坊鍔犱富瑕佷翰灞�
+ if (this.familyMemberList.length === 0) {
+ this.currentFamilyMember = {
+ name: "",
+ relation: "",
+ phone: "",
+ idcard: "",
+ isMain: true
+ };
+ this.familyDialogTitle = "娣诲姞涓昏浜插睘";
+ } else {
+ this.currentFamilyMember = {
+ name: "",
+ relation: "",
+ phone: "",
+ idcard: "",
+ isMain: false
+ };
+ }
+
+ this.familyDialogVisible = true;
},
- editOtherFamily(index) {
- this.openOtherFamilyDialog(index);
+
+ editFamilyMember(index) {
+ this.isEditFamilyMember = true;
+ this.editFamilyMemberIndex = index;
+ const member = this.familyMemberList[index];
+ this.currentFamilyMember = {
+ name: member.name,
+ relation: member.relation,
+ phone: member.phone || "",
+ idcard: member.idcard || "",
+ isMain: index === 0
+ };
+ this.familyDialogTitle = index === 0 ? "缂栬緫涓昏浜插睘" : "缂栬緫鍏朵粬瀹跺睘";
+ this.familyDialogVisible = true;
},
- deleteOtherFamily(index) {
- this.$confirm("纭鍒犻櫎璇ュ灞烇紵", "鎻愮ず", { type: "warning" }).then(
- () => {
- this.otherFamilyList.splice(index, 1);
- this.updateOtherFamilyField();
- }
- );
+
+ deleteFamilyMember(index) {
+ if (index === 0) {
+ this.$message.warning("涓昏浜插睘涓嶅彲鍒犻櫎");
+ return;
+ }
+ this.$confirm("纭鍒犻櫎璇ュ灞烇紵", "鎻愮ず", { type: "warning" })
+ .then(() => {
+ this.familyMemberList.splice(index, 1);
+ this.updateFamilyMemberField();
+ })
+ .catch(() => {});
},
- saveOtherFamily() {
- if (
- !this.currentOtherFamily.name ||
- !this.currentOtherFamily.relation ||
- !this.currentOtherFamily.phone
- ) {
- this.$message.warning("璇峰~鍐欏畬鏁翠俊鎭�");
+
+ saveFamilyMember() {
+ if (!this.currentFamilyMember.name) {
+ this.$message.warning("璇疯緭鍏ュ鍚�");
+ return;
+ }
+ if (!this.currentFamilyMember.relation) {
+ this.$message.warning("璇烽�夋嫨涓庢崘璧犺�呭叧绯�");
return;
}
- if (this.isEditOtherFamily) {
- this.otherFamilyList.splice(this.editOtherFamilyIndex, 1, {
- ...this.currentOtherFamily
- });
- } else {
- this.otherFamilyList.push({ ...this.currentOtherFamily });
+ // 濡傛灉鏄富瑕佷翰灞烇紝楠岃瘉韬唤璇佸拰鐢佃瘽
+ if (this.currentFamilyMember.isMain) {
+ if (!this.currentFamilyMember.idcard) {
+ this.$message.warning("璇疯緭鍏ヤ富瑕佷翰灞炵殑韬唤璇佸彿");
+ return;
+ }
+ if (
+ !/^(\d{15}|\d{18}|\d{17}(\d|X|x))$/.test(
+ this.currentFamilyMember.idcard
+ )
+ ) {
+ this.$message.warning("璇疯緭鍏ユ纭殑韬唤璇佸彿");
+ return;
+ }
+ if (!this.currentFamilyMember.phone) {
+ this.$message.warning("璇疯緭鍏ヤ富瑕佷翰灞炵殑鑱旂郴鐢佃瘽");
+ return;
+ }
+ if (!/^1[3-9]\d{9}$/.test(this.currentFamilyMember.phone)) {
+ this.$message.warning("璇疯緭鍏ユ纭殑鎵嬫満鍙�");
+ return;
+ }
}
- this.updateOtherFamilyField();
- this.otherFamilyDialogVisible = false;
+ const memberData = {
+ name: this.currentFamilyMember.name,
+ relation: this.currentFamilyMember.relation,
+ phone: this.currentFamilyMember.isMain
+ ? this.currentFamilyMember.phone
+ : "",
+ idcard: this.currentFamilyMember.isMain
+ ? this.currentFamilyMember.idcard
+ : ""
+ };
+
+ if (this.isEditFamilyMember) {
+ this.familyMemberList.splice(this.editFamilyMemberIndex, 1, memberData);
+ } else {
+ this.familyMemberList.push(memberData);
+ }
+
+ this.updateFamilyMemberField();
+ this.familyDialogVisible = false;
+ this.$message.success(this.isEditFamilyMember ? "缂栬緫鎴愬姛" : "娣诲姞鎴愬姛");
},
- updateOtherFamilyField() {
- this.form.otherFamilyMembers = JSON.stringify(this.otherFamilyList);
+
+ updateFamilyMemberField() {
+ if (this.familyMemberList.length > 0) {
+ const mainMember = this.familyMemberList[0];
+ this.form.relativeconfirmationsignname = mainMember.name;
+ this.form.signfamilyrelations = mainMember.relation;
+ this.form.relativeidcardno = mainMember.idcard || "";
+ this.form.relativephone = mainMember.phone || "";
+
+ const otherMembers = this.familyMemberList.slice(1).map(member => ({
+ name: member.name,
+ relation: member.relation,
+ phone: member.phone || "",
+ idcard: member.idcard || ""
+ }));
+ this.form.otherFamilyMembers = JSON.stringify(otherMembers);
+ } else {
+ this.form.relativeconfirmationsignname = "";
+ this.form.signfamilyrelations = "";
+ this.form.relativeidcardno = "";
+ this.form.relativephone = "";
+ this.form.otherFamilyMembers = "[]";
+ }
},
- // 鏇存柊assessannex瀛樺偍瀛楁
+
updateAssessannexField() {
- // 灏嗘墍鏈夌被鍨嬬殑闄勪欢鍚堝苟涓轰竴涓暟缁�
const allAttachments = [];
Object.values(this.attachmentData).forEach(attachments => {
allAttachments.push(...attachments);
});
-
- // 鏇存柊鍒拌〃鍗曞瓧娈�
this.form.assessannex = JSON.stringify(allAttachments);
},
- // 鏂囦欢棰勮
handlePreview(file) {
this.currentPreviewFile = {
fileName: file.fileName,
@@ -796,11 +669,9 @@
this.previewVisible = true;
},
- // 鏂囦欢涓嬭浇
handleDownload(file) {
const fileUrl = file.fileUrl;
const fileName = file.fileName;
-
if (fileUrl) {
const link = document.createElement("a");
link.href = fileUrl;
@@ -815,21 +686,18 @@
}
},
- // 鑾峰彇鏂囦欢绫诲瀷
getFileType(fileName) {
if (!fileName) return "other";
const extension = this.getFileExtension(fileName);
const imageTypes = ["jpg", "jpeg", "png"];
const pdfTypes = ["pdf"];
const officeTypes = ["doc", "docx"];
-
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(".")
@@ -837,7 +705,6 @@
.toLowerCase();
},
- // 鏂囦欢澶у皬鏍煎紡鍖�
formatFileSize(size) {
if (!size) return "0 B";
const k = 1024;
@@ -846,26 +713,22 @@
return parseFloat((size / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
},
- // 鏃ユ湡鏃堕棿鏍煎紡鍖�
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");
-
return `${year}-${month}-${day} ${hours}:${minutes}`;
} catch (error) {
return dateTime;
}
},
- // 鑾峰彇褰撳墠鏃堕棿
getCurrentTime() {
const now = new Date();
return `${now.getFullYear()}-${(now.getMonth() + 1)
@@ -884,6 +747,7 @@
.toString()
.padStart(2, "0")}`;
},
+
accomplish() {
this.$confirm("鏄惁瀹屾垚璇ユ渚嬫崘鐚‘璁ゆ楠わ紵", "鎻愰啋", {
confirmButtonText: "纭畾",
@@ -894,28 +758,27 @@
this.form.state = 3;
this.handleSave();
})
-
.catch(() => {});
},
- // 淇濆瓨纭淇℃伅
async handleSave() {
try {
await this.$refs.form.validate();
this.saveLoading = true;
- this.updateOtherFamilyField();
+ this.updateFamilyMemberField();
this.updateAssessannexField();
+
const saveData = {
...this.form,
infoid: this.infoid,
organdecision: this.organdecision.join(","),
organdecisionOther: this.organdecisionOther
- // assessannex瀛楁宸插湪updateAssessannexField涓洿鏂�
};
if (saveData.state == 1 || !saveData.state) {
saveData.state = 2;
}
+
let response = null;
if (saveData.id) {
response = await relativesEdit(saveData);
@@ -949,6 +812,11 @@
.detail-card {
margin-bottom: 20px;
+}
+
+.main-family {
+ font-weight: bold;
+ color: #e6a23c;
}
.attachment-card {
@@ -986,7 +854,7 @@
.empty-attachment {
text-align: center;
- padding: 40px 0;
+ padding: 30px 0;
color: #909399;
}
diff --git a/src/views/business/course/components/DonorMaintenanceStage.vue b/src/views/business/course/components/DonorMaintenanceStage.vue
index 75e2721..7080781 100644
--- a/src/views/business/course/components/DonorMaintenanceStage.vue
+++ b/src/views/business/course/components/DonorMaintenanceStage.vue
@@ -90,30 +90,6 @@
<span v-else>鏃犻檮浠�</span>
</template>
</el-table-column>
- <el-table-column
- label="鎿嶄綔"
- align="center"
- width="200"
- class-name="small-padding fixed-width"
- >
- <template slot-scope="scope">
- <el-button
- size="mini"
- type="text"
- icon="el-icon-edit"
- @click="handleEditCulture(scope.row)"
- >缂栬緫</el-button
- >
- <el-button
- size="mini"
- type="text"
- icon="el-icon-delete"
- style="color: #F56C6C;"
- @click="handleDeleteCulture(scope.row)"
- >鍒犻櫎</el-button
- >
- </template>
- </el-table-column>
</el-table>
</el-card>
</el-tab-pane>
@@ -159,30 +135,6 @@
<span v-else>鏃犻檮浠�</span>
</template>
</el-table-column>
- <el-table-column
- label="鎿嶄綔"
- align="center"
- width="180"
- class-name="small-padding fixed-width"
- >
- <template slot-scope="scope">
- <el-button
- size="mini"
- type="text"
- icon="el-icon-edit"
- @click="handleEditRecord(scope.row)"
- >缂栬緫</el-button
- >
- <el-button
- size="mini"
- type="text"
- icon="el-icon-delete"
- style="color: #F56C6C;"
- @click="handleDeleteRecord(scope.row)"
- >鍒犻櫎</el-button
- >
- </template>
- </el-table-column>
</el-table>
</el-card>
</el-tab-pane>
@@ -220,160 +172,6 @@
</el-card>
<!-- 鎶ょ悊鏍告煡璁板綍 -->
-
- <!-- 鍩瑰吇璁板綍缂栬緫瀵硅瘽妗� -->
- <el-dialog
- :title="cultureDialogTitle"
- :visible.sync="cultureDialogVisible"
- width="700px"
- :close-on-click-modal="false"
- >
- <el-form
- :model="cultureForm"
- ref="cultureForm"
- :rules="cultureRules"
- label-width="120px"
- >
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍩瑰吇绫诲瀷" prop="cultureType">
- <el-select
- v-model="cultureForm.cultureType"
- placeholder="璇烽�夋嫨鍩瑰吇绫诲瀷"
- style="width: 100%"
- >
- <el-option
- v-for="item in cultureTypeOptions"
- :key="item.value"
- :label="item.label"
- :value="item.label"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閲囨牱鏃堕棿" prop="sampleTime">
- <el-date-picker
- v-model="cultureForm.sampleTime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="閫夋嫨閲囨牱鏃堕棿"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍩瑰吇缁撴灉" prop="result">
- <el-select
- v-model="cultureForm.result"
- placeholder="璇烽�夋嫨鍩瑰吇缁撴灉"
- style="width: 100%"
- >
- <el-option label="闃存��" value="闃存��" />
- <el-option label="闃虫��" value="闃虫��" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-form-item label="闄勪欢">
- <UploadAttachment
- ref="cultureUploadAttachment"
- :file-list="cultureFileList"
- :limit="10"
- :accept="attachmentAccept"
- :multiple="true"
- @change="handleCultureAttachmentChange"
- @upload-success="handleCultureUploadSuccess"
- @upload-error="handleCultureUploadError"
- @remove="handleCultureAttachmentRemove"
- />
- </el-form-item>
- </el-form>
-
- <span slot="footer" class="dialog-footer">
- <el-button @click="cultureDialogVisible = false">鍙栨秷</el-button>
- <el-button
- type="primary"
- @click="handleSaveCulture"
- :loading="cultureSaveLoading"
- >淇濆瓨</el-button
- >
- </span>
- </el-dialog>
-
- <!-- 鎶ょ悊鏍告煡璁板綍缂栬緫瀵硅瘽妗� -->
- <el-dialog
- :title="recordDialogTitle"
- :visible.sync="recordDialogVisible"
- width="700px"
- :close-on-click-modal="false"
- >
- <el-form
- :model="recordForm"
- ref="recordForm"
- :rules="recordRules"
- label-width="120px"
- >
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鏍告煡鏃堕棿" prop="recordTime">
- <el-date-picker
- v-model="recordForm.recordTime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="閫夋嫨鏍告煡鏃堕棿"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏍告煡浜�" prop="recorder">
- <el-input
- v-model="recordForm.recorder"
- placeholder="璇疯緭鍏ユ牳鏌ヤ汉濮撳悕"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-form-item label="鏍告煡璁板綍" prop="checkRecord">
- <el-input
- type="textarea"
- :rows="4"
- v-model="recordForm.checkRecord"
- placeholder="璇疯緭鍏ユ牳鏌ヨ褰曞唴瀹�"
- />
- </el-form-item>
-
- <el-form-item label="闄勪欢">
- <UploadAttachment
- ref="recordUploadAttachment"
- :file-list="recordFileList"
- :limit="10"
- :accept="attachmentAccept"
- :multiple="true"
- @change="handleRecordAttachmentChange"
- @upload-success="handleRecordUploadSuccess"
- @upload-error="handleRecordUploadError"
- @remove="handleRecordAttachmentRemove"
- />
- </el-form-item>
- </el-form>
-
- <span slot="footer" class="dialog-footer">
- <el-button @click="recordDialogVisible = false">鍙栨秷</el-button>
- <el-button
- type="primary"
- @click="handleSaveRecord"
- :loading="recordSaveLoading"
- >淇濆瓨</el-button
- >
- </span>
- </el-dialog>
<!-- 闄勪欢棰勮瀵硅瘽妗� -->
<el-dialog
@@ -444,7 +242,6 @@
<script>
import { maintainList, maintainedit, maintainAdd } from "@/api/businessApi";
import Pagination from "@/components/Pagination";
-import UploadAttachment from "@/components/UploadAttachment";
import FilePreviewDialog from "@/components/FilePreviewDialog";
import LiverKidneyPanel from "@/components/MaintainComponents/LiverKidneyPanel.vue";
import BloodRoutinePanel from "@/components/MaintainComponents/BloodRoutinePanel.vue";
@@ -457,7 +254,6 @@
name: "MaintenanceDetail",
components: {
Pagination,
- UploadAttachment,
FilePreviewDialog,
LiverKidneyPanel,
BloodRoutinePanel,
@@ -480,7 +276,7 @@
},
data() {
return {
- isEdit: true,
+ isEdit: false,
currentMaintenanceId: null,
isEditMode: false,
form: {
diff --git a/src/views/business/course/components/EthicalReviewStage.vue b/src/views/business/course/components/EthicalReviewStage.vue
index 2d4b6ce..768af02 100644
--- a/src/views/business/course/components/EthicalReviewStage.vue
+++ b/src/views/business/course/components/EthicalReviewStage.vue
@@ -1,141 +1,31 @@
<template>
<div class="ethics-review-detail">
+ <!-- <case-basic-info :case-id="caseId" :show-attachment="true":column="3" /> -->
+
<el-card class="detail-card">
<!-- 浼︾悊瀹℃煡鍩烘湰淇℃伅 -->
<div slot="header" class="clearfix">
<span class="detail-title">浼︾悊瀹℃煡鍩烘湰淇℃伅</span>
- <div style="float: right;">
- <el-button type="primary" @click="handleSave" :loading="saveLoading">
- 淇濆瓨
- </el-button>
-
- <el-button
- type="success"
- @click="handleCompleteReview"
- :disabled="form.status == '3' || form.status == '2'"
- :loading="completeLoading"
- >
- 瀹℃煡瀹屾垚
- </el-button>
-
- <el-button
- type="warning"
- @click="handleSuspendReview"
- :disabled="form.status == '2' || form.status == '3'"
- :loading="suspendLoading"
- >
- 瀹℃煡涓
- </el-button>
-
- <el-button
- type="danger"
- @click="handleEndReview"
- :disabled="form.status == '2'"
- :loading="endLoading"
- >
- 缁撴潫瀹℃煡
- </el-button>
- </div>
</div>
- <el-form :model="form" ref="form" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="鍙戣捣涓婚" prop="initiateTheme">
- <el-input
- v-model="form.initiateTheme"
- placeholder="璇疯緭鍏ュ彂璧蜂富棰�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍙戣捣浜�" prop="initiatePerson">
- <el-input v-model="form.initiatePerson" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="瀹℃煡鐘舵��" prop="status">
- <el-select v-model="form.status" style="width: 100%">
- <el-option
- v-for="dict in dict.type.sys_ethical"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
+ <el-descriptions title="鍩烘湰淇℃伅" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="鍙戣捣涓婚">{{ form.initiateTheme || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣捣浜�">{{ form.initiatePerson || '-' }}</el-descriptions-item>
+ </el-descriptions>
- <!-- 涓撳鐩稿叧淇℃伅 -->
-
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="浼︾悊瀹℃煡缁撹" prop="expertConclusion">
- <el-select v-model="form.expertConclusion" style="width: 100%">
- <el-option label="鍚屾剰" value="1" />
- <el-option label="瀹℃煡涓�" value="2" />
- <el-option label="涓嶅悓鎰�" value="0" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="浼︾悊瀹℃煡缁撹鏃堕棿" prop="expertTime">
- <el-date-picker
- v-model="form.expertTime"
- type="datetime"
- 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="24">
- <el-form-item label="瀹℃煡鎰忚" prop="expertOpinion">
- <el-input
- type="textarea"
- :rows="2"
- v-model="form.expertOpinion"
- placeholder="璇疯緭鍏ユ剰瑙�"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="澶囨敞" prop="remark">
- <el-input
- type="textarea"
- :rows="3"
- v-model="form.remark"
- placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
+ <el-descriptions title="瀹℃煡缁撹" :column="descriptionColumn" border size="small" style="margin-top: 16px;">
+ <el-descriptions-item label="浼︾悊瀹℃煡缁撹">{{ expertConclusionLabel }}</el-descriptions-item>
+ <el-descriptions-item label="浼︾悊瀹℃煡缁撹鏃堕棿">{{ form.expertTime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="瀹℃煡鎰忚" :span="descriptionColumn">{{ form.expertOpinion || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="澶囨敞" :span="descriptionColumn">{{ form.remark || '-' }}</el-descriptions-item>
+ </el-descriptions>
</el-card>
- <!-- 闄勪欢涓婁紶 -->
+ <!-- 鐩稿叧闄勪欢 -->
<el-card class="attachment-card">
<div slot="header" class="clearfix">
<span class="detail-title">鐩稿叧闄勪欢</span>
</div>
-
- <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
- <UploadAttachment
- ref="uploadAttachment"
- :file-list="attachmentFileList"
- :limit="10"
- accept=".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx"
- @change="handleAttachmentChange"
- @upload-success="handleUploadSuccess"
- @upload-error="handleUploadError"
- @remove="handleAttachmentRemove"
- />
<!-- 闄勪欢鍒楄〃 -->
<div
@@ -167,7 +57,7 @@
<span>{{ formatDateTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="266">
+ <el-table-column label="鎿嶄綔" width="180">
<template slot-scope="scope">
<el-button
size="mini"
@@ -183,13 +73,6 @@
>
涓嬭浇
</el-button>
- <el-button
- size="mini"
- type="danger"
- @click="handleRemoveAttachment(scope.$index)"
- >
- 鍒犻櫎
- </el-button>
</template>
</el-table-column>
</el-table>
@@ -204,7 +87,7 @@
class="el-icon-folder-opened"
style="font-size: 60px; color: #C0C4CC; margin-bottom: 20px;"
></i>
- <p style="color: #909399; font-size: 14px;">鏆傛棤闄勪欢锛岃涓婁紶鐩稿叧鏂囦欢</p>
+ <p style="color: #909399; font-size: 14px;">鏆傛棤闄勪欢</p>
</div>
</el-card>
@@ -212,27 +95,6 @@
<el-card class="expert-card">
<div slot="header" class="clearfix">
<span class="detail-title">涓撳瀹℃煡鎯呭喌</span>
- <div style="float: right;">
- <el-button size="mini" type="primary" @click="handleAddExpert">
- 娣诲姞涓撳
- </el-button>
- <el-button
- size="mini"
- type="primary"
- @click="handleSendToNormalExperts"
- :disabled="!canSendToNormalExperts"
- >
- 鍙戦�佷笓瀹�
- </el-button>
- <el-button
- size="mini"
- type="success"
- @click="handleSendToChiefExpert"
- :disabled="!canSendToChiefExpert"
- >
- 鍙戦�佷富濮斾笓瀹�
- </el-button>
- </div>
</div>
<!-- 涓撳缁熻淇℃伅 -->
@@ -348,7 +210,27 @@
<span v-else class="no-data">-</span>
</template>
</el-table-column>
-
+ <!-- 鍦�"瀹℃煡鏃堕棿"鍒楀悗闈㈡坊鍔�"鎵嬬闄勪欢"鍒� -->
+ <el-table-column label="鎵嬬闄勪欢" width="120" align="center">
+ <template slot-scope="scope">
+ <template v-if="scope.row.sigin">
+ <!-- 鏈夌鍚嶏紝鏄剧ず鍙偣鍑婚瑙堢殑鍥剧墖 -->
+ <el-button
+ type="text"
+ size="mini"
+ @click="handlePreviewSignature(scope.row.sigin)"
+ class="signature-preview-btn"
+ >
+ <i class="el-icon-picture" style="margin-right: 4px;"></i>
+ 鏌ョ湅绛惧悕
+ </el-button>
+ </template>
+ <template v-else>
+ <!-- 鏃犵鍚嶏紝鏄剧ず鏂滄潬 -->
+ <span class="no-signature">/</span>
+ </template>
+ </template>
+ </el-table-column>
<el-table-column label="瀹℃煡鎰忚" min-width="200" show-overflow-tooltip>
<template slot-scope="scope">
<span :class="{ 'expert-opinion': scope.row.expertopinion }">
@@ -390,246 +272,8 @@
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="180" align="center" fixed="right">
- <template slot-scope="scope">
- <el-button
- size="mini"
- type="text"
- icon="el-icon-s-promotion"
- @click="handleSendToExpert(scope.row)"
- :disabled="
- scope.row.receiveStatus == '2' ||
- scope.row.receiveStatus == '3' ||
- scope.row.receiveStatus == '4'
- "
- :class="{
- 'sent-button':
- scope.row.receiveStatus == '2' ||
- scope.row.receiveStatus == '3'
- }"
- >
- {{
- scope.row.receiveStatus == "2" || scope.row.receiveStatus == "3"
- ? "宸插彂閫�"
- : "鍙戦��"
- }}
- </el-button>
- <el-button
- v-if="scope.row.receiveStatus == 0"
- size="mini"
- type="text"
- icon="el-icon-delete"
- @click="handleDeleteExpertReview(scope.row, scope.$index)"
- style="color: #f56c6c;"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </el-table-column>
</el-table>
</el-card>
-
- <!-- 娣诲姞涓撳瀵硅瘽妗� -->
- <el-dialog
- title="娣诲姞涓撳"
- :visible.sync="expertDialogVisible"
- width="800px"
- @close="handleExpertDialogClose"
- >
- <div style="margin-bottom: 20px;">
- <el-input
- v-model="expertSearchQuery"
- placeholder="璇疯緭鍏ヤ笓瀹跺鍚嶆垨缂栧彿鎼滅储"
- style="width: 300px; margin-right: 10px;"
- @keyup.enter.native="handleSearchExperts"
- >
- <el-button
- slot="append"
- icon="el-icon-search"
- @click="handleSearchExperts"
- ></el-button>
- </el-input>
- <el-select
- v-model="filterExpertType"
- placeholder="涓撳绫诲瀷"
- style="width: 150px; margin-right: 10px;"
- @change="handleSearchExperts"
- >
- <el-option label="鍏ㄩ儴" value=""></el-option>
- <el-option label="鏅�氫笓瀹�" value="0"></el-option>
- <el-option label="涓讳换濮斿憳" value="1"></el-option>
- </el-select>
- <el-button type="primary" @click="handleSearchExperts">鎼滅储</el-button>
- <el-button @click="handleResetSearch">閲嶇疆</el-button>
- </div>
-
- <el-table
- :data="filteredExpertList"
- v-loading="expertListLoading"
- style="width: 100%"
- max-height="400"
- @selection-change="handleExpertSelectionChange"
- >
- <el-table-column type="selection" width="55"></el-table-column>
- <el-table-column
- label="涓撳濮撳悕"
- prop="username"
- width="120"
- ></el-table-column>
- <el-table-column
- label="涓撳缂栧彿"
- prop="userno"
- width="120"
- ></el-table-column>
- <el-table-column label="涓撳绫诲瀷" width="100">
- <template slot-scope="scope">
- <el-tag
- size="small"
- :type="getIsChiefExpert(scope.row) ? 'danger' : ''"
- >
- {{ getIsChiefExpert(scope.row) ? "涓讳换濮斿憳" : "鏅�氫笓瀹�" }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column
- label="鍗曚綅鍚嶇О"
- prop="unitname"
- show-overflow-tooltip
- ></el-table-column>
- <el-table-column
- label="鑱岀О"
- prop="title"
- width="100"
- ></el-table-column>
- <el-table-column
- label="鑱旂郴鐢佃瘽"
- prop="telephone"
- width="120"
- ></el-table-column>
- </el-table>
-
- <div style="margin-top: 20px; text-align: center;">
- <el-pagination
- @size-change="handlePageSizeChange"
- @current-change="handlePageChange"
- :current-page="expertPage.pageNum"
- :page-sizes="[10, 20, 50, 100]"
- :page-size="expertPage.pageSize"
- layout="total, sizes, prev, pager, next, jumper"
- :total="filteredExpertTotal"
- ></el-pagination>
- </div>
-
- <div slot="footer">
- <el-button @click="expertDialogVisible = false">鍙栨秷</el-button>
- <el-button
- type="primary"
- @click="handleConfirmAddExpert"
- :disabled="selectedExperts.length == 0"
- >纭畾娣诲姞</el-button
- >
- </div>
- </el-dialog>
-
- <!-- 鍙戦�佷笓瀹跺璇濇 -->
- <el-dialog
- :title="sendDialogTitle"
- :visible.sync="sendDialogVisible"
- width="500px"
- @close="handleSendDialogClose"
- >
- <el-form :model="sendForm" ref="sendForm" label-width="100px">
- <el-form-item label="涓撳绫诲瀷" prop="expertType">
- <el-radio-group
- v-model="sendForm.expertType"
- @change="handleExpertTypeChange"
- >
- <el-radio label="normal">鏅�氫笓瀹�</el-radio>
- <el-radio label="chief">涓诲涓撳</el-radio>
- </el-radio-group>
- </el-form-item>
-
- <el-form-item label="鍙戦�佹椂闂�" prop="startTime" required>
- <el-date-picker
- v-model="sendForm.startTime"
- type="datetime"
- placeholder="璇烽�夋嫨鍙戦�佹椂闂�"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
-
- <el-form-item
- label="鎴鏃堕棿"
- prop="endTime"
- :required="sendForm.expertType !== 'chief'"
- >
- <el-date-picker
- v-model="sendForm.endTime"
- type="datetime"
- placeholder="璇烽�夋嫨鎴鏃堕棿"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- :disabled="sendForm.expertType === 'chief'"
- />
- <div v-if="sendForm.expertType !== 'chief'" style="margin-top: 5px;">
- <el-button-group>
- <el-button size="mini" @click="setEndTime(0.5)"
- >鍗婂皬鏃跺悗</el-button
- >
- <el-button size="mini" @click="setEndTime(1)">涓�灏忔椂鍚�</el-button>
- <el-button size="mini" @click="setEndTime(2)">涓ゅ皬鏃跺悗</el-button>
- <el-button size="mini" @click="setEndTime(24)">涓�澶╁悗</el-button>
- </el-button-group>
- </div>
- <div
- v-if="sendForm.expertType === 'chief'"
- style="font-size: 12px; color: #999; margin-top: 5px;"
- >
- 涓诲涓撳鏃犻渶璁剧疆鎴鏃堕棿
- </div>
- </el-form-item>
-
- <el-form-item label="鍙戦�佹柟寮�" prop="sendType" required>
- <el-select
- v-model="sendForm.sendType"
- placeholder="璇烽�夋嫨鍙戦�佹柟寮�"
- style="width: 100%"
- >
- <el-option label="绯荤粺鍙戦��" value="0"></el-option>
- <el-option label="閭欢鍙戦��" value="1"></el-option>
- <el-option label="鐭俊鍙戦��" value="2"></el-option>
- <el-option label="鍏朵粬鏂瑰紡" value="3"></el-option>
- </el-select>
- </el-form-item>
-
- <el-form-item label="鍙戦�佹爣棰�" prop="title" required>
- <el-input v-model="sendForm.title" placeholder="璇疯緭鍏ュ彂閫佹爣棰�" />
- </el-form-item>
-
- <el-form-item label="鍙戦�佸唴瀹�" prop="content" required>
- <el-input
- type="textarea"
- :rows="4"
- v-model="sendForm.content"
- placeholder="璇疯緭鍏ュ彂閫佺粰涓撳鐨勫鏌ュ唴瀹硅鏄�"
- />
- </el-form-item>
-
- <el-form-item label="璺宠浆閾炬帴" prop="url">
- <el-input
- v-model="sendForm.url"
- placeholder="璇疯緭鍏ヨ烦杞摼鎺ワ紙鍙�夛級"
- />
- </el-form-item>
- </el-form>
- <div slot="footer">
- <el-button @click="sendDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleSendConfirm" :loading="sending"
- >纭鍙戦��</el-button
- >
- </div>
- </el-dialog>
<!-- 涓撳鍘嗗彶瀹℃壒鎯呭喌瀵硅瘽妗� -->
<el-dialog
@@ -757,22 +401,24 @@
<script>
import { getToken } from "@/utils/auth";
import {
- ethicalreviewgetInfoID,
+ reviewinitiateBaseInfoList,
ethicalreviewedit,
ethicalreviewadd,
ethicalreviewInfo,
ethicalreExpertTotal,
- sendNotification
+ sendNotification,
+ sendcall
} from "@/api/businessApi";
import { listExternalperson } from "@/api/project/externalperson";
import CaseBasicInfo from "@/components/CaseBasicInfo";
-import UploadAttachment from "@/components/UploadAttachment";
import FilePreviewDialog from "@/components/FilePreviewDialog";
import dayjs from "dayjs";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
export default {
name: "EthicsReviewDetail",
- components: { CaseBasicInfo, UploadAttachment, FilePreviewDialog },
+ components: { CaseBasicInfo, FilePreviewDialog },
+ mixins: [readonlyDescriptionsMixin],
dicts: ["sys_user_sex", "sys_ethical", "Review_status"],
props: {
infoid: {
@@ -861,7 +507,17 @@
{ max: 500, message: "闀垮害涓嶈兘瓒呰繃 500 涓瓧绗�", trigger: "blur" }
]
},
-
+ sending: false, // 鍗曚釜鍙戦�佺姸鎬�
+ sendingAll: false, // 鍏ㄥ眬鍙戦�佺姸鎬�
+ sendingProgress: 0, // 鍙戦�佽繘搴�
+ sendingTotal: 0, // 鎬诲彂閫佹暟
+ sendingSuccessCount: 0, // 鎴愬姛鏁�
+ sendingFailCount: 0, // 澶辫触鏁�
+ sendingResults: [], // 鍙戦�佺粨鏋滃垪琛�
+ originalFormData: null, // 鍘熷琛ㄥ崟鏁版嵁
+ originalExpertList: null, // 鍘熷涓撳鍒楄〃
+ originalAttachments: null, // 鍘熷闄勪欢鍒楄〃
+ isDataLoaded: false, // 鏁版嵁鏄惁宸插姞杞�
// 淇濆瓨鍔犺浇鐘舵��
saveLoading: false,
completeLoading: false,
@@ -902,7 +558,6 @@
startTime: "",
endTime: "",
sendType: "0",
- title: "浼︾悊瀹℃煡浠诲姟閫氱煡",
content: "",
url: ""
},
@@ -923,17 +578,23 @@
return this.form.ethicalreviewopinionsList || [];
},
+ // 浼︾悊瀹℃煡缁撹鏂囨湰锛堝彧璇诲睍绀猴級
+ expertConclusionLabel() {
+ const map = { 0: "涓嶅悓鎰�", 1: "鍚屾剰", 2: "瀹℃煡涓�" };
+ return map[this.form.expertConclusion] || "-";
+ },
+
// 璁$畻灞炴�э細鏅�氫笓瀹舵暟閲�
normalExpertsCount() {
return this.ethicalreviewopinionsList.filter(
- expert => expert.expertType === "0"
+ expert => expert.expertType == "0"
).length;
},
// 璁$畻灞炴�э細涓诲涓撳鏁伴噺
chiefExpertsCount() {
return this.ethicalreviewopinionsList.filter(
- expert => expert.expertType === "1"
+ expert => expert.expertType == "1"
).length;
},
@@ -945,7 +606,7 @@
// 璁$畻灞炴�э細宸插悓鎰忎笓瀹舵暟閲�
approvedExpertsCount() {
return this.ethicalreviewopinionsList.filter(
- expert => expert.expertconclusion === "1"
+ expert => expert.expertconclusion == "1"
).length;
},
@@ -954,7 +615,7 @@
const total = this.totalExpertsCount;
const approved = this.approvedExpertsCount;
- if (total === 0) return "鏈鏌�";
+ if (total == 0) return "鏈鏌�";
if (approved >= Math.ceil(total * 0.7)) {
// 瓒呰繃70%鍚屾剰
return "閫氳繃";
@@ -970,7 +631,7 @@
const total = this.totalExpertsCount;
const approved = this.approvedExpertsCount;
- if (total === 0) return "info";
+ if (total == 0) return "info";
if (approved >= Math.ceil(total * 0.7)) {
return "success";
} else if (approved >= Math.ceil(total * 0.5)) {
@@ -984,10 +645,10 @@
availableNormalExperts() {
return this.ethicalreviewopinionsList.filter(
expert =>
- expert.expertType === "0" &&
+ expert.expertType == "0" &&
(!expert.receiveStatus ||
- expert.receiveStatus === "0" ||
- expert.receiveStatus === "1")
+ expert.receiveStatus == "0" ||
+ expert.receiveStatus == "1")
);
},
@@ -995,10 +656,10 @@
availableChiefExperts() {
return this.ethicalreviewopinionsList.filter(
expert =>
- expert.expertType === "1" &&
+ expert.expertType == "1" &&
(!expert.receiveStatus ||
- expert.receiveStatus === "0" ||
- expert.receiveStatus === "1")
+ expert.receiveStatus == "0" ||
+ expert.receiveStatus == "1")
);
},
@@ -1010,7 +671,7 @@
// 鏄惁鍙互鍙戦�佺粰涓诲涓撳锛堥渶瑕佽嚦灏�12涓櫘閫氫笓瀹跺悓鎰忥級
canSendToChiefExpert() {
const normalApprovedCount = this.ethicalreviewopinionsList.filter(
- expert => expert.expertType === "0" && expert.expertconclusion === "1"
+ expert => expert.expertType == "0" && expert.expertconclusion == "1"
).length;
return this.availableChiefExperts.length > 0 && normalApprovedCount >= 12;
},
@@ -1061,9 +722,9 @@
// 鍙戦�佸璇濇鏍囬
sendDialogTitle() {
- if (this.sendForm.expertType === "chief") {
+ if (this.sendForm.expertType == "chief") {
return "鍙戦�佷富濮斾笓瀹跺鏌�";
- } else if (this.sendForm.expertType === "normal") {
+ } else if (this.sendForm.expertType == "normal") {
return "鍙戦�佹櫘閫氫笓瀹跺鏌�";
} else {
return "鍙戦�佷笓瀹跺鏌�";
@@ -1080,8 +741,15 @@
}
},
created() {
+ this.infoid = this.infoid;
this.caseId = this.infoid;
this.getDetail(this.infoid, this.id);
+ // 鐩戝惉璺敱鍙樺寲锛岄槻姝㈢敤鎴风寮�椤甸潰
+ window.addEventListener("beforeunload", this.beforeUnloadHandler);
+ },
+ beforeDestroy() {
+ // 绉婚櫎浜嬩欢鐩戝惉鍣�
+ window.removeEventListener("beforeunload", this.beforeUnloadHandler);
},
methods: {
// 鍒濆鍖栨柊澧炴暟鎹�
@@ -1104,36 +772,47 @@
if (id) {
response = await ethicalreviewInfo(id);
} else if (infoid) {
- response = await ethicalreviewgetInfoID({ InfoId: infoid });
+ response = await reviewinitiateBaseInfoList({ infoid: infoid });
+ if (response.data[0].id) {
+ this.id = response.data[0].id;
+ response = await ethicalreviewInfo(this.id);
+ }
}
- if (response.code === 200) {
+ if (
+ !response.data.status ||
+ response.data.status == 0 ||
+ response.data.status == 1
+ ) {
+ response.data.status = "2";
+ }
+ if (response.code == 200) {
let detailData = {};
- if (response.data && id) {
+ if (response.data && this.id) {
this.form = response.data;
// 瑙f瀽 filePatch 瀛楁
this.parseFilePatch(this.form.filePatch);
this.initAttachmentFileList();
- // 濡傛灉涓撳瀹℃煡鎰忚鍒楄〃涓嶅瓨鍦紝鍒濆鍖栦负绌烘暟缁�
if (!this.form.ethicalreviewopinionsList) {
this.$set(this.form, "ethicalreviewopinionsList", []);
}
- } else if (response.data && infoid) {
- this.form = response.data;
- // 瑙f瀽 filePatch 瀛楁
+ } else if (response.data && this.infoid) {
+ this.form = response.data[0];
this.parseFilePatch(this.form.filePatch);
this.initAttachmentFileList();
- // 濡傛灉涓撳瀹℃煡鎰忚鍒楄〃涓嶅瓨鍦紝鍒濆鍖栦负绌烘暟缁�
if (!this.form.ethicalreviewopinionsList) {
this.$set(this.form, "ethicalreviewopinionsList", []);
}
}
- // 璁剧疆 expertReviews 鐢ㄤ簬琛ㄦ牸鏄剧ず
+ // 淇濆瓨鍘熷鏁版嵁鐢ㄤ簬姣旇緝
+ this.saveOriginalData();
+
this.expertReviews = this.form.ethicalreviewopinionsList;
+ this.isDataLoaded = true;
this.$message.success("鏁版嵁鍔犺浇鎴愬姛");
} else {
@@ -1145,6 +824,22 @@
} finally {
this.expertLoading = false;
}
+ },
+
+ // 淇濆瓨鍘熷鏁版嵁
+ saveOriginalData() {
+ // 娣辨嫹璐濊〃鍗曟暟鎹�
+ this.originalFormData = JSON.parse(JSON.stringify(this.form));
+
+ // 娣辨嫹璐濅笓瀹跺垪琛�
+ this.originalExpertList = this.form.ethicalreviewopinionsList
+ ? JSON.parse(JSON.stringify(this.form.ethicalreviewopinionsList))
+ : [];
+
+ // 娣辨嫹璐濋檮浠跺垪琛�
+ this.originalAttachments = this.form.annexfilesList
+ ? JSON.parse(JSON.stringify(this.form.annexfilesList))
+ : [];
},
// 瑙f瀽 filePatch 瀛楁
@@ -1182,7 +877,7 @@
// 鏋勫缓 filePatch 瀛楁
buildFilePatch() {
- if (!this.form.annexfilesList || this.form.annexfilesList.length === 0) {
+ if (!this.form.annexfilesList || this.form.annexfilesList.length == 0) {
return "";
}
return JSON.stringify(this.form.annexfilesList);
@@ -1197,7 +892,7 @@
handleAttachmentRemove(file) {
if (file.url) {
const index = this.form.annexfilesList.findIndex(
- item => item.path === file.url || item.fileUrl === file.url
+ item => item.path == file.url || item.fileUrl == file.url
);
if (index > -1) {
this.form.annexfilesList.splice(index, 1);
@@ -1214,7 +909,7 @@
// 涓婁紶鎴愬姛澶勭悊
handleUploadSuccess({ file, fileList, response }) {
- if (response.code === 200) {
+ if (response.code == 200) {
const attachmentObj = {
fileName: file.name,
path: response.data || file.url,
@@ -1238,10 +933,23 @@
// 鏂囦欢棰勮
handlePreview(file) {
+ console.log(file, "file");
+
this.currentPreviewFile = {
fileName: file.fileName,
fileUrl: file.path || file.fileUrl,
fileType: this.getFileType(file.fileName)
+ };
+ this.previewVisible = true;
+ },
+ // 鏂囦欢棰勮
+ handlePreviewSignature(file) {
+ console.log(file, "file");
+
+ this.currentPreviewFile = {
+ fileName: file,
+ fileUrl: file,
+ fileType: "png"
};
this.previewVisible = true;
},
@@ -1317,13 +1025,13 @@
// 鑱岀О鍖呭惈"涓讳换濮斿憳"鎴栬�卐xpertType涓�"1"
return (
(expert.title && expert.title.includes("涓讳换濮斿憳")) ||
- expert.expertType === "1"
+ expert.expertType == "1"
);
},
// 涓撳绫诲瀷鏂囨湰杞崲
getExpertTypeText(type) {
- return type === "1" ? "涓诲涓撳" : "鏅�氫笓瀹�";
+ return type == "1" ? "涓诲涓撳" : "鏅�氫笓瀹�";
},
// 瀹℃煡鐘舵�佽繃婊ゅ櫒
@@ -1372,7 +1080,7 @@
// 涓撳琛屾牱寮�
getExpertRowClassName({ row }) {
- return row.expertType === "1" ? "chief-expert-row" : "normal-expert-row";
+ return row.expertType == "1" ? "chief-expert-row" : "normal-expert-row";
},
// 鑾峰彇涓撳鍞竴鏍囪瘑
@@ -1382,7 +1090,7 @@
// 涓撳绫诲瀷鍙樻洿澶勭悊
handleExpertTypeChange() {
- if (this.sendForm.expertType === "chief") {
+ if (this.sendForm.expertType == "chief") {
// 涓诲涓撳鏃犻渶璁剧疆鎴鏃堕棿
this.sendForm.endTime = "";
} else {
@@ -1407,9 +1115,9 @@
if (valid) {
this.saveLoading = true;
// 淇濆瓨娓呯┖id渚夸簬鍚庣鏁翠綋鍒犻櫎鏂板
- this.form.ethicalreviewopinionsList.forEach(item => {
- item.id = null;
- });
+ // this.form.ethicalreviewopinionsList.forEach(item => {
+ // item.id = null;
+ // });
try {
const submitData = {
...this.form,
@@ -1428,15 +1136,19 @@
response = await ethicalreviewadd(submitData);
}
- if (response.code === 200) {
+ if (response.code == 200) {
this.$message.success("淇濆瓨鎴愬姛");
+ // 淇濆瓨鎴愬姛鍚庢洿鏂板師濮嬫暟鎹�
+ this.saveOriginalData();
this.isEdit = false;
- if (!this.form.id && response.data && response.data.id) {
- this.form.id = response.data.id;
- this.$router.replace({
- query: { ...this.$route.query, id: this.form.id }
- });
+ if (!this.form.id && response.data) {
+ this.form.id = response.data;
+ this.id = this.form.id;
+ // this.$router.replace({
+ // query: { ...this.$route.query, id: this.form.id }
+ // });
}
+ this.refreshPageData();
} else {
this.$message.error("淇濆瓨澶辫触锛�" + (response.msg || "鏈煡閿欒"));
}
@@ -1471,7 +1183,7 @@
const response = await ethicalreviewedit(updateData);
- if (response.code === 200) {
+ if (response.code == 200) {
this.$message.success("瀹℃煡鐘舵�佸凡鏇存柊涓哄畬鎴�");
this.form.status = "3";
this.form.endTime = updateData.endTime;
@@ -1523,7 +1235,7 @@
const response = await ethicalreviewedit(updateData);
- if (response.code === 200) {
+ if (response.code == 200) {
this.$message.success("瀹℃煡宸蹭腑姝紝鎵�鏈変笓瀹剁姸鎬佸凡鏇存柊");
this.form.status = "2";
} else {
@@ -1555,7 +1267,7 @@
try {
const updateData = {
...this.form,
- status: "2", // 瀹℃煡涓
+ status: "4", // 瀹℃煡涓
endTime: new Date()
.toISOString()
.replace("T", " ")
@@ -1564,9 +1276,9 @@
const response = await ethicalreviewedit(updateData);
- if (response.code === 200) {
+ if (response.code == 200) {
this.$message.success("瀹℃煡宸茬粨鏉�");
- this.form.status = "2";
+ this.form.status = "4";
this.form.endTime = updateData.endTime;
} else {
this.$message.error("鎿嶄綔澶辫触锛�" + (response.msg || "鏈煡閿欒"));
@@ -1586,13 +1298,255 @@
this.expertDialogVisible = true;
this.loadExperts();
},
+ /**
+ * 鍒锋柊椤甸潰鏁版嵁
+ */
+ async refreshPageData() {
+ try {
+ // 閲嶇疆鏁版嵁鐘舵��
+ this.isDataLoaded = false;
+ // 娓呯┖褰撳墠鏁版嵁
+ this.form = {
+ id: undefined,
+ infoid: undefined,
+ caseNo: "",
+ initiateTheme: "",
+ initiatePerson: "",
+ status: "0",
+ startTime: "",
+ cutOffTime: "",
+ endTime: "",
+ expertName: "",
+ expertNo: "",
+ expertType: "0",
+ expertConclusion: "",
+ expertOpinion: "",
+ expertTime: "",
+ orderNo: 1,
+ remark: "",
+ annexfilesList: [],
+ filePatch: "",
+ ethicalreviewopinionsList: [],
+ createBy: "",
+ createTime: "",
+ updateBy: "",
+ updateTime: "",
+ delFlag: "0"
+ };
+
+ this.attachmentFileList = [];
+ this.originalFormData = null;
+ this.originalExpertList = null;
+ this.originalAttachments = null;
+
+ // 閲嶆柊鑾峰彇鏁版嵁
+ if (this.id) {
+ await this.getDetail(this.infoid, this.id);
+ } else if (this.infoid) {
+ await this.getDetail(this.infoid, null);
+ } else {
+ this.$message.warning("鏃犳硶鍒锋柊锛岀己灏戝繀瑕佺殑鍙傛暟");
+ }
+
+ this.$message.success("鏁版嵁鍒锋柊鎴愬姛");
+ } catch (error) {
+ console.error("鍒锋柊鏁版嵁澶辫触:", error);
+ this.$message.error("鍒锋柊鏁版嵁澶辫触锛岃閲嶈瘯");
+ }
+ },
+
+ /**
+ * 澶勭悊椤甸潰鍒锋柊
+ * 妫�鏌ユ槸鍚︽湁鏈繚瀛樻暟鎹紝纭鍚庡埛鏂伴〉闈�
+ */
+ handleRefresh() {
+ // 妫�鏌ユ槸鍚︽湁鏈繚瀛樼殑缂栬緫
+ if (this.hasUnsavedChanges()) {
+ this.$confirm(
+ "褰撳墠鏈夋湭淇濆瓨鐨勬暟鎹紝鍒锋柊椤甸潰灏嗕涪澶辫繖浜涙洿鏀广�傛槸鍚︾户缁埛鏂帮紵",
+ "璀﹀憡",
+ {
+ confirmButtonText: "缁х画鍒锋柊",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ distinguishCancelAndClose: true,
+ beforeClose: (action, instance, done) => {
+ if (action === "confirm") {
+ instance.confirmButtonLoading = true;
+ instance.confirmButtonText = "鍒锋柊涓�...";
+
+ // 寤惰繜鎵ц浠ョ‘淇漊I鏇存柊
+ setTimeout(() => {
+ done();
+ instance.confirmButtonLoading = false;
+
+ // 鐢ㄦ埛纭鍒锋柊
+ this.refreshPageData();
+ }, 300);
+ } else {
+ this.$message({
+ type: "info",
+ message: "宸插彇娑堝埛鏂�"
+ });
+ done();
+ }
+ }
+ }
+ ).catch(action => {
+ if (action === "cancel") {
+ this.$message({
+ type: "info",
+ message: "宸插彇娑堝埛鏂�"
+ });
+ }
+ });
+ } else {
+ // 娌℃湁鏈繚瀛樼殑缂栬緫锛岀洿鎺ュ埛鏂�
+ this.refreshPageData();
+ }
+ },
+ // 妫�鏌ユ槸鍚︽湁鏈繚瀛樼殑鏁版嵁鍙樺寲
+ hasUnsavedChanges() {
+ if (!this.isDataLoaded) {
+ return false; // 鏁版嵁鏈姞杞斤紝鏃犻渶妫�娴�
+ }
+
+ // 1. 妫�鏌ヨ〃鍗曞瓧娈靛彉鍖�
+ const formFieldsChanged = this.checkFormFieldsChanged();
+
+ // 2. 妫�鏌ヤ笓瀹跺垪琛ㄥ彉鍖�
+ const expertListChanged = this.checkExpertListChanged();
+
+ // 3. 妫�鏌ラ檮浠跺垪琛ㄥ彉鍖�
+ const attachmentsChanged = this.checkAttachmentsChanged();
+
+ return formFieldsChanged || expertListChanged || attachmentsChanged;
+ },
+
+ // 妫�鏌ヨ〃鍗曞瓧娈垫槸鍚︽湁鍙樺寲
+ checkFormFieldsChanged() {
+ if (!this.originalFormData) return false;
+
+ const formKeys = [
+ "initiateTheme",
+ "initiatePerson",
+ "status",
+ "expertConclusion",
+ "expertOpinion",
+ "expertTime",
+ "remark"
+ ];
+
+ for (const key of formKeys) {
+ if (this.form[key] !== this.originalFormData[key]) {
+ console.log(
+ `琛ㄥ崟瀛楁鍙樺寲: ${key}`,
+ this.form[key],
+ this.originalFormData[key]
+ );
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ // 妫�鏌ヤ笓瀹跺垪琛ㄥ彉鍖�
+ checkExpertListChanged() {
+ if (!this.originalExpertList || !this.form.ethicalreviewopinionsList) {
+ return false;
+ }
+
+ const original = this.originalExpertList;
+ const current = this.form.ethicalreviewopinionsList;
+
+ // 1. 妫�鏌ユ暟閲忓彉鍖�
+ if (original.length !== current.length) {
+ console.log("涓撳鏁伴噺鍙樺寲:", original.length, "->", current.length);
+ return true;
+ }
+
+ // 2. 妫�鏌ユ瘡涓笓瀹剁殑鍙樺寲
+ for (let i = 0; i < original.length; i++) {
+ const origExpert = original[i];
+ const currExpert = current[i];
+
+ // 妫�鏌ュ叧閿瓧娈靛彉鍖�
+ const fieldsToCheck = [
+ "expertconclusion",
+ "expertopinion",
+ "receiveStatus",
+ "conclusiontime",
+ "startTime",
+ "endTime",
+ "sendType"
+ ];
+
+ for (const field of fieldsToCheck) {
+ if (origExpert[field] !== currExpert[field]) {
+ console.log(
+ `涓撳${i}鐨�${field}瀛楁鍙樺寲:`,
+ origExpert[field],
+ "->",
+ currExpert[field]
+ );
+ return true;
+ }
+ }
+ }
+
+ return false;
+ },
+
+ // 妫�鏌ラ檮浠跺垪琛ㄥ彉鍖�
+ checkAttachmentsChanged() {
+ if (!this.originalAttachments || !this.form.annexfilesList) {
+ return false;
+ }
+
+ const original = this.originalAttachments;
+ const current = this.form.annexfilesList;
+
+ // 妫�鏌ユ暟閲忓彉鍖�
+ if (original.length !== current.length) {
+ console.log("闄勪欢鏁伴噺鍙樺寲:", original.length, "->", current.length);
+ return true;
+ }
+
+ // 妫�鏌ユ枃浠跺悕鍙樺寲锛堥�氬父闄勪欢涓嶄細淇敼锛屽彧澧炲垹锛�
+ const originalFileNames = original.map(f => f.fileName || f.name).sort();
+ const currentFileNames = current.map(f => f.fileName || f.name).sort();
+
+ for (let i = 0; i < originalFileNames.length; i++) {
+ if (originalFileNames[i] !== currentFileNames[i]) {
+ console.log(
+ "闄勪欢鏂囦欢鍚嶅彉鍖�:",
+ originalFileNames[i],
+ "->",
+ currentFileNames[i]
+ );
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ // 娴忚鍣ㄧ寮�椤甸潰妫�娴�
+ beforeUnloadHandler(event) {
+ if (this.hasUnsavedChanges()) {
+ const message = "鎮ㄦ湁鏈繚瀛樼殑鏇存敼锛岀‘瀹氳绂诲紑鍚楋紵";
+ event.returnValue = message; // 鏍囧噯鏂瑰紡
+ return message; // 鏌愪簺娴忚鍣ㄩ渶瑕佽繑鍥炲瓧绗︿覆
+ }
+ },
// 鍔犺浇涓撳鍒楄〃
async loadExperts() {
try {
this.expertListLoading = true;
const params = {
- usertype: "浼︾悊涓撳", // 浼︾悊涓撳
+ usertype: "ethical", // 浼︾悊涓撳
pageNum: this.expertPage.pageNum,
pageSize: this.expertPage.pageSize
};
@@ -1602,7 +1556,7 @@
}
const response = await listExternalperson(params);
- if (response.code === 200) {
+ if (response.code == 200) {
this.expertList = response.rows || [];
this.expertTotal = response.total || 0;
} else {
@@ -1639,7 +1593,7 @@
// 纭娣诲姞涓撳
handleConfirmAddExpert() {
- if (this.selectedExperts.length === 0) {
+ if (this.selectedExperts.length == 0) {
this.$message.warning("璇烽�夋嫨瑕佹坊鍔犵殑涓撳");
return;
}
@@ -1664,7 +1618,7 @@
expertType: isChief ? "1" : "0", // 涓讳换濮斿憳璁剧疆涓轰富濮斾笓瀹�
deptName: expert.unitname || "",
title: expert.title || "",
- deptname: expert.telephone || "",
+ donorno: expert.telephone || "",
receiveStatus: "0", // 寰呮帴鏀�
expertconclusion: "",
expertopinion: "",
@@ -1719,6 +1673,9 @@
// 鍙戦�佺粰鏅�氫笓瀹�
handleSendToNormalExperts() {
+ if (!this.validateAllIds(this.ethicalreviewopinionsList)) {
+ return;
+ }
this.currentSendExperts = this.availableNormalExperts;
this.sendForm.expertType = "normal";
this.sendForm.endTime = ""; // 閲嶇疆鎴鏃堕棿
@@ -1727,6 +1684,9 @@
// 鍙戦�佺粰涓诲涓撳
handleSendToChiefExpert() {
+ if (!this.validateAllIds(this.ethicalreviewopinionsList)) {
+ return;
+ }
this.currentSendExperts = this.availableChiefExperts;
this.sendForm.expertType = "chief";
this.sendForm.endTime = ""; // 涓诲涓撳鏃犻渶鎴鏃堕棿
@@ -1735,12 +1695,40 @@
// 鍙戦�佺粰鍗曚釜涓撳
handleSendToExpert(expert) {
+ if (!this.validateAllIds(this.ethicalreviewopinionsList)) {
+ return;
+ }
this.currentSendExperts = [expert];
- this.sendForm.expertType = expert.expertType === "1" ? "chief" : "normal";
- this.sendForm.endTime = expert.expertType === "1" ? "" : ""; // 涓诲涓撳鏃犻渶鎴鏃堕棿
+ this.sendForm.expertType = expert.expertType == "1" ? "chief" : "normal";
+ this.sendForm.endTime = expert.expertType == "1" ? "" : ""; // 涓诲涓撳鏃犻渶鎴鏃堕棿
this.sendDialogVisible = true;
},
+ validateAllIds(arr, idField = "id") {
+ if (!Array.isArray(arr) || arr.length === 0) {
+ this.$message.warning("璇峰厛閫夋嫨涓撳鍒楄〃");
+ return false;
+ }
+
+ const emptyIdItems = arr.filter(item => {
+ const id = item[idField];
+ return (
+ id === undefined ||
+ id === null ||
+ id === "" ||
+ id.toString().trim() === ""
+ );
+ });
+
+ if (emptyIdItems.length > 0) {
+ this.$message.warning(
+ "褰撳墠閫変腑涓撳鍒楄〃鏈夋湭淇濆瓨鏁版嵁锛岃淇濆瓨鍒锋柊鍚庡啀鍙戦��"
+ );
+ return false;
+ }
+
+ return true;
+ },
// 鍙戦�佸璇濇鍏抽棴
handleSendDialogClose() {
this.sendForm = {
@@ -1749,7 +1737,6 @@
startTime: "",
endTime: "",
sendType: "0",
- title: "浼︾悊瀹℃煡浠诲姟閫氱煡",
content: "",
url: ""
};
@@ -1769,55 +1756,67 @@
return;
}
- if (!this.sendForm.sendType) {
- this.$message.warning("璇烽�夋嫨鍙戦�佹柟寮�");
- return;
- }
+ // if (!this.sendForm.sendType) {
+ // this.$message.warning("璇烽�夋嫨鍙戦�佹柟寮�");
+ // return;
+ // }
- if (!this.sendForm.title) {
- this.$message.warning("璇疯緭鍏ュ彂閫佹爣棰�");
- return;
- }
+ // if (!this.sendForm.title) {
+ // this.$message.warning("璇疯緭鍏ュ彂閫佹爣棰�");
+ // return;
+ // }
- if (!this.sendForm.content) {
- this.$message.warning("璇疯緭鍏ュ彂閫佸唴瀹�");
- return;
- }
+ // if (!this.sendForm.content) {
+ // this.$message.warning("璇疯緭鍏ュ彂閫佸唴瀹�");
+ // return;
+ // }
- if (this.currentSendExperts.length === 0) {
+ if (this.currentSendExperts.length == 0) {
this.$message.warning("娌℃湁鎵惧埌鍙彂閫佺殑涓撳");
return;
}
- this.sending = true;
+ // 鍒濆鍖栧彂閫佺姸鎬�
+ this.sendingAll = true;
+ this.sendingProgress = 0;
+ this.sendingTotal = this.currentSendExperts.length;
+ this.sendingSuccessCount = 0;
+ this.sendingFailCount = 0;
+ this.sendingResults = [];
+
+ // 鍒涘缓涓�涓繘搴﹀璇濇
+ const progressDialog = this.$message({
+ type: "info",
+ message: `姝e湪鍙戦�侀�氱煡锛岃绋嶅��... (0/${this.sendingTotal})`,
+ duration: 0, // 涓嶄細鑷姩鍏抽棴
+ showClose: true
+ });
+
try {
- // 鍙戦�佺粰姣忎釜涓撳
- const sendPromises = this.currentSendExperts.map(async expert => {
+ // 浣跨敤Promise鏁扮粍鏉ラ『搴忔墽琛屽彂閫�
+ for (let i = 0; i < this.currentSendExperts.length; i++) {
+ const expert = this.currentSendExperts[i];
+
+ // 鏇存柊杩涘害
+ this.sendingProgress = i;
+ progressDialog.message = `姝e湪鍙戦�侀�氱煡锛岃绋嶅��... (${i}/${this.sendingTotal})`;
+
try {
- // 鏋勫缓鍙戦�佹暟鎹�
- const sendData = {
- number: expert.deptname || "", // 鐢ㄦ埛鎵嬫満鍙�
- title: this.sendForm.title,
- url: this.sendForm.url || "",
+ // 鍙戦�佸崟涓笓瀹堕�氱煡
+ const result = await this.sendSingleExpert(expert, i);
+ this.sendingResults.push(result);
- createTime: new Date()
- .toISOString()
- .replace("T", " ")
- .substring(0, 19)
- };
+ if (result.success) {
+ this.sendingSuccessCount++;
- // 璋冪敤鍙戦�侀�氱煡鎺ュ彛
- const response = await sendNotification(sendData);
-
- if (response.code === 200) {
// 鏇存柊涓撳鐘舵��
const index = this.form.ethicalreviewopinionsList.findIndex(
e =>
- e.expertNo === expert.expertNo ||
- e.expertname === expert.expertname
+ e.expertNo == expert.expertNo ||
+ e.expertname == expert.expertname
);
- if (index !== -1) {
+ if (index != -1) {
this.form.ethicalreviewopinionsList[index].receiveStatus = "1"; // 宸叉帴鏀�
this.form.ethicalreviewopinionsList[
index
@@ -1842,42 +1841,49 @@
this.form.ethicalreviewopinionsList[index]
);
}
-
- return { success: true, expert: expert.expertname };
} else {
- return {
- success: false,
- expert: expert.expertname,
- error: response.msg
- };
+ this.sendingFailCount++;
}
} catch (error) {
console.error(`鍙戦�佺粰涓撳 ${expert.expertname} 澶辫触:`, error);
- return {
+ this.sendingResults.push({
success: false,
expert: expert.expertname,
error: error.message
- };
+ });
+ this.sendingFailCount++;
}
- });
- // 绛夊緟鎵�鏈夊彂閫佸畬鎴�
- const results = await Promise.all(sendPromises);
-
- // 缁熻鍙戦�佺粨鏋�
- const successCount = results.filter(r => r.success).length;
- const failCount = results.filter(r => !r.success).length;
-
- if (failCount === 0) {
- this.$message.success(`鎴愬姛鍙戦�佺粰 ${successCount} 浣嶄笓瀹禶);
- } else if (successCount > 0) {
- this.$message.warning(
- `鎴愬姛鍙戦�佺粰 ${successCount} 浣嶄笓瀹讹紝澶辫触 ${failCount} 浣峘
- );
- } else {
- this.$message.error("鍙戦�佸け璐ワ紝璇风◢鍚庨噸璇�");
+ // 濡傛灉涓嶆槸鏈�鍚庝竴涓紝绛夊緟100ms鍐嶅彂閫佷笅涓�涓�
+ if (i < this.currentSendExperts.length - 1) {
+ await this.sleep(100);
+ }
}
+ // 瀹屾垚杩涘害
+ this.sendingProgress = this.sendingTotal;
+ progressDialog.message = `鍙戦�佸畬鎴愶紝鎴愬姛 ${this.sendingSuccessCount} 涓紝澶辫触 ${this.sendingFailCount} 涓猔;
+
+ // 寤惰繜1绉掑悗鍏抽棴杩涘害瀵硅瘽妗�
+ await this.sleep(1000);
+ progressDialog.close();
+
+ // 鏄剧ず鏈�缁堢粨鏋�
+ if (this.sendingFailCount == 0) {
+ this.$message.success(
+ `鎴愬姛鍙戦�佺粰 ${this.sendingSuccessCount} 浣嶄笓瀹禶
+ );
+ } else if (this.sendingSuccessCount > 0) {
+ this.$message.warning(
+ `鎴愬姛鍙戦�佺粰 ${this.sendingSuccessCount} 浣嶄笓瀹讹紝澶辫触 ${this.sendingFailCount} 浣峘
+ );
+ // 濡傛灉鏈夊け璐ワ紝鍙互鏄剧ず璇︾粏澶辫触淇℃伅
+ this.showFailedDetails();
+ } else {
+ this.$message.error("鍏ㄩ儴鍙戦�佸け璐ワ紝璇风◢鍚庨噸璇�");
+ }
+
+ // 鍏抽棴鍙戦�佸璇濇
this.sendDialogVisible = false;
this.sendForm = {
expertType: "normal",
@@ -1885,19 +1891,111 @@
startTime: "",
endTime: "",
sendType: "0",
- title: "浼︾悊瀹℃煡浠诲姟閫氱煡",
content: "",
url: ""
};
this.currentSendExperts = [];
+ // 淇濆瓨鏁翠釜鍗曟嵁
+ this.handleSave();
} catch (error) {
- console.error("鍙戦�佸け璐�:", error);
- this.$message.error("鍙戦�佸け璐ワ紝璇烽噸璇�");
+ console.error("鍙戦�佽繃绋嬩腑鍙戠敓閿欒:", error);
+ progressDialog.close();
+ this.$message.error("鍙戦�佽繃绋嬩腑鍙戠敓閿欒锛岃閲嶈瘯");
} finally {
- this.sending = false;
+ this.sendingAll = false;
+ }
+ },
+ // 鍙戦�佸崟涓笓瀹剁殑鏂规硶
+ async sendSingleExpert(expert, index) {
+ console.log(expert, "expert", index);
+
+ try {
+ // // 鏋勫缓鍙戦�佹暟鎹�
+ // const sendData = {
+ // number: expert.deptname || "", // 鐢ㄦ埛鎵嬫満鍙�
+ // title: this.sendForm.title,
+ // url: this.sendForm.url || "",
+ // createTime: new Date()
+ // .toISOString()
+ // .replace("T", " ")
+ // .substring(0, 19)
+ // };
+ const sendDatas = {
+ expertNo: expert.donorno || "", //7.14
+ id: expert.id || "",
+ infoId: this.infoid || ""
+ };
+
+ console.log(`姝e湪鍙戦�佺 ${index + 1} 涓笓瀹�: ${expert.expertname}`);
+
+ // 璋冪敤鍙戦�侀�氱煡鎺ュ彛
+ // const response = await sendNotification(sendData);
+ // const response = await sendcall({
+ // tel: expert.donorno ? expert.donorno : 13634195431, // 杩欓噷搴旇鏄� expert.deptname 鎴� expert.phone
+ // messageContent:
+ // "闈掑矝澶у闄勫睘鍖婚櫌涓婃姤娼滃湪鎹愮尞妗堜緥锛岃鐧诲綍OPO绯荤粺鏌ョ湅璇︾粏淇℃伅锛屽強鏃惰繘琛屽鎺ャ�傜櫥褰曢摼鎺�:https://brdeddd.qduhosos.cn/dklejdj/deljf/index"
+ // });
+ const response = await sendNotification(sendDatas);
+
+ if (response.code == 200) {
+ return {
+ success: true,
+ expert: expert.expertname,
+ index: index
+ };
+ } else {
+ return {
+ success: false,
+ expert: expert.expertname,
+ index: index,
+ error: response.msg
+ };
+ }
+ } catch (error) {
+ console.error(`鍙戦�佺粰涓撳 ${expert.expertname} 澶辫触:`, error);
+ return {
+ success: false,
+ expert: expert.expertname,
+ index: index,
+ error: error.message
+ };
}
},
+ // 鏄剧ず澶辫触璇︽儏鐨勬柟娉�
+ showFailedDetails() {
+ const failedExperts = this.sendingResults.filter(r => !r.success);
+ if (failedExperts.length > 0) {
+ this.$confirm(
+ `鏈� ${failedExperts.length} 浣嶄笓瀹跺彂閫佸け璐ワ紝鏄惁鏌ョ湅澶辫触璇︽儏锛焋,
+ "鍙戦�佺粨鏋�",
+ {
+ confirmButtonText: "鏌ョ湅璇︽儏",
+ cancelButtonText: "鍏抽棴",
+ type: "warning"
+ }
+ )
+ .then(() => {
+ let detailMessage = "鍙戦�佸け璐ョ殑涓撳锛歕n\n";
+ failedExperts.forEach((expert, index) => {
+ detailMessage += `${index + 1}. ${expert.expert}: ${
+ expert.error
+ }\n`;
+ });
+
+ this.$alert(detailMessage, "鍙戦�佸け璐ヨ鎯�", {
+ confirmButtonText: "纭畾",
+ customClass: "failed-details-dialog"
+ });
+ })
+ .catch(() => {});
+ }
+ },
+
+ // 鐫$湢鍑芥暟锛岀敤浜庨棿闅�
+ sleep(ms) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+ },
// 鍒犻櫎涓撳瀹℃煡
handleDeleteExpertReview(expert, index) {
this.$confirm("纭畾瑕佸垹闄よ涓撳鐨勫鏌ヨ褰曞悧锛�", "鎻愮ず", {
@@ -1931,7 +2029,7 @@
const response = await ethicalreExpertTotal(params);
- if (response && response.code === 200) {
+ if (response && response.code == 200) {
this.expertHistoryData = response.data || response[0] || null;
} else {
this.$message.error(
@@ -2171,11 +2269,82 @@
.selected-case-info {
margin-bottom: 20px;
}
+/* 鍙戦�佽繘搴︽牱寮� */
+.send-progress-container {
+ margin: 20px 0;
+ padding: 20px;
+ background: #f5f7fa;
+ border-radius: 8px;
+}
+.send-stats {
+ display: flex;
+ justify-content: center;
+ gap: 30px;
+ margin-top: 10px;
+}
+
+.stat-item {
+ font-size: 14px;
+ font-weight: 500;
+ padding: 4px 12px;
+ border-radius: 4px;
+}
+
+.stat-item.success {
+ color: #67c23a;
+ background: #f0f9eb;
+}
+
+.stat-item.fail {
+ color: #f56c6c;
+ background: #fef0f0;
+}
+
+/* 澶辫触璇︽儏瀵硅瘽妗� */
+.failed-details-dialog {
+ min-width: 400px;
+ max-width: 600px;
+}
+
+.failed-details-dialog .el-message-box__content {
+ max-height: 400px;
+ overflow-y: auto;
+ white-space: pre-wrap;
+ word-break: break-word;
+}
.case-info-card {
border-left: 4px solid #67c23a;
}
+/* 鍦–SS涓坊鍔� */
+:deep(.el-message-box) {
+ max-width: 500px;
+}
+/* 娣诲姞鏈繚瀛樼姸鎬佹牱寮� */
+.unsaved-hint {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ background: #e6a23c;
+ color: white;
+ padding: 4px 8px;
+ border-radius: 4px;
+ font-size: 12px;
+ animation: pulse 2s infinite;
+}
+
+@keyframes pulse {
+ 0% {
+ opacity: 0.8;
+ }
+ 50% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0.8;
+ }
+}
/* 鍝嶅簲寮忚璁� */
@media (max-width: 768px) {
.ethics-review-detail {
diff --git a/src/views/business/course/components/MedicalAssessmentStage.vue b/src/views/business/course/components/MedicalAssessmentStage.vue
index 3a4c17d..1fe761d 100644
--- a/src/views/business/course/components/MedicalAssessmentStage.vue
+++ b/src/views/business/course/components/MedicalAssessmentStage.vue
@@ -7,17 +7,20 @@
<span>鍣ㄥ畼璇勪及琛�</span>
</div>
- <!-- 鎹愮尞鍐冲畾琛ㄥ崟 -->
- <el-form>
- <el-form-item label-width="100px" label="鎹愮尞鍐冲畾">
- <el-checkbox-group v-model="organdecisionValues" @change="handleOrganDecisionChange" :disabled="!isEdit">
- <el-checkbox v-for="dict in dict.type.sys_Organ" :key="dict.value" :label="dict.value">{{ dict.label }}
- </el-checkbox>
- </el-checkbox-group>
- <el-input v-if="showOtherInput" v-model="organdecisionOther" placeholder="璇疯緭鍏ュ叾浠栨崘鐚喅瀹氱殑鍏蜂綋鍐呭"
- style="margin-top: 10px; width: 300px;" :readonly="!isEdit" @input="handleOtherDecisionInput"></el-input>
- </el-form-item>
- </el-form>
+ <!-- 鎹愮尞鍐冲畾锛堝彧璇诲睍绀猴級 -->
+ <el-descriptions title="鎹愮尞鍐冲畾" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="鎹愮尞鍐冲畾">
+ <template v-if="organdecisionValues && organdecisionValues.length">
+ <el-tag v-for="(v, i) in organdecisionValues" :key="i" size="small" style="margin-right: 8px;">
+ {{ getOrganLabel(v) }}
+ </el-tag>
+ </template>
+ <template v-else>-</template>
+ </el-descriptions-item>
+ <el-descriptions-item v-if="showOtherInput" label="鍏朵粬鎹愮尞鍐冲畾">
+ {{ organdecisionOther || '-' }}
+ </el-descriptions-item>
+ </el-descriptions>
<!-- 鍣ㄥ畼璇勪及琛ㄦ牸 -->
<el-table :data="filteredOrganAssessmentList" v-loading="assessmentLoading" style="width: 100%"
@@ -32,29 +35,16 @@
<el-tab-pane v-for="(assessment, index) in getOrganAssessments(scope.row)"
:key="`${scope.row.organno}_${index}`" :label="`绗�${index + 1}娆¤瘎浼癭" :name="String(index)">
<organ-assessment-form :organ-data="scope.row" :assessment-index="index"
- :readonly="!canAssessOrgan(scope.row)" :current-user="currentUser"
+ :readonly="true" :current-user="currentUser"
@update-assessment="handleUpdateAssessment" @delete-assessment="handleDeleteAssessment"
@save-assessment="handleSaveAssessment" />
- </el-tab-pane>
-
- <!-- 娣诲姞璇勪及鎸夐挳 -->
- <el-tab-pane name="add" v-if="canAssessOrgan(scope.row) && isEdit">
- <template slot="label">
- <el-button type="text" icon="el-icon-plus" @click.stop="handleAddNewAssessment(scope.row)"
- size="mini">
- 鏂板璇勪及
- </el-button>
- </template>
- <div class="add-assessment-prompt">
- <el-empty description="鐐瑰嚮涓婃柟鎸夐挳娣诲姞鏂扮殑璇勪及"></el-empty>
- </div>
</el-tab-pane>
<!-- 璇勪及姹囨�籘ab -->
<el-tab-pane label="璇勪及姹囨��" name="summary">
<div class="assessment-summary">
<!-- 鍩烘湰淇℃伅姹囨�� -->
- <el-descriptions title="鍩烘湰淇℃伅姹囨��" :column="2" border>
+ <el-descriptions title="鍩烘湰淇℃伅姹囨��" :column="descriptionColumn" border>
<el-descriptions-item label="鍣ㄥ畼绫诲瀷">
<span class="summary-item">{{
getOrganLabel(scope.row.organno)
@@ -96,7 +86,7 @@
</el-tag>
</div>
- <el-descriptions :column="2" border class="detail-descriptions">
+ <el-descriptions :column="descriptionColumn" border class="detail-descriptions">
<!-- 璇勪及鏃堕棿 -->
<el-descriptions-item label="璇勪及鏃堕棿" :span="2">
<span class="time-text">
@@ -163,7 +153,7 @@
<!-- 鍣ㄥ畼鍩烘湰淇℃伅鍗$墖 -->
<el-card header="鍣ㄥ畼淇℃伅" style="margin-top: 20px;" class="organ-info-card">
- <el-descriptions :column="2" border>
+ <el-descriptions :column="descriptionColumn" border>
<el-descriptions-item label="鑾峰彇鍓嶆椿妫�">
<el-tag :type="scope.row.isbiopsybefore == '1'
? 'success'
@@ -252,30 +242,8 @@
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" align="center" width="150" class-name="small-padding fixed-width">
- <template slot-scope="scope">
- <el-button v-if="canAssessOrgan(scope.row) && isEdit" size="mini" type="text"
- @click="handleToggleExpand(scope.row)">
- {{
- expandedRowKeys.includes(scope.row.organno) ? "鏀惰捣" : "璇︽儏"
- }}
- </el-button>
- <el-button v-else-if="!isEdit" size="mini" type="text" @click="handleToggleExpand(scope.row)">
- {{
- expandedRowKeys.includes(scope.row.organno) ? "鏀惰捣" : "鏌ョ湅"
- }}
- </el-button>
- <el-button v-else size="mini" type="text" disabled>鏃犳潈闄�</el-button>
- </template>
- </el-table-column>
</el-table>
</el-card>
-
- <!-- 鏁翠綋淇濆瓨鎸夐挳 -->
- <div class="footer-actions" v-if="isEdit">
- <el-button type="primary" @click="handleSaveAll" :loading="saveLoading">淇濆瓨璇勪及琛�</el-button>
- <el-button type="success" @click="accomplish" :loading="saveLoading">璇勪及瀹屾垚</el-button>
- </div>
<!-- 鏂囦欢棰勮寮圭獥 -->
<FilePreviewDialog :visible="attachmentVisible" :file="currentPreviewFile" @close="attachmentVisible = false" />
@@ -291,10 +259,12 @@
import CaseBasicInfo from "@/components/CaseBasicInfo";
import FilePreviewDialog from "@/components/FilePreviewDialog";
import OrganAssessmentForm from "@/components/assessInfoComponents/OrganAssessmentForm.vue";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
export default {
name: "AssessmentDetail",
components: { OrganAssessmentForm, FilePreviewDialog, CaseBasicInfo },
+ mixins: [readonlyDescriptionsMixin],
dicts: ["sys_user_sex", "sys_Organ", "sys_0_1"],
props: {
infoid: {
@@ -419,7 +389,7 @@
created() {
this.caseId = this.infoid;
- this.isEdit = true;
+ this.isEdit = false;
this.getAssessmentDetail();
},
methods: {
diff --git a/src/views/business/course/components/OrganAllocationStage.vue b/src/views/business/course/components/OrganAllocationStage.vue
index 4046433..384a886 100644
--- a/src/views/business/course/components/OrganAllocationStage.vue
+++ b/src/views/business/course/components/OrganAllocationStage.vue
@@ -6,44 +6,11 @@
<span class="detail-title">鍣ㄥ畼鍒嗛厤鍩烘湰淇℃伅</span>
</div>
- <el-form :model="form" ref="form" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍒嗛厤鐘舵��" prop="allocationStatus">
- <el-select
- v-model="form.allocationStatus"
- placeholder="璇烽�夋嫨鍒嗛厤鐘舵��"
- >
- <el-option
- v-for="dict in dict.type.organ_allocation_status || []"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍒嗛厤鏃堕棿" prop="allocationTime">
- <el-date-picker
- v-model="form.allocationTime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- :disabled="form.allocationStatus == '1'"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璐熻矗浜�" prop="registrationName">
- <el-input v-model="form.registrationName" />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
+ <el-descriptions title="鍩烘湰淇℃伅" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="鍒嗛厤鐘舵��">{{ selectDictLabel(dict.type.organ_allocation_status, form.allocationStatus) }}</el-descriptions-item>
+ <el-descriptions-item label="鍒嗛厤鏃堕棿">{{ form.allocationTime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="璐熻矗浜�">{{ form.registrationName || '-' }}</el-descriptions-item>
+ </el-descriptions>
</el-card>
<!-- 鍣ㄥ畼鍒嗛厤璁板綍閮ㄥ垎 -->
@@ -58,49 +25,24 @@
</div>
</div>
- <el-form
- ref="allocationForm"
- :rules="allocationRules"
- :model="allocationData"
- label-position="right"
- >
- <el-row>
- <el-col>
- <el-form-item label-width="100px" label="鍒嗛厤鍣ㄥ畼">
- <el-checkbox-group
- v-model="selectedOrgans"
- @change="handleOrganSelectionChange"
- >
- <el-checkbox
- v-for="dict in dict.type.sys_Organ || []"
- :key="dict.value"
- :label="dict.value"
- :disabled="form.allocationStatus == '1'"
- >
- {{ dict.label }}
- </el-checkbox>
- </el-checkbox-group>
- <el-input
- v-if="showOtherInput"
- v-model="otherOrganInput"
- placeholder="璇疯緭鍏ュ叾浠栧櫒瀹樺悕绉�"
- style="margin-top: 10px; width: 300px;"
- :disabled="form.allocationStatus == '1'"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <el-descriptions title="鍒嗛厤鍣ㄥ畼" :column="1" border size="small" style="margin-bottom: 16px;">
+ <el-descriptions-item label="鍒嗛厤鍣ㄥ畼">
+ <template v-if="selectedOrgans && selectedOrgans.length">
+ <span v-for="(v, i) in selectedOrgans" :key="v">
+ {{ v === 'C01' && otherOrganInput ? '鍏朵粬(' + otherOrganInput + ')' : getOrganLabel(v) }}<span v-if="i < selectedOrgans.length - 1">銆�</span>
+ </span>
+ </template>
+ <template v-else>-</template>
+ </el-descriptions-item>
+ </el-descriptions>
- <el-row>
- <el-col>
- <el-form-item>
- <el-table
- :data="displayOrgans"
- v-loading="loading"
- border
- style="width: 100%"
- :row-class-name="getOrganRowClassName"
- >
+ <el-table
+ :data="displayOrgans"
+ v-loading="loading"
+ border
+ style="width: 100%"
+ :row-class-name="getOrganRowClassName"
+ >
<el-table-column
label="搴忓彿"
type="index"
@@ -133,127 +75,36 @@
align="center"
width="120"
prop="organname"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.organname"
- placeholder="鍣ㄥ畼鍚嶇О"
- :disabled="true"
- />
- </template>
- </el-table-column>
-
- <!-- <el-table-column
- label="鍒嗛厤绯荤粺缂栧彿"
- align="center"
- width="150"
- prop="caseno"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.caseno"
- placeholder="鍒嗛厤绯荤粺缂栧彿"
- :disabled="
- form.allocationStatus == '1' ||
- scope.row.allocationstatus == '3'
- "
- />
- </template>
- </el-table-column> -->
+ show-overflow-tooltip
+ />
<el-table-column
label="鍒嗛厤寮�濮嬫椂闂�"
align="center"
width="180"
prop="applicanttime"
- >
- <template slot-scope="scope">
- <el-date-picker
- clearable
- size="small"
- style="width: 100%"
- v-model="scope.row.applicanttime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="閫夋嫨寮�濮嬫帴鏀舵椂闂�"
- :disabled="
- form.allocationStatus == '1' ||
- scope.row.allocationstatus == '3'
- "
- />
- </template>
- </el-table-column>
+ />
<el-table-column
label="鍒嗛厤鎺ユ敹鏃堕棿"
align="center"
width="180"
prop="organgettime"
- >
- <template slot-scope="scope">
- <el-date-picker
- clearable
- size="small"
- style="width: 100%"
- v-model="scope.row.organgettime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="閫夋嫨鍒嗛厤鎺ユ敹鏃堕棿"
- :disabled="
- form.allocationStatus == '1' ||
- scope.row.allocationstatus == '3'
- "
- />
- </template>
- </el-table-column>
+ />
<el-table-column
label="鍙椾綋濮撴皬"
align="center"
width="120"
prop="name"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.name"
- placeholder="鍙椾綋濮撴皬"
- :disabled="
- form.allocationStatus == '1' ||
- scope.row.allocationstatus == '3'
- "
- />
- </template>
- </el-table-column>
+ />
<el-table-column
label="绉绘鍖婚櫌"
align="center"
width="200"
prop="transplanthospitalname"
- >
- <template slot-scope="scope">
- <el-autocomplete
- v-model="scope.row.transplanthospitalname"
- :fetch-suggestions="queryHospitalSearch"
- placeholder="璇烽�夋嫨鎴栬緭鍏ョЩ妞嶅尰闄�"
- style="width: 100%"
- clearable
- ></el-autocomplete>
- </template>
- <!-- <template slot-scope="scope">
- <el-select
- v-model="scope.row.transplanthospitalname"
- placeholder="璇烽�夋嫨绉绘鍖婚櫌"
- style="width: 100%"
- >
- <el-option
- v-for="dict in dict.type.Geta_hospital"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- ></el-option>
- </el-select>
- </template> -->
- </el-table-column>
+ show-overflow-tooltip
+ />
<!-- 淇敼template涓殑璇存槑鍒� -->
<el-table-column
@@ -264,16 +115,7 @@
>
<template slot-scope="scope">
<div v-if="scope.row.allocationstatus != '3'">
- <el-input
- type="textarea"
- clearable
- v-model="scope.row.reallocationreason"
- placeholder="璇疯緭鍏ヨ鏄�"
- :disabled="
- form.allocationStatus == '1' ||
- scope.row.allocationstatus == '3'
- "
- />
+ <span>{{ scope.row.reallocationreason || '-' }}</span>
</div>
<div v-else>
<!-- 閲嶅垎閰嶈褰曪細鏄剧ず璇︾粏鏌ョ湅鎸夐挳 -->
@@ -311,102 +153,11 @@
</template>
</el-table-column>
- <el-table-column
- label="鎿嶄綔"
- align="center"
- width="120"
- class-name="small-padding fixed-width"
- v-if="form.allocationStatus !== '1'"
- fixed="right"
- >
- <template slot-scope="scope">
- <el-button
- size="mini"
- type="text"
- icon="el-icon-copy-document"
- @click="handleRedistribution(scope.row)"
- :disabled="scope.row.allocationstatus == '3'"
- style="color: #e6a23c;"
- >
- {{
- scope.row.allocationstatus == "3"
- ? "宸查噸鍒嗛厤"
- : "閲嶅垎閰�"
- }}
- </el-button>
- <el-button
- v-if="scope.row.allocationstatus != '3'"
- size="mini"
- type="text"
- icon="el-icon-delete"
- @click="handleInvalidate(scope.row)"
- :disabled="
- scope.row.allocationstatus == '3' ||
- scope.row.allocationstatus == '2'
- "
- style="color: #f56c6c;"
- >
- {{
- scope.row.allocationstatus == "2" ? "宸蹭綔搴�" : "浣滃簾"
- }}
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-form-item>
- </el-col>
- </el-row>
+ </el-table>
- <!-- 鍒嗛厤缁熻淇℃伅 -->
- <!-- <div
- class="allocation-stats"
- v-if="
- allocationData.serviceDonateorganList &&
- allocationData.serviceDonateorganList.length > 0
- "
- >
- <el-row :gutter="20">
- <el-col :span="6">
- <div class="stat-item">
- <span class="stat-label">宸插垎閰嶅櫒瀹�:</span>
- <span class="stat-value"
- >{{ allocationData.serviceDonateorganList.length }} 涓�</span
- >
- </div>
- </el-col>
- <el-col :span="6">
- <div class="stat-item">
- <span class="stat-label">寰呭鏍�:</span>
- <span class="stat-value">{{ pendingReviewCount }} 涓�</span>
- </div>
- </el-col>
- <el-col :span="6">
- <div class="stat-item">
- <span class="stat-label">娑夊強鍖婚櫌:</span>
- <span class="stat-value">{{ uniqueHospitals }} 瀹�</span>
- </div>
- </el-col>
- <el-col :span="6">
- <div class="stat-item">
- <span class="stat-label">閲嶅垎閰�:</span>
- <span class="stat-value">{{ redistributedCount }} 涓�</span>
- </div>
- </el-col>
- </el-row>
- </div> -->
-
- <div
- v-if="
- !allocationData.serviceDonateorganList ||
- allocationData.serviceDonateorganList.length == 0
- "
- class="empty-allocation"
- >
- <el-empty description="鏆傛棤鍒嗛厤璁板綍" :image-size="80">
- <span>璇峰厛閫夋嫨瑕佸垎閰嶇殑鍣ㄥ畼</span>
- </el-empty>
- </div>
- </el-form>
+ <div v-if="!displayOrgans.length" class="empty-allocation">
+ <el-empty description="鏆傛棤鍒嗛厤璁板綍" :image-size="80" />
+ </div>
</el-card>
<!-- 闄勪欢绠$悊閮ㄥ垎浼樺寲 -->
@@ -414,23 +165,7 @@
<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"
- :multiple="true"
- @change="handleAttachmentChange"
- @upload-success="handleUploadSuccess"
- @upload-error="handleUploadError"
- @remove="handleAttachmentRemove"
- />
<!-- 闄勪欢鍒楄〃灞曠ず -->
<div class="attachment-list" v-if="attachments && attachments.length > 0">
@@ -462,7 +197,7 @@
<span>{{ formatFileSize(scope.row.fileSize) }}</span>
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="280" fixed="right">
+ <el-table-column label="鎿嶄綔" width="180" fixed="right">
<template slot-scope="scope">
<el-button
size="mini"
@@ -479,92 +214,15 @@
>
涓嬭浇
</el-button>
- <el-button
- size="mini"
- type="danger"
- @click="handleRemoveAttachment(scope.$index)"
- >
- 鍒犻櫎
- </el-button>
</template>
</el-table-column>
</el-table>
</div>
- </el-card>
- <div style="text-align: center; margin: 30px 0;">
- <el-button type="primary" @click="handleSave" :loading="saveLoading">
- 淇濆瓨
- </el-button>
- <el-button
- type="success"
- @click="handleConfirmAllocation"
- :disabled="form.allocationStatus == '1'"
- :loading="confirmLoading"
- >
- 纭鍒嗛厤
- </el-button>
- </div>
- <!-- 閲嶅垎閰嶅璇濇 -->
- <el-dialog
- title="鍣ㄥ畼閲嶅垎閰�"
- :visible.sync="redistributionDialogVisible"
- width="500px"
- @close="handleRedistributionDialogClose"
- >
- <el-form
- :model="redistributionForm"
- :rules="redistributionRules"
- ref="redistributionFormRef"
- label-width="100px"
- >
- <el-form-item label="鍘熷櫒瀹樹俊鎭�">
- <el-input v-model="redistributionForm.organname" readonly />
- </el-form-item>
- <el-form-item label="閲嶅垎閰嶅師鍥�" prop="reason" required>
- <el-input
- type="textarea"
- :rows="4"
- v-model="redistributionForm.reason"
- placeholder="璇疯緭鍏ラ噸鍒嗛厤鍘熷洜"
- />
- </el-form-item>
- <el-form-item label="閲嶅垎閰嶆椂闂�" prop="redistributionTime" required>
- <el-date-picker
- v-model="redistributionForm.redistributionTime"
- type="datetime"
- placeholder="璇烽�夋嫨閲嶅垎閰嶆椂闂�"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- <el-form-item label="閲嶅垎閰嶉檮浠�">
- <UploadAttachment
- ref="redistributionAttachmentUpload"
- :file-list="redistributionAttachmentList"
- :limit="5"
- :accept="attachmentAccept"
- :multiple="true"
- @change="handleRedistributionChange"
- @upload-success="handleRedistributionUploadSuccess"
- @upload-error="handleRedistributionUploadError"
- @remove="handleRedistributionAttachmentRemove"
- />
- <div style="margin-top: 5px; font-size: 12px; color: #999;">
- 鏀寔涓婁紶閲嶅垎閰嶇浉鍏虫枃浠� (鏈�澶�5涓�)
- </div>
- </el-form-item>
- </el-form>
- <div slot="footer">
- <el-button @click="redistributionDialogVisible = false">鍙栨秷</el-button>
- <el-button
- type="primary"
- @click="handleRedistributionConfirm"
- :loading="redistributionLoading"
- >
- 纭閲嶅垎閰�
- </el-button>
+
+ <div v-else class="empty-attachment">
+ <el-empty description="鏆傛棤闄勪欢" :image-size="80" />
</div>
- </el-dialog>
+ </el-card>
<!-- 鍦╰emplate涓坊鍔犻噸鍒嗛厤璇︽儏寮圭獥 -->
<el-dialog
title="閲嶅垎閰嶈鎯�"
@@ -574,7 +232,7 @@
<div v-loading="redistributionDetailLoading">
<div v-if="currentRedistributionDetail" style="padding: 20px;">
<!-- 鍩烘湰淇℃伅 -->
- <el-descriptions title="閲嶅垎閰嶄俊鎭�" :column="2" border>
+ <el-descriptions title="閲嶅垎閰嶄俊鎭�" :column="descriptionColumn" border size="small">
<el-descriptions-item label="鍣ㄥ畼鍚嶇О">
{{ currentRedistributionDetail.organname || "-" }}
</el-descriptions-item>
@@ -709,20 +367,20 @@
allocationedit,
donateorganBaseinfoInfo
} from "@/api/businessApi";
-import UploadAttachment from "@/components/UploadAttachment";
import FilePreviewDialog from "@/components/FilePreviewDialog";
import OrgSelecter from "@/views/project/components/orgselect";
import CaseBasicInfo from "@/components/CaseBasicInfo";
import dayjs from "dayjs";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
export default {
name: "OrganAllocationDetail",
components: {
- UploadAttachment,
OrgSelecter,
FilePreviewDialog,
CaseBasicInfo
},
+ mixins: [readonlyDescriptionsMixin],
dicts: [
"sys_BloodType",
"sys_DonationCategory",
diff --git a/src/views/business/course/components/OrganProcurementStage.vue b/src/views/business/course/components/OrganProcurementStage.vue
index fe95cd1..a3e8163 100644
--- a/src/views/business/course/components/OrganProcurementStage.vue
+++ b/src/views/business/course/components/OrganProcurementStage.vue
@@ -1,5 +1,6 @@
<template>
<div class="organ-procurement-detail">
+ <!-- <case-basic-info :case-id="caseId" :show-attachment="true":column="3" /> -->
<!-- 鍩烘湰淇℃伅 -->
<el-card class="detail-card">
@@ -7,198 +8,32 @@
<span class="detail-title">鍣ㄥ畼鑾峰彇鍩烘湰淇℃伅</span>
</div>
- <el-form :model="form" ref="form" :rules="rules" label-width="120px">
- <!-- 鎵嬫湳鐩稿叧淇℃伅 -->
- <el-divider content-position="left">鎵嬫湳淇℃伅</el-divider>
+ <el-descriptions title="鎵嬫湳淇℃伅" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="鎵嬫湳鍖荤敓">{{ form.operationdoctor || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鎵嬫湳寮�濮嬫椂闂�">{{ form.operationbegtime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鎵嬫湳缁撴潫鏃堕棿">{{ form.operationendtime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鑵逛富鍔ㄨ剦鎻掔鏃堕棿">{{ form.abdominalaortacannulatime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鑵逛富鍔ㄨ剦鐏屾敞鏃堕棿">{{ form.abdominalaortaperfusiontime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="闂ㄩ潤鑴夋彃绠℃椂闂�">{{ form.portalveincannulatime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="闂ㄩ潤鑴夌亴娉ㄦ椂闂�">{{ form.portalveinperfusiontime || '-' }}</el-descriptions-item>
+ </el-descriptions>
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="鎵嬫湳鍖荤敓" prop="operationdoctor">
- <el-input v-model="form.operationdoctor" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鎵嬫湳寮�濮嬫椂闂�" prop="operationbegtime">
- <el-date-picker
- v-model="form.operationbegtime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鎵嬫湳缁撴潫鏃堕棿" prop="operationendtime">
- <el-date-picker
- v-model="form.operationendtime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <el-descriptions title="鍗忚皟鍛樹俊鎭�" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="杩涙墜鏈鏃堕棿">{{ form.coordinatorInOperating || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍑烘墜鏈鏃堕棿">{{ form.coordinatorOutOperating || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鏄惁榛樺搥缂呮��">{{ form.isspendremember === 1 ? '鏄�' : form.isspendremember === 0 ? '鍚�' : '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鎭㈠閬椾綋浠">{{ form.isrestoreremains === 1 ? '鏄�' : form.isrestoreremains === 0 ? '鍚�' : '-' }}</el-descriptions-item>
+ </el-descriptions>
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item
- label="鑵逛富鍔ㄨ剦鎻掔鏃堕棿"
- prop="abdominalaortacannulatime"
- >
- <el-date-picker
- v-model="form.abdominalaortacannulatime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item
- label="鑵逛富鍔ㄨ剦鐏屾敞鏃堕棿"
- prop="abdominalaortaperfusiontime"
- >
- <el-date-picker
- v-model="form.abdominalaortaperfusiontime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <el-descriptions title="璐熻矗浜轰俊鎭�" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="璐熻矗浜哄鍚�">{{ form.responsibleusername || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍗忚皟鍛樹竴">{{ form.coordinatedusernameo || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍗忚皟鍛樹簩">{{ form.coordinatedusernamet || '-' }}</el-descriptions-item>
+ </el-descriptions>
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="闂ㄩ潤鑴夋彃绠℃椂闂�" prop="portalveincannulatime">
- <el-date-picker
- v-model="form.portalveincannulatime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="闂ㄩ潤鑴夌亴娉ㄦ椂闂�" prop="portalveinperfusiontime">
- <el-date-picker
- v-model="form.portalveinperfusiontime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <!-- 鍗忚皟鍛樹俊鎭� -->
- <el-divider content-position="left">鍗忚皟鍛樹俊鎭�</el-divider>
-
- <el-row :gutter="20">
- <!-- <el-col :span="8">
- <el-form-item label="鍗忚皟鍛樺鍚�" prop="coordinatorName">
- <el-input v-model="form.coordinatorName" />
- </el-form-item>
- </el-col> -->
- <el-col :span="8">
- <el-form-item label="杩涙墜鏈鏃堕棿" prop="coordinatorInOperating">
- <el-date-picker
- v-model="form.coordinatorInOperating"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍑烘墜鏈鏃堕棿" prop="coordinatorOutOperating">
- <el-date-picker
- v-model="form.coordinatorOutOperating"
- type="datetime"
- 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="8">
- <el-form-item label="鍗忚皟鍛樼瀛�" prop="coordinatorSign">
- <el-input v-model="form.coordinatorSign" />
- </el-form-item>
- </el-col> -->
- <!-- <el-col :span="8">
- <el-form-item label="鑾峰彇鏃堕棿" prop="coordinatorSignTime">
- <el-date-picker
- v-model="form.coordinatorSignTime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col> -->
- <el-col :span="8">
- <el-form-item label="鏄惁榛樺搥缂呮��" prop="isspendremember">
- <el-select v-model="form.isspendremember" style="width: 100%">
- <el-option label="鏄�" :value="1" />
- <el-option label="鍚�" :value="0" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鎭㈠閬椾綋浠" prop="isrestoreremains">
- <el-select v-model="form.isrestoreremains" style="width: 100%">
- <el-option label="鏄�" :value="1" />
- <el-option label="鍚�" :value="0" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
-
- <!-- 璐熻矗浜轰俊鎭� -->
- <el-divider content-position="left">璐熻矗浜轰俊鎭�</el-divider>
-
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="璐熻矗浜哄鍚�" prop="responsibleusername">
- <el-input v-model="form.responsibleusername" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍗忚皟鍛樹竴" prop="coordinatedusernameo">
- <el-input v-model="form.coordinatedusernameo" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet">
- <el-input v-model="form.coordinatedusernamet" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <!-- 鑾峰彇鏈烘瀯淇℃伅 -->
- <el-divider content-position="left">鑾峰彇鏈烘瀯淇℃伅</el-divider>
-
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="鑾峰彇鏈烘瀯鍚嶇О" prop="gainhospitalname">
- <el-input
- v-model="form.gainhospitalname"
- placeholder="璇疯緭鍏ヨ幏鍙栨満鏋勫悕绉�"
- />
- </el-form-item>
- </el-col>
- <!-- <el-col :span="8">
- <el-form-item label="鎹愮尞缂栧彿" prop="gainhospitalno">
- <el-input
- v-model="form.gainhospitalno"
- placeholder="璇疯緭鍏ユ崘鐚紪鍙�"
- />
- </el-form-item>
- </el-col> -->
- </el-row>
- </el-form>
+ <el-descriptions title="鑾峰彇鏈烘瀯淇℃伅" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="鑾峰彇鏈烘瀯鍚嶇О">{{ form.gainhospitalname || '-' }}</el-descriptions-item>
+ </el-descriptions>
</el-card>
<!-- 鍣ㄥ畼鑾峰彇璁板綍閮ㄥ垎 -->
@@ -213,209 +48,29 @@
</div>
</div>
- <el-form
- ref="procurementForm"
- :rules="procurementRules"
- :model="procurementData"
- label-position="right"
- >
- <el-row>
- <el-col>
- <el-form-item label-width="100px" label="鎹愮尞鍣ㄥ畼">
- <el-checkbox-group
- v-model="selectedOrgans"
- @change="handleOrganSelectionChange"
- >
- <el-checkbox
- v-for="dict in dict.type.sys_Organ || []"
- :key="dict.value"
- :label="dict.value"
- >
- {{ dict.label }}
- </el-checkbox>
- </el-checkbox-group>
- </el-form-item>
- </el-col>
- </el-row>
+ <el-descriptions title="鎹愮尞鍣ㄥ畼" :column="1" border size="small" style="margin-bottom: 16px;">
+ <el-descriptions-item label="鎹愮尞鍣ㄥ畼">
+ <template v-if="selectedOrgans && selectedOrgans.length">
+ <span v-for="(v, i) in selectedOrgans" :key="v">
+ {{ getOrganLabel(v) }}<span v-if="i < selectedOrgans.length - 1">銆�</span>
+ </span>
+ </template>
+ <template v-else>-</template>
+ </el-descriptions-item>
+ </el-descriptions>
- <el-row>
- <el-col>
- <el-form-item>
- <el-table
- :data="displayOrgans"
- v-loading="loading"
- border
- style="width: 100%"
- :row-class-name="getOrganRowClassName"
- >
- <el-table-column
- label="鍣ㄥ畼鍚嶇О"
- align="center"
- width="120"
- prop="organname"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.organname"
- placeholder="鍣ㄥ畼鍚嶇О"
- :disabled="true"
- />
- </template>
- </el-table-column>
+ <el-table :data="displayOrgans" v-loading="loading" border style="width: 100%">
+ <el-table-column label="鍣ㄥ畼鍚嶇О" align="center" prop="organname" />
+ <el-table-column label="鑾峰彇寮�濮嬫椂闂�" align="center" prop="organStartTime" />
+ <el-table-column label="鍣ㄥ畼绂讳綋鏃堕棿" align="center" prop="organgettime" />
+ <el-table-column label="鑾峰彇鍖婚櫌" align="center" prop="gainhospitalname" show-overflow-tooltip />
+ <el-table-column label="鑾峰彇鍖诲笀" align="center" prop="organgetdoct" />
+ <el-table-column label="璇存槑" align="center" prop="notgetreason" min-width="200" show-overflow-tooltip />
+ </el-table>
- <el-table-column
- label="鑾峰彇寮�濮嬫椂闂�"
- align="center"
- width="260"
- prop="organStartTime"
- >
- <template slot-scope="scope">
- <el-date-picker
- clearable
- size="small"
- style="width: 100%"
- v-model="scope.row.organStartTime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="閫夋嫨鑾峰彇寮�濮嬫椂闂�"
- />
- </template>
- </el-table-column>
-
- <el-table-column
- label="鍣ㄥ畼绂讳綋鏃堕棿"
- align="center"
- width="260"
- prop="organgettime"
- >
- <template slot-scope="scope">
- <el-date-picker
- clearable
- size="small"
- style="width: 100%"
- v-model="scope.row.organgettime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="閫夋嫨鍣ㄥ畼绂讳綋鏃堕棿"
- />
- </template>
- </el-table-column>
-
- <el-table-column
- label="鑾峰彇鍖婚櫌"
- align="center"
- width="300"
- prop="gainhospitalname"
- >
- <!-- <template slot-scope="scope">
- <el-select
- v-model="scope.row.gainhospitalname"
- placeholder="璇烽�夋嫨鑾峰彇鍖婚櫌"
- style="width: 100%"
- >
- <el-option
- v-for="dict in dict.type.Geta_hospital"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- ></el-option>
-
- </el-select>
- </template> -->
- <template slot-scope="scope">
- <el-autocomplete
- v-model="scope.row.gainhospitalname"
- :fetch-suggestions="queryHospitalSearch"
- placeholder="璇烽�夋嫨鎴栬緭鍏ヨ幏鍙栧尰闄�"
- style="width: 100%"
- clearable
- ></el-autocomplete>
- </template>
- </el-table-column>
-
- <el-table-column
- label="鑾峰彇鍖诲笀"
- align="center"
- width="150"
- prop="organgetdoct"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.organgetdoct"
- placeholder="鑾峰彇鍖诲笀"
- />
- </template>
- </el-table-column>
-
- <!-- <el-table-column
- label="鑾峰彇鐘舵��"
- align="center"
- width="120"
- prop="organstate"
- >
- <template slot-scope="scope">
- <el-select
- v-model="scope.row.organstate"
- placeholder="璇烽�夋嫨鑾峰彇鐘舵��"
- style="width: 100%"
- >
- <el-option
- v-for="dict in dict.type.Obtain_status"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </template>
- </el-table-column> -->
-
- <el-table-column
- label="璇存槑"
- align="center"
- prop="notgetreason"
- min-width="200"
- >
- <template slot-scope="scope">
- <el-input
- type="textarea"
- clearable
- v-model="scope.row.notgetreason"
- placeholder="璇疯緭鍏ユ湭鑾峰彇璇存槑"
- />
- </template>
- </el-table-column>
-
- <el-table-column
- label="鎿嶄綔"
- align="center"
- width="120"
- class-name="small-padding fixed-width"
- >
- <template slot-scope="scope">
- <el-button
- size="mini"
- type="text"
- icon="el-icon-edit"
- @click="handleEditProcurement(scope.row)"
- >
- 缂栬緫
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-form-item>
- </el-col>
- </el-row>
-
- <div
- v-if="!procurementData.serviceDonationwitnessorgans"
- class="empty-procurement"
- >
- <el-empty description="鏆傛棤鑾峰彇璁板綍" :image-size="80">
- <span>璇峰厛閫夋嫨瑕佽幏鍙栫殑鍣ㄥ畼</span>
- </el-empty>
- </div>
- </el-form>
+ <div v-if="!displayOrgans.length" class="empty-procurement">
+ <el-empty description="鏆傛棤鑾峰彇璁板綍" :image-size="80" />
+ </div>
</el-card>
<!-- 闄勪欢绠$悊閮ㄥ垎 - 鍒嗙被Tab灞曠ず -->
@@ -424,253 +79,96 @@
<span class="detail-title">鐩稿叧闄勪欢</span>
</div>
- <!-- 涓婁紶鍖哄煙锛堟棤鍒嗙被閫夋嫨锛岀敱Tab鎺у埗锛� -->
- <div class="upload-wrapper">
- <UploadAttachment
- ref="uploadAttachment"
- :file-list="attachmentFileList"
- :limit="attachmentLimit"
- :accept="attachmentAccept"
- :multiple="true"
- @change="handleAttachmentChange"
- @upload-success="handleUploadSuccess"
- @upload-error="handleUploadError"
- @remove="handleAttachmentRemove"
- />
- <div style="font-size:12px; color:#909399; margin-top:4px;">
- 褰撳墠涓婁紶鍒嗙被锛�<el-tag size="small" type="info">{{
- activeTab === "鏈垎绫�" ? "鏈垎绫�" : activeTab
- }}</el-tag>
- 锛堝垏鎹� Tab 鍙敼鍙樹笂浼犲垎绫伙級
- </div>
- </div>
-
- <!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず锛屾敮鎸佷慨鏀瑰垎绫� -->
- <div class="attachment-list" v-if="attachments && attachments.length > 0">
- <el-tabs v-model="activeTab" type="border-card">
- <el-tab-pane
- v-for="category in categories"
- :key="category"
- :label="category + '(' + getCategoryCount(category) + ')'"
- :name="category"
+ <!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず -->
+ <el-tabs v-model="activeTab" type="border-card">
+ <el-tab-pane
+ v-for="category in categories"
+ :key="category"
+ :label="category + '(' + getCategoryCount(category) + ')'"
+ :name="category"
+ >
+ <el-table
+ :data="getCategoryFiles(category)"
+ style="width: 100%"
+ size="small"
+ border
>
- <el-table
- :data="getCategoryFiles(category)"
- style="width: 100%"
- size="small"
- border
- >
- <el-table-column label="鏂囦欢鍚�" min-width="180">
- <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="150">
- <template #default="scope">
- <el-select
- v-model="scope.row.fileType"
- size="small"
- @change="updateAttachmentCategory(scope.row, $event)"
- placeholder="閫夋嫨鍒嗙被"
- >
- <el-option label="鍘熻〃鎷嶇収" value="鍘熻〃鎷嶇収" />
- <el-option label="浼︾悊瀹℃煡鏉愭枡" value="浼︾悊瀹℃煡鏉愭枡" />
- <el-option label="姝讳骸鍒ゅ畾鏉愭枡" value="姝讳骸鍒ゅ畾鏉愭枡" />
- <el-option label="榛樺搥浠紡鐓х墖" value="榛樺搥浠紡鐓х墖" />
- <el-option label="鎹愮尞瑙佽瘉瑙嗛" value="鎹愮尞瑙佽瘉瑙嗛" />
- <el-option label="鏈垎绫�" value="" />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鏂囦欢绫诲瀷" width="100">
- <template #default="scope">
- <el-tag size="small">{{
- getFileTypeText(scope.row.fileName)
- }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="涓婁紶鏃堕棿" width="160">
- <template #default="scope">
- <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鏂囦欢澶у皬" width="100">
- <template #default="scope">
- <span>{{ formatFileSize(scope.row.fileSize) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="180" fixed="right">
- <template #default="scope">
- <el-button
- size="mini"
- type="primary"
- @click="handlePreview(scope.row)"
- >棰勮</el-button
- >
- <el-button
- size="mini"
- type="danger"
- @click="handleRemoveAttachmentByFile(scope.row)"
- >鍒犻櫎</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </el-tab-pane>
- </el-tabs>
- </div>
-
- <!-- 鏃犻檮浠舵椂鏄剧ず -->
- <div v-else style="text-align:center; padding:20px; color:#909399;">
- 鏆傛棤闄勪欢锛岃涓婁紶
- </div>
+ <el-table-column label="鏂囦欢鍚�" min-width="180">
+ <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="150">
+ <template #default="scope">
+ <span>{{ scope.row.fileType || '鏈垎绫�' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢绫诲瀷" width="100">
+ <template #default="scope">
+ <el-tag size="small">{{
+ getFileTypeText(scope.row.fileName)
+ }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="涓婁紶鏃堕棿" width="160">
+ <template #default="scope">
+ <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢澶у皬" width="100">
+ <template #default="scope">
+ <span>{{ formatFileSize(scope.row.fileSize) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="100" fixed="right">
+ <template #default="scope">
+ <el-button
+ size="mini"
+ type="primary"
+ @click="handlePreview(scope.row)"
+ >棰勮</el-button
+ >
+ </template>
+ </el-table-column>
+ </el-table>
+ <div
+ v-if="getCategoryFiles(category).length === 0"
+ style="text-align:center; padding:20px; color:#909399;"
+ >
+ 鏆傛棤闄勪欢
+ </div>
+ </el-tab-pane>
+ </el-tabs>
</el-card>
- <div style="text-align: center; margin: 30px 0;">
- <el-button type="primary" @click="handleSave" :loading="saveLoading">
- 淇濆瓨
- </el-button>
- <el-button
- type="success"
- @click="handleProcure"
- :loading="confirmLoading"
- >
- 纭鑾峰彇
- </el-button>
- </div>
- <!-- 缂栬緫鑾峰彇璁板綍瀵硅瘽妗� -->
- <el-dialog
- title="缂栬緫鍣ㄥ畼鑾峰彇璁板綍"
- :visible.sync="editDialogVisible"
- width="600px"
- >
- <el-form :model="currentRecord" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍣ㄥ畼鍚嶇О">
- <el-input v-model="currentRecord.organname" readonly />
- </el-form-item>
- </el-col>
- <!-- <el-col :span="12">
- <el-form-item label="鑾峰彇鐘舵��">
- <el-select v-model="currentRecord.organstate" style="width: 100%">
- <el-option
- v-for="dict in dict.type.Obtain_status"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </el-form-item>
- </el-col> -->
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鑾峰彇鍖诲笀">
- <el-input
- v-model="currentRecord.organgetdoct"
- placeholder="璇疯緭鍏ヨ幏鍙栧尰甯�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍔╂墜">
- <el-input
- v-model="currentRecord.assistant"
- placeholder="璇疯緭鍏ュ姪鎵嬪鍚�"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鑾峰彇鎶ゅ+">
- <el-input
- v-model="currentRecord.procurementNurse"
- placeholder="璇疯緭鍏ヨ幏鍙栨姢澹�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎵嬫湳瀹ゆ姢澹�">
- <el-input
- v-model="currentRecord.operatingRoomNurse"
- placeholder="璇疯緭鍏ユ墜鏈鎶ゅ+"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-form-item label="楹婚唹鍖荤敓">
- <el-input
- v-model="currentRecord.anesthesiologist"
- placeholder="璇疯緭鍏ラ夯閱夊尰鐢�"
- />
- </el-form-item>
-
- <el-form-item label="鏈幏鍙栬鏄�">
- <el-input
- type="textarea"
- :rows="3"
- v-model="currentRecord.notgetreason"
- placeholder="璇疯緭鍏ユ湭鑾峰彇鐨勫師鍥犺鏄�"
- />
- </el-form-item>
- </el-form>
-
- <div slot="footer">
- <el-button @click="editDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleEditConfirm">纭</el-button>
- </div>
- </el-dialog>
-
<!-- 鏂囦欢棰勮寮圭獥 -->
- <el-dialog
- :title="filePreviewTitle"
- :visible.sync="filePreviewVisible"
- width="800px"
- @close="filePreviewVisible = false"
- >
- <div v-if="currentPreviewFile">
- <div v-if="currentPreviewFile.fileType === 'image'">
- <img
- :src="currentPreviewFile.fileUrl"
- style="max-width: 100%; max-height: 500px;"
- />
- </div>
- <div v-else-if="currentPreviewFile.fileType === 'pdf'">
- <iframe
- :src="currentPreviewFile.fileUrl"
- width="100%"
- height="500px"
- ></iframe>
- </div>
- <div v-else>
- <p>涓嶆敮鎸侀瑙堟鏂囦欢绫诲瀷锛岃涓嬭浇鏌ョ湅</p>
- </div>
- </div>
- </el-dialog>
+ <FilePreviewDialog
+ :visible="previewVisible"
+ :file="currentPreviewFile"
+ @close="previewVisible = false"
+ @download="handleDownload"
+ />
</div>
</template>
<script>
import { witnessList, witnessadd, witnessedit } from "@/api/businessApi";
-import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
import CaseBasicInfo from "@/components/CaseBasicInfo";
+import { getToken } from "@/utils/auth";
import dayjs from "dayjs";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
export default {
name: "OrganProcurementDetail",
components: {
- UploadAttachment,
+ FilePreviewDialog,
CaseBasicInfo
},
+ mixins: [readonlyDescriptionsMixin],
dicts: [
"sys_BloodType",
"Geta_hospital",
@@ -784,19 +282,22 @@
},
// 闄勪欢鏁版嵁
attachments: [],
- attachmentFileList: [],
- // 闄勪欢鐩稿叧閰嶇疆
- attachmentLimit: 10,
- attachmentAccept:
- ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt",
+ // 涓婁紶鐩稿叧
+ uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+ headers: {
+ Authorization: "Bearer " + getToken()
+ },
+ uploadDialogVisible: false,
+ uploadLoading: false,
+ tempFileList: [],
+ currentUploadCategory: "",
// 缂栬緫瀵硅瘽妗�
editDialogVisible: false,
currentRecord: {},
currentEditIndex: -1,
// 鏂囦欢棰勮鐩稿叧
- filePreviewVisible: false,
- currentPreviewFile: null,
- filePreviewTitle: ""
+ previewVisible: false,
+ currentPreviewFile: null
};
},
computed: {
@@ -854,22 +355,6 @@
return this.dict.type.sys_Organ || [];
}
},
- watch: {
- // 鐩戝惉闄勪欢鏁版嵁鍙樺寲
- attachments: {
- handler(newAttachments) {
- this.attachmentFileList = newAttachments.map(item => ({
- uid: item.id || Math.random(),
- name: item.fileName,
- fileSize: item.fileSize,
- url: item.path || item.fileUrl,
- uploadTime: item.uploadTime,
- status: "success"
- }));
- },
- deep: true
- }
- },
created() {
this.caseId = this.infoid;
@@ -884,7 +369,7 @@
// 鍒濆鍖栨暟鎹�
initData() {
- const infoid = this.infoid;
+ const infoid = this.infoid;
if (!infoid) {
this.$message.error("缂哄皯蹇呰鐨勮矾鐢卞弬鏁� infoid");
@@ -939,19 +424,8 @@
fileType: item.fileType || "" // 榛樿绌哄瓧绗︿覆琛ㄧず鏈垎绫�
}));
this.form.attachments = this.attachments;
- // 鍚屾 attachmentFileList
- this.attachmentFileList = this.attachments.map(item => ({
- uid: item.id || Math.random(),
- name: item.fileName,
- url: item.path || item.fileUrl,
- fileSize: item.fileSize,
- uploadTime: item.uploadTime,
- status: "success",
- raw: item
- }));
} else {
this.attachments = [];
- this.attachmentFileList = [];
}
// 澶勭悊鎹愮尞鍣ㄥ畼瀛楁
@@ -1387,133 +861,163 @@
this.handleConfirmProcurement();
},
- // 闄勪欢鐩稿叧鏂规硶
- /** 闄勪欢鍙樺寲澶勭悊 */
- handleAttachmentChange(fileList) {
- this.attachmentFileList = fileList;
+ // ===== 闄勪欢鐩稿叧鏂规硶 =====
+ // 鎵撳紑涓婁紶瀵硅瘽妗�
+ openUploadDialog(category) {
+ this.currentUploadCategory = category;
+ this.tempFileList = [];
+ this.uploadDialogVisible = true;
+ this.$nextTick(() => {
+ if (this.$refs.uploadRef) {
+ this.$refs.uploadRef.clearFiles();
+ }
+ });
},
- /** 闄勪欢绉婚櫎澶勭悊 */
- handleAttachmentRemove(file) {
- // 鐩存帴璋冪敤鏂扮殑鍒犻櫎鏂规硶
- if (file.raw) {
- this.handleRemoveAttachmentByFile(file.raw);
- } else if (file.url) {
- const target = this.attachments.find(
- item => item.path === file.url || item.fileUrl === file.url
- );
- if (target) {
- this.handleRemoveAttachmentByFile(target);
- }
- }
-},
-
- /** 涓婁紶鎴愬姛澶勭悊 */
- handleUploadSuccess({ file, fileList, response }) {
- if (response.code === 200) {
- // 鏍规嵁褰撳墠婵�娲荤殑 Tab 鍐冲畾鍒嗙被锛堟湭鍒嗙被 Tab 瀵瑰簲绌哄瓧绗︿覆锛�
- const category = this.activeTab === '鏈垎绫�' ? '' : this.activeTab;
- const attachmentObj = {
- fileName: file.name,
- path: response.fileUrl || file.url,
- fileUrl: response.fileUrl || file.url,
- fileType: category, // 鍏抽敭锛氳褰曞垎绫�
- fileSize: file.size,
- uploadTime: dayjs().format('YYYY-MM-DD HH:mm:ss')
- };
-
- if (!Array.isArray(this.attachments)) {
- this.attachments = [];
- }
- this.attachments.push(attachmentObj);
- this.attachmentFileList = fileList;
- this.$message.success('鏂囦欢涓婁紶鎴愬姛');
- }
-},
-// 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
-getCategoryCount(category) {
- return this.attachments.filter(item => {
- const type = item.fileType || '';
- if (category === '鏈垎绫�') {
- return !this.presetCategories.includes(type);
- }
- return type === category;
- }).length;
-},
-
-// 鑾峰彇鏌愬垎绫荤殑鏂囦欢鍒楄〃
-getCategoryFiles(category) {
- return this.attachments.filter(item => {
- const type = item.fileType || '';
- if (category === '鏈垎绫�') {
- return !this.presetCategories.includes(type);
- }
- return type === category;
- });
-},
-
-// 鏇存柊闄勪欢鍒嗙被锛堜笅鎷変慨鏀规椂瑙﹀彂锛�
-updateAttachmentCategory(row, newVal) {
- const target = this.attachments.find(item => item === row);
- if (target) {
- target.fileType = newVal; // 鍙兘涓虹┖瀛楃涓�
- // 鍚屾鏇存柊 attachmentFileList
- const fileItem = this.attachmentFileList.find(
- f => f.raw === row || f.url === row.fileUrl
- );
- if (fileItem) {
- fileItem.raw.fileType = newVal;
- fileItem.fileType = newVal || '鏈垎绫�';
- }
- // 濡傛灉褰撳墠婵�娲荤殑tab娌℃湁鏂囦欢浜嗭紝鑷姩鍒囨崲鍒扮涓�涓湁鏂囦欢鐨則ab
- const currentTabHasFiles = this.getCategoryFiles(this.activeTab).length > 0;
- if (!currentTabHasFiles) {
- const firstCategory = this.categories[0];
- if (firstCategory) this.activeTab = firstCategory;
- }
- }
-},
-
-// 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
-handleRemoveAttachmentByFile(file) {
- const index = this.attachments.findIndex(item => item === file);
- if (index > -1) {
- this.attachments.splice(index, 1);
- // 鍚屾鍒犻櫎 attachmentFileList
- const fileIndex = this.attachmentFileList.findIndex(
- f => f.raw === file || f.url === file.fileUrl
- );
- if (fileIndex > -1) {
- this.attachmentFileList.splice(fileIndex, 1);
- }
- this.$message.success('闄勪欢鍒犻櫎鎴愬姛');
- }
-},
- /** 涓婁紶閿欒澶勭悊 */
- handleUploadError({ file, fileList, error }) {
- console.error("闄勪欢涓婁紶澶辫触:", error);
- this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+ // 涓婁紶鍓嶆牎楠�
+ beforeUpload(file) {
+ const allowedTypes = [
+ "application/pdf",
+ "image/jpeg",
+ "image/png",
+ "application/msword",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+ ];
+ const maxSize = 10 * 1024 * 1024;
+ const isTypeOk =
+ allowedTypes.includes(file.type) ||
+ file.name.endsWith(".pdf") ||
+ file.name.endsWith(".jpg") ||
+ file.name.endsWith(".jpeg") ||
+ file.name.endsWith(".png") ||
+ file.name.endsWith(".doc") ||
+ file.name.endsWith(".docx");
+ if (!isTypeOk) {
+ this.$message.error(
+ "鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼爌df銆乯pg銆乸ng銆乨oc鎴杁ocx鏍煎紡鏂囦欢"
+ );
+ return false;
+ }
+ if (file.size > maxSize) {
+ this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
+ return false;
+ }
+ return true;
},
- /** 鎵嬪姩鍒犻櫎闄勪欢 */
- handleRemoveAttachment(index) {
- this.attachments.splice(index, 1);
- this.attachmentFileList.splice(index, 1);
- this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+ // 鏂囦欢閫夋嫨鍙樺寲
+ handleFileChange(file, fileList) {
+ this.tempFileList = fileList;
},
- /** 鏂囦欢棰勮 */
+ // 涓存椂绉婚櫎
+ handleTempRemove(file, fileList) {
+ this.tempFileList = fileList;
+ },
+
+ // 涓婁紶鎴愬姛澶勭悊
+ handleUploadSuccess(response, file, fileList) {
+ if (response.code !== 200) {
+ this.$message.error(response.msg || "涓婁紶澶辫触");
+ return;
+ }
+ // 鏈垎绫诲搴旂┖瀛楃涓诧紝涓庡睍绀�/淇濆瓨閫昏緫涓�鑷�
+ const category =
+ this.currentUploadCategory === "鏈垎绫�"
+ ? ""
+ : this.currentUploadCategory;
+ const attachmentObj = {
+ fileName: file.name,
+ path: response.fileUrl || response.url || response.data || file.url,
+ fileUrl: response.fileUrl || response.url || response.data || file.url,
+ fileType: category,
+ fileSize: file.size,
+ uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+ };
+ if (!Array.isArray(this.attachments)) {
+ this.attachments = [];
+ }
+ this.attachments.push(attachmentObj);
+ this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+ this.uploadLoading = false;
+ this.uploadDialogVisible = false;
+ this.tempFileList = [];
+ },
+
+ // 鎻愪氦涓婁紶
+ submitUpload() {
+ if (this.tempFileList.length === 0) {
+ this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
+ return;
+ }
+ this.uploadLoading = true;
+ this.$refs.uploadRef.submit();
+ },
+
+ // 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
+ getCategoryCount(category) {
+ return this.attachments.filter(item => {
+ const type = item.fileType || "";
+ if (category === "鏈垎绫�") {
+ return !this.presetCategories.includes(type);
+ }
+ return type === category;
+ }).length;
+ },
+
+ // 鑾峰彇鏌愬垎绫荤殑鏂囦欢鍒楄〃
+ getCategoryFiles(category) {
+ return this.attachments.filter(item => {
+ const type = item.fileType || "";
+ if (category === "鏈垎绫�") {
+ return !this.presetCategories.includes(type);
+ }
+ return type === category;
+ });
+ },
+
+ // 鏇存柊闄勪欢鍒嗙被锛堜笅鎷変慨鏀规椂瑙﹀彂锛�
+ updateAttachmentCategory(row, newVal) {
+ const target = this.attachments.find(item => item === row);
+ if (target) {
+ target.fileType = newVal;
+ const currentTabHasFiles =
+ this.getCategoryFiles(this.activeTab).length > 0;
+ if (!currentTabHasFiles) {
+ const firstCategory = this.categories[0];
+ if (firstCategory) this.activeTab = firstCategory;
+ }
+ }
+ },
+
+ // 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
+ handleRemoveAttachmentByFile(file) {
+ this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning"
+ })
+ .then(() => {
+ const index = this.attachments.findIndex(item => item === file);
+ if (index > -1) {
+ this.attachments.splice(index, 1);
+ this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+ }
+ })
+ .catch(() => {});
+ },
+
+ // 鏂囦欢棰勮
handlePreview(file) {
this.currentPreviewFile = {
fileName: file.fileName,
fileUrl: file.path || file.fileUrl,
fileType: this.getFileType(file.fileName)
};
- this.filePreviewTitle = file.fileName;
- this.filePreviewVisible = true;
+ this.previewVisible = true;
},
- /** 鏂囦欢涓嬭浇 */
+ // 鏂囦欢涓嬭浇
handleDownload(file) {
const fileUrl = file.path || file.fileUrl;
const fileName = file.fileName;
diff --git a/src/views/business/course/components/OrganUtilizationStage.vue b/src/views/business/course/components/OrganUtilizationStage.vue
index 0545d9b..a3e8163 100644
--- a/src/views/business/course/components/OrganUtilizationStage.vue
+++ b/src/views/business/course/components/OrganUtilizationStage.vue
@@ -1,673 +1,254 @@
<template>
- <div class="organ-utilization-detail">
- <el-form :model="form" ref="form" :rules="rules" label-width="120px">
- <!-- 鍩烘湰淇℃伅 -->
- <el-card class="detail-card">
- <div slot="header" class="clearfix">
- <span class="detail-title">鍣ㄥ畼鍒╃敤鍩烘湰淇℃伅</span>
- </div>
+ <div class="organ-procurement-detail">
+ <!-- <case-basic-info :case-id="caseId" :show-attachment="true":column="3" /> -->
- <el-row :gutter="20">
- <el-col :span="6">
- <el-form-item label="璐熻矗浜�" prop="responsibleusername">
- <el-input
- v-model="form.responsibleusername"
- placeholder="璇疯緭鍏ヨ礋璐d汉濮撳悕"
- />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="鍗忚皟鍛樹竴" prop="coordinatedusernameo">
- <el-input
- v-model="form.coordinatedusernameo"
- placeholder="璇疯緭鍏ュ崗璋冨憳涓�濮撳悕"
- />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet">
- <el-input
- v-model="form.coordinatedusernamet"
- placeholder="璇疯緭鍏ュ崗璋冨憳浜屽鍚�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="瀹屾垚鏃堕棿" prop="completetime">
- <el-date-picker
- v-model="form.completetime"
- type="datetime"
- 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="createBy">
- <el-input v-model="form.createBy" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐧昏鏃堕棿" prop="createTime">
- <el-date-picker
- v-model="form.createTime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row> -->
- </el-card>
- <el-card class="detail-card">
- <div slot="header" class="clearfix">
- <span class="detail-title">閬椾綋鎹愮尞淇℃伅</span>
- </div>
- <el-row :gutter="20">
- <el-col :span="6">
- <el-form-item align="left" label="閬椾綋鎺ユ敹" prop="isbodydonation">
- <el-radio-group v-model="form.isbodydonation">
- <el-radio
- v-for="dict in dict.type.sys_0_1 || []"
- :key="dict.value"
- :label="dict.value"
- >{{ dict.label }}</el-radio
- >
- </el-radio-group>
- </el-form-item>
- </el-col>
-
- <el-col :span="8">
- <el-form-item align="left" label="鎺ユ敹瀹跺睘" prop="relationname">
- <el-input
- v-model="form.relationname"
- placeholder="璇疯緭鍏ユ帴鏀跺灞�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="涓庢崘鐚�呭叧绯�" prop="signfamilyrelations">
- <el-select
- v-model="form.signfamilyrelations"
- placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
- >
- <el-option
- v-for="dict in dict.type.sys_FamilyRelation || []"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-card>
- </el-form>
- <!-- 鍣ㄥ畼鍒╃敤璁板綍閮ㄥ垎 - 鏁村悎鍙楄�呰鎯� -->
- <el-card class="utilization-card">
+ <!-- 鍩烘湰淇℃伅 -->
+ <el-card class="detail-card">
<div slot="header" class="clearfix">
- <span class="detail-title">鍣ㄥ畼鍒╃敤璁板綍</span>
+ <span class="detail-title">鍣ㄥ畼鑾峰彇鍩烘湰淇℃伅</span>
+ </div>
+
+ <el-descriptions title="鎵嬫湳淇℃伅" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="鎵嬫湳鍖荤敓">{{ form.operationdoctor || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鎵嬫湳寮�濮嬫椂闂�">{{ form.operationbegtime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鎵嬫湳缁撴潫鏃堕棿">{{ form.operationendtime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鑵逛富鍔ㄨ剦鎻掔鏃堕棿">{{ form.abdominalaortacannulatime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鑵逛富鍔ㄨ剦鐏屾敞鏃堕棿">{{ form.abdominalaortaperfusiontime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="闂ㄩ潤鑴夋彃绠℃椂闂�">{{ form.portalveincannulatime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="闂ㄩ潤鑴夌亴娉ㄦ椂闂�">{{ form.portalveinperfusiontime || '-' }}</el-descriptions-item>
+ </el-descriptions>
+
+ <el-descriptions title="鍗忚皟鍛樹俊鎭�" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="杩涙墜鏈鏃堕棿">{{ form.coordinatorInOperating || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍑烘墜鏈鏃堕棿">{{ form.coordinatorOutOperating || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鏄惁榛樺搥缂呮��">{{ form.isspendremember === 1 ? '鏄�' : form.isspendremember === 0 ? '鍚�' : '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鎭㈠閬椾綋浠">{{ form.isrestoreremains === 1 ? '鏄�' : form.isrestoreremains === 0 ? '鍚�' : '-' }}</el-descriptions-item>
+ </el-descriptions>
+
+ <el-descriptions title="璐熻矗浜轰俊鎭�" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="璐熻矗浜哄鍚�">{{ form.responsibleusername || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍗忚皟鍛樹竴">{{ form.coordinatedusernameo || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍗忚皟鍛樹簩">{{ form.coordinatedusernamet || '-' }}</el-descriptions-item>
+ </el-descriptions>
+
+ <el-descriptions title="鑾峰彇鏈烘瀯淇℃伅" :column="descriptionColumn" border size="small">
+ <el-descriptions-item label="鑾峰彇鏈烘瀯鍚嶇О">{{ form.gainhospitalname || '-' }}</el-descriptions-item>
+ </el-descriptions>
+ </el-card>
+
+ <!-- 鍣ㄥ畼鑾峰彇璁板綍閮ㄥ垎 -->
+ <el-card class="procurement-card">
+ <div slot="header" class="clearfix">
+ <span class="detail-title">鍣ㄥ畼鑾峰彇璁板綍</span>
<div style="float: right;">
<dict-tag
- :options="dict.type.utilize_statue"
- :value="form.completeState"
+ :options="dict.type.Obtain_status"
+ :value="form.witnessState"
/>
</div>
</div>
- <el-form
- ref="utilizationForm"
- :rules="utilizationRules"
- :model="utilizationData"
- label-position="right"
- >
- <el-row>
- <el-col>
- <el-form-item label-width="100px" label="绉绘鍣ㄥ畼">
- <el-checkbox-group
- v-model="selectedOrgans"
- @change="handleOrganSelectionChange"
- >
- <el-checkbox
- v-for="dict in dict.type.sys_Organ || []"
- :key="dict.value"
- :label="dict.value"
- >
- {{ dict.label }}
- </el-checkbox>
- </el-checkbox-group>
- </el-form-item>
- </el-col>
- </el-row>
+ <el-descriptions title="鎹愮尞鍣ㄥ畼" :column="1" border size="small" style="margin-bottom: 16px;">
+ <el-descriptions-item label="鎹愮尞鍣ㄥ畼">
+ <template v-if="selectedOrgans && selectedOrgans.length">
+ <span v-for="(v, i) in selectedOrgans" :key="v">
+ {{ getOrganLabel(v) }}<span v-if="i < selectedOrgans.length - 1">銆�</span>
+ </span>
+ </template>
+ <template v-else>-</template>
+ </el-descriptions-item>
+ </el-descriptions>
- <el-row>
- <el-col>
- <el-form-item>
- <el-table
- :data="displayOrgans"
- v-loading="loading"
- border
- style="width: 100%"
- :row-class-name="getOrganRowClassName"
- :expand-row-keys="expandedRows"
- @expand-change="handleExpandChange"
- row-key="organno"
- >
- <el-table-column type="expand" width="60">
- <template slot-scope="scope">
- <!-- 灞曞紑琛屽唴瀹� - 鍙楄�呰缁嗕俊鎭� -->
- <div class="recipient-detail-expand">
- <div class="recipient-header">
- <span class="recipient-title">鍙楄�呰缁嗕俊鎭�</span>
- <el-tag
- v-if="scope.row.transplantstate === '1'"
- type="success"
- size="small"
- >
- 宸茬Щ妞�
- </el-tag>
- <el-tag
- v-else-if="scope.row.transplantstate === '0'"
- type="warning"
- size="small"
- >
- 鏈Щ妞�
- </el-tag>
- <el-tag v-else type="info" size="small">
- 绉绘涓�
- </el-tag>
- </div>
+ <el-table :data="displayOrgans" v-loading="loading" border style="width: 100%">
+ <el-table-column label="鍣ㄥ畼鍚嶇О" align="center" prop="organname" />
+ <el-table-column label="鑾峰彇寮�濮嬫椂闂�" align="center" prop="organStartTime" />
+ <el-table-column label="鍣ㄥ畼绂讳綋鏃堕棿" align="center" prop="organgettime" />
+ <el-table-column label="鑾峰彇鍖婚櫌" align="center" prop="gainhospitalname" show-overflow-tooltip />
+ <el-table-column label="鑾峰彇鍖诲笀" align="center" prop="organgetdoct" />
+ <el-table-column label="璇存槑" align="center" prop="notgetreason" min-width="200" show-overflow-tooltip />
+ </el-table>
- <el-form
- :model="scope.row"
- label-width="140px"
- class="recipient-form"
- >
- <!-- 鍩烘湰淇℃伅閮ㄥ垎 -->
- <div class="form-section">
- <h4 class="section-title">鍩烘湰淇℃伅</h4>
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="鍙楄�呭鍚�">
- <el-input
- v-model="scope.row.name"
- placeholder="璇疯緭鍏ュ彈鑰呭鍚�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍑虹敓鏃ユ湡">
- <el-date-picker
- v-model="scope.row.birthday"
- type="date"
- value-format="yyyy-MM-dd"
- placeholder="閫夋嫨鍑虹敓鏃ユ湡"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鎬у埆">
- <el-select
- v-model="scope.row.sex"
- placeholder="璇烽�夋嫨鎬у埆"
- style="width: 100%"
- >
- <el-option label="鐢�" :value="0" />
- <el-option label="濂�" :value="1" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="骞撮緞">
- <el-input
- v-model="scope.row.age"
- placeholder="骞撮緞"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="璇佷欢绫诲瀷">
- <el-select
- v-model="scope.row.idcardtype"
- 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-select>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="璇佷欢鍙风爜">
- <el-input
- v-model="scope.row.idcardno"
- placeholder="璇佷欢鍙风爜"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </div>
-
- <!-- 鑱旂郴淇℃伅閮ㄥ垎 -->
- <div class="form-section">
- <h4 class="section-title">鑱旂郴淇℃伅</h4>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="绉绘涓績鍚嶇О">
- <el-input
- v-model="scope.row.hospitalname"
- placeholder="璇疯緭鍏ョЩ妞嶄腑蹇冨悕绉�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽">
- <el-input
- v-model="scope.row.phone"
- placeholder="鑱旂郴鐢佃瘽"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鐜颁綇鍦板潃">
- <el-input
- type="textarea"
- :rows="2"
- v-model="scope.row.residenceaddress"
- placeholder="璇疯緭鍏ヨ缁嗗湴鍧�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </div>
-
- <!-- 绉绘淇℃伅閮ㄥ垎 -->
- <div
- class="form-section"
- v-if="scope.row.transplantstate === '1'"
- >
- <h4 class="section-title">绉绘淇℃伅</h4>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="绉绘鏃堕棿">
- <el-date-picker
- v-model="scope.row.transplanttime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="閫夋嫨绉绘鏃ユ湡"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绉绘鍖荤敓">
- <el-input
- v-model="scope.row.transplantdoct"
- placeholder="璇疯緭鍏ョЩ妞嶅尰鐢�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </div>
-
- <!-- 鏈Щ妞嶅師鍥� -->
- <div
- class="form-section"
- v-if="scope.row.transplantstate === '0'"
- >
- <h4 class="section-title">鏈Щ妞嶄俊鎭�</h4>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鏈Щ妞嶅師鍥�">
- <el-input
- type="textarea"
- :rows="3"
- v-model="scope.row.abandonreason"
- placeholder="璇疯緭鍏ユ湭绉绘鍘熷洜"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </div>
- </el-form>
- </div>
- </template>
- </el-table-column>
-
- <el-table-column
- label="鍣ㄥ畼鍚嶇О"
- align="center"
- prop="organname"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.organname"
- placeholder="鍣ㄥ畼鍚嶇О"
- :disabled="true"
- />
- </template>
- </el-table-column>
-
- <!-- <el-table-column label="绯荤粺缂栧彿" align="center" prop="caseNo">
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.caseNo"
- placeholder="绯荤粺缂栧彿"
- />
- </template>
- </el-table-column> -->
-
- <el-table-column
- label="绉绘鍖婚櫌"
- align="center"
- width="260"
- prop="hospitalno"
- >
- <template slot-scope="scope">
- <el-autocomplete
- v-model="scope.row.hospitalname"
- :fetch-suggestions="queryHospitalSearch"
- placeholder="璇烽�夋嫨鎴栬緭鍏ョЩ妞嶅尰闄�"
- style="width: 100%"
- clearable
- ></el-autocomplete>
- </template>
- </el-table-column>
- <el-table-column
- label="绉绘鐘舵��"
- align="center"
- prop="transplantstate"
- >
- <template slot-scope="scope">
- <el-select
- v-model="scope.row.transplantstate"
- placeholder="璇烽�夋嫨绉绘鐘舵��"
- style="width: 100%"
- @change="handleTransplantStatusChange(scope.row, $event)"
- >
- <el-option
- v-for="dict in transplantStatusList"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </template>
- </el-table-column>
-
- <el-table-column
- label="绉绘鏃堕棿"
- align="center"
- width="220"
- prop="transplanttime"
- >
- <template slot-scope="scope">
- <el-date-picker
- clearable
- size="small"
- style="width: 100%"
- v-model="scope.row.transplanttime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="閫夋嫨绉绘鏃堕棿"
- />
- </template>
- </el-table-column>
-
- <el-table-column
- label="绉绘鍖荤敓"
- align="center"
- prop="transplantdoct"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.transplantdoct"
- placeholder="鍖诲笀濮撳悕"
- />
- </template>
- </el-table-column>
-
- <el-table-column label="鍙楄�呭鍚�" align="center" prop="name">
- <template slot-scope="scope">
- <el-input v-model="scope.row.name" placeholder="鍙楄�呭鍚�" />
- </template>
- </el-table-column>
- </el-table>
- </el-form-item>
- </el-col>
- </el-row>
-
- <!-- 缁熻淇℃伅 -->
-
- <div
- v-if="
- !utilizationData.serviceDonatecomporganList ||
- utilizationData.serviceDonatecomporganList.length == 0
- "
- class="empty-utilization"
- >
- <el-empty description="鏆傛棤鍒╃敤璁板綍" :image-size="80">
- <span>璇峰厛閫夋嫨瑕佸埄鐢ㄧ殑鍣ㄥ畼</span>
- </el-empty>
- </div>
- </el-form>
+ <div v-if="!displayOrgans.length" class="empty-procurement">
+ <el-empty description="鏆傛棤鑾峰彇璁板綍" :image-size="80" />
+ </div>
</el-card>
- <!-- 闄勪欢绠$悊閮ㄥ垎 -->
<!-- 闄勪欢绠$悊閮ㄥ垎 - 鍒嗙被Tab灞曠ず -->
<el-card class="attachment-card">
<div slot="header" class="clearfix">
<span class="detail-title">鐩稿叧闄勪欢</span>
</div>
- <!-- 涓婁紶鍖哄煙锛堟棤鍒嗙被閫夋嫨锛岀敱Tab鎺у埗锛� -->
- <div class="upload-wrapper">
- <UploadAttachment
- ref="uploadAttachment"
- :file-list="attachmentFileList"
- :limit="attachmentLimit"
- :accept="attachmentAccept"
- :multiple="true"
- @change="handleAttachmentChange"
- @upload-success="handleUploadSuccess"
- @upload-error="handleUploadError"
- @remove="handleAttachmentRemove"
- />
- <div style="font-size:12px; color:#909399; margin-top:4px;">
- 褰撳墠涓婁紶鍒嗙被锛�<el-tag size="small" type="info">{{
- activeTab === "鏈垎绫�" ? "鏈垎绫�" : activeTab
- }}</el-tag>
- 锛堝垏鎹� Tab 鍙敼鍙樹笂浼犲垎绫伙級
- </div>
- </div>
-
- <!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず锛屾敮鎸佷慨鏀瑰垎绫� -->
- <div class="attachment-list" v-if="attachments && attachments.length > 0">
- <el-tabs v-model="activeTab" type="border-card">
- <el-tab-pane
- v-for="category in categories"
- :key="category"
- :label="category + '(' + getCategoryCount(category) + ')'"
- :name="category"
+ <!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず -->
+ <el-tabs v-model="activeTab" type="border-card">
+ <el-tab-pane
+ v-for="category in categories"
+ :key="category"
+ :label="category + '(' + getCategoryCount(category) + ')'"
+ :name="category"
+ >
+ <el-table
+ :data="getCategoryFiles(category)"
+ style="width: 100%"
+ size="small"
+ border
>
- <el-table
- :data="getCategoryFiles(category)"
- style="width: 100%"
- size="small"
- border
- >
- <el-table-column label="鏂囦欢鍚�" min-width="180">
- <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="150">
- <template #default="scope">
- <el-select
- v-model="scope.row.fileType"
- size="small"
- @change="updateAttachmentCategory(scope.row, $event)"
- placeholder="閫夋嫨鍒嗙被"
- >
- <el-option label="鍘熻〃鎷嶇収" value="鍘熻〃鎷嶇収" />
- <el-option label="鎺ュ彈纭涔�" value="鎺ュ彈纭涔�" />
- <el-option label="寮冪敤璇存槑" value="寮冪敤璇存槑" />
- <el-option label="鎹愮尞璇佷功鐓х墖" value="鎹愮尞璇佷功鐓х墖" />
- <el-option label="鏈垎绫�" value="" />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鏂囦欢绫诲瀷" width="100">
- <template #default="scope">
- <el-tag size="small">{{
- getFileTypeText(scope.row.fileName)
- }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="涓婁紶鏃堕棿" width="160">
- <template #default="scope">
- <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鏂囦欢澶у皬" width="120">
- <template #default="scope">
- <span>{{ formatFileSize(scope.row.fileSize) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="180" fixed="right">
- <template #default="scope">
- <el-button
- size="mini"
- type="primary"
- @click="handlePreview(scope.row)"
- >棰勮</el-button
- >
- <el-button
- size="mini"
- type="danger"
- @click="handleRemoveAttachmentByFile(scope.row)"
- >鍒犻櫎</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </el-tab-pane>
- </el-tabs>
- </div>
-
- <!-- 鏃犻檮浠舵椂鏄剧ず -->
- <div v-else style="text-align:center; padding:20px; color:#909399;">
- 鏆傛棤闄勪欢锛岃涓婁紶
- </div>
+ <el-table-column label="鏂囦欢鍚�" min-width="180">
+ <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="150">
+ <template #default="scope">
+ <span>{{ scope.row.fileType || '鏈垎绫�' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢绫诲瀷" width="100">
+ <template #default="scope">
+ <el-tag size="small">{{
+ getFileTypeText(scope.row.fileName)
+ }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="涓婁紶鏃堕棿" width="160">
+ <template #default="scope">
+ <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢澶у皬" width="100">
+ <template #default="scope">
+ <span>{{ formatFileSize(scope.row.fileSize) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="100" fixed="right">
+ <template #default="scope">
+ <el-button
+ size="mini"
+ type="primary"
+ @click="handlePreview(scope.row)"
+ >棰勮</el-button
+ >
+ </template>
+ </el-table-column>
+ </el-table>
+ <div
+ v-if="getCategoryFiles(category).length === 0"
+ style="text-align:center; padding:20px; color:#909399;"
+ >
+ 鏆傛棤闄勪欢
+ </div>
+ </el-tab-pane>
+ </el-tabs>
</el-card>
- <div style="text-align: center; margin: 30px 0;">
- <el-button type="primary" @click="handleSave" :loading="saveLoading">
- 淇濆瓨
- </el-button>
- <el-button
- type="success"
- @click="handleComplete"
- :loading="confirmLoading"
- >
- 瀹屾垚鍒╃敤
- </el-button>
- </div>
- <!-- 鏂囦欢棰勮瀵硅瘽妗� -->
+ <!-- 鏂囦欢棰勮寮圭獥 -->
<FilePreviewDialog
- :visible="filePreviewVisible"
+ :visible="previewVisible"
:file="currentPreviewFile"
- @close="filePreviewVisible = false"
- @download="handleDownloadAttachment"
+ @close="previewVisible = false"
+ @download="handleDownload"
/>
</div>
</template>
<script>
-import {
- completionList,
- completionadd,
- completionedit
-} from "@/api/businessApi";
-import UploadAttachment from "@/components/UploadAttachment"; // 鏂板瀵煎叆
-import FilePreviewDialog from "@/components/FilePreviewDialog"; // 鏂板瀵煎叆
+import { witnessList, witnessadd, witnessedit } from "@/api/businessApi";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
import CaseBasicInfo from "@/components/CaseBasicInfo";
-import dayjs from "dayjs"; // 鏂板瀵煎叆锛岀敤浜庢椂闂村鐞�
+import { getToken } from "@/utils/auth";
+import dayjs from "dayjs";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
export default {
- name: "OrganUtilizationDetail",
+ name: "OrganProcurementDetail",
components: {
- UploadAttachment,
FilePreviewDialog,
CaseBasicInfo
},
- props: {
+ mixins: [readonlyDescriptionsMixin],
+ dicts: [
+ "sys_BloodType",
+ "Geta_hospital",
+ "sys_DonationCategory",
+ "sys_Organ",
+ "Obtain_status"
+ ],
+ props: {
infoid: {
type: String,
default: true
}
},
- dicts: [
- "Geta_hospital",
- "sys_BloodType",
- "sys_Organ",
- "sys_FamilyRelation",
- "sys_0_1",
- "utilize_statue"
- ],
data() {
return {
caseId: null,
- activeTab: "鍘熻〃鎷嶇収", // 褰撳墠婵�娲荤殑闄勪欢鍒嗙被Tab
- presetCategories: ["鍘熻〃鎷嶇収", "鎺ュ彈纭涔�", "寮冪敤璇存槑", "鎹愮尞璇佷功鐓х墖"], // 棰勮鍒嗙被
- // 琛ㄥ崟鏁版嵁 - 鏍规嵁鎺ュ彛鍙傛暟璋冩暣
+ // 琛ㄥ崟鏁版嵁
form: {
id: undefined,
infoid: undefined,
+ name: "",
inpatientno: "",
- completeState: "2",
+ witnessState: "2",
caseNo: "",
donorno: "",
treatmenthospitalname: "",
treatmenthospitalno: "",
sex: "",
- name: "",
age: "",
bloodtype: "",
idcardno: "",
diagnosisname: "",
- completetime: "",
+ coordinatorName: "",
+ gainhospitalno: "",
+ gainhospitalname: "",
+ deathtime: "",
+ deathreason: "",
+ deathjudgedocto: "",
+ deathjudgedoctt: "",
+ deathjudgeannex: "",
+ operationbegtime: "",
+ operationendtime: "",
+ operationdoctor: "",
+ isspendremember: 1,
+ isrestoreremains: 1,
+ rememberannex: "",
responsibleuserid: "",
responsibleusername: "",
coordinateduserido: "",
coordinatedusernameo: "",
coordinateduseridt: "",
coordinatedusernamet: "",
- assessannex: "",
- donateorgan: "",
- isbodydonation: "1",
- receivingunitname: "",
- createBy: "",
- createTime: "",
- updateBy: "",
- updateTime: "",
+ abdominalaortacannulatime: "",
+ abdominalaortaperfusiontime: "",
+ portalveincannulatime: "",
+ portalveinperfusiontime: "",
+ pulmonaryarterycannulatime: "",
+ pulmonaryarteryperfusiontime: "",
+ aortacannulatime: "",
+ aortaperfusiontime: "",
+ organdonation: "",
+ organdonationOther: "",
+ donationcategory: "",
+ coordinatorInOperating: "",
+ coordinatorOutOperating: "",
+ coordinatorSign: "",
+ coordinatorSignTime: "",
attachments: []
+ },
+ activeTab: "鍘熻〃鎷嶇収", // 褰撳墠婵�娲荤殑闄勪欢鍒嗙被Tab
+ presetCategories: [
+ "鍘熻〃鎷嶇収",
+ "浼︾悊瀹℃煡鏉愭枡",
+ "姝讳骸鍒ゅ畾鏉愭枡",
+ "榛樺搥浠紡鐓х墖",
+ "鎹愮尞瑙佽瘉瑙嗛"
+ ], // 棰勮鍒嗙被
+ organExpansionMap: {
+ C64: { subItems: ["C64L", "C64R"], subNames: ["宸﹁偩", "鍙宠偩"] },
+ C34: { subItems: ["C34L", "C34R"], subNames: ["宸﹁偤", "鍙宠偤"] }
},
// 琛ㄥ崟楠岃瘉瑙勫垯
rules: {
@@ -677,12 +258,15 @@
diagnosisname: [
{ required: true, message: "鐤剧梾璇婃柇涓嶈兘涓虹┖", trigger: "blur" }
],
- donorno: [
- { required: true, message: "鎹愮尞鑰呯紪鍙蜂笉鑳戒负绌�", trigger: "blur" }
+ donationcategory: [
+ { required: true, message: "鎹愮尞绫诲埆涓嶈兘涓虹┖", trigger: "change" }
+ ],
+ operationdoctor: [
+ { required: true, message: "鎵嬫湳鍖荤敓涓嶈兘涓虹┖", trigger: "blur" }
]
},
- // 鍒╃敤璁板綍楠岃瘉瑙勫垯
- utilizationRules: {},
+ // 鑾峰彇璁板綍楠岃瘉瑙勫垯
+ procurementRules: {},
// 淇濆瓨鍔犺浇鐘舵��
saveLoading: false,
confirmLoading: false,
@@ -692,44 +276,28 @@
selectedOrgans: [],
// 鍖婚櫌鍒楄〃
hospitalList: [],
- // 绉绘鐘舵�佸垪琛�
- transplantStatusList: [
- { value: "1", label: "宸茬Щ妞�" },
- { value: "0", label: "鏈Щ妞�" },
- { value: "2", label: "绉绘涓�" },
- { value: "3", label: "搴撳瓨" }
- ],
- organExpansionMap: {
- C64: { subItems: ["C64L", "C64R"], subNames: ["宸﹁偩", "鍙宠偩"] },
- C34: { subItems: ["C34L", "C34R"], subNames: ["宸﹁偤", "鍙宠偤"] }
- },
- // 鍒╃敤璁板綍鏁版嵁
- utilizationData: {
- serviceDonatecomporganList: []
- },
- // 闅忚璁板綍鏁版嵁
- followupData: {
- records: []
+ // 鑾峰彇璁板綍鏁版嵁
+ procurementData: {
+ serviceDonationwitnessorgans: []
},
// 闄勪欢鏁版嵁
attachments: [],
- // 灞曞紑鐨勮keys
- expandedRows: [],
+ // 涓婁紶鐩稿叧
+ uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+ headers: {
+ Authorization: "Bearer " + getToken()
+ },
+ uploadDialogVisible: false,
+ uploadLoading: false,
+ tempFileList: [],
+ currentUploadCategory: "",
// 缂栬緫瀵硅瘽妗�
editDialogVisible: false,
currentRecord: {},
currentEditIndex: -1,
- // 闄勪欢鐩稿叧閰嶇疆 - 鏂板
- attachmentFileList: [],
- attachmentLimit: 10,
- attachmentAccept:
- ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt",
-
- // 鏂囦欢棰勮鐩稿叧 - 鏂板
- filePreviewVisible: false,
- currentPreviewFile: null,
- currentFollowup: {},
- isEditingFollowup: false
+ // 鏂囦欢棰勮鐩稿叧
+ previewVisible: false,
+ currentPreviewFile: null
};
},
computed: {
@@ -737,25 +305,21 @@
currentUser() {
return JSON.parse(sessionStorage.getItem("user") || "{}");
},
+ displayOrgans() {
+ return (this.procurementData.serviceDonationwitnessorgans || []).filter(
+ item => item.delFlag !== 1
+ );
+ },
categories() {
- // 濮嬬粓杩斿洖鎵�鏈夐璁惧垎绫� + 鏈垎绫伙紝鍗充娇娌℃湁鏁版嵁涔熸樉绀�
- const allCategories = ['鍘熻〃鎷嶇収', '鎺ュ彈纭涔�', '寮冪敤璇存槑', '鎹愮尞璇佷功鐓х墖', '鏈垎绫�'];
- return allCategories;
- },
- // 宸茬Щ妞嶆暟閲�
- transplantedCount() {
- if (!this.utilizationData.serviceDonatecomporganList) return 0;
- return this.utilizationData.serviceDonatecomporganList.filter(
- record => record.transplantstate === "1"
- ).length;
- },
- // 鍞竴鍖婚櫌鏁伴噺
- uniqueHospitals() {
- if (!this.utilizationData.serviceDonatecomporganList) return 0;
- const hospitals = this.utilizationData.serviceDonatecomporganList
- .map(record => record.hospitalno)
- .filter(Boolean);
- return new Set(hospitals).size;
+ // 濮嬬粓杩斿洖鎵�鏈夐璁惧垎绫� + 鏈垎绫伙紝鏃犺鏄惁鏈夋暟鎹�
+ return [
+ "鍘熻〃鎷嶇収",
+ "浼︾悊瀹℃煡鏉愭枡",
+ "姝讳骸鍒ゅ畾鏉愭枡",
+ "榛樺搥浠紡鐓х墖",
+ "鎹愮尞瑙佽瘉瑙嗛",
+ "鏈垎绫�"
+ ];
},
organReverseMap() {
const map = {};
@@ -767,11 +331,24 @@
}
return map;
},
- // 杩囨护鎺� delFlag=1 鐨勮褰曪紙鐢ㄤ簬琛ㄦ牸灞曠ず锛�
- displayOrgans() {
- return (this.utilizationData.serviceDonatecomporganList || []).filter(
- item => item.delFlag !== 1
- );
+ // 涓嶅畬鏁寸殑璁板綍鏁伴噺
+ incompleteRecords() {
+ if (!this.procurementData.serviceDonationwitnessorgans) return 0;
+ return this.procurementData.serviceDonationwitnessorgans.filter(
+ record =>
+ !record.organStartTime ||
+ !record.organgettime ||
+ !record.gainhospitalno ||
+ !record.organgetdoct
+ ).length;
+ },
+ // 鍞竴鍖婚櫌鏁伴噺
+ uniqueHospitals() {
+ if (!this.procurementData.serviceDonationwitnessorgans) return 0;
+ const hospitals = this.procurementData.serviceDonationwitnessorgans
+ .map(record => record.gainhospitalno)
+ .filter(Boolean);
+ return new Set(hospitals).size;
},
// 鑾峰彇鍣ㄥ畼瀛楀吀
organDict() {
@@ -779,47 +356,110 @@
}
},
created() {
+ this.caseId = this.infoid;
+
this.initData();
},
- watch: {
- // 鐩戝惉闄勪欢鏁版嵁鍙樺寲 - 鏂板
- attachments: {
- handler(newAttachments) {
- this.attachmentFileList = newAttachments.map(item => ({
- uid: item.id || Math.random(),
- name: item.fileName,
- fileSize: item.fileSize,
- url: item.path || item.fileUrl,
- uploadTime: item.uploadTime,
- status: "success"
- }));
- },
- deep: true
- }
- },
methods: {
+ // 鏍规嵁瀛楀吀value鑾峰彇label
+ getOrganLabel(organValue) {
+ const dictItem = this.organDict.find(item => item.value === organValue);
+ return dictItem ? dictItem.label : organValue;
+ },
+
// 鍒濆鍖栨暟鎹�
initData() {
- this.caseId = this.infoid;
+ const infoid = this.infoid;
- if (!this.caseId) {
+ if (!infoid) {
this.$message.error("缂哄皯蹇呰鐨勮矾鐢卞弬鏁� infoid");
this.$router.back();
return;
}
- this.form.infoid = this.caseId;
- this.form.createBy =
- this.currentUser.username || this.currentUser.name || "褰撳墠鐢ㄦ埛";
- this.form.createTime = new Date()
- .toISOString()
- .replace("T", " ")
- .substring(0, 19);
+ this.form.infoid = infoid;
+ // this.generateDonorNo();
- this.getDetail();
+ if (infoid) {
+ this.getDetail(infoid);
+ }
+
+ this.getHospitalData();
+ },
+ getOrganNameByNo(organno) {
+ // 妫�鏌ユ槸鍚﹀湪鏄犲皠鐨勫瓙椤逛腑
+ for (const key in this.organExpansionMap) {
+ const { subItems, subNames } = this.organExpansionMap[key];
+ const idx = subItems.indexOf(organno);
+ if (idx !== -1) {
+ return subNames[idx];
+ }
+ }
+ // 鍚﹀垯浠庡瓧鍏镐腑鑾峰彇
+ return this.getOrganLabel(organno);
+ },
+ // 鑾峰彇璇︽儏
+ async getDetail(infoid) {
+ this.loading = true;
+ try {
+ const response = await witnessList({ infoid });
+ if (
+ response.code === 200 &&
+ response.data &&
+ response.data.length > 0
+ ) {
+ const data = response.data[0];
+ if (!data.witnessState || data.witnessState == 1) {
+ data.witnessState = "2";
+ }
+
+ // 濉厖琛ㄥ崟鏁版嵁
+ Object.assign(this.form, data);
+
+ // 鍒濆鍖栭檮浠�
+ if (this.form.deathjudgeannex) {
+ const parsed = JSON.parse(this.form.deathjudgeannex);
+ this.attachments = parsed.map(item => ({
+ ...item,
+ fileType: item.fileType || "" // 榛樿绌哄瓧绗︿覆琛ㄧず鏈垎绫�
+ }));
+ this.form.attachments = this.attachments;
+ } else {
+ this.attachments = [];
+ }
+
+ // 澶勭悊鎹愮尞鍣ㄥ畼瀛楁
+ if (data.organdonation) {
+ const organArray = Array.isArray(data.organdonation)
+ ? data.organdonation
+ : (data.organdonation || "").split(",").filter(item => item);
+ this.selectedOrgans = organArray;
+ this.form.organdonationOther = data.organdonationOther || "";
+ }
+
+ // 澶勭悊鍣ㄥ畼鑾峰彇璁板綍
+ if (data.serviceDonationwitnessorgans) {
+ this.procurementData.serviceDonationwitnessorgans = Array.isArray(
+ data.serviceDonationwitnessorgans
+ )
+ ? data.serviceDonationwitnessorgans
+ : [];
+ }
+
+ this.$message.success("鏁版嵁鍔犺浇鎴愬姛");
+ this.syncOrgansFromSelection();
+ } else {
+ this.$message.warning("鏈壘鍒板搴旂殑鍣ㄥ畼鑾峰彇鏁版嵁");
+ }
+ } catch (error) {
+ console.error("鑾峰彇鍣ㄥ畼鑾峰彇璇︽儏澶辫触:", error);
+ this.$message.error("鑾峰彇璇︽儏澶辫触");
+ } finally {
+ this.loading = false;
+ }
},
syncOrgansFromSelection() {
- const records = this.utilizationData.serviceDonatecomporganList || [];
+ const records = this.procurementData.serviceDonationwitnessorgans || [];
const targetNos = [];
this.selectedOrgans.forEach(val => {
if (this.organExpansionMap[val]) {
@@ -829,125 +469,77 @@
}
});
+ // 鏂板鎴栨仮澶�
targetNos.forEach(no => {
const existing = records.find(r => r.organno === no);
if (existing) {
- if (existing.delFlag === 1) existing.delFlag = 0;
+ if (existing.delFlag === 1) {
+ existing.delFlag = 0; // 鎭㈠鏄剧ず
+ }
} else {
- // 浣跨敤鍒涘缓鏂规硶锛岃嚜鍔ㄥ寘鍚� delFlag:0
- this.createOrganRecord(no);
+ records.push({
+ id: null,
+ organname: this.getOrganNameByNo(no),
+ organno: no,
+ organStartTime: "",
+ organgettime: "",
+ gainhospitalno: "",
+ gainhospitalname: "",
+ organgetdoct: "",
+ assistant: "",
+ procurementNurse: "",
+ operatingRoomNurse: "",
+ anesthesiologist: "",
+ organstate: "1",
+ notgetreason: "",
+ delFlag: 0
+ });
}
});
- // 寮哄埗鎵�鏈夎褰� delFlag=0锛堝姞杞芥椂搴旇鍏ㄩ儴鏈夋晥锛�
- records.forEach(r => (r.delFlag = 0));
- this.form.donateorgan = this.selectedOrgans.join(",");
+ // 锛堝彲閫夛級濡傛灉鍔犺浇鏃跺悗绔繑鍥炰簡 delFlag=1 鐨勮褰曪紝浣嗗疄闄呭簲璇ユ樉绀猴紝寮哄埗閲嶇疆
+ records.forEach(r => {
+ if (r.delFlag === 1) r.delFlag = 0;
+ });
+
+ this.form.organdonation = this.selectedOrgans.join(",");
},
- // 鑾峰彇璇︽儏
- async getDetail() {
- this.loading = true;
+ // 鑾峰彇鍖婚櫌鏁版嵁
+ async getHospitalData() {
try {
- const response = await completionList({ infoid: this.caseId });
- if (
- response.code === 200 &&
- response.data &&
- response.data.length > 0
- ) {
- const data = response.data[0];
- if (!data.completeState || data.completeState == 1) {
- data.completeState = "2";
- }
- this.form = data;
- // 濉厖琛ㄥ崟鏁版嵁
- // Object.assign(this.form, data);
- this.form.signfamilyrelations = this.form.signfamilyrelations || "";
- // 澶勭悊鎹愮尞鍣ㄥ畼瀛楁
- if (data.donateorgan) {
- const organArray = Array.isArray(data.donateorgan)
- ? data.donateorgan
- : (data.donateorgan || "").split(",").filter(item => item);
- this.selectedOrgans = organArray;
- }
-
- // 澶勭悊鍣ㄥ畼鍒╃敤璁板綍
- if (data.serviceDonatecomporganList) {
- this.utilizationData.serviceDonatecomporganList = Array.isArray(
- data.serviceDonatecomporganList
- )
- ? data.serviceDonatecomporganList.map(record => ({
- ...record,
- transplanttime: record.transplanttime || "",
- transplantstate: record.transplantstate
- ? record.transplantstate.toString()
- : "1"
- }))
- : [];
- }
- console.log(this.utilizationData.serviceDonatecomporganList);
-
- // 鍒濆鍖栭檮浠�
- // 鏀逛负锛堢‘淇濇瘡涓檮浠堕兘鏈� fileType 瀛楁锛�
- if (this.form.assessannex) {
- const parsed = JSON.parse(this.form.assessannex);
- this.attachments = parsed.map(item => ({
- ...item,
- fileType: item.fileType || "" // 榛樿绌哄瓧绗︿覆琛ㄧず鏈垎绫�
- }));
- this.form.attachments = this.attachments;
- // 鍚屾 attachmentFileList
- this.attachmentFileList = this.attachments.map(item => ({
- uid: item.id || Math.random(),
- name: item.fileName,
- url: item.path || item.fileUrl,
- fileSize: item.fileSize,
- uploadTime: item.uploadTime,
- status: "success",
- raw: item
- }));
- } else {
- this.attachments = [];
- this.attachmentFileList = [];
- }
-
- this.$message.success("鏁版嵁鍔犺浇鎴愬姛");
- this.syncOrgansFromSelection();
- } else {
- this.$message.warning("鏈壘鍒板搴旂殑鍣ㄥ畼鍒╃敤鏁版嵁");
- }
+ // TODO: 鏇挎崲涓哄疄闄呯殑鍖婚櫌鍒楄〃鎺ュ彛
+ // 鏆傛椂浣跨敤妯℃嫙鏁版嵁
+ this.hospitalList = [
+ { hospitalNo: "H001", hospitalName: "鍖椾含鍗忓拰鍖婚櫌" },
+ { hospitalNo: "H002", hospitalName: "涓婃捣鍗庡北鍖婚櫌" },
+ { hospitalNo: "H003", hospitalName: "骞垮窞涓北鍖婚櫌" },
+ { hospitalNo: "H004", hospitalName: "姝︽眽鍚屾祹鍖婚櫌" },
+ { hospitalNo: "H005", hospitalName: "鎴愰兘鍗庤タ鍖婚櫌" }
+ ];
} catch (error) {
- console.error("鑾峰彇鍣ㄥ畼鍒╃敤璇︽儏澶辫触:", error);
- this.$message.error("鑾峰彇璇︽儏澶辫触");
- } finally {
- this.loading = false;
+ console.error("鑾峰彇鍖婚櫌鏁版嵁澶辫触:", error);
+ this.$message.error("鑾峰彇鍖婚櫌鏁版嵁澶辫触");
}
},
+ // 绉绘鍖婚櫌妯$硦鎼滅储
+ queryHospitalSearch(queryString, cb) {
+ const hospitals = this.dict.type.Geta_hospital || [];
+ const results = queryString
+ ? hospitals.filter(item =>
+ item.label.toLowerCase().includes(queryString.toLowerCase())
+ )
+ : hospitals;
- // 鑾峰彇鍖婚櫌鏁版嵁
- // async getHospitalData() {
- // try {
- // // TODO: 鏇挎崲涓哄疄闄呯殑鍖婚櫌鍒楄〃鎺ュ彛
- // // 鏆傛椂浣跨敤妯℃嫙鏁版嵁
- // this.hospitalList = [
- // { hospitalNo: "H001", hospitalName: "鍖椾含鍗忓拰鍖婚櫌" },
- // { hospitalNo: "H002", hospitalName: "涓婃捣鍗庡北鍖婚櫌" },
- // { hospitalNo: "H003", hospitalName: "涓婃捣鐟為噾鍖婚櫌" },
- // { hospitalNo: "H004", hospitalName: "骞垮窞涓北鍖婚櫌" },
- // { hospitalNo: "H005", hospitalName: "姝︽眽鍚屾祹鍖婚櫌" },
- // { hospitalNo: "H006", hospitalName: "鎴愰兘鍗庤タ鍖婚櫌" }
- // ];
- // } catch (error) {
- // console.error("鑾峰彇鍖婚櫌鏁版嵁澶辫触:", error);
- // this.$message.error("鑾峰彇鍖婚櫌鏁版嵁澶辫触");
- // }
- // },
-
+ // el-autocomplete 闇�瑕� value 瀛楁
+ cb(results.map(item => ({ value: item.label })));
+ },
// 鍣ㄥ畼閫夋嫨鐘舵�佸彉鍖�
async handleOrganSelectionChange(selectedValues) {
// 1. 澶勭悊浜掓枼閫昏緫锛堜慨鏀� this.selectedOrgans锛�
this.handleExclusiveSelections(selectedValues);
const finalSelected = this.selectedOrgans;
- const records = this.utilizationData.serviceDonatecomporganList || [];
+ const records = this.procurementData.serviceDonationwitnessorgans || [];
// 2. 鏋勫缓鐩爣鍣ㄥ畼缂栧彿鍒楄〃锛堝睍寮�缁勫悎鍣ㄥ畼锛�
const targetOrganNos = [];
@@ -959,7 +551,7 @@
}
});
- // 3. 鏂板鎴栨仮澶嶈褰曪紙鏃犻渶寮圭獥锛�
+ // 3. 鏂板鎴栨仮澶嶇洰鏍囧櫒瀹樿褰曪紙鏃犲脊绐楋級
targetOrganNos.forEach(no => {
const existing = records.find(r => r.organno === no);
if (existing) {
@@ -967,11 +559,27 @@
existing.delFlag = 0; // 鎭㈠鏄剧ず
}
} else {
- this.createOrganRecord(no); // 鏂板璁板綍锛堝寘鍚� delFlag:0锛�
+ records.push({
+ id: null,
+ organname: this.getOrganNameByNo(no),
+ organno: no,
+ organStartTime: "",
+ organgettime: "",
+ gainhospitalno: "",
+ gainhospitalname: "",
+ organgetdoct: "",
+ assistant: "",
+ procurementNurse: "",
+ operatingRoomNurse: "",
+ anesthesiologist: "",
+ organstate: "1",
+ notgetreason: "",
+ delFlag: 0
+ });
}
});
- // 4. 鎵惧嚭闇�瑕佸彇娑堢殑璁板綍锛堜笉鍦ㄧ洰鏍囬泦鍚堜腑鐨勶級
+ // 4. 鎵惧嚭闇�瑕佸彇娑堢殑璁板綍锛堜笉鍦ㄧ洰鏍囬泦鍚堜腑锛�
const toRemove = records.filter(r => !targetOrganNos.includes(r.organno));
const toRemoveSaved = toRemove.filter(r => r.id); // 宸蹭繚瀛橈紝闇�纭
const toRemoveUnsaved = toRemove.filter(r => !r.id); // 鏈繚瀛橈紝鐩存帴绉婚櫎
@@ -987,7 +595,7 @@
const organNames = toRemoveSaved.map(r => r.organname).join("銆�");
try {
await this.$confirm(
- `鎮ㄧ‘瀹氳鍙栨秷浠ヤ笅宸蹭繚瀛樼殑鍣ㄥ畼鍒╃敤璁板綍鍚楋紵\n${organNames}\n鍙栨秷鍚庯紝杩欎簺璁板綍灏嗕粠鍒楄〃涓Щ闄わ紙鏁版嵁浠嶄繚鐣欙紝鍙仮澶嶏級銆俙,
+ `鎮ㄧ‘瀹氳鍙栨秷浠ヤ笅宸蹭繚瀛樼殑鍣ㄥ畼鑾峰彇璁板綍鍚楋紵\n${organNames}\n鍙栨秷鍚庯紝杩欎簺璁板綍灏嗕粠鍒楄〃涓Щ闄わ紙鏁版嵁浠嶄繚鐣欙紝鍙仮澶嶏級銆俙,
"鎻愮ず",
{
confirmButtonText: "纭畾绉婚櫎",
@@ -1001,7 +609,6 @@
});
} catch (error) {
// 鐢ㄦ埛鍙栨秷锛氭仮澶嶉�変腑鐘舵��
- // 灏嗗彇娑堢殑鍣ㄥ畼閲嶆柊鍔犲叆 this.selectedOrgans
const parentToRestore = new Set();
toRemoveSaved.forEach(r => {
const parent = this.organReverseMap[r.organno];
@@ -1016,56 +623,37 @@
this.selectedOrgans.push(val);
}
});
- // 鎻愮ず鐢ㄦ埛鎿嶄綔宸插彇娑�
this.$message.info("宸插彇娑堝垹闄ゆ搷浣�");
// 鏇存柊琛ㄥ崟瀛楁锛堜繚鎸佷竴鑷存�э級
- this.form.donateorgan = this.selectedOrgans.join(",");
- // 娉ㄦ剰锛氭鏃� records 涓凡鏂板浜嗙洰鏍囧櫒瀹橈紝骞朵笖涔嬪墠鐨勮褰曟湭琚爣璁板垹闄わ紝鐘舵�佷竴鑷淬��
- // 浣嗘槸锛屾垜浠繕闇�瑕佺Щ闄や箣鍓嶆柊澧炰絾鐢ㄦ埛鍙兘涓嶆兂淇濈暀鐨勮褰曪紵涓嶄細锛屽洜涓烘柊澧炵殑鏄洰鏍囧櫒瀹橈紝鐢ㄦ埛鏄兂淇濈暀鐨勩��
- // 鍥犳鐩存帴杩斿洖鍗冲彲銆�
- return;
+ this.form.organdonation = this.selectedOrgans.join(",");
+ return; // 閫�鍑烘柟娉曪紝閬垮厤缁х画鎵ц
}
}
// 5. 鏇存柊琛ㄥ崟瀛楁
- this.form.donateorgan = this.selectedOrgans.join(",");
+ this.form.organdonation = this.selectedOrgans.join(",");
},
- // 绉绘鍖婚櫌妯$硦鎼滅储
- queryHospitalSearch(queryString, cb) {
- const hospitals = this.dict.type.Geta_hospital || [];
- const results = queryString
- ? hospitals.filter(item =>
- item.label.toLowerCase().includes(queryString.toLowerCase())
- )
- : hospitals;
- // el-autocomplete 闇�瑕� value 瀛楁
- cb(results.map(item => ({ value: item.label })));
- },
// 澶勭悊浜掓枼閫夋嫨
handleExclusiveSelections(selectedValues) {
- // 濡傛灉閫夋嫨浜�"鍙岃偩"(鍋囪瀛楀吀鍊间负C64)锛岃嚜鍔ㄥ彇娑堝崟鐙殑"宸﹁偩"(C64L)鍜�"鍙宠偩"(C64R)閫夋嫨
+ // 鍙岃偩涓庡乏鍙宠偩浜掓枼
if (selectedValues.includes("C64")) {
this.selectedOrgans = selectedValues.filter(
item => item !== "C64L" && item !== "C64R"
);
- }
- // 濡傛灉閫夋嫨浜�"宸﹁偩"鎴�"鍙宠偩"锛屽彇娑�"鍙岃偩"閫夋嫨
- else if (
+ } else if (
selectedValues.includes("C64L") ||
selectedValues.includes("C64R")
) {
this.selectedOrgans = selectedValues.filter(item => item !== "C64");
}
- // 濡傛灉閫夋嫨浜�"鍏ㄨ偤"(鍋囪瀛楀吀鍊间负C34)锛岃嚜鍔ㄥ彇娑堝崟鐙殑"宸﹁偤"(C34L)鍜�"鍙宠偤"(C34R)閫夋嫨
+ // 鍏ㄨ偤涓庡乏鍙宠偤浜掓枼
if (selectedValues.includes("C34")) {
this.selectedOrgans = selectedValues.filter(
item => item !== "C34L" && item !== "C34R"
);
- }
- // 濡傛灉閫夋嫨浜�"宸﹁偤"鎴�"鍙宠偤"锛屽彇娑�"鍏ㄨ偤"閫夋嫨
- else if (
+ } else if (
selectedValues.includes("C34L") ||
selectedValues.includes("C34R")
) {
@@ -1077,158 +665,89 @@
createOrganRecord(organValue) {
const organName = this.getOrganLabel(organValue);
- this.utilizationData.serviceDonatecomporganList.push({
+ this.procurementData.serviceDonationwitnessorgans.push({
+ id: null,
organname: organName,
organno: organValue,
- caseNo: "",
- hospitalno: "",
- hospitalname: "",
- name: "",
- transplantdoct: "",
- transplanttime: "",
- transplantstate: "1",
- abandonreason: "",
- delFlag: 0, // 鏂板
- sex: "",
- age: "",
- birthday: "",
- phone: "",
- residenceaddress: "",
- residenceprovince: "",
- residenceprovincename: "",
- residencecity: "",
- residencecityname: "",
- residencetown: "",
- residencetownname: "",
- residencecommunity: "",
- residencecommunityname: "",
- residencecountycode: "",
- residencecountyname: "",
- idcardtype: "",
- idcardno: "",
- ageunit: ""
+ organStartTime: "",
+ organgettime: "",
+ gainhospitalno: "",
+ gainhospitalname: "",
+ organgetdoct: "",
+ assistant: "",
+ procurementNurse: "",
+ operatingRoomNurse: "",
+ anesthesiologist: "",
+ organstate: "1",
+ notgetreason: ""
});
},
- // 鏍规嵁瀛楀吀value鑾峰彇label
- getOrganLabel(organValue) {
- const dictItem = this.organDict.find(item => item.value === organValue);
- return dictItem ? dictItem.label : organValue;
- },
-
- // 绉绘鐘舵�佸彉鍖栧鐞�
- handleTransplantStatusChange(row, status) {
- if (status === "0") {
- // 濡傛灉鐘舵�佷负鏈Щ妞嶏紝娓呴櫎鐩稿叧瀛楁
- // row.transplanttime = "";
- // row.transplantdoct = "";
- // row.hospitalno = "";
- // row.hospitalname = "";
- } else if (status === "1") {
- // 濡傛灉鐘舵�佷负宸茬Щ妞嶏紝鑷姩璁剧疆绉绘鏃堕棿涓哄綋鍓嶆椂闂�
- if (!row.transplanttime) {
- row.transplanttime = new Date().toISOString().split("T")[0];
- }
+ // 鍖婚櫌閫夋嫨鍙樺寲
+ handleHospitalChange(row, hospitalNo) {
+ const hospital = this.hospitalList.find(
+ item => item.hospitalNo === hospitalNo
+ );
+ if (hospital) {
+ row.gainhospitalname = hospital.hospitalName;
}
},
-
- // 琛屽睍寮�浜嬩欢
- handleExpandChange(row, expandedRows) {
- this.expandedRows = expandedRows.map(item => item.organno);
+ // 缂栬緫鑾峰彇璁板綍
+ handleEditProcurement(row) {
+ const index = this.procurementData.serviceDonationwitnessorgans.findIndex(
+ item => item.organno === row.organno
+ );
+ if (index !== -1) {
+ this.currentRecord = { ...row };
+ this.currentEditIndex = index;
+ this.editDialogVisible = true;
+ }
},
-
- // 鍒犻櫎鍣ㄥ畼璁板綍
- handleRemoveOrgan(index) {
- this.$confirm("纭鍒犻櫎杩欐潯鍣ㄥ畼璁板綍鍚楋紵", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- })
- .then(() => {
- const organno = this.utilizationData.serviceDonatecomporganList[index]
- .organno;
- this.utilizationData.serviceDonatecomporganList.splice(index, 1);
-
- // 浠庨�変腑鐨勫櫒瀹樹腑绉婚櫎
- const idx = this.selectedOrgans.indexOf(organno);
- if (idx > -1) {
- this.selectedOrgans.splice(idx, 1);
- }
-
- this.$message.success("鍣ㄥ畼璁板綍鍒犻櫎鎴愬姛");
- })
- .catch(() => {});
+ // 纭缂栬緫
+ handleEditConfirm() {
+ if (this.currentEditIndex !== -1) {
+ this.procurementData.serviceDonationwitnessorgans[
+ this.currentEditIndex
+ ] = {
+ ...this.currentRecord
+ };
+ this.$message.success("鑾峰彇璁板綍鏇存柊鎴愬姛");
+ this.editDialogVisible = false;
+ }
},
-
// 鍣ㄥ畼琛屾牱寮�
getOrganRowClassName({ row }) {
if (
- row.transplantstate === "1" &&
- (!row.hospitalno || !row.name || !row.transplanttime)
+ !row.organStartTime ||
+ !row.organgettime ||
+ !row.gainhospitalno ||
+ !row.organgetdoct
) {
- return "warning-row";
- }
- if (row.transplantstate === "0" && !row.abandonreason) {
return "warning-row";
}
return "";
},
-
- // 鑾峰彇鐘舵�佹爣绛剧被鍨�
- getStatusTagType(status) {
- const typeMap = {
- 3: "success",
- 2: "warning",
- 1: "info"
- };
- return typeMap[status] || "info";
- },
-
- // 鑾峰彇鐘舵�佹枃鏈�
- getStatusText(status) {
- const textMap = {
- 3: "宸插畬鎴�",
- 2: "杩涜涓�",
- 1: "寰呭鐞�"
- };
- return textMap[status] || "鏈煡";
- },
-
- // 鑾峰彇闅忚绫诲瀷鏍囩
- getFollowupTypeTag(type) {
- const typeMap = {
- routine: "success",
- emergency: "danger",
- special: "warning"
- };
- return typeMap[type] || "info";
- },
-
- // 鑾峰彇闅忚绫诲瀷鏂囨湰
- getFollowupTypeText(type) {
- const textMap = {
- routine: "甯歌闅忚",
- emergency: "绱ф�ラ殢璁�",
- special: "鐗规畩闅忚"
- };
- return textMap[type] || "鏈煡";
- },
-
// 淇濆瓨鍩烘湰淇℃伅
async handleSave() {
this.$refs.form.validate(async valid => {
if (valid) {
this.saveLoading = true;
try {
+ console.log(this.procurementData.serviceDonationwitnessorgans);
+
const saveData = {
...this.form,
- assessannex: JSON.stringify(this.attachments),
- donateorgan: this.selectedOrgans.join(","),
- serviceDonatecomporganList:
- this.utilizationData.serviceDonatecomporganList || []
+ deathjudgeannex: JSON.stringify(this.attachments),
+ organdonation: this.selectedOrgans.join(","),
+ serviceDonationwitnessorganList:
+ this.procurementData.serviceDonationwitnessorgans || [],
+ serviceDonationwitnessorgans:
+ this.procurementData.serviceDonationwitnessorgans || []
};
+ console.log(saveData.serviceDonationwitnessorganList);
+ console.log(saveData.serviceDonationwitnessorgans);
- const apiMethod = this.form.id ? completionedit : completionadd;
+ const apiMethod = this.form.id ? witnessedit : witnessadd;
const response = await apiMethod(saveData);
if (response.code === 200) {
@@ -1251,14 +770,10 @@
}
});
},
-
- // 淇濆瓨鍒╃敤璁板綍
- async handleSaveUtilization() {
- if (
- !this.utilizationData.serviceDonatecomporganList ||
- this.utilizationData.serviceDonatecomporganList.length === 0
- ) {
- this.$message.warning("璇峰厛娣诲姞鍒╃敤璁板綍");
+ // 淇濆瓨鑾峰彇璁板綍
+ async handleSaveProcurement() {
+ if (!this.form.id) {
+ this.$message.warning("璇峰厛淇濆瓨鍩烘湰淇℃伅");
return;
}
@@ -1267,57 +782,44 @@
const saveData = {
...this.form,
attachments: this.attachments,
- donateorgan: this.selectedOrgans.join(","),
- serviceDonatecomporganList:
- this.utilizationData.serviceDonatecomporganList || []
+ organdonation: this.selectedOrgans.join(","),
+ serviceDonationwitnessorgans:
+ this.procurementData.serviceDonationwitnessorgans || []
};
- const response = await completionedit(saveData);
+ const response = await witnessedit(saveData);
if (response.code === 200) {
- this.$message.success("鍒╃敤璁板綍淇濆瓨鎴愬姛");
+ this.$message.success("鑾峰彇璁板綍淇濆瓨鎴愬姛");
} else {
this.$message.error(
- "淇濆瓨鍒╃敤璁板綍澶辫触锛�" + (response.msg || "鏈煡閿欒")
+ "淇濆瓨鑾峰彇璁板綍澶辫触锛�" + (response.msg || "鏈煡閿欒")
);
}
} catch (error) {
- console.error("淇濆瓨鍒╃敤璁板綍澶辫触:", error);
- this.$message.error("淇濆瓨鍒╃敤璁板綍澶辫触");
+ console.error("淇濆瓨鑾峰彇璁板綍澶辫触:", error);
+ this.$message.error("淇濆瓨鑾峰彇璁板綍澶辫触");
} finally {
this.saveLoading = false;
}
},
-
- // 纭瀹屾垚鍒╃敤
- async handleConfirmUtilization() {
- // 妫�鏌ュ埄鐢ㄨ褰曟槸鍚﹀畬鏁�
- const incompleteRecords = this.utilizationData.serviceDonatecomporganList.filter(
- record => {
- if (record.transplantstate === "1") {
- return !record.hospitalno || !record.name || !record.transplanttime;
- } else if (record.transplantstate === "0") {
- return !record.abandonreason;
- }
- return false;
- }
- );
-
- if (incompleteRecords.length > 0) {
- this.$message.warning("璇峰厛瀹屽杽鎵�鏈夊埄鐢ㄨ褰曠殑淇℃伅");
+ // 纭瀹屾垚鑾峰彇
+ async handleConfirmProcurement() {
+ if (this.incompleteRecords > 0) {
+ this.$message.warning("璇峰厛瀹屽杽鎵�鏈夎幏鍙栬褰曠殑淇℃伅");
return;
}
- this.$confirm("纭瀹屾垚鍣ㄥ畼鍒╃敤鍚楋紵瀹屾垚鍚庡皢鏃犳硶淇敼鍒╃敤淇℃伅銆�", "鎻愮ず", {
+ this.$confirm("纭瀹屾垚鍣ㄥ畼鑾峰彇鍚楋紵瀹屾垚鍚庡皢鏃犳硶淇敼鑾峰彇淇℃伅銆�", "鎻愮ず", {
confirmButtonText: "纭畾",
cancelButtonText: "鍙栨秷",
type: "warning"
})
.then(async () => {
this.confirmLoading = true;
- this.form.completeState = "3";
- this.form.completetime =
- this.form.completetime ||
+ this.form.witnessState = "3";
+ this.form.operationendtime =
+ this.form.operationendtime ||
new Date()
.toISOString()
.replace("T", " ")
@@ -1327,126 +829,131 @@
const saveData = {
...this.form,
attachments: this.attachments,
- donateorgan: this.selectedOrgans.join(","),
- serviceDonatecomporganList:
- this.utilizationData.serviceDonatecomporganList || []
+ organdonation: this.selectedOrgans.join(","),
+ serviceDonationwitnessorgans:
+ this.procurementData.serviceDonationwitnessorgans || []
};
- const response = await completionedit(saveData);
+ const response = await witnessedit(saveData);
if (response.code === 200) {
- this.$message.success("鍣ㄥ畼鍒╃敤宸插畬鎴�");
+ this.$message.success("鍣ㄥ畼鑾峰彇宸插畬鎴�");
} else {
this.$message.error(
- "纭鍒╃敤澶辫触锛�" + (response.msg || "鏈煡閿欒")
+ "纭鑾峰彇澶辫触锛�" + (response.msg || "鏈煡閿欒")
);
- this.form.completeState = "2";
- this.form.completetime = "";
+ this.form.witnessState = "2";
+ this.form.operationendtime = "";
}
} catch (error) {
- console.error("纭鍒╃敤澶辫触:", error);
- this.$message.error("纭鍒╃敤澶辫触");
- this.form.completeState = "2";
- this.form.completetime = "";
+ console.error("纭鑾峰彇澶辫触:", error);
+ this.$message.error("纭鑾峰彇澶辫触");
+ this.form.witnessState = "2";
+ this.form.operationendtime = "";
} finally {
this.confirmLoading = false;
}
})
.catch(() => {});
},
-
- // 瀹屾垚鍒╃敤
- handleComplete() {
- this.handleConfirmUtilization();
+ // 纭鑾峰彇鎸夐挳鍒悕
+ handleProcure() {
+ this.handleConfirmProcurement();
},
- // 淇濆瓨闅忚璁板綍
- handleSaveFollowup() {
- if (!this.currentFollowup.organNo) {
- this.$message.warning("璇烽�夋嫨鍣ㄥ畼");
- return;
- }
-
- if (!this.currentFollowup.followupTime) {
- this.$message.warning("璇烽�夋嫨闅忚鏃堕棿");
- return;
- }
-
- this.saveLoading = true;
-
- // 鑾峰彇鍣ㄥ畼鍚嶇О
- const organRecord = this.utilizationData.serviceDonatecomporganList.find(
- item => item.organno === this.currentFollowup.organNo
- );
- const organName = organRecord ? organRecord.organname : "";
-
- const followupData = {
- ...this.currentFollowup,
- organName: organName,
- utilizationId: this.form.id
- };
-
- // TODO: 鏇挎崲涓哄疄闄呯殑闅忚璁板綍淇濆瓨鎺ュ彛
- setTimeout(() => {
- if (this.isEditingFollowup) {
- // 鏇存柊鐜版湁璁板綍
- const index = this.followupData.records.findIndex(
- item => item.id === this.currentFollowup.id
- );
- if (index !== -1) {
- this.followupData.records[index] = {
- ...followupData,
- id: this.currentFollowup.id
- };
- }
- } else {
- // 娣诲姞鏂拌褰�
- this.followupData.records.push({ ...followupData, id: Date.now() });
+ // ===== 闄勪欢鐩稿叧鏂规硶 =====
+ // 鎵撳紑涓婁紶瀵硅瘽妗�
+ openUploadDialog(category) {
+ this.currentUploadCategory = category;
+ this.tempFileList = [];
+ this.uploadDialogVisible = true;
+ this.$nextTick(() => {
+ if (this.$refs.uploadRef) {
+ this.$refs.uploadRef.clearFiles();
}
- this.$message.success("闅忚璁板綍淇濆瓨鎴愬姛");
- this.followupDialogVisible = false;
- this.saveLoading = false;
- }, 1000);
- },
- /** 闄勪欢鍙樺寲澶勭悊 */
- handleAttachmentChange(fileList) {
- this.attachmentFileList = fileList;
+ });
},
- /** 闄勪欢绉婚櫎澶勭悊 */
- handleAttachmentRemove(file) {
- if (file.url) {
- const index = this.attachments.findIndex(
- item => item.path === file.url || item.fileUrl === file.url
+ // 涓婁紶鍓嶆牎楠�
+ beforeUpload(file) {
+ const allowedTypes = [
+ "application/pdf",
+ "image/jpeg",
+ "image/png",
+ "application/msword",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+ ];
+ const maxSize = 10 * 1024 * 1024;
+ const isTypeOk =
+ allowedTypes.includes(file.type) ||
+ file.name.endsWith(".pdf") ||
+ file.name.endsWith(".jpg") ||
+ file.name.endsWith(".jpeg") ||
+ file.name.endsWith(".png") ||
+ file.name.endsWith(".doc") ||
+ file.name.endsWith(".docx");
+ if (!isTypeOk) {
+ this.$message.error(
+ "鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼爌df銆乯pg銆乸ng銆乨oc鎴杁ocx鏍煎紡鏂囦欢"
);
- if (index > -1) {
- this.attachments.splice(index, 1);
- this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
- }
+ return false;
}
+ if (file.size > maxSize) {
+ this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
+ return false;
+ }
+ return true;
},
- /** 涓婁紶鎴愬姛澶勭悊 */
- handleUploadSuccess({ file, fileList, response }) {
- if (response.code === 200) {
- // 鏍规嵁褰撳墠婵�娲荤殑 Tab 鍐冲畾鍒嗙被锛堟湭鍒嗙被 Tab 瀵瑰簲绌哄瓧绗︿覆锛�
- const category = this.activeTab === "鏈垎绫�" ? "" : this.activeTab;
- const attachmentObj = {
- fileName: file.name,
- path: response.fileUrl || file.url,
- fileUrl: response.fileUrl || file.url,
- fileType: category, // 鍏抽敭锛氳褰曞垎绫�
- fileSize: file.size,
- uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
- };
- if (!Array.isArray(this.attachments)) {
- this.attachments = [];
- }
- this.attachments.push(attachmentObj);
- this.attachmentFileList = fileList; // 淇濇寔鍚屾
- this.$message.success("鏂囦欢涓婁紶鎴愬姛");
- }
+ // 鏂囦欢閫夋嫨鍙樺寲
+ handleFileChange(file, fileList) {
+ this.tempFileList = fileList;
},
+
+ // 涓存椂绉婚櫎
+ handleTempRemove(file, fileList) {
+ this.tempFileList = fileList;
+ },
+
+ // 涓婁紶鎴愬姛澶勭悊
+ handleUploadSuccess(response, file, fileList) {
+ if (response.code !== 200) {
+ this.$message.error(response.msg || "涓婁紶澶辫触");
+ return;
+ }
+ // 鏈垎绫诲搴旂┖瀛楃涓诧紝涓庡睍绀�/淇濆瓨閫昏緫涓�鑷�
+ const category =
+ this.currentUploadCategory === "鏈垎绫�"
+ ? ""
+ : this.currentUploadCategory;
+ const attachmentObj = {
+ fileName: file.name,
+ path: response.fileUrl || response.url || response.data || file.url,
+ fileUrl: response.fileUrl || response.url || response.data || file.url,
+ fileType: category,
+ fileSize: file.size,
+ uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+ };
+ if (!Array.isArray(this.attachments)) {
+ this.attachments = [];
+ }
+ this.attachments.push(attachmentObj);
+ this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+ this.uploadLoading = false;
+ this.uploadDialogVisible = false;
+ this.tempFileList = [];
+ },
+
+ // 鎻愪氦涓婁紶
+ submitUpload() {
+ if (this.tempFileList.length === 0) {
+ this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
+ return;
+ }
+ this.uploadLoading = true;
+ this.$refs.uploadRef.submit();
+ },
+
// 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
getCategoryCount(category) {
return this.attachments.filter(item => {
@@ -1473,16 +980,7 @@
updateAttachmentCategory(row, newVal) {
const target = this.attachments.find(item => item === row);
if (target) {
- target.fileType = newVal; // 鍙兘涓虹┖瀛楃涓�
- // 鍚屾鏇存柊 attachmentFileList
- const fileItem = this.attachmentFileList.find(
- f => f.raw === row || f.url === row.fileUrl
- );
- if (fileItem) {
- fileItem.raw.fileType = newVal;
- fileItem.fileType = newVal || "鏈垎绫�";
- }
- // 濡傛灉褰撳墠婵�娲荤殑tab娌℃湁鏂囦欢浜嗭紝鑷姩鍒囨崲鍒扮涓�涓湁鏂囦欢鐨則ab
+ target.fileType = newVal;
const currentTabHasFiles =
this.getCategoryFiles(this.activeTab).length > 0;
if (!currentTabHasFiles) {
@@ -1494,42 +992,33 @@
// 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
handleRemoveAttachmentByFile(file) {
- const index = this.attachments.findIndex(item => item === file);
- if (index > -1) {
- this.attachments.splice(index, 1);
- // 鍚屾鍒犻櫎 attachmentFileList
- const fileIndex = this.attachmentFileList.findIndex(
- f => f.raw === file || f.url === file.fileUrl
- );
- if (fileIndex > -1) {
- this.attachmentFileList.splice(fileIndex, 1);
- }
- this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
- }
- },
- /** 涓婁紶閿欒澶勭悊 */
- handleUploadError({ file, fileList, error }) {
- console.error("闄勪欢涓婁紶澶辫触:", error);
- this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+ this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning"
+ })
+ .then(() => {
+ const index = this.attachments.findIndex(item => item === file);
+ if (index > -1) {
+ this.attachments.splice(index, 1);
+ this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+ }
+ })
+ .catch(() => {});
},
- /** 鎵嬪姩鍒犻櫎闄勪欢 */
- handleRemoveAttachment(index) {
- // 鐩存帴璋冪敤鏂扮殑鍒犻櫎鏂规硶
- this.handleRemoveAttachmentByFile(file.raw || file);
- },
-
- /** 鏂囦欢棰勮 */
+ // 鏂囦欢棰勮
handlePreview(file) {
this.currentPreviewFile = {
fileName: file.fileName,
fileUrl: file.path || file.fileUrl,
fileType: this.getFileType(file.fileName)
};
- this.filePreviewVisible = true;
+ this.previewVisible = true;
},
- /** 鏂囦欢涓嬭浇 */
- handleDownloadAttachment(file) {
+
+ // 鏂囦欢涓嬭浇
+ handleDownload(file) {
const fileUrl = file.path || file.fileUrl;
const fileName = file.fileName;
@@ -1642,24 +1131,36 @@
};
</script>
-<style lang="scss" scoped>
-.organ-utilization-detail {
+<style scoped>
+.organ-procurement-detail {
padding: 20px;
background-color: #f5f7fa;
min-height: 100vh;
}
-.detail-card,
-.utilization-card,
-.followup-card,
-.attachment-card {
+.detail-card {
margin-bottom: 20px;
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
border: 1px solid #e4e7ed;
}
-/* 鏂板闄勪欢澶撮儴鏍峰紡 */
+.procurement-card {
+ margin-bottom: 20px;
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+ border: 1px solid #e4e7ed;
+}
+
+.attachment-card {
+ margin-bottom: 20px;
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+ border: 1px solid #e4e7ed;
+ padding: 20px;
+ background: #fafafa;
+}
+
.attachment-header {
display: flex;
align-items: center;
@@ -1672,7 +1173,6 @@
.attachment-title {
font-weight: 600;
color: #303133;
- font-size: 16px;
}
.attachment-tip {
@@ -1682,7 +1182,7 @@
}
.attachment-list {
- margin-top: 20px;
+ margin-top: 16px;
}
.list-title {
@@ -1695,16 +1195,8 @@
.file-name {
font-size: 13px;
margin-left: 8px;
- color: #606266;
}
-/* 鏂囦欢鍥炬爣鏍峰紡 */
-.el-icon-document {
- font-size: 16px;
- vertical-align: middle;
-}
-
-/* 淇濇寔鍘熸湁鏍峰紡 */
.detail-title {
font-size: 18px;
font-weight: 600;
@@ -1712,42 +1204,11 @@
line-height: 1.4;
}
-/* 琛ㄦ牸鏁翠綋鏍峰紡 */
-:deep(.el-table) {
- border-radius: 8px;
- overflow: hidden;
-}
-
-:deep(.el-table th) {
- background-color: #f5f7fa;
- color: #606266;
- font-weight: 600;
-}
-
-:deep(.el-table .cell) {
- padding: 12px 8px;
- line-height: 1.5;
-}
-
-/* 鏂戦┈绾硅〃鏍艰 */
-:deep(.el-table__row.warning-row) {
- background-color: #fdf6ec;
-}
-
-:deep(.el-table__row.default-row) {
- background-color: #f0f9ff;
-}
-
-/* 榧犳爣鎮仠鏁堟灉 */
-:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
- background-color: #f5f7fa !important;
-}
-
/* 缁熻淇℃伅鏍峰紡 */
-.utilization-stats {
+.procurement-stats {
margin-top: 20px;
padding: 15px;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ background: linear-gradient(135deg, #a6b2e7 0%, #8a66ad 100%);
border-radius: 8px;
color: white;
}
@@ -1773,214 +1234,17 @@
color: white;
}
-/* 灞曞紑琛屾牱寮� */
-.recipient-detail-expand {
- padding: 20px;
+/* 绌虹姸鎬佹牱寮� */
+.empty-procurement {
+ text-align: center;
+ padding: 40px 0;
+ color: #909399;
background: #fafafa;
- border-radius: 8px;
- margin: 10px 0;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-}
-
-.recipient-header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 20px;
- padding-bottom: 15px;
- border-bottom: 2px solid #e4e7ed;
-}
-
-.recipient-title {
- font-size: 16px;
- font-weight: 600;
- color: #303133;
-}
-
-/* 琛ㄥ崟閮ㄥ垎鏍峰紡 */
-.recipient-form {
- background: white;
- padding: 20px;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
-}
-
-/* 琛ㄥ崟閮ㄥ垎鏍囬 */
-.form-section {
- margin-bottom: 25px;
- padding-bottom: 20px;
- border-bottom: 1px solid #f0f0f0;
-
- &:last-child {
- margin-bottom: 0;
- padding-bottom: 0;
- border-bottom: none;
- }
-}
-
-.section-title {
- font-size: 15px;
- font-weight: 600;
- color: #409eff;
- margin: 0 0 15px 0;
- padding-left: 10px;
- border-left: 4px solid #409eff;
- line-height: 1.2;
-}
-
-/* 琛ㄥ崟琛岄棿璺� */
-:deep(.el-form-item) {
- margin-bottom: 20px;
-
- .el-form-item__label {
- font-weight: 500;
- color: #606266;
- padding-right: 10px;
- }
-
- .el-form-item__content {
- line-height: 1.5;
- }
-}
-
-/* 琛ㄥ崟杈撳叆妗嗘牱寮� */
-:deep(.el-input__inner) {
- height: 36px;
- line-height: 36px;
border-radius: 4px;
- transition: all 0.3s ease;
-
- &:focus {
- border-color: #409eff;
- box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
- }
-
- &:disabled {
- background-color: #f5f7fa;
- border-color: #e4e7ed;
- color: #c0c4cc;
- cursor: not-allowed;
- }
-}
-
-/* 鏂囨湰鍩熸牱寮� */
-:deep(.el-textarea__inner) {
- min-height: 80px;
- border-radius: 4px;
- transition: all 0.3s ease;
-
- &:focus {
- border-color: #409eff;
- box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
- }
-
- &:disabled {
- background-color: #f5f7fa;
- border-color: #e4e7ed;
- color: #c0c4cc;
- cursor: not-allowed;
- }
-}
-
-/* 閫夋嫨妗嗘牱寮� */
-:deep(.el-select) {
- width: 100%;
-
- .el-input__inner {
- border-radius: 4px;
- }
-
- &.is-disabled {
- .el-input__inner {
- background-color: #f5f7fa;
- border-color: #e4e7ed;
- color: #c0c4cc;
- }
- }
-}
-
-/* 鏃ユ湡閫夋嫨鍣ㄦ牱寮� */
-:deep(.el-date-editor) {
- width: 100%;
-
- &.el-input__inner {
- border-radius: 4px;
- }
-
- &.is-disabled {
- .el-input__inner {
- background-color: #f5f7fa;
- border-color: #e4e7ed;
- color: #c0c4cc;
- }
- }
-}
-
-/* 鍝嶅簲寮忚皟鏁� */
-@media (max-width: 768px) {
- .recipient-detail-expand {
- padding: 15px;
- }
-
- .recipient-form {
- padding: 15px;
- }
-
- .attachment-header {
- flex-wrap: wrap;
- }
-
- .attachment-tip {
- width: 100%;
- margin-top: 8px;
- margin-left: 0;
- }
-
- .form-section {
- margin-bottom: 20px;
- padding-bottom: 15px;
- }
-
- :deep(.el-form-item) {
- margin-bottom: 15px;
- }
-
- .section-title {
- font-size: 14px;
- margin-bottom: 12px;
- }
-}
-
-:deep(.el-divider) {
margin: 20px 0;
- background-color: #e4e7ed;
}
-/* 琛ㄥ崟鏍囩鍜岃緭鍏ユ鏍峰紡 */
-:deep(.el-form-item__label) {
- font-weight: 500;
- color: #606266;
-}
-
-:deep(.el-input__inner:focus) {
- border-color: #409eff;
- box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
-}
-
-/* 鎸夐挳鏍峰紡浼樺寲 */
-:deep(.el-button--primary) {
- background: linear-gradient(135deg, #409eff 0%, #3375e0 100%);
- border: none;
- border-radius: 4px;
- transition: all 0.3s ease;
-}
-
-:deep(.el-button--primary:hover) {
- transform: translateY(-1px);
- box-shadow: 0 4px 12px rgba(64, 158, 255, 0.4);
-}
-
-/* 搴曢儴鎿嶄綔鎸夐挳 */
+/* 瀵硅瘽妗嗗簳閮ㄦ寜閽� */
.dialog-footer {
margin-top: 20px;
text-align: center;
@@ -1993,49 +1257,23 @@
min-width: 120px;
}
-/* 绌虹姸鎬佹牱寮� */
-.empty-utilization {
- text-align: center;
- padding: 40px 0;
- color: #909399;
- background: #fafafa;
- border-radius: 4px;
- margin: 20px 0;
+/* 琛ㄦ牸琛屾牱寮� */
+:deep(.warning-row) {
+ background-color: #fff7e6 !important;
}
-/* 鏂囦欢淇℃伅鏍峰紡 */
-.file-info {
- display: flex;
- align-items: center;
- padding: 5px 0;
+:deep(.warning-row:hover) {
+ background-color: #ffecc2 !important;
}
-.file-info i {
- font-size: 18px;
- margin-right: 10px;
-}
-
-/* 骞虫澘璁惧閫傞厤 */
-@media (max-width: 1024px) {
- .organ-utilization-detail {
- padding: 15px;
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 768px) {
+ .organ-procurement-detail {
+ padding: 10px;
}
- :deep(.el-col) {
+ .procurement-stats .el-col {
margin-bottom: 10px;
- }
-}
-
-/* 鎵嬫満璁惧閫傞厤 */
-
-/* 瓒呭皬灞忓箷璁惧 */
-@media (max-width: 480px) {
- .organ-utilization-detail {
- padding: 5px;
- }
-
- :deep(.el-card__header) {
- padding: 10px 15px;
}
}
</style>
diff --git a/src/views/business/course/components/readonlyDescriptionsMixin.js b/src/views/business/course/components/readonlyDescriptionsMixin.js
new file mode 100644
index 0000000..92749c5
--- /dev/null
+++ b/src/views/business/course/components/readonlyDescriptionsMixin.js
@@ -0,0 +1,36 @@
+/**
+ * 娴佺▼鍙板彧璇绘弿杩板垪琛ㄧ殑鍝嶅簲寮忓垪鏁� mixin
+ * 鐢ㄤ簬鍚勯樁娈佃鎯呯粍浠讹紝鏍规嵁绐楀彛瀹藉害鑷�傚簲 el-descriptions 鐨� column锛�
+ * - >= 1920px锛�4 鍒楋紙瀹藉睆锛�
+ * - >= 1200px锛�3 鍒楋紙涓睆锛�
+ * - >= 768px 锛�2 鍒楋紙绐勫睆锛�
+ * - < 768px 锛�1 鍒楋紙鎵嬫満锛�
+ */
+export default {
+ data() {
+ return {
+ windowWidth: 0
+ };
+ },
+ computed: {
+ descriptionColumn() {
+ const w = this.windowWidth;
+ if (w >= 1920) return 4;
+ if (w >= 1200) return 3;
+ if (w >= 768) return 2;
+ return 1;
+ }
+ },
+ mounted() {
+ this.windowWidth = window.innerWidth;
+ this.__handleWindowResize = () => {
+ this.windowWidth = window.innerWidth;
+ };
+ window.addEventListener("resize", this.__handleWindowResize);
+ },
+ beforeDestroy() {
+ if (this.__handleWindowResize) {
+ window.removeEventListener("resize", this.__handleWindowResize);
+ }
+ }
+};
diff --git a/src/views/business/course/index.vue b/src/views/business/course/index.vue
index 431fb4b..fe1cf19 100644
--- a/src/views/business/course/index.vue
+++ b/src/views/business/course/index.vue
@@ -62,7 +62,11 @@
<!-- 鍙充晶鍐呭 -->
<div class="content-section">
- <case-basic-info :case-id="caseId" :show-attachment="true" />
+ <case-basic-info
+ :case-id="caseId"
+ :show-attachment="true"
+ :column="descriptionColumn"
+ />
<div class="stage-detail-section">
<div class="section-header">
@@ -102,7 +106,7 @@
}
// 瀹屾垚 / 瀹屾垚XX
- if (/瀹屾垚|瀹岀粨/.test(l)) {
+ if (/瀹屾垚|瀹岀粨|宸茬‘璁�/.test(l)) {
return "completed";
}
@@ -126,6 +130,7 @@
import OrganUtilizationStage from "./components/OrganUtilizationStage";
import dayjs from "dayjs";
+import readonlyDescriptionsMixin from "./components/readonlyDescriptionsMixin";
// ============== 瀛楀吀鏄犲皠锛堜綘鍚庨潰鑷繁鏀癸級 ==============
const STAGE_DICT_MAP = {
@@ -165,6 +170,7 @@
export default {
name: "DonationProcessDetail",
+ mixins: [readonlyDescriptionsMixin],
components: {
CaseBasicInfo,
DonorMaintenanceStage,
@@ -416,7 +422,7 @@
.stage-detail-section {
flex: 1;
- /* 鍗犳嵁鍓╀綑绌洪棿 */
+ /* 鍗犳嵁鍓╀綑绌洪棿锛岄摵婊″彸渚у唴瀹瑰尯 */
background: white;
border-radius: 6px;
padding: 20px;
@@ -425,7 +431,7 @@
flex-direction: column;
min-height: 400px;
/* 鏈�灏忛珮搴� */
- max-height: 800px;
+ /* max-height: 1000px; */
/* 鏈�澶ч珮搴︼紝鍙牴鎹渶瑕佽皟鏁� */
overflow: hidden;
/* 闅愯棌澶栧眰婧㈠嚭 */
@@ -643,5 +649,8 @@
min-height: 300px;
max-height: 400px;
}
+ .basic-info-card {
+ margin-bottom: 0;
+ }
}
</style>
diff --git a/src/views/business/decide/DecideInfo copy.vue b/src/views/business/decide/DecideInfo copy.vue
index 239e5f9..6f5fa44 100644
--- a/src/views/business/decide/DecideInfo copy.vue
+++ b/src/views/business/decide/DecideInfo copy.vue
@@ -1,6 +1,6 @@
<template>
<div class="death-judgment-detail">
- <case-basic-info :case-id="caseId" :show-attachment="true" />
+ <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
<el-card class="detail-card">
<!-- 鍩虹淇℃伅 -->
<div slot="header" class="clearfix">
diff --git a/src/views/business/decide/DecideInfo.vue b/src/views/business/decide/DecideInfo.vue
index 9522c29..a297929 100644
--- a/src/views/business/decide/DecideInfo.vue
+++ b/src/views/business/decide/DecideInfo.vue
@@ -1,6 +1,6 @@
<template>
<div class="death-judgment-detail">
- <case-basic-info :case-id="caseId" :show-attachment="true" />
+ <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
<!-- 鍏叡淇℃伅妯″潡锛堢嫭绔嬫樉绀猴級 -->
<!-- 鍒ゅ畾绫诲瀷鏍囩椤� -->
@@ -51,7 +51,7 @@
</el-form>
</el-card> -->
<!-- 鑴戞浜″垽瀹氭ā鍧� -->
- <el-card v-if="activeJudgmentType === 'brain'" class="detail-card">
+ <el-card v-if="activeJudgmentType === 'brain'" class="detail-card paper-card">
<div slot="header" class="clearfix">
<span class="detail-title">鑴戞浜″垽瀹氫俊鎭�</span>
@@ -65,73 +65,63 @@
</el-button>
</div>
- <el-form :model="form" ref="brainForm" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="姝讳骸鍘熷洜" prop="deathreason">
- <el-input v-model="form.deathreason" :readonly="!isEdit" />
- </el-form-item>
- </el-col>
- </el-row>
+ <el-form :model="form" ref="brainForm" :rules="rules" label-width="120px" class="paper-form">
+ <div class="form-row">
+ <el-form-item label="姝讳骸鍘熷洜" prop="deathreason" class="col-1-3">
+ <el-input v-model="form.deathreason" :readonly="!isEdit" />
+ </el-form-item>
+ </div>
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="姝讳骸鏃堕棿" prop="deathtime">
- <el-date-picker
- v-model="form.deathtime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- :disabled="!isEdit"
+ <div class="form-row">
+ <el-form-item label="姝讳骸鏃堕棿" prop="deathtime" class="col-1-3">
+ <el-date-picker
+ v-model="form.deathtime"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ :disabled="!isEdit"
+ />
+ </el-form-item>
+ <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="deathjudgedocto" class="col-1-3">
+ <el-input v-model="form.deathjudgedocto" :readonly="!isEdit" />
+ </el-form-item>
+ <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="deathjudgedoctt" class="col-1-3">
+ <el-input v-model="form.deathjudgedoctt" :readonly="!isEdit" />
+ </el-form-item>
+ </div>
+ <div class="form-row">
+ <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓" class="col-full">
+ <div
+ v-for="(doctor, index) in brainExtraDoctors"
+ :key="index"
+ style="display: flex; align-items: center; margin-bottom: 8px;"
+ >
+ <el-input
+ v-model="brainExtraDoctors[index]"
+ placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
+ style="flex: 1; margin-right: 10px;"
+ :readonly="!isEdit"
/>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="deathjudgedocto">
- <el-input v-model="form.deathjudgedocto" :readonly="!isEdit" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="deathjudgedoctt">
- <el-input v-model="form.deathjudgedoctt" :readonly="!isEdit" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓">
- <div
- v-for="(doctor, index) in brainExtraDoctors"
- :key="index"
- style="display: flex; align-items: center; margin-bottom: 8px;"
- >
- <el-input
- v-model="brainExtraDoctors[index]"
- placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
- style="flex: 1; margin-right: 10px;"
- :readonly="!isEdit"
- />
- <el-button
- v-if="isEdit"
- type="danger"
- icon="el-icon-minus"
- circle
- size="mini"
- @click="removeBrainDoctor(index)"
- />
- </div>
<el-button
v-if="isEdit"
- type="primary"
- icon="el-icon-plus"
- size="small"
- @click="addBrainDoctor"
- >
- 娣诲姞鍖荤敓
- </el-button>
- </el-form-item>
- </el-col>
- </el-row>
+ type="danger"
+ icon="el-icon-minus"
+ circle
+ size="mini"
+ @click="removeBrainDoctor(index)"
+ />
+ </div>
+ <el-button
+ v-if="isEdit"
+ type="primary"
+ icon="el-icon-plus"
+ size="small"
+ @click="addBrainDoctor"
+ >
+ 娣诲姞鍖荤敓
+ </el-button>
+ </el-form-item>
+ </div>
</el-form>
<!-- 鑴戞浜¤瘎浼拌〃闄勪欢 -->
@@ -253,7 +243,7 @@
</el-card>
<!-- 蹇冩浜″垽瀹氭ā鍧� -->
- <el-card v-else class="detail-card">
+ <el-card v-else class="detail-card paper-card">
<div slot="header" class="clearfix">
<span class="detail-title">蹇冩浜″垽瀹氫俊鎭�</span>
<el-button
@@ -275,79 +265,69 @@
</el-button>
</div>
- <el-form :model="form" ref="heartForm" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="蹇冩浜″師鍥�" prop="heartdeathreason">
- <el-input v-model="form.heartdeathreason" :readonly="!isEdit" />
- </el-form-item>
- </el-col>
- </el-row>
+ <el-form :model="form" ref="heartForm" :rules="rules" label-width="120px" class="paper-form">
+ <div class="form-row">
+ <el-form-item label="蹇冩浜″師鍥�" prop="heartdeathreason" class="col-1-3">
+ <el-input v-model="form.heartdeathreason" :readonly="!isEdit" />
+ </el-form-item>
+ </div>
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="蹇冩浜″垽瀹氬畬鎴愭椂闂�" prop="heartdeathtime">
- <el-date-picker
- v-model="form.heartdeathtime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- :disabled="!isEdit"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="heartdeathjudgedocto">
+ <div class="form-row">
+ <el-form-item label="蹇冩浜″垽瀹氬畬鎴愭椂闂�" prop="heartdeathtime" class="col-1-3">
+ <el-date-picker
+ v-model="form.heartdeathtime"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ :disabled="!isEdit"
+ />
+ </el-form-item>
+ <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="heartdeathjudgedocto" class="col-1-3">
+ <el-input
+ v-model="form.heartdeathjudgedocto"
+ :readonly="!isEdit"
+ />
+ </el-form-item>
+ <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="heartdeathjudgedoctt" class="col-1-3">
+ <el-input
+ v-model="form.heartdeathjudgedoctt"
+ :readonly="!isEdit"
+ />
+ </el-form-item>
+ </div>
+ <div class="form-row">
+ <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓" class="col-full">
+ <div
+ v-for="(doctor, index) in heartExtraDoctors"
+ :key="index"
+ style="display: flex; align-items: center; margin-bottom: 8px;"
+ >
<el-input
- v-model="form.heartdeathjudgedocto"
+ v-model="heartExtraDoctors[index]"
+ placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
+ style="flex: 1; margin-right: 10px;"
:readonly="!isEdit"
/>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="heartdeathjudgedoctt">
- <el-input
- v-model="form.heartdeathjudgedoctt"
- :readonly="!isEdit"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓">
- <div
- v-for="(doctor, index) in heartExtraDoctors"
- :key="index"
- style="display: flex; align-items: center; margin-bottom: 8px;"
- >
- <el-input
- v-model="heartExtraDoctors[index]"
- placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
- style="flex: 1; margin-right: 10px;"
- :readonly="!isEdit"
- />
- <el-button
- v-if="isEdit"
- type="danger"
- icon="el-icon-minus"
- circle
- size="mini"
- @click="removeHeartDoctor(index)"
- />
- </div>
<el-button
v-if="isEdit"
- type="primary"
- icon="el-icon-plus"
- size="small"
- @click="addHeartDoctor"
- >
- 娣诲姞鍖荤敓
- </el-button>
- </el-form-item>
- </el-col>
- </el-row>
+ type="danger"
+ icon="el-icon-minus"
+ circle
+ size="mini"
+ @click="removeHeartDoctor(index)"
+ />
+ </div>
+ <el-button
+ v-if="isEdit"
+ type="primary"
+ icon="el-icon-plus"
+ size="small"
+ @click="addHeartDoctor"
+ >
+ 娣诲姞鍖荤敓
+ </el-button>
+ </el-form-item>
+ </div>
</el-form>
<!-- 蹇冩浜¤瘎浼拌〃闄勪欢 -->
@@ -1398,4 +1378,73 @@
:deep(.image-preview-dialog .el-message-box__content) {
text-align: center;
}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+ padding: 16px;
+}
+
+.paper-form {
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
+
+.paper-form >>> .form-row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+ flex: 0 0 33.3333%;
+ display: flex;
+ margin: 0;
+ background: #fff;
+ border-right: 1px solid #d0d3db;
+ border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+ display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+ flex: 0 0 120px;
+ width: 120px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #ecf5ff;
+ border-right: 1px solid #d0d3db;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
+}
</style>
diff --git a/src/views/business/ethicalReview/ethicalReviewInfo.vue b/src/views/business/ethicalReview/ethicalReviewInfo.vue
index 2da5b62..36c22e2 100644
--- a/src/views/business/ethicalReview/ethicalReviewInfo.vue
+++ b/src/views/business/ethicalReview/ethicalReviewInfo.vue
@@ -1,28 +1,24 @@
<template>
<div class="ethics-review-detail">
- <case-basic-info :case-id="caseId" :show-attachment="true" />
+ <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
- <el-card class="detail-card">
+ <el-card class="detail-card paper-card">
<!-- 浼︾悊瀹℃煡鍩烘湰淇℃伅 -->
<div slot="header" class="clearfix">
<span class="detail-title">浼︾悊瀹℃煡鍩烘湰淇℃伅</span>
</div>
- <el-form :model="form" ref="form" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="鍙戣捣涓婚" prop="initiateTheme">
- <el-input
- v-model="form.initiateTheme"
- placeholder="璇疯緭鍏ュ彂璧蜂富棰�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍙戣捣浜�" prop="initiatePerson">
- <el-input v-model="form.initiatePerson" />
- </el-form-item>
- </el-col>
+ <el-form :model="form" ref="form" :rules="rules" label-width="120px" class="paper-form">
+ <div class="form-row">
+ <el-form-item label="鍙戣捣涓婚" prop="initiateTheme" class="col-1-3">
+ <el-input
+ v-model="form.initiateTheme"
+ placeholder="璇疯緭鍏ュ彂璧蜂富棰�"
+ />
+ </el-form-item>
+ <el-form-item label="鍙戣捣浜�" prop="initiatePerson" class="col-1-3">
+ <el-input v-model="form.initiatePerson" />
+ </el-form-item>
<!-- <el-col :span="8">
<el-form-item label="瀹℃煡鐘舵��" prop="status">
<el-select v-model="form.status" style="width: 100%">
@@ -35,57 +31,49 @@
</el-select>
</el-form-item>
</el-col> -->
- </el-row>
+ </div>
<!-- 涓撳鐩稿叧淇℃伅 -->
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="浼︾悊瀹℃煡缁撹" prop="expertConclusion">
- <el-select v-model="form.expertConclusion" style="width: 100%">
- <el-option label="鍚屾剰" value="1" />
- <el-option label="瀹℃煡涓�" value="2" />
- <el-option label="涓嶅悓鎰�" value="0" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="浼︾悊瀹℃煡缁撹鏃堕棿" prop="expertTime">
- <el-date-picker
- v-model="form.expertTime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="浼︾悊瀹℃煡缁撹" prop="expertConclusion" class="col-1-3">
+ <el-select v-model="form.expertConclusion" style="width: 100%">
+ <el-option label="鍚屾剰" value="1" />
+ <el-option label="瀹℃煡涓�" value="2" />
+ <el-option label="涓嶅悓鎰�" value="0" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="浼︾悊瀹℃煡缁撹鏃堕棿" prop="expertTime" class="col-1-3">
+ <el-date-picker
+ v-model="form.expertTime"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </div>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="瀹℃煡鎰忚" prop="expertOpinion">
- <el-input
- type="textarea"
- :rows="2"
- v-model="form.expertOpinion"
- placeholder="璇疯緭鍏ユ剰瑙�"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="瀹℃煡鎰忚" prop="expertOpinion" class="col-full">
+ <el-input
+ type="textarea"
+ :rows="2"
+ v-model="form.expertOpinion"
+ placeholder="璇疯緭鍏ユ剰瑙�"
+ />
+ </el-form-item>
+ </div>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="澶囨敞" prop="remark">
- <el-input
- type="textarea"
- :rows="3"
- v-model="form.remark"
- placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="澶囨敞" prop="remark" class="col-full">
+ <el-input
+ type="textarea"
+ :rows="3"
+ v-model="form.remark"
+ placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+ />
+ </el-form-item>
+ </div>
</el-form>
</el-card>
@@ -1163,7 +1151,7 @@
},
// 鑾峰彇璇︽儏
- async getDetail(infoid, id) {
+ async getDetail(infoid, id) {
try {
this.expertLoading = true;
let response = {};
@@ -1171,7 +1159,12 @@
response = await ethicalreviewInfo(id);
} else if (infoid) {
response = await reviewinitiateBaseInfoList({ infoid: infoid });
+ if (response.data[0].id) {
+ this.id = response.data[0].id;
+ response = await ethicalreviewInfo(this.id);
+ }
}
+
if (
!response.data.status ||
response.data.status == 0 ||
@@ -1182,7 +1175,7 @@
if (response.code == 200) {
let detailData = {};
- if (response.data && id) {
+ if (response.data && this.id) {
this.form = response.data;
// 瑙f瀽 filePatch 瀛楁
this.parseFilePatch(this.form.filePatch);
@@ -1191,7 +1184,7 @@
if (!this.form.ethicalreviewopinionsList) {
this.$set(this.form, "ethicalreviewopinionsList", []);
}
- } else if (response.data && infoid) {
+ } else if (response.data && this.infoid) {
this.form = response.data[0];
this.parseFilePatch(this.form.filePatch);
this.initAttachmentFileList();
@@ -1534,8 +1527,8 @@
// 淇濆瓨鎴愬姛鍚庢洿鏂板師濮嬫暟鎹�
this.saveOriginalData();
this.isEdit = false;
- if (!this.form.id && response.data && response.data.id) {
- this.form.id = response.data.id;
+ if (!this.form.id && response.data ) {
+ this.form.id = response.data;
this.id = this.form.id;
// this.$router.replace({
// query: { ...this.$route.query, id: this.form.id }
@@ -2748,4 +2741,73 @@
margin-bottom: 10px;
}
}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+ padding: 16px;
+}
+
+.paper-form {
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
+
+.paper-form >>> .form-row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+ flex: 0 0 33.3333%;
+ display: flex;
+ margin: 0;
+ background: #fff;
+ border-right: 1px solid #d0d3db;
+ border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+ display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+ flex: 0 0 120px;
+ width: 120px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #ecf5ff;
+ border-right: 1px solid #d0d3db;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
+}
</style>
diff --git a/src/views/business/followupVisit/info.vue b/src/views/business/followupVisit/info.vue
index 8d54bf1..5af828e 100644
--- a/src/views/business/followupVisit/info.vue
+++ b/src/views/business/followupVisit/info.vue
@@ -146,7 +146,7 @@
</el-card>
<!-- 缂栬緫/鏂板鍖哄煙 - 濮嬬粓鏄剧ず -->
- <el-card class="edit-area-card">
+ <el-card class="edit-area-card paper-card">
<div slot="header" class="clearfix">
<span>{{ editForm.id ? '缂栬緫闅忚璁板綍' : '鏂板闅忚璁板綍' }}</span>
<div style="float: right;">
@@ -165,171 +165,162 @@
:model="editForm"
:rules="editRules"
label-width="120px"
+ class="paper-form"
>
- <el-row>
- <el-col :span="12">
- <el-form-item label="闅忚搴忓彿" prop="seqno">
- <el-input-number
- v-model="editForm.seqno"
- :min="1"
- :max="20"
- placeholder="璇疯緭鍏ラ殢璁垮簭鍙�"
- style="width: 200px"
- />
- <span style="margin-left: 10px; color: #999;">(绗瑊{ editForm.seqno || 1 }}娆¢殢璁�)</span>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="闅忚鏃堕棿" prop="followuptime">
- <el-date-picker
- v-model="editForm.followuptime"
- type="datetime"
- placeholder="閫夋嫨闅忚鏃堕棿"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 200px"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="闅忚搴忓彿" prop="seqno" class="col-half">
+ <el-input-number
+ v-model="editForm.seqno"
+ :min="1"
+ :max="20"
+ placeholder="璇疯緭鍏ラ殢璁垮簭鍙�"
+ style="width: 200px"
+ />
+ <span style="margin-left: 10px; color: #999;">(绗瑊{ editForm.seqno || 1 }}娆¢殢璁�)</span>
+ </el-form-item>
+ <el-form-item label="闅忚鏃堕棿" prop="followuptime" class="col-half">
+ <el-date-picker
+ v-model="editForm.followuptime"
+ type="datetime"
+ placeholder="閫夋嫨闅忚鏃堕棿"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 200px"
+ />
+ </el-form-item>
+ </div>
- <el-row>
- <el-col :span="12">
- <el-form-item label="鍣ㄥ畼鍙椾綋鑰呭鍚�" prop="recipientname">
- <el-input
- v-model="editForm.recipientname"
- placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呭鍚�"
- maxlength="50"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙椾綋鐢佃瘽" prop="recipientphone">
- <el-input
- v-model="editForm.recipientphone"
- placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呯數璇�"
- maxlength="20"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="鍣ㄥ畼鍙椾綋鑰呭鍚�" prop="recipientname" class="col-half">
+ <el-input
+ v-model="editForm.recipientname"
+ placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呭鍚�"
+ maxlength="50"
+ />
+ </el-form-item>
+ <el-form-item label="鍙椾綋鐢佃瘽" prop="recipientphone" class="col-half">
+ <el-input
+ v-model="editForm.recipientphone"
+ placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呯數璇�"
+ maxlength="20"
+ />
+ </el-form-item>
+ </div>
- <el-row>
- <el-col :span="12">
- <el-form-item label="绉绘鍖婚櫌鍚嶇О" prop="hospitalname">
- <el-input
- v-model="editForm.hospitalname"
- placeholder="璇疯緭鍏ョЩ妞嶅尰闄㈠悕绉�"
- maxlength="100"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绉绘绉戝" prop="hospitaldept">
- <el-input
- v-model="editForm.hospitaldept"
- placeholder="璇疯緭鍏ョЩ妞嶅尰闄㈢瀹�"
- maxlength="50"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="绉绘鍖婚櫌鍚嶇О" prop="hospitalname" class="col-half">
+ <el-input
+ v-model="editForm.hospitalname"
+ placeholder="璇疯緭鍏ョЩ妞嶅尰闄㈠悕绉�"
+ maxlength="100"
+ />
+ </el-form-item>
+ <el-form-item label="绉绘绉戝" prop="hospitaldept" class="col-half">
+ <el-input
+ v-model="editForm.hospitaldept"
+ placeholder="璇疯緭鍏ョЩ妞嶅尰闄㈢瀹�"
+ maxlength="50"
+ />
+ </el-form-item>
+ </div>
- <el-row>
- <el-col :span="12">
- <el-form-item label="闅忚鍖荤敓濮撳悕" prop="doctorname">
- <el-input
- v-model="editForm.doctorname"
- placeholder="璇疯緭鍏ユ帴鍙楅殢璁垮尰鐢熷鍚�"
- maxlength="50"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍖荤敓鐢佃瘽" prop="doctorphone">
- <el-input
- v-model="editForm.doctorphone"
- placeholder="璇疯緭鍏ユ帴鍙楅殢璁垮尰鐢熺數璇�"
- maxlength="20"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="闅忚鍖荤敓濮撳悕" prop="doctorname" class="col-half">
+ <el-input
+ v-model="editForm.doctorname"
+ placeholder="璇疯緭鍏ユ帴鍙楅殢璁垮尰鐢熷鍚�"
+ maxlength="50"
+ />
+ </el-form-item>
+ <el-form-item label="鍖荤敓鐢佃瘽" prop="doctorphone" class="col-half">
+ <el-input
+ v-model="editForm.doctorphone"
+ placeholder="璇疯緭鍏ユ帴鍙楅殢璁垮尰鐢熺數璇�"
+ maxlength="20"
+ />
+ </el-form-item>
+ </div>
- <el-row>
- <el-col :span="12">
- <el-form-item label="鎹愮尞缁撴灉" prop="donateresult">
- <el-select
- v-model="editForm.donateresult"
- placeholder="璇烽�夋嫨鎹愮尞缁撴灉"
- style="width: 200px"
- >
- <el-option label="鎴愬姛" value="1" />
- <el-option label="澶辫触" value="0" />
- <el-option label="杩涜涓�" value="2" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="闅忚鑰�" prop="followupno">
- <el-input
- v-model="editForm.followupno"
- placeholder="璇疯緭鍏ラ殢璁胯��"
- maxlength="50"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="鎹愮尞缁撴灉" prop="donateresult" class="col-half">
+ <el-select
+ v-model="editForm.donateresult"
+ placeholder="璇烽�夋嫨鎹愮尞缁撴灉"
+ style="width: 200px"
+ >
+ <el-option label="鎴愬姛" value="1" />
+ <el-option label="澶辫触" value="0" />
+ <el-option label="杩涜涓�" value="2" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="闅忚鑰�" prop="followupno" class="col-half">
+ <el-input
+ v-model="editForm.followupno"
+ placeholder="璇疯緭鍏ラ殢璁胯��"
+ maxlength="50"
+ />
+ </el-form-item>
+ </div>
- <el-form-item label="闅忚鎻忚堪" prop="followupdescribe">
- <el-input
- v-model="editForm.followupdescribe"
- type="textarea"
- placeholder="璇疯緭鍏ラ殢璁挎弿杩�"
- maxlength="1000"
- :rows="3"
- show-word-limit
- />
- </el-form-item>
+ <div class="form-row">
+ <el-form-item label="闅忚鎻忚堪" prop="followupdescribe" class="col-full">
+ <el-input
+ v-model="editForm.followupdescribe"
+ type="textarea"
+ placeholder="璇疯緭鍏ラ殢璁挎弿杩�"
+ maxlength="1000"
+ :rows="3"
+ show-word-limit
+ />
+ </el-form-item>
+ </div>
- <el-form-item label="鍖荤敓鎻忚堪" prop="doctordescribe">
- <el-input
- v-model="editForm.doctordescribe"
- type="textarea"
- placeholder="璇疯緭鍏ュ尰鐢熸弿杩�"
- maxlength="500"
- :rows="3"
- show-word-limit
- />
- </el-form-item>
+ <div class="form-row">
+ <el-form-item label="鍖荤敓鎻忚堪" prop="doctordescribe" class="col-full">
+ <el-input
+ v-model="editForm.doctordescribe"
+ type="textarea"
+ placeholder="璇疯緭鍏ュ尰鐢熸弿杩�"
+ maxlength="500"
+ :rows="3"
+ show-word-limit
+ />
+ </el-form-item>
+ </div>
- <el-form-item label="鍙椾綋鑰呮弿杩�" prop="recipientdescribe">
- <el-input
- v-model="editForm.recipientdescribe"
- type="textarea"
- placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呮弿杩�"
- maxlength="500"
- :rows="3"
- show-word-limit
- />
- </el-form-item>
+ <div class="form-row">
+ <el-form-item label="鍙椾綋鑰呮弿杩�" prop="recipientdescribe" class="col-full">
+ <el-input
+ v-model="editForm.recipientdescribe"
+ type="textarea"
+ placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呮弿杩�"
+ maxlength="500"
+ :rows="3"
+ show-word-limit
+ />
+ </el-form-item>
+ </div>
- <el-form-item label="澶囨敞" prop="remark">
- <el-input
- v-model="editForm.remark"
- type="textarea"
- placeholder="璇疯緭鍏ュ娉�"
- maxlength="500"
- :rows="3"
- show-word-limit
- />
- </el-form-item>
+ <div class="form-row">
+ <el-form-item label="澶囨敞" prop="remark" class="col-full">
+ <el-input
+ v-model="editForm.remark"
+ type="textarea"
+ placeholder="璇疯緭鍏ュ娉�"
+ maxlength="500"
+ :rows="3"
+ show-word-limit
+ />
+ </el-form-item>
+ </div>
- <el-form-item>
- <el-button type="primary" @click="submitEditForm">
- {{ editForm.id ? '淇濆瓨淇敼' : '鍒涘缓闅忚' }}
- </el-button>
- <el-button @click="resetEditForm">閲嶇疆</el-button>
- </el-form-item>
+ <div class="form-row">
+ <el-form-item class="col-full">
+ <el-button type="primary" @click="submitEditForm">
+ {{ editForm.id ? '淇濆瓨淇敼' : '鍒涘缓闅忚' }}
+ </el-button>
+ <el-button @click="resetEditForm">閲嶇疆</el-button>
+ </el-form-item>
+ </div>
</el-form>
</el-card>
</div>
@@ -740,4 +731,73 @@
cursor: pointer;
background-color: #f5f7fa;
}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+ padding: 16px;
+}
+
+.paper-form {
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
+
+.paper-form >>> .form-row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+ flex: 0 0 33.3333%;
+ display: flex;
+ margin: 0;
+ background: #fff;
+ border-right: 1px solid #d0d3db;
+ border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+ display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+ flex: 0 0 120px;
+ width: 120px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #ecf5ff;
+ border-right: 1px solid #d0d3db;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
+}
</style>
diff --git a/src/views/business/maintain/maintainInfo.vue b/src/views/business/maintain/maintainInfo.vue
index 212bdc6..e92fc17 100644
--- a/src/views/business/maintain/maintainInfo.vue
+++ b/src/views/business/maintain/maintainInfo.vue
@@ -1,6 +1,6 @@
<template>
<div class="maintenance-detail">
- <case-basic-info :case-id="caseId" :show-attachment="true" />
+ <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
<el-card class="assessment-card">
<div slot="header" class="clearfix">
@@ -1366,4 +1366,73 @@
.custom-positive-tooltip {
max-width: 400px;
}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+ padding: 0;
+}
+
+.paper-form {
+ border-top: 1px solid #d0d3db;
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
+
+.paper-form >>> .form-row {
+ display: flex;
+ width: 100%;
+}
+
+.paper-form >>> .el-form-item {
+ flex: 0 0 33.3333%;
+ display: flex;
+ margin: 0;
+ background: #fff;
+ border-right: 1px solid #d0d3db;
+ border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+ display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+ flex: 0 0 120px;
+ width: 120px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #f3f5f9;
+ border-right: 1px solid #d0d3db;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
+}
</style>
diff --git a/src/views/business/transfer/TransportEdit.vue b/src/views/business/transfer/TransportEdit.vue
index 7481687..b334b74 100644
--- a/src/views/business/transfer/TransportEdit.vue
+++ b/src/views/business/transfer/TransportEdit.vue
@@ -47,9 +47,10 @@
:model="formData"
:rules="formRules"
label-width="120px"
+ class="paper-form"
>
<!-- 鍩虹淇℃伅 -->
- <el-card class="form-section" shadow="never">
+ <el-card class="form-section paper-card" shadow="never">
<div slot="header" class="section-header">
<i
class="el-icon-document"
@@ -58,70 +59,60 @@
<span>鍩虹淇℃伅</span>
</div>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
- <el-input
- v-model="formData.caseNo"
- :disabled="true"
- placeholder="鑷姩浠庢渚嬭幏鍙�"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="妗堜緥缂栧彿" prop="caseNo" class="col-half">
+ <el-input
+ v-model="formData.caseNo"
+ :disabled="true"
+ placeholder="鑷姩浠庢渚嬭幏鍙�"
+ />
+ </el-form-item>
+ </div>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鎮h�呭鍚�" prop="patName">
- <el-input
- v-model="formData.patName"
- :disabled="true"
- placeholder="鑷姩浠庢渚嬭幏鍙�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎬у埆" prop="sex">
- <el-select
- v-model="formData.sex"
- :disabled="true"
- placeholder="璇烽�夋嫨鎬у埆"
- style="width: 100%"
- >
- <el-option label="鐢�" value="1" />
- <el-option label="濂�" value="2" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="鎮h�呭鍚�" prop="patName" class="col-half">
+ <el-input
+ v-model="formData.patName"
+ :disabled="true"
+ placeholder="鑷姩浠庢渚嬭幏鍙�"
+ />
+ </el-form-item>
+ <el-form-item label="鎬у埆" prop="sex" class="col-half">
+ <el-select
+ v-model="formData.sex"
+ :disabled="true"
+ placeholder="璇烽�夋嫨鎬у埆"
+ style="width: 100%"
+ >
+ <el-option label="鐢�" value="1" />
+ <el-option label="濂�" value="2" />
+ </el-select>
+ </el-form-item>
+ </div>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="骞撮緞" prop="age">
- <el-input-number
- v-model="formData.age"
- :min="0"
- :max="120"
- :disabled="true"
- placeholder="鑷姩浠庢渚嬭幏鍙�"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname">
- <el-input
- v-model="formData.diagnosisname"
- :disabled="true"
- placeholder="鑷姩浠庢渚嬭幏鍙�"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="骞撮緞" prop="age" class="col-half">
+ <el-input-number
+ v-model="formData.age"
+ :min="0"
+ :max="120"
+ :disabled="true"
+ placeholder="鑷姩浠庢渚嬭幏鍙�"
+ style="width: 100%"
+ />
+ </el-form-item>
+ <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname" class="col-half">
+ <el-input
+ v-model="formData.diagnosisname"
+ :disabled="true"
+ placeholder="鑷姩浠庢渚嬭幏鍙�"
+ />
+ </el-form-item>
+ </div>
</el-card>
<!-- 鍖婚櫌淇℃伅 -->
- <el-card class="form-section" shadow="never">
+ <el-card class="form-section paper-card" shadow="never">
<div slot="header" class="section-header">
<i
class="el-icon-office-building"
@@ -130,47 +121,39 @@
<span>鍖婚櫌淇℃伅</span>
</div>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="娌荤枟鍖婚櫌" prop="treatmentHospitalName">
- <el-input
- v-model="formData.treatmentHospitalName"
- :disabled="true"
- placeholder="鑷姩浠庢渚嬭幏鍙�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="娌荤枟绉戝" prop="treatmentDeptName">
- <el-input
- v-model="formData.treatmentDeptName"
- placeholder="璇疯緭鍏ユ不鐤楃瀹ゅ悕绉�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="ICU璇勪及鍖荤敓" prop="icuDoctor">
- <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>
+ <div class="form-row">
+ <el-form-item label="娌荤枟鍖婚櫌" prop="treatmentHospitalName" class="col-half">
+ <el-input
+ v-model="formData.treatmentHospitalName"
+ :disabled="true"
+ placeholder="鑷姩浠庢渚嬭幏鍙�"
+ />
+ </el-form-item>
+ <el-form-item label="娌荤枟绉戝" prop="treatmentDeptName" class="col-half">
+ <el-input
+ v-model="formData.treatmentDeptName"
+ placeholder="璇疯緭鍏ユ不鐤楃瀹ゅ悕绉�"
+ />
+ </el-form-item>
+ </div>
+ <div class="form-row">
+ <el-form-item label="ICU璇勪及鍖荤敓" prop="icuDoctor" class="col-half">
+ <el-input
+ v-model="formData.icuDoctor"
+ placeholder="璇疯緭鍏CU璇勪及鍖荤敓"
+ />
+ </el-form-item>
+ <el-form-item label="ICU鍖荤敓鐢佃瘽" prop="icuDoctorPhone" class="col-half">
+ <el-input
+ v-model="formData.icuDoctorPhone"
+ placeholder="璇疯緭鍏CU鍖荤敓鎵嬫満鍙�"
+ />
+ </el-form-item>
+ </div>
</el-card>
<!-- 杞繍淇℃伅 -->
- <el-card class="form-section" shadow="never">
+ <el-card class="form-section paper-card" shadow="never">
<div slot="header" class="section-header">
<i
class="el-icon-location-information"
@@ -179,29 +162,25 @@
<span>杞繍淇℃伅</span>
</div>
- <el-row :gutter="20">
- <el-col :span="12">
- <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="transportStartTime">
- <el-date-picker
- v-model="formData.transportStartTime"
- type="datetime"
- placeholder="閫夋嫨鍑哄彂鏃堕棿"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
+ <div class="form-row">
+ <el-form-item label="鍑哄彂鍦扮偣" prop="transportStartPlace" class="col-half">
+ <el-input
+ v-model="formData.transportStartPlace"
+ placeholder="璇疯緭鍏ュ嚭鍙戝湴鐐�"
+ />
+ </el-form-item>
+ <el-form-item label="鍑哄彂鏃堕棿" prop="transportStartTime" class="col-half">
+ <el-date-picker
+ v-model="formData.transportStartTime"
+ type="datetime"
+ placeholder="閫夋嫨鍑哄彂鏃堕棿"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </div>
- <el-row :gutter="20">
+ <div class="form-row">
<!-- <el-col :span="12">
<el-form-item label="杞繍鐘舵��" prop="transitStatus">
<el-select
@@ -217,19 +196,17 @@
</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="contactPerson" class="col-half">
+ <el-input
+ v-model="formData.contactPerson"
+ placeholder="璇疯緭鍏ュ崗璋冨憳濮撳悕"
+ />
+ </el-form-item>
+ </div>
</el-card>
<!-- 鍖绘姢浜哄憳淇℃伅 -->
- <el-card class="form-section" shadow="never">
+ <el-card class="form-section paper-card" shadow="never">
<div slot="header" class="section-header">
<i
class="el-icon-user"
@@ -238,15 +215,13 @@
<span>鍖绘姢浜哄憳淇℃伅</span>
</div>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="杞繍鍖荤敓" prop="doctor">
- <el-input
- v-model="formData.doctor"
- placeholder="璇疯緭鍏ヨ浆杩愬尰鐢�"
- />
- </el-form-item>
- </el-col>
+ <div class="form-row">
+ <el-form-item label="杞繍鍖荤敓" prop="doctor" class="col-half">
+ <el-input
+ v-model="formData.doctor"
+ placeholder="璇疯緭鍏ヨ浆杩愬尰鐢�"
+ />
+ </el-form-item>
<!-- <el-col :span="12">
<el-form-item label="鍖荤敓鐢佃瘽" prop="doctorPhone">
<el-input
@@ -255,12 +230,10 @@
/>
</el-form-item>
</el-col> -->
- <el-col :span="12">
- <el-form-item label="杞繍鎶ゅ+" prop="nurse">
- <el-input v-model="formData.nurse" placeholder="璇疯緭鍏ユ姢澹鍚�" />
- </el-form-item>
- </el-col>
- </el-row>
+ <el-form-item label="杞繍鎶ゅ+" prop="nurse" class="col-half">
+ <el-input v-model="formData.nurse" placeholder="璇疯緭鍏ユ姢澹鍚�" />
+ </el-form-item>
+ </div>
<!-- <el-row :gutter="20">
@@ -274,15 +247,13 @@
</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>
- </el-col>
+ <div class="form-row">
+ <el-form-item label="杞繍椹鹃┒鍛�" prop="driver" class="col-half">
+ <el-input
+ v-model="formData.driver"
+ placeholder="璇疯緭鍏ラ┚椹跺憳濮撳悕"
+ />
+ </el-form-item>
<!-- <el-col :span="12">
<el-form-item label="椹鹃┒鍛樼數璇�" prop="driverPhone">
<el-input
@@ -291,7 +262,7 @@
/>
</el-form-item>
</el-col> -->
- </el-row>
+ </div>
</el-card>
<!-- 闄勪欢淇℃伅 -->
@@ -390,7 +361,7 @@
</el-card>
<!-- 澶囨敞淇℃伅 -->
- <el-card class="form-section" shadow="never">
+ <el-card class="form-section paper-card" shadow="never">
<div slot="header" class="section-header">
<i
class="el-icon-edit"
@@ -398,16 +369,18 @@
></i>
<span>澶囨敞淇℃伅</span>
</div>
- <el-form-item prop="remark">
- <el-input
- v-model="formData.remark"
- type="textarea"
- :rows="4"
- placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
- maxlength="500"
- show-word-limit
- />
- </el-form-item>
+ <div class="form-row">
+ <el-form-item prop="remark" class="col-full">
+ <el-input
+ v-model="formData.remark"
+ type="textarea"
+ :rows="4"
+ placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+ maxlength="500"
+ show-word-limit
+ />
+ </el-form-item>
+ </div>
</el-card>
</el-form>
@@ -857,4 +830,88 @@
.case-info-card {
border-left: 4px solid #67c23a;
}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+ padding: 16px;
+}
+
+.paper-form {
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
+
+.paper-form >>> .form-row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+ flex: 0 0 33.3333%;
+ display: flex;
+ margin: 0;
+ background: #fff;
+ border-right: 1px solid #d0d3db;
+ border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+ display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+ flex: 0 0 120px;
+ width: 120px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #ecf5ff;
+ border-right: 1px solid #d0d3db;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
+}
+
+/* ===== TransportEdit 鐗规畩閫傞厤锛氳〃鍗曞唴鏈夊涓垎鍖� el-card锛屾瘡涓垎鍖哄悇鑷嫭绔嬫垚瀹屾暣缃戞牸 ===== */
+.paper-form {
+ border: none;
+ background: transparent;
+}
+.paper-form >>> .paper-card {
+ border: none;
+ box-shadow: none;
+}
+.paper-form >>> .paper-card >>> .el-card__body {
+ border-top: 1px solid #d0d3db;
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+}
</style>
diff --git a/vue.config.js b/vue.config.js
index df11e23..46b25ec 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -33,9 +33,9 @@
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
- // target: `http://www.qdopo.com:9095`,
- target:`http://192.168.76.25:9095`,//鎵撳寘鍦板潃
- // target:`http://192.168.100.10:8080`,
+ // target: `https://opo.qduh.cn`,
+ // target:`http://192.168.76.25:9095`,//鎵撳寘鍦板潃
+ target:`http://192.168.100.10:8080`,
// target: `http://localhost:8080`,
// target:`http://192.168.100.137:8080`,
// target: `https://slb.hospitalstar.com:9093`,
diff --git "a/\347\256\241\347\220\206\347\253\2578.20.zip" "b/\347\256\241\347\220\206\347\253\2578.20.zip"
new file mode 100644
index 0000000..a17503e
--- /dev/null
+++ "b/\347\256\241\347\220\206\347\253\2578.20.zip"
Binary files differ
--
Gitblit v1.9.3