From 3b7fcf5ea471f6cb388f86d0732b8ece47a3cefc Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期一, 29 十二月 2025 21:05:58 +0800
Subject: [PATCH] 页面更新

---
 src/views/OfficeRelated/conference/index.vue | 1194 ++++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 967 insertions(+), 227 deletions(-)

diff --git a/src/views/OfficeRelated/conference/index.vue b/src/views/OfficeRelated/conference/index.vue
index 5b87c95..d7f2b3b 100644
--- a/src/views/OfficeRelated/conference/index.vue
+++ b/src/views/OfficeRelated/conference/index.vue
@@ -17,7 +17,11 @@
     <el-card class="filter-card">
       <el-form :model="queryParams" inline>
         <el-form-item label="浼氳绫诲瀷">
-          <el-select v-model="queryParams.meetingType" clearable placeholder="璇烽�夋嫨">
+          <el-select
+            v-model="queryParams.meetingType"
+            clearable
+            placeholder="璇烽�夋嫨"
+          >
             <el-option label="绉戠爺浼氳" value="research" />
             <el-option label="鏃ュ父浼氳" value="daily" />
             <el-option label="椤圭洰浼氳" value="project" />
@@ -44,7 +48,11 @@
           />
         </el-form-item>
         <el-form-item label="鐘舵��">
-          <el-select v-model="queryParams.status" clearable placeholder="璇烽�夋嫨">
+          <el-select
+            v-model="queryParams.status"
+            clearable
+            placeholder="璇烽�夋嫨"
+          >
             <el-option label="寰呭紑濮�" value="pending" />
             <el-option label="杩涜涓�" value="ongoing" />
             <el-option label="宸茬粨鏉�" value="completed" />
@@ -67,51 +75,114 @@
         style="width: 100%"
         @sort-change="handleSortChange"
       >
-        <el-table-column prop="id" label="ID" width="80" fixed />
-        <el-table-column prop="title" label="浼氳涓婚" width="200" fixed>
+        <!-- <el-table-column prop="id" label="ID" width="80" fixed /> -->
+        <el-table-column
+          prop="title"
+          align="center"
+          label="浼氳涓婚"
+          width="200"
+          fixed
+        >
           <template #default="scope">
             <el-button type="text" @click="handleView(scope.row)">
               {{ scope.row.title }}
             </el-button>
           </template>
         </el-table-column>
-        <el-table-column prop="meetingType" label="浼氳绫诲瀷" width="120">
+        <el-table-column
+          align="center"
+          prop="meetingType"
+          label="浼氳绫诲瀷"
+          width="120"
+        >
           <template #default="scope">
             <el-tag :type="getMeetingTypeTag(scope.row.meetingType)">
               {{ getMeetingTypeText(scope.row.meetingType) }}
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="participants" label="鍙備細浜哄憳" width="180" show-overflow-tooltip>
-          <template #default="scope">
-            <span>{{ scope.row.participants.join(', ') }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="location" label="浼氳鍦扮偣" width="150" />
-        <el-table-column prop="startTime" label="寮�濮嬫椂闂�" width="160" sortable>
-          <template #default="scope">
-            <span>{{ formatDateTime(scope.row.startTime) }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="endTime" label="缁撴潫鏃堕棿" width="160" sortable>
-          <template #default="scope">
-            <span>{{ formatDateTime(scope.row.endTime) }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="duration" label="鎸佺画鏃堕棿" width="100">
-          <template #default="scope">
-            <span>{{ calculateDuration(scope.row) }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="summary" label="浼氳姒傝" min-width="200" show-overflow-tooltip />
-        <el-table-column prop="status" label="鐘舵��" width="100" fixed="right">
+        <el-table-column
+          align="center"
+          prop="status"
+          label="鐘舵��"
+          width="100"
+          fixed="right"
+        >
           <template #default="scope">
             <el-tag :type="getStatusTag(scope.row.status)">
               {{ getStatusText(scope.row.status) }}
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="鎿嶄綔" width="200" fixed="right">
+        <el-table-column
+          prop="participants"
+          label="鍙備細浜哄憳"
+          align="center"
+          width="180"
+          show-overflow-tooltip
+        >
+          <template #default="scope">
+            <span>{{ scope.row.participants.join(", ") }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="location"
+          label="浼氳鍦扮偣"
+          width="150"
+        />
+        <el-table-column
+          align="center"
+          prop="startTime"
+          label="寮�濮嬫椂闂�"
+          width="160"
+          sortable
+        >
+          <template #default="scope">
+            <span>{{ formatDateTime(scope.row.startTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="endTime"
+          label="缁撴潫鏃堕棿"
+          width="160"
+          sortable
+        >
+          <template #default="scope">
+            <span>{{ formatDateTime(scope.row.endTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="duration"
+          label="鎸佺画鏃堕棿"
+          width="100"
+        >
+          <template #default="scope">
+            <span>{{ calculateDuration(scope.row) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="summary"
+          label="浼氳姒傝"
+          min-width="200"
+          show-overflow-tooltip
+        />
+        <el-table-column align="center" label="浼氳绾" width="120">
+          <template #default="scope">
+            <el-button
+              size="mini"
+              type="text"
+              @click="handleViewMinutes(scope.row)"
+              :disabled="!scope.row.meetingMinutes"
+            >
+              {{ scope.row.meetingMinutes ? "鏌ョ湅绾" : "鏆傛棤" }}
+            </el-button>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" width="200" fixed="right">
           <template #default="scope">
             <el-button size="mini" type="text" @click="handleView(scope.row)">
               鏌ョ湅
@@ -152,6 +223,87 @@
       </div>
     </el-card>
 
+    <el-dialog
+      title="浼氳绾"
+      :visible.sync="minutesDialogVisible"
+      width="700px"
+    >
+      <div v-if="currentRecord.meetingMinutes">
+        <el-alert
+          title="浼氳绾璇︽儏"
+          type="info"
+          :closable="false"
+          style="margin-bottom: 16px;"
+        />
+        <div class="minutes-content">
+          <el-card>
+            <div
+              style="white-space: pre-line; line-height: 1.6; max-height: 300px; overflow-y: auto;"
+            >
+              {{ currentRecord.meetingMinutes }}
+            </div>
+          </el-card>
+        </div>
+
+        <!-- 浼氳绾闄勪欢灞曠ず -->
+        <div
+          class="minutes-attachments"
+          v-if="
+            currentRecord.minutesAttachments &&
+              currentRecord.minutesAttachments.length > 0
+          "
+        >
+          <el-divider content-position="left">浼氳绾闄勪欢</el-divider>
+          <div class="attachment-list">
+            <div
+              v-for="file in currentRecord.minutesAttachments"
+              :key="file.id"
+              class="attachment-item"
+            >
+              <el-link
+                type="primary"
+                :href="file.url"
+                target="_blank"
+                class="file-link"
+              >
+                <i
+                  :class="getFileIcon(file.type)"
+                  style="margin-right: 8px;"
+                ></i>
+                {{ file.name }}
+                <span class="file-size">({{ formatFileSize(file.size) }})</span>
+              </el-link>
+            </div>
+          </div>
+        </div>
+
+        <div
+          class="minutes-meta"
+          style="margin-top: 16px; color: #909399; font-size: 12px;"
+        >
+          <span
+            >鍒涘缓鏃堕棿:
+            {{ formatDateTime(currentRecord.minutesCreateTime) }}</span
+          >
+          <span style="margin-left: 16px;"
+            >鍒涘缓浜�: {{ currentRecord.minutesCreator || "绯荤粺" }}</span
+          >
+        </div>
+      </div>
+      <div v-else>
+        <el-empty description="鏆傛棤浼氳绾"></el-empty>
+      </div>
+      <span slot="footer">
+        <el-button @click="minutesDialogVisible = false">鍏抽棴</el-button>
+        <el-button
+          type="primary"
+          @click="handleEdit(currentRecord)"
+          v-if="currentRecord.meetingMinutes"
+        >
+          缂栬緫绾
+        </el-button>
+      </span>
+    </el-dialog>
     <!-- 鏌ョ湅璇︽儏瀵硅瘽妗� -->
     <el-dialog
       :title="`浼氳璇︽儏 - ${currentRecord.title || ''}`"
@@ -160,7 +312,9 @@
       :before-close="handleDetailClose"
     >
       <el-descriptions :column="2" border v-if="currentRecord">
-        <el-descriptions-item label="浼氳涓婚">{{ currentRecord.title }}</el-descriptions-item>
+        <el-descriptions-item label="浼氳涓婚">{{
+          currentRecord.title
+        }}</el-descriptions-item>
         <el-descriptions-item label="浼氳绫诲瀷">
           <el-tag :type="getMeetingTypeTag(currentRecord.meetingType)">
             {{ getMeetingTypeText(currentRecord.meetingType) }}
@@ -177,35 +331,140 @@
             {{ participant }}
           </el-tag>
         </el-descriptions-item>
-        <el-descriptions-item label="浼氳鍦扮偣">{{ currentRecord.location }}</el-descriptions-item>
+        <el-descriptions-item label="浼氳鍦扮偣">{{
+          currentRecord.location
+        }}</el-descriptions-item>
         <el-descriptions-item label="浼氳鐘舵��">
           <el-tag :type="getStatusTag(currentRecord.status)">
             {{ getStatusText(currentRecord.status) }}
           </el-tag>
         </el-descriptions-item>
-        <el-descriptions-item label="寮�濮嬫椂闂�">{{ formatDateTime(currentRecord.startTime) }}</el-descriptions-item>
-        <el-descriptions-item label="缁撴潫鏃堕棿">{{ formatDateTime(currentRecord.endTime) }}</el-descriptions-item>
-        <el-descriptions-item label="鎸佺画鏃堕棿">{{ calculateDuration(currentRecord) }}</el-descriptions-item>
-        <el-descriptions-item label="鍒涘缓浜�">{{ currentRecord.creator }}</el-descriptions-item>
+        <el-descriptions-item label="寮�濮嬫椂闂�">{{
+          formatDateTime(currentRecord.startTime)
+        }}</el-descriptions-item>
+        <el-descriptions-item label="缁撴潫鏃堕棿">{{
+          formatDateTime(currentRecord.endTime)
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鎸佺画鏃堕棿">{{
+          calculateDuration(currentRecord)
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鍒涘缓浜�">{{
+          currentRecord.creator
+        }}</el-descriptions-item>
         <el-descriptions-item label="浼氳姒傝" :span="2">
           {{ currentRecord.summary }}
         </el-descriptions-item>
         <el-descriptions-item label="浼氳鍐呭" :span="2">
-          <div style="white-space: pre-line; max-height: 300px; overflow-y: auto;">
+          <div
+            style="white-space: pre-line; max-height: 300px; overflow-y: auto;"
+          >
             {{ currentRecord.content }}
           </div>
         </el-descriptions-item>
-        <el-descriptions-item label="闄勪欢" :span="2" v-if="currentRecord.attachments && currentRecord.attachments.length">
-          <div v-for="file in currentRecord.attachments" :key="file.id" class="attachment-item">
-            <el-link type="primary" :href="file.url" target="_blank">
-              <i class="el-icon-document"></i> {{ file.name }}
-            </el-link>
+        <el-descriptions-item label="浼氳璇︽儏闄勪欢" :span="2">
+          <div class="detail-attachments">
+            <div
+              v-if="
+                currentRecord.detailAttachments &&
+                  currentRecord.detailAttachments.length > 0
+              "
+              class="attachment-grid"
+            >
+              <div
+                v-for="file in currentRecord.detailAttachments"
+                :key="file.id"
+                class="attachment-card"
+              >
+                <el-card shadow="hover" class="file-card">
+                  <div class="file-content">
+                    <i :class="getFileIcon(file.type)" class="file-icon"></i>
+                    <div class="file-info">
+                      <div class="file-name" :title="file.name">
+                        {{ file.name }}
+                      </div>
+                      <div class="file-meta">
+                        <span class="file-size">{{
+                          formatFileSize(file.size)
+                        }}</span>
+                        <span class="file-time">{{
+                          formatDateTime(file.uploadTime)
+                        }}</span>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="file-actions">
+                    <el-button
+                      type="text"
+                      size="mini"
+                      @click="handlePreview(file)"
+                      >棰勮</el-button
+                    >
+                    <el-button
+                      type="text"
+                      size="mini"
+                      @click="handleDownload(file)"
+                      >涓嬭浇</el-button
+                    >
+                  </div>
+                </el-card>
+              </div>
+            </div>
+            <div v-else class="no-attachment">
+              <el-empty
+                description="鏆傛棤浼氳璇︽儏闄勪欢"
+                :image-size="50"
+              ></el-empty>
+            </div>
+          </div>
+        </el-descriptions-item>
+
+        <!-- 浼氳姒傝闄勪欢 -->
+        <el-descriptions-item label="浼氳姒傝闄勪欢" :span="2">
+          <div class="summary-attachments">
+            <div
+              v-if="
+                currentRecord.summaryAttachments &&
+                  currentRecord.summaryAttachments.length > 0
+              "
+              class="attachment-list"
+            >
+              <div
+                v-for="file in currentRecord.summaryAttachments"
+                :key="file.id"
+                class="attachment-item"
+              >
+                <el-link
+                  type="primary"
+                  :href="file.url"
+                  target="_blank"
+                  class="file-link"
+                >
+                  <i
+                    :class="getFileIcon(file.type)"
+                    style="margin-right: 8px;"
+                  ></i>
+                  {{ file.name }}
+                  <span class="file-size"
+                    >({{ formatFileSize(file.size) }})</span
+                  >
+                </el-link>
+              </div>
+            </div>
+            <div v-else class="no-attachment">
+              <el-empty
+                description="鏆傛棤浼氳姒傝闄勪欢"
+                :image-size="50"
+              ></el-empty>
+            </div>
           </div>
         </el-descriptions-item>
       </el-descriptions>
+
       <span slot="footer">
         <el-button @click="detailDialogVisible = false">鍏抽棴</el-button>
-        <el-button type="primary" @click="handleEdit(currentRecord)">缂栬緫</el-button>
+        <el-button type="primary" @click="handleEdit(currentRecord)"
+          >缂栬緫</el-button
+        >
       </span>
     </el-dialog>
 
@@ -228,7 +487,11 @@
         </el-form-item>
 
         <el-form-item label="浼氳绫诲瀷" prop="meetingType">
-          <el-select v-model="editForm.meetingType" placeholder="璇烽�夋嫨浼氳绫诲瀷" style="width: 100%">
+          <el-select
+            v-model="editForm.meetingType"
+            placeholder="璇烽�夋嫨浼氳绫诲瀷"
+            style="width: 100%"
+          >
             <el-option label="绉戠爺浼氳" value="research" />
             <el-option label="鏃ュ父浼氳" value="daily" />
             <el-option label="椤圭洰浼氳" value="project" />
@@ -257,7 +520,109 @@
         <el-form-item label="浼氳鍦扮偣" prop="location">
           <el-input v-model="editForm.location" placeholder="璇疯緭鍏ヤ細璁湴鐐�" />
         </el-form-item>
+        <el-form-item label="浼氳璇︽儏闄勪欢">
+          <div class="attachment-upload-section">
+            <div class="section-title">浼氳鐩稿叧璧勬枡</div>
+            <div class="upload-tip">涓婁紶浼氳璁ㄨ鏉愭枡銆佽儗鏅祫鏂欑瓑鐩稿叧鏂囦欢</div>
+            <el-upload
+              class="detail-upload"
+              action="#"
+              :auto-upload="false"
+              :on-change="handleDetailFileChange"
+              :file-list="editForm.detailAttachments"
+              :limit="10"
+              multiple
+            >
+              <el-button size="small" type="primary" icon="el-icon-upload">
+                涓婁紶璇︽儏闄勪欢
+              </el-button>
+              <div slot="tip" class="el-upload__tip">
+                鏀寔鏂囨。銆佸浘鐗囩瓑鏍煎紡锛屽崟涓枃浠朵笉瓒呰繃20MB
+              </div>
+            </el-upload>
+            <div
+              v-if="
+                editForm.detailAttachments &&
+                  editForm.detailAttachments.length > 0
+              "
+              class="uploaded-files"
+            >
+              <div
+                v-for="(file, index) in editForm.detailAttachments"
+                :key="file.uid || index"
+                class="file-item"
+              >
+                <span class="file-name">{{ file.name }}</span>
+                <el-button
+                  type="text"
+                  size="mini"
+                  @click="handleRemoveDetailFile(index)"
+                  style="color: #F56C6C;"
+                >
+                  鍒犻櫎
+                </el-button>
+              </div>
+            </div>
+          </div>
+        </el-form-item>
 
+        <el-form-item label="浼氳姒傝" prop="summary">
+          <el-input
+            v-model="editForm.summary"
+            type="textarea"
+            :rows="2"
+            placeholder="璇疯緭鍏ヤ細璁瑕�"
+            maxlength="200"
+            show-word-limit
+          />
+        </el-form-item>
+
+        <!-- 浼氳姒傝闄勪欢涓婁紶 -->
+        <el-form-item label="浼氳姒傝闄勪欢">
+          <div class="attachment-upload-section">
+            <div class="section-title">浼氳绾鏉愭枡</div>
+            <div class="upload-tip">涓婁紶浼氳绾銆佸喅璁枃浠剁瓑鐩稿叧鏉愭枡</div>
+            <el-upload
+              class="summary-upload"
+              action="#"
+              :auto-upload="false"
+              :on-change="handleSummaryFileChange"
+              :file-list="editForm.summaryAttachments"
+              :limit="5"
+              multiple
+            >
+              <el-button size="small" type="primary" icon="el-icon-upload">
+                涓婁紶姒傝闄勪欢
+              </el-button>
+              <div slot="tip" class="el-upload__tip">
+                鏀寔PDF銆乄ord绛夋枃妗f牸寮忥紝鍗曚釜鏂囦欢涓嶈秴杩�10MB
+              </div>
+            </el-upload>
+            <div
+              v-if="
+                editForm.summaryAttachments &&
+                  editForm.summaryAttachments.length > 0
+              "
+              class="uploaded-files"
+            >
+              <div
+                v-for="(file, index) in editForm.summaryAttachments"
+                :key="file.uid || index"
+                class="file-item"
+              >
+                <span class="file-name">{{ file.name }}</span>
+                <el-button
+                  type="text"
+                  size="mini"
+                  @click="handleRemoveSummaryFile(index)"
+                  style="color: #F56C6C;"
+                >
+                  鍒犻櫎
+                </el-button>
+              </div>
+            </div>
+          </div>
+        </el-form-item>
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="寮�濮嬫椂闂�" prop="startTime">
@@ -303,25 +668,47 @@
           />
         </el-form-item>
 
-        <el-form-item label="闄勪欢涓婁紶">
-          <el-upload
-            action="#"
-            :auto-upload="false"
-            :on-change="handleFileChange"
-            :file-list="editForm.attachments"
-            :limit="5"
-            multiple
-          >
-            <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
-            <div slot="tip" class="el-upload__tip">鏀寔涓婁紶鏂囨。銆佸浘鐗囩瓑鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB</div>
-          </el-upload>
+        <!-- 浼氳绾闄勪欢涓婁紶 -->
+        <el-form-item label="浼氳绾闄勪欢">
+          <div class="attachment-upload-section">
+            <div class="upload-tip">涓婁紶涓庝細璁邯瑕佺浉鍏崇殑琛ュ厖鏉愭枡</div>
+            <el-upload
+              class="minutes-upload"
+              action="#"
+              :auto-upload="false"
+              :on-change="handleMinutesFileChange"
+              :file-list="editForm.minutesAttachments"
+              :limit="5"
+              multiple
+            >
+              <el-button size="small" type="primary" icon="el-icon-upload">
+                涓婁紶绾闄勪欢
+              </el-button>
+              <div slot="tip" class="el-upload__tip">
+                鏀寔鍥剧墖銆佹枃妗g瓑鏍煎紡锛屽崟涓枃浠朵笉瓒呰繃10MB
+              </div>
+            </el-upload>
+          </div>
+        </el-form-item>
+        <el-form-item label="浼氳绾" prop="meetingMinutes">
+          <el-input
+            v-model="editForm.meetingMinutes"
+            type="textarea"
+            :rows="6"
+            placeholder="璇疯緭鍏ヤ細璁邯瑕佸唴瀹癸紝鍖呮嫭浼氳鍐宠銆佽鍔ㄨ鍒掋�佽矗浠讳汉绛変俊鎭�"
+            maxlength="1000"
+            show-word-limit
+          />
+          <div style="color: #909399; font-size: 12px; margin-top: 4px;">
+            鎻愮ず锛氬彲璁板綍浼氳璁ㄨ瑕佺偣銆佸喅璁簨椤广�佽鍔ㄨ鍒掔瓑
+          </div>
         </el-form-item>
       </el-form>
 
       <span slot="footer">
         <el-button @click="handleEditClose">鍙栨秷</el-button>
         <el-button type="primary" @click="handleSave" :loading="saveLoading">
-          {{ isEditing ? '淇濆瓨' : '鏂板' }}
+          {{ isEditing ? "淇濆瓨" : "鏂板" }}
         </el-button>
       </span>
     </el-dialog>
@@ -330,15 +717,15 @@
 
 <script>
 export default {
-  name: 'MeetingManagement',
+  name: "MeetingManagement",
   data() {
     return {
       // 鏌ヨ鍙傛暟
       queryParams: {
-        meetingType: '',
-        location: '',
+        meetingType: "",
+        location: "",
         dateRange: [],
-        status: ''
+        status: ""
       },
       // 鍒嗛〉鍙傛暟
       pagination: {
@@ -360,325 +747,546 @@
       tableData: [],
       // 鐢ㄦ埛鍒楄〃锛堢敤浜庨�夋嫨鍙備細浜哄憳锛�
       userList: [
-        { id: 1, name: '寮犱笁' },
-        { id: 2, name: '鏉庡洓' },
-        { id: 3, name: '鐜嬩簲' },
-        { id: 4, name: '璧靛叚' },
-        { id: 5, name: '閽变竷' },
-        { id: 6, name: '瀛欏叓' },
-        { id: 7, name: '鍛ㄤ節' },
-        { id: 8, name: '鍚村崄' }
+        { id: 1, name: "寮犱笁" },
+        { id: 2, name: "鏉庡洓" },
+        { id: 3, name: "鐜嬩簲" },
+        { id: 4, name: "璧靛叚" },
+        { id: 5, name: "閽变竷" },
+        { id: 6, name: "瀛欏叓" },
+        { id: 7, name: "鍛ㄤ節" },
+        { id: 8, name: "鍚村崄" }
       ],
+      minutesDialogVisible: false, // 浼氳绾瀵硅瘽妗嗘樉绀虹姸鎬�
+
       // 缂栬緫琛ㄥ崟鏁版嵁
       editForm: {
-        title: '',
-        meetingType: '',
+        title: "",
+        meetingType: "",
         participants: [],
-        location: '',
-        startTime: '',
-        endTime: '',
-        summary: '',
-        content: '',
-        attachments: []
+        location: "",
+        startTime: "",
+        endTime: "",
+        summary: "",
+        content: "",
+        attachments: [],
+        detailAttachments: [], // 浼氳璇︽儏闄勪欢
+        summaryAttachments: [], // 浼氳姒傝闄勪欢
+        minutesAttachments: [] // 浼氳绾闄勪欢
       },
       // 琛ㄥ崟楠岃瘉瑙勫垯
       editRules: {
-        title: [{ required: true, message: '璇疯緭鍏ヤ細璁富棰�', trigger: 'blur' }],
-        meetingType: [{ required: true, message: '璇烽�夋嫨浼氳绫诲瀷', trigger: 'change' }],
-        participants: [{ required: true, message: '璇烽�夋嫨鍙備細浜哄憳', trigger: 'change' }],
-        location: [{ required: true, message: '璇疯緭鍏ヤ細璁湴鐐�', trigger: 'blur' }],
-        startTime: [{ required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change' }],
-        endTime: [{ required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change' }],
-        summary: [{ required: true, message: '璇疯緭鍏ヤ細璁瑕�', trigger: 'blur' }],
-        content: [{ required: true, message: '璇疯緭鍏ヤ細璁唴瀹�', trigger: 'blur' }]
+        title: [{ required: true, message: "璇疯緭鍏ヤ細璁富棰�", trigger: "blur" }],
+        meetingType: [
+          { required: true, message: "璇烽�夋嫨浼氳绫诲瀷", trigger: "change" }
+        ],
+        participants: [
+          { required: true, message: "璇烽�夋嫨鍙備細浜哄憳", trigger: "change" }
+        ],
+        location: [
+          { required: true, message: "璇疯緭鍏ヤ細璁湴鐐�", trigger: "blur" }
+        ],
+        startTime: [
+          { required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change" }
+        ],
+        endTime: [
+          { required: true, message: "璇烽�夋嫨缁撴潫鏃堕棿", trigger: "change" }
+        ],
+        summary: [
+          { required: true, message: "璇疯緭鍏ヤ細璁瑕�", trigger: "blur" }
+        ],
+        content: [
+          { required: true, message: "璇疯緭鍏ヤ細璁唴瀹�", trigger: "blur" }
+        ],
+        meetingMinutes: [
+          {
+            max: 1000,
+            message: "浼氳绾闀垮害涓嶈兘瓒呰繃1000涓瓧绗�",
+            trigger: "blur"
+          }
+        ]
       }
-    }
+    };
   },
   mounted() {
-    this.loadData()
+    this.loadData();
   },
   methods: {
     // 鍔犺浇鏁版嵁
     async loadData() {
-      this.loading = true
+      this.loading = true;
       try {
         // 妯℃嫙API璋冪敤
-        await new Promise(resolve => setTimeout(resolve, 500))
+        await new Promise(resolve => setTimeout(resolve, 500));
 
         // 鐢熸垚妯℃嫙鏁版嵁
-        this.tableData = this.generateMockData()
-        this.pagination.total = this.tableData.length
+        this.tableData = this.generateMockData();
+        this.pagination.total = this.tableData.length;
       } catch (error) {
-        console.error('鍔犺浇鏁版嵁澶辫触:', error)
-        this.$message.error('鏁版嵁鍔犺浇澶辫触')
+        console.error("鍔犺浇鏁版嵁澶辫触:", error);
+        this.$message.error("鏁版嵁鍔犺浇澶辫触");
       } finally {
-        this.loading = false
+        this.loading = false;
       }
+    },
+    getFileIcon(fileType) {
+      const iconMap = {
+        pdf: "el-icon-document",
+        doc: "el-icon-document",
+        docx: "el-icon-document",
+        xls: "el-icon-document",
+        xlsx: "el-icon-document",
+        ppt: "el-icon-document",
+        pptx: "el-icon-document",
+        jpg: "el-icon-picture",
+        jpeg: "el-icon-picture",
+        png: "el-icon-picture",
+        gif: "el-icon-picture",
+        zip: "el-icon-folder",
+        rar: "el-icon-folder"
+      };
+      return iconMap[fileType] || "el-icon-document";
+    },
+    // 鏌ョ湅浼氳绾
+    handleViewMinutes(record) {
+      this.currentRecord = { ...record };
+      this.minutesDialogVisible = true;
     },
 
     // 鐢熸垚妯℃嫙鏁版嵁
     generateMockData() {
-      const meetingTypes = ['research', 'daily', 'project', 'department', 'review']
-      const statuses = ['pending', 'ongoing', 'completed', 'cancelled']
-      const participantsPool = ['寮犱笁', '鏉庡洓', '鐜嬩簲', '璧靛叚', '閽变竷', '瀛欏叓', '鍛ㄤ節', '鍚村崄']
+      const meetingTypes = [
+        "research",
+        "daily",
+        "project",
+        "department",
+        "review"
+      ];
+      const statuses = ["pending", "ongoing", "completed", "cancelled"];
+      const participantsPool = [
+        "寮犱笁",
+        "鏉庡洓",
+        "鐜嬩簲",
+        "璧靛叚",
+        "閽变竷",
+        "瀛欏叓",
+        "鍛ㄤ節",
+        "鍚村崄"
+      ];
+
+      // 浼氳绾绀轰緥鍐呭
+      const minutesExamples = [
+        `浼氳鍐宠锛�
+1. 椤圭洰璁″垝璋冩暣鑷充笅鍛ㄤ竴姝e紡鍚姩
+2. 鎶�鏈柟妗堢敱寮犱笁璐熻矗瀹屽杽
+3. 涓嬪懆杩涜鎶�鏈瘎瀹′細璁�
+
+琛屽姩璁″垝锛�
+- 鏉庡洓锛氬噯澶囨妧鏈枃妗o紙鎴鍛ㄤ簲锛�
+- 鐜嬩簲锛氬崗璋冭祫婧愬垎閰嶏紙鎴鍛ㄥ洓锛�
+- 鍏ㄤ綋锛氬弬鍔犳妧鏈煿璁紙鍛ㄤ笁涓嬪崍锛塦,
+
+        `璁ㄨ瑕佺偣锛�
+1. 褰撳墠椤圭洰杩涘害姝e父锛岄渶鍔犲己璐ㄩ噺绠℃帶
+2. 瀹㈡埛鍙嶉闂闇�瑕佷紭鍏堝鐞�
+3. 涓嬮樁娈靛伐浣滈噸鐐规槑纭�
+
+浠诲姟鍒嗛厤锛�
+鉁� 宸插畬鎴愶細闇�姹傚垎鏋愩�佹妧鏈柟妗�
+馃敺 杩涜涓細寮�鍙戝疄鏂斤紙璐熻矗浜猴細璧靛叚锛�
+鈴� 寰呭紑濮嬶細娴嬭瘯楠屾敹`,
+
+        `閲嶈鍐宠锛�
+鈥� 閫氳繃棰勭畻璋冩暣鏂规
+鈥� 纭畾鏂版垚鍛樺姞鍏ユ椂闂�
+鈥� 鎵瑰噯璁惧閲囪喘鐢宠
+
+鍚庣画瀹夋帓锛�
+馃搮 涓嬫浼氳鏃堕棿锛�2024-01-15 14:00
+馃搷 浼氳鍦扮偣锛氱涓�浼氳瀹�
+馃懃 蹇呴』鍙備細浜哄憳锛氬紶涓夈�佹潕鍥沗
+      ];
 
       return Array.from({ length: 10 }, (_, index) => {
-        const participantCount = Math.floor(Math.random() * 5) + 2
-        const participants = []
+        const participantCount = Math.floor(Math.random() * 5) + 2;
+        const participants = [];
         for (let i = 0; i < participantCount; i++) {
-          const randomIndex = Math.floor(Math.random() * participantsPool.length)
-          participants.push(participantsPool[randomIndex])
+          const randomIndex = Math.floor(
+            Math.random() * participantsPool.length
+          );
+          participants.push(participantsPool[randomIndex]);
         }
 
-        // 鍘婚噸
-        const uniqueParticipants = [...new Set(participants)]
+        const uniqueParticipants = [...new Set(participants)];
+        const startTime = new Date();
+        startTime.setDate(
+          startTime.getDate() + Math.floor(Math.random() * 30) - 15
+        );
+        startTime.setHours(
+          9 + Math.floor(Math.random() * 8),
+          Math.floor(Math.random() * 4) * 15,
+          0
+        );
 
-        const startTime = new Date()
-        startTime.setDate(startTime.getDate() + Math.floor(Math.random() * 30) - 15)
-        startTime.setHours(9 + Math.floor(Math.random() * 8), Math.floor(Math.random() * 4) * 15, 0)
+        const endTime = new Date(startTime);
+        endTime.setHours(
+          startTime.getHours() + Math.floor(Math.random() * 3) + 1
+        );
 
-        const endTime = new Date(startTime)
-        endTime.setHours(startTime.getHours() + Math.floor(Math.random() * 3) + 1)
-
+        // 闅忔満鍐冲畾鏄惁鏈変細璁邯瑕侊紙60%姒傜巼鏈夌邯瑕侊級
+        const hasMinutes = Math.random() > 0.4;
+        const meetingMinutes = hasMinutes
+          ? minutesExamples[Math.floor(Math.random() * minutesExamples.length)]
+          : "";
+        const hasDetailAttachments = Math.random() > 0.5;
+        const hasSummaryAttachments = Math.random() > 0.6;
+        const hasMinutesAttachments = Math.random() > 0.7;
         return {
           id: index + 1,
-          title: `鍏充簬${['绉戠爺椤圭洰', '鏃ュ父宸ヤ綔', '鎶�鏈瘎瀹�', '閮ㄩ棬鍗忚皟'][Math.floor(Math.random() * 4)]}鐨勪細璁甡,
-          meetingType: meetingTypes[Math.floor(Math.random() * meetingTypes.length)],
+          title: `鍏充簬${
+            ["绉戠爺椤圭洰", "鏃ュ父宸ヤ綔", "鎶�鏈瘎瀹�", "閮ㄩ棬鍗忚皟"][
+              Math.floor(Math.random() * 4)
+            ]
+          }鐨勪細璁甡,
+           // 娣诲姞鍒嗙被鍨嬮檮浠�
+          detailAttachments: hasDetailAttachments ? [
+            {
+              id: `detail-${index}-1`,
+              name: `浼氳鏉愭枡-${index}.pdf`,
+              type: 'pdf',
+              size: 2048000,
+              url: '/api/files/meeting-material.pdf',
+              uploadTime: new Date(startTime.getTime() - 3600000).toISOString()
+            },
+            {
+              id: `detail-${index}-2`,
+              name: `鑳屾櫙璧勬枡-${index}.docx`,
+              type: 'docx',
+              size: 1024000,
+              url: '/api/files/background.docx',
+              uploadTime: new Date(startTime.getTime() - 7200000).toISOString()
+            }
+          ] : [],
+
+          summaryAttachments: hasSummaryAttachments ? [
+            {
+              id: `summary-${index}-1`,
+              name: `浼氳绾-${index}.pdf`,
+              type: 'pdf',
+              size: 512000,
+              url: '/api/files/meeting-summary.pdf',
+              uploadTime: new Date(startTime.getTime() + 3600000).toISOString()
+            }
+          ] : [],
+
+          minutesAttachments: hasMinutesAttachments ? [
+            {
+              id: `minutes-${index}-1`,
+              name: `琛ュ厖鏉愭枡-${index}.jpg`,
+              type: 'jpg',
+              size: 1024000,
+              url: '/api/files/supplement.jpg',
+              uploadTime: new Date(startTime.getTime() + 7200000).toISOString()
+            }
+          ] : [],
+          meetingType:
+            meetingTypes[Math.floor(Math.random() * meetingTypes.length)],
           participants: uniqueParticipants,
-          location: ['绗竴浼氳瀹�', '绗簩浼氳瀹�', '绗笁浼氳瀹�', '绾夸笂浼氳'][Math.floor(Math.random() * 4)],
+          location: ["绗竴浼氳瀹�", "绗簩浼氳瀹�", "绗笁浼氳瀹�", "绾夸笂浼氳"][
+            Math.floor(Math.random() * 4)
+          ],
           startTime: startTime.toISOString(),
           endTime: endTime.toISOString(),
-          summary: `鏈浼氳涓昏璁ㄨ${['椤圭洰杩涘睍', '鎶�鏈毦棰�', '宸ヤ綔璁″垝', '闂鍗忚皟'][Math.floor(Math.random() * 4)]}绛夌浉鍏充簨瀹渀,
+          summary: `鏈浼氳涓昏璁ㄨ${
+            ["椤圭洰杩涘睍", "鎶�鏈毦棰�", "宸ヤ綔璁″垝", "闂鍗忚皟"][
+              Math.floor(Math.random() * 4)
+            ]
+          }绛夌浉鍏充簨瀹渀,
           content: `浼氳璇︾粏鍐呭锛歕n1. 璁涓�璁ㄨ\n2. 璁浜屽垎鏋怽n3. 涓嬩竴姝ュ伐浣滆鍒抃n4. 浠诲姟鍒嗛厤`,
+          meetingMinutes: meetingMinutes,
+          minutesCreateTime: hasMinutes
+            ? new Date(startTime.getTime() + 3600000).toISOString()
+            : "",
+          minutesCreator: hasMinutes ? participants[0] : "",
           status: statuses[Math.floor(Math.random() * statuses.length)],
-          creator: '绯荤粺绠$悊鍛�',
+          creator: "绯荤粺绠$悊鍛�",
           attachments: []
-        }
-      })
+        };
+      });
     },
 
     // 鑾峰彇浼氳绫诲瀷鏍囩鏍峰紡
     getMeetingTypeTag(type) {
       const typeMap = {
-        research: 'primary',
-        daily: 'success',
-        project: 'warning',
-        department: 'info',
-        review: 'danger'
-      }
-      return typeMap[type] || 'info'
+        research: "primary",
+        daily: "success",
+        project: "warning",
+        department: "info",
+        review: "danger"
+      };
+      return typeMap[type] || "info";
     },
 
     // 鑾峰彇浼氳绫诲瀷鏂囨湰
     getMeetingTypeText(type) {
       const textMap = {
-        research: '绉戠爺浼氳',
-        daily: '鏃ュ父浼氳',
-        project: '椤圭洰浼氳',
-        department: '閮ㄩ棬浼氳',
-        review: '璇勫浼氳'
-      }
-      return textMap[type] || type
+        research: "绉戠爺浼氳",
+        daily: "鏃ュ父浼氳",
+        project: "椤圭洰浼氳",
+        department: "閮ㄩ棬浼氳",
+        review: "璇勫浼氳"
+      };
+      return textMap[type] || type;
     },
 
     // 鑾峰彇鐘舵�佹爣绛炬牱寮�
     getStatusTag(status) {
       const statusMap = {
-        pending: 'primary',
-        ongoing: 'success',
-        completed: 'info',
-        cancelled: 'danger'
-      }
-      return statusMap[status] || 'info'
+        pending: "primary",
+        ongoing: "success",
+        completed: "info",
+        cancelled: "danger"
+      };
+      return statusMap[status] || "info";
     },
 
     // 鑾峰彇鐘舵�佹枃鏈�
     getStatusText(status) {
       const textMap = {
-        pending: '寰呭紑濮�',
-        ongoing: '杩涜涓�',
-        completed: '宸茬粨鏉�',
-        cancelled: '宸插彇娑�'
-      }
-      return textMap[status] || status
+        pending: "寰呭紑濮�",
+        ongoing: "杩涜涓�",
+        completed: "宸茬粨鏉�",
+        cancelled: "宸插彇娑�"
+      };
+      return textMap[status] || status;
     },
 
     // 鏍煎紡鍖栨棩鏈熸椂闂�
     formatDateTime(dateTime) {
-      if (!dateTime) return ''
-      const date = new Date(dateTime)
-      return date.toLocaleString('zh-CN')
+      if (!dateTime) return "";
+      const date = new Date(dateTime);
+      return date.toLocaleString("zh-CN");
     },
 
     // 璁$畻浼氳鎸佺画鏃堕棿
     calculateDuration(record) {
-      if (!record.startTime || !record.endTime) return ''
-      const start = new Date(record.startTime)
-      const end = new Date(record.endTime)
-      const duration = (end - start) / (1000 * 60) // 鍒嗛挓鏁�
+      if (!record.startTime || !record.endTime) return "";
+      const start = new Date(record.startTime);
+      const end = new Date(record.endTime);
+      const duration = (end - start) / (1000 * 60); // 鍒嗛挓鏁�
 
       if (duration < 60) {
-        return `${Math.round(duration)}鍒嗛挓`
+        return `${Math.round(duration)}鍒嗛挓`;
       } else {
-        const hours = Math.floor(duration / 60)
-        const minutes = Math.round(duration % 60)
-        return minutes > 0 ? `${hours}灏忔椂${minutes}鍒嗛挓` : `${hours}灏忔椂`
+        const hours = Math.floor(duration / 60);
+        const minutes = Math.round(duration % 60);
+        return minutes > 0 ? `${hours}灏忔椂${minutes}鍒嗛挓` : `${hours}灏忔椂`;
       }
     },
 
     // 鏌ヨ澶勭悊
     handleQuery() {
-      this.pagination.currentPage = 1
-      this.loadData()
+      this.pagination.currentPage = 1;
+      this.loadData();
     },
 
     // 閲嶇疆鏌ヨ
     handleReset() {
       this.queryParams = {
-        meetingType: '',
-        location: '',
+        meetingType: "",
+        location: "",
         dateRange: [],
-        status: ''
-      }
-      this.pagination.currentPage = 1
-      this.loadData()
+        status: ""
+      };
+      this.pagination.currentPage = 1;
+      this.loadData();
     },
 
     // 鏌ョ湅璇︽儏
     handleView(record) {
-      this.currentRecord = { ...record }
-      this.detailDialogVisible = true
+      this.currentRecord = { ...record };
+      this.detailDialogVisible = true;
     },
 
     // 鏂板璁板綍
     handleAdd() {
-      this.isEditing = false
-      this.editForm = this.getDefaultFormData()
-      this.editDialogVisible = true
+      this.isEditing = false;
+      this.editForm = this.getDefaultFormData();
+      this.editDialogVisible = true;
       this.$nextTick(() => {
-        this.$refs.editForm && this.$refs.editForm.clearValidate()
-      })
+        this.$refs.editForm && this.$refs.editForm.clearValidate();
+      });
     },
 
     // 缂栬緫璁板綍
     handleEdit(record) {
-      this.isEditing = true
-      this.currentRecord = record
-      this.editForm = { ...record }
-      this.editDialogVisible = true
-      this.detailDialogVisible = false
+      this.isEditing = true;
+      this.currentRecord = record;
+      this.editForm = { ...record };
+      this.editDialogVisible = true;
+      this.detailDialogVisible = false;
       this.$nextTick(() => {
-        this.$refs.editForm && this.$refs.editForm.clearValidate()
-      })
+        this.$refs.editForm && this.$refs.editForm.clearValidate();
+      });
     },
 
     // 澶嶅埗璁板綍
     handleCopy(record) {
-      this.isEditing = false
-      const copiedRecord = { ...record }
-      delete copiedRecord.id
-      copiedRecord.title = copiedRecord.title + '锛堝鍒讹級'
-      this.editForm = copiedRecord
-      this.editDialogVisible = true
+      this.isEditing = false;
+      const copiedRecord = { ...record };
+      delete copiedRecord.id;
+      copiedRecord.title = copiedRecord.title + "锛堝鍒讹級";
+      this.editForm = copiedRecord;
+      this.editDialogVisible = true;
       this.$nextTick(() => {
-        this.$refs.editForm && this.$refs.editForm.clearValidate()
-      })
+        this.$refs.editForm && this.$refs.editForm.clearValidate();
+      });
     },
 
     // 鍒犻櫎璁板綍
     handleDelete(record) {
-      this.$confirm('纭畾瑕佸垹闄よ繖鏉′細璁褰曞悧锛�', '鎻愮ず', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning'
-      }).then(() => {
-        // 妯℃嫙鍒犻櫎鎿嶄綔
-        this.tableData = this.tableData.filter(item => item.id !== record.id)
-        this.pagination.total = this.tableData.length
-        this.$message.success('鍒犻櫎鎴愬姛')
-      }).catch(() => {})
+      this.$confirm("纭畾瑕佸垹闄よ繖鏉′細璁褰曞悧锛�", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(() => {
+          // 妯℃嫙鍒犻櫎鎿嶄綔
+          this.tableData = this.tableData.filter(item => item.id !== record.id);
+          this.pagination.total = this.tableData.length;
+          this.$message.success("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    // 鏂板鏂规硶锛氭牸寮忓寲鏂囦欢澶у皬
+    formatFileSize(bytes) {
+      if (!bytes) return "0 B";
+      const k = 1024;
+      const sizes = ["B", "KB", "MB", "GB"];
+      const i = Math.floor(Math.log(bytes) / Math.log(k));
+      return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
     },
 
+    // 鍒嗙被鍨嬫枃浠朵笂浼犲鐞�
+    handleDetailFileChange(file, fileList) {
+      this.editForm.detailAttachments = fileList;
+    },
+
+    handleSummaryFileChange(file, fileList) {
+      this.editForm.summaryAttachments = fileList;
+    },
+
+    handleMinutesFileChange(file, fileList) {
+      this.editForm.minutesAttachments = fileList;
+    },
+
+    // 鍒犻櫎宸蹭笂浼犵殑鏂囦欢
+    handleRemoveDetailFile(index) {
+      this.editForm.detailAttachments.splice(index, 1);
+    },
+
+    handleRemoveSummaryFile(index) {
+      this.editForm.summaryAttachments.splice(index, 1);
+    },
+
+    // 鏂囦欢棰勮鍜屼笅杞�
+    handlePreview(file) {
+      // 瀹炵幇鏂囦欢棰勮閫昏緫
+      this.$message.info(`棰勮鏂囦欢: ${file.name}`);
+    },
+
+    handleDownload(file) {
+      // 瀹炵幇鏂囦欢涓嬭浇閫昏緫
+      const link = document.createElement("a");
+      link.href = file.url;
+      link.download = file.name;
+      link.click();
+      this.$message.success(`寮�濮嬩笅杞�: ${file.name}`);
+    },
     // 淇濆瓨璁板綍
     async handleSave() {
       try {
-        const valid = await this.$refs.editForm.validate()
-        if (!valid) return
+        const valid = await this.$refs.editForm.validate();
+        if (!valid) return;
 
-        this.saveLoading = true
+        this.saveLoading = true;
         // 妯℃嫙API璋冪敤
-        await new Promise(resolve => setTimeout(resolve, 1000))
+        await new Promise(resolve => setTimeout(resolve, 1000));
 
-        this.$message.success(this.isEditing ? '淇濆瓨鎴愬姛' : '鏂板鎴愬姛')
-        this.editDialogVisible = false
-        this.loadData()
+        this.$message.success(this.isEditing ? "淇濆瓨鎴愬姛" : "鏂板鎴愬姛");
+        this.editDialogVisible = false;
+        this.loadData();
       } catch (error) {
-        console.error('淇濆瓨澶辫触:', error)
-        this.$message.error('鎿嶄綔澶辫触')
+        console.error("淇濆瓨澶辫触:", error);
+        this.$message.error("鎿嶄綔澶辫触");
       } finally {
-        this.saveLoading = false
+        this.saveLoading = false;
       }
     },
 
     // 鏂囦欢涓婁紶澶勭悊
     handleFileChange(file, fileList) {
-      this.editForm.attachments = fileList
+      this.editForm.attachments = fileList;
     },
 
     // 鍏抽棴璇︽儏瀵硅瘽妗�
     handleDetailClose() {
-      this.detailDialogVisible = false
-      this.currentRecord = {}
+      this.detailDialogVisible = false;
+      this.currentRecord = {};
     },
 
     // 鍏抽棴缂栬緫瀵硅瘽妗�
     handleEditClose() {
-      this.editDialogVisible = false
-      this.currentRecord = {}
+      this.editDialogVisible = false;
+      this.currentRecord = {};
       this.$nextTick(() => {
-        this.$refs.editForm && this.$refs.editForm.clearValidate()
-      })
+        this.$refs.editForm && this.$refs.editForm.clearValidate();
+      });
     },
 
     // 瀵煎嚭鏁版嵁
     exportData() {
-      this.$message.success('瀵煎嚭鍔熻兘寮�鍙戜腑')
+      this.$message.success("瀵煎嚭鍔熻兘寮�鍙戜腑");
     },
 
     // 鍒嗛〉澶у皬鍙樺寲
     handleSizeChange(size) {
-      this.pagination.pageSize = size
-      this.pagination.currentPage = 1
-      this.loadData()
+      this.pagination.pageSize = size;
+      this.pagination.currentPage = 1;
+      this.loadData();
     },
 
     // 褰撳墠椤靛彉鍖�
     handleCurrentChange(page) {
-      this.pagination.currentPage = page
-      this.loadData()
+      this.pagination.currentPage = page;
+      this.loadData();
     },
 
     // 鎺掑簭鍙樺寲
     handleSortChange(sort) {
-      console.log('鎺掑簭鍙樺寲:', sort)
+      console.log("鎺掑簭鍙樺寲:", sort);
     },
 
-    // 鑾峰彇榛樿琛ㄥ崟鏁版嵁
+    // 鏇存柊榛樿琛ㄥ崟鏁版嵁
     getDefaultFormData() {
       return {
-        title: '',
-        meetingType: '',
+        title: "",
+        meetingType: "",
         participants: [],
-        location: '',
-        startTime: '',
-        endTime: '',
-        summary: '',
-        content: '',
-        attachments: []
-      }
+        location: "",
+        startTime: "",
+        endTime: "",
+        summary: "",
+        content: "",
+        meetingMinutes: "",
+        minutesCreateTime: "",
+        minutesCreator: "",
+        detailAttachments: [],
+        summaryAttachments: [],
+        minutesAttachments: []
+      };
     }
   }
-}
+};
 </script>
 
 <style scoped>
@@ -711,7 +1319,28 @@
 .attachment-item {
   margin-bottom: 8px;
 }
+.minutes-content {
+  margin-bottom: 16px;
+}
 
+.minutes-meta {
+  border-top: 1px solid #e4e7ed;
+  padding-top: 12px;
+}
+
+/* 浼氳绾鏂囨湰鍖哄煙鏍峰紡 */
+.minutes-textarea {
+  font-family: "Monaco", "Menlo", "Ubuntu Mono", monospace;
+  font-size: 13px;
+  line-height: 1.5;
+}
+
+/* 鍝嶅簲寮忚皟鏁� */
+@media (max-width: 768px) {
+  .minutes-content .el-card {
+    margin: 0 -20px;
+  }
+}
 /* 鍝嶅簲寮忚璁� */
 @media (max-width: 768px) {
   .page-header {
@@ -725,4 +1354,115 @@
     justify-content: space-between;
   }
 }
+/* 鏂板闄勪欢鐩稿叧鏍峰紡 */
+.attachment-upload-section {
+  border: 1px solid #ebeef5;
+  border-radius: 4px;
+  padding: 15px;
+  background-color: #fafafa;
+}
+
+.section-title {
+  font-weight: bold;
+  margin-bottom: 8px;
+  color: #303133;
+}
+
+.upload-tip {
+  font-size: 12px;
+  color: #909399;
+  margin-bottom: 10px;
+}
+
+.uploaded-files {
+  margin-top: 10px;
+}
+
+.file-item {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 8px;
+  border-bottom: 1px solid #f0f0f0;
+}
+
+.file-item:last-child {
+  border-bottom: none;
+}
+
+.file-name {
+  flex: 1;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.attachment-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+  gap: 10px;
+}
+
+.file-card {
+  transition: all 0.3s ease;
+}
+
+.file-card:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+}
+
+.file-content {
+  display: flex;
+  align-items: center;
+}
+
+.file-icon {
+  font-size: 24px;
+  color: #409EFF;
+  margin-right: 10px;
+}
+
+.file-info {
+  flex: 1;
+}
+
+.file-name {
+  font-size: 14px;
+  font-weight: 500;
+  margin-bottom: 4px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.file-meta {
+  display: flex;
+  justify-content: space-between;
+  font-size: 12px;
+  color: #909399;
+}
+
+.file-actions {
+  margin-top: 8px;
+  text-align: center;
+}
+
+.file-link {
+  display: flex;
+  align-items: center;
+}
+
+.no-attachment {
+  text-align: center;
+  padding: 20px;
+  color: #909399;
+}
+
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 768px) {
+  .attachment-grid {
+    grid-template-columns: 1fr;
+  }
+}
 </style>

--
Gitblit v1.9.3