import React, { Component } from 'react'; import './index.less'; import { Icon, Radio } from 'antd'; import Assets from '@src/components/Assets'; import Page from '@src/containers/Page'; import { asyncSMessage } from '@src/services/AsyncTools'; import CheckboxItem from '../../../components/CheckboxItem'; import Button from '../../../components/Button'; import Modal from '../../../components/Modal'; import UserTable from '../../../components/UserTable'; import { Order } from '../../../stores/order'; import { Course } from '../../../stores/course'; import { User } from '../../../stores/user'; import { getMap } from '../../../../../src/services/Tools'; import { CourseVsType } from '../../../../Constant'; const CourseVsTypeMap = getMap(CourseVsType, 'value', 'tips'); export default class extends Page { initState() { return { courses: [] }; } init() { Course.allVs() .then(result => { // 赠送选择选择 this.setState({ courses: result.filter(row => ['novice', 'coach'].indexOf(row.vsType) >= 0) }); }); } initData() { Order.getOrder(34) .then((order) => { User.needPay(order); }); Order.allCheckout() .then(result => { User.formatOrder(result); this.setState({ order: result, list: result.checkouts }); }); } onAll(checked) { const { selectList } = this.state; const { list = [] } = this.state; if (checked) { list.forEach(item => { if (selectList.indexOf(item.key) >= 0) return; selectList.push(item.key); }); } else { list.forEach(item => { const index = selectList.indexOf(item.key); if (index < 0) return; selectList.splice(index, 1); }); } this.setState({ selectList, allChecked: checked }); } onSelect(key, checked) { const { selectList = [] } = this.state; if (checked) { selectList.push(key); } else { selectList.splice(selectList.indexOf(key), 1); } this.setState({ selectList, allChecked: false }); } onDelete(list) { Promise.all(list.map(row => { return Order.removeCheckout(row); })) .then(() => { this.refresh(); }); } onChangeNumber(id, number) { Order.changeCheckout(id, number) .then(() => { this.refresh(); }); } pay() { const { courseId, list, order } = this.state; if (list.length === 0) return; if (order.gift && order.gift.filter(row => row.key === 'vs').length > 0 && !courseId) { // 请选择课程 asyncSMessage('请选择赠送的课程', 'warn'); return; } Order.confirmPay(courseId) .then(result => { return User.needPay(result) .then(() => { linkTo(`/order/${result.id}`); }) .catch(() => { this.refresh(); }); }); } renderView() { const { courses = [], order = {}, list = [], allChecked, selectList = [], courseId } = this.state; return ( <div style={{ paddingTop: 50 }}> <div className="content"> <div className="t-1 m-b-2 f-w-b t-s-24">购物车</div> </div> <div className="list content"> {(list || []).map(item => { return [ item.productType === 'course_package' && <div className="content"> <div className="m-b-1 t-8">您看中的课程已构成套餐,结算有优惠</div> </div>, <OrderItem data={item} checked={selectList.indexOf(item.id) >= 0} onDelete={() => this.onDelete([item.id])} onCheck={(checked) => this.onSelect(item.id, checked)} onChangeNumber={(number) => this.onChangeNumber(item.id, number)} />, ]; })} </div> <div className="gift-list content"> {(order.gift || []).map(item => { return <GiftItem data={item} courses={courses} courseId={courseId} onSelectCourse={(id) => item.key === 'vs' && this.setState({ courseId: id })} />; })} </div> <div className="footer"> <div className="content"> <div className="d-i-b m-t-1 m-r-2"> <CheckboxItem className="v-a-m m-r-5" theme="white" checked={allChecked} onClick={() => this.onAll(!allChecked)} /> 全选 </div> <div style={{ marginRight: 50 }} className="d-i-b m-t-1"> <Button size="small" radius disabled={selectList.length === 0} onClick={() => this.onDelete(selectList)}> 删除 </Button> </div> {order.promote && order.promote.length > 0 && [ <div style={{ marginTop: 15 }} className="d-i-b t-9 t-s-12 m-r-5"> 优惠活动: </div>, <div style={{ marginTop: 15 }} className="d-i-b t-s-12"> {order.promote.map(row => { return <div>{row.message}</div>; })} </div>, ]} <div className="f-r"> <div className="d-i-b m-r-1 m-t-1"> <div className="t-1 t-s-16 f-w-b"> 实付<span className="m-l-5 t-7 t-s-20"> ¥ {order.money || 0}</span> </div> <div className="t-1"> 原价<span className="m-l-5 t-8 t-d-l-t">¥ {order.originMoney || 0}</span> <span hidden={!((order.originMoney || 0) - (order.money || 0))} className="m-l-5 t-8">(优惠活动-¥{(order.originMoney || 0) - (order.money || 0)})</span> </div> </div> <Button className="submit" onClick={() => this.pay()}>立即付款</Button> </div> </div> </div> </div> ); } } class GiftItem extends Component { render() { const { data } = this.props; return ( <div className="gift-item"> {this.renderInfo()} {data.key === 'vs' && this.renderVs()} </div> ); } renderInfo() { const { data } = this.props; let message = ''; if (data.money) { message = `实付金额满${data.money}元赠送`; } else if (data.from === 'vsNumber') { message = `1VS1课程满${data.number}节赠送`; } return ( <div className="gift-item-info"> <Assets name="gift2" className="gift" width={20} height={20} /> <div style={{ width: 350 }} className="d-i-b t-1 t-s-16"> {data.message} </div> <div style={{ width: 400 }} className="d-i-b t-8 t-s-12"> {message} </div> </div> ); } renderVs() { const { courses, courseId, onSelectCourse } = this.props; return ( <div className="gift-item-detail l-h-20"> <div className="select"> <div style={{ width: 350 }} className="d-i-b t-1 t-s-12"> <span className="d-i-b f-w-b m-r-5">请选择</span> </div> <div className="d-i-b t-1 t-s-12">可至「个人中心-课程」预约辅导时间。</div> </div> <div className="select-list m-b-5 l-h-16"> {courses.map(course => { return <div> <div style={{ width: 350 }} className="d-i-b t-1 t-s-12"> <span className="d-i-b m-r-5"> <Radio className="m-r-5" checked={courseId === course.id} onChange={() => onSelectCourse(course.id)} /> {course.title} </span> </div> <div className="d-i-b t-8 t-s-12">{CourseVsTypeMap[course.vsType]}</div> </div>; })} </div> </div> ); } } class OrderItem extends Component { constructor(props) { super(props); this.state = { open: false, showList: false }; this.columns = [{ key: 'label', title: '服务', }, { key: 'expireDays', title: '开通有效期', render: (text, checkout) => { return checkout.expireDays ? `${checkout.expireDays}天` : '付款后立即生效'; }, }, { key: 'useExpireDays', title: '使用有效期', render: (text, checkout) => { return checkout.useExpireDays ? `${checkout.useExpireDays}天` : '永久'; }, }]; } render() { const { data } = this.props; const { showList } = this.state; return ( <div className="order-item"> {this.renderInfo()} {(data.children || data.gift) && this.renderDetail()} <Modal show={showList} maskClosable close={false} body={false} width={630} onClose={() => this.setState({ showList: false })} > <UserTable size="small" theme="top" columns={this.columns} data={data.gift} /> </Modal> </div> ); } renderInfo() { const { data, onCheck, onDelete, onChangeNumber, checked } = this.props; const checkout = data; return ( <div className="order-item-info"> <CheckboxItem theme="white" className="select" checked={checked} onClick={() => onCheck(!checked)} /> <Icon className="close" type="close-circle" theme="filled" onClick={() => onDelete()} /> <div style={{ width: 350 }} className="d-i-b t-1 t-s-16"> {data.title} </div> <div style={{ width: 430 }} className="d-i-b t-8 t-s-12"> <span className="m-r-2">开通有效期: {checkout.expireDays ? `${checkout.expireDays}天` : '付款后立即生效'}</span> <span className="m-l-2">使用有效期: {checkout.useExpireDays ? `${checkout.useExpireDays}天` : '永久'}</span> </div> <div style={{ width: 120 }} className="d-i-b t-8 t-s-12 p-r"> {data.number > 0 && ['数量', <input value={data.number} style={{ width: 32 }} className="m-l-5 t-c" />, <Icon className="up" type="caret-up" onClick={() => data.number < data.maxNumber && onChangeNumber(data.number + 1)} />, <Icon className="down" type="caret-down" onClick={() => data.number > 1 && data.number > data.minNumber && onChangeNumber(data.number - 1)} />]} </div> <div className="d-i-b t-7 t-s-16"> ¥ {data.money}</div> </div> ); } renderDetail() { const { data = {} } = this.props; const { children = [], gift } = data; const { open } = this.state; return ( <div className="order-item-detail l-h-20"> <div hidden={!children || children.length === 0} className="contain"> <div style={{ width: 880 }} className="d-i-b t-1 t-s-12"> <span className="d-i-b f-w-b m-r-5"> 包含 <Icon hidden={!open} className="t-10 c-p" type="caret-up" onClick={() => this.setState({ open: !open })} /> <Icon hidden={open} className="t-10 c-p" type="caret-down" onClick={() => this.setState({ open: !open })} /> </span> <span hidden={open} style={{ width: 300 }} className="d-i-b nowrap"> {(children || []).map(checkout => checkout.title).join(' + ')} </span> </div> <div className="d-i-b t-1 t-s-12 t-d-l-t"> ¥ {data.originMoney}</div> </div> <div hidden={!open} className="contain-list m-b-5 l-h-16"> {(children || []).map(checkout => { return <div> <div style={{ width: 350 }} className="d-i-b t-1 t-s-12"> <span className="d-i-b m-r-5">{checkout.title}</span> </div> <div className="d-i-b t-8 t-s-12"> <span className="m-r-2">开通有效期: {checkout.expireDays ? `${checkout.expireDays}天` : '付款后立即生效'}</span> <span className="m-l-2">使用有效期: {checkout.useExpireDays ? `${checkout.useExpireDays}天` : '永久'}</span> </div> </div>; })} </div> {gift && <div className="service"> <div className="d-i-b t-1 t-s-12"> <span className="d-i-b f-w-b m-r-5">赠送服务</span> <span className="d-i-b"> {gift.map(row => { return `${row.label}x${row.param ? row.param.label : row.number}`; }).join(' ')} <Icon className="m-l-5 close" type="exclamation-circle" theme="filled" onClick={() => { this.setState({ showList: true }); }} /> </span> </div> </div>} </div> ); } }