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/summary/index.vue |  399 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 399 insertions(+), 0 deletions(-)

diff --git a/src/views/collaborativeApproval/notificationManagement/summary/index.vue b/src/views/collaborativeApproval/notificationManagement/summary/index.vue
new file mode 100644
index 0000000..a00316d
--- /dev/null
+++ b/src/views/collaborativeApproval/notificationManagement/summary/index.vue
@@ -0,0 +1,399 @@
+<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-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">
+          <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 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>
+          </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="minutesDialogVisible"
+      width="80%"
+      @close="handleCloseMinutesDialog"
+    >
+      <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="editor-container">
+            <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>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</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 { 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 meetingList = ref([])
+
+// 鏌ヨ鍙傛暟
+const queryParams = reactive({
+  current: 1,
+  size: 10
+})
+
+// 鎼滅储琛ㄥ崟
+const searchForm = reactive({
+  title: '',
+  applicant: '',
+  // status: '1' // 榛樿鍙樉绀哄凡閫氳繃瀹℃壒鐨勪細璁�
+})
+
+// 鏄惁鏄剧ず瀵硅瘽妗�
+const detailDialogVisible = ref(false)
+const minutesDialogVisible = ref(false)
+
+// 褰撳墠鏌ョ湅鐨勪細璁�
+const currentMeeting = ref(null)
+
+// 浼氳绾鍐呭
+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.postJob})`
+      }
+    })
+
+    return it
+  })
+  total.value = resp.data.total
+  loading.value = false
+}
+
+// 鎼滅储鎸夐挳鎿嶄綔
+const handleSearch = () => {
+  queryParams.current = 1
+  getList()
+}
+
+// 閲嶇疆鎼滅储琛ㄥ崟
+const resetSearch = () => {
+  Object.assign(searchForm, {
+    title: '',
+    applicant: '',
+    // status: '1'
+  })
+  handleSearch()
+}
+
+// 鏌ョ湅璇︽儏
+const viewDetail = (row) => {
+  currentMeeting.value = row
+  detailDialogVisible.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>`
+  }
+
+  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 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')
+}
+
+// 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
+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;
+}
+
+.nowrap-label {
+  white-space: nowrap !important;
+}
+
+.editor-container {
+  border: 1px solid #dcdfe6;
+  border-radius: 4px;
+}
+</style>

--
Gitblit v1.9.3