import React, { Component } from 'react'; import './index.less'; import Page from '@src/containers/Page'; import { formatDate, formatMonth, getMap, formatPercent } from '@src/services/Tools'; import Ratio from '../../../components/Ratio'; import UserAction from '../../../components/UserAction'; import UserPagination from '../../../components/UserPagination'; import { ExperienceScore, ExperienceDay, PrepareStatus, ExperiencePercent } from '../../../../Constant'; import { Main } from '../../../stores/main'; import { My } from '../../../stores/my'; import { Course } from '../../../stores/course'; const PrepareStatusMap = getMap(PrepareStatus, 'value', 'label'); const ExperiencePercentMap = getMap(ExperiencePercent, 'value', 'label'); const colorList = ['#2754E0', '#3F86EA', '#41A6F3', '#9BD4FF']; export default class extends Page { initState() { const prepareStatusSelect = PrepareStatus.map(row => { return { title: row.label, key: row.value, }; }); prepareStatusSelect.unshift({ title: '全部', key: '', }); const experienceDaySelect = ExperienceDay.map(row => { return { title: row.label, key: row.value, }; }); experienceDaySelect.unshift({ title: '全部', key: '', }); const experienceScoreSelect = ExperienceScore.map(row => { return { title: row.label, key: row.value, }; }); experienceScoreSelect.unshift({ title: '全部', key: '', }); const experiencePercentSelect = ExperiencePercent.map(row => { return { title: row.label, key: row.value, }; }); experiencePercentSelect.unshift({ title: '全部', key: '', }); return { prepareStatusSelect, experienceDaySelect, experienceScoreSelect, experiencePercentSelect, }; } init() { Main.getExperience() .then(result => { const totalScoreNumber = result.score.reduce((x, y) => x + y, 0); const totalPercentNumber = result.percent.reduce((x, y) => x + y, 0); const scoreList = ExperienceScore.map((row, index) => { const percent = formatPercent(result.score[index] || 0, totalScoreNumber); return { color: colorList[index], label: `${row.label} ${percent} ${result.score[index] || 0}人`, value: percent, }; }); const percentList = ExperiencePercent.map((row, index) => { const percent = formatPercent(result.percent[index] || 0, totalPercentNumber); return { color: colorList[index], label: `${row.label} ${percent} ${result.percent[index] || 0}人`, value: percent, }; }); this.setState({ data: result, scoreList, percentList }); }); } initData() { const data = Object.assign(this.state, this.state.search); if (data.order) { data.sortMap = { [data.order]: data.direction }; } data.filterMap = this.state.search; this.setState(data); Course.listExperience(Object.assign({}, this.state.search)) .then(result => { this.setState({ list: result.list, total: result.total }); }); } onFilter(value) { this.search(value, false); this.initData(); } onChangePage(page) { this.search({ page }, false); this.initData(); } renderView() { return ( <div> <div className="top content t-8"> 千行课堂 > <span className="t-1">学员表现</span> </div> {this.renderDetail()} </div> ); } renderDetail() { const { filterMap, list, data = {}, scoreList, percentList, total, page } = this.state; const { prepareStatusSelect, experienceDaySelect, experienceScoreSelect, experiencePercentSelect } = this.state; return [ <div className="center"> <div className="content"> <div className="total-list"> <div className="total-item"> <div className="title">学员人数</div> <div className="label">{data.number || 0}</div> </div> <div className="total-item"> <div className="title">考分分布</div> <Ratio size="small" values={scoreList || []} /> </div> <div className="total-item"> <div className="title">出分周期</div> <div className="label">{data.period || 0}天</div> </div> <div className="total-item"> <div className="title">提分比例</div> <Ratio size="small" values={percentList || []} /> </div> </div> <UserAction selectList={[ { key: 'prepareStatus', placeholder: '身份', select: prepareStatusSelect, }, { key: 'experienceDay', placeholder: '备考周期', select: experienceDaySelect, }, { key: 'experienceScore', placeholder: '分手成绩', select: experienceScoreSelect, }, { key: 'experiencePercent', placeholder: '提分幅度', select: experiencePercentSelect, }, ]} filterMap={filterMap} onFilter={value => this.onFilter(value)} /> {list.map(item => { return <Article data={item} />; })} {total > 0 && list.length > 0 && ( <UserPagination total={total} current={page} pageSize={this.state.search.size} onChange={p => this.onChangePage(p)} /> )} </div> </div>, ]; } } class Article extends Component { constructor(props) { super(props); this.state = {}; } onCollect() { const { data } = this.props; const { collect } = this.state; if (collect === false || !data.collect) { My.addExperienceCollect(data.id) .then(() => { this.setState({ collect: true }); }); } else { My.delExperienceCollect(data.id) .then(() => { this.setState({ collect: false }); }); } } render() { const { data } = this.props; const { collect } = this.state; return ( <div className="article-item p-t-2 b-b" onClick={() => linkTo(`/course/experience/detail/${data.id}`)}> <div className="t-1 t-s-14 f-w-b"> {data.title} <div className="f-r t-3 t-s-12 f-w-d"> <span>{data.updateTime && formatDate(data.updateTime, 'YYYY-MM-DD HH:mm:ss')}</span> <span className="m-l-2">阅读 {data.viewNumber}</span> <span className="m-l-2" onClick={(e) => { e.stopPropagation(); this.onCollect(); }}> {(collect === false || !data.collect) ? '收藏' : '取消收藏'} </span> </div> </div> <div className="t-1 t-s-12 m-b-2"> <span className="m-r-2">{data.user ? data.user.nickname : data.nickname}</span> <span className="m-r-2">{PrepareStatusMap[data.prepareStatus]}</span> <span className="m-r-2">备考:{!!data.experienceDay && formatMonth(data.experienceDay, false)}</span> <span className="m-r-2"> {data.experienceScore}分 /提分 {ExperiencePercentMap[data.experiencePercent]} </span> </div> <div className="t-2 m-b-2 detail">{data.description}</div> </div> ); } }