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