peixue-dev/peidu/uniapp/manager-package/pages/manager/assign.vue

357 lines
7.9 KiB
Vue
Raw Normal View History

<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>