|
@@ -20,7 +20,8 @@
|
|
|
</el-col>
|
|
|
<el-col :span="10">
|
|
|
<el-form-item label="分部" prop="organIds" :rules="[{ required: true, message: '请选择分部' }]">
|
|
|
- <select-all v-model.trim="form.organIds" filterable placeholder="请选择分部" multiple clearable>
|
|
|
+ <select-all v-model.trim="form.organIds" filterable placeholder="请选择分部" multiple clearable
|
|
|
+ :disabled="isDisabled">
|
|
|
<el-option v-for="(item, index) in selects.branchs" :key="index" :label="item.name"
|
|
|
:value="item.id"></el-option>
|
|
|
</select-all>
|
|
@@ -29,7 +30,7 @@
|
|
|
<el-col :span="10">
|
|
|
<el-form-item label="声部" prop="subjectIdList" :rules="[{ required: true, message: '请选择声部' }]">
|
|
|
<el-select v-model.trim="form.subjectIdList" filterable clearable @change="onChangeSubject"
|
|
|
- placeholder="请选择声部" style="width: 100% !important">
|
|
|
+ placeholder="请选择声部" style="width: 100% !important" :disabled="isDisabled">
|
|
|
<el-option v-for="(item, index) in subjectList" :key="index" :value="item.id" :label="item.name" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
@@ -51,10 +52,27 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="10">
|
|
|
- <el-form-item label="课程购买时间" prop="signUpTimeList" :rules="[{ required: true, message: '请选择课程购买时间' }]">
|
|
|
- <el-date-picker style="width: 100%" v-model="form.signUpTimeList" :picker-options="pickerOptions"
|
|
|
+ <el-form-item label="课程购买开始时间" prop="signUpStart" :rules="[{ required: true, message: '请选择课程购买开始时间' }]">
|
|
|
+ <!-- <el-date-picker style="width: 100%" v-model="form.signUpTimeList" :picker-options="pickerOptions"
|
|
|
type="daterange" :default-time="['00:00:00', '23:59:59']" range-separator="-" start-placeholder="购买开始日期"
|
|
|
end-placeholder="购买结束日期">
|
|
|
+ </el-date-picker> -->
|
|
|
+ <el-date-picker v-model="form.signUpStart" :picker-options="startBigin()" type="date"
|
|
|
+ style="width: 100% !important" placeholder="购买开始日期" @change="() => {
|
|
|
+ form.signUpEnd = ''
|
|
|
+ form.timeTable = []; // 课表重置
|
|
|
+ }" :disabled="isDisabled">
|
|
|
+ </el-date-picker>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="10">
|
|
|
+ <el-form-item label="课程购买结束时间" prop="signUpEnd" :rules="[{ required: true, message: '请选择课程购买结束时间' }]">
|
|
|
+ <el-date-picker v-model="form.signUpEnd" type="date" :picker-options="beginDate()"
|
|
|
+ style="width: 100% !important" placeholder="购买结束日期" @change="() => {
|
|
|
+ if (status == 0) {
|
|
|
+ form.timeTable = []; // 课表重置
|
|
|
+ }
|
|
|
+ }" :disabled="type === 'update' && status === 2">
|
|
|
</el-date-picker>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
@@ -66,13 +84,13 @@
|
|
|
@input="(val) => { form.onlineClassesNum = val.replace(/[^\d]/g, '') }" @change="() => {
|
|
|
form.timeTable = []; // 课表重置
|
|
|
}
|
|
|
- "></el-input>
|
|
|
+ " :disabled="isDisabled"></el-input>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="10">
|
|
|
<el-form-item label="课程时长" prop="singleClassMinuteId" :rules="[{ required: true, message: '请选择课程时长' }]">
|
|
|
<el-select v-model.trim="form.singleClassMinuteId" filterable clearable style="width: 100% !important"
|
|
|
- placeholder="请选择课程时长" @change="onSingleClassChange">
|
|
|
+ placeholder="请选择课程时长" @change="onSingleClassChange" :disabled="isDisabled">
|
|
|
<el-option v-for="( item, key ) in liveGroupList " :key="key" :label="item.singleClassMinutes"
|
|
|
:value="item.id" />
|
|
|
</el-select>
|
|
@@ -81,13 +99,15 @@
|
|
|
<el-col :span="10">
|
|
|
<el-form-item label="现单价" prop="onlineClassesUnitPrice" :rules="[{ required: true, message: '请输入现单价' }]">
|
|
|
<el-input v-model="form.onlineClassesUnitPrice" placeholder="请输入现单价" maxlength="9"
|
|
|
- @input="(val) => { form.onlineClassesUnitPrice = val.replace(/[^\d]/g, '') }"></el-input>
|
|
|
+ @input="(val) => { form.onlineClassesUnitPrice = val.replace(/[^\d]/g, '') }"
|
|
|
+ :disabled="isDisabled"></el-input>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="10">
|
|
|
<el-form-item label="原单价" prop="offlineClassesUnitPrice" :rules="[{ required: true, message: '请输入原单价' }]">
|
|
|
<el-input v-model="form.offlineClassesUnitPrice" placeholder="请输入原单价" maxlength="9"
|
|
|
- @input="(val) => { form.offlineClassesUnitPrice = val.replace(/[^\d]/g, '') }"></el-input>
|
|
|
+ @input="(val) => { form.offlineClassesUnitPrice = val.replace(/[^\d]/g, '') }"
|
|
|
+ :disabled="isDisabled"></el-input>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
|
|
@@ -103,7 +123,7 @@
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
|
|
|
- <el-button type="danger" @click="onTimeTable">点击排课</el-button>
|
|
|
+ <el-button type="danger" @click="onTimeTable" :disabled="isDisabled">点击排课</el-button>
|
|
|
<el-table style="width: 100%; margin-top: 20px;" :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
|
|
|
:data="form.timeTable">
|
|
|
<el-table-column align="center" label="课时">
|
|
@@ -115,7 +135,8 @@
|
|
|
<template slot-scope="scope">
|
|
|
<el-form-item :prop="'timeTable.' + scope.$index + '.teachingContent'"
|
|
|
:rules="[{ required: true, message: '请输入内容' }]" style="margin-bottom: 0;">
|
|
|
- <el-input v-model="scope.row.teachingContent" placeholder="请输入内容" maxlength="20">
|
|
|
+ <el-input v-model="scope.row.teachingContent" placeholder="请输入内容" maxlength="20"
|
|
|
+ :disabled="type === 'update' && status === 2">
|
|
|
</el-input>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
@@ -124,7 +145,8 @@
|
|
|
<template slot-scope="scope">
|
|
|
<el-form-item :prop="'timeTable.' + scope.$index + '.teachingPoint'"
|
|
|
:rules="[{ required: true, message: '请输入技能/知识点掌握' }]" style="margin-bottom: 0;">
|
|
|
- <el-input v-model="form.timeTable[scope.$index].teachingPoint" placeholder="请输入技能/知识点掌握" maxlength="20">
|
|
|
+ <el-input v-model="form.timeTable[scope.$index].teachingPoint" placeholder="请输入技能/知识点掌握" maxlength="20"
|
|
|
+ :disabled="type === 'update' && status === 2">
|
|
|
</el-input>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
@@ -216,7 +238,7 @@
|
|
|
</div>
|
|
|
|
|
|
<el-dialog title="排课" ref="maskForm" width="500px" :visible.sync="dialogFormVisible">
|
|
|
- <addLiveCourse :singleClassMinutes="form.singleClassMinutes" :signUpTimeList="form.signUpTimeList"
|
|
|
+ <addLiveCourse :singleClassMinutes="form.singleClassMinutes" :signUpEnd="form.signUpEnd"
|
|
|
:onlineCourseNum="form.onlineClassesNum" @close="dialogFormVisible = false" @confirm="onConfirm" />
|
|
|
</el-dialog>
|
|
|
</div>
|
|
@@ -226,18 +248,20 @@ import dayjs from "dayjs";
|
|
|
import deepClone from "@/helpers/deep-clone";
|
|
|
import preview from "./modals/preview.vue";
|
|
|
import addLiveCourse from "./modals/addLiveCourse.vue";
|
|
|
-import { sysTenantConfigAll, findTeacherByTenantId } from "./api";
|
|
|
+import { sysTenantConfigAll, findTeacherByTenantId, liveGroupDetail } from "./api";
|
|
|
import {
|
|
|
getSubject,
|
|
|
-
|
|
|
getOrganRole
|
|
|
} from "@/api/buildTeam";
|
|
|
import { vipGroupCategory, createVip } from "@/api/vipSeting";
|
|
|
export default {
|
|
|
components: { preview, addLiveCourse },
|
|
|
data() {
|
|
|
+ const query = this.$route.query;
|
|
|
return {
|
|
|
- name: "新建直播课",
|
|
|
+ name: query.type == 'update' ? "修改直播课" : '新建直播课',
|
|
|
+ id: query.id,
|
|
|
+ type: query.type,
|
|
|
dialogFormVisible: false,
|
|
|
form: {
|
|
|
roomTitle: "", //
|
|
@@ -269,7 +293,8 @@ export default {
|
|
|
timeTable: [], // 排课
|
|
|
clientType: "TEACHER" // 主讲人身份 默认[老师]
|
|
|
},
|
|
|
-
|
|
|
+ status: 0, // 直播课状态
|
|
|
+ courseStartDate: null, // 课程开始时间
|
|
|
serviceProvider: "tencentCloud", // 直播模式
|
|
|
subjectList: [], // 声部列表
|
|
|
teacherList: [], // 指导老师
|
|
@@ -360,10 +385,10 @@ export default {
|
|
|
onlineClassesNum: form.onlineClassesNum || 0,
|
|
|
offlineClassesUnitPrice: form.offlineClassesUnitPrice || 0,
|
|
|
onlineClassesUnitPrice: form.onlineClassesUnitPrice || 0,
|
|
|
- registrationStartTime: dayjs(form.signUpTimeList[0]).format(
|
|
|
+ registrationStartTime: dayjs(form.signUpStart).format(
|
|
|
"YYYY-MM-DD"
|
|
|
),
|
|
|
- paymentExpireDate: dayjs(form.signUpTimeList[0]).format(
|
|
|
+ paymentExpireDate: dayjs(form.signUpEnd).format(
|
|
|
"YYYY-MM-DD"
|
|
|
),
|
|
|
singleClassMinutes: form.singleClassMinutes,
|
|
@@ -430,7 +455,7 @@ export default {
|
|
|
async onTimeTable() {
|
|
|
let count = 0;
|
|
|
this.$refs.liveForm.validateField(
|
|
|
- ["signUpTimeList", "onlineClassesNum", "singleClassMinuteId"],
|
|
|
+ ["signUpStart", "signUPEnd", "onlineClassesNum", "singleClassMinuteId"],
|
|
|
valid => {
|
|
|
count += 1;
|
|
|
if (valid) {
|
|
@@ -444,6 +469,36 @@ export default {
|
|
|
}
|
|
|
);
|
|
|
},
|
|
|
+ beginDate() {
|
|
|
+ const timer = this.form.signUpStart || ''
|
|
|
+ const courseTimer = this.courseStartDate ? dayjs(this.courseStartDate).format('YYYY-MM-DD') : ''
|
|
|
+ const type = this.type
|
|
|
+ // console.log(type, courseTimer, 'courseTimer')
|
|
|
+ return {
|
|
|
+ firstDayOfWeek: 1,
|
|
|
+ disabledDate(time) {
|
|
|
+ if (timer) {
|
|
|
+ if (courseTimer && type === 'update') {
|
|
|
+ // console.log(new Date(timer).getTime(), time.getTime(), new Date(timer).getTime() >= time.getTime(), dayjs(time).format('YYYY-MM-DD'), new Date(courseTimer + ' 00:00:00').getTime(), time.getTime() >= new Date(courseTimer + ' 00:00:00').getTime(), courseTimer)
|
|
|
+ return new Date(timer).getTime() > time.getTime() || time.getTime() >= new Date(courseTimer + ' 00:00:00').getTime();
|
|
|
+ } else {
|
|
|
+ return new Date(timer).getTime() > time.getTime();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return time.getTime() + 86400000 <= new Date().getTime();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ };
|
|
|
+ },
|
|
|
+ startBigin() {
|
|
|
+ return {
|
|
|
+ firstDayOfWeek: 1,
|
|
|
+ disabledDate(time) {
|
|
|
+ // return time.getTime() >= Date.now();
|
|
|
+ return time.getTime() + 86400000 <= new Date().getTime();
|
|
|
+ },
|
|
|
+ };
|
|
|
+ },
|
|
|
onScrollError() {
|
|
|
this.$nextTick(() => {
|
|
|
let isError = document.getElementsByClassName("is-error");
|
|
@@ -513,7 +568,7 @@ export default {
|
|
|
});
|
|
|
|
|
|
// 获取乐团主管
|
|
|
- await getOrganRole().then(ruselt => {
|
|
|
+ await getOrganRole({ all: true }).then(ruselt => {
|
|
|
this.educationList = ruselt?.data?.EDUCATION;
|
|
|
});
|
|
|
|
|
@@ -526,6 +581,70 @@ export default {
|
|
|
this.liveGroupList = res.data;
|
|
|
}
|
|
|
});
|
|
|
+
|
|
|
+ // 获取详情
|
|
|
+ if (this.id) {
|
|
|
+ const query = this.$route.query;
|
|
|
+ const { data } = await liveGroupDetail({ id: query.id });
|
|
|
+ const liveBroadcastRoom = data.liveBroadcastRoom || {};
|
|
|
+ const vipGroupApplyBaseInfo = data.vipGroupApplyBaseInfo || {};
|
|
|
+ const courseSchedules = data.courseSchedules || [];
|
|
|
+ const tempCourse = [];
|
|
|
+ courseSchedules.forEach(item => {
|
|
|
+ tempCourse.push({
|
|
|
+ classDate: item.classDate,
|
|
|
+ actualTeacherId: item.teacherId,
|
|
|
+ startClassTimeStr: item.startClassTimeStr,
|
|
|
+ endClassTimeStr: item.endClassTimeStr,
|
|
|
+ teachMode: "ONLINE",
|
|
|
+ singleClassMinutes: vipGroupApplyBaseInfo.singleClassMinutes,
|
|
|
+ teachingContent: item.teachingContent,
|
|
|
+ teachingPoint: item.teachingPoint
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ const subjectId = vipGroupApplyBaseInfo.subjectIdList ? Number(vipGroupApplyBaseInfo.subjectIdList) : ''
|
|
|
+ await this.onChangeSubject(subjectId)
|
|
|
+
|
|
|
+ // 初始化数据
|
|
|
+ this.form = {
|
|
|
+ roomTitle: liveBroadcastRoom.roomTitle, //
|
|
|
+ liveRemark: liveBroadcastRoom.liveRemark, // 内容
|
|
|
+ organIds: vipGroupApplyBaseInfo.organIdList ? vipGroupApplyBaseInfo.organIdList.split(",").map(item => Number(item)) : [],
|
|
|
+ subjectIdList: subjectId, // 声部
|
|
|
+ teacher: liveBroadcastRoom.speakerId, // 指导老师列表
|
|
|
+ educationalTeacherId: vipGroupApplyBaseInfo.educationalTeacherId, // 乐团主管
|
|
|
+ preTemplate: liveBroadcastRoom.preTemplate, // 模板
|
|
|
+ signUpStart: vipGroupApplyBaseInfo.registrationStartTime, // 开始时间
|
|
|
+ signUpEnd: vipGroupApplyBaseInfo.paymentExpireDate, // 结束时间
|
|
|
+ // signUpTimeList: [
|
|
|
+ // vipGroupApplyBaseInfo.registrationStartTime,
|
|
|
+ // vipGroupApplyBaseInfo.paymentExpireDate
|
|
|
+ // ], // 课程购买时间
|
|
|
+ onlineClassesNum: vipGroupApplyBaseInfo.onlineClassesNum,
|
|
|
+ singleClassMinuteId: vipGroupApplyBaseInfo.singleClassMinutes, //时长编号
|
|
|
+ singleClassMinutes: vipGroupApplyBaseInfo.singleClassMinutes, // 时长
|
|
|
+ onlineClassesUnitPrice: vipGroupApplyBaseInfo.onlineClassesUnitPrice, // 售价
|
|
|
+ offlineClassesUnitPrice:
|
|
|
+ vipGroupApplyBaseInfo.offlineClassesUnitPrice, // 原价
|
|
|
+ os: liveBroadcastRoom.os, // 直播设备
|
|
|
+ useScene: liveBroadcastRoom.useScene, // 直播场景
|
|
|
+ popularizeType: liveBroadcastRoom.popularizeType, // 观看权限信息
|
|
|
+ viewMode: liveBroadcastRoom.viewMode,
|
|
|
+ roomConfig: liveBroadcastRoom.roomConfig || {
|
|
|
+ whether_like: 0,
|
|
|
+ whether_chat: 0,
|
|
|
+ whether_video: 0,
|
|
|
+ whether_mic: 0,
|
|
|
+ whether_view_shop_cart: 0
|
|
|
+ },
|
|
|
+ timeTable: tempCourse, // 排课
|
|
|
+ clientType: "TEACHER" // 主讲人身份 默认[老师]
|
|
|
+ };
|
|
|
+
|
|
|
+ this.status = data.vipGroupApplyBaseInfo.status
|
|
|
+ this.courseStartDate = data.vipGroupApplyBaseInfo.courseStartDate
|
|
|
+ }
|
|
|
} catch (e) {
|
|
|
//
|
|
|
console.log(e, "e info");
|
|
@@ -539,6 +658,10 @@ export default {
|
|
|
countOfflineClassesUnitPrice() {
|
|
|
return this.form.onlineClassesNum * this.form.offlineClassesUnitPrice || 0
|
|
|
},
|
|
|
+ isDisabled() {
|
|
|
+ console.log(this.status, this.type, 'isDisabled');
|
|
|
+ return this.type === 'update' && [1, 2].includes(this.status) ? true : false
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
</script>
|
|
@@ -584,7 +707,7 @@ export default {
|
|
|
height: 36px !important;
|
|
|
}
|
|
|
|
|
|
-::v-deep .el-col-8 .el-form-item__content {
|
|
|
+::v-deep .el-col-10 .el-form-item__content {
|
|
|
height: 36px !important;
|
|
|
}
|
|
|
|