From 8a22c10dd6a1a635e44b97056efb6f5627b395e4 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期三, 21 一月 2026 10:21:31 +0800
Subject: [PATCH] 会议看板
---
src/pages/index.vue | 18 +
src/api/collaborativeApproval/approvalProcess.js | 1
src/pages.json | 7
src/pages/managementMeetings/meetSummary/approve.vue | 90 ++++----
src/pages/managementMeetings/meetingBoard/index.vue | 394 +++++++++++++++++++++++++++++++++++++++
src/api/managementMeetings/meetExamine.js | 13 +
src/pages/cooperativeOffice/collaborativeApproval/detail.vue | 36 +++
7 files changed, 512 insertions(+), 47 deletions(-)
diff --git a/src/api/collaborativeApproval/approvalProcess.js b/src/api/collaborativeApproval/approvalProcess.js
index 415bed8..47cf3ec 100644
--- a/src/api/collaborativeApproval/approvalProcess.js
+++ b/src/api/collaborativeApproval/approvalProcess.js
@@ -30,6 +30,7 @@
data: query,
})
}
+
// 淇敼瀹℃壒娴佺▼
export function approveProcessUpdate(query) {
return request({
diff --git a/src/api/managementMeetings/meetExamine.js b/src/api/managementMeetings/meetExamine.js
index c40a905..3a43e20 100644
--- a/src/api/managementMeetings/meetExamine.js
+++ b/src/api/managementMeetings/meetExamine.js
@@ -45,3 +45,16 @@
data: data,
});
}
+export function getMeetSummary(){
+ return request({
+ url: "/meeting/getMeetSummary",
+ method: "get",
+ });
+}
+
+export function getMeetSummaryItems(){
+ return request({
+ url: "/meeting/getMeetSummaryItems",
+ method: "get",
+ });
+}
diff --git a/src/pages.json b/src/pages.json
index ca4a8e0..fa92849 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -359,6 +359,13 @@
}
},
{
+ "path": "pages/managementMeetings/meetingBoard/index",
+ "style": {
+ "navigationBarTitleText": "浼氳鐪嬫澘",
+ "navigationStyle": "custom"
+ }
+ },
+ {
"path": "pages/managementMeetings/meetSummary/approve",
"style": {
"navigationBarTitleText": "鎬荤粨",
diff --git a/src/pages/cooperativeOffice/collaborativeApproval/detail.vue b/src/pages/cooperativeOffice/collaborativeApproval/detail.vue
index 541e87b..dc7a869 100644
--- a/src/pages/cooperativeOffice/collaborativeApproval/detail.vue
+++ b/src/pages/cooperativeOffice/collaborativeApproval/detail.vue
@@ -53,24 +53,36 @@
readonly
placeholder="璇烽�夋嫨"
@click="showDatePicker" />
+ <template #right>
+ <up-icon name="arrow-right"
+ @click="showDatePicker"></up-icon>
+ </template>
</u-form-item>
<!-- approveType=2 璇峰亣鐩稿叧瀛楁 -->
<template v-if="approveType === 2">
<u-form-item prop="startDate"
- label="璇峰亣寮�濮嬫椂闂�"
+ label="寮�濮嬫椂闂�"
required>
<u-input v-model="form.startDate"
readonly
- placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
+ placeholder="璇峰亣寮�濮嬫椂闂�"
@click="showStartDatePicker" />
+ <template #right>
+ <up-icon name="arrow-right"
+ @click="showStartDatePicker"></up-icon>
+ </template>
</u-form-item>
<u-form-item prop="endDate"
- label="璇峰亣缁撴潫鏃堕棿"
+ label="缁撴潫鏃堕棿"
required>
<u-input v-model="form.endDate"
readonly
- placeholder="璇烽�夋嫨缁撴潫鏃堕棿"
+ placeholder="璇峰亣缁撴潫鏃堕棿"
@click="showEndDatePicker" />
+ <template #right>
+ <up-icon name="arrow-right"
+ @click="showEndDatePicker"></up-icon>
+ </template>
</u-form-item>
</template>
<!-- approveType=3 鍑哄樊鐩稿叧瀛楁 -->
@@ -400,7 +412,21 @@
.map(node => node.userId)
.join(",");
form.value.approveType = approveType.value;
- console.log("form.value---", form.value);
+ form.value.approveDeptId = Number(form.value.approveDeptId);
+ // const submitForm = {
+ // approveDeptId: form.value.approveDeptId,
+ // approveDeptName: form.value.approveDeptName,
+ // approveReason: form.value.approveReason,
+ // approveTime: form.value.approveTime,
+ // approveType: form.value.approveType,
+ // approveUser: form.value.approveUser,
+ // approveUserIds: form.value.approveUserIds,
+ // endDate: form.value.endDate,
+ // startDate: form.value.startDate,
+ // };
+ // console.log("form.value---", form.value);
+ // console.log("submitForm", submitForm);
+
if (operationType.value === "add" || currentApproveStatus.value == 3) {
approveProcessAdd(form.value).then(res => {
showToast("鎻愪氦鎴愬姛");
diff --git a/src/pages/index.vue b/src/pages/index.vue
index 5fa2e5c..532b7b3 100644
--- a/src/pages/index.vue
+++ b/src/pages/index.vue
@@ -331,6 +331,14 @@
label: "浼氳鎬荤粨",
},
{
+ icon: "/static/images/icon/qingjiaguanli@2x.png",
+ label: "浼氳鐪嬫澘",
+ },
+ {
+ icon: "/static/images/icon/qingjiaguanli@2x.png",
+ label: "閫氱煡鍏憡",
+ },
+ {
icon: "/static/images/icon/xietongshenpi@2x.png",
label: "鍗忓悓瀹℃壒",
},
@@ -538,6 +546,16 @@
url: "/pages/managementMeetings/meetSummary/index",
});
break;
+ case "浼氳鐪嬫澘":
+ uni.navigateTo({
+ url: "/pages/managementMeetings/meetingBoard/index",
+ });
+ break;
+ case "閫氱煡鍏憡":
+ uni.navigateTo({
+ url: "/pages/cooperativeOffice/noticeManagement/index",
+ });
+ break;
case "鍗忓悓瀹℃壒":
uni.navigateTo({
url: "/pages/cooperativeOffice/collaborativeApproval/index",
diff --git a/src/pages/managementMeetings/meetSummary/approve.vue b/src/pages/managementMeetings/meetSummary/approve.vue
index f2b8193..c30c8be 100644
--- a/src/pages/managementMeetings/meetSummary/approve.vue
+++ b/src/pages/managementMeetings/meetSummary/approve.vue
@@ -82,6 +82,12 @@
const approvalData = ref({});
const approvalSteps = ref([]);
const isEdit = ref(false);
+ const showToast = message => {
+ uni.showToast({
+ title: message,
+ icon: "none",
+ });
+ };
onLoad(options => {
console.log(options, "options");
if (options.item) {
@@ -143,48 +149,48 @@
minutesContentId.value = res.data.id;
} else {
minutesContent.value = `<h2>${approvalData.value.title}浼氳绾</h2>
- <p><strong>浼氳鏃堕棿锛�</strong>${
- approvalData
- .value
- .meetingTime
- }</p>
- <p><strong>浼氳鍦扮偣锛�</strong>${
- approvalData
- .value
- .location
- }</p>
- <p><strong>涓绘寔浜猴細</strong>${
- approvalData
- .value
- .host
- }</p>
- <p><strong>鍙備細浜哄憳锛�</strong></p>
- <ol>
- ${approvalData.value.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>`;
+ <p><strong>浼氳鏃堕棿锛�</strong>${
+ approvalData
+ .value
+ .meetingTime
+ }</p>
+ <p><strong>浼氳鍦扮偣锛�</strong>${
+ approvalData
+ .value
+ .location
+ }</p>
+ <p><strong>涓绘寔浜猴細</strong>${
+ approvalData
+ .value
+ .host
+ }</p>
+ <p><strong>鍙備細浜哄憳锛�</strong></p>
+ <ol>
+ ${approvalData.value.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>`;
}
})
.catch(error => {
diff --git a/src/pages/managementMeetings/meetingBoard/index.vue b/src/pages/managementMeetings/meetingBoard/index.vue
new file mode 100644
index 0000000..47a32bd
--- /dev/null
+++ b/src/pages/managementMeetings/meetingBoard/index.vue
@@ -0,0 +1,394 @@
+// 瀹℃壒绠$悊涓婚〉闈�
+<template>
+ <view class="sales-account">
+ <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
+ <PageHeader title="浼氳鐪嬫澘"
+ @back="goBack" />
+ <!-- 瀹℃壒鍒楄〃 -->
+ <view class="topbox">
+ <view class="boxItem">
+ <view class="boxItem-num">
+ {{stats.total}}
+ </view>
+ <view class="boxItem-title">
+ 鎬讳細璁暟
+ </view>
+ </view>
+ <view class="boxItem">
+ <view class="boxItem-num">
+ {{stats.underWay}}
+ </view>
+ <view class="boxItem-title">
+ 杩涜涓�
+ </view>
+ </view>
+ <view class="boxItem">
+ <view class="boxItem-num">
+ {{stats.completed}}
+ </view>
+ <view class="boxItem-title">
+ 宸插畬鎴�
+ </view>
+ </view>
+ <view class="boxItem">
+ <view class="boxItem-num">
+ {{stats.toStart}}
+ </view>
+ <view class="boxItem-title">
+ 鍗冲皢寮�濮�
+ </view>
+ </view>
+ </view>
+ <view class="ledger-list"
+ v-if="ledgerList.length > 0">
+ <view v-for="(item, index) in ledgerList"
+ :key="index">
+ <view class="ledger-item">
+ <view class="item-header">
+ <view class="item-left">
+ <view class="document-icon">
+ <up-icon name="file-text"
+ size="16"
+ color="#ffffff"></up-icon>
+ </view>
+ <text class="item-id">{{ item.title }}</text>
+ </view>
+ <view class="item-tag">
+ <u-tag :type="getTagClass(item.status)">{{ formatReceiptType(item.status) }}</u-tag>
+ </view>
+ </view>
+ <up-divider></up-divider>
+ <view class="item-details">
+ <view class="detail-row">
+ <text class="detail-label">涓绘寔浜�</text>
+ <text class="detail-value">{{ item.host }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">鍙備細浜烘暟</text>
+ <text class="detail-value">{{ item.participants.length }}</text>
+ </view>
+ <view class="detail-row-approveReason">
+ <text class="detail-label">浼氳鏃堕棿</text>
+ <text class="detail-value highlightBlue">{{dayjs(item.startTime).format("YYYY-MM-DD")}}
+ {{ formatTime(item.startTime) }} - {{ formatTime(item.endTime) }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">浼氳鍦扮偣</text>
+ <text class="detail-value">{{ item.location }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">鍙備細浜烘暟</text>
+ <text class="detail-value">{{ item.participants.length }}</text>
+ </view>
+ <!-- <up-divider></up-divider> -->
+ <u-collapse @change="change"
+ @close="close"
+ @open="open"
+ accordion
+ border
+ :duration="300">
+ <u-collapse-item :title="`浼氳绾 ${item.content ? '' : '(鏃�)'}`"
+ :name="`meeting-${index}`">
+ <view class="meeting-content">
+ <view v-if="item.content"
+ v-html="item.content"
+ class="content-html"></view>
+ <view v-else
+ class="no-content">
+ <text>鏆傛棤浼氳绾鍐呭</text>
+ </view>
+ </view>
+ </u-collapse-item>
+ </u-collapse>
+ </view>
+ </view>
+ </view>
+ </view>
+ <view v-else
+ class="no-data">
+ <text>鏆傛棤鏁版嵁</text>
+ </view>
+ </view>
+</template>
+
+<script setup>
+ import { ref, toRefs, reactive } from "vue";
+ import PageHeader from "@/components/PageHeader.vue";
+ import {
+ getMeetSummaryItems,
+ getMeetSummary,
+ } from "@/api/managementMeetings/meetExamine";
+ import { onShow } from "@dcloudio/uni-app";
+ import dayjs from "dayjs";
+ import useUserStore from "@/store/modules/user";
+ // 鏁版嵁
+ const ledgerList = ref([]);
+ const data = reactive({
+ searchForm: {
+ title: "",
+ },
+ });
+
+ // 杩斿洖涓婁竴椤�
+ const goBack = () => {
+ uni.navigateBack();
+ };
+ // 缁熻鏁版嵁
+ const stats = ref({});
+ const getnum = () => {
+ getMeetSummary().then(res => {
+ stats.value = res.data;
+ });
+ };
+ // 鏍煎紡鍖栨椂闂�
+ const formatTime = timeStr => {
+ const date = new Date(timeStr);
+ return date.toLocaleTimeString("zh-CN", {
+ hour: "2-digit",
+ minute: "2-digit",
+ });
+ };
+ // 鏌ヨ鍒楄〃
+ const getList = () => {
+ showLoadingToast("鍔犺浇涓�...");
+
+ getMeetSummaryItems()
+ .then(res => {
+ ledgerList.value = res.data.map(item => {
+ return {
+ ...item,
+ participants: JSON.parse(item.participants),
+ };
+ });
+ closeToast();
+ })
+ .catch(() => {
+ closeToast();
+ });
+ };
+ // 鏄剧ず鍔犺浇鎻愮ず
+ const showLoadingToast = message => {
+ uni.showLoading({
+ title: message,
+ mask: true,
+ });
+ };
+ const formatDateTime = dateTime => {
+ if (!dateTime) return "";
+ return dateTime.replace(" ", "\n");
+ };
+
+ // 鍏抽棴鎻愮ず
+ const closeToast = () => {
+ uni.hideLoading();
+ };
+
+ // 鏍煎紡鍖栧洖娆炬柟寮�
+ const formatReceiptType = params => {
+ if (params == 0) {
+ return "宸插畬鎴�";
+ } else if (params == 1) {
+ return "鍗冲皢寮�濮�";
+ } else if (params == 2) {
+ return "杩涜涓�";
+ } else {
+ return "鏈煡";
+ }
+ };
+ // 鑾峰彇鏍囩鏍峰紡绫�
+ const getTagClass = type => {
+ if (type == 0) {
+ return "info";
+ } else if (type == 1) {
+ return "warning";
+ } else if (type == 2) {
+ return "success";
+ } else {
+ return "info";
+ }
+ };
+
+ // u-collapse 浜嬩欢澶勭悊鍑芥暟
+ const change = name => {
+ console.log("灞曞紑鐨勯潰鏉垮悕:", name);
+ };
+
+ const close = name => {
+ console.log("鍏抽棴鐨勯潰鏉垮悕:", name);
+ };
+
+ const open = name => {
+ console.log("鎵撳紑鐨勯潰鏉垮悕:", name);
+ };
+
+ onShow(async () => {
+ // 椤甸潰鍔犺浇瀹屾垚鍚庣殑鍒濆鍖栭�昏緫
+ try {
+ // 涓や釜鏂规硶鎵ц瀹屾垚鍚庡啀鎵ц getList()
+ getList();
+ getnum();
+ } catch (error) {
+ console.error("鍒濆鍖栨暟鎹け璐�:", error);
+ // 鍗充娇鍑洪敊涔熸墽琛� getList()锛岀‘淇濋〉闈㈣兘姝e父鍔犺浇
+ getList();
+ getnum();
+ }
+ });
+</script>
+
+<style scoped lang="scss">
+ @import "../../../styles/sales-common.scss";
+
+ .u-divider {
+ margin: 0 !important;
+ }
+
+ // 鏂囨。鍥炬爣鏍峰紡 - 瑕嗙洊鍏叡鏍峰紡涓殑鑳屾櫙鑹�
+ .document-icon {
+ background: #ed8d05;
+ }
+
+ // 娴姩鎸夐挳鏍峰紡 - 瑕嗙洊鍏叡鏍峰紡涓殑鑳屾櫙鑹�
+ .fab-button {
+ background: #ed8d05;
+ }
+
+ // 鐗规湁鏍峰紡
+ .detail-row-user {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ .detail-row-approveReason {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 8px;
+ }
+
+ .detail-value.highlightBlue {
+ color: #2979ff;
+ font-weight: 500;
+ }
+
+ .detail-value.highlightYellow {
+ color: #ed8d05;
+ font-weight: 500;
+ }
+
+ .approver-value {
+ display: flex;
+ justify-content: flex-end;
+ }
+
+ .approver-chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ background: #f0f6ff;
+ color: #2b7cff;
+ border: 1px solid #e0efff;
+ border-radius: 999px;
+ padding: 4px 10px;
+ max-width: 100%;
+ }
+
+ .approver-name {
+ font-size: 12px;
+ color: #2b7cff;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .actions {
+ display: flex;
+ gap: 10px;
+ align-items: center;
+ justify-content: flex-end;
+ margin-top: 18rpx;
+ }
+
+ .action-btn {
+ border-radius: 16px;
+ height: 28px;
+ line-height: 28px;
+ padding: 0 12px;
+ }
+ .topbox {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-left: 20px;
+ margin-right: 20px;
+ margin-top: 10px;
+ }
+ .boxItem {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ background-color: #fff;
+ width: 24%;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ border-radius: 6px;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05);
+ }
+ .boxItem-num {
+ margin-bottom: 5px;
+ font-weight: 500;
+ color: #2979ff;
+ }
+
+ // 浼氳绾鏍峰紡
+ .meeting-content {
+ padding: 15px;
+ line-height: 1.6;
+ font-size: 14px;
+ }
+
+ .content-html {
+ color: #333;
+ word-break: break-word;
+ }
+
+ .content-html :deep(p) {
+ margin-bottom: 10px;
+ }
+
+ .content-html :deep(ul),
+ .content-html :deep(ol) {
+ margin-bottom: 10px;
+ padding-left: 20px;
+ }
+
+ .content-html :deep(li) {
+ margin-bottom: 5px;
+ }
+
+ .no-content {
+ color: #999;
+ text-align: center;
+ padding: 20px 0;
+ font-size: 14px;
+ }
+
+ // u-collapse 鏍峰紡浼樺寲
+ :deep(.u-collapse) {
+ margin-top: 10px;
+ border-radius: 6px;
+ overflow: hidden;
+ }
+
+ :deep(.u-collapse-item__header) {
+ font-size: 14px;
+ font-weight: 500;
+ }
+
+ :deep(.u-collapse-item__content) {
+ background-color: #fafafa;
+ border-top: 1px solid #f0f0f0;
+ }
+</style>
\ No newline at end of file
--
Gitblit v1.9.3