From dc082351978a1e9f75d7a1471a0ca7ebeac552a5 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期一, 01 六月 2026 11:07:50 +0800
Subject: [PATCH] opo维护
---
src/views/project/travelexpensedeal/index.vue | 8
src/views/business/OrganUtilization/index.vue | 62
vue.config.js | 132
src/components/MaintainComponents/UrineRoutinePanel.vue | 2
src/views/business/transfer/TransportEdit.vue | 45
src/views/project/donatebaseinfo/index.vue | 119
src/views/business/ethicalReview/ethicalReviewInfo.vue | 724 ++++++-
src/views/project/reimbursementpayee/index.vue | 12
src/views/business/course/components/DeathJudgmentStage.vue | 4
src/views/business/GetWitness/GetWitnessInfo.vue | 32
src/views/project/donatereview/index.vue | 4
src/views/business/appear/index.vue | 33
src/views/business/OrganUtilization/OrganUtilizationInfo.vue | 57
src/views/business/course/components/components/BloodRoutinePanel.vue | 2
src/views/project/relativesconfirmation/index.vue | 4
src/views/project/funddetail/index.vue | 4
src/api/project/donatebaseinfo.js | 83
src/components/CaseBasicInfo/index.vue | 37
src/views/business/affirm/affirmInfo.vue | 231 +
src/views/business/maintain/maintainInfo.vue | 120 +
src/components/CaseStageAttachmentsDialog/index.vue | 535 +++++
src/api/businessApi/ethicalReview.js | 61
src/views/project/donationdetails/index.vue | 14
管理端 (3).zip | 0
src/views/project/donatebaseinfo/EditCaseModal.vue | 47
src/views/business/course/components/DonationConfirmStage.vue | 4
src/views/business/course/components/OrganAllocationStage.vue | 2
src/views/business/decide/DecideInfo.vue | 29
管理端.zip | 0
src/views/business/decide/index.vue | 6
src/components/MaintainComponents/LiverKidneyPanel.vue | 2
src/components/MaintainComponents/BloodRoutinePanel.vue | 1
src/utils/request.js | 2
src/views/business/course/index.vue | 522 ++---
src/views/project/donatebaseinfo/Archivedpage.vue | 322 +++
/dev/null | 1536 ---------------
src/views/business/transfer/index.vue | 63
src/views/login.vue | 3
src/views/business/course/components/EthicalReviewStage.vue | 6
src/views/project/DonationProcess/index.vue | 14
src/views/business/allocation/allocationInfo.vue | 860 +++++++-
src/views/business/appear/caseDetail.vue | 8
src/views/business/course/components/components/UrineRoutinePanel.vue | 2
管理端 (2).zip | 0
src/views/project/externalperson/index.vue | 7
src/views/project/distributedetail/index.vue | 8
src/views/business/course/components/components/LiverKidneyPanel.vue | 2
47 files changed, 3,270 insertions(+), 2,501 deletions(-)
diff --git a/src/api/businessApi/ethicalReview.js b/src/api/businessApi/ethicalReview.js
index cda4d19..ba15f35 100644
--- a/src/api/businessApi/ethicalReview.js
+++ b/src/api/businessApi/ethicalReview.js
@@ -1,57 +1,72 @@
-import request from '@/utils/request'
+import request from "@/utils/request";
// 妗堜緥鍒楄〃鍙婅鎯�
export function reviewinitiateBaseInfoList(data) {
return request({
- url: '/project/ethicalreviewinitiate/reviewinitiateBaseInfoList',
- method: 'post',
+ url: "/project/ethicalreviewinitiate/reviewinitiateBaseInfoList",
+ method: "post",
data: data
- })
+ });
}
// 浼︾悊瀹℃煡淇℃伅淇敼
export function ethicalreviewadd(data) {
return request({
- url: '/project/ethicalreviewinitiate/add',
- method: 'post',
+ url: "/project/ethicalreviewinitiate/add",
+ method: "post",
data: data
- })
+ });
}
// 浼︾悊瀹℃煡淇℃伅淇敼
export function ethicalreviewedit(data) {
return request({
- url: '/project/ethicalreviewinitiate/edit',
- method: 'post',
+ url: "/project/ethicalreviewinitiate/edit",
+ method: "post",
data: data
- })
+ });
}
// 瀹℃煡涓撳缁熻
export function ethicalreExpertTotal(query) {
return request({
- url: '/project/ethicalreviewopinions/expertTotal',
- method: 'get',
+ url: "/project/ethicalreviewopinions/expertTotal",
+ method: "get",
params: query
- })
+ });
}
// 浼︾悊瀹℃煡淇℃伅璇︽儏
export function ethicalreviewInfo(id) {
return request({
- url: '/project/ethicalreviewinitiate/getInfo/' + id,
- method: 'get'
- })
+ url: "/project/ethicalreviewinitiate/getInfo/" + id,
+ method: "get"
+ });
+}
+// 浼︾悊瀹℃煡淇℃伅infoid鏌ヨ璇︽儏
+export function ethicalreviewgetInfoID(query) {
+ return request({
+ url: "/project/ethicalreviewinitiate/getInfoID",
+ method: "get",
+ params: query
+ });
}
// 瀹℃煡鍗曠姸鎬佸彉鏇�
export function ethicalreviewreceiveStatus(id) {
return request({
- url: '/project/ethicalreviewopinions/receiveStatus',
- method: 'get'
- })
+ url: "/project/ethicalreviewopinions/receiveStatus",
+ method: "get"
+ });
}
// 涓撳娑堟伅鎺ㄩ��
export function sendNotification(data) {
return request({
- url: '/system/dingtalk/sendNotification',
- method: 'post',
+ url: "/system/dingtalk/sendNotification",
+ method: "post",
data: data
- })
+ });
}
-
+// 鐭俊
+export function sendcall(data) {
+ return request({
+ url: "/sms/send",
+ method: "post",
+ data: data
+ });
+}
diff --git a/src/api/project/donatebaseinfo.js b/src/api/project/donatebaseinfo.js
index ee6177b..7558e61 100644
--- a/src/api/project/donatebaseinfo.js
+++ b/src/api/project/donatebaseinfo.js
@@ -1,101 +1,110 @@
-import request from '@/utils/request'
+import request from "@/utils/request";
// 鏌ヨ鎹愮尞鍩虹鍒楄〃
export function listDonatebaseinfo(data) {
return request({
- url: '/project/donatebaseinfo/list',
- method: 'post',
+ url: "/project/donatebaseinfo/list",
+ method: "post",
data: data
- })
+ });
}
export function listDonationProcess(query) {
return request({
- url: '/VDonationworkflow/donationworkflow/list',
- method: 'get',
+ url: "/VDonationworkflow/donationworkflow/list",
+ method: "get",
params: query
- })
+ });
}
// 鏌ヨ鎹愮尞鍩虹璇︾粏
export function getDonatebaseinfo(id) {
return request({
- url: '/project/donatebaseinfo/' + id,
- method: 'get'
- })
+ url: "/project/donatebaseinfo/" + id,
+ method: "get"
+ });
+}
+
+// 鑾峰彇鎹愮尞缂栧彿
+export function getfileList(data) {
+ return request({
+ url: "/project/donatebaseinfo/fileList",
+ method: "get",
+ params: data
+ });
}
// 鑾峰彇鎹愮尞缂栧彿
export function getDonationNumber(data) {
return request({
- url: '/project/donatebaseinfo/donatenumber',
- method: 'post',
+ url: "/project/donatebaseinfo/donatenumber",
+ method: "post",
data: data
- })
+ });
}
// 鏌ヨ鎹愮尞宸ヤ綔娴�
export function getDonatebaseinfoflow(id) {
return request({
- url: '/project/donatebaseinfo/getWorkFlow/' + id,
- method: 'get'
- })
+ url: "/project/donatebaseinfo/getWorkFlow/" + id,
+ method: "get"
+ });
}
// 鏂板鎹愮尞鍩虹
export function addDonatebaseinfo(data) {
return request({
- url: '/project/donatebaseinfo/add',
- method: 'post',
+ url: "/project/donatebaseinfo/add",
+ method: "post",
data: data
- })
+ });
}
// 淇敼鎹愮尞鍩虹
export function updateDonatebaseinfo(data) {
return request({
- url: '/project/donatebaseinfo/edit',
- method: 'post',
+ url: "/project/donatebaseinfo/edit",
+ method: "post",
data: data
- })
+ });
}
// 鍒犻櫎鎹愮尞鍩虹
export function delDonatebaseinfo(id) {
return request({
- url: '/project/donatebaseinfo/remove/' + id,
- method: 'get',
- })
+ url: "/project/donatebaseinfo/remove/" + id,
+ method: "get"
+ });
}
// 瀵煎嚭鎹愮尞鍩虹
export function exportDonatebaseinfo(query) {
return request({
- url: '/project/donatebaseinfo/export',
- method: 'get',
+ url: "/project/donatebaseinfo/export",
+ method: "get",
params: query
- })
+ });
}
// 鑾峰彇鎹愮尞缂栧彿
export function getdonatorno(data) {
// console.log("鑾峰彇鎹愮尞缂栧彿锛氬叆鍙傦細" + JSON.stringify(data));
return request({
- url: '/project/donatebaseinfo/donatenumber',
- method: 'get',
+ url: "/project/donatebaseinfo/donatenumber",
+ method: "get",
params: data
- })
+ });
}
// 涓嬭浇浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃
export function downloadbaseinfo(id) {
return request({
- url: '/project/donatebaseinfo/download/' + id,
- method: 'get'
- })
+ url: "/project/donatebaseinfo/download/" + id,
+ method: "get"
+ });
}
// 涓嬭浇浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃
export function fileCase(data) {
return request({
- url: '/project/pdfmerge/merge',
- method: 'get',
+ url: "/project/pdfmerge/merge",
+ method: "get",
params: data
- })
+ });
}
diff --git a/src/components/CaseBasicInfo/index.vue b/src/components/CaseBasicInfo/index.vue
index 045e856..b992cc3 100644
--- a/src/components/CaseBasicInfo/index.vue
+++ b/src/components/CaseBasicInfo/index.vue
@@ -2,6 +2,16 @@
<el-card class="basic-info-card" v-loading="loading">
<div slot="header" class="clearfix">
<span>妗堜緥鍩烘湰淇℃伅</span>
+
+ <el-button
+ v-if="showAttachment"
+ type="text"
+ style="float: right; margin-left: 12px"
+ @click="openStageAttachments"
+ >
+ <i class="el-icon-folder"></i> 鏌ョ湅鍚勯樁娈甸檮浠�
+ </el-button>
+
<el-button
v-if="showAttachment && hasAttachments"
style="float: right; padding: 3px 0"
@@ -100,14 +110,24 @@
<div v-else class="empty-state">
<el-empty description="鏆傛棤妗堜緥淇℃伅" :image-size="100"></el-empty>
</div>
+ <!-- 鍚勯樁娈甸檮浠跺脊妗� -->
+ <case-stage-attachments-dialog
+ ref="stageDialog"
+ :case-id="caseId"
+ :selected-ids="selectedAttachmentIds"
+ @confirm="onAttachmentsConfirm"
+ />
</el-card>
</template>
<script>
-import { getDonatebaseinfo } from "@/api/project/donatebaseinfo";
+import { getDonatebaseinfo, getfileList } from "@/api/project/donatebaseinfo";
+import CaseStageAttachmentsDialog from "@/components/CaseStageAttachmentsDialog";
export default {
name: "CaseBasicInfoSimple",
+ components: { CaseStageAttachmentsDialog },
+
props: {
// 妗堜緥ID
caseId: {
@@ -173,7 +193,9 @@
basicData: null,
// 瀛楀吀閫夐」
sexOptions: [],
- bloodTypeOptions: []
+ bloodTypeOptions: [],
+ selectedAttachmentIds: ["123", "456"],
+ finalAttachments: []
};
},
computed: {
@@ -234,7 +256,16 @@
console.warn("鍔犺浇瀛楀吀澶辫触:", error);
}
},
+ // 鎵撳紑鍚勯樁娈甸檮浠跺脊妗�
+ openStageAttachments() {
+ this.$refs.stageDialog.open();
+ },
+ onAttachmentsConfirm(list) {
+ this.finalAttachments = list;
+ console.log("閫変腑鐨勯樁娈甸檮浠讹細", list);
+ // 鍙洿鎺ユ彁浜ょ粰鎺ュ彛
+ },
// 鍔犺浇鍩烘湰淇℃伅
async loadBasicInfo() {
if (!this.caseId) return;
@@ -245,7 +276,7 @@
if (response.code === 200) {
this.basicData = this.mapApiData(response.data);
- console.log(this.basicData );
+ console.log(this.basicData);
this.loading = false;
} else {
diff --git a/src/components/CaseStageAttachmentsDialog/index.vue b/src/components/CaseStageAttachmentsDialog/index.vue
new file mode 100644
index 0000000..ddcd28d
--- /dev/null
+++ b/src/components/CaseStageAttachmentsDialog/index.vue
@@ -0,0 +1,535 @@
+<template>
+ <el-dialog
+ title="妗堜緥鍚勯樁娈甸檮浠�"
+ :visible.sync="visible"
+ width="1200px"
+ top="4vh"
+ append-to-body
+ :close-on-click-modal="false"
+ @closed="handleClosed"
+ >
+ <!-- 闃舵 Tabs -->
+ <el-tabs v-model="activeStage" type="card" @tab-click="handleStageChange">
+ <el-tab-pane
+ v-for="stage in stageTypes"
+ :key="stage.value"
+ :label="stage.label"
+ :name="stage.value"
+ >
+ <!-- 闃舵鍐呯殑闄勪欢绫诲瀷 Tabs -->
+ <div class="stage-content">
+ <el-tabs v-model="activeType" type="border-card">
+ <el-tab-pane
+ v-for="type in getTypesByStage(stage.value)"
+ :key="type.value"
+ :label="type.label"
+ :name="type.value"
+ >
+ <!-- 闄勪欢鍒楄〃 -->
+ <div class="attachment-list">
+ <el-table
+ :data="getAttachmentsByStageAndType(stage.value, type.value)"
+ size="small"
+ v-loading="loading"
+ style="width: 100%;"
+ @row-click="handleRowClick"
+ :row-class-name="tableRowClassName"
+ >
+ <el-table-column label="鏂囦欢鍚�" min-width="220">
+ <template slot-scope="scope">
+ <i
+ class="el-icon-document"
+ style="color: #409EFF; margin-right: 8px;"
+ ></i>
+ <span class="file-name">{{ scope.row.fileName }}</span>
+ </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>{{ formatDateTime(scope.row.uploadTime) }}</span>
+ </template>
+ </el-table-column>
+
+ <el-table-column label="涓婁紶浜�" width="120" align="center">
+ <template slot-scope="scope">
+ <span>{{ scope.row.uploader || "-" }}</span>
+ </template>
+ </el-table-column>
+
+ <el-table-column label="鎿嶄綔" width="180" align="center">
+ <template slot-scope="scope">
+ <el-button
+ size="mini"
+ type="primary"
+ @click="handlePreview(scope.row)"
+ >
+ 棰勮
+ </el-button>
+ <el-button
+ size="mini"
+ type="danger"
+ @click="handleDownload(scope.row)"
+ >
+ 涓嬭浇
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <!-- 绌虹姸鎬� -->
+ <div
+ v-if="
+ getAttachmentsByStageAndType(stage.value, type.value)
+ .length === 0
+ "
+ class="empty-attachment"
+ >
+ <el-empty
+ :description="`鏆傛棤${type.label}闄勪欢`"
+ :image-size="80"
+ ></el-empty>
+ </div>
+ </div>
+ </el-tab-pane>
+ </el-tabs>
+ </div>
+ </el-tab-pane>
+ </el-tabs>
+
+ <span slot="footer" class="dialog-footer">
+ <el-button @click="visible = false">鍏抽棴</el-button>
+ <!-- <el-button type="primary" @click="handleConfirm">
+ 纭閫夋嫨 ({{ selectedCount }})
+ </el-button> -->
+ </span>
+
+ <!-- 鏂囦欢棰勮寮圭獥 -->
+ <FilePreviewDialog
+ :visible="previewVisible"
+ :file="currentPreviewFile"
+ @close="previewVisible = false"
+ @download="handleDownload"
+ />
+ </el-dialog>
+</template>
+
+<script>
+import { getfileList } from "@/api/project/donatebaseinfo";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
+import { parseTime } from "@/utils/ruoyi";
+
+export default {
+ name: "StageAttachmentsDialog",
+ components: {
+ FilePreviewDialog
+ },
+ props: {
+ caseId: {
+ type: [String, Number],
+ required: true
+ },
+ // 宸查�変腑鐨勯檮浠禝D闆嗗悎锛堢敤浜庡洖鏄撅級
+ selectedIds: {
+ type: Array,
+ default: () => []
+ }
+ },
+ data() {
+ return {
+ visible: false,
+ loading: false,
+
+ // 闃舵瀹氫箟
+ stageTypes: [
+ { value: "death", label: "姝讳骸鍒ゅ畾" },
+ { value: "confirm", label: "鎹愮尞纭" },
+ { value: "maintain", label: "渚涜�呯淮鎶�" },
+ { value: "witness", label: "鍣ㄥ畼鑾峰彇瑙佽瘉" },
+ { value: "ethics", label: "浼︾悊瀹℃煡" }
+ ],
+
+ // 鍚勯樁娈甸檮浠剁被鍨嬪畾涔�
+ typeDefinitions: {
+ death: [
+ { value: "brain", label: "鑴戞浜″垽瀹�" },
+ { value: "heart", label: "蹇冩浜″垽瀹�" }
+ ],
+ confirm: [
+ { value: "1", label: "浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃" },
+ { value: "2", label: "浜轰綋鍣ㄥ畼鎹愮尞浜插睘纭鐧昏琛�" },
+ { value: "3", label: "鎹愮尞鑰呭強鐩寸郴浜插睘韬唤璇併�佹埛鍙g翱鐩稿叧璇佹槑" },
+ { value: "4", label: "鍏皯韬晠鍚庝汉浣撳櫒瀹橈紙瑙掕啘锛夐仐浣撴崘鐚憡鐭ヤ功" },
+ { value: "5", label: "鑴戞浜″垽瀹氱煡鎯呭悓鎰忎功" },
+ { value: "6", label: "蹇冩浜″垽瀹氱煡鎯呭悓鎰忎功" }
+ ],
+ maintain: [
+ { value: "urine", label: "灏垮父瑙�" },
+ { value: "blood", label: "琛�甯歌" },
+ { value: "liver", label: "鑲濊偩鍔熻兘" },
+ { value: "culture", label: "鍩瑰吇缁撴灉" },
+ { value: "nurse", label: "鎶ょ悊璁板綍" }
+ ],
+ witness: [{ value: "deathCert", label: "姝讳骸璇佹槑" }],
+ ethics: [{ value: "review", label: "浼︾悊瀹℃煡鏉愭枡" }]
+ },
+
+ // 褰撳墠婵�娲荤殑Tab
+ activeStage: "death",
+ activeType: "",
+
+ // 鍘熷鎺ュ彛鏁版嵁
+ rawData: null,
+
+ // 澶勭悊鍚庣殑闄勪欢鏁版嵁 stage -> type -> list
+ attachmentData: {},
+
+ // 閫変腑鐨勯檮浠堕泦鍚�
+ selectedAttachments: new Map(),
+
+ // 棰勮鐩稿叧
+ previewVisible: false,
+ currentPreviewFile: null
+ };
+ },
+ computed: {
+ // 褰撳墠闃舵涓嬬殑闄勪欢绫诲瀷
+ currentStageTypes() {
+ return this.typeDefinitions[this.activeStage] || [];
+ },
+
+ // 宸查�夋暟閲�
+ selectedCount() {
+ return this.selectedAttachments.size;
+ },
+ selectedCount() {
+ return this.selectedAttachments?.size || 0;
+ }
+ },
+ watch: {
+ selectedIds: {
+ handler(newVal) {
+ this.initSelectedState(newVal);
+ },
+ immediate: true
+ }
+ },
+ methods: {
+ open() {
+ this.visible = true;
+ this.loadData();
+ },
+
+ // 鍒濆鍖栭�変腑鐘舵��
+ initSelectedState(ids) {
+ this.selectedAttachments.clear();
+ ids.forEach(id => {
+ this.selectedAttachments.set(id, true);
+ });
+ },
+
+ // 鍔犺浇鏁版嵁
+ async loadData() {
+ this.loading = true;
+ try {
+ const res = await getfileList({ infoid: this.caseId });
+ if (res.code === 200) {
+ this.rawData = res.data || {};
+ this.processData();
+ }
+ } catch (e) {
+ console.error(e);
+ } finally {
+ this.loading = false;
+ }
+ },
+
+ // 澶勭悊鎺ュ彛鏁版嵁
+ processData() {
+ const d = this.rawData;
+ const result = {};
+
+ // 鍒濆鍖栫粨鏋�
+ this.stageTypes.forEach(stage => {
+ result[stage.value] = {};
+ (this.typeDefinitions[stage.value] || []).forEach(type => {
+ result[stage.value][type.value] = [];
+ });
+ });
+
+ // ===== 1. 姝讳骸鍒ゅ畾 =====
+ (d.deathinfo || []).forEach(item => {
+ this.pushAttachment(
+ result.death,
+ "brain",
+ this.parseAttachments(item.deathjudgeannex)
+ );
+ this.pushAttachment(
+ result.death,
+ "heart",
+ this.parseAttachments(item.heartdeathjudgeannex)
+ );
+ });
+
+ // ===== 2. 鎹愮尞纭 =====
+ (d.relativesconfirmation || []).forEach(item => {
+ this.pushAttachment(
+ result.confirm,
+ "1",
+ this.parseAttachments(item.assessannex)
+ );
+ });
+
+ // ===== 3. 渚涜�呯淮鎶� =====
+ (d.donatemaintenance || []).forEach(item => {
+ try {
+ const itemDesc = JSON.parse(item.itemDesc || "{}");
+ this.pushAttachment(
+ result.maintain,
+ "urine",
+ itemDesc.urineRoutine?.attachments || []
+ );
+ this.pushAttachment(
+ result.maintain,
+ "blood",
+ itemDesc.bloodRoutine?.attachments || []
+ );
+ this.pushAttachment(
+ result.maintain,
+ "liver",
+ itemDesc.liverKidney?.attachments || []
+ );
+ this.pushAttachment(
+ result.maintain,
+ "culture",
+ itemDesc.cultureResults?.flatMap(c => c.attachments || []) || []
+ );
+ this.pushAttachment(
+ result.maintain,
+ "nurse",
+ itemDesc.nursingRecords?.flatMap(n => n.attachments || []) || []
+ );
+ } catch {}
+ });
+
+ // ===== 4. 鍣ㄥ畼鑾峰彇瑙佽瘉 =====
+ (d.donationwitness || []).forEach(item => {
+ this.pushAttachment(
+ result.witness,
+ "deathCert",
+ this.parseAttachments(item.deathjudgeannex)
+ );
+ });
+
+ // ===== 5. 浼︾悊瀹℃煡 =====
+ (d.donateflowcharts || []).forEach(item => {
+ this.pushAttachment(
+ result.ethics,
+ "review",
+ this.parseAttachments(item.filePatch)
+ );
+ });
+
+ this.attachmentData = result;
+
+ this.$nextTick(() => {
+ if (this.currentStageTypes.length > 0) {
+ this.activeType = this.currentStageTypes[0].value;
+ }
+ });
+ },
+
+ // 杈呭姪锛氳В鏋愰檮浠跺瓧娈�
+ parseAttachments(val) {
+ if (!val) return [];
+ if (Array.isArray(val)) return val;
+ try {
+ const arr = JSON.parse(val);
+ return Array.isArray(arr) ? arr : [];
+ } catch {
+ return val
+ .split(";")
+ .filter(Boolean)
+ .map(p => ({ fileName: p.split("/").pop(), fileUrl: p }));
+ }
+ },
+
+ // 杈呭姪锛氭帹閫侀檮浠跺苟琛ュ厖瀛楁
+ pushAttachment(result, type, files) {
+ files.forEach(file => {
+ const attachment = {
+ id: file.id || `${Date.now()}_${Math.random()}`,
+ fileName: file.fileName,
+ fileUrl: file.path || file.fileUrl,
+ fileSize: file.fileSize,
+ uploadTime: file.uploadTime,
+ uploader: file.uploader,
+ type: type,
+ stage: this.activeStage
+ };
+ result[type].push(attachment);
+
+ // // 鍥炴樉閫変腑鐘舵��
+ // if (this.selectedAttachments.has(attachment.id)) {
+ // attachment._selected = true;
+ // }
+ });
+ },
+
+ // 鑾峰彇鏌愰樁娈典笅鐨勯檮浠剁被鍨�
+ getTypesByStage(stage) {
+ return this.typeDefinitions[stage] || [];
+ },
+
+ // 鑾峰彇闄勪欢鍒楄〃
+ getAttachmentsByStageAndType(stage, type) {
+ return this.attachmentData[stage]?.[type] || [];
+ },
+
+ // 闃舵鍒囨崲
+ handleStageChange() {
+ this.$nextTick(() => {
+ if (this.currentStageTypes.length > 0) {
+ this.activeType = this.currentStageTypes[0].value;
+ }
+ });
+ },
+
+ // 鐐瑰嚮琛岄�夋嫨/鍙栨秷
+ handleRowClick(row) {
+ if (this.selectedAttachments.has(row.id)) {
+ this.selectedAttachments.delete(row.id);
+ } else {
+ this.selectedAttachments.set(row.id, row);
+ }
+},
+ tableRowClassName({ row }) {
+ return this.selectedAttachments.has(row.id)
+ ? "selected-row"
+ : "";
+},
+ // 棰勮
+ handlePreview(row) {
+ this.currentPreviewFile = {
+ fileName: row.fileName,
+ fileUrl: row.fileUrl,
+ fileType: this.getFileType(row.fileName)
+ };
+ this.previewVisible = true;
+ },
+
+ // 涓嬭浇
+ handleDownload(file) {
+ const link = document.createElement("a");
+ link.href = file.fileUrl || file.path;
+ link.download = file.fileName;
+ link.click();
+ },
+
+ // 鑾峰彇鏂囦欢绫诲瀷
+ getFileType(fileName) {
+ const ext = fileName
+ .split(".")
+ .pop()
+ .toLowerCase();
+ if (["jpg", "jpeg", "png"].includes(ext)) return "image";
+ if (ext === "pdf") return "pdf";
+ if (["doc", "docx"].includes(ext)) return "office";
+ return "other";
+ },
+
+ // 鏂囦欢澶у皬鏍煎紡鍖�
+ formatFileSize(size) {
+ if (!size) 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];
+ },
+
+ // 鏃ユ湡鏃堕棿鏍煎紡鍖�
+ formatDateTime(dateTime) {
+ return dateTime ? parseTime(dateTime) : "-";
+ },
+
+ // 纭閫夋嫨
+ handleConfirm() {
+ const result = [];
+ this.selectedAttachments.forEach(attachment => {
+ result.push({
+ id: attachment.id,
+ fileName: attachment.fileName,
+ fileUrl: attachment.fileUrl,
+ fileSize: attachment.fileSize,
+ uploadTime: attachment.uploadTime,
+ uploader: attachment.uploader,
+ stage: attachment.stage,
+ stageName:
+ this.stageTypes.find(s => s.value === attachment.stage)?.label ||
+ "",
+ type: attachment.type,
+ typeName:
+ this.typeDefinitions[attachment.stage]?.find(
+ t => t.value === attachment.type
+ )?.label || ""
+ });
+ });
+
+ this.$emit("confirm", result);
+ this.visible = false;
+ },
+
+ // 寮规鍏抽棴
+ handleClosed() {
+ this.attachmentData = {};
+ this.selectedAttachments.clear();
+ }
+ }
+};
+</script>
+
+<style scoped>
+.stage-content {
+ padding: 15px 0;
+}
+
+.attachment-list {
+ margin-top: 15px;
+}
+
+.empty-attachment {
+ text-align: center;
+ padding: 40px 0;
+ color: #909399;
+ border: 1px dashed #dcdfe6;
+ border-radius: 4px;
+ margin-top: 15px;
+}
+
+.file-name {
+ font-size: 13px;
+ color: #606266;
+}
+
+/* 閫変腑琛岄珮浜� */
+::v-deep .el-table__row:hover {
+ cursor: pointer;
+}
+::v-deep .el-table__row.selected-row {
+ background-color: #ecf5ff !important;
+}
+</style>
diff --git a/src/components/MaintainComponents/BloodRoutinePanel.vue b/src/components/MaintainComponents/BloodRoutinePanel.vue
index 6a76ef2..b91ec14 100644
--- a/src/components/MaintainComponents/BloodRoutinePanel.vue
+++ b/src/components/MaintainComponents/BloodRoutinePanel.vue
@@ -29,7 +29,6 @@
border
style="width: 100%"
class="medical-table"
- v-fit-columns
:key="tableKey"
@header-dragend="handleHeaderDragEnd"
v-loading="tableLoading"
diff --git a/src/components/MaintainComponents/LiverKidneyPanel.vue b/src/components/MaintainComponents/LiverKidneyPanel.vue
index 6a1ac0c..d1ee0fd 100644
--- a/src/components/MaintainComponents/LiverKidneyPanel.vue
+++ b/src/components/MaintainComponents/LiverKidneyPanel.vue
@@ -19,7 +19,7 @@
style="width: 100%"
class="medical-table"
:key="tableKey"
- v-fit-columns
+
@header-dragend="handleHeaderDragEnd"
>
<el-table-column
diff --git a/src/components/MaintainComponents/UrineRoutinePanel.vue b/src/components/MaintainComponents/UrineRoutinePanel.vue
index e482237..d8d8a26 100644
--- a/src/components/MaintainComponents/UrineRoutinePanel.vue
+++ b/src/components/MaintainComponents/UrineRoutinePanel.vue
@@ -29,7 +29,7 @@
border
style="width: 100%"
class="medical-table"
- v-fit-columns
+
:key="tableKey"
@header-dragend="handleHeaderDragEnd"
v-loading="tableLoading"
diff --git a/src/utils/request.js b/src/utils/request.js
index d0a5db3..b6ed29e 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -61,7 +61,7 @@
const s_url = sessionObj.url; // 璇锋眰鍦板潃
const s_data = sessionObj.data; // 璇锋眰鏁版嵁
const s_time = sessionObj.time; // 璇锋眰鏃堕棿
- const interval = 500; // 闂撮殧鏃堕棿(ms)锛屽皬浜庢鏃堕棿瑙嗕负閲嶅鎻愪氦
+ const interval = 50; // 闂撮殧鏃堕棿(ms)锛屽皬浜庢鏃堕棿瑙嗕负閲嶅鎻愪氦
if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
const message = '鏁版嵁姝e湪澶勭悊锛岃鍕块噸澶嶆彁浜�';
console.warn(`[${s_url}]: ` + message)
diff --git a/src/views/business/GetWitness/GetWitnessInfo.vue b/src/views/business/GetWitness/GetWitnessInfo.vue
index c55238e..7ae2546 100644
--- a/src/views/business/GetWitness/GetWitnessInfo.vue
+++ b/src/views/business/GetWitness/GetWitnessInfo.vue
@@ -136,19 +136,41 @@
</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> -->
<el-col :span="8">
- <el-form-item label="绛惧瓧鏃堕棿" prop="coordinatorSignTime">
+ <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>
@@ -163,12 +185,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>
diff --git a/src/views/business/OrganUtilization/OrganUtilizationInfo.vue b/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
index 6106b5f..d6a0daa 100644
--- a/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
+++ b/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
@@ -85,7 +85,7 @@
</div>
<el-row :gutter="20">
<el-col :span="6">
- <el-form-item align="left" label="閬椾綋鎹愮尞" prop="isbodydonation">
+ <el-form-item align="left" label="閬椾綋鎺ユ敹" prop="isbodydonation">
<el-radio-group v-model="form.isbodydonation">
<el-radio
v-for="dict in dict.type.sys_0_1 || []"
@@ -96,24 +96,28 @@
</el-radio-group>
</el-form-item>
</el-col>
- <el-col :span="18" v-if="form.isbodydonation == 1">
- <el-form-item
- align="left"
- label="鎺ユ敹鍗曚綅"
- prop="receivingunitname"
- >
- <el-input
- v-model="form.receivingunitname"
- placeholder="璇疯緭鍏ユ帴鏀跺崟浣�"
- />
- </el-form-item>
- </el-col>
- <el-col :span="8" v-else>
+
+ <el-col :span="8">
<el-form-item align="left" label="鎺ユ敹瀹跺睘" prop="relationname">
<el-input
v-model="form.relationname"
placeholder="璇疯緭鍏ユ帴鏀跺灞�"
/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item label="涓庢崘鐚�呭叧绯�" prop="signfamilyrelations">
+ <el-select
+ v-model="form.signfamilyrelations"
+ placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
+ >
+ <el-option
+ v-for="dict in dict.type.sys_FamilyRelation || []"
+ :key="dict.value"
+ :label="dict.label"
+ :value="dict.value"
+ ></el-option>
+ </el-select>
</el-form-item>
</el-col>
</el-row>
@@ -597,7 +601,13 @@
FilePreviewDialog,
CaseBasicInfo
},
- dicts: ["sys_BloodType", "sys_Organ", "sys_0_1", "utilize_statue"],
+ dicts: [
+ "sys_BloodType",
+ "sys_Organ",
+ "sys_FamilyRelation",
+ "sys_0_1",
+ "utilize_statue"
+ ],
data() {
return {
caseId: null,
@@ -627,7 +637,7 @@
coordinatedusernamet: "",
assessannex: "",
donateorgan: "",
- isbodydonation: "0",
+ isbodydonation: "1",
receivingunitname: "",
createBy: "",
createTime: "",
@@ -756,17 +766,8 @@
.replace("T", " ")
.substring(0, 19);
- this.generateDonorNo();
this.getDetail();
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);
},
// 鑾峰彇璇︽儏
@@ -783,9 +784,10 @@
if (!data.completeState || data.completeState == 1) {
data.completeState = "2";
}
+ this.form = data;
// 濉厖琛ㄥ崟鏁版嵁
- Object.assign(this.form, data);
-
+ // Object.assign(this.form, data);
+ this.form.signfamilyrelations = this.form.signfamilyrelations || "";
// 澶勭悊鎹愮尞鍣ㄥ畼瀛楁
if (data.donateorgan) {
const organArray = Array.isArray(data.donateorgan)
@@ -1180,7 +1182,6 @@
return false;
}
);
-
if (incompleteRecords.length > 0) {
this.$message.warning("璇峰厛瀹屽杽鎵�鏈夊埄鐢ㄨ褰曠殑淇℃伅");
diff --git a/src/views/business/OrganUtilization/index.vue b/src/views/business/OrganUtilization/index.vue
index ee5d473..d98215e 100644
--- a/src/views/business/OrganUtilization/index.vue
+++ b/src/views/business/OrganUtilization/index.vue
@@ -26,17 +26,17 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
- <el-form-item label="璁板綍鐘舵��" prop="recordstate">
+ <el-form-item label="鍒╃敤鐘舵��" prop="completeState">
<el-select
- v-model="queryParams.recordstate"
- placeholder="璇烽�夋嫨璁板綍鐘舵��"
+ v-model="queryParams.completeState"
+ placeholder="璇烽�夋嫨鍒╃敤鐘舵��"
clearable
style="width: 200px"
>
- <el-option label="宸插畬鎴�" value="completed" />
- <el-option label="杩涜涓�" value="processing" />
- <el-option label="寰呭鐞�" value="pending" />
- <el-option label="宸插叧闂�" value="closed" />
+ <el-option label="寰呭埄鐢�" value="1" />
+ <el-option label="杩涜涓�" value="2" />
+ <el-option label="宸插畬鎴�" value="3" />
+ <el-option label="鏀惧純" value="4" />
</el-select>
</el-form-item>
<el-form-item>
@@ -113,7 +113,12 @@
</template>
</el-table-column>
<el-table-column label="骞撮緞" align="center" prop="age" width="80" />
- <el-table-column label="琛�鍨�" align="center" prop="bloodtype" width="80">
+ <el-table-column
+ label="琛�鍨�"
+ align="center"
+ prop="bloodtype"
+ width="80"
+ >
<template slot-scope="scope">
<dict-tag
v-if="scope.row.bloodtype"
@@ -121,6 +126,19 @@
:value="scope.row.bloodtype"
/>
<span v-else>-</span>
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="鍒╃敤鐘舵��"
+ align="center"
+ prop="recordstate"
+ width="100"
+ >
+ <template slot-scope="scope">
+ <dict-tag
+ :options="dict.type.utilize_statue"
+ :value="scope.row.completeState"
+ />
</template>
</el-table-column>
<el-table-column
@@ -154,19 +172,7 @@
<span>{{ scope.row.responsibleusername || "-" }}</span>
</template>
</el-table-column>
- <el-table-column
- label="璁板綍鐘舵��"
- align="center"
- prop="recordstate"
- width="100"
- >
- <template slot-scope="scope">
- <dict-tag
- :options="dict.type.utilize_statue"
- :value="scope.row.completeState"
- />
- </template>
- </el-table-column>
+
<el-table-column
label="鎿嶄綔"
fixed="right"
@@ -214,13 +220,17 @@
</template>
<script>
-import { completionList, completionadd, completionedit } from "@/api/businessApi";
+import {
+ completionList,
+ completionadd,
+ completionedit
+} from "@/api/businessApi";
import Pagination from "@/components/Pagination";
export default {
name: "OrganUtilizationList",
components: { Pagination },
- dicts: ["sys_user_sex", "sys_BloodType",'utilize_statue'],
+ dicts: ["sys_user_sex", "sys_BloodType", "utilize_statue"],
data() {
return {
// 閬僵灞�
@@ -262,13 +272,13 @@
let data = response.data;
if (Array.isArray(data)) {
this.organUtilizationList = data;
- this.total = data.length;
+ this.total = response.total;
} else if (data && data.rows) {
this.organUtilizationList = data.rows;
- this.total = data.total || data.rows.length;
+ this.total = response.total;
} else if (data && data.list) {
this.organUtilizationList = data.list;
- this.total = data.total || data.list.length;
+ this.total = response.total;
} else {
this.organUtilizationList = [];
this.total = 0;
diff --git a/src/views/business/affirm/affirmInfo.vue b/src/views/business/affirm/affirmInfo.vue
index 613f64e..abd3036 100644
--- a/src/views/business/affirm/affirmInfo.vue
+++ b/src/views/business/affirm/affirmInfo.vue
@@ -126,7 +126,48 @@
</el-form-item>
</el-col>
</el-row>
+ <el-row style="margin-bottom: 10px;">
+ <el-button
+ type="primary"
+ size="mini"
+ icon="el-icon-plus"
+ @click="openOtherFamilyDialog()"
+ >
+ 娣诲姞鍏朵粬瀹跺睘
+ </el-button>
+ </el-row>
+ <el-table :data="otherFamilyList" size="small" border>
+ <el-table-column label="濮撳悕" prop="name" />
+ <el-table-column label="涓庢崘璧犺�呭叧绯�" prop="relation">
+ <template slot-scope="scope">
+ <dict-tag
+ :options="dict.type.sys_FamilyRelation"
+ :value="scope.row.relation"
+ />
+ </template>
+ </el-table-column>
+ <el-table-column label="鑱旂郴鐢佃瘽" prop="phone" />
+ <el-table-column label="鎿嶄綔" width="120" align="center">
+ <template slot-scope="scope">
+ <el-button
+ size="mini"
+ type="text"
+ @click="editOtherFamily(scope.$index)"
+ >
+ 缂栬緫
+ </el-button>
+ <el-button
+ size="mini"
+ type="text"
+ style="color:red"
+ @click="deleteOtherFamily(scope.$index)"
+ >
+ 鍒犻櫎
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
<el-row>
<el-form-item label-width="100px" label="鎹愮尞鍐冲畾">
<el-checkbox-group v-model="organdecision">
@@ -259,7 +300,38 @@
</el-tab-pane>
</el-tabs>
</el-card>
+ <!-- 鍏朵粬瀹跺睘寮圭獥 -->
+ <el-dialog
+ :title="isEditOtherFamily ? '缂栬緫鍏朵粬瀹跺睘' : '娣诲姞鍏朵粬瀹跺睘'"
+ :visible.sync="otherFamilyDialogVisible"
+ width="400px"
+ >
+ <el-form :model="currentOtherFamily" label-width="100px">
+ <el-form-item label="濮撳悕" prop="name">
+ <el-input v-model="currentOtherFamily.name" />
+ </el-form-item>
+ <el-form-item label="鍏崇郴" prop="relation">
+ <el-select v-model="currentOtherFamily.relation" style="width:100%">
+ <el-option
+ v-for="dict in dict.type.sys_FamilyRelation"
+ :key="dict.value"
+ :label="dict.label"
+ :value="dict.value"
+ />
+ </el-select>
+ </el-form-item>
+
+ <el-form-item label="鐢佃瘽" prop="phone">
+ <el-input v-model="currentOtherFamily.phone" />
+ </el-form-item>
+ </el-form>
+
+ <span slot="footer">
+ <el-button @click="otherFamilyDialogVisible = false">鍙栨秷</el-button>
+ <el-button type="primary" @click="saveOtherFamily">纭畾</el-button>
+ </span>
+ </el-dialog>
<!-- 涓婁紶瀵硅瘽妗� -->
<el-dialog
:title="`涓婁紶${getCurrentTypeLabel}闄勪欢`"
@@ -271,14 +343,15 @@
ref="uploadRef"
class="upload-demo"
drag
- action="#"
+ :action="uploadAction"
+ :headers="headers"
multiple
:file-list="tempFileList"
:before-upload="beforeUpload"
:on-change="handleFileChange"
:on-remove="handleTempRemove"
+ :on-success="handleUploadSuccess"
:auto-upload="false"
- :http-request="handleHttpRequest"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
@@ -314,6 +387,8 @@
import { relativesList, relativesEdit, relativesAdd } from "@/api/businessApi";
import FilePreviewDialog from "@/components/FilePreviewDialog";
import CaseBasicInfo from "@/components/CaseBasicInfo";
+import { getToken } from "@/utils/auth";
+
export default {
name: "ConfirmationDetail",
components: {
@@ -347,21 +422,39 @@
relativeidcardno: "",
relativephone: "",
relativeRemark: "",
- assessannex: "" // JSON瀛楃涓插瓨鍌ㄦ墍鏈夐檮浠�
+ assessannex: "", // JSON瀛楃涓插瓨鍌ㄦ墍鏈夐檮浠�
+ otherFamilyMembers: "" // 鉁� 鏂板
},
+ uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+ headers: {
+ Authorization: "Bearer " + getToken()
+ },
+ // 鍏朵粬瀹跺睘琛ㄦ牸鏁版嵁
+ otherFamilyList: [],
+
+ // 褰撳墠缂栬緫鐨勫叾浠栧灞烇紙寮圭獥鐢級
+ currentOtherFamily: {
+ name: "",
+ relation: "",
+ phone: ""
+ },
+
+ // 鏄惁缂栬緫妯″紡锛堝叾浠栧灞烇級
+ isEditOtherFamily: false,
+ editOtherFamilyIndex: -1,
+
+ // 鍏朵粬瀹跺睘寮圭獥
+ otherFamilyDialogVisible: false,
organdecision: [],
organdecisionOther: "",
organselection: [
"鑲濊剰",
- "鍙岃偩",
- "宸﹁偩",
- "鍙宠偩",
+ "鑲捐剰",
"蹇冭剰",
"鑲鸿剰",
"鑳拌吅",
"灏忚偁",
- "鍙岀溂缁勭粐",
- "閬椾綋",
+ "鐪艰鑶�",
"鍏朵粬"
],
// 鍔犺浇鐘舵��
@@ -454,7 +547,17 @@
} else {
detailData = response;
}
-
+ // 澶勭悊鍏朵粬瀹跺睘鏁版嵁
+ if (detailData.otherFamilyMembers) {
+ try {
+ this.otherFamilyList =
+ typeof detailData.otherFamilyMembers === "string"
+ ? JSON.parse(detailData.otherFamilyMembers)
+ : detailData.otherFamilyMembers || [];
+ } catch (e) {
+ this.otherFamilyList = [];
+ }
+ }
// 鏄犲皠瀛楁鍒拌〃鍗�
this.form = {
...this.form,
@@ -586,55 +689,40 @@
this.tempFileList = fileList;
},
- // 鑷畾涔変笂浼犺姹�
- handleHttpRequest(options) {
- return new Promise((resolve, reject) => {
- this.uploadLoading = true;
+ handleUploadSuccess(response, file) {
+ if (response.code !== 200) {
+ this.$message.error(response.msg || "涓婁紶澶辫触");
+ return;
+ }
- // 妯℃嫙涓婁紶杩囩▼
- setTimeout(() => {
- const newAttachment = {
- id: Date.now(),
- fileName: options.file.name,
- fileUrl: URL.createObjectURL(options.file),
- fileSize: options.file.size,
- fileType: this.getFileExtension(options.file.name),
- type: this.currentUploadType, // 璁板綍闄勪欢绫诲瀷
- uploadTime: new Date().toISOString(),
- uploader: "褰撳墠鐢ㄦ埛"
- };
+ const newAttachment = {
+ id: Date.now(),
+ fileName: file.name,
+ fileUrl: response.url,
+ fileSize: file.size,
+ fileType: this.getFileExtension(file.name),
+ type: this.currentUploadType,
+ uploadTime: this.getCurrentTime(),
+ uploader: "褰撳墠鐢ㄦ埛"
+ };
- // 娣诲姞鍒板搴旂被鍨嬬殑闄勪欢鍒楄〃
- if (this.attachmentData[this.currentUploadType]) {
- this.attachmentData[this.currentUploadType].push(newAttachment);
- }
+ this.attachmentData[this.currentUploadType].push(newAttachment);
+ this.updateAssessannexField();
- this.uploadLoading = false;
- this.updateAssessannexField(); // 鏇存柊瀛樺偍瀛楁
- resolve({ code: 200, data: newAttachment });
- }, 1500);
- });
+ this.$message.success("涓婁紶鎴愬姛");
+ this.uploadLoading = false;
+ this.uploadDialogVisible = false;
+ this.tempFileList = [];
},
- // 鎻愪氦涓婁紶
- async submitUpload() {
+ submitUpload() {
if (this.tempFileList.length === 0) {
this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
return;
}
- try {
- for (const file of this.tempFileList) {
- await this.$refs.uploadRef.submit();
- }
-
- this.$message.success("鏂囦欢涓婁紶鎴愬姛");
- this.uploadDialogVisible = false;
- this.tempFileList = [];
- } catch (error) {
- this.$message.error("鏂囦欢涓婁紶澶辫触");
- console.error("涓婁紶澶辫触:", error);
- }
+ this.uploadLoading = true;
+ this.$refs.uploadRef.submit(); // 鉁� 鍙皟鐢ㄤ竴娆�
},
// 鍒犻櫎闄勪欢
@@ -653,7 +741,51 @@
})
.catch(() => {});
},
+ openOtherFamilyDialog(index) {
+ this.isEditOtherFamily = typeof index === "number";
+ this.editOtherFamilyIndex = index || -1;
+ this.currentOtherFamily = this.isEditOtherFamily
+ ? { ...this.otherFamilyList[index] }
+ : { name: "", relation: "", phone: "" };
+
+ this.otherFamilyDialogVisible = true;
+ },
+ editOtherFamily(index) {
+ this.openOtherFamilyDialog(index);
+ },
+ deleteOtherFamily(index) {
+ this.$confirm("纭鍒犻櫎璇ュ灞烇紵", "鎻愮ず", { type: "warning" }).then(
+ () => {
+ this.otherFamilyList.splice(index, 1);
+ this.updateOtherFamilyField();
+ }
+ );
+ },
+ saveOtherFamily() {
+ if (
+ !this.currentOtherFamily.name ||
+ !this.currentOtherFamily.relation ||
+ !this.currentOtherFamily.phone
+ ) {
+ this.$message.warning("璇峰~鍐欏畬鏁翠俊鎭�");
+ return;
+ }
+
+ if (this.isEditOtherFamily) {
+ this.otherFamilyList.splice(this.editOtherFamilyIndex, 1, {
+ ...this.currentOtherFamily
+ });
+ } else {
+ this.otherFamilyList.push({ ...this.currentOtherFamily });
+ }
+
+ this.updateOtherFamilyField();
+ this.otherFamilyDialogVisible = false;
+ },
+ updateOtherFamilyField() {
+ this.form.otherFamilyMembers = JSON.stringify(this.otherFamilyList);
+ },
// 鏇存柊assessannex瀛樺偍瀛楁
updateAssessannexField() {
// 灏嗘墍鏈夌被鍨嬬殑闄勪欢鍚堝苟涓轰竴涓暟缁�
@@ -784,9 +916,8 @@
await this.$refs.form.validate();
this.saveLoading = true;
- // 纭繚闄勪欢鏁版嵁鏄渶鏂扮殑
+ this.updateOtherFamilyField();
this.updateAssessannexField();
-
const saveData = {
...this.form,
infoid: this.infoid,
diff --git a/src/views/business/allocation/allocationInfo.vue b/src/views/business/allocation/allocationInfo.vue
index c2106f3..c78d505 100644
--- a/src/views/business/allocation/allocationInfo.vue
+++ b/src/views/business/allocation/allocationInfo.vue
@@ -52,7 +52,7 @@
<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>
@@ -122,6 +122,7 @@
v-model="otherOrganInput"
placeholder="璇疯緭鍏ュ叾浠栧櫒瀹樺悕绉�"
style="margin-top: 10px; width: 300px;"
+ :disabled="form.allocationStatus == '1'"
/>
</el-form-item>
</el-col>
@@ -137,6 +138,33 @@
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-tag
+ :type="
+ getAllocationStatusTagType(scope.row.allocationstatus)
+ "
+ size="small"
+ >
+ {{ getAllocationStatusText(scope.row.allocationstatus) }}
+ </el-tag>
+ </template>
+ </el-table-column>
+
<el-table-column
label="鍣ㄥ畼鍚嶇О"
align="center"
@@ -162,13 +190,16 @@
<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="鍒嗛厤鎺ユ敹鏃堕棿"
+ label="鍒嗛厤寮�濮嬫椂闂�"
align="center"
width="180"
prop="applicanttime"
@@ -181,8 +212,33 @@
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'"
+ :disabled="
+ form.allocationStatus == '1' ||
+ scope.row.allocationstatus == '3'
+ "
/>
</template>
</el-table-column>
@@ -197,7 +253,10 @@
<el-input
v-model="scope.row.name"
placeholder="鍙椾綋濮撴皬"
- :disabled="form.allocationStatus == '1'"
+ :disabled="
+ form.allocationStatus == '1' ||
+ scope.row.allocationstatus == '3'
+ "
/>
</template>
</el-table-column>
@@ -216,11 +275,16 @@
:dataList="dataList"
v-model="scope.row.transplanthospitalno"
style="width: 100%"
+ :disabled="
+ form.allocationStatus == '1' ||
+ scope.row.allocationstatus == '3'
+ "
/>
</div>
</template>
</el-table-column>
+ <!-- 淇敼template涓殑璇存槑鍒� -->
<el-table-column
label="璇存槑"
align="center"
@@ -228,13 +292,51 @@
min-width="200"
>
<template slot-scope="scope">
- <el-input
- type="textarea"
- clearable
- v-model="scope.row.reallocationreason"
- placeholder="璇疯緭鍏ヨ鏄�"
- :disabled="form.allocationStatus == '1'"
- />
+ <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-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>
@@ -244,6 +346,7 @@
width="120"
class-name="small-padding fixed-width"
v-if="form.allocationStatus !== '1'"
+ fixed="right"
>
<template slot-scope="scope">
<el-button
@@ -251,9 +354,16 @@
type="text"
icon="el-icon-copy-document"
@click="handleRedistribution(scope.row)"
- :disabled="!scope.row.caseno"
+ :disabled="
+ scope.row.allocationstatus == '3' || !scope.row.caseno
+ "
+ style="color: #e6a23c;"
>
- 閲嶅垎閰�
+ {{
+ scope.row.allocationstatus == "3"
+ ? "宸查噸鍒嗛厤"
+ : "閲嶅垎閰�"
+ }}
</el-button>
</template>
</el-table-column>
@@ -281,8 +391,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,26 +403,8 @@
</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>
@@ -324,28 +416,6 @@
</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>
<!-- 闄勪欢绠$悊閮ㄥ垎浼樺寲 -->
@@ -436,12 +506,18 @@
title="鍣ㄥ畼閲嶅垎閰�"
:visible.sync="redistributionDialogVisible"
width="500px"
+ @close="handleRedistributionDialogClose"
>
- <el-form :model="redistributionForm" label-width="100px">
+ <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-form-item label="閲嶅垎閰嶅師鍥�" prop="reason" required>
<el-input
type="textarea"
:rows="4"
@@ -449,15 +525,170 @@
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="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="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"
@@ -499,7 +730,10 @@
data() {
return {
caseId: null,
-
+ // 閲嶅垎閰嶈鎯呯浉鍏�
+ redistributionDetailDialogVisible: false,
+ redistributionDetailLoading: false,
+ currentRedistributionDetail: null,
// 琛ㄥ崟鏁版嵁
form: {
id: undefined,
@@ -538,9 +772,19 @@
},
// 鍒嗛厤璁板綍楠岃瘉瑙勫垯
allocationRules: {},
+ // 閲嶅垎閰嶉獙璇佽鍒�
+ redistributionRules: {
+ reason: [
+ { required: true, message: "閲嶅垎閰嶅師鍥犱笉鑳戒负绌�", trigger: "blur" }
+ ],
+ redistributionTime: [
+ { required: true, message: "閲嶅垎閰嶆椂闂翠笉鑳戒负绌�", trigger: "blur" }
+ ]
+ },
// 淇濆瓨鍔犺浇鐘舵��
saveLoading: false,
confirmLoading: false,
+ redistributionLoading: false,
// 鍔犺浇鐘舵��
loading: false,
// 閫変腑鐨勫櫒瀹橈紙瀛樺偍瀛楀吀value锛�
@@ -564,8 +808,11 @@
redistributionDialogVisible: false,
redistributionForm: {
organname: "",
- reason: ""
+ reason: "",
+ redistributionTime: ""
},
+ redistributionAttachmentList: [],
+ redistributionFormRef: null,
currentRedistributeRecord: null,
// 鏂囦欢棰勮鐩稿叧
filePreviewVisible: false,
@@ -585,8 +832,23 @@
record =>
!record.caseno ||
!record.applicanttime ||
+ !record.organgettime ||
!record.name ||
!record.transplanthospitalno
+ ).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;
},
// 鍞竴鍖婚櫌鏁伴噺
@@ -604,6 +866,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: {
@@ -639,6 +910,100 @@
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 : "鏈煡鐘舵��";
+ },
+
+ // 鏌ョ湅閲嶅垎閰嶈鎯�
+ 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);
@@ -671,6 +1036,7 @@
this.getHospitalData();
},
+
// 鐢熸垚鎹愮尞鑰呯紪鍙�
generateDonorNo() {
const timestamp = Date.now().toString();
@@ -692,10 +1058,10 @@
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) {
@@ -719,7 +1085,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
+ };
+ })
: [];
// 鏇存柊閫変腑鐨勫櫒瀹�
@@ -767,6 +1156,7 @@
this.loading = false;
}
},
+
// 鑾峰彇鍖婚櫌鏁版嵁
async getHospitalData() {
try {
@@ -784,6 +1174,7 @@
this.$message.error("鑾峰彇鍖婚櫌鏁版嵁澶辫触");
}
},
+
// 鍣ㄥ畼閫夋嫨鐘舵�佸彉鍖�
handleOrganSelectionChange(selectedValues) {
if (!this.allocationData.serviceDonateorganList) {
@@ -884,10 +1275,13 @@
organno: organValue,
caseno: "",
applicanttime: "",
+ organgettime: "",
name: "",
transplanthospitalno: "",
transplantHospitalName: "",
reallocationreason: "",
+ allocationstatus: "0", // 榛樿鎻愪氦鍒嗛厤鐘舵��
+ redistributionInfo: null,
organState: 1
});
},
@@ -901,38 +1295,184 @@
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;
- }
- if (this.currentRedistributeRecord) {
- this.currentRedistributeRecord.reallocationreason = this.redistributionForm.reason;
- this.$message.success("閲嶅垎閰嶅師鍥犲凡鏇存柊");
- this.redistributionDialogVisible = false;
+ // 閲嶅垎閰嶅璇濇鍏抽棴
+ 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 (
+ if (row.allocationstatus == "3") {
+ return "redistributed-row"; // 閲嶅垎閰嶈褰曟牱寮�
+ } else if (
!row.caseno ||
!row.applicanttime ||
+ !row.organgettime ||
!row.name ||
!row.transplanthospitalno
) {
- return "warning-row";
+ return "warning-row"; // 淇℃伅涓嶅畬鏁存牱寮�
+ } else if (row.allocationstatus == "0") {
+ return "pending-row"; // 寰呭鏍告牱寮�
}
return "";
},
+
// 鏋勫缓 filePatch 瀛楁
buildFilePatch() {
if (!this.attachments || this.attachments.length == 0) {
@@ -940,6 +1480,7 @@
}
return JSON.stringify(this.attachments);
},
+
// 淇濆瓨鍩烘湰淇℃伅
async handleSave() {
this.$refs.form.validate(async valid => {
@@ -955,17 +1496,26 @@
serviceDonateorganList:
this.allocationData.serviceDonateorganList || []
};
- if (
- submitData.allocationStatus == 1 ||
- !submitData.allocationStatus
- ) {
- submitData.allocationStatus = 2;
- }
- 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 || "";
+ }
});
+
+ 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);
@@ -973,9 +1523,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 || "鏈煡閿欒"));
@@ -988,38 +1535,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) {
@@ -1075,6 +1591,9 @@
/** 闄勪欢鍙樺寲澶勭悊 */
handleAttachmentChange(fileList) {
this.attachmentFileList = fileList;
+ },
+ handleRedistributionChange(fileList) {
+ this.redistributionAttachmentList = fileList;
},
/** 闄勪欢绉婚櫎澶勭悊 */
@@ -1132,9 +1651,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;
@@ -1213,6 +1732,8 @@
/** 鑾峰彇鏂囦欢鎵╁睍鍚� */
getFileExtension(filename) {
+ console.log(filename, "filename");
+
return filename
.split(".")
.pop()
@@ -1342,7 +1863,46 @@
font-size: 20px;
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;
@@ -1350,15 +1910,23 @@
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;
}
@@ -1367,6 +1935,42 @@
background-color: #ffecc2;
}
+:deep(.pending-row) {
+ background-color: #f0f9ff;
+}
+
+:deep(.pending-row:hover) {
+ background-color: #e0f2ff;
+}
+
+/* 绂佺敤鐘舵�佺殑杈撳叆妗嗘牱寮� */
+: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;
+}
+
+/* 閲嶅垎閰嶆寜閽牱寮� */
+:deep(.el-button--text.is-disabled) {
+ color: #c0c4cc !important;
+ cursor: not-allowed;
+}
+
+/* 閲嶅垎閰嶄俊鎭彁绀烘鏍峰紡 */
+:deep(.el-tooltip__popper) {
+ max-width: 300px;
+ white-space: pre-line;
+ line-height: 1.6;
+}
+
/* 鍝嶅簲寮忚璁� */
@media (max-width: 768px) {
.organ-allocation-detail {
diff --git a/src/views/business/appear/caseDetail.vue b/src/views/business/appear/caseDetail.vue
index 3b27c8b..58eb5c6 100644
--- a/src/views/business/appear/caseDetail.vue
+++ b/src/views/business/appear/caseDetail.vue
@@ -117,7 +117,13 @@
<span class="section-title">鍖婚櫌淇℃伅</span>
</div>
<el-descriptions :column="2" border>
- <el-descriptions-item label="娌荤枟鍖婚櫌鍚嶇О">{{
+ <el-descriptions-item label="ICU璇勪及鍖荤敓">{{
+ caseData.icuDoctor || "-"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="ICU鍖荤敓鐢佃瘽">{{
+ caseData.icuDoctorPhone || "-"
+ }}</el-descriptions-item
+ ><el-descriptions-item label="娌荤枟鍖婚櫌鍚嶇О">{{
caseData.treatmenthospitalname || "-"
}}</el-descriptions-item>
<!-- <el-descriptions-item label="娌荤枟绉戝鍚嶇О">{{
diff --git a/src/views/business/appear/index.vue b/src/views/business/appear/index.vue
index a1ee5cc..68194a3 100644
--- a/src/views/business/appear/index.vue
+++ b/src/views/business/appear/index.vue
@@ -715,7 +715,24 @@
></i>
<span>鍖婚櫌淇℃伅</span>
</div>
-
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="ICU璇勪及鍖荤敓" prop="icuDoctor">
+ <el-input
+ v-model="editForm.icuDoctor"
+ placeholder="璇疯緭鍏CU璇勪及鍖荤敓"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="ICU鍖荤敓鐢佃瘽" prop="icuDoctorPhone">
+ <el-input
+ v-model="editForm.icuDoctorPhone"
+ placeholder="璇疯緭鍏CU鍖荤敓鎵嬫満鍙�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="娌荤枟鍖婚櫌" prop="treatmenthospitalname">
@@ -998,7 +1015,15 @@
FilePreviewDialog
},
dicts: ["sys_user_sex", "sys_BloodType", "sys_Infectious", "sys_IDType"],
+
data() {
+ const validateConfirmResult = (rule, value, callback) => {
+ if (this.approveForm.approveResult === "4" && !value) {
+ callback(new Error("椹冲洖鏃跺繀椤诲~鍐欓┏鍥炴剰瑙�"));
+ } else {
+ callback();
+ }
+ };
return {
// 閬僵灞�
loading: false,
@@ -1048,9 +1073,7 @@
approveResult: [
{ required: true, message: "璇烽�夋嫨纭缁撴灉", trigger: "change" }
],
- confirmResult: [
- { required: true, message: "璇疯緭鍏ョ‘璁ゆ剰瑙�", trigger: "blur" }
- ],
+ confirmResult: [{ validator: validateConfirmResult, trigger: "blur" }],
rejectType: {
required: false,
validator: (rule, value, callback) => {
@@ -1219,7 +1242,7 @@
}
return "鏈夎浆杩愬崟";
}
- return "闇�杞繍";
+ return "鏈煡";
},
/** 璺宠浆鍒板垱寤鸿浆杩愬崟椤甸潰 */
diff --git a/src/views/business/course/components/DeathJudgmentStage.vue b/src/views/business/course/components/DeathJudgmentStage.vue
index b64306c..8550177 100644
--- a/src/views/business/course/components/DeathJudgmentStage.vue
+++ b/src/views/business/course/components/DeathJudgmentStage.vue
@@ -23,7 +23,7 @@
</el-tab-pane>
</el-tabs>
</el-card>
- <el-card class="detail-card common-info-card">
+ <!-- <el-card class="detail-card common-info-card">
<div slot="header" class="clearfix">
<span class="detail-title">鍏叡淇℃伅</span>
</div>
@@ -71,7 +71,7 @@
</el-col>
</el-row>
</el-form>
- </el-card>
+ </el-card> -->
<!-- 鑴戞浜″垽瀹氭ā鍧� -->
<el-card v-if="activeJudgmentType === 'brain'" class="detail-card">
<div slot="header" class="clearfix">
diff --git a/src/views/business/course/components/DonationConfirmStage.vue b/src/views/business/course/components/DonationConfirmStage.vue
index 044817c..7d55c4d 100644
--- a/src/views/business/course/components/DonationConfirmStage.vue
+++ b/src/views/business/course/components/DonationConfirmStage.vue
@@ -79,10 +79,10 @@
</el-form-item>
</el-col>
<el-col :span="6">
- <el-form-item label="涓庢崘璧犺�呭叧绯�" prop="signfamilyrelations">
+ <el-form-item label="涓庢崘鐚�呭叧绯�" prop="signfamilyrelations">
<el-select
v-model="form.signfamilyrelations"
- placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+ placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
>
<el-option
v-for="dict in dict.type.sys_FamilyRelation || []"
diff --git a/src/views/business/course/components/EthicalReviewStage.vue b/src/views/business/course/components/EthicalReviewStage.vue
index 7b874b4..3192819 100644
--- a/src/views/business/course/components/EthicalReviewStage.vue
+++ b/src/views/business/course/components/EthicalReviewStage.vue
@@ -758,7 +758,7 @@
<script>
import { getToken } from "@/utils/auth";
import {
- reviewinitiateBaseInfoList,
+ ethicalreviewgetInfoID,
ethicalreviewedit,
ethicalreviewadd,
ethicalreviewInfo,
@@ -1106,7 +1106,7 @@
if (id) {
response = await ethicalreviewInfo(id);
} else if (infoid) {
- response = await reviewinitiateBaseInfoList({ infoid: infoid });
+ response = await ethicalreviewgetInfoID({ InfoId: infoid });
}
if (response.code === 200) {
@@ -1123,7 +1123,7 @@
this.$set(this.form, "ethicalreviewopinionsList", []);
}
} else if (response.data && infoid) {
- this.form = response.data[0];
+ this.form = response.data;
// 瑙f瀽 filePatch 瀛楁
this.parseFilePatch(this.form.filePatch);
this.initAttachmentFileList();
diff --git a/src/views/business/course/components/OrganAllocationStage.vue b/src/views/business/course/components/OrganAllocationStage.vue
index 41cbcf9..72caae8 100644
--- a/src/views/business/course/components/OrganAllocationStage.vue
+++ b/src/views/business/course/components/OrganAllocationStage.vue
@@ -688,7 +688,7 @@
// 鑾峰彇璇︽儏
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) {
diff --git a/src/views/business/course/components/components/BloodRoutinePanel.vue b/src/views/business/course/components/components/BloodRoutinePanel.vue
index a43e2fd..d8aed02 100644
--- a/src/views/business/course/components/components/BloodRoutinePanel.vue
+++ b/src/views/business/course/components/components/BloodRoutinePanel.vue
@@ -29,7 +29,7 @@
border
style="width: 100%"
class="medical-table"
- v-fit-columns
+
:key="tableKey"
@header-dragend="handleHeaderDragEnd"
v-loading="tableLoading"
diff --git a/src/views/business/course/components/components/LiverKidneyPanel.vue b/src/views/business/course/components/components/LiverKidneyPanel.vue
index a485fed..fcd83bf 100644
--- a/src/views/business/course/components/components/LiverKidneyPanel.vue
+++ b/src/views/business/course/components/components/LiverKidneyPanel.vue
@@ -19,7 +19,7 @@
style="width: 100%"
class="medical-table"
:key="tableKey"
- v-fit-columns
+
@header-dragend="handleHeaderDragEnd"
>
<el-table-column
diff --git a/src/views/business/course/components/components/UrineRoutinePanel.vue b/src/views/business/course/components/components/UrineRoutinePanel.vue
index 4d62072..e5c5d49 100644
--- a/src/views/business/course/components/components/UrineRoutinePanel.vue
+++ b/src/views/business/course/components/components/UrineRoutinePanel.vue
@@ -29,7 +29,7 @@
border
style="width: 100%"
class="medical-table"
- v-fit-columns
+
:key="tableKey"
@header-dragend="handleHeaderDragEnd"
v-loading="tableLoading"
diff --git a/src/views/business/course/index.vue b/src/views/business/course/index.vue
index dcbb645..02501b3 100644
--- a/src/views/business/course/index.vue
+++ b/src/views/business/course/index.vue
@@ -2,13 +2,10 @@
<div class="donation-process-detail">
<el-card class="process-card">
<div class="process-container">
- <!-- 宸︿晶鏃堕棿绾� - 鐙珛鍥哄畾锛屽唴閮ㄥ彲婊氬姩 -->
+ <!-- 宸︿晶鏃堕棿绾� -->
<div class="timeline-section">
<div class="section-header">
<h3>鎹愮尞杩涚▼鏃堕棿绾�</h3>
- <el-tag :type="getOverallStatusTag(caseInfo.status)">
- {{ getStatusText(caseInfo.status) }}
- </el-tag>
</div>
<div class="timeline-scroll-container">
@@ -18,20 +15,20 @@
:key="stage.key"
class="timeline-item"
:class="{
- active: activeStage === stage.key,
- completed: stage.status === 'completed',
- 'in-progress': stage.status === 'in_progress',
- pending: stage.status === 'pending'
+ active: stage.status == 'active',
+ completed: stage.status == 'completed',
+ progress: stage.status == 'progress',
+ pending: stage.status == 'pending'
}"
@click="handleStageClick(stage)"
>
<div class="timeline-marker">
<i
- v-if="stage.status === 'completed'"
+ v-if="stage.status == 'completed'"
class="el-icon-check"
></i>
<i
- v-else-if="stage.status === 'in_progress'"
+ v-else-if="stage.status == 'progress'"
class="el-icon-loading"
></i>
<i v-else class="el-icon-time"></i>
@@ -40,25 +37,21 @@
<div class="timeline-content">
<div class="stage-header">
<span class="stage-name">{{ stage.name }}</span>
- <el-tag
- size="small"
- :type="getStageStatusTag(stage.status)"
- >
- {{ getStageStatusText(stage.status) }}
- </el-tag>
+ <dict-tag
+ :options="dict.type[stage.dict]"
+ :value="stage.state"
+ />
</div>
<div class="stage-info">
- <div v-if="stage.completeTime" class="time-info">
- <span
- >瀹屾垚鏃堕棿: {{ formatTime(stage.completeTime) }}</span
- >
+ <div v-if="stage.createtime" class="time-info">
+ 鍒涘缓鏃堕棿: {{ formatTime(stage.createtime) }}
</div>
<div v-if="stage.updateTime" class="time-info">
- <span>鏈�杩戞洿鏂�: {{ formatTime(stage.updateTime) }}</span>
+ 鏈�杩戞洿鏂�: {{ formatTime(stage.updateTime) }}
</div>
<div v-if="stage.operator" class="operator-info">
- <span>璐熻矗浜�: {{ stage.operator }}</span>
+ 璐熻矗浜�: {{ stage.operator }}
</div>
</div>
</div>
@@ -67,19 +60,15 @@
</div>
</div>
- <!-- 鍙充晶鍐呭鍖哄煙 - 鐙珛婊氬姩 -->
+ <!-- 鍙充晶鍐呭 -->
<div class="content-section">
- <!-- 妗堜緥鍩烘湰淇℃伅 - 鍥哄畾楂樺害锛屽彲婊氬姩 -->
<case-basic-info :case-id="caseId" :show-attachment="true" />
- <!-- 闃舵璇︽儏鍐呭 - 鑷�傚簲楂樺害锛屽彲婊氬姩 -->
<div class="stage-detail-section">
<div class="section-header">
<h3>{{ activeStageName }} - 闃舵璇︽儏</h3>
- <div class="stage-actions"></div>
</div>
- <!-- 鍔ㄦ�侀樁娈靛唴瀹� -->
<div class="stage-content-wrapper">
<component
:is="getStageComponent()"
@@ -96,135 +85,178 @@
</template>
<script>
+// ===================== 瀛楀吀 Label 鈫� UI 涓婚 =====================
+function mapDictLabelToTheme(label) {
+ if (!label) return "pending";
+
+ const l = label.trim();
+
+ // 寰� XX
+ if (/^寰�/.test(l)) {
+ return "progress";
+ }
+
+ // XX涓�
+ if (/涓�$/.test(l)) {
+ return "active";
+ }
+
+ // 瀹屾垚 / 瀹屾垚XX
+ if (/瀹屾垚/.test(l)) {
+ return "completed";
+ }
+
+ // 寮冪敤 / 鏀惧純
+ if (/寮冪敤|鏀惧純/.test(l)) {
+ return "danger";
+ }
+
+ return "pending";
+}
import { getDonatebaseinfoflow } from "@/api/project/donatebaseinfo";
-import { getDonationProcessDetail } from "./donationProcess";
+import CaseBasicInfo from "@/components/CaseBasicInfo";
+
import DonorMaintenanceStage from "./components/DonorMaintenanceStage";
-import MedicalAssessmentStage from "./components/MedicalAssessmentStage";
import DeathJudgmentStage from "./components/DeathJudgmentStage";
+import MedicalAssessmentStage from "./components/MedicalAssessmentStage";
import DonationConfirmStage from "./components/DonationConfirmStage";
import EthicalReviewStage from "./components/EthicalReviewStage";
import OrganAllocationStage from "./components/OrganAllocationStage";
import OrganProcurementStage from "./components/OrganProcurementStage";
import OrganUtilizationStage from "./components/OrganUtilizationStage";
-import CaseBasicInfo from "@/components/CaseBasicInfo";
import dayjs from "dayjs";
+
+// ============== 瀛楀吀鏄犲皠锛堜綘鍚庨潰鑷繁鏀癸級 ==============
+const STAGE_DICT_MAP = {
+ donatemaintenance: "maintain_type",
+ deathinfo: "decide_type",
+ medicalevaluation: "state_Evaluation",
+ relativesconfirmation: "affirm_type",
+ donateflowcharts: "sys_ethical",
+ donateorgansService: "allocation_Status",
+ donationwitness: "Obtain_status",
+ donatecompletioninfo: "utilize_statue"
+};
+
+// state -> 娴佺▼鐘舵��
+const STATE_MAP = {
+ 0: "pending",
+ 1: "progress",
+ 2: "completed",
+ 3: "terminated"
+};
+
+// 闃舵閰嶇疆
+const STAGE_CONFIG = [
+ { key: "donor_maintenance", name: "渚涜�呯淮鎶�", apiKey: "donatemaintenance" },
+ { key: "death_judgment", name: "姝讳骸鍒ゅ畾", apiKey: "deathinfo" },
+ { key: "medical_assessment", name: "鍖诲璇勪及", apiKey: "medicalevaluation" },
+ {
+ key: "donation_confirm",
+ name: "鎹愮尞纭",
+ apiKey: "relativesconfirmation"
+ },
+ { key: "ethical_review", name: "浼︾悊瀹℃煡", apiKey: "donateflowcharts" },
+ { key: "organ_allocation", name: "鍣ㄥ畼鍒嗛厤", apiKey: "donateorgansService" },
+ { key: "organ_procurement", name: "鍣ㄥ畼鑾峰彇", apiKey: "donationwitness" },
+ { key: "organ_utilization", name: "鍣ㄥ畼鍒╃敤", apiKey: "donatecompletioninfo" }
+];
export default {
name: "DonationProcessDetail",
components: {
+ CaseBasicInfo,
DonorMaintenanceStage,
- MedicalAssessmentStage,
DeathJudgmentStage,
+ MedicalAssessmentStage,
DonationConfirmStage,
EthicalReviewStage,
OrganAllocationStage,
OrganProcurementStage,
- OrganUtilizationStage,
- CaseBasicInfo
+ OrganUtilizationStage
},
- dicts: ["sys_user_sex", "sys_BloodType", "sys_0_1"],
+ dicts: [
+ "decide_type",
+ "maintain_type",
+ "state_Evaluation",
+ "affirm_type",
+ "sys_ethical",
+ "allocation_Status",
+ "Obtain_status",
+ "utilize_statue"
+ ], // 杩欓噷鍙0鏄庝竴涓嵆鍙紝鍏朵綑閫氳繃 dict.type[xxx] 浣跨敤
data() {
return {
caseId: null,
- infoid: null,
- caseInfo: {
- id: "",
- caseNo: "",
- hospitalNo: "",
- donorName: "",
- gender: "",
- age: "",
- bloodType: "",
- diagnosis: "",
- status: "in_progress",
- createTime: "",
- registrant: "",
- currentStage: "donor_maintenance"
- },
- processStages: [
- {
- key: "donor_maintenance",
- name: "渚涜�呯淮鎶�",
- status: "completed",
- completeTime: "2025-12-01 10:00:00",
- updateTime: "2025-12-01 10:00:00",
- operator: "寮犲尰鐢�"
- },
- {
- key: "death_judgment",
- name: "姝讳骸鍒ゅ畾",
- status: "completed",
- completeTime: "2025-12-02 14:30:00",
- updateTime: "2025-12-02 14:30:00",
- operator: "鐜嬪尰鐢�"
- },
- {
- key: "medical_assessment",
- name: "鍖诲璇勪及",
- status: "completed",
-
- completeTime: "2025-12-03 09:15:00",
- updateTime: "2025-12-03 09:15:00",
- operator: "鏉庝富浠�"
- },
- {
- key: "donation_confirm",
- name: "鎹愮尞纭",
- status: "completed",
- completeTime: "2025-12-03 11:00:00",
- updateTime: "2025-12-03 11:00:00",
- operator: "璧靛崗璋冨憳"
- },
- {
- key: "ethical_review",
- name: "浼︾悊瀹℃煡",
- status: "completed",
- completeTime: "2025-12-03 15:20:00",
- updateTime: "2025-12-03 15:20:00",
- operator: "浼︾悊濮斿憳浼�"
- },
- {
- key: "organ_allocation",
- name: "鍣ㄥ畼鍒嗛厤",
- status: "in_progress",
- updateTime: "2025-12-04 10:00:00",
- operator: "鍒嗛厤绯荤粺"
- },
- {
- key: "organ_procurement",
- name: "鍣ㄥ畼鑾峰彇",
- status: "in_progress",
- operator: "寰呭垎閰�"
- },
- {
- key: "organ_utilization",
- name: "鍣ㄥ畼鍒╃敤",
- status: "in_progress",
- operator: "寰呭垎閰�"
- }
- ],
- activeStage: "organ_allocation",
- activeStageName: "鍣ㄥ畼鍒嗛厤",
- activeStageData: {},
- loading: false
+ caseInfo: {},
+ processStages: [],
+ activeStage: "",
+ activeStageName: "",
+ activeStageData: {}
};
},
- computed: {},
created() {
this.caseId = this.$route.query.id;
- this.infoid = this.$route.query.id;
-
if (this.caseId) {
this.getDetail();
- } else {
- this.generateMockData();
}
- this.setActiveStage(this.activeStage);
},
methods: {
+ async getDetail() {
+ try {
+ const res = await getDonatebaseinfoflow(this.caseId);
+
+ const data = res;
+
+ this.caseInfo = data.donatebaseinfo || {};
+
+ this.processStages = STAGE_CONFIG.map(stage => {
+ const obj = data[stage.apiKey] || {};
+ console.log(stage.apiKey, "stage.apiKey");
+ console.log(this.dict?.type?.[STAGE_DICT_MAP[stage.apiKey]]);
+
+ const dictLabel =
+ this.dict?.type?.[STAGE_DICT_MAP[stage.apiKey]]?.find(
+ d => d.value == obj.state
+ )?.label || "";
+
+ const theme = mapDictLabelToTheme(dictLabel);
+
+ return {
+ key: stage.key,
+ name: stage.name,
+ dict: STAGE_DICT_MAP[stage.apiKey],
+ state: obj.state,
+ dictLabel,
+ status: theme, // 鉁� 鏍稿績锛歎I 涓婚鐢� dictLabel 鍐冲畾
+ createtime: obj.createtime,
+ updateTime: obj.updatetime,
+ operator: obj.updateperson || obj.createperson
+ };
+ });
+
+ const active =
+ this.processStages.find(s => s.status == "progress") ||
+ [...this.processStages].reverse().find(s => s.status == "completed");
+
+ this.setActiveStage(active?.key || STAGE_CONFIG[0].key);
+ } catch (e) {
+ console.error(e);
+ this.$message.error("鑾峰彇娴佺▼璇︽儏澶辫触");
+ }
+ },
+
+ setActiveStage(key) {
+ const stage = this.processStages.find(s => s.key == key);
+ if (!stage) return;
+ this.activeStage = key;
+ this.activeStageName = stage.name;
+ this.activeStageData = stage;
+ },
+
getStageComponent() {
- const componentMap = {
+ const map = {
donor_maintenance: "DonorMaintenanceStage",
death_judgment: "DeathJudgmentStage",
medical_assessment: "MedicalAssessmentStage",
@@ -234,169 +266,19 @@
organ_procurement: "OrganProcurementStage",
organ_utilization: "OrganUtilizationStage"
};
- return componentMap[this.activeStage];
+ return map[this.activeStage];
},
- // 鑾峰彇璇︽儏鏁版嵁
- async getDetail() {
- this.loading = true;
- try {
- const response = await getDonatebaseinfoflow(this.caseId);
- if (response.code === 200) {
- this.caseInfo = response.data.caseInfo;
- this.processStages = response.data.processStages;
- this.setActiveStage(response.data.currentStage);
- }
- } catch (error) {
- console.error("鑾峰彇鎹愮尞杩涚▼璇︽儏澶辫触:", error);
- this.$message.error("鑾峰彇璇︽儏澶辫触");
- } finally {
- this.loading = false;
- }
- },
- // 鐢熸垚妯℃嫙鏁版嵁
- generateMockData() {
- this.caseInfo = {
- id: "202512001",
- caseNo: "C202512001",
- hospitalNo: "D202512001",
- donorName: "寮犱笁",
- gender: "0",
- age: 45,
- bloodType: "A",
- diagnosis: "鑴戝浼�",
- status: "in_progress",
- createTime: "2025-12-01 08:00:00",
- registrant: "鏉庡崗璋冨憳",
- currentStage: "organ_allocation"
- };
- },
- // 璁剧疆褰撳墠婵�娲婚樁娈�
- setActiveStage(stageKey) {
- this.activeStage = stageKey;
- const stage = this.processStages.find(s => s.key === stageKey);
- if (stage) {
- this.activeStageName = stage.name;
- this.activeStageData = stage;
- console.log(this.activeStageData, "this.activeStageData");
- }
- },
- // 澶勭悊闃舵鐐瑰嚮
+
handleStageClick(stage) {
- if (stage.status !== "pending") {
- this.setActiveStage(stage.key);
- } else {
- this.$message.warning("璇ラ樁娈靛皻鏈紑濮嬶紝鏃犳硶鏌ョ湅璇︽儏");
+ if (stage.status == "pending") {
+ this.$message.warning("璇ラ樁娈靛皻鏈紑濮�");
+ return;
}
+ this.setActiveStage(stage.key);
},
- // 鑾峰彇闃舵鐘舵�佹爣绛剧被鍨�
- getStageStatusTag(status) {
- const map = {
- completed: "success",
- in_progress: "warning",
- pending: "info"
- };
- return map[status] || "info";
- },
- // 鑾峰彇闃舵鐘舵�佹枃鏈�
- getStageStatusText(status) {
- const map = {
- completed: "宸插畬鎴�",
- in_progress: "杩涜涓�",
- pending: "鏈紑濮�"
- };
- return map[status] || "鏈煡";
- },
- // 鑾峰彇鏁翠綋鐘舵�佹爣绛剧被鍨�
- getOverallStatusTag(status) {
- const map = {
- completed: "success",
- in_progress: "warning",
- pending: "info",
- terminated: "danger"
- };
- return map[status] || "info";
- },
- // 鑾峰彇鏁翠綋鐘舵�佹枃鏈�
- getStatusText(status) {
- const map = {
- completed: "宸插畬鎴�",
- in_progress: "杩涜涓�",
- pending: "鏈紑濮�",
- terminated: "宸茬粓姝�"
- };
- return map[status] || "鏈煡";
- },
- // 鏃堕棿鏍煎紡鍖�
+
formatTime(time) {
- if (!time) return "-";
- return dayjs(time).format("YYYY-MM-DD HH:mm");
- },
-
- // 鑾峰彇褰撳墠闃舵鍚嶇О
- getCurrentStageName() {
- const currentStage = this.processStages.find(
- stage => stage.status === "in_progress"
- );
- return currentStage ? currentStage.name : "宸插畬鎴�";
- },
- // 缂栬緫鍩烘湰淇℃伅
- handleEditBasicInfo() {
- this.$message.info("缂栬緫鍩烘湰淇℃伅鍔熻兘");
- },
- // 瀹屾垚闃舵
- handleCompleteStage() {
- this.$confirm(`纭畾瑕佸畬鎴愩��${this.activeStageName}銆戦樁娈靛悧锛焋, "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- }).then(() => {
- // 鏇存柊褰撳墠闃舵鐘舵��
- const currentIndex = this.processStages.findIndex(
- stage => stage.key === this.activeStage
- );
-
- if (currentIndex !== -1) {
- this.processStages[currentIndex].status = "completed";
- this.processStages[
- currentIndex
- ].completeTime = new Date().toISOString();
-
- // 婵�娲讳笅涓�涓樁娈�
- if (currentIndex < this.processStages.length - 1) {
- this.processStages[currentIndex + 1].status = "in_progress";
- this.setActiveStage(this.processStages[currentIndex + 1].key);
- } else {
- this.caseInfo.status = "completed";
- }
-
- this.$message.success("闃舵宸插畬鎴�");
- }
- });
- },
- // 鏌ョ湅璇︽儏
- handleViewDetail() {
- const routeMap = {
- donor_maintenance: "/case/donorMaintenance/detail",
- death_judgment: "/case/deathJudgment/detail",
- medical_assessment: "/case/medicalAssessment/detail",
- donation_confirm: "/case/donationConfirm/detail",
- ethical_review: "/case/ethicalReview/detail",
- organ_allocation: "/case/organAllocation/detail",
- organ_procurement: "/case/organProcurement/detail",
- organ_utilization: "/case/organUtilization/detail"
- };
-
- const route = routeMap[this.activeStage];
- if (route) {
- this.$router.push({
- path: route,
- query: { id: this.caseId }
- });
- }
- },
- // 淇敼闃舵淇℃伅
- handleModifyStage() {
- this.$message.info(`淇敼${this.activeStageName}淇℃伅鍔熻兘`);
+ return time ? dayjs(time).format("YYYY-MM-DD HH:mm") : "-";
}
}
};
@@ -418,31 +300,40 @@
.process-container {
display: flex;
- min-height: 600px; /* 璁剧疆涓�涓渶灏忛珮搴� */
+ min-height: 600px;
+ /* 璁剧疆涓�涓渶灏忛珮搴� */
gap: 20px;
- align-items: flex-start; /* 椤堕儴瀵归綈 */
+ align-items: flex-start;
+ /* 椤堕儴瀵归綈 */
}
/* 宸︿晶鏃堕棿绾挎牱寮� - 鍥哄畾楂樺害锛屽唴閮ㄦ粴鍔� */
.timeline-section {
- flex: 0 0 320px; /* 鍥哄畾瀹藉害 */
+ flex: 0 0 320px;
+ /* 鍥哄畾瀹藉害 */
display: flex;
flex-direction: column;
background: white;
border-radius: 6px;
padding: 20px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
- height: calc(120vh - 120px); /* 鏍规嵁瑙嗗彛楂樺害鑷�傚簲 */
- max-height: 1200px; /* 璁剧疆鏈�澶ч珮搴� */
- position: sticky; /* 浣跨敤 sticky 瀹氫綅 */
- top: 20px; /* 璺濈椤堕儴 20px */
+ height: calc(120vh - 120px);
+ /* 鏍规嵁瑙嗗彛楂樺害鑷�傚簲 */
+ max-height: 1200px;
+ /* 璁剧疆鏈�澶ч珮搴� */
+ position: sticky;
+ /* 浣跨敤 sticky 瀹氫綅 */
+ top: 20px;
+ /* 璺濈椤堕儴 20px */
}
.timeline-scroll-container {
flex: 1;
- overflow-y: auto; /* 鍐呴儴鍙粴鍔� */
+ overflow-y: auto;
+ /* 鍐呴儴鍙粴鍔� */
margin-top: 20px;
- padding-right: 8px; /* 涓烘粴鍔ㄦ潯鐣欏嚭绌洪棿 */
+ padding-right: 8px;
+ /* 涓烘粴鍔ㄦ潯鐣欏嚭绌洪棿 */
}
.timeline-scroll-container::-webkit-scrollbar {
@@ -476,7 +367,8 @@
display: flex;
flex-direction: column;
gap: 20px;
- min-height: 0; /* 閲嶈锛氬厑璁竑lex瀛愰」鍘嬬缉 */
+ min-height: 0;
+ /* 閲嶈锛氬厑璁竑lex瀛愰」鍘嬬缉 */
}
.basic-info-section {
@@ -486,13 +378,16 @@
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
display: flex;
flex-direction: column;
- min-height: 0; /* 閲嶈 */
+ min-height: 0;
+ /* 閲嶈 */
}
.basic-info-content {
flex: 1;
- max-height: 300px; /* 鍩烘湰淇℃伅鍖哄煙鏈�澶ч珮搴� */
- overflow-y: auto; /* 鍩烘湰淇℃伅鍐呴儴鍙粴鍔� */
+ max-height: 300px;
+ /* 鍩烘湰淇℃伅鍖哄煙鏈�澶ч珮搴� */
+ overflow-y: auto;
+ /* 鍩烘湰淇℃伅鍐呴儴鍙粴鍔� */
margin-top: 20px;
padding-right: 8px;
}
@@ -520,24 +415,30 @@
}
.stage-detail-section {
- flex: 1; /* 鍗犳嵁鍓╀綑绌洪棿 */
+ flex: 1;
+ /* 鍗犳嵁鍓╀綑绌洪棿 */
background: white;
border-radius: 6px;
padding: 20px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
display: flex;
flex-direction: column;
- min-height: 400px; /* 鏈�灏忛珮搴� */
- max-height: 800px; /* 鏈�澶ч珮搴︼紝鍙牴鎹渶瑕佽皟鏁� */
- overflow: hidden; /* 闅愯棌澶栧眰婧㈠嚭 */
+ min-height: 400px;
+ /* 鏈�灏忛珮搴� */
+ max-height: 800px;
+ /* 鏈�澶ч珮搴︼紝鍙牴鎹渶瑕佽皟鏁� */
+ overflow: hidden;
+ /* 闅愯棌澶栧眰婧㈠嚭 */
}
.stage-content-wrapper {
flex: 1;
- overflow-y: auto; /* 闃舵璇︽儏鍐呴儴鍙粴鍔� */
+ overflow-y: auto;
+ /* 闃舵璇︽儏鍐呴儴鍙粴鍔� */
margin-top: 20px;
padding-right: 8px;
- min-height: 0; /* 閲嶈 */
+ min-height: 0;
+ /* 閲嶈 */
}
.stage-content-wrapper::-webkit-scrollbar {
@@ -563,7 +464,8 @@
display: flex;
justify-content: space-between;
align-items: center;
- flex-shrink: 0; /* 闃叉琚帇缂� */
+ flex-shrink: 0;
+ /* 闃叉琚帇缂� */
}
.section-header h3 {
@@ -581,14 +483,22 @@
cursor: pointer;
transition: all 0.3s ease;
border: 1px solid #e4e7ed;
- flex-shrink: 0; /* 闃叉琚帇缂� */
+ flex-shrink: 0;
+ /* 闃叉琚帇缂� */
}
.timeline-item:hover {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
transform: translateY(-1px);
}
+.timeline-item.danger {
+ border-color: #f56c6c;
+ background-color: #fef0f0;
+}
+.timeline-item.danger .timeline-marker {
+ background-color: #f56c6c;
+}
.timeline-item.active {
border-color: #409eff;
background-color: #f0f9ff;
@@ -599,7 +509,7 @@
background-color: #f0f9e8;
}
-.timeline-item.in-progress {
+.timeline-item.progress {
border-color: #e6a23c;
background-color: #fdf6ec;
}
@@ -624,8 +534,11 @@
.timeline-item.completed .timeline-marker {
background-color: #67c23a;
}
+.timeline-item.active .timeline-marker {
+ background-color: #409eff;
+}
-.timeline-item.in-progress .timeline-marker {
+.timeline-item.progress .timeline-marker {
background-color: #e6a23c;
}
@@ -684,7 +597,8 @@
width: 100%;
height: auto;
max-height: 300px;
- position: static; /* 灏忓睆骞曞彇娑� sticky */
+ position: static;
+ /* 灏忓睆骞曞彇娑� sticky */
}
.timeline-scroll-container {
diff --git a/src/views/business/decide/DecideInfo.vue b/src/views/business/decide/DecideInfo.vue
index 0e262e8..894015e 100644
--- a/src/views/business/decide/DecideInfo.vue
+++ b/src/views/business/decide/DecideInfo.vue
@@ -24,7 +24,7 @@
</el-tab-pane>
</el-tabs>
</el-card>
- <el-card class="detail-card common-info-card">
+ <!-- <el-card class="detail-card common-info-card">
<div slot="header" class="clearfix">
<span class="detail-title">鍏叡淇℃伅</span>
</div>
@@ -46,33 +46,10 @@
<el-input v-model="form.gainhospitalname" :readonly="!isEdit" />
</el-form-item>
</el-col>
- <el-col :span="8">
- <el-form-item label="鏄惁榛樺搥缂呮��" prop="isspendremember">
- <el-select
- v-model="form.isspendremember"
- :disabled="!isEdit"
- 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"
- :disabled="!isEdit"
- style="width: 100%"
- >
- <el-option label="鏄�" :value="1" />
- <el-option label="鍚�" :value="0" />
- </el-select>
- </el-form-item>
- </el-col>
+
</el-row>
</el-form>
- </el-card>
+ </el-card> -->
<!-- 鑴戞浜″垽瀹氭ā鍧� -->
<el-card v-if="activeJudgmentType === 'brain'" class="detail-card">
<div slot="header" class="clearfix">
diff --git a/src/views/business/decide/index.vue b/src/views/business/decide/index.vue
index 9ccf9f2..48a0536 100644
--- a/src/views/business/decide/index.vue
+++ b/src/views/business/decide/index.vue
@@ -175,9 +175,9 @@
<template slot-scope="scope">
<el-tag
v-if="scope.row.deathreason"
- :type="getDeathReasonTagType(scope.row.deathreason)"
+ type="danger"
>
- {{ getDeathReasonText(scope.row.deathreason) }}
+ {{ scope.row.deathreason }}
</el-tag>
<span v-else>-</span>
</template>
@@ -226,7 +226,7 @@
>
<template slot-scope="scope">
<el-tag v-if="scope.row.heartdeathreason" type="danger">
- {{ getHeartDeathReasonText(scope.row.heartdeathreason) }}
+ {{ scope.row.heartdeathreason }}
</el-tag>
<span v-else>-</span>
</template>
diff --git a/src/views/business/ethicalReview/ethicalReviewInfo copy.vue b/src/views/business/ethicalReview/ethicalReviewInfo copy.vue
deleted file mode 100644
index d5828de..0000000
--- a/src/views/business/ethicalReview/ethicalReviewInfo copy.vue
+++ /dev/null
@@ -1,1536 +0,0 @@
-<template>
- <div class="ethics-review-detail">
- <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="warning"
- @click="handleEndReview"
- :disabled="form.ethicsConclusion === 'terminated'"
- >
- 缁撴潫瀹℃煡
- </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="donorName">
- <el-input v-model="form.donorName" />
- </el-form-item>
- </el-col>
- <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>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="骞撮緞" prop="age">
- <el-input v-model="form.age" />
- </el-form-item>
- </el-col>
- <el-col :span="16">
- <el-form-item label="鐤剧梾璇婃柇" prop="diagnosis">
- <el-input v-model="form.diagnosis" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="8">
- <el-form-item label="浼︾悊缁撹" prop="ethicsConclusion">
- <el-select v-model="form.ethicsConclusion" style="width: 100%">
- <el-option label="瀹℃煡涓�" value="reviewing" />
- <el-option label="鍚屾剰" value="approved" />
- <el-option
- label="淇敼鍚庡悓鎰�"
- value="approved_with_modifications"
- />
- <el-option label="淇敼鍚庨噸瀹�" value="re-review" />
- <el-option label="涓嶅悓鎰�" value="disapproved" />
- <el-option label="缁堟瀹℃煡" value="terminated" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="瀹℃煡鏃堕棿" prop="reviewTime">
- <el-date-picker
- v-model="form.reviewTime"
- 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="registrant">
- <el-input v-model="form.registrant" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="浼︾悊鎰忚" prop="ethicsOpinion">
- <el-input
- type="textarea"
- :rows="3"
- v-model="form.ethicsOpinion"
- placeholder="璇疯緭鍏ヤ鸡鐞嗗鏌ユ剰瑙�"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <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-form>
- </el-card>
- <!-- 闄勪欢涓婁紶 -->
- <el-card class="attachment-card">
- <div slot="header" class="clearfix">
- <span class="detail-title">鐩稿叧闄勪欢</span>
- <el-button type="primary" size="mini" @click="handleUploadAttachment">
- 涓婁紶闄勪欢
- </el-button>
- </div>
-
- <el-table :data="attachments" style="width: 100%">
- <el-table-column label="鏂囦欢鍚嶇О" min-width="200">
- <template slot-scope="scope">
- <div class="file-info">
- <i
- class="el-icon-document"
- 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="100" align="center">
- <template slot-scope="scope">
- <span>{{ scope.row.uploader }}</span>
- </template>
- </el-table-column>
-
- <el-table-column label="鎿嶄綔" width="120" 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
- >
- </template>
- </el-table-column>
- </el-table>
- </el-card>
- <!-- 涓撳瀹℃煡鎯呭喌 -->
- <el-card class="expert-card">
- <div slot="header" class="clearfix">
- <span class="detail-title">涓撳瀹℃煡鎯呭喌 (18浣嶄笓瀹� + 1浣嶄富濮斾笓瀹�)</span>
- <div style="float: right;">
- <el-button
- size="mini"
- type="primary"
- @click="handleSendToNormalExperts"
- :disabled="!canSendToNormalExperts"
- >
- 鍙戦�佷笓瀹�
- </el-button>
- <el-button
- size="mini"
- type="success"
- @click="handleSendToChiefExpert"
- :disabled="!canSendToChiefExpert"
- >
- 鍙戦�佷富濮斾笓瀹�
- </el-button>
- <el-button
- size="mini"
- type="warning"
- @click="handleBatchSend"
- :disabled="!canBatchSend"
- >
- 鎵归噺鍙戦��
- </el-button>
- </div>
- </div>
- <!-- 涓撳缁熻淇℃伅 -->
- <div
- class="expert-stats"
- style="margin-top: 20px; padding: 15px; background: #f5f7fa; border-radius: 4px;"
- >
- <el-row :gutter="20">
- <el-col :span="6">
- <div class="stat-item">
- <span class="stat-label">涓撳宸插悓鎰�:</span>
- <span class="stat-value">{{ approvedNormalExperts }}/18</span>
- </div>
- </el-col>
- <el-col :span="6">
- <div class="stat-item">
- <span class="stat-label">涓诲涓撳鐘舵��:</span>
- <span class="stat-value">{{ chiefExpertStatus }}</span>
- </div>
- </el-col>
- <el-col :span="6">
- <div class="stat-item">
- <span class="stat-label">鎬诲畬鎴愯繘搴�:</span>
- <span class="stat-value">{{ completionRate }}%</span>
- </div>
- </el-col>
- <el-col :span="6">
- <div class="stat-item">
- <span class="stat-label">瀹℃煡缁撴灉:</span>
- <span class="stat-value">
- <el-tag :type="overallConclusionFilter">
- {{ overallConclusionText }}
- </el-tag>
- </span>
- </div>
- </el-col>
- </el-row>
- </div>
- <!-- 涓撳瀹℃煡琛ㄦ牸 -->
- <el-table
- :data="expertReviews"
- v-loading="expertLoading"
- style="width: 100%"
- heiht="800"
- :row-class-name="getExpertRowClassName"
- >
- <el-table-column label="搴忓彿" width="60" align="center" type="index" />
-
- <el-table-column
- label="涓撳濮撳悕"
- width="120"
- align="center"
- fixed="left"
- >
- <template slot-scope="scope">
- <span>{{ scope.row.expertName }}</span>
- <el-tag
- v-if="scope.row.isChief"
- size="mini"
- type="danger"
- style="margin-left: 5px;"
- >涓诲</el-tag
- >
- </template>
- </el-table-column>
-
- <el-table-column label="涓撳绫诲瀷" width="100" align="center">
- <template slot-scope="scope">
- <span :class="scope.row.isChief ? 'chief-expert' : 'normal-expert'">
- {{ scope.row.isChief ? "涓诲涓撳" : "涓撳" }}
- </span>
- </template>
- </el-table-column>
-
- <el-table-column label="瀹℃煡鐘舵��" width="100" align="center">
- <template slot-scope="scope">
- <el-tag :type="statusFilter(scope.row.reviewStatus)" size="small">
- {{ statusTextFilter(scope.row.reviewStatus) }}
- </el-tag>
- </template>
- </el-table-column>
-
- <el-table-column label="涓撳缁撹" width="120" align="center">
- <template slot-scope="scope">
- <el-tag
- v-if="scope.row.expertConclusion"
- :type="conclusionFilter(scope.row.expertConclusion)"
- size="small"
- >
- {{ conclusionTextFilter(scope.row.expertConclusion) }}
- </el-tag>
- <span v-else class="no-data">-</span>
- </template>
- </el-table-column>
-
- <el-table-column label="瀹℃煡鎰忚" min-width="200" show-overflow-tooltip>
- <template slot-scope="scope">
- <span :class="{ 'expert-opinion': scope.row.expertOpinion }">
- {{ scope.row.expertOpinion || "鏆傛棤鎰忚" }}
- </span>
- </template>
- </el-table-column>
-
- <el-table-column label="瀹℃煡鏃堕棿" width="160" align="center">
- <template slot-scope="scope">
- <span>{{
- scope.row.reviewTime ? parseTime(scope.row.reviewTime) : "鏈鏌�"
- }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鍙戦�佹椂闂�" width="160" align="center">
- <template slot-scope="scope">
- <span>{{
- scope.row.reviewTime ? parseTime(scope.row.reviewTime) : "鏈彂閫�"
- }}</span>
- </template>
- </el-table-column>
-
- <el-table-column label="鎿嶄綔" width="280" align="center" fixed="right">
- <template slot-scope="scope">
- <el-button
- size="mini"
- type="text"
- icon="el-icon-s-promotion"
- @click="handleSendToExpert(scope.row)"
- :disabled="scope.row.reviewStatus === 'submitted'"
- :class="{ 'sent-button': scope.row.reviewStatus === 'submitted' }"
- >
- {{ scope.row.reviewStatus === "submitted" ? "宸插彂閫�" : "鍙戦��" }}
- </el-button>
- <el-button
- size="mini"
- type="text"
- icon="el-icon-edit"
- @click="handleEditExpertReview(scope.row)"
- :disabled="scope.row.reviewStatus !== 'submitted'"
- >
- 缂栬緫
- </el-button>
- <el-button
- size="mini"
- type="text"
- icon="el-icon-view"
- @click="handleViewExpertReview(scope.row)"
- >
- 璇︽儏
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
-
- <!-- 鍙戦�佷笓瀹跺璇濇 -->
- <el-dialog
- title="鍙戦�佷笓瀹跺鏌�"
- :visible.sync="sendDialogVisible"
- width="500px"
- >
- <el-form :model="sendForm" ref="sendForm" label-width="100px">
- <el-form-item label="涓撳绫诲瀷" prop="expertType">
- <el-radio-group v-model="sendForm.expertType">
- <el-radio label="normal">涓撳</el-radio>
- <el-radio label="chief">涓诲涓撳</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item
- label="閫夋嫨涓撳"
- prop="expertIds"
- v-if="sendForm.expertType === 'normal'"
- >
- <el-select
- v-model="sendForm.expertIds"
- multiple
- placeholder="璇烽�夋嫨涓撳"
- style="width: 100%"
- >
- <el-option
- v-for="expert in availableExperts"
- :key="expert.id"
- :label="expert.name"
- :value="expert.id"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鍙戦�佸唴瀹�" prop="content">
- <el-input
- type="textarea"
- :rows="4"
- v-model="sendForm.content"
- placeholder="璇疯緭鍏ュ彂閫佺粰涓撳鐨勫鏌ュ唴瀹硅鏄�"
- />
- </el-form-item>
- </el-form>
- <div slot="footer">
- <el-button @click="sendDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleSendConfirm"
- >纭鍙戦��</el-button
- >
- </div>
- </el-dialog>
- </div>
-</template>
-<script>
-import {
- getEthicsReviewDetail,
- updateEthicsReview,
- sendExpertReview,
- endEthicsReview,
- uploadAttachment,
- deleteAttachment,
- getAttachments
-} from "./ethicsReview";
-import {
- reviewinitiateBaseInfoList,
- ethicalreviewedit,
- ethicalreviewadd
-} from "@/api/businessApi";
-
-export default {
- name: "EthicsReviewDetail",
- data() {
- return {
- // 琛ㄥ崟鏁版嵁
- form: {
- id: undefined,
- hospitalNo: "",
- donorName: "",
- gender: "",
- age: "",
- diagnosis: "",
- ethicsConclusion: "reviewing",
- ethicsOpinion: "",
- reviewTime: "",
- registrant: "",
- registrationTime: new Date()
- .toISOString()
- .replace("T", " ")
- .substring(0, 19)
- },
- // 琛ㄥ崟楠岃瘉瑙勫垯
- rules: {
- donorName: [
- { required: true, message: "鎹愮尞鑰呭鍚嶄笉鑳戒负绌�", trigger: "blur" }
- ],
- ethicsConclusion: [
- { required: true, message: "浼︾悊缁撹涓嶈兘涓虹┖", trigger: "change" }
- ],
- reviewTime: [
- { required: true, message: "瀹℃煡鏃堕棿涓嶈兘涓虹┖", trigger: "change" }
- ]
- },
- // 淇濆瓨鍔犺浇鐘舵��
- saveLoading: false,
-
- // 闄勪欢鏁版嵁
- attachments: [],
- expertReviews: [
- // 涓撳锛�18浣嶏級- 鍒濆鐘舵�佷负鐢宠涓�
- {
- id: 1,
- expertName: "闄舵槉",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 2,
- expertName: "鍒樻枌",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 3,
- expertName: "浜庢捣鍒� ",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 4,
- expertName: "鐜嬬孩姊�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 5,
- expertName: "鐜嬫槬鍏�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 6,
- expertName: "鐜嬮潤",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 7,
- expertName: "杈规枃瓒�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 8,
- expertName: "闂織鍕�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 9,
- expertName: "璁稿嚖",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 10,
- expertName: "璁镐紶灞�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 11,
- expertName: "寮犵孩宀�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 12,
- expertName: "鏉ㄨ嫃姘�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 13,
- expertName: "瀹嬬帀寮�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 14,
- expertName: "鍛ㄤ紶鍒�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 15,
- expertName: "鑽嗗嚒娉�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 16,
- expertName: "鐭枃鎹�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 17,
- expertName: "钁i渿",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- {
- id: 18,
- expertName: "钄¢噾璐�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- // 涓诲涓撳锛�1浣嶏級
- {
- id: 19,
- expertName: "瀛斿績娑�",
- isChief: true,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- }
- ],
- expertLoading: false,
- attachmentLoading: false,
- // 鍙戦�佸璇濇
- sendDialogVisible: false,
- sendForm: {
- expertType: "normal",
- expertIds: [],
- content: ""
- },
- // 涓婁紶鐩稿叧
- uploadDialogVisible: false,
- uploadLoading: false,
- tempFileList: [],
- // 鍙敤涓撳鍒楄〃
- availableExperts: [
- { id: 1, name: "寮犳暀鎺�", type: "normal" },
- { id: 2, name: "鏉庢暀鎺�", type: "normal" },
- { id: 3, name: "鐜嬫暀鎺�", type: "normal" },
- { id: 4, name: "璧典富濮�", type: "chief" }
- ]
- };
- },
- computed: {
- // 璁$畻灞炴�э細涓撳鍚屾剰鏁伴噺
- approvedNormalExperts() {
- return this.expertReviews.filter(
- expert => !expert.isChief && expert.expertConclusion === "approved"
- ).length;
- },
- // 璁$畻灞炴�э細涓诲涓撳鐘舵��
- chiefExpertStatus() {
- const chiefExpert = this.expertReviews.find(expert => expert.isChief);
- return chiefExpert
- ? this.statusTextFilter(chiefExpert.reviewStatus)
- : "鏈垎閰�";
- },
- // 璁$畻灞炴�э細瀹屾垚杩涘害
- completionRate() {
- const totalExperts = this.expertReviews.length;
- const completedExperts = this.expertReviews.filter(
- expert => expert.reviewStatus === "submitted"
- ).length;
- return totalExperts > 0
- ? Math.round((completedExperts / totalExperts) * 100)
- : 0;
- },
- // 璁$畻灞炴�э細鎬讳綋缁撹
- overallConclusionText() {
- if (this.approvedNormalExperts >= 12) {
- return "閫氳繃";
- } else if (this.approvedNormalExperts >= 9) {
- return "淇敼鍚庨�氳繃";
- } else {
- return "涓嶉�氳繃";
- }
- },
- overallConclusionFilter() {
- if (this.approvedNormalExperts >= 12) {
- return "success";
- } else if (this.approvedNormalExperts >= 9) {
- return "warning";
- } else {
- return "danger";
- }
- },
- // 鏄惁鍙互鍙戦�佺粰涓撳
- canSendToNormalExperts() {
- return (
- this.expertReviews.filter(
- expert => !expert.isChief && expert.reviewStatus === "applying"
- ).length > 0
- );
- },
- // 鏄惁鍙互鍙戦�佺粰涓诲涓撳锛堥渶瑕佽嚦灏�12涓笓瀹跺悓鎰忥級
- canSendToChiefExpert() {
- return (
- this.approvedNormalExperts >= 12 &&
- this.expertReviews.filter(
- expert => expert.isChief && expert.reviewStatus === "applying"
- ).length > 0
- );
- },
- // 鏄惁鍙互鎵归噺鍙戦��
- canBatchSend() {
- return (
- this.expertReviews.filter(expert => expert.reviewStatus === "applying")
- .length > 0
- );
- },
- // 鏄惁鍙互鍙戦�佷笓瀹跺鏌�
- canSendToExperts() {
- return this.form.id && this.form.ethicsConclusion === "reviewing";
- },
- // 褰撳墠鐢ㄦ埛淇℃伅
- currentUser() {
- return JSON.parse(sessionStorage.getItem("user") || "{}");
- }
- },
- created() {
- const id = this.$route.query.id;
- if (id) {
- this.getDetail(id);
- this.getAttachments(id);
- // 涓嶅啀闇�瑕佷粠鎺ュ彛鑾峰彇涓撳鍒楄〃锛屼娇鐢ㄥ浐瀹氱殑expertReviews鏁版嵁
- } else if (this.$route.path.includes("/add")) {
- this.generateHospitalNo();
- this.form.registrant = this.currentUser.username || "褰撳墠鐢ㄦ埛";
- }
- },
- methods: {
- // 鐢熸垚浣忛櫌鍙�
- generateHospitalNo() {
- const timestamp = Date.now().toString();
- this.form.hospitalNo = "D" + timestamp.slice(-6);
- },
- getExpertRowClassName({ row }) {
- return row.isChief ? "chief-expert-row" : "normal-expert-row";
- },
- // 鑾峰彇璇︽儏
- getDetail(id) {
- getEthicsReviewDetail(id)
- .then(response => {
- if (response.code === 200) {
- this.form = response.data;
- }
- })
- .catch(error => {
- console.error("鑾峰彇浼︾悊瀹℃煡璇︽儏澶辫触:", error);
- this.$message.error("鑾峰彇璇︽儏澶辫触");
- });
- },
-
- // 鑾峰彇涓撳瀹℃煡鍒楄〃
- getExpertReviews(ethicsReviewId) {
- this.expertLoading = true;
- // 妯℃嫙鏁版嵁 - 瀹為檯椤圭洰涓粠鎺ュ彛鑾峰彇
- setTimeout(() => {
- this.expertReviews = [
- // 涓撳锛�18浣嶏級
- {
- id: 1,
- expertName: "寮犳暀鎺�",
- isChief: false,
- reviewStatus: "submitted",
- expertConclusion: "approved",
- expertOpinion: "绗﹀悎浼︾悊瑕佹眰",
- reviewTime: "2025-12-01 10:30:00"
- },
- {
- id: 2,
- expertName: "鏉庢暀鎺�",
- isChief: false,
- reviewStatus: "submitted",
- expertConclusion: "approved",
- expertOpinion: "鏂规璁捐鍚堢悊",
- reviewTime: "2025-12-01 11:20:00"
- },
- {
- id: 3,
- expertName: "鐜嬫暀鎺�",
- isChief: false,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- },
- // 涓诲涓撳锛�1浣嶏級
- {
- id: 19,
- expertName: "璧典富濮�",
- isChief: true,
- reviewStatus: "applying",
- expertConclusion: "",
- expertOpinion: "",
- reviewTime: ""
- }
- ];
- this.expertLoading = false;
- }, 500);
- },
-
- // 鑾峰彇闄勪欢鍒楄〃
- getAttachments(ethicsReviewId) {
- this.attachmentLoading = true;
- getAttachments(ethicsReviewId)
- .then(response => {
- if (response.code === 200) {
- this.attachments = response.data;
- }
- this.attachmentLoading = false;
- })
- .catch(error => {
- console.error("鑾峰彇闄勪欢鍒楄〃澶辫触:", error);
- this.attachmentLoading = false;
- });
- },
-
- // 鐘舵�佽繃婊ゅ櫒
- statusFilter(status) {
- const statusMap = {
- applying: "info",
- submitted: "success"
- };
- return statusMap[status] || "info";
- },
-
- statusTextFilter(status) {
- const statusMap = {
- applying: "鐢宠涓�",
- submitted: "宸叉彁浜�"
- };
- return statusMap[status] || "鏈煡";
- },
-
- // 缁撹杩囨护鍣�
- conclusionFilter(conclusion) {
- const conclusionMap = {
- approved: "success",
- approved_with_modifications: "warning",
- disapproved: "danger"
- };
- return conclusionMap[conclusion] || "info";
- },
-
- conclusionTextFilter(conclusion) {
- const conclusionMap = {
- approved: "鍚屾剰",
- approved_with_modifications: "淇敼鍚庡悓鎰�",
- disapproved: "涓嶅悓鎰�"
- };
- return conclusionMap[conclusion] || "鏈煡";
- },
-
- // 淇濆瓨淇℃伅
- handleSave() {
- this.$refs.form.validate(valid => {
- if (valid) {
- this.saveLoading = true;
- const apiMethod = this.form.id ? updateEthicsReview : addEthicsReview;
-
- 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 }
- });
- }
- }
- })
- .catch(error => {
- console.error("淇濆瓨澶辫触:", error);
- this.$message.error("淇濆瓨澶辫触");
- })
- .finally(() => {
- this.saveLoading = false;
- });
- }
- });
- },
-
- // 鍙戦�佷笓瀹跺鏌�
- handleSendToExperts() {
- this.sendDialogVisible = true;
- },
-
- // 鍙戦�佺粰涓撳
- handleSendToNormalExperts() {
- const normalExperts = this.expertReviews.filter(
- expert => !expert.isChief && expert.reviewStatus === "applying"
- );
- this.sendForm.expertIds = normalExperts.map(expert => expert.id);
- this.sendForm.expertType = "normal";
- this.sendDialogVisible = true;
- },
-
- // 鍙戦�佺粰涓诲涓撳
- handleSendToChiefExpert() {
- const chiefExpert = this.expertReviews.find(
- expert => expert.isChief && expert.reviewStatus === "applying"
- );
- if (chiefExpert) {
- this.sendForm.expertIds = [chiefExpert.id];
- this.sendForm.expertType = "chief";
- this.sendDialogVisible = true;
- }
- },
-
- // 鎵归噺鍙戦��
- handleBatchSend() {
- const applyingExperts = this.expertReviews.filter(
- expert => expert.reviewStatus === "applying"
- );
- this.sendForm.expertIds = applyingExperts.map(expert => expert.id);
- this.sendForm.expertType = "batch";
- this.sendDialogVisible = true;
- },
-
- // 鍙戦�佺粰鍗曚釜涓撳
- handleSendToExpert(expert) {
- this.sendForm.expertIds = [expert.id];
- this.sendForm.expertType = expert.isChief ? "chief" : "normal";
- this.sendDialogVisible = true;
- },
-
- // 纭鍙戦��
- handleSendConfirm() {
- if (this.sendForm.expertIds.length === 0) {
- this.$message.warning("璇烽�夋嫨瑕佸彂閫佺殑涓撳");
- return;
- }
-
- sendExpertReview({
- ethicsReviewId: this.form.id,
- expertIds: this.sendForm.expertIds,
- content: this.sendForm.content
- })
- .then(response => {
- if (response.code === 200) {
- this.$message.success("鍙戦�佹垚鍔�");
- this.sendDialogVisible = false;
- this.getExpertReviews(this.form.id);
- this.sendForm = {
- expertType: "normal",
- expertIds: [],
- content: ""
- };
- }
- })
- .catch(error => {
- console.error("鍙戦�佸け璐�:", error);
- this.$message.error("鍙戦�佸け璐�");
- });
- },
-
- // 缁撴潫瀹℃煡
- handleEndReview() {
- this.$confirm(
- "纭畾瑕佺粨鏉熸湰娆′鸡鐞嗗鏌ュ悧锛熺粨鏉熷悗灏嗘棤娉曚慨鏀逛笓瀹跺鏌ョ粨鏋溿��",
- "鎻愮ず",
- {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- }
- )
- .then(() => {
- endEthicsReview(this.form.id)
- .then(response => {
- if (response.code === 200) {
- this.$message.success("瀹℃煡宸茬粨鏉�");
- this.form.ethicsConclusion = "terminated";
- }
- })
- .catch(error => {
- console.error("缁撴潫瀹℃煡澶辫触:", error);
- this.$message.error("缁撴潫瀹℃煡澶辫触");
- });
- })
- .catch(() => {});
- },
-
- // 缂栬緫涓撳瀹℃煡
- handleEditExpertReview(expert) {
- this.$prompt("璇疯緭鍏ュ鏌ユ剰瑙�", "缂栬緫涓撳瀹℃煡", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- inputValue: expert.expertOpinion || "",
- inputValidator: value => {
- if (!value || value.trim() === "") {
- return "瀹℃煡鎰忚涓嶈兘涓虹┖";
- }
- return true;
- }
- })
- .then(({ value }) => {
- // 妯℃嫙鏇存柊涓撳瀹℃煡
- const index = this.expertReviews.findIndex(e => e.id === expert.id);
- if (index !== -1) {
- this.expertReviews[index].expertOpinion = value;
- this.$message.success("瀹℃煡鎰忚宸叉洿鏂�");
- }
- })
- .catch(() => {});
- },
-
- // 鏌ョ湅涓撳瀹℃煡璇︽儏
- handleViewExpertReview(expert) {
- this.$alert(
- `
- <div>
- <p><strong>涓撳濮撳悕锛�</strong>${expert.expertName}</p>
- <p><strong>涓撳绫诲瀷锛�</strong>${
- expert.isChief ? "涓诲涓撳" : "涓撳"
- }</p>
- <p><strong>瀹℃煡鐘舵�侊細</strong>${this.statusTextFilter(
- expert.reviewStatus
- )}</p>
- <p><strong>涓撳缁撹锛�</strong>${
- expert.expertConclusion
- ? this.conclusionTextFilter(expert.expertConclusion)
- : "鏈彁浜�"
- }</p>
- <p><strong>瀹℃煡鎰忚锛�</strong>${expert.expertOpinion || "鏃�"}</p>
- <p><strong>瀹℃煡鏃堕棿锛�</strong>${expert.reviewTime || "鏈鏌�"}</p>
- </div>
- `,
- "涓撳瀹℃煡璇︽儏",
- {
- dangerouslyUseHTMLString: true,
- customClass: "expert-review-detail-dialog"
- }
- );
- },
-
- // 涓婁紶闄勪欢
- handleUploadAttachment() {
- this.uploadDialogVisible = true;
- },
-
- // 涓婁紶鍓嶆牎楠�
- beforeUpload(file) {
- const allowedTypes = [
- "application/pdf",
- "image/jpeg",
- "image/png",
- "application/msword",
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
- "application/vnd.ms-excel",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
- ];
-
- 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") ||
- file.name.endsWith(".xls") ||
- file.name.endsWith(".xlsx");
-
- if (!isTypeOk) {
- this.$message.error("鏂囦欢鏍煎紡涓嶆敮鎸�");
- return false;
- }
-
- if (file.size > maxSize) {
- this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
- return false;
- }
-
- return true;
- },
-
- // 鏂囦欢閫夋嫨鍙樺寲
- handleFileChange(file, fileList) {
- this.tempFileList = fileList;
- },
-
- // 鎻愪氦涓婁紶
- submitUpload() {
- if (this.tempFileList.length === 0) {
- this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
- return;
- }
-
- this.uploadLoading = true;
-
- const uploadPromises = this.tempFileList.map(file => {
- const formData = new FormData();
- formData.append("file", file.raw);
- formData.append("ethicsReviewId", this.form.id);
-
- return uploadAttachment(formData);
- });
-
- Promise.all(uploadPromises)
- .then(responses => {
- this.$message.success("鏂囦欢涓婁紶鎴愬姛");
- this.uploadDialogVisible = false;
- this.tempFileList = [];
- this.getAttachments(this.form.id);
- })
- .catch(error => {
- console.error("涓婁紶澶辫触:", error);
- this.$message.error("鏂囦欢涓婁紶澶辫触");
- })
- .finally(() => {
- this.uploadLoading = false;
- });
- },
-
- // 棰勮闄勪欢
- handlePreviewAttachment(attachment) {
- if (attachment.fileName.endsWith(".pdf")) {
- window.open(attachment.fileUrl, "_blank");
- } else if (attachment.fileName.match(/\.(jpg|jpeg|png)$/i)) {
- this.$alert(
- `<img src="${attachment.fileUrl}" style="max-width: 100%;" alt="${attachment.fileName}">`,
- "鍥剧墖棰勮",
- {
- dangerouslyUseHTMLString: true,
- customClass: "image-preview-dialog"
- }
- );
- } else {
- this.$message.info("璇ユ枃浠剁被鍨嬫殏涓嶆敮鎸佸湪绾块瑙堬紝璇蜂笅杞藉悗鏌ョ湅");
- }
- },
-
- // 涓嬭浇闄勪欢
- handleDownloadAttachment(attachment) {
- const link = document.createElement("a");
- link.href = attachment.fileUrl;
- link.download = attachment.fileName;
- link.click();
- this.$message.success(`寮�濮嬩笅杞�: ${attachment.fileName}`);
- },
-
- // 鍒犻櫎闄勪欢
- handleRemoveAttachment(attachment) {
- this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- })
- .then(() => {
- deleteAttachment(attachment.id)
- .then(response => {
- if (response.code === 200) {
- this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
- this.getAttachments(this.form.id);
- }
- })
- .catch(error => {
- console.error("鍒犻櫎闄勪欢澶辫触:", error);
- this.$message.error("鍒犻櫎闄勪欢澶辫触");
- });
- })
- .catch(() => {});
- },
-
- // 鑾峰彇鏂囦欢绫诲瀷
- getFileType(fileName) {
- const ext = 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();
- },
-
- // 鏂囦欢澶у皬鏍煎紡鍖�
- formatFileSize(size) {
- if (size === 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];
- },
-
- // 鏃堕棿鏍煎紡鍖�
- 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")}`;
- }
- }
-};
-</script>
-<style scoped>
-.ethics-review-detail {
- padding: 20px;
- background-color: #f5f7fa;
-}
-
-.detail-card {
- margin-bottom: 20px;
- border-radius: 8px;
- box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-}
-
-.expert-card {
- margin-bottom: 20px;
- border-radius: 8px;
- box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-}
-
-.attachment-card {
- margin-bottom: 20px;
- border-radius: 8px;
- box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-}
-
-.detail-title {
- font-size: 18px;
- font-weight: 600;
- color: #303133;
-}
-
-.expert-stats {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: rgb(43, 181, 245);
- border-radius: 8px;
- margin-bottom: 20px;
-}
-
-.stat-item {
- display: flex;
- flex-direction: column;
- align-items: center;
- padding: 10px;
-}
-
-.stat-label {
- font-size: 12px;
- opacity: 0.9;
- margin-bottom: 5px;
-}
-
-.stat-value {
- font-size: 18px;
- font-weight: bold;
-}
-
-.upload-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 15px;
- padding: 10px;
- background-color: #f8f9fa;
- border-radius: 4px;
-}
-
-.upload-title {
- font-size: 14px;
- font-weight: 600;
- color: #303133;
-}
-
-.file-info {
- display: flex;
- align-items: center;
-}
-
-.empty-attachment {
- text-align: center;
- padding: 40px 0;
- color: #909399;
-}
-
-/* 琛ㄥ崟鏍峰紡浼樺寲 */
-:deep(.el-form-item__label) {
- font-weight: 500;
-}
-
-:deep(.el-input__inner) {
- border-radius: 4px;
-}
-
-:deep(.el-textarea__inner) {
- border-radius: 4px;
- resize: vertical;
-}
-
-/* 琛ㄦ牸鏍峰紡浼樺寲 */
-:deep(.el-table) {
- border-radius: 8px;
- overflow: hidden;
-}
-
-:deep(.el-table th) {
- background-color: #f5f7fa;
- color: #606266;
- font-weight: 500;
-}
-
-:deep(.el-table .cell) {
- padding: 8px 12px;
-}
-
-/* 鎸夐挳鏍峰紡浼樺寲 */
-:deep(.el-button--primary) {
- background: linear-gradient(135deg, #409eff 0%, #3375e0 100%);
- border: none;
- border-radius: 4px;
-}
-
-:deep(.el-button--success) {
- background: linear-gradient(135deg, #67c23a 0%, #529b2f 100%);
- border: none;
- border-radius: 4px;
-}
-
-:deep(.el-button--warning) {
- background: linear-gradient(135deg, #e6a23c 0%, #d18c2a 100%);
- border: none;
- border-radius: 4px;
-}
-
-:deep(.el-button--danger) {
- background: linear-gradient(135deg, #f56c6c 0%, #e05b5b 100%);
- border: none;
- border-radius: 4px;
-}
-
-/* 鏍囩鏍峰紡 */
-:deep(.el-tag) {
- border-radius: 12px;
- border: none;
- font-weight: 500;
-}
-
-/* 瀵硅瘽妗嗘牱寮忎紭鍖� */
-: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;
-}
-
-:deep(.el-dialog__title) {
- font-weight: 600;
- color: #303133;
-}
-
-/* 涓婁紶缁勪欢鏍峰紡 */
-:deep(.el-upload-dragger) {
- border: 2px dashed #dcdfe6;
- border-radius: 6px;
- background-color: #fafafa;
- transition: all 0.3s ease;
-}
-
-:deep(.el-upload-dragger:hover) {
- border-color: #409eff;
- background-color: #f0f7ff;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
- .ethics-review-detail {
- padding: 10px;
- }
-
- .expert-stats .el-col {
- margin-bottom: 10px;
- }
-
- .upload-header {
- flex-direction: column;
- align-items: flex-start;
- gap: 10px;
- }
-}
-
-/* 鍔ㄧ敾鏁堟灉 */
-.fade-enter-active,
-.fade-leave-active {
- transition: opacity 0.3s ease;
-}
-
-.fade-enter,
-.fade-leave-to {
- opacity: 0;
-}
-
-/* 鍔犺浇鐘舵�� */
-.loading-container {
- display: flex;
- justify-content: center;
- align-items: center;
- height: 200px;
-}
-
-/* 涓撳绫诲瀷鏍峰紡 */
-.normal-expert {
- color: #409eff;
- font-weight: 500;
-}
-
-.chief-expert {
- color: #f56c6c;
- font-weight: 600;
-}
-
-/* 涓撳琛屾牱寮� */
-:deep(.normal-expert-row) {
- background-color: #fafafa;
-}
-
-:deep(.chief-expert-row) {
- background-color: #fff7e6;
-}
-
-:deep(.normal-expert-row:hover) {
- background-color: #f0f7ff;
-}
-
-:deep(.chief-expert-row:hover) {
- background-color: #ffecc2;
-}
-
-/* 鏃犳暟鎹牱寮� */
-.no-data {
- color: #909399;
- font-style: italic;
-}
-
-/* 涓撳鎰忚鏍峰紡 */
-.expert-opinion {
- color: #303133;
- line-height: 1.5;
-}
-
-/* 宸插彂閫佹寜閽牱寮� */
-.sent-button {
- color: #67c23a !important;
-}
-
-/* 琛ㄦ牸琛屾偓鍋滄晥鏋� */
-:deep(.el-table__row:hover) {
- transform: translateY(-1px);
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
- transition: all 0.3s ease;
-}
-
-/* 鑷畾涔夋粴鍔ㄦ潯 */
-:deep(::-webkit-scrollbar) {
- width: 6px;
- height: 6px;
-}
-
-:deep(::-webkit-scrollbar-track) {
- background: #f1f1f1;
- border-radius: 3px;
-}
-
-:deep(::-webkit-scrollbar-thumb) {
- background: #c1c1c1;
- border-radius: 3px;
-}
-
-:deep(::-webkit-scrollbar-thumb:hover) {
- background: #a8a8a8;
-}
-
-/* 涓撳瀹℃煡琛ㄦ牸鐗规畩鏍峰紡 */
-.expert-table-special :deep(.el-table__row) {
- transition: all 0.3s ease;
-}
-
-.expert-table-special :deep(.el-table__row:hover) {
- background-color: #f0f7ff;
- transform: translateY(-1px);
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-}
-
-/* 涓诲涓撳琛岄珮浜� */
-:deep(.chief-expert-row) {
- background-color: #fff7e6 !important;
-}
-
-:deep(.chief-expert-row:hover) {
- background-color: #ffecc2 !important;
-}
-</style>
diff --git a/src/views/business/ethicalReview/ethicalReviewInfo.vue b/src/views/business/ethicalReview/ethicalReviewInfo.vue
index c783e46..8e56dfa 100644
--- a/src/views/business/ethicalReview/ethicalReviewInfo.vue
+++ b/src/views/business/ethicalReview/ethicalReviewInfo.vue
@@ -55,7 +55,7 @@
<el-input v-model="form.initiatePerson" />
</el-form-item>
</el-col>
- <el-col :span="8">
+ <!-- <el-col :span="8">
<el-form-item label="瀹℃煡鐘舵��" prop="status">
<el-select v-model="form.status" style="width: 100%">
<el-option
@@ -66,7 +66,7 @@
/>
</el-select>
</el-form-item>
- </el-col>
+ </el-col> -->
</el-row>
<!-- 涓撳鐩稿叧淇℃伅 -->
@@ -215,6 +215,14 @@
<div slot="header" class="clearfix">
<span class="detail-title">涓撳瀹℃煡鎯呭喌</span>
<div style="float: right;">
+ <el-button
+ type="warning"
+ size="mini"
+ @click="handleRefresh"
+ icon="el-icon-refresh"
+ >
+ 鍒锋柊
+ </el-button>
<el-button size="mini" type="primary" @click="handleAddExpert">
娣诲姞涓撳
</el-button>
@@ -350,7 +358,27 @@
<span v-else class="no-data">-</span>
</template>
</el-table-column>
-
+ <!-- 鍦�"瀹℃煡鏃堕棿"鍒楀悗闈㈡坊鍔�"鎵嬬闄勪欢"鍒� -->
+ <el-table-column label="鎵嬬闄勪欢" width="120" align="center">
+ <template slot-scope="scope">
+ <template v-if="scope.row.sigin">
+ <!-- 鏈夌鍚嶏紝鏄剧ず鍙偣鍑婚瑙堢殑鍥剧墖 -->
+ <el-button
+ type="text"
+ size="mini"
+ @click="handlePreviewSignature(scope.row.sigin)"
+ class="signature-preview-btn"
+ >
+ <i class="el-icon-picture" style="margin-right: 4px;"></i>
+ 鏌ョ湅绛惧悕
+ </el-button>
+ </template>
+ <template v-else>
+ <!-- 鏃犵鍚嶏紝鏄剧ず鏂滄潬 -->
+ <span class="no-signature">/</span>
+ </template>
+ </template>
+ </el-table-column>
<el-table-column label="瀹℃煡鎰忚" min-width="200" show-overflow-tooltip>
<template slot-scope="scope">
<span :class="{ 'expert-opinion': scope.row.expertopinion }">
@@ -435,7 +463,7 @@
<el-dialog
title="娣诲姞涓撳"
:visible.sync="expertDialogVisible"
- width="800px"
+ width="900px"
@close="handleExpertDialogClose"
>
<div style="margin-bottom: 20px;">
@@ -469,7 +497,7 @@
:data="filteredExpertList"
v-loading="expertListLoading"
style="width: 100%"
- max-height="400"
+ max-height="600"
@selection-change="handleExpertSelectionChange"
>
<el-table-column type="selection" width="55"></el-table-column>
@@ -505,7 +533,7 @@
></el-table-column>
<el-table-column
label="鑱旂郴鐢佃瘽"
- prop="telephone"
+ prop="donorno"
width="120"
></el-table-column>
</el-table>
@@ -572,7 +600,7 @@
placeholder="璇烽�夋嫨鎴鏃堕棿"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
- :disabled="sendForm.expertType === 'chief'"
+ :disabled="sendForm.expertType == 'chief'"
/>
<div v-if="sendForm.expertType !== 'chief'" style="margin-top: 5px;">
<el-button-group>
@@ -585,7 +613,7 @@
</el-button-group>
</div>
<div
- v-if="sendForm.expertType === 'chief'"
+ v-if="sendForm.expertType == 'chief'"
style="font-size: 12px; color: #999; margin-top: 5px;"
>
涓诲涓撳鏃犻渶璁剧疆鎴鏃堕棿
@@ -627,12 +655,35 @@
</el-form>
<div slot="footer">
<el-button @click="sendDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="handleSendConfirm" :loading="sending"
- >纭鍙戦��</el-button
+ <el-button
+ type="primary"
+ @click="handleSendConfirm"
+ :loading="sendingAll"
+ :disabled="sendingAll"
>
+ {{
+ sendingAll
+ ? `鍙戦�佷腑 (${sendingProgress}/${sendingTotal})`
+ : "纭鍙戦��"
+ }}
+ </el-button>
</div>
</el-dialog>
-
+ <!-- 鎴栬�呭湪椤甸潰涓坊鍔犺繘搴︽潯 -->
+ <div v-if="sendingAll" class="send-progress-container">
+ <el-progress
+ :percentage="Math.round((sendingProgress / sendingTotal) * 100)"
+ :text-inside="true"
+ :stroke-width="20"
+ status="success"
+ >
+ <span>宸插彂閫� {{ sendingProgress }} / {{ sendingTotal }}</span>
+ </el-progress>
+ <div class="send-stats">
+ <span class="stat-item success">鎴愬姛: {{ sendingSuccessCount }}</span>
+ <span class="stat-item fail">澶辫触: {{ sendingFailCount }}</span>
+ </div>
+ </div>
<!-- 涓撳鍘嗗彶瀹℃壒鎯呭喌瀵硅瘽妗� -->
<el-dialog
title="涓撳鍘嗗彶瀹℃壒鎯呭喌"
@@ -764,7 +815,8 @@
ethicalreviewadd,
ethicalreviewInfo,
ethicalreExpertTotal,
- sendNotification
+ sendNotification,
+ sendcall
} from "@/api/businessApi";
import { listExternalperson } from "@/api/project/externalperson";
import CaseBasicInfo from "@/components/CaseBasicInfo";
@@ -859,7 +911,17 @@
{ max: 500, message: "闀垮害涓嶈兘瓒呰繃 500 涓瓧绗�", trigger: "blur" }
]
},
-
+ sending: false, // 鍗曚釜鍙戦�佺姸鎬�
+ sendingAll: false, // 鍏ㄥ眬鍙戦�佺姸鎬�
+ sendingProgress: 0, // 鍙戦�佽繘搴�
+ sendingTotal: 0, // 鎬诲彂閫佹暟
+ sendingSuccessCount: 0, // 鎴愬姛鏁�
+ sendingFailCount: 0, // 澶辫触鏁�
+ sendingResults: [], // 鍙戦�佺粨鏋滃垪琛�
+ originalFormData: null, // 鍘熷琛ㄥ崟鏁版嵁
+ originalExpertList: null, // 鍘熷涓撳鍒楄〃
+ originalAttachments: null, // 鍘熷闄勪欢鍒楄〃
+ isDataLoaded: false, // 鏁版嵁鏄惁宸插姞杞�
// 淇濆瓨鍔犺浇鐘舵��
saveLoading: false,
completeLoading: false,
@@ -924,14 +986,14 @@
// 璁$畻灞炴�э細鏅�氫笓瀹舵暟閲�
normalExpertsCount() {
return this.ethicalreviewopinionsList.filter(
- expert => expert.expertType === "0"
+ expert => expert.expertType == "0"
).length;
},
// 璁$畻灞炴�э細涓诲涓撳鏁伴噺
chiefExpertsCount() {
return this.ethicalreviewopinionsList.filter(
- expert => expert.expertType === "1"
+ expert => expert.expertType == "1"
).length;
},
@@ -943,7 +1005,7 @@
// 璁$畻灞炴�э細宸插悓鎰忎笓瀹舵暟閲�
approvedExpertsCount() {
return this.ethicalreviewopinionsList.filter(
- expert => expert.expertconclusion === "1"
+ expert => expert.expertconclusion == "1"
).length;
},
@@ -952,7 +1014,7 @@
const total = this.totalExpertsCount;
const approved = this.approvedExpertsCount;
- if (total === 0) return "鏈鏌�";
+ if (total == 0) return "鏈鏌�";
if (approved >= Math.ceil(total * 0.7)) {
// 瓒呰繃70%鍚屾剰
return "閫氳繃";
@@ -968,7 +1030,7 @@
const total = this.totalExpertsCount;
const approved = this.approvedExpertsCount;
- if (total === 0) return "info";
+ if (total == 0) return "info";
if (approved >= Math.ceil(total * 0.7)) {
return "success";
} else if (approved >= Math.ceil(total * 0.5)) {
@@ -982,10 +1044,10 @@
availableNormalExperts() {
return this.ethicalreviewopinionsList.filter(
expert =>
- expert.expertType === "0" &&
+ expert.expertType == "0" &&
(!expert.receiveStatus ||
- expert.receiveStatus === "0" ||
- expert.receiveStatus === "1")
+ expert.receiveStatus == "0" ||
+ expert.receiveStatus == "1")
);
},
@@ -993,10 +1055,10 @@
availableChiefExperts() {
return this.ethicalreviewopinionsList.filter(
expert =>
- expert.expertType === "1" &&
+ expert.expertType == "1" &&
(!expert.receiveStatus ||
- expert.receiveStatus === "0" ||
- expert.receiveStatus === "1")
+ expert.receiveStatus == "0" ||
+ expert.receiveStatus == "1")
);
},
@@ -1008,7 +1070,7 @@
// 鏄惁鍙互鍙戦�佺粰涓诲涓撳锛堥渶瑕佽嚦灏�12涓櫘閫氫笓瀹跺悓鎰忥級
canSendToChiefExpert() {
const normalApprovedCount = this.ethicalreviewopinionsList.filter(
- expert => expert.expertType === "0" && expert.expertconclusion === "1"
+ expert => expert.expertType == "0" && expert.expertconclusion == "1"
).length;
return this.availableChiefExperts.length > 0 && normalApprovedCount >= 12;
},
@@ -1059,9 +1121,9 @@
// 鍙戦�佸璇濇鏍囬
sendDialogTitle() {
- if (this.sendForm.expertType === "chief") {
+ if (this.sendForm.expertType == "chief") {
return "鍙戦�佷富濮斾笓瀹跺鏌�";
- } else if (this.sendForm.expertType === "normal") {
+ } else if (this.sendForm.expertType == "normal") {
return "鍙戦�佹櫘閫氫笓瀹跺鏌�";
} else {
return "鍙戦�佷笓瀹跺鏌�";
@@ -1082,6 +1144,12 @@
this.id = this.$route.query.id;
this.caseId = this.$route.query.infoid;
this.getDetail(this.infoid, this.id);
+ // 鐩戝惉璺敱鍙樺寲锛岄槻姝㈢敤鎴风寮�椤甸潰
+ window.addEventListener("beforeunload", this.beforeUnloadHandler);
+ },
+ beforeDestroy() {
+ // 绉婚櫎浜嬩欢鐩戝惉鍣�
+ window.removeEventListener("beforeunload", this.beforeUnloadHandler);
},
methods: {
// 鍒濆鍖栨柊澧炴暟鎹�
@@ -1107,7 +1175,7 @@
response = await reviewinitiateBaseInfoList({ infoid: infoid });
}
- if (response.code === 200) {
+ if (response.code == 200) {
let detailData = {};
if (response.data && id) {
@@ -1116,24 +1184,24 @@
this.parseFilePatch(this.form.filePatch);
this.initAttachmentFileList();
- // 濡傛灉涓撳瀹℃煡鎰忚鍒楄〃涓嶅瓨鍦紝鍒濆鍖栦负绌烘暟缁�
if (!this.form.ethicalreviewopinionsList) {
this.$set(this.form, "ethicalreviewopinionsList", []);
}
} else if (response.data && infoid) {
this.form = response.data[0];
- // 瑙f瀽 filePatch 瀛楁
this.parseFilePatch(this.form.filePatch);
this.initAttachmentFileList();
- // 濡傛灉涓撳瀹℃煡鎰忚鍒楄〃涓嶅瓨鍦紝鍒濆鍖栦负绌烘暟缁�
if (!this.form.ethicalreviewopinionsList) {
this.$set(this.form, "ethicalreviewopinionsList", []);
}
}
- // 璁剧疆 expertReviews 鐢ㄤ簬琛ㄦ牸鏄剧ず
+ // 淇濆瓨鍘熷鏁版嵁鐢ㄤ簬姣旇緝
+ this.saveOriginalData();
+
this.expertReviews = this.form.ethicalreviewopinionsList;
+ this.isDataLoaded = true;
this.$message.success("鏁版嵁鍔犺浇鎴愬姛");
} else {
@@ -1145,6 +1213,22 @@
} finally {
this.expertLoading = false;
}
+ },
+
+ // 淇濆瓨鍘熷鏁版嵁
+ saveOriginalData() {
+ // 娣辨嫹璐濊〃鍗曟暟鎹�
+ this.originalFormData = JSON.parse(JSON.stringify(this.form));
+
+ // 娣辨嫹璐濅笓瀹跺垪琛�
+ this.originalExpertList = this.form.ethicalreviewopinionsList
+ ? JSON.parse(JSON.stringify(this.form.ethicalreviewopinionsList))
+ : [];
+
+ // 娣辨嫹璐濋檮浠跺垪琛�
+ this.originalAttachments = this.form.annexfilesList
+ ? JSON.parse(JSON.stringify(this.form.annexfilesList))
+ : [];
},
// 瑙f瀽 filePatch 瀛楁
@@ -1182,7 +1266,7 @@
// 鏋勫缓 filePatch 瀛楁
buildFilePatch() {
- if (!this.form.annexfilesList || this.form.annexfilesList.length === 0) {
+ if (!this.form.annexfilesList || this.form.annexfilesList.length == 0) {
return "";
}
return JSON.stringify(this.form.annexfilesList);
@@ -1197,7 +1281,7 @@
handleAttachmentRemove(file) {
if (file.url) {
const index = this.form.annexfilesList.findIndex(
- item => item.path === file.url || item.fileUrl === file.url
+ item => item.path == file.url || item.fileUrl == file.url
);
if (index > -1) {
this.form.annexfilesList.splice(index, 1);
@@ -1214,7 +1298,7 @@
// 涓婁紶鎴愬姛澶勭悊
handleUploadSuccess({ file, fileList, response }) {
- if (response.code === 200) {
+ if (response.code == 200) {
const attachmentObj = {
fileName: file.name,
path: response.data || file.url,
@@ -1238,10 +1322,23 @@
// 鏂囦欢棰勮
handlePreview(file) {
+ console.log(file, "file");
+
this.currentPreviewFile = {
fileName: file.fileName,
fileUrl: file.path || file.fileUrl,
fileType: this.getFileType(file.fileName)
+ };
+ this.previewVisible = true;
+ },
+ // 鏂囦欢棰勮
+ handlePreviewSignature(file) {
+ console.log(file, "file");
+
+ this.currentPreviewFile = {
+ fileName: file,
+ fileUrl: file,
+ fileType: "png"
};
this.previewVisible = true;
},
@@ -1317,13 +1414,13 @@
// 鑱岀О鍖呭惈"涓讳换濮斿憳"鎴栬�卐xpertType涓�"1"
return (
(expert.title && expert.title.includes("涓讳换濮斿憳")) ||
- expert.expertType === "1"
+ expert.expertType == "1"
);
},
// 涓撳绫诲瀷鏂囨湰杞崲
getExpertTypeText(type) {
- return type === "1" ? "涓诲涓撳" : "鏅�氫笓瀹�";
+ return type == "1" ? "涓诲涓撳" : "鏅�氫笓瀹�";
},
// 瀹℃煡鐘舵�佽繃婊ゅ櫒
@@ -1372,7 +1469,7 @@
// 涓撳琛屾牱寮�
getExpertRowClassName({ row }) {
- return row.expertType === "1" ? "chief-expert-row" : "normal-expert-row";
+ return row.expertType == "1" ? "chief-expert-row" : "normal-expert-row";
},
// 鑾峰彇涓撳鍞竴鏍囪瘑
@@ -1382,7 +1479,7 @@
// 涓撳绫诲瀷鍙樻洿澶勭悊
handleExpertTypeChange() {
- if (this.sendForm.expertType === "chief") {
+ if (this.sendForm.expertType == "chief") {
// 涓诲涓撳鏃犻渶璁剧疆鎴鏃堕棿
this.sendForm.endTime = "";
} else {
@@ -1407,9 +1504,9 @@
if (valid) {
this.saveLoading = true;
// 淇濆瓨娓呯┖id渚夸簬鍚庣鏁翠綋鍒犻櫎鏂板
- this.form.ethicalreviewopinionsList.forEach(item=>{
- item.id=null
- })
+ this.form.ethicalreviewopinionsList.forEach(item => {
+ item.id = null;
+ });
try {
const submitData = {
...this.form,
@@ -1428,8 +1525,10 @@
response = await ethicalreviewadd(submitData);
}
- if (response.code === 200) {
+ if (response.code == 200) {
this.$message.success("淇濆瓨鎴愬姛");
+ // 淇濆瓨鎴愬姛鍚庢洿鏂板師濮嬫暟鎹�
+ this.saveOriginalData();
this.isEdit = false;
if (!this.form.id && response.data && response.data.id) {
this.form.id = response.data.id;
@@ -1471,7 +1570,7 @@
const response = await ethicalreviewedit(updateData);
- if (response.code === 200) {
+ if (response.code == 200) {
this.$message.success("瀹℃煡鐘舵�佸凡鏇存柊涓哄畬鎴�");
this.form.status = "3";
this.form.endTime = updateData.endTime;
@@ -1523,7 +1622,7 @@
const response = await ethicalreviewedit(updateData);
- if (response.code === 200) {
+ if (response.code == 200) {
this.$message.success("瀹℃煡宸蹭腑姝紝鎵�鏈変笓瀹剁姸鎬佸凡鏇存柊");
this.form.status = "2";
} else {
@@ -1555,7 +1654,7 @@
try {
const updateData = {
...this.form,
- status: "2", // 瀹℃煡涓
+ status: "4", // 瀹℃煡涓
endTime: new Date()
.toISOString()
.replace("T", " ")
@@ -1564,9 +1663,9 @@
const response = await ethicalreviewedit(updateData);
- if (response.code === 200) {
+ if (response.code == 200) {
this.$message.success("瀹℃煡宸茬粨鏉�");
- this.form.status = "2";
+ this.form.status = "4";
this.form.endTime = updateData.endTime;
} else {
this.$message.error("鎿嶄綔澶辫触锛�" + (response.msg || "鏈煡閿欒"));
@@ -1586,13 +1685,255 @@
this.expertDialogVisible = true;
this.loadExperts();
},
+ /**
+ * 鍒锋柊椤甸潰鏁版嵁
+ */
+ async refreshPageData() {
+ try {
+ // 閲嶇疆鏁版嵁鐘舵��
+ this.isDataLoaded = false;
+ // 娓呯┖褰撳墠鏁版嵁
+ this.form = {
+ id: undefined,
+ infoid: undefined,
+ caseNo: "",
+ initiateTheme: "",
+ initiatePerson: "",
+ status: "0",
+ startTime: "",
+ cutOffTime: "",
+ endTime: "",
+ expertName: "",
+ expertNo: "",
+ expertType: "0",
+ expertConclusion: "",
+ expertOpinion: "",
+ expertTime: "",
+ orderNo: 1,
+ remark: "",
+ annexfilesList: [],
+ filePatch: "",
+ ethicalreviewopinionsList: [],
+ createBy: "",
+ createTime: "",
+ updateBy: "",
+ updateTime: "",
+ delFlag: "0"
+ };
+
+ this.attachmentFileList = [];
+ this.originalFormData = null;
+ this.originalExpertList = null;
+ this.originalAttachments = null;
+
+ // 閲嶆柊鑾峰彇鏁版嵁
+ if (this.id) {
+ await this.getDetail(this.infoid, this.id);
+ } else if (this.infoid) {
+ await this.getDetail(this.infoid, null);
+ } else {
+ this.$message.warning("鏃犳硶鍒锋柊锛岀己灏戝繀瑕佺殑鍙傛暟");
+ }
+
+ this.$message.success("鏁版嵁鍒锋柊鎴愬姛");
+ } catch (error) {
+ console.error("鍒锋柊鏁版嵁澶辫触:", error);
+ this.$message.error("鍒锋柊鏁版嵁澶辫触锛岃閲嶈瘯");
+ }
+ },
+
+ /**
+ * 澶勭悊椤甸潰鍒锋柊
+ * 妫�鏌ユ槸鍚︽湁鏈繚瀛樻暟鎹紝纭鍚庡埛鏂伴〉闈�
+ */
+ handleRefresh() {
+ // 妫�鏌ユ槸鍚︽湁鏈繚瀛樼殑缂栬緫
+ if (this.hasUnsavedChanges()) {
+ this.$confirm(
+ "褰撳墠鏈夋湭淇濆瓨鐨勬暟鎹紝鍒锋柊椤甸潰灏嗕涪澶辫繖浜涙洿鏀广�傛槸鍚︾户缁埛鏂帮紵",
+ "璀﹀憡",
+ {
+ confirmButtonText: "缁х画鍒锋柊",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ distinguishCancelAndClose: true,
+ beforeClose: (action, instance, done) => {
+ if (action === "confirm") {
+ instance.confirmButtonLoading = true;
+ instance.confirmButtonText = "鍒锋柊涓�...";
+
+ // 寤惰繜鎵ц浠ョ‘淇漊I鏇存柊
+ setTimeout(() => {
+ done();
+ instance.confirmButtonLoading = false;
+
+ // 鐢ㄦ埛纭鍒锋柊
+ this.refreshPageData();
+ }, 300);
+ } else {
+ this.$message({
+ type: "info",
+ message: "宸插彇娑堝埛鏂�"
+ });
+ done();
+ }
+ }
+ }
+ ).catch(action => {
+ if (action === "cancel") {
+ this.$message({
+ type: "info",
+ message: "宸插彇娑堝埛鏂�"
+ });
+ }
+ });
+ } else {
+ // 娌℃湁鏈繚瀛樼殑缂栬緫锛岀洿鎺ュ埛鏂�
+ this.refreshPageData();
+ }
+ },
+ // 妫�鏌ユ槸鍚︽湁鏈繚瀛樼殑鏁版嵁鍙樺寲
+ hasUnsavedChanges() {
+ if (!this.isDataLoaded) {
+ return false; // 鏁版嵁鏈姞杞斤紝鏃犻渶妫�娴�
+ }
+
+ // 1. 妫�鏌ヨ〃鍗曞瓧娈靛彉鍖�
+ const formFieldsChanged = this.checkFormFieldsChanged();
+
+ // 2. 妫�鏌ヤ笓瀹跺垪琛ㄥ彉鍖�
+ const expertListChanged = this.checkExpertListChanged();
+
+ // 3. 妫�鏌ラ檮浠跺垪琛ㄥ彉鍖�
+ const attachmentsChanged = this.checkAttachmentsChanged();
+
+ return formFieldsChanged || expertListChanged || attachmentsChanged;
+ },
+
+ // 妫�鏌ヨ〃鍗曞瓧娈垫槸鍚︽湁鍙樺寲
+ checkFormFieldsChanged() {
+ if (!this.originalFormData) return false;
+
+ const formKeys = [
+ "initiateTheme",
+ "initiatePerson",
+ "status",
+ "expertConclusion",
+ "expertOpinion",
+ "expertTime",
+ "remark"
+ ];
+
+ for (const key of formKeys) {
+ if (this.form[key] !== this.originalFormData[key]) {
+ console.log(
+ `琛ㄥ崟瀛楁鍙樺寲: ${key}`,
+ this.form[key],
+ this.originalFormData[key]
+ );
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ // 妫�鏌ヤ笓瀹跺垪琛ㄥ彉鍖�
+ checkExpertListChanged() {
+ if (!this.originalExpertList || !this.form.ethicalreviewopinionsList) {
+ return false;
+ }
+
+ const original = this.originalExpertList;
+ const current = this.form.ethicalreviewopinionsList;
+
+ // 1. 妫�鏌ユ暟閲忓彉鍖�
+ if (original.length !== current.length) {
+ console.log("涓撳鏁伴噺鍙樺寲:", original.length, "->", current.length);
+ return true;
+ }
+
+ // 2. 妫�鏌ユ瘡涓笓瀹剁殑鍙樺寲
+ for (let i = 0; i < original.length; i++) {
+ const origExpert = original[i];
+ const currExpert = current[i];
+
+ // 妫�鏌ュ叧閿瓧娈靛彉鍖�
+ const fieldsToCheck = [
+ "expertconclusion",
+ "expertopinion",
+ "receiveStatus",
+ "conclusiontime",
+ "startTime",
+ "endTime",
+ "sendType"
+ ];
+
+ for (const field of fieldsToCheck) {
+ if (origExpert[field] !== currExpert[field]) {
+ console.log(
+ `涓撳${i}鐨�${field}瀛楁鍙樺寲:`,
+ origExpert[field],
+ "->",
+ currExpert[field]
+ );
+ return true;
+ }
+ }
+ }
+
+ return false;
+ },
+
+ // 妫�鏌ラ檮浠跺垪琛ㄥ彉鍖�
+ checkAttachmentsChanged() {
+ if (!this.originalAttachments || !this.form.annexfilesList) {
+ return false;
+ }
+
+ const original = this.originalAttachments;
+ const current = this.form.annexfilesList;
+
+ // 妫�鏌ユ暟閲忓彉鍖�
+ if (original.length !== current.length) {
+ console.log("闄勪欢鏁伴噺鍙樺寲:", original.length, "->", current.length);
+ return true;
+ }
+
+ // 妫�鏌ユ枃浠跺悕鍙樺寲锛堥�氬父闄勪欢涓嶄細淇敼锛屽彧澧炲垹锛�
+ const originalFileNames = original.map(f => f.fileName || f.name).sort();
+ const currentFileNames = current.map(f => f.fileName || f.name).sort();
+
+ for (let i = 0; i < originalFileNames.length; i++) {
+ if (originalFileNames[i] !== currentFileNames[i]) {
+ console.log(
+ "闄勪欢鏂囦欢鍚嶅彉鍖�:",
+ originalFileNames[i],
+ "->",
+ currentFileNames[i]
+ );
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ // 娴忚鍣ㄧ寮�椤甸潰妫�娴�
+ beforeUnloadHandler(event) {
+ if (this.hasUnsavedChanges()) {
+ const message = "鎮ㄦ湁鏈繚瀛樼殑鏇存敼锛岀‘瀹氳绂诲紑鍚楋紵";
+ event.returnValue = message; // 鏍囧噯鏂瑰紡
+ return message; // 鏌愪簺娴忚鍣ㄩ渶瑕佽繑鍥炲瓧绗︿覆
+ }
+ },
// 鍔犺浇涓撳鍒楄〃
async loadExperts() {
try {
this.expertListLoading = true;
const params = {
- usertype: "浼︾悊涓撳", // 浼︾悊涓撳
+ usertype: "ethical", // 浼︾悊涓撳
pageNum: this.expertPage.pageNum,
pageSize: this.expertPage.pageSize
};
@@ -1602,7 +1943,7 @@
}
const response = await listExternalperson(params);
- if (response.code === 200) {
+ if (response.code == 200) {
this.expertList = response.rows || [];
this.expertTotal = response.total || 0;
} else {
@@ -1639,7 +1980,7 @@
// 纭娣诲姞涓撳
handleConfirmAddExpert() {
- if (this.selectedExperts.length === 0) {
+ if (this.selectedExperts.length == 0) {
this.$message.warning("璇烽�夋嫨瑕佹坊鍔犵殑涓撳");
return;
}
@@ -1664,7 +2005,7 @@
expertType: isChief ? "1" : "0", // 涓讳换濮斿憳璁剧疆涓轰富濮斾笓瀹�
deptName: expert.unitname || "",
title: expert.title || "",
- deptname: expert.telephone || "",
+ donorno: expert.telephone || "",
receiveStatus: "0", // 寰呮帴鏀�
expertconclusion: "",
expertopinion: "",
@@ -1736,8 +2077,8 @@
// 鍙戦�佺粰鍗曚釜涓撳
handleSendToExpert(expert) {
this.currentSendExperts = [expert];
- this.sendForm.expertType = expert.expertType === "1" ? "chief" : "normal";
- this.sendForm.endTime = expert.expertType === "1" ? "" : ""; // 涓诲涓撳鏃犻渶鎴鏃堕棿
+ this.sendForm.expertType = expert.expertType == "1" ? "chief" : "normal";
+ this.sendForm.endTime = expert.expertType == "1" ? "" : ""; // 涓诲涓撳鏃犻渶鎴鏃堕棿
this.sendDialogVisible = true;
},
@@ -1784,40 +2125,52 @@
return;
}
- if (this.currentSendExperts.length === 0) {
+ if (this.currentSendExperts.length == 0) {
this.$message.warning("娌℃湁鎵惧埌鍙彂閫佺殑涓撳");
return;
}
- this.sending = true;
+ // 鍒濆鍖栧彂閫佺姸鎬�
+ this.sendingAll = true;
+ this.sendingProgress = 0;
+ this.sendingTotal = this.currentSendExperts.length;
+ this.sendingSuccessCount = 0;
+ this.sendingFailCount = 0;
+ this.sendingResults = [];
+
+ // 鍒涘缓涓�涓繘搴﹀璇濇
+ const progressDialog = this.$message({
+ type: "info",
+ message: `姝e湪鍙戦�侀�氱煡锛岃绋嶅��... (0/${this.sendingTotal})`,
+ duration: 0, // 涓嶄細鑷姩鍏抽棴
+ showClose: true
+ });
+
try {
- // 鍙戦�佺粰姣忎釜涓撳
- const sendPromises = this.currentSendExperts.map(async expert => {
+ // 浣跨敤Promise鏁扮粍鏉ラ『搴忔墽琛屽彂閫�
+ for (let i = 0; i < this.currentSendExperts.length; i++) {
+ const expert = this.currentSendExperts[i];
+
+ // 鏇存柊杩涘害
+ this.sendingProgress = i;
+ progressDialog.message = `姝e湪鍙戦�侀�氱煡锛岃绋嶅��... (${i}/${this.sendingTotal})`;
+
try {
- // 鏋勫缓鍙戦�佹暟鎹�
- const sendData = {
- number: expert.deptname || "", // 鐢ㄦ埛鎵嬫満鍙�
- title: this.sendForm.title,
- url: this.sendForm.url || "",
+ // 鍙戦�佸崟涓笓瀹堕�氱煡
+ const result = await this.sendSingleExpert(expert, i);
+ this.sendingResults.push(result);
- createTime: new Date()
- .toISOString()
- .replace("T", " ")
- .substring(0, 19)
- };
+ if (result.success) {
+ this.sendingSuccessCount++;
- // 璋冪敤鍙戦�侀�氱煡鎺ュ彛
- const response = await sendNotification(sendData);
-
- if (response.code === 200) {
// 鏇存柊涓撳鐘舵��
const index = this.form.ethicalreviewopinionsList.findIndex(
e =>
- e.expertNo === expert.expertNo ||
- e.expertname === expert.expertname
+ e.expertNo == expert.expertNo ||
+ e.expertname == expert.expertname
);
- if (index !== -1) {
+ if (index != -1) {
this.form.ethicalreviewopinionsList[index].receiveStatus = "1"; // 宸叉帴鏀�
this.form.ethicalreviewopinionsList[
index
@@ -1842,42 +2195,49 @@
this.form.ethicalreviewopinionsList[index]
);
}
-
- return { success: true, expert: expert.expertname };
} else {
- return {
- success: false,
- expert: expert.expertname,
- error: response.msg
- };
+ this.sendingFailCount++;
}
} catch (error) {
console.error(`鍙戦�佺粰涓撳 ${expert.expertname} 澶辫触:`, error);
- return {
+ this.sendingResults.push({
success: false,
expert: expert.expertname,
error: error.message
- };
+ });
+ this.sendingFailCount++;
}
- });
- // 绛夊緟鎵�鏈夊彂閫佸畬鎴�
- const results = await Promise.all(sendPromises);
-
- // 缁熻鍙戦�佺粨鏋�
- const successCount = results.filter(r => r.success).length;
- const failCount = results.filter(r => !r.success).length;
-
- if (failCount === 0) {
- this.$message.success(`鎴愬姛鍙戦�佺粰 ${successCount} 浣嶄笓瀹禶);
- } else if (successCount > 0) {
- this.$message.warning(
- `鎴愬姛鍙戦�佺粰 ${successCount} 浣嶄笓瀹讹紝澶辫触 ${failCount} 浣峘
- );
- } else {
- this.$message.error("鍙戦�佸け璐ワ紝璇风◢鍚庨噸璇�");
+ // 濡傛灉涓嶆槸鏈�鍚庝竴涓紝绛夊緟100ms鍐嶅彂閫佷笅涓�涓�
+ if (i < this.currentSendExperts.length - 1) {
+ await this.sleep(100);
+ }
}
+ // 瀹屾垚杩涘害
+ this.sendingProgress = this.sendingTotal;
+ progressDialog.message = `鍙戦�佸畬鎴愶紝鎴愬姛 ${this.sendingSuccessCount} 涓紝澶辫触 ${this.sendingFailCount} 涓猔;
+
+ // 寤惰繜1绉掑悗鍏抽棴杩涘害瀵硅瘽妗�
+ await this.sleep(1000);
+ progressDialog.close();
+
+ // 鏄剧ず鏈�缁堢粨鏋�
+ if (this.sendingFailCount == 0) {
+ this.$message.success(
+ `鎴愬姛鍙戦�佺粰 ${this.sendingSuccessCount} 浣嶄笓瀹禶
+ );
+ } else if (this.sendingSuccessCount > 0) {
+ this.$message.warning(
+ `鎴愬姛鍙戦�佺粰 ${this.sendingSuccessCount} 浣嶄笓瀹讹紝澶辫触 ${this.sendingFailCount} 浣峘
+ );
+ // 濡傛灉鏈夊け璐ワ紝鍙互鏄剧ず璇︾粏澶辫触淇℃伅
+ this.showFailedDetails();
+ } else {
+ this.$message.error("鍏ㄩ儴鍙戦�佸け璐ワ紝璇风◢鍚庨噸璇�");
+ }
+
+ // 鍏抽棴鍙戦�佸璇濇
this.sendDialogVisible = false;
this.sendForm = {
expertType: "normal",
@@ -1890,14 +2250,99 @@
url: ""
};
this.currentSendExperts = [];
+ // 淇濆瓨鏁翠釜鍗曟嵁
+ this.handleSave();
} catch (error) {
- console.error("鍙戦�佸け璐�:", error);
- this.$message.error("鍙戦�佸け璐ワ紝璇烽噸璇�");
+ console.error("鍙戦�佽繃绋嬩腑鍙戠敓閿欒:", error);
+ progressDialog.close();
+ this.$message.error("鍙戦�佽繃绋嬩腑鍙戠敓閿欒锛岃閲嶈瘯");
} finally {
- this.sending = false;
+ this.sendingAll = false;
+ }
+ },
+ // 鍙戦�佸崟涓笓瀹剁殑鏂规硶
+ async sendSingleExpert(expert, index) {
+ try {
+ // 鏋勫缓鍙戦�佹暟鎹�
+ const sendData = {
+ number: expert.deptname || "", // 鐢ㄦ埛鎵嬫満鍙�
+ title: this.sendForm.title,
+ url: this.sendForm.url || "",
+ createTime: new Date()
+ .toISOString()
+ .replace("T", " ")
+ .substring(0, 19)
+ };
+
+ console.log(`姝e湪鍙戦�佺 ${index + 1} 涓笓瀹�: ${expert.expertname}`);
+
+ // 璋冪敤鍙戦�侀�氱煡鎺ュ彛
+ // const response = await sendNotification(sendData);
+ const response = await sendcall({
+ tel: expert.donorno ? expert.donorno : 13634195431, // 杩欓噷搴旇鏄� expert.deptname 鎴� expert.phone
+ messageContent:
+ "闈掑矝澶у闄勫睘鍖婚櫌涓婃姤娼滃湪鎹愮尞妗堜緥锛岃鐧诲綍OPO绯荤粺鏌ョ湅璇︾粏淇℃伅锛屽強鏃惰繘琛屽鎺ャ�傜櫥褰曢摼鎺�:https://brdeddd.qduhosos.cn/dklejdj/deljf/index"
+ });
+
+ if (response.code == 200) {
+ return {
+ success: true,
+ expert: expert.expertname,
+ index: index
+ };
+ } else {
+ return {
+ success: false,
+ expert: expert.expertname,
+ index: index,
+ error: response.msg
+ };
+ }
+ } catch (error) {
+ console.error(`鍙戦�佺粰涓撳 ${expert.expertname} 澶辫触:`, error);
+ return {
+ success: false,
+ expert: expert.expertname,
+ index: index,
+ error: error.message
+ };
}
},
+ // 鏄剧ず澶辫触璇︽儏鐨勬柟娉�
+ showFailedDetails() {
+ const failedExperts = this.sendingResults.filter(r => !r.success);
+ if (failedExperts.length > 0) {
+ this.$confirm(
+ `鏈� ${failedExperts.length} 浣嶄笓瀹跺彂閫佸け璐ワ紝鏄惁鏌ョ湅澶辫触璇︽儏锛焋,
+ "鍙戦�佺粨鏋�",
+ {
+ confirmButtonText: "鏌ョ湅璇︽儏",
+ cancelButtonText: "鍏抽棴",
+ type: "warning"
+ }
+ )
+ .then(() => {
+ let detailMessage = "鍙戦�佸け璐ョ殑涓撳锛歕n\n";
+ failedExperts.forEach((expert, index) => {
+ detailMessage += `${index + 1}. ${expert.expert}: ${
+ expert.error
+ }\n`;
+ });
+
+ this.$alert(detailMessage, "鍙戦�佸け璐ヨ鎯�", {
+ confirmButtonText: "纭畾",
+ customClass: "failed-details-dialog"
+ });
+ })
+ .catch(() => {});
+ }
+ },
+
+ // 鐫$湢鍑芥暟锛岀敤浜庨棿闅�
+ sleep(ms) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+ },
// 鍒犻櫎涓撳瀹℃煡
handleDeleteExpertReview(expert, index) {
this.$confirm("纭畾瑕佸垹闄よ涓撳鐨勫鏌ヨ褰曞悧锛�", "鎻愮ず", {
@@ -1931,7 +2376,7 @@
const response = await ethicalreExpertTotal(params);
- if (response && response.code === 200) {
+ if (response && response.code == 200) {
this.expertHistoryData = response.data || response[0] || null;
} else {
this.$message.error(
@@ -2171,11 +2616,82 @@
.selected-case-info {
margin-bottom: 20px;
}
+/* 鍙戦�佽繘搴︽牱寮� */
+.send-progress-container {
+ margin: 20px 0;
+ padding: 20px;
+ background: #f5f7fa;
+ border-radius: 8px;
+}
+.send-stats {
+ display: flex;
+ justify-content: center;
+ gap: 30px;
+ margin-top: 10px;
+}
+
+.stat-item {
+ font-size: 14px;
+ font-weight: 500;
+ padding: 4px 12px;
+ border-radius: 4px;
+}
+
+.stat-item.success {
+ color: #67c23a;
+ background: #f0f9eb;
+}
+
+.stat-item.fail {
+ color: #f56c6c;
+ background: #fef0f0;
+}
+
+/* 澶辫触璇︽儏瀵硅瘽妗� */
+.failed-details-dialog {
+ min-width: 400px;
+ max-width: 600px;
+}
+
+.failed-details-dialog .el-message-box__content {
+ max-height: 400px;
+ overflow-y: auto;
+ white-space: pre-wrap;
+ word-break: break-word;
+}
.case-info-card {
border-left: 4px solid #67c23a;
}
+/* 鍦–SS涓坊鍔� */
+:deep(.el-message-box) {
+ max-width: 500px;
+}
+/* 娣诲姞鏈繚瀛樼姸鎬佹牱寮� */
+.unsaved-hint {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ background: #e6a23c;
+ color: white;
+ padding: 4px 8px;
+ border-radius: 4px;
+ font-size: 12px;
+ animation: pulse 2s infinite;
+}
+
+@keyframes pulse {
+ 0% {
+ opacity: 0.8;
+ }
+ 50% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0.8;
+ }
+}
/* 鍝嶅簲寮忚璁� */
@media (max-width: 768px) {
.ethics-review-detail {
diff --git a/src/views/business/maintain/maintainInfo.vue b/src/views/business/maintain/maintainInfo.vue
index 78cd766..ec052b2 100644
--- a/src/views/business/maintain/maintainInfo.vue
+++ b/src/views/business/maintain/maintainInfo.vue
@@ -55,8 +55,17 @@
<el-tag
:type="scope.row.result === '闃存��' ? 'success' : 'danger'"
effect="plain"
+ @click="handleResultClick(scope.row)"
+ style="cursor: pointer;"
>
{{ scope.row.result }}
+ <i
+ v-if="
+ scope.row.result === '闃虫��' && scope.row.positiveDetails
+ "
+ class="el-icon-info"
+ style="margin-left: 4px;"
+ ></i>
</el-tag>
</template>
</el-table-column>
@@ -263,6 +272,7 @@
v-model="cultureForm.result"
placeholder="璇烽�夋嫨鍩瑰吇缁撴灉"
style="width: 100%"
+ @change="handleResultChange"
>
<el-option label="闃存��" value="闃存��" />
<el-option label="闃虫��" value="闃虫��" />
@@ -270,7 +280,19 @@
</el-form-item>
</el-col>
</el-row>
-
+ <el-form-item
+ v-if="cultureForm.result === '闃虫��'"
+ label="闃虫�ц鎯�"
+ prop="positiveDetails"
+ >
+ <el-input
+ type="textarea"
+ :rows="2"
+ v-model="cultureForm.positiveDetails"
+ placeholder="璇疯緭鍏ラ槼鎬х粨鏋滅殑璇︾粏淇℃伅"
+ clearable
+ />
+ </el-form-item>
<el-form-item label="闄勪欢">
<UploadAttachment
ref="cultureUploadAttachment"
@@ -502,6 +524,7 @@
cultureType: "",
sampleTime: "",
result: "闃存��",
+ positiveDetails: "", // 鏂板锛氶槼鎬ц鎯�
attachments: []
},
cultureFileList: [],
@@ -514,7 +537,8 @@
],
result: [
{ required: true, message: "璇烽�夋嫨鍩瑰吇缁撴灉", trigger: "change" }
- ]
+ ],
+ positiveDetails: [] // 鍔ㄦ�侀獙璇佽鍒�
},
cultureTypeOptions: [
{ value: "1", label: "琛�鍩瑰吇" },
@@ -661,7 +685,46 @@
this.recordLoading = false;
}
},
+ // 澶勭悊鍩瑰吇缁撴灉閫夋嫨鍙樺寲
+ handleResultChange(value) {
+ this.$nextTick(() => {
+ if (value === "闃虫��") {
+ this.cultureRules.positiveDetails = [
+ { required: true, message: "璇疯緭鍏ラ槼鎬ц鎯�", trigger: "blur" }
+ ];
+ } else {
+ this.cultureRules.positiveDetails = [];
+ this.cultureForm.positiveDetails = "";
+ }
+ // 娓呴櫎楠岃瘉
+ if (this.$refs.cultureForm) {
+ this.$refs.cultureForm.clearValidate("positiveDetails");
+ }
+ });
+ },
+ // 澶勭悊鐐瑰嚮鍩瑰吇缁撴灉鏍囩
+ handleResultClick(row) {
+ if (row.result === "闃虫��" && row.positiveDetails) {
+ this.$alert(
+ `<div style="padding: 10px;">
+ <h4 style="margin-bottom: 10px; color: #f56c6c;">闃虫�ц鎯咃細</h4>
+ <div style="background: #fef0f0; padding: 15px; border-radius: 4px; border-left: 4px solid #f56c6c;">
+ <p style="margin: 0; white-space: pre-wrap; line-height: 1.5;">${row.positiveDetails}</p>
+ </div>
+ </div>`,
+ "闃虫�х粨鏋滆鎯�",
+ {
+ dangerouslyUseHTMLString: true,
+ confirmButtonText: "鍏抽棴",
+ customClass: "result-details-dialog",
+ showClose: false
+ }
+ );
+ } else if (row.result === "闃虫��") {
+ this.$message.warning("璇ラ槼鎬ц褰曟殏鏃犺鎯呬俊鎭�");
+ }
+ },
// 淇濆瓨鎵�鏈夋暟鎹�
async handleSave() {
try {
@@ -747,9 +810,13 @@
});
},
+ // 5. 淇敼缂栬緫鍩瑰吇璁板綍鏂规硶
handleEditCulture(row) {
this.cultureDialogTitle = "缂栬緫鍩瑰吇璁板綍";
- this.cultureForm = { ...row };
+ this.cultureForm = {
+ ...row,
+ positiveDetails: row.positiveDetails || "" // 纭繚鏈塸ositiveDetails瀛楁
+ };
this.cultureFileList = row.attachments
? row.attachments.map(item => ({
uid: item.id || Math.random(),
@@ -763,27 +830,44 @@
this.cultureDialogVisible = true;
this.$nextTick(() => {
this.$refs.cultureForm && this.$refs.cultureForm.clearValidate();
+ // 濡傛灉缂栬緫鏃舵槸闃虫�х粨鏋滐紝璁剧疆楠岃瘉瑙勫垯
+ if (row.result === "闃虫��") {
+ this.cultureRules.positiveDetails = [
+ { required: true, message: "璇疯緭鍏ラ槼鎬ц鎯�", trigger: "blur" }
+ ];
+ }
});
},
+ // 6. 淇敼淇濆瓨鍩瑰吇璁板綍鏂规硶
handleSaveCulture() {
this.$refs.cultureForm.validate(valid => {
if (valid) {
this.cultureSaveLoading = true;
- if (this.cultureForm.id) {
+ // 鏋勫缓淇濆瓨鏁版嵁
+ const saveData = {
+ ...this.cultureForm,
+ // 濡傛灉鏄槾鎬э紝娓呯┖闃虫�ц鎯�
+ positiveDetails:
+ this.cultureForm.result === "闃虫��"
+ ? this.cultureForm.positiveDetails || ""
+ : ""
+ };
+
+ if (saveData.id) {
const index = this.cultureList.findIndex(
- item => item.id === this.cultureForm.id
+ item => item.id === saveData.id
);
if (index !== -1) {
- this.cultureList.splice(index, 1, { ...this.cultureForm });
+ this.cultureList.splice(index, 1, { ...saveData });
}
} else {
- this.cultureForm.id = Date.now();
- this.cultureList.push({ ...this.cultureForm });
+ saveData.id = Date.now();
+ this.cultureList.push({ ...saveData });
}
- this.$message.success(this.cultureForm.id ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
+ this.$message.success(saveData.id ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
this.cultureDialogVisible = false;
this.cultureSaveLoading = false;
}
@@ -1171,4 +1255,22 @@
font-size: 13px;
margin-left: 8px;
}
+/* 7. 娣诲姞涓�浜涙牱寮� */
+.result-details-dialog {
+ width: 500px;
+}
+
+.result-details-dialog .el-message-box__content {
+ padding: 0;
+}
+
+.result-details-dialog .el-message-box__header {
+ background: #fef0f0;
+ border-bottom: 1px solid #fde2e2;
+}
+
+.result-details-dialog .el-message-box__title {
+ color: #f56c6c;
+ font-weight: bold;
+}
</style>
diff --git a/src/views/business/transfer/TransportEdit.vue b/src/views/business/transfer/TransportEdit.vue
index bae6f58..e37071e 100644
--- a/src/views/business/transfer/TransportEdit.vue
+++ b/src/views/business/transfer/TransportEdit.vue
@@ -149,6 +149,24 @@
</el-form-item>
</el-col>
</el-row>
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="ICU璇勪及鍖荤敓" prop="icuDoctor">
+ <el-input
+ v-model="formData.icuDoctor"
+ placeholder="璇疯緭鍏CU璇勪及鍖荤敓"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="ICU鍖荤敓鐢佃瘽" prop="icuDoctorPhone">
+ <el-input
+ v-model="formData.icuDoctorPhone"
+ placeholder="璇疯緭鍏CU鍖荤敓鎵嬫満鍙�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
</el-card>
<!-- 杞繍淇℃伅 -->
@@ -222,10 +240,10 @@
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="鎬ヨ瘖绉戝尰鐢�" prop="doctor">
+ <el-form-item label="杞繍鍖荤敓" prop="doctor">
<el-input
v-model="formData.doctor"
- placeholder="璇疯緭鍏ユ�ヨ瘖绉戝尰鐢�"
+ placeholder="璇疯緭鍏ヨ浆杩愬尰鐢�"
/>
</el-form-item>
</el-col>
@@ -241,7 +259,7 @@
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="鎶ゅ+" prop="nurse">
+ <el-form-item label="杞繍鎶ゅ+" prop="nurse">
<el-input v-model="formData.nurse" placeholder="璇疯緭鍏ユ姢澹鍚�" />
</el-form-item>
</el-col>
@@ -257,7 +275,7 @@
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="椹鹃┒鍛�" prop="driver">
+ <el-form-item label="杞繍椹鹃┒鍛�" prop="driver">
<el-input
v-model="formData.driver"
placeholder="璇疯緭鍏ラ┚椹跺憳濮撳悕"
@@ -274,24 +292,7 @@
</el-col>
</el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="ICU璇勪及鍖荤敓" prop="icuDoctor">
- <el-input
- v-model="formData.icuDoctor"
- placeholder="璇疯緭鍏CU璇勪及鍖荤敓"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="ICU鍖荤敓鐢佃瘽" prop="icuDoctorPhone">
- <el-input
- v-model="formData.icuDoctorPhone"
- placeholder="璇疯緭鍏CU鍖荤敓鎵嬫満鍙�"
- />
- </el-form-item>
- </el-col>
- </el-row>
+
</el-card>
<!-- 闄勪欢淇℃伅 -->
diff --git a/src/views/business/transfer/index.vue b/src/views/business/transfer/index.vue
index bbf0b4d..cb73d73 100644
--- a/src/views/business/transfer/index.vue
+++ b/src/views/business/transfer/index.vue
@@ -217,34 +217,49 @@
>
<template slot-scope="scope">
<el-button
- size="mini"
- type="text"
- icon="el-icon-view"
+ size="small"
+ type="primary"
@click="handleDetail(scope.row)"
>璇︽儏</el-button
>
<el-button
- size="mini"
- type="text"
- icon="el-icon-edit"
+ size="small"
+ type="primary"
+ style="margin-bottom: 10px;"
+ plain
@click="handleUpdate(scope.row)"
>缂栬緫</el-button
>
<el-button
- size="mini"
- type="text"
- icon="el-icon-video-play"
+ size="small"
+ type="primary"
+ plain
@click="handleStartTransport(scope.row)"
v-if="scope.row.transitStatus === 1"
>寮�濮嬭浆杩�</el-button
>
<el-button
- size="mini"
- type="text"
- icon="el-icon-check"
+ size="small"
+ type="success"
+ plain
@click="handleCompleteTransport(scope.row)"
v-if="scope.row.transitStatus === 2"
>瀹屾垚杞繍</el-button
+ ><el-button
+ size="small"
+ type="danger"
+ plain
+ @click="cancelTransport(scope.row)"
+ v-if="scope.row.transitStatus === 2"
+ >鍙栨秷杞繍</el-button
+ >
+ <el-button
+ size="small"
+ type="warning"
+ plain
+ @click="recoverTransport(scope.row)"
+ v-if="scope.row.transitStatus === 4"
+ >鎭㈠杞繍</el-button
>
</template>
</el-table-column>
@@ -664,6 +679,8 @@
// 鍏朵粬瀛楁鍙互鏍规嵁闇�瑕佷粠妗堜緥涓幏鍙�
transportStartPlace: caseData.treatmenthospitalname || "",
contactPerson: caseData.coordinatorName || "",
+ icuDoctor: caseData.icuDoctor,
+ icuDoctorPhone: caseData.icuDoctorPhone,
transitStatus: 1, // 榛樿寰呰浆杩�
// 娓呯┖鍏朵粬瀛楁
id: undefined,
@@ -793,6 +810,18 @@
this.actionTitle = "瀹屾垚杞繍";
this.actionText = "瀹屾垚";
this.actionOpen = true;
+ } /** 瀹屾垚杞繍鎿嶄綔 */,
+ async cancelTransport(row) {
+ this.currentTransport = row;
+ this.actionTitle = "鍙栨秷杞繍";
+ this.actionText = "鍙栨秷";
+ this.actionOpen = true;
+ } /** 瀹屾垚杞繍鎿嶄綔 */,
+ async recoverTransport(row) {
+ this.currentTransport = row;
+ this.actionTitle = "鎭㈠杞繍";
+ this.actionText = "鎭㈠";
+ this.actionOpen = true;
},
/** 纭鎿嶄綔 */
@@ -806,13 +835,19 @@
requestData.transitStatus = 2; // 璁剧疆涓鸿浆杩愪腑
} else if (this.actionText === "瀹屾垚") {
requestData.transitStatus = 3; // 璁剧疆涓鸿浆杩愬畬鎴�
+ } else if (this.actionText === "鍙栨秷") {
+ requestData.transitStatus = 4; // 璁剧疆涓鸿浆杩愬彇娑�
+ } else if (this.actionText === "鎭㈠") {
+ requestData.transitStatus = 2; // 璁剧疆涓鸿浆杩愪腑
}
-
+ requestData.annexfilesList.forEach(item => {
+ item.id = null;
+ });
const response = await transportEdit(requestData);
if (response.code == 200) {
this.$modal.msgSuccess(`${this.actionText}杞繍鎴愬姛`);
- if (requestData.transitStatus==3) {
+ if (requestData.transitStatus == 3) {
const resappear = await donateInfo(requestData.reportId);
if (resappear.code) {
let obj = resappear.data;
diff --git a/src/views/login.vue b/src/views/login.vue
index 6a50751..0f6a635 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -139,7 +139,8 @@
this.getCode();
this.getCookie();
this.getAuthCode();
- this.loginForm.password=this.generatePassword();
+ this.loginForm.password='';
+ // this.loginForm.password=this.generatePassword();
// this.avoidLogin();
},
methods: {
diff --git a/src/views/project/DonationProcess/index.vue b/src/views/project/DonationProcess/index.vue
index da4d64d..4fa2c40 100644
--- a/src/views/project/DonationProcess/index.vue
+++ b/src/views/project/DonationProcess/index.vue
@@ -195,12 +195,13 @@
/>
</template>
</el-table-column>
- <el-table-column
- label="浼犳煋鐥�"
- align="center"
- prop="infectious"
- width="180"
- />
+ <el-table-column label="浼犳煋鐥�" align="center" prop="infectious">
+ <template slot-scope="scope">
+ <span v-for="item in scope.row.infectious.split(',')"
+ ><dict-tag :options="dict.type.sys_Infectious" :value="item" />
+ </span>
+ </template>
+ </el-table-column>
<el-table-column
label="棣栬瘖鍖婚櫌"
@@ -405,6 +406,7 @@
"sys_donornode",
"sys_BloodType",
"sys_EthicalReview",
+ 'sys_Infectious',
"sys_BaseAssessConclusion"
],
data() {
diff --git a/src/views/project/distributedetail/index.vue b/src/views/project/distributedetail/index.vue
index 60f494f..5341493 100644
--- a/src/views/project/distributedetail/index.vue
+++ b/src/views/project/distributedetail/index.vue
@@ -188,7 +188,7 @@
<dict-tag :options="dict.type.sys_user_sex" :value="scope.row.sex"/>
</template>
</el-table-column>
- <el-table-column label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" align="center" prop="familyrelations">
+ <el-table-column label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" align="center" prop="familyrelations">
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_FamilyRelation" :value="scope.row.familyrelations"/>
</template>
@@ -240,7 +240,7 @@
</template>
</el-table-column>
</el-table>
-
+
<pagination
v-show="total>0"
:total="total"
@@ -296,8 +296,8 @@
></el-option>
</el-select>
</el-form-item>
- <el-form-item label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
- <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愯禒鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
+ <el-form-item label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
+ <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愮尞鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
</el-form-item>
<el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
<el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" />
diff --git a/src/views/project/donatebaseinfo/Archivedpage.vue b/src/views/project/donatebaseinfo/Archivedpage.vue
new file mode 100644
index 0000000..dc09df0
--- /dev/null
+++ b/src/views/project/donatebaseinfo/Archivedpage.vue
@@ -0,0 +1,322 @@
+<template>
+ <div class="app-container archive-container">
+ <div class="archive-header">
+ <span class="archive-title">鎹愮尞妗堜緥褰掓。绠$悊</span>
+ <span class="archive-tag">浠呭睍绀哄凡褰掓。妗堜緥锛堜笉鍙紪杈戯級</span>
+</div>
+ <!-- 鎼滅储 -->
+ <el-card class="search-card">
+ <el-form
+ :model="queryParams"
+ ref="queryForm"
+ :inline="true"
+ v-show="showSearch"
+ label-width="70px"
+ >
+ <el-row :gutter="8">
+ <el-col :span="5">
+ <el-form-item label="濮撳悕" prop="name">
+ <el-input
+ v-model="queryParams.name"
+ placeholder="璇疯緭鍏ュ鍚�"
+ clearable
+ size="small"
+ />
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="5">
+ <el-form-item label="鎶ュ憡鍖婚櫌" prop="treatmenthospitalno">
+ <org-selecter
+ ref="orgSelecter"
+ :org-type="'3'"
+ v-model="queryParams.treatmenthospitalno"
+ />
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="9">
+ <el-form-item label="褰掓。鏃堕棿">
+ <el-date-picker
+ v-model="selecttime"
+ type="daterange"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡"
+ value-format="yyyy-MM-dd"
+ @change="getTimeList"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row>
+ <el-col :span="4">
+ <el-form-item>
+ <el-button
+ type="primary"
+ icon="el-icon-search"
+ size="mini"
+ @click="handleQuery"
+ >
+ 鎼滅储
+ </el-button>
+ <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">
+ 閲嶇疆
+ </el-button>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ </el-card>
+
+ <!-- 鎿嶄綔 -->
+ <el-row :gutter="10" class="mb8">
+ <el-col :span="1.5">
+ <el-button
+ type="warning"
+ plain
+ icon="el-icon-download"
+ size="mini"
+ :loading="exportLoading"
+ @click="handleExport"
+ >
+ 瀵煎嚭
+ </el-button>
+ </el-col>
+ </el-row>
+
+ <el-card class="table-card">
+
+ <el-table
+ v-loading="loading"
+ :data="tableList"
+ class="archive-table"
+ border
+ >
+ <el-table-column label="濮撳悕" align="center" prop="name" />
+ <el-table-column label="浣忛櫌鍙�" align="center" prop="inpatientno" />
+ <el-table-column label="鎬у埆" align="center" prop="sex">
+ <template slot-scope="scope">
+ <dict-tag
+ :options="dict.type.sys_user_sex"
+ :value="scope.row.sex"
+ />
+ </template>
+ </el-table-column>
+ <el-table-column label="骞撮緞" align="center" prop="age" />
+ <el-table-column label="琛�鍨�" align="center" prop="bloodtype">
+ <template slot-scope="scope">
+ <dict-tag
+ :options="dict.type.sys_BloodType"
+ :value="scope.row.bloodtype"
+ />
+ </template>
+ </el-table-column>
+ <el-table-column label="褰掓。鏃堕棿" align="center" prop="filingtime" />
+
+ <el-table-column
+ label="鎿嶄綔"
+ width="120"
+ align="center"
+ fixed="right"
+ >
+ <template slot-scope="scope">
+ <el-button
+ size="mini"
+ type="text"
+ style="color:#67C23A;"
+ @click="handleCancelArchive(scope.row)"
+ >
+ 鍙栨秷褰掓。
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </el-card>
+ <!-- 琛ㄦ牸 -->
+
+ <pagination
+ v-show="total > 0"
+ :total="total"
+ :page.sync="queryParams.pageNum"
+ :limit.sync="queryParams.pageSize"
+ @pagination="getList"
+ />
+ </div>
+</template>
+<script>
+import {
+ listDonatebaseinfo,
+ updateDonatebaseinfo,
+ exportDonatebaseinfo
+} from "@/api/project/donatebaseinfo";
+import OrgSelecter from "@/views/project/components/orgselect";
+
+export default {
+ name: "DonateArchive",
+ components: { OrgSelecter },
+ dicts: ["sys_user_sex", "sys_BloodType"],
+
+ data() {
+ return {
+ loading: true,
+ exportLoading: false,
+ tableList: [],
+ total: 0,
+ selecttime: [],
+
+ queryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ name: null,
+ treatmenthospitalno: null,
+ starttime: null,
+ endtime: null,
+ recordstate: "4" // 鉁� 鍙煡褰掓。妗堜緥
+ }
+ };
+ },
+
+ created() {
+ this.getList();
+ },
+
+ methods: {
+ getTimeList() {
+ if (!this.selecttime) return;
+ const [start, end] = this.selecttime;
+ this.queryParams.starttime = start;
+ this.queryParams.endtime = end;
+ },
+
+ getList() {
+ this.loading = true;
+ listDonatebaseinfo(this.queryParams).then(res => {
+ this.tableList = res.data;
+ this.total = res.total;
+ this.loading = false;
+ });
+ },
+
+ handleQuery() {
+ this.queryParams.pageNum = 1;
+ this.getList();
+ },
+
+ resetQuery() {
+ this.queryParams = {
+ pageNum: 1,
+ pageSize: 10,
+ name: null,
+ treatmenthospitalno: null,
+ starttime: null,
+ endtime: null,
+ recordstate: "4"
+ };
+ this.selecttime = [];
+ this.resetForm("queryForm");
+ this.getList();
+ },
+
+ /** 鍙栨秷褰掓。 */
+ handleCancelArchive(row) {
+ this.$confirm("纭鍙栨秷褰掓。锛熷彇娑堝悗妗堜緥灏嗘仮澶嶄负姝e父鐘舵�併��", "鎻愮ず", {
+ type: "warning"
+ }).then(async () => {
+ const res = await updateDonatebaseinfo({
+ id: row.id,
+ recordstate: "2"
+ });
+
+ if (res.code === 200) {
+ this.$modal.msgSuccess("宸插彇娑堝綊妗�");
+ this.getList();
+ } else {
+ this.$modal.msgError(res.msg || "鎿嶄綔澶辫触");
+ }
+ }).catch(() => {});
+ },
+
+ /** 瀵煎嚭 */
+ async handleExport() {
+ this.$modal.confirm("鏄惁瀵煎嚭褰掓。妗堜緥鏁版嵁锛�").then(async () => {
+ this.exportLoading = true;
+ const res = await exportDonatebaseinfo(this.queryParams);
+ this.$download.name(res.msg);
+ this.exportLoading = false;
+ }).catch(() => {});
+ }
+ }
+};
+</script>
+<style scoped>
+/* ===== 褰掓。椤甸潰鏁翠綋椋庢牸 ===== */
+.archive-container {
+ background: #f5f7fa;
+ min-height: calc(100vh - 84px);
+ padding: 20px;
+}
+
+/* ===== 椤甸潰鏍囬鍖� ===== */
+.archive-header {
+ display: flex;
+ align-items: center;
+ margin-bottom: 16px;
+}
+
+.archive-title {
+ font-size: 18px;
+ font-weight: bold;
+ color: #606266;
+}
+
+.archive-tag {
+ margin-left: 12px;
+ background: #fdf6ec;
+ color: #e6a23c;
+ border: 1px solid #faecd8;
+ padding: 4px 10px;
+ border-radius: 4px;
+ font-size: 12px;
+}
+
+/* ===== 鎼滅储鍖哄煙 ===== */
+.search-card {
+ background: #ffffff;
+ padding: 18px 20px 0;
+ border-radius: 6px;
+ margin-bottom: 16px;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04);
+}
+
+/* ===== 琛ㄦ牸鍖哄煙 ===== */
+.table-card {
+ background: #ffffff;
+ padding: 16px;
+ border-radius: 6px;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04);
+}
+
+/* ===== 褰掓。琛ㄦ牸琛屾牱寮忥紙閲嶇偣锛� ===== */
+::v-deep .archive-table .el-table__row {
+ background: #fdfbf5;
+}
+
+::v-deep .archive-table .el-table__row:hover > td {
+ background: #f9f3e3 !important;
+}
+
+/* ===== 鎿嶄綔鎸夐挳 ===== */
+.archive-action-btn {
+ color: #67c23a;
+ font-weight: 500;
+}
+
+/* ===== 绌虹姸鎬� ===== */
+.empty-archive {
+ text-align: center;
+ padding: 60px 0;
+ color: #909399;
+}
+</style>
diff --git a/src/views/project/donatebaseinfo/EditCaseModal.vue b/src/views/project/donatebaseinfo/EditCaseModal.vue
index adf8394..f89c500 100644
--- a/src/views/project/donatebaseinfo/EditCaseModal.vue
+++ b/src/views/project/donatebaseinfo/EditCaseModal.vue
@@ -181,18 +181,12 @@
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="鍏ラ櫌鏃堕棿" prop="Reporttothehospital">
- <el-input
- v-model="formData.Reporttothehospital"
- placeholder="璇疯緭鍏ュ叆闄㈡椂闂�"
- />
-
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="鍏ラ櫌绉戝" prop="treatmentdeptname">
- <el-input
- v-model="formData.treatmentdeptname"
- placeholder="璇疯緭鍏ョ瀹�"
+ <el-date-picker
+ v-model="formData.entryTime"
+ type="datetime"
+ placeholder="閫夋嫨鍏ラ櫌鏃堕棿"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ style="width: 100%"
/>
</el-form-item>
</el-col>
@@ -370,14 +364,7 @@
/>
</el-form-item>
</el-col>
- <el-col :span="8">
- <el-form-item label="鍗忚皟鍛樼紪鍙�" prop="coordinatorNo">
- <el-input
- v-model="formData.coordinatorNo"
- placeholder="璇疯緭鍏ュ崗璋冨憳缂栧彿"
- />
- </el-form-item>
- </el-col>
+
<el-col :span="8">
<el-form-item label="鍗忚皟鍛樺鍚�" prop="coordinatorName">
<el-input
@@ -496,10 +483,10 @@
</el-form-item>
</el-col>
<el-col :span="8">
- <el-form-item label="涓庢崘璧犺�呭叧绯�" prop="familyrelations">
+ <el-form-item label="涓庢崘鐚�呭叧绯�" prop="familyrelations">
<el-select
v-model="formData.familyrelations"
- placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+ placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
>
<el-option
v-for="dict in dict.type.sys_FamilyRelation || []"
@@ -1013,19 +1000,21 @@
// 璁剧疆鍦板潃淇℃伅
if (data.residenceprovince) {
this.residenceAddress = {
- sheng: data.residenceprovincename,
- shi: data.residencecityname,
- qu: data.residencetownname
+ sheng: data.residenceprovince,
+ shi: data.residencecity,
+ qu: data.residencetown
};
}
if (data.registerprovince) {
this.registerAddress = {
- sheng: data.registerprovincename,
- shi: data.registercityname,
- qu: data.registertownname
+ sheng: data.registerprovince,
+ shi: data.registercity,
+ qu: data.registertown
};
}
+ console.log(this.registerAddress,'registerAddress12');
+
this.calculateAge(data.birthday);
} catch (error) {
@@ -1137,6 +1126,8 @@
},
handleRegisterAddressChange(address) {
+ console.log(this.registerAddress,'registerAddress11');
+
this.formData.registerprovince = address.sheng;
this.formData.registercity = address.shi;
this.formData.registertown = address.qu;
diff --git a/src/views/project/donatebaseinfo/index.vue b/src/views/project/donatebaseinfo/index.vue
index 6442bd2..63e3fca 100644
--- a/src/views/project/donatebaseinfo/index.vue
+++ b/src/views/project/donatebaseinfo/index.vue
@@ -101,6 +101,12 @@
</template>
</el-table-column>
<el-table-column
+ label="浣忛櫌鍙�"
+ align="center"
+ prop="inpatientno"
+ width="200"
+ />
+ <el-table-column
label="鎹愮尞杩涘害"
align="center"
prop="workflow"
@@ -129,12 +135,7 @@
/>
</template>
</el-table-column>
- <el-table-column
- label="妗堜緥缂栧彿"
- align="center"
- prop="caseNo"
- width="200"
- />
+
<el-table-column label="鎬у埆" align="center" prop="sex" width="100">
<template slot-scope="scope">
<dict-tag
@@ -158,16 +159,12 @@
}}
</template>
</el-table-column>
-<<<<<<< HEAD
- <el-table-column label="GCS璇勫垎" align="center" prop="gcsScore" width="100"/>
-=======
<el-table-column
- label="涓婃姤鍖婚櫌"
+ label="GCS璇勫垎"
align="center"
- prop="treatmenthospitalname"
+ prop="gcsScore"
+ width="100"
/>
- <el-table-column label="GCS璇勫垎" align="center" prop="gcsScore" />
->>>>>>> 059398ad3ad81ea49dfb75ac09f268bc0b0f6145
<el-table-column label="琛�鍨�" align="center" prop="bloodtype" width="100">
<template slot-scope="scope">
<dict-tag
@@ -176,20 +173,24 @@
/>
</template>
</el-table-column>
+
+ <el-table-column label="浼犳煋鐥�" align="center" prop="infectious">
+ <template slot-scope="scope">
+ <span v-for="item in scope.row.infectious.split(',')"
+ ><dict-tag :options="dict.type.sys_Infectious" :value="item" />
+ </span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鐤剧梾璇婃柇" align="center" prop="diagnosisname" />
<el-table-column
- label="鎶ュ憡鍖婚櫌"
+ label="鍗忚皟鍛�"
align="center"
- prop="treatmenthospitalname"
- />
- <el-table-column
- label="鎶ュ憡浜�"
- align="center"
- prop="reportername"
+ prop="coordinatorName"
width="100"
/>
<el-table-column
label="鎿嶄綔"
- width="190"
+ width="220"
align="center"
class-name="small-padding fixed-width"
fixed="right"
@@ -204,14 +205,29 @@
>
璇︽儏
</el-button>
+
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleOpenEdit(scope.row)"
v-hasPermi="['project:donatebaseinfo:edit']"
- >缂栬緫</el-button
+ v-if="scope.row.recordstate !== '4'"
>
+ 缂栬緫
+ </el-button>
+
+ <!-- 鉁� 鏂板锛氬綊妗f寜閽� -->
+ <el-button
+ size="mini"
+ type="text"
+ style="color:#E6A23C;"
+ @click="handleArchive(scope.row)"
+ v-if="scope.row.recordstate !== '4'"
+ >
+ 褰掓。
+ </el-button>
+
<el-button
size="mini"
type="text"
@@ -223,6 +239,7 @@
>
缁堟
</el-button>
+
<el-button
size="mini"
type="text"
@@ -270,7 +287,8 @@
import {
listDonatebaseinfo,
addDonatebaseinfo,
- exportDonatebaseinfo
+ exportDonatebaseinfo,
+ updateDonatebaseinfo
} from "@/api/project/donatebaseinfo";
import Li_area_select from "@/components/Address";
import OrgSelecter from "@/views/project/components/orgselect";
@@ -287,6 +305,7 @@
dicts: [
"sys_user_sex",
"sys_BloodType",
+ "sys_Infectious",
"sys_DonationCategory",
"sys_donornode"
],
@@ -455,7 +474,52 @@
this.currentRecord = { ...row };
this.modalVisible = { ...this.modalVisible, restore: true };
},
+ /** 褰掓。 */
+ handleArchive(row) {
+ this.$confirm("纭灏嗚妗堜緥褰掓。锛熷綊妗e悗灏嗕笉鍙紪杈戙��", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning"
+ })
+ .then(async () => {
+ try {
+ const res = await updateDonatebaseinfo({
+ id: row.id,
+ recordstate: "4",
+ filingtime: this.getCurrentTime()
+ });
+ if (res.code === 200) {
+ this.$modal.msgSuccess("褰掓。鎴愬姛");
+ this.getList();
+ } else {
+ this.$modal.msgError(res.msg || "褰掓。澶辫触");
+ }
+ } catch (err) {
+ this.$modal.msgError("鎿嶄綔澶辫触");
+ }
+ })
+ .catch(() => {});
+ },
+ // 鑾峰彇褰撳墠鏃堕棿
+ getCurrentTime() {
+ const now = new Date();
+ return `${now.getFullYear()}-${(now.getMonth() + 1)
+ .toString()
+ .padStart(2, "0")}-${now
+ .getDate()
+ .toString()
+ .padStart(2, "0")} ${now
+ .getHours()
+ .toString()
+ .padStart(2, "0")}:${now
+ .getMinutes()
+ .toString()
+ .padStart(2, "0")}:${now
+ .getSeconds()
+ .toString()
+ .padStart(2, "0")}`;
+ },
getTimeList() {
if (!this.selecttime) {
// this.queryParams.starttime = "1998-01-01 00:00:00";
@@ -541,12 +605,13 @@
this.loading = false;
}
},
- /** 鎵撳紑缂栬緫寮圭獥 */
handleOpenEdit(row) {
- // 纭繚鍦ㄦ墦寮�寮规鍓嶉噸缃甤urrentEditData
- this.currentEditData = {};
+ if (row.recordstate === "4") {
+ this.$modal.msgWarning("褰掓。妗堜緥涓嶅彲缂栬緫");
+ return;
+ }
- // 浣跨敤$nextTick纭繚DOM鏇存柊瀹屾垚
+ this.currentEditData = {};
this.$nextTick(() => {
this.currentEditData = { ...row };
this.editModalVisible = true;
diff --git a/src/views/project/donatereview/index.vue b/src/views/project/donatereview/index.vue
index 9f06523..66c7017 100644
--- a/src/views/project/donatereview/index.vue
+++ b/src/views/project/donatereview/index.vue
@@ -629,10 +629,10 @@
</el-form-item>
</el-col>
<el-col :span="8">
- <el-form-item label="涓庢崘璧犺�呭叧绯�" prop="familyrelations">
+ <el-form-item label="涓庢崘鐚�呭叧绯�" prop="familyrelations">
<el-select
v-model="form.familyrelations"
- placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+ placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
>
<el-option
v-for="dict in dict.type.sys_FamilyRelation"
diff --git a/src/views/project/donationdetails/index.vue b/src/views/project/donationdetails/index.vue
index 6bc93cd..a16ee2b 100644
--- a/src/views/project/donationdetails/index.vue
+++ b/src/views/project/donationdetails/index.vue
@@ -664,10 +664,10 @@
</el-form-item>
</el-col>
<el-col :span="8">
- <el-form-item label="涓庢崘璧犺�呭叧绯�" prop="familyrelations">
+ <el-form-item label="涓庢崘鐚�呭叧绯�" prop="familyrelations">
<el-select
v-model="form.familyrelations"
- placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+ placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
>
<el-option
v-for="dict in dict.type.sys_FamilyRelation || []"
@@ -1023,7 +1023,7 @@
>
<el-row>
<el-col :span="6">
- <el-form-item label="鎹愯禒鑰呮皯鏃�" prop="nation">
+ <el-form-item label="鎹愮尞鑰呮皯鏃�" prop="nation">
<el-select
filterable
v-model="affirmform.nation"
@@ -1039,7 +1039,7 @@
</el-form-item>
</el-col>
<el-col :span="6">
- <el-form-item label="鎹愯禒鑰呭鍘�" prop="education">
+ <el-form-item label="鎹愮尞鑰呭鍘�" prop="education">
<el-select
v-model="affirmform.education"
placeholder="璇烽�夋嫨瀛﹀巻"
@@ -1054,7 +1054,7 @@
</el-form-item>
</el-col>
<el-col :span="6">
- <el-form-item label="鎹愯禒鑰呰亴涓�" prop="occupation">
+ <el-form-item label="鎹愮尞鑰呰亴涓�" prop="occupation">
<el-select
filterable
v-model="affirmform.occupation"
@@ -1079,12 +1079,12 @@
<el-col :span="6">
<el-form-item
align="left"
- label="涓庢崘璧犺�呭叧绯�"
+ label="涓庢崘鐚�呭叧绯�"
prop="familyrelations"
>
<el-select
v-model="affirmform.familyrelations"
- placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+ placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
>
<el-option
v-for="dict in dict.type.sys_FamilyRelation || []"
diff --git a/src/views/project/externalperson/index.vue b/src/views/project/externalperson/index.vue
index dd83482..bfd71fe 100644
--- a/src/views/project/externalperson/index.vue
+++ b/src/views/project/externalperson/index.vue
@@ -460,12 +460,7 @@
}
}
],
- bankcardno: [
- { required: true, message: "璇疯緭鍏ラ摱琛岃处鍙�", trigger: "blur" }
- ],
- depositbank: [
- { required: true, message: "璇疯緭鍏ュ紑鎴烽摱琛�", trigger: "blur" }
- ]
+
},
//鏄惁鏄笓瀹惰垂鐨凮PO瀹℃壒浜哄憳
ismanager: false
diff --git a/src/views/project/funddetail/index.vue b/src/views/project/funddetail/index.vue
index 5c18378..11dddc1 100644
--- a/src/views/project/funddetail/index.vue
+++ b/src/views/project/funddetail/index.vue
@@ -133,8 +133,8 @@
<el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
</el-select>
</el-form-item></el-col>
- <el-col :span="5"><el-form-item label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
- <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愯禒鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
+ <el-col :span="5"><el-form-item label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
+ <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愮尞鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
</el-form-item></el-col>
<el-col :span="5"><el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
<el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" />
diff --git a/src/views/project/reimbursementpayee/index.vue b/src/views/project/reimbursementpayee/index.vue
index 9d5d82e..15f4301 100644
--- a/src/views/project/reimbursementpayee/index.vue
+++ b/src/views/project/reimbursementpayee/index.vue
@@ -69,10 +69,10 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
- <el-form-item label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
+ <el-form-item label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
<el-input
v-model="queryParams.familyrelations"
- placeholder="璇疯緭鍏ヤ笌鎹愯禒鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
+ placeholder="璇疯緭鍏ヤ笌鎹愮尞鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
clearable
size="small"
@keyup.enter.native="handleQuery"
@@ -167,7 +167,7 @@
<el-table-column label="鍗″彿" align="center" prop="bankcardno" />
<el-table-column label="鐢宠閲戦" align="center" prop="amount" />
<el-table-column label="鑱旂郴鐢佃瘽" align="center" prop="phone" />
- <el-table-column label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" align="center" prop="familyrelations" />
+ <el-table-column label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" align="center" prop="familyrelations" />
<el-table-column label="浠樻鏃ユ湡" align="center" prop="paiddate" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.paiddate, '{y}-{m}-{d}') }}</span>
@@ -199,7 +199,7 @@
</template>
</el-table-column>
</el-table>
-
+
<pagination
v-show="total>0"
:total="total"
@@ -237,8 +237,8 @@
<el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
<el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" />
</el-form-item>
- <el-form-item label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
- <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愯禒鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
+ <el-form-item label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
+ <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愮尞鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
</el-form-item>
<el-form-item label="浠樻鏃ユ湡" prop="paiddate">
<el-date-picker clearable size="small"
diff --git a/src/views/project/relativesconfirmation/index.vue b/src/views/project/relativesconfirmation/index.vue
index 16104e2..3fdc823 100644
--- a/src/views/project/relativesconfirmation/index.vue
+++ b/src/views/project/relativesconfirmation/index.vue
@@ -449,12 +449,12 @@
<el-col :span="6">
<el-form-item
align="left"
- label="涓庢崘璧犺�呭叧绯�"
+ label="涓庢崘鐚�呭叧绯�"
prop="familyrelations"
>
<el-select
v-model="form.familyrelations"
- placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+ placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
>
<el-option
v-for="dict in dict.type.sys_FamilyRelation"
diff --git a/src/views/project/travelexpensedeal/index.vue b/src/views/project/travelexpensedeal/index.vue
index 13bbf91..c68473b 100644
--- a/src/views/project/travelexpensedeal/index.vue
+++ b/src/views/project/travelexpensedeal/index.vue
@@ -227,7 +227,7 @@
<!-- 娣诲姞鎴栦慨鏀硅垂鐢ㄧ敵璇锋槑缁嗗璇濇 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
-
+
<el-form-item label="鏀剁泭浜�" prop="beneficiaryname">
<el-input
v-model="form.beneficiaryname"
@@ -260,12 +260,12 @@
</el-select>
</el-form-item>
<el-form-item
- label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
+ label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
prop="familyrelations"
>
<el-input
v-model="form.familyrelations"
- placeholder="璇疯緭鍏ヤ笌鎹愯禒鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
+ placeholder="璇疯緭鍏ヤ笌鎹愮尞鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
/>
</el-form-item>
<el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
@@ -574,4 +574,4 @@
},
},
};
-</script>
\ No newline at end of file
+</script>
diff --git a/vue.config.js b/vue.config.js
index 40c759e..cb37af7 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -1,13 +1,13 @@
-'use strict'
-const path = require('path')
+"use strict";
+const path = require("path");
function resolve(dir) {
- return path.join(__dirname, dir)
+ return path.join(__dirname, dir);
}
-const name = process.env.VUE_APP_TITLE || '闈掗檮闄PO绠$悊骞冲彴' // 缃戦〉鏍囬
+const name = process.env.VUE_APP_TITLE || "闈掗檮闄PO绠$悊骞冲彴"; // 缃戦〉鏍囬
-const port = process.env.port || process.env.npm_config_port || 80 // 绔彛
+const port = process.env.port || process.env.npm_config_port || 80; // 绔彛
// vue.config.js 閰嶇疆璇存槑
//瀹樻柟vue.config.js 鍙傝�冩枃妗� https://cli.vuejs.org/zh/config/#css-loaderoptions
@@ -18,36 +18,37 @@
// 渚嬪 https://www.ruoyi.vip/銆傚鏋滃簲鐢ㄨ閮ㄧ讲鍦ㄤ竴涓瓙璺緞涓婏紝浣犲氨闇�瑕佺敤杩欎釜閫夐」鎸囧畾杩欎釜瀛愯矾寰勩�備緥濡傦紝濡傛灉浣犵殑搴旂敤琚儴缃插湪 https://www.ruoyi.vip/admin/锛屽垯璁剧疆 baseUrl 涓� /admin/銆�
publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
// 鍦╪pm run build 鎴� yarn build 鏃� 锛岀敓鎴愭枃浠剁殑鐩綍鍚嶇О锛堣鍜宐aseUrl鐨勭敓浜х幆澧冭矾寰勪竴鑷达級锛堥粯璁ist锛�
- outputDir: 'dist',
+ outputDir: "dist",
// 鐢ㄤ簬鏀剧疆鐢熸垚鐨勯潤鎬佽祫婧� (js銆乧ss銆乮mg銆乫onts) 鐨勶紱锛堥」鐩墦鍖呬箣鍚庯紝闈欐�佽祫婧愪細鏀惧湪杩欎釜鏂囦欢澶逛笅锛�
- assetsDir: 'static',
+ assetsDir: "static",
// 鏄惁寮�鍚痚slint淇濆瓨妫�娴嬶紝鏈夋晥鍊硷細ture | false | 'error'
- lintOnSave: process.env.NODE_ENV === 'development',
+ lintOnSave: process.env.NODE_ENV === "development",
// 濡傛灉浣犱笉闇�瑕佺敓浜х幆澧冪殑 source map锛屽彲浠ュ皢鍏惰缃负 false 浠ュ姞閫熺敓浜х幆澧冩瀯寤恒��
productionSourceMap: false,
// webpack-dev-server 鐩稿叧閰嶇疆
devServer: {
- host: '0.0.0.0',
+ host: "0.0.0.0",
port: port,
open: true,
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
- target:`http://localhost:8080`,
+ target: `http://www.qdopo.com:9095`,
+ // target:`http://192.168.76.25:9095`,//鎵撳寘鍦板潃
// target:`http://192.168.100.10:8080`,
// target:`http://192.168.100.137:8080`,
// target: `https://slb.hospitalstar.com:9093`,
changeOrigin: true,
pathRewrite: {
- ['^' + process.env.VUE_APP_BASE_API]: ''
+ ["^" + process.env.VUE_APP_BASE_API]: ""
}
},
//褰損df鍜屾暟鎹帴鍙d笉鍦ㄥ悓涓�涓姹傚湴鍧�涓嬫椂,涓簆df棰勮杩藉姞涓�涓唬鐞�
- '/pdf': {
- target: 'http://192.168.1.4/pdf/data',
+ "/pdf": {
+ target: "http://192.168.1.4/pdf/data",
changOrigin: true,
pathRewrite: {
- '^/pdf': ''
+ "^/pdf": ""
}
}
},
@@ -57,73 +58,70 @@
name: name,
resolve: {
alias: {
- '@': resolve('src')
-
+ "@": resolve("src")
}
}
},
chainWebpack(config) {
- config.plugins.delete('preload') // TODO: need test
- config.plugins.delete('prefetch') // TODO: need test
+ config.plugins.delete("preload"); // TODO: need test
+ config.plugins.delete("prefetch"); // TODO: need test
// set svg-sprite-loader
config.module
- .rule('svg')
- .exclude.add(resolve('src/assets/icons'))
- .end()
+ .rule("svg")
+ .exclude.add(resolve("src/assets/icons"))
+ .end();
config.module
- .rule('icons')
+ .rule("icons")
.test(/\.svg$/)
- .include.add(resolve('src/assets/icons'))
+ .include.add(resolve("src/assets/icons"))
.end()
- .use('svg-sprite-loader')
- .loader('svg-sprite-loader')
+ .use("svg-sprite-loader")
+ .loader("svg-sprite-loader")
.options({
- symbolId: 'icon-[name]'
+ symbolId: "icon-[name]"
})
- .end()
+ .end();
- config
- .when(process.env.NODE_ENV !== 'development',
- config => {
- config
- .plugin('ScriptExtHtmlWebpackPlugin')
- .after('html')
- .use('script-ext-html-webpack-plugin', [{
- // `runtime` must same as runtimeChunk name. default is `runtime`
- inline: /runtime\..*\.js$/
- }])
- .end()
- config
- .optimization.splitChunks({
- chunks: 'all',
- cacheGroups: {
- libs: {
- name: 'chunk-libs',
- test: /[\\/]node_modules[\\/]/,
- priority: 10,
- chunks: 'initial' // only package third parties that are initially dependent
- },
- elementUI: {
- name: 'chunk-elementUI', // split elementUI into a single package
- priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
- test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
- },
- commons: {
- name: 'chunk-commons',
- test: resolve('src/components'), // can customize your rules
- minChunks: 3, // minimum common number
- priority: 5,
- reuseExistingChunk: true
- }
- }
- })
- config.optimization.runtimeChunk('single'),
+ config.when(process.env.NODE_ENV !== "development", config => {
+ config
+ .plugin("ScriptExtHtmlWebpackPlugin")
+ .after("html")
+ .use("script-ext-html-webpack-plugin", [
{
- from: path.resolve(__dirname, './public/robots.txt'), //闃茬埇铏枃浠�
- to: './' //鍒版牴鐩綍涓�
+ // `runtime` must same as runtimeChunk name. default is `runtime`
+ inline: /runtime\..*\.js$/
+ }
+ ])
+ .end();
+ config.optimization.splitChunks({
+ chunks: "all",
+ cacheGroups: {
+ libs: {
+ name: "chunk-libs",
+ test: /[\\/]node_modules[\\/]/,
+ priority: 10,
+ chunks: "initial" // only package third parties that are initially dependent
+ },
+ elementUI: {
+ name: "chunk-elementUI", // split elementUI into a single package
+ priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
+ test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
+ },
+ commons: {
+ name: "chunk-commons",
+ test: resolve("src/components"), // can customize your rules
+ minChunks: 3, // minimum common number
+ priority: 5,
+ reuseExistingChunk: true
}
}
- )
+ });
+ config.optimization.runtimeChunk("single"),
+ {
+ from: path.resolve(__dirname, "./public/robots.txt"), //闃茬埇铏枃浠�
+ to: "./" //鍒版牴鐩綍涓�
+ };
+ });
}
-}
+};
diff --git "a/\347\256\241\347\220\206\347\253\257 \0502\051.zip" "b/\347\256\241\347\220\206\347\253\257 \0502\051.zip"
new file mode 100644
index 0000000..9da13ee
--- /dev/null
+++ "b/\347\256\241\347\220\206\347\253\257 \0502\051.zip"
Binary files differ
diff --git "a/\347\256\241\347\220\206\347\253\257 \0503\051.zip" "b/\347\256\241\347\220\206\347\253\257 \0503\051.zip"
new file mode 100644
index 0000000..75284fb
--- /dev/null
+++ "b/\347\256\241\347\220\206\347\253\257 \0503\051.zip"
Binary files differ
diff --git "a/\347\256\241\347\220\206\347\253\257.zip" "b/\347\256\241\347\220\206\347\253\257.zip"
new file mode 100644
index 0000000..22d1d2b
--- /dev/null
+++ "b/\347\256\241\347\220\206\347\253\257.zip"
Binary files differ
--
Gitblit v1.9.3