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/course/components/OrganProcurementStage.vue | 789 +++++++++++++++++++++++++++++++++++---------------------
1 files changed, 490 insertions(+), 299 deletions(-)
diff --git a/src/views/business/course/components/OrganProcurementStage.vue b/src/views/business/course/components/OrganProcurementStage.vue
index 4bbbf52..fe95cd1 100644
--- a/src/views/business/course/components/OrganProcurementStage.vue
+++ b/src/views/business/course/components/OrganProcurementStage.vue
@@ -5,7 +5,6 @@
<el-card class="detail-card">
<div slot="header" class="clearfix">
<span class="detail-title">鍣ㄥ畼鑾峰彇鍩烘湰淇℃伅</span>
-
</div>
<el-form :model="form" ref="form" :rules="rules" label-width="120px">
@@ -124,19 +123,35 @@
</el-row>
<el-row :gutter="20">
- <el-col :span="8">
+ <!-- <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-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>
@@ -151,12 +166,12 @@
</el-form-item>
</el-col>
<el-col :span="8">
- <el-form-item label="鑱旂粶浜轰竴" prop="coordinatedusernameo">
+ <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-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet">
<el-input v-model="form.coordinatedusernamet" />
</el-form-item>
</el-col>
@@ -174,14 +189,14 @@
/>
</el-form-item>
</el-col>
- <el-col :span="8">
- <el-form-item label="鑾峰彇鏈烘瀯缂栫爜" prop="gainhospitalno">
+ <!-- <el-col :span="8">
+ <el-form-item label="鎹愮尞缂栧彿" prop="gainhospitalno">
<el-input
v-model="form.gainhospitalno"
- placeholder="璇疯緭鍏ヨ幏鍙栨満鏋勭紪鐮�"
+ placeholder="璇疯緭鍏ユ崘鐚紪鍙�"
/>
</el-form-item>
- </el-col>
+ </el-col> -->
</el-row>
</el-form>
</el-card>
@@ -191,7 +206,6 @@
<div slot="header" class="clearfix">
<span class="detail-title">鍣ㄥ畼鑾峰彇璁板綍</span>
<div style="float: right;">
-
<dict-tag
:options="dict.type.Obtain_status"
:value="form.witnessState"
@@ -228,7 +242,7 @@
<el-col>
<el-form-item>
<el-table
- :data="procurementData.serviceDonationwitnessorgans"
+ :data="displayOrgans"
v-loading="loading"
border
style="width: 100%"
@@ -252,7 +266,7 @@
<el-table-column
label="鑾峰彇寮�濮嬫椂闂�"
align="center"
- width="180"
+ width="260"
prop="organStartTime"
>
<template slot-scope="scope">
@@ -271,7 +285,7 @@
<el-table-column
label="鍣ㄥ畼绂讳綋鏃堕棿"
align="center"
- width="180"
+ width="260"
prop="organgettime"
>
<template slot-scope="scope">
@@ -290,30 +304,39 @@
<el-table-column
label="鑾峰彇鍖婚櫌"
align="center"
- width="200"
- prop="gainhospitalno"
+ width="300"
+ prop="gainhospitalname"
>
- <template slot-scope="scope">
+ <!-- <template slot-scope="scope">
<el-select
- v-model="scope.row.gainhospitalno"
+ v-model="scope.row.gainhospitalname"
placeholder="璇烽�夋嫨鑾峰彇鍖婚櫌"
style="width: 100%"
- @change="handleHospitalChange(scope.row, $event)"
>
<el-option
- v-for="hospital in hospitalList"
- :key="hospital.hospitalNo"
- :label="hospital.hospitalName"
- :value="hospital.hospitalNo"
- />
+ 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="120"
+ width="150"
prop="organgetdoct"
>
<template slot-scope="scope">
@@ -325,51 +348,6 @@
</el-table-column>
<!-- <el-table-column
- label="鍔╂墜"
- align="center"
- width="120"
- prop="assistant"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.assistant"
- placeholder="鍔╂墜"
-
- />
- </template>
- </el-table-column> -->
-
- <!-- <el-table-column
- label="鑾峰彇鎶ゅ+"
- align="center"
- width="120"
- prop="procurementNurse"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.procurementNurse"
- placeholder="鑾峰彇鎶ゅ+"
-
- />
- </template>
- </el-table-column>
-
- <el-table-column
- label="鎵嬫湳瀹ゆ姢澹�"
- align="center"
- width="120"
- prop="operatingRoomNurse"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.operatingRoomNurse"
- placeholder="鎵嬫湳瀹ゆ姢澹�"
-
- />
- </template>
- </el-table-column> -->
-
- <el-table-column
label="鑾峰彇鐘舵��"
align="center"
width="120"
@@ -389,7 +367,7 @@
/>
</el-select>
</template>
- </el-table-column>
+ </el-table-column> -->
<el-table-column
label="璇存槑"
@@ -429,55 +407,6 @@
</el-col>
</el-row>
- <!-- 鑾峰彇缁熻淇℃伅 -->
- <!-- <div
- class="procurement-stats"
- v-if="
- procurementData.serviceDonationwitnessorgans &&
- procurementData.serviceDonationwitnessorgans.length > 0
- "
- >
- <el-row :gutter="20">
- <el-col :span="6">
- <div class="stat-item">
- <span class="stat-label">宸茶幏鍙栧櫒瀹�:</span>
- <span class="stat-value"
- >{{
- procurementData.serviceDonationwitnessorgans.length
- }}
- 涓�</span
- >
- </div>
- </el-col>
- <el-col :span="6">
- <div class="stat-item">
- <span class="stat-label">寰呭畬鍠勪俊鎭�:</span>
- <span class="stat-value">{{ incompleteRecords }} 涓�</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">
- <el-tag
- :type="
- form.witnessState === 'completed' ? 'success' : 'warning'
- "
- >
- {{ form.witnessState === "completed" ? "宸插畬鎴�" : "杩涜涓�" }}
- </el-tag>
- </span>
- </div>
- </el-col>
- </el-row>
- </div> -->
-
<div
v-if="!procurementData.serviceDonationwitnessorgans"
class="empty-procurement"
@@ -489,89 +418,130 @@
</el-form>
</el-card>
- <!-- 闄勪欢绠$悊閮ㄥ垎浼樺寲 -->
+ <!-- 闄勪欢绠$悊閮ㄥ垎 - 鍒嗙被Tab灞曠ず -->
<el-card class="attachment-card">
- <div class="attachment-header">
- <i class="el-icon-paperclip"></i>
- <span class="attachment-title">鐩稿叧闄勪欢</span>
- <span class="attachment-tip"
- >鏀寔涓婁紶鍣ㄥ畼鑾峰彇鐩稿叧鏂囦欢 (鏈�澶歿{ attachmentLimit }}涓�)</span
- >
+ <div slot="header" class="clearfix">
+ <span class="detail-title">鐩稿叧闄勪欢</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"
- />
+ <!-- 涓婁紶鍖哄煙锛堟棤鍒嗙被閫夋嫨锛岀敱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">
- <div class="list-title">宸蹭笂浼犻檮浠� ({{ attachments.length }})</div>
- <el-table :data="attachments" style="width: 100%" size="small">
- <el-table-column label="鏂囦欢鍚�" min-width="200">
- <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="160">
- <template slot-scope="scope">
- <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鏂囦欢澶у皬" width="100">
- <template slot-scope="scope">
- <span>{{ formatFileSize(scope.row.fileSize) }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="200" fixed="right">
- <template slot-scope="scope">
- <el-button
- size="mini"
- type="primary"
- @click="handlePreview(scope.row)"
- :disabled="!isPreviewable(scope.row.fileName)"
- >
- 棰勮
- </el-button>
- <el-button
- size="mini"
- type="success"
- @click="handleDownload(scope.row)"
- >
- 涓嬭浇
- </el-button>
- <el-button
- size="mini"
- type="danger"
- @click="handleRemoveAttachment(scope.$index)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </el-table-column>
- </el-table>
+ <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-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-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="缂栬緫鍣ㄥ畼鑾峰彇璁板綍"
@@ -585,7 +555,7 @@
<el-input v-model="currentRecord.organname" readonly />
</el-form-item>
</el-col>
- <el-col :span="12">
+ <!-- <el-col :span="12">
<el-form-item label="鑾峰彇鐘舵��">
<el-select v-model="currentRecord.organstate" style="width: 100%">
<el-option
@@ -596,7 +566,7 @@
/>
</el-select>
</el-form-item>
- </el-col>
+ </el-col> -->
</el-row>
<el-row :gutter="20">
@@ -644,10 +614,7 @@
/>
</el-form-item>
- <el-form-item
- label="鏈幏鍙栬鏄�"
- v-if="currentRecord.organstate === '0'"
- >
+ <el-form-item label="鏈幏鍙栬鏄�">
<el-input
type="textarea"
:rows="3"
@@ -706,11 +673,12 @@
},
dicts: [
"sys_BloodType",
+ "Geta_hospital",
"sys_DonationCategory",
"sys_Organ",
"Obtain_status"
],
- props: {
+ props: {
infoid: {
type: String,
default: true
@@ -772,6 +740,18 @@
coordinatorSignTime: "",
attachments: []
},
+ activeTab: "鍘熻〃鎷嶇収", // 褰撳墠婵�娲荤殑闄勪欢鍒嗙被Tab
+ presetCategories: [
+ "鍘熻〃鎷嶇収",
+ "浼︾悊瀹℃煡鏉愭枡",
+ "姝讳骸鍒ゅ畾鏉愭枡",
+ "榛樺搥浠紡鐓х墖",
+ "鎹愮尞瑙佽瘉瑙嗛"
+ ], // 棰勮鍒嗙被
+ organExpansionMap: {
+ C64: { subItems: ["C64L", "C64R"], subNames: ["宸﹁偩", "鍙宠偩"] },
+ C34: { subItems: ["C34L", "C34R"], subNames: ["宸﹁偤", "鍙宠偤"] }
+ },
// 琛ㄥ崟楠岃瘉瑙勫垯
rules: {
name: [
@@ -823,6 +803,32 @@
// 褰撳墠鐢ㄦ埛淇℃伅
currentUser() {
return JSON.parse(sessionStorage.getItem("user") || "{}");
+ },
+ displayOrgans() {
+ return (this.procurementData.serviceDonationwitnessorgans || []).filter(
+ item => item.delFlag !== 1
+ );
+ },
+ categories() {
+ // 濮嬬粓杩斿洖鎵�鏈夐璁惧垎绫� + 鏈垎绫伙紝鏃犺鏄惁鏈夋暟鎹�
+ return [
+ "鍘熻〃鎷嶇収",
+ "浼︾悊瀹℃煡鏉愭枡",
+ "姝讳骸鍒ゅ畾鏉愭枡",
+ "榛樺搥浠紡鐓х墖",
+ "鎹愮尞瑙佽瘉瑙嗛",
+ "鏈垎绫�"
+ ];
+ },
+ organReverseMap() {
+ const map = {};
+ for (const key in this.organExpansionMap) {
+ const { subItems } = this.organExpansionMap[key];
+ subItems.forEach(item => {
+ map[item] = key;
+ });
+ }
+ return map;
},
// 涓嶅畬鏁寸殑璁板綍鏁伴噺
incompleteRecords() {
@@ -878,8 +884,7 @@
// 鍒濆鍖栨暟鎹�
initData() {
- const id = null;
- const infoid = this.infoid;
+ const infoid = this.infoid;
if (!infoid) {
this.$message.error("缂哄皯蹇呰鐨勮矾鐢卞弬鏁� infoid");
@@ -896,13 +901,18 @@
this.getHospitalData();
},
- // 鐢熸垚鎹愮尞鑰呯紪鍙�
- // generateDonorNo() {
- // const timestamp = Date.now().toString();
- // this.form.donorno = "D" + timestamp.slice(-8);
- // this.form.caseNo = "CASE" + timestamp.slice(-6);
- // this.form.inpatientno = "IP" + timestamp.slice(-6);
- // },
+ 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;
@@ -923,10 +933,25 @@
// 鍒濆鍖栭檮浠�
if (this.form.deathjudgeannex) {
- this.form.attachments = JSON.parse(this.form.deathjudgeannex);
- this.attachments = Array.isArray(this.form.attachments)
- ? [...this.form.attachments]
- : [];
+ const parsed = JSON.parse(this.form.deathjudgeannex);
+ 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 = [];
}
// 澶勭悊鎹愮尞鍣ㄥ畼瀛楁
@@ -948,6 +973,7 @@
}
this.$message.success("鏁版嵁鍔犺浇鎴愬姛");
+ this.syncOrgansFromSelection();
} else {
this.$message.warning("鏈壘鍒板搴旂殑鍣ㄥ畼鑾峰彇鏁版嵁");
}
@@ -957,6 +983,52 @@
} finally {
this.loading = false;
}
+ },
+ syncOrgansFromSelection() {
+ const records = this.procurementData.serviceDonationwitnessorgans || [];
+ const targetNos = [];
+ this.selectedOrgans.forEach(val => {
+ if (this.organExpansionMap[val]) {
+ targetNos.push(...this.organExpansionMap[val].subItems);
+ } else {
+ targetNos.push(val);
+ }
+ });
+
+ // 鏂板鎴栨仮澶�
+ targetNos.forEach(no => {
+ const existing = records.find(r => r.organno === no);
+ if (existing) {
+ if (existing.delFlag === 1) {
+ existing.delFlag = 0; // 鎭㈠鏄剧ず
+ }
+ } else {
+ 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=1 鐨勮褰曪紝浣嗗疄闄呭簲璇ユ樉绀猴紝寮哄埗閲嶇疆
+ records.forEach(r => {
+ if (r.delFlag === 1) r.delFlag = 0;
+ });
+
+ this.form.organdonation = this.selectedOrgans.join(",");
},
// 鑾峰彇鍖婚櫌鏁版嵁
async getHospitalData() {
@@ -975,87 +1047,139 @@
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;
+
+ // el-autocomplete 闇�瑕� value 瀛楁
+ cb(results.map(item => ({ value: item.label })));
+ },
// 鍣ㄥ畼閫夋嫨鐘舵�佸彉鍖�
- handleOrganSelectionChange(selectedValues) {
- if (!this.procurementData.serviceDonationwitnessorgans) {
- this.procurementData.serviceDonationwitnessorgans = [];
- }
-
- const currentOrganValues = this.procurementData.serviceDonationwitnessorgans.map(
- item => item.organno
- );
-
- // 澶勭悊浜掓枼閫昏緫
+ async handleOrganSelectionChange(selectedValues) {
+ // 1. 澶勭悊浜掓枼閫昏緫锛堜慨鏀� this.selectedOrgans锛�
this.handleExclusiveSelections(selectedValues);
- // 鏇存柊鎹愮尞鍣ㄥ畼瀛楁
- this.form.organdonation = selectedValues.join(",");
+ const finalSelected = this.selectedOrgans;
+ const records = this.procurementData.serviceDonationwitnessorgans || [];
- // 鏂板閫夋嫨鐨勫櫒瀹�
- selectedValues.forEach(organValue => {
- if (!currentOrganValues.includes(organValue)) {
- this.createOrganRecord(organValue);
+ // 2. 鏋勫缓鐩爣鍣ㄥ畼缂栧彿鍒楄〃锛堝睍寮�缁勫悎鍣ㄥ畼锛�
+ const targetOrganNos = [];
+ finalSelected.forEach(val => {
+ if (this.organExpansionMap[val]) {
+ targetOrganNos.push(...this.organExpansionMap[val].subItems);
+ } else {
+ targetOrganNos.push(val);
}
});
- // 绉婚櫎鍙栨秷閫夋嫨鐨勫櫒瀹�
- this.procurementData.serviceDonationwitnessorgans = this.procurementData.serviceDonationwitnessorgans.filter(
- record => {
- if (selectedValues.includes(record.organno)) {
- return true;
- } else {
- if (record.id) {
- this.$confirm(
- "鍒犻櫎鍣ㄥ畼鑾峰彇鏁版嵁鍚庡皢鏃犳硶鎭㈠锛屾偍纭鍒犻櫎璇ユ潯璁板綍鍚楋紵",
- "鎻愮ず",
- {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- }
- )
- .then(() => {
- this.procurementData.serviceDonationwitnessorgans = this.procurementData.serviceDonationwitnessorgans.filter(
- r => r.organno !== record.organno
- );
- this.$message.success("鍒犻櫎鎴愬姛");
- })
- .catch(() => {
- this.selectedOrgans.push(record.organno);
- });
- return true;
- } else {
- return false;
- }
+ // 3. 鏂板鎴栨仮澶嶇洰鏍囧櫒瀹樿褰曪紙鏃犲脊绐楋級
+ targetOrganNos.forEach(no => {
+ const existing = records.find(r => r.organno === no);
+ if (existing) {
+ if (existing.delFlag === 1) {
+ existing.delFlag = 0; // 鎭㈠鏄剧ず
}
+ } else {
+ 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. 鎵惧嚭闇�瑕佸彇娑堢殑璁板綍锛堜笉鍦ㄧ洰鏍囬泦鍚堜腑锛�
+ 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"
+ }
+ );
+ // 鐢ㄦ埛纭锛氭爣璁� delFlag=1
+ toRemoveSaved.forEach(r => {
+ r.delFlag = 1;
+ });
+ } catch (error) {
+ // 鐢ㄦ埛鍙栨秷锛氭仮澶嶉�変腑鐘舵��
+ const parentToRestore = new Set();
+ toRemoveSaved.forEach(r => {
+ const parent = this.organReverseMap[r.organno];
+ if (parent) {
+ parentToRestore.add(parent);
+ } else {
+ parentToRestore.add(r.organno);
+ }
+ });
+ parentToRestore.forEach(val => {
+ if (!this.selectedOrgans.includes(val)) {
+ this.selectedOrgans.push(val);
+ }
+ });
+ this.$message.info("宸插彇娑堝垹闄ゆ搷浣�");
+ // 鏇存柊琛ㄥ崟瀛楁锛堜繚鎸佷竴鑷存�э級
+ this.form.organdonation = this.selectedOrgans.join(",");
+ return; // 閫�鍑烘柟娉曪紝閬垮厤缁х画鎵ц
+ }
+ }
+
+ // 5. 鏇存柊琛ㄥ崟瀛楁
+ this.form.organdonation = this.selectedOrgans.join(",");
},
// 澶勭悊浜掓枼閫夋嫨
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")
) {
@@ -1135,13 +1259,19 @@
if (valid) {
this.saveLoading = true;
try {
+ console.log(this.procurementData.serviceDonationwitnessorgans);
+
const saveData = {
...this.form,
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 ? witnessedit : witnessadd;
const response = await apiMethod(saveData);
@@ -1264,40 +1394,101 @@
},
/** 闄勪欢绉婚櫎澶勭悊 */
- handleAttachmentRemove(file) {
- if (file.url) {
- const index = this.attachments.findIndex(
- item => item.path === file.url || item.fileUrl === file.url
- );
- if (index > -1) {
- this.attachments.splice(index, 1);
- this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
- }
- }
- },
+ 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) {
- 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")
- };
+ 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 = [];
- }
+ 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;
+},
- this.attachments.push(attachmentObj);
- this.attachmentFileList = fileList;
- this.$message.success("鏂囦欢涓婁紶鎴愬姛");
- }
- },
+// 鑾峰彇鏌愬垎绫荤殑鏂囦欢鍒楄〃
+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);
--
Gitblit v1.9.3