|
@@ -0,0 +1,1028 @@
|
|
|
+<template>
|
|
|
+ <div class="program">
|
|
|
+ <van-cell-group class="van-cell-group--inset">
|
|
|
+ <van-cell :title="vipGroup.name" class="titleContent" title-class="titleStyle" label-class="labelStyle">
|
|
|
+ <template #label>
|
|
|
+ <p>{{ vipGroup.description }}</p>
|
|
|
+ <!-- <p>排课时间范围:{{ vipGroup.coursesStartTime }} 至 {{ vipGroup.coursesEndTime }}</p> -->
|
|
|
+ </template>
|
|
|
+ </van-cell>
|
|
|
+ </van-cell-group>
|
|
|
+
|
|
|
+ <h2 class="van-block__title">{{ typeStatus ? '付费' : '赠送' }}课程排课</h2>
|
|
|
+ <van-cell-group>
|
|
|
+ <van-field
|
|
|
+ :value="typeStatus ? courseType[vipGroup.courseType] : courseType[vipGroup.giveCourseType]"
|
|
|
+ label="课程类型"
|
|
|
+ :readonly="true"
|
|
|
+ input-align="right"
|
|
|
+ size="large"
|
|
|
+ placeholder="请选择"
|
|
|
+ />
|
|
|
+ <van-field
|
|
|
+ :value="typeStatus ? vipGroup.vipGroupCategoryNames : vipGroup.giveCategoryName"
|
|
|
+ label="课程形式"
|
|
|
+ v-if="courseTypeIsVip"
|
|
|
+ :readonly="true"
|
|
|
+ input-align="right"
|
|
|
+ size="large"
|
|
|
+ placeholder="请选择"
|
|
|
+ />
|
|
|
+ <van-field
|
|
|
+ v-model="formName.subjectListName"
|
|
|
+ @click="onGetSheetList('subjectList')"
|
|
|
+ label="排课声部"
|
|
|
+ :readonly="true"
|
|
|
+ input-align="right"
|
|
|
+ is-link
|
|
|
+ size="large"
|
|
|
+ placeholder="请选择"
|
|
|
+ />
|
|
|
+ <van-field
|
|
|
+ v-model="formName.educationalTeacherName"
|
|
|
+ @click="onGetSheetList('teacherList')"
|
|
|
+ label="乐团主管"
|
|
|
+ :readonly="true"
|
|
|
+ input-align="right"
|
|
|
+ is-link
|
|
|
+ size="large"
|
|
|
+ placeholder="请选择"
|
|
|
+ />
|
|
|
+ </van-cell-group>
|
|
|
+
|
|
|
+ <template v-if="studentList.length > 0">
|
|
|
+ <h2 class="van-block__title">上课学员</h2>
|
|
|
+ <van-cell-group>
|
|
|
+ <van-cell title-style="flex: 1 auto; color: #1A1A1A;" size="large" v-for="(item, index) in studentList" :key="index">
|
|
|
+ <template #title>
|
|
|
+ {{ item.username }} - {{ item.phone }}
|
|
|
+ </template>
|
|
|
+ <template #default>
|
|
|
+ <span @click="onDelete('student', item)"><van-icon name="delete-o" size=".14rem" /> <span style="font-size: .12rem;">删除</span></span>
|
|
|
+ </template>
|
|
|
+ </van-cell>
|
|
|
+ </van-cell-group>
|
|
|
+ </template>
|
|
|
+ <div class="addButton" @click="studentStatus = true">
|
|
|
+ <van-icon name="plus" /> 添加学员
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <h2 class="van-block__title">课时组成</h2>
|
|
|
+ <van-cell-group>
|
|
|
+ <van-field
|
|
|
+ v-if="statusList.hasOnline && teachMode == -1"
|
|
|
+ v-model="form.onlineClassesNums"
|
|
|
+ @keyup="onClassKeyUp"
|
|
|
+ label="线上课次数"
|
|
|
+ input-align="right"
|
|
|
+ size="large"
|
|
|
+ placeholder="请输入次数"
|
|
|
+ type="number"
|
|
|
+ />
|
|
|
+ <van-field
|
|
|
+ v-if="statusList.hasOffline && teachMode == -1"
|
|
|
+ v-model="form.offlineClassesNums"
|
|
|
+ @keyup="onClassKeyUp('offLine')"
|
|
|
+ label="线下课次数"
|
|
|
+ input-align="right"
|
|
|
+ size="large"
|
|
|
+ placeholder="请输入次数"
|
|
|
+ type="number"
|
|
|
+ />
|
|
|
+ <van-field
|
|
|
+ v-if="tempOfflineNum > 0"
|
|
|
+ v-model="formName.teacherSchoolName"
|
|
|
+ @click="onGetSheetList('teacherSchool')"
|
|
|
+ label="线下课地址"
|
|
|
+ :readonly="true"
|
|
|
+ input-align="right"
|
|
|
+ is-link
|
|
|
+ size="large"
|
|
|
+ placeholder="请选择"
|
|
|
+ />
|
|
|
+ <!-- 不影响判断逻辑 -->
|
|
|
+ <van-field
|
|
|
+ v-if="isMusicTheory"
|
|
|
+ :value="'1-' + (form.studentNum || 0) + '人'"
|
|
|
+ label="班级人数"
|
|
|
+ :readonly="true"
|
|
|
+ input-align="right"
|
|
|
+ size="large"
|
|
|
+ />
|
|
|
+ <van-field
|
|
|
+ v-else
|
|
|
+ :value="(form.studentNum || 0) + '人'"
|
|
|
+ label="班级人数"
|
|
|
+ :readonly="true"
|
|
|
+ input-align="right"
|
|
|
+ size="large"
|
|
|
+ />
|
|
|
+ <van-field
|
|
|
+ :value="(form.singleClassMinutes || 0) + '分钟'"
|
|
|
+ label="单课时时长"
|
|
|
+ :readonly="true"
|
|
|
+ input-align="right"
|
|
|
+ size="large"
|
|
|
+ />
|
|
|
+ </van-cell-group>
|
|
|
+
|
|
|
+ <h2 class="van-block__title">课时安排</h2>
|
|
|
+ <van-cell-group>
|
|
|
+ <van-cell
|
|
|
+ title="最早排课时间"
|
|
|
+ :readonly="true"
|
|
|
+ v-if="vipGroup.coursesStartTime"
|
|
|
+ input-align="right"
|
|
|
+ size="large"
|
|
|
+ value-class="showText"
|
|
|
+ :value="vipGroup.coursesStartTime"
|
|
|
+ >
|
|
|
+ </van-cell>
|
|
|
+ <van-cell
|
|
|
+ title="最晚排课时间"
|
|
|
+ :readonly="true"
|
|
|
+ v-if="vipGroup.coursesEndTime"
|
|
|
+ input-align="right"
|
|
|
+ size="large"
|
|
|
+ value-class="showText"
|
|
|
+ :value="vipGroup.coursesEndTime"
|
|
|
+ >
|
|
|
+ </van-cell>
|
|
|
+ <!-- 为了处理,付费网管课程 -->
|
|
|
+ <!-- {{ !courseTypeIsVip && isLimitNum && typeStatus ? false : true }} -->
|
|
|
+ <van-field
|
|
|
+ v-model="form.totalClassTime"
|
|
|
+ label="课时总数"
|
|
|
+ :readonly="!courseTypeIsVip && !isLimitNum && typeStatus ? false : true"
|
|
|
+ input-align="right"
|
|
|
+ size="large"
|
|
|
+ placeholder="请输入排课课时数"
|
|
|
+ >
|
|
|
+ <template #extra v-if="form.totalClassTime">
|
|
|
+ <span style="color: #808080; font-size: 16px;">课时</span>
|
|
|
+ </template>
|
|
|
+ </van-field>
|
|
|
+ <van-field
|
|
|
+ v-model="form.courseStart"
|
|
|
+ label="排课开始时间"
|
|
|
+ :readonly="true"
|
|
|
+ input-align="right"
|
|
|
+ is-link
|
|
|
+ size="large"
|
|
|
+ placeholder="请选择"
|
|
|
+ @click="dataForm.status = true"
|
|
|
+ />
|
|
|
+ </van-cell-group>
|
|
|
+
|
|
|
+ <van-cell-group :border="false" style="margin-top: .1rem">
|
|
|
+ <van-cell
|
|
|
+ title-class="title-time"
|
|
|
+ v-for="(item, index) in scheduleList"
|
|
|
+ :key="index"
|
|
|
+ >
|
|
|
+ <template slot="title">
|
|
|
+ <span class="online">{{ item.type }}</span>
|
|
|
+ <span class="week">{{ item.weekStr }}</span>
|
|
|
+ <span class="timer">{{ item.startTime + "~" + item.endTime }}</span>
|
|
|
+ </template>
|
|
|
+ <template slot="default">
|
|
|
+ <span @click="onDelete('class', item)"><van-icon name="delete-o" size=".14rem" /> <span style="font-size: .12rem;">删除</span></span>
|
|
|
+ </template>
|
|
|
+ </van-cell>
|
|
|
+ </van-cell-group>
|
|
|
+ <div class="addButton" @click="teachingStatus = true">
|
|
|
+ <van-icon name="plus" /> 添加课时安排
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <van-cell-group>
|
|
|
+ <van-field
|
|
|
+ label="排课列表"
|
|
|
+ v-if="scheduleList.length > 0"
|
|
|
+ disabled
|
|
|
+ input-align="right"
|
|
|
+ @click="onShowTimeTable"
|
|
|
+ is-link
|
|
|
+ size="large"
|
|
|
+ />
|
|
|
+ </van-cell-group>
|
|
|
+
|
|
|
+ <div class="button-group">
|
|
|
+ <van-button type="primary" @click="onSubmit" round size="large">确认</van-button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 选择上课学员 -->
|
|
|
+ <van-popup
|
|
|
+ v-model="studentStatus"
|
|
|
+ :lock-scroll="true"
|
|
|
+ position="bottom"
|
|
|
+ :style="{ height: '80%' }"
|
|
|
+ class="studentChose"
|
|
|
+ >
|
|
|
+ <student-list
|
|
|
+ @close="studentStatus = false"
|
|
|
+ :studentList="studentList"
|
|
|
+ :activityId="activityId"
|
|
|
+ :studentNum="form.studentNum"
|
|
|
+ :courseTypeIsVip="courseTypeIsVip"
|
|
|
+ :typeStatus="typeStatus"
|
|
|
+ :isMusicTheory="isMusicTheory"
|
|
|
+ @submit="onSelectStudent" />
|
|
|
+ </van-popup>
|
|
|
+
|
|
|
+ <!-- 排课开始时间 -->
|
|
|
+ <van-popup v-model="dataForm.status" position="bottom">
|
|
|
+ <van-datetime-picker
|
|
|
+ v-model="dataForm.currentDate"
|
|
|
+ type="date"
|
|
|
+ :min-date="dataForm.minDate"
|
|
|
+ :max-date="dataForm.maxDate"
|
|
|
+ :formatter="formatter"
|
|
|
+ @cancel="dataForm.status = false"
|
|
|
+ @confirm="onCurrentConfirm"
|
|
|
+ />
|
|
|
+ </van-popup>
|
|
|
+ <!-- 课时安排 -->
|
|
|
+ <van-popup v-model="teachingStatus" position="bottom">
|
|
|
+ <course-modal :scheduleList="scheduleList" :singleClassMinutes="form.singleClassMinutes" @close="teachingStatus = false" />
|
|
|
+ </van-popup>
|
|
|
+
|
|
|
+ <van-popup v-model="sheetForm.sheetStatus" position="bottom">
|
|
|
+ <van-picker
|
|
|
+ :loading="sheetForm.loading"
|
|
|
+ :default-index="sheetForm.index"
|
|
|
+ :columns="sheetForm.columns"
|
|
|
+ show-toolbar
|
|
|
+ @cancel="sheetForm.sheetStatus = false"
|
|
|
+ @confirm="onSheetConfirm"
|
|
|
+ />
|
|
|
+ </van-popup>
|
|
|
+
|
|
|
+ <!-- 课表展示 -->
|
|
|
+ <van-popup v-model="statusList.classTime" position="bottom" >
|
|
|
+ <van-row>
|
|
|
+ <van-col span="12">上课类型</van-col>
|
|
|
+ <van-col span="12">上课时间</van-col>
|
|
|
+ </van-row>
|
|
|
+ <div class="tableContainer">
|
|
|
+ <van-row v-for="(item, index) in timeTable" :key="index">
|
|
|
+ <van-col span="12">
|
|
|
+ {{ item.teachMode == "ONLINE" ? "线上" : "线下" }}
|
|
|
+ </van-col>
|
|
|
+ <van-col span="12">
|
|
|
+ {{ item.classDate }} {{ item.startClassTimeStr }}
|
|
|
+ </van-col>
|
|
|
+ </van-row>
|
|
|
+ </div>
|
|
|
+ </van-popup>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import dayjs from 'dayjs'
|
|
|
+import studentList from './modal/studentList'
|
|
|
+import courseModal from './modal/course'
|
|
|
+import { courseType } from '../../constant'
|
|
|
+import { getActivityWaitCourseStudentNum, createVipGroup, createPracticeGroup } from './api'
|
|
|
+import { findSubSubjects, findEducationUsers, findVipSchoolByTeacher2 } from "@/api/teacher";
|
|
|
+export default {
|
|
|
+ components: { studentList, courseModal },
|
|
|
+ data() {
|
|
|
+ const query = this.$route.query
|
|
|
+ return {
|
|
|
+ courseType,
|
|
|
+ type: query.type,
|
|
|
+ activityId: query.activityId,
|
|
|
+ vipDetail: {},
|
|
|
+ vipGroup: {},
|
|
|
+ studentStatus: false,
|
|
|
+ studentList: [],
|
|
|
+ checkboxSelectIds: [],
|
|
|
+ teachMode: null, // -1:所有;0:线上;1:线下"
|
|
|
+ sheetForm: {
|
|
|
+ // 上拉弹窗
|
|
|
+ currentType: null, // 当前选择的类型
|
|
|
+ sheetStatus: false,
|
|
|
+ loading: true, // 加载数据
|
|
|
+ index: 0, // 选中的索引值
|
|
|
+ columns: [],
|
|
|
+ },
|
|
|
+ timeTable: [], // 生成的课表
|
|
|
+ loadData: {
|
|
|
+ // 下拉加载数据
|
|
|
+ subjectList: [], // 声部列表
|
|
|
+ teacherList: [],
|
|
|
+ teacherSchool: [], // 线下课地址
|
|
|
+ },
|
|
|
+ tempOfflineNum: 0, // 临时存放线下课次数
|
|
|
+ form: {
|
|
|
+ vipGroupCategoryId: null,
|
|
|
+ subjectIdList: null,
|
|
|
+ educationalTeacherId: null,
|
|
|
+ singleClassMinutes: null,
|
|
|
+ onlineClassesNums: null,
|
|
|
+ offlineClassesNums: null,
|
|
|
+ totalClassTime: null, // 总课时数
|
|
|
+ studentNum: null, // 每班人数
|
|
|
+ courseStart: null, // 排课开始时间
|
|
|
+ teacherSchoolId: null,
|
|
|
+ vipGroupActivityId: query.activityId,
|
|
|
+ },
|
|
|
+ formName: {
|
|
|
+ vipGroupCategoryId: null,
|
|
|
+ subjectListName: null,
|
|
|
+ subjectListIndex: 0, // 声部名称
|
|
|
+ educationalTeacherName: null, // 乐团主管
|
|
|
+ educationalTeacherIndex: 0,
|
|
|
+ teacherSchoolName: null,
|
|
|
+ teacherSchoolIndex: 0, // 线下课地址
|
|
|
+ },
|
|
|
+ statusList: {
|
|
|
+ hasOnline: false, // 是否显示线上
|
|
|
+ hasOffline: false, // 是否显示线下
|
|
|
+ classTime: false, // 查看排课列表
|
|
|
+ },
|
|
|
+ scheduleList: [],
|
|
|
+ // 排课弹窗
|
|
|
+ teachingStatus: false, // 课时安排状态
|
|
|
+ dataForm: {
|
|
|
+ // 时间下拉框
|
|
|
+ status: false,
|
|
|
+ minDate: new Date(),
|
|
|
+ maxDate: new Date(2035, 10, 1),
|
|
|
+ currentDate: new Date(),
|
|
|
+ },
|
|
|
+ isMusicTheory: false,
|
|
|
+ }
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ typeStatus() { // 是否是付费课程
|
|
|
+ return this.type == 'pay' ? true : false
|
|
|
+ },
|
|
|
+ courseTypeIsVip() { // 目前只有两种课程,VIP 网管课,则可以这样判断
|
|
|
+ const type = this.typeStatus ? this.vipGroup.courseType : this.vipGroup.giveCourseType
|
|
|
+ return type == 'VIP' ? true : false
|
|
|
+ },
|
|
|
+ isLimitNum() { // 是否限制排课
|
|
|
+ return this.vipGroup.minCourseNum > 0 ? true : false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.__init()
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ async __init() {
|
|
|
+ try {
|
|
|
+ let res = await getActivityWaitCourseStudentNum({ activityId: this.activityId })
|
|
|
+ this.vipDetail = res.data
|
|
|
+ let vipGroup = res.data.vipGroupActivity
|
|
|
+ vipGroup.coursesStartTime = vipGroup.coursesStartTime ? dayjs(vipGroup.coursesStartTime).format('YYYY-MM-DD') : null
|
|
|
+ vipGroup.coursesEndTime = vipGroup.coursesEndTime ? dayjs(vipGroup.coursesEndTime).format('YYYY-MM-DD') : null
|
|
|
+ this.vipGroup = vipGroup
|
|
|
+ let form = this.form
|
|
|
+ // 课程形式
|
|
|
+ form.vipGroupCategoryId = this.typeStatus ? vipGroup.vipGroupCategoryIdList : vipGroup.giveCategoryId
|
|
|
+ // 单课时长
|
|
|
+ form.singleClassMinutes = this.typeStatus ? vipGroup.singleCourseTime : vipGroup.giveSingleCourseTime
|
|
|
+
|
|
|
+ this.isMusicTheory = vipGroup.giveCategoryName === '乐理课'
|
|
|
+
|
|
|
+ if(this.courseTypeIsVip) {
|
|
|
+ // 每班人数
|
|
|
+ form.studentNum = this.typeStatus ? vipGroup.vipGroupCategoryNum : vipGroup.giveCategoryNum
|
|
|
+ this.statusList.hasOnline = this.typeStatus ? this.formatStatus('online', vipGroup.teachMode) : this.formatStatus('online', vipGroup.giveTeachMode)
|
|
|
+ this.statusList.hasOffline = this.typeStatus ? this.formatStatus('offline', vipGroup.teachMode) : this.formatStatus('offline', vipGroup.giveTeachMode)
|
|
|
+ } else {
|
|
|
+ form.totalClassTime = null
|
|
|
+ form.studentNum = 1
|
|
|
+ this.statusList.hasOnLine = false
|
|
|
+ this.statusList.hasOffLine = false
|
|
|
+ }
|
|
|
+
|
|
|
+ if(this.isLimitNum || !this.typeStatus) { // 是否限制了排课
|
|
|
+ // 排课次数,活动排课没有范围一说,最大次数和最小次数必须一致
|
|
|
+ form.totalClassTime = this.typeStatus ? vipGroup.minCourseNum : vipGroup.giveCourseNum
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果
|
|
|
+ if(this.teachMode == 0) {
|
|
|
+ form.onlineClassesNums = form.totalClassTime || 0
|
|
|
+ form.offlineClassesNums = 0
|
|
|
+ } else if(this.teachMode == 1) {
|
|
|
+ form.onlineClassesNums = 0
|
|
|
+ form.offlineClassesNums = form.totalClassTime || 0
|
|
|
+ this.tempOfflineNum = form.totalClassTime || 0
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onGetSheetList(name) {
|
|
|
+ // 获取科目列表
|
|
|
+ let sheetForm = this.sheetForm;
|
|
|
+ sheetForm.columns = [];
|
|
|
+ sheetForm.sheetStatus = true;
|
|
|
+ sheetForm.loading = true;
|
|
|
+ sheetForm.currentType = name;
|
|
|
+ sheetForm.index = 0;
|
|
|
+ let arr = this.loadData[name];
|
|
|
+ if (arr.length > 0) {
|
|
|
+ sheetForm.columns = arr;
|
|
|
+ sheetForm.index = this.formName[name + "Index"];
|
|
|
+ sheetForm.loading = false;
|
|
|
+ } else {
|
|
|
+ this.onLoadingData(name);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onLoadingData() {
|
|
|
+ // 加载数据
|
|
|
+ let sheetForm = this.sheetForm;
|
|
|
+ if (sheetForm.currentType == "subjectList") {
|
|
|
+ // 声部列表
|
|
|
+ findSubSubjects().then((res) => {
|
|
|
+ let result = res.data;
|
|
|
+ if (result.code == 200 && result.data.length > 0) {
|
|
|
+ let tempArr = [];
|
|
|
+ result.data.forEach((item) => {
|
|
|
+ item.value = item.id;
|
|
|
+ item.text = item.name;
|
|
|
+ tempArr.push(item);
|
|
|
+ });
|
|
|
+ this.loadData.subjectList = tempArr;
|
|
|
+ sheetForm.columns = tempArr;
|
|
|
+ sheetForm.loading = false;
|
|
|
+ } else {
|
|
|
+ this.$toast("暂无科目列表");
|
|
|
+ sheetForm.loading = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else if (sheetForm.currentType == "teacherSchool") {
|
|
|
+ // 教师教学点
|
|
|
+ findVipSchoolByTeacher2().then((res) => {
|
|
|
+ let result = res.data;
|
|
|
+ if (result.code == 200 && result.data.length > 0) {
|
|
|
+ let tempArr = [];
|
|
|
+ result.data.forEach((item) => {
|
|
|
+ item.value = item.id;
|
|
|
+ item.text = item.name;
|
|
|
+ tempArr.push(item);
|
|
|
+ });
|
|
|
+ this.loadData.teacherSchool = tempArr;
|
|
|
+ sheetForm.columns = tempArr;
|
|
|
+ sheetForm.loading = false;
|
|
|
+ } else {
|
|
|
+ this.$toast("暂无教学点");
|
|
|
+ sheetForm.loading = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else if (sheetForm.currentType == "teacherList") {
|
|
|
+ // 乐团主管
|
|
|
+ findEducationUsers().then((res) => {
|
|
|
+ let result = res.data;
|
|
|
+ if (result.code == 200 && result.data.length > 0) {
|
|
|
+ let tempArr = [];
|
|
|
+ result.data.forEach((item) => {
|
|
|
+ item.value = item.userId;
|
|
|
+ item.text = item.userName;
|
|
|
+ tempArr.push(item);
|
|
|
+ });
|
|
|
+ this.loadData.teacherList = tempArr;
|
|
|
+ sheetForm.columns = tempArr;
|
|
|
+ sheetForm.loading = false;
|
|
|
+ } else {
|
|
|
+ this.$toast("暂无乐团主管");
|
|
|
+ sheetForm.loading = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onSheetConfirm(value, index) {
|
|
|
+ // 上拉弹窗
|
|
|
+ let sheetForm = this.sheetForm,
|
|
|
+ form = this.form,
|
|
|
+ formName = this.formName
|
|
|
+ if (sheetForm.currentType == "subjectList") {
|
|
|
+ // 科目名称赋值
|
|
|
+ form.subjectIdList = value.value;
|
|
|
+ formName.subjectListName = value.text;
|
|
|
+ formName.subjectListIndex = index;
|
|
|
+ } else if (sheetForm.currentType == "teacherSchool") {
|
|
|
+ // 线下课地址
|
|
|
+ form.teacherSchoolId = value.value;
|
|
|
+ formName.teacherSchoolName = value.text;
|
|
|
+ formName.teacherSchoolIndex = index;
|
|
|
+ } else if (sheetForm.currentType == "teacherList") {
|
|
|
+ // 乐团主管
|
|
|
+ form.educationalTeacherId = value.value;
|
|
|
+ formName.educationalTeacherName = value.text;
|
|
|
+ formName.educationalTeacherIndex = index;
|
|
|
+ }
|
|
|
+
|
|
|
+ sheetForm.sheetStatus = false;
|
|
|
+ },
|
|
|
+ async onSubmit() {
|
|
|
+ // 次数限制是否可以继续创建
|
|
|
+ let form = this.form;
|
|
|
+ let statusList = this.statusList;
|
|
|
+
|
|
|
+ if (!form.subjectIdList) {
|
|
|
+ this.$toast("请选择排课声部");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!form.educationalTeacherId) {
|
|
|
+ this.$toast("请选择乐团主管");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (this.checkboxSelectIds.length <= 0) {
|
|
|
+ this.$toast("请选择上课学员");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.isMusicTheory) {
|
|
|
+ if (!(this.checkboxSelectIds.length >= 1 && this.checkboxSelectIds.length <= this.form.studentNum)) {
|
|
|
+ this.$toast(`请选择1-${this.form.studentNum}名学生,当前选择${this.checkboxSelectIds.length}名`);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (this.checkboxSelectIds.length != this.form.studentNum) {
|
|
|
+ this.$toast(`请选择学生${this.form.studentNum}名,当前选择${this.checkboxSelectIds.length}名`);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ let onlineClassesStatus = !form.onlineClassesNums && form.onlineClassesNums <= 0 ? true : false;
|
|
|
+ let offlineClassesStatus = !form.offlineClassesNums && form.offlineClassesNums <= 0 ? true : false;
|
|
|
+
|
|
|
+ if (statusList.hasOnline && onlineClassesStatus) {
|
|
|
+ this.$toast("请输入线上课次数");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (statusList.hasOffline && !statusList.hasOnline) {
|
|
|
+ if (offlineClassesStatus) {
|
|
|
+ this.$toast("请输入线下课次数");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否有线下
|
|
|
+ if (form.offlineClassesNums > 0 && !form.teacherSchoolId) {
|
|
|
+ this.$toast("请选择线下课地址");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (
|
|
|
+ statusList.hasOffline &&
|
|
|
+ statusList.hasOnline &&
|
|
|
+ parseFloat(form.onlineClassesNums || 0) + parseFloat(form.offlineClassesNums || 0) != this.form.totalClassTime
|
|
|
+ ) {
|
|
|
+ this.$toast('线上课次数+线下课次数不等于总课次数')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.scheduleList.length <= 0) {
|
|
|
+ this.$toast("课时安排不能为空");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!this.checkCourseList()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 排课
|
|
|
+ this.setTimeTable();
|
|
|
+
|
|
|
+ form.studentIdList = this.checkboxSelectIds.join(",");
|
|
|
+
|
|
|
+ form.firstStudentId = this.studentList.length > 0 ? this.studentList[0].userId : null;
|
|
|
+ form.onlineClassesNum = Number(form.onlineClassesNums);
|
|
|
+ form.offlineClassesNum = Number(form.offlineClassesNums);
|
|
|
+ let params = {
|
|
|
+ courseSchedules: this.timeTable
|
|
|
+ }
|
|
|
+ if(this.courseTypeIsVip) {
|
|
|
+ params.vipGroupApplyBaseInfo = form
|
|
|
+ params.giveFlag = !this.typeStatus
|
|
|
+ await this.onPayVip(params)
|
|
|
+ } else {
|
|
|
+ params.practiceGroupApplyBaseInfoDto = form
|
|
|
+ params.practiceGroupApplyBaseInfoDto.studentId = form.studentIdList
|
|
|
+ params.practiceGroupApplyBaseInfoDto.allCourseNum = form.totalClassTime
|
|
|
+ params.practiceGroupApplyBaseInfoDto.subjectId = form.subjectIdList
|
|
|
+ params.giveFlag = !this.typeStatus
|
|
|
+ await this.onPayPractice(params)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ async onPayVip(params) {
|
|
|
+ try {
|
|
|
+ await createVipGroup(params)
|
|
|
+ this.$toast("排课成功");
|
|
|
+ setTimeout(() => {
|
|
|
+ this.$router.back()
|
|
|
+ }, 1000);
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ },
|
|
|
+ async onPayPractice(params) {
|
|
|
+ try {
|
|
|
+ await createPracticeGroup(params)
|
|
|
+ this.$toast("排课成功");
|
|
|
+ setTimeout(() => {
|
|
|
+ this.$router.back()
|
|
|
+ }, 1000);
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onSelectStudent(items) {
|
|
|
+ // 选中的数据
|
|
|
+ const tempItems = items || []
|
|
|
+ this.studentList = tempItems
|
|
|
+ // if(tempItems.length <= 0) { // 判断是否有选择学员
|
|
|
+ this.checkboxSelectIds = []
|
|
|
+ // }
|
|
|
+ tempItems.forEach(item => {
|
|
|
+ this.checkboxSelectIds.push(item.userId)
|
|
|
+ })
|
|
|
+ this.studentStatus = false
|
|
|
+ },
|
|
|
+ onDelete(type, item) {
|
|
|
+ if(type == 'student') {
|
|
|
+ // 删除上课学员
|
|
|
+ this.$dialog.confirm({
|
|
|
+ title: '提示',
|
|
|
+ message: '是否删除该学员?',
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ confirmButtonColor: '#269a93',
|
|
|
+ cancelButtonText: '取消'
|
|
|
+ }).then(() => {
|
|
|
+ let index = this.studentList.indexOf(item);
|
|
|
+ if (index !== -1) {
|
|
|
+ this.studentList.splice(index, 1);
|
|
|
+ this.checkboxSelectIds.splice(index, 1);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else if(type == 'class') {
|
|
|
+ // 删除上课学员
|
|
|
+ this.$dialog.confirm({
|
|
|
+ title: '提示',
|
|
|
+ message: '是否删除该课时安排?',
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ confirmButtonColor: '#269a93',
|
|
|
+ cancelButtonText: '取消'
|
|
|
+ }).then(() => {
|
|
|
+ let index = this.scheduleList.indexOf(item);
|
|
|
+ if (index !== -1) {
|
|
|
+ this.scheduleList.splice(index, 1);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onCurrentConfirm(value) {
|
|
|
+ // 排课开始时间
|
|
|
+ this.form.courseStart = dayjs(value).format('YYYY-MM-DD')
|
|
|
+ this.dataForm.status = false;
|
|
|
+ },
|
|
|
+ onClassKeyUp(type) {
|
|
|
+ // 线上课&线下课修改时
|
|
|
+ if(this.teachMode != -1) return
|
|
|
+ let form = this.form
|
|
|
+ let onlineNum = form.onlineClassesNums
|
|
|
+ let offLineNum = form.offlineClassesNums
|
|
|
+ // 重置次数,不能
|
|
|
+ if(parseInt(onlineNum || 0) + parseInt(offLineNum || 0) >= form.totalClassTime) {
|
|
|
+ if(type == 'offLine') {
|
|
|
+ let diffNum = form.totalClassTime - parseInt(onlineNum || 0)
|
|
|
+ offLineNum = diffNum < 0 ? 0 : diffNum
|
|
|
+ } else {
|
|
|
+ let diffNum = form.totalClassTime - parseInt(offLineNum || 0)
|
|
|
+ onlineNum = diffNum < 0 ? 0 : diffNum
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.form.onlineClassesNums = onlineNum
|
|
|
+ this.form.offlineClassesNums = offLineNum
|
|
|
+ this.tempOfflineNum = offLineNum || 0
|
|
|
+ },
|
|
|
+ onShowTimeTable() {
|
|
|
+ // 显示排课列表
|
|
|
+ if (!this.checkCourseList()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const checkmMsg = this.checkTimeTable()
|
|
|
+ if (checkmMsg) {
|
|
|
+ this.$toast(checkmMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ this.statusList.classTime = true;
|
|
|
+ this.setTimeTable();
|
|
|
+ },
|
|
|
+ checkTimeTable() {
|
|
|
+ let form = this.form,
|
|
|
+ scheduleList = this.scheduleList;
|
|
|
+ let online = parseInt(
|
|
|
+ form.onlineClassesNums ? form.onlineClassesNums : 0
|
|
|
+ );
|
|
|
+ let offline = parseInt(
|
|
|
+ form.offlineClassesNums ? form.offlineClassesNums : 0
|
|
|
+ );
|
|
|
+ // 网管课默认只有线上课次
|
|
|
+ if(!this.courseTypeIsVip) {
|
|
|
+ online = parseInt(form.totalClassTime || 0)
|
|
|
+ }
|
|
|
+ // let totalCount = Number(online) + Number(offline)
|
|
|
+ let hasOnlineSchedule = false,
|
|
|
+ hasOfflineSchedule = false
|
|
|
+
|
|
|
+ for (let i = 0; i < scheduleList.length; i++) {
|
|
|
+ const item = scheduleList[i];
|
|
|
+ if (item.type == '线上') {
|
|
|
+ hasOnlineSchedule = true;
|
|
|
+ }
|
|
|
+ if (item.type == '线下') {
|
|
|
+ hasOfflineSchedule = true;
|
|
|
+ }
|
|
|
+ if (hasOnlineSchedule && hasOfflineSchedule) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (online > 0 && !hasOnlineSchedule) {
|
|
|
+ return '请添加线上课时安排';
|
|
|
+ }
|
|
|
+ if (offline > 0 && !hasOfflineSchedule) {
|
|
|
+ return '请添加线下课时安排';
|
|
|
+ }
|
|
|
+ console.log({...form}, online, offline, hasOnlineSchedule, hasOfflineSchedule)
|
|
|
+ },
|
|
|
+ setTimeTable() {
|
|
|
+ if (!this.checkCourseList(false)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 重置排课列表
|
|
|
+ this.timeTable = [];
|
|
|
+
|
|
|
+ let form = this.form,
|
|
|
+ scheduleList = this.scheduleList;
|
|
|
+
|
|
|
+ // 拿到线上课数与线下课数 以及
|
|
|
+ let online = parseInt(
|
|
|
+ form.onlineClassesNums ? form.onlineClassesNums : 0
|
|
|
+ );
|
|
|
+ let offline = parseInt(
|
|
|
+ form.offlineClassesNums ? form.offlineClassesNums : 0
|
|
|
+ );
|
|
|
+ // 网管课默认只有线上课次
|
|
|
+ if(!this.courseTypeIsVip) {
|
|
|
+ online = parseInt(form.totalClassTime || 0)
|
|
|
+ }
|
|
|
+ // 判断是否有课程安排
|
|
|
+ if (scheduleList.length <= 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let totalCount = Number(online) + Number(offline);
|
|
|
+ let tempCourseStart = form.courseStart.replace(/-/gi, "/");
|
|
|
+ let dateOperation = new Date(tempCourseStart);
|
|
|
+ let forMark = 0;
|
|
|
+ while (totalCount && totalCount > 0) {
|
|
|
+ for (let i = 0; i < scheduleList.length; i++) {
|
|
|
+ if (online == 0 && offline == 0) break;
|
|
|
+ let num = scheduleList[i].weekIndex - dateOperation.getDay();
|
|
|
+ // 如果是同一天一个周期会出现排课都排到一天
|
|
|
+ if (forMark > 0 && num == 0 && i == 0) {
|
|
|
+ num = num + 7;
|
|
|
+ }
|
|
|
+ if (num < 0) {
|
|
|
+ // 如果为负数则为下周
|
|
|
+ num = num + 7;
|
|
|
+ }
|
|
|
+ let dataStr = this.getThinkDate(dateOperation, num);
|
|
|
+
|
|
|
+ // 判断是否大于当前时间
|
|
|
+ let nowGetTime = new Date().getTime();
|
|
|
+ let courseTime = new Date(dataStr.replace(/-/gi, "/") +" " + scheduleList[i].startTime + ":00").getTime();
|
|
|
+ if (nowGetTime < courseTime) {
|
|
|
+ let tempArr = {
|
|
|
+ classDate: dataStr,
|
|
|
+ startClassTimeStr: scheduleList[i].startTime,
|
|
|
+ endClassTimeStr: scheduleList[i].endTime,
|
|
|
+ };
|
|
|
+ // console.log(scheduleList[i].type, online, offline)
|
|
|
+ if (scheduleList[i].type == "线上" && online > 0) {
|
|
|
+ tempArr.teachMode = "ONLINE";
|
|
|
+ this.timeTable.push(tempArr);
|
|
|
+ online--;
|
|
|
+
|
|
|
+ totalCount--;
|
|
|
+ } else if (scheduleList[i].type == "线下" && offline > 0) {
|
|
|
+ tempArr.teachMode = "OFFLINE";
|
|
|
+ this.timeTable.push(tempArr);
|
|
|
+ offline--;
|
|
|
+
|
|
|
+ totalCount--;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 加一周
|
|
|
+ if (scheduleList.length == 1) {
|
|
|
+ dateOperation.setDate(dateOperation.getDate() + 7);
|
|
|
+ } else if (
|
|
|
+ scheduleList.every((item) => item.weekStr === scheduleList[0].weekStr)
|
|
|
+ ) {
|
|
|
+ // 标记循环次数(标记判断课程安排是不是同一天)
|
|
|
+ forMark++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.timeTable.sort((a, b) => {
|
|
|
+ let aStr = dayjs(dayjs(a.classDate).format("YYYY-MM-DD") + " " + a.startClassTimeStr + ":00").valueOf();
|
|
|
+ let bStr = dayjs(dayjs(b.classDate).format("YYYY-MM-DD") + " " + b.startClassTimeStr + ":00").valueOf();
|
|
|
+ return aStr - bStr;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ getThinkDate(date, num) {
|
|
|
+ let Stamp = date;
|
|
|
+ Stamp.setDate(date.getDate() + num); // 获取当前月数的第几天
|
|
|
+ return dayjs(Stamp).format('YYYY-MM-DD')
|
|
|
+ },
|
|
|
+ checkCourseList(isShowToast = true) {
|
|
|
+ let form = this.form;
|
|
|
+ let scheduleList = this.scheduleList || [];
|
|
|
+ let hasOnLine = false; // 是否有线上课时安排
|
|
|
+ let hasOffLine = false;
|
|
|
+ scheduleList.forEach((item) => {
|
|
|
+ if (item.type == "线上") {
|
|
|
+ hasOnLine = true;
|
|
|
+ }
|
|
|
+ if (item.type == "线下") {
|
|
|
+ hasOffLine = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ let statusList = this.statusList;
|
|
|
+ let onlineClassesStatus = !form.onlineClassesNums && form.onlineClassesNums <= 0 ? true : false;
|
|
|
+ let offlineClassesStatus = !form.offlineClassesNums && form.offlineClassesNums <= 0 ? true : false;
|
|
|
+ if (statusList.hasOnline) {
|
|
|
+ if (onlineClassesStatus) {
|
|
|
+ if (isShowToast) {
|
|
|
+ this.$toast("请输入线上课次数");
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!onlineClassesStatus && !hasOnLine && form.onlineClassesNums > 0) {
|
|
|
+ if (isShowToast) {
|
|
|
+ this.$toast("课时安排缺少线上课类型");
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (statusList.hasOffline && !statusList.hasOnline) {
|
|
|
+ if (offlineClassesStatus) {
|
|
|
+ if (isShowToast) {
|
|
|
+ this.$toast("请输入线下课次数");
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ !offlineClassesStatus &&
|
|
|
+ !hasOffLine &&
|
|
|
+ form.offlineClassesNums > 0
|
|
|
+ ) {
|
|
|
+ if (isShowToast) {
|
|
|
+ this.$toast("课时安排缺少线下课类型");
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ statusList.hasOffline &&
|
|
|
+ statusList.hasOnline &&
|
|
|
+ parseFloat(form.onlineClassesNums || 0) + parseFloat(form.offlineClassesNums || 0) != this.form.totalClassTime
|
|
|
+ ) {
|
|
|
+ this.$toast('线上课次数+线下课次数不等于总课次数')
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ },
|
|
|
+ formatStatus(type, teachMode) {
|
|
|
+ // -1:所有;0:线上;1:线下
|
|
|
+ this.teachMode = teachMode
|
|
|
+ if(type == 'online' && teachMode == 0) {
|
|
|
+ return true
|
|
|
+ } else if(type == 'offline' && teachMode == 1) {
|
|
|
+ return true
|
|
|
+ } else if(teachMode == -1) {
|
|
|
+ return true
|
|
|
+ } else {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ formatter(type, value) {
|
|
|
+ if (type === "year") {
|
|
|
+ return `${value}年`;
|
|
|
+ } else if (type === "month") {
|
|
|
+ return `${value}月`;
|
|
|
+ } else if (type === "day") {
|
|
|
+ return `${value}日`;
|
|
|
+ }
|
|
|
+ return value;
|
|
|
+ },
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less" scoped>
|
|
|
+@import url("../../assets/commonLess/variable.less");
|
|
|
+.program {
|
|
|
+ background-color: #F5F5F5;
|
|
|
+ min-height: 100vh;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+.van-cell-group--inset {
|
|
|
+ margin: .12rem .12rem 0;
|
|
|
+ overflow: hidden;
|
|
|
+ border-radius: 8px;
|
|
|
+ .titleContent {
|
|
|
+ padding: .14rem .16rem;
|
|
|
+ }
|
|
|
+ .titleStyle {
|
|
|
+ font-size: .2rem;
|
|
|
+ color: #333333;
|
|
|
+ font-size: 500;
|
|
|
+ }
|
|
|
+ .labelStyle {
|
|
|
+ padding-top: .08rem;
|
|
|
+ color: #666666;
|
|
|
+ font-size: .13rem;
|
|
|
+ line-height: .2rem;
|
|
|
+ }
|
|
|
+}
|
|
|
+.van-row {
|
|
|
+ line-height: 0.4rem;
|
|
|
+ border-top: 1px solid #edeef0;
|
|
|
+ text-align: center;
|
|
|
+ font-size: 0.14rem;
|
|
|
+
|
|
|
+ &:first-child {
|
|
|
+ border-top: 0;
|
|
|
+ background: #edeef0;
|
|
|
+ color: #444;
|
|
|
+ font-size: 0.15rem;
|
|
|
+ }
|
|
|
+}
|
|
|
+.tableContainer {
|
|
|
+ max-height: 2.44rem;
|
|
|
+ overflow: auto;
|
|
|
+ .van-row {
|
|
|
+ color: #444;
|
|
|
+ &:first-child {
|
|
|
+ border-top: 0;
|
|
|
+ background: #fff;
|
|
|
+ font-size: 0.14rem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+.van-block__title {
|
|
|
+ padding: .12rem .14rem .06rem;
|
|
|
+ color: #808080;
|
|
|
+ font-size: .14rem;
|
|
|
+ line-height: .2rem;
|
|
|
+}
|
|
|
+.button-group {
|
|
|
+ margin: 0.3rem 0.26rem 0.2rem;
|
|
|
+
|
|
|
+ .van-button--primary {
|
|
|
+ background: @mColor;
|
|
|
+ border-color: @mColor;
|
|
|
+ font-size: 0.18rem;
|
|
|
+ }
|
|
|
+}
|
|
|
+.title-time {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ flex: 1 auto;
|
|
|
+ color: #1A1A1A;
|
|
|
+ font-size: .16rem;
|
|
|
+ .week {
|
|
|
+ padding-left: 0.4rem;
|
|
|
+ padding-right: 0.15rem;
|
|
|
+ }
|
|
|
+}
|
|
|
+/deep/.studentChose {
|
|
|
+ border-radius: .1rem .1rem 0px 0px;
|
|
|
+ overflow: auto;
|
|
|
+ background: #F5F5F5;
|
|
|
+}
|
|
|
+/deep/.van-field__label {
|
|
|
+ color: #1A1A1A;
|
|
|
+}
|
|
|
+/deep/.van-field__control, .showText {
|
|
|
+ font-size: 16px;
|
|
|
+ color: #808080;
|
|
|
+}
|
|
|
+.addButton {
|
|
|
+ margin: .1rem .28rem;
|
|
|
+ border: 1px dashed #CFCFCF;
|
|
|
+ line-height: .42rem;
|
|
|
+ text-align: center;
|
|
|
+ background: #FBFBFB;
|
|
|
+ color: #666666;
|
|
|
+ font-size: .14rem;
|
|
|
+ border-radius: .05rem;
|
|
|
+}
|
|
|
+</style>
|