<template>
|
<view class="home-page" :style="pageVars">
|
<view class="hero">
|
<view class="top-icons">
|
<button class="icon-button" @tap="openDrawer">
|
<image class="top-icon" src="/static/icons/user-round-white.svg" mode="aspectFit" />
|
</button>
|
<button class="icon-button notify-button" @tap="showNotify">
|
<image class="top-icon" src="/static/icons/bell-white.svg" mode="aspectFit" />
|
<text v-if="unreadMessageCount" class="badge">{{ unreadMessageCount }}</text>
|
</button>
|
</view>
|
|
<view class="stats-row">
|
<view class="stat-block">
|
<view class="stat-label">今日接单</view>
|
<view class="stat-value">{{ todayOrderCount }}</view>
|
</view>
|
<view class="stat-block">
|
<view class="stat-label">今日讲解人数</view>
|
<view class="stat-value">{{ todayPeopleCount }}</view>
|
</view>
|
</view>
|
</view>
|
|
<view class="main-area">
|
<template v-if="auditStatus === 'disabled'">
|
<view class="disabled-state">
|
<text class="disabled-title">您的账号已被禁用,无法接单,具体请查看</text>
|
<text class="policy-link" @tap="openPolicy">《平台奖惩机制》</text>
|
<text class="disabled-tip">如有疑问请联系后台工作人员</text>
|
<text class="service-line-text">客服微信:{{ customerServiceWechat || '--' }}</text>
|
<text class="service-line-text">客服电话:{{ customerServicePhone || '--' }}</text>
|
</view>
|
</template>
|
<template v-else-if="auditStatus === 'approved' && isReceiving">
|
<view class="receiving-summary" :class="{ 'has-order': hasReceivingOrders }">
|
<view class="receiving-left">
|
<template v-if="hasReceivingOrders">
|
<view class="service-line">
|
<text>{{ activeReceivingOrder.serviceNameShort }}</text>
|
<text>{{ activeReceivingOrder.durationText }}</text>
|
</view>
|
<view class="start-line">{{ receivingStatusText }} {{ countdownText }}后{{ receivingActionText }}</view>
|
</template>
|
<template v-else>
|
接单中
|
</template>
|
</view>
|
<view class="receiving-right">
|
<view>{{ receivingMeetingPoint }}</view>
|
<view class="meeting-link" @tap="viewMeetingPoint">查看汇合点</view>
|
</view>
|
</view>
|
<template v-if="hasReceivingOrders">
|
<view class="customer-list">
|
<view v-for="item in receivingCustomers" :key="item.no" class="customer-row">
|
<view class="customer-no" :class="`no-${item.no}`">{{ item.no }}</view>
|
<view class="customer-main">
|
<view>{{ item.phone }}</view>
|
<view>{{ item.people }}人</view>
|
</view>
|
<button class="phone-link" @tap="callCustomer(item)">电话联系</button>
|
<image class="phone-icon" src="/static/icons/smartphone.svg" mode="aspectFit" />
|
</view>
|
</view>
|
<button v-if="isServing" class="lecture-button" @tap="finishLecture">结束讲解</button>
|
<button
|
v-else
|
class="lecture-button"
|
:loading="startingLecture"
|
:disabled="startingLecture"
|
@tap="startLecture"
|
>开始讲解</button>
|
</template>
|
<template v-else>
|
<view class="empty-order">暂无订单请耐心等待</view>
|
<button class="cancel-button" @tap="cancelReceiving">取消接单</button>
|
</template>
|
</template>
|
<template v-else-if="auditStatus === 'approved'">
|
<button class="start-button" @tap="goReceiving">开始接单</button>
|
</template>
|
<template v-else-if="auditStatus === 'rejected'">
|
<view class="audit-state rejected-state">
|
<text class="audit-message">审核未通过,请修改资料并重新提交。</text>
|
<button class="resubmit-button" @tap="resubmit">重新提交</button>
|
</view>
|
</template>
|
<template v-else>
|
<view class="audit-state">
|
<text class="audit-message">资料已提交,请耐心等待审核</text>
|
</view>
|
</template>
|
</view>
|
|
<view v-if="drawerVisible" class="drawer-layer">
|
<view class="drawer-panel" :class="{ open: drawerOpen }">
|
<view class="drawer-hero" @tap="goProfile">
|
<view class="avatar"></view>
|
<view class="guide-info">
|
<view class="guide-inline">
|
<text class="guide-name">{{ guide.name || '赵四' }}</text>
|
<text v-if="auditStatus !== 'approved'" class="audit-tag">{{ auditStatusText }}</text>
|
</view>
|
<view v-if="auditStatus === 'approved'" class="stars">{{ drawerRatingStars }}</view>
|
</view>
|
<image v-if="auditStatus === 'approved'" class="drawer-arrow" src="/static/icons/chevron-right-white.svg" mode="aspectFit" />
|
</view>
|
|
<view class="menu-list">
|
<view v-for="item in visibleDrawerMenus" :key="item.text" class="menu-item" @tap="handleMenu(item)">
|
<image class="menu-icon" :src="item.icon" mode="aspectFit" />
|
<text class="menu-text">{{ item.text }}</text>
|
<image class="menu-arrow" src="/static/icons/chevron-right.svg" mode="aspectFit" />
|
</view>
|
</view>
|
</view>
|
<view class="drawer-mask" :class="{ open: drawerOpen }" @tap="closeDrawer"></view>
|
</view>
|
|
<guide-dialog
|
v-model:visible="dialog.visible"
|
:title="dialog.title"
|
:content="dialog.content"
|
:confirm-text="dialog.confirmText"
|
:cancel-text="dialog.cancelText"
|
@confirm="confirmDialog"
|
/>
|
</view>
|
</template>
|
|
<script>
|
import GuideDialog from '../../components/guide-dialog/guide-dialog.vue'
|
import { getLoginState, isLoggedIn } from '../../services/auth'
|
import {
|
getCurrentGuideReceivingSession,
|
getGuideProfile,
|
getGuideReceivingOptions,
|
finishGuideLecture,
|
resolveMeetingPoint,
|
updateGuideOnlineStatus
|
} from '../../services/guide'
|
import { openMeetingPointPage } from '../../services/map'
|
import { getGuideOrders, startGuideLecture } from '../../services/order'
|
import { playNotificationAlert } from '../../services/message'
|
import { getWorkbenchData } from '../../services/workbench'
|
import { formatDuration, maskPhone } from '../../utils/format'
|
import { formatRatingStars } from '../../utils/rating'
|
import { routeTo } from '../../utils/router'
|
import { getStatusBarHeight, upxToPx } from '../../utils/system'
|
|
function resolveGuideName(guide = {}, fallback = {}) {
|
return guide.realName || guide.name || guide.username || fallback.realName || fallback.name || fallback.username || ''
|
}
|
|
function isSameId(left, right) {
|
return left !== undefined && left !== null && right !== undefined && right !== null && String(left) === String(right)
|
}
|
|
function buildReceivingConfig(session, scenics = [], fallback = {}) {
|
if (!session) {
|
return null
|
}
|
const scenic = scenics.find((item) => isSameId(item.id, session.scenicSpotId)) || {}
|
const meetingPoints = scenic.meetingPoints || []
|
const meetingPoint = meetingPoints.find((item) => isSameId(item.id, session.meetingPointId)) || meetingPoints[0] || {}
|
return {
|
...fallback,
|
scenicId: session.scenicSpotId || scenic.id || '',
|
scenicName: scenic.name || fallback.scenicName || '',
|
meetingPointId: session.meetingPointId || meetingPoint.id || '',
|
meetingPointName: meetingPoint.name || fallback.meetingPointName || '',
|
meetingPointLatitude: meetingPoint.latitude ?? fallback.meetingPointLatitude ?? fallback.latitude,
|
meetingPointLongitude: meetingPoint.longitude ?? fallback.meetingPointLongitude ?? fallback.longitude,
|
latitude: meetingPoint.latitude ?? fallback.latitude,
|
longitude: meetingPoint.longitude ?? fallback.longitude
|
}
|
}
|
|
export default {
|
components: {
|
GuideDialog
|
},
|
data() {
|
return {
|
guide: {},
|
accountState: 'pending',
|
auditRemark: '',
|
customerServiceWechat: '',
|
customerServicePhone: '',
|
todayOrderCount: 0,
|
todayPeopleCount: 0,
|
orders: [],
|
ordersSignature: '[]',
|
guideSignature: '',
|
receivingScenics: [],
|
receivingScenicsLoaded: false,
|
unreadMessageCount: 0,
|
unreadMessageInitialized: false,
|
countdownSeconds: 15 * 60,
|
countdownTimer: null,
|
refreshTimer: null,
|
refreshing: false,
|
startingLecture: false,
|
dialog: {
|
visible: false,
|
title: '提示',
|
content: '',
|
confirmText: '确认',
|
cancelText: '取消',
|
action: ''
|
},
|
pendingCustomer: null,
|
drawerVisible: false,
|
drawerOpen: false,
|
statusBarHeight: getStatusBarHeight(),
|
drawerMenus: [
|
{ text: '业绩明细', icon: '/static/icons/badge-dollar.svg', url: '/pages/earnings/index' },
|
{ text: '历史订单', icon: '/static/icons/clipboard-list.svg', url: '/pages/orders/index' },
|
{ text: '我的评分', icon: '/static/icons/star.svg', url: '/pages/rating/index' },
|
{ text: '服务协议', icon: '/static/icons/file-text.svg', url: '/pages/agreements/index' },
|
{ text: '意见反馈', icon: '/static/icons/message-warning.svg', url: '/pages/feedback/index' },
|
{ text: '设置', icon: '/static/icons/settings.svg', url: '/pages/settings/index' }
|
]
|
}
|
},
|
computed: {
|
auditStatus() {
|
return this.accountState
|
},
|
auditStatusText() {
|
if (this.auditStatus === 'rejected') {
|
return '审核未通过'
|
}
|
if (this.auditStatus === 'pending') {
|
return '资质审核中'
|
}
|
if (this.auditStatus === 'disabled') {
|
return '账号已禁用'
|
}
|
return ''
|
},
|
visibleDrawerMenus() {
|
if (this.auditStatus === 'approved') {
|
return this.drawerMenus
|
}
|
return this.drawerMenus.filter((item) => item.text === '设置')
|
},
|
drawerRatingStars() {
|
return formatRatingStars(this.guide.rating)
|
},
|
isReceiving() {
|
return ['online', 'serving'].includes(this.guide.onlineStatus) || this.receivingOrders.length > 0
|
},
|
isServing() {
|
return this.guide.onlineStatus === 'serving' || this.activeReceivingOrder.status === 'serving'
|
},
|
receivingStatusText() {
|
return this.isServing ? '讲解中' : '接单中'
|
},
|
receivingActionText() {
|
return this.isServing ? '结束讲解' : '开始讲解'
|
},
|
countdownText() {
|
const seconds = Math.max(this.countdownSeconds, 0)
|
const minutes = Math.floor(seconds / 60)
|
const rest = seconds % 60
|
return `${minutes}:${String(rest).padStart(2, '0')}`
|
},
|
receivingMeetingPoint() {
|
return this.activeReceivingOrder.meetingPointName ||
|
(this.currentMeetingPointDetail && this.currentMeetingPointDetail.name) ||
|
(this.guide.receivingConfig && this.guide.receivingConfig.meetingPointName) ||
|
'未配置汇合点'
|
},
|
currentMeetingPointDetail() {
|
return resolveMeetingPoint(this.guide.receivingConfig || {})
|
},
|
receivingOrders() {
|
return this.orders.filter((item) => ['pending', 'accepted', 'arrived', 'serving'].includes(item.status))
|
},
|
hasReceivingOrders() {
|
return this.receivingOrders.length > 0
|
},
|
activeReceivingOrder() {
|
const order = this.receivingOrders[0] || {}
|
return {
|
...order,
|
serviceNameShort: (order.serviceName && order.serviceName.replace('拼团 · ', '').replace('包团 · ', '')) || '精讲',
|
durationText: formatDuration(order.durationMinutes || 30)
|
}
|
},
|
receivingCustomers() {
|
return this.receivingOrders.reduce((rows, order) => {
|
const customers = order.customers && order.customers.length
|
? order.customers
|
: [{ phone: order.customerPhone, people: order.quantity }]
|
customers.forEach((customer) => {
|
rows.push({
|
no: rows.length + 1,
|
phone: maskPhone(customer.phone || ''),
|
people: Number(customer.people || 0)
|
})
|
})
|
return rows
|
}, [])
|
},
|
pageVars() {
|
const heroHeight = this.statusBarHeight + upxToPx(452)
|
return {
|
'--hero-height': `${heroHeight}px`,
|
'--top-icons-top': `${this.statusBarHeight + upxToPx(28)}px`,
|
'--stats-row-padding-top': `${this.statusBarHeight + upxToPx(228)}px`,
|
'--drawer-hero-height': `${heroHeight}px`,
|
'--drawer-hero-padding-top': `${this.statusBarHeight + upxToPx(70)}px`
|
}
|
}
|
},
|
onShow() {
|
if (!isLoggedIn()) {
|
routeTo('/pages/login/index', 'reLaunch')
|
return
|
}
|
this.loadData()
|
this.startRefresh()
|
},
|
onHide() {
|
this.stopRefresh()
|
this.clearCountdown()
|
},
|
onUnload() {
|
this.stopRefresh()
|
this.clearCountdown()
|
},
|
methods: {
|
loadData({ silent = false } = {}) {
|
if (this.refreshing) {
|
return Promise.resolve()
|
}
|
this.refreshing = true
|
const previousOrderId = this.activeReceivingOrder.id
|
const previousOnlineStatus = this.guide.onlineStatus
|
return getWorkbenchData().then((workbench) => {
|
const remoteGuide = workbench.guide || {}
|
const loginGuide = (getLoginState() || {}).guide || {}
|
const baseGuide = {
|
...loginGuide,
|
...remoteGuide,
|
name: resolveGuideName(remoteGuide, loginGuide),
|
phone: remoteGuide.mobile || loginGuide.phone
|
}
|
this.accountState = workbench.accountState || 'pending'
|
this.auditRemark = workbench.auditRemark || ''
|
this.customerServiceWechat = workbench.customerServiceWechat || ''
|
this.customerServicePhone = workbench.customerServicePhone || ''
|
this.todayOrderCount = Number(workbench.todayOrderCount || 0)
|
this.todayPeopleCount = Number(workbench.todayPeopleCount || 0)
|
const nextUnreadMessageCount = Number(workbench.unreadNotificationCount || 0)
|
if (this.unreadMessageInitialized && nextUnreadMessageCount > this.unreadMessageCount) {
|
playNotificationAlert()
|
}
|
this.unreadMessageCount = nextUnreadMessageCount
|
this.unreadMessageInitialized = true
|
if (this.accountState !== 'approved') {
|
this.updateGuide(baseGuide)
|
this.updateOrders([])
|
this.setupCountdown()
|
return null
|
}
|
return Promise.all([
|
getGuideProfile(),
|
getGuideOrders('all'),
|
getCurrentGuideReceivingSession(),
|
this.loadReceivingScenics()
|
]).then(([localGuide, orders, receivingSession, receivingScenics]) => {
|
const nextGuide = {
|
...baseGuide,
|
...localGuide,
|
name: resolveGuideName(localGuide, baseGuide),
|
phone: localGuide.phone || baseGuide.phone,
|
onlineStatus: receivingSession
|
? (receivingSession.status === 'IN_SERVICE' ? 'serving' : 'online')
|
: 'offline',
|
receivingConfig: buildReceivingConfig(receivingSession, receivingScenics, baseGuide.receivingConfig || {})
|
}
|
this.updateGuide(nextGuide)
|
this.updateOrders(orders)
|
if (previousOrderId !== this.activeReceivingOrder.id ||
|
previousOnlineStatus !== this.guide.onlineStatus ||
|
!this.countdownTimer) {
|
this.setupCountdown()
|
}
|
return null
|
})
|
}).catch((error) => {
|
if (!silent) {
|
uni.showToast({ title: error.message || '首页数据加载失败', icon: 'none' })
|
}
|
}).finally(() => {
|
this.refreshing = false
|
})
|
},
|
loadReceivingScenics() {
|
if (this.receivingScenicsLoaded) {
|
return Promise.resolve(this.receivingScenics)
|
}
|
return getGuideReceivingOptions().then((result) => {
|
const scenics = result.scenics || []
|
this.receivingScenics = scenics
|
this.receivingScenicsLoaded = true
|
return scenics
|
})
|
},
|
updateGuide(guide) {
|
const signature = JSON.stringify(guide || {})
|
if (signature !== this.guideSignature) {
|
this.guide = guide || {}
|
this.guideSignature = signature
|
}
|
},
|
updateOrders(orders) {
|
const nextOrders = orders || []
|
const signature = JSON.stringify(nextOrders)
|
if (signature !== this.ordersSignature) {
|
this.orders = nextOrders
|
this.ordersSignature = signature
|
}
|
},
|
startRefresh() {
|
this.stopRefresh()
|
this.refreshTimer = setInterval(() => {
|
this.loadData({ silent: true })
|
}, 5000)
|
},
|
stopRefresh() {
|
if (this.refreshTimer) {
|
clearInterval(this.refreshTimer)
|
this.refreshTimer = null
|
}
|
},
|
setupCountdown() {
|
this.clearCountdown()
|
if (!this.isReceiving || !this.hasReceivingOrders) {
|
return
|
}
|
this.countdownSeconds = this.isServing ? (this.activeReceivingOrder.durationMinutes || 30) * 60 : 15 * 60
|
this.countdownTimer = setInterval(() => {
|
if (this.countdownSeconds <= 0) {
|
this.clearCountdown()
|
return
|
}
|
this.countdownSeconds -= 1
|
}, 1000)
|
},
|
clearCountdown() {
|
if (this.countdownTimer) {
|
clearInterval(this.countdownTimer)
|
this.countdownTimer = null
|
}
|
},
|
openDrawer() {
|
this.drawerVisible = true
|
this.$nextTick(() => {
|
this.drawerOpen = true
|
})
|
},
|
closeDrawer() {
|
this.drawerOpen = false
|
setTimeout(() => {
|
this.drawerVisible = false
|
}, 260)
|
},
|
showNotify() {
|
routeTo('/pages/messages/index')
|
},
|
viewMeetingPoint() {
|
openMeetingPointPage(this.currentMeetingPointDetail || this.guide.receivingConfig || {})
|
},
|
callCustomer(item) {
|
this.pendingCustomer = item
|
this.openDialog({
|
title: '电话联系',
|
content: `即将联系 ${item.phone}`,
|
confirmText: '拨打',
|
action: 'callCustomer'
|
})
|
},
|
startLecture() {
|
const orderId = this.activeReceivingOrder.id
|
if (this.startingLecture) {
|
return
|
}
|
if (!orderId) {
|
uni.showToast({ title: '当前没有可开始的订单', icon: 'none' })
|
return
|
}
|
this.startingLecture = true
|
startGuideLecture(orderId).then((startedOrder) => {
|
this.updateGuide({ ...this.guide, onlineStatus: 'serving' })
|
this.updateOrders(this.orders.map((order) => (
|
order.id === startedOrder.id ? { ...order, ...startedOrder } : order
|
)))
|
this.setupCountdown()
|
uni.showToast({ title: '已开始讲解', icon: 'none' })
|
return this.loadData({ silent: true })
|
}).catch((error) => {
|
uni.showToast({ title: error.message || '开始讲解失败', icon: 'none' })
|
}).finally(() => {
|
this.startingLecture = false
|
})
|
},
|
finishLecture() {
|
this.openDialog({
|
title: '结束讲解',
|
content: '是否需要提前结束讲解',
|
confirmText: '确认',
|
cancelText: '取消',
|
action: 'finishLecture'
|
})
|
},
|
goReceiving() {
|
routeTo('/pages/receiving/index')
|
},
|
cancelReceiving() {
|
this.openDialog({
|
title: '取消接单',
|
content: '确认停止当前接单状态?',
|
confirmText: '确认',
|
action: 'cancelReceiving'
|
})
|
},
|
resubmit() {
|
routeTo('/pages/register-phone/index')
|
},
|
openPolicy() {
|
routeTo('/pages/agreements/index')
|
},
|
goProfile() {
|
if (this.auditStatus !== 'approved') {
|
return
|
}
|
this.closeDrawer()
|
routeTo('/pages/profile/index')
|
},
|
handleMenu(item) {
|
if (item.url) {
|
this.closeDrawer()
|
routeTo(item.url, item.type || 'navigateTo')
|
return
|
}
|
uni.showToast({ title: `${item.text}待接入`, icon: 'none' })
|
},
|
openDialog(options) {
|
this.dialog = {
|
visible: true,
|
title: options.title || '提示',
|
content: options.content || '',
|
confirmText: options.confirmText || '确认',
|
cancelText: options.cancelText || '取消',
|
action: options.action || ''
|
}
|
},
|
confirmDialog() {
|
if (this.dialog.action === 'callCustomer') {
|
uni.showToast({ title: '电话能力待接真实号码', icon: 'none' })
|
return
|
}
|
if (this.dialog.action === 'finishLecture') {
|
finishGuideLecture().then(() => {
|
this.loadData()
|
uni.showToast({ title: '讲解已结束', icon: 'none' })
|
})
|
return
|
}
|
if (this.dialog.action === 'cancelReceiving') {
|
updateGuideOnlineStatus('offline').then(() => {
|
this.loadData()
|
uni.showToast({ title: '已取消接单', icon: 'none' })
|
})
|
}
|
}
|
}
|
}
|
</script>
|
|
<style>
|
.home-page {
|
position: relative;
|
min-height: 100vh;
|
background: #ffffff;
|
overflow: hidden;
|
}
|
|
.hero {
|
position: relative;
|
height: var(--hero-height);
|
padding: 0 64rpx;
|
background: #4d8fe8;
|
}
|
|
.top-icons {
|
position: absolute;
|
left: 74rpx;
|
right: 62rpx;
|
top: var(--top-icons-top);
|
height: 62rpx;
|
}
|
|
.icon-button {
|
position: absolute;
|
top: 0;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
width: 60rpx;
|
height: 60rpx;
|
padding: 0;
|
border: 0;
|
background: transparent;
|
}
|
|
.icon-button:first-child {
|
left: 0;
|
}
|
|
.icon-button::after,
|
.start-button::after,
|
.resubmit-button::after,
|
.cancel-button::after,
|
.lecture-button::after,
|
.phone-link::after {
|
border: 0;
|
}
|
|
.top-icon {
|
width: 42rpx;
|
height: 42rpx;
|
}
|
|
.notify-button {
|
right: 0;
|
}
|
|
.badge {
|
position: absolute;
|
right: 2rpx;
|
top: 0;
|
min-width: 28rpx;
|
height: 28rpx;
|
padding: 0 6rpx;
|
border-radius: 999rpx;
|
color: #ffffff;
|
background: #ff1f1f;
|
text-align: center;
|
line-height: 28rpx;
|
font-size: 20rpx;
|
font-weight: 800;
|
}
|
|
.stats-row {
|
display: grid;
|
grid-template-columns: 1fr 1fr;
|
padding-top: var(--stats-row-padding-top);
|
color: #ffffff;
|
text-align: center;
|
}
|
|
.stat-label {
|
font-size: 27rpx;
|
font-weight: 700;
|
}
|
|
.stat-value {
|
margin-top: 28rpx;
|
font-size: 48rpx;
|
font-weight: 800;
|
}
|
|
.main-area {
|
position: relative;
|
min-height: calc(100vh - var(--hero-height));
|
background: #ffffff;
|
}
|
|
.disabled-state {
|
display: flex;
|
flex-direction: column;
|
align-items: center;
|
padding: 190rpx 48rpx 0;
|
color: #222222;
|
text-align: center;
|
}
|
|
.disabled-title {
|
font-size: 28rpx;
|
font-weight: 700;
|
line-height: 1.7;
|
}
|
|
.policy-link {
|
margin-top: 42rpx;
|
color: #1685e8;
|
font-size: 30rpx;
|
font-weight: 700;
|
}
|
|
.disabled-tip {
|
margin-top: 80rpx;
|
font-size: 27rpx;
|
}
|
|
.service-line-text {
|
margin-top: 46rpx;
|
font-size: 27rpx;
|
}
|
|
.receiving-summary {
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
height: 160rpx;
|
padding: 0 58rpx;
|
border-bottom: 1rpx solid #d8d8d8;
|
}
|
|
.receiving-summary.has-order {
|
height: 188rpx;
|
align-items: flex-start;
|
padding-top: 36rpx;
|
}
|
|
.receiving-left {
|
color: #1f2937;
|
font-size: 30rpx;
|
font-weight: 500;
|
}
|
|
.service-line {
|
display: flex;
|
gap: 16rpx;
|
color: #1f2937;
|
font-size: 29rpx;
|
line-height: 1.3;
|
}
|
|
.start-line {
|
margin-top: 34rpx;
|
color: #1f2937;
|
font-size: 29rpx;
|
line-height: 1.3;
|
}
|
|
.receiving-right {
|
color: #111827;
|
text-align: right;
|
font-size: 25rpx;
|
line-height: 1.8;
|
}
|
|
.meeting-link {
|
color: #1685ff;
|
}
|
|
.customer-list {
|
padding: 0 58rpx;
|
}
|
|
.customer-row {
|
display: flex;
|
align-items: center;
|
min-height: 150rpx;
|
border-bottom: 1rpx solid #d8d8d8;
|
}
|
|
.customer-no {
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
width: 62rpx;
|
height: 62rpx;
|
border-radius: 50%;
|
color: #ffffff;
|
font-size: 26rpx;
|
font-weight: 800;
|
}
|
|
.customer-no.no-1 {
|
background: #1f7bff;
|
}
|
|
.customer-no.no-2 {
|
background: #e8757a;
|
}
|
|
.customer-no.no-3 {
|
background: #43d63b;
|
}
|
|
.customer-main {
|
flex: 1;
|
margin-left: 26rpx;
|
color: #111827;
|
font-size: 25rpx;
|
line-height: 1.55;
|
}
|
|
.phone-link {
|
padding: 0;
|
color: #1685ff;
|
background: transparent;
|
font-size: 25rpx;
|
font-weight: 500;
|
}
|
|
.phone-icon {
|
width: 38rpx;
|
height: 38rpx;
|
margin-left: 16rpx;
|
}
|
|
.empty-order {
|
position: absolute;
|
left: 0;
|
right: 0;
|
top: 37%;
|
color: #111827;
|
text-align: center;
|
font-size: 28rpx;
|
font-weight: 500;
|
}
|
|
.lecture-button {
|
position: absolute;
|
left: 50%;
|
bottom: 168rpx;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
width: 444rpx;
|
height: 90rpx;
|
margin-left: -222rpx;
|
border-radius: 10rpx;
|
color: #ffffff;
|
background: #4d8fe8;
|
font-size: 26rpx;
|
font-weight: 700;
|
}
|
|
.cancel-button {
|
position: absolute;
|
left: 50%;
|
bottom: 168rpx;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
width: 444rpx;
|
height: 90rpx;
|
margin-left: -222rpx;
|
border-radius: 10rpx;
|
color: #ffffff;
|
background: #4d8fe8;
|
font-size: 26rpx;
|
font-weight: 700;
|
}
|
|
.start-button {
|
position: absolute;
|
left: 50%;
|
top: 57%;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
width: 444rpx;
|
height: 90rpx;
|
margin-left: -222rpx;
|
border-radius: 10rpx;
|
color: #ffffff;
|
background: #4d8fe8;
|
font-size: 26rpx;
|
font-weight: 700;
|
}
|
|
.audit-state {
|
position: absolute;
|
left: 0;
|
right: 0;
|
top: 39%;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
color: #111827;
|
text-align: center;
|
}
|
|
.rejected-state {
|
top: 36%;
|
flex-direction: column;
|
}
|
|
.audit-message {
|
font-size: 28rpx;
|
font-weight: 500;
|
}
|
|
.resubmit-button {
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
width: 374rpx;
|
height: 88rpx;
|
margin-top: 330rpx;
|
border-radius: 10rpx;
|
color: #ffffff;
|
background: #2879ff;
|
font-size: 26rpx;
|
font-weight: 700;
|
}
|
|
.drawer-layer {
|
position: fixed;
|
left: 0;
|
right: 0;
|
top: 0;
|
bottom: 0;
|
z-index: 40;
|
display: flex;
|
}
|
|
.drawer-panel {
|
position: relative;
|
z-index: 2;
|
width: 574rpx;
|
height: 100%;
|
background: #ffffff;
|
transform: translateX(-100%);
|
transition: transform 260ms ease-out;
|
}
|
|
.drawer-panel.open {
|
transform: translateX(0);
|
}
|
|
.drawer-mask {
|
flex: 1;
|
height: 100%;
|
background: rgba(0, 0, 0, 0.22);
|
opacity: 0;
|
transition: opacity 260ms ease-out;
|
}
|
|
.drawer-mask.open {
|
opacity: 1;
|
}
|
|
.drawer-hero {
|
display: flex;
|
align-items: center;
|
height: var(--drawer-hero-height);
|
padding: var(--drawer-hero-padding-top) 68rpx 0;
|
background: #4d8fe8;
|
}
|
|
.avatar {
|
width: 108rpx;
|
height: 108rpx;
|
border: 2rpx solid rgba(255, 255, 255, 0.9);
|
border-radius: 50%;
|
background: #ffffff;
|
}
|
|
.guide-info {
|
flex: 1;
|
margin-left: 52rpx;
|
}
|
|
.guide-inline {
|
display: flex;
|
align-items: center;
|
gap: 28rpx;
|
}
|
|
.guide-name {
|
color: #ffffff;
|
font-size: 30rpx;
|
font-weight: 800;
|
}
|
|
.audit-tag {
|
display: inline-flex;
|
align-items: center;
|
justify-content: center;
|
min-width: 158rpx;
|
height: 54rpx;
|
padding: 0 18rpx;
|
border-radius: 10rpx;
|
color: #1f3b5b;
|
background: #ffffff;
|
font-size: 24rpx;
|
font-weight: 700;
|
}
|
|
.drawer-arrow {
|
width: 36rpx;
|
height: 36rpx;
|
}
|
|
.stars {
|
margin-top: 22rpx;
|
color: #ffd321;
|
font-size: 30rpx;
|
letter-spacing: 4rpx;
|
}
|
|
.menu-list {
|
padding: 38rpx 64rpx 0;
|
}
|
|
.menu-item {
|
display: flex;
|
align-items: center;
|
min-height: 96rpx;
|
border-bottom: 1rpx solid #eef1f5;
|
}
|
|
.menu-icon {
|
width: 40rpx;
|
height: 40rpx;
|
}
|
|
.menu-text {
|
flex: 1;
|
margin-left: 28rpx;
|
color: #22324a;
|
font-size: 27rpx;
|
font-weight: 500;
|
}
|
|
.menu-arrow {
|
width: 34rpx;
|
height: 34rpx;
|
}
|
</style>
|