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