From 42a1a434f77154746038c476ef70ca9be0b8e4e0 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期一, 19 一月 2026 18:02:46 +0800
Subject: [PATCH] fix: 完成资金管理,财务对账
---
src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue | 414 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 414 insertions(+), 0 deletions(-)
diff --git a/src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue b/src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue
new file mode 100644
index 0000000..83747a0
--- /dev/null
+++ b/src/views/collaborativeApproval/notificationManagement/meetExamine/index.vue
@@ -0,0 +1,414 @@
+<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-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">
+ <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">
+ <template #default="scope">
+ {{ scope.row.participants.length }}浜�
+ </template>
+ </el-table-column>
+ <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">
+ <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>
+ </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"
+ />
+ </el-card>
+
+ <!-- 浼氳璇︽儏瀵硅瘽妗� -->
+ <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">{{
+ currentMeeting.title
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鐢宠浜�" label-class-name="nowrap-label">{{
+ currentMeeting.applicant
+ }}</el-descriptions-item>
+ <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">
+ {{ formatDateTime(currentMeeting.meetingTime) }}
+ </el-descriptions-item>
+ <el-descriptions-item label="浼氳鍦扮偣" label-class-name="nowrap-label">{{
+ currentMeeting.location
+ }}</el-descriptions-item>
+ <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-tag :type="getStatusType(currentMeeting.status)">
+ {{ getStatusText(currentMeeting.status) }}
+ </el-tag>
+ </el-descriptions-item>
+ <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>
+
+
+ <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;"
+ >
+ {{ 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"
+ >
+ <div v-if="currentMeeting">
+ <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">
+ {{ 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;"
+ >
+ {{ participant.name }}
+ </el-tag>
+ </div>
+ </div>
+
+ <div v-show="false" class="approval-opinion mt-20">
+ <h4>瀹℃壒鎰忚</h4>
+ <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>
+ </div>
+ </template>
+ </el-dialog>
+ </div>
+</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 {getStaffOnJob} from "@/api/personnelManagement/onboarding.js";
+import dayjs from "dayjs";
+
+// 鏁版嵁鍒楄〃鍔犺浇鐘舵��
+const loading = ref(false)
+
+// 鎬绘潯鏁�
+const total = ref(0)
+
+// 琛ㄦ牸楂樺害锛堟牴鎹獥鍙i珮搴﹁嚜閫傚簲锛�
+const tableHeight = ref(window.innerHeight - 380)
+const roomEnum = ref([])
+const staffList = ref([])
+// 瀹℃壒鍒楄〃鏁版嵁
+const approvalList = ref([])
+
+// 鏌ヨ鍙傛暟
+const queryParams = reactive({
+ current: 1,
+ size: 10
+})
+
+// 鎼滅储琛ㄥ崟
+const searchForm = reactive({
+ title: '',
+ applicant: '',
+ status: ''
+})
+
+// 鏄惁鏄剧ず瀵硅瘽妗�
+const detailDialogVisible = ref(false)
+const approvalDialogVisible = ref(false)
+
+// 褰撳墠鏌ョ湅鐨勪細璁�
+const currentMeeting = ref(null)
+
+// 瀹℃壒鎰忚
+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.postJob})`
+ }
+ })
+
+
+ return it
+ })
+ total.value = resp.data.total
+ loading.value = false
+}
+
+// 鎼滅储鎸夐挳鎿嶄綔
+const handleSearch = () => {
+ queryParams.pageNum = 1
+ getList()
+}
+
+// 閲嶇疆鎼滅储琛ㄥ崟
+const resetSearch = () => {
+ Object.assign(searchForm, {
+ title: '',
+ applicant: '',
+ status: ''
+ })
+ handleSearch()
+}
+
+// 鏌ョ湅璇︽儏
+const viewDetail = (row) => {
+ currentMeeting.value = row
+ detailDialogVisible.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 getStatusText = (status) => {
+ const statusMap = {
+ '0': '寰呭鎵�',
+ '1': '宸查�氳繃',
+ '2': '鏈�氳繃',
+ '3': '宸插彇娑�'
+ }
+ return statusMap[status] || '鏈煡'
+}
+
+// 鏍煎紡鍖栨棩鏈熸椂闂�
+const formatDateTime = (dateTime) => {
+ if (!dateTime) return ''
+ return dateTime.replace(' ', '\n')
+}
+
+// 鎻愪氦瀹℃壒
+const submitApproval = (status) => {
+ // if (status === 'approved' && !approvalOpinion.value.trim()) {
+ // ElMessage.warning('璇峰~鍐欏鎵规剰瑙�')
+ // return
+ // }
+
+ ElMessageBox.confirm(
+ `纭${status === '1' ? '閫氳繃' : '涓嶉�氳繃'}璇ヤ細璁敵璇凤紵`,
+ '瀹℃壒纭',
+ {
+ confirmButtonText: '纭畾',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ }
+ ).then(() => {
+ saveMeetingApplication({
+ id: currentMeeting.value.id,
+ status: status
+ }).then(resp=>{
+ // 鏇存柊浼氳鐘舵��
+ currentMeeting.value.status = status
+
+ ElMessage.success('瀹℃壒鎻愪氦鎴愬姛')
+ approvalDialogVisible.value = false
+ getList()
+ })
+
+ }).catch(() => {
+ })
+}
+
+// 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
+onMounted(async () => {
+ const [resp1, resp2]= await Promise.all([getRoomEnum(), getStaffOnJob()])
+ roomEnum.value = resp1.data
+ staffList.value = resp2.data
+
+ await getList()
+})
+</script>
+
+<style scoped>
+.app-container {
+ padding: 20px;
+}
+
+.page-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 20px;
+}
+
+.page-header h2 {
+ margin: 0;
+ color: #303133;
+}
+
+.search-card {
+ margin-bottom: 20px;
+}
+
+.dialog-footer {
+ display: flex;
+ justify-content: flex-end;
+ gap: 10px;
+}
+
+.content-section h4 {
+ margin: 0 0 15px 0;
+ color: #303133;
+}
+
+.mt-20 {
+ margin-top: 20px;
+}
+
+.participants-list {
+ min-height: 40px;
+ padding: 15px;
+ border-radius: 4px;
+ line-height: 1.6;
+}
+
+.approval-opinion h4 {
+ margin: 0 0 15px 0;
+ color: #303133;
+}
+
+.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;
+}
+</style>
--
Gitblit v1.9.3