import React, { Component } from 'react'; import { Link } from 'react-router-dom'; import './index.less'; import { Icon, Popover } from 'antd'; import FileUpload from '@src/components/FileUpload'; import Page from '@src/containers/Page'; import Assets from '@src/components/Assets'; import { asyncSMessage } from '@src/services/AsyncTools'; import { formatDate, formatSeconds, formatPercent } from '@src/services/Tools'; import UserLayout from '../../../layouts/User'; import Button from '../../../components/Button'; import ProgressText from '../../../components/ProgressText'; import IconButton from '../../../components/IconButton'; import { Icon as GIcon } from '../../../components/Icon'; import menu from '../index'; import Tabs from '../../../components/Tabs'; import UserTable from '../../../components/UserTable'; import More from '../../../components/More'; import Modal from '../../../components/Modal'; import DatePlane from '../../../components/Date'; import Note from '../../../components/Note'; import { FinishModal, CommentModal } from '../../../components/OtherModal'; import { My } from '../../../stores/my'; import { User } from '../../../stores/user'; import { Question } from '../../../stores/question'; import { Order } from '../../../stores/order'; import { Common } from '../../../stores/common'; export default class extends Page { initState() { return { tab: 'online', status: 'all', }; } formatRecord(row) { if (row.useEndTime) { if (row.isSuspend && !row.restoreTime) { row.status = 'suspend'; } else if (new Date(row.useEndTime).getTime() < new Date().getTime()) { row.status = 'end'; } else { row.status = 'ing'; } } else { row.status = 'not'; } row.paperMap = {}; row.appointmentPaperMap = {}; if (row.papers) { row.papers.forEach(paper => { if (paper.courseNo) row.paperMap[paper.courseNo] = paper; if (paper.appointment) row.appointmentPaperMap[paper.appointment] = paper; }); } row.progressMap = {}; if (row.progress) { row.progress.forEach(progress => { row.progressMap[progress.courseNoId] = progress; }); } row.courseNoMap = {}; row.courseTime = 0; if (row.courseNos) { row.courseNos.forEach(no => { row.courseNoMap[no.id] = no; row.courseTime += no.time; no.paper = row.paperMap[no.id]; no.progress = row.progressMap[no.id]; }); } if (row.currentNo) { row.currentCourseNo = row.courseNoMap[row.currentNo]; } else { row.currentNo = 0; } // 如果已经最新预约结束,则添加一个空记录作为最新预约 if (row.appointments) { row.appointments.forEach(r => { r.paper = row.appointmentPaperMap[r.id]; r.noteList = (row.comments || []).filter(c => c.type === 'note' && c.appointmentId === r.id); r.supplyList = (row.comments || []).filter(c => c.type === 'supply' && c.appointmentId === r.id); }); // 是否是最后一课时,是否过预约时间 const last = row.appointments.length - 1; const appointment = row.appointments[last]; if (new Date(appointment.endTime).getTime() < new Date().getTime()) { // row.status = 'end'; if (row.number !== row.appointments.length) { row.appointments.push([{}]); } } } row.days = new Date(row.userEndTime); return row; } initData() { const data = Object.assign(this.state, this.state.search); data.filterMap = this.state.search; if (data.order) { data.sortMap = { [data.order]: data.direction }; } this.setState(data); let isUsed = null; let isEnd = null; switch (data.status) { case 'learning': isUsed = true; isEnd = false; break; case 'end': isUsed = true; isEnd = true; break; case 'nouse': isUsed = false; isEnd = false; break; case 'all': default: } My.listCourse(Object.assign({ courseModule: data.tab }, this.state.search, { isUsed, isEnd })).then(result => { result.list = result.list.map(row => { return this.formatRecord(row); }); this.setState({ list: result.list, total: result.total, page: data.page }); }); } onAction() { } onTabChange(tab) { const data = { tab }; this.refreshQuery(data); } onStatusChange(status) { this.search({ status }); } openTime(record) { if (record.courseTimeMap) { this.setState({ data: record, showTime: true }); return; } My.timeCourse(record.id).then(result => { const courseMap = {}; const previewMap = {}; const stopMap = {}; result.forEach(row => { const date = formatDate(row.day, 'YYYY-MM-DD'); if (row.type === 'stop') { stopMap[date] = true; } else if (row.type === 'preview') { previewMap[date] = true; } else if (row.type === 'course') { courseMap[date] = true; } }); record.courseTimeMap = courseMap; record.previewTimeMap = previewMap; record.stopTimeMap = stopMap; this.setState({ data: record, showTime: true }); }); } refreshDetail(recordId) { My.detailCourse(recordId).then(result => { let { list } = this.state; list = list.map(row => { if (row.id === recordId) return this.formatRecord(result); return row; }); this.setState({ list }); }); } suspend() { const { suspend } = this.state; My.suspendCourse(suspend.id) .then(() => { asyncSMessage('停课成功'); this.setState({ showSuspend: false }); this.refreshDetail(suspend.id); }) .catch(err => { asyncSMessage(err.message, 'error'); }); } restore() { const { restore } = this.state; My.restoreCourse(restore.id) .then(() => { asyncSMessage('恢复成功'); this.setState({ showRestore: false }); this.refreshDetail(restore.id); }) .catch(err => { asyncSMessage(err.message, 'error'); }); } submitAppointmentComment(data, type) { data.type = type; if (data.id) { My.editAppointmentComment(data).then(() => { this.refreshDetail(data.recordId); }); } else { My.addAppointmentComment(data).then(() => { this.refreshDetail(data.recordId); }); } } deleteAppointmentComment(row) { My.delAppointmentComment(row.id).then(() => { this.refreshDetail(row.recordId); }); } submitQuestionFile(data) { My.uploadAppointmentQuestion(data).then(() => { this.refreshDetail(data.recordId); }); } setCCTalkName(recordId, cctalkname) { My.setCCTalkName(recordId, cctalkname).then(() => { this.refreshDetail(recordId); }); } open(recordId) { Order.useRecord(recordId).then(() => { this.refreshDetail(recordId); }); } closeCommentTips(recordId) { My.courseCommentTips(recordId); } uploadNote(file) { const { note = {} } = this.state; Common.uploadImage(file).then(result => { note.file = result.url; note.name = file.name; this.setState({ note }); }); } uploadSupply(file) { const { supply = {} } = this.state; Common.uploadImage(file).then(result => { supply.file = result.url; supply.name = file.name; this.setState({ supply }); }); } renderView() { const { config } = this.props; return ; } renderDetail() { const { tab, status, showTips, showTime, showSuspend, showRestore, showUploadNote, showUploadSupply, showSupply, showNote, showComment, showFinish, comment = {}, data = {}, note = {}, supply = {}, appointment = {}, } = this.state; return (
this.onTabChange(key)} /> this.onStatusChange(key)} /> {this[`renderTab${tab}`]()} this.setState({ showTime: false })} >
听课频率
{data.currentNo ? parseInt(data.totalDays / data.currentNo, 10) : 0}天/课时
作业完成度
{data.previewProgress || 0}%
听课
预习
停课
{ }} disabledDate={current => { const date = current.format('YYYY-MM-DD'); return data.stopTimeMap[date]; }} dateRender={current => { const date = current.format('YYYY-MM-DD'); return (
{current.get('date')} {data.courseTimeMap[date] && } {data.previewTimeMap[date] && }
); }} checkRefresh={(date, refresh) => { setTimeout(() => { refresh(); }, 2000); return true; }} />
*听课频率≤2天/课时,作业完成度≥90%,课程有效期可延长7-10天。
this.suspend()} onCancel={() => this.setState({ showSuspend: false })} >
最长停课周期为1个月,到期后系统自动恢复至“学习中”状态。
每门课程只有一次申请机会,是否需要停课?
*停课不影响听课频率的计算;
{' '} 停课期间可随时恢复学习。
this.restore()} onCancel={() => this.setState({ showRestore: false })} >
恢复学习后,本课程的停课功能将无法使用。是否恢复学习?
this.submitAppointmentComment(note, 'note')} onCancel={() => this.setState({ showUploadNote: false, note: {} })} >