|
@@ -87,10 +87,52 @@ export default defineComponent({
|
|
|
subjectList.value = res.data || []
|
|
|
} catch {}
|
|
|
}
|
|
|
+
|
|
|
+ //上课时间
|
|
|
+ const startClassTime = ref<string>('')
|
|
|
+ const endClassTime = ref<string>('')
|
|
|
+ const getClassTime = async () => {
|
|
|
+ try {
|
|
|
+ const res = await request.get(
|
|
|
+ '/api-teacher/sysConfig/queryByParamNameList',
|
|
|
+ {
|
|
|
+ params: {
|
|
|
+ paramNames: 'course_start_setting,course_end_setting'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ )
|
|
|
+ if (res.code === 200) {
|
|
|
+ for (let i = 0, len = res.data.length; i < len; i++) {
|
|
|
+ if (res.data[i].paramName === 'course_start_setting') {
|
|
|
+ startClassTime.value = res.data[i].paramValue
|
|
|
+ }
|
|
|
+ if (res.data[i].paramName === 'course_end_setting') {
|
|
|
+ endClassTime.value = res.data[i].paramValue
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (error) {}
|
|
|
+ }
|
|
|
onMounted(() => {
|
|
|
getSubjectSelect()
|
|
|
+ getClassTime()
|
|
|
})
|
|
|
|
|
|
+ //检查上课时间是否满足后台设置的最晚时间
|
|
|
+ const checkClassTimeIsSatisfyLastTime = () => {
|
|
|
+ const baseTime = dayjs()
|
|
|
+ const _endTime = baseTime.set('hour', Number(startTime.value.split(':')[0]))
|
|
|
+ .set('minute', Number(startTime.value.split(':')[1]))
|
|
|
+ .add(params.singleClssTime, 'minute')
|
|
|
+ const _endClassTime = baseTime.set('hour', Number(endClassTime.value.split(':')[0]))
|
|
|
+ .set('minute', Number(endClassTime.value.split(':')[1]))
|
|
|
+ // console.log(_endTime.format('HH:mm'),_endClassTime.format('HH:mm'))
|
|
|
+ return {
|
|
|
+ isOk: _endTime.isBefore(_endClassTime),
|
|
|
+ _endClassTime: _endClassTime.format('HH:mm')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
//开始时间
|
|
|
const onSetTime = async (time: string) => {
|
|
|
console.log(time)
|
|
@@ -160,6 +202,7 @@ export default defineComponent({
|
|
|
const curriculum = ref<string[]>([])
|
|
|
// 设置排课数据
|
|
|
const setParmas = () => {
|
|
|
+
|
|
|
if (!params.courseName) {
|
|
|
Toast('请填写课程名称')
|
|
|
return
|
|
@@ -168,10 +211,7 @@ export default defineComponent({
|
|
|
Toast('请选择训练声部')
|
|
|
return
|
|
|
}
|
|
|
- if (!students.value.length) {
|
|
|
- Toast('请选择上课学员')
|
|
|
- return
|
|
|
- }
|
|
|
+
|
|
|
if (!params.singleClssTime) {
|
|
|
Toast('请填写单课时时长')
|
|
|
return
|
|
@@ -190,10 +230,21 @@ export default defineComponent({
|
|
|
Toast('请选择上课时间')
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+ let checkData = checkClassTimeIsSatisfyLastTime()
|
|
|
+ if (!checkData.isOk) {
|
|
|
+ Toast(`上课结束时间不能晚于${checkData._endClassTime}`)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!students.value.length) {
|
|
|
+ Toast('请选择上课学员')
|
|
|
+ return
|
|
|
+ }
|
|
|
const { timeList, curriculumList } = calcDate()
|
|
|
params.timeList = timeList
|
|
|
curriculum.value = curriculumList
|
|
|
- console.log(curriculumList)
|
|
|
+ // console.log(curriculumList)
|
|
|
confirmShow.value = true
|
|
|
}
|
|
|
|
|
@@ -232,239 +283,247 @@ export default defineComponent({
|
|
|
周日: 0
|
|
|
}
|
|
|
// console.log(Object.values(week))
|
|
|
- return () => (
|
|
|
- <>
|
|
|
- <ColHeader />
|
|
|
- <div class={styles.container}>
|
|
|
- <Field
|
|
|
- label="课程名称"
|
|
|
- placeholder="请输入课程名称"
|
|
|
- v-model={params.courseName}
|
|
|
- />
|
|
|
- <Field
|
|
|
- label="训练声部"
|
|
|
- placeholder="请选择训练声部"
|
|
|
- {...fieldProps}
|
|
|
- modelValue={params.subjectName}
|
|
|
- onClick={() => (voiceShow.value = true)}
|
|
|
- />
|
|
|
- <Cell style={{ padding: 0 }}>
|
|
|
+ return () => {
|
|
|
+ const minStartHour = startClassTime.value.split(':')[0] || ''
|
|
|
+ const minStartMimute = startClassTime.value.split(':')[1] || ''
|
|
|
+ return (
|
|
|
+ <>
|
|
|
+ <ColHeader />
|
|
|
+ <div class={styles.container}>
|
|
|
+ <Field
|
|
|
+ label="课程名称"
|
|
|
+ placeholder="请输入课程名称"
|
|
|
+ v-model={params.courseName}
|
|
|
+ />
|
|
|
<Field
|
|
|
- style={{ margin: 0 }}
|
|
|
- border={false}
|
|
|
- label="上课学员"
|
|
|
- placeholder="请选择上课学员"
|
|
|
+ label="训练声部"
|
|
|
+ placeholder="请选择训练声部"
|
|
|
{...fieldProps}
|
|
|
- onClick={() => (selectStudentShow.value = true)}
|
|
|
+ modelValue={params.subjectName}
|
|
|
+ onClick={() => (voiceShow.value = true)}
|
|
|
/>
|
|
|
- {students.value.length ? (
|
|
|
- <div class={styles.tags}>
|
|
|
- {students.value.map((n: IStudent, index: number) => (
|
|
|
- <Tag closeable onClose={() => onDeleteStudent(index)}>
|
|
|
- {n.userName}
|
|
|
- </Tag>
|
|
|
- ))}
|
|
|
- </div>
|
|
|
- ) : null}
|
|
|
- </Cell>
|
|
|
- <Field
|
|
|
- label="课时数"
|
|
|
- placeholder="请输入课时数"
|
|
|
- v-slots={{
|
|
|
- input: () => <Stepper v-model={params.classNum}></Stepper>
|
|
|
- }}
|
|
|
- />
|
|
|
- <Field
|
|
|
- class={styles.singleClssTime}
|
|
|
- type="number"
|
|
|
- label="单课时时长"
|
|
|
- placeholder="请输入课程时长"
|
|
|
- modelValue={params.singleClssTime}
|
|
|
- onUpdate:modelValue={t => {
|
|
|
- if (Math.abs(t) > 60) {
|
|
|
- Toast('时长不能大于60分钟')
|
|
|
- return
|
|
|
- }
|
|
|
- params.singleClssTime = Math.abs(t)
|
|
|
- }}
|
|
|
- // v-model={params.singleClssTime}
|
|
|
- v-slots={{
|
|
|
- 'right-icon': () => <div>分钟</div>
|
|
|
- }}
|
|
|
- />
|
|
|
- <Field
|
|
|
- label="开始日期"
|
|
|
- placeholder="请选择开始日期"
|
|
|
- {...fieldProps}
|
|
|
- modelValue={params.date}
|
|
|
- onClick={() => (dateShow.value = true)}
|
|
|
- />
|
|
|
- <Cell
|
|
|
- title="循环周次"
|
|
|
- v-slots={{
|
|
|
- label: () => (
|
|
|
- <RadioGroup class={styles.week} v-model={params.week}>
|
|
|
- {Object.keys(week).map((n: string) => {
|
|
|
- return (
|
|
|
- <Radio
|
|
|
- disabled={
|
|
|
- params.isSkipHolidays &&
|
|
|
- (n === '周六' || n === '周日')
|
|
|
- }
|
|
|
- name={n}
|
|
|
- >
|
|
|
- {n}
|
|
|
- </Radio>
|
|
|
- )
|
|
|
- })}
|
|
|
- </RadioGroup>
|
|
|
- )
|
|
|
- }}
|
|
|
- />
|
|
|
- <Field
|
|
|
- label="上课时间"
|
|
|
- placeholder="请选择上课时间"
|
|
|
- {...fieldProps}
|
|
|
- modelValue={timeScope.value}
|
|
|
- onClick={() => (timeShow.value = true)}
|
|
|
- />
|
|
|
- <Cell
|
|
|
- title="是否跳过节假日"
|
|
|
- v-slots={{
|
|
|
- value: () => (
|
|
|
- <RadioGroup
|
|
|
- class={styles.holdays}
|
|
|
- v-model={params.isSkipHolidays}
|
|
|
- onChange={() => {
|
|
|
- if (
|
|
|
- params.isSkipHolidays &&
|
|
|
- (params.week === '周六' || params.week === '周日')
|
|
|
- ) {
|
|
|
- params.week = ''
|
|
|
- }
|
|
|
- }}
|
|
|
- >
|
|
|
- <Radio name={true} style={{ marginRight: '10px' }}>
|
|
|
- 是
|
|
|
- </Radio>
|
|
|
- <Radio name={false}>否</Radio>
|
|
|
- </RadioGroup>
|
|
|
- )
|
|
|
- }}
|
|
|
- />
|
|
|
- <Cell
|
|
|
- v-slots={{
|
|
|
- title: () => (
|
|
|
- <div class={styles.tips}>
|
|
|
- <img class={styles.icon} src={iconTips} />
|
|
|
- <span>温馨提醒</span>
|
|
|
- </div>
|
|
|
- ),
|
|
|
- label: () => (
|
|
|
- <div class={styles.tipsContent}>
|
|
|
- 1、云酷琴房时长按课程人数扣减(含老师),以45分钟1对1课程师生2人为例,课程结束后将消耗时长:2人*45分钟=90分钟;
|
|
|
- <br />
|
|
|
- <br />
|
|
|
- 2、每节线上课平台赠送10分钟免费时长,分别为课前5分钟及课后5分钟,赠送时长不计算费用;
|
|
|
- <br />
|
|
|
- <br />
|
|
|
- 3、课程消耗时长按排课人数计算,无论实际到课人数是否为排课人数,都会按照排课人数扣费;
|
|
|
- <br />
|
|
|
- <br />
|
|
|
- 4、课程结束后费用立即结算;
|
|
|
- <br />
|
|
|
- <br />
|
|
|
- 5、琴房时长不足时,您将无法排课,请确保琴房剩余时长充足。
|
|
|
+ <Cell style={{ padding: 0 }}>
|
|
|
+ <Field
|
|
|
+ style={{ margin: 0 }}
|
|
|
+ border={false}
|
|
|
+ label="上课学员"
|
|
|
+ placeholder="请选择上课学员"
|
|
|
+ {...fieldProps}
|
|
|
+ onClick={() => (selectStudentShow.value = true)}
|
|
|
+ />
|
|
|
+ {students.value.length ? (
|
|
|
+ <div class={styles.tags}>
|
|
|
+ {students.value.map((n: IStudent, index: number) => (
|
|
|
+ <Tag closeable onClose={() => onDeleteStudent(index)}>
|
|
|
+ {n.userName}
|
|
|
+ </Tag>
|
|
|
+ ))}
|
|
|
</div>
|
|
|
- )
|
|
|
- }}
|
|
|
- />
|
|
|
+ ) : null}
|
|
|
+ </Cell>
|
|
|
+ <Field
|
|
|
+ label="课时数"
|
|
|
+ placeholder="请输入课时数"
|
|
|
+ v-slots={{
|
|
|
+ input: () => <Stepper v-model={params.classNum}></Stepper>
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ <Field
|
|
|
+ class={styles.singleClssTime}
|
|
|
+ type="number"
|
|
|
+ label="单课时时长"
|
|
|
+ placeholder="请输入课程时长"
|
|
|
+ modelValue={params.singleClssTime}
|
|
|
+ onUpdate:modelValue={t => {
|
|
|
+ if (Math.abs(t) > 60) {
|
|
|
+ Toast('时长不能大于60分钟')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (Math.abs(t) === 0) {
|
|
|
+ Toast('时长不能小于1分钟')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ params.singleClssTime = Math.abs(t)
|
|
|
+ }}
|
|
|
+ // v-model={params.singleClssTime}
|
|
|
+ v-slots={{
|
|
|
+ 'right-icon': () => <div>分钟</div>
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ <Field
|
|
|
+ label="开始日期"
|
|
|
+ placeholder="请选择开始日期"
|
|
|
+ {...fieldProps}
|
|
|
+ modelValue={params.date}
|
|
|
+ onClick={() => (dateShow.value = true)}
|
|
|
+ />
|
|
|
+ <Cell
|
|
|
+ title="循环周次"
|
|
|
+ v-slots={{
|
|
|
+ label: () => (
|
|
|
+ <RadioGroup class={styles.week} v-model={params.week}>
|
|
|
+ {Object.keys(week).map((n: string) => {
|
|
|
+ return (
|
|
|
+ <Radio
|
|
|
+ disabled={
|
|
|
+ params.isSkipHolidays &&
|
|
|
+ (n === '周六' || n === '周日')
|
|
|
+ }
|
|
|
+ name={n}
|
|
|
+ >
|
|
|
+ {n}
|
|
|
+ </Radio>
|
|
|
+ )
|
|
|
+ })}
|
|
|
+ </RadioGroup>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ <Field
|
|
|
+ label="上课时间"
|
|
|
+ placeholder="请选择上课时间"
|
|
|
+ {...fieldProps}
|
|
|
+ modelValue={timeScope.value}
|
|
|
+ onClick={() => (timeShow.value = true)}
|
|
|
+ />
|
|
|
+ <Cell
|
|
|
+ title="是否跳过节假日"
|
|
|
+ v-slots={{
|
|
|
+ value: () => (
|
|
|
+ <RadioGroup
|
|
|
+ class={styles.holdays}
|
|
|
+ v-model={params.isSkipHolidays}
|
|
|
+ onChange={() => {
|
|
|
+ if (
|
|
|
+ params.isSkipHolidays &&
|
|
|
+ (params.week === '周六' || params.week === '周日')
|
|
|
+ ) {
|
|
|
+ params.week = ''
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Radio name={true} style={{ marginRight: '10px' }}>
|
|
|
+ 是
|
|
|
+ </Radio>
|
|
|
+ <Radio name={false}>否</Radio>
|
|
|
+ </RadioGroup>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ <Cell
|
|
|
+ v-slots={{
|
|
|
+ title: () => (
|
|
|
+ <div class={styles.tips}>
|
|
|
+ <img class={styles.icon} src={iconTips} />
|
|
|
+ <span>温馨提醒</span>
|
|
|
+ </div>
|
|
|
+ ),
|
|
|
+ label: () => (
|
|
|
+ <div class={styles.tipsContent}>
|
|
|
+ 1、云酷琴房时长按课程人数扣减(含老师),以45分钟1对1课程师生2人为例,课程结束后将消耗时长:2人*45分钟=90分钟;
|
|
|
+ <br />
|
|
|
+ <br />
|
|
|
+ 2、每节线上课平台赠送10分钟免费时长,分别为课前5分钟及课后5分钟,赠送时长不计算费用;
|
|
|
+ <br />
|
|
|
+ <br />
|
|
|
+ 3、课程消耗时长按排课人数计算,无论实际到课人数是否为排课人数,都会按照排课人数扣费;
|
|
|
+ <br />
|
|
|
+ <br />
|
|
|
+ 4、课程结束后费用立即结算;
|
|
|
+ <br />
|
|
|
+ <br />
|
|
|
+ 5、琴房时长不足时,您将无法排课,请确保琴房剩余时长充足。
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ />
|
|
|
|
|
|
- <Button
|
|
|
- block
|
|
|
- type="primary"
|
|
|
+ <Button
|
|
|
+ block
|
|
|
+ type="primary"
|
|
|
+ round
|
|
|
+ style={{ margin: '0 auto', width: '90%', marginTop: '20px' }}
|
|
|
+ onClick={() => setParmas()}
|
|
|
+ >
|
|
|
+ 下一步
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <Popup position="bottom" v-model:show={dateShow.value}>
|
|
|
+ <DatetimePicker
|
|
|
+ type="date"
|
|
|
+ minDate={dayjs().year(2022).toDate()}
|
|
|
+ formatter={formatterDate}
|
|
|
+ onConfirm={(time: Date) => {
|
|
|
+ params.date = dayjs(time).format('YYYY-MM-DD')
|
|
|
+ dateShow.value = false
|
|
|
+ getHolidays(dayjs(time).format('YYYY'))
|
|
|
+ }}
|
|
|
+ onCancel={() => (dateShow.value = false)}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
+
|
|
|
+ <Popup
|
|
|
+ v-model:show={voiceShow.value}
|
|
|
+ position="bottom"
|
|
|
round
|
|
|
- style={{ margin: '0 auto', width: '90%', marginTop: '20px' }}
|
|
|
- onClick={() => setParmas()}
|
|
|
+ closeable
|
|
|
+ safe-area-inset-bottom
|
|
|
>
|
|
|
- 下一步
|
|
|
- </Button>
|
|
|
- </div>
|
|
|
+ <OrganSearch
|
|
|
+ subjectList={subjectList.value}
|
|
|
+ v-model={params.subjectId}
|
|
|
+ v-model:subjectName={params.subjectName}
|
|
|
+ onSort={() => (voiceShow.value = false)}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
|
|
|
- <Popup position="bottom" v-model:show={dateShow.value}>
|
|
|
- <DatetimePicker
|
|
|
- type="date"
|
|
|
- minDate={dayjs().year(2022).toDate()}
|
|
|
- formatter={formatterDate}
|
|
|
- onConfirm={(time: Date) => {
|
|
|
- params.date = dayjs(time).format('YYYY-MM-DD')
|
|
|
- dateShow.value = false
|
|
|
- getHolidays(dayjs(time).format('YYYY'))
|
|
|
- }}
|
|
|
- onCancel={() => (dateShow.value = false)}
|
|
|
- />
|
|
|
- </Popup>
|
|
|
+ <Popup position="bottom" v-model:show={timeShow.value} round>
|
|
|
+ <div class={styles.picker}>
|
|
|
+ <DatetimePicker
|
|
|
+ v-model={startTime.value}
|
|
|
+ type="time"
|
|
|
+ minHour={minStartHour}
|
|
|
+ minMinute={minStartMimute}
|
|
|
+ onConfirm={() => {
|
|
|
+ timeShow.value = false
|
|
|
+ }}
|
|
|
+ onCancel={() => (timeShow.value = false)}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </Popup>
|
|
|
|
|
|
- <Popup
|
|
|
- v-model:show={voiceShow.value}
|
|
|
- position="bottom"
|
|
|
- round
|
|
|
- closeable
|
|
|
- safe-area-inset-bottom
|
|
|
- >
|
|
|
- <OrganSearch
|
|
|
- subjectList={subjectList.value}
|
|
|
- v-model={params.subjectId}
|
|
|
- v-model:subjectName={params.subjectName}
|
|
|
- onSort={() => (voiceShow.value = false)}
|
|
|
- />
|
|
|
- </Popup>
|
|
|
+ {/* 选择学员 */}
|
|
|
+ <ColPopup v-model={selectStudentShow.value}>
|
|
|
+ <SelectStudents
|
|
|
+ ref={studentRef}
|
|
|
+ subjectList={subjectList.value}
|
|
|
+ onSetStudents={onSetStudents}
|
|
|
+ />
|
|
|
+ </ColPopup>
|
|
|
|
|
|
- <Popup position="bottom" v-model:show={timeShow.value} round>
|
|
|
- <div class={styles.picker}>
|
|
|
- <DatetimePicker
|
|
|
- v-model={startTime.value}
|
|
|
- type="time"
|
|
|
- maxHour="22"
|
|
|
- onConfirm={() => {
|
|
|
- timeShow.value = false
|
|
|
- console.log(startTime.value)
|
|
|
+ {/* 确认排课 */}
|
|
|
+ <Popup
|
|
|
+ position="bottom"
|
|
|
+ class={styles.coursePopup}
|
|
|
+ v-model:show={confirmShow.value}
|
|
|
+ closeable
|
|
|
+ round
|
|
|
+ >
|
|
|
+ <CourseSchedule
|
|
|
+ item={params}
|
|
|
+ students={students.value}
|
|
|
+ curriculum={curriculum.value}
|
|
|
+ onClose={() => {
|
|
|
+ confirmShow.value = false
|
|
|
+ }}
|
|
|
+ onComfirm={() => {
|
|
|
+ onCourseSchedule()
|
|
|
}}
|
|
|
- onCancel={() => (timeShow.value = false)}
|
|
|
/>
|
|
|
- </div>
|
|
|
- </Popup>
|
|
|
-
|
|
|
- {/* 选择学员 */}
|
|
|
- <ColPopup v-model={selectStudentShow.value}>
|
|
|
- <SelectStudents
|
|
|
- ref={studentRef}
|
|
|
- subjectList={subjectList.value}
|
|
|
- onSetStudents={onSetStudents}
|
|
|
- />
|
|
|
- </ColPopup>
|
|
|
-
|
|
|
- {/* 确认排课 */}
|
|
|
- <Popup
|
|
|
- position="bottom"
|
|
|
- class={styles.coursePopup}
|
|
|
- v-model:show={confirmShow.value}
|
|
|
- closeable
|
|
|
- round
|
|
|
- >
|
|
|
- <CourseSchedule
|
|
|
- item={params}
|
|
|
- students={students.value}
|
|
|
- curriculum={curriculum.value}
|
|
|
- onClose={() => {
|
|
|
- confirmShow.value = false
|
|
|
- }}
|
|
|
- onComfirm={() => {
|
|
|
- onCourseSchedule()
|
|
|
- }}
|
|
|
- />
|
|
|
- </Popup>
|
|
|
- </>
|
|
|
- )
|
|
|
+ </Popup>
|
|
|
+ </>
|
|
|
+ )
|
|
|
+ }
|
|
|
}
|
|
|
})
|