357 lines
7.9 KiB
Vue
357 lines
7.9 KiB
Vue
<template>
|
||
<view class="container">
|
||
<!-- 订单信息 -->
|
||
<view class="order-card">
|
||
<view class="card-title">订单信息</view>
|
||
<view class="info-row">
|
||
<text class="label">服务名称:</text>
|
||
<text class="value">{{ orderInfo.serviceName }}</text>
|
||
</view>
|
||
<view class="info-row">
|
||
<text class="label">服务时间:</text>
|
||
<text class="value">{{ form.serviceDate }} {{ form.timeSlot }}</text>
|
||
</view>
|
||
<view class="info-row">
|
||
<text class="label">服务地址:</text>
|
||
<text class="value">{{ form.serviceAddress }}</text>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 选择陪伴员 -->
|
||
<view class="section">
|
||
<view class="section-title">选择陪伴员</view>
|
||
|
||
<view class="teacher-list">
|
||
<view
|
||
v-for="teacher in teacherList"
|
||
:key="teacher.id"
|
||
class="teacher-item"
|
||
:class="{ selected: form.teacherId === teacher.id }"
|
||
@click="selectTeacher(teacher)"
|
||
>
|
||
<image :src="teacher.avatar || '/static/images/avatar.png'" mode="aspectFill" />
|
||
<view class="teacher-info">
|
||
<text class="teacher-name">{{ teacher.teacherName }}</text>
|
||
<text class="teacher-subjects">{{ teacher.subjects || '暂无科目' }}</text>
|
||
<text class="teacher-level">{{ getLevelText(teacher.level) }}</text>
|
||
</view>
|
||
<view class="check-icon" v-if="form.teacherId === teacher.id">
|
||
<text class="iconfont icon-check"></text>
|
||
</view>
|
||
</view>
|
||
|
||
<view v-if="teacherList.length === 0" class="empty">
|
||
<text>暂无可用陪伴员</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 服务要求 -->
|
||
<view class="section">
|
||
<view class="section-title">服务要求</view>
|
||
<textarea
|
||
v-model="form.serviceRequirement"
|
||
placeholder="请输入服务要求(选填)"
|
||
maxlength="500"
|
||
/>
|
||
<view class="count">{{ form.serviceRequirement.length }}/500</view>
|
||
</view>
|
||
|
||
<!-- 提交按钮 -->
|
||
<view class="submit-btn">
|
||
<button @click="submit" :disabled="!canSubmit">确认派单</button>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import { managerApi, orderApi } from '@/api/index.js'
|
||
|
||
export default {
|
||
data() {
|
||
return {
|
||
orderId: null,
|
||
workOrderId: null,
|
||
managerId: null,
|
||
orderInfo: {},
|
||
teacherList: [],
|
||
form: {
|
||
teacherId: null,
|
||
serviceDate: '',
|
||
timeSlot: '',
|
||
serviceAddress: '',
|
||
serviceRequirement: ''
|
||
}
|
||
}
|
||
},
|
||
computed: {
|
||
canSubmit() {
|
||
return this.form.teacherId && this.form.serviceDate && this.form.timeSlot
|
||
}
|
||
},
|
||
onLoad(options) {
|
||
this.orderId = options.orderId
|
||
this.workOrderId = options.workOrderId
|
||
this.managerId = options.managerId
|
||
this.loadOrderInfo()
|
||
},
|
||
methods: {
|
||
async loadOrderInfo() {
|
||
try {
|
||
const res = await orderApi.getOrderDetail(this.orderId)
|
||
this.orderInfo = res
|
||
|
||
this.form.serviceDate = res.serviceDate
|
||
this.form.timeSlot = res.timeSlot
|
||
this.form.serviceAddress = res.serviceAddress
|
||
|
||
this.loadAvailableTeachers()
|
||
} catch (error) {
|
||
uni.showToast({ title: '加载订单信息失败', icon: 'none' })
|
||
}
|
||
},
|
||
|
||
async loadAvailableTeachers() {
|
||
try {
|
||
const res = await managerApi.getAvailableTeachers({
|
||
serviceId: this.orderInfo.serviceId,
|
||
serviceDate: this.form.serviceDate,
|
||
timeSlot: this.form.timeSlot
|
||
})
|
||
this.teacherList = res
|
||
} catch (error) {
|
||
uni.showToast({ title: '加载陪伴员列表失败', icon: 'none' })
|
||
}
|
||
},
|
||
|
||
selectTeacher(teacher) {
|
||
this.form.teacherId = teacher.id
|
||
},
|
||
|
||
getLevelText(level) {
|
||
const levelMap = {
|
||
normal: '普通教师',
|
||
gold: '金牌教师',
|
||
scholar: '学霸教师'
|
||
}
|
||
return levelMap[level] || '普通教师'
|
||
},
|
||
|
||
async submit() {
|
||
if (!this.canSubmit) return
|
||
|
||
uni.showLoading({ title: '派单中...' })
|
||
|
||
try {
|
||
await managerApi.assignOrder({
|
||
orderId: this.orderId,
|
||
managerId: this.managerId,
|
||
teacherId: this.form.teacherId,
|
||
serviceDate: this.form.serviceDate,
|
||
timeSlot: this.form.timeSlot,
|
||
serviceAddress: this.form.serviceAddress,
|
||
serviceRequirement: this.form.serviceRequirement
|
||
})
|
||
|
||
uni.hideLoading()
|
||
uni.showToast({
|
||
title: '派单成功',
|
||
icon: 'success',
|
||
duration: 2000
|
||
})
|
||
|
||
setTimeout(() => {
|
||
uni.navigateBack()
|
||
}, 2000)
|
||
} catch (error) {
|
||
uni.hideLoading()
|
||
uni.showToast({
|
||
title: error.message || '派单失败',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.container {
|
||
min-height: 100vh;
|
||
background: #f8f8f8;
|
||
padding: 20rpx 30rpx 120rpx;
|
||
}
|
||
|
||
.order-card {
|
||
background: #fff;
|
||
border-radius: 16rpx;
|
||
padding: 30rpx;
|
||
margin-bottom: 20rpx;
|
||
|
||
.card-title {
|
||
font-size: 32rpx;
|
||
font-weight: bold;
|
||
color: #333;
|
||
margin-bottom: 20rpx;
|
||
padding-left: 20rpx;
|
||
border-left: 6rpx solid #667eea;
|
||
}
|
||
|
||
.info-row {
|
||
display: flex;
|
||
margin-bottom: 16rpx;
|
||
font-size: 28rpx;
|
||
|
||
&:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.label {
|
||
color: #999;
|
||
min-width: 180rpx;
|
||
}
|
||
|
||
.value {
|
||
flex: 1;
|
||
color: #333;
|
||
}
|
||
}
|
||
}
|
||
|
||
.section {
|
||
background: #fff;
|
||
border-radius: 16rpx;
|
||
padding: 30rpx;
|
||
margin-bottom: 20rpx;
|
||
|
||
.section-title {
|
||
font-size: 32rpx;
|
||
font-weight: bold;
|
||
color: #333;
|
||
margin-bottom: 20rpx;
|
||
padding-left: 20rpx;
|
||
border-left: 6rpx solid #667eea;
|
||
}
|
||
|
||
textarea {
|
||
width: 100%;
|
||
min-height: 200rpx;
|
||
padding: 20rpx;
|
||
background: #f8f8f8;
|
||
border-radius: 12rpx;
|
||
font-size: 28rpx;
|
||
color: #333;
|
||
}
|
||
|
||
.count {
|
||
text-align: right;
|
||
font-size: 24rpx;
|
||
color: #999;
|
||
margin-top: 10rpx;
|
||
}
|
||
}
|
||
|
||
.teacher-list {
|
||
.teacher-item {
|
||
display: flex;
|
||
align-items: center;
|
||
padding: 24rpx;
|
||
background: #f8f8f8;
|
||
border-radius: 12rpx;
|
||
margin-bottom: 16rpx;
|
||
position: relative;
|
||
|
||
&:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
&.selected {
|
||
background: #e6f7ff;
|
||
border: 2rpx solid #667eea;
|
||
}
|
||
|
||
image {
|
||
width: 100rpx;
|
||
height: 100rpx;
|
||
border-radius: 50rpx;
|
||
margin-right: 20rpx;
|
||
}
|
||
|
||
.teacher-info {
|
||
flex: 1;
|
||
|
||
.teacher-name {
|
||
display: block;
|
||
font-size: 30rpx;
|
||
font-weight: bold;
|
||
color: #333;
|
||
margin-bottom: 8rpx;
|
||
}
|
||
|
||
.teacher-subjects {
|
||
display: block;
|
||
font-size: 26rpx;
|
||
color: #666;
|
||
margin-bottom: 8rpx;
|
||
}
|
||
|
||
.teacher-level {
|
||
display: inline-block;
|
||
padding: 4rpx 16rpx;
|
||
background: #fff7e6;
|
||
color: #fa8c16;
|
||
font-size: 22rpx;
|
||
border-radius: 20rpx;
|
||
}
|
||
}
|
||
|
||
.check-icon {
|
||
width: 48rpx;
|
||
height: 48rpx;
|
||
background: #667eea;
|
||
border-radius: 50%;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
|
||
.iconfont {
|
||
font-size: 32rpx;
|
||
color: #fff;
|
||
}
|
||
}
|
||
}
|
||
|
||
.empty {
|
||
text-align: center;
|
||
padding: 80rpx 0;
|
||
color: #999;
|
||
font-size: 28rpx;
|
||
}
|
||
}
|
||
|
||
.submit-btn {
|
||
position: fixed;
|
||
bottom: 0;
|
||
left: 0;
|
||
right: 0;
|
||
padding: 20rpx 30rpx;
|
||
background: #fff;
|
||
border-top: 1rpx solid #eee;
|
||
|
||
button {
|
||
width: 100%;
|
||
height: 88rpx;
|
||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||
color: #fff;
|
||
border: none;
|
||
border-radius: 44rpx;
|
||
font-size: 32rpx;
|
||
font-weight: bold;
|
||
|
||
&[disabled] {
|
||
background: #ccc;
|
||
}
|
||
}
|
||
}
|
||
</style>
|