You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

388 lines
13 KiB

<template>
<view class="shift-application fixed-bot-padding">
<view class="a-warn">私教课以及教练预约的课程不可换班</view>
<view class="a-tit">我的换班</view>
<view class="a-ipts">
<picker :range="courseList" range-key="name" @change="courseChange">
<view class="i-view">
<input placeholder="请选择课程" disabled v-model="selectInfo.courseInfo.name" />
<image mode="aspectFit" src="/static/images/triangle_c33.png"></image>
</view>
</picker>
<picker :range="classList" range-key="class_name" @change="classChange">
<view class="i-view">
<input placeholder="请选择班级" disabled v-model="selectInfo.classInfo.class_name" />
<image mode="aspectFit" src="/static/images/triangle_c33.png"></image>
</view>
</picker>
<picker :range="coachList" range-key="name" @change="coachChange">
<view class="i-view">
<input placeholder="请选择换班教练" disabled v-model="selectInfo.coachInfo.name" />
<image mode="aspectFit" src="/static/images/triangle_c33.png"></image>
</view>
</picker>
<!-- <picker :range="timeList" range-key="_time" @change="timeChange"> -->
<view class="i-view" @click="showTimeModal">
<input placeholder="请选择换班时间" disabled v-model="selectedTimeTxt" />
<image mode="aspectFit" src="/static/images/triangle_c33.png"></image>
</view>
<!-- </picker> -->
</view>
<view class="a-tip">
<view>换班需要换班教练的时间为空闲。</view>
<view>换班后您的时间为空闲,记得前往我的时间。</view>
<view>管理您的时间哦。</view>
</view>
<view class="a-mask" v-if="isShowTimeModal">
<view class="m-content">
<scroll-view class="c-list" scroll-y="">
<view v-for="(e, i) in timeList" :key="i" :class="['l-item', tempSelectTimeID.includes(e.id)?'active':'']" @click="timeSelect(e)">{{e._time || '-'}}</view>
</scroll-view>
<view class="c-btns">
<view hover-class="hover-active" @click="isShowTimeModal = false">取消</view>
<view hover-class="hover-active" @click="confirmTimeSelected">确定</view>
</view>
</view>
</view>
<view class="fixed-bot-btn"><view hover-class="hover-active" @click="submitBtn">提交换班申请</view></view>
</view>
</template>
<script>
import { mapState } from 'vuex';
import { API } from '../../../js/api';
import { servers } from '../../../js/server';
import util from '../../../utils/util';
export default {
computed: {
...mapState([ 'storeInfo' ]),
selectedTimeTxt(){
let { selectTimeIDS, timeList } = this;
let txtArr = timeList.filter(e=>selectTimeIDS.includes(e.id)).map(e=>e._time);
return txtArr.join(',') || '';
}
},
data(){
return {
courseList: [], // 课程列表
classList: [], // 班级列表
coachList: [], // 教练列表
timeList: [], // 时间列表
selectTimeIDS: [], // 已选时间
tempSelectTimeID: [], // 临时选中
isShowTimeModal: false,
selectInfo: {
courseInfo: {
name: ''
},
classInfo: {
class_name: ''
},
coachInfo: {
name: ''
},
}
}
},
onLoad(){
this.getCourseList({});
},
methods: {
submitBtn: util.debounce(function(){
let { courseInfo, classInfo, coachInfo } = this.selectInfo;
let { selectTimeIDS } = this;
if(!courseInfo.id || !classInfo.id || !coachInfo.id || selectTimeIDS.length<=0 )return util.showNone('请选择完整!');
util.showLoad();
servers.post({
url: API.addShiftWorkRecord,
data: {
course_id: courseInfo.id,
class_id: classInfo.id,
accept_coach_id: coachInfo.id,
course_duration_ids: selectTimeIDS,
},
isDefaultGet: false,
})
.then(res=>{
util.hideLoad();
if(res.data.code == 0){
util.showModal({
title: '提示',
content: res.data.message || '操作成功!',
success: ele=>{
if(ele.confirm)util.routeTo(`/pages/shift/record/record`, 'nT')
}
})
}else{
util.showModal({
title: '提示',
content: res.data.message || '操作失败!'
})
}
})
.catch(util.hideLoad)
}, 300, 300),
showTimeModal(){
this.isShowTimeModal = true;
this.tempSelectTimeID = [...this.selectTimeIDS];
},
timeSelect(e){
let { tempSelectTimeID } = this;
this.tempSelectTimeID = tempSelectTimeID.includes(e.id) ?
tempSelectTimeID.filter(el=>el!=e.id) :
[...tempSelectTimeID, e.id];
},
confirmTimeSelected(){
this.selectTimeIDS = [...this.tempSelectTimeID];
this.isShowTimeModal = false;
},
// 教练切换
coachChange(e){
let { coachList, selectInfo } = this;
if(!selectInfo.classInfo.id)return util.showNone('请选择班级!');
let _coachInfo = coachList[e.detail.value] || {};
this.timeList = [];
this.selectTimeIDS = [];
this.selectInfo = {
...selectInfo,
coachInfo: _coachInfo
};
this.getShiftWorkClassTimes(selectInfo.courseInfo.id);
},
// 班级切换
classChange(e){
let { classList, selectInfo } = this;
if(!selectInfo.courseInfo.id)return util.showNone('请选择课程!');
let _classInfo = classList[e.detail.value] || {};
this.timeList = [];
this.selectTimeIDS = [];
this.selectInfo = {
...selectInfo,
classInfo: _classInfo,
coachInfo: {
name: ''
}
};
this.getCoachList();
},
// 课程切换
courseChange(e){
let { courseList } = this;
let _courseInfo = courseList[e.detail.value] || {};
this.timeList = [];
this.selectTimeIDS = [];
this.selectInfo = {
courseInfo: _courseInfo,
classInfo: {
class_name: ''
},
coachInfo: {
name: ''
}
};
this.getClassList( _courseInfo.id );
},
// 时间列表
getShiftWorkClassTimes(courseId){
util.showLoad();
servers.get({
url: API.getShiftWorkClassTimes,
data: { courseId },
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
let _list = res || [];
this.timeList = _list.map(e=>{
return {
...e,
_time: `${e.date} ${e.start_duration}~${e.end_duration}`
}
});
})
},
// 教练列表
getCoachList(){
util.showLoad();
let { storeInfo } = this;
servers.get({
url: API.getCoachList,
data: { stadium_id: storeInfo.id },
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
let _list = res.list || [];
this.coachList = _list;
})
},
// 班级列表
getClassList( course_id ){
util.showLoad();
servers.get({
url: API.course.getClassList,
data: { course_id, type: 0 },
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
let _list = res.list || [];
this.classList = _list;
console.warn(_list)
})
},
// 课程列表
getCourseList({
is_experience_class = 0,
kind = '',
}){
let { storeInfo } = this;
util.showLoad();
servers.get({
url: API.course.courseList,
data: {
stadium_id: storeInfo.id,
is_experience_class,
kind,
have_class_way: 2,
},
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad();
let _list = res.list || [];
this.courseList = _list;
})
}
}
}
</script>
<style lang="scss">
@import "~style/public.scss";
.a-mask{
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 10;
background-color: rgba($color: #000000, $alpha: .5);
.m-content{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 80%;
height: 800upx;
border-radius: 10upx;
background-color: #fff;
padding: 24upx;
.c-list{
margin-bottom: 24upx;
height: 600upx;
.l-item{
margin-bottom: 12upx;
height: 80upx;
border: 2upx solid #d8d8d8;
color: #333;
line-height: 76upx;
text-align: center;
font-size: 36upx;
border-radius: 10upx;
&.active{
border-color: $themeColor;
color: $themeColor;
}
}
}
.c-btns{
@include centerFlex(center);
>view{
margin: 0 24upx;
width: 200upx;
height: 88upx;
line-height: 88upx;
text-align: center;
border-radius: 44upx;
background-color: $themeColor;
font-size: 32upx;
color: #fff;
border: 2upx solid $themeColor;
&:first-child{
color: $themeColor;
background-color: #fff;
}
}
}
}
}
page{
background-color: #fff;
}
.shift-application{
}
.a-warn{
margin-bottom: 52upx;
height: 92upx;
line-height: 92upx;
text-align: center;
font-size: 28upx;
color: #FF873D;
background-color: rgba($color: #FF873D, $alpha: .2);
}
.a-tit{
line-height: 44upx;
text-align: center;
font-size: 32upx;
font-weight: 500;
color: #333;
}
.a-ipts{
padding-top: 24upx;
.i-view{
margin: 0 auto 24upx;
width: 538upx;
height: 88upx;
border: 2upx solid #d8d8d8;
border-radius: 10upx;
padding: 0 20upx;
@include centerFlex(space-between);
>input{
flex-grow: 1;
height: 100%;
font-size: 28upx;
color: #333;
}
>image{
margin-left: 20upx;
flex-shrink: 0;
width: 28upx;
height: 28upx;
}
}
}
.a-tip{
margin: 0 auto;
width: 538upx;
>view{
font-size: 26upx;
line-height: 36upx;
color: #9a9a9d;
}
}
.fixed-bot-btn{
border-top: 2upx solid #D8D8D8;
}
</style>