From 87e331767b3ce416c957b7336e94b9ba208f0efb Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期四, 16 四月 2026 18:08:31 +0800
Subject: [PATCH] 维护

---
 src/api/officeManagementApi/studies.js       |   37 +
 src/api/officeManagementApi/checkingIn.js    |   29 
 src/views/OfficeRelated/conference/index.vue | 1164 +++++++++++++++++++--------------------
 src/views/business/affirm/affirmInfo.vue     |   13 
 src/api/officeManagementApi/index.js         |   15 
 src/views/business/affirm/index.vue          |    6 
 src/api/officeManagementApi/conference.js    |   25 
 src/views/OfficeRelated/engage/index.vue     |  429 +++++++++-----
 8 files changed, 930 insertions(+), 788 deletions(-)

diff --git a/src/api/officeManagementApi/checkingIn.js b/src/api/officeManagementApi/checkingIn.js
index ccf1855..e42e21d 100644
--- a/src/api/officeManagementApi/checkingIn.js
+++ b/src/api/officeManagementApi/checkingIn.js
@@ -1,25 +1,40 @@
 import request from '@/utils/request'
 
-// 妗堜緥鍒楄〃鍙婅鎯�
-export function meetinglist(data) {
+// 鑰冨嫟鍒楄〃
+export function attendancerecordslist(data) {
   return request({
-    url: '/project/meeting/list',
+    url: '/project/attendancerecords/list',
     method: 'post',
     data: data
   })
 }
 // 鑰冨嫟淇敼
-export function meetingedit(data) {
+export function attendancerecordsedit(data) {
   return request({
-    url: '/project/meeting/edit',
+    url: '/project/attendancerecords/edit',
+    method: 'post',
+    data: data
+  })
+}
+// 鑰冨嫟淇敼
+export function attendancerecordsadd(data) {
+  return request({
+    url: '/project/attendancerecords/add',
     method: 'post',
     data: data
   })
 }
 // 鑰冨嫟璇︽儏
-export function meetingInfo(id) {
+export function attendancerecordsInfo(id) {
   return request({
-    url: '/project/meeting/getInfo/' + id,
+    url: '/project/attendancerecords/getInfo/' + id,
+    method: 'get'
+  })
+}
+// 鍒犻櫎
+export function attendancerecordsDel(id) {
+  return request({
+    url: '/project/attendancerecords/remove/' + id,
     method: 'get'
   })
 }
diff --git a/src/api/officeManagementApi/conference.js b/src/api/officeManagementApi/conference.js
index e250558..f439f42 100644
--- a/src/api/officeManagementApi/conference.js
+++ b/src/api/officeManagementApi/conference.js
@@ -1,6 +1,6 @@
 import request from '@/utils/request'
 
-// 妗堜緥鍒楄〃鍙婅鎯�
+// 浼氳鍒楄〃
 export function meetinglist(data) {
   return request({
     url: '/project/meeting/list',
@@ -16,6 +16,14 @@
     data: data
   })
 }
+// 浼氳绾淇敼
+export function meetingadd(data) {
+  return request({
+    url: '/project/meeting/add',
+    method: 'post',
+    data: data
+  })
+}
 // 浼氳绾璇︽儏
 export function meetingInfo(id) {
   return request({
@@ -23,3 +31,18 @@
     method: 'get'
   })
 }
+// 鍒犻櫎
+export function meetingDel(id) {
+  return request({
+    url: '/project/meeting/remove/' + id,
+    method: 'get'
+  })
+}
+// 瀵煎嚭鎹愮尞鍣ㄥ畼绠$悊
+export function exporremeeting(query) {
+  return request({
+    url: '/project/meeting/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/src/api/officeManagementApi/index.js b/src/api/officeManagementApi/index.js
index 07a8fbe..257ffc7 100644
--- a/src/api/officeManagementApi/index.js
+++ b/src/api/officeManagementApi/index.js
@@ -1,11 +1,4 @@
-export * from "./affirm";
-export * from "./allocation";
-export * from "./appear";
-export * from "./assess";
-export * from "./course";
-export * from "./ethicalReview";
-export * from "./decide";
-export * from "./GetWitness";
-export * from "./maintain";
-export * from "./OrganUtilization";
-export * from "./transfer";
+export * from "./studies";
+export * from "./conference";
+export * from "./checkingIn";
+
diff --git a/src/api/officeManagementApi/studies.js b/src/api/officeManagementApi/studies.js
index 3278538..713e9c3 100644
--- a/src/api/officeManagementApi/studies.js
+++ b/src/api/officeManagementApi/studies.js
@@ -1,25 +1,48 @@
 import request from '@/utils/request'
 
-// 妗堜緥鍒楄〃鍙婅鎯�
-export function meetinglist(data) {
+// 杩涗慨鍒楄〃
+export function recordslist(data) {
   return request({
-    url: '/project/meeting/list',
+    url: '/project/records/list',
     method: 'post',
     data: data
   })
 }
 // 杩涗慨淇敼
-export function meetingedit(data) {
+export function recordsedit(data) {
   return request({
-    url: '/project/meeting/edit',
+    url: '/project/records/edit',
+    method: 'post',
+    data: data
+  })
+}
+// 杩涗慨淇敼
+export function recordsadd(data) {
+  return request({
+    url: '/project/records/add',
     method: 'post',
     data: data
   })
 }
 // 杩涗慨璇︽儏
-export function meetingInfo(id) {
+export function recordsInfo(id) {
   return request({
-    url: '/project/meeting/getInfo/' + id,
+    url: '/project/records/getInfo/' + id,
     method: 'get'
   })
 }
+// 鍒犻櫎
+export function recordsDel(id) {
+  return request({
+    url: '/project/records/remove/' + id,
+    method: 'get'
+  })
+}
+// 瀵煎嚭鎹愮尞鍣ㄥ畼绠$悊
+export function exporrecords(query) {
+  return request({
+    url: '/project/records/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/src/views/OfficeRelated/conference/index.vue b/src/views/OfficeRelated/conference/index.vue
index d7f2b3b..bc55057 100644
--- a/src/views/OfficeRelated/conference/index.vue
+++ b/src/views/OfficeRelated/conference/index.vue
@@ -2,7 +2,6 @@
   <div class="meeting-management">
     <!-- 椤甸潰澶撮儴 -->
     <div class="page-header">
-      <h2>浼氳绠$悊</h2>
       <div class="header-actions">
         <el-button type="primary" icon="el-icon-plus" @click="handleAdd">
           鏂板缓浼氳
@@ -37,7 +36,7 @@
             style="width: 150px"
           />
         </el-form-item>
-        <el-form-item label="鏃堕棿鑼冨洿">
+        <el-form-item label="浼氳寮�濮嬫椂闂磋寖鍥�">
           <el-date-picker
             v-model="queryParams.dateRange"
             type="daterange"
@@ -53,11 +52,22 @@
             clearable
             placeholder="璇烽�夋嫨"
           >
-            <el-option label="寰呭紑濮�" value="pending" />
-            <el-option label="杩涜涓�" value="ongoing" />
-            <el-option label="宸茬粨鏉�" value="completed" />
-            <el-option label="宸插彇娑�" value="cancelled" />
+            <el-option label="寰呭紑濮�" value="1" />
+            <el-option label="杩涜涓�" value="2" />
+            <el-option label="宸茬粨鏉�" value="3" />
+            <el-option label="宸插彇娑�" value="4" />
+            <el-option label="寰呭鏍�" value="0" />
+            <el-option label="宸查�氳繃" value="1" />
+            <el-option label="宸查┏鍥�" value="2" />
           </el-select>
+        </el-form-item>
+        <el-form-item label="浼氳涓婚">
+          <el-input
+            v-model="queryParams.title"
+            placeholder="璇疯緭鍏ヤ細璁富棰�"
+            clearable
+            style="width: 150px"
+          />
         </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="handleQuery">鏌ヨ</el-button>
@@ -75,7 +85,7 @@
         style="width: 100%"
         @sort-change="handleSortChange"
       >
-        <!-- <el-table-column prop="id" label="ID" width="80" fixed /> -->
+        <el-table-column prop="id" label="ID" width="80" fixed align="center" />
         <el-table-column
           prop="title"
           align="center"
@@ -84,7 +94,7 @@
           fixed
         >
           <template #default="scope">
-            <el-button type="text" @click="handleView(scope.row)">
+            <el-button type="text" @click="handleView(scope.row.id)">
               {{ scope.row.title }}
             </el-button>
           </template>
@@ -96,38 +106,32 @@
           width="120"
         >
           <template #default="scope">
-            <el-tag :type="getMeetingTypeTag(scope.row.meetingType)">
-              {{ getMeetingTypeText(scope.row.meetingType) }}
+            <el-tag :type="getMeetingTypeTag(scope.row.typeId)">
+              {{ getMeetingTypeText(scope.row.typeId) }}
             </el-tag>
           </template>
         </el-table-column>
         <el-table-column
           align="center"
-          prop="status"
-          label="鐘舵��"
+          label="浼氳鐘舵��"
           width="100"
           fixed="right"
         >
           <template #default="scope">
-            <el-tag :type="getStatusTag(scope.row.status)">
-              {{ getStatusText(scope.row.status) }}
+            <el-tag :type="getMeetingStatusTag(scope.row.status)">
+              {{ getMeetingStatusText(scope.row.status) }}
             </el-tag>
           </template>
         </el-table-column>
         <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>
+          prop="organizerName"
+          label="缁勭粐鑰�"
+          width="120"
+        />
         <el-table-column
           align="center"
-          prop="location"
+          prop="locationName"
           label="浼氳鍦扮偣"
           width="150"
         />
@@ -176,25 +180,42 @@
               size="mini"
               type="text"
               @click="handleViewMinutes(scope.row)"
-              :disabled="!scope.row.meetingMinutes"
+              :disabled="!scope.row.recordcontent"
             >
-              {{ scope.row.meetingMinutes ? "鏌ョ湅绾" : "鏆傛棤" }}
+              {{ scope.row.recordcontent ? "鏌ョ湅绾" : "鏆傛棤" }}
             </el-button>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="瀹℃牳鐘舵��" width="100">
+          <template #default="scope">
+            <el-tag :type="getApprovalStatusTag(scope.row.approvalStatus)">
+              {{ getApprovalStatusText(scope.row.approvalStatus) }}
+            </el-tag>
           </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)">
+            <el-button
+              size="mini"
+              type="text"
+              @click="handleView(scope.row.id)"
+            >
               鏌ョ湅
             </el-button>
-            <el-button size="mini" type="text" @click="handleEdit(scope.row)">
+            <el-button
+              size="mini"
+              type="text"
+              @click="handleEdit(scope.row.id)"
+              :disabled="scope.row.delFlag === 1"
+            >
               缂栬緫
             </el-button>
             <el-button
               size="mini"
               type="text"
-              @click="handleCopy(scope.row)"
+              @click="handleCopy(scope.row.id)"
               style="color: #67C23A;"
+              :disabled="scope.row.delFlag === 1"
             >
               澶嶅埗
             </el-button>
@@ -203,6 +224,7 @@
               type="text"
               @click="handleDelete(scope.row)"
               style="color: #F56C6C;"
+              :disabled="scope.row.delFlag === 1"
             >
               鍒犻櫎
             </el-button>
@@ -213,22 +235,24 @@
       <!-- 鍒嗛〉 -->
       <div class="pagination-container">
         <el-pagination
-          :current-page="pagination.currentPage"
+          :current-page="pagination.pageNum"
           :page-size="pagination.pageSize"
           :total="pagination.total"
           layout="total, sizes, prev, pager, next, jumper"
+          :page-sizes="[10, 20, 50, 100]"
           @size-change="handleSizeChange"
           @current-change="handleCurrentChange"
         />
       </div>
     </el-card>
 
+    <!-- 浼氳绾瀵硅瘽妗� -->
     <el-dialog
       title="浼氳绾"
       :visible.sync="minutesDialogVisible"
       width="700px"
     >
-      <div v-if="currentRecord.meetingMinutes">
+      <div v-if="currentRecord.recordcontent">
         <el-alert
           title="浼氳绾璇︽儏"
           type="info"
@@ -240,7 +264,7 @@
             <div
               style="white-space: pre-line; line-height: 1.6; max-height: 300px; overflow-y: auto;"
             >
-              {{ currentRecord.meetingMinutes }}
+              {{ currentRecord.recordcontent }}
             </div>
           </el-card>
         </div>
@@ -249,15 +273,15 @@
         <div
           class="minutes-attachments"
           v-if="
-            currentRecord.minutesAttachments &&
-              currentRecord.minutesAttachments.length > 0
+            currentRecord.recordattachment &&
+              parseAttachments(currentRecord.recordattachment).length > 0
           "
         >
           <el-divider content-position="left">浼氳绾闄勪欢</el-divider>
           <div class="attachment-list">
             <div
-              v-for="file in currentRecord.minutesAttachments"
-              :key="file.id"
+              v-for="file in parseAttachments(currentRecord.recordattachment)"
+              :key="file.id || file.name"
               class="attachment-item"
             >
               <el-link
@@ -267,11 +291,13 @@
                 class="file-link"
               >
                 <i
-                  :class="getFileIcon(file.type)"
+                  :class="getFileIcon(file.type || file.name)"
                   style="margin-right: 8px;"
                 ></i>
                 {{ file.name }}
-                <span class="file-size">({{ formatFileSize(file.size) }})</span>
+                <span class="file-size" v-if="file.size"
+                  >({{ formatFileSize(file.size) }})</span
+                >
               </el-link>
             </div>
           </div>
@@ -282,11 +308,10 @@
           style="margin-top: 16px; color: #909399; font-size: 12px;"
         >
           <span
-            >鍒涘缓鏃堕棿:
-            {{ formatDateTime(currentRecord.minutesCreateTime) }}</span
+            >璁板綍鏃堕棿: {{ formatDateTime(currentRecord.recorderTime) }}</span
           >
           <span style="margin-left: 16px;"
-            >鍒涘缓浜�: {{ currentRecord.minutesCreator || "绯荤粺" }}</span
+            >璁板綍浜�: {{ currentRecord.recorderBy || "鏈寚瀹�" }}</span
           >
         </div>
       </div>
@@ -297,13 +322,14 @@
         <el-button @click="minutesDialogVisible = false">鍏抽棴</el-button>
         <el-button
           type="primary"
-          @click="handleEdit(currentRecord)"
-          v-if="currentRecord.meetingMinutes"
+          @click="handleEdit(currentRecord.id)"
+          v-if="currentRecord.recordcontent"
         >
           缂栬緫绾
         </el-button>
       </span>
     </el-dialog>
+
     <!-- 鏌ョ湅璇︽儏瀵硅瘽妗� -->
     <el-dialog
       :title="`浼氳璇︽儏 - ${currentRecord.title || ''}`"
@@ -311,34 +337,29 @@
       width="800px"
       :before-close="handleDetailClose"
     >
-      <el-descriptions :column="2" border v-if="currentRecord">
+      <el-descriptions :column="2" border v-if="currentRecord.id">
+        <el-descriptions-item label="浼氳缂栧彿">{{
+          currentRecord.meetingNumber
+        }}</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) }}
+          <el-tag :type="getMeetingTypeTag(currentRecord.typeId)">
+            {{ getMeetingTypeText(currentRecord.typeId) }}
           </el-tag>
         </el-descriptions-item>
-        <el-descriptions-item label="鍙備細浜哄憳" :span="2">
-          <el-tag
-            v-for="participant in currentRecord.participants"
-            :key="participant"
-            type="info"
-            size="small"
-            style="margin-right: 8px; margin-bottom: 8px;"
-          >
-            {{ participant }}
-          </el-tag>
-        </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 :type="getMeetingStatusTag(currentRecord.status)">
+            {{ getMeetingStatusText(currentRecord.status) }}
           </el-tag>
         </el-descriptions-item>
+        <el-descriptions-item label="缁勭粐鑰�">{{
+          currentRecord.organizerName || currentRecord.createBy
+        }}</el-descriptions-item>
+        <el-descriptions-item label="浼氳鍦扮偣">{{
+          currentRecord.locationName || currentRecord.locationId
+        }}</el-descriptions-item>
         <el-descriptions-item label="寮�濮嬫椂闂�">{{
           formatDateTime(currentRecord.startTime)
         }}</el-descriptions-item>
@@ -348,57 +369,62 @@
         <el-descriptions-item label="鎸佺画鏃堕棿">{{
           calculateDuration(currentRecord)
         }}</el-descriptions-item>
-        <el-descriptions-item label="鍒涘缓浜�">{{
-          currentRecord.creator
+        <el-descriptions-item label="瀹℃牳鐘舵��">
+          <el-tag :type="getApprovalStatusTag(currentRecord.approvalStatus)">
+            {{ getApprovalStatusText(currentRecord.approvalStatus) }}
+          </el-tag>
+        </el-descriptions-item>
+        <el-descriptions-item label="瀹℃牳浜�">{{
+          currentRecord.approverBy || "鏈鏍�"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="瀹℃牳鏃堕棿">{{
+          currentRecord.approvalTime
+            ? formatDateTime(currentRecord.approvalTime)
+            : "鏈鏍�"
         }}</el-descriptions-item>
         <el-descriptions-item label="浼氳姒傝" :span="2">
           {{ currentRecord.summary }}
         </el-descriptions-item>
         <el-descriptions-item label="浼氳鍐呭" :span="2">
           <div
+            v-html="currentRecord.content"
             style="white-space: pre-line; max-height: 300px; overflow-y: auto;"
-          >
-            {{ currentRecord.content }}
-          </div>
+          ></div>
         </el-descriptions-item>
-        <el-descriptions-item label="浼氳璇︽儏闄勪欢" :span="2">
+
+        <!-- 浼氳闄勪欢 -->
+        <el-descriptions-item label="浼氳闄勪欢" :span="2">
           <div class="detail-attachments">
             <div
               v-if="
-                currentRecord.detailAttachments &&
-                  currentRecord.detailAttachments.length > 0
+                currentRecord.attachment &&
+                  parseAttachments(currentRecord.attachment).length > 0
               "
               class="attachment-grid"
             >
               <div
-                v-for="file in currentRecord.detailAttachments"
-                :key="file.id"
+                v-for="file in parseAttachments(currentRecord.attachment)"
+                :key="file.id || file.name"
                 class="attachment-card"
               >
                 <el-card shadow="hover" class="file-card">
                   <div class="file-content">
-                    <i :class="getFileIcon(file.type)" class="file-icon"></i>
+                    <i
+                      :class="getFileIcon(file.type || file.name)"
+                      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">{{
+                        <span class="file-size" v-if="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
-                    >
+                  <div class="file-actions" v-if="file.url">
                     <el-button
                       type="text"
                       size="mini"
@@ -410,61 +436,37 @@
               </div>
             </div>
             <div v-else class="no-attachment">
-              <el-empty
-                description="鏆傛棤浼氳璇︽儏闄勪欢"
-                :image-size="50"
-              ></el-empty>
+              <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-item label="鍒涘缓浜�">{{
+          currentRecord.createBy
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鍒涘缓鏃堕棿">{{
+          formatDateTime(currentRecord.createTime)
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鏇存柊浜�">{{
+          currentRecord.updateBy
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鏇存柊鏃堕棿">{{
+          formatDateTime(currentRecord.updateTime)
+        }}</el-descriptions-item>
+        <el-descriptions-item label="澶囨敞" :span="2">{{
+          currentRecord.remark || "鏃�"
+        }}</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.id)"
+          :disabled="currentRecord.delFlag === 1"
         >
+          缂栬緫
+        </el-button>
       </span>
     </el-dialog>
 
@@ -486,143 +488,33 @@
           <el-input v-model="editForm.title" placeholder="璇疯緭鍏ヤ細璁富棰�" />
         </el-form-item>
 
-        <el-form-item label="浼氳绫诲瀷" prop="meetingType">
+        <el-form-item label="浼氳绫诲瀷" prop="typeId">
           <el-select
-            v-model="editForm.meetingType"
+            v-model="editForm.typeId"
             placeholder="璇烽�夋嫨浼氳绫诲瀷"
             style="width: 100%"
           >
-            <el-option label="绉戠爺浼氳" value="research" />
-            <el-option label="鏃ュ父浼氳" value="daily" />
-            <el-option label="椤圭洰浼氳" value="project" />
-            <el-option label="閮ㄩ棬浼氳" value="department" />
-            <el-option label="璇勫浼氳" value="review" />
+            <el-option label="绉戠爺浼氳" :value="1" />
+            <el-option label="鏃ュ父浼氳" :value="2" />
+            <el-option label="椤圭洰浼氳" :value="3" />
+            <el-option label="閮ㄩ棬浼氳" :value="4" />
+            <el-option label="璇勫浼氳" :value="5" />
           </el-select>
         </el-form-item>
 
-        <el-form-item label="鍙備細浜哄憳" prop="participants">
+        <el-form-item label="浼氳鍦扮偣" prop="locationId">
           <el-select
-            v-model="editForm.participants"
-            multiple
-            filterable
-            placeholder="璇烽�夋嫨鍙備細浜哄憳"
+            v-model="editForm.locationId"
+            placeholder="璇烽�夋嫨浼氳鍦扮偣"
             style="width: 100%"
           >
-            <el-option
-              v-for="user in userList"
-              :key="user.id"
-              :label="user.name"
-              :value="user.name"
-            />
+            <el-option label="绗竴浼氳瀹�" :value="1" />
+            <el-option label="绗簩浼氳瀹�" :value="2" />
+            <el-option label="绗笁浼氳瀹�" :value="3" />
+            <el-option label="绾夸笂浼氳" :value="4" />
           </el-select>
         </el-form-item>
 
-        <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">
@@ -648,6 +540,19 @@
           </el-col>
         </el-row>
 
+        <el-form-item label="鎻愬墠鎻愰啋" prop="reminderMinutes">
+          <el-input-number
+            v-model="editForm.reminderMinutes"
+            :min="0"
+            :max="1440"
+            :step="5"
+            controls-position="right"
+            style="width: 100%"
+          >
+            <template #append>鍒嗛挓</template>
+          </el-input-number>
+        </el-form-item>
+
         <el-form-item label="浼氳姒傝" prop="summary">
           <el-input
             v-model="editForm.summary"
@@ -664,20 +569,79 @@
             v-model="editForm.content"
             type="textarea"
             :rows="6"
-            placeholder="璇疯緭鍏ヤ細璁叿浣撳唴瀹�"
+            placeholder="璇疯緭鍏ヤ細璁叿浣撳唴瀹癸紙鏀寔HTML鏍煎紡锛�"
           />
         </el-form-item>
 
-        <!-- 浼氳绾闄勪欢涓婁紶 -->
-        <el-form-item label="浼氳绾闄勪欢">
+        <el-form-item label="浼氳闄勪欢">
+          <div class="attachment-upload-section">
+            <div class="upload-tip">涓婁紶浼氳鐩稿叧璧勬枡鏂囦欢</div>
+            <el-upload
+              class="attachment-upload"
+              action="#"
+              :auto-upload="false"
+              :on-change="handleAttachmentChange"
+              :file-list="editForm.attachmentFiles"
+              :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.attachmentFiles && editForm.attachmentFiles.length > 0
+              "
+              class="uploaded-files"
+            >
+              <div
+                v-for="(file, index) in editForm.attachmentFiles"
+                :key="file.uid || index"
+                class="file-item"
+              >
+                <span class="file-name">{{ file.name }}</span>
+                <el-button
+                  type="text"
+                  size="mini"
+                  @click="handleRemoveAttachmentFile(index)"
+                  style="color: #F56C6C;"
+                >
+                  鍒犻櫎
+                </el-button>
+              </div>
+            </div>
+          </div>
+        </el-form-item>
+
+        <el-divider>浼氳绾锛堝彲浼氬悗琛ュ厖锛�</el-divider>
+
+        <el-form-item label="绾鍐呭" prop="recordcontent">
+          <el-input
+            v-model="editForm.recordcontent"
+            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-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"
+              :on-change="handleMinutesAttachmentChange"
+              :file-list="editForm.recordattachmentFiles"
               :limit="5"
               multiple
             >
@@ -690,18 +654,14 @@
             </el-upload>
           </div>
         </el-form-item>
-        <el-form-item label="浼氳绾" prop="meetingMinutes">
+
+        <el-form-item label="澶囨敞" prop="remark">
           <el-input
-            v-model="editForm.meetingMinutes"
+            v-model="editForm.remark"
             type="textarea"
-            :rows="6"
-            placeholder="璇疯緭鍏ヤ細璁邯瑕佸唴瀹癸紝鍖呮嫭浼氳鍐宠銆佽鍔ㄨ鍒掋�佽矗浠讳汉绛変俊鎭�"
-            maxlength="1000"
-            show-word-limit
+            :rows="2"
+            placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
           />
-          <div style="color: #909399; font-size: 12px; margin-top: 4px;">
-            鎻愮ず锛氬彲璁板綍浼氳璁ㄨ瑕佺偣銆佸喅璁簨椤广�佽鍔ㄨ鍒掔瓑
-          </div>
         </el-form-item>
       </el-form>
 
@@ -716,12 +676,22 @@
 </template>
 
 <script>
+import {
+  meetinglist,
+  meetingedit,
+  meetingadd,
+  meetingInfo,
+  meetingDel,
+  exporremeeting
+} from "@/api/officeManagementApi";
+
 export default {
   name: "MeetingManagement",
   data() {
     return {
       // 鏌ヨ鍙傛暟
       queryParams: {
+        title: "",
         meetingType: "",
         location: "",
         dateRange: [],
@@ -729,7 +699,7 @@
       },
       // 鍒嗛〉鍙傛暟
       pagination: {
-        currentPage: 1,
+        pageNum: 1,
         pageSize: 10,
         total: 0
       },
@@ -739,51 +709,23 @@
       // 瀵硅瘽妗嗘樉绀虹姸鎬�
       detailDialogVisible: false,
       editDialogVisible: false,
+      minutesDialogVisible: false,
       // 褰撳墠鎿嶄綔璁板綍
       currentRecord: {},
       // 缂栬緫鐘舵��
       isEditing: false,
       // 琛ㄦ牸鏁版嵁
       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: "鍚村崄" }
-      ],
-      minutesDialogVisible: false, // 浼氳绾瀵硅瘽妗嗘樉绀虹姸鎬�
-
       // 缂栬緫琛ㄥ崟鏁版嵁
-      editForm: {
-        title: "",
-        meetingType: "",
-        participants: [],
-        location: "",
-        startTime: "",
-        endTime: "",
-        summary: "",
-        content: "",
-        attachments: [],
-        detailAttachments: [], // 浼氳璇︽儏闄勪欢
-        summaryAttachments: [], // 浼氳姒傝闄勪欢
-        minutesAttachments: [] // 浼氳绾闄勪欢
-      },
+      editForm: this.getDefaultFormData(),
       // 琛ㄥ崟楠岃瘉瑙勫垯
       editRules: {
         title: [{ required: true, message: "璇疯緭鍏ヤ細璁富棰�", trigger: "blur" }],
-        meetingType: [
+        typeId: [
           { required: true, message: "璇烽�夋嫨浼氳绫诲瀷", trigger: "change" }
         ],
-        participants: [
-          { required: true, message: "璇烽�夋嫨鍙備細浜哄憳", trigger: "change" }
-        ],
-        location: [
-          { required: true, message: "璇疯緭鍏ヤ細璁湴鐐�", trigger: "blur" }
+        locationId: [
+          { required: true, message: "璇烽�夋嫨浼氳鍦扮偣", trigger: "change" }
         ],
         startTime: [
           { required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change" }
@@ -797,12 +739,8 @@
         content: [
           { required: true, message: "璇疯緭鍏ヤ細璁唴瀹�", trigger: "blur" }
         ],
-        meetingMinutes: [
-          {
-            max: 1000,
-            message: "浼氳绾闀垮害涓嶈兘瓒呰繃1000涓瓧绗�",
-            trigger: "blur"
-          }
+        reminderMinutes: [
+          { required: true, message: "璇疯緭鍏ユ彁鍓嶆彁閱掓椂闂�", trigger: "blur" }
         ]
       }
     };
@@ -815,12 +753,29 @@
     async loadData() {
       this.loading = true;
       try {
-        // 妯℃嫙API璋冪敤
-        await new Promise(resolve => setTimeout(resolve, 500));
+        const params = {
+          pageNum: this.pagination.pageNum,
+          pageSize: this.pagination.pageSize,
+          ...this.queryParams
+        };
 
-        // 鐢熸垚妯℃嫙鏁版嵁
-        this.tableData = this.generateMockData();
-        this.pagination.total = this.tableData.length;
+        // 澶勭悊鏃堕棿鑼冨洿鏌ヨ
+        if (
+          this.queryParams.dateRange &&
+          this.queryParams.dateRange.length === 2
+        ) {
+          params.startTime = this.queryParams.dateRange[0];
+          params.endTime = this.queryParams.dateRange[1];
+        }
+
+        const response = await meetinglist(params);
+
+        if (response.code === 200) {
+          this.tableData = response.rows || [];
+          this.pagination.total = response.total || 0;
+        } else {
+          this.$message.error(response.msg || "鑾峰彇鏁版嵁澶辫触");
+        }
       } catch (error) {
         console.error("鍔犺浇鏁版嵁澶辫触:", error);
         this.$message.error("鏁版嵁鍔犺浇澶辫触");
@@ -828,7 +783,14 @@
         this.loading = false;
       }
     },
-    getFileIcon(fileType) {
+
+    // 鑾峰彇鏂囦欢鍥炬爣
+    getFileIcon(fileName) {
+      if (!fileName) return "el-icon-document";
+      const ext = fileName
+        .split(".")
+        .pop()
+        .toLowerCase();
       const iconMap = {
         pdf: "el-icon-document",
         doc: "el-icon-document",
@@ -844,227 +806,99 @@
         zip: "el-icon-folder",
         rar: "el-icon-folder"
       };
-      return iconMap[fileType] || "el-icon-document";
+      return iconMap[ext] || "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 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 = [];
-        for (let i = 0; i < participantCount; i++) {
-          const randomIndex = Math.floor(
-            Math.random() * participantsPool.length
-          );
-          participants.push(participantsPool[randomIndex]);
+    // 瑙f瀽闄勪欢JSON
+    parseAttachments(attachmentJson) {
+      if (!attachmentJson) return [];
+      try {
+        if (typeof attachmentJson === "string") {
+          return JSON.parse(attachmentJson);
         }
-
-        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 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)
-            ]
-          }鐨勪細璁甡,
-           // 娣诲姞鍒嗙被鍨嬮檮浠�
-          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)
-          ],
-          startTime: startTime.toISOString(),
-          endTime: endTime.toISOString(),
-          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: "绯荤粺绠$悊鍛�",
-          attachments: []
-        };
-      });
+        return attachmentJson;
+      } catch (error) {
+        console.error("瑙f瀽闄勪欢澶辫触:", error);
+        return [];
+      }
     },
 
     // 鑾峰彇浼氳绫诲瀷鏍囩鏍峰紡
-    getMeetingTypeTag(type) {
+    getMeetingTypeTag(typeId) {
       const typeMap = {
-        research: "primary",
-        daily: "success",
-        project: "warning",
-        department: "info",
-        review: "danger"
+        1: "primary", // 绉戠爺浼氳
+        2: "success", // 鏃ュ父浼氳
+        3: "warning", // 椤圭洰浼氳
+        4: "info", // 閮ㄩ棬浼氳
+        5: "danger" // 璇勫浼氳
       };
-      return typeMap[type] || "info";
+      return typeMap[typeId] || "info";
     },
 
     // 鑾峰彇浼氳绫诲瀷鏂囨湰
-    getMeetingTypeText(type) {
+    getMeetingTypeText(typeId) {
       const textMap = {
-        research: "绉戠爺浼氳",
-        daily: "鏃ュ父浼氳",
-        project: "椤圭洰浼氳",
-        department: "閮ㄩ棬浼氳",
-        review: "璇勫浼氳"
+        1: "绉戠爺浼氳",
+        2: "鏃ュ父浼氳",
+        3: "椤圭洰浼氳",
+        4: "閮ㄩ棬浼氳",
+        5: "璇勫浼氳"
       };
-      return textMap[type] || type;
+      return textMap[typeId] || "鍏朵粬";
     },
 
-    // 鑾峰彇鐘舵�佹爣绛炬牱寮�
-    getStatusTag(status) {
+    // 鑾峰彇浼氳鐘舵�佹爣绛炬牱寮�
+    getMeetingStatusTag(status) {
       const statusMap = {
-        pending: "primary",
-        ongoing: "success",
-        completed: "info",
-        cancelled: "danger"
+        1: "primary", // 寰呭紑濮�
+        2: "success", // 杩涜涓�
+        3: "info", // 宸茬粨鏉�
+        4: "danger" // 宸插彇娑�
       };
       return statusMap[status] || "info";
     },
 
-    // 鑾峰彇鐘舵�佹枃鏈�
-    getStatusText(status) {
+    // 鑾峰彇浼氳鐘舵�佹枃鏈�
+    getMeetingStatusText(status) {
       const textMap = {
-        pending: "寰呭紑濮�",
-        ongoing: "杩涜涓�",
-        completed: "宸茬粨鏉�",
-        cancelled: "宸插彇娑�"
+        1: "寰呭紑濮�",
+        2: "杩涜涓�",
+        3: "宸茬粨鏉�",
+        4: "宸插彇娑�"
       };
-      return textMap[status] || status;
+      return textMap[status] || "鏈煡";
+    },
+
+    // 鑾峰彇瀹℃牳鐘舵�佹爣绛炬牱寮�
+    getApprovalStatusTag(status) {
+      const statusMap = {
+        0: "warning", // 寰呭鏍�
+        1: "success", // 宸查�氳繃
+        2: "danger" // 宸查┏鍥�
+      };
+      return statusMap[status] || "info";
+    },
+
+    // 鑾峰彇瀹℃牳鐘舵�佹枃鏈�
+    getApprovalStatusText(status) {
+      const textMap = {
+        0: "寰呭鏍�",
+        1: "宸查�氳繃",
+        2: "宸查┏鍥�"
+      };
+      return textMap[status] || "鏈鏍�";
     },
 
     // 鏍煎紡鍖栨棩鏈熸椂闂�
     formatDateTime(dateTime) {
       if (!dateTime) return "";
-      const date = new Date(dateTime);
-      return date.toLocaleString("zh-CN");
+      return dateTime.replace("T", " ");
     },
 
     // 璁$畻浼氳鎸佺画鏃堕棿
@@ -1083,28 +917,48 @@
       }
     },
 
+    // 鏍煎紡鍖栨枃浠跺ぇ灏�
+    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];
+    },
+
     // 鏌ヨ澶勭悊
     handleQuery() {
-      this.pagination.currentPage = 1;
+      this.pagination.pageNum = 1;
       this.loadData();
     },
 
     // 閲嶇疆鏌ヨ
     handleReset() {
       this.queryParams = {
+        title: "",
         meetingType: "",
         location: "",
         dateRange: [],
         status: ""
       };
-      this.pagination.currentPage = 1;
+      this.pagination.pageNum = 1;
       this.loadData();
     },
 
     // 鏌ョ湅璇︽儏
-    handleView(record) {
-      this.currentRecord = { ...record };
-      this.detailDialogVisible = true;
+    async handleView(id) {
+      try {
+        const response = await meetingInfo(id);
+        if (response.code === 200) {
+          this.currentRecord = response.data || {};
+          this.detailDialogVisible = true;
+        } else {
+          this.$message.error(response.msg || "鑾峰彇璇︽儏澶辫触");
+        }
+      } catch (error) {
+        console.error("鑾峰彇璇︽儏澶辫触:", error);
+        this.$message.error("鑾峰彇璇︽儏澶辫触");
+      }
     },
 
     // 鏂板璁板綍
@@ -1118,114 +972,200 @@
     },
 
     // 缂栬緫璁板綍
-    handleEdit(record) {
-      this.isEditing = true;
-      this.currentRecord = record;
-      this.editForm = { ...record };
-      this.editDialogVisible = true;
-      this.detailDialogVisible = false;
-      this.$nextTick(() => {
-        this.$refs.editForm && this.$refs.editForm.clearValidate();
-      });
+    async handleEdit(id) {
+      try {
+        const response = await meetingInfo(id);
+        if (response.code === 200) {
+          this.isEditing = true;
+          this.currentRecord = response.data || {};
+          this.editForm = { ...response.data };
+
+          // 瑙f瀽闄勪欢
+          if (this.editForm.attachment) {
+            this.editForm.attachmentFiles = this.parseAttachments(
+              this.editForm.attachment
+            );
+          }
+          if (this.editForm.recordattachment) {
+            this.editForm.recordattachmentFiles = this.parseAttachments(
+              this.editForm.recordattachment
+            );
+          }
+
+          this.editDialogVisible = true;
+          this.detailDialogVisible = false;
+          this.$nextTick(() => {
+            this.$refs.editForm && this.$refs.editForm.clearValidate();
+          });
+        } else {
+          this.$message.error(response.msg || "鑾峰彇璁板綍澶辫触");
+        }
+      } catch (error) {
+        console.error("鑾峰彇璁板綍澶辫触:", error);
+        this.$message.error("鑾峰彇璁板綍澶辫触");
+      }
     },
 
     // 澶嶅埗璁板綍
-    handleCopy(record) {
-      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();
-      });
+    async handleCopy(id) {
+      try {
+        const response = await meetingInfo(id);
+        if (response.code === 200) {
+          this.isEditing = false;
+          const copiedRecord = { ...response.data };
+
+          // 绉婚櫎ID锛岀敓鎴愭柊璁板綍
+          delete copiedRecord.id;
+          delete copiedRecord.meetingNumber;
+          copiedRecord.title = copiedRecord.title + "锛堝鍒讹級";
+          copiedRecord.parentMeetingId = id;
+
+          // 瑙f瀽闄勪欢
+          if (copiedRecord.attachment) {
+            copiedRecord.attachmentFiles = this.parseAttachments(
+              copiedRecord.attachment
+            );
+          }
+          if (copiedRecord.recordattachment) {
+            copiedRecord.recordattachmentFiles = this.parseAttachments(
+              copiedRecord.recordattachment
+            );
+          }
+
+          this.editForm = copiedRecord;
+          this.editDialogVisible = true;
+          this.$nextTick(() => {
+            this.$refs.editForm && this.$refs.editForm.clearValidate();
+          });
+        } else {
+          this.$message.error(response.msg || "鑾峰彇璁板綍澶辫触");
+        }
+      } catch (error) {
+        console.error("鑾峰彇璁板綍澶辫触:", error);
+        this.$message.error("鑾峰彇璁板綍澶辫触");
+      }
     },
 
     // 鍒犻櫎璁板綍
-    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;
+    async handleDelete(record) {
+      try {
+        await this.$confirm("纭畾瑕佸垹闄よ繖鏉′細璁褰曞悧锛�", "鎻愮ず", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        });
+
+        const response = await meetingDel(record.id);
+        if (response.code === 200) {
           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];
+          this.loadData();
+        } else {
+          this.$message.error(response.msg || "鍒犻櫎澶辫触");
+        }
+      } catch (error) {
+        if (error !== "cancel") {
+          console.error("鍒犻櫎澶辫触:", error);
+          this.$message.error("鍒犻櫎澶辫触");
+        }
+      }
     },
 
-    // 鍒嗙被鍨嬫枃浠朵笂浼犲鐞�
-    handleDetailFileChange(file, fileList) {
-      this.editForm.detailAttachments = fileList;
+    // 鏂囦欢涓婁紶澶勭悊
+    handleAttachmentChange(file, fileList) {
+      this.editForm.attachmentFiles = fileList;
     },
 
-    handleSummaryFileChange(file, fileList) {
-      this.editForm.summaryAttachments = fileList;
-    },
-
-    handleMinutesFileChange(file, fileList) {
-      this.editForm.minutesAttachments = fileList;
+    handleMinutesAttachmentChange(file, fileList) {
+      this.editForm.recordattachmentFiles = fileList;
     },
 
     // 鍒犻櫎宸蹭笂浼犵殑鏂囦欢
-    handleRemoveDetailFile(index) {
-      this.editForm.detailAttachments.splice(index, 1);
+    handleRemoveAttachmentFile(index) {
+      this.editForm.attachmentFiles.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}`);
+      if (file.url) {
+        const link = document.createElement("a");
+        link.href = file.url;
+        link.download = file.name;
+        link.click();
+        this.$message.success(`寮�濮嬩笅杞�: ${file.name}`);
+      } else {
+        this.$message.warning("鏂囦欢鍦板潃涓嶅瓨鍦�");
+      }
     },
+
     // 淇濆瓨璁板綍
     async handleSave() {
       try {
         const valid = await this.$refs.editForm.validate();
         if (!valid) return;
 
-        this.saveLoading = true;
-        // 妯℃嫙API璋冪敤
-        await new Promise(resolve => setTimeout(resolve, 1000));
+        // 楠岃瘉鏃堕棿
+        if (this.editForm.startTime && this.editForm.endTime) {
+          if (
+            new Date(this.editForm.endTime) <= new Date(this.editForm.startTime)
+          ) {
+            this.$message.error("缁撴潫鏃堕棿蹇呴』鏅氫簬寮�濮嬫椂闂�");
+            return;
+          }
+        }
 
-        this.$message.success(this.isEditing ? "淇濆瓨鎴愬姛" : "鏂板鎴愬姛");
-        this.editDialogVisible = false;
-        this.loadData();
+        this.saveLoading = true;
+
+        // 澶勭悊闄勪欢
+        const formData = { ...this.editForm };
+
+        if (formData.attachmentFiles) {
+          formData.attachment = JSON.stringify(
+            formData.attachmentFiles.map(file => ({
+              name: file.name,
+              url: file.url || "",
+              size: file.size || 0,
+              type: file.type || file.name.split(".").pop()
+            }))
+          );
+        }
+
+        if (formData.recordattachmentFiles) {
+          formData.recordattachment = JSON.stringify(
+            formData.recordattachmentFiles.map(file => ({
+              name: file.name,
+              url: file.url || "",
+              size: file.size || 0,
+              type: file.type || file.name.split(".").pop()
+            }))
+          );
+        }
+
+        // 娓呯悊鏂囦欢鍒楄〃瀛楁
+        delete formData.attachmentFiles;
+        delete formData.recordattachmentFiles;
+
+        let response;
+        if (this.isEditing) {
+          response = await meetingedit(formData);
+        } else {
+          response = await meetingadd(formData);
+        }
+
+        if (response.code === 200) {
+          this.$message.success(this.isEditing ? "淇濆瓨鎴愬姛" : "鏂板鎴愬姛");
+          this.editDialogVisible = false;
+          this.loadData();
+        } else {
+          this.$message.error(
+            response.msg || (this.isEditing ? "淇濆瓨澶辫触" : "鏂板澶辫触")
+          );
+        }
       } catch (error) {
         console.error("淇濆瓨澶辫触:", error);
-        this.$message.error("鎿嶄綔澶辫触");
+        this.$message.error(this.isEditing ? "淇濆瓨澶辫触" : "鏂板澶辫触");
       } finally {
         this.saveLoading = false;
       }
-    },
-
-    // 鏂囦欢涓婁紶澶勭悊
-    handleFileChange(file, fileList) {
-      this.editForm.attachments = fileList;
     },
 
     // 鍏抽棴璇︽儏瀵硅瘽妗�
@@ -1238,6 +1178,7 @@
     handleEditClose() {
       this.editDialogVisible = false;
       this.currentRecord = {};
+      this.editForm = this.getDefaultFormData();
       this.$nextTick(() => {
         this.$refs.editForm && this.$refs.editForm.clearValidate();
       });
@@ -1245,19 +1186,28 @@
 
     // 瀵煎嚭鏁版嵁
     exportData() {
-      this.$message.success("瀵煎嚭鍔熻兘寮�鍙戜腑");
+      const queryParams = this.queryParams;
+      this.$modal
+        .confirm("鏄惁纭瀵煎嚭鎵�鏈変細璁邯瑕佹暟鎹」锛�")
+        .then(() => {
+          return exporremeeting(queryParams);
+        })
+        .then(response => {
+          this.$download.name(response.msg);
+        })
+        .catch(() => {});
     },
 
     // 鍒嗛〉澶у皬鍙樺寲
     handleSizeChange(size) {
       this.pagination.pageSize = size;
-      this.pagination.currentPage = 1;
+      this.pagination.pageNum = 1;
       this.loadData();
     },
 
     // 褰撳墠椤靛彉鍖�
     handleCurrentChange(page) {
-      this.pagination.currentPage = page;
+      this.pagination.pageNum = page;
       this.loadData();
     },
 
@@ -1266,23 +1216,30 @@
       console.log("鎺掑簭鍙樺寲:", sort);
     },
 
-    // 鏇存柊榛樿琛ㄥ崟鏁版嵁
+    // 鑾峰彇榛樿琛ㄥ崟鏁版嵁
     getDefaultFormData() {
       return {
+        id: null,
         title: "",
-        meetingType: "",
-        participants: [],
-        location: "",
+        typeId: null,
+        locationId: null,
         startTime: "",
         endTime: "",
         summary: "",
         content: "",
-        meetingMinutes: "",
-        minutesCreateTime: "",
-        minutesCreator: "",
-        detailAttachments: [],
-        summaryAttachments: [],
-        minutesAttachments: []
+        attachment: null,
+        attachmentFiles: [],
+        status: 1, // 榛樿寰呭紑濮�
+        isRecurring: 0,
+        recurringPattern: null,
+        parentMeetingId: null,
+        reminderMinutes: 30,
+        recordcontent: "",
+        recordattachment: null,
+        recordattachmentFiles: [],
+        recorderBy: "",
+        remark: "",
+        approvalStatus: 0 // 榛樿寰呭鏍�
       };
     }
   }
@@ -1326,13 +1283,6 @@
 .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;
 }
 
 /* 鍝嶅簲寮忚皟鏁� */
@@ -1419,7 +1369,7 @@
 
 .file-icon {
   font-size: 24px;
-  color: #409EFF;
+  color: #409eff;
   margin-right: 10px;
 }
 
diff --git a/src/views/OfficeRelated/engage/index.vue b/src/views/OfficeRelated/engage/index.vue
index 041216e..566998f 100644
--- a/src/views/OfficeRelated/engage/index.vue
+++ b/src/views/OfficeRelated/engage/index.vue
@@ -2,7 +2,6 @@
   <div class="training-management">
     <!-- 椤甸潰澶撮儴 -->
     <div class="page-header">
-      <h2>杩涗慨绠$悊</h2>
       <div class="header-actions">
         <el-button type="primary" icon="el-icon-plus" @click="handleAdd">
           鏂板杩涗慨璁板綍
@@ -69,15 +68,15 @@
         <el-table-column prop="id" label="ID" width="80" fixed />
         <el-table-column prop="name" label="濮撳悕" width="100" fixed>
           <template #default="scope">
-            <el-button type="text" @click="handleView(scope.row)">
+            <el-button type="text" @click="handleView(scope.row.id)">
               {{ scope.row.name }}
             </el-button>
           </template>
         </el-table-column>
-        <el-table-column prop="gender" label="鎬у埆" width="80">
+        <el-table-column prop="sex" label="鎬у埆" width="80">
           <template #default="scope">
-            <el-tag :type="scope.row.gender === '鐢�' ? 'primary' : 'danger'" size="small">
-              {{ scope.row.gender }}
+            <el-tag :type="scope.row.sex === '鐢�' ? 'primary' : 'danger'" size="small">
+              {{ scope.row.sex }}
             </el-tag>
           </template>
         </el-table-column>
@@ -90,38 +89,54 @@
             </el-tag>
           </template>
         </el-table-column>
-                <el-table-column prop="trainingStartDate" label="杩涗慨寮�濮嬫椂闂�" width="120" />
-        <el-table-column prop="trainingEndDate" label="杩涗慨缁撴潫鏃堕棿" width="120" />
+        <el-table-column prop="trainingStartDate" label="杩涗慨寮�濮嬫椂闂�" width="120">
+          <template #default="scope">
+            {{ formatDate(scope.row.trainingStartDate) }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="trainingEndDate" label="杩涗慨缁撴潫鏃堕棿" width="120">
+          <template #default="scope">
+            {{ formatDate(scope.row.trainingEndDate) }}
+          </template>
+        </el-table-column>
         <el-table-column prop="trainingMajor" label="杩涗慨涓撲笟" width="120" />
         <el-table-column prop="idCard" label="韬唤璇佸彿" width="180" show-overflow-tooltip />
         <el-table-column prop="technicalTitle" label="鎶�鏈亴绉�" width="120" />
-        <el-table-column prop="professionalField" label="浠庝簨涓撲笟" width="120" />
+        <el-table-column prop="profession" label="浠庝簨涓撲笟" width="120" />
         <el-table-column prop="workYears" label="宸ヤ綔骞撮檺" width="100" sortable />
-        <el-table-column prop="graduateSchool" label="姣曚笟闄㈡牎" width="150" show-overflow-tooltip />
+        <el-table-column prop="graduationSchool" label="姣曚笟闄㈡牎" width="150" show-overflow-tooltip />
         <el-table-column prop="workUnit" label="鎵�鍦ㄥ崟浣�" width="150" show-overflow-tooltip />
 
-        <el-table-column prop="status" label="鐘舵��" width="100" fixed="right">
+        <el-table-column prop="recordStatus" label="鐘舵��" width="100" fixed="right">
           <template #default="scope">
-            <el-tag :type="getStatusTag(scope.row.status)">
-              {{ scope.row.status }}
+            <el-tag :type="getStatusTag(scope.row.recordStatus)">
+              {{ scope.row.recordStatus || '杩涜涓�' }}
             </el-tag>
           </template>
         </el-table-column>
         <el-table-column label="鎿嶄綔" width="180" fixed="right">
           <template #default="scope">
-            <el-button size="mini" type="text" @click="handleView(scope.row)">
+            <el-button size="mini" type="text" @click="handleView(scope.row.id)">
               鏌ョ湅
             </el-button>
-            <el-button size="mini" type="text" @click="handleEdit(scope.row)">
+            <el-button size="mini" type="text" @click="handleEdit(scope.row.id)">
               缂栬緫
             </el-button>
             <el-button
               size="mini"
               type="text"
-              @click="handleCopy(scope.row)"
+              @click="handleCopy(scope.row.id)"
               style="color: #67C23A;"
             >
               澶嶅埗
+            </el-button>
+            <el-button
+              size="mini"
+              type="text"
+              @click="handleDelete(scope.row)"
+              style="color: #F56C6C;"
+            >
+              鍒犻櫎
             </el-button>
           </template>
         </el-table-column>
@@ -130,10 +145,11 @@
       <!-- 鍒嗛〉 -->
       <div class="pagination-container">
         <el-pagination
-          :current-page="pagination.currentPage"
+          :current-page="pagination.pageNum"
           :page-size="pagination.pageSize"
           :total="pagination.total"
           layout="total, sizes, prev, pager, next, jumper"
+          :page-sizes="[10, 20, 50, 100]"
           @size-change="handleSizeChange"
           @current-change="handleCurrentChange"
         />
@@ -147,9 +163,9 @@
       width="900px"
       :before-close="handleDetailClose"
     >
-      <el-descriptions :column="2" border v-if="currentRecord">
+      <el-descriptions :column="2" border v-if="currentRecord.id">
         <el-descriptions-item label="濮撳悕">{{ currentRecord.name }}</el-descriptions-item>
-        <el-descriptions-item label="鎬у埆">{{ currentRecord.gender }}</el-descriptions-item>
+        <el-descriptions-item label="鎬у埆">{{ currentRecord.sex }}</el-descriptions-item>
         <el-descriptions-item label="骞撮緞">{{ currentRecord.age }}</el-descriptions-item>
         <el-descriptions-item label="瀛﹀巻">{{ currentRecord.education }}</el-descriptions-item>
         <el-descriptions-item label="杩涗慨绫诲瀷">
@@ -158,31 +174,37 @@
           </el-tag>
         </el-descriptions-item>
         <el-descriptions-item label="韬唤璇佸彿">{{ currentRecord.idCard }}</el-descriptions-item>
-        <el-descriptions-item label="姣曚笟闄㈡牎">{{ currentRecord.graduateSchool }}</el-descriptions-item>
+        <el-descriptions-item label="姣曚笟闄㈡牎">{{ currentRecord.graduationSchool }}</el-descriptions-item>
         <el-descriptions-item label="鎵�鍦ㄥ崟浣�">{{ currentRecord.workUnit }}</el-descriptions-item>
         <el-descriptions-item label="鎶�鏈亴绉�">{{ currentRecord.technicalTitle }}</el-descriptions-item>
-        <el-descriptions-item label="浠庝簨涓撲笟">{{ currentRecord.professionalField }}</el-descriptions-item>
+        <el-descriptions-item label="浠庝簨涓撲笟">{{ currentRecord.profession }}</el-descriptions-item>
         <el-descriptions-item label="宸ヤ綔骞撮檺">{{ currentRecord.workYears }}骞�</el-descriptions-item>
-        <el-descriptions-item label="杩涗慨鐩爣">{{ currentRecord.trainingObjective }}</el-descriptions-item>
-        <el-descriptions-item label="杩涗慨寮�濮嬫椂闂�">{{ currentRecord.trainingStartDate }}</el-descriptions-item>
-        <el-descriptions-item label="杩涗慨缁撴潫鏃堕棿">{{ currentRecord.trainingEndDate }}</el-descriptions-item>
+        <el-descriptions-item label="杩涗慨鐩爣">{{ currentRecord.trainingGoal }}</el-descriptions-item>
+        <el-descriptions-item label="杩涗慨寮�濮嬫椂闂�">{{ formatDate(currentRecord.trainingStartDate) }}</el-descriptions-item>
+        <el-descriptions-item label="杩涗慨缁撴潫鏃堕棿">{{ formatDate(currentRecord.trainingEndDate) }}</el-descriptions-item>
         <el-descriptions-item label="杩涗慨涓撲笟">{{ currentRecord.trainingMajor }}</el-descriptions-item>
         <el-descriptions-item label="浠庝簨宸ヤ綔鎯呭喌" :span="2">
           {{ currentRecord.workSituation }}
         </el-descriptions-item>
-        <el-descriptions-item label="杩涗慨绉戠洰鍙婄洰鐨�" :span="2">
-          {{ currentRecord.trainingSubject }}
+        <el-descriptions-item label="杩涗慨绉戠洰" :span="2">
+          {{ currentRecord.applySubject }}
+        </el-descriptions-item>
+        <el-descriptions-item label="杩涗慨鐩殑" :span="2">
+          {{ currentRecord.applyPurpose }}
         </el-descriptions-item>
         <el-descriptions-item label="涓昏瀛﹀巻" :span="2">
           <div style="white-space: pre-line;">{{ currentRecord.mainEducation }}</div>
         </el-descriptions-item>
         <el-descriptions-item label="涓昏宸ヤ綔缁忓巻" :span="2">
-          <div style="white-space: pre-line;">{{ currentRecord.workExperience }}</div>
+          <div style="white-space: pre-line;">{{ currentRecord.mainExperience }}</div>
         </el-descriptions-item>
+        <el-descriptions-item label="鍒涘缓鏃堕棿">{{ formatDateTime(currentRecord.createTime) }}</el-descriptions-item>
+        <el-descriptions-item label="鏇存柊鏃堕棿">{{ formatDateTime(currentRecord.updateTime) }}</el-descriptions-item>
+        <!-- <el-descriptions-item label="澶囨敞" :span="2">{{ currentRecord.remark }}</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.id)">缂栬緫</el-button>
       </span>
     </el-dialog>
 
@@ -207,8 +229,8 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鎬у埆" prop="gender">
-              <el-radio-group v-model="editForm.gender">
+            <el-form-item label="鎬у埆" prop="sex">
+              <el-radio-group v-model="editForm.sex">
                 <el-radio label="鐢�">鐢�</el-radio>
                 <el-radio label="濂�">濂�</el-radio>
               </el-radio-group>
@@ -255,8 +277,8 @@
           <el-input v-model="editForm.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�" />
         </el-form-item>
 
-        <el-form-item label="姣曚笟闄㈡牎" prop="graduateSchool">
-          <el-input v-model="editForm.graduateSchool" placeholder="璇疯緭鍏ユ瘯涓氶櫌鏍�" />
+        <el-form-item label="姣曚笟闄㈡牎" prop="graduationSchool">
+          <el-input v-model="editForm.graduationSchool" placeholder="璇疯緭鍏ユ瘯涓氶櫌鏍�" />
         </el-form-item>
 
         <el-form-item label="鎵�鍦ㄥ崟浣�" prop="workUnit">
@@ -270,8 +292,8 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="浠庝簨涓撲笟" prop="professionalField">
-              <el-input v-model="editForm.professionalField" placeholder="璇疯緭鍏ヤ粠浜嬩笓涓�" />
+            <el-form-item label="浠庝簨涓撲笟" prop="profession">
+              <el-input v-model="editForm.profession" placeholder="璇疯緭鍏ヤ粠浜嬩笓涓�" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -281,14 +303,16 @@
             v-model="editForm.workYears"
             :min="0"
             :max="50"
+            :precision="1"
+            :step="0.5"
             controls-position="right"
             style="width: 100%"
           />
         </el-form-item>
 
-        <el-form-item label="杩涗慨鐩爣" prop="trainingObjective">
+        <el-form-item label="杩涗慨鐩爣" prop="trainingGoal">
           <el-input
-            v-model="editForm.trainingObjective"
+            v-model="editForm.trainingGoal"
             type="textarea"
             :rows="2"
             placeholder="璇疯緭鍏ヨ繘淇洰鏍�"
@@ -302,7 +326,7 @@
                 v-model="editForm.trainingStartDate"
                 type="date"
                 placeholder="閫夋嫨寮�濮嬫棩鏈�"
-                value-format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd HH:mm:ss"
                 style="width: 100%"
               />
             </el-form-item>
@@ -313,7 +337,7 @@
                 v-model="editForm.trainingEndDate"
                 type="date"
                 placeholder="閫夋嫨缁撴潫鏃ユ湡"
-                value-format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd HH:mm:ss"
                 style="width: 100%"
               />
             </el-form-item>
@@ -324,21 +348,30 @@
           <el-input v-model="editForm.trainingMajor" placeholder="璇疯緭鍏ヨ繘淇笓涓�" />
         </el-form-item>
 
+        <el-form-item label="杩涗慨绉戠洰" prop="applySubject">
+          <el-input
+            v-model="editForm.applySubject"
+            type="textarea"
+            :rows="2"
+            placeholder="璇疯緭鍏ユ湰娆$敵璇疯繘淇鐩�"
+          />
+        </el-form-item>
+
+        <el-form-item label="杩涗慨鐩殑" prop="applyPurpose">
+          <el-input
+            v-model="editForm.applyPurpose"
+            type="textarea"
+            :rows="2"
+            placeholder="璇疯緭鍏ヨ繘淇洰鐨勮姹�"
+          />
+        </el-form-item>
+
         <el-form-item label="浠庝簨宸ヤ綔鎯呭喌" prop="workSituation">
           <el-input
             v-model="editForm.workSituation"
             type="textarea"
             :rows="3"
             placeholder="璇疯緭鍏ヤ粠浜嬪伐浣滄儏鍐�"
-          />
-        </el-form-item>
-
-        <el-form-item label="杩涗慨绉戠洰鍙婄洰鐨�" prop="trainingSubject">
-          <el-input
-            v-model="editForm.trainingSubject"
-            type="textarea"
-            :rows="3"
-            placeholder="璇疯緭鍏ユ湰娆$敵璇疯繘淇綍绉嶇鐩強鐩殑瑕佹眰"
           />
         </el-form-item>
 
@@ -351,14 +384,23 @@
           />
         </el-form-item>
 
-        <el-form-item label="涓昏宸ヤ綔缁忓巻" prop="workExperience">
+        <el-form-item label="涓昏宸ヤ綔缁忓巻" prop="mainExperience">
           <el-input
-            v-model="editForm.workExperience"
+            v-model="editForm.mainExperience"
             type="textarea"
             :rows="3"
             placeholder="璇疯緭鍏ヤ富瑕佸伐浣滅粡鍘嗭紙姣忚涓�鏉★級"
           />
         </el-form-item>
+
+        <!-- <el-form-item label="澶囨敞" prop="remark">
+          <el-input
+            v-model="editForm.remark"
+            type="textarea"
+            :rows="2"
+            placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+          />
+        </el-form-item> -->
       </el-form>
 
       <span slot="footer">
@@ -372,6 +414,8 @@
 </template>
 
 <script>
+import { recordslist, recordsedit, recordsadd, recordsInfo, recordsDel,exporrecords } from "@/api/officeManagementApi";
+
 export default {
   name: 'TrainingManagement',
   data() {
@@ -385,7 +429,7 @@
       },
       // 鍒嗛〉鍙傛暟
       pagination: {
-        currentPage: 1,
+        pageNum: 1,
         pageSize: 10,
         total: 0
       },
@@ -402,35 +446,20 @@
       // 琛ㄦ牸鏁版嵁
       tableData: [],
       // 缂栬緫琛ㄥ崟鏁版嵁
-      editForm: {
-        name: '',
-        gender: '鐢�',
-        age: 25,
-        education: '',
-        trainingType: '',
-        idCard: '',
-        graduateSchool: '',
-        workUnit: '',
-        technicalTitle: '',
-        professionalField: '',
-        workYears: 0,
-        trainingObjective: '',
-        trainingStartDate: '',
-        trainingEndDate: '',
-        trainingMajor: '',
-        workSituation: '',
-        trainingSubject: '',
-        mainEducation: '',
-        workExperience: ''
-      },
+      editForm: this.getDefaultFormData(),
       // 琛ㄥ崟楠岃瘉瑙勫垯
       editRules: {
         name: [{ required: true, message: '璇疯緭鍏ュ鍚�', trigger: 'blur' }],
-        gender: [{ required: true, message: '璇烽�夋嫨鎬у埆', trigger: 'change' }],
+        sex: [{ required: true, message: '璇烽�夋嫨鎬у埆', trigger: 'change' }],
         age: [{ required: true, message: '璇疯緭鍏ュ勾榫�', trigger: 'blur' }],
         education: [{ required: true, message: '璇烽�夋嫨瀛﹀巻', trigger: 'change' }],
         trainingType: [{ required: true, message: '璇烽�夋嫨杩涗慨绫诲瀷', trigger: 'change' }],
-        idCard: [{ required: true, message: '璇疯緭鍏ヨ韩浠借瘉鍙�', trigger: 'blur' }]
+        idCard: [
+          { required: true, message: '璇疯緭鍏ヨ韩浠借瘉鍙�', trigger: 'blur' },
+          { pattern: /^\d{17}[\dXx]$/, message: '璇疯緭鍏ユ纭殑韬唤璇佸彿', trigger: 'blur' }
+        ],
+        trainingStartDate: [{ required: true, message: '璇烽�夋嫨杩涗慨寮�濮嬫椂闂�', trigger: 'change' }],
+        trainingEndDate: [{ required: true, message: '璇烽�夋嫨杩涗慨缁撴潫鏃堕棿', trigger: 'change' }]
       }
     }
   },
@@ -442,12 +471,26 @@
     async loadData() {
       this.loading = true
       try {
-        // 妯℃嫙API璋冪敤
-        await new Promise(resolve => setTimeout(resolve, 500))
+        const params = {
+          pageNum: this.pagination.pageNum,
+          pageSize: this.pagination.pageSize,
+          ...this.queryParams
+        }
 
-        // 鐢熸垚妯℃嫙鏁版嵁
-        this.tableData = this.generateMockData()
-        this.pagination.total = this.tableData.length
+        // 澶勭悊鏃堕棿鑼冨洿鏌ヨ
+        if (this.queryParams.dateRange && this.queryParams.dateRange.length === 2) {
+          params.startDate = this.queryParams.dateRange[0]
+          params.endDate = this.queryParams.dateRange[1]
+        }
+
+        const response = await recordslist(params)
+
+        if (response.code === 200) {
+          this.tableData = response.rows || []
+          this.pagination.total = response.total || 0
+        } else {
+          this.$message.error(response.msg || '鑾峰彇鏁版嵁澶辫触')
+        }
       } catch (error) {
         console.error('鍔犺浇鏁版嵁澶辫触:', error)
         this.$message.error('鏁版嵁鍔犺浇澶辫触')
@@ -455,36 +498,7 @@
         this.loading = false
       }
     },
-    // 鐢熸垚妯℃嫙鏁版嵁
-    generateMockData() {
-      const names = ['寮犱笁', '鏉庡洓', '鐜嬩簲', '璧靛叚', '閽变竷', '瀛欏叓', '鍛ㄤ節', '鍚村崄']
-      const trainingTypes = ['professional', 'management', 'education', 'skill']
-      const statuses = ['杩涜涓�', '宸插畬鎴�', '寰呭鏍�', '宸插彇娑�']
 
-      return Array.from({ length: 10 }, (_, index) => ({
-        id: index + 1,
-        name: names[Math.floor(Math.random() * names.length)],
-        gender: Math.random() > 0.5 ? '鐢�' : '濂�',
-        age: 25 + Math.floor(Math.random() * 20),
-        education: ['鍗氬+', '纭曞+', '鏈', '澶т笓'][Math.floor(Math.random() * 4)],
-        trainingType: trainingTypes[Math.floor(Math.random() * trainingTypes.length)],
-        idCard: '11010119900101' + (1000 + index).toString().slice(-4),
-        graduateSchool: ['鍖椾含澶у', '娓呭崕澶у', '澶嶆棪澶у', '涓婃捣浜ら�氬ぇ瀛�'][Math.floor(Math.random() * 4)],
-        workUnit: ['闈掑矝澶у闄勫睘鍖婚櫌', '闈掑矝甯傚競绔嬪尰闄�', '灞变笢澶у榻愰瞾鍖婚櫌', '闈掑矝甯備腑蹇冨尰闄�'][Math.floor(Math.random() * 4)],
-        technicalTitle: ['涓讳换鍖诲笀', '鍓富浠诲尰甯�', '涓绘不鍖诲笀', '浣忛櫌鍖诲笀'][Math.floor(Math.random() * 4)],
-        professionalField: ['蹇冭绠″唴绉�', '绁炵粡澶栫', '鍎跨', '濡囦骇绉�'][Math.floor(Math.random() * 4)],
-        workYears: 5 + Math.floor(Math.random() * 20),
-        trainingObjective: '鎻愬崌涓撲笟鎶�鏈拰涓村簥鑳藉姏',
-        trainingStartDate: '2024-' + (Math.floor(Math.random() * 12) + 1).toString().padStart(2, '0') + '-01',
-        trainingEndDate: '2024-' + (Math.floor(Math.random() * 12) + 1).toString().padStart(2, '0') + '-28',
-        trainingMajor: '涓村簥鍖诲',
-        workSituation: '鍦ㄤ复搴婁竴绾垮伐浣滐紝璐熻矗鎮h�呰瘖鐤�',
-        trainingSubject: '楂樼骇蹇冭绠′粙鍏ユ不鐤楁妧鏈�',
-        mainEducation: '2005-2009 澶у鍖诲閮� 涓村簥鍖诲鏈\n2009-2012 澶у鍖诲閮� 纭曞+',
-        workExperience: '2012-2015 鍗忓拰鍖婚櫌 浣忛櫌鍖诲笀\n2015-2020 鍗忓拰鍖婚櫌 涓绘不鍖诲笀',
-        status: statuses[Math.floor(Math.random() * statuses.length)]
-      }))
-    },
     // 鑾峰彇杩涗慨绫诲瀷鏍囩鏍峰紡
     getTrainingTypeTag(type) {
       const typeMap = {
@@ -495,6 +509,7 @@
       }
       return typeMap[type] || 'info'
     },
+
     // 鑾峰彇杩涗慨绫诲瀷鏂囨湰
     getTrainingTypeText(type) {
       const textMap = {
@@ -505,21 +520,38 @@
       }
       return textMap[type] || type
     },
+
     // 鑾峰彇鐘舵�佹爣绛炬牱寮�
     getStatusTag(status) {
       const statusMap = {
         '杩涜涓�': 'primary',
         '宸插畬鎴�': 'success',
         '寰呭鏍�': 'warning',
-        '宸插彇娑�': 'danger'
+        '宸插彇娑�': 'danger',
+        '姝e父': 'success',
+        '鍒犻櫎': 'danger'
       }
       return statusMap[status] || 'info'
     },
+
+    // 鏍煎紡鍖栨棩鏈�
+    formatDate(date) {
+      if (!date) return ''
+      return date.split(' ')[0]
+    },
+
+    // 鏍煎紡鍖栨棩鏈熸椂闂�
+    formatDateTime(dateTime) {
+      if (!dateTime) return ''
+      return dateTime.replace('T', ' ')
+    },
+
     // 鏌ヨ澶勭悊
     handleQuery() {
-      this.pagination.currentPage = 1
+      this.pagination.pageNum = 1
       this.loadData()
     },
+
     // 閲嶇疆鏌ヨ
     handleReset() {
       this.queryParams = {
@@ -528,14 +560,26 @@
         technicalTitle: '',
         dateRange: []
       }
-      this.pagination.currentPage = 1
+      this.pagination.pageNum = 1
       this.loadData()
     },
+
     // 鏌ョ湅璇︽儏
-    handleView(record) {
-      this.currentRecord = { ...record }
-      this.detailDialogVisible = true
+    async handleView(id) {
+      try {
+        const response = await recordsInfo(id)
+        if (response.code === 200) {
+          this.currentRecord = response.data || {}
+          this.detailDialogVisible = true
+        } else {
+          this.$message.error(response.msg || '鑾峰彇璇︽儏澶辫触')
+        }
+      } catch (error) {
+        console.error('鑾峰彇璇︽儏澶辫触:', error)
+        this.$message.error('鑾峰彇璇︽儏澶辫触')
+      }
     },
+
     // 鏂板璁板綍
     handleAdd() {
       this.isEditing = false
@@ -545,29 +589,54 @@
         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.$nextTick(() => {
-        this.$refs.editForm && this.$refs.editForm.clearValidate()
-      })
+    async handleEdit(id) {
+      try {
+        const response = await recordsInfo(id)
+        if (response.code === 200) {
+          this.isEditing = true
+          this.currentRecord = response.data || {}
+          this.editForm = { ...response.data }
+          this.editDialogVisible = true
+          this.detailDialogVisible = false
+          this.$nextTick(() => {
+            this.$refs.editForm && this.$refs.editForm.clearValidate()
+          })
+        } else {
+          this.$message.error(response.msg || '鑾峰彇璁板綍澶辫触')
+        }
+      } catch (error) {
+        console.error('鑾峰彇璁板綍澶辫触:', error)
+        this.$message.error('鑾峰彇璁板綍澶辫触')
+      }
     },
+
     // 澶嶅埗璁板綍
-    handleCopy(record) {
-      this.isEditing = false
-      const copiedRecord = { ...record }
-      delete copiedRecord.id
-      copiedRecord.name = copiedRecord.name + '锛堝鍒讹級'
-      this.editForm = copiedRecord
-      this.editDialogVisible = true
-      this.$nextTick(() => {
-        this.$refs.editForm && this.$refs.editForm.clearValidate()
-      })
+    async handleCopy(id) {
+      try {
+        const response = await recordsInfo(id)
+        if (response.code === 200) {
+          this.isEditing = false
+          const copiedRecord = { ...response.data }
+          delete copiedRecord.id
+          copiedRecord.name = copiedRecord.name + '锛堝鍒讹級'
+          copiedRecord.isCopy = 1
+          copiedRecord.originalId = id
+          this.editForm = copiedRecord
+          this.editDialogVisible = true
+          this.$nextTick(() => {
+            this.$refs.editForm && this.$refs.editForm.clearValidate()
+          })
+        } else {
+          this.$message.error(response.msg || '鑾峰彇璁板綍澶辫触')
+        }
+      } catch (error) {
+        console.error('鑾峰彇璁板綍澶辫触:', error)
+        this.$message.error('鑾峰彇璁板綍澶辫触')
+      }
     },
+
     // 淇濆瓨璁板綍
     async handleSave() {
       try {
@@ -575,74 +644,140 @@
         if (!valid) return
 
         this.saveLoading = true
-        // 妯℃嫙API璋冪敤
-        await new Promise(resolve => setTimeout(resolve, 1000))
 
-        this.$message.success(this.isEditing ? '淇濆瓨鎴愬姛' : '鏂板鎴愬姛')
-        this.editDialogVisible = false
-        this.loadData()
+        // 楠岃瘉缁撴潫鏃堕棿涓嶈兘鏃╀簬寮�濮嬫椂闂�
+        if (this.editForm.trainingStartDate && this.editForm.trainingEndDate) {
+          if (this.editForm.trainingEndDate < this.editForm.trainingStartDate) {
+            this.$message.error('缁撴潫鏃堕棿涓嶈兘鏃╀簬寮�濮嬫椂闂�')
+            this.saveLoading = false
+            return
+          }
+        }
+
+        let response
+        if (this.isEditing) {
+          // 缂栬緫
+          response = await recordsedit(this.editForm)
+        } else {
+          // 鏂板
+          response = await recordsadd(this.editForm)
+        }
+
+        if (response.code === 200) {
+          this.$message.success(this.isEditing ? '淇濆瓨鎴愬姛' : '鏂板鎴愬姛')
+          this.editDialogVisible = false
+          this.loadData()
+        } else {
+          this.$message.error(response.msg || (this.isEditing ? '淇濆瓨澶辫触' : '鏂板澶辫触'))
+        }
       } catch (error) {
         console.error('淇濆瓨澶辫触:', error)
-        this.$message.error('鎿嶄綔澶辫触')
+        this.$message.error(this.isEditing ? '淇濆瓨澶辫触' : '鏂板澶辫触')
       } finally {
         this.saveLoading = false
       }
     },
+
+    // 鍒犻櫎璁板綍
+    async handleDelete(row) {
+      try {
+        await this.$confirm('纭畾瑕佸垹闄よ繖鏉¤褰曞悧锛�', '鎻愮ず', {
+          type: 'warning',
+          confirmButtonText: '纭畾',
+          cancelButtonText: '鍙栨秷'
+        })
+
+        const response = await recordsDel(row.id)
+        if (response.code === 200) {
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.loadData()
+        } else {
+          this.$message.error(response.msg || '鍒犻櫎澶辫触')
+        }
+      } catch (error) {
+        if (error !== 'cancel') {
+          console.error('鍒犻櫎澶辫触:', error)
+          this.$message.error('鍒犻櫎澶辫触')
+        }
+      }
+    },
+
     // 鍏抽棴璇︽儏瀵硅瘽妗�
     handleDetailClose() {
       this.detailDialogVisible = false
       this.currentRecord = {}
     },
+
     // 鍏抽棴缂栬緫瀵硅瘽妗�
     handleEditClose() {
       this.editDialogVisible = false
       this.currentRecord = {}
+      this.editForm = this.getDefaultFormData()
       this.$nextTick(() => {
         this.$refs.editForm && this.$refs.editForm.clearValidate()
       })
     },
+
     // 瀵煎嚭鏁版嵁
     exportData() {
-      this.$message.success('瀵煎嚭鍔熻兘寮�鍙戜腑')
+       const queryParams = this.queryParams;
+      this.$modal
+        .confirm("鏄惁纭瀵煎嚭鎵�鏈夎繘淇鐞嗘暟鎹」锛�")
+        .then(() => {
+          return exporrecords(queryParams);
+        })
+        .then((response) => {
+          this.$download.name(response.msg);
+        })
+        .catch(() => { });
     },
+
     // 鍒嗛〉澶у皬鍙樺寲
     handleSizeChange(size) {
       this.pagination.pageSize = size
-      this.pagination.currentPage = 1
+      this.pagination.pageNum = 1
       this.loadData()
     },
+
     // 褰撳墠椤靛彉鍖�
     handleCurrentChange(page) {
-      this.pagination.currentPage = page
+      this.pagination.pageNum = page
       this.loadData()
     },
+
     // 鎺掑簭鍙樺寲
     handleSortChange(sort) {
       console.log('鎺掑簭鍙樺寲:', sort)
-      // 杩欓噷鍙互娣诲姞鎺掑簭閫昏緫
+      // 杩欓噷鍙互娣诲姞鎺掑簭閫昏緫锛屽鏋滈渶瑕佺殑璇�
     },
+
     // 鑾峰彇榛樿琛ㄥ崟鏁版嵁
     getDefaultFormData() {
       return {
+        id: null,
         name: '',
-        gender: '鐢�',
+        sex: '鐢�',
         age: 25,
         education: '',
         trainingType: '',
         idCard: '',
-        graduateSchool: '',
+        graduationSchool: '',
         workUnit: '',
         technicalTitle: '',
-        professionalField: '',
+        profession: '',
         workYears: 0,
-        trainingObjective: '',
+        trainingGoal: '',
         trainingStartDate: '',
         trainingEndDate: '',
         trainingMajor: '',
         workSituation: '',
-        trainingSubject: '',
+        applySubject: '',
+        applyPurpose: '',
         mainEducation: '',
-        workExperience: ''
+        mainExperience: '',
+        remark: '',
+        isCopy: 0,
+        originalId: null
       }
     }
   }
diff --git a/src/views/business/affirm/affirmInfo.vue b/src/views/business/affirm/affirmInfo.vue
index 9ed3c61..f7db6d5 100644
--- a/src/views/business/affirm/affirmInfo.vue
+++ b/src/views/business/affirm/affirmInfo.vue
@@ -341,7 +341,7 @@
 </template>
 
 <script>
-import { relativesList, relativesEdit } from "@/api/businessApi";
+import { relativesList, relativesEdit, relativesAdd } from "@/api/businessApi";
 import FilePreviewDialog from "@/components/FilePreviewDialog";
 
 export default {
@@ -511,8 +511,7 @@
           ? detailData.organdecision
           : detailData.organdecision.split(",");
       }
-      console.log(this.organdecision,'this.organdecision');
-
+      console.log(this.organdecision, "this.organdecision");
 
       // 澶勭悊闄勪欢鏁版嵁 - 浠巃ssessannex瀛楁瑙f瀽JSON骞舵寜绫诲瀷鍒嗙被
       this.processAssessannexData();
@@ -806,8 +805,12 @@
           organdecisionOther: this.organdecisionOther
           // assessannex瀛楁宸插湪updateAssessannexField涓洿鏂�
         };
-
-        const response = await relativesEdit(saveData);
+        let response = null;
+        if (saveData.id) {
+          response = await relativesEdit(saveData);
+        } else {
+          response = await relativesAdd(saveData);
+        }
 
         if (response.code === 200) {
           this.$message.success("淇濆瓨鎴愬姛");
diff --git a/src/views/business/affirm/index.vue b/src/views/business/affirm/index.vue
index 4866a74..4ab4aed 100644
--- a/src/views/business/affirm/index.vue
+++ b/src/views/business/affirm/index.vue
@@ -358,15 +358,15 @@
         if (Array.isArray(response.data)) {
           // 濡傛灉杩斿洖鐨勬槸鏁扮粍
           this.confirmationList = response.data;
-          this.total = response.data.length;
+          this.total = response.total;
         } else if (response.data.rows) {
           // 濡傛灉杩斿洖鐨勬槸鍒嗛〉鏁版嵁缁撴瀯
           this.confirmationList = response.data.rows;
-          this.total = response.data.total;
+          this.total = response.total;
         } else if (Array.isArray(response.data.list)) {
           // 濡傛灉杩斿洖鐨勬槸list瀛楁
           this.confirmationList = response.data.list;
-          this.total = response.data.total || response.data.list.length;
+          this.total = response.total;
         } else {
           // 鍏朵粬鏁版嵁缁撴瀯锛屽皾璇曠洿鎺ヤ娇鐢╠ata
           this.confirmationList = response.data;

--
Gitblit v1.9.3