From c441e5f3cb734b5db5e893536f267b13814796f5 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期三, 11 三月 2026 10:12:06 +0800
Subject: [PATCH] 青岛推送

---
 src/views/business/assess/assessInfo.vue | 1750 ++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 1,464 insertions(+), 286 deletions(-)

diff --git a/src/views/business/assess/assessInfo.vue b/src/views/business/assess/assessInfo.vue
index 0b50446..36cdba3 100644
--- a/src/views/business/assess/assessInfo.vue
+++ b/src/views/business/assess/assessInfo.vue
@@ -17,44 +17,38 @@
           assessmentData.caseNo
         }}</el-descriptions-item>
         <el-descriptions-item label="娼滃湪鎹愮尞鑰呭鍚�">{{
-          assessmentData.donorName
+          assessmentData.name || assessmentData.donorName
         }}</el-descriptions-item>
         <el-descriptions-item label="鎬у埆">
-          <dict-tag :options="genderOptions" :value="assessmentData.gender" />
+          <dict-tag
+            :options="dict.type.sys_user_sex"
+            :value="assessmentData.sex"
+          />
         </el-descriptions-item>
         <el-descriptions-item label="骞撮緞"
           >{{ assessmentData.age }}宀�</el-descriptions-item
         >
         <el-descriptions-item label="琛�鍨�">
-          <dict-tag
-            :options="bloodTypeOptions"
-            :value="assessmentData.bloodType"
-          />
+          {{ assessmentData.bloodtype }}
         </el-descriptions-item>
         <el-descriptions-item label="璇佷欢鍙风爜">{{
-          assessmentData.idCardNo
+          assessmentData.idcardno
         }}</el-descriptions-item>
         <el-descriptions-item label="鐤剧梾璇婃柇">{{
-          assessmentData.diagnosis
+          assessmentData.diagnosisname
         }}</el-descriptions-item>
         <el-descriptions-item label="鎵�鍦ㄥ尰鐤楁満鏋�">{{
-          assessmentData.hospitalName
+          assessmentData.treatmenthospitalname
         }}</el-descriptions-item>
-        <el-descriptions-item label="涓绘不鍖荤敓">{{
-          assessmentData.doctorName
+        <el-descriptions-item label="鍗忚皟鍛�">{{
+          assessmentData.coordinatorName
         }}</el-descriptions-item>
-        <el-descriptions-item label="鐢宠璇勪及鏃堕棿">{{
-          assessmentData.applyTime
+        <el-descriptions-item label="璇勪及鏃堕棿">{{
+          assessmentData.assessTime
         }}</el-descriptions-item>
-        <el-descriptions-item label="璇勪及绫诲瀷">
-          <dict-tag
-            :options="assessmentTypeOptions"
-            :value="assessmentData.assessmentType"
-          />
-        </el-descriptions-item>
         <el-descriptions-item label="璇勪及鐘舵��">
-          <el-tag :type="statusFilter(assessmentData.assessmentStatus)">
-            {{ statusTextFilter(assessmentData.assessmentStatus) }}
+          <el-tag :type="statusFilter(assessmentData.assessState)">
+            {{ statusTextFilter(assessmentData.assessState) }}
           </el-tag>
         </el-descriptions-item>
       </el-descriptions>
@@ -69,6 +63,7 @@
           type="primary"
           size="mini"
           @click="handleCompleteAssessment"
+          :loading="saveLoading"
         >
           纭瀹屾垚璇勪及
         </el-button>
@@ -77,69 +72,303 @@
         </span>
       </div>
 
+      <!-- 鎹愮尞鍐冲畾琛ㄥ崟 -->
+      <el-form>
+        <el-form-item label-width="100px" label="鎹愮尞鍐冲畾">
+          <el-checkbox-group
+            v-model="organdecisionValues"
+            @change="handleOrganDecisionChange"
+            :disabled="!isEdit"
+          >
+            <el-checkbox
+              v-for="dict in dict.type.sys_Organ"
+              :key="dict.value"
+              :label="dict.value"
+              >{{ dict.label }}
+            </el-checkbox>
+          </el-checkbox-group>
+          <el-input
+            v-if="showOtherInput"
+            v-model="organdecisionOther"
+            placeholder="璇疯緭鍏ュ叾浠栨崘鐚喅瀹氱殑鍏蜂綋鍐呭"
+            style="margin-top: 10px; width: 300px;"
+            :readonly="!isEdit"
+            @input="handleOtherDecisionInput"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+
+      <!-- 鍣ㄥ畼璇勪及琛ㄦ牸 -->
       <el-table
-        :data="organAssessmentList"
+        :data="filteredOrganAssessmentList"
         v-loading="assessmentLoading"
         style="width: 100%"
         :row-class-name="getRowClassName"
+        :expand-row-keys="expandedRowKeys"
+        @expand-change="handleExpandChange"
+        row-key="organno"
+        empty-text="褰撳墠鎹愮尞鍐冲畾涓嬫殏鏃犻渶瑕佽瘎浼扮殑鍣ㄥ畼"
       >
+        <el-table-column type="expand">
+          <template slot-scope="scope">
+            <div class="organ-expand-content" v-if="scope.row.expanded">
+              <el-tabs
+                v-model="scope.row.activeTab"
+                type="card"
+                class="organ-detail-tabs"
+                @tab-click="handleTabClick(scope.row, $event)"
+              >
+                <!-- 鍔ㄦ�佺敓鎴愯瘎浼癟ab -->
+                <el-tab-pane
+                  v-for="(assessment, index) in getOrganAssessments(scope.row)"
+                  :key="`${scope.row.organno}_${index}`"
+                  :label="`绗�${index + 1}娆¤瘎浼癭"
+                  :name="index"
+                >
+                  <organ-assessment-form
+                    :organ-data="scope.row"
+                    :assessment-index="index"
+                    :readonly="!canAssessOrgan(scope.row)"
+                    :current-user="currentUser"
+                    @update-assessment="handleUpdateAssessment"
+                    @delete-assessment="handleDeleteAssessment"
+                    @save-assessment="handleSaveAssessment"
+                  />
+                </el-tab-pane>
+
+                <!-- 娣诲姞璇勪及鎸夐挳 -->
+                <el-tab-pane
+                  name="add"
+                  v-if="canAssessOrgan(scope.row) && isEdit"
+                >
+                  <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="鍣ㄥ畼绫诲瀷">
+        <span class="summary-item">{{ getOrganLabel(scope.row.organno) }}</span>
+      </el-descriptions-item>
+      <el-descriptions-item label="鑾峰彇鏈烘瀯">
+        <span class="summary-item">{{ scope.row.gainhospitalname }}</span>
+      </el-descriptions-item>
+      <el-descriptions-item label="璇勪及娆℃暟" :span="2">
+        <el-tag type="info" size="medium">
+          {{ getAssessmentCount(scope.row) }}娆�
+        </el-tag>
+      </el-descriptions-item>
+      <el-descriptions-item label="鏈�鏂拌瘎浼版椂闂�" :span="2">
+        <span class="highlight-text">{{ getLatestAssessmentTime(scope.row) || "-" }}</span>
+      </el-descriptions-item>
+    </el-descriptions>
+
+    <!-- 璇勪及璇︽儏姹囨�� -->
+    <el-card header="璇勪及璇︽儏鍒楄〃" style="margin-top: 20px;" class="assessment-detail-card">
+      <div v-if="getOrganAssessments(scope.row).length === 0" class="no-assessment">
+        <el-empty description="鏆傛棤璇勪及璁板綍"></el-empty>
+      </div>
+
+      <div v-else>
+        <!-- 姣忔璇勪及璇︽儏 -->
+        <div v-for="(assessment, index) in getOrganAssessments(scope.row)"
+             :key="index"
+             class="assessment-item">
+          <el-card shadow="hover" class="assessment-card">
+            <div slot="header" class="clearfix">
+              <span class="assessment-title">绗瑊{ index + 1 }}娆¤瘎浼�</span>
+              <el-tag
+                :type="getAssessmentTagType(assessment.status)"
+                size="small"
+                class="status-tag"
+              >
+                {{ getAssessmentStatusText(assessment.status) }}
+              </el-tag>
+            </div>
+
+            <el-descriptions :column="2" border class="detail-descriptions">
+              <el-descriptions-item label="璇勪及鏃堕棿" :span="2">
+                <span class="time-text">{{ assessment.assessmentTime || "-" }}</span>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="璇勪及浜�">
+                <el-tag type="info" size="small">
+                  {{ assessment.assessor || "鏈~鍐�" }}
+                </el-tag>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="鍔熻兘鐘舵��">
+                <el-tag
+                  :type="getFunctionStatusTagType(assessment.functionStatus)"
+                  size="small"
+                >
+                  {{ getFunctionStatusText(assessment.functionStatus) }}
+                </el-tag>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="璇勪及鎰忚" :span="2">
+                <div class="opinion-content">
+                  {{ assessment.assessmentOpinion || "鏆傛棤璇勪及鎰忚" }}
+                </div>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="闄勪欢鏁伴噺" :span="2" v-if="assessment.attachments && assessment.attachments.length > 0">
+                <el-tag type="success" size="small">
+                  {{ assessment.attachments.length }}涓�
+                </el-tag>
+                <el-button
+                  type="text"
+                  size="mini"
+                  @click="showAttachmentList(assessment.attachments, index + 1)"
+                  style="margin-left: 10px;"
+                >
+                  鏌ョ湅闄勪欢鍒楄〃
+                </el-button>
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-card>
+        </div>
+      </div>
+    </el-card>
+
+    <!-- 鍣ㄥ畼鍩烘湰淇℃伅鍗$墖 -->
+    <el-card header="鍣ㄥ畼淇℃伅" style="margin-top: 20px;" class="organ-info-card">
+      <el-descriptions :column="2" border>
+        <el-descriptions-item label="鑾峰彇鍓嶆椿妫�">
+          <el-tag
+            :type="
+              scope.row.isbiopsybefore === '1'
+                ? 'success'
+                : 'info'
+            "
+            size="small"
+          >
+            {{ scope.row.isbiopsybefore === "1" ? "鏄�" : "鍚�" }}
+          </el-tag>
+        </el-descriptions-item>
+        <el-descriptions-item label="鑾峰彇鍚庢椿妫�">
+          <el-tag
+            :type="
+              scope.row.isbiopsyafter === '1'
+                ? 'success'
+                : 'info'
+            "
+            size="small"
+          >
+            {{ scope.row.isbiopsyafter === "1" ? "鏄�" : "鍚�" }}
+          </el-tag>
+        </el-descriptions-item>
+        <el-descriptions-item label="杈圭紭鍣ㄥ畼">
+          <el-tag
+            :type="
+              scope.row.ismarginalorgan === '1'
+                ? 'warning'
+                : 'info'
+            "
+            size="small"
+          >
+            {{
+              scope.row.ismarginalorgan === "1" ? "鏄�" : "鍚�"
+            }}
+          </el-tag>
+        </el-descriptions-item>
+        <el-descriptions-item label="鐥呭師鑿岄槼鎬�">
+          <el-tag
+            :type="
+              scope.row.ispathogenpositive === '1'
+                ? 'danger'
+                : 'info'
+            "
+            size="small"
+          >
+            {{
+              scope.row.ispathogenpositive === "1" ? "鏄�" : "鍚�"
+            }}
+          </el-tag>
+        </el-descriptions-item>
+      </el-descriptions>
+    </el-card>
+  </div>
+</el-tab-pane>
+              </el-tabs>
+            </div>
+          </template>
+        </el-table-column>
+
+        <el-table-column label="鍣ㄥ畼绫诲瀷" align="center" prop="organname">
+          <template slot-scope="scope">
+            {{ getOrganLabel(scope.row.organno) }}
+          </template>
+        </el-table-column>
+
+        <el-table-column label="鍣ㄥ畼缂栧彿" align="center" prop="organnumber" />
+
         <el-table-column
-          label="鍣ㄥ畼绫诲瀷"
+          label="鑾峰彇鏈烘瀯"
           align="center"
-          prop="organType"
+          prop="gainhospitalname"
+          show-overflow-tooltip
+        />
+
+        <!-- 鍔ㄦ�佹樉绀鸿瘎浼扮姸鎬佸垪 -->
+        <el-table-column
+          v-for="index in getMaxAssessmentCount()"
+          :key="index"
+          :label="`绗�${index}娆¤瘎浼癭"
+          align="center"
           width="120"
         >
           <template slot-scope="scope">
-            <dict-tag
-              :options="organTypeOptions"
-              :value="scope.row.organType"
-            />
-          </template>
-        </el-table-column>
-        <el-table-column
-          label="璇勪及绉戝"
-          align="center"
-          prop="department"
-          width="120"
-        />
-        <el-table-column
-          label="璇勪及浜哄憳"
-          align="center"
-          prop="assessor"
-          width="100"
-        />
-        <el-table-column label="璇勪及鐘舵��" align="center" width="100">
-          <template slot-scope="scope">
             <el-tag
-              :type="scope.row.assessmentStatus === '1' ? 'success' : 'warning'"
+              v-if="getOrganAssessments(scope.row)[index - 1]"
+              :type="
+                getAssessmentTagType(
+                  getOrganAssessments(scope.row)[index - 1].status
+                )
+              "
               size="small"
             >
-              {{ scope.row.assessmentStatus === "1" ? "宸茶瘎浼�" : "寰呰瘎浼�" }}
+              {{
+                getAssessmentStatusText(
+                  getOrganAssessments(scope.row)[index - 1].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="
+                getOrganOverallStatus(scope.row) === 'completed'
+                  ? 'success'
+                  : getOrganOverallStatus(scope.row) === 'assessing'
+                  ? 'primary'
+                  : 'warning'
+              "
+              size="small"
+            >
+              {{ getOrganOverallStatusText(scope.row) }}
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="鍔熻兘鐘舵��" align="center" width="100">
-          <template slot-scope="scope">
-            <el-tag
-              :type="getFunctionStatusType(scope.row.functionStatus)"
-              size="small"
-            >
-              {{ getFunctionStatusText(scope.row.functionStatus) }}
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column
-          label="璇勪及鎰忚"
-          align="center"
-          prop="assessmentOpinion"
-          min-width="150"
-          show-overflow-tooltip
-        />
-        <el-table-column label="璇勪及鏃堕棿" align="center" width="120">
-          <template slot-scope="scope">
-            <span>{{ scope.row.assessmentTime || "-" }}</span>
-          </template>
-        </el-table-column>
+
         <el-table-column
           label="鎿嶄綔"
           align="center"
@@ -148,275 +377,990 @@
         >
           <template slot-scope="scope">
             <el-button
-              v-if="canAssessOrgan(scope.row)"
+              v-if="canAssessOrgan(scope.row) && isEdit"
               size="mini"
               type="text"
-              @click="handleOrganAssess(scope.row)"
-              >{{
-                scope.row.assessmentStatus === "1" ? "鏌ョ湅/淇敼" : "璇勪及"
-              }}</el-button
+              @click="handleToggleExpand(scope.row)"
             >
+              {{
+                expandedRowKeys.includes(scope.row.organno) ? "鏀惰捣" : "璇︽儏"
+              }}
+            </el-button>
+            <el-button
+              v-else-if="!isEdit"
+              size="mini"
+              type="text"
+              @click="handleToggleExpand(scope.row)"
+            >
+              {{
+                expandedRowKeys.includes(scope.row.organno) ? "鏀惰捣" : "鏌ョ湅"
+              }}
+            </el-button>
             <el-button v-else size="mini" type="text" disabled
               >鏃犳潈闄�</el-button
-            >
-            <el-button
-              v-if="isCoordinator"
-              size="mini"
-              type="text"
-              @click="handleViewOrganDetail(scope.row)"
-              >璇︽儏</el-button
             >
           </template>
         </el-table-column>
       </el-table>
-
-      <!-- 鍣ㄥ畼璇勪及璇︽儏 -->
-     <el-collapse v-model="activeOrgans" accordion class="organ-detail-collapse">
-        <el-collapse-item
-          v-for="organ in organAssessmentList"
-          :key="organ.organType"
-          :name="organ.organType"
-          :title="getOrganTitle(organ)"
-        >
-          <div class="organ-detail-header">
-            <span class="organ-name">{{ getOrganName(organ.organType) }}璇勪及璇︽儏</span>
-            <span class="attachment-count" v-if="organ.attachments && organ.attachments.length > 0">
-              闄勪欢鏁伴噺: {{ organ.attachments.length }}
-            </span>
-          </div>
-          <organ-assessment-form
-            :organ-data="organ"
-            :readonly="!canAssessOrgan(organ)"
-            @save="handleSaveOrganAssessment"
-          />
-        </el-collapse-item>
-      </el-collapse>
     </el-card>
 
-    <!-- 闄勪欢棰勮寮圭獥 -->
-    <attachment-preview
+    <!-- 鏁翠綋淇濆瓨鎸夐挳 -->
+    <div class="footer-actions" v-if="isEdit">
+      <el-button type="primary" @click="handleSaveAll" :loading="saveLoading"
+        >淇濆瓨璇勪及琛�</el-button
+      >
+      <el-button @click="handleCancel">鍙栨秷</el-button>
+    </div>
+
+    <!-- 鏂囦欢棰勮寮圭獥 -->
+    <FilePreviewDialog
       :visible="attachmentVisible"
-      :attachment-list="attachmentList"
+      :file="currentPreviewFile"
       @close="attachmentVisible = false"
     />
   </div>
 </template>
 
 <script>
-// import { getAssessment, updateOrganAssessment, completeAssessment } from "@/api/case/assessment";
 import {
-  getAssessment,
-  updateOrganAssessment,
-  completeAssessment
-} from "./mockAssessmentApi";
-
+  evaluateBaseInfolist,
+  assessedit,
+  assessAdd
+} from "@/api/businessApi/index";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
 import OrganAssessmentForm from "./components/OrganAssessmentForm.vue";
-import AttachmentPreview from "./components/AttachmentPreview.vue";
 
 export default {
   name: "AssessmentDetail",
-  components: { OrganAssessmentForm, AttachmentPreview },
+  components: { OrganAssessmentForm, FilePreviewDialog },
+  dicts: ["sys_user_sex", "sys_Organ", "sys_0_1"],
   data() {
     return {
-      // 璇勪及ID
-      assessmentId: undefined,
-      // 璇勪及鏁版嵁
-      assessmentData: {},
-      // 鍣ㄥ畼璇勪及鍒楄〃
-      organAssessmentList: [],
-      // 闄勪欢鍒楄〃
-      attachmentList: [],
+      // 鏄惁缂栬緫妯″紡
+      isEdit: false,
       // 鍔犺浇鐘舵��
       assessmentLoading: false,
-      // 褰撳墠鐢ㄦ埛淇℃伅
+      saveLoading: false,
+      // 鏁版嵁ID
+      infoid: undefined,
+      assessmentId: undefined,
+      // 涓昏鏁版嵁
+      assessmentData: {},
+      organAssessmentList: [], // 鎵�鏈夊櫒瀹樻暟鎹�
+      // 灞曞紑琛岀浉鍏�
+      expandedRowKeys: [],
+      // 闄勪欢鐩稿叧
+      currentPreviewFile: null,
+      attachmentVisible: false,
+      // 鎹愮尞鍐冲畾鐩稿叧
+      organdecisionValues: [], // 瀛樺偍瀛楀吀value
+      organdecisionOther: "",
+      // 璁板綍鎹愮尞鍐冲畾鍙樺寲鍓嶇殑鍊�
+      prevOrgandecisionValues: [],
+      // 鍣ㄥ畼绫诲瀷鏄犲皠鍏崇郴
+      organDecisionMapping: {
+        C38: ["C38"], // 蹇冭剰 -> 蹇冭剰
+        C22: ["C22"], // 鍏ㄨ倽 -> 鍏ㄨ倽
+        C22L: ["C22L"], // 宸﹀崐鑲� -> 宸﹀崐鑲�
+        C22L0: ["C22L0"], // 宸﹀鍙� -> 宸﹀鍙�
+        C22R: ["C22R"], // 鍙冲崐鑲� -> 鍙冲崐鑲�
+        C22R0: ["C22R0"], // 鍙充笁鍙� -> 鍙充笁鍙�
+        C64: ["C64L", "C64R"], // 鍙岃偩 -> 宸﹁偩, 鍙宠偩
+        C64L: ["C64L"], // 宸﹁偩 -> 宸﹁偩
+        C64R: ["C64R"], // 鍙宠偩 -> 鍙宠偩
+        C34: ["C34L", "C34R"], // 鍏ㄨ偤 -> 宸﹁偤, 鍙宠偤
+        C34L: ["C34L"], // 宸﹁偤 -> 宸﹁偤
+        C34R: ["C34R"], // 鍙宠偤 -> 鍙宠偤
+        C17: ["C17"], // 灏忚偁 -> 灏忚偁
+        C25: ["C25"], // 鑳拌吅 -> 鑳拌吅
+        C00: [], // 閬椾綋 -> 涓嶆槧灏勫叿浣撳櫒瀹橈紙閬椾綋鏄暣浣擄級
+        C69L: ["C69L"], // 宸︾溂瑙掕啘 -> 宸︾溂瑙掕啘
+        C69R: ["C69R"], // 鍙崇溂瑙掕啘 -> 鍙崇溂瑙掕啘
+        C01: [] // 鍏朵粬 -> 涓嶆槧灏勫叿浣撳櫒瀹�
+      },
+      // 鐢ㄦ埛淇℃伅
       currentUser: {
         id: "001",
         name: "寮犲尰鐢�",
-        department: "蹇冭剰澶栫",
-        role: "department" // coordinator: 鍗忚皟鍛�, department: 绉戝浜哄憳
+        department: "蹇冭剰绉�",
+        role: "coordinator"
       },
-      // 灞曞紑鐨勫櫒瀹�
-      activeOrgans: [],
-      // 闄勪欢棰勮鍙鎬�
-      attachmentVisible: false,
-      // 瀛楀吀閫夐」
-      genderOptions: [
-        { value: "0", label: "鐢�" },
-        { value: "1", label: "濂�" }
-      ],
-      bloodTypeOptions: [
-        { value: "A", label: "A鍨�" },
-        { value: "B", label: "B鍨�" },
-        { value: "O", label: "O鍨�" },
-        { value: "AB", label: "AB鍨�" }
-      ],
-      assessmentTypeOptions: [
-        { value: "1", label: "鍒濇璇勪及" },
-        { value: "2", label: "鏈�缁堣瘎浼�" }
-      ],
-      organTypeOptions: [
-        { value: "heart", label: "蹇冭剰" },
-        { value: "liver", label: "鑲濊剰" },
-        { value: "kidney", label: "鑲捐剰" },
-        { value: "lung", label: "鑲鸿剰" },
-        { value: "pancreas", label: "鑳拌吅" },
-        { value: "intestine", label: "鑲犻亾" },
-        { value: "cornea", label: "瑙掕啘" },
-        { value: "skin", label: "鐨偆" }
-      ]
+      // 璁板綍琚垹闄ょ殑鍣ㄥ畼璇勪及
+      deletedOrganAssessments: [],
+      // 鐢ㄤ簬杩借釜tab婵�娲荤姸鎬�
+      activeTabMap: new Map(),
+      // 鍒锋柊key
+      refreshKey: 0
     };
   },
   computed: {
-    // 鏄惁鏄崗璋冨憳
     isCoordinator() {
       return this.currentUser.role === "coordinator";
     },
-    // 褰撳墠绉戝
     currentDepartment() {
       return this.currentUser.department;
     },
-    // 鎵�鏈夊櫒瀹樻槸鍚﹂兘宸茶瘎浼�
-    allOrgansAssessed() {
-      return this.organAssessmentList.every(
-        organ => organ.assessmentStatus === "1"
+    // 鏍规嵁鎹愮尞鍐冲畾杩囨护鍚庣殑鍣ㄥ畼鍒楄〃
+    filteredOrganAssessmentList() {
+      if (!this.organdecisionValues || this.organdecisionValues.length === 0) {
+        return [];
+      }
+
+      const selectedOrgans = new Set();
+      this.organdecisionValues.forEach(decision => {
+        const organs = this.organDecisionMapping[decision] || [];
+        organs.forEach(organ => selectedOrgans.add(organ));
+      });
+
+      return this.organAssessmentList.filter(
+        organ =>
+          selectedOrgans.has(organ.organno) &&
+          organ.delFlag !== "1" &&
+          !this.deletedOrganAssessments.includes(organ.organno)
       );
+    },
+    // 妫�鏌ユ墍鏈夎繃婊ゅ悗鐨勫櫒瀹樻槸鍚﹂兘宸茶瘎浼�
+    allOrgansAssessed() {
+      return this.filteredOrganAssessmentList.every(organ => {
+        const assessments = this.getOrganAssessments(organ);
+        return (
+          assessments &&
+          assessments.length > 0 &&
+          assessments.every(assessment => assessment.status === "assessed")
+        );
+      });
+    },
+    // 鑾峰彇鍣ㄥ畼瀛楀吀
+    organDict() {
+      return this.dict.type.sys_Organ || [];
+    },
+    // 鍒ゆ柇鏄惁闇�瑕佹樉绀哄叾浠栬緭鍏ユ
+    showOtherInput() {
+      return this.organdecisionValues.includes("C01");
+    }
+  },
+  watch: {
+    // 鐩戝惉鎹愮尞鍐冲畾鍙樺寲锛岀敤浜庡鏉傞�昏緫澶勭悊
+    organdecisionValues: {
+      handler(newVal, oldVal) {
+        this.handleComplexDecisionChange(newVal, oldVal);
+      },
+      deep: true
     }
   },
   created() {
+    this.infoid = this.$route.query.infoid;
     this.assessmentId = this.$route.query.id;
+    this.isEdit = this.$route.query.assess === "true";
     this.getAssessmentDetail();
-
   },
   methods: {
-    // 鑾峰彇璇勪及璇︽儏 - 浣跨敤Mock鏁版嵁
-    getAssessmentDetail() {
-      this.assessmentLoading = true;
-      getAssessment(this.assessmentId)
-        .then(response => {
-          if (response.code === 200) {
-            this.assessmentData = response.data.caseInfo;
-            this.organAssessmentList = response.data.organAssessments || [];
+    // 鏍规嵁瀛楀吀value鑾峰彇label
+    getOrganLabel(organValue) {
+      const dictItem = this.organDict.find(item => item.value === organValue);
+      return dictItem ? dictItem.label : organValue;
+    },
 
-            // 纭繚姣忎釜鍣ㄥ畼璇勪及鏁版嵁閮芥湁attachments鏁扮粍
-            this.organAssessmentList.forEach(organ => {
-              if (!organ.attachments) {
-                organ.attachments = [];
-              }
-            });
+    // Tab鐐瑰嚮浜嬩欢
+    handleTabClick(organ, tab) {
+      if (tab.name !== "add") {
+        this.activeTabMap.set(organ.organno, tab.name);
+      }
+    },
+// 鑾峰彇鍔熻兘鐘舵�佹爣绛剧被鍨�
+  getFunctionStatusTagType(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": "鏃犳硶璇勪及"
+    };
+    return textMap[status] || "鏈瘎浼�";
+  },
+
+  // 鏄剧ず闄勪欢鍒楄〃
+  showAttachmentList(attachments, assessmentNumber) {
+    if (!attachments || attachments.length === 0) {
+      this.$message.info(`绗�${assessmentNumber}娆¤瘎浼版殏鏃犻檮浠禶);
+      return;
+    }
+
+    this.$alert(
+      `<div>
+        <h4>绗�${assessmentNumber}娆¤瘎浼伴檮浠跺垪琛�</h4>
+        <ul style="list-style: none; padding-left: 0;">
+          ${attachments.map((item, index) => `
+            <li style="margin: 5px 0; padding: 5px; background: #f5f7fa; border-radius: 4px;">
+              <i class="el-icon-document"></i>
+              <span style="margin-left: 8px;">${item.fileName}</span>
+              <el-button
+                type="text"
+                size="mini"
+                onclick="window.open('${item.path || item.fileUrl}')"
+                style="margin-left: 10px;"
+              >
+                涓嬭浇
+              </el-button>
+            </li>
+          `).join('')}
+        </ul>
+      </div>`,
+      '闄勪欢鍒楄〃',
+      {
+        dangerouslyUseHTMLString: true,
+        showConfirmButton: false,
+        showCancelButton: true,
+        cancelButtonText: '鍏抽棴'
+      }
+    );
+  },
+    // 鑾峰彇鍣ㄥ畼鐨勮瘎浼板垪琛�
+    getOrganAssessments(organ) {
+      if (!organ.assesscontent) return [];
+      try {
+        const assessData =
+          typeof organ.assesscontent === "string"
+            ? JSON.parse(organ.assesscontent)
+            : organ.assesscontent;
+
+        if (Array.isArray(assessData)) {
+          return assessData.filter(item => item.delFlag !== "1");
+        }
+        return [];
+      } catch (error) {
+        console.warn("瑙f瀽璇勪及鍐呭澶辫触:", error);
+        return [];
+      }
+    },
+
+    // 鑾峰彇璇勪及鏁伴噺
+    getAssessmentCount(organ) {
+      return this.getOrganAssessments(organ).length;
+    },
+
+    // 澶勭悊璇勪及鏇存柊
+    handleUpdateAssessment(data) {
+      const { organData, assessmentData, assessmentIndex } = data;
+      const assessments = this.getOrganAssessments(organData);
+
+      if (assessments[assessmentIndex]) {
+        // 鍒涘缓鏂扮殑璇勪及鏁扮粍
+        const newAssessments = [...assessments];
+        newAssessments[assessmentIndex] = {
+          ...assessments[assessmentIndex],
+          ...assessmentData
+        };
+
+        // 鏇存柊 assesscontent
+        this.$set(organData, "assesscontent", JSON.stringify(newAssessments));
+        this.$forceUpdate();
+      }
+    },
+
+    // 鏁翠綋淇濆瓨鏂规硶
+    async handleSaveAll() {
+      this.saveLoading = true;
+      try {
+        const saveData = {
+          id: this.assessmentData.id || undefined,
+          infoid: this.infoid,
+          caseNo: this.assessmentData.caseNo,
+          donorno: this.assessmentData.donorno,
+          treatmenthospitalname: this.assessmentData.treatmenthospitalname,
+          treatmenthospitalno: this.assessmentData.treatmenthospitalno,
+          sex: this.assessmentData.sex,
+          age: this.assessmentData.age,
+          bloodtype: this.assessmentData.bloodtype,
+          idcardno: this.assessmentData.idcardno,
+          diagnosisname: this.assessmentData.diagnosisname,
+          coordinatorName: this.assessmentData.coordinatorName,
+          assessTime:
+            this.assessmentData.assessTime || new Date().toISOString(),
+          assessState: this.assessmentData.assessState,
+          assessannex: this.assessmentData.assessannex,
+          organdecision: this.organdecisionValues.join(","),
+          organdecisionOther: this.organdecisionOther,
+          serviceMedicalevaluationorganList: this.organAssessmentList.map(
+            organ => ({
+              id: organ.id,
+              infoid: organ.infoid,
+              donorno: organ.donorno,
+              organno: organ.organno,
+              organname: this.getOrganLabel(organ.organno),
+              organnumber: organ.organnumber,
+              gainhospitalno: organ.gainhospitalno,
+              gainhospitalname: organ.gainhospitalname,
+              isbiopsybefore: organ.isbiopsybefore,
+              isbiopsyafter: organ.isbiopsyafter,
+              ismarginalorgan: organ.ismarginalorgan,
+              ispathogenpositive: organ.ispathogenpositive,
+              ispnf: organ.ispnf,
+              isdgf: organ.isdgf,
+              delFlag: organ.delFlag || "0",
+              assesscontent: organ.assesscontent || "[]"
+            })
+          )
+        };
+
+        const saveMethod = this.assessmentData.id ? assessedit : assessAdd;
+        const response = await saveMethod(saveData);
+
+        if (response.code === 200) {
+          this.$message.success("璇勪及琛ㄤ繚瀛樻垚鍔燂紒");
+          if (!this.assessmentData.id && response.data && response.data.id) {
+            this.assessmentData.id = response.data.id;
           }
-          this.assessmentLoading = false;
-        })
-        .catch(error => {
-          console.error("鑾峰彇璇勪及璇︽儏澶辫触:", error);
-          this.assessmentLoading = false;
-        });
+          this.refreshKey += 1; // 瑙﹀彂閲嶆柊娓叉煋
+        } else {
+          this.$message.error("淇濆瓨澶辫触锛�" + (response.msg || "鏈煡閿欒"));
+        }
+      } catch (error) {
+        console.error("淇濆瓨璇勪及琛ㄥけ璐�:", error);
+        this.$message.error("淇濆瓨澶辫触锛岃閲嶈瘯");
+      } finally {
+        this.saveLoading = false;
+      }
     },
 
-    // 鏂板鏂规硶锛氳幏鍙栧櫒瀹樺悕绉�
-    getOrganName(organType) {
-      const organ = this.organTypeOptions.find(opt => opt.value === organType);
-      return organ ? organ.label : organType;
+    // 鍙栨秷鎸夐挳浜嬩欢
+    handleCancel() {
+      this.$router.go(-1);
     },
-    // 鐘舵�佽繃婊ゅ櫒
-    statusFilter(status) {
-      const statusMap = {
-        "0": "warning",
-        "1": "primary",
-        "2": "success",
-        "3": "danger"
+
+    // 鎹愮尞鍐冲畾鍙樻洿澶勭悊
+    async handleOrganDecisionChange(newDecision) {
+      const oldDecision = [...this.prevOrgandecisionValues];
+      this.autoHandleDecisionChange(newDecision);
+
+      const removedDecisions = oldDecision.filter(
+        item => !newDecision.includes(item)
+      );
+
+      for (const decision of removedDecisions) {
+        await this.handleRemovedDecision(decision);
+      }
+
+      this.prevOrgandecisionValues = [...newDecision];
+      this.$forceUpdate();
+
+      if (newDecision.length === 0) {
+        this.expandedRowKeys = [];
+      }
+    },
+
+    // 鍏朵粬鎹愮尞鍐冲畾杈撳叆澶勭悊
+    handleOtherDecisionInput(value) {
+      // 杈撳叆鏃朵笉鍋氬崟鐙繚瀛橈紝绛夊緟鏁翠綋淇濆瓨
+    },
+
+    // 鑷姩澶勭悊鍐冲畾鍙樻洿閫昏緫
+    autoHandleDecisionChange(newDecision) {
+      // 濡傛灉閫夋嫨浜�"鍙岃偩"(value: C64)锛岃嚜鍔ㄥ彇娑堝崟鐙殑"宸﹁偩"(value: C64L)鍜�"鍙宠偩"(value: C64R)閫夋嫨
+      if (newDecision.includes("C64")) {
+        this.organdecisionValues = newDecision.filter(
+          item => item !== "C64L" && item !== "C64R"
+        );
+      }
+      // 濡傛灉閫夋嫨浜�"宸﹁偩"鎴�"鍙宠偩"锛屽彇娑�"鍙岃偩"閫夋嫨
+      else if (newDecision.includes("C64L") || newDecision.includes("C64R")) {
+        this.organdecisionValues = newDecision.filter(item => item !== "C64");
+      }
+
+      // 濡傛灉閫夋嫨浜�"鍏ㄨ偤"(value: C34)锛岃嚜鍔ㄥ彇娑堝崟鐙殑"宸﹁偤"(value: C34L)鍜�"鍙宠偤"(value: C34R)閫夋嫨
+      if (newDecision.includes("C34")) {
+        this.organdecisionValues = newDecision.filter(
+          item => item !== "C34L" && item !== "C34R"
+        );
+      }
+      // 濡傛灉閫夋嫨浜�"宸﹁偤"鎴�"鍙宠偤"锛屽彇娑�"鍏ㄨ偤"閫夋嫨
+      else if (newDecision.includes("C34L") || newDecision.includes("C34R")) {
+        this.organdecisionValues = newDecision.filter(item => item !== "C34");
+      }
+
+      // 澶勭悊鍏朵粬浜掓枼閫昏緫
+      this.handleExclusiveDecisions();
+    },
+
+    // 澶勭悊浜掓枼鐨勬崘鐚喅瀹�
+    handleExclusiveDecisions() {
+      // 閬椾綋鎹愮尞(value: 10)涓庡叾浠栧櫒瀹樻崘鐚簰鏂ワ紙鏍规嵁涓氬姟闇�姹傝皟鏁达級
+      if (this.organdecisionValues.includes("10")) {
+        // 鍙互璁剧疆鍙繚鐣欓仐浣撴崘鐚紝鎴栬�呮牴鎹笟鍔¢渶姹傚鐞�
+      }
+    },
+
+    // 澶嶆潅鍐崇瓥鍙樺寲澶勭悊
+    handleComplexDecisionChange(newVal, oldVal) {
+      // 澶勭悊鏂板鐨勯�夋嫨
+      const addedDecisions = newVal.filter(item => !oldVal.includes(item));
+      const removedDecisions = oldVal.filter(item => !newVal.includes(item));
+
+      // 瀵规柊澧炲姞鐨勯�夋嫨杩涜鐗规畩澶勭悊
+      addedDecisions.forEach(decision => {
+        this.handleNewDecision(decision);
+      });
+
+      // 瀵圭Щ闄ょ殑閫夋嫨杩涜娓呯悊
+      removedDecisions.forEach(decision => {
+        this.handleRemovedDecision(decision);
+      });
+    },
+
+    // 澶勭悊鏂板鐨勬崘鐚喅瀹�
+    handleNewDecision(decision) {
+      // 鏍规嵁鏄犲皠鍏崇郴鑷姩鍒涘缓瀵瑰簲鐨勫櫒瀹樿瘎浼伴」
+      this.autoCreateOrganAssessments(decision);
+    },
+
+    // 鑷姩鍒涘缓鍣ㄥ畼璇勪及椤�
+    autoCreateOrganAssessments(decision) {
+      const organsToCreate = this.organDecisionMapping[decision];
+
+      if (organsToCreate && organsToCreate.length > 0) {
+        organsToCreate.forEach(organValue => {
+          this.ensureOrganExists(organValue);
+        });
+
+        // 鏄剧ず鍒涘缓鎻愮ず
+        if (organsToCreate.length > 0) {
+          this.$message.success(
+            `宸蹭负銆�${this.getOrganLabel(decision)}銆戝垱寤�${
+              organsToCreate.length
+            }涓瘎浼伴」`
+          );
+        }
+      } else {
+        console.warn(
+          `鎹愮尞鍐冲畾銆�${this.getOrganLabel(decision)}銆戞病鏈夐厤缃櫒瀹樻槧灏勫叧绯籤
+        );
+      }
+    },
+
+    // 澶勭悊绉婚櫎鐨勬崘鐚喅瀹�
+    async handleRemovedDecision(decision) {
+      const relatedOrgans = this.organDecisionMapping[decision] || [];
+
+      for (const organValue of relatedOrgans) {
+        const organIndex = this.organAssessmentList.findIndex(
+          organ => organ.organno === organValue && organ.delFlag !== "1"
+        );
+
+        if (organIndex !== -1) {
+          const organ = this.organAssessmentList[organIndex];
+          const organLabel = this.getOrganLabel(organValue);
+
+          try {
+            await this.$confirm(
+              `鎹愮尞鍐冲畾"${this.getOrganLabel(
+                decision
+              )}"宸插彇娑堬紝鏄惁鍒犻櫎瀵瑰簲鐨�${organLabel}璇勪及璁板綍锛焋,
+              "纭鍒犻櫎",
+              {
+                confirmButtonText: "纭畾",
+                cancelButtonText: "鍙栨秷",
+                type: "warning"
+              }
+            );
+
+            this.$set(this.organAssessmentList[organIndex], "delFlag", "1");
+            this.deletedOrganAssessments.push(organValue);
+
+            const keyIndex = this.expandedRowKeys.indexOf(organValue);
+            if (keyIndex > -1) {
+              this.expandedRowKeys.splice(keyIndex, 1);
+            }
+
+            this.$message.success(`${organLabel}璇勪及璁板綍宸叉爣璁板垹闄);
+          } catch (cancelError) {
+            if (!this.organdecisionValues.includes(decision)) {
+              this.organdecisionValues.push(decision);
+            }
+            this.$message.info(`宸插彇娑堝垹闄�${organLabel}璇勪及璁板綍`);
+          }
+        }
+      }
+    },
+
+    // 纭繚鍣ㄥ畼瀛樺湪
+    ensureOrganExists(organValue) {
+      const exists = this.organAssessmentList.some(
+        organ => organ.organno === organValue && organ.delFlag !== "1"
+      );
+
+      if (!exists) {
+        const newOrgan = {
+          id: null,
+          organno: organValue,
+          organname: this.getOrganLabel(organValue),
+          gainhospitalname: "寰呭垎閰嶆満鏋�",
+          isbiopsybefore: "0",
+          isbiopsyafter: "0",
+          ismarginalorgan: "0",
+          ispathogenpositive: "0",
+          assesscontent: JSON.stringify([this.getDefaultAssessment(0)]),
+          activeTab: 0,
+          expanded: false,
+          createTime: new Date().toISOString(),
+          delFlag: "0"
+        };
+
+        this.organAssessmentList = [...this.organAssessmentList, newOrgan];
+        return true;
+      }
+      return false;
+    },
+
+    // 鑾峰彇璇勪及璇︽儏
+    async getAssessmentDetail() {
+      this.assessmentLoading = true;
+      try {
+        const response = await evaluateBaseInfolist({ infoid: this.infoid });
+
+        if (response.code === 200) {
+          this.handleResponseData(response);
+        } else {
+          this.$message.error("鑾峰彇璇︽儏澶辫触锛�" + (response.msg || "鏈煡閿欒"));
+        }
+      } catch (error) {
+        console.error("鑾峰彇璇勪及璇︽儏澶辫触:", error);
+        this.$message.error("鑾峰彇璇︽儏澶辫触");
+      } finally {
+        this.assessmentLoading = false;
+      }
+    },
+
+    // 澶勭悊鎺ュ彛鍝嶅簲鏁版嵁
+    handleResponseData(response) {
+      let detailData = null;
+
+      if (response.data) {
+        if (Array.isArray(response.data)) {
+          detailData = response.data[0] || {};
+        } else if (response.data.rows && Array.isArray(response.data.rows)) {
+          detailData = response.data.rows[0] || {};
+        } else if (Array.isArray(response.data.list)) {
+          detailData = response.data.list[0] || {};
+        } else {
+          detailData = response.data;
+        }
+      } else {
+        detailData = response;
+      }
+
+      this.assessmentData = {
+        id: detailData.id || this.assessmentId,
+        infoid: detailData.infoid || this.infoid,
+        caseNo: detailData.caseNo || "",
+        name: detailData.name || detailData.donorName || "",
+        sex: detailData.sex || "",
+        age: detailData.age || "",
+        bloodtype: detailData.bloodtype || "",
+        idcardno: detailData.idcardno || "",
+        diagnosisname: detailData.diagnosisname || "",
+        treatmenthospitalname: detailData.treatmenthospitalname || "",
+        coordinatorName: detailData.coordinatorName || "",
+        assessTime: detailData.assessTime || "",
+        assessState: detailData.assessState || "1",
+        assessannex: detailData.assessannex || ""
       };
-      return statusMap[status] || "info";
+
+      if (detailData.organdecision) {
+        const decisionArray = Array.isArray(detailData.organdecision)
+          ? detailData.organdecision
+          : (detailData.organdecision || "").split(",").filter(item => item);
+
+        this.organdecisionValues = decisionArray;
+        this.prevOrgandecisionValues = [...decisionArray];
+        this.organdecisionOther = detailData.organdecisionOther || "";
+      }
+
+      this.processOrganAssessmentData(detailData);
     },
-    statusTextFilter(status) {
+
+    // 澶勭悊鍣ㄥ畼璇勪及鏁版嵁
+    processOrganAssessmentData(detailData) {
+      let organList = [];
+
+      if (detailData.serviceMedicalevaluationorganList) {
+        if (Array.isArray(detailData.serviceMedicalevaluationorganList)) {
+          organList = detailData.serviceMedicalevaluationorganList;
+        }
+      }
+
+      this.organAssessmentList = organList.map(organ => {
+        const organno = organ.organno;
+
+        // 濡傛灉 assesscontent 鏄瓧绗︿覆锛岀‘淇濆畠鏄湁鏁堢殑 JSON
+        if (organ.assesscontent && typeof organ.assesscontent === "string") {
+          try {
+            JSON.parse(organ.assesscontent);
+          } catch (error) {
+            console.warn(
+              "鏃犳晥鐨� assesscontent锛岄噸缃负绌烘暟缁�:",
+              organ.assesscontent
+            );
+            organ.assesscontent = "[]";
+          }
+        } else if (!organ.assesscontent) {
+          organ.assesscontent = "[]";
+        }
+
+        const assessments = this.getOrganAssessments(organ);
+        const activeTab = this.activeTabMap.has(organno)
+          ? this.activeTabMap.get(organno)
+          : assessments.length > 0
+          ? 0
+          : "summary";
+
+        return {
+          ...organ,
+          organname: this.getOrganLabel(organ.organno) || organ.organname,
+          activeTab: activeTab,
+          expanded: false,
+          delFlag: organ.delFlag || "0"
+        };
+      });
+    },
+
+    // 鑾峰彇榛樿璇勪及鏁版嵁缁撴瀯
+    getDefaultAssessment(index) {
+      return {
+        index: index,
+        status: "pending",
+        assessmentTime: "",
+        assessor: "",
+        functionStatus: "",
+        assessmentOpinion: "",
+        clinicalData: {},
+        labResults: {},
+        createTime: new Date().toISOString(),
+        delFlag: "0"
+      };
+    },
+
+    // 璁$畻鏈�澶ц瘎浼版鏁�
+    getMaxAssessmentCount() {
+      const maxCount = Math.max(
+        ...this.organAssessmentList
+          .filter(organ => organ.delFlag !== "1")
+          .map(organ => this.getAssessmentCount(organ))
+      );
+      return Math.max(maxCount, 1);
+    },
+
+    // 鑾峰彇鍣ㄥ畼鏁翠綋鐘舵��
+    getOrganOverallStatus(organ) {
+      const assessments = this.getOrganAssessments(organ);
+      if (assessments.length === 0) {
+        return "pending";
+      }
+
+      const validAssessments = assessments.filter(a => a.delFlag !== "1");
+      if (validAssessments.length === 0) {
+        return "pending";
+      }
+
+      const allAssessed = validAssessments.every(
+        assessment => assessment.status === "assessed"
+      );
+      const someAssessed = validAssessments.some(
+        assessment => assessment.status === "assessed"
+      );
+
+      if (allAssessed) return "completed";
+      if (someAssessed) return "assessing";
+      return "pending";
+    },
+
+    getOrganOverallStatusText(organ) {
+      const status = this.getOrganOverallStatus(organ);
       const statusMap = {
-        "0": "寰呰瘎浼�",
-        "1": "璇勪及涓�",
-        "2": "宸插畬鎴�",
-        "3": "宸插叧闂�"
+        pending: "寰呰瘎浼�",
+        assessing: "璇勪及涓�",
+        completed: "宸插畬鎴�"
       };
       return statusMap[status] || "鏈煡";
     },
-    // 鑾峰彇鍔熻兘鐘舵�佺被鍨�
-    getFunctionStatusType(status) {
+
+    // 鍒囨崲灞曞紑琛�
+    handleToggleExpand(row) {
+      const key = row.organno;
+      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.organno === key;
+        });
+      }
+    },
+
+    // 灞曞紑琛屽彉鍖�
+    handleExpandChange(row, expandedRows) {
+      this.expandedRowKeys = expandedRows.map(item => item.organno);
+      this.organAssessmentList.forEach(item => {
+        item.expanded = this.expandedRowKeys.includes(item.organno);
+      });
+    },
+
+    // 娣诲姞鏂拌瘎浼�
+    handleAddNewAssessment(organ) {
+      const assessments = this.getOrganAssessments(organ);
+      const newAssessment = {
+        ...this.getDefaultAssessment(assessments.length),
+        assessor: this.currentUser.name
+      };
+
+      const newAssessments = [...assessments, newAssessment];
+      this.$set(organ, "assesscontent", JSON.stringify(newAssessments));
+
+      organ.activeTab = assessments.length;
+      this.activeTabMap.set(organ.organno, assessments.length);
+
+      this.$message.success("宸叉坊鍔犳柊鐨勮瘎浼�");
+    },
+
+    // 澶勭悊鍒犻櫎璇勪及浜嬩欢
+    handleDeleteAssessment(data) {
+      const { organData, assessmentIndex } = data;
+      this.deleteOrganAssessment(organData, assessmentIndex);
+    },
+    // 澶勭悊璇勪及淇濆瓨
+    handleSaveAssessment(data) {
+      const { organData, assessmentData, assessmentIndex } = data;
+      const assessments = this.getOrganAssessments(organData);
+
+      console.log("淇濆瓨璇勪及鏁版嵁:", data);
+
+      if (assessments[assessmentIndex]) {
+        // 鍒涘缓鏂扮殑璇勪及鏁扮粍
+        const newAssessments = [...assessments];
+        newAssessments[assessmentIndex] = {
+          ...assessments[assessmentIndex],
+          ...assessmentData,
+          status: "assessed", // 鏍囪涓哄凡璇勪及
+          assessmentTime: new Date().toISOString(), // 璁剧疆璇勪及鏃堕棿
+          delFlag: "0" // 纭繚鍒犻櫎鏍囧織
+        };
+
+        // 鏇存柊 assesscontent
+        this.$set(organData, "assesscontent", JSON.stringify(newAssessments));
+
+        // 寮哄埗閲嶆柊娓叉煋
+        this.$forceUpdate();
+
+        this.$message.success("璇勪及淇濆瓨鎴愬姛");
+
+        // 妫�鏌ユ槸鍚﹂渶瑕佽嚜鍔ㄥ垏鎹㈠埌涓嬩竴涓瘎浼�
+        this.checkAndSwitchTab(organData, assessmentIndex);
+      }
+    },
+
+    // 妫�鏌ュ苟鑷姩鍒囨崲tab
+    checkAndSwitchTab(organData, currentIndex) {
+      const assessments = this.getOrganAssessments(organData);
+      if (currentIndex < assessments.length - 1) {
+        // 濡傛灉杩樻湁涓嬩竴涓瘎浼帮紝鑷姩鍒囨崲鍒颁笅涓�涓�
+        organData.activeTab = currentIndex + 1;
+        this.activeTabMap.set(organData.organno, currentIndex + 1);
+      } else {
+        // 濡傛灉娌℃湁涓嬩竴涓瘎浼帮紝鍒囨崲鍒版眹鎬婚〉
+        organData.activeTab = "summary";
+        this.activeTabMap.set(organData.organno, "summary");
+      }
+    },
+
+    // 鍒犻櫎鍣ㄥ畼璇勪及
+    async deleteOrganAssessment(organ, assessmentIndex) {
+      try {
+        await this.$confirm(
+          `纭鍒犻櫎绗�${assessmentIndex + 1}娆¤瘎浼拌褰曞悧锛焋,
+          "纭鍒犻櫎",
+          {
+            confirmButtonText: "纭畾",
+            cancelButtonText: "鍙栨秷",
+            type: "warning"
+          }
+        );
+
+        const assessments = this.getOrganAssessments(organ);
+        if (assessments[assessmentIndex]) {
+          // 鏍囪涓哄垹闄�
+          assessments[assessmentIndex].delFlag = "1";
+
+          // 杩囨护鎺夊凡鍒犻櫎鐨勮瘎浼�
+          const newAssessments = assessments.filter(
+            item => item.delFlag !== "1"
+          );
+
+          // 閲嶆柊璁$畻璇勪及绱㈠紩
+          newAssessments.forEach((assessment, index) => {
+            assessment.index = index;
+          });
+
+          // 鏇存柊 assesscontent
+          this.$set(organ, "assesscontent", JSON.stringify(newAssessments));
+
+          // 澶勭悊tab鍒囨崲
+          if (newAssessments.length === 0) {
+            organ.activeTab = "summary";
+            this.activeTabMap.set(organ.organno, "summary");
+          } else if (organ.activeTab === assessmentIndex) {
+            const newIndex = Math.max(0, assessmentIndex - 1);
+            organ.activeTab = newIndex;
+            this.activeTabMap.set(organ.organno, newIndex);
+          } else if (organ.activeTab === "summary") {
+            this.activeTabMap.set(organ.organno, "summary");
+          }
+
+          this.$message.success("璇勪及璁板綍宸插垹闄�");
+          this.$forceUpdate();
+        }
+      } catch (cancelError) {
+        this.$message.info("宸插彇娑堝垹闄�");
+      }
+    },
+
+    // 鑾峰彇鏈�鏂拌瘎浼版椂闂�
+    getLatestAssessmentTime(organ) {
+      const assessments = this.getOrganAssessments(organ);
+      if (assessments.length === 0) return null;
+
+      const assessed = assessments.filter(
+        a => a.assessmentTime && a.delFlag !== "1"
+      );
+      if (assessed.length === 0) return null;
+
+      return assessed.sort(
+        (a, b) => new Date(b.assessmentTime) - new Date(a.assessmentTime)
+      )[0].assessmentTime;
+    },
+
+    // 鑾峰彇璇勪及鐘舵�佹爣绛剧被鍨�
+    getAssessmentTagType(status) {
       const typeMap = {
-        "1": "success", // 姝e父
-        "2": "warning", // 杞诲害寮傚父
-        "3": "danger", // 閲嶅害寮傚父
-        "4": "info" // 鏃犳硶璇勪及
+        pending: "warning",
+        assessing: "primary",
+        assessed: "success"
       };
       return typeMap[status] || "info";
     },
-    // 鑾峰彇鍔熻兘鐘舵�佹枃鏈�
-    getFunctionStatusText(status) {
+
+    // 鑾峰彇璇勪及鐘舵�佹枃鏈�
+    getAssessmentStatusText(status) {
       const textMap = {
-        "1": "姝e父",
-        "2": "杞诲害寮傚父",
-        "3": "閲嶅害寮傚父",
-        "4": "鏃犳硶璇勪及"
+        pending: "寰呰瘎浼�",
+        assessing: "璇勪及涓�",
+        assessed: "宸茶瘎浼�"
       };
       return textMap[status] || "鏈煡";
     },
-    // 妫�鏌ユ槸鍚︽湁鏉冮檺璇勪及璇ュ櫒瀹�
+
+    // 妫�鏌ヨ瘎浼版潈闄�
     canAssessOrgan(organ) {
       if (this.isCoordinator) return true;
-      return organ.department === this.currentDepartment;
+      if (!this.isEdit) return false;
+      return (
+        organ.gainhospitalname &&
+        organ.gainhospitalname.includes(this.currentDepartment)
+      );
     },
+
     // 鑾峰彇琛岀被鍚�
     getRowClassName({ row }) {
       return this.canAssessOrgan(row) ? "assessable-row" : "non-assessable-row";
     },
-    // 淇敼鏂规硶锛氭洿鏂板櫒瀹樻爣棰樻樉绀�
-    getOrganTitle(organ) {
-      const organName = this.getOrganName(organ.organType);
-      const attachmentCount = organ.attachments ? organ.attachments.length : 0;
-      return `${organName}璇勪及璇︽儏锛�${organ.department}锛�${attachmentCount > 0 ? ` 路 ${attachmentCount}涓檮浠禶 : ''}`;
+
+    // 鐘舵�佽繃婊ゅ櫒
+    statusFilter(status) {
+      const statusMap = {
+        "1": "warning",
+        "2": "primary",
+        "3": "success"
+      };
+      return statusMap[status] || "info";
     },
-    // 鍣ㄥ畼璇勪及
-    handleOrganAssess(organ) {
-      this.activeOrgans = [organ.organType];
+
+    statusTextFilter(status) {
+      const statusMap = {
+        "1": "寰呰瘎浼�",
+        "2": "璇勪及涓�",
+        "3": "宸插畬鎴�"
+      };
+      return statusMap[status] || "鏈煡";
     },
-    // 鏌ョ湅鍣ㄥ畼璇︽儏
-    handleViewOrganDetail(organ) {
-      this.activeOrgans = [organ.organType];
-    },
-    // 淇濆瓨鍣ㄥ畼璇勪及 - 浣跨敤Mock API
-    handleSaveOrganAssessment(organData) {
-      updateOrganAssessment(organData)
-        .then(response => {
-          if (response.code === 200) {
-            this.$message.success("璇勪及淇濆瓨鎴愬姛");
-            // 鍒锋柊鏁版嵁
-            this.getAssessmentDetail();
-          }
-        })
-        .catch(error => {
-          console.error("淇濆瓨璇勪及澶辫触:", error);
-          this.$message.error("淇濆瓨澶辫触");
-        });
-    },
-    // 鏌ョ湅闄勪欢棰勮
+
+    // 鏌ョ湅闄勪欢
     handleAttachmentPreview() {
-      this.attachmentVisible = true;
+      if (this.assessmentData.assessannex) {
+        try {
+          const annexData =
+            typeof this.assessmentData.assessannex === "string"
+              ? JSON.parse(this.assessmentData.assessannex)
+              : this.assessmentData.assessannex;
+
+          if (Array.isArray(annexData) && annexData.length > 0) {
+            this.currentPreviewFile = annexData[0];
+            this.attachmentVisible = true;
+          } else {
+            this.$message.info("鏆傛棤闄勪欢鍙瑙�");
+          }
+        } catch (error) {
+          this.$message.info("闄勪欢鏁版嵁鏍煎紡閿欒");
+        }
+      } else {
+        this.$message.info("鏆傛棤闄勪欢");
+      }
     },
-    // 瀹屾垚璇勪及 - 浣跨敤Mock API
-    handleCompleteAssessment() {
-      this.$confirm("纭瀹屾垚鎵�鏈夊櫒瀹樿瘎浼板悧锛熷畬鎴愬悗灏嗘棤娉曚慨鏀�", "纭鎿嶄綔", {
-        confirmButtonText: "纭畾",
-        cancelButtonText: "鍙栨秷",
-        type: "warning"
-      }).then(() => {
-        completeAssessment(this.assessmentId)
-          .then(response => {
-            if (response.code === 200) {
-              this.$message.success("璇勪及瀹屾垚纭鎴愬姛");
-              this.getAssessmentDetail();
-            }
-          })
-          .catch(error => {
-            console.error("瀹屾垚璇勪及澶辫触:", error);
-            this.$message.error("鎿嶄綔澶辫触");
-          });
-      });
+
+    // 瀹屾垚璇勪及
+    async handleCompleteAssessment() {
+      try {
+        await this.$confirm(
+          "纭瀹屾垚鎵�鏈夊櫒瀹樿瘎浼板悧锛熷畬鎴愬悗灏嗘棤娉曚慨鏀�",
+          "纭鎿嶄綔",
+          {
+            confirmButtonText: "纭畾",
+            cancelButtonText: "鍙栨秷",
+            type: "warning"
+          }
+        );
+
+        const updateData = {
+          ...this.assessmentData,
+          assessState: "3",
+          assessTime: new Date().toISOString()
+        };
+
+        const response = await assessedit(updateData);
+
+        if (response.code === 200) {
+          this.$message.success("璇勪及瀹屾垚纭鎴愬姛");
+          this.assessmentData.assessState = "3";
+          this.isEdit = false;
+        } else {
+          this.$message.error("鎿嶄綔澶辫触锛�" + (response.msg || "鏈煡閿欒"));
+        }
+      } catch (error) {
+        if (error !== "cancel") {
+          console.error("瀹屾垚璇勪及澶辫触:", error);
+          this.$message.error("鎿嶄綔澶辫触");
+        }
+      }
     }
   }
 };
@@ -435,31 +1379,48 @@
   margin-bottom: 20px;
 }
 
-.organ-detail-collapse {
-  margin-top: 20px;
-}
-.organ-detail-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 15px;
-  padding-bottom: 10px;
-  border-bottom: 1px solid #ebeef5;
-}
-
-.organ-name {
-  font-size: 16px;
-  font-weight: bold;
-  color: #303133;
-}
-
-.attachment-count {
-  font-size: 14px;
-  color: #409EFF;
-  background-color: #ecf5ff;
-  padding: 4px 8px;
+/* 灞曞紑琛屾牱寮� */
+.organ-expand-content {
+  padding: 20px;
+  background: #fafafa;
   border-radius: 4px;
+  margin: 10px 0;
 }
+
+.organ-detail-tabs {
+  background: white;
+  border-radius: 4px;
+  padding: 20px;
+}
+
+.add-assessment-prompt {
+  text-align: center;
+  padding: 40px 0;
+}
+
+.assessment-summary {
+  padding: 10px;
+}
+
+/* 搴曢儴淇濆瓨鎸夐挳鏍峰紡 */
+.footer-actions {
+  margin-top: 20px;
+  text-align: center;
+  padding: 20px;
+  border-top: 1px solid #eaeaea;
+}
+
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 768px) {
+  .assessment-detail {
+    padding: 10px;
+  }
+
+  .organ-expand-content {
+    padding: 10px;
+  }
+}
+
 ::v-deep .assessable-row {
   background-color: #f0f9ff;
 }
@@ -468,6 +1429,24 @@
   background-color: #fafafa;
 }
 
+.jstitle {
+  float: right;
+  font-size: 18px !important;
+  font-weight: 600;
+  color: #2645f7;
+  font-size: 12px;
+}
+
+/* 琛ㄦ牸灞曞紑鍥炬爣鏍峰紡 */
+::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;
@@ -477,11 +1456,210 @@
 .fixed-width .el-button {
   margin: 0 2px;
 }
-.jstitle {
-  float: right;
-  font-size: 18px !important;
+/* 姹囨�婚〉闈㈡牱寮� */
+.assessment-summary {
+  padding: 10px;
+}
+
+.summary-item {
+  font-weight: 500;
+  color: #303133;
+}
+
+.highlight-text {
+  color: #409EFF;
+  font-weight: 500;
+}
+
+.assessment-detail-card {
+  border: 1px solid #e6ebf5;
+}
+
+.organ-info-card {
+  border: 1px solid #e6ebf5;
+  background-color: #fafafa;
+}
+
+.no-assessment {
+  text-align: center;
+  padding: 40px 0;
+  color: #909399;
+}
+
+.assessment-item {
+  margin-bottom: 20px;
+}
+
+.assessment-item:last-child {
+  margin-bottom: 0;
+}
+
+.assessment-card {
+  border: 1px solid #dcdfe6;
+  border-radius: 8px;
+  transition: all 0.3s;
+}
+
+.assessment-card:hover {
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  border-color: #409EFF;
+}
+
+.assessment-title {
+  font-size: 16px;
   font-weight: 600;
-  color: #2645f7;
+  color: #303133;
+}
+
+.status-tag {
+  float: right;
+  margin-right: 0;
+}
+
+.time-text {
+  color: #67C23A;
+  font-weight: 500;
+}
+
+.opinion-content {
+  padding: 8px 12px;
+  background: #f5f7fa;
+  border-radius: 4px;
+  line-height: 1.5;
+  color: #606266;
+  white-space: pre-wrap;
+  word-break: break-word;
+}
+
+.detail-descriptions {
+  background: #fff;
+}
+
+/* 浼樺寲琛ㄦ牸鏍峰紡 */
+::v-deep .el-table {
+  color: #303133;
+  font-size: 14px;
+}
+
+::v-deep .el-table th {
+  background-color: #f5f7fa;
+  color: #303133;
+  font-weight: 600;
+  padding: 12px 0;
+}
+
+::v-deep .el-table tr {
+  background-color: #fff;
+}
+
+::v-deep .el-table tr:hover {
+  background-color: #f5f7fa;
+}
+
+::v-deep .el-table .cell {
+  padding: 12px 10px;
+  line-height: 1.5;
+}
+
+::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td {
+  background-color: #fafafa;
+}
+
+::v-deep .el-table--enable-row-hover .el-table__body tr:hover>td {
+  background-color: #ecf5ff;
+}
+
+/* 鍙瘎浼拌鏍峰紡 */
+::v-deep .assessable-row {
+  background-color: #f0f9ff !important;
+}
+
+::v-deep .assessable-row:hover {
+  background-color: #d9ecff !important;
+}
+
+::v-deep .non-assessable-row {
+  background-color: #fafafa !important;
+}
+
+/* 鎻忚堪鍒楄〃鏍峰紡浼樺寲 */
+::v-deep .el-descriptions__label {
+  width: 120px;
+  background-color: #f5f7fa;
+  font-weight: 600;
+  color: #303133;
+}
+
+::v-deep .el-descriptions__content {
+  background-color: #fff;
+  color: #606266;
+}
+
+::v-deep .el-descriptions__body {
+  background-color: #fff;
+}
+
+/* 鍗$墖鏍峰紡浼樺寲 */
+::v-deep .el-card__header {
+  background-color: #f5f7fa;
+  border-bottom: 1px solid #e6ebf5;
+  padding: 12px 20px;
+  font-weight: 600;
+  color: #303133;
+}
+
+::v-deep .el-card__body {
+  padding: 20px;
+}
+
+/* 鏍囩鏍峰紡浼樺寲 */
+::v-deep .el-tag {
+  font-weight: 500;
+  border-radius: 12px;
+  padding: 0 10px;
+  height: 24px;
+  line-height: 22px;
+}
+
+/* 鎸夐挳鏍峰紡浼樺寲 */
+::v-deep .el-button--mini {
+  padding: 7px 12px;
   font-size: 12px;
+  border-radius: 4px;
+}
+
+/* Tab鏍峰紡浼樺寲 */
+::v-deep .el-tabs__item {
+  font-weight: 500;
+  color: #606266;
+}
+
+::v-deep .el-tabs__item.is-active {
+  color: #409EFF;
+  font-weight: 600;
+}
+
+::v-deep .el-tabs__nav-wrap::after {
+  background-color: #e4e7ed;
+}
+
+::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active {
+  background-color: #fff;
+  border-bottom-color: #fff;
+}
+
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 768px) {
+  .assessment-summary {
+    padding: 5px;
+  }
+
+  ::v-deep .el-table .cell {
+    padding: 8px 5px;
+  }
+
+  .assessment-card {
+    margin-bottom: 10px;
+  }
 }
 </style>

--
Gitblit v1.9.3