|  | @@ -0,0 +1,270 @@
 | 
	
		
			
				|  |  | +import dayjs from 'dayjs'
 | 
	
		
			
				|  |  | +import { ElButton, ElCol, ElRow } from 'element-plus'
 | 
	
		
			
				|  |  | +import { defineComponent } from 'vue'
 | 
	
		
			
				|  |  | +import styles from './index.module.less'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default defineComponent({
 | 
	
		
			
				|  |  | +  name: 'practice-timer',
 | 
	
		
			
				|  |  | +  props: {
 | 
	
		
			
				|  |  | +    timerObject: {
 | 
	
		
			
				|  |  | +      // 传入的数据
 | 
	
		
			
				|  |  | +      type: Object,
 | 
	
		
			
				|  |  | +      default: {}
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    onClose: {
 | 
	
		
			
				|  |  | +      type: Function,
 | 
	
		
			
				|  |  | +      default: () => {}
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    onChoice: {
 | 
	
		
			
				|  |  | +      // 点击选择时间
 | 
	
		
			
				|  |  | +      type: Function,
 | 
	
		
			
				|  |  | +      default: (item: any) => {}
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    courseMinutes: {
 | 
	
		
			
				|  |  | +      // 课程时长
 | 
	
		
			
				|  |  | +      type: Number,
 | 
	
		
			
				|  |  | +      default: 25
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    freeMinutes: {
 | 
	
		
			
				|  |  | +      // 空余时长
 | 
	
		
			
				|  |  | +      type: Number,
 | 
	
		
			
				|  |  | +      default: 5
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    startSetting: {
 | 
	
		
			
				|  |  | +      // 开始设置时间
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: '08:00'
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    endSetting: {
 | 
	
		
			
				|  |  | +      // 结束设置时间
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: '18:00'
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  data() {
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      timerList: [],
 | 
	
		
			
				|  |  | +      list: [] as any,
 | 
	
		
			
				|  |  | +      weekList: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
 | 
	
		
			
				|  |  | +      weekType: [
 | 
	
		
			
				|  |  | +        'monday',
 | 
	
		
			
				|  |  | +        'tuesday',
 | 
	
		
			
				|  |  | +        'wednesday',
 | 
	
		
			
				|  |  | +        'thursday',
 | 
	
		
			
				|  |  | +        'friday',
 | 
	
		
			
				|  |  | +        'saturday',
 | 
	
		
			
				|  |  | +        'sunday'
 | 
	
		
			
				|  |  | +      ]
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  mounted() {
 | 
	
		
			
				|  |  | +    this.list = this.timerInit(
 | 
	
		
			
				|  |  | +      this.startSetting,
 | 
	
		
			
				|  |  | +      this.endSetting,
 | 
	
		
			
				|  |  | +      this.courseMinutes + this.freeMinutes || 30
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  | +    console.log(this.endSetting)
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  methods: {
 | 
	
		
			
				|  |  | +    timerInit(startTime: string, endTime: string, space: number) {
 | 
	
		
			
				|  |  | +      let start = dayjs(startTime, 'HH:mm')
 | 
	
		
			
				|  |  | +      const end = dayjs(endTime, 'HH:mm')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const timerList: any = []
 | 
	
		
			
				|  |  | +      // 生成一天的时间段
 | 
	
		
			
				|  |  | +      while (start.add(space, 'minute').isSameOrBefore(dayjs(end))) {
 | 
	
		
			
				|  |  | +        const item = {
 | 
	
		
			
				|  |  | +          startTime: start.format('HH:mm'),
 | 
	
		
			
				|  |  | +          endTime: start.add(space, 'minute').format('HH:mm'),
 | 
	
		
			
				|  |  | +          status: false
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 一周
 | 
	
		
			
				|  |  | +        timerList.push(item)
 | 
	
		
			
				|  |  | +        start = start.add(space, 'minute')
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      const list: any = []
 | 
	
		
			
				|  |  | +      // 生成一周的时间段
 | 
	
		
			
				|  |  | +      timerList.forEach((item: any) => {
 | 
	
		
			
				|  |  | +        const weekList: any = []
 | 
	
		
			
				|  |  | +        for (let i = 0; i < 7; i++) {
 | 
	
		
			
				|  |  | +          weekList.push({
 | 
	
		
			
				|  |  | +            ...item
 | 
	
		
			
				|  |  | +          })
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        list.push(weekList)
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const tempList = this._initData(list)
 | 
	
		
			
				|  |  | +      return tempList
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    _initData(list: Array<any>) {
 | 
	
		
			
				|  |  | +      // 回显数据
 | 
	
		
			
				|  |  | +      const weekType = this.weekType
 | 
	
		
			
				|  |  | +      const timerObject = this.timerObject
 | 
	
		
			
				|  |  | +      list.forEach((item: any) => {
 | 
	
		
			
				|  |  | +        item.forEach((slot: any, slotIndex: number) => {
 | 
	
		
			
				|  |  | +          const dayList = timerObject[weekType[slotIndex]]
 | 
	
		
			
				|  |  | +          const startTime = dayjs(slot.startTime, 'HH:mm').format('HH:mm:ss')
 | 
	
		
			
				|  |  | +          const isExist = dayList?.some(
 | 
	
		
			
				|  |  | +            (course: any) => course.startTime === startTime
 | 
	
		
			
				|  |  | +          )
 | 
	
		
			
				|  |  | +          isExist && (slot.status = true)
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +      return list
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    btnStatus(index: number, type: 'row' | 'col') {
 | 
	
		
			
				|  |  | +      if (type === 'row') {
 | 
	
		
			
				|  |  | +        return this.list.every((item: any) => {
 | 
	
		
			
				|  |  | +          return item[index].status
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      if (type == 'col') {
 | 
	
		
			
				|  |  | +        return this.list[index].every((item: any) => item.status)
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    choice(index: number, type: 'row' | 'col', status?: boolean) {
 | 
	
		
			
				|  |  | +      if (type === 'row') {
 | 
	
		
			
				|  |  | +        this.list.forEach((item: any, i: number) => {
 | 
	
		
			
				|  |  | +          const type = !status ? true : false
 | 
	
		
			
				|  |  | +          item[index].status = type
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      if (type == 'col') {
 | 
	
		
			
				|  |  | +        this.list[index].forEach((item: any, i: number) => {
 | 
	
		
			
				|  |  | +          const type = !status ? true : false
 | 
	
		
			
				|  |  | +          item.status = type
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    onSubmit() {
 | 
	
		
			
				|  |  | +      const list = this.list
 | 
	
		
			
				|  |  | +      const weekList = {
 | 
	
		
			
				|  |  | +        monday: [],
 | 
	
		
			
				|  |  | +        tuesday: [],
 | 
	
		
			
				|  |  | +        wednesday: [],
 | 
	
		
			
				|  |  | +        thursday: [],
 | 
	
		
			
				|  |  | +        friday: [],
 | 
	
		
			
				|  |  | +        saturday: [],
 | 
	
		
			
				|  |  | +        sunday: []
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      const weekType = this.weekType
 | 
	
		
			
				|  |  | +      let status = false
 | 
	
		
			
				|  |  | +      list.forEach((item: any, i: number) => {
 | 
	
		
			
				|  |  | +        item.forEach((times: any, j: number) => {
 | 
	
		
			
				|  |  | +          if (times.status) {
 | 
	
		
			
				|  |  | +            status = true
 | 
	
		
			
				|  |  | +            weekList[weekType[j]].push({
 | 
	
		
			
				|  |  | +              startTime: dayjs(times.startTime, 'HH:mm').format('HH:mm:ss'),
 | 
	
		
			
				|  |  | +              endTime: dayjs(times.endTime, 'HH:mm')
 | 
	
		
			
				|  |  | +                .subtract(this.freeMinutes, 'minute')
 | 
	
		
			
				|  |  | +                .format('HH:mm:ss')
 | 
	
		
			
				|  |  | +            })
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +      this.onChoice && this.onChoice(weekList, status)
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  render() {
 | 
	
		
			
				|  |  | +    return (
 | 
	
		
			
				|  |  | +      <div class={styles.timer}>
 | 
	
		
			
				|  |  | +        <div class={styles.tips}>
 | 
	
		
			
				|  |  | +          <div class={styles.tipsTitle}>请选择陪练开始时间</div>
 | 
	
		
			
				|  |  | +          <div class={styles.tipsTime}>
 | 
	
		
			
				|  |  | +            陪练课单课时时长为 <span>{this.courseMinutes}</span> 分钟
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <div class={[styles.timerContainer, 'mb12']}>
 | 
	
		
			
				|  |  | +          <ElRow gutter={5}>
 | 
	
		
			
				|  |  | +            <ElCol span={3} class={[styles.tag]}></ElCol>
 | 
	
		
			
				|  |  | +            {this.weekList.map((item: any) => (
 | 
	
		
			
				|  |  | +              <ElCol span={3}>
 | 
	
		
			
				|  |  | +                <span class={styles.tag}>{item}</span>
 | 
	
		
			
				|  |  | +              </ElCol>
 | 
	
		
			
				|  |  | +            ))}
 | 
	
		
			
				|  |  | +          </ElRow>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          <ElRow gutter={5} class="pt-1">
 | 
	
		
			
				|  |  | +            <ElCol span={3} class={[styles.tag]}></ElCol>
 | 
	
		
			
				|  |  | +            {this.weekList.map((item: any, index: number) => (
 | 
	
		
			
				|  |  | +              <ElCol span={3}>
 | 
	
		
			
				|  |  | +                <span
 | 
	
		
			
				|  |  | +                  class={[
 | 
	
		
			
				|  |  | +                    styles.tag,
 | 
	
		
			
				|  |  | +                    'cursor-pointer',
 | 
	
		
			
				|  |  | +                    this.btnStatus(index, 'row') && styles.active
 | 
	
		
			
				|  |  | +                  ]}
 | 
	
		
			
				|  |  | +                  onClick={() =>
 | 
	
		
			
				|  |  | +                    this.choice(index, 'row', this.btnStatus(index, 'row'))
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                >
 | 
	
		
			
				|  |  | +                  全选
 | 
	
		
			
				|  |  | +                </span>
 | 
	
		
			
				|  |  | +              </ElCol>
 | 
	
		
			
				|  |  | +            ))}
 | 
	
		
			
				|  |  | +          </ElRow>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          <div class="h-72 overflow-auto">
 | 
	
		
			
				|  |  | +            {this.list.map((item: any, index: number) => (
 | 
	
		
			
				|  |  | +              <ElRow gutter={5} class="pt-1">
 | 
	
		
			
				|  |  | +                <ElCol span={3}>
 | 
	
		
			
				|  |  | +                  <span
 | 
	
		
			
				|  |  | +                    class={[
 | 
	
		
			
				|  |  | +                      styles.tag,
 | 
	
		
			
				|  |  | +                      'cursor-pointer',
 | 
	
		
			
				|  |  | +                      this.btnStatus(index, 'col') && styles.active
 | 
	
		
			
				|  |  | +                    ]}
 | 
	
		
			
				|  |  | +                    onClick={() =>
 | 
	
		
			
				|  |  | +                      this.choice(index, 'col', this.btnStatus(index, 'col'))
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                  >
 | 
	
		
			
				|  |  | +                    全选
 | 
	
		
			
				|  |  | +                  </span>
 | 
	
		
			
				|  |  | +                </ElCol>
 | 
	
		
			
				|  |  | +                {item.map((week: any) => (
 | 
	
		
			
				|  |  | +                  <ElCol span={3}>
 | 
	
		
			
				|  |  | +                    <span
 | 
	
		
			
				|  |  | +                      class={[
 | 
	
		
			
				|  |  | +                        styles.tag,
 | 
	
		
			
				|  |  | +                        'cursor-pointer',
 | 
	
		
			
				|  |  | +                        week.status && styles.select
 | 
	
		
			
				|  |  | +                      ]}
 | 
	
		
			
				|  |  | +                      style={{ color: '#333333' }}
 | 
	
		
			
				|  |  | +                      onClick={() => (week.status = !week.status)}
 | 
	
		
			
				|  |  | +                    >
 | 
	
		
			
				|  |  | +                      {week.startTime}
 | 
	
		
			
				|  |  | +                    </span>
 | 
	
		
			
				|  |  | +                  </ElCol>
 | 
	
		
			
				|  |  | +                ))}
 | 
	
		
			
				|  |  | +              </ElRow>
 | 
	
		
			
				|  |  | +            ))}
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        {/* <Sticky offsetBottom={0} position="bottom"> */}
 | 
	
		
			
				|  |  | +        <div class="text-center pt-3 pb-5">
 | 
	
		
			
				|  |  | +          <ElButton
 | 
	
		
			
				|  |  | +            class="!w-40 !h-[38px]"
 | 
	
		
			
				|  |  | +            onClick={() => {
 | 
	
		
			
				|  |  | +              this.onClose()
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +          >
 | 
	
		
			
				|  |  | +            取消
 | 
	
		
			
				|  |  | +          </ElButton>
 | 
	
		
			
				|  |  | +          <ElButton
 | 
	
		
			
				|  |  | +            type="primary"
 | 
	
		
			
				|  |  | +            class="!w-40 !h-[38px]"
 | 
	
		
			
				|  |  | +            onClick={this.onSubmit}
 | 
	
		
			
				|  |  | +          >
 | 
	
		
			
				|  |  | +            保存设置
 | 
	
		
			
				|  |  | +          </ElButton>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +        {/* </Sticky> */}
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +})
 |