From 7f67f2e6fbb7d47249fef0905a40a66f13ae2f2b Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期五, 21 八月 2026 10:05:32 +0800
Subject: [PATCH] 青岛维护
---
src/views/business/GetWitness/GetWitnessInfo.vue | 2311 +++++++++++++++++++++++++++++++++--------------------------
1 files changed, 1,294 insertions(+), 1,017 deletions(-)
diff --git a/src/views/business/GetWitness/GetWitnessInfo.vue b/src/views/business/GetWitness/GetWitnessInfo.vue
index 096378a..ea5578b 100644
--- a/src/views/business/GetWitness/GetWitnessInfo.vue
+++ b/src/views/business/GetWitness/GetWitnessInfo.vue
@@ -1,171 +1,176 @@
<template>
<div class="organ-procurement-detail">
+ <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 style="float: right;">
- <el-button type="primary" @click="handleSave" :loading="saveLoading">
- 淇濆瓨
- </el-button>
- <el-button
- type="success"
- @click="handleProcure"
- :disabled="form.procurementStatus === 'procured'"
- >
- 纭鑾峰彇
- </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="hospitalNo">
- <el-input v-model="form.hospitalNo" readonly />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="浣忛櫌鍙�" prop="caseNo">
- <el-input v-model="form.caseNo" readonly />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
- <el-input v-model="form.donorName" />
- </el-form-item>
- </el-col>
- </el-row>
+ <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="gender">
- <el-select v-model="form.gender" style="width: 100%">
- <el-option label="鐢�" value="0" />
- <el-option label="濂�" value="1" />
- </el-select>
+ <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>
+
+ <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>
+
+ <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>
+
+ <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="age">
- <el-input v-model="form.age" />
+ </el-col> -->
+ <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>
+
+ <div class="form-row">
+ <!-- <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="birthDate">
+ </el-col> -->
+ <!-- <el-col :span="8">
+ <el-form-item label="鑾峰彇鏃堕棿" prop="coordinatorSignTime">
<el-date-picker
- v-model="form.birthDate"
- type="date"
- value-format="yyyy-MM-dd"
+ v-model="form.coordinatorSignTime"
+ type="datetime"
+ value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
- </el-col>
- </el-row>
+ </el-col> -->
+ <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-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鐤剧梾璇婃柇" prop="diagnosis">
+ <!-- 璐熻矗浜轰俊鎭� -->
+ <el-divider content-position="left">璐熻矗浜轰俊鎭�</el-divider>
+
+ <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>
+
+ <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
- type="textarea"
- :rows="2"
- v-model="form.diagnosis"
- placeholder="璇疯緭鍏ョ柧鐥呰瘖鏂俊鎭�"
+ v-model="form.gainhospitalno"
+ placeholder="璇疯緭鍏ユ崘鐚紪鍙�"
/>
</el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鑾峰彇鏃堕棿" prop="procurementTime">
- <el-date-picker
- v-model="form.procurementTime"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- style="width: 100%"
- :disabled="form.procurementStatus !== 'procured'"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="鎵嬫湳鍚嶇О" prop="surgeryName">
- <el-input v-model="form.surgeryName" />
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鎵嬫湳寮�濮嬫椂闂�" prop="surgeryStartTime">
- <el-date-picker
- v-model="form.surgeryStartTime"
- 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="donorDeathTime">
- <el-date-picker
- v-model="form.donorDeathTime"
- 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="abdominalAortaCannulationTime">
- <el-date-picker
- v-model="form.abdominalAortaCannulationTime"
- 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="inferiorVenaCavaCannulationTime">
- <el-date-picker
- v-model="form.inferiorVenaCavaCannulationTime"
- 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="superiorMesentericVeinCannulationTime">
- <el-date-picker
- v-model="form.superiorMesentericVeinCannulationTime"
- 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="registrant">
- <el-input v-model="form.registrant" />
- </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%"
- readonly
- />
- </el-form-item>
- </el-col>
- </el-row>
+ </el-col> -->
+ </div>
</el-form>
</el-card>
@@ -174,9 +179,10 @@
<div slot="header" class="clearfix">
<span class="detail-title">鍣ㄥ畼鑾峰彇璁板綍</span>
<div style="float: right;">
- <el-tag :type="form.procurementStatus === 'procured' ? 'success' : 'warning'">
- {{ form.procurementStatus === 'procured' ? '宸茶幏鍙�' : '寰呰幏鍙�' }}
- </el-tag>
+ <dict-tag
+ :options="dict.type.Obtain_status"
+ :value="form.witnessState"
+ />
</div>
</div>
@@ -188,13 +194,15 @@
>
<el-row>
<el-col>
- <el-form-item label-width="100px" label="鑾峰彇鍣ㄥ畼">
- <el-checkbox-group v-model="selectedOrgans" @change="handleOrganSelectionChange">
+ <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.procurementStatus === 'procured'"
>
{{ dict.label }}
</el-checkbox>
@@ -207,7 +215,7 @@
<el-col>
<el-form-item>
<el-table
- :data="procurementData.records"
+ :data="displayOrgans"
v-loading="loading"
border
style="width: 100%"
@@ -217,11 +225,11 @@
label="鍣ㄥ畼鍚嶇О"
align="center"
width="120"
- prop="organName"
+ prop="organname"
>
<template slot-scope="scope">
<el-input
- v-model="scope.row.organName"
+ v-model="scope.row.organname"
placeholder="鍣ㄥ畼鍚嶇О"
:disabled="true"
/>
@@ -231,7 +239,7 @@
<el-table-column
label="鑾峰彇寮�濮嬫椂闂�"
align="center"
- width="180"
+ width="260"
prop="organStartTime"
>
<template slot-scope="scope">
@@ -243,7 +251,6 @@
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="閫夋嫨鑾峰彇寮�濮嬫椂闂�"
- :disabled="form.procurementStatus === 'procured'"
/>
</template>
</el-table-column>
@@ -251,19 +258,18 @@
<el-table-column
label="鍣ㄥ畼绂讳綋鏃堕棿"
align="center"
- width="180"
- prop="organGetTime"
+ width="260"
+ prop="organgettime"
>
<template slot-scope="scope">
<el-date-picker
clearable
size="small"
style="width: 100%"
- v-model="scope.row.organGetTime"
+ v-model="scope.row.organgettime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="閫夋嫨鍣ㄥ畼绂讳綋鏃堕棿"
- :disabled="form.procurementStatus === 'procured'"
/>
</template>
</el-table-column>
@@ -271,138 +277,83 @@
<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%"
- :disabled="form.procurementStatus === 'procured'"
- @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"
- prop="organGetDoctor"
+ width="150"
+ prop="organgetdoct"
>
<template slot-scope="scope">
<el-input
- v-model="scope.row.organGetDoctor"
+ v-model="scope.row.organgetdoct"
placeholder="鑾峰彇鍖诲笀"
- :disabled="form.procurementStatus === 'procured'"
/>
</template>
</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="鍔╂墜"
- :disabled="form.procurementStatus === 'procured'"
- />
- </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="鑾峰彇鎶ゅ+"
- :disabled="form.procurementStatus === 'procured'"
- />
- </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="鎵嬫湳瀹ゆ姢澹�"
- :disabled="form.procurementStatus === 'procured'"
- />
- </template>
- </el-table-column>
-
- <el-table-column
- label="楹婚唹鍖荤敓"
- align="center"
- width="120"
- prop="anesthesiologist"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.anesthesiologist"
- placeholder="楹婚唹鍖荤敓"
- :disabled="form.procurementStatus === 'procured'"
- />
- </template>
- </el-table-column>
-
- <el-table-column
+ <!-- <el-table-column
label="鑾峰彇鐘舵��"
align="center"
width="120"
- prop="organState"
+ prop="organstate"
>
<template slot-scope="scope">
<el-select
- v-model="scope.row.organState"
+ v-model="scope.row.organstate"
placeholder="璇烽�夋嫨鑾峰彇鐘舵��"
style="width: 100%"
- :disabled="form.procurementStatus === 'procured'"
>
<el-option
- v-for="dict in organStateList"
+ 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> -->
<el-table-column
label="璇存槑"
align="center"
- prop="notGetReason"
+ prop="notgetreason"
min-width="200"
>
<template slot-scope="scope">
<el-input
type="textarea"
clearable
- v-model="scope.row.notGetReason"
+ v-model="scope.row.notgetreason"
placeholder="璇疯緭鍏ユ湭鑾峰彇璇存槑"
- :disabled="form.procurementStatus === 'procured'"
/>
</template>
</el-table-column>
@@ -412,7 +363,6 @@
align="center"
width="120"
class-name="small-padding fixed-width"
- v-if="form.procurementStatus !== 'procured'"
>
<template slot-scope="scope">
<el-button
@@ -430,137 +380,129 @@
</el-col>
</el-row>
- <!-- 鑾峰彇缁熻淇℃伅 -->
- <div class="procurement-stats" v-if="procurementData.records.length > 0">
- <el-row :gutter="20">
- <el-col :span="6">
- <div class="stat-item">
- <span class="stat-label">宸茶幏鍙栧櫒瀹�:</span>
- <span class="stat-value">{{ procurementData.records.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.procurementStatus === 'procured' ? 'success' : 'warning'">
- {{ form.procurementStatus === 'procured' ? '宸插畬鎴�' : '杩涜涓�' }}
- </el-tag>
- </span>
- </div>
- </el-col>
- </el-row>
- </div>
-
- <div v-else class="empty-procurement">
+ <div
+ v-if="!procurementData.serviceDonationwitnessorgans"
+ class="empty-procurement"
+ >
<el-empty description="鏆傛棤鑾峰彇璁板綍" :image-size="80">
<span>璇峰厛閫夋嫨瑕佽幏鍙栫殑鍣ㄥ畼</span>
</el-empty>
</div>
</el-form>
-
- <div class="dialog-footer" v-if="form.procurementStatus !== 'procured'">
- <el-button
- type="primary"
- @click="handleSaveProcurement"
- :loading="saveLoading"
- :disabled="procurementData.records.length === 0"
- >
- 淇濆瓨鑾峰彇璁板綍
- </el-button>
- <el-button
- type="success"
- @click="handleConfirmProcurement"
- :loading="confirmLoading"
- :disabled="incompleteRecords > 0"
- >
- 纭瀹屾垚鑾峰彇
- </el-button>
- </div>
</el-card>
- <!-- 闄勪欢绠$悊閮ㄥ垎 -->
+ <!-- 闄勪欢绠$悊閮ㄥ垎 - 鍒嗙被Tab灞曠ず -->
<el-card class="attachment-card">
<div slot="header" class="clearfix">
<span class="detail-title">鐩稿叧闄勪欢</span>
- <el-button
- type="primary"
- size="mini"
- icon="el-icon-upload"
- @click="handleUploadAttachment"
+ </div>
+
+ <!-- 闄勪欢鍒楄〃 - 鍒嗙被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-button>
- </div>
-
- <div class="attachment-list">
- <el-table :data="attachments" style="width: 100%">
- <el-table-column label="鏂囦欢鍚嶇О" min-width="200">
- <template slot-scope="scope">
- <div class="file-info">
- <i :class="getFileIcon(scope.row.fileName)" style="margin-right: 8px; color: #409EFF;"></i>
- <span>{{ scope.row.fileName }}</span>
- </div>
- </template>
- </el-table-column>
-
- <el-table-column label="鏂囦欢绫诲瀷" width="100" align="center">
- <template slot-scope="scope">
- <el-tag size="small">{{ getFileType(scope.row.fileName) }}</el-tag>
- </template>
- </el-table-column>
-
- <el-table-column label="鏂囦欢澶у皬" width="100" align="center">
- <template slot-scope="scope">
- <span>{{ formatFileSize(scope.row.fileSize) }}</span>
- </template>
- </el-table-column>
-
- <el-table-column label="涓婁紶鏃堕棿" width="160" align="center">
- <template slot-scope="scope">
- <span>{{ parseTime(scope.row.uploadTime) }}</span>
- </template>
- </el-table-column>
-
- <el-table-column label="鎿嶄綔" width="150" align="center">
- <template slot-scope="scope">
- <el-button
- size="mini"
- type="text"
- icon="el-icon-view"
- @click="handlePreviewAttachment(scope.row)"
- >棰勮</el-button>
- <el-button
- size="mini"
- type="text"
- icon="el-icon-download"
- @click="handleDownloadAttachment(scope.row)"
- >涓嬭浇</el-button>
- <el-button
- size="mini"
- type="text"
- icon="el-icon-delete"
- style="color: #F56C6C;"
- @click="handleRemoveAttachment(scope.row)"
- >鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
+ <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
+ 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>
+ <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="缂栬緫鍣ㄥ畼鑾峰彇璁板綍"
@@ -571,32 +513,38 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="鍣ㄥ畼鍚嶇О">
- <el-input v-model="currentRecord.organName" readonly />
+ <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-select v-model="currentRecord.organstate" style="width: 100%">
<el-option
- v-for="dict in organStateList"
+ 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-col> -->
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="鑾峰彇鍖诲笀">
- <el-input v-model="currentRecord.organGetDoctor" placeholder="璇疯緭鍏ヨ幏鍙栧尰甯�" />
+ <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-input
+ v-model="currentRecord.assistant"
+ placeholder="璇疯緭鍏ュ姪鎵嬪鍚�"
+ />
</el-form-item>
</el-col>
</el-row>
@@ -604,25 +552,34 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="鑾峰彇鎶ゅ+">
- <el-input v-model="currentRecord.procurementNurse" placeholder="璇疯緭鍏ヨ幏鍙栨姢澹�" />
+ <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-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-input
+ v-model="currentRecord.anesthesiologist"
+ placeholder="璇疯緭鍏ラ夯閱夊尰鐢�"
+ />
</el-form-item>
- <el-form-item label="鏈幏鍙栬鏄�" v-if="currentRecord.organState === '0'">
+ <el-form-item label="鏈幏鍙栬鏄�">
<el-input
type="textarea"
:rows="3"
- v-model="currentRecord.notGetReason"
+ v-model="currentRecord.notgetreason"
placeholder="璇疯緭鍏ユ湭鑾峰彇鐨勫師鍥犺鏄�"
/>
</el-form-item>
@@ -633,67 +590,159 @@
<el-button type="primary" @click="handleEditConfirm">纭</el-button>
</div>
</el-dialog>
+
+ <!-- 涓婁紶瀵硅瘽妗� -->
+ <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="previewVisible"
+ :file="currentPreviewFile"
+ @close="previewVisible = false"
+ @download="handleDownload"
+ />
</div>
</template>
<script>
-import {
- getOrganProcurementDetail,
- updateOrganProcurement,
- saveProcurementRecords,
- getHospitalList,
- getCoordinatorList
-} from "./organProcurement";
+import { witnessList, witnessadd, witnessedit } from "@/api/businessApi";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
+import CaseBasicInfo from "@/components/CaseBasicInfo";
+import { getToken } from "@/utils/auth";
+import dayjs from "dayjs";
export default {
name: "OrganProcurementDetail",
- dicts: ["sys_user_sex", "sys_Organ", "sys_0_1", "sys_DonationCategory"],
+ components: {
+ FilePreviewDialog,
+ CaseBasicInfo
+ },
+ dicts: [
+ "sys_BloodType",
+ "Geta_hospital",
+ "sys_DonationCategory",
+ "sys_Organ",
+ "Obtain_status"
+ ],
data() {
return {
+ caseId: null,
// 琛ㄥ崟鏁版嵁
form: {
id: undefined,
- hospitalNo: "",
+ infoid: undefined,
+ name: "",
+ inpatientno: "",
+ witnessState: "2",
caseNo: "",
- donorName: "",
- gender: "",
+ donorno: "",
+ treatmenthospitalname: "",
+ treatmenthospitalno: "",
+ sex: "",
age: "",
- birthDate: "",
- diagnosis: "",
- procurementStatus: "pending",
- procurementTime: "",
- registrant: "",
- registrationTime: "",
- surgeryName: "",
- surgeryStartTime: "",
- donorDeathTime: "",
- abdominalAortaCannulationTime: "",
- inferiorVenaCavaCannulationTime: "",
- superiorMesentericVeinCannulationTime: "",
- donationCategory: "1",
- deathJudgeDoctor1: "",
- deathJudgeDoctor2: "",
- deathReason: "",
- operationEndTime: "",
+ bloodtype: "",
+ idcardno: "",
+ diagnosisname: "",
+ coordinatorName: "",
+ gainhospitalno: "",
+ gainhospitalname: "",
+ deathtime: "",
+ deathreason: "",
+ deathjudgedocto: "",
+ deathjudgedoctt: "",
+ deathjudgeannex: "",
+ operationbegtime: "",
+ operationendtime: "",
+ operationdoctor: "",
+ isspendremember: 1,
+ isrestoreremains: 1,
+ rememberannex: "",
+ responsibleuserid: "",
+ responsibleusername: "",
+ coordinateduserido: "",
+ coordinatedusernameo: "",
+ coordinateduseridt: "",
+ coordinatedusernamet: "",
+ abdominalaortacannulatime: "",
+ abdominalaortaperfusiontime: "",
+ portalveincannulatime: "",
+ portalveinperfusiontime: "",
+ pulmonaryarterycannulatime: "",
+ pulmonaryarteryperfusiontime: "",
+ aortacannulatime: "",
+ aortaperfusiontime: "",
+ organdonation: "",
+ organdonationOther: "",
+ donationcategory: "",
coordinatorInOperating: "",
coordinatorOutOperating: "",
+ coordinatorSign: "",
coordinatorSignTime: "",
- responsibleUserName: "",
- coordinatedUserId1: "",
- coordinatedUserId2: "",
- isSpendRemember: 1,
- isRestoreRemains: 1
+ attachments: []
+ },
+ activeTab: "鍘熻〃鎷嶇収", // 褰撳墠婵�娲荤殑闄勪欢鍒嗙被Tab
+ presetCategories: [
+ "鍘熻〃鎷嶇収",
+ "浼︾悊瀹℃煡鏉愭枡",
+ "姝讳骸鍒ゅ畾鏉愭枡",
+ "榛樺搥浠紡鐓х墖",
+ "鎹愮尞瑙佽瘉瑙嗛"
+ ], // 棰勮鍒嗙被
+ organExpansionMap: {
+ C64: { subItems: ["C64L", "C64R"], subNames: ["宸﹁偩", "鍙宠偩"] },
+ C34: { subItems: ["C34L", "C34R"], subNames: ["宸﹁偤", "鍙宠偤"] }
},
// 琛ㄥ崟楠岃瘉瑙勫垯
rules: {
- donorName: [
+ name: [
{ required: true, message: "鎹愮尞鑰呭鍚嶄笉鑳戒负绌�", trigger: "blur" }
],
- diagnosis: [
+ diagnosisname: [
{ required: true, message: "鐤剧梾璇婃柇涓嶈兘涓虹┖", trigger: "blur" }
],
- surgeryName: [
- { required: true, message: "鎵嬫湳鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+ donationcategory: [
+ { required: true, message: "鎹愮尞绫诲埆涓嶈兘涓虹┖", trigger: "change" }
+ ],
+ operationdoctor: [
+ { required: true, message: "鎵嬫湳鍖荤敓涓嶈兘涓虹┖", trigger: "blur" }
]
},
// 鑾峰彇璁板綍楠岃瘉瑙勫垯
@@ -707,24 +756,28 @@
selectedOrgans: [],
// 鍖婚櫌鍒楄〃
hospitalList: [],
- // 鍗忚皟鍛樺垪琛�
- coordinatorList: [],
- // 鍣ㄥ畼鐘舵�佸垪琛�
- organStateList: [
- { value: "1", label: "宸茶幏鍙�" },
- { value: "0", label: "鏈幏鍙�" },
- { value: "2", label: "閮ㄥ垎鑾峰彇" }
- ],
// 鑾峰彇璁板綍鏁版嵁
procurementData: {
- records: []
+ serviceDonationwitnessorgans: []
},
// 闄勪欢鏁版嵁
attachments: [],
+ // 涓婁紶鐩稿叧
+ uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+ headers: {
+ Authorization: "Bearer " + getToken()
+ },
+ uploadDialogVisible: false,
+ uploadLoading: false,
+ tempFileList: [],
+ currentUploadCategory: "",
// 缂栬緫瀵硅瘽妗�
editDialogVisible: false,
currentRecord: {},
- currentEditIndex: -1
+ currentEditIndex: -1,
+ // 鏂囦欢棰勮鐩稿叧
+ previewVisible: false,
+ currentPreviewFile: null
};
},
computed: {
@@ -732,164 +785,397 @@
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() {
- return this.procurementData.records.filter(
+ if (!this.procurementData.serviceDonationwitnessorgans) return 0;
+ return this.procurementData.serviceDonationwitnessorgans.filter(
record =>
!record.organStartTime ||
- !record.organGetTime ||
- !record.gainHospitalNo ||
- !record.organGetDoctor
+ !record.organgettime ||
+ !record.gainhospitalno ||
+ !record.organgetdoct
).length;
},
// 鍞竴鍖婚櫌鏁伴噺
uniqueHospitals() {
- const hospitals = this.procurementData.records
- .map(record => record.gainHospitalNo)
+ if (!this.procurementData.serviceDonationwitnessorgans) return 0;
+ const hospitals = this.procurementData.serviceDonationwitnessorgans
+ .map(record => record.gainhospitalno)
.filter(Boolean);
return new Set(hospitals).size;
+ },
+ // 鑾峰彇鍣ㄥ畼瀛楀吀
+ organDict() {
+ return this.dict.type.sys_Organ || [];
}
},
created() {
- const id = this.$route.query.id;
- if (id) {
- this.getDetail(id);
- } else {
- this.generateCaseNo();
- this.form.registrant = this.currentUser.username || "褰撳墠鐢ㄦ埛";
- this.form.registrationTime = new Date()
- .toISOString()
- .replace("T", " ")
- .substring(0, 19);
- }
- this.getHospitalData();
- this.getCoordinatorData();
+ this.caseId = this.$route.query.infoid;
+
+ this.initData();
},
methods: {
- // 鐢熸垚浣忛櫌鍙�
- generateCaseNo() {
- const timestamp = Date.now().toString();
- this.form.hospitalNo = "D" + timestamp.slice(-6);
- this.form.caseNo = "C" + timestamp.slice(-6);
+ // 鏍规嵁瀛楀吀value鑾峰彇label
+ getOrganLabel(organValue) {
+ const dictItem = this.organDict.find(item => item.value === organValue);
+ return dictItem ? dictItem.label : organValue;
+ },
+
+ // 鍒濆鍖栨暟鎹�
+ initData() {
+ const { id, infoid } = this.$route.query;
+
+ if (!infoid) {
+ this.$message.error("缂哄皯蹇呰鐨勮矾鐢卞弬鏁� infoid");
+ this.$router.back();
+ return;
+ }
+
+ this.form.infoid = infoid;
+ // this.generateDonorNo();
+
+ 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);
},
// 鑾峰彇璇︽儏
- getDetail(id) {
+ async getDetail(infoid) {
this.loading = true;
- getOrganProcurementDetail(id)
- .then(response => {
- if (response.code === 200) {
- this.form = response.data;
- if (response.data.procurementRecords) {
- this.procurementData.records = response.data.procurementRecords;
- this.selectedOrgans = response.data.procurementRecords.map(
- item => item.organNo
- );
- }
+ 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";
}
- this.loading = false;
- })
- .catch(error => {
- console.error("鑾峰彇鍣ㄥ畼鑾峰彇璇︽儏澶辫触:", error);
- this.loading = false;
- this.$message.error("鑾峰彇璇︽儏澶辫触");
- });
+
+ // 濉厖琛ㄥ崟鏁版嵁
+ 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.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(",");
},
// 鑾峰彇鍖婚櫌鏁版嵁
- getHospitalData() {
- getHospitalList().then(response => {
- if (response.code === 200) {
- this.hospitalList = response.data;
- }
- });
+ async getHospitalData() {
+ try {
+ // 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("鑾峰彇鍖婚櫌鏁版嵁澶辫触");
+ }
},
- // 鑾峰彇鍗忚皟鍛樻暟鎹�
- getCoordinatorData() {
- getCoordinatorList().then(response => {
- if (response.code === 200) {
- this.coordinatorList = response.data;
- }
- });
+ // 绉绘鍖婚櫌妯$硦鎼滅储
+ 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) {
- const currentOrganNos = this.procurementData.records.map(
- item => item.organNo
- );
+ async handleOrganSelectionChange(selectedValues) {
+ // 1. 澶勭悊浜掓枼閫昏緫锛堜慨鏀� this.selectedOrgans锛�
+ this.handleExclusiveSelections(selectedValues);
- // 鏂板閫夋嫨鐨勫櫒瀹�
- selectedValues.forEach(organValue => {
- if (!currentOrganNos.includes(organValue)) {
- const organInfo = this.dict.type.sys_Organ.find(
- item => item.value === organValue
- );
- if (organInfo) {
- this.procurementData.records.push({
- organName: organInfo.label,
- organNo: organValue,
- id: null,
- procurementId: this.form.id,
- organStartTime: "",
- organGetTime: "",
- gainHospitalNo: "",
- gainHospitalName: "",
- organGetDoctor: "",
- assistant: "",
- procurementNurse: "",
- operatingRoomNurse: "",
- anesthesiologist: "",
- organState: "1",
- notGetReason: ""
- });
- }
+ const finalSelected = this.selectedOrgans;
+ const records = this.procurementData.serviceDonationwitnessorgans || [];
+
+ // 2. 鏋勫缓鐩爣鍣ㄥ畼缂栧彿鍒楄〃锛堝睍寮�缁勫悎鍣ㄥ畼锛�
+ const targetOrganNos = [];
+ finalSelected.forEach(val => {
+ if (this.organExpansionMap[val]) {
+ targetOrganNos.push(...this.organExpansionMap[val].subItems);
+ } else {
+ targetOrganNos.push(val);
}
});
- // 绉婚櫎鍙栨秷閫夋嫨鐨勫櫒瀹�
- this.procurementData.records = this.procurementData.records.filter(
- record => {
- if (selectedValues.includes(record.organNo)) {
- return true;
- } else {
- if (record.id) {
- this.$confirm(
- "鍒犻櫎鍣ㄥ畼鑾峰彇鏁版嵁鍚庡皢鏃犳硶鎭㈠锛屾偍纭鍒犻櫎璇ユ潯璁板綍鍚楋紵",
- "鎻愮ず",
- {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- }
- )
- .then(() => {
- this.procurementData.records = this.procurementData.records.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) {
+ // 鍙岃偩涓庡乏鍙宠偩浜掓枼
+ if (selectedValues.includes("C64")) {
+ this.selectedOrgans = selectedValues.filter(
+ item => item !== "C64L" && item !== "C64R"
+ );
+ } else if (
+ selectedValues.includes("C64L") ||
+ selectedValues.includes("C64R")
+ ) {
+ this.selectedOrgans = selectedValues.filter(item => item !== "C64");
+ }
+
+ // 鍏ㄨ偤涓庡乏鍙宠偤浜掓枼
+ if (selectedValues.includes("C34")) {
+ this.selectedOrgans = selectedValues.filter(
+ item => item !== "C34L" && item !== "C34R"
+ );
+ } else if (
+ selectedValues.includes("C34L") ||
+ selectedValues.includes("C34R")
+ ) {
+ this.selectedOrgans = selectedValues.filter(item => item !== "C34");
+ }
+ },
+
+ // 鍒涘缓鍣ㄥ畼璁板綍
+ createOrganRecord(organValue) {
+ const organName = this.getOrganLabel(organValue);
+
+ this.procurementData.serviceDonationwitnessorgans.push({
+ id: null,
+ organname: organName,
+ organno: organValue,
+ organStartTime: "",
+ organgettime: "",
+ gainhospitalno: "",
+ gainhospitalname: "",
+ organgetdoct: "",
+ assistant: "",
+ procurementNurse: "",
+ operatingRoomNurse: "",
+ anesthesiologist: "",
+ organstate: "1",
+ notgetreason: ""
+ });
+ },
+
// 鍖婚櫌閫夋嫨鍙樺寲
handleHospitalChange(row, hospitalNo) {
const hospital = this.hospitalList.find(
item => item.hospitalNo === hospitalNo
);
if (hospital) {
- row.gainHospitalName = hospital.hospitalName;
+ row.gainhospitalname = hospital.hospitalName;
}
},
// 缂栬緫鑾峰彇璁板綍
handleEditProcurement(row) {
- const index = this.procurementData.records.findIndex(
- item => item.organNo === row.organNo
+ const index = this.procurementData.serviceDonationwitnessorgans.findIndex(
+ item => item.organno === row.organno
);
if (index !== -1) {
this.currentRecord = { ...row };
@@ -900,7 +1186,9 @@
// 纭缂栬緫
handleEditConfirm() {
if (this.currentEditIndex !== -1) {
- this.procurementData.records[this.currentEditIndex] = {
+ this.procurementData.serviceDonationwitnessorgans[
+ this.currentEditIndex
+ ] = {
...this.currentRecord
};
this.$message.success("鑾峰彇璁板綍鏇存柊鎴愬姛");
@@ -911,69 +1199,92 @@
getOrganRowClassName({ row }) {
if (
!row.organStartTime ||
- !row.organGetTime ||
- !row.gainHospitalNo ||
- !row.organGetDoctor
+ !row.organgettime ||
+ !row.gainhospitalno ||
+ !row.organgetdoct
) {
return "warning-row";
}
return "";
},
// 淇濆瓨鍩烘湰淇℃伅
- handleSave() {
- this.$refs.form.validate(valid => {
+ async handleSave() {
+ this.$refs.form.validate(async valid => {
if (valid) {
this.saveLoading = true;
- const apiMethod = this.form.id
- ? updateOrganProcurement
- : addOrganProcurement;
+ try {
+ console.log(this.procurementData.serviceDonationwitnessorgans);
- apiMethod(this.form)
- .then(response => {
- if (response.code === 200) {
- this.$message.success("淇濆瓨鎴愬姛");
- if (!this.form.id) {
- this.form.id = response.data.id;
- this.$router.replace({
- query: { ...this.$route.query, id: this.form.id }
- });
- }
+ 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);
+
+ if (response.code === 200) {
+ this.$message.success("淇濆瓨鎴愬姛");
+ 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 }
+ });
}
- })
- .catch(error => {
- console.error("淇濆瓨澶辫触:", error);
- this.$message.error("淇濆瓨澶辫触");
- })
- .finally(() => {
- this.saveLoading = false;
- });
+ } else {
+ this.$message.error("淇濆瓨澶辫触锛�" + (response.msg || "鏈煡閿欒"));
+ }
+ } catch (error) {
+ console.error("淇濆瓨澶辫触:", error);
+ this.$message.error("淇濆瓨澶辫触");
+ } finally {
+ this.saveLoading = false;
+ }
}
});
},
// 淇濆瓨鑾峰彇璁板綍
- handleSaveProcurement() {
+ async handleSaveProcurement() {
if (!this.form.id) {
this.$message.warning("璇峰厛淇濆瓨鍩烘湰淇℃伅");
return;
}
this.saveLoading = true;
- saveProcurementRecords(this.form.id, this.procurementData.records)
- .then(response => {
- if (response.code === 200) {
- this.$message.success("鑾峰彇璁板綍淇濆瓨鎴愬姛");
- }
- })
- .catch(error => {
- console.error("淇濆瓨鑾峰彇璁板綍澶辫触:", error);
- this.$message.error("淇濆瓨鑾峰彇璁板綍澶辫触");
- })
- .finally(() => {
- this.saveLoading = false;
- });
+ try {
+ const saveData = {
+ ...this.form,
+ attachments: this.attachments,
+ organdonation: this.selectedOrgans.join(","),
+ serviceDonationwitnessorgans:
+ this.procurementData.serviceDonationwitnessorgans || []
+ };
+
+ const response = await witnessedit(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;
+ }
},
// 纭瀹屾垚鑾峰彇
- handleConfirmProcurement() {
+ async handleConfirmProcurement() {
if (this.incompleteRecords > 0) {
this.$message.warning("璇峰厛瀹屽杽鎵�鏈夎幏鍙栬褰曠殑淇℃伅");
return;
@@ -984,118 +1295,316 @@
cancelButtonText: "鍙栨秷",
type: "warning"
})
- .then(() => {
+ .then(async () => {
this.confirmLoading = true;
- this.form.procurementStatus = "procured";
- this.form.procurementTime = new Date()
- .toISOString()
- .replace("T", " ")
- .substring(0, 19);
+ this.form.witnessState = "3";
+ this.form.operationendtime =
+ this.form.operationendtime ||
+ new Date()
+ .toISOString()
+ .replace("T", " ")
+ .substring(0, 19);
- updateOrganProcurement(this.form)
- .then(response => {
- if (response.code === 200) {
- this.$message.success("鍣ㄥ畼鑾峰彇宸插畬鎴�");
- }
- })
- .catch(error => {
- console.error("纭鑾峰彇澶辫触:", error);
- this.$message.error("纭鑾峰彇澶辫触");
- })
- .finally(() => {
- this.confirmLoading = false;
- });
+ try {
+ const saveData = {
+ ...this.form,
+ attachments: this.attachments,
+ organdonation: this.selectedOrgans.join(","),
+ serviceDonationwitnessorgans:
+ this.procurementData.serviceDonationwitnessorgans || []
+ };
+
+ const response = await witnessedit(saveData);
+
+ if (response.code === 200) {
+ this.$message.success("鍣ㄥ畼鑾峰彇宸插畬鎴�");
+ } else {
+ this.$message.error(
+ "纭鑾峰彇澶辫触锛�" + (response.msg || "鏈煡閿欒")
+ );
+ this.form.witnessState = "2";
+ this.form.operationendtime = "";
+ }
+ } catch (error) {
+ console.error("纭鑾峰彇澶辫触:", error);
+ this.$message.error("纭鑾峰彇澶辫触");
+ this.form.witnessState = "2";
+ this.form.operationendtime = "";
+ } finally {
+ this.confirmLoading = false;
+ }
})
.catch(() => {});
},
- // 涓婁紶闄勪欢
- handleUploadAttachment() {
- this.$message.info("闄勪欢涓婁紶鍔熻兘");
+ // 纭鑾峰彇鎸夐挳鍒悕
+ handleProcure() {
+ this.handleConfirmProcurement();
},
- // 棰勮闄勪欢
- handlePreviewAttachment(attachment) {
- this.$message.info("闄勪欢棰勮鍔熻兘");
+
+ // ===== 闄勪欢鐩稿叧鏂规硶 =====
+ // 鎵撳紑涓婁紶瀵硅瘽妗�
+ openUploadDialog(category) {
+ this.currentUploadCategory = category;
+ this.tempFileList = [];
+ this.uploadDialogVisible = true;
+ this.$nextTick(() => {
+ if (this.$refs.uploadRef) {
+ this.$refs.uploadRef.clearFiles();
+ }
+ });
},
- // 涓嬭浇闄勪欢
- handleDownloadAttachment(attachment) {
- this.$message.info("闄勪欢涓嬭浇鍔熻兘");
+
+ // 涓婁紶鍓嶆牎楠�
+ 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(attachment) {
+
+ // 鏂囦欢閫夋嫨鍙樺寲
+ 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(() => {
- this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+ const index = this.attachments.findIndex(item => item === file);
+ if (index > -1) {
+ this.attachments.splice(index, 1);
+ this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+ }
})
.catch(() => {});
},
- // 鑾峰彇鏂囦欢鍥炬爣
- getFileIcon(fileName) {
- const ext = fileName
- .split(".")
- .pop()
- .toLowerCase();
- const iconMap = {
- pdf: "el-icon-document",
- doc: "el-icon-document",
- docx: "el-icon-document",
- xls: "el-icon-document",
- xlsx: "el-icon-document",
- jpg: "el-icon-picture",
- jpeg: "el-icon-picture",
- png: "el-icon-picture"
+
+ // 鏂囦欢棰勮
+ handlePreview(file) {
+ this.currentPreviewFile = {
+ fileName: file.fileName,
+ fileUrl: file.path || file.fileUrl,
+ fileType: this.getFileType(file.fileName)
};
- return iconMap[ext] || "el-icon-document";
+ this.previewVisible = true;
},
- // 鑾峰彇鏂囦欢绫诲瀷
+
+ // 鏂囦欢涓嬭浇
+ handleDownload(file) {
+ const fileUrl = file.path || file.fileUrl;
+ const fileName = file.fileName;
+
+ if (fileUrl) {
+ const link = document.createElement("a");
+ link.href = fileUrl;
+ link.download = fileName;
+ link.style.display = "none";
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ this.$message.success("寮�濮嬩笅杞芥枃浠�");
+ } else {
+ this.$message.warning("鏂囦欢璺緞涓嶅瓨鍦紝鏃犳硶涓嬭浇");
+ }
+ },
+
+ /** 鑾峰彇鏂囦欢绫诲瀷 */
getFileType(fileName) {
- const ext = fileName
+ if (!fileName) return "other";
+ const extension = fileName
.split(".")
.pop()
.toLowerCase();
- const typeMap = {
- pdf: "PDF",
- doc: "DOC",
- docx: "DOCX",
- xls: "XLS",
- xlsx: "XLSX",
- jpg: "JPG",
- jpeg: "JPEG",
- png: "PNG"
- };
- return typeMap[ext] || ext.toUpperCase();
+ const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"];
+ const pdfTypes = ["pdf"];
+ const officeTypes = ["doc", "docx", "xls", "xlsx", "ppt", "pptx"];
+ if (imageTypes.includes(extension)) return "image";
+ if (pdfTypes.includes(extension)) return "pdf";
+ if (officeTypes.includes(extension)) return "office";
+ return "other";
},
- // 鏂囦欢澶у皬鏍煎紡鍖�
- formatFileSize(size) {
- if (size === 0) return "0 B";
+
+ /** 鑾峰彇鏂囦欢鍥炬爣棰滆壊 */
+ getFileIconColor(fileName) {
+ const type = this.getFileType(fileName);
+ const colorMap = {
+ image: "#67C23A",
+ pdf: "#F56C6C",
+ office: "#409EFF",
+ other: "#909399"
+ };
+ return colorMap[type] || "#909399";
+ },
+
+ /** 鑾峰彇鏂囦欢鏍囩绫诲瀷 */
+ getFileTagType(fileName) {
+ const type = this.getFileType(fileName);
+ const typeMap = {
+ image: "success",
+ pdf: "danger",
+ office: "primary",
+ other: "info"
+ };
+ return typeMap[type] || "info";
+ },
+
+ /** 鑾峰彇鏂囦欢绫诲瀷鏂囨湰 */
+ getFileTypeText(fileName) {
+ const type = this.getFileType(fileName);
+ const textMap = {
+ image: "鍥剧墖",
+ pdf: "PDF",
+ office: "鏂囨。",
+ other: "鍏朵粬"
+ };
+ return textMap[type] || "鏈煡";
+ },
+
+ /** 妫�鏌ユ槸鍚﹀彲棰勮 */
+ isPreviewable(fileName) {
+ const type = this.getFileType(fileName);
+ return ["image", "pdf"].includes(type);
+ },
+
+ /** 鑾峰彇鏂囦欢鎵╁睍鍚� */
+ getFileExtension(filename) {
+ return filename
+ .split(".")
+ .pop()
+ .toLowerCase();
+ },
+
+ /** 鏍煎紡鍖栨枃浠跺ぇ灏� */
+ formatFileSize(bytes) {
+ if (!bytes || bytes === 0) return "0 B";
const k = 1024;
const sizes = ["B", "KB", "MB", "GB"];
- const i = Math.floor(Math.log(size) / Math.log(k));
- return parseFloat((size / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
},
- // 鏃堕棿鏍煎紡鍖�
- parseTime(time) {
- if (!time) return "";
- const date = new Date(time);
- return `${date.getFullYear()}-${(date.getMonth() + 1)
- .toString()
- .padStart(2, "0")}-${date
- .getDate()
- .toString()
- .padStart(2, "0")} ${date
- .getHours()
- .toString()
- .padStart(2, "0")}:${date
- .getMinutes()
- .toString()
- .padStart(2, "0")}`;
+
+ /** 鏃ユ湡鏃堕棿鏍煎紡鍖� */
+ 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;
+ }
}
}
};
</script>
+
<style scoped>
.organ-procurement-detail {
padding: 20px;
@@ -1122,6 +1631,44 @@
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;
+ gap: 8px;
+ margin-bottom: 16px;
+ padding-bottom: 8px;
+ border-bottom: 1px solid #ebeef5;
+}
+
+.attachment-title {
+ font-weight: 600;
+ color: #303133;
+}
+
+.attachment-tip {
+ font-size: 12px;
+ color: #909399;
+ margin-left: auto;
+}
+
+.attachment-list {
+ margin-top: 16px;
+}
+
+.list-title {
+ font-weight: bold;
+ margin-bottom: 12px;
+ color: #303133;
+ font-size: 14px;
+}
+
+.file-name {
+ font-size: 13px;
+ margin-left: 8px;
}
.detail-title {
@@ -1193,385 +1740,115 @@
background-color: #ffecc2 !important;
}
-:deep(.el-table .cell) {
- padding: 8px 12px;
- line-height: 1.5;
-}
-
-:deep(.el-table th) {
- background-color: #f5f7fa;
- color: #606266;
- font-weight: 600;
-}
-
-:deep(.el-table--border) {
- border: 1px solid #e4e7ed;
- border-radius: 4px;
-}
-
-:deep(.el-table--border th) {
- border-right: 1px solid #e4e7ed;
-}
-
-:deep(.el-table--border td) {
- border-right: 1px solid #e4e7ed;
-}
-
-/* 琛ㄥ崟鏍峰紡浼樺寲 */
-:deep(.el-form-item__label) {
- font-weight: 500;
- color: #606266;
-}
-
-:deep(.el-input__inner) {
- border-radius: 4px;
- border: 1px solid #dcdfe6;
- transition: border-color 0.3s ease;
-}
-
-:deep(.el-input__inner:focus) {
- border-color: #409EFF;
- box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
-}
-
-:deep(.el-textarea__inner) {
- border-radius: 4px;
- resize: vertical;
- min-height: 60px;
-}
-
-:deep(.el-select) {
- width: 100%;
-}
-
-/* 鎸夐挳鏍峰紡浼樺寲 */
-: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);
-}
-
-:deep(.el-button--success) {
- background: linear-gradient(135deg, #67C23A 0%, #529b2f 100%);
- border: none;
- border-radius: 4px;
- transition: all 0.3s ease;
-}
-
-:deep(.el-button--success:hover) {
- transform: translateY(-1px);
- box-shadow: 0 4px 12px rgba(103, 194, 58, 0.4);
-}
-
-:deep(.el-button--warning) {
- background: linear-gradient(135deg, #E6A23C 0%, #d18c2a 100%);
- border: none;
- border-radius: 4px;
- transition: all 0.3s ease;
-}
-
-:deep(.el-button--warning:hover) {
- transform: translateY(-1px);
- box-shadow: 0 4px 12px rgba(230, 162, 60, 0.4);
-}
-
-:deep(.el-button--danger) {
- background: linear-gradient(135deg, #F56C6C 0%, #e05b5b 100%);
- border: none;
- border-radius: 4px;
- transition: all 0.3s ease;
-}
-
-:deep(.el-button--danger:hover) {
- transform: translateY(-1px);
- box-shadow: 0 4px 12px rgba(245, 108, 108, 0.4);
-}
-
-/* 鏍囩鏍峰紡 */
-:deep(.el-tag) {
- border-radius: 12px;
- border: none;
- font-weight: 500;
- padding: 4px 12px;
-}
-
-:deep(.el-tag--success) {
- background: linear-gradient(135deg, #67C23A 0%, #529b2f 100%);
- color: white;
-}
-
-:deep(.el-tag--warning) {
- background: linear-gradient(135deg, #E6A23C 0%, #d18c2a 100%);
- color: white;
-}
-
-/* 澶嶉�夋缁勬牱寮� */
-:deep(.el-checkbox-group) {
- display: flex;
- flex-wrap: wrap;
- gap: 15px;
- margin-top: 10px;
-}
-
-:deep(.el-checkbox) {
- margin-right: 0;
-}
-
-:deep(.el-checkbox__input.is-checked .el-checkbox__inner) {
- background: linear-gradient(135deg, #409EFF 0%, #3375e0 100%);
- border-color: #409EFF;
-}
-
-:deep(.el-checkbox__input.is-checked + .el-checkbox__label) {
- color: #409EFF;
- font-weight: 500;
-}
-
-/* 鏃ユ湡閫夋嫨鍣ㄦ牱寮� */
-:deep(.el-date-editor) {
- width: 100%;
-}
-
-:deep(.el-picker-panel) {
- border-radius: 8px;
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
-}
-
-/* 鍔犺浇鐘舵�� */
-:deep(.el-loading-mask) {
- border-radius: 4px;
-}
-
-/* 鍗$墖澶撮儴鏍峰紡浼樺寲 */
-:deep(.el-card__header) {
- background: linear-gradient(135deg, #f5f7fa 0%, #e4e7ed 100%);
- border-bottom: 1px solid #e4e7ed;
- padding: 15px 20px;
-}
-
/* 鍝嶅簲寮忚璁� */
-@media (max-width: 1200px) {
- .organ-procurement-detail {
- padding: 15px;
- }
-
- :deep(.el-col) {
- margin-bottom: 10px;
- }
-}
-
@media (max-width: 768px) {
.organ-procurement-detail {
padding: 10px;
}
- .detail-title {
- font-size: 16px;
- }
-
- .stat-item {
- padding: 5px;
- }
-
- .stat-label {
- font-size: 10px;
- }
-
- .stat-value {
- font-size: 14px;
- }
-
- :deep(.el-table .cell) {
- padding: 4px 8px;
- font-size: 12px;
- }
-
- :deep(.el-checkbox-group) {
- gap: 8px;
- }
-
- .dialog-footer .el-button {
- margin: 5px;
- min-width: 100px;
+ .procurement-stats .el-col {
+ margin-bottom: 10px;
}
}
-@media (max-width: 480px) {
- .organ-procurement-detail {
- padding: 5px;
- }
-
- :deep(.el-card__header) {
- padding: 10px 15px;
- }
-
- :deep(.el-form-item__label) {
- font-size: 12px;
- }
-
- :deep(.el-table) {
- font-size: 11px;
- }
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+ padding: 16px;
}
-/* 鍔ㄧ敾鏁堟灉 */
-.fade-enter-active, .fade-leave-active {
- transition: opacity 0.3s ease;
+.paper-form {
+ border-left: 1px solid #d0d3db;
+ background: #fff;
+ /* 瓒呭灞忛檺鍒惰〃鍗曟渶澶у搴︼紝鍙充晶鐣欑櫧锛岄伩鍏嶅瓧娈靛垎甯冭繃寮� */
+ max-width: 1400px;
}
-.fade-enter, .fade-leave-to {
- opacity: 0;
+.paper-form >>> .form-row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #d0d3db;
+ /* 涓婄Щ1px涓庝笂涓�琛岀殑border-bottom閲嶅彔锛屼袱琛屼箣闂村彧鏄剧ず涓�鏉�1px缁嗙嚎 */
+ margin-top: -1px;
+}
+.paper-form >>> .form-row:first-child {
+ margin-top: 0;
}
-/* 鑷畾涔夋粴鍔ㄦ潯 */
-:deep(::-webkit-scrollbar) {
- width: 6px;
- height: 6px;
+/* 琛屽熬绌虹櫧濉厖锛氫笉婊℃暣琛岀殑鍙充晶鑷姩琛ヤ竴涓┖鐧芥牸瀛愶紝缃戞牸淇濇寔闂悎锛堝彸渚ч�傚綋鐣欑櫧锛� */
+.paper-form >>> .form-row::after {
+ content: "";
+ flex: 1 1 0;
+ min-height: 42px;
+ background: linear-gradient(to left, #d0d3db 1px, transparent 1px),
+ linear-gradient(to top, #d0d3db 1px, transparent 1px);
+ background-color: #fff;
}
-:deep(::-webkit-scrollbar-track) {
- background: #f1f1f1;
- border-radius: 3px;
+.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;
}
-:deep(::-webkit-scrollbar-thumb) {
- background: #c1c1c1;
- border-radius: 3px;
-}
+.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%; }
-:deep(::-webkit-scrollbar-thumb:hover) {
- background: #a8a8a8;
-}
-
-/* 鏂囦欢淇℃伅鏍峰紡 */
-.file-info {
+.paper-form >>> .el-form-item__label {
+ flex: 0 0 150px;
+ width: 150px !important;
+ float: none;
+ padding: 0 8px !important;
+ background: #ecf5ff;
+ border-right: 1px solid #d0d3db;
display: flex;
align-items: center;
- padding: 5px 0;
-}
-
-.file-info i {
- font-size: 18px;
- margin-right: 10px;
-}
-
-/* 鎿嶄綔鎸夐挳缁勬牱寮� */
-:deep(.small-padding .el-button) {
- margin: 0 2px;
- padding: 4px 8px;
-}
-
-/* 琛ㄥ崟琛岄棿璺濅紭鍖� */
-:deep(.el-form-item) {
- margin-bottom: 18px;
-}
-
-:deep(.el-row) {
- margin-bottom: 10px;
-}
-
-/* 瀵硅瘽妗嗘牱寮忎紭鍖� */
-:deep(.el-dialog) {
- border-radius: 8px;
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
-}
-
-:deep(.el-dialog__header) {
- background: linear-gradient(135deg, #f5f7fa 0%, #e4e7ed 100%);
- border-bottom: 1px solid #e4e7ed;
- padding: 15px 20px;
- border-radius: 8px 8px 0 0;
-}
-
-:deep(.el-dialog__title) {
+ justify-content: center;
+ text-align: center;
+ font-size: 13px;
font-weight: 600;
- color: #303133;
+ color: #2c3038;
+ line-height: 1.3;
+ white-space: nowrap;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+ color: #f56c6c;
+ margin-right: 2px;
}
-:deep(.el-dialog__body) {
- padding: 20px;
-}
-
-:deep(.el-dialog__footer) {
- padding: 15px 20px;
- border-top: 1px solid #e4e7ed;
-}
-
-/* 鐗规畩鐘舵�佹彁绀� */
-.procurement-warning {
- background-color: #fff7e6;
- border: 1px solid #ffecc2;
- border-radius: 4px;
- padding: 10px 15px;
- margin: 10px 0;
- color: #e6a23c;
- font-size: 14px;
-}
-
-.procurement-success {
- background-color: #f0f9ff;
- border: 1px solid #b3e0ff;
- border-radius: 4px;
- padding: 10px 15px;
- margin: 10px 0;
- color: #409EFF;
- font-size: 14px;
-}
-
-/* 鏃堕棿绾挎牱寮忥紙鐢ㄤ簬鎵嬫湳鏃堕棿灞曠ず锛� */
-.procurement-timeline {
- margin: 20px 0;
- padding: 15px;
- background: #f8f9fa;
- border-radius: 4px;
-}
-
-.timeline-item {
+.paper-form >>> .el-form-item__content {
+ flex: 1;
+ margin-left: 0 !important;
display: flex;
align-items: center;
- margin-bottom: 10px;
- padding: 8px 12px;
- background: white;
- border-radius: 4px;
- border-left: 4px solid #409EFF;
+ flex-wrap: wrap;
+ padding: 6px 10px;
+ background: #fff;
+ min-height: 42px;
+ line-height: 1.4;
}
-.timeline-label {
- font-weight: 500;
- min-width: 120px;
- color: #606266;
+/* 鎺т欢瀹藉害閫備腑锛屼笉閾烘弧鏁存牸锛堝唴瀹圭煭鏃惰緭鍏ユ涓嶅啀鎷夊緱寰堥暱锛� */
+.paper-form >>> .el-form-item__content .el-input,
+.paper-form >>> .el-form-item__content .el-select,
+.paper-form >>> .el-form-item__content .el-cascader {
+ width: 220px;
+ max-width: 100%;
}
-
-.timeline-value {
- color: #303133;
- font-weight: 500;
+.paper-form >>> .el-form-item__content .el-date-editor {
+ width: 240px;
+ max-width: 100%;
}
-
-/* 鎵撳嵃鏍峰紡 */
-@media print {
- .organ-procurement-detail {
- padding: 0;
- background: white;
- }
-
- .detail-card,
- .procurement-card,
- .attachment-card {
- box-shadow: none;
- border: 1px solid #ddd;
- margin-bottom: 15px;
- page-break-inside: avoid;
- }
-
- .dialog-footer,
- .el-button {
- display: none;
- }
+.paper-form >>> .el-form-item__content .el-range-editor {
+ width: 360px;
+ max-width: 100%;
}
</style>
--
Gitblit v1.9.3