| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // 审æ¹ç®¡çä¸»é¡µé¢ |
| | | <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()ï¼ç¡®ä¿é¡µé¢è½æ£å¸¸å è½½ |
| | | 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> |