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/views/business/assess/assessInfo.vue |  789 +++++++++++++++++++++++++++++--------------------------
 1 files changed, 418 insertions(+), 371 deletions(-)

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>

--
Gitblit v1.9.3