page.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. import React, { Component } from 'react';
  2. import './index.less';
  3. import { Icon } from 'antd';
  4. import Assets from '@src/components/Assets';
  5. import Page from '@src/containers/Page';
  6. import Modal from '../../../components/Modal';
  7. import UserTable from '../../../components/UserTable';
  8. import IconButton from '../../../components/IconButton';
  9. import { Order } from '../../../stores/order';
  10. import { User } from '../../../stores/user';
  11. import { formatDate } from '../../../../../src/services/Tools';
  12. // import { ServiceKey, ServiceParamMap, OrderInfoMap } from '../../../../Constant';
  13. export default class extends Page {
  14. initData() {
  15. const { id } = this.params;
  16. Order.getOrder(id)
  17. .then(result => {
  18. User.formatOrder(result);
  19. this.setState({ order: result, list: result.checkouts });
  20. });
  21. }
  22. renderView() {
  23. const { order = {}, list = [] } = this.state;
  24. return (
  25. <div style={{ paddingTop: 40 }}>
  26. <div className="content">
  27. <div className="t-1 m-b-2 f-w-b t-s-24">订单详情</div>
  28. </div>
  29. <div className="content">
  30. <div className="m-b-1 t-8 m-b-2">订单编号 {order.id}</div>
  31. </div>
  32. <div className="list content">
  33. {(list || []).map(item => {
  34. return <OrderItem data={item} />;
  35. })}
  36. </div>
  37. <div className="gift-list content">
  38. {(order.gift || []).map(item => {
  39. return <GiftItem data={item} />;
  40. })}
  41. </div>
  42. <div className="content block">
  43. <div className="t-1 t-s-18 f-w-b title">订单金额</div>
  44. <div className="t-2 t-s-12 item">
  45. <span>应付金额</span>
  46. <span>¥ {order.originMoney}</span>
  47. </div>
  48. {order.originMoney - order.money > 0 && <div className="t-2 t-s-12 item">
  49. <span>优惠金额</span>
  50. <span>¥ {order.originMoney - order.money}</span>
  51. </div>}
  52. <div className="t-2 t-s-12 item">
  53. <span>实付金额</span>
  54. <span>¥ {order.money}</span>
  55. </div>
  56. </div>
  57. <div className="content block">
  58. <div className="t-1 t-s-18 f-w-b title">支付信息</div>
  59. <div className="t-2 t-s-12 item">
  60. <span>支付方式</span>
  61. <span>
  62. {order.payMethod && <Assets name={order.payMethod === 'wechat' ? 'wechatpay' : order.payMethod} />}
  63. {/* alipay wechatpay bank */}
  64. </span>
  65. </div>
  66. <div className="t-2 t-s-12 item">
  67. <span>付款时间</span>
  68. <span>{order.payTime && formatDate(order.payTime, 'YYYY-MM-DD HH:mm:ss')}</span>
  69. </div>
  70. </div>
  71. </div>
  72. );
  73. }
  74. }
  75. class GiftItem extends Component {
  76. render() {
  77. const { data } = this.props;
  78. let message = '';
  79. if (data.money) {
  80. message = `实付金额满${data.money}元赠送`;
  81. } else if (data.from === 'vsNumber') {
  82. message = `1VS1课程满${data.number}节赠送`;
  83. }
  84. return (
  85. <div className="gift-item">
  86. <div className="d-i-b t-2 t-s-12 m-l-2">
  87. <Assets className="m-r-5" width={20} height={20} name="gift2" />
  88. {data.message}
  89. </div>
  90. <div style={{ marginRight: 80 }} className="d-i-b t-2 t-s-12 f-r">
  91. {message}
  92. </div>
  93. </div>
  94. );
  95. }
  96. }
  97. class OrderItem extends Component {
  98. constructor(props) {
  99. super(props);
  100. this.state = { open: false, showList: false };
  101. this.columns = [{
  102. key: 'label',
  103. title: '服务',
  104. }, {
  105. key: 'expireDays',
  106. title: '开通有效期',
  107. render: (text, checkout) => {
  108. return checkout.expireDays ? `${checkout.expireDays}天` : '付款后立即生效';
  109. },
  110. }, {
  111. key: 'useExpireDays',
  112. title: '使用有效期',
  113. render: (text, checkout) => {
  114. return checkout.useExpireDays ? `${checkout.useExpireDays}天` : '永久';
  115. },
  116. }];
  117. }
  118. render() {
  119. const { data = {} } = this.props;
  120. const { showList } = this.state;
  121. return (
  122. <div className="order-item">
  123. {this.renderInfo()}
  124. {(data.children || data.gift) && this.renderDetail()}
  125. <Modal
  126. show={showList}
  127. maskClosable
  128. close={false}
  129. body={false}
  130. width={630}
  131. onClose={() => this.setState({ showList: false })}
  132. >
  133. <UserTable
  134. size="small"
  135. theme="top"
  136. columns={this.columns}
  137. data={data.gift}
  138. />
  139. </Modal>
  140. </div>
  141. );
  142. }
  143. renderInfo() {
  144. const { data } = this.props;
  145. const checkout = data;
  146. return (
  147. <div className="order-item-info">
  148. <div style={{ width: 360 }} className="d-i-b t-1 t-s-16">
  149. {data.title}
  150. </div>
  151. <div style={{ width: 530 }} hidden={checkout.productType === 'data'} className="d-i-b t-8 t-s-12">
  152. <span className="m-r-2">开通有效期: {checkout.expireDays ? `${checkout.expireDays}天` : '付款后立即生效'}</span>
  153. <span className="m-l-2">使用有效期: {checkout.useExpireDays ? `${checkout.useExpireDays}天` : '永久'}</span>
  154. </div>
  155. <div style={{ width: 530 }} hidden={checkout.productType !== 'data'} className="d-i-b t-8 t-s-12">
  156. <IconButton
  157. type="download"
  158. onClick={() => {
  159. openLink(checkout.data.resource);
  160. }}
  161. />
  162. </div>
  163. <div style={{ width: 120 }} className="d-i-b t-s-12 p-r">
  164. {data.number > 0 && <span className="t-8 m-r-2">数量</span>}
  165. {data.number > 0 && <span className="t-1">{data.number}</span>}
  166. </div>
  167. <div className="d-i-b t-7 t-s-16"> ¥ {data.money}</div>
  168. </div>
  169. );
  170. }
  171. renderDetail() {
  172. const { data = {} } = this.props;
  173. const { children = [], gift } = data;
  174. const { open } = this.state;
  175. return (
  176. <div className="order-item-detail l-h-20">
  177. <div hidden={!children || children.length === 0} className="contain">
  178. <div style={{ width: 1010 }} className="d-i-b t-1 t-s-12">
  179. <span className="d-i-b f-w-b m-r-5">
  180. 包含
  181. <Icon
  182. hidden={!open}
  183. className="t-10 c-p"
  184. type="caret-up"
  185. onClick={() => this.setState({ open: !open })}
  186. />
  187. <Icon
  188. hidden={open}
  189. className="t-10 c-p"
  190. type="caret-down"
  191. onClick={() => this.setState({ open: !open })}
  192. />
  193. </span>
  194. <span hidden={open} style={{ width: 300 }} className="d-i-b nowrap">
  195. {(children || []).map(checkout => checkout.title).join(' + ')}
  196. </span>
  197. </div>
  198. <div className="d-i-b t-1 t-s-12 t-d-l-t"> ¥ {data.originMoney}</div>
  199. </div>
  200. <div hidden={!open} className="contain-list m-b-5 l-h-16">
  201. {(children || []).map(checkout => {
  202. return <div>
  203. <div style={{ width: 360 }} className="d-i-b t-1 t-s-12">
  204. <span className="d-i-b m-r-5">{checkout.title}</span>
  205. </div>
  206. <div className="d-i-b t-8 t-s-12">
  207. <span className="m-r-2">开通有效期: {checkout.expireDays ? `${checkout.expireDays}天` : '付款后立即生效'}</span>
  208. <span className="m-l-2">使用有效期: {checkout.useExpireDays ? `${checkout.useExpireDays}天` : '永久'}</span>
  209. </div>
  210. </div>;
  211. })}
  212. </div>
  213. {gift && <div className="service">
  214. <div className="d-i-b t-1 t-s-12">
  215. <span className="d-i-b f-w-b m-r-5">赠送服务</span>
  216. <span className="d-i-b">
  217. {gift.map(row => {
  218. return `${row.label}x${row.param ? row.param.label : row.number}`;
  219. }).join(' ')}
  220. <Icon className="m-l-5 close" type="exclamation-circle" theme="filled" onClick={() => {
  221. this.setState({ showList: true });
  222. }} />
  223. </span>
  224. </div>
  225. </div>}
  226. </div>
  227. );
  228. }
  229. }