From bcb9976e7680ce67fadb6fec7ab5fca36552cdbc Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期三, 28 一月 2026 17:10:49 +0800
Subject: [PATCH] 青岛维护
---
src/api/businessApi/decide.js | 25
src/views/business/assess/index.vue | 42
src/views/business/decide/DecideInfo.vue | 295 ++++--
src/views/business/assess/components/OrganAssessmentForm.vue | 554 ++++++++----
src/views/project/DonationProcess/index.vue | 347 ++++----
src/views/business/transfer/TransportEdit.vue | 2
src/api/businessApi/maintain.js | 45 +
src/views/business/ethicalReview/ethicalReviewInfo.vue | 2
src/views/business/decide/index.vue | 320 +++++--
src/api/businessApi/assess.js | 44 +
src/views/business/assess/assessInfo.vue | 789 +++++++++--------
11 files changed, 1,511 insertions(+), 954 deletions(-)
diff --git a/src/api/businessApi/assess.js b/src/api/businessApi/assess.js
index e69de29..db1b6aa 100644
--- a/src/api/businessApi/assess.js
+++ b/src/api/businessApi/assess.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 涓婃姤妗堜緥鏂板
+export function assessAdd(data) {
+ return request({
+ url: '/project/assessbaseinforeport/add',
+ method: 'post',
+ data: data
+ })
+}
+
+// 妗堜緥鍒楄〃鍙婅鎯�
+export function evaluateBaseInfolist(data) {
+ return request({
+ url: '/project/medicalevaluation/evaluateBaseInfolist',
+ method: 'post',
+ data: data
+ })
+}
+// 涓婃姤妗堜緥鍒楄〃
+export function assessList(data) {
+ return request({
+ url: '/project/assessbaseinforeport/list',
+ method: 'post',
+ data: data
+ })
+}
+
+// 妗堜緥璇︽儏
+export function assessInfo(id) {
+ return request({
+ url: '/project/assessbaseinforeport/getInfo/' + id,
+ method: 'get'
+ })
+}
+
+// 鍒犻櫎
+export function assessDel(id) {
+ return request({
+ url: '/project/assessbaseinforeport/remove/' + id,
+ method: 'get'
+ })
+}
+
diff --git a/src/api/businessApi/decide.js b/src/api/businessApi/decide.js
index e69de29..9a34d31 100644
--- a/src/api/businessApi/decide.js
+++ b/src/api/businessApi/decide.js
@@ -0,0 +1,25 @@
+import request from '@/utils/request'
+
+// 妗堜緥鍒楄〃鍙婅鎯�
+export function queryDathInfoBaseInfo(data) {
+ return request({
+ url: '/project/deathinfo/queryDathInfoBaseInfo',
+ method: 'post',
+ data: data
+ })
+}
+// 姝讳骸淇℃伅淇敼
+export function deathinfoedit(data) {
+ return request({
+ url: '/project/deathinfo/edit',
+ method: 'post',
+ data: data
+ })
+}
+// 姝讳骸淇℃伅璇︽儏
+export function deathinfoInfo(id) {
+ return request({
+ url: '/project/deathinfo/getInfo/' + id,
+ method: 'get'
+ })
+}
diff --git a/src/api/businessApi/maintain.js b/src/api/businessApi/maintain.js
index e69de29..883d70f 100644
--- a/src/api/businessApi/maintain.js
+++ b/src/api/businessApi/maintain.js
@@ -0,0 +1,45 @@
+import request from '@/utils/request'
+
+// 渚涜�呯淮鎶ゆ柊澧�
+export function maintainAdd(data) {
+ return request({
+ url: '/project/donatemaintenance/add',
+ method: 'post',
+ data: data
+ })
+}
+// 渚涜�呯淮鎶や慨鏀�
+export function maintainedit(data) {
+ return request({
+ url: '/project/donatemaintenance/edit',
+ method: 'post',
+ data: data
+ })
+}
+
+
+// 渚涜�呯淮鎶ゅ垪琛�
+export function maintainList(data) {
+ return request({
+ url: '/project/donatemaintenance/maintenanceBaseInfoList',
+ method: 'post',
+ data: data
+ })
+}
+
+// 妗堜緥璇︽儏
+export function maintainInfo(id) {
+ return request({
+ url: '/project/donatemaintenance/getInfo/' + id,
+ method: 'get'
+ })
+}
+
+// 鍒犻櫎
+export function maintainDel(id) {
+ return request({
+ url: '/project/donatemaintenance/remove/' + id,
+ method: 'get'
+ })
+}
+
diff --git a/src/views/business/assess/assessInfo.vue b/src/views/business/assess/assessInfo.vue
index 727e73a..330cff8 100644
--- a/src/views/business/assess/assessInfo.vue
+++ b/src/views/business/assess/assessInfo.vue
@@ -76,13 +76,131 @@
褰撳墠瑙掕壊锛歿{ currentDepartment }}璇勪及浜哄憳
</span>
</div>
-
+ <el-row>
+ <el-form-item label-width="100px" label="璇勪及鍣ㄥ畼">
+ <el-checkbox-group v-model="organdecision">
+ <el-checkbox
+ v-for="item in organselection"
+ :key="item"
+ :label="item"
+ >{{ item }}
+ </el-checkbox>
+ </el-checkbox-group>
+ <el-input
+ v-if="organdecision.includes('鍏朵粬')"
+ v-model="assessmentData.organdecisionOther"
+ placeholder="璇疯緭鍏ュ叾浠栨崘鐚喅瀹氱殑鍏蜂綋鍐呭"
+ style="margin-top: 10px; width: 300px;"
+ ></el-input>
+ </el-form-item>
+ </el-row>
<el-table
:data="organAssessmentList"
v-loading="assessmentLoading"
style="width: 100%"
:row-class-name="getRowClassName"
+ :expand-row-keys="expandedRowKeys"
+ @expand-change="handleExpandChange"
+ row-key="organType"
>
+ <el-table-column type="expand" width="60">
+ <template slot-scope="scope">
+ <div class="organ-expand-content" v-if="scope.row.expanded">
+ <el-tabs
+ v-model="scope.row.activeAssessmentTab"
+ type="card"
+ class="organ-detail-tabs"
+ >
+ <!-- 鍔ㄦ�佺敓鎴愯瘎浼癟ab -->
+ <el-tab-pane
+ v-for="(assessment, index) in scope.row.assessments"
+ :key="index"
+ :label="`绗�${index + 1}娆¤瘎浼癭"
+ :name="`assessment_${index}`"
+ >
+ <organ-assessment-form
+ :organ-data="scope.row"
+ :assessment-data="assessment"
+ :assessment-index="index"
+ :readonly="!canAssessOrgan(scope.row)"
+ @save="handleSaveOrganAssessment"
+ @add-assessment="handleAddAssessment"
+ />
+ </el-tab-pane>
+
+ <!-- 娣诲姞璇勪及鎸夐挳 -->
+ <el-tab-pane name="add" v-if="canAssessOrgan(scope.row)">
+ <template slot="label">
+ <el-button
+ type="text"
+ icon="el-icon-plus"
+ @click.stop="handleAddNewAssessment(scope.row)"
+ size="mini"
+ >
+ 鏂板璇勪及
+ </el-button>
+ </template>
+ <div class="add-assessment-prompt">
+ <el-empty description="鐐瑰嚮涓婃柟鎸夐挳娣诲姞鏂扮殑璇勪及"></el-empty>
+ </div>
+ </el-tab-pane>
+
+ <!-- 璇勪及姹囨�籘ab -->
+ <el-tab-pane label="璇勪及姹囨��" name="summary">
+ <div class="assessment-summary">
+ <el-descriptions title="璇勪及缁撴灉姹囨��" :column="2" border>
+ <el-descriptions-item label="鍣ㄥ畼绫诲瀷">{{
+ scope.row.organName
+ }}</el-descriptions-item>
+ <el-descriptions-item label="璇勪及绉戝">{{
+ scope.row.department
+ }}</el-descriptions-item>
+ <el-descriptions-item label="璇勪及娆℃暟" :span="2">
+ <el-tag type="info"
+ >{{ scope.row.assessments.length }}娆�</el-tag
+ >
+ </el-descriptions-item>
+ <el-descriptions-item label="鏈�鏂拌瘎浼版椂闂�" :span="2">
+ {{ getLatestAssessmentTime(scope.row) || "-" }}
+ </el-descriptions-item>
+ </el-descriptions>
+
+ <!-- 闄勪欢姹囨�� -->
+ <el-card header="鎵�鏈夎瘎浼伴檮浠�" style="margin-top: 20px;">
+ <el-table
+ :data="getAllAttachments(scope.row)"
+ size="small"
+ empty-text="鏆傛棤闄勪欢"
+ >
+ <el-table-column label="闄勪欢鍚嶇О" prop="fileName" />
+ <el-table-column label="璇勪及闃舵" width="120">
+ <template slot-scope="{ row }">
+ 绗瑊{ row.assessmentIndex + 1 }}娆¤瘎浼�
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="涓婁紶鏃堕棿"
+ prop="uploadTime"
+ width="180"
+ />
+ <el-table-column label="鎿嶄綔" width="120">
+ <template slot-scope="{ row }">
+ <el-button
+ type="text"
+ @click="handlePreviewAttachment(row)"
+ >棰勮</el-button
+ >
+ </template>
+ </el-table-column>
+ </el-table>
+ </el-card>
+ </div>
+ </el-tab-pane>
+ </el-tabs>
+ </div>
+ </template>
+ </el-table-column>
+
<el-table-column
label="鍣ㄥ畼绫诲瀷"
align="center"
@@ -96,54 +214,51 @@
/>
</template>
</el-table-column>
+
<el-table-column
label="璇勪及绉戝"
align="center"
prop="department"
width="120"
/>
- <el-table-column
- label="璇勪及浜哄憳"
- align="center"
- prop="assessor"
- />
- <!-- 鏂板锛氱涓�娆¤瘎浼扮姸鎬� -->
- <el-table-column label="绗竴娆¤瘎浼�" align="center" >
+ <el-table-column label="璇勪及浜哄憳" align="center" prop="assessor" />
+
+ <!-- 鍔ㄦ�佹樉绀鸿瘎浼扮姸鎬佸垪 -->
+ <el-table-column
+ v-for="(assessment, index) in getMaxAssessmentCount()"
+ :key="index"
+ :label="`绗�${index + 1}娆¤瘎浼癭"
+ align="center"
+ width="120"
+ >
<template slot-scope="scope">
<el-tag
- :type="getAssessmentTagType(scope.row.firstAssessment.status)"
+ v-if="scope.row.assessments[index]"
+ :type="getAssessmentTagType(scope.row.assessments[index].status)"
size="small"
>
- {{ getAssessmentStatusText(scope.row.firstAssessment.status) }}
+ {{ getAssessmentStatusText(scope.row.assessments[index].status) }}
+ </el-tag>
+ <el-tag v-else type="info" size="small">鏈瘎浼�</el-tag>
+ </template>
+ </el-table-column>
+
+ <el-table-column label="鏁翠綋鐘舵��" align="center" width="100">
+ <template slot-scope="scope">
+ <el-tag
+ :type="scope.row.assessmentStatus === '1' ? 'success' : 'primary'"
+ size="small"
+ >
+ {{ scope.row.assessmentStatus === "1" ? "宸插畬鎴�" : "璇勪及涓�" }}
</el-tag>
</template>
</el-table-column>
- <!-- 鏂板锛氱浜屾璇勪及鐘舵�� -->
- <el-table-column label="绗簩娆¤瘎浼�" align="center" >
- <template slot-scope="scope">
- <el-tag
- :type="getAssessmentTagType(scope.row.secondAssessment.status)"
- size="small"
- >
- {{ getAssessmentStatusText(scope.row.secondAssessment.status) }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鏁翠綋鐘舵��" align="center" >
- <template slot-scope="scope">
- <el-tag
- :type="scope.row.assessmentStatus === '1' ? 'success' : 'warning'"
- size="small"
- >
- {{ scope.row.assessmentStatus === "1" ? "宸茶瘎浼�" : "寰呰瘎浼�" }}
- </el-tag>
- </template>
- </el-table-column>
+
<el-table-column
label="鎿嶄綔"
align="center"
- width="180"
+ width="150"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
@@ -151,133 +266,35 @@
v-if="canAssessOrgan(scope.row)"
size="mini"
type="text"
- @click="handleOrganAssess(scope.row)"
+ @click="handleToggleExpand(scope.row)"
>
- 璇勪及
+ {{
+ expandedRowKeys.includes(scope.row.organType) ? "鏀惰捣" : "璇︽儏"
+ }}
</el-button>
<el-button v-else size="mini" type="text" disabled
>鏃犳潈闄�</el-button
>
- <el-button
- size="mini"
- type="text"
- @click="handleViewOrganDetail(scope.row)"
- >
- 璇︽儏
- </el-button>
</template>
</el-table-column>
</el-table>
-
- <!-- 鍣ㄥ畼璇勪及璇︽儏 - 鏀逛负Tab椤靛舰寮� -->
- <el-dialog
- :title="`${currentOrgan.organName}璇勪及璇︽儏`"
- :visible.sync="organDetailVisible"
- width="90%"
- top="5vh"
- class="organ-detail-dialog"
- >
- <el-tabs v-model="activeAssessmentTab" type="card">
- <!-- 绗竴娆¤瘎浼癟ab -->
- <el-tab-pane label="绗竴娆¤瘎浼�" name="first">
- <organ-assessment-form
- :organ-data="currentOrgan"
- :assessment-data="currentOrgan.firstAssessment"
- assessment-type="first"
- :readonly="!canAssessOrgan(currentOrgan)"
- @save="handleSaveOrganAssessment"
- />
- </el-tab-pane>
-
- <!-- 绗簩娆¤瘎浼癟ab -->
- <el-tab-pane label="绗簩娆¤瘎浼�" name="second">
- <organ-assessment-form
- :organ-data="currentOrgan"
- :assessment-data="currentOrgan.secondAssessment"
- assessment-type="second"
- :readonly="!canAssessOrgan(currentOrgan)"
- @save="handleSaveOrganAssessment"
- />
- </el-tab-pane>
-
- <!-- 璇勪及姹囨�籘ab -->
- <el-tab-pane label="璇勪及姹囨��" name="summary">
- <div class="assessment-summary">
- <el-descriptions title="璇勪及缁撴灉姹囨��" :column="2" border>
- <el-descriptions-item label="鍣ㄥ畼绫诲瀷">
- {{ currentOrgan.organName }}
- </el-descriptions-item>
- <el-descriptions-item label="璇勪及绉戝">
- {{ currentOrgan.department }}
- </el-descriptions-item>
- <el-descriptions-item label="绗竴娆¤瘎浼扮姸鎬�">
- <el-tag :type="getAssessmentTagType(currentOrgan.firstAssessment.status)">
- {{ getAssessmentStatusText(currentOrgan.firstAssessment.status) }}
- </el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="绗簩娆¤瘎浼扮姸鎬�">
- <el-tag :type="getAssessmentTagType(currentOrgan.secondAssessment.status)">
- {{ getAssessmentStatusText(currentOrgan.secondAssessment.status) }}
- </el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="绗竴娆¤瘎浼版椂闂�" :span="2">
- {{ currentOrgan.firstAssessment.assessmentTime || '-' }}
- </el-descriptions-item>
- <el-descriptions-item label="绗簩娆¤瘎浼版椂闂�" :span="2">
- {{ currentOrgan.secondAssessment.assessmentTime || '-' }}
- </el-descriptions-item>
- </el-descriptions>
-
- <!-- 闄勪欢姹囨�� -->
- <el-card header="璇勪及闄勪欢" style="margin-top: 20px;">
- <el-table :data="getAllAttachments(currentOrgan)" size="small">
- <el-table-column label="闄勪欢鍚嶇О" prop="fileName" />
- <el-table-column label="璇勪及闃舵" >
- <template slot-scope="{row}">
- {{ row.assessmentType === 'first' ? '绗竴娆¤瘎浼�' : '绗簩娆¤瘎浼�' }}
- </template>
- </el-table-column>
- <el-table-column label="涓婁紶鏃堕棿" prop="uploadTime" width="180" />
- <el-table-column label="鎿嶄綔" width="120">
- <template slot-scope="{row}">
- <el-button type="text" @click="handlePreviewAttachment(row)">棰勮</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
- </div>
- </el-tab-pane>
- </el-tabs>
-
- <div slot="footer" class="dialog-footer">
- <el-button @click="organDetailVisible = false">鍏抽棴</el-button>
- <el-button
- v-if="canAssessOrgan(currentOrgan)"
- type="primary"
- @click="handleSaveAllAssessments"
- >
- 淇濆瓨鎵�鏈夎瘎浼�
- </el-button>
- </div>
- </el-dialog>
</el-card>
- <!-- 闄勪欢棰勮寮圭獥 -->
- <!-- <attachment-preview
- :visible="attachmentVisible"
- :attachment-list="attachmentList"
- @close="attachmentVisible = false"
- /> -->
+ <!-- 鏂囦欢棰勮寮圭獥 -->
<FilePreviewDialog
:visible="attachmentVisible"
- :file="attachmentList"
+ :file="currentPreviewFile"
@close="attachmentVisible = false"
/>
</div>
</template>
<script>
-import { getAssessment, updateOrganAssessment, completeAssessment } from "./mockAssessmentApi";
+import {
+ getAssessment,
+ updateOrganAssessment,
+ completeAssessment
+} from "./mockAssessmentApi";
import FilePreviewDialog from "@/components/FilePreviewDialog";
import OrganAssessmentForm from "./components/OrganAssessmentForm.vue";
@@ -291,27 +308,19 @@
organAssessmentList: [],
attachmentList: [],
assessmentLoading: false,
-
- // 鍣ㄥ畼璇︽儏鐩稿叧鏁版嵁
- organDetailVisible: false,
- currentOrgan: {
- organType: '',
- organName: '',
- department: '',
- firstAssessment: this.getDefaultAssessment(),
- secondAssessment: this.getDefaultAssessment()
- },
- activeAssessmentTab: 'first',
+ organdecision: [],
+ // 灞曞紑琛岀浉鍏�
+ expandedRowKeys: [],
+ currentPreviewFile: null,
+ attachmentVisible: false,
currentUser: {
id: "001",
name: "寮犲尰鐢�",
- department: "蹇冭剰澶栫",
- role: "department"
+ department: "鍗忚皟鍛�",
+ role: "coordinator"
},
-
- attachmentVisible: false,
-
+ //department锛氬績鑴忋�乧oordinator锛氬崗璋冨憳
// 瀛楀吀閫夐」
genderOptions: [
{ value: "0", label: "鐢�" },
@@ -336,6 +345,19 @@
{ value: "intestine", label: "鑲犻亾" },
{ value: "cornea", label: "瑙掕啘" },
{ value: "skin", label: "鐨偆" }
+ ],
+ organselection: [
+ "鑲濊剰",
+ "鍙岃偩",
+ "宸﹁偩",
+ "鍙宠偩",
+ "蹇冭剰",
+ "鑲鸿剰",
+ "鑳拌吅",
+ "灏忚偁",
+ "鍙岀溂缁勭粐",
+ "閬椾綋",
+ "鍏朵粬"
]
};
},
@@ -347,9 +369,13 @@
return this.currentUser.department;
},
allOrgansAssessed() {
- return this.organAssessmentList.every(organ =>
- organ.firstAssessment.status === 'assessed' &&
- organ.secondAssessment.status === 'assessed'
+ return this.organAssessmentList.every(
+ organ =>
+ organ.assessments &&
+ organ.assessments.length > 0 &&
+ organ.assessments.every(
+ assessment => assessment.status === "assessed"
+ )
);
}
},
@@ -361,11 +387,11 @@
// 鑾峰彇榛樿璇勪及鏁版嵁缁撴瀯
getDefaultAssessment() {
return {
- status: 'pending', // pending, assessing, assessed
- assessmentTime: '',
- assessor: '',
- functionStatus: '',
- assessmentOpinion: '',
+ status: "pending",
+ assessmentTime: "",
+ assessor: "",
+ functionStatus: "",
+ assessmentOpinion: "",
attachments: [],
clinicalData: {},
labResults: {}
@@ -379,7 +405,9 @@
.then(response => {
if (response.code === 200) {
this.assessmentData = response.data.caseInfo;
- this.organAssessmentList = this.transformOrganData(response.data.organAssessments || []);
+ this.organAssessmentList = this.transformOrganData(
+ response.data.organAssessments || []
+ );
}
this.assessmentLoading = false;
})
@@ -389,21 +417,27 @@
});
},
- // 杞崲鍣ㄥ畼鏁版嵁鏍煎紡锛屾敮鎸佷袱娆¤瘎浼�
+ // 杞崲鍣ㄥ畼鏁版嵁鏍煎紡锛屾敮鎸佸娆¤瘎浼�
transformOrganData(organList) {
return organList.map(organ => {
const organName = this.getOrganName(organ.organType);
- // 纭繚鏈変袱娆¤瘎浼扮殑鏁版嵁缁撴瀯
- if (!organ.firstAssessment) {
- organ.firstAssessment = this.getDefaultAssessment();
+ // 杞崲涓哄娆¤瘎浼扮殑鏁版嵁缁撴瀯
+ const assessments = [];
+ if (organ.firstAssessment) {
+ assessments.push({ ...organ.firstAssessment, index: 0 });
}
- if (!organ.secondAssessment) {
- organ.secondAssessment = this.getDefaultAssessment();
+ if (organ.secondAssessment) {
+ assessments.push({ ...organ.secondAssessment, index: 1 });
}
+ // 鍙互缁х画娣诲姞鏇村璇勪及...
- // 璁剧疆鍣ㄥ畼鍚嶇О
+ // 璁剧疆鍣ㄥ畼鍚嶇О鍜岃瘎浼版暟鎹�
organ.organName = organName;
+ organ.assessments = assessments;
+ organ.activeAssessmentTab =
+ assessments.length > 0 ? "assessment_0" : "summary";
+ organ.expanded = false;
// 璁$畻鏁翠綋璇勪及鐘舵��
organ.assessmentStatus = this.calculateOverallStatus(organ);
@@ -412,54 +446,199 @@
});
},
+ // 璁$畻鏈�澶ц瘎浼版鏁帮紙鐢ㄤ簬琛ㄥご鏄剧ず锛�
+ getMaxAssessmentCount() {
+ const maxCount = Math.max(
+ ...this.organAssessmentList.map(organ =>
+ organ.assessments ? organ.assessments.length : 0
+ )
+ );
+ return Math.max(maxCount, 2); // 鑷冲皯鏄剧ず2鍒�
+ },
+
// 璁$畻鏁翠綋璇勪及鐘舵��
calculateOverallStatus(organ) {
- const firstDone = organ.firstAssessment.status === 'assessed';
- const secondDone = organ.secondAssessment.status === 'assessed';
+ if (!organ.assessments || organ.assessments.length === 0) return "0";
- if (firstDone && secondDone) return '1'; // 宸插畬鎴�
- if (firstDone || secondDone) return '2'; // 閮ㄥ垎瀹屾垚
- return '0'; // 鏈紑濮�
+ const allAssessed = organ.assessments.every(
+ assessment => assessment.status === "assessed"
+ );
+ const someAssessed = organ.assessments.some(
+ assessment => assessment.status === "assessed"
+ );
+
+ if (allAssessed) return "1";
+ if (someAssessed) return "2";
+ return "0";
+ },
+
+ // 鍒囨崲灞曞紑琛�
+ handleToggleExpand(row) {
+ const key = row.organType;
+ const index = this.expandedRowKeys.indexOf(key);
+
+ if (index > -1) {
+ this.expandedRowKeys.splice(index, 1);
+ row.expanded = false;
+ } else {
+ this.expandedRowKeys = [key];
+ this.organAssessmentList.forEach(item => {
+ item.expanded = item.organType === key;
+ });
+ }
+ },
+
+ // 灞曞紑琛屽彉鍖�
+ handleExpandChange(row, expandedRows) {
+ this.expandedRowKeys = expandedRows.map(item => item.organType);
+ this.organAssessmentList.forEach(item => {
+ item.expanded = this.expandedRowKeys.includes(item.organType);
+ });
+ },
+
+ // 娣诲姞鏂拌瘎浼�
+ handleAddNewAssessment(organ) {
+ const newAssessment = {
+ ...this.getDefaultAssessment(),
+ index: organ.assessments.length
+ };
+
+ organ.assessments.push(newAssessment);
+ organ.activeAssessmentTab = `assessment_${organ.assessments.length - 1}`;
+
+ // 鏇存柊鏁翠綋鐘舵��
+ organ.assessmentStatus = this.calculateOverallStatus(organ);
+
+ this.$message.success("宸叉坊鍔犳柊鐨勮瘎浼�");
+ },
+
+ // 澶勭悊娣诲姞璇勪及浜嬩欢
+ handleAddAssessment(data) {
+ const { organData, currentIndex } = data;
+ this.handleAddNewAssessment(organData);
+ },
+
+ // 淇濆瓨璇勪及
+ handleSaveOrganAssessment(saveData) {
+ const { organData, assessmentData, assessmentIndex } = saveData;
+
+ const organToUpdate = {
+ ...organData,
+ assessments: organData.assessments.map((assessment, index) =>
+ index === assessmentIndex
+ ? {
+ ...assessmentData,
+ status: "assessed",
+ assessmentTime: new Date().toISOString(),
+ assessor: this.currentUser.name
+ }
+ : assessment
+ )
+ };
+
+ // 鏇存柊鏁翠綋鐘舵��
+ organToUpdate.assessmentStatus = this.calculateOverallStatus(
+ organToUpdate
+ );
+
+ updateOrganAssessment(organToUpdate)
+ .then(response => {
+ if (response.code === 200) {
+ this.$message.success(`绗�${assessmentIndex + 1}娆¤瘎浼颁繚瀛樻垚鍔焋);
+ this.getAssessmentDetail();
+
+ // 鏇存柊褰撳墠灞曞紑琛岀殑鏁版嵁
+ const index = this.organAssessmentList.findIndex(
+ item => item.organType === organData.organType
+ );
+ if (index !== -1) {
+ this.organAssessmentList.splice(index, 1, organToUpdate);
+ }
+ }
+ })
+ .catch(error => {
+ console.error("淇濆瓨璇勪及澶辫触:", error);
+ this.$message.error("淇濆瓨澶辫触");
+ });
+ },
+
+ // 鑾峰彇鏈�鏂拌瘎浼版椂闂�
+ getLatestAssessmentTime(organ) {
+ if (!organ.assessments || organ.assessments.length === 0) return null;
+
+ const assessed = organ.assessments.filter(a => a.assessmentTime);
+ if (assessed.length === 0) return null;
+
+ return assessed.sort(
+ (a, b) => new Date(b.assessmentTime) - new Date(a.assessmentTime)
+ )[0].assessmentTime;
+ },
+
+ // 鑾峰彇鎵�鏈夐檮浠�
+ getAllAttachments(organ) {
+ const attachments = [];
+
+ if (organ.assessments) {
+ organ.assessments.forEach((assessment, index) => {
+ if (assessment.attachments) {
+ assessment.attachments.forEach(att => {
+ attachments.push({
+ ...att,
+ assessmentIndex: index,
+ assessmentNumber: index + 1
+ });
+ });
+ }
+ });
+ }
+
+ return attachments;
+ },
+
+ // 棰勮闄勪欢
+ handlePreviewAttachment(attachment) {
+ this.currentPreviewFile = {
+ fileName: attachment.fileName,
+ fileUrl: attachment.path || attachment.fileUrl,
+ fileType: this.getFileType(attachment.fileName)
+ };
+ this.attachmentVisible = true;
+ },
+
+ // 鑾峰彇鏂囦欢绫诲瀷
+ getFileType(fileName) {
+ if (!fileName) return "other";
+
+ const extension = fileName
+ .split(".")
+ .pop()
+ .toLowerCase();
+ const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"];
+ const pdfTypes = ["pdf"];
+ const officeTypes = ["doc", "docx", "xls", "xlsx", "ppt", "pptx"];
+
+ if (imageTypes.includes(extension)) return "image";
+ if (pdfTypes.includes(extension)) return "pdf";
+ if (officeTypes.includes(extension)) return "office";
+ return "other";
},
// 鑾峰彇璇勪及鐘舵�佹爣绛剧被鍨�
getAssessmentTagType(status) {
const typeMap = {
- 'pending': 'info',
- 'assessing': 'warning',
- 'assessed': 'success'
+ pending: "warning",
+ assessing: "primary",
+ assessed: "success"
};
- return typeMap[status] || 'info';
+ return typeMap[status] || "info";
},
// 鑾峰彇璇勪及鐘舵�佹枃鏈�
getAssessmentStatusText(status) {
const textMap = {
- 'pending': '寰呰瘎浼�',
- 'assessing': '璇勪及涓�',
- 'assessed': '宸茶瘎浼�'
- };
- return textMap[status] || '鏈煡';
- },
-
- // 鑾峰彇鍔熻兘鐘舵�佺被鍨�
- getFunctionStatusType(status) {
- const typeMap = {
- "1": "success", // 姝e父
- "2": "warning", // 杞诲害寮傚父
- "3": "danger", // 閲嶅害寮傚父
- "4": "info" // 鏃犳硶璇勪及
- };
- return typeMap[status] || "info";
- },
-
- // 鑾峰彇鍔熻兘鐘舵�佹枃鏈�
- getFunctionStatusText(status) {
- const textMap = {
- "1": "姝e父",
- "2": "杞诲害寮傚父",
- "3": "閲嶅害寮傚父",
- "4": "鏃犳硶璇勪及"
+ pending: "寰呰瘎浼�",
+ assessing: "璇勪及涓�",
+ assessed: "宸茶瘎浼�"
};
return textMap[status] || "鏈煡";
},
@@ -479,125 +658,6 @@
// 鑾峰彇琛岀被鍚�
getRowClassName({ row }) {
return this.canAssessOrgan(row) ? "assessable-row" : "non-assessable-row";
- },
-
- // 鏍煎紡鍖栨椂闂�
- formatTime(time) {
- if (!time) return '';
- return new Date(time).toLocaleString();
- },
-
- // 鏌ョ湅鍣ㄥ畼璇︽儏
- handleViewOrganDetail(organ) {
- this.currentOrgan = JSON.parse(JSON.stringify(organ));
- this.activeAssessmentTab = 'first';
- this.organDetailVisible = true;
- },
-
- // 鍣ㄥ畼璇勪及
- handleOrganAssess(organ) {
- this.currentOrgan = JSON.parse(JSON.stringify(organ));
- this.activeAssessmentTab = 'first';
- this.organDetailVisible = true;
- },
-
- // 淇濆瓨鍗曚釜璇勪及
- handleSaveOrganAssessment(assessmentData, assessmentType) {
- const organToUpdate = {
- ...this.currentOrgan,
- [assessmentType === 'first' ? 'firstAssessment' : 'secondAssessment']: {
- ...assessmentData,
- status: 'assessed',
- assessmentTime: new Date().toISOString(),
- assessor: this.currentUser.name
- }
- };
-
- // 鏇存柊鏁翠綋鐘舵��
- organToUpdate.assessmentStatus = this.calculateOverallStatus(organToUpdate);
-
- updateOrganAssessment(organToUpdate)
- .then(response => {
- if (response.code === 200) {
- this.$message.success(`${assessmentType === 'first' ? '绗竴娆�' : '绗簩娆�'}璇勪及淇濆瓨鎴愬姛`);
- this.getAssessmentDetail();
- // 鑷姩鍒囨崲鍒颁笅涓�涓湭瀹屾垚鐨勮瘎浼版垨姹囨�婚〉
- this.autoSwitchTab(assessmentType);
- }
- })
- .catch(error => {
- console.error("淇濆瓨璇勪及澶辫触:", error);
- this.$message.error("淇濆瓨澶辫触");
- });
- },
-
- // 鑷姩鍒囨崲Tab椤�
- autoSwitchTab(currentType) {
- if (currentType === 'first' && this.currentOrgan.secondAssessment.status === 'pending') {
- this.activeAssessmentTab = 'second';
- } else if (currentType === 'second' ||
- (currentType === 'first' && this.currentOrgan.secondAssessment.status === 'assessed')) {
- this.activeAssessmentTab = 'summary';
- }
- },
-
- // 淇濆瓨鎵�鏈夎瘎浼�
- handleSaveAllAssessments() {
- this.$confirm("纭淇濆瓨鎵�鏈夎瘎浼版暟鎹悧锛�", "纭淇濆瓨", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- }).then(() => {
- const organToUpdate = JSON.parse(JSON.stringify(this.currentOrgan));
-
- // 鏇存柊鏁翠綋鐘舵��
- organToUpdate.assessmentStatus = this.calculateOverallStatus(organToUpdate);
-
- updateOrganAssessment(organToUpdate)
- .then(response => {
- if (response.code === 200) {
- this.$message.success("鎵�鏈夎瘎浼版暟鎹繚瀛樻垚鍔�");
- this.getAssessmentDetail();
- this.organDetailVisible = false;
- }
- })
- .catch(error => {
- console.error("淇濆瓨璇勪及澶辫触:", error);
- this.$message.error("淇濆瓨澶辫触");
- });
- });
- },
-
- // 鑾峰彇鎵�鏈夐檮浠�
- getAllAttachments(organ) {
- const attachments = [];
-
- if (organ.firstAssessment.attachments) {
- organ.firstAssessment.attachments.forEach(att => {
- attachments.push({
- ...att,
- assessmentType: 'first'
- });
- });
- }
-
- if (organ.secondAssessment.attachments) {
- organ.secondAssessment.attachments.forEach(att => {
- attachments.push({
- ...att,
- assessmentType: 'second'
- });
- });
- }
-
- return attachments;
- },
-
- // 棰勮闄勪欢
- handlePreviewAttachment(attachment) {
- // 瀹炵幇闄勪欢棰勮閫昏緫
- console.log('棰勮闄勪欢:', attachment);
- this.$message.info('闄勪欢棰勮鍔熻兘寰呭疄鐜�');
},
// 鐘舵�佽繃婊ゅ櫒
@@ -661,41 +721,36 @@
margin-bottom: 20px;
}
-.assessment-time {
- font-size: 12px;
- color: #909399;
- margin-top: 4px;
-}
-
-/* Tab椤垫牱寮忎紭鍖� */
-.organ-detail-dialog ::v-deep .el-dialog__body {
+/* 灞曞紑琛屾牱寮� */
+.organ-expand-content {
padding: 20px;
- max-height: 70vh;
- overflow-y: auto;
+ background: #fafafa;
+ border-radius: 4px;
+ margin: 10px 0;
}
-.organ-detail-dialog ::v-deep .el-tabs__content {
- padding: 20px 0;
- min-height: 400px;
+.organ-detail-tabs {
+ background: white;
+ border-radius: 4px;
+ padding: 20px;
+}
+
+.add-assessment-prompt {
+ text-align: center;
+ padding: 40px 0;
}
.assessment-summary {
padding: 10px;
}
-.dialog-footer {
- text-align: right;
- padding-top: 20px;
- border-top: 1px solid #ebeef5;
-}
-
/* 鍝嶅簲寮忚璁� */
@media (max-width: 768px) {
- .organ-detail-dialog {
- width: 95% !important;
+ .assessment-detail {
+ padding: 10px;
}
- .assessment-detail {
+ .organ-expand-content {
padding: 10px;
}
}
@@ -708,16 +763,6 @@
background-color: #fafafa;
}
-::v-deep .el-descriptions__label {
- width: 120px;
- background-color: #f5f7fa;
- font-weight: bold;
-}
-
-.fixed-width .el-button {
- margin: 0 2px;
-}
-
.jstitle {
float: right;
font-size: 18px !important;
@@ -726,21 +771,23 @@
font-size: 12px;
}
-/* Tab椤垫縺娲荤姸鎬佹牱寮� */
-::v-deep .el-tabs__item.is-active {
- color: #409EFF;
+/* 琛ㄦ牸灞曞紑鍥炬爣鏍峰紡 */
+::v-deep .el-table__expand-icon {
+ cursor: pointer;
+}
+
+::v-deep .el-table__expanded-cell {
+ padding: 0 !important;
+}
+
+/* 纭繚鎻忚堪鍒楄〃鏍囩瀹藉害涓�鑷� */
+::v-deep .el-descriptions__label {
+ width: 120px;
+ background-color: #f5f7fa;
font-weight: bold;
}
-/* 璇勪及琛ㄥ崟鏍峰紡 */
-.assessment-form-section {
- margin-bottom: 20px;
-}
-
-.assessment-form-section h3 {
- margin-bottom: 15px;
- color: #303133;
- border-left: 4px solid #409EFF;
- padding-left: 10px;
+.fixed-width .el-button {
+ margin: 0 2px;
}
</style>
diff --git a/src/views/business/assess/components/OrganAssessmentForm.vue b/src/views/business/assess/components/OrganAssessmentForm.vue
index 9a17291..49ce6cd 100644
--- a/src/views/business/assess/components/OrganAssessmentForm.vue
+++ b/src/views/business/assess/components/OrganAssessmentForm.vue
@@ -1,8 +1,8 @@
<template>
<div class="organ-assessment-form">
- <el-form :model="organData" label-width="120px">
+ <el-form :model="assessmentData" label-width="120px">
<el-form-item label="鍔熻兘鐘舵��">
- <el-select v-model="organData.functionStatus" :disabled="readonly">
+ <el-select v-model="assessmentData.functionStatus" :disabled="readonly">
<el-option label="姝e父" value="1" />
<el-option label="杞诲害寮傚父" value="2" />
<el-option label="閲嶅害寮傚父" value="3" />
@@ -13,59 +13,110 @@
<el-form-item label="璇勪及鎰忚">
<el-input
type="textarea"
- v-model="organData.assessmentOpinion"
+ v-model="assessmentData.assessmentOpinion"
:rows="4"
:disabled="readonly"
placeholder="璇疯緭鍏ヨ瘎浼版剰瑙�"
/>
</el-form-item>
- <!-- 鍣ㄥ畼绾у埆闄勪欢绠$悊 -->
+ <!-- 闄勪欢涓婁紶鍖哄煙 -->
<el-form-item label="鐩稿叧闄勪欢">
<div class="attachment-section">
- <el-upload
- v-if="!readonly"
- class="attachment-upload"
- action="/api/attachment/upload"
- :headers="uploadHeaders"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- :before-upload="beforeUpload"
- :show-file-list="false"
- :multiple="true"
- >
- <el-button size="small" type="primary" icon="el-icon-upload">
- 涓婁紶闄勪欢
- </el-button>
- <div slot="tip" class="el-upload__tip">
- 鏀寔鍥剧墖銆佹枃妗g瓑鏍煎紡锛屽崟涓枃浠朵笉瓒呰繃10MB
- </div>
- </el-upload>
-
- <!-- 闄勪欢鍒楄〃 -->
- <div v-if="organData.attachments && organData.attachments.length > 0" class="attachment-list">
- <div v-for="file in organData.attachments" :key="file.id" class="attachment-item">
- <div class="file-info">
- <i :class="getFileIcon(file.fileType)" class="file-icon"></i>
- <span class="file-name" :title="file.fileName">{{ file.fileName }}</span>
- <span class="file-size">({{ formatFileSize(file.fileSize) }})</span>
- </div>
- <div class="file-actions">
- <el-button type="text" size="mini" @click="handlePreview(file)">棰勮</el-button>
- <el-button type="text" size="mini" @click="handleDownload(file)">涓嬭浇</el-button>
- <el-button
- v-if="!readonly"
- type="text"
- size="mini"
- style="color: #F56C6C;"
- @click="handleDeleteFile(file)"
- >鍒犻櫎</el-button>
- </div>
- </div>
+ <div class="attachment-header">
+ <i class="el-icon-paperclip"></i>
+ <span class="attachment-title">闄勪欢涓婁紶</span>
+ <span class="attachment-tip"
+ >鏀寔涓婁紶妫�楠屾姤鍛婂崟绛夋枃浠� (鏈�澶歿{ attachmentLimit }}涓�)</span
+ >
</div>
- <div v-else class="no-attachment">
- <el-empty description="鏆傛棤闄勪欢" :image-size="50"></el-empty>
+ <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
+ <UploadAttachment
+ ref="uploadAttachment"
+ :file-list="attachmentFileList"
+ :limit="attachmentLimit"
+ :accept="attachmentAccept"
+ :multiple="true"
+ @change="handleAttachmentChange"
+ @upload-success="handleUploadSuccess"
+ @upload-error="handleUploadError"
+ @remove="handleAttachmentRemove"
+ />
+
+ <!-- 闄勪欢鍒楄〃 -->
+ <div
+ class="attachment-list"
+ v-if="
+ assessmentData.attachments &&
+ assessmentData.attachments.length > 0
+ "
+ >
+ <div class="list-title">
+ 宸蹭笂浼犻檮浠� ({{ assessmentData.attachments.length }})
+ </div>
+ <el-table
+ :data="assessmentData.attachments"
+ style="width: 100%"
+ size="small"
+ >
+ <el-table-column label="鏂囦欢鍚�" min-width="200">
+ <template slot-scope="scope">
+ <i
+ class="el-icon-document"
+ :style="{ color: getFileIconColor(scope.row.fileName) }"
+ ></i>
+ <span class="file-name">{{ scope.row.fileName }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢绫诲瀷" width="100">
+ <template slot-scope="scope">
+ <el-tag
+ :type="getFileTagType(scope.row.fileName)"
+ size="small"
+ >
+ {{ getFileTypeText(scope.row.fileName) }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="涓婁紶鏃堕棿" width="160">
+ <template slot-scope="scope">
+ <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏂囦欢澶у皬" width="100">
+ <template slot-scope="scope">
+ <span>{{ formatFileSize(scope.row.fileSize) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="266" fixed="right">
+ <template slot-scope="scope">
+ <el-button
+ size="mini"
+ type="primary"
+ @click="handlePreview(scope.row)"
+ :disabled="!isPreviewable(scope.row.fileName)"
+ >
+ 棰勮
+ </el-button>
+ <el-button
+ size="mini"
+ type="success"
+ @click="handleDownload(scope.row)"
+ >
+ 涓嬭浇
+ </el-button>
+ <el-button
+ v-if="!readonly"
+ size="mini"
+ type="danger"
+ @click="handleRemoveAttachment(scope.$index)"
+ >
+ 鍒犻櫎
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
</div>
</div>
</el-form-item>
@@ -73,45 +124,53 @@
<el-form-item v-if="!readonly">
<el-button type="primary" @click="handleSave">淇濆瓨璇勪及</el-button>
<el-button @click="handleCancel">鍙栨秷</el-button>
+ <el-button
+ type="success"
+ @click="handleAddAssessment"
+ icon="el-icon-plus"
+ >
+ 鏂板璇勪及璁板綍
+ </el-button>
</el-form-item>
</el-form>
- <!-- 闄勪欢棰勮寮圭獥 -->
- <el-dialog
- :title="`闄勪欢棰勮 - ${currentFile.fileName}`"
- :visible.sync="previewVisible"
- width="60%"
- >
- <div v-if="isImage(currentFile.fileType)" class="image-preview">
- <img :src="currentFile.fileUrl" alt="棰勮鍥剧墖" style="max-width: 100%;" />
- </div>
- <div v-else class="file-preview">
- <el-alert
- title="璇ユ枃浠舵牸寮忎笉鏀寔鍦ㄧ嚎棰勮锛岃涓嬭浇鍚庢煡鐪�"
- type="info"
- show-icon
- />
- <div style="text-align: center; margin-top: 20px;">
- <el-button type="primary" @click="handleDownload(currentFile)">
- <i class="el-icon-download"></i> 涓嬭浇鏂囦欢
- </el-button>
- </div>
- </div>
- </el-dialog>
+ <!-- 鏂囦欢棰勮寮圭獥 -->
+ <FilePreviewDialog
+ :visible="previewVisible"
+ :file="currentPreviewFile"
+ @close="previewVisible = false"
+ @download="handleDownload"
+ />
</div>
</template>
<script>
-import { getToken } from '@/utils/auth'
+import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
+import dayjs from "dayjs";
export default {
name: "OrganAssessmentForm",
+ components: {
+ UploadAttachment,
+ FilePreviewDialog
+ },
props: {
organData: {
type: Object,
+ default: () => ({})
+ },
+ assessmentData: {
+ type: Object,
default: () => ({
- attachments: [] // 纭繚鏈夐檮浠舵暟缁�
+ functionStatus: "",
+ assessmentOpinion: "",
+ attachments: []
})
+ },
+ assessmentIndex: {
+ type: Number,
+ default: 0
},
readonly: {
type: Boolean,
@@ -120,125 +179,250 @@
},
data() {
return {
+ // 棰勮鐩稿叧
previewVisible: false,
- currentFile: {},
- uploadHeaders: {
- Authorization: 'Bearer ' + getToken()
- }
+ currentPreviewFile: null,
+
+ // 闄勪欢鐩稿叧閰嶇疆
+ attachmentLimit: 10,
+ attachmentAccept:
+ ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt",
+ attachmentFileList: []
};
},
+ watch: {
+ organData: {
+ handler(newVal, oldVal) {
+ // 鍙湁褰撻檮浠舵暟鎹湡姝e彂鐢熷彉鍖栨椂鎵嶅垵濮嬪寲
+ if (
+ !oldVal ||
+ !oldVal.attachments ||
+ JSON.stringify(newVal.attachments) !==
+ JSON.stringify(oldVal.attachments)
+ ) {
+ this.initAttachmentList();
+ }
+ },
+ immediate: true,
+ deep: true
+ }
+ },
methods: {
+ /** 鍒濆鍖栭檮浠跺垪琛� */
+ initAttachmentList() {
+ if (this.organData.attachments && this.organData.attachments.length > 0) {
+ this.assessmentData.attachments = [...this.organData.attachments];
+ this.attachmentFileList = this.organData.attachments.map(item => ({
+ uid: item.id || Math.random(),
+ name: item.fileName,
+ url: item.path || item.fileUrl,
+ status: "success"
+ }));
+ } else {
+ this.assessmentData.attachments = [];
+ this.attachmentFileList = [];
+ }
+ },
handleSave() {
- this.$emit('save', {
- ...this.organData,
- assessmentTime: new Date().toISOString(),
- assessor: '褰撳墠鐢ㄦ埛'
- });
+ const saveData = {
+ organData: this.organData,
+ assessmentData: this.assessmentData,
+ assessmentIndex: this.assessmentIndex
+ };
+ this.$emit("save", saveData);
},
handleCancel() {
- this.$emit('cancel');
+ this.$emit("cancel");
},
- // 鏂囦欢涓婁紶澶勭悊
- handleUploadSuccess(response, file) {
+ handleAddAssessment() {
+ this.$emit("add-assessment", {
+ organData: this.organData,
+ currentIndex: this.assessmentIndex
+ });
+ },
+ /** 闄勪欢鍙樺寲澶勭悊 */
+ handleAttachmentChange(fileList) {
+ this.attachmentFileList = fileList;
+ },
+
+ /** 闄勪欢绉婚櫎澶勭悊 */
+ handleAttachmentRemove(file) {
+ if (file.url) {
+ const index = this.assessmentData.attachments.findIndex(
+ item => item.path === file.url || item.fileUrl === file.url
+ );
+ if (index > -1) {
+ this.assessmentData.attachments.splice(index, 1);
+ }
+ }
+ },
+
+ /** 鎵嬪姩鍒犻櫎闄勪欢 */
+ handleRemoveAttachment(index) {
+ this.assessmentData.attachments.splice(index, 1);
+ this.attachmentFileList.splice(index, 1);
+ this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+ },
+
+ /** 涓婁紶鎴愬姛澶勭悊 */
+ handleUploadSuccess({ file, fileList, response }) {
if (response.code === 200) {
- // 灏嗘柊鏂囦欢娣诲姞鍒伴檮浠跺垪琛�
- const newFile = {
- id: response.data.fileId,
+ const attachmentObj = {
+ id:
+ response.data.fileId ||
+ Math.random()
+ .toString(36)
+ .substr(2),
fileName: file.name,
+ path: response.data.fileUrl || file.url,
+ fileUrl: response.data.fileUrl || file.url,
fileType: this.getFileExtension(file.name),
fileSize: file.size,
- fileUrl: response.data.fileUrl,
- uploadTime: new Date().toISOString()
+ uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+ assessmentType: this.assessmentType,
+ organType: this.organData.organType
};
- if (!this.organData.attachments) {
- this.organData.attachments = [];
- }
- this.organData.attachments.push(newFile);
-
- this.$message.success('鏂囦欢涓婁紶鎴愬姛');
+ this.assessmentData.attachments.push(attachmentObj);
+ this.$message.success("鏂囦欢涓婁紶鎴愬姛");
}
},
- handleUploadError(error) {
- console.error('鏂囦欢涓婁紶澶辫触:', error);
- this.$message.error('鏂囦欢涓婁紶澶辫触');
+ /** 涓婁紶閿欒澶勭悊 */
+ handleUploadError({ file, fileList, error }) {
+ console.error("闄勪欢涓婁紶澶辫触:", error);
+ this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
},
- beforeUpload(file) {
- const isLt10M = file.size / 1024 / 1024 < 10;
- if (!isLt10M) {
- this.$message.error('鏂囦欢澶у皬涓嶈兘瓒呰繃 10MB');
- return false;
- }
- return true;
- },
-
- // 鏂囦欢鎿嶄綔
+ /** 鏂囦欢棰勮 */
handlePreview(file) {
- this.currentFile = file;
+ this.currentPreviewFile = {
+ fileName: file.fileName,
+ fileUrl: file.path || file.fileUrl,
+ fileType: this.getFileType(file.fileName)
+ };
this.previewVisible = true;
},
+ /** 鏂囦欢涓嬭浇 */
handleDownload(file) {
- // 妯℃嫙鏂囦欢涓嬭浇
- const link = document.createElement('a');
- link.href = file.fileUrl;
- link.download = file.fileName;
- link.click();
- this.$message.success('寮�濮嬩笅杞芥枃浠�');
+ 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("鏂囦欢璺緞涓嶅瓨鍦紝鏃犳硶涓嬭浇");
+ }
},
- handleDeleteFile(file) {
- this.$confirm('纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- const index = this.organData.attachments.findIndex(f => f.id === file.id);
- if (index !== -1) {
- this.organData.attachments.splice(index, 1);
- this.$message.success('鍒犻櫎鎴愬姛');
- }
- });
+ /** 鑾峰彇鏂囦欢绫诲瀷 */
+ getFileType(fileName) {
+ if (!fileName) return "other";
+
+ const extension = fileName
+ .split(".")
+ .pop()
+ .toLowerCase();
+ const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"];
+ const pdfTypes = ["pdf"];
+ const officeTypes = ["doc", "docx", "xls", "xlsx", "ppt", "pptx"];
+
+ if (imageTypes.includes(extension)) return "image";
+ if (pdfTypes.includes(extension)) return "pdf";
+ if (officeTypes.includes(extension)) return "office";
+ return "other";
},
- // 宸ュ叿鏂规硶
- getFileIcon(fileType) {
- const iconMap = {
- 'pdf': 'el-icon-document',
- 'doc': 'el-icon-document',
- 'docx': 'el-icon-document',
- 'xls': 'el-icon-document',
- 'xlsx': 'el-icon-document',
- 'jpg': 'el-icon-picture',
- 'jpeg': 'el-icon-picture',
- 'png': 'el-icon-picture',
- 'gif': 'el-icon-picture'
+ /** 鑾峰彇鏂囦欢鍥炬爣棰滆壊 */
+ getFileIconColor(fileName) {
+ const type = this.getFileType(fileName);
+ const colorMap = {
+ image: "#67C23A",
+ pdf: "#F56C6C",
+ office: "#409EFF",
+ other: "#909399"
};
- return iconMap[fileType] || 'el-icon-document';
+ return colorMap[type] || "#909399";
},
+ /** 鑾峰彇鏂囦欢鏍囩绫诲瀷 */
+ getFileTagType(fileName) {
+ const type = this.getFileType(fileName);
+ const typeMap = {
+ image: "success",
+ pdf: "danger",
+ office: "primary",
+ other: "info"
+ };
+ return typeMap[type] || "info";
+ },
+
+ /** 鑾峰彇鏂囦欢绫诲瀷鏂囨湰 */
+ getFileTypeText(fileName) {
+ const type = this.getFileType(fileName);
+ const textMap = {
+ image: "鍥剧墖",
+ pdf: "PDF",
+ office: "鏂囨。",
+ other: "鍏朵粬"
+ };
+ return textMap[type] || "鏈煡";
+ },
+
+ /** 妫�鏌ユ槸鍚﹀彲棰勮 */
+ isPreviewable(fileName) {
+ const type = this.getFileType(fileName);
+ return ["image", "pdf"].includes(type);
+ },
+
+ /** 鑾峰彇鏂囦欢鎵╁睍鍚� */
getFileExtension(filename) {
- return filename.split('.').pop().toLowerCase();
+ return filename
+ .split(".")
+ .pop()
+ .toLowerCase();
},
+ /** 鏍煎紡鍖栨枃浠跺ぇ灏� */
formatFileSize(bytes) {
- if (bytes === 0) return '0 B';
+ if (!bytes || bytes === 0) return "0 B";
const k = 1024;
- const sizes = ['B', 'KB', 'MB', 'GB'];
+ const sizes = ["B", "KB", "MB", "GB"];
const i = Math.floor(Math.log(bytes) / Math.log(k));
- return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
},
- isImage(fileType) {
- const imageTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp'];
- return imageTypes.includes(fileType);
+ /** 鏃ユ湡鏃堕棿鏍煎紡鍖� */
+ formatDateTime(dateTime) {
+ if (!dateTime) return "";
+
+ try {
+ const date = new Date(dateTime);
+ if (isNaN(date.getTime())) return dateTime;
+
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, "0");
+ const day = String(date.getDate()).padStart(2, "0");
+ const hours = String(date.getHours()).padStart(2, "0");
+ const minutes = String(date.getMinutes()).padStart(2, "0");
+
+ return `${year}-${month}-${day} ${hours}:${minutes}`;
+ } catch (error) {
+ return dateTime;
+ }
}
}
-}
+};
</script>
<style scoped>
@@ -250,61 +434,57 @@
border: 1px solid #ebeef5;
border-radius: 4px;
padding: 15px;
+ background: #fafafa;
}
-.attachment-upload {
- margin-bottom: 15px;
+.attachment-header {
+ display: flex;
+ align-items: center;
+ margin-bottom: 16px;
+ padding-bottom: 8px;
+ border-bottom: 1px solid #ebeef5;
+}
+
+.attachment-title {
+ font-weight: bold;
+ margin: 0 8px;
+ color: #303133;
+}
+
+.attachment-tip {
+ font-size: 12px;
+ color: #909399;
+ margin-left: auto;
}
.attachment-list {
- max-height: 300px;
- overflow-y: auto;
+ margin-top: 16px;
}
-.attachment-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 8px 12px;
- border-bottom: 1px solid #f0f0f0;
-}
-
-.attachment-item:last-child {
- border-bottom: none;
-}
-
-.file-info {
- display: flex;
- align-items: center;
- flex: 1;
-}
-
-.file-icon {
- margin-right: 8px;
- font-size: 16px;
- color: #409EFF;
+.list-title {
+ font-weight: bold;
+ margin-bottom: 12px;
+ color: #303133;
+ font-size: 14px;
}
.file-name {
- flex: 1;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- margin-right: 8px;
+ font-size: 13px;
+ margin-left: 8px;
}
-.file-size {
- color: #909399;
+::v-deep .el-upload__tip {
font-size: 12px;
-}
-
-.file-actions {
- flex-shrink: 0;
-}
-
-.no-attachment {
- text-align: center;
- padding: 20px;
color: #909399;
+ margin-top: 8px;
+}
+
+::v-deep .el-table .cell {
+ padding: 8px 12px;
+}
+
+::v-deep .el-button--mini {
+ padding: 5px 10px;
+ font-size: 12px;
}
</style>
diff --git a/src/views/business/assess/index.vue b/src/views/business/assess/index.vue
index 75168b4..fb1ab31 100644
--- a/src/views/business/assess/index.vue
+++ b/src/views/business/assess/index.vue
@@ -26,18 +26,18 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
- <el-form-item label="涓氬姟浜哄憳" prop="assignee">
+ <el-form-item label="涓氬姟浜哄憳" prop="coordinatorName">
<el-input
- v-model="queryParams.assignee"
+ v-model="queryParams.coordinatorName"
placeholder="璇疯緭鍏ヤ笟鍔′汉鍛�"
clearable
style="width: 200px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
- <el-form-item label="璇勪及鐘舵��" prop="assessmentStatus">
+ <el-form-item label="璇勪及鐘舵��" prop="firstAssessState">
<el-select
- v-model="queryParams.assessmentStatus"
+ v-model="queryParams.firstAssessState"
placeholder="璇烽�夋嫨璇勪及鐘舵��"
clearable
style="width: 200px"
@@ -50,7 +50,7 @@
</el-form-item>
<el-form-item label="鐢宠鏃堕棿" prop="applyTimeRange">
<el-date-picker
- v-model="queryParams.applyTimeRange"
+ v-model="applyTimeRange"
type="daterange"
range-separator="鑷�"
start-placeholder="寮�濮嬫棩鏈�"
@@ -61,7 +61,7 @@
</el-form-item>
<el-form-item label="璇勪及鏃堕棿" prop="assessmentTimeRange">
<el-date-picker
- v-model="queryParams.assessmentTimeRange"
+ v-model="assessmentTimeRange"
type="daterange"
range-separator="鑷�"
start-placeholder="寮�濮嬫棩鏈�"
@@ -187,22 +187,22 @@
<el-table-column
label="璇勪及鐘舵��"
align="center"
- prop="assessmentStatus"
+ prop="firstAssessState"
width="100"
>
<template slot-scope="scope">
- <el-tag :type="statusFilter(scope.row.assessmentStatus)">
- {{ statusTextFilter(scope.row.assessmentStatus) }}
+ <el-tag :type="statusFilter(scope.row.firstAssessState)">
+ {{ statusTextFilter(scope.row.firstAssessState) }}
</el-tag>
</template>
</el-table-column>
<el-table-column
label="涓氬姟浜哄憳"
align="center"
- prop="assignee"
+ prop="coordinatorName"
width="100"
/>
- <el-table-column
+ <!-- <el-table-column
label="璇勪及绫诲瀷"
align="center"
prop="assessmentType"
@@ -214,7 +214,7 @@
:value="parseInt(scope.row.assessmentType)"
/>
</template>
- </el-table-column>
+ </el-table-column> -->
<el-table-column
label="鎿嶄綔"
align="center"
@@ -231,8 +231,8 @@
>
<el-button
v-if="
- scope.row.assessmentStatus === '0' ||
- scope.row.assessmentStatus === '1'
+ scope.row.firstAssessState === '0' ||
+ scope.row.firstAssessState === '1'
"
size="mini"
type="text"
@@ -241,7 +241,7 @@
>璇勪及</el-button
>
<el-button
- v-if="scope.row.assessmentStatus === '2'"
+ v-if="scope.row.firstAssessState === '2'"
size="mini"
type="text"
icon="el-icon-check"
@@ -271,7 +271,7 @@
delAssessment,
exportAssessment
} from "./mockAssessmentApi";
-
+import { evaluateBaseInfolist } from "@/api/businessApi/index";
import Pagination from "@/components/Pagination";
export default {
@@ -298,11 +298,12 @@
pageSize: 10,
donorName: undefined,
hospitalName: undefined,
- assignee: undefined,
- assessmentStatus: undefined,
- applyTimeRange: [],
- assessmentTimeRange: []
+ coordinatorName: undefined,
+ firstAssessState: undefined,
+
},
+ applyTimeRange: [],
+ assessmentTimeRange: [],
// 鎬у埆閫夐」
genderOptions: [
{ value: "0", label: "鐢�" },
@@ -341,6 +342,7 @@
// 鏌ヨ璇勪及鍒楄〃
getList() {
this.loading = true;
+ evaluateBaseInfolist(this.queryParams);
listAssessment(this.queryParams)
.then(response => {
if (response.code === 200) {
diff --git a/src/views/business/decide/DecideInfo.vue b/src/views/business/decide/DecideInfo.vue
index 4a664a6..74ca8c9 100644
--- a/src/views/business/decide/DecideInfo.vue
+++ b/src/views/business/decide/DecideInfo.vue
@@ -13,33 +13,41 @@
>
淇濆瓨淇℃伅
</el-button>
+ <el-button
+ v-else
+ type="primary"
+ style="float: right; padding: 3px 0"
+ @click="handleEdit"
+ >
+ 缂栬緫淇℃伅
+ </el-button>
</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-form-item label="鎹愮尞鑰呯紪鍙�" prop="donorno">
<el-input
- v-model="form.hospitalNo"
+ v-model="form.donorno"
:readonly="!isEdit"
- placeholder="鑷姩鐢熸垚 D+鏁板瓧"
+ placeholder="鑷姩鐢熸垚鎹愮尞鑰呯紪鍙�"
/>
</el-form-item>
</el-col>
<el-col :span="8">
- <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
- <el-input v-model="form.donorName" :readonly="!isEdit" />
+ <el-form-item label="鎹愮尞鑰呭鍚�" prop="name">
+ <el-input v-model="form.name" :readonly="!isEdit" />
</el-form-item>
</el-col>
<el-col :span="8">
- <el-form-item label="鎬у埆" prop="gender">
+ <el-form-item label="鎬у埆" prop="sex">
<el-select
- v-model="form.gender"
+ v-model="form.sex"
:disabled="!isEdit"
style="width: 100%"
>
- <el-option label="鐢�" value="0" />
- <el-option label="濂�" value="1" />
+ <el-option label="鐢�" value="1" />
+ <el-option label="濂�" value="2" />
</el-select>
</el-form-item>
</el-col>
@@ -52,14 +60,14 @@
</el-form-item>
</el-col>
<el-col :span="8">
- <el-form-item label="鐤剧梾璇婃柇" prop="diagnosis">
- <el-input v-model="form.diagnosis" :readonly="!isEdit" />
+ <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname">
+ <el-input v-model="form.diagnosisname" :readonly="!isEdit" />
</el-form-item>
</el-col>
<el-col :span="8">
- <el-form-item label="姝讳骸鍘熷洜" prop="deathReason">
+ <el-form-item label="姝讳骸鍘熷洜" prop="deathreason">
<el-select
- v-model="form.deathReason"
+ v-model="form.deathreason"
:disabled="!isEdit"
style="width: 100%"
>
@@ -73,9 +81,9 @@
<el-row :gutter="20">
<el-col :span="8">
- <el-form-item label="姝讳骸鏃堕棿" prop="deathTime">
+ <el-form-item label="姝讳骸鏃堕棿" prop="deathtime">
<el-date-picker
- v-model="form.deathTime"
+ v-model="form.deathtime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
@@ -83,21 +91,61 @@
/>
</el-form-item>
</el-col>
- <el-col :span="8">
- <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="judgmentDoctor">
- <el-input v-model="form.judgmentDoctorone" :readonly="!isEdit" />
+ <el-col :span="8">
+ <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="deathjudgedocto">
+ <el-input v-model="form.deathjudgedocto" :readonly="!isEdit" />
</el-form-item>
</el-col>
<el-col :span="8">
- <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="judgmentDoctor">
- <el-input v-model="form.judgmentDoctortwo" :readonly="!isEdit" />
+ <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="deathjudgedoctt">
+ <el-input v-model="form.deathjudgedoctt" :readonly="!isEdit" />
</el-form-item>
</el-col>
</el-row>
- <el-row>
+
+ <el-row :gutter="20">
<el-col :span="8">
- <el-form-item label="鐧昏浜�" prop="registrant">
- <el-input v-model="form.registrant" :readonly="!isEdit" />
+ <el-form-item label="鍣ㄥ畼鑾峰彇鏈烘瀯" prop="gainhospitalname">
+ <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-row :gutter="20">
+ <el-col :span="8">
+ <el-form-item label="璐熻矗浜�" prop="responsibleusername">
+ <el-input v-model="form.responsibleusername" :readonly="!isEdit" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="璁板綍鐘舵��" prop="recordstate">
+ <el-tag :type="getStatusTag(form.recordstate)">
+ {{ getStatusText(form.recordstate) }}
+ </el-tag>
</el-form-item>
</el-col>
</el-row>
@@ -281,7 +329,7 @@
</template>
<script>
-import { getDeathJudgmentDetail, updateDeathJudgment } from "./mockDeathJudgmentApi";
+import { deathinfoedit, deathinfoInfo } from "@/api/businessApi";
export default {
name: "DeathJudgmentDetail",
@@ -294,31 +342,39 @@
// 琛ㄥ崟鏁版嵁
form: {
id: undefined,
- hospitalNo: "",
- donorName: "",
- gender: "",
+ infoid: undefined,
+ donorno: "",
+ name: "",
+ sex: "",
age: "",
- diagnosis: "",
- deathReason: "",
- deathTime: "",
- judgmentDoctor: "",
- judgmentDescription: "",
- registrant: "",
- registrationTime: ""
+ diagnosisname: "",
+ deathreason: "",
+ deathtime: "",
+ deathjudgedocto: "",
+ deathjudgedoctt: "",
+ gainhospitalno: "",
+ gainhospitalname: "",
+ isspendremember: 0,
+ isrestoreremains: 0,
+ rememberannex: "",
+ responsibleuserid: "",
+ responsibleusername: "",
+ recordstate: "0",
+ judgmentDescription: ""
},
// 琛ㄥ崟楠岃瘉瑙勫垯
rules: {
- donorName: [
+ name: [
{ required: true, message: "鎹愮尞鑰呭鍚嶄笉鑳戒负绌�", trigger: "blur" }
],
- deathReason: [
+ deathreason: [
{ required: true, message: "姝讳骸鍘熷洜涓嶈兘涓虹┖", trigger: "change" }
],
- deathTime: [
+ deathtime: [
{ required: true, message: "姝讳骸鏃堕棿涓嶈兘涓虹┖", trigger: "change" }
],
- judgmentDoctor: [
- { required: true, message: "鍒ゅ畾鍖荤敓涓嶈兘涓虹┖", trigger: "blur" }
+ deathjudgedocto: [
+ { required: true, message: "鍒ゅ畾鍖荤敓涓�涓嶈兘涓虹┖", trigger: "blur" }
]
},
// 闄勪欢鐩稿叧鏁版嵁
@@ -358,52 +414,87 @@
if (id && !this.$route.path.includes('/add')) {
this.getDetail(id);
} else if (this.$route.path.includes('/add')) {
- this.generateHospitalNo();
+ this.generateDonorNo();
}
this.getAttachmentList();
},
methods: {
- // 鐢熸垚浣忛櫌鍙�
- generateHospitalNo() {
- // 妯℃嫙鐢熸垚浣忛櫌鍙凤細D + 鏃堕棿鎴冲悗6浣�
+ // 鐢熸垚鎹愮尞鑰呯紪鍙�
+ generateDonorNo() {
const timestamp = Date.now().toString();
- this.form.hospitalNo = 'D' + timestamp.slice(-6);
+ this.form.donorno = 'DONOR' + timestamp.slice(-8);
},
// 鑾峰彇璇︽儏
- getDetail(id) {
- getDeathJudgmentDetail(id).then(response => {
- if (response.code === 200) {
- this.form = response.data;
+ async getDetail(id) {
+ try {
+ const response = await deathinfoInfo({ id });
+ let realData = {};
+
+ if (response && response.data) {
+ realData = response.data;
+ } else if (response) {
+ realData = response;
}
- });
+
+ // 鏄犲皠瀛楁鍒拌〃鍗�
+ this.form = {
+ ...this.form,
+ ...realData,
+ // 纭繚鏁板�肩被鍨嬪瓧娈垫纭浆鎹�
+ isspendremember: realData.isspendremember ? parseInt(realData.isspendremember) : 0,
+ isrestoreremains: realData.isrestoreremains ? parseInt(realData.isrestoreremains) : 0
+ };
+
+ // 瑙f瀽闄勪欢淇℃伅
+ if (realData.rememberannex) {
+ this.parseAttachmentData(realData.rememberannex);
+ }
+
+ } catch (error) {
+ console.error('鑾峰彇姝讳骸鍒ゅ畾璇︽儏澶辫触:', error);
+ this.$message.error('鏁版嵁鍔犺浇澶辫触');
+ }
+ },
+ // 瑙f瀽闄勪欢鏁版嵁
+ parseAttachmentData(attachmentJson) {
+ try {
+ if (attachmentJson) {
+ const attachments = JSON.parse(attachmentJson);
+ if (Array.isArray(attachments)) {
+ this.attachmentList = attachments;
+ }
+ }
+ } catch (error) {
+ console.error('瑙f瀽闄勪欢鏁版嵁澶辫触:', error);
+ }
+ },
+ // 鏋勫缓闄勪欢JSON鏁版嵁
+ buildAttachmentJson() {
+ return JSON.stringify(this.attachmentList);
+ },
+ // 鑾峰彇鐘舵�佹爣绛炬牱寮�
+ getStatusTag(status) {
+ const statusMap = {
+ "0": "warning", // 缁存姢涓�
+ "1": "success", // 宸插畬鎴�
+ "99": "danger" // 宸茬粓姝�
+ };
+ return statusMap[status] || "info";
+ },
+ // 鑾峰彇鐘舵�佹枃鏈�
+ getStatusText(status) {
+ const textMap = {
+ "0": "缁存姢涓�",
+ "1": "宸插畬鎴�",
+ "99": "宸茬粓姝�"
+ };
+ return textMap[status] || "鏈煡鐘舵��";
},
// 鑾峰彇闄勪欢鍒楄〃
getAttachmentList() {
this.attachmentLoading = true;
- // 妯℃嫙闄勪欢鏁版嵁 - 瀹為檯椤圭洰涓粠鎺ュ彛鑾峰彇
+ // 瀹為檯椤圭洰涓粠鎺ュ彛鑾峰彇闄勪欢鏁版嵁
setTimeout(() => {
- this.attachmentList = [
- {
- id: 1,
- type: "1",
- typeName: "鑴戞浜″垽瀹氳〃",
- fileName: "鑴戞浜″垽瀹氳〃_202512001.pdf",
- fileSize: 2548321,
- uploadTime: "2025-12-01 10:30:00",
- uploader: "寮犲尰鐢�",
- fileUrl: "/attachments/brain_death_1.pdf"
- },
- {
- id: 2,
- type: "2",
- typeName: "鑴戠數鍥捐瘎浼拌〃",
- fileName: "鑴戠數鍥捐瘎浼拌〃_202512001.docx",
- fileSize: 512345,
- uploadTime: "2025-12-01 14:20:00",
- uploader: "鏉庡尰鐢�",
- fileUrl: "/attachments/eeg_1.docx"
- }
- ];
this.attachmentLoading = false;
}, 500);
},
@@ -451,7 +542,6 @@
const maxSize = 10 * 1024 * 1024; // 10MB
- // 鏍¢獙鏂囦欢绫诲瀷
const isTypeOk = allowedTypes.includes(file.type) ||
file.name.endsWith('.pdf') ||
file.name.endsWith('.jpg') ||
@@ -467,7 +557,6 @@
return false;
}
- // 鏍¢獙鏂囦欢澶у皬
if (file.size > maxSize) {
this.$message.error('鏂囦欢澶у皬涓嶈兘瓒呰繃10MB');
return false;
@@ -493,7 +582,6 @@
this.uploadLoading = true;
try {
- // 妯℃嫙涓婁紶杩囩▼ - 瀹為檯椤圭洰涓皟鐢ㄤ笂浼犳帴鍙�
for (const file of this.tempFileList) {
const newAttachment = {
id: Date.now() + Math.random(),
@@ -508,6 +596,9 @@
this.attachmentList.push(newAttachment);
}
+
+ // 鏇存柊闄勪欢JSON鏁版嵁鍒拌〃鍗�
+ this.form.rememberannex = this.buildAttachmentJson();
this.$message.success('鏂囦欢涓婁紶鎴愬姛');
this.uploadDialogVisible = false;
@@ -529,6 +620,8 @@
const index = this.attachmentList.findIndex(item => item.id === attachment.id);
if (index !== -1) {
this.attachmentList.splice(index, 1);
+ // 鏇存柊闄勪欢JSON鏁版嵁鍒拌〃鍗�
+ this.form.rememberannex = this.buildAttachmentJson();
this.$message.success('璇勪及琛ㄥ垹闄ゆ垚鍔�');
}
}).catch(() => {});
@@ -549,38 +642,48 @@
},
// 涓嬭浇闄勪欢
handleDownload(attachment) {
- // 瀹為檯椤圭洰涓皟鐢ㄤ笅杞芥帴鍙�
const link = document.createElement('a');
link.href = attachment.fileUrl;
link.download = attachment.fileName;
link.click();
this.$message.success(`寮�濮嬩笅杞�: ${attachment.fileName}`);
},
+ // 缂栬緫淇℃伅
+ handleEdit() {
+ this.isEdit = true;
+ },
// 淇濆瓨淇℃伅
- handleSave() {
- this.$refs.form.validate(valid => {
+ async handleSave() {
+ this.$refs.form.validate(async valid => {
if (valid) {
this.saveLoading = true;
- // 妯℃嫙淇濆瓨杩囩▼
- updateDeathJudgment(this.form)
- .then(response => {
- if (response.code === 200) {
- this.$message.success('淇濆瓨鎴愬姛');
- if (this.$route.path.includes('/add')) {
- this.$router.push('/case/deathJudgment');
- } else {
- this.isEdit = false;
- }
+ try {
+ // 鏋勫缓鎻愪氦鏁版嵁
+ const submitData = {
+ ...this.form,
+ // 纭繚闄勪欢鏁版嵁鏈�鏂�
+ rememberannex: this.buildAttachmentJson()
+ };
+
+ const response = await deathinfoedit(submitData);
+
+ if (response.code === 200) {
+ this.$message.success('淇濆瓨鎴愬姛');
+ this.isEdit = false;
+
+ if (this.$route.path.includes('/add')) {
+ this.$router.push('/case/deathJudgment');
}
- })
- .catch(error => {
- console.error('淇濆瓨澶辫触:', error);
- this.$message.error('淇濆瓨澶辫触');
- })
- .finally(() => {
- this.saveLoading = false;
- });
+ } else {
+ this.$message.error(response.message || '淇濆瓨澶辫触');
+ }
+ } catch (error) {
+ console.error('淇濆瓨澶辫触:', error);
+ this.$message.error('淇濆瓨澶辫触');
+ } finally {
+ this.saveLoading = false;
+ }
}
});
},
diff --git a/src/views/business/decide/index.vue b/src/views/business/decide/index.vue
index 73c4a50..88b380a 100644
--- a/src/views/business/decide/index.vue
+++ b/src/views/business/decide/index.vue
@@ -8,27 +8,27 @@
:inline="true"
label-width="100px"
>
- <el-form-item label="浣忛櫌鍙�" prop="hospitalNo">
+ <el-form-item label="浣忛櫌鍙�" prop="inpatientno">
<el-input
- v-model="queryParams.hospitalNo"
+ v-model="queryParams.inpatientno"
placeholder="璇疯緭鍏ヤ綇闄㈠彿"
clearable
style="width: 200px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
- <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
+ <el-form-item label="鎹愮尞鑰呭鍚�" prop="name">
<el-input
- v-model="queryParams.donorName"
+ v-model="queryParams.name"
placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
clearable
style="width: 200px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
- <el-form-item label="姝讳骸鍘熷洜" prop="deathReason">
+ <el-form-item label="姝讳骸鍘熷洜" prop="deathreason">
<el-select
- v-model="queryParams.deathReason"
+ v-model="queryParams.deathreason"
placeholder="璇烽�夋嫨姝讳骸鍘熷洜"
clearable
style="width: 200px"
@@ -73,13 +73,6 @@
>淇敼</el-button
>
<el-button
- type="danger"
- icon="el-icon-delete"
- :disabled="multiple"
- @click="handleDelete"
- >鍒犻櫎</el-button
- >
- <el-button
type="warning"
icon="el-icon-download"
@click="handleExport"
@@ -103,95 +96,114 @@
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column
+ label="妗堜緥缂栧彿"
+ align="center"
+ prop="caseNo"
+ width="120"
+ />
+ <el-table-column
label="浣忛櫌鍙�"
align="center"
- prop="hospitalNo"
+ prop="inpatientno"
width="120"
/>
<el-table-column
label="鎹愮尞鑰呭鍚�"
align="center"
- prop="donorName"
+ prop="name"
width="120"
/>
- <el-table-column label="鎬у埆" align="center" prop="gender" width="80">
+ <el-table-column label="鎬у埆" align="center" prop="sex" width="80">
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_user_sex"
- :value="parseInt(scope.row.gender)"
+ :value="scope.row.sex"
/>
</template>
</el-table-column>
<el-table-column label="骞撮緞" align="center" prop="age" width="80" />
<el-table-column
+ label="娌荤枟鍖婚櫌"
+ align="center"
+ prop="treatmenthospitalname"
+ width="180"
+ show-overflow-tooltip
+ />
+ <el-table-column
label="鐤剧梾璇婃柇"
align="center"
- prop="diagnosis"
- min-width="180"
+ prop="diagnosisname"
+ min-width="200"
show-overflow-tooltip
/>
<el-table-column
label="姝讳骸鍘熷洜"
align="center"
- prop="deathReason"
+ prop="deathreason"
width="120"
>
<template slot-scope="scope">
- <el-tag :type="reasonFilter(scope.row.deathReason)">
- {{ reasonTextFilter(scope.row.deathReason) }}
+ <el-tag :type="reasonFilter(scope.row.deathreason)">
+ {{ reasonTextFilter(scope.row.deathreason) }}
</el-tag>
</template>
</el-table-column>
<el-table-column
label="姝讳骸鏃堕棿"
align="center"
- prop="deathTime"
+ prop="deathtime"
width="160"
>
<template slot-scope="scope">
<span>{{
- scope.row.deathTime
- ? parseTime(scope.row.deathTime, "{y}-{m}-{d} {h}:{i}")
+ scope.row.deathtime
+ ? parseTime(scope.row.deathtime, "{y}-{m}-{d} {h}:{i}")
: "-"
}}</span>
</template>
</el-table-column>
<el-table-column
- label="鍒ゅ畾鍖荤敓"
+ label="鍒ゅ畾鍖荤敓涓�"
align="center"
- prop="judgmentDoctor"
+ prop="deathjudgedocto"
width="120"
/>
- <el-table-column
+ <el-table-column
label="鍒ゅ畾鍖荤敓浜�"
align="center"
- prop="judgmentDoctortwo"
+ prop="deathjudgedoctt"
width="120"
/>
<el-table-column
- label="鐧昏鏃堕棿"
+ label="璁板綍鐘舵��"
align="center"
- prop="registrationTime"
+ prop="recordstate"
+ width="100"
+ >
+ <template slot-scope="scope">
+ <el-tag :type="statusFilter(scope.row.recordstate)">
+ {{ statusTextFilter(scope.row.recordstate) }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="鍒涘缓鏃堕棿"
+ align="center"
+ prop="createTime"
width="160"
>
<template slot-scope="scope">
<span>{{
- scope.row.registrationTime
- ? parseTime(scope.row.registrationTime, "{y}-{m}-{d} {h}:{i}")
+ scope.row.createTime
+ ? parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}")
: "-"
}}</span>
</template>
</el-table-column>
- <el-table-column
- label="鐧昏浜�"
- align="center"
- prop="registrant"
- width="100"
- />
<el-table-column
label="鎿嶄綔"
align="center"
- width="210"
+ width="180"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
@@ -208,14 +220,6 @@
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>淇敼</el-button
- >
- <el-button
- size="mini"
- type="text"
- icon="el-icon-delete"
- style="color: #F56C6C"
- @click="handleDelete(scope.row)"
- >鍒犻櫎</el-button
>
</template>
</el-table-column>
@@ -234,7 +238,7 @@
</template>
<script>
-import { listDeathJudgment, delDeathJudgment, exportDeathJudgment } from "./mockDeathJudgmentApi";
+import { queryDathInfoBaseInfo, deathinfoedit,deathinfoInfo } from "@/api/businessApi";
import Pagination from "@/components/Pagination";
export default {
@@ -259,11 +263,13 @@
queryParams: {
pageNum: 1,
pageSize: 10,
- hospitalNo: undefined,
- donorName: undefined,
- deathReason: undefined,
+ inpatientno: undefined,
+ name: undefined,
+ deathreason: undefined,
deathTimeRange: []
- }
+ },
+ // 鎵�鏈夋暟鎹紙鐢ㄤ簬鍓嶇绛涢�夛級
+ allTableData: []
};
},
created() {
@@ -273,55 +279,157 @@
// 姝讳骸鍘熷洜杩囨护鍣�
reasonFilter(reason) {
const reasonMap = {
- "brain_death": "primary", // 鑴戞浜�
- "heart_death": "danger", // 蹇冩浜�
- "other": "info" // 鍏朵粬
+ brain_death: "primary",
+ heart_death: "danger",
+ other: "info"
};
return reasonMap[reason] || "info";
},
+
reasonTextFilter(reason) {
const reasonMap = {
- "brain_death": "鑴戞浜�",
- "heart_death": "蹇冩浜�",
- "other": "鍏朵粬"
+ brain_death: "鑴戞浜�",
+ heart_death: "蹇冩浜�",
+ other: "鍏朵粬"
};
return reasonMap[reason] || "鏈煡";
},
- // 鏌ヨ姝讳骸鍒ゅ畾鍒楄〃
- getList() {
- this.loading = true;
- listDeathJudgment(this.queryParams)
- .then(response => {
- if (response.code === 200) {
- this.deathJudgmentList = response.data.rows;
- this.total = response.data.total;
- } else {
- this.$message.error("鑾峰彇鏁版嵁澶辫触");
- }
- this.loading = false;
- })
- .catch(error => {
- console.error("鑾峰彇姝讳骸鍒ゅ畾鍒楄〃澶辫触:", error);
- this.loading = false;
- this.$message.error("鑾峰彇鏁版嵁澶辫触");
- });
+
+ // 璁板綍鐘舵�佽繃婊ゅ櫒
+ statusFilter(status) {
+ const statusMap = {
+ "0": "warning", // 缁存姢涓�
+ "1": "success", // 宸插畬鎴�
+ "99": "danger" // 宸茬粓姝�
+ };
+ return statusMap[status] || "info";
},
+
+ statusTextFilter(status) {
+ const statusMap = {
+ "0": "缁存姢涓�",
+ "1": "宸插畬鎴�",
+ "99": "宸茬粓姝�"
+ };
+ return statusMap[status] || "鏈煡鐘舵��";
+ },
+
+ // 鏌ヨ姝讳骸鍒ゅ畾鍒楄〃
+ async getList() {
+ this.loading = true;
+ try {
+ const response = await queryDathInfoBaseInfo(this.queryParams);
+
+ // 鏍规嵁瀹為檯鎺ュ彛杩斿洖缁撴瀯璋冩暣
+ let realData = [];
+ realData = response.data;
+ this.total = response.total;
+ // if (Array.isArray(response)) {
+ // realData = response;
+ // } else if (response && response.data) {
+ // realData = response.data;
+ // } else if (response && response.rows) {
+ // realData = response.rows;
+ // this.total = response.total || response.rows.length;
+ // } else if (response && response.code === 200) {
+ // realData = response.data.rows || response.data;
+ // this.total = response.data.total || realData.length;
+ // } else {
+ // realData = [];
+ // }
+
+ // 瀛樺偍鎵�鏈夋暟鎹敤浜庡墠绔瓫閫�
+ this.allTableData = realData;
+
+ // 搴旂敤鍓嶇绛涢�夋潯浠�
+ let filteredData = this.applyFrontendFilter(realData);
+
+ // 鍓嶇鍒嗛〉澶勭悊锛堝鏋滄帴鍙d笉鏀寔鍚庣鍒嗛〉锛�
+ if (!response.total && !response.data) {
+ const startIndex =
+ (this.queryParams.pageNum - 1) * this.queryParams.pageSize;
+ const endIndex = startIndex + this.queryParams.pageSize;
+ this.deathJudgmentList = filteredData.slice(startIndex, endIndex);
+ this.total = filteredData.length;
+ } else {
+ // 鎺ュ彛宸插垎椤碉紝鐩存帴浣跨敤杩斿洖鏁版嵁
+ this.deathJudgmentList = filteredData;
+ }
+ } catch (error) {
+ console.error("鑾峰彇姝讳骸鍒ゅ畾鏁版嵁澶辫触:", error);
+ this.$message.error("鏁版嵁鍔犺浇澶辫触");
+ this.deathJudgmentList = [];
+ this.total = 0;
+ } finally {
+ this.loading = false;
+ }
+ },
+
+ // 搴旂敤鍓嶇绛涢��
+ applyFrontendFilter(data) {
+ let filteredData = data;
+
+ // 浣忛櫌鍙风瓫閫�
+ if (this.queryParams.inpatientno) {
+ filteredData = filteredData.filter(
+ item =>
+ item.inpatientno &&
+ item.inpatientno.includes(this.queryParams.inpatientno)
+ );
+ }
+
+ // 濮撳悕绛涢��
+ if (this.queryParams.name) {
+ filteredData = filteredData.filter(
+ item => item.name && item.name.includes(this.queryParams.name)
+ );
+ }
+
+ // 姝讳骸鍘熷洜绛涢��
+ if (this.queryParams.deathreason) {
+ filteredData = filteredData.filter(
+ item => item.deathreason === this.queryParams.deathreason
+ );
+ }
+
+ // 姝讳骸鏃堕棿鑼冨洿绛涢��
+ if (
+ this.queryParams.deathTimeRange &&
+ this.queryParams.deathTimeRange.length === 2
+ ) {
+ const [startDate, endDate] = this.queryParams.deathTimeRange;
+ filteredData = filteredData.filter(item => {
+ if (!item.deathtime) return false;
+ const deathTime = new Date(item.deathtime).getTime();
+ const startTime = new Date(startDate).getTime();
+ const endTime = new Date(endDate + " 23:59:59").getTime();
+ return deathTime >= startTime && deathTime <= endTime;
+ });
+ }
+
+ return filteredData;
+ },
+
// 鎼滅储鎸夐挳鎿嶄綔
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
+
// 閲嶇疆鎸夐挳鎿嶄綔
resetQuery() {
this.$refs.queryForm.resetFields();
- this.handleQuery();
+ this.queryParams.pageNum = 1;
+ this.getList();
},
+
// 澶氶�夋閫変腑鏁版嵁
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
+
// 鏌ョ湅璇︽儏
handleView(row) {
this.$router.push({
@@ -329,10 +437,12 @@
query: { id: row.id }
});
},
+
// 鏂板鎸夐挳鎿嶄綔
handleCreate() {
this.$router.push("/case/DecideInfo");
},
+
// 淇敼鎸夐挳鎿嶄綔
handleUpdate(row) {
const id = row.id || this.ids[0];
@@ -341,28 +451,9 @@
query: { id: id }
});
},
- // 鍒犻櫎鎸夐挳鎿嶄綔
- handleDelete(row) {
- const ids = row.id ? [row.id] : this.ids;
- this.$confirm("鏄惁纭鍒犻櫎閫変腑鐨勬暟鎹」锛�", "璀﹀憡", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- })
- .then(() => {
- return delDeathJudgment(ids);
- })
- .then(response => {
- if (response.code === 200) {
- this.$message.success("鍒犻櫎鎴愬姛");
- this.getList();
- }
- })
- .catch(() => {});
- },
- // 瀵煎嚭鎸夐挳鎿嶄綔
+
+ // 瀵煎嚭鎸夐挳鎿嶄綔锛堟ā鎷熻皟鐢級
handleExport() {
- const queryParams = this.queryParams;
this.$confirm("鏄惁纭瀵煎嚭鎵�鏈夋浜″垽瀹氭暟鎹紵", "璀﹀憡", {
confirmButtonText: "纭畾",
cancelButtonText: "鍙栨秷",
@@ -370,12 +461,19 @@
})
.then(() => {
this.loading = true;
- return exportDeathJudgment(queryParams);
+ // 妯℃嫙瀵煎嚭鎿嶄綔
+ return new Promise(resolve => {
+ setTimeout(() => {
+ resolve({ code: 200 });
+ }, 1000);
+ });
})
.then(response => {
if (response.code === 200) {
this.$message.success("瀵煎嚭鎴愬姛");
// 瀹為檯椤圭洰涓繖閲屽鐞嗘枃浠朵笅杞�
+ // 鍙互娣诲姞浠ヤ笅浠g爜鏉ヨЕ鍙戞枃浠朵笅杞�
+ // this.downloadFile();
}
this.loading = false;
})
@@ -383,6 +481,18 @@
this.loading = false;
});
},
+
+ // 鏂囦欢涓嬭浇鏂规硶锛堥鐣欙級
+ downloadFile() {
+ // 瀹為檯椤圭洰涓殑鏂囦欢涓嬭浇閫昏緫
+ const link = document.createElement("a");
+ link.style.display = "none";
+ link.href = "/api/export/death-judgment"; // 鏇挎崲涓哄疄闄呭鍑烘帴鍙�
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ },
+
// 鏃堕棿鏍煎紡鍖�
parseTime(time, pattern) {
if (!time) return "";
@@ -440,4 +550,14 @@
.fixed-width .el-button {
margin: 0 5px;
}
+
+/* 琛ㄦ牸鏍峰紡浼樺寲 */
+::v-deep .el-table .cell {
+ padding: 8px 4px;
+}
+
+::v-deep .el-table th {
+ background-color: #f5f7fa;
+ font-weight: bold;
+}
</style>
diff --git a/src/views/business/ethicalReview/ethicalReviewInfo.vue b/src/views/business/ethicalReview/ethicalReviewInfo.vue
index b9a7f8f..4040953 100644
--- a/src/views/business/ethicalReview/ethicalReviewInfo.vue
+++ b/src/views/business/ethicalReview/ethicalReviewInfo.vue
@@ -325,7 +325,7 @@
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="180" align="center" fixed="right">
+ <el-table-column label="鎿嶄綔" width="280" align="center" fixed="right">
<template slot-scope="scope">
<el-button
size="mini"
diff --git a/src/views/business/transfer/TransportEdit.vue b/src/views/business/transfer/TransportEdit.vue
index a42de59..e27c247 100644
--- a/src/views/business/transfer/TransportEdit.vue
+++ b/src/views/business/transfer/TransportEdit.vue
@@ -297,7 +297,7 @@
<span>{{ formatDateTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="180">
+ <el-table-column label="鎿嶄綔" width="266">
<template slot-scope="scope">
<el-button
size="mini"
diff --git a/src/views/project/DonationProcess/index.vue b/src/views/project/DonationProcess/index.vue
index 8a7fe08..9eb57f6 100644
--- a/src/views/project/DonationProcess/index.vue
+++ b/src/views/project/DonationProcess/index.vue
@@ -108,25 +108,25 @@
v-loading="loading"
:data="donatebaseinfoList"
border
- :default-sort="{ prop: 'donatetime', order: 'descending' }"
+ :default-sort="{ prop: 'reporttime', order: 'descending' }"
style="width: 100%; margin-top: 20px;"
>
<el-table-column
label="涓婃姤鏃堕棿"
align="center"
- prop="donatetime"
+ prop="reporttime"
width="110"
fixed="left"
>
<template slot-scope="scope">
- <span>{{ parseTime(scope.row.donatetime, "{y}-{m}-{d}") }}</span>
+ <span>{{ parseTime(scope.row.reporttime, "{y}-{m}-{d}") }}</span>
</template>
</el-table-column>
<el-table-column
- label="杩涘害"
+ label="鎹愮尞鐘舵��"
align="center"
- prop="coreteamassessconclusion"
+ prop="recordstate"
width="100"
fixed="left"
>
@@ -141,7 +141,7 @@
<el-table-column label="鎬у埆" align="center" prop="sex" width="80">
<template slot-scope="scope">
- <span>{{ scope.row.sex === 1 ? "鐢�" : "濂�" }}</span>
+ <span>{{ scope.row.sex === "1" ? "鐢�" : "濂�" }}</span>
</template>
</el-table-column>
@@ -155,34 +155,37 @@
/>
<el-table-column
+ label="娌荤枟鍖婚櫌"
+ align="center"
+ prop="treatmenthospitalname"
+ width="150"
+ />
+
+ <el-table-column
label="鍗忚皟鍛�"
align="center"
- prop="reportername"
+ prop="coordinatorName"
width="100"
/>
<el-table-column
- label="杞负妗堜緥鏃堕棿"
+ label="妗堜緥缂栧彿"
align="center"
- prop="donatetime"
- width="110"
- >
- <template slot-scope="scope">
- <span>{{ parseTime(scope.row.donatetime, "{y}-{m}-{d}") }}</span>
- </template>
- </el-table-column>
+ prop="caseNo"
+ width="120"
+ />
<!-- 绗竴娆″尰瀛﹁瘎浼� -->
<el-table-column
label="绗竴娆¤瘎浼扮粨璁�"
align="center"
- prop="coreteamassessconclusion"
+ prop="firstAssessState"
width="120"
>
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_BaseAssessConclusion"
- :value="scope.row.coreteamassessconclusion"
+ :value="scope.row.firstAssessState"
/>
</template>
</el-table-column>
@@ -190,13 +193,11 @@
<el-table-column
label="绗竴娆¤瘎浼版椂闂�"
align="center"
- prop="coreteamassesstime"
+ prop="assessFirstTime"
width="110"
>
<template slot-scope="scope">
- <span>{{
- parseTime(scope.row.coreteamassesstime, "{y}-{m}-{d}")
- }}</span>
+ <span>{{ parseTime(scope.row.assessFirstTime, "{y}-{m}-{d}") }}</span>
</template>
</el-table-column>
@@ -204,13 +205,13 @@
<el-table-column
label="绗簩娆¤瘎浼扮粨璁�"
align="center"
- prop="coreteamassessconclusion"
+ prop="secondAssessState"
width="120"
>
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_BaseAssessConclusion"
- :value="scope.row.coreteamassessconclusion"
+ :value="scope.row.secondAssessState"
/>
</template>
</el-table-column>
@@ -218,12 +219,12 @@
<el-table-column
label="绗簩娆¤瘎浼版椂闂�"
align="center"
- prop="coreteamassesstime"
+ prop="assessSecondTime"
width="110"
>
<template slot-scope="scope">
<span>{{
- parseTime(scope.row.coreteamassesstime, "{y}-{m}-{d}")
+ parseTime(scope.row.assessSecondTime, "{y}-{m}-{d}")
}}</span>
</template>
</el-table-column>
@@ -231,24 +232,24 @@
<el-table-column
label="浜插睘纭鏃堕棿"
align="center"
- prop="signdate"
+ prop="signDate"
width="110"
>
<template slot-scope="scope">
- <span>{{ parseTime(scope.row.signdate, "{y}-{m}-{d}") }}</span>
+ <span>{{ parseTime(scope.row.signDate, "{y}-{m}-{d}") }}</span>
</template>
</el-table-column>
<el-table-column
label="浼︾悊瀹℃煡缁撹"
align="center"
- prop="expertconclusion"
+ prop="expertConclusion"
width="120"
>
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_EthicalReview"
- :value="scope.row.expertconclusion"
+ :value="scope.row.expertConclusion"
/>
</template>
</el-table-column>
@@ -256,30 +257,30 @@
<el-table-column
label="浼︾悊瀹℃煡鏃堕棿"
align="center"
- prop="conclusiontime"
+ prop="expertTime"
width="110"
>
<template slot-scope="scope">
- <span>{{ parseTime(scope.row.conclusiontime, "{y}-{m}-{d}") }}</span>
+ <span>{{ parseTime(scope.row.expertTime, "{y}-{m}-{d}") }}</span>
</template>
</el-table-column>
<el-table-column
label="鍣ㄥ畼鍒嗛厤鏁伴噺"
align="center"
- prop="organcount"
+ prop="organCount"
width="100"
/>
<el-table-column
label="鑾峰彇瑙佽瘉鏃堕棿"
align="center"
- prop="operationbegtime"
+ prop="operationBegTime"
width="110"
>
<template slot-scope="scope">
<span>{{
- parseTime(scope.row.operationbegtime, "{y}-{m}-{d}")
+ parseTime(scope.row.operationBegTime, "{y}-{m}-{d}")
}}</span>
</template>
</el-table-column>
@@ -287,26 +288,26 @@
<el-table-column
label="瀹屾垚鐧昏鏃堕棿"
align="center"
- prop="completetime"
+ prop="completeTime"
width="110"
>
<template slot-scope="scope">
- <span>{{ parseTime(scope.row.completetime, "{y}-{m}-{d}") }}</span>
+ <span>{{ parseTime(scope.row.completeTime, "{y}-{m}-{d}") }}</span>
</template>
</el-table-column>
+ <!-- 鎹愮尞杩涘害鍒� -->
<el-table-column
label="鎹愮尞杩涘害"
align="center"
- prop="workflow"
+ prop="recordstate"
width="120"
- fixed="right"
>
<template slot-scope="scope">
- <div v-if="!scope.row.terminationCase">
+ <div v-if="scope.row.terminationCase == 0">
<dict-tag
:options="dict.type.sys_donornode"
- :value="scope.row.workflow"
+ :value="scope.row.recordstate"
/>
</div>
<div v-else>
@@ -315,23 +316,24 @@
</template>
</el-table-column>
- <!-- <el-table-column label="鎿嶄綔" align="center" width="120" fixed="right">
+ <!-- 鎿嶄綔鍒楋細鍙繚鐣欑粓姝㈠拰鏌ョ湅璇︽儏 -->
+ <el-table-column label="鎿嶄綔" align="center" width="150" fixed="right">
<template slot-scope="scope">
+ <el-button size="mini" type="text" @click="handleDetail(scope.row)"
+ >鏌ョ湅璇︽儏</el-button
+ >
<el-button
size="mini"
type="text"
- icon="el-icon-view"
- @click="handleDetail(scope.row)"
- >璇︽儏</el-button>
- <el-button
- v-if="scope.row.recordstate == 0"
- size="mini"
- type="text"
- icon="el-icon-check"
- @click="handleApprove(scope.row)"
- >瀹℃牳</el-button>
+ style="color: #f56c6c;"
+ @click="handleTerminate(scope.row)"
+ v-if="
+ scope.row.terminationCase === 0 && scope.row.recordstate !== '99'
+ "
+ >缁堟</el-button
+ >
</template>
- </el-table-column> -->
+ </el-table-column>
</el-table>
<pagination
@@ -344,7 +346,7 @@
<!-- 璇︽儏寮规 -->
<el-dialog
- :title="`鎹愮尞鑰呰鎯� - ${currentRecord.name}`"
+ :title="`鎹愮尞鑰呰鎯� - ${currentRecord.name || ''}`"
:visible.sync="detailVisible"
width="1000px"
append-to-body
@@ -352,41 +354,32 @@
<donor-detail :donorData="currentRecord" @close="detailVisible = false" />
</el-dialog>
- <!-- 瀹℃牳寮规 -->
+ <!-- 缁堟纭寮规 -->
<el-dialog
- title="鎹愮尞鑰呭鏍�"
- :visible.sync="approveVisible"
- width="500px"
+ title="缁堟纭"
+ :visible.sync="terminateVisible"
+ width="400px"
append-to-body
>
- <el-form ref="approveForm" :model="approveForm" label-width="100px">
- <el-form-item label="瀹℃牳缁撴灉">
- <el-radio-group v-model="approveForm.approveResult">
- <el-radio label="1">閫氳繃</el-radio>
- <el-radio label="2">椹冲洖</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="瀹℃牳鎰忚">
- <el-input
- type="textarea"
- v-model="approveForm.approveOpinion"
- placeholder="璇疯緭鍏ュ鏍告剰瑙�"
- :rows="4"
- />
- </el-form-item>
- </el-form>
+ <div style="margin-bottom: 20px;">
+ <p>
+ 纭畾瑕佺粓姝㈡崘鐚��
+ <strong>{{ currentRecord.name }}</strong> 鐨勬崘鐚繘绋嬪悧锛�
+ </p>
+ <p style="color: #f56c6c; font-size: 12px;">
+ 姝ゆ搷浣滀笉鍙�嗭紝璇疯皑鎱庢搷浣滐紒
+ </p>
+ </div>
<div slot="footer">
- <el-button @click="approveVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitApprove">纭畾</el-button>
+ <el-button @click="terminateVisible = false">鍙栨秷</el-button>
+ <el-button type="danger" @click="submitTerminate">纭缁堟</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
-// 瀵煎叆妯℃嫙鏁版嵁鐢熸垚宸ュ叿
-import Mock from "mockjs";
-import { courselist } from "@/api/businessApi";
+import { courselist, terminateDonor } from "@/api/businessApi";
export default {
name: "Donatebaseinfo",
@@ -403,8 +396,8 @@
donatebaseinfoList: [],
// 璇︽儏寮规鏄剧ず
detailVisible: false,
- // 瀹℃牳寮规鏄剧ず
- approveVisible: false,
+ // 缁堟纭寮规鏄剧ず
+ terminateVisible: false,
// 褰撳墠鎿嶄綔璁板綍
currentRecord: {},
// 缁熻鏁版嵁
@@ -421,11 +414,6 @@
name: undefined,
idcardno: undefined,
recordstate: undefined
- },
- // 瀹℃牳琛ㄥ崟
- approveForm: {
- approveResult: "1",
- approveOpinion: ""
}
};
},
@@ -433,96 +421,96 @@
this.getList();
},
methods: {
- /** 鐢熸垚妯℃嫙鏁版嵁 */
- generateMockData() {
- const mockTemplate = {
- "list|15-30": [
- {
- "id|+1": 1001,
- name: "@cname",
- "sex|1": [1, 2], // 1:鐢�, 2:濂�
- "age|18-65": 1,
- idcardno: /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dX]$/,
- reportername: "@cname",
- treatmenthospitalname: "@ctitle(3, 5)鍖婚櫌",
- donatetime: '@datetime("yyyy-MM-dd HH:mm:ss")',
- "coreteamassessconclusion|1": ["1", "2", "3"], // 璇勪及缁撹
- coreteamassesstime: '@datetime("yyyy-MM-dd HH:mm:ss")',
- signdate: '@datetime("yyyy-MM-dd HH:mm:ss")',
- "expertconclusion|1": ["1", "2", "3"], // 浼︾悊瀹℃煡缁撹
- conclusiontime: '@datetime("yyyy-MM-dd HH:mm:ss")',
- "organcount|0-5": 1,
- operationbegtime: '@datetime("yyyy-MM-dd HH:mm:ss")',
- completetime: '@datetime("yyyy-MM-dd HH:mm:ss")',
- "workflow|1": ["1", "2", "3", "4", "5"], // 宸ヤ綔娴佺姸鎬�
- "recordstate|1": ["0", "1", "99"], // 0:寰呭鏍�, 1:宸插鏍�, 99:宸茬粓姝�
- "terminationCase|1": [true, false]
- }
- ]
- };
-
- return Mock.mock(mockTemplate).list;
- },
-
/** 鏌ヨ鎹愮尞鍩虹鍒楄〃 */
async getList() {
this.loading = true;
- const response = await courselist(this.queryParams);
- // 妯℃嫙API璋冪敤寤惰繜
- setTimeout(() => {
- // 鐢熸垚妯℃嫙鏁版嵁
- const mockData = this.generateMockData();
+ try {
+ const response = await courselist(this.queryParams);
- // 搴旂敤绛涢�夋潯浠�
- let filteredData = mockData;
- if (this.queryParams.name) {
- filteredData = filteredData.filter(item =>
- item.name.includes(this.queryParams.name)
- );
- }
- if (this.queryParams.idcardno) {
- filteredData = filteredData.filter(item =>
- item.idcardno.includes(this.queryParams.idcardno)
- );
- }
- if (this.queryParams.recordstate) {
- filteredData = filteredData.filter(
- item => item.recordstate === this.queryParams.recordstate
- );
- }
+ // 鏍规嵁瀹為檯鎺ュ彛杩斿洖缁撴瀯璋冩暣
+ let realData = [];
+ realData = response.data.donatebaseinfoProgressDTOS;
+ this.total = response.total;
+ this.stats.pendingCount = response.data.terminationCase[0];
+ this.stats.approvedCount = response.data.terminationCase[1];
+ this.stats.terminatedCount = response.data.terminationCase[2];
+ this.stats.totalCount = response.total;
+ // 瀛樺偍鎵�鏈夋暟鎹敤浜庡墠绔瓫閫夊拰鍒嗛〉
+ this.allTableData = realData;
- // 鍒嗛〉澶勭悊
- const startIndex =
- (this.queryParams.pageNum - 1) * this.queryParams.pageSize;
- const endIndex = startIndex + this.queryParams.pageSize;
- this.donatebaseinfoList = filteredData.slice(startIndex, endIndex);
- this.total = filteredData.length;
+ // 搴旂敤鍓嶇绛涢�夋潯浠讹紙濡傛灉鎺ュ彛涓嶆敮鎸佸悗绔瓫閫夛級
+ let filteredData = this.applyFrontendFilter(realData);
+
+ // 鍓嶇鍒嗛〉澶勭悊锛堝鏋滄帴鍙d笉鏀寔鍚庣鍒嗛〉锛�
+ if (!response.total && !response.data) {
+ const startIndex =
+ (this.queryParams.pageNum - 1) * this.queryParams.pageSize;
+ const endIndex = startIndex + this.queryParams.pageSize;
+ this.donatebaseinfoList = filteredData.slice(startIndex, endIndex);
+ this.total = filteredData.length;
+ } else {
+ // 鎺ュ彛宸插垎椤碉紝鐩存帴浣跨敤杩斿洖鏁版嵁
+ this.donatebaseinfoList = filteredData;
+ }
// 鏇存柊缁熻鏁版嵁
- this.updateStats(mockData);
+ // this.updateStats(realData);
+ } catch (error) {
+ console.error("鑾峰彇鏁版嵁澶辫触:", error);
+ this.$message.error("鏁版嵁鍔犺浇澶辫触");
+ this.donatebaseinfoList = [];
+ this.total = 0;
+ // this.updateStats([]);
+ } finally {
this.loading = false;
- }, 500);
+ }
+ },
+
+ /** 搴旂敤鍓嶇绛涢�� */
+ applyFrontendFilter(data) {
+ let filteredData = data;
+
+ if (this.queryParams.name) {
+ filteredData = filteredData.filter(
+ item => item.name && item.name.includes(this.queryParams.name)
+ );
+ }
+
+ if (this.queryParams.idcardno) {
+ filteredData = filteredData.filter(
+ item =>
+ item.idcardno && item.idcardno.includes(this.queryParams.idcardno)
+ );
+ }
+
+ if (this.queryParams.recordstate) {
+ filteredData = filteredData.filter(
+ item => item.recordstate === this.queryParams.recordstate
+ );
+ }
+
+ return filteredData;
},
/** 鏇存柊缁熻鏁版嵁 */
updateStats(data) {
this.stats.totalCount = data.length;
this.stats.pendingCount = data.filter(
- item => item.recordstate === "0"
+ item => item.recordstate === "0" || item.recordstate === 0
).length;
this.stats.approvedCount = data.filter(
- item => item.recordstate === "1"
+ item => item.recordstate === "1" || item.recordstate === 1
).length;
this.stats.terminatedCount = data.filter(
- item => item.recordstate === "99"
+ item => item.recordstate === "99" || item.recordstate === 99
).length;
},
/** 鑾峰彇鐘舵�佹爣绛炬牱寮� */
getStatusTag(status) {
const statusMap = {
- "0": "warning", // 寰呭鏍�
- "1": "success", // 宸插鏍�
+ "0": "warning", // 缁存姢涓�
+ "1": "success", // 宸插畬鎴�
"99": "danger" // 宸茬粓姝�
};
return statusMap[status] || "info";
@@ -541,7 +529,11 @@
/** 鏃堕棿鏍煎紡鍖� */
parseTime(time, format) {
if (!time) return "-";
+
+ // 澶勭悊鏃堕棿鎴冲拰鏃ユ湡瀛楃涓�
const date = new Date(time);
+ if (isNaN(date.getTime())) return time;
+
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, "0");
const day = date
@@ -563,13 +555,8 @@
/** 閲嶇疆鎸夐挳鎿嶄綔 */
resetQuery() {
- this.queryParams = {
- pageNum: 1,
- pageSize: 10,
- name: undefined,
- idcardno: undefined,
- recordstate: undefined
- };
+ this.$refs.queryForm.resetFields();
+ this.queryParams.pageNum = 1;
this.getList();
},
@@ -579,29 +566,28 @@
this.detailVisible = true;
},
- /** 瀹℃牳鎿嶄綔 */
- handleApprove(row) {
+ /** 缁堟鎿嶄綔 */
+ handleTerminate(row) {
this.currentRecord = { ...row };
- this.approveForm = {
- approveResult: "1",
- approveOpinion: ""
- };
- this.approveVisible = true;
+ this.terminateVisible = true;
},
- /** 鎻愪氦瀹℃牳 */
- submitApprove() {
- // 妯℃嫙瀹℃牳鎻愪氦
- const index = this.donatebaseinfoList.findIndex(
- item => item.id === this.currentRecord.id
- );
- if (index !== -1) {
- this.donatebaseinfoList[
- index
- ].recordstate = this.approveForm.approveResult;
- this.$message.success("瀹℃牳鎴愬姛");
- this.approveVisible = false;
- this.getList(); // 閲嶆柊鍔犺浇鏇存柊缁熻
+ /** 鎻愪氦缁堟 */
+ async submitTerminate() {
+ try {
+ // 璋冪敤缁堟鎺ュ彛
+ await terminateDonor({
+ id: this.currentRecord.id,
+ caseNo: this.currentRecord.caseNo,
+ terminationReason: "绠$悊鍛樻墜鍔ㄧ粓姝�"
+ });
+
+ this.$message.success("缁堟鎴愬姛");
+ this.terminateVisible = false;
+ this.getList(); // 閲嶆柊鍔犺浇鏇存柊鏁版嵁
+ } catch (error) {
+ this.$message.error("缁堟澶辫触");
+ console.error("缁堟閿欒:", error);
}
}
}
@@ -678,4 +664,9 @@
background-color: #f5f7fa;
font-weight: bold;
}
+
+/* 鎿嶄綔鎸夐挳鏍峰紡 */
+::v-deep .el-button--text {
+ padding: 4px 8px;
+}
</style>
--
Gitblit v1.9.3