From e15d032770157952bab8d9b15177ac03d736851c Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期六, 09 五月 2026 17:34:53 +0800
Subject: [PATCH] 医疗信息

---
 src/views/business/ethicalReview/ethicalReviewInfo.vue | 1374 +++++++++++++++++++++++++++++++----------------------------
 1 files changed, 715 insertions(+), 659 deletions(-)

diff --git a/src/views/business/ethicalReview/ethicalReviewInfo.vue b/src/views/business/ethicalReview/ethicalReviewInfo.vue
index b9a7f8f..9e76ff2 100644
--- a/src/views/business/ethicalReview/ethicalReviewInfo.vue
+++ b/src/views/business/ethicalReview/ethicalReviewInfo.vue
@@ -1,7 +1,9 @@
 <template>
   <div class="ethics-review-detail">
+    <case-basic-info :case-id="caseId" :show-attachment="true" />
+
     <el-card class="detail-card">
-      <!-- 鍩虹淇℃伅 -->
+      <!-- 浼︾悊瀹℃煡鍩烘湰淇℃伅 -->
       <div slot="header" class="clearfix">
         <span class="detail-title">浼︾悊瀹℃煡鍩烘湰淇℃伅</span>
         <div style="float: right;">
@@ -12,7 +14,7 @@
           <el-button
             type="warning"
             @click="handleEndReview"
-            :disabled="form.ethicsConclusion === 'terminated'"
+            :disabled="form.status === '2'"
           >
             缁撴潫瀹℃煡
           </el-button>
@@ -22,58 +24,37 @@
       <el-form :model="form" ref="form" :rules="rules" label-width="120px">
         <el-row :gutter="20">
           <el-col :span="8">
-            <el-form-item label="浣忛櫌鍙�" prop="hospitalNo">
-              <el-input v-model="form.hospitalNo" readonly />
+            <el-form-item label="鍙戣捣涓婚" prop="initiateTheme">
+              <el-input
+                v-model="form.initiateTheme"
+                placeholder="璇疯緭鍏ュ彂璧蜂富棰�"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
-              <el-input v-model="form.donorName" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鎬у埆" prop="gender">
-              <el-select v-model="form.gender" style="width: 100%">
-                <el-option label="鐢�" value="0" />
-                <el-option label="濂�" value="1" />
-              </el-select>
+            <el-form-item label="鍙戣捣浜�" prop="initiatePerson">
+              <el-input v-model="form.initiatePerson" />
             </el-form-item>
           </el-col>
         </el-row>
 
         <el-row :gutter="20">
           <el-col :span="8">
-            <el-form-item label="骞撮緞" prop="age">
-              <el-input v-model="form.age" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="16">
-            <el-form-item label="鐤剧梾璇婃柇" prop="diagnosis">
-              <el-input v-model="form.diagnosis" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="浼︾悊缁撹" prop="ethicsConclusion">
-              <el-select v-model="form.ethicsConclusion" style="width: 100%">
-                <el-option label="瀹℃煡涓�" value="reviewing" />
-                <el-option label="鍚屾剰" value="approved" />
+            <el-form-item label="瀹℃煡鐘舵��" prop="status">
+              <el-select v-model="form.status" style="width: 100%">
                 <el-option
-                  label="淇敼鍚庡悓鎰�"
-                  value="approved_with_modifications"
+                  v-for="dict in dict.type.sys_ethical"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
                 />
-                <el-option label="淇敼鍚庨噸瀹�" value="re-review" />
-                <el-option label="涓嶅悓鎰�" value="disapproved" />
-                <el-option label="缁堟瀹℃煡" value="terminated" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="瀹℃煡鏃堕棿" prop="reviewTime">
+            <el-form-item label="鍙戣捣鏃堕棿" prop="startTime">
               <el-date-picker
-                v-model="form.reviewTime"
+                v-model="form.startTime"
                 type="datetime"
                 value-format="yyyy-MM-dd HH:mm:ss"
                 style="width: 100%"
@@ -81,107 +62,194 @@
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="鐧昏浜�" prop="registrant">
-              <el-input v-model="form.registrant" />
+            <el-form-item label="鎴鏃堕棿" prop="cutOffTime">
+              <el-date-picker
+                v-model="form.cutOffTime"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                style="width: 100%"
+              >
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <!-- 涓撳鐩稿叧淇℃伅 -->
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="涓撳濮撳悕" prop="expertName">
+              <el-input v-model="form.expertName" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="涓撳缂栧彿" prop="expertNo">
+              <el-input v-model="form.expertNo" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="涓撳绫诲瀷" prop="expertType">
+              <el-select v-model="form.expertType" style="width: 100%">
+                <el-option label="鏅�氫笓瀹�" value="normal" />
+                <el-option label="涓诲涓撳" value="chief" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="涓撳缁撹" prop="expertConclusion">
+              <el-select v-model="form.expertConclusion" style="width: 100%">
+                <el-option label="鍚屾剰" value="1" />
+                <el-option label="瀹℃煡涓�" value="2" />
+                <el-option label="涓嶅悓鎰�" value="0" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="涓撳缁撹鏃堕棿" prop="expertTime">
+              <el-date-picker
+                v-model="form.expertTime"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="涓撳鎺掗槦搴忓彿" prop="orderNo">
+              <el-input-number
+                v-model="form.orderNo"
+                :min="1"
+                :max="20"
+                style="width: 100%"
+              />
             </el-form-item>
           </el-col>
         </el-row>
 
         <el-row :gutter="20">
           <el-col :span="24">
-            <el-form-item label="浼︾悊鎰忚" prop="ethicsOpinion">
+            <el-form-item label="涓撳鎰忚" prop="expertOpinion">
               <el-input
                 type="textarea"
-                :rows="3"
-                v-model="form.ethicsOpinion"
-                placeholder="璇疯緭鍏ヤ鸡鐞嗗鏌ユ剰瑙�"
+                :rows="2"
+                v-model="form.expertOpinion"
+                placeholder="璇疯緭鍏ヤ笓瀹舵剰瑙�"
               />
             </el-form-item>
           </el-col>
         </el-row>
 
-        <el-form-item label="鐧昏鏃堕棿" prop="registrationTime">
-          <el-date-picker
-            v-model="form.registrationTime"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            style="width: 100%"
-          />
-        </el-form-item>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="澶囨敞" prop="remark">
+              <el-input
+                type="textarea"
+                :rows="3"
+                v-model="form.remark"
+                placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
     </el-card>
+
     <!-- 闄勪欢涓婁紶 -->
     <el-card class="attachment-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">鐩稿叧闄勪欢</span>
-        <el-button type="primary" size="mini" @click="handleUploadAttachment">
+        <!-- <el-button type="primary" size="mini" @click="openUploadDialog">
           涓婁紶闄勪欢
-        </el-button>
+        </el-button> -->
       </div>
 
-      <el-table :data="attachments" style="width: 100%">
-        <el-table-column label="鏂囦欢鍚嶇О" min-width="200">
-          <template slot-scope="scope">
-            <div class="file-info">
+      <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
+      <UploadAttachment
+        ref="uploadAttachment"
+        :file-list="attachmentFileList"
+        :limit="10"
+        accept=".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx"
+        @change="handleAttachmentChange"
+        @upload-success="handleUploadSuccess"
+        @upload-error="handleUploadError"
+        @remove="handleAttachmentRemove"
+      />
+
+      <!-- 闄勪欢鍒楄〃 -->
+      <div
+        class="attachment-list"
+        v-if="form.annexfilesList && form.annexfilesList.length > 0"
+      >
+        <div class="list-title">
+          宸蹭笂浼犻檮浠� ({{ form.annexfilesList.length }})
+        </div>
+        <el-table
+          :data="form.annexfilesList"
+          style="width: 100%"
+          size="small"
+        >
+          <el-table-column label="鏂囦欢鍚�" min-width="200">
+            <template slot-scope="scope">
               <i
                 class="el-icon-document"
                 style="margin-right: 8px; color: #409EFF;"
               ></i>
-              <span>{{ scope.row.fileName }}</span>
-            </div>
-          </template>
-        </el-table-column>
+              <span class="file-name">{{ scope.row.fileName }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏂囦欢绫诲瀷" width="100">
+            <template slot-scope="scope">
+              <el-tag size="small">{{
+                getFileType(scope.row.fileName)
+              }}</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="鍒涘缓鏃堕棿" width="160">
+            <template slot-scope="scope">
+              <span>{{ formatDateTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="鎿嶄綔" width="266">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="primary"
+                @click="handlePreview(scope.row)"
+              >
+                棰勮
+              </el-button>
+              <el-button
+                size="mini"
+                type="success"
+                @click="handleDownload(scope.row)"
+              >
+                涓嬭浇
+              </el-button>
+              <el-button
+                size="mini"
+                type="danger"
+                @click="handleRemoveAttachment(scope.$index)"
+              >
+                鍒犻櫎
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
 
-        <el-table-column label="鏂囦欢绫诲瀷" width="100" align="center">
-          <template slot-scope="scope">
-            <el-tag size="small">{{ getFileType(scope.row.fileName) }}</el-tag>
-          </template>
-        </el-table-column>
-
-        <el-table-column label="鏂囦欢澶у皬" width="100" align="center">
-          <template slot-scope="scope">
-            <span>{{ formatFileSize(scope.row.fileSize) }}</span>
-          </template>
-        </el-table-column>
-
-        <el-table-column label="涓婁紶鏃堕棿" width="160" align="center">
-          <template slot-scope="scope">
-            <span>{{ parseTime(scope.row.uploadTime) }}</span>
-          </template>
-        </el-table-column>
-
-        <el-table-column label="涓婁紶浜�" width="100" align="center">
-          <template slot-scope="scope">
-            <span>{{ scope.row.uploader }}</span>
-          </template>
-        </el-table-column>
-
-        <el-table-column label="鎿嶄綔" width="120" align="center">
-          <template slot-scope="scope">
-            <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-view"
-              @click="handlePreviewAttachment(scope.row)"
-              >棰勮</el-button
-            >
-            <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-download"
-              @click="handleDownloadAttachment(scope.row)"
-              >涓嬭浇</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
+      <!-- 绌虹姸鎬� -->
+      <div v-if="!form.annexfilesList || form.annexfilesList.length === 0" class="empty-attachment">
+        <i class="el-icon-folder-opened" style="font-size: 60px; color: #C0C4CC; margin-bottom: 20px;"></i>
+        <p style="color: #909399; font-size: 14px;">鏆傛棤闄勪欢锛岃涓婁紶鐩稿叧鏂囦欢</p>
+      </div>
     </el-card>
+
     <!-- 涓撳瀹℃煡鎯呭喌 -->
     <el-card class="expert-card">
       <div slot="header" class="clearfix">
-        <span class="detail-title"
-          >涓撳瀹℃煡鎯呭喌 (18浣嶄笓瀹� + 1浣嶄富濮斾笓瀹�)</span
-        >
+        <span class="detail-title">涓撳瀹℃煡鎯呭喌 (18浣嶄笓瀹� + 1浣嶄富濮斾笓瀹�)</span>
         <div style="float: right;">
           <el-button
             size="mini"
@@ -209,7 +277,8 @@
           </el-button>
         </div>
       </div>
- <!-- 涓撳缁熻淇℃伅 -->
+
+      <!-- 涓撳缁熻淇℃伅 -->
       <div
         class="expert-stats"
         style="margin-top: 20px; padding: 15px; background: #f5f7fa; border-radius: 4px;"
@@ -245,12 +314,13 @@
           </el-col>
         </el-row>
       </div>
+
       <!-- 涓撳瀹℃煡琛ㄦ牸 -->
       <el-table
         :data="expertReviews"
         v-loading="expertLoading"
         style="width: 100%"
-        heiht="300"
+        height="800"
         :row-class-name="getExpertRowClassName"
       >
         <el-table-column label="搴忓彿" width="60" align="center" type="index" />
@@ -320,12 +390,12 @@
         <el-table-column label="鍙戦�佹椂闂�" width="160" align="center">
           <template slot-scope="scope">
             <span>{{
-              scope.row.reviewTime ? parseTime(scope.row.reviewTime) : "鏈彂閫�"
+              scope.row.sendTime ? parseTime(scope.row.sendTime) : "鏈彂閫�"
             }}</span>
           </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"
@@ -357,8 +427,6 @@
           </template>
         </el-table-column>
       </el-table>
-
-
     </el-card>
 
     <!-- 鍙戦�佷笓瀹跺璇濇 -->
@@ -409,58 +477,131 @@
         >
       </div>
     </el-dialog>
+
+    <!-- 鏂囦欢棰勮寮圭獥 -->
+    <FilePreviewDialog
+      :visible="previewVisible"
+      :file="currentPreviewFile"
+      @close="previewVisible = false"
+      @download="handleDownload"
+    />
   </div>
 </template>
+
 <script>
+import { getToken } from "@/utils/auth";
 import {
-  getEthicsReviewDetail,
-  updateEthicsReview,
-  sendExpertReview,
-  endEthicsReview,
-  uploadAttachment,
-  deleteAttachment,
-  getAttachments
-} from "./ethicsReview";
+  reviewinitiateBaseInfoList,
+  ethicalreviewedit,
+  ethicalreviewadd,
+  ethicalreviewInfo
+} from "@/api/businessApi";
+import CaseBasicInfo from "@/components/CaseBasicInfo";
+import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
+import dayjs from "dayjs";
 
 export default {
   name: "EthicsReviewDetail",
+  components: { CaseBasicInfo, UploadAttachment, FilePreviewDialog },
+  dicts: ["sys_user_sex", "sys_ethical"],
+
   data() {
     return {
+      // 椤甸潰妯″紡
+      isEdit: false,
+      // 鍩烘湰淇℃伅
+      infoid: undefined,
+      id: undefined,
+      caseId: null,
+      caseNo: "",
+
       // 琛ㄥ崟鏁版嵁
       form: {
+        // 鍩虹淇℃伅
         id: undefined,
-        hospitalNo: "",
-        donorName: "",
-        gender: "",
-        age: "",
-        diagnosis: "",
-        ethicsConclusion: "reviewing",
-        ethicsOpinion: "",
-        reviewTime: "",
-        registrant: "",
-        registrationTime: new Date()
-          .toISOString()
-          .replace("T", " ")
-          .substring(0, 19)
+        infoid: undefined,
+        caseNo: "",
+        initiateTheme: "",
+        initiatePerson: "",
+
+        // 鐘舵�佸拰鏃堕棿
+        status: "0", // 0:鏂板缓, 1:瀹℃煡涓�, 2:缁撴潫
+        startTime: "",
+        cutOffTime: "",
+        endTime: "",
+
+        // 涓撳淇℃伅
+        expertName: "",
+        expertNo: "",
+        expertType: "normal",
+        expertConclusion: "",
+        expertOpinion: "",
+        expertTime: "",
+        orderNo: 1,
+
+        // 澶囨敞
+        remark: "",
+
+        // 闄勪欢淇℃伅
+        annexfilesList: [],
+        filePatch: "",
+
+        // 绯荤粺瀛楁
+        createBy: "",
+        createTime: "",
+        updateBy: "",
+        updateTime: "",
+        delFlag: "0"
       },
       // 琛ㄥ崟楠岃瘉瑙勫垯
       rules: {
-        donorName: [
-          { required: true, message: "鎹愮尞鑰呭鍚嶄笉鑳戒负绌�", trigger: "blur" }
+        initiateTheme: [
+          { required: true, message: "鍙戣捣涓婚涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 100,
+            message: "闀垮害鍦� 2 鍒� 100 涓瓧绗�",
+            trigger: "blur"
+          }
         ],
-        ethicsConclusion: [
-          { required: true, message: "浼︾悊缁撹涓嶈兘涓虹┖", trigger: "change" }
+        initiatePerson: [
+          { required: true, message: "鍙戣捣浜轰笉鑳戒负绌�", trigger: "blur" }
         ],
-        reviewTime: [
-          { required: true, message: "瀹℃煡鏃堕棿涓嶈兘涓虹┖", trigger: "change" }
+        status: [
+          { required: true, message: "瀹℃煡鐘舵�佷笉鑳戒负绌�", trigger: "change" }
+        ],
+        startTime: [
+          { required: true, message: "鍙戣捣鏃堕棿涓嶈兘涓虹┖", trigger: "change" }
+        ],
+        cutOffTime: [
+          { required: true, message: "鎴鏃堕棿涓嶈兘涓虹┖", trigger: "change" }
+        ],
+        expertName: [
+          { max: 50, message: "闀垮害涓嶈兘瓒呰繃 50 涓瓧绗�", trigger: "blur" }
+        ],
+        expertNo: [
+          { max: 50, message: "闀垮害涓嶈兘瓒呰繃 50 涓瓧绗�", trigger: "blur" }
+        ],
+        expertConclusion: [
+          { max: 2, message: "闀垮害涓嶈兘瓒呰繃 2 涓瓧绗�", trigger: "change" }
+        ],
+        remark: [
+          { max: 500, message: "闀垮害涓嶈兘瓒呰繃 500 涓瓧绗�", trigger: "blur" }
         ]
       },
       // 淇濆瓨鍔犺浇鐘舵��
       saveLoading: false,
 
-      // 闄勪欢鏁版嵁
-      attachments: [],
-     expertReviews: [
+      // 闄勪欢鐩稿叧
+      attachmentFileList: [],
+
+      // 棰勮鐩稿叧
+      previewVisible: false,
+      currentPreviewFile: null,
+
+      // 涓撳瀹℃煡鏁版嵁
+      expertReviews: [
         // 涓撳锛�18浣嶏級- 鍒濆鐘舵�佷负鐢宠涓�
         {
           id: 1,
@@ -469,7 +610,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 2,
@@ -478,7 +620,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 3,
@@ -487,7 +630,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 4,
@@ -496,7 +640,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 5,
@@ -505,7 +650,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 6,
@@ -514,7 +660,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 7,
@@ -523,7 +670,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 8,
@@ -532,7 +680,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 9,
@@ -541,7 +690,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 10,
@@ -550,7 +700,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 11,
@@ -559,7 +710,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 12,
@@ -568,7 +720,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 13,
@@ -577,7 +730,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 14,
@@ -586,7 +740,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 15,
@@ -595,7 +750,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 16,
@@ -604,7 +760,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 17,
@@ -613,7 +770,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         {
           id: 18,
@@ -622,7 +780,8 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         },
         // 涓诲涓撳锛�1浣嶏級
         {
@@ -632,11 +791,13 @@
           reviewStatus: "applying",
           expertConclusion: "",
           expertOpinion: "",
-          reviewTime: ""
+          reviewTime: "",
+          sendTime: ""
         }
       ],
       expertLoading: false,
       attachmentLoading: false,
+
       // 鍙戦�佸璇濇
       sendDialogVisible: false,
       sendForm: {
@@ -644,16 +805,28 @@
         expertIds: [],
         content: ""
       },
-      // 涓婁紶鐩稿叧
-      uploadDialogVisible: false,
-      uploadLoading: false,
-      tempFileList: [],
+
       // 鍙敤涓撳鍒楄〃
       availableExperts: [
-        { id: 1, name: "寮犳暀鎺�", type: "normal" },
-        { id: 2, name: "鏉庢暀鎺�", type: "normal" },
-        { id: 3, name: "鐜嬫暀鎺�", type: "normal" },
-        { id: 4, name: "璧典富濮�", type: "chief" }
+        { id: 1, name: "闄舵槉", type: "normal" },
+        { id: 2, name: "鍒樻枌", type: "normal" },
+        { id: 3, name: "浜庢捣鍒�", type: "normal" },
+        { id: 4, name: "鐜嬬孩姊�", type: "normal" },
+        { id: 5, name: "鐜嬫槬鍏�", type: "normal" },
+        { id: 6, name: "鐜嬮潤", type: "normal" },
+        { id: 7, name: "杈规枃瓒�", type: "normal" },
+        { id: 8, name: "闂織鍕�", type: "normal" },
+        { id: 9, name: "璁稿嚖", type: "normal" },
+        { id: 10, name: "璁镐紶灞�", type: "normal" },
+        { id: 11, name: "寮犵孩宀�", type: "normal" },
+        { id: 12, name: "鏉ㄨ嫃姘�", type: "normal" },
+        { id: 13, name: "瀹嬬帀寮�", type: "normal" },
+        { id: 14, name: "鍛ㄤ紶鍒�", type: "normal" },
+        { id: 15, name: "鑽嗗嚒娉�", type: "normal" },
+        { id: 16, name: "鐭枃鎹�", type: "normal" },
+        { id: 17, name: "钁i渿", type: "normal" },
+        { id: 18, name: "钄¢噾璐�", type: "normal" },
+        { id: 19, name: "瀛斿績娑�", type: "chief" }
       ]
     };
   },
@@ -724,112 +897,249 @@
           .length > 0
       );
     },
-    // 鏄惁鍙互鍙戦�佷笓瀹跺鏌�
-    canSendToExperts() {
-      return this.form.id && this.form.ethicsConclusion === "reviewing";
-    },
     // 褰撳墠鐢ㄦ埛淇℃伅
     currentUser() {
       return JSON.parse(sessionStorage.getItem("user") || "{}");
     }
   },
   created() {
-    const id = this.$route.query.id;
-    if (id) {
-      this.getDetail(id);
-      this.getAttachments(id);
-      // 涓嶅啀闇�瑕佷粠鎺ュ彛鑾峰彇涓撳鍒楄〃锛屼娇鐢ㄥ浐瀹氱殑expertReviews鏁版嵁
-    } else if (this.$route.path.includes("/add")) {
-      this.generateHospitalNo();
-      this.form.registrant = this.currentUser.username || "褰撳墠鐢ㄦ埛";
-    }
+    this.infoid = this.$route.query.infoid;
+    this.id = this.$route.query.id;
+    this.caseId = this.$route.query.infoid;
+    this.getDetail(this.infoid, this.id);
   },
   methods: {
-    // 鐢熸垚浣忛櫌鍙�
-    generateHospitalNo() {
-      const timestamp = Date.now().toString();
-      this.form.hospitalNo = "D" + timestamp.slice(-6);
+    // 鍒濆鍖栨柊澧炴暟鎹�
+    initNewData() {
+      this.form.infoid = this.infoid;
+      this.form.caseNo = this.$route.query.caseNo || "";
+      this.form.initiatePerson = this.currentUser.username || "褰撳墠鐢ㄦ埛";
+      this.form.startTime = new Date()
+        .toISOString()
+        .replace("T", " ")
+        .substring(0, 19);
+      this.form.createBy = this.currentUser.username || "admin";
     },
-    getExpertRowClassName({ row }) {
-      return row.isChief ? "chief-expert-row" : "normal-expert-row";
-    },
+
     // 鑾峰彇璇︽儏
-    getDetail(id) {
-      getEthicsReviewDetail(id)
-        .then(response => {
-          if (response.code === 200) {
+    async getDetail(infoid, id) {
+      try {
+        this.expertLoading = true;
+        let response = {};
+        if (id) {
+          response = await ethicalreviewInfo(id);
+        } else if (infoid) {
+          response = await reviewinitiateBaseInfoList({ infoid: infoid });
+        }
+
+        if (response.code === 200) {
+          let detailData = {};
+
+          if (response.data && id) {
             this.form = response.data;
+            // 瑙f瀽 filePatch 瀛楁
+            this.parseFilePatch(this.form.filePatch);
+            this.initAttachmentFileList();
+          } else if (response.data && infoid) {
+            this.form = response.data[0];
+            // 瑙f瀽 filePatch 瀛楁
+            this.parseFilePatch(this.form.filePatch);
+            this.initAttachmentFileList();
           }
-        })
-        .catch(error => {
-          console.error("鑾峰彇浼︾悊瀹℃煡璇︽儏澶辫触:", error);
-          this.$message.error("鑾峰彇璇︽儏澶辫触");
-        });
+          console.log(this.form, "this.form ");
+
+          this.infoid = detailData.infoid || this.infoid;
+          this.caseNo = detailData.caseNo || "";
+
+          this.$message.success("鏁版嵁鍔犺浇鎴愬姛");
+        } else {
+          this.$message.error("鑾峰彇璇︽儏澶辫触锛�" + (response.msg || "鏈煡閿欒"));
+        }
+      } catch (error) {
+        console.error("鑾峰彇浼︾悊瀹℃煡璇︽儏澶辫触:", error);
+        this.$message.error("鏁版嵁鍔犺浇澶辫触");
+      } finally {
+        this.expertLoading = false;
+      }
+    },
+
+    // 瑙f瀽 filePatch 瀛楁
+    parseFilePatch(filePatch) {
+      if (!filePatch) {
+        this.form.annexfilesList = [];
+        return;
+      }
+
+      try {
+        this.form.annexfilesList = JSON.parse(filePatch);
+      } catch (error) {
+        console.error("瑙f瀽 filePatch 瀛楁澶辫触:", error);
+        this.form.annexfilesList = [];
+      }
+    },
+
+    // 鍒濆鍖栭檮浠舵枃浠跺垪琛�
+    initAttachmentFileList() {
+      if (this.form.annexfilesList && this.form.annexfilesList.length > 0) {
+        this.attachmentFileList = this.form.annexfilesList.map(item => ({
+          uid: item.id || Math.random().toString(36).substr(2, 9),
+          name: item.fileName,
+          url: item.path || item.fileUrl,
+          status: "success"
+        }));
+      } else {
+        this.attachmentFileList = [];
+      }
+    },
+
+    // 鏋勫缓 filePatch 瀛楁
+    buildFilePatch() {
+      if (!this.form.annexfilesList || this.form.annexfilesList.length === 0) {
+        return "";
+      }
+      return JSON.stringify(this.form.annexfilesList);
+    },
+
+    // 闄勪欢鍙樺寲澶勭悊
+    handleAttachmentChange(fileList) {
+      this.attachmentFileList = fileList;
+    },
+
+    // 闄勪欢绉婚櫎澶勭悊
+    handleAttachmentRemove(file) {
+      if (file.url) {
+        const index = this.form.annexfilesList.findIndex(
+          item => item.path === file.url || item.fileUrl === file.url
+        );
+        if (index > -1) {
+          this.form.annexfilesList.splice(index, 1);
+        }
+      }
+    },
+
+    // 鎵嬪姩鍒犻櫎闄勪欢
+    handleRemoveAttachment(index) {
+      this.form.annexfilesList.splice(index, 1);
+      this.attachmentFileList.splice(index, 1);
+      this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+    },
+
+    // 涓婁紶鎴愬姛澶勭悊
+    handleUploadSuccess({ file, fileList, response }) {
+      if (response.code === 200) {
+        const attachmentObj = {
+          fileName: file.name,
+          path: response.data || file.url,
+          fileUrl: response.data || file.url,
+          type: this.getFileExtension(file.name),
+          createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+          infoid: this.infoid,
+          delFlag: 0
+        };
+
+        this.form.annexfilesList.push(attachmentObj);
+        this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+      }
+    },
+
+    // 涓婁紶閿欒澶勭悊
+    handleUploadError({ file, fileList, error }) {
+      console.error("闄勪欢涓婁紶澶辫触:", error);
+      this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+    },
+
+    // 鎵撳紑涓婁紶瀵硅瘽妗�
+    openUploadDialog() {
+      this.$refs.uploadAttachment.openUpload();
+    },
+
+    // 鏂囦欢棰勮
+    handlePreview(file) {
+      this.currentPreviewFile = {
+        fileName: file.fileName,
+        fileUrl: file.path || file.fileUrl,
+        fileType: this.getFileType(file.fileName)
+      };
+      this.previewVisible = true;
+    },
+
+    // 鏂囦欢涓嬭浇
+    handleDownload(file) {
+      const fileUrl = file.path || file.fileUrl;
+      const fileName = file.fileName;
+
+      if (fileUrl) {
+        const link = document.createElement("a");
+        link.href = fileUrl;
+        link.download = fileName;
+        link.style.display = "none";
+        document.body.appendChild(link);
+        link.click();
+        document.body.removeChild(link);
+        this.$message.success("寮�濮嬩笅杞芥枃浠�");
+      } else {
+        this.$message.warning("鏂囦欢璺緞涓嶅瓨鍦紝鏃犳硶涓嬭浇");
+      }
+    },
+
+    // 鑾峰彇鏂囦欢绫诲瀷
+    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";
+    },
+
+    // 鑾峰彇鏂囦欢鎵╁睍鍚�
+    getFileExtension(filename) {
+      return filename
+        .split(".")
+        .pop()
+        .toLowerCase();
+    },
+
+    // 鏃ユ湡鏃堕棿鏍煎紡鍖�
+    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");
+        const seconds = String(date.getSeconds()).padStart(2, "0");
+
+        return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+      } catch (error) {
+        return dateTime;
+      }
     },
 
     // 鑾峰彇涓撳瀹℃煡鍒楄〃
     getExpertReviews(ethicsReviewId) {
       this.expertLoading = true;
-      // 妯℃嫙鏁版嵁 - 瀹為檯椤圭洰涓粠鎺ュ彛鑾峰彇
       setTimeout(() => {
-        this.expertReviews = [
-          // 涓撳锛�18浣嶏級
-          {
-            id: 1,
-            expertName: "寮犳暀鎺�",
-            isChief: false,
-            reviewStatus: "submitted",
-            expertConclusion: "approved",
-            expertOpinion: "绗﹀悎浼︾悊瑕佹眰",
-            reviewTime: "2025-12-01 10:30:00"
-          },
-          {
-            id: 2,
-            expertName: "鏉庢暀鎺�",
-            isChief: false,
-            reviewStatus: "submitted",
-            expertConclusion: "approved",
-            expertOpinion: "鏂规璁捐鍚堢悊",
-            reviewTime: "2025-12-01 11:20:00"
-          },
-          {
-            id: 3,
-            expertName: "鐜嬫暀鎺�",
-            isChief: false,
-            reviewStatus: "applying",
-            expertConclusion: "",
-            expertOpinion: "",
-            reviewTime: ""
-          },
-          // 涓诲涓撳锛�1浣嶏級
-          {
-            id: 19,
-            expertName: "璧典富濮�",
-            isChief: true,
-            reviewStatus: "applying",
-            expertConclusion: "",
-            expertOpinion: "",
-            reviewTime: ""
-          }
-        ];
         this.expertLoading = false;
       }, 500);
     },
 
-    // 鑾峰彇闄勪欢鍒楄〃
-    getAttachments(ethicsReviewId) {
-      this.attachmentLoading = true;
-      getAttachments(ethicsReviewId)
-        .then(response => {
-          if (response.code === 200) {
-            this.attachments = response.data;
-          }
-          this.attachmentLoading = false;
-        })
-        .catch(error => {
-          console.error("鑾峰彇闄勪欢鍒楄〃澶辫触:", error);
-          this.attachmentLoading = false;
-        });
+    // 涓撳琛屾牱寮�
+    getExpertRowClassName({ row }) {
+      return row.isChief ? "chief-expert-row" : "normal-expert-row";
     },
 
     // 鐘舵�佽繃婊ゅ櫒
@@ -869,38 +1179,87 @@
     },
 
     // 淇濆瓨淇℃伅
-    handleSave() {
-      this.$refs.form.validate(valid => {
+    async handleSave() {
+      this.$refs.form.validate(async valid => {
         if (valid) {
           this.saveLoading = true;
-          const apiMethod = this.form.id ? updateEthicsReview : addEthicsReview;
+          try {
+            const submitData = {
+              ...this.form,
+              // 纭繚蹇呰瀛楁
+              infoid: this.infoid,
+              caseNo: this.caseNo,
+              // 鏋勫缓 filePatch 瀛楁
+              filePatch: this.buildFilePatch()
+            };
 
-          apiMethod(this.form)
-            .then(response => {
-              if (response.code === 200) {
-                this.$message.success("淇濆瓨鎴愬姛");
-                if (!this.form.id) {
-                  this.form.id = response.data.id;
-                  this.$router.replace({
-                    query: { ...this.$route.query, id: this.form.id }
-                  });
-                }
+            let response = null;
+
+            if (submitData.id) {
+              response = await ethicalreviewedit(submitData);
+            } else {
+              response = await ethicalreviewadd(submitData);
+            }
+
+            if (response.code === 200) {
+              this.$message.success("淇濆瓨鎴愬姛");
+              this.isEdit = false;
+              if (!this.form.id && response.data && response.data.id) {
+                this.form.id = response.data.id;
+                this.$router.replace({
+                  query: { ...this.$route.query, id: this.form.id }
+                });
               }
-            })
-            .catch(error => {
-              console.error("淇濆瓨澶辫触:", error);
-              this.$message.error("淇濆瓨澶辫触");
-            })
-            .finally(() => {
-              this.saveLoading = false;
-            });
+            } else {
+              this.$message.error("淇濆瓨澶辫触锛�" + (response.msg || "鏈煡閿欒"));
+            }
+          } catch (error) {
+            console.error("淇濆瓨澶辫触:", error);
+            this.$message.error("淇濆瓨澶辫触锛岃閲嶈瘯");
+          } finally {
+            this.saveLoading = false;
+          }
         }
       });
     },
 
-    // 鍙戦�佷笓瀹跺鏌�
-    handleSendToExperts() {
-      this.sendDialogVisible = true;
+    // 缁撴潫瀹℃煡
+    async handleEndReview() {
+      this.$confirm(
+        "纭畾瑕佺粨鏉熸湰娆′鸡鐞嗗鏌ュ悧锛熺粨鏉熷悗灏嗘棤娉曚慨鏀逛笓瀹跺鏌ョ粨鏋溿��",
+        "鎻愮ず",
+        {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }
+      )
+        .then(async () => {
+          try {
+            const updateData = {
+              ...this.form,
+              status: "2",
+              endTime: new Date()
+                .toISOString()
+                .replace("T", " ")
+                .substring(0, 19)
+            };
+
+            const response = await ethicalreviewedit(updateData);
+
+            if (response.code === 200) {
+              this.$message.success("瀹℃煡宸茬粨鏉�");
+              this.form.status = "2";
+              this.form.endTime = updateData.endTime;
+            } else {
+              this.$message.error("鎿嶄綔澶辫触锛�" + (response.msg || "鏈煡閿欒"));
+            }
+          } catch (error) {
+            console.error("缁撴潫瀹℃煡澶辫触:", error);
+            this.$message.error("缁撴潫瀹℃煡澶辫触");
+          }
+        })
+        .catch(() => {});
     },
 
     // 鍙戦�佺粰涓撳
@@ -949,54 +1308,27 @@
         return;
       }
 
-      sendExpertReview({
-        ethicsReviewId: this.form.id,
-        expertIds: this.sendForm.expertIds,
-        content: this.sendForm.content
-      })
-        .then(response => {
-          if (response.code === 200) {
-            this.$message.success("鍙戦�佹垚鍔�");
-            this.sendDialogVisible = false;
-            this.getExpertReviews(this.form.id);
-            this.sendForm = {
-              expertType: "normal",
-              expertIds: [],
-              content: ""
-            };
-          }
-        })
-        .catch(error => {
-          console.error("鍙戦�佸け璐�:", error);
-          this.$message.error("鍙戦�佸け璐�");
-        });
-    },
+      this.$message.success("鍙戦�佹垚鍔�");
+      this.sendDialogVisible = false;
 
-    // 缁撴潫瀹℃煡
-    handleEndReview() {
-      this.$confirm(
-        "纭畾瑕佺粨鏉熸湰娆′鸡鐞嗗鏌ュ悧锛熺粨鏉熷悗灏嗘棤娉曚慨鏀逛笓瀹跺鏌ョ粨鏋溿��",
-        "鎻愮ず",
-        {
-          confirmButtonText: "纭畾",
-          cancelButtonText: "鍙栨秷",
-          type: "warning"
+      this.sendForm.expertIds.forEach(expertId => {
+        const index = this.expertReviews.findIndex(
+          expert => expert.id === expertId
+        );
+        if (index !== -1) {
+          this.expertReviews[index].reviewStatus = "submitted";
+          this.expertReviews[index].sendTime = new Date()
+            .toISOString()
+            .replace("T", " ")
+            .substring(0, 19);
         }
-      )
-        .then(() => {
-          endEthicsReview(this.form.id)
-            .then(response => {
-              if (response.code === 200) {
-                this.$message.success("瀹℃煡宸茬粨鏉�");
-                this.form.ethicsConclusion = "terminated";
-              }
-            })
-            .catch(error => {
-              console.error("缁撴潫瀹℃煡澶辫触:", error);
-              this.$message.error("缁撴潫瀹℃煡澶辫触");
-            });
-        })
-        .catch(() => {});
+      });
+
+      this.sendForm = {
+        expertType: "normal",
+        expertIds: [],
+        content: ""
+      };
     },
 
     // 缂栬緫涓撳瀹℃煡
@@ -1013,7 +1345,6 @@
         }
       })
         .then(({ value }) => {
-          // 妯℃嫙鏇存柊涓撳瀹℃煡
           const index = this.expertReviews.findIndex(e => e.id === expert.id);
           if (index !== -1) {
             this.expertReviews[index].expertOpinion = value;
@@ -1052,165 +1383,6 @@
       );
     },
 
-    // 涓婁紶闄勪欢
-    handleUploadAttachment() {
-      this.uploadDialogVisible = true;
-    },
-
-    // 涓婁紶鍓嶆牎楠�
-    beforeUpload(file) {
-      const allowedTypes = [
-        "application/pdf",
-        "image/jpeg",
-        "image/png",
-        "application/msword",
-        "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
-        "application/vnd.ms-excel",
-        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
-      ];
-
-      const maxSize = 10 * 1024 * 1024;
-
-      const isTypeOk =
-        allowedTypes.includes(file.type) ||
-        file.name.endsWith(".pdf") ||
-        file.name.endsWith(".jpg") ||
-        file.name.endsWith(".jpeg") ||
-        file.name.endsWith(".png") ||
-        file.name.endsWith(".doc") ||
-        file.name.endsWith(".docx") ||
-        file.name.endsWith(".xls") ||
-        file.name.endsWith(".xlsx");
-
-      if (!isTypeOk) {
-        this.$message.error("鏂囦欢鏍煎紡涓嶆敮鎸�");
-        return false;
-      }
-
-      if (file.size > maxSize) {
-        this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
-        return false;
-      }
-
-      return true;
-    },
-
-    // 鏂囦欢閫夋嫨鍙樺寲
-    handleFileChange(file, fileList) {
-      this.tempFileList = fileList;
-    },
-
-    // 鎻愪氦涓婁紶
-    submitUpload() {
-      if (this.tempFileList.length === 0) {
-        this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
-        return;
-      }
-
-      this.uploadLoading = true;
-
-      const uploadPromises = this.tempFileList.map(file => {
-        const formData = new FormData();
-        formData.append("file", file.raw);
-        formData.append("ethicsReviewId", this.form.id);
-
-        return uploadAttachment(formData);
-      });
-
-      Promise.all(uploadPromises)
-        .then(responses => {
-          this.$message.success("鏂囦欢涓婁紶鎴愬姛");
-          this.uploadDialogVisible = false;
-          this.tempFileList = [];
-          this.getAttachments(this.form.id);
-        })
-        .catch(error => {
-          console.error("涓婁紶澶辫触:", error);
-          this.$message.error("鏂囦欢涓婁紶澶辫触");
-        })
-        .finally(() => {
-          this.uploadLoading = false;
-        });
-    },
-
-    // 棰勮闄勪欢
-    handlePreviewAttachment(attachment) {
-      if (attachment.fileName.endsWith(".pdf")) {
-        window.open(attachment.fileUrl, "_blank");
-      } else if (attachment.fileName.match(/\.(jpg|jpeg|png)$/i)) {
-        this.$alert(
-          `<img src="${attachment.fileUrl}" style="max-width: 100%;" alt="${attachment.fileName}">`,
-          "鍥剧墖棰勮",
-          {
-            dangerouslyUseHTMLString: true,
-            customClass: "image-preview-dialog"
-          }
-        );
-      } else {
-        this.$message.info("璇ユ枃浠剁被鍨嬫殏涓嶆敮鎸佸湪绾块瑙堬紝璇蜂笅杞藉悗鏌ョ湅");
-      }
-    },
-
-    // 涓嬭浇闄勪欢
-    handleDownloadAttachment(attachment) {
-      const link = document.createElement("a");
-      link.href = attachment.fileUrl;
-      link.download = attachment.fileName;
-      link.click();
-      this.$message.success(`寮�濮嬩笅杞�: ${attachment.fileName}`);
-    },
-
-    // 鍒犻櫎闄勪欢
-    handleRemoveAttachment(attachment) {
-      this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
-        confirmButtonText: "纭畾",
-        cancelButtonText: "鍙栨秷",
-        type: "warning"
-      })
-        .then(() => {
-          deleteAttachment(attachment.id)
-            .then(response => {
-              if (response.code === 200) {
-                this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
-                this.getAttachments(this.form.id);
-              }
-            })
-            .catch(error => {
-              console.error("鍒犻櫎闄勪欢澶辫触:", error);
-              this.$message.error("鍒犻櫎闄勪欢澶辫触");
-            });
-        })
-        .catch(() => {});
-    },
-
-    // 鑾峰彇鏂囦欢绫诲瀷
-    getFileType(fileName) {
-      const ext = fileName
-        .split(".")
-        .pop()
-        .toLowerCase();
-      const typeMap = {
-        pdf: "PDF",
-        doc: "DOC",
-        docx: "DOCX",
-        xls: "XLS",
-        xlsx: "XLSX",
-        jpg: "JPG",
-        jpeg: "JPEG",
-        png: "PNG"
-      };
-      return typeMap[ext] || ext.toUpperCase();
-    },
-
-    // 鏂囦欢澶у皬鏍煎紡鍖�
-    formatFileSize(size) {
-      if (size === 0) return "0 B";
-      const k = 1024;
-      const sizes = ["B", "KB", "MB", "GB"];
-      const i = Math.floor(Math.log(size) / Math.log(k));
-      return parseFloat((size / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
-    },
-
     // 鏃堕棿鏍煎紡鍖�
     parseTime(time) {
       if (!time) return "";
@@ -1231,6 +1403,9 @@
   }
 };
 </script>
+
+
+
 <style scoped>
 .ethics-review-detail {
   padding: 20px;
@@ -1286,22 +1461,6 @@
   font-weight: bold;
 }
 
-.upload-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 15px;
-  padding: 10px;
-  background-color: #f8f9fa;
-  border-radius: 4px;
-}
-
-.upload-title {
-  font-size: 14px;
-  font-weight: 600;
-  color: #303133;
-}
-
 .file-info {
   display: flex;
   align-items: center;
@@ -1313,133 +1472,6 @@
   color: #909399;
 }
 
-/* 琛ㄥ崟鏍峰紡浼樺寲 */
-:deep(.el-form-item__label) {
-  font-weight: 500;
-}
-
-:deep(.el-input__inner) {
-  border-radius: 4px;
-}
-
-:deep(.el-textarea__inner) {
-  border-radius: 4px;
-  resize: vertical;
-}
-
-/* 琛ㄦ牸鏍峰紡浼樺寲 */
-:deep(.el-table) {
-  border-radius: 8px;
-  overflow: hidden;
-}
-
-:deep(.el-table th) {
-  background-color: #f5f7fa;
-  color: #606266;
-  font-weight: 500;
-}
-
-:deep(.el-table .cell) {
-  padding: 8px 12px;
-}
-
-/* 鎸夐挳鏍峰紡浼樺寲 */
-:deep(.el-button--primary) {
-  background: linear-gradient(135deg, #409eff 0%, #3375e0 100%);
-  border: none;
-  border-radius: 4px;
-}
-
-:deep(.el-button--success) {
-  background: linear-gradient(135deg, #67c23a 0%, #529b2f 100%);
-  border: none;
-  border-radius: 4px;
-}
-
-:deep(.el-button--warning) {
-  background: linear-gradient(135deg, #e6a23c 0%, #d18c2a 100%);
-  border: none;
-  border-radius: 4px;
-}
-
-:deep(.el-button--danger) {
-  background: linear-gradient(135deg, #f56c6c 0%, #e05b5b 100%);
-  border: none;
-  border-radius: 4px;
-}
-
-/* 鏍囩鏍峰紡 */
-:deep(.el-tag) {
-  border-radius: 12px;
-  border: none;
-  font-weight: 500;
-}
-
-/* 瀵硅瘽妗嗘牱寮忎紭鍖� */
-:deep(.el-dialog) {
-  border-radius: 8px;
-  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
-}
-
-:deep(.el-dialog__header) {
-  background: linear-gradient(135deg, #f5f7fa 0%, #e4e7ed 100%);
-  border-bottom: 1px solid #e4e7ed;
-  padding: 15px 20px;
-}
-
-:deep(.el-dialog__title) {
-  font-weight: 600;
-  color: #303133;
-}
-
-/* 涓婁紶缁勪欢鏍峰紡 */
-:deep(.el-upload-dragger) {
-  border: 2px dashed #dcdfe6;
-  border-radius: 6px;
-  background-color: #fafafa;
-  transition: all 0.3s ease;
-}
-
-:deep(.el-upload-dragger:hover) {
-  border-color: #409eff;
-  background-color: #f0f7ff;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
-  .ethics-review-detail {
-    padding: 10px;
-  }
-
-  .expert-stats .el-col {
-    margin-bottom: 10px;
-  }
-
-  .upload-header {
-    flex-direction: column;
-    align-items: flex-start;
-    gap: 10px;
-  }
-}
-
-/* 鍔ㄧ敾鏁堟灉 */
-.fade-enter-active,
-.fade-leave-active {
-  transition: opacity 0.3s ease;
-}
-
-.fade-enter,
-.fade-leave-to {
-  opacity: 0;
-}
-
-/* 鍔犺浇鐘舵�� */
-.loading-container {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  height: 200px;
-}
 /* 涓撳绫诲瀷鏍峰紡 */
 .normal-expert {
   color: #409eff;
@@ -1484,50 +1516,74 @@
 .sent-button {
   color: #67c23a !important;
 }
-
-/* 琛ㄦ牸琛屾偓鍋滄晥鏋� */
-:deep(.el-table__row:hover) {
-  transform: translateY(-1px);
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-  transition: all 0.3s ease;
-}
-/* 鑷畾涔夋粴鍔ㄦ潯 */
-:deep(::-webkit-scrollbar) {
-  width: 6px;
-  height: 6px;
+.form-section {
+  margin-bottom: 16px;
 }
 
-:deep(::-webkit-scrollbar-track) {
-  background: #f1f1f1;
-  border-radius: 3px;
+.section-header {
+  display: flex;
+  align-items: center;
+  font-weight: bold;
+  color: #303133;
 }
 
-:deep(::-webkit-scrollbar-thumb) {
-  background: #c1c1c1;
-  border-radius: 3px;
+.dialog-footer {
+  text-align: right;
+  padding: 20px 0 0;
 }
 
-:deep(::-webkit-scrollbar-thumb:hover) {
-  background: #a8a8a8;
+.attachment-section {
+  margin-bottom: 16px;
 }
 
-/* 涓撳瀹℃煡琛ㄦ牸鐗规畩鏍峰紡 */
-.expert-table-special :deep(.el-table__row) {
-  transition: all 0.3s ease;
+.attachment-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16px;
+  padding: 8px 0;
+  border-bottom: 1px solid #ebeef5;
 }
 
-.expert-table-special :deep(.el-table__row:hover) {
-  background-color: #f0f7ff;
-  transform: translateY(-1px);
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+.attachment-title {
+  font-weight: bold;
+  margin: 0 8px;
 }
 
-/* 涓诲涓撳琛岄珮浜� */
-:deep(.chief-expert-row) {
-  background-color: #fff7e6 !important;
+.attachment-tip {
+  font-size: 12px;
+  color: #909399;
 }
 
-:deep(.chief-expert-row:hover) {
-  background-color: #ffecc2 !important;
+.attachment-list {
+  margin-top: 16px;
+}
+
+.list-title {
+  font-weight: bold;
+  margin-bottom: 12px;
+  color: #303133;
+}
+
+.file-name {
+  font-size: 13px;
+}
+
+/* 妗堜緥淇℃伅灞曠ず鏍峰紡 */
+.selected-case-info {
+  margin-bottom: 20px;
+}
+
+.case-info-card {
+  border-left: 4px solid #67c23a;
+}
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 768px) {
+  .ethics-review-detail {
+    padding: 10px;
+  }
+
+  .expert-stats .el-col {
+    margin-bottom: 10px;
+  }
 }
 </style>

--
Gitblit v1.9.3