From c8e9849cb5f24848df0174c13bfbbff37bb08a5a Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期二, 21 七月 2026 15:45:30 +0800
Subject: [PATCH] 维护
---
src/views/business/allocation/allocationInfo.vue | 1317 +++++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 914 insertions(+), 403 deletions(-)
diff --git a/src/views/business/allocation/allocationInfo.vue b/src/views/business/allocation/allocationInfo.vue
index cfa9d2d..1ab3aab 100644
--- a/src/views/business/allocation/allocationInfo.vue
+++ b/src/views/business/allocation/allocationInfo.vue
@@ -5,67 +5,33 @@
<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="handleConfirmAllocation"
- :disabled="form.allocationStatus == '1'"
- :loading="confirmLoading"
- >
- 纭鍒嗛厤
- </el-button>
- </div>
</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 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-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-form-item label="璐熻矗浜�" prop="registrationName">
<el-input v-model="form.registrationName" />
</el-form-item>
</el-col>
- <el-col :span="12">
- <el-form-item label="鐧昏鏃堕棿" prop="registrationTime">
- <el-date-picker
- v-model="form.registrationTime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
+
</el-row>
</el-form>
</el-card>
@@ -75,54 +41,22 @@
<div slot="header" class="clearfix">
<span class="detail-title">鍣ㄥ畼鍒嗛厤璁板綍</span>
<div style="float: right;">
- <el-tag
- :type="
- form.allocationStatus == '1'
- ? 'success'
- : form.allocationStatus == '2'
- ? 'danger'
- : 'warning'
- "
- >
- {{
- form.allocationStatus == "1"
- ? "宸插垎閰�"
- : form.allocationStatus == "2"
- ? "浣滃簾"
- : "鏈垎閰�"
- }}
- </el-tag>
+ <dict-tag :options="dict.type.organ_allocation_status" :value="form.allocationStatus" />
</div>
</div>
- <el-form
- ref="allocationForm"
- :rules="allocationRules"
- :model="allocationData"
- label-position="right"
- >
+ <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'"
- >
+ <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;"
- />
+ <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>
@@ -130,29 +64,26 @@
<el-row>
<el-col>
<el-form-item>
- <el-table
- :data="allocationData.serviceDonateorganList"
- v-loading="loading"
- border
- style="width: 100%"
- :row-class-name="getOrganRowClassName"
- >
- <el-table-column
- label="鍣ㄥ畼鍚嶇О"
- align="center"
- width="120"
- prop="organname"
- >
+ <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>
+
+ <el-table-column label="鍒嗛厤鐘舵��" align="center" width="100" prop="allocationstatus" fixed>
<template slot-scope="scope">
- <el-input
- v-model="scope.row.organname"
- placeholder="鍣ㄥ畼鍚嶇О"
- :disabled="true"
- />
+ <el-tag :type="getAllocationStatusTagType(scope.row.allocationstatus)
+ " size="small">
+ {{ getAllocationStatusText(scope.row.allocationstatus) }}
+ </el-tag>
</template>
</el-table-column>
- <el-table-column
+ <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-column
label="鍒嗛厤绯荤粺缂栧彿"
align="center"
width="150"
@@ -162,98 +93,110 @@
<el-input
v-model="scope.row.caseno"
placeholder="鍒嗛厤绯荤粺缂栧彿"
- :disabled="form.allocationStatus == '1'"
+ :disabled="
+ form.allocationStatus == '1' ||
+ scope.row.allocationstatus == '3'
+ "
/>
+ </template>
+ </el-table-column> -->
+
+ <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="180"
- prop="applicanttime"
- >
+ <el-table-column label="鍙椾綋濮撴皬" align="center" width="120" prop="name">
<template slot-scope="scope">
- <el-date-picker
- clearable
- size="small"
+ <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%"
- v-model="scope.row.applicanttime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="閫夋嫨鍒嗛厤鎺ユ敹鏃堕棿"
- :disabled="form.allocationStatus == '1'"
- />
- </template>
+ >
+ <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>
- <el-table-column
- label="鍙椾綋濮撴皬"
- align="center"
- width="120"
- prop="name"
- >
+ <!-- 淇敼template涓殑璇存槑鍒� -->
+ <el-table-column label="璇存槑" align="center" prop="reallocationreason" min-width="200">
<template slot-scope="scope">
- <el-input
- v-model="scope.row.name"
- placeholder="鍙椾綋濮撴皬"
- :disabled="form.allocationStatus == '1'"
- />
- </template>
- </el-table-column>
+ <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'
+ " />
+ </div>
+ <div v-else>
+ <!-- 閲嶅垎閰嶈褰曪細鏄剧ず璇︾粏鏌ョ湅鎸夐挳 -->
+ <el-button v-if="scope.row.reallocationreason" type="text" size="small"
+ @click="handleViewRedistributionDetail(scope.row)" style="color: #e6a23c;">
+ <i class="el-icon-document"></i>
+ 鏌ョ湅閲嶅垎閰嶈鎯�
+ </el-button>
+ <span v-else class="no-data">-</span>
- <el-table-column
- label="绉绘鍖婚櫌"
- align="center"
- width="200"
- prop="transplanthospitalno"
- >
- <template slot-scope="scope">
- <div>
- <org-selecter
- ref="tranHosSelect"
- :org-type="'4'"
- :dataList="dataList"
- v-model="scope.row.transplanthospitalno"
- style="width: 100%"
- />
+ <!-- 淇濈暀鍘熸湁鐨勫伐鍏锋彁绀猴紙鍙Щ闄ゆ垨淇濈暀锛� -->
+ <el-tooltip v-if="scope.row.redistributionInfo" :content="formatRedistributionTooltip(
+ scope.row.redistributionInfo
+ )
+ " placement="top">
+ <el-button type="text" size="small" style="margin-left: 5px;">
+ <i class="el-icon-info"></i>
+ </el-button>
+ </el-tooltip>
</div>
</template>
</el-table-column>
- <el-table-column
- label="璇存槑"
- align="center"
- prop="reallocationreason"
- min-width="200"
- >
+ <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-input
- type="textarea"
- clearable
- v-model="scope.row.reallocationreason"
- placeholder="璇疯緭鍏ヨ鏄�"
- :disabled="form.allocationStatus == '1'"
- />
- </template>
- </el-table-column>
-
- <el-table-column
- label="鎿嶄綔"
- align="center"
- width="120"
- class-name="small-padding fixed-width"
- v-if="form.allocationStatus !== '1'"
- >
- <template slot-scope="scope">
- <el-button
- size="mini"
- type="text"
- icon="el-icon-copy-document"
- @click="handleRedistribution(scope.row)"
- :disabled="!scope.row.caseno"
- >
- 閲嶅垎閰�
+ <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>
@@ -263,7 +206,7 @@
</el-row>
<!-- 鍒嗛厤缁熻淇℃伅 -->
- <div
+ <!-- <div
class="allocation-stats"
v-if="
allocationData.serviceDonateorganList &&
@@ -281,8 +224,8 @@
</el-col>
<el-col :span="6">
<div class="stat-item">
- <span class="stat-label">寰呭畬鍠勪俊鎭�:</span>
- <span class="stat-value">{{ incompleteRecords }} 涓�</span>
+ <span class="stat-label">寰呭鏍�:</span>
+ <span class="stat-value">{{ pendingReviewCount }} 涓�</span>
</div>
</el-col>
<el-col :span="6">
@@ -293,59 +236,22 @@
</el-col>
<el-col :span="6">
<div class="stat-item">
- <span class="stat-label">鍒嗛厤鐘舵��:</span>
- <span class="stat-value">
- <el-tag
- :type="
- form.allocationStatus == '1'
- ? 'success'
- : form.allocationStatus == '2'
- ? 'danger'
- : 'warning'
- "
- >
- {{
- form.allocationStatus == "1"
- ? "宸插垎閰�"
- : form.allocationStatus == "2"
- ? "浣滃簾"
- : "鏈垎閰�"
- }}
- </el-tag>
- </span>
+ <span class="stat-label">閲嶅垎閰�:</span>
+ <span class="stat-value">{{ redistributedCount }} 涓�</span>
</div>
</el-col>
</el-row>
- </div>
+ </div> -->
- <div v-else class="empty-allocation">
+ <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 class="dialog-footer" v-if="form.allocationStatus !== '1'">
- <el-button
- type="primary"
- @click="handleSaveAllocation"
- :loading="saveLoading"
- :disabled="
- !allocationData.serviceDonateorganList ||
- allocationData.serviceDonateorganList.length == 0
- "
- >
- 淇濆瓨鍒嗛厤璁板綍
- </el-button>
- <el-button
- type="success"
- @click="handleConfirmAllocation"
- :loading="confirmLoading"
- :disabled="incompleteRecords > 0"
- >
- 纭瀹屾垚鍒嗛厤
- </el-button>
- </div> -->
</el-card>
<!-- 闄勪欢绠$悊閮ㄥ垎浼樺寲 -->
@@ -353,34 +259,21 @@
<div class="attachment-header">
<i class="el-icon-paperclip"></i>
<span class="attachment-title">鐩稿叧闄勪欢</span>
- <span class="attachment-tip"
- >鏀寔涓婁紶鍣ㄥ畼鍒嗛厤鐩稿叧鏂囦欢 (鏈�澶歿{ attachmentLimit }}涓�)</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"
- />
+ <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">
<div class="list-title">宸蹭笂浼犻檮浠� ({{ attachments.length }})</div>
<el-table :data="attachments" style="width: 100%" size="small">
- <el-table-column label="鏂囦欢鍚�" min-width="200">
+ <el-table-column label="鏂囦欢鍚�" min-width="150">
<template slot-scope="scope">
- <i
- class="el-icon-document"
- :style="{ color: getFileIconColor(scope.row.fileName) }"
- ></i>
+ <i class="el-icon-document" :style="{ color: getFileIconColor(scope.row.fileName) }"></i>
<span class="file-name">{{ scope.row.fileName }}</span>
</template>
</el-table-column>
@@ -401,28 +294,16 @@
<span>{{ formatFileSize(scope.row.fileSize) }}</span>
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="200" fixed="right">
+ <el-table-column label="鎿嶄綔" width="280" fixed="right">
<template slot-scope="scope">
- <el-button
- size="mini"
- type="primary"
- @click="handlePreview(scope.row)"
- :disabled="!isPreviewable(scope.row.fileName)"
- >
+ <el-button size="mini" type="primary" @click="handlePreview(scope.row)"
+ :disabled="!isPreviewable(scope.row.fileName)">
棰勮
</el-button>
- <el-button
- size="mini"
- type="success"
- @click="handleDownloadAttachment(scope.row)"
- >
+ <el-button size="mini" type="success" @click="handleDownloadAttachment(scope.row)">
涓嬭浇
</el-button>
- <el-button
- size="mini"
- type="danger"
- @click="handleRemoveAttachment(scope.$index)"
- >
+ <el-button size="mini" type="danger" @click="handleRemoveAttachment(scope.$index)">
鍒犻櫎
</el-button>
</template>
@@ -430,41 +311,143 @@
</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"
- >
- <el-form :model="redistributionForm" label-width="100px">
+ <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">
- <el-input
- type="textarea"
- :rows="4"
- v-model="redistributionForm.reason"
- placeholder="璇疯緭鍏ラ噸鍒嗛厤鍘熷洜"
- />
+ <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"
- >纭閲嶅垎閰�</el-button
- >
+ <el-button type="primary" @click="handleRedistributionConfirm" :loading="redistributionLoading">
+ 纭閲嶅垎閰�
+ </el-button>
</div>
</el-dialog>
+ <!-- 鍦╰emplate涓坊鍔犻噸鍒嗛厤璇︽儏寮圭獥 -->
+ <el-dialog title="閲嶅垎閰嶈鎯�" :visible.sync="redistributionDetailDialogVisible" width="600px">
+ <div v-loading="redistributionDetailLoading">
+ <div v-if="currentRedistributionDetail" style="padding: 20px;">
+ <!-- 鍩烘湰淇℃伅 -->
+ <el-descriptions title="閲嶅垎閰嶄俊鎭�" :column="2" border>
+ <el-descriptions-item label="鍣ㄥ畼鍚嶇О">
+ {{ currentRedistributionDetail.organname || "-" }}
+ </el-descriptions-item>
+ <el-descriptions-item label="鎿嶄綔浜�">
+ {{ currentRedistributionDetail.operator || "-" }}
+ </el-descriptions-item>
+ <el-descriptions-item label="鎿嶄綔鏃堕棿">
+ {{
+ currentRedistributionDetail.operatorTime
+ ? formatDateTime(currentRedistributionDetail.operatorTime)
+ : "-"
+ }}
+ </el-descriptions-item>
+ <el-descriptions-item label="閲嶅垎閰嶆椂闂�">
+ {{
+ currentRedistributionDetail.redistributionTime
+ ? formatDateTime(
+ currentRedistributionDetail.redistributionTime
+ )
+ : "-"
+ }}
+ </el-descriptions-item>
+ </el-descriptions>
+ <!-- 閲嶅垎閰嶅師鍥� -->
+ <div style="margin-top: 20px;">
+ <div class="section-title">閲嶅垎閰嶅師鍥�</div>
+ <div class="section-content" style="padding: 10px; background: #f5f7fa; border-radius: 4px;">
+ {{ currentRedistributionDetail.reason || "鏃�" }}
+ </div>
+ </div>
+
+ <!-- 閲嶅垎閰嶉檮浠� -->
+ <div style="margin-top: 20px;" v-if="
+ currentRedistributionDetail.attachments &&
+ currentRedistributionDetail.attachments.length > 0
+ ">
+ <div class="section-title">
+ 閲嶅垎閰嶉檮浠� ({{ currentRedistributionDetail.attachments.length }})
+ </div>
+ <div class="redistribution-attachments">
+ <el-table :data="currentRedistributionDetail.attachments" size="small" style="width: 100%">
+ <el-table-column label="鏂囦欢鍚�" min-width="150">
+ <template slot-scope="scope">
+ <i class="el-icon-document" :style="{ color: getFileIconColor(scope.row.fileName) }"></i>
+ <span class="file-name">{{ scope.row.fileName }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢绫诲瀷" width="100">
+ <template slot-scope="scope">
+ <el-tag :type="getFileTagType(scope.row.fileName)" size="small">
+ {{ getFileTypeText(scope.row.fileName) }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="涓婁紶鏃堕棿" width="150">
+ <template slot-scope="scope">
+ <span>{{
+ scope.row.uploadTime
+ ? formatDateTime(scope.row.uploadTime)
+ : "-"
+ }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="150" fixed="right">
+ <template slot-scope="scope">
+ <el-button size="mini" type="primary" @click="handleRedistributionAttachmentPreview(scope.row)"
+ :disabled="!isPreviewable(scope.row.fileName)">
+ 棰勮
+ </el-button>
+ <el-button size="mini" type="success" @click="handleRedistributionAttachmentDownload(scope.row)">
+ 涓嬭浇
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </div>
+
+ <div v-else style="margin-top: 20px; text-align: center; color: #909399;">
+ 鏃犻噸鍒嗛厤闄勪欢
+ </div>
+ </div>
+ </div>
+ <div slot="footer">
+ <el-button @click="redistributionDetailDialogVisible = false">鍏抽棴</el-button>
+ </div>
+ </el-dialog>
<!-- 闄勪欢棰勮瀵硅瘽妗� -->
- <FilePreviewDialog
- :visible="filePreviewVisible"
- :file="currentPreviewFile"
- @close="filePreviewVisible = false"
- @download="handleDownloadAttachment"
- />
+ <FilePreviewDialog :visible="filePreviewVisible" :file="currentPreviewFile" @close="filePreviewVisible = false"
+ @download="handleDownloadAttachment" />
</div>
</template>
@@ -494,18 +477,22 @@
"sys_DonationCategory",
"sys_RecordState",
"sys_Organ",
+ "Geta_hospital",
+
"organ_allocation_status"
],
data() {
return {
caseId: null,
-
+ // 閲嶅垎閰嶈鎯呯浉鍏�
+ redistributionDetailDialogVisible: false,
+ redistributionDetailLoading: false,
+ currentRedistributionDetail: null,
// 琛ㄥ崟鏁版嵁
form: {
id: undefined,
infoid: undefined,
donationcategory: "",
- recordstate: "",
caseNo: "",
donorno: "",
treatmenthospitalname: "",
@@ -535,16 +522,23 @@
],
diagnosisname: [
{ required: true, message: "鐤剧梾璇婃柇涓嶈兘涓虹┖", trigger: "blur" }
- ],
- recordstate: [
- { required: true, message: "璁板綍鐘舵�佷笉鑳戒负绌�", trigger: "change" }
]
},
// 鍒嗛厤璁板綍楠岃瘉瑙勫垯
allocationRules: {},
+ // 閲嶅垎閰嶉獙璇佽鍒�
+ redistributionRules: {
+ reason: [
+ { required: true, message: "閲嶅垎閰嶅師鍥犱笉鑳戒负绌�", trigger: "blur" }
+ ],
+ redistributionTime: [
+ { required: true, message: "閲嶅垎閰嶆椂闂翠笉鑳戒负绌�", trigger: "blur" }
+ ]
+ },
// 淇濆瓨鍔犺浇鐘舵��
saveLoading: false,
confirmLoading: false,
+ redistributionLoading: false,
// 鍔犺浇鐘舵��
loading: false,
// 閫変腑鐨勫櫒瀹橈紙瀛樺偍瀛楀吀value锛�
@@ -568,8 +562,11 @@
redistributionDialogVisible: false,
redistributionForm: {
organname: "",
- reason: ""
+ reason: "",
+ redistributionTime: ""
},
+ redistributionAttachmentList: [],
+ redistributionFormRef: null,
currentRedistributeRecord: null,
// 鏂囦欢棰勮鐩稿叧
filePreviewVisible: false,
@@ -582,22 +579,39 @@
currentUser() {
return JSON.parse(sessionStorage.getItem("user") || "{}");
},
+ displayOrgans() {
+ return (this.allocationData.serviceDonateorganList || [])
+ .filter(item => item.delFlag !== 1);
+ },
// 涓嶅畬鏁寸殑璁板綍鏁伴噺
incompleteRecords() {
if (!this.allocationData.serviceDonateorganList) return 0;
return this.allocationData.serviceDonateorganList.filter(
record =>
- !record.caseno ||
!record.applicanttime ||
+ !record.organgettime ||
!record.name ||
- !record.transplanthospitalno
+ !record.transplanthospitalname
).length;
},
- // 鍞竴鍖婚櫌鏁伴噺
+ // 寰呭鏍歌褰曟暟閲�
+ pendingReviewCount() {
+ if (!this.allocationData.serviceDonateorganList) return 0;
+ return this.allocationData.serviceDonateorganList.filter(
+ record => record.allocationstatus == "0"
+ ).length;
+ },
+ // 閲嶅垎閰嶈褰曟暟閲�
+ redistributedCount() {
+ if (!this.allocationData.serviceDonateorganList) return 0;
+ return this.allocationData.serviceDonateorganList.filter(
+ record => record.allocationstatus == "3"
+ ).length;
+ },
uniqueHospitals() {
if (!this.allocationData.serviceDonateorganList) return 0;
const hospitals = this.allocationData.serviceDonateorganList
- .map(record => record.transplanthospitalno)
+ .map(record => record.transplanthospitalname)
.filter(Boolean);
return new Set(hospitals).size;
},
@@ -608,6 +622,15 @@
// 鍒ゆ柇鏄惁闇�瑕佹樉绀哄叾浠栬緭鍏ユ
showOtherInput() {
return this.selectedOrgans.includes("C01"); // 鍋囪"鍏朵粬"鐨勫瓧鍏稿�兼槸C01
+ },
+ // 鍒嗛厤鐘舵�佸瓧鍏告槧灏�
+ allocationStatusDict() {
+ return {
+ "0": { label: "鎻愪氦鍒嗛厤", type: "info" },
+ "1": { label: "瀹℃牳閫氳繃", type: "success" },
+ "2": { label: "宸蹭綔搴�", type: "danger" },
+ "3": { label: "閲嶅垎閰�", type: "warning" }
+ };
}
},
watch: {
@@ -643,6 +666,110 @@
this.initData();
},
methods: {
+ // 鑾峰彇鍒嗛厤鐘舵�佹爣绛剧被鍨�
+ getAllocationStatusTagType(status) {
+ const statusMap = this.allocationStatusDict;
+ return statusMap[status] ? statusMap[status].type : "info";
+ },
+
+ // 鑾峰彇鍒嗛厤鐘舵�佹枃鏈�
+ getAllocationStatusText(status) {
+ const statusMap = this.allocationStatusDict;
+ return statusMap[status] ? statusMap[status].label : "鏈煡鐘舵��";
+ },
+ 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 })));
+ },
+ // 鏌ョ湅閲嶅垎閰嶈鎯�
+ handleViewRedistributionDetail(row) {
+ this.redistributionDetailLoading = true;
+ this.redistributionDetailDialogVisible = true;
+
+ try {
+ if (row.redistributionInfo) {
+ // 瑙f瀽閲嶅垎閰嶄俊鎭�
+ const redistributionInfo = JSON.parse(row.redistributionInfo);
+ this.currentRedistributionDetail = {
+ organname: row.organname || "-",
+ ...redistributionInfo
+ };
+ } else {
+ this.currentRedistributionDetail = {
+ organname: row.organname || "-",
+ reason: "鏃犻噸鍒嗛厤鍘熷洜",
+ attachments: []
+ };
+ }
+ } catch (error) {
+ console.error("瑙f瀽閲嶅垎閰嶄俊鎭け璐�:", error);
+ this.$message.error("閲嶅垎閰嶄俊鎭В鏋愬け璐�");
+ this.currentRedistributionDetail = {
+ organname: row.organname || "-",
+ reason: "閲嶅垎閰嶄俊鎭牸寮忛敊璇�",
+ attachments: []
+ };
+ } finally {
+ this.redistributionDetailLoading = false;
+ }
+ },
+
+ // 棰勮閲嶅垎閰嶉檮浠�
+ handleRedistributionAttachmentPreview(file) {
+ this.currentPreviewFile = {
+ fileName: file.fileName,
+ fileUrl: file.path || file.fileUrl,
+ fileType: this.getFileType(file.fileName)
+ };
+ this.filePreviewVisible = true;
+ },
+
+ // 涓嬭浇閲嶅垎閰嶉檮浠�
+ handleRedistributionAttachmentDownload(file) {
+ const fileUrl = file.path || file.fileUrl;
+ const fileName = file.fileName;
+
+ if (fileUrl) {
+ const link = document.createElement("a");
+ link.href = fileUrl;
+ link.download = fileName;
+ link.style.display = "none";
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ this.$message.success("寮�濮嬩笅杞芥枃浠�");
+ } else {
+ this.$message.warning("鏂囦欢璺緞涓嶅瓨鍦紝鏃犳硶涓嬭浇");
+ }
+ },
+
+ // 澧炲己鏍煎紡鍖栧伐鍏锋彁绀烘柟娉�
+ formatRedistributionTooltip(redistributionInfo) {
+ if (!redistributionInfo) return "";
+ try {
+ const info = JSON.parse(redistributionInfo);
+ let tooltip = `閲嶅垎閰嶅師鍥�: ${info.reason}\n閲嶅垎閰嶆椂闂�: ${info.redistributionTime}`;
+
+ // 娣诲姞闄勪欢淇℃伅
+ if (info.attachments && info.attachments.length > 0) {
+ tooltip += `\n\n闄勪欢(${info.attachments.length}涓�):`;
+ info.attachments.forEach((att, index) => {
+ tooltip += `\n${index + 1}. ${att.fileName}`;
+ });
+ }
+
+ return tooltip;
+ } catch (error) {
+ return redistributionInfo;
+ }
+ },
// 鏍规嵁瀛楀吀value鑾峰彇label
getOrganLabel(organValue) {
const dictItem = this.organDict.find(item => item.value == organValue);
@@ -675,6 +802,7 @@
this.getHospitalData();
},
+
// 鐢熸垚鎹愮尞鑰呯紪鍙�
generateDonorNo() {
const timestamp = Date.now().toString();
@@ -696,16 +824,15 @@
this.form.attachments = [];
}
},
+
// 鑾峰彇璇︽儏
async getDetail(infoid, id) {
this.loading = true;
- donateorganBaseinfoInfo(id);
try {
const response = await allocationList({ infoid });
if (response.code == 200 && response.data && response.data.length > 0) {
const data = response.data[0];
- data.allocationStatus = JSON.stringify(data.allocationStatus);
// 濉厖琛ㄥ崟鏁版嵁
Object.assign(this.form, data);
// 杞崲闄勪欢涓洪泦鍚�
@@ -723,7 +850,30 @@
this.allocationData.serviceDonateorganList = Array.isArray(
data.serviceDonateorganList
)
- ? data.serviceDonateorganList
+ ? data.serviceDonateorganList.map(item => {
+ // 纭繚姣忔潯璁板綍閮芥湁鍒嗛厤鐘舵�佸瓧娈碉紝榛樿鍊间负0
+ const allocationstatus = item.allocationstatus || "0";
+ let redistributionInfo = null;
+
+ // 瑙f瀽閲嶅垎閰嶄俊鎭�
+ if (allocationstatus == "3" && item.reallocationreason) {
+ try {
+ redistributionInfo = JSON.parse(item.reallocationreason);
+ console.log(redistributionInfo);
+ } catch (error) {
+ console.warn("瑙f瀽閲嶅垎閰嶄俊鎭け璐�:", error);
+ redistributionInfo = item.reallocationreason;
+ }
+ }
+
+ return {
+ ...item,
+ allocationstatus,
+ redistributionInfo: redistributionInfo
+ ? JSON.stringify(redistributionInfo)
+ : null
+ };
+ })
: [];
// 鏇存柊閫変腑鐨勫櫒瀹�
@@ -771,6 +921,7 @@
this.loading = false;
}
},
+
// 鑾峰彇鍖婚櫌鏁版嵁
async getHospitalData() {
try {
@@ -788,59 +939,80 @@
this.$message.error("鑾峰彇鍖婚櫌鏁版嵁澶辫触");
}
},
+
// 鍣ㄥ畼閫夋嫨鐘舵�佸彉鍖�
- handleOrganSelectionChange(selectedValues) {
- if (!this.allocationData.serviceDonateorganList) {
- this.allocationData.serviceDonateorganList = [];
+ async handleOrganSelectionChange(selectedValues) {
+ // 1. 澶勭悊浜掓枼閫昏緫锛堜慨鏀� this.selectedOrgans锛�
+ this.handleExclusiveSelections(selectedValues);
+
+ const finalSelected = this.selectedOrgans;
+ const records = this.allocationData.serviceDonateorganList || [];
+
+ // 2. 鏋勫缓鐩爣鍣ㄥ畼缂栧彿鍒楄〃锛堢洿鎺ヤ娇鐢ㄩ�変腑鐨勫�硷紝涓嶅睍寮�锛�
+ const targetOrganNos = finalSelected; // 杩欓噷涓嶅睍寮�锛屽氨鏄�変腑鐨勫櫒瀹樼紪鍙�
+
+ // 3. 鏂板鎴栨仮澶嶈褰�
+ targetOrganNos.forEach(no => {
+ const existing = records.find(r => r.organno === no);
+ if (existing) {
+ if (existing.delFlag === 1) {
+ existing.delFlag = 0; // 鎭㈠鏄剧ず
}
+ } else {
+ this.createOrganRecord(no);
+ }
+ });
- const currentOrganValues = this.allocationData.serviceDonateorganList.map(
- item => item.organno
+ // 4. 鎵惧嚭闇�瑕佸彇娑堢殑璁板綍锛堜笉鍦ㄧ洰鏍囬泦鍚堜腑锛�
+ const toRemove = records.filter(r => !targetOrganNos.includes(r.organno));
+ const toRemoveSaved = toRemove.filter(r => r.id); // 宸蹭繚瀛橈紝闇�纭
+ const toRemoveUnsaved = toRemove.filter(r => !r.id); // 鏈繚瀛橈紝鐩存帴绉婚櫎
+
+ // 4.1 鐩存帴绉婚櫎鏈繚瀛樼殑璁板綍
+ toRemoveUnsaved.forEach(r => {
+ const idx = records.indexOf(r);
+ if (idx !== -1) records.splice(idx, 1);
+ });
+
+ // 4.2 澶勭悊宸蹭繚瀛樼殑璁板綍锛氬脊绐楃‘璁�
+ if (toRemoveSaved.length > 0) {
+ const organNames = toRemoveSaved.map(r => r.organname).join('銆�');
+ try {
+ await this.$confirm(
+ `鎮ㄧ‘瀹氳鍙栨秷浠ヤ笅宸蹭繚瀛樼殑鍣ㄥ畼鍒嗛厤璁板綍鍚楋紵\n${organNames}\n鍙栨秷鍚庯紝杩欎簺璁板綍灏嗕粠鍒楄〃涓Щ闄わ紙鏁版嵁浠嶄繚鐣欙紝鍙仮澶嶏級銆俙,
+ '鎻愮ず',
+ {
+ confirmButtonText: '纭畾绉婚櫎',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ }
);
-
- // 澶勭悊浜掓枼閫昏緫锛堝弬鑰冩崘鐚喅瀹氶〉闈級
- this.handleExclusiveSelections(selectedValues);
-
- // 鏂板閫夋嫨鐨勫櫒瀹�
- selectedValues.forEach(organValue => {
- if (!currentOrganValues.includes(organValue)) {
- this.createOrganRecord(organValue);
+ // 鐢ㄦ埛纭锛氭爣璁� delFlag=1锛屽苟浠庨�変腑鍒楄〃涓Щ闄�
+ toRemoveSaved.forEach(r => {
+ r.delFlag = 1;
+ // 浠� selectedOrgans 涓Щ闄ゅ搴旂殑鍣ㄥ畼缂栧彿
+ const idx = this.selectedOrgans.indexOf(r.organno);
+ if (idx !== -1) this.selectedOrgans.splice(idx, 1);
+ });
+ } catch (error) {
+ // 鐢ㄦ埛鍙栨秷锛氭仮澶嶉�変腑鐘舵�侊紙灏嗗彇娑堢殑鍣ㄥ畼閲嶆柊鍔犲叆 selectedOrgans锛�
+ const parentToRestore = new Set();
+ toRemoveSaved.forEach(r => {
+ // 鐩存帴鎭㈠鍣ㄥ畼缂栧彿锛堝洜涓轰笉灞曞紑锛屾墍浠ュ氨鏄� r.organno锛�
+ if (!this.selectedOrgans.includes(r.organno)) {
+ this.selectedOrgans.push(r.organno);
}
});
+ this.$message.info('宸插彇娑堝垹闄ゆ搷浣�');
+ return; // 閫�鍑烘柟娉曪紝閬垮厤缁х画鎵ц
+ }
+ }
- // 绉婚櫎鍙栨秷閫夋嫨鐨勫櫒瀹�
- this.allocationData.serviceDonateorganList = this.allocationData.serviceDonateorganList.filter(
- record => {
- if (selectedValues.includes(record.organno)) {
- return true;
- } else {
- if (record.id) {
- this.$confirm(
- "鍒犻櫎鍣ㄥ畼鍒嗛厤鏁版嵁鍚庡皢鏃犳硶鎭㈠锛屾偍纭鍒犻櫎璇ユ潯璁板綍鍚楋紵",
- "鎻愮ず",
- {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- }
- )
- .then(() => {
- this.allocationData.serviceDonateorganList = this.allocationData.serviceDonateorganList.filter(
- r => r.organno !== record.organno
- );
- this.$message.success("鍒犻櫎鎴愬姛");
- })
- .catch(() => {
- this.selectedOrgans.push(record.organno);
- });
- return true; // 绛夊緟鐢ㄦ埛纭
- } else {
- return false; // 鐩存帴鍒犻櫎鏂拌褰�
- }
- }
- }
- );
- },
+ // 5. 娉ㄦ剰锛氬浜庡凡鏍囪鍒犻櫎鐨勮褰曪紝鎴戜滑涓嶄粠 selectedOrgans 涓Щ闄わ紙宸插湪纭鏃剁Щ闄わ級
+ // 浣嗚繕瑕佽�冭檻锛氭煇浜涜褰曞彲鑳藉洜涓轰簰鏂ラ�昏緫琚Щ闄わ紝宸插寘鍚湪 finalSelected 涓鐞嗭紝鏃犻澶栨搷浣�
+ // 鏇存柊琛ㄥ崟瀛楁锛堝鏋滈渶瑕佷繚瀛橀�変腑鐨勫櫒瀹樺垪琛紝鍙互鍦ㄨ繖閲岃缃� this.form.donateorgan锛屼絾鏈」鐩湭鐢級
+ // 濡傛灉闇�瑕侊紝鍙互娣诲姞 this.form.donateorgan = this.selectedOrgans.join(',');
+},
// 澶勭悊浜掓枼閫夋嫨锛堝弬鑰冩崘鐚喅瀹氶〉闈級
handleExclusiveSelections(selectedValues) {
@@ -888,11 +1060,15 @@
organno: organValue,
caseno: "",
applicanttime: "",
+ organgettime: "",
name: "",
transplanthospitalno: "",
transplantHospitalName: "",
reallocationreason: "",
- organState: 1
+ allocationstatus: "0", // 榛樿鎻愪氦鍒嗛厤鐘舵��
+ redistributionInfo: null,
+ organState: 1,
+ delFlag: 0 // 鏂板
});
},
@@ -905,38 +1081,219 @@
row.transplantHospitalName = hospital.hospitalName;
}
},
+
// 閲嶅垎閰嶆搷浣�
handleRedistribution(row) {
this.currentRedistributeRecord = row;
this.redistributionForm.organname = row.organname;
- this.redistributionForm.reason = row.reallocationreason || "";
+ this.redistributionForm.reason = "";
+ this.redistributionForm.redistributionTime = new Date()
+ .toISOString()
+ .replace("T", " ")
+ .substring(0, 19);
+ this.redistributionAttachmentList = [];
this.redistributionDialogVisible = true;
},
- // 纭閲嶅垎閰�
- handleRedistributionConfirm() {
- if (!this.redistributionForm.reason) {
- this.$message.warning("璇疯緭鍏ラ噸鍒嗛厤鍘熷洜");
- return;
- }
+ // 浣滃簾鎿嶄綔
+ handleInvalidate(row) {
+ this.$confirm(`纭畾瑕佸皢 "${row.organname}" 鐨勫垎閰嶈褰曚綔搴熷悧锛焋, "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning"
+ })
+ .then(() => {
+ // 鎵惧埌褰撳墠璁板綍鐨勭储寮�
+ const index = this.allocationData.serviceDonateorganList.findIndex(
+ item => item === row
+ );
- if (this.currentRedistributeRecord) {
- this.currentRedistributeRecord.reallocationreason = this.redistributionForm.reason;
- this.$message.success("閲嶅垎閰嶅師鍥犲凡鏇存柊");
- this.redistributionDialogVisible = false;
+ if (index !== -1) {
+ // 鏇存柊璁板綍鐘舵�佷负浣滃簾
+ this.allocationData.serviceDonateorganList[index].allocationstatus =
+ "2";
+
+ // 鏇存柊閫変腑鐨勫櫒瀹樺垪琛紙濡傛灉璇ュ櫒瀹樹笉鍐嶆湁鍏朵粬鏈夋晥璁板綍锛�
+ const organNo = row.organno;
+ const hasOtherValidRecord = this.allocationData.serviceDonateorganList.some(
+ item => item.organno === organNo && item.allocationstatus !== "2"
+ );
+
+ if (!hasOtherValidRecord) {
+ this.selectedOrgans = this.selectedOrgans.filter(
+ item => item !== organNo
+ );
+ }
+
+ this.$message.success("璁板綍宸蹭綔搴�");
+ }
+ })
+ .catch(() => { });
+ },
+ // 閲嶅垎閰嶅璇濇鍏抽棴
+ handleRedistributionDialogClose() {
+ this.redistributionForm = {
+ organname: "",
+ reason: "",
+ redistributionTime: ""
+ };
+ this.redistributionAttachmentList = [];
+ this.currentRedistributeRecord = null;
+ },
+
+ // 閲嶅垎閰嶉檮浠朵笂浼犳垚鍔�
+ handleRedistributionUploadSuccess({ file, fileList, response }) {
+ if (response.code == 200) {
+ const attachmentObj = {
+ fileName: file.name,
+ path: response.fileUrl || file.url,
+ fileUrl: response.fileUrl || file.url,
+ fileType: this.getFileExtension(file.name),
+ fileSize: file.size,
+ uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+ };
+ console.log(11);
+
+ this.redistributionAttachmentList = fileList;
+ this.$message.success("閲嶅垎閰嶉檮浠朵笂浼犳垚鍔�");
}
},
+
+ // 閲嶅垎閰嶉檮浠朵笂浼犻敊璇�
+ handleRedistributionUploadError({ file, fileList, error }) {
+ console.error("閲嶅垎閰嶉檮浠朵笂浼犲け璐�:", error);
+ this.$message.error("閲嶅垎閰嶉檮浠朵笂浼犲け璐ワ紝璇烽噸璇�");
+ },
+
+ // 閲嶅垎閰嶉檮浠剁Щ闄�
+ handleRedistributionAttachmentRemove(file) {
+ if (file.url) {
+ const index = this.redistributionAttachmentList.findIndex(
+ item => item.path == file.url || item.fileUrl == file.url
+ );
+ if (index > -1) {
+ this.redistributionAttachmentList.splice(index, 1);
+ }
+ }
+ },
+
+ // 纭閲嶅垎閰�
+ async handleRedistributionConfirm() {
+ this.$refs.redistributionFormRef.validate(async valid => {
+ if (!valid) {
+ this.$message.warning("璇峰畬鍠勯噸鍒嗛厤淇℃伅");
+ return;
+ }
+ console.log(1, this.redistributionAttachmentList);
+
+ this.redistributionLoading = true;
+
+ try {
+ // 鏋勫缓閲嶅垎閰嶄俊鎭璞�
+ const redistributionInfo = {
+ reason: this.redistributionForm.reason,
+ redistributionTime: this.redistributionForm.redistributionTime,
+ attachments: this.redistributionAttachmentList.map(att => ({
+ // fileName: att.fileName,
+ // path: att.path || att.fileUrl,
+ // fileUrl: att.path || att.fileUrl,
+ // fileType: this.getFileExtension(att.name),
+ // fileSize: att.fileSize,
+ // uploadTime: att.uploadTime
+ fileName: att.name,
+ path: att.url,
+ fileUrl: att.url,
+ fileType: this.getFileExtension(att.name),
+ fileSize: att.size,
+ uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+ })),
+
+ operator: this.currentUser.username || this.currentUser.nickName,
+ operatorTime: new Date()
+ .toISOString()
+ .replace("T", " ")
+ .substring(0, 19)
+ };
+ console.log(2, this.redistributionAttachmentList);
+
+ // 鎵惧埌褰撳墠璁板綍鐨勭储寮�
+ const currentIndex = this.allocationData.serviceDonateorganList.findIndex(
+ item => item == this.currentRedistributeRecord
+ );
+
+ if (currentIndex !== -1) {
+ // 1. 鏇存柊鍘熻褰曠殑鐘舵�佷负3锛堥噸鍒嗛厤锛夊苟淇濆瓨閲嶅垎閰嶄俊鎭�
+ const originalRecord = { ...this.currentRedistributeRecord };
+ originalRecord.allocationstatus = "3";
+ originalRecord.reallocationreason = JSON.stringify(
+ redistributionInfo
+ );
+ originalRecord.redistributionInfo = JSON.stringify(
+ redistributionInfo
+ );
+
+ // 2. 鍒涘缓鏂扮殑璁板綍
+ const newRecord = {
+ ...this.currentRedistributeRecord,
+ id: null, // 鏂拌褰旾D涓虹┖
+ allocationstatus: "0", // 鏂拌褰曠姸鎬佷负鎻愪氦鍒嗛厤
+ reallocationreason: "", // 娓呯┖閲嶅垎閰嶅師鍥�
+ redistributionInfo: null,
+ // 閲嶇疆鐩稿叧瀛楁锛屼絾淇濈暀鍣ㄥ畼淇℃伅
+ caseno: "",
+ applicanttime: "",
+ organgettime: "",
+ name: "",
+ transplanthospitalno: "",
+ transplantHospitalName: ""
+ };
+
+ // 3. 鍦ㄦ暟缁勪腑鎻掑叆鏂拌褰曪紙鍦ㄦ棫璁板綍涔嬪悗锛�
+ this.allocationData.serviceDonateorganList.splice(
+ currentIndex + 1,
+ 0,
+ newRecord
+ );
+ // 4. 鏇存柊鍘熻褰�
+ this.allocationData.serviceDonateorganList[
+ currentIndex
+ ] = originalRecord;
+
+ // 5. 鏇存柊閫変腑鐨勫櫒瀹樺垪琛�
+ this.selectedOrgans.push(this.currentRedistributeRecord.organno);
+
+ this.$message.success("閲嶅垎閰嶆搷浣滄垚鍔熷畬鎴�");
+ this.redistributionDialogVisible = false;
+ } else {
+ this.$message.error("鏈壘鍒板搴旂殑璁板綍");
+ }
+ } catch (error) {
+ console.error("閲嶅垎閰嶆搷浣滃け璐�:", error);
+ this.$message.error("閲嶅垎閰嶆搷浣滃け璐�");
+ } finally {
+ this.redistributionLoading = false;
+ }
+ });
+ },
+
// 鍣ㄥ畼琛屾牱寮�
getOrganRowClassName({ row }) {
- if (
- !row.caseno ||
+ if (row.allocationstatus == "3") {
+ return "redistributed-row"; // 閲嶅垎閰嶈褰曟牱寮�
+ } else if (row.allocationstatus == "2") {
+ return "invalidated-row"; // 浣滃簾璁板綍鏍峰紡
+ } else if (
!row.applicanttime ||
+ !row.organgettime ||
!row.name ||
- !row.transplanthospitalno
+ !row.transplanthospitalname
) {
- return "warning-row";
+ return "warning-row"; // 淇℃伅涓嶅畬鏁存牱寮�
+ } else if (row.allocationstatus == "0") {
+ return "pending-row"; // 寰呭鏍告牱寮�
}
return "";
},
+
// 鏋勫缓 filePatch 瀛楁
buildFilePatch() {
if (!this.attachments || this.attachments.length == 0) {
@@ -944,6 +1301,7 @@
}
return JSON.stringify(this.attachments);
},
+
// 淇濆瓨鍩烘湰淇℃伅
async handleSave() {
this.$refs.form.validate(async valid => {
@@ -959,12 +1317,26 @@
serviceDonateorganList:
this.allocationData.serviceDonateorganList || []
};
- saveData.fileName = this.buildFilePatch();
+
+ // 纭繚姣忔潯璁板綍閮芥湁鍒嗛厤鐘舵��
saveData.serviceDonateorganList.forEach(item => {
item.baseid = this.form.id;
item.infoid = this.form.infoid;
+ // 纭繚鏈夊垎閰嶇姸鎬佸瓧娈�
+ if (!item.allocationstatus) {
+ item.allocationstatus = "0";
+ }
+ // 濡傛灉鏄噸鍒嗛厤璁板綍锛岀‘淇濇湁閲嶅垎閰嶄俊鎭�
+ if (item.allocationstatus == "3" && !item.reallocationreason) {
+ item.reallocationreason = item.redistributionInfo || "";
+ }
});
- this.form.recordstate = 1;
+
+ if (saveData.allocationStatus == 1 || !saveData.allocationStatus) {
+ saveData.allocationStatus = 2;
+ }
+ saveData.fileName = this.buildFilePatch();
+
const apiMethod = this.form.id ? allocationedit : allocationadd;
const response = await apiMethod(saveData);
@@ -972,9 +1344,6 @@
this.$message.success("淇濆瓨鎴愬姛");
if (!this.form.id && response.data) {
this.form.id = response.data;
- // this.$router.replace({
- // query: { ...this.$route.query, id: this.form.id }
- // });
}
} else {
this.$message.error("淇濆瓨澶辫触锛�" + (response.msg || "鏈煡閿欒"));
@@ -987,38 +1356,7 @@
}
});
},
- // 淇濆瓨鍒嗛厤璁板綍
- async handleSaveAllocation() {
- if (!this.form.id) {
- this.$message.warning("璇峰厛淇濆瓨鍩烘湰淇℃伅");
- return;
- }
- this.saveLoading = true;
- try {
- const saveData = {
- ...this.form,
- attachments: this.attachments,
- serviceDonateorganList:
- this.allocationData.serviceDonateorganList || []
- };
-
- const response = await allocationedit(saveData);
-
- if (response.code == 200) {
- this.$message.success("鍒嗛厤璁板綍淇濆瓨鎴愬姛");
- } else {
- this.$message.error(
- "淇濆瓨鍒嗛厤璁板綍澶辫触锛�" + (response.msg || "鏈煡閿欒")
- );
- }
- } catch (error) {
- console.error("淇濆瓨鍒嗛厤璁板綍澶辫触:", error);
- this.$message.error("淇濆瓨鍒嗛厤璁板綍澶辫触");
- } finally {
- this.saveLoading = false;
- }
- },
// 纭瀹屾垚鍒嗛厤
async handleConfirmAllocation() {
if (this.incompleteRecords > 0) {
@@ -1033,7 +1371,7 @@
})
.then(async () => {
this.confirmLoading = true;
- this.form.allocationStatus = "1";
+ this.form.allocationStatus = "3";
this.form.allocationTime = new Date()
.toISOString()
.replace("T", " ")
@@ -1067,13 +1405,16 @@
this.confirmLoading = false;
}
})
- .catch(() => {});
+ .catch(() => { });
},
// 闄勪欢鐩稿叧鏂规硶
/** 闄勪欢鍙樺寲澶勭悊 */
handleAttachmentChange(fileList) {
this.attachmentFileList = fileList;
+ },
+ handleRedistributionChange(fileList) {
+ this.redistributionAttachmentList = fileList;
},
/** 闄勪欢绉婚櫎澶勭悊 */
@@ -1131,9 +1472,9 @@
fileUrl: file.path || file.fileUrl,
fileType: this.getFileType(file.fileName)
};
- // this.filePreviewTitle = file.fileName;
this.filePreviewVisible = true;
},
+
handleDownloadAttachment(file) {
const fileUrl = file.path || file.fileUrl;
const fileName = file.fileName;
@@ -1212,6 +1553,8 @@
/** 鑾峰彇鏂囦欢鎵╁睍鍚� */
getFileExtension(filename) {
+ console.log(filename, "filename");
+
return filename
.split(".")
.pop()
@@ -1342,6 +1685,47 @@
font-weight: bold;
}
+/* 鍦╯tyle閮ㄥ垎娣诲姞 */
+.section-title {
+ font-weight: 600;
+ color: #303133;
+ margin-bottom: 8px;
+ font-size: 14px;
+}
+
+.section-content {
+ background: #f5f7fa;
+ padding: 12px;
+ border-radius: 4px;
+ border-left: 3px solid #e6a23c;
+ line-height: 1.6;
+}
+
+.redistribution-attachments {
+ margin-top: 10px;
+ border: 1px solid #ebeef5;
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+/* 閲嶅垎閰嶈鎯呰〃鏍兼牱寮� */
+:deep(.redistribution-attachments .el-table) {
+ border: none;
+}
+
+:deep(.redistribution-attachments .el-table th) {
+ background-color: #f5f7fa;
+ color: #606266;
+ font-weight: 600;
+}
+
+/* 鍝嶅簲寮忚皟鏁� */
+@media (max-width: 768px) {
+ .redistribution-attachments {
+ overflow-x: auto;
+ }
+}
+
/* 绌虹姸鎬佹牱寮� */
.empty-allocation {
text-align: center;
@@ -1349,21 +1733,142 @@
color: #909399;
}
-/* 瀵硅瘽妗嗗簳閮ㄦ寜閽� */
-.dialog-footer {
- margin-top: 20px;
- text-align: center;
- padding-top: 20px;
- border-top: 1px solid #e4e7ed;
+/* 鏃犳暟鎹牱寮� */
+.no-data {
+ color: #909399;
+ font-style: italic;
}
-/* 琛ㄦ牸琛屾牱寮� */
+/* ===== 琛ㄦ牸琛屾牱寮� ===== */
+
+/* 閲嶅垎閰嶈鏍峰紡 */
+:deep(.redistributed-row) {
+ background-color: #fdf6ec;
+ opacity: 0.8;
+}
+
+:deep(.redistributed-row:hover) {
+ background-color: #faecd8;
+ opacity: 0.9;
+}
+
+/* 淇℃伅涓嶅畬鏁磋鍛婅鏍峰紡 */
:deep(.warning-row) {
background-color: #fff7e6;
}
:deep(.warning-row:hover) {
background-color: #ffecc2;
+}
+
+/* 寰呭鏍歌鏍峰紡 */
+:deep(.pending-row) {
+ background-color: #f0f9ff;
+}
+
+:deep(.pending-row:hover) {
+ background-color: #e0f2ff;
+}
+
+/* ===== 鏂板锛氫綔搴熻鏍峰紡 ===== */
+:deep(.invalidated-row) {
+ background-color: #fef0f0;
+ position: relative;
+}
+
+:deep(.invalidated-row td) {
+ opacity: 0.6;
+ text-decoration: line-through;
+ color: #c0c4cc !important;
+}
+
+:deep(.invalidated-row:hover td) {
+ background-color: #fde2e2 !important;
+ opacity: 0.75;
+}
+
+/* 浣滃簾琛屽唴鐨勮緭鍏ユ鍜岄�夋嫨鍣ㄦ牱寮� */
+:deep(.invalidated-row .el-input__inner),
+:deep(.invalidated-row .el-textarea__inner),
+:deep(.invalidated-row .el-date-editor .el-input__inner) {
+ background-color: #fef0f0 !important;
+ border-color: #fbc4c4 !important;
+ color: #c0c4cc !important;
+ cursor: not-allowed !important;
+}
+
+/* 浣滃簾琛屽唴鐨勬爣绛炬牱寮� */
+:deep(.invalidated-row .el-tag) {
+ opacity: 0.5;
+}
+
+/* 浣滃簾琛屽唴鐨勬寜閽牱寮� */
+:deep(.invalidated-row .el-button--text) {
+ color: #c0c4cc !important;
+ cursor: not-allowed !important;
+}
+
+/* ===== 鎿嶄綔鎸夐挳鏍峰紡 ===== */
+
+/* 鎿嶄綔鎸夐挳瀹瑰櫒 */
+.operation-buttons {
+ display: flex;
+ gap: 4px;
+ justify-content: center;
+ align-items: center;
+}
+
+/* 鎿嶄綔鎸夐挳閫氱敤鏍峰紡 */
+:deep(.el-table .el-button--text) {
+ padding: 4px 6px;
+ font-size: 12px;
+}
+
+/* 閲嶅垎閰嶆寜閽牱寮� */
+:deep(.el-button--text.redistribute-btn) {
+ color: #e6a23c;
+}
+
+:deep(.el-button--text.redistribute-btn:hover:not(:disabled)) {
+ color: #cf9236;
+}
+
+/* 浣滃簾鎸夐挳鏍峰紡 */
+:deep(.el-button--text.invalidate-btn) {
+ color: #f56c6c;
+}
+
+:deep(.el-button--text.invalidate-btn:hover:not(:disabled)) {
+ color: #d9534f;
+}
+
+/* 绂佺敤鐘舵�佺殑鎸夐挳鏍峰紡 */
+:deep(.el-button--text.is-disabled) {
+ color: #c0c4cc !important;
+ cursor: not-allowed !important;
+ opacity: 0.5;
+}
+
+/* 閲嶅垎閰嶄俊鎭彁绀烘鏍峰紡 */
+:deep(.el-tooltip__popper) {
+ max-width: 300px;
+ white-space: pre-line;
+ line-height: 1.6;
+}
+
+/* 绂佺敤鐘舵�佺殑杈撳叆妗嗘牱寮� */
+:deep(.el-input.is-disabled .el-input__inner) {
+ background-color: #f5f7fa;
+ border-color: #e4e7ed;
+ color: #c0c4cc;
+ cursor: not-allowed;
+}
+
+:deep(.el-textarea.is-disabled .el-textarea__inner) {
+ background-color: #f5f7fa;
+ border-color: #e4e7ed;
+ color: #c0c4cc;
+ cursor: not-allowed;
}
/* 鍝嶅簲寮忚璁� */
@@ -1375,5 +1880,11 @@
.allocation-stats .el-col {
margin-bottom: 10px;
}
+
+ /* 绉诲姩绔搷浣滄寜閽牱寮忚皟鏁� */
+ :deep(.el-table .el-button--text) {
+ padding: 2px 4px;
+ font-size: 11px;
+ }
}
</style>
--
Gitblit v1.9.3