From fbba46986e98abe68cd2460d1ed2e296cc4ad269 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期四, 04 六月 2026 16:04:46 +0800
Subject: [PATCH] 会议的参会人员改为用户管理的数据选择及其他页面的回显

---
 src/views/collaborativeApproval/notificationManagement/summary/index.vue         |  624 +++++++------
 src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue     |  632 +++++++------
 src/views/collaborativeApproval/notificationManagement/meetPublish/index.vue     |  622 +++++++------
 src/views/collaborativeApproval/notificationManagement/meetApplication/index.vue |  844 +++++++++--------
 4 files changed, 1,466 insertions(+), 1,256 deletions(-)

diff --git a/src/views/collaborativeApproval/notificationManagement/meetApplication/index.vue b/src/views/collaborativeApproval/notificationManagement/meetApplication/index.vue
index b2fb88d..f083574 100644
--- a/src/views/collaborativeApproval/notificationManagement/meetApplication/index.vue
+++ b/src/views/collaborativeApproval/notificationManagement/meetApplication/index.vue
@@ -1,18 +1,17 @@
 <template>
   <div>
-
     <!-- 鐢宠绫诲瀷閫夋嫨 -->
     <el-card class="type-card">
       <div class="type-selector">
-        <div
-            v-for="type in applicationTypes"
-            :key="type.value"
-            class="type-item"
-            :class="{ active: currentType === type.value }"
-            @click="changeType(type.value)"
-        >
+        <div v-for="type in applicationTypes"
+             :key="type.value"
+             class="type-item"
+             :class="{ active: currentType === type.value }"
+             @click="changeType(type.value)">
           <div class="type-icon">
-            <el-icon :size="24"><component :is="type.icon"/></el-icon>
+            <el-icon :size="24">
+              <component :is="type.icon" />
+            </el-icon>
           </div>
           <div class="type-info">
             <div class="type-name">{{ type.name }}</div>
@@ -21,491 +20,512 @@
         </div>
       </div>
     </el-card>
-
     <!-- 浼氳鐢宠琛ㄥ崟 -->
     <el-card>
       <div class="form-header">
         <h3>{{ getCurrentTypeName() }}鐢宠</h3>
       </div>
-
-      <el-form
-          ref="meetingFormRef"
-          :model="meetingForm"
-          :rules="rules"
-          label-width="100px"
-      >
+      <el-form ref="meetingFormRef"
+               :model="meetingForm"
+               :rules="rules"
+               label-width="100px">
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="浼氳涓婚" prop="title">
-              <el-input v-model="meetingForm.title" placeholder="璇疯緭鍏ヤ細璁富棰�"/>
+            <el-form-item label="浼氳涓婚"
+                          prop="title">
+              <el-input v-model="meetingForm.title"
+                        placeholder="璇疯緭鍏ヤ細璁富棰�" />
             </el-form-item>
           </el-col>
         </el-row>
-
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="浼氳瀹�" prop="roomId">
-              <el-select v-model="meetingForm.roomId" placeholder="璇烽�夋嫨浼氳瀹�" style="width: 100%">
-                <el-option
-                    v-for="room in meetingRooms"
-                    :key="room.id"
-                    :label="`${room.name} (${room.location})`"
-                    :value="room.id"
-                />
+            <el-form-item label="浼氳瀹�"
+                          prop="roomId">
+              <el-select v-model="meetingForm.roomId"
+                         placeholder="璇烽�夋嫨浼氳瀹�"
+                         style="width: 100%">
+                <el-option v-for="room in meetingRooms"
+                           :key="room.id"
+                           :label="`${room.name} (${room.location})`"
+                           :value="room.id" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="涓绘寔浜�" prop="host">
-              <el-input v-model="meetingForm.host" placeholder="璇疯緭鍏ヤ富鎸佷汉濮撳悕"/>
+            <el-form-item label="涓绘寔浜�"
+                          prop="host">
+              <el-input v-model="meetingForm.host"
+                        placeholder="璇疯緭鍏ヤ富鎸佷汉濮撳悕" />
             </el-form-item>
           </el-col>
         </el-row>
-
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="浼氳鏃ユ湡" prop="meetingDate">
-              <el-date-picker
-                  v-model="meetingForm.meetingDate"
-                  type="date"
-                  placeholder="璇烽�夋嫨浼氳鏃ユ湡"
-                  value-format="YYYY-MM-DD"
-                  format="YYYY-MM-DD"
-                  :disabled-date="disabledDate"
-                  style="width: 100%"
-              />
+            <el-form-item label="浼氳鏃ユ湡"
+                          prop="meetingDate">
+              <el-date-picker v-model="meetingForm.meetingDate"
+                              type="date"
+                              placeholder="璇烽�夋嫨浼氳鏃ユ湡"
+                              value-format="YYYY-MM-DD"
+                              format="YYYY-MM-DD"
+                              :disabled-date="disabledDate"
+                              style="width: 100%" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <!-- 绌哄垪锛屼繚鎸佸竷灞� -->
           </el-col>
         </el-row>
-
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="寮�濮嬫椂闂�" prop="startTime">
-              <el-select
-                  v-model="meetingForm.startTime"
-                  placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
-                  style="width: 100%"
-              >
-                <el-option
-                    v-for="time in startTimeOptions"
-                    :key="time.value"
-                    :label="time.label"
-                    :value="time.value"
-                />
+            <el-form-item label="寮�濮嬫椂闂�"
+                          prop="startTime">
+              <el-select v-model="meetingForm.startTime"
+                         placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
+                         style="width: 100%">
+                <el-option v-for="time in startTimeOptions"
+                           :key="time.value"
+                           :label="time.label"
+                           :value="time.value" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="缁撴潫鏃堕棿" prop="endTime">
-              <el-select
-                  v-model="meetingForm.endTime"
-                  placeholder="璇烽�夋嫨缁撴潫鏃堕棿"
-                  style="width: 100%"
-              >
-                <el-option
-                    v-for="time in endTimeOptions"
-                    :key="time.value"
-                    :label="time.label"
-                    :value="time.value"
-                />
+            <el-form-item label="缁撴潫鏃堕棿"
+                          prop="endTime">
+              <el-select v-model="meetingForm.endTime"
+                         placeholder="璇烽�夋嫨缁撴潫鏃堕棿"
+                         style="width: 100%">
+                <el-option v-for="time in endTimeOptions"
+                           :key="time.value"
+                           :label="time.label"
+                           :value="time.value" />
               </el-select>
             </el-form-item>
           </el-col>
         </el-row>
-
-        <el-form-item label="鍙備細浜哄憳" prop="participants">
-          <el-select
-              v-model="meetingForm.participants"
-              multiple
-              filterable
-              placeholder="璇烽�夋嫨鍙備細浜哄憳"
-              style="width: 100%"
-          >
-            <el-option
-                v-for="person in employees"
-                :key="person.id"
-                :label="`${person.staffName}${person.postName ? ` (${person.postName})` : ''}`"
-                :value="person.id"
-            />
+        <el-form-item label="鍙備細浜哄憳"
+                      prop="participants">
+          <el-select v-model="meetingForm.participants"
+                     multiple
+                     filterable
+                     placeholder="璇烽�夋嫨鍙備細浜哄憳"
+                     style="width: 100%">
+            <el-option v-for="user in users"
+                       :key="user.userId"
+                       :label="user.deptNames ? `${user.nickName} (${user.deptNames})` : user.nickName"
+                       :value="user.userId" />
           </el-select>
         </el-form-item>
-
-        <el-form-item label="浼氳璇存槑" prop="description">
-          <el-input
-              v-model="meetingForm.description"
-              type="textarea"
-              :rows="4"
-              placeholder="璇疯緭鍏ヤ細璁鏄�"
-          />
+        <el-form-item label="浼氳璇存槑"
+                      prop="description">
+          <el-input v-model="meetingForm.description"
+                    type="textarea"
+                    :rows="4"
+                    placeholder="璇疯緭鍏ヤ細璁鏄�" />
         </el-form-item>
       </el-form>
-
       <div class="form-footer">
         <el-button @click="resetForm">閲嶇疆</el-button>
-        <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
+        <el-button type="primary"
+                   @click="submitForm">鎻愪氦</el-button>
       </div>
     </el-card>
   </div>
 </template>
 
 <script setup>
-import {ref, reactive, onMounted, computed, watch} from 'vue'
-import {ElMessage} from 'element-plus'
-import {Plus, Document, Promotion, Bell} from '@element-plus/icons-vue'
-import {getRoomEnum, saveMeetingApplication} from '@/api/collaborativeApproval/meeting.js'
-import {staffOnJobListPage} from "@/api/personnelManagement/staffOnJob.js";
+  import { ref, reactive, onMounted, computed, watch } from "vue";
+  import { ElMessage } from "element-plus";
+  import { Plus, Document, Promotion, Bell } from "@element-plus/icons-vue";
+  import {
+    getRoomEnum,
+    saveMeetingApplication,
+  } from "@/api/collaborativeApproval/meeting.js";
+  import { userListNoPageByTenantId } from "@/api/system/user.js";
 
-// 褰撳墠鐢宠绫诲瀷
-const currentType = ref('department') // approval: 瀹℃壒娴佺▼, department: 閮ㄩ棬绾�, notification: 閫氱煡鍙戝竷
+  // 褰撳墠鐢宠绫诲瀷
+  const currentType = ref("department"); // approval: 瀹℃壒娴佺▼, department: 閮ㄩ棬绾�, notification: 閫氱煡鍙戝竷
 
-// 鐢宠绫诲瀷閫夐」
-const applicationTypes = ref([
-  {
-    value: 'approval',
-    name: '瀹℃壒娴佺▼浼氳',
-    desc: '闇�瑕佺粡杩囧绾у鎵圭殑浼氳鐢宠',
-    icon: Document
-  },
-  {
-    value: 'department',
-    name: '閮ㄩ棬绾т細璁�',
-    desc: '閮ㄩ棬鍐呴儴浼氳鐢宠娴佺▼',
-    icon: Promotion
-  },
-  {
-    value: 'notification',
-    name: '浼氳閫氱煡',
-    desc: '鏃犻渶瀹℃壒鐩存帴鍙戝竷鐨勪細璁�氱煡',
-    icon: Bell
-  }
-])
+  // 鐢宠绫诲瀷閫夐」
+  const applicationTypes = ref([
+    {
+      value: "approval",
+      name: "瀹℃壒娴佺▼浼氳",
+      desc: "闇�瑕佺粡杩囧绾у鎵圭殑浼氳鐢宠",
+      icon: Document,
+    },
+    {
+      value: "department",
+      name: "閮ㄩ棬绾т細璁�",
+      desc: "閮ㄩ棬鍐呴儴浼氳鐢宠娴佺▼",
+      icon: Promotion,
+    },
+    {
+      value: "notification",
+      name: "浼氳閫氱煡",
+      desc: "鏃犻渶瀹℃壒鐩存帴鍙戝竷鐨勪細璁�氱煡",
+      icon: Bell,
+    },
+  ]);
 
-// 琛ㄥ崟鏁版嵁
-const meetingForm = reactive({
-  title: '',
-  type: '',
-  roomId: '',
-  host: '',
-  meetingDate: '',
-  startTime: '',
-  endTime: '',
-  participants: [],
-  description: ''
-})
+  // 琛ㄥ崟鏁版嵁
+  const meetingForm = reactive({
+    title: "",
+    type: "",
+    roomId: "",
+    host: "",
+    meetingDate: "",
+    startTime: "",
+    endTime: "",
+    participants: [],
+    description: "",
+  });
 
-// 琛ㄥ崟寮曠敤
-const meetingFormRef = ref(null)
+  // 琛ㄥ崟寮曠敤
+  const meetingFormRef = ref(null);
 
-// 浼氳瀹ゅ垪琛�
-const meetingRooms = ref([])
+  // 浼氳瀹ゅ垪琛�
+  const meetingRooms = ref([]);
 
-// 鍛樺伐鍒楄〃
-const employees = ref([])
+  // 鐢ㄦ埛鍒楄〃锛堢郴缁熺鐞�-鐢ㄦ埛绠$悊锛�
+  const users = ref([]);
 
-// 鏃堕棿閫夐」锛堜互鍗婂皬鏃朵负闂撮殧锛�
-const timeOptions = ref([])
+  // 鏃堕棿閫夐」锛堜互鍗婂皬鏃朵负闂撮殧锛�
+  const timeOptions = ref([]);
 
-const getTimeInMinutes = (time) => {
-  if (!time) return -1
-  const [hour, minute] = time.split(':').map(Number)
-  return hour * 60 + minute
-}
+  const getTimeInMinutes = time => {
+    if (!time) return -1;
+    const [hour, minute] = time.split(":").map(Number);
+    return hour * 60 + minute;
+  };
 
-const isToday = (dateText) => {
-  if (!dateText) return false
-  const [year, month, day] = dateText.split('-').map(Number)
-  const now = new Date()
-  return year === now.getFullYear() && month === now.getMonth() + 1 && day === now.getDate()
-}
+  const isToday = dateText => {
+    if (!dateText) return false;
+    const [year, month, day] = dateText.split("-").map(Number);
+    const now = new Date();
+    return (
+      year === now.getFullYear() &&
+      month === now.getMonth() + 1 &&
+      day === now.getDate()
+    );
+  };
 
-const validateStartTime = (_rule, value, callback) => {
-  if (!value) {
-    callback()
-    return
-  }
-
-  if (isToday(meetingForm.meetingDate)) {
-    const now = new Date()
-    const currentMinutes = now.getHours() * 60 + now.getMinutes()
-    if (getTimeInMinutes(value) > currentMinutes) {
-      callback(new Error('褰撳ぉ寮�濮嬫椂闂翠笉鑳芥櫄浜庡綋鍓嶆椂闂�'))
-      return
+  const validateStartTime = (_rule, value, callback) => {
+    if (!value) {
+      callback();
+      return;
     }
-  }
 
-  callback()
-}
-
-const validateEndTime = (_rule, value, callback) => {
-  if (!value || !meetingForm.startTime) {
-    callback()
-    return
-  }
-
-  if (getTimeInMinutes(value) <= getTimeInMinutes(meetingForm.startTime)) {
-    callback(new Error('缁撴潫鏃堕棿蹇呴』澶т簬寮�濮嬫椂闂�'))
-    return
-  }
-
-  callback()
-}
-
-// 琛ㄥ崟鏍¢獙瑙勫垯
-const rules = {
-  title: [{required: true, message: '璇疯緭鍏ヤ細璁富棰�', trigger: 'blur'}],
-  roomId: [{required: true, message: '璇烽�夋嫨浼氳瀹�', trigger: 'change'}],
-  host: [{required: true, message: '璇疯緭鍏ヤ富鎸佷汉', trigger: 'blur'}],
-  meetingDate: [{required: true, message: '璇烽�夋嫨浼氳鏃ユ湡', trigger: 'change'}],
-  startTime: [
-    {required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change'},
-    {validator: validateStartTime, trigger: 'change'}
-  ],
-  endTime: [
-    {required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change'},
-    {validator: validateEndTime, trigger: 'change'}
-  ],
-  participants: [{required: true, message: '璇烽�夋嫨鍙備細浜哄憳', trigger: 'change'}]
-}
-
-const startTimeOptions = computed(() => {
-  if (!isToday(meetingForm.meetingDate)) {
-    return timeOptions.value
-  }
-  const now = new Date()
-  const currentMinutes = now.getHours() * 60 + now.getMinutes()
-  return timeOptions.value.filter(item => getTimeInMinutes(item.value) <= currentMinutes)
-})
-
-const endTimeOptions = computed(() => {
-  if (!meetingForm.startTime) {
-    return timeOptions.value
-  }
-  const startMinutes = getTimeInMinutes(meetingForm.startTime)
-  return timeOptions.value.filter(item => getTimeInMinutes(item.value) > startMinutes)
-})
-
-// 鍒濆鍖栨椂闂撮�夐」
-const initTimeOptions = () => {
-  const options = []
-  const now = new Date()
-  const currentHour = now.getHours()
-  const currentMinute = now.getMinutes()
-  // meetingDate 鏄� "yyyy-MM-dd"
-  const meetingDate = new Date(meetingForm.meetingDate)
-
-  const isSameDay =
-    now.getFullYear() === meetingDate.getFullYear() &&
-    now.getMonth() === meetingDate.getMonth() &&
-    now.getDate() === meetingDate.getDate()
-
-  console.log('鏄惁鍚屼竴澶�:', isSameDay)
-  for (let hour = 8; hour <= 18; hour++) {
-    // 寮�濮嬫椂闂村繀椤绘櫄浜庡綋鍓嶆椂闂�
-    if (hour < currentHour && isSameDay) {
-      continue
+    if (isToday(meetingForm.meetingDate)) {
+      const now = new Date();
+      const currentMinutes = now.getHours() * 60 + now.getMinutes();
+      if (getTimeInMinutes(value) > currentMinutes) {
+        callback(new Error("褰撳ぉ寮�濮嬫椂闂翠笉鑳芥櫄浜庡綋鍓嶆椂闂�"));
+        return;
+      }
     }
-    if (hour === currentHour && currentMinute > 30 && isSameDay) {
-      continue
-    }
-    // 姣忎釜灏忔椂娣诲姞涓や釜閫夐」锛氭暣鐐瑰拰鍗婄偣
-    options.push({
-      value: `${hour.toString().padStart(2, '0')}:00`,
-      label: `${hour.toString().padStart(2, '0')}:00`
-    })
 
-    if (hour < 18) { // 18:00涔嬪悗娌℃湁鍗婄偣閫夐」
+    callback();
+  };
+
+  const validateEndTime = (_rule, value, callback) => {
+    if (!value || !meetingForm.startTime) {
+      callback();
+      return;
+    }
+
+    if (getTimeInMinutes(value) <= getTimeInMinutes(meetingForm.startTime)) {
+      callback(new Error("缁撴潫鏃堕棿蹇呴』澶т簬寮�濮嬫椂闂�"));
+      return;
+    }
+
+    callback();
+  };
+
+  // 琛ㄥ崟鏍¢獙瑙勫垯
+  const rules = {
+    title: [{ required: true, message: "璇疯緭鍏ヤ細璁富棰�", trigger: "blur" }],
+    roomId: [{ required: true, message: "璇烽�夋嫨浼氳瀹�", trigger: "change" }],
+    host: [{ required: true, message: "璇疯緭鍏ヤ富鎸佷汉", trigger: "blur" }],
+    meetingDate: [
+      { required: true, message: "璇烽�夋嫨浼氳鏃ユ湡", trigger: "change" },
+    ],
+    startTime: [
+      { required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change" },
+      { validator: validateStartTime, trigger: "change" },
+    ],
+    endTime: [
+      { required: true, message: "璇烽�夋嫨缁撴潫鏃堕棿", trigger: "change" },
+      { validator: validateEndTime, trigger: "change" },
+    ],
+    participants: [
+      { required: true, message: "璇烽�夋嫨鍙備細浜哄憳", trigger: "change" },
+    ],
+  };
+
+  const startTimeOptions = computed(() => {
+    if (!isToday(meetingForm.meetingDate)) {
+      return timeOptions.value;
+    }
+    const now = new Date();
+    const currentMinutes = now.getHours() * 60 + now.getMinutes();
+    return timeOptions.value.filter(
+      item => getTimeInMinutes(item.value) <= currentMinutes
+    );
+  });
+
+  const endTimeOptions = computed(() => {
+    if (!meetingForm.startTime) {
+      return timeOptions.value;
+    }
+    const startMinutes = getTimeInMinutes(meetingForm.startTime);
+    return timeOptions.value.filter(
+      item => getTimeInMinutes(item.value) > startMinutes
+    );
+  });
+
+  // 鍒濆鍖栨椂闂撮�夐」
+  const initTimeOptions = () => {
+    const options = [];
+    const now = new Date();
+    const currentHour = now.getHours();
+    const currentMinute = now.getMinutes();
+    // meetingDate 鏄� "yyyy-MM-dd"
+    const meetingDate = new Date(meetingForm.meetingDate);
+
+    const isSameDay =
+      now.getFullYear() === meetingDate.getFullYear() &&
+      now.getMonth() === meetingDate.getMonth() &&
+      now.getDate() === meetingDate.getDate();
+
+    console.log("鏄惁鍚屼竴澶�:", isSameDay);
+    for (let hour = 8; hour <= 18; hour++) {
+      // 寮�濮嬫椂闂村繀椤绘櫄浜庡綋鍓嶆椂闂�
+      if (hour < currentHour && isSameDay) {
+        continue;
+      }
+      if (hour === currentHour && currentMinute > 30 && isSameDay) {
+        continue;
+      }
+      // 姣忎釜灏忔椂娣诲姞涓や釜閫夐」锛氭暣鐐瑰拰鍗婄偣
       options.push({
-        value: `${hour.toString().padStart(2, '0')}:30`,
-        label: `${hour.toString().padStart(2, '0')}:30`
-      })
+        value: `${hour.toString().padStart(2, "0")}:00`,
+        label: `${hour.toString().padStart(2, "0")}:00`,
+      });
+
+      if (hour < 18) {
+        // 18:00涔嬪悗娌℃湁鍗婄偣閫夐」
+        options.push({
+          value: `${hour.toString().padStart(2, "0")}:30`,
+          label: `${hour.toString().padStart(2, "0")}:30`,
+        });
+      }
     }
-  }
-  timeOptions.value = options
-}
+    timeOptions.value = options;
+  };
 
-watch(() => meetingForm.meetingDate, () => {
-  if (meetingForm.startTime && !startTimeOptions.value.some(item => item.value === meetingForm.startTime)) {
-    meetingForm.startTime = ''
-  }
-  if (meetingForm.endTime && !endTimeOptions.value.some(item => item.value === meetingForm.endTime)) {
-    meetingForm.endTime = ''
-  }
-  if (meetingForm.startTime) {
-    meetingFormRef.value?.validateField('startTime')
-  }
-  if (meetingForm.endTime) {
-    meetingFormRef.value?.validateField('endTime')
-  }
-  initTimeOptions()
-})
-
-watch(() => meetingForm.startTime, () => {
-  if (meetingForm.endTime && getTimeInMinutes(meetingForm.endTime) <= getTimeInMinutes(meetingForm.startTime)) {
-    meetingForm.endTime = ''
-  }
-  if (meetingForm.endTime) {
-    meetingFormRef.value?.validateField('endTime')
-  }
-  
-})
-
-// 绂佺敤鏃ユ湡锛堢鐢ㄤ粖澶╀箣鍓嶇殑鏃ユ湡锛�
-const disabledDate = (time) => {
-  // 绂佺敤浠婂ぉ涔嬪墠鐨勬棩鏈�
-  return time.getTime() < Date.now() - 86400000
-}
-
-// 鍒囨崲鐢宠绫诲瀷
-const changeType = (type) => {
-  currentType.value = type
-}
-
-// 鑾峰彇褰撳墠绫诲瀷鍚嶇О
-const getCurrentTypeName = () => {
-  const type = applicationTypes.value.find(t => t.value === currentType.value)
-  return type ? type.name : ''
-}
-
-// 閲嶇疆琛ㄥ崟
-const resetForm = () => {
-  meetingFormRef.value?.resetFields()
-}
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
-  meetingFormRef.value?.validate((valid) => {
-    if (valid) {
-
-      let formData = {...meetingForm}
-      formData.applicationType = currentType.value
-      formData.startTime = `${meetingForm.meetingDate} ${meetingForm.startTime}:00`
-      formData.endTime = `${meetingForm.meetingDate} ${meetingForm.endTime}:00`
-      formData.participants = JSON.stringify(formData.participants)
-      console.log(formData)
-      saveMeetingApplication(formData).then(() => {
-
-        // 妯℃嫙鎻愪氦鎿嶄綔
-        ElMessage.success(`${getCurrentTypeName()}鎻愪氦鎴愬姛`)
-
-        // 鏍规嵁涓嶅悓绫诲瀷鎵ц涓嶅悓鎿嶄綔
-        switch (currentType.value) {
-          case 'approval':
-            ElMessage.info('浼氳宸叉彁浜ゅ鎵规祦绋�')
-            break
-          case 'department':
-            ElMessage.info('閮ㄩ棬绾т細璁敵璇峰凡鎻愪氦')
-            break
-          case 'notification':
-            ElMessage.info('浼氳閫氱煡宸插彂甯�')
-            break
-        }
-        resetForm()
-      })
-
+  watch(
+    () => meetingForm.meetingDate,
+    () => {
+      if (
+        meetingForm.startTime &&
+        !startTimeOptions.value.some(item => item.value === meetingForm.startTime)
+      ) {
+        meetingForm.startTime = "";
+      }
+      if (
+        meetingForm.endTime &&
+        !endTimeOptions.value.some(item => item.value === meetingForm.endTime)
+      ) {
+        meetingForm.endTime = "";
+      }
+      if (meetingForm.startTime) {
+        meetingFormRef.value?.validateField("startTime");
+      }
+      if (meetingForm.endTime) {
+        meetingFormRef.value?.validateField("endTime");
+      }
+      initTimeOptions();
     }
-  })
-}
+  );
 
-// 椤甸潰鍔犺浇鏃跺垵濮嬪寲
-onMounted(() => {
-  initTimeOptions()
-  getRoomEnum().then(res => {
-    meetingRooms.value = res.data
-  })
-  staffOnJobListPage({
-    current: -1,
-    size: -1,
-    staffState: 1
-  }).then(res => {
-    employees.value = res.data.records.sort((a, b) => (a.postName || '').localeCompare(b.postName || ''))
-  })
-})
+  watch(
+    () => meetingForm.startTime,
+    () => {
+      if (
+        meetingForm.endTime &&
+        getTimeInMinutes(meetingForm.endTime) <=
+          getTimeInMinutes(meetingForm.startTime)
+      ) {
+        meetingForm.endTime = "";
+      }
+      if (meetingForm.endTime) {
+        meetingFormRef.value?.validateField("endTime");
+      }
+    }
+  );
+
+  // 绂佺敤鏃ユ湡锛堢鐢ㄤ粖澶╀箣鍓嶇殑鏃ユ湡锛�
+  const disabledDate = time => {
+    // 绂佺敤浠婂ぉ涔嬪墠鐨勬棩鏈�
+    return time.getTime() < Date.now() - 86400000;
+  };
+
+  // 鍒囨崲鐢宠绫诲瀷
+  const changeType = type => {
+    currentType.value = type;
+  };
+
+  // 鑾峰彇褰撳墠绫诲瀷鍚嶇О
+  const getCurrentTypeName = () => {
+    const type = applicationTypes.value.find(t => t.value === currentType.value);
+    return type ? type.name : "";
+  };
+
+  // 閲嶇疆琛ㄥ崟
+  const resetForm = () => {
+    meetingFormRef.value?.resetFields();
+  };
+
+  // 鎻愪氦琛ㄥ崟
+  const submitForm = () => {
+    meetingFormRef.value?.validate(valid => {
+      if (valid) {
+        let formData = { ...meetingForm };
+        formData.applicationType = currentType.value;
+        formData.startTime = `${meetingForm.meetingDate} ${meetingForm.startTime}:00`;
+        formData.endTime = `${meetingForm.meetingDate} ${meetingForm.endTime}:00`;
+        formData.participants = JSON.stringify(formData.participants);
+        console.log(formData);
+        saveMeetingApplication(formData).then(() => {
+          // 妯℃嫙鎻愪氦鎿嶄綔
+          ElMessage.success(`${getCurrentTypeName()}鎻愪氦鎴愬姛`);
+
+          // 鏍规嵁涓嶅悓绫诲瀷鎵ц涓嶅悓鎿嶄綔
+          switch (currentType.value) {
+            case "approval":
+              ElMessage.info("浼氳宸叉彁浜ゅ鎵规祦绋�");
+              break;
+            case "department":
+              ElMessage.info("閮ㄩ棬绾т細璁敵璇峰凡鎻愪氦");
+              break;
+            case "notification":
+              ElMessage.info("浼氳閫氱煡宸插彂甯�");
+              break;
+          }
+          resetForm();
+        });
+      }
+    });
+  };
+
+  // 椤甸潰鍔犺浇鏃跺垵濮嬪寲
+  onMounted(() => {
+    initTimeOptions();
+    getRoomEnum().then(res => {
+      meetingRooms.value = res.data;
+    });
+    userListNoPageByTenantId().then(res => {
+      const list = Array.isArray(res?.data) ? res.data : [];
+      users.value = list
+        .map(item => ({
+          userId: item?.userId,
+          nickName:
+            item?.nickName || item?.userName || String(item?.userId ?? ""),
+          deptNames: item?.deptNames || "",
+        }))
+        .filter(
+          item =>
+            item.userId !== null && item.userId !== undefined && item.nickName
+        )
+        .sort((a, b) => String(a.nickName).localeCompare(String(b.nickName)));
+    });
+  });
 </script>
 
 <style scoped>
-.app-container {
-  padding: 20px;
-}
+  .app-container {
+    padding: 20px;
+  }
 
-.page-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 20px;
-}
+  .page-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 20px;
+  }
 
-.page-header h2 {
-  margin: 0;
-  color: #303133;
-}
+  .page-header h2 {
+    margin: 0;
+    color: #303133;
+  }
 
-.type-card {
-  margin-bottom: 20px;
-}
+  .type-card {
+    margin-bottom: 20px;
+  }
 
-.type-selector {
-  display: flex;
-  gap: 20px;
-}
+  .type-selector {
+    display: flex;
+    gap: 20px;
+  }
 
-.type-item {
-  flex: 1;
-  display: flex;
-  align-items: center;
-  padding: 20px;
-  border: 1px solid #ebeef5;
-  border-radius: 8px;
-  cursor: pointer;
-  transition: all 0.3s;
-}
+  .type-item {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    padding: 20px;
+    border: 1px solid #ebeef5;
+    border-radius: 8px;
+    cursor: pointer;
+    transition: all 0.3s;
+  }
 
-.type-item:hover {
-  border-color: #409eff;
-  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-}
+  .type-item:hover {
+    border-color: #409eff;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  }
 
-.type-item.active {
-  border-color: #409eff;
-  background-color: #ecf5ff;
-}
+  .type-item.active {
+    border-color: #409eff;
+    background-color: #ecf5ff;
+  }
 
-.type-icon {
-  margin-right: 15px;
-  color: #409eff;
-}
+  .type-icon {
+    margin-right: 15px;
+    color: #409eff;
+  }
 
-.type-name {
-  font-size: 16px;
-  font-weight: 500;
-  color: #303133;
-  margin-bottom: 5px;
-}
+  .type-name {
+    font-size: 16px;
+    font-weight: 500;
+    color: #303133;
+    margin-bottom: 5px;
+  }
 
-.type-desc {
-  font-size: 14px;
-  color: #909399;
-}
+  .type-desc {
+    font-size: 14px;
+    color: #909399;
+  }
 
-.form-header {
-  margin-bottom: 20px;
-  padding-bottom: 15px;
-  border-bottom: 1px solid #ebeef5;
-}
+  .form-header {
+    margin-bottom: 20px;
+    padding-bottom: 15px;
+    border-bottom: 1px solid #ebeef5;
+  }
 
-.form-header h3 {
-  margin: 0;
-  color: #303133;
-}
+  .form-header h3 {
+    margin: 0;
+    color: #303133;
+  }
 
-.form-footer {
-  display: flex;
-  justify-content: flex-end;
-  gap: 10px;
-  margin-top: 30px;
-  padding-top: 20px;
-  border-top: 1px solid #ebeef5;
-}
+  .form-footer {
+    display: flex;
+    justify-content: flex-end;
+    gap: 10px;
+    margin-top: 30px;
+    padding-top: 20px;
+    border-top: 1px solid #ebeef5;
+  }
 </style>
diff --git a/src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue b/src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue
index 26e2c24..57f5eaa 100644
--- a/src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue
+++ b/src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue
@@ -1,182 +1,219 @@
 <template>
   <div>
-
-    <el-form :model="searchForm" inline>
-        <el-form-item label="浼氳涓婚">
-          <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ヤ細璁富棰�" clearable/>
-        </el-form-item>
-        <el-form-item label="鐢宠浜�">
-          <el-input v-model="searchForm.applicant" placeholder="璇疯緭鍏ョ敵璇蜂汉" clearable/>
-        </el-form-item>
-        <el-form-item label="瀹℃壒鐘舵��">
-          <el-select style="width: 100px" v-model="searchForm.status" placeholder="璇烽�夋嫨瀹℃壒鐘舵��" clearable>
-            <el-option label="寰呭鎵�" value="0"/>
-            <el-option label="宸查�氳繃" value="1"/>
-            <el-option label="鏈鎵�" value="2"/>
-            <el-option label="宸插彇娑�" value="3"/>
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
-          <el-button @click="resetSearch">閲嶇疆</el-button>
-        </el-form-item>
-      </el-form>
-
+    <el-form :model="searchForm"
+             inline>
+      <el-form-item label="浼氳涓婚">
+        <el-input v-model="searchForm.title"
+                  placeholder="璇疯緭鍏ヤ細璁富棰�"
+                  clearable />
+      </el-form-item>
+      <el-form-item label="鐢宠浜�">
+        <el-input v-model="searchForm.applicant"
+                  placeholder="璇疯緭鍏ョ敵璇蜂汉"
+                  clearable />
+      </el-form-item>
+      <el-form-item label="瀹℃壒鐘舵��">
+        <el-select style="width: 100px"
+                   v-model="searchForm.status"
+                   placeholder="璇烽�夋嫨瀹℃壒鐘舵��"
+                   clearable>
+          <el-option label="寰呭鎵�"
+                     value="0" />
+          <el-option label="宸查�氳繃"
+                     value="1" />
+          <el-option label="鏈鎵�"
+                     value="2" />
+          <el-option label="宸插彇娑�"
+                     value="3" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary"
+                   @click="handleSearch">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
     <!-- 浼氳瀹℃壒鍒楄〃 -->
     <el-card>
-      <el-table v-loading="loading" :data="approvalList" border :height="tableHeight">
-        <el-table-column prop="title" label="浼氳涓婚" align="center" min-width="200" show-overflow-tooltip/>
-        <el-table-column prop="applicant" label="鐢宠浜�" align="center" width="120"/>
-        <el-table-column prop="host" label="涓荤悊浜�" align="center" width="120"/>
-        <el-table-column prop="meetingTime" label="浼氳鏃堕棿" align="center" width="180">
+      <el-table v-loading="loading"
+                :data="approvalList"
+                border
+                :height="tableHeight">
+        <el-table-column prop="title"
+                         label="浼氳涓婚"
+                         align="center"
+                         min-width="200"
+                         show-overflow-tooltip />
+        <el-table-column prop="applicant"
+                         label="鐢宠浜�"
+                         align="center"
+                         width="120" />
+        <el-table-column prop="host"
+                         label="涓荤悊浜�"
+                         align="center"
+                         width="120" />
+        <el-table-column prop="meetingTime"
+                         label="浼氳鏃堕棿"
+                         align="center"
+                         width="180">
           <template #default="scope">
             {{ formatDateTime(scope.row.meetingTime) }}
           </template>
         </el-table-column>
-        <el-table-column prop="location" label="浼氳鍦扮偣" align="center" width="150"/>
-        <el-table-column prop="participants" label="鍙備細浜烘暟" align="center" width="100">
+        <el-table-column prop="location"
+                         label="浼氳鍦扮偣"
+                         align="center"
+                         width="150" />
+        <el-table-column prop="participants"
+                         label="鍙備細浜烘暟"
+                         align="center"
+                         width="100">
           <template #default="scope">
             {{ scope.row.participants.length }}浜�
           </template>
         </el-table-column>
-        <el-table-column prop="status" label="瀹℃壒鐘舵��" align="center" width="120">
+        <el-table-column prop="status"
+                         label="瀹℃壒鐘舵��"
+                         align="center"
+                         width="120">
           <template #default="scope">
             <el-tag :type="getStatusType(scope.row.status)">
               {{ getStatusText(scope.row.status) }}
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="鎿嶄綔" align="center" width="200" fixed="right">
+        <el-table-column label="鎿嶄綔"
+                         align="center"
+                         width="200"
+                         fixed="right">
           <template #default="scope">
-            <el-button type="primary" link @click="viewDetail(scope.row)">鏌ョ湅</el-button>
-            <el-button
-                v-if="scope.row.status == '0'"
-                type="primary"
-                link
-                @click="handleApproval(scope.row)"
-            >
+            <el-button type="primary"
+                       link
+                       @click="viewDetail(scope.row)">鏌ョ湅</el-button>
+            <el-button v-if="scope.row.status == '0'"
+                       type="primary"
+                       link
+                       @click="handleApproval(scope.row)">
               瀹℃壒
             </el-button>
           </template>
         </el-table-column>
       </el-table>
-
       <!-- 鍒嗛〉 -->
-      <pagination
-          v-show="total > 0"
-          :total="total"
-          v-model:page="queryParams.current"
-          v-model:limit="queryParams.size"
-          @pagination="getList"
-      />
+      <pagination v-show="total > 0"
+                  :total="total"
+                  v-model:page="queryParams.current"
+                  v-model:limit="queryParams.size"
+                  @pagination="getList" />
     </el-card>
-
     <!-- 浼氳璇︽儏瀵硅瘽妗� -->
-    <el-dialog
-        title="浼氳璇︽儏"
-        v-model="detailDialogVisible"
-        width="800px"
-    >
+    <el-dialog title="浼氳璇︽儏"
+               v-model="detailDialogVisible"
+               width="800px">
       <div v-if="currentMeeting">
-         <el-descriptions label-width="100px" class="meeting-desc" :column="2" border>
-          <el-descriptions-item label="浼氳涓婚" label-class-name="nowrap-label">{{
+        <el-descriptions label-width="100px"
+                         class="meeting-desc"
+                         :column="2"
+                         border>
+          <el-descriptions-item label="浼氳涓婚"
+                                label-class-name="nowrap-label">{{
               currentMeeting.title
             }}</el-descriptions-item>
-          <el-descriptions-item label="鐢宠浜�" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="鐢宠浜�"
+                                label-class-name="nowrap-label">{{
               currentMeeting.applicant
             }}</el-descriptions-item>
-          <el-descriptions-item label="涓荤悊浜�" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="涓荤悊浜�"
+                                label-class-name="nowrap-label">{{
               currentMeeting.host
             }}</el-descriptions-item>
-          <el-descriptions-item label="浼氳鏃堕棿" :span="2" label-class-name="nowrap-label">
+          <el-descriptions-item label="浼氳鏃堕棿"
+                                :span="2"
+                                label-class-name="nowrap-label">
             {{ formatDateTime(currentMeeting.meetingTime) }}
           </el-descriptions-item>
-          <el-descriptions-item label="浼氳鍦扮偣" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="浼氳鍦扮偣"
+                                label-class-name="nowrap-label">{{
               currentMeeting.location
             }}</el-descriptions-item>
-          <el-descriptions-item label="鍙備細浜烘暟" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="鍙備細浜烘暟"
+                                label-class-name="nowrap-label">{{
               currentMeeting.participants.length
             }}浜�</el-descriptions-item>
-          <el-descriptions-item label="瀹℃壒鐘舵��" label-class-name="nowrap-label">
+          <el-descriptions-item label="瀹℃壒鐘舵��"
+                                label-class-name="nowrap-label">
             <el-tag :type="getStatusType(currentMeeting.status)">
               {{ getStatusText(currentMeeting.status) }}
             </el-tag>
           </el-descriptions-item>
-          <el-descriptions-item label="鐢宠鏃堕棿" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="鐢宠鏃堕棿"
+                                label-class-name="nowrap-label">{{
               currentMeeting.createTime
             }}</el-descriptions-item>
-          <el-descriptions-item style="max-height: 400px" label="浼氳璇存槑" :span="2"
+          <el-descriptions-item style="max-height: 400px"
+                                label="浼氳璇存槑"
+                                :span="2"
                                 label-class-name="nowrap-label">{{ currentMeeting.description }}</el-descriptions-item>
         </el-descriptions>
-
-
         <div class="content-section mt-20">
           <h4>鍙備細浜哄憳</h4>
           <div class="participants-list">
-            <el-tag
-                v-for="participant in currentMeeting.participants"
-                :key="participant.id"
-                style="margin-right: 10px; margin-bottom: 10px;"
-            >
+            <el-tag v-for="participant in currentMeeting.participants"
+                    :key="participant.id"
+                    style="margin-right: 10px; margin-bottom: 10px;">
               {{ participant.name }}
             </el-tag>
           </div>
         </div>
       </div>
-
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="detailDialogVisible = false">鍏� 闂�</el-button>
         </div>
       </template>
     </el-dialog>
-
     <!-- 浼氳瀹℃壒瀵硅瘽妗� -->
-    <el-dialog
-        title="浼氳瀹℃壒"
-        v-model="approvalDialogVisible"
-    >
+    <el-dialog title="浼氳瀹℃壒"
+               v-model="approvalDialogVisible">
       <div v-if="currentMeeting">
-        <el-descriptions :column="2" border>
+        <el-descriptions :column="2"
+                         border>
           <el-descriptions-item label="浼氳涓婚">{{ currentMeeting.title }}</el-descriptions-item>
           <el-descriptions-item label="鐢宠浜�">{{ currentMeeting.applicant }}</el-descriptions-item>
           <el-descriptions-item label="涓荤悊浜�">{{ currentMeeting.host }}</el-descriptions-item>
-          <el-descriptions-item label="浼氳鏃堕棿" :span="2">
+          <el-descriptions-item label="浼氳鏃堕棿"
+                                :span="2">
             {{ formatDateTime(currentMeeting.meetingTime) }}
           </el-descriptions-item>
           <el-descriptions-item label="浼氳鍦扮偣">{{ currentMeeting.location }}</el-descriptions-item>
           <el-descriptions-item label="鍙備細浜烘暟">{{ currentMeeting.participants.length }}浜�</el-descriptions-item>
         </el-descriptions>
-
         <div class="content-section mt-20">
           <h4>鍙備細浜哄憳</h4>
           <div class="participants-list">
-            <el-tag
-                v-for="participant in currentMeeting.participants"
-                :key="participant.id"
-                style="margin-right: 10px; margin-bottom: 10px;"
-            >
+            <el-tag v-for="participant in currentMeeting.participants"
+                    :key="participant.id"
+                    style="margin-right: 10px; margin-bottom: 10px;">
               {{ participant.name }}
             </el-tag>
           </div>
         </div>
-
-        <div v-show="false" class="approval-opinion mt-20">
+        <div v-show="false"
+             class="approval-opinion mt-20">
           <h4>瀹℃壒鎰忚</h4>
-          <el-input
-              v-model="approvalOpinion"
-              type="textarea"
-              placeholder="璇疯緭鍏ュ鎵规剰瑙�"
-              :rows="4"
-          />
+          <el-input v-model="approvalOpinion"
+                    type="textarea"
+                    placeholder="璇疯緭鍏ュ鎵规剰瑙�"
+                    :rows="4" />
         </div>
       </div>
-
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="approvalDialogVisible = false">鍙� 娑�</el-button>
-          <el-button type="danger" @click="submitApproval('2')">涓嶉�氳繃</el-button>
-          <el-button type="primary" @click="submitApproval('1')">閫� 杩�</el-button>
+          <el-button type="danger"
+                     @click="submitApproval('2')">涓嶉�氳繃</el-button>
+          <el-button type="primary"
+                     @click="submitApproval('1')">閫� 杩�</el-button>
         </div>
       </template>
     </el-dialog>
@@ -184,231 +221,260 @@
 </template>
 
 <script setup>
-import {ref, reactive, onMounted} from 'vue'
-import {ElMessage, ElMessageBox} from 'element-plus'
-import Pagination from '@/components/Pagination/index.vue'
-import {getRoomEnum, getExamineList,saveMeetingApplication} from '@/api/collaborativeApproval/meeting.js'
-import dayjs from "dayjs";
-import {staffOnJobListPage} from "@/api/personnelManagement/staffOnJob.js";
+  import { ref, reactive, onMounted } from "vue";
+  import { ElMessage, ElMessageBox } from "element-plus";
+  import Pagination from "@/components/Pagination/index.vue";
+  import {
+    getRoomEnum,
+    getExamineList,
+    saveMeetingApplication,
+  } from "@/api/collaborativeApproval/meeting.js";
+  import dayjs from "dayjs";
+  import { userListNoPageByTenantId } from "@/api/system/user.js";
 
-// 鏁版嵁鍒楄〃鍔犺浇鐘舵��
-const loading = ref(false)
+  // 鏁版嵁鍒楄〃鍔犺浇鐘舵��
+  const loading = ref(false);
 
-// 鎬绘潯鏁�
-const total = ref(0)
+  // 鎬绘潯鏁�
+  const total = ref(0);
 
-// 琛ㄦ牸楂樺害锛堟牴鎹獥鍙i珮搴﹁嚜閫傚簲锛�
-const tableHeight = ref(window.innerHeight - 380)
-const roomEnum = ref([])
-const staffList = ref([])
-// 瀹℃壒鍒楄〃鏁版嵁
-const approvalList = ref([])
+  // 琛ㄦ牸楂樺害锛堟牴鎹獥鍙i珮搴﹁嚜閫傚簲锛�
+  const tableHeight = ref(window.innerHeight - 380);
+  const roomEnum = ref([]);
+  const userList = ref([]);
+  // 瀹℃壒鍒楄〃鏁版嵁
+  const approvalList = ref([]);
 
-// 鏌ヨ鍙傛暟
-const queryParams = reactive({
-  current: 1,
-  size: 10
-})
+  // 鏌ヨ鍙傛暟
+  const queryParams = reactive({
+    current: 1,
+    size: 10,
+  });
 
-// 鎼滅储琛ㄥ崟
-const searchForm = reactive({
-  title: '',
-  applicant: '',
-  status: ''
-})
+  // 鎼滅储琛ㄥ崟
+  const searchForm = reactive({
+    title: "",
+    applicant: "",
+    status: "",
+  });
 
-// 鏄惁鏄剧ず瀵硅瘽妗�
-const detailDialogVisible = ref(false)
-const approvalDialogVisible = ref(false)
+  // 鏄惁鏄剧ず瀵硅瘽妗�
+  const detailDialogVisible = ref(false);
+  const approvalDialogVisible = ref(false);
 
-// 褰撳墠鏌ョ湅鐨勪細璁�
-const currentMeeting = ref(null)
+  // 褰撳墠鏌ョ湅鐨勪細璁�
+  const currentMeeting = ref(null);
 
-// 瀹℃壒鎰忚
-const approvalOpinion = ref('')
+  // 瀹℃壒鎰忚
+  const approvalOpinion = ref("");
 
-// 鏌ヨ鏁版嵁
-const getList = async () => {
-  loading.value = true
-  let resp = await getExamineList({...searchForm, ...queryParams})
-  approvalList.value = resp.data.records.map(it => {
-    let room = roomEnum.value.find(room => it.roomId === room.id)
-    it.location = `${room.name}(${room.location})`
-    let staffs = JSON.parse(it.participants)
-    it.staffCount = staffs.size
-    it.meetingTime = `${it.meetingDate} ${dayjs(it.startTime).format('HH:mm:ss')} ~ ${dayjs(it.endTime).format('HH:mm:ss')}`
-    it.participants = staffList.value.filter(staff => staffs.some(id=>id === staff.id)).map(staff => {
-      return {
-        id: staff.id,
-        name:  `${staff.staffName}${staff.postName ? ` (${staff.postName})` : ''}`
+  // 鏌ヨ鏁版嵁
+  const getList = async () => {
+    loading.value = true;
+    let resp = await getExamineList({ ...searchForm, ...queryParams });
+    const userMap = new Map(userList.value.map(u => [String(u.userId), u]));
+    approvalList.value = resp.data.records.map(it => {
+      let room = roomEnum.value.find(room => it.roomId === room.id);
+      it.location = `${room.name}(${room.location})`;
+      let participantIds = [];
+      try {
+        participantIds = Array.isArray(it.participants)
+          ? it.participants
+          : JSON.parse(it.participants);
+      } catch (_e) {
+        participantIds = [];
       }
-    })
+      if (!Array.isArray(participantIds)) participantIds = [];
+      it.staffCount = participantIds.length;
+      it.meetingTime = `${it.meetingDate} ${dayjs(it.startTime).format(
+        "HH:mm:ss"
+      )} ~ ${dayjs(it.endTime).format("HH:mm:ss")}`;
+      it.participants = participantIds.map(id => {
+        const user = userMap.get(String(id));
+        const nickName = user?.nickName || user?.userName || String(id ?? "");
+        const deptNames = user?.deptNames || "";
+        return {
+          id,
+          name: deptNames ? `${nickName} (${deptNames})` : nickName,
+        };
+      });
 
+      return it;
+    });
+    total.value = resp.data.total;
+    loading.value = false;
+  };
 
-    return it
-  })
-  total.value = resp.data.total
-  loading.value = false
-}
+  // 鎼滅储鎸夐挳鎿嶄綔
+  const handleSearch = () => {
+    queryParams.pageNum = 1;
+    getList();
+  };
 
-// 鎼滅储鎸夐挳鎿嶄綔
-const handleSearch = () => {
-  queryParams.pageNum = 1
-  getList()
-}
+  // 閲嶇疆鎼滅储琛ㄥ崟
+  const resetSearch = () => {
+    Object.assign(searchForm, {
+      title: "",
+      applicant: "",
+      status: "",
+    });
+    handleSearch();
+  };
 
-// 閲嶇疆鎼滅储琛ㄥ崟
-const resetSearch = () => {
-  Object.assign(searchForm, {
-    title: '',
-    applicant: '',
-    status: ''
-  })
-  handleSearch()
-}
+  // 鏌ョ湅璇︽儏
+  const viewDetail = row => {
+    currentMeeting.value = row;
+    detailDialogVisible.value = true;
+  };
 
-// 鏌ョ湅璇︽儏
-const viewDetail = (row) => {
-  currentMeeting.value = row
-  detailDialogVisible.value = true
-}
+  // 澶勭悊瀹℃壒
+  const handleApproval = row => {
+    currentMeeting.value = row;
+    approvalOpinion.value = "";
+    approvalDialogVisible.value = true;
+  };
 
-// 澶勭悊瀹℃壒
-const handleApproval = (row) => {
-  currentMeeting.value = row
-  approvalOpinion.value = ''
-  approvalDialogVisible.value = true
-}
+  // 鑾峰彇鐘舵�佺被鍨�
+  const getStatusType = status => {
+    const statusMap = {
+      0: "info", // 寰呭鎵�
+      1: "success", // 宸查�氳繃
+      2: "warning", // 鏈�氳繃
+      3: "danger", // 鍙栨秷
+    };
+    return statusMap[status] || "info";
+  };
 
-// 鑾峰彇鐘舵�佺被鍨�
-const getStatusType = (status) => {
-  const statusMap = {
-    '0': 'info',     // 寰呭鎵�
-    '1': 'success',  // 宸查�氳繃
-    '2': 'warning',  // 鏈�氳繃
-    '3': 'danger'   // 鍙栨秷
-  }
-  return statusMap[status] || 'info'
-}
+  // 鑾峰彇鐘舵�佹枃鏈�
+  const getStatusText = status => {
+    const statusMap = {
+      0: "寰呭鎵�",
+      1: "宸查�氳繃",
+      2: "鏈�氳繃",
+      3: "宸插彇娑�",
+    };
+    return statusMap[status] || "鏈煡";
+  };
 
-// 鑾峰彇鐘舵�佹枃鏈�
-const getStatusText = (status) => {
-  const statusMap = {
-    '0': '寰呭鎵�',
-    '1': '宸查�氳繃',
-    '2': '鏈�氳繃',
-    '3': '宸插彇娑�'
-  }
-  return statusMap[status] || '鏈煡'
-}
+  // 鏍煎紡鍖栨棩鏈熸椂闂�
+  const formatDateTime = dateTime => {
+    if (!dateTime) return "";
+    return dateTime.replace(" ", "\n");
+  };
 
-// 鏍煎紡鍖栨棩鏈熸椂闂�
-const formatDateTime = (dateTime) => {
-  if (!dateTime) return ''
-  return dateTime.replace(' ', '\n')
-}
+  // 鎻愪氦瀹℃壒
+  const submitApproval = status => {
+    // if (status === 'approved' && !approvalOpinion.value.trim()) {
+    //   ElMessage.warning('璇峰~鍐欏鎵规剰瑙�')
+    //   return
+    // }
 
-// 鎻愪氦瀹℃壒
-const submitApproval = (status) => {
-  // if (status === 'approved' && !approvalOpinion.value.trim()) {
-  //   ElMessage.warning('璇峰~鍐欏鎵规剰瑙�')
-  //   return
-  // }
-
-  ElMessageBox.confirm(
-      `纭${status === '1' ? '閫氳繃' : '涓嶉�氳繃'}璇ヤ細璁敵璇凤紵`,
-      '瀹℃壒纭',
+    ElMessageBox.confirm(
+      `纭${status === "1" ? "閫氳繃" : "涓嶉�氳繃"}璇ヤ細璁敵璇凤紵`,
+      "瀹℃壒纭",
       {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning'
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
       }
-  ).then(() => {
-    saveMeetingApplication({
-      id: currentMeeting.value.id,
-      status: status
-    }).then(resp=>{
-      // 鏇存柊浼氳鐘舵��
-      currentMeeting.value.status = status
+    )
+      .then(() => {
+        saveMeetingApplication({
+          id: currentMeeting.value.id,
+          status: status,
+        }).then(resp => {
+          // 鏇存柊浼氳鐘舵��
+          currentMeeting.value.status = status;
 
-      ElMessage.success('瀹℃壒鎻愪氦鎴愬姛')
-      approvalDialogVisible.value = false
-      getList()
-    })
+          ElMessage.success("瀹℃壒鎻愪氦鎴愬姛");
+          approvalDialogVisible.value = false;
+          getList();
+        });
+      })
+      .catch(() => {});
+  };
 
-  }).catch(() => {
-  })
-}
+  // 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
+  onMounted(async () => {
+    const [resp1, resp2] = await Promise.all([
+      getRoomEnum(),
+      userListNoPageByTenantId(),
+    ]);
+    roomEnum.value = resp1.data;
+    const list = Array.isArray(resp2?.data) ? resp2.data : [];
+    userList.value = list
+      .map(item => ({
+        userId: item?.userId,
+        nickName: item?.nickName,
+        userName: item?.userName,
+        deptNames:
+          item?.deptNames || (item?.dept?.deptName ? item.dept.deptName : ""),
+      }))
+      .filter(item => item.userId !== null && item.userId !== undefined);
 
-// 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
-onMounted(async () => {
-  const [resp1, resp2]= await Promise.all([getRoomEnum(), staffOnJobListPage({current: -1, size: -1, staffState: 1})])
-  roomEnum.value = resp1.data
-  staffList.value = resp2.data.records
-
-  await getList()
-})
+    await getList();
+  });
 </script>
 
 <style scoped>
-.app-container {
-  padding: 20px;
-}
+  .app-container {
+    padding: 20px;
+  }
 
-.page-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 20px;
-}
+  .page-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 20px;
+  }
 
-.page-header h2 {
-  margin: 0;
-  color: #303133;
-}
+  .page-header h2 {
+    margin: 0;
+    color: #303133;
+  }
 
-.search-card {
-  margin-bottom: 20px;
-}
+  .search-card {
+    margin-bottom: 20px;
+  }
 
-.dialog-footer {
-  display: flex;
-  justify-content: flex-end;
-  gap: 10px;
-}
+  .dialog-footer {
+    display: flex;
+    justify-content: flex-end;
+    gap: 10px;
+  }
 
-.content-section h4 {
-  margin: 0 0 15px 0;
-  color: #303133;
-}
+  .content-section h4 {
+    margin: 0 0 15px 0;
+    color: #303133;
+  }
 
-.mt-20 {
-  margin-top: 20px;
-}
+  .mt-20 {
+    margin-top: 20px;
+  }
 
-.participants-list {
-  min-height: 40px;
-  padding: 15px;
-  border-radius: 4px;
-  line-height: 1.6;
-}
+  .participants-list {
+    min-height: 40px;
+    padding: 15px;
+    border-radius: 4px;
+    line-height: 1.6;
+  }
 
-.approval-opinion h4 {
-  margin: 0 0 15px 0;
-  color: #303133;
-}
+  .approval-opinion h4 {
+    margin: 0 0 15px 0;
+    color: #303133;
+  }
 
-.nowrap-label {
-  white-space: nowrap !important;
-}
+  .nowrap-label {
+    white-space: nowrap !important;
+  }
 
-.description-content {
-  white-space: pre-wrap;
-  word-wrap: break-word;
-  line-height: 1.6;
-  padding: 10px;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-  min-height: 60px;
-}
+  .description-content {
+    white-space: pre-wrap;
+    word-wrap: break-word;
+    line-height: 1.6;
+    padding: 10px;
+    background-color: #f5f7fa;
+    border-radius: 4px;
+    min-height: 60px;
+  }
 </style>
diff --git a/src/views/collaborativeApproval/notificationManagement/meetPublish/index.vue b/src/views/collaborativeApproval/notificationManagement/meetPublish/index.vue
index dace531..3b9650a 100644
--- a/src/views/collaborativeApproval/notificationManagement/meetPublish/index.vue
+++ b/src/views/collaborativeApproval/notificationManagement/meetPublish/index.vue
@@ -1,180 +1,213 @@
 <template>
   <div>
-
-    <el-form :model="searchForm" inline>
-        <el-form-item label="浼氳涓婚">
-          <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ヤ細璁富棰�" clearable/>
-        </el-form-item>
-        <el-form-item label="鐢宠浜�">
-          <el-input v-model="searchForm.applicant" placeholder="璇疯緭鍏ョ敵璇蜂汉" clearable/>
-        </el-form-item>
-        <el-form-item label="鍙戝竷鐘舵��">
-          <el-select style="width: 100px" v-model="searchForm.status" placeholder="璇烽�夋嫨鍙戝竷鐘舵��" clearable>
-            <el-option label="寰呭彂甯�" value="0"/>
-            <el-option label="宸插彂甯�" value="1"/>
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
-          <el-button @click="resetSearch">閲嶇疆</el-button>
-        </el-form-item>
-      </el-form>
-
+    <el-form :model="searchForm"
+             inline>
+      <el-form-item label="浼氳涓婚">
+        <el-input v-model="searchForm.title"
+                  placeholder="璇疯緭鍏ヤ細璁富棰�"
+                  clearable />
+      </el-form-item>
+      <el-form-item label="鐢宠浜�">
+        <el-input v-model="searchForm.applicant"
+                  placeholder="璇疯緭鍏ョ敵璇蜂汉"
+                  clearable />
+      </el-form-item>
+      <el-form-item label="鍙戝竷鐘舵��">
+        <el-select style="width: 100px"
+                   v-model="searchForm.status"
+                   placeholder="璇烽�夋嫨鍙戝竷鐘舵��"
+                   clearable>
+          <el-option label="寰呭彂甯�"
+                     value="0" />
+          <el-option label="宸插彂甯�"
+                     value="1" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary"
+                   @click="handleSearch">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
     <!-- 浼氳鍙戝竷鍒楄〃 -->
     <el-card>
-      <el-table v-loading="loading" :data="approvalList" border :height="tableHeight">
-        <el-table-column prop="title" label="浼氳涓婚" align="center" min-width="200" show-overflow-tooltip/>
-        <el-table-column prop="applicant" label="鐢宠浜�" align="center" width="120"/>
-        <el-table-column prop="host" label="涓荤悊浜�" align="center" width="120"/>
-        <el-table-column prop="meetingTime" label="浼氳鏃堕棿" align="center" width="180">
+      <el-table v-loading="loading"
+                :data="approvalList"
+                border
+                :height="tableHeight">
+        <el-table-column prop="title"
+                         label="浼氳涓婚"
+                         align="center"
+                         min-width="200"
+                         show-overflow-tooltip />
+        <el-table-column prop="applicant"
+                         label="鐢宠浜�"
+                         align="center"
+                         width="120" />
+        <el-table-column prop="host"
+                         label="涓荤悊浜�"
+                         align="center"
+                         width="120" />
+        <el-table-column prop="meetingTime"
+                         label="浼氳鏃堕棿"
+                         align="center"
+                         width="180">
           <template #default="scope">
             {{ formatDateTime(scope.row.meetingTime) }}
           </template>
         </el-table-column>
-        <el-table-column prop="location" label="浼氳鍦扮偣" align="center" width="150"/>
-        <el-table-column prop="participants" label="鍙備細浜烘暟" align="center" width="100">
+        <el-table-column prop="location"
+                         label="浼氳鍦扮偣"
+                         align="center"
+                         width="150" />
+        <el-table-column prop="participants"
+                         label="鍙備細浜烘暟"
+                         align="center"
+                         width="100">
           <template #default="scope">
             {{ scope.row.participants.length }}浜�
           </template>
         </el-table-column>
-        <el-table-column prop="status" label="鍙戝竷鐘舵��" align="center" width="120">
+        <el-table-column prop="status"
+                         label="鍙戝竷鐘舵��"
+                         align="center"
+                         width="120">
           <template #default="scope">
             <el-tag :type="getStatusType(scope.row.status)">
               {{ getStatusText(scope.row.status) }}
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="鎿嶄綔" align="center" width="200" fixed="right">
+        <el-table-column label="鎿嶄綔"
+                         align="center"
+                         width="200"
+                         fixed="right">
           <template #default="scope">
-            <el-button type="primary" link @click="viewDetail(scope.row)">鏌ョ湅</el-button>
-            <el-button
-                v-if="scope.row.status == '0'"
-                type="primary"
-                link
-                @click="handleApproval(scope.row)"
-            >
+            <el-button type="primary"
+                       link
+                       @click="viewDetail(scope.row)">鏌ョ湅</el-button>
+            <el-button v-if="scope.row.status == '0'"
+                       type="primary"
+                       link
+                       @click="handleApproval(scope.row)">
               鍙戝竷
             </el-button>
           </template>
         </el-table-column>
       </el-table>
-
       <!-- 鍒嗛〉 -->
-      <pagination
-          v-show="total > 0"
-          :total="total"
-          v-model:page="queryParams.current"
-          v-model:limit="queryParams.size"
-          @pagination="getList"
-      />
+      <pagination v-show="total > 0"
+                  :total="total"
+                  v-model:page="queryParams.current"
+                  v-model:limit="queryParams.size"
+                  @pagination="getList" />
     </el-card>
-
     <!-- 浼氳璇︽儏瀵硅瘽妗� -->
-    <el-dialog
-        title="浼氳璇︽儏"
-        v-model="detailDialogVisible"
-        width="800px"
-    >
+    <el-dialog title="浼氳璇︽儏"
+               v-model="detailDialogVisible"
+               width="800px">
       <div v-if="currentMeeting">
-         <el-descriptions label-width="100px" class="meeting-desc" :column="2" border>
-          <el-descriptions-item label="浼氳涓婚" label-class-name="nowrap-label">{{
+        <el-descriptions label-width="100px"
+                         class="meeting-desc"
+                         :column="2"
+                         border>
+          <el-descriptions-item label="浼氳涓婚"
+                                label-class-name="nowrap-label">{{
               currentMeeting.title
             }}</el-descriptions-item>
-          <el-descriptions-item label="鐢宠浜�" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="鐢宠浜�"
+                                label-class-name="nowrap-label">{{
               currentMeeting.applicant
             }}</el-descriptions-item>
-          <el-descriptions-item label="涓荤悊浜�" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="涓荤悊浜�"
+                                label-class-name="nowrap-label">{{
               currentMeeting.host
             }}</el-descriptions-item>
-          <el-descriptions-item label="浼氳鏃堕棿" :span="2" label-class-name="nowrap-label">
+          <el-descriptions-item label="浼氳鏃堕棿"
+                                :span="2"
+                                label-class-name="nowrap-label">
             {{ formatDateTime(currentMeeting.meetingTime) }}
           </el-descriptions-item>
-          <el-descriptions-item label="浼氳鍦扮偣" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="浼氳鍦扮偣"
+                                label-class-name="nowrap-label">{{
               currentMeeting.location
             }}</el-descriptions-item>
-          <el-descriptions-item label="鍙備細浜烘暟" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="鍙備細浜烘暟"
+                                label-class-name="nowrap-label">{{
               currentMeeting.participants.length
             }}浜�</el-descriptions-item>
-          <el-descriptions-item label="鍙戝竷鐘舵��" label-class-name="nowrap-label">
+          <el-descriptions-item label="鍙戝竷鐘舵��"
+                                label-class-name="nowrap-label">
             <el-tag :type="getStatusType(currentMeeting.status)">
               {{ getStatusText(currentMeeting.status) }}
             </el-tag>
           </el-descriptions-item>
-          <el-descriptions-item label="鐢宠鏃堕棿" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="鐢宠鏃堕棿"
+                                label-class-name="nowrap-label">{{
               currentMeeting.createTime
             }}</el-descriptions-item>
-          <el-descriptions-item style="max-height: 400px" label="浼氳璇存槑" :span="2"
+          <el-descriptions-item style="max-height: 400px"
+                                label="浼氳璇存槑"
+                                :span="2"
                                 label-class-name="nowrap-label">{{ currentMeeting.description }}</el-descriptions-item>
         </el-descriptions>
-
-
         <div class="content-section mt-20">
           <h4>鍙備細浜哄憳</h4>
           <div class="participants-list">
-            <el-tag
-                v-for="participant in currentMeeting.participants"
-                :key="participant.id"
-                style="margin-right: 10px; margin-bottom: 10px;"
-            >
+            <el-tag v-for="participant in currentMeeting.participants"
+                    :key="participant.id"
+                    style="margin-right: 10px; margin-bottom: 10px;">
               {{ participant.name }}
             </el-tag>
           </div>
         </div>
       </div>
-
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="detailDialogVisible = false">鍏� 闂�</el-button>
         </div>
       </template>
     </el-dialog>
-
     <!-- 浼氳鍙戝竷瀵硅瘽妗� -->
-    <el-dialog
-        title="浼氳鍙戝竷"
-        v-model="approvalDialogVisible"
-    >
+    <el-dialog title="浼氳鍙戝竷"
+               v-model="approvalDialogVisible">
       <div v-if="currentMeeting">
-        <el-descriptions :column="2" border>
+        <el-descriptions :column="2"
+                         border>
           <el-descriptions-item label="浼氳涓婚">{{ currentMeeting.title }}</el-descriptions-item>
           <el-descriptions-item label="鐢宠浜�">{{ currentMeeting.applicant }}</el-descriptions-item>
           <el-descriptions-item label="涓荤悊浜�">{{ currentMeeting.host }}</el-descriptions-item>
-          <el-descriptions-item label="浼氳鏃堕棿" :span="2">
+          <el-descriptions-item label="浼氳鏃堕棿"
+                                :span="2">
             {{ formatDateTime(currentMeeting.meetingTime) }}
           </el-descriptions-item>
           <el-descriptions-item label="浼氳鍦扮偣">{{ currentMeeting.location }}</el-descriptions-item>
           <el-descriptions-item label="鍙備細浜烘暟">{{ currentMeeting.participants.length }}浜�</el-descriptions-item>
         </el-descriptions>
-
         <div class="content-section mt-20">
           <h4>鍙備細浜哄憳</h4>
           <div class="participants-list">
-            <el-tag
-                v-for="participant in currentMeeting.participants"
-                :key="participant.id"
-                style="margin-right: 10px; margin-bottom: 10px;"
-            >
+            <el-tag v-for="participant in currentMeeting.participants"
+                    :key="participant.id"
+                    style="margin-right: 10px; margin-bottom: 10px;">
               {{ participant.name }}
             </el-tag>
           </div>
         </div>
-
         <div class="approval-opinion mt-20">
           <h4>鍙戝竷鎰忚</h4>
-          <el-input
-              v-model="publishComment"
-              type="textarea"
-              placeholder="璇疯緭鍏ュ彂甯冩剰瑙�"
-              :rows="4"
-          />
+          <el-input v-model="publishComment"
+                    type="textarea"
+                    placeholder="璇疯緭鍏ュ彂甯冩剰瑙�"
+                    :rows="4" />
         </div>
       </div>
-
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="approvalDialogVisible = false">鍙� 娑�</el-button>
-<!--          <el-button type="danger" @click="submitApproval('2')">涓嶉�氳繃</el-button>-->
-          <el-button type="primary" @click="submitApproval('1')">鍙� 甯�</el-button>
+          <!--          <el-button type="danger" @click="submitApproval('2')">涓嶉�氳繃</el-button>-->
+          <el-button type="primary"
+                     @click="submitApproval('1')">鍙� 甯�</el-button>
         </div>
       </template>
     </el-dialog>
@@ -182,231 +215,260 @@
 </template>
 
 <script setup>
-import {ref, reactive, onMounted} from 'vue'
-import {ElMessage, ElMessageBox} from 'element-plus'
-import Pagination from '@/components/Pagination/index.vue'
-import {getRoomEnum, getMeetingPublish,saveMeetingApplication} from '@/api/collaborativeApproval/meeting.js'
-import dayjs from "dayjs";
-import {staffOnJobListPage} from "@/api/personnelManagement/staffOnJob.js";
+  import { ref, reactive, onMounted } from "vue";
+  import { ElMessage, ElMessageBox } from "element-plus";
+  import Pagination from "@/components/Pagination/index.vue";
+  import {
+    getRoomEnum,
+    getMeetingPublish,
+    saveMeetingApplication,
+  } from "@/api/collaborativeApproval/meeting.js";
+  import dayjs from "dayjs";
+  import { userListNoPageByTenantId } from "@/api/system/user.js";
 
-// 鏁版嵁鍒楄〃鍔犺浇鐘舵��
-const loading = ref(false)
+  // 鏁版嵁鍒楄〃鍔犺浇鐘舵��
+  const loading = ref(false);
 
-// 鎬绘潯鏁�
-const total = ref(0)
+  // 鎬绘潯鏁�
+  const total = ref(0);
 
-// 琛ㄦ牸楂樺害锛堟牴鎹獥鍙i珮搴﹁嚜閫傚簲锛�
-const tableHeight = ref(window.innerHeight - 380)
-const roomEnum = ref([])
-const staffList = ref([])
-// 鍙戝竷鍒楄〃鏁版嵁
-const approvalList = ref([])
+  // 琛ㄦ牸楂樺害锛堟牴鎹獥鍙i珮搴﹁嚜閫傚簲锛�
+  const tableHeight = ref(window.innerHeight - 380);
+  const roomEnum = ref([]);
+  const userList = ref([]);
+  // 鍙戝竷鍒楄〃鏁版嵁
+  const approvalList = ref([]);
 
-// 鏌ヨ鍙傛暟
-const queryParams = reactive({
-  current: 1,
-  size: 10
-})
+  // 鏌ヨ鍙傛暟
+  const queryParams = reactive({
+    current: 1,
+    size: 10,
+  });
 
-// 鎼滅储琛ㄥ崟
-const searchForm = reactive({
-  title: '',
-  applicant: '',
-  status: ''
-})
+  // 鎼滅储琛ㄥ崟
+  const searchForm = reactive({
+    title: "",
+    applicant: "",
+    status: "",
+  });
 
-// 鏄惁鏄剧ず瀵硅瘽妗�
-const detailDialogVisible = ref(false)
-const approvalDialogVisible = ref(false)
+  // 鏄惁鏄剧ず瀵硅瘽妗�
+  const detailDialogVisible = ref(false);
+  const approvalDialogVisible = ref(false);
 
-// 褰撳墠鏌ョ湅鐨勪細璁�
-const currentMeeting = ref(null)
+  // 褰撳墠鏌ョ湅鐨勪細璁�
+  const currentMeeting = ref(null);
 
-// 鍙戝竷鎰忚
-const publishComment = ref('')
+  // 鍙戝竷鎰忚
+  const publishComment = ref("");
 
-// 鏌ヨ鏁版嵁
-const getList = async () => {
-  loading.value = true
-  let resp = await getMeetingPublish({...searchForm, ...queryParams})
-  approvalList.value = resp.data.records.map(it => {
-    let room = roomEnum.value.find(room => it.roomId === room.id)
-    it.location = `${room.name}(${room.location})`
-    let staffs = JSON.parse(it.participants)
-    it.staffCount = staffs.size
-    it.status = it.publishStatus
-    it.meetingTime = `${it.meetingDate} ${dayjs(it.startTime).format('HH:mm:ss')} ~ ${dayjs(it.endTime).format('HH:mm:ss')}`
-    it.participants = staffList.value.filter(staff => staffs.some(id=>id === staff.id)).map(staff => {
-      return {
-        id: staff.id,
-        name: `${staff.staffName}${staff.postName ? ` (${staff.postName})` : ''}`
+  // 鏌ヨ鏁版嵁
+  const getList = async () => {
+    loading.value = true;
+    let resp = await getMeetingPublish({ ...searchForm, ...queryParams });
+    const userMap = new Map(userList.value.map(u => [String(u.userId), u]));
+    approvalList.value = resp.data.records.map(it => {
+      let room = roomEnum.value.find(room => it.roomId === room.id);
+      it.location = `${room.name}(${room.location})`;
+      let participantIds = [];
+      try {
+        participantIds = Array.isArray(it.participants)
+          ? it.participants
+          : JSON.parse(it.participants);
+      } catch (_e) {
+        participantIds = [];
       }
-    })
+      if (!Array.isArray(participantIds)) participantIds = [];
+      it.staffCount = participantIds.length;
+      it.status = it.publishStatus;
+      it.meetingTime = `${it.meetingDate} ${dayjs(it.startTime).format(
+        "HH:mm:ss"
+      )} ~ ${dayjs(it.endTime).format("HH:mm:ss")}`;
+      it.participants = participantIds.map(id => {
+        const user = userMap.get(String(id));
+        const nickName = user?.nickName || user?.userName || String(id ?? "");
+        const deptNames = user?.deptNames || "";
+        return {
+          id,
+          name: deptNames ? `${nickName} (${deptNames})` : nickName,
+        };
+      });
 
+      return it;
+    });
+    total.value = resp.data.total;
+    loading.value = false;
+  };
 
-    return it
-  })
-  total.value = resp.data.total
-  loading.value = false
-}
+  // 鎼滅储鎸夐挳鎿嶄綔
+  const handleSearch = () => {
+    queryParams.pageNum = 1;
+    getList();
+  };
 
-// 鎼滅储鎸夐挳鎿嶄綔
-const handleSearch = () => {
-  queryParams.pageNum = 1
-  getList()
-}
+  // 閲嶇疆鎼滅储琛ㄥ崟
+  const resetSearch = () => {
+    Object.assign(searchForm, {
+      title: "",
+      applicant: "",
+      status: "",
+    });
+    handleSearch();
+  };
 
-// 閲嶇疆鎼滅储琛ㄥ崟
-const resetSearch = () => {
-  Object.assign(searchForm, {
-    title: '',
-    applicant: '',
-    status: ''
-  })
-  handleSearch()
-}
+  // 鏌ョ湅璇︽儏
+  const viewDetail = row => {
+    currentMeeting.value = row;
+    detailDialogVisible.value = true;
+  };
 
-// 鏌ョ湅璇︽儏
-const viewDetail = (row) => {
-  currentMeeting.value = row
-  detailDialogVisible.value = true
-}
+  // 澶勭悊鍙戝竷
+  const handleApproval = row => {
+    currentMeeting.value = row;
+    publishComment.value = "";
+    approvalDialogVisible.value = true;
+  };
 
-// 澶勭悊鍙戝竷
-const handleApproval = (row) => {
-  currentMeeting.value = row
-  publishComment.value = ''
-  approvalDialogVisible.value = true
-}
+  // 鑾峰彇鐘舵�佺被鍨�
+  const getStatusType = status => {
+    const statusMap = {
+      0: "info", // 寰呭彂甯�
+      1: "success", // 宸查�氳繃
+      2: "danger", // 鏈�氳繃
+    };
+    return statusMap[status] || "info";
+  };
 
-// 鑾峰彇鐘舵�佺被鍨�
-const getStatusType = (status) => {
-  const statusMap = {
-    '0': 'info',     // 寰呭彂甯�
-    '1': 'success',  // 宸查�氳繃
-    '2': 'danger',  // 鏈�氳繃
-  }
-  return statusMap[status] || 'info'
-}
+  // 鑾峰彇鐘舵�佹枃鏈�
+  const getStatusText = status => {
+    const statusMap = {
+      0: "寰呭彂甯�",
+      1: "宸插彂甯�",
+      2: "宸插彇娑�",
+    };
+    return statusMap[status] || "鏈煡";
+  };
 
-// 鑾峰彇鐘舵�佹枃鏈�
-const getStatusText = (status) => {
-  const statusMap = {
-    '0': '寰呭彂甯�',
-    '1': '宸插彂甯�',
-    '2': '宸插彇娑�',
-  }
-  return statusMap[status] || '鏈煡'
-}
+  // 鏍煎紡鍖栨棩鏈熸椂闂�
+  const formatDateTime = dateTime => {
+    if (!dateTime) return "";
+    return dateTime.replace(" ", "\n");
+  };
 
-// 鏍煎紡鍖栨棩鏈熸椂闂�
-const formatDateTime = (dateTime) => {
-  if (!dateTime) return ''
-  return dateTime.replace(' ', '\n')
-}
+  // 鎻愪氦鍙戝竷
+  const submitApproval = status => {
+    // if (status === 'approved' && !publishComment.value.trim()) {
+    //   ElMessage.warning('璇峰~鍐欏彂甯冩剰瑙�')
+    //   return
+    // }
 
-// 鎻愪氦鍙戝竷
-const submitApproval = (status) => {
-  // if (status === 'approved' && !publishComment.value.trim()) {
-  //   ElMessage.warning('璇峰~鍐欏彂甯冩剰瑙�')
-  //   return
-  // }
-
-  ElMessageBox.confirm(
-      `纭${status === '1' ? '鍙戝竷' : '鍙栨秷'}璇ヤ細璁紵`,
-      '鍙戝竷纭',
+    ElMessageBox.confirm(
+      `纭${status === "1" ? "鍙戝竷" : "鍙栨秷"}璇ヤ細璁紵`,
+      "鍙戝竷纭",
       {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning'
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
       }
-  ).then(() => {
-    saveMeetingApplication({
-      id: currentMeeting.value.id,
-      publishStatus: status,
-      publishComment: publishComment.value
-    }).then(resp=>{
-      // 鏇存柊浼氳鐘舵��
-      currentMeeting.value.status = status
+    )
+      .then(() => {
+        saveMeetingApplication({
+          id: currentMeeting.value.id,
+          publishStatus: status,
+          publishComment: publishComment.value,
+        }).then(resp => {
+          // 鏇存柊浼氳鐘舵��
+          currentMeeting.value.status = status;
 
-      ElMessage.success('鍙戝竷鎻愪氦鎴愬姛')
-      approvalDialogVisible.value = false
-      getList()
-    })
+          ElMessage.success("鍙戝竷鎻愪氦鎴愬姛");
+          approvalDialogVisible.value = false;
+          getList();
+        });
+      })
+      .catch(() => {});
+  };
 
-  }).catch(() => {
-  })
-}
+  // 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
+  onMounted(async () => {
+    const [resp1, resp2] = await Promise.all([
+      getRoomEnum(),
+      userListNoPageByTenantId(),
+    ]);
+    roomEnum.value = resp1.data;
+    const list = Array.isArray(resp2?.data) ? resp2.data : [];
+    userList.value = list
+      .map(item => ({
+        userId: item?.userId,
+        nickName: item?.nickName,
+        userName: item?.userName,
+        deptNames:
+          item?.deptNames || (item?.dept?.deptName ? item.dept.deptName : ""),
+      }))
+      .filter(item => item.userId !== null && item.userId !== undefined);
 
-// 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
-onMounted(async () => {
-  const [resp1, resp2]= await Promise.all([getRoomEnum(), staffOnJobListPage({current: -1, size: -1, staffState: 1})])
-  roomEnum.value = resp1.data
-  staffList.value = resp2.data.records
-
-  await getList()
-})
+    await getList();
+  });
 </script>
 
 <style scoped>
-.app-container {
-  padding: 20px;
-}
+  .app-container {
+    padding: 20px;
+  }
 
-.page-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 20px;
-}
+  .page-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 20px;
+  }
 
-.page-header h2 {
-  margin: 0;
-  color: #303133;
-}
+  .page-header h2 {
+    margin: 0;
+    color: #303133;
+  }
 
-.search-card {
-  margin-bottom: 20px;
-}
+  .search-card {
+    margin-bottom: 20px;
+  }
 
-.dialog-footer {
-  display: flex;
-  justify-content: flex-end;
-  gap: 10px;
-}
+  .dialog-footer {
+    display: flex;
+    justify-content: flex-end;
+    gap: 10px;
+  }
 
-.content-section h4 {
-  margin: 0 0 15px 0;
-  color: #303133;
-}
+  .content-section h4 {
+    margin: 0 0 15px 0;
+    color: #303133;
+  }
 
-.mt-20 {
-  margin-top: 20px;
-}
+  .mt-20 {
+    margin-top: 20px;
+  }
 
-.participants-list {
-  min-height: 40px;
-  padding: 15px;
-  border-radius: 4px;
-  line-height: 1.6;
-}
+  .participants-list {
+    min-height: 40px;
+    padding: 15px;
+    border-radius: 4px;
+    line-height: 1.6;
+  }
 
-.approval-opinion h4 {
-  margin: 0 0 15px 0;
-  color: #303133;
-}
+  .approval-opinion h4 {
+    margin: 0 0 15px 0;
+    color: #303133;
+  }
 
-.nowrap-label {
-  white-space: nowrap !important;
-}
+  .nowrap-label {
+    white-space: nowrap !important;
+  }
 
-.description-content {
-  white-space: pre-wrap;
-  word-wrap: break-word;
-  line-height: 1.6;
-  padding: 10px;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-  min-height: 60px;
-}
+  .description-content {
+    white-space: pre-wrap;
+    word-wrap: break-word;
+    line-height: 1.6;
+    padding: 10px;
+    background-color: #f5f7fa;
+    border-radius: 4px;
+    min-height: 60px;
+  }
 </style>
diff --git a/src/views/collaborativeApproval/notificationManagement/summary/index.vue b/src/views/collaborativeApproval/notificationManagement/summary/index.vue
index 2b26723..295d64e 100644
--- a/src/views/collaborativeApproval/notificationManagement/summary/index.vue
+++ b/src/views/collaborativeApproval/notificationManagement/summary/index.vue
@@ -1,153 +1,182 @@
 <template>
   <div>
-
-    <el-form :model="searchForm" inline>
-        <el-form-item label="浼氳涓婚">
-          <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ヤ細璁富棰�" clearable />
-        </el-form-item>
-        <el-form-item label="鐢宠浜�">
-          <el-input v-model="searchForm.applicant" placeholder="璇疯緭鍏ョ敵璇蜂汉" clearable />
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
-          <el-button @click="resetSearch">閲嶇疆</el-button>
-        </el-form-item>
-      </el-form>
-
+    <el-form :model="searchForm"
+             inline>
+      <el-form-item label="浼氳涓婚">
+        <el-input v-model="searchForm.title"
+                  placeholder="璇疯緭鍏ヤ細璁富棰�"
+                  clearable />
+      </el-form-item>
+      <el-form-item label="鐢宠浜�">
+        <el-input v-model="searchForm.applicant"
+                  placeholder="璇疯緭鍏ョ敵璇蜂汉"
+                  clearable />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary"
+                   @click="handleSearch">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
     <!-- 浼氳鍒楄〃 -->
     <el-card>
-      <el-table v-loading="loading" :data="meetingList" border :height="tableHeight">
-        <el-table-column prop="title" label="浼氳涓婚" align="center" min-width="200" show-overflow-tooltip />
-        <el-table-column prop="applicant" label="鐢宠浜�" align="center" width="120" />
-        <el-table-column prop="host" label="涓绘寔浜�" align="center" width="120" />
-        <el-table-column prop="meetingTime" label="浼氳鏃堕棿" align="center" width="180">
+      <el-table v-loading="loading"
+                :data="meetingList"
+                border
+                :height="tableHeight">
+        <el-table-column prop="title"
+                         label="浼氳涓婚"
+                         align="center"
+                         min-width="200"
+                         show-overflow-tooltip />
+        <el-table-column prop="applicant"
+                         label="鐢宠浜�"
+                         align="center"
+                         width="120" />
+        <el-table-column prop="host"
+                         label="涓绘寔浜�"
+                         align="center"
+                         width="120" />
+        <el-table-column prop="meetingTime"
+                         label="浼氳鏃堕棿"
+                         align="center"
+                         width="180">
           <template #default="scope">
             {{ formatDateTime(scope.row.meetingTime) }}
           </template>
         </el-table-column>
-        <el-table-column prop="location" label="浼氳鍦扮偣" align="center" width="150" />
-        <el-table-column prop="participants" label="鍙備細浜烘暟" align="center" width="100">
+        <el-table-column prop="location"
+                         label="浼氳鍦扮偣"
+                         align="center"
+                         width="150" />
+        <el-table-column prop="participants"
+                         label="鍙備細浜烘暟"
+                         align="center"
+                         width="100">
           <template #default="scope">
             {{ scope.row.participants.length }}浜�
           </template>
         </el-table-column>
-        <el-table-column label="鎿嶄綔" align="center" width="200" fixed="right">
+        <el-table-column label="鎿嶄綔"
+                         align="center"
+                         width="200"
+                         fixed="right">
           <template #default="scope">
-            <el-button type="primary" link @click="viewDetail(scope.row)">鏌ョ湅</el-button>
-            <el-button
-              type="primary"
-              link
-              @click="addMinutes(scope.row)"
-            >
+            <el-button type="primary"
+                       link
+                       @click="viewDetail(scope.row)">鏌ョ湅</el-button>
+            <el-button type="primary"
+                       link
+                       @click="addMinutes(scope.row)">
               娣诲姞绾
             </el-button>
           </template>
         </el-table-column>
       </el-table>
-
       <!-- 鍒嗛〉 -->
-      <pagination
-        v-show="total > 0"
-        :total="total"
-        v-model:page="queryParams.current"
-        v-model:limit="queryParams.size"
-        @pagination="getList"
-      />
+      <pagination v-show="total > 0"
+                  :total="total"
+                  v-model:page="queryParams.current"
+                  v-model:limit="queryParams.size"
+                  @pagination="getList" />
     </el-card>
-
     <!-- 浼氳璇︽儏瀵硅瘽妗� -->
-    <el-dialog
-      title="浼氳璇︽儏"
-      v-model="detailDialogVisible"
-      width="800px"
-    >
+    <el-dialog title="浼氳璇︽儏"
+               v-model="detailDialogVisible"
+               width="800px">
       <div v-if="currentMeeting">
-        <el-descriptions label-width="100px" class="meeting-desc" :column="2" border>
-          <el-descriptions-item label="浼氳涓婚" label-class-name="nowrap-label">{{
+        <el-descriptions label-width="100px"
+                         class="meeting-desc"
+                         :column="2"
+                         border>
+          <el-descriptions-item label="浼氳涓婚"
+                                label-class-name="nowrap-label">{{
             currentMeeting.title
           }}</el-descriptions-item>
-          <el-descriptions-item label="鐢宠浜�" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="鐢宠浜�"
+                                label-class-name="nowrap-label">{{
             currentMeeting.applicant
           }}</el-descriptions-item>
-          <el-descriptions-item label="涓绘寔浜�" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="涓绘寔浜�"
+                                label-class-name="nowrap-label">{{
             currentMeeting.host
           }}</el-descriptions-item>
-          <el-descriptions-item label="浼氳鏃堕棿" :span="2" label-class-name="nowrap-label">
+          <el-descriptions-item label="浼氳鏃堕棿"
+                                :span="2"
+                                label-class-name="nowrap-label">
             {{ formatDateTime(currentMeeting.meetingTime) }}
           </el-descriptions-item>
-          <el-descriptions-item label="浼氳鍦扮偣" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="浼氳鍦扮偣"
+                                label-class-name="nowrap-label">{{
             currentMeeting.location
           }}</el-descriptions-item>
-          <el-descriptions-item label="鍙備細浜烘暟" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="鍙備細浜烘暟"
+                                label-class-name="nowrap-label">{{
             currentMeeting.participants.length
           }}浜�</el-descriptions-item>
-          <el-descriptions-item label="瀹℃壒鐘舵��" label-class-name="nowrap-label">
+          <el-descriptions-item label="瀹℃壒鐘舵��"
+                                label-class-name="nowrap-label">
             <el-tag :type="getStatusType(currentMeeting.status)">
               {{ getStatusText(currentMeeting.status) }}
             </el-tag>
           </el-descriptions-item>
-          <el-descriptions-item label="鐢宠鏃堕棿" label-class-name="nowrap-label">{{
+          <el-descriptions-item label="鐢宠鏃堕棿"
+                                label-class-name="nowrap-label">{{
             currentMeeting.createTime
           }}</el-descriptions-item>
-          <el-descriptions-item style="max-height: 400px" label="浼氳璇存槑" :span="2"
-            label-class-name="nowrap-label">{{ currentMeeting.description }}</el-descriptions-item>
+          <el-descriptions-item style="max-height: 400px"
+                                label="浼氳璇存槑"
+                                :span="2"
+                                label-class-name="nowrap-label">{{ currentMeeting.description }}</el-descriptions-item>
         </el-descriptions>
-
         <div class="content-section mt-20">
           <h4>鍙備細浜哄憳</h4>
           <div class="participants-list">
-            <el-tag
-              v-for="participant in currentMeeting.participants"
-              :key="participant.id"
-              style="margin-right: 10px; margin-bottom: 10px;"
-            >
+            <el-tag v-for="participant in currentMeeting.participants"
+                    :key="participant.id"
+                    style="margin-right: 10px; margin-bottom: 10px;">
               {{ participant.name }}
             </el-tag>
           </div>
         </div>
       </div>
-
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="detailDialogVisible = false">鍏� 闂�</el-button>
         </div>
       </template>
     </el-dialog>
-
     <!-- 娣诲姞浼氳绾瀵硅瘽妗� -->
-    <el-dialog
-      title="娣诲姞浼氳绾"
-      v-model="minutesDialogVisible"
-      width="80%"
-      @close="handleCloseMinutesDialog"
-    >
+    <el-dialog title="娣诲姞浼氳绾"
+               v-model="minutesDialogVisible"
+               width="80%"
+               @close="handleCloseMinutesDialog">
       <div v-if="currentMeeting">
-        <el-descriptions :column="2" border>
+        <el-descriptions :column="2"
+                         border>
           <el-descriptions-item label="浼氳涓婚">{{ currentMeeting.title }}</el-descriptions-item>
           <el-descriptions-item label="鐢宠浜�">{{ currentMeeting.applicant }}</el-descriptions-item>
           <el-descriptions-item label="涓绘寔浜�">{{ currentMeeting.host }}</el-descriptions-item>
-          <el-descriptions-item label="浼氳鏃堕棿" :span="2">
+          <el-descriptions-item label="浼氳鏃堕棿"
+                                :span="2">
             {{ formatDateTime(currentMeeting.meetingTime) }}
           </el-descriptions-item>
           <el-descriptions-item label="浼氳鍦扮偣">{{ currentMeeting.location }}</el-descriptions-item>
           <el-descriptions-item label="鍙備細浜烘暟">{{ currentMeeting.participants.length }}浜�</el-descriptions-item>
         </el-descriptions>
-
         <div class="content-section mt-20">
           <h4>浼氳绾鍐呭</h4>
           <div class="editor-container">
-            <Editor
-              v-model="minutesContent"
-              :min-height="400"
-            />
+            <Editor v-model="minutesContent"
+                    :min-height="400" />
           </div>
         </div>
       </div>
-
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="minutesDialogVisible = false">鍙� 娑�</el-button>
-          <el-button type="primary" @click="submitMinutes">淇� 瀛�</el-button>
+          <el-button type="primary"
+                     @click="submitMinutes">淇� 瀛�</el-button>
         </div>
       </template>
     </el-dialog>
@@ -155,245 +184,278 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted } from 'vue'
-import { ElMessage } from 'element-plus'
-import Pagination from '@/components/Pagination/index.vue'
-import Editor from '@/components/Editor/index.vue'
-import { getRoomEnum, getMeetingPublish ,getMeetingMinutesByMeetingId,saveMeetingMinutes} from '@/api/collaborativeApproval/meeting.js'
-import dayjs from "dayjs"
-import {staffOnJobListPage} from "@/api/personnelManagement/staffOnJob.js";
+  import { ref, reactive, onMounted } from "vue";
+  import { ElMessage } from "element-plus";
+  import Pagination from "@/components/Pagination/index.vue";
+  import Editor from "@/components/Editor/index.vue";
+  import {
+    getRoomEnum,
+    getMeetingPublish,
+    getMeetingMinutesByMeetingId,
+    saveMeetingMinutes,
+  } from "@/api/collaborativeApproval/meeting.js";
+  import dayjs from "dayjs";
+  import { userListNoPageByTenantId } from "@/api/system/user.js";
 
-// 鏁版嵁鍒楄〃鍔犺浇鐘舵��
-const loading = ref(false)
+  // 鏁版嵁鍒楄〃鍔犺浇鐘舵��
+  const loading = ref(false);
 
-// 鎬绘潯鏁�
-const total = ref(0)
+  // 鎬绘潯鏁�
+  const total = ref(0);
 
-// 琛ㄦ牸楂樺害锛堟牴鎹獥鍙i珮搴﹁嚜閫傚簲锛�
-const tableHeight = ref(window.innerHeight - 380)
-const roomEnum = ref([])
-const staffList = ref([])
+  // 琛ㄦ牸楂樺害锛堟牴鎹獥鍙i珮搴﹁嚜閫傚簲锛�
+  const tableHeight = ref(window.innerHeight - 380);
+  const roomEnum = ref([]);
+  const userList = ref([]);
 
-// 浼氳鍒楄〃鏁版嵁
-const meetingList = ref([])
+  // 浼氳鍒楄〃鏁版嵁
+  const meetingList = ref([]);
 
-// 鏌ヨ鍙傛暟
-const queryParams = reactive({
-  current: 1,
-  size: 10
-})
+  // 鏌ヨ鍙傛暟
+  const queryParams = reactive({
+    current: 1,
+    size: 10,
+  });
 
-// 鎼滅储琛ㄥ崟
-const searchForm = reactive({
-  title: '',
-  applicant: '',
-  // status: '1' // 榛樿鍙樉绀哄凡閫氳繃瀹℃壒鐨勪細璁�
-})
+  // 鎼滅储琛ㄥ崟
+  const searchForm = reactive({
+    title: "",
+    applicant: "",
+    // status: '1' // 榛樿鍙樉绀哄凡閫氳繃瀹℃壒鐨勪細璁�
+  });
 
-// 鏄惁鏄剧ず瀵硅瘽妗�
-const detailDialogVisible = ref(false)
-const minutesDialogVisible = ref(false)
+  // 鏄惁鏄剧ず瀵硅瘽妗�
+  const detailDialogVisible = ref(false);
+  const minutesDialogVisible = ref(false);
 
-// 褰撳墠鏌ョ湅鐨勪細璁�
-const currentMeeting = ref(null)
+  // 褰撳墠鏌ョ湅鐨勪細璁�
+  const currentMeeting = ref(null);
 
-// 浼氳绾鍐呭
-const minutesContent = ref('')
-const minutesContentId = ref('')
+  // 浼氳绾鍐呭
+  const minutesContent = ref("");
+  const minutesContentId = ref("");
 
-// 鏌ヨ鏁版嵁
-const getList = async () => {
-  loading.value = true
-  let resp = await getMeetingPublish({ ...searchForm, ...queryParams })
-  meetingList.value = resp.data.records.map(it => {
-    let room = roomEnum.value.find(room => it.roomId === room.id)
-    it.location = `${room.name}(${room.location})`
-    let staffs = JSON.parse(it.participants)
-    it.staffCount = staffs.size
-    it.meetingTime = `${it.meetingDate} ${dayjs(it.startTime).format('HH:mm:ss')} ~ ${dayjs(it.endTime).format('HH:mm:ss')}`
-    it.participants = staffList.value.filter(staff => staffs.some(id => id === staff.id)).map(staff => {
-      return {
-        id: staff.id,
-        name:  `${staff.staffName}${staff.postName ? ` (${staff.postName})` : ''}`
-      }
-    })
+  const parseParticipants = raw => {
+    if (!raw) return [];
+    if (Array.isArray(raw)) return raw;
+    try {
+      const parsed = JSON.parse(raw);
+      return Array.isArray(parsed) ? parsed : [];
+    } catch (_e) {
+      return [];
+    }
+  };
 
-    return it
-  })
-  total.value = resp.data.total
-  loading.value = false
-}
+  // 鏌ヨ鏁版嵁
+  const getList = async () => {
+    loading.value = true;
+    let resp = await getMeetingPublish({ ...searchForm, ...queryParams });
+    const userMap = new Map(userList.value.map(u => [String(u.userId), u]));
+    meetingList.value = resp.data.records.map(it => {
+      let room = roomEnum.value.find(room => it.roomId === room.id);
+      it.location = `${room.name}(${room.location})`;
+      const participantIds = parseParticipants(it.participants);
+      it.staffCount = participantIds.length;
+      it.meetingTime = `${it.meetingDate} ${dayjs(it.startTime).format(
+        "HH:mm:ss"
+      )} ~ ${dayjs(it.endTime).format("HH:mm:ss")}`;
+      it.participants = participantIds.map(id => {
+        const user = userMap.get(String(id));
+        const nickName = user?.nickName || user?.userName || String(id ?? "");
+        const deptNames = user?.deptNames || "";
+        return {
+          id,
+          name: deptNames ? `${nickName} (${deptNames})` : nickName,
+        };
+      });
 
-// 鎼滅储鎸夐挳鎿嶄綔
-const handleSearch = () => {
-  queryParams.current = 1
-  getList()
-}
+      return it;
+    });
+    total.value = resp.data.total;
+    loading.value = false;
+  };
 
-// 閲嶇疆鎼滅储琛ㄥ崟
-const resetSearch = () => {
-  Object.assign(searchForm, {
-    title: '',
-    applicant: '',
-    // status: '1'
-  })
-  handleSearch()
-}
+  // 鎼滅储鎸夐挳鎿嶄綔
+  const handleSearch = () => {
+    queryParams.current = 1;
+    getList();
+  };
 
-// 鏌ョ湅璇︽儏
-const viewDetail = (row) => {
-  currentMeeting.value = row
-  detailDialogVisible.value = true
-}
+  // 閲嶇疆鎼滅储琛ㄥ崟
+  const resetSearch = () => {
+    Object.assign(searchForm, {
+      title: "",
+      applicant: "",
+      // status: '1'
+    });
+    handleSearch();
+  };
 
-// 娣诲姞浼氳绾
-const addMinutes = async (row) => {
-  let resp = await getMeetingMinutesByMeetingId(row.id)
-  currentMeeting.value = row
-  if (resp.data){
-    minutesContent.value = resp.data.content
-    minutesContentId.value = resp.data.id
-  }else {
-    minutesContent.value = `<h2>${row.title}浼氳绾</h2>
-<p><strong>浼氳鏃堕棿锛�</strong>${row.meetingTime}</p>
-<p><strong>浼氳鍦扮偣锛�</strong>${row.location}</p>
-<p><strong>涓绘寔浜猴細</strong>${row.host}</p>
-<p><strong>鍙備細浜哄憳锛�</strong></p>
-<ol>
-  ${row.participants.map(p => `<li>${p.name}</li>`).join('')}
-</ol>
-<p><strong>浼氳鍐呭锛�</strong></p>
-<ol>
-  <li>璁涓�锛�
-    <ul>
-      <li>璁ㄨ鍐呭锛�</li>
-      <li>鍐宠浜嬮」锛�</li>
-    </ul>
-  </li>
-  <li>璁浜岋細
-    <ul>
-      <li>璁ㄨ鍐呭锛�</li>
-      <li>鍐宠浜嬮」锛�</li>
-    </ul>
-  </li>
-</ol>
-<p><strong>澶囨敞锛�</strong></p>`
-  }
+  // 鏌ョ湅璇︽儏
+  const viewDetail = row => {
+    currentMeeting.value = row;
+    detailDialogVisible.value = true;
+  };
 
-  minutesDialogVisible.value = true
-}
+  // 娣诲姞浼氳绾
+  const addMinutes = async row => {
+    let resp = await getMeetingMinutesByMeetingId(row.id);
+    currentMeeting.value = row;
+    if (resp.data) {
+      minutesContent.value = resp.data.content;
+      minutesContentId.value = resp.data.id;
+    } else {
+      minutesContent.value = `<h2>${row.title}浼氳绾</h2>
+  <p><strong>浼氳鏃堕棿锛�</strong>${row.meetingTime}</p>
+  <p><strong>浼氳鍦扮偣锛�</strong>${row.location}</p>
+  <p><strong>涓绘寔浜猴細</strong>${row.host}</p>
+  <p><strong>鍙備細浜哄憳锛�</strong></p>
+  <ol>
+    ${row.participants.map(p => `<li>${p.name}</li>`).join("")}
+  </ol>
+  <p><strong>浼氳鍐呭锛�</strong></p>
+  <ol>
+    <li>璁涓�锛�
+      <ul>
+        <li>璁ㄨ鍐呭锛�</li>
+        <li>鍐宠浜嬮」锛�</li>
+      </ul>
+    </li>
+    <li>璁浜岋細
+      <ul>
+        <li>璁ㄨ鍐呭锛�</li>
+        <li>鍐宠浜嬮」锛�</li>
+      </ul>
+    </li>
+  </ol>
+  <p><strong>澶囨敞锛�</strong></p>`;
+    }
 
-// 鎻愪氦浼氳绾
-const submitMinutes = () => {
-  if (!minutesContent.value) {
-    ElMessage.warning('璇疯緭鍏ヤ細璁邯瑕佸唴瀹�')
-    return
-  }
-  saveMeetingMinutes({
-    id: minutesContentId.value,
-    content: minutesContent.value,
-    meetingId: currentMeeting.value.id,
-    title: currentMeeting.value.title
-  }).then(resp=>{
-    console.log('浼氳绾鍐呭:', minutesContent.value)
-    ElMessage.success('浼氳绾淇濆瓨鎴愬姛')
-    minutesDialogVisible.value = false
-  })
+    minutesDialogVisible.value = true;
+  };
 
-}
+  // 鎻愪氦浼氳绾
+  const submitMinutes = () => {
+    if (!minutesContent.value) {
+      ElMessage.warning("璇疯緭鍏ヤ細璁邯瑕佸唴瀹�");
+      return;
+    }
+    saveMeetingMinutes({
+      id: minutesContentId.value,
+      content: minutesContent.value,
+      meetingId: currentMeeting.value.id,
+      title: currentMeeting.value.title,
+    }).then(resp => {
+      console.log("浼氳绾鍐呭:", minutesContent.value);
+      ElMessage.success("浼氳绾淇濆瓨鎴愬姛");
+      minutesDialogVisible.value = false;
+    });
+  };
 
-// 鍏抽棴浼氳绾瀵硅瘽妗�
-const handleCloseMinutesDialog = () => {
-  minutesContent.value = ''
-}
+  // 鍏抽棴浼氳绾瀵硅瘽妗�
+  const handleCloseMinutesDialog = () => {
+    minutesContent.value = "";
+  };
 
-// 鑾峰彇鐘舵�佺被鍨�
-const getStatusType = (status) => {
-  const statusMap = {
-    '0': 'info',     // 寰呭鎵�
-    '1': 'success',  // 宸查�氳繃
-    '2': 'warning',  // 鏈�氳繃
-    '3': 'danger'   // 鍙栨秷
-  }
-  return statusMap[status] || 'info'
-}
+  // 鑾峰彇鐘舵�佺被鍨�
+  const getStatusType = status => {
+    const statusMap = {
+      0: "info", // 寰呭鎵�
+      1: "success", // 宸查�氳繃
+      2: "warning", // 鏈�氳繃
+      3: "danger", // 鍙栨秷
+    };
+    return statusMap[status] || "info";
+  };
 
-// 鑾峰彇鐘舵�佹枃鏈�
-const getStatusText = (status) => {
-  const statusMap = {
-    '0': '寰呭鎵�',
-    '1': '宸查�氳繃',
-    '2': '鏈�氳繃',
-    '3': '宸插彇娑�'
-  }
-  return statusMap[status] || '鏈煡'
-}
+  // 鑾峰彇鐘舵�佹枃鏈�
+  const getStatusText = status => {
+    const statusMap = {
+      0: "寰呭鎵�",
+      1: "宸查�氳繃",
+      2: "鏈�氳繃",
+      3: "宸插彇娑�",
+    };
+    return statusMap[status] || "鏈煡";
+  };
 
-// 鏍煎紡鍖栨棩鏈熸椂闂�
-const formatDateTime = (dateTime) => {
-  if (!dateTime) return ''
-  return dateTime.replace(' ', '\n')
-}
+  // 鏍煎紡鍖栨棩鏈熸椂闂�
+  const formatDateTime = dateTime => {
+    if (!dateTime) return "";
+    return dateTime.replace(" ", "\n");
+  };
 
-// 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
-onMounted(async () => {
-  const [resp1, resp2] = await Promise.all([getRoomEnum(), staffOnJobListPage({current: -1, size: -1, staffState: 1})])
-  roomEnum.value = resp1.data
-  staffList.value = resp2.data.records
+  // 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
+  onMounted(async () => {
+    const [resp1, resp2] = await Promise.all([
+      getRoomEnum(),
+      userListNoPageByTenantId(),
+    ]);
+    roomEnum.value = resp1.data;
+    const list = Array.isArray(resp2?.data) ? resp2.data : [];
+    userList.value = list
+      .map(item => ({
+        userId: item?.userId,
+        nickName: item?.nickName,
+        userName: item?.userName,
+        deptNames:
+          item?.deptNames || (item?.dept?.deptName ? item.dept.deptName : ""),
+      }))
+      .filter(item => item.userId !== null && item.userId !== undefined);
 
-  await getList()
-})
+    await getList();
+  });
 </script>
 
 <style scoped>
-.app-container {
-  padding: 20px;
-}
+  .app-container {
+    padding: 20px;
+  }
 
-.page-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 20px;
-}
+  .page-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 20px;
+  }
 
-.page-header h2 {
-  margin: 0;
-  color: #303133;
-}
+  .page-header h2 {
+    margin: 0;
+    color: #303133;
+  }
 
-.search-card {
-  margin-bottom: 20px;
-}
+  .search-card {
+    margin-bottom: 20px;
+  }
 
-.dialog-footer {
-  display: flex;
-  justify-content: flex-end;
-  gap: 10px;
-}
+  .dialog-footer {
+    display: flex;
+    justify-content: flex-end;
+    gap: 10px;
+  }
 
-.content-section h4 {
-  margin: 0 0 15px 0;
-  color: #303133;
-}
+  .content-section h4 {
+    margin: 0 0 15px 0;
+    color: #303133;
+  }
 
-.mt-20 {
-  margin-top: 20px;
-}
+  .mt-20 {
+    margin-top: 20px;
+  }
 
-.participants-list {
-  min-height: 40px;
-  padding: 15px;
-  border-radius: 4px;
-  line-height: 1.6;
-}
+  .participants-list {
+    min-height: 40px;
+    padding: 15px;
+    border-radius: 4px;
+    line-height: 1.6;
+  }
 
-.nowrap-label {
-  white-space: nowrap !important;
-}
+  .nowrap-label {
+    white-space: nowrap !important;
+  }
 
-.editor-container {
-  border: 1px solid #dcdfe6;
-  border-radius: 4px;
-}
+  .editor-container {
+    border: 1px solid #dcdfe6;
+    border-radius: 4px;
+  }
 </style>

--
Gitblit v1.9.3