page.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. import React from 'react';
  2. import { Form, Row, Col, Input, Button, Icon } from 'antd';
  3. import './index.less';
  4. import Page from '@src/containers/Page';
  5. import Block from '@src/components/Block';
  6. import { flattenObject, formatFormError } from '@src/services/Tools';
  7. import { asyncSMessage } from '@src/services/AsyncTools';
  8. import { System } from '../../../stores/system';
  9. export default class extends Page {
  10. initData() {
  11. System.getCoursePromote().then(result => {
  12. const { form } = this.props;
  13. (result.video_list || []).forEach((row, index) => {
  14. form.getFieldDecorator(`video_list[${index}].number`);
  15. form.getFieldDecorator(`video_list[${index}].percent`);
  16. });
  17. (result['1v1_list'] || []).forEach((row, index) => {
  18. form.getFieldDecorator(`1v1_list[${index}].number`);
  19. form.getFieldDecorator(`1v1_list[${index}].percent`);
  20. });
  21. (result.gifts || []).forEach((row, index) => {
  22. form.getFieldDecorator(`gifts[${index}].money`);
  23. form.getFieldDecorator(`gifts[${index}].hour`);
  24. });
  25. form.setFieldsValue(flattenObject(result));
  26. this.setState({ load: true, data: result });
  27. });
  28. }
  29. addLength(field, info) {
  30. let { data } = this.state;
  31. data = data || {};
  32. data[field] = data[field] || [];
  33. data[field].push(info);
  34. this.setState({ data });
  35. }
  36. deleteLength(field, start, length) {
  37. let { data } = this.state;
  38. data = data || {};
  39. data[field] = data[field] || [];
  40. data[field].splice(start, length);
  41. this.setState({ data });
  42. }
  43. changeMapValue(field, index, key, value) {
  44. const { data } = this.state;
  45. data[field] = data[field] || {};
  46. data[field][index] = data[field][index] || {};
  47. data[field][index][key] = value;
  48. this.setState({ data });
  49. }
  50. changeValue(field, key, value) {
  51. const { data } = this.state;
  52. data[field] = data[field] || {};
  53. data[field][key] = value;
  54. this.setState({ data });
  55. }
  56. submit() {
  57. const { form } = this.props;
  58. form.validateFields((err) => {
  59. if (!err) {
  60. const data = form.getFieldsValue();
  61. data.video_list = (data.video_list || []).map(row => {
  62. return { number: Number(row.number), percent: Number(row.percent) };
  63. });
  64. data['1v1_list'] = (data['1v1_list'] || []).map(row => {
  65. return { number: Number(row.number), percent: Number(row.percent) };
  66. });
  67. data.gifts = (data.gifts || []).map(row => {
  68. return { money: Number(row.money), hour: Number(row.hour) };
  69. });
  70. System.setCoursePromote(data)
  71. .then(() => {
  72. this.setState(data);
  73. asyncSMessage('保存成功');
  74. }).catch((e) => {
  75. form.setFields(formatFormError(data, e.result));
  76. });
  77. }
  78. });
  79. }
  80. renderVideo() {
  81. const { getFieldDecorator } = this.props.form;
  82. const { data } = this.state;
  83. const videos = data.video_list || [];
  84. return <Block>
  85. <h1>视频课折扣</h1>
  86. <Form>
  87. <Form.Item label='按购买课程数量计算' />
  88. {videos.map((row, index) => {
  89. return <Row>
  90. <Col span={2}>
  91. <Form.Item>
  92. {getFieldDecorator(`video_list[${index}].number`, {
  93. rules: [
  94. { required: true, message: '输入数量' },
  95. ],
  96. })(
  97. <Input placeholder={'输入数量'} onChange={(value) => {
  98. this.changeMapValue('video_list', index, 'number', value);
  99. }} />,
  100. )}
  101. </Form.Item>
  102. </Col>
  103. <Col span={1}>
  104. </Col>
  105. <Col span={2}>
  106. <Form.Item>
  107. {getFieldDecorator(`video_list[${index}].percent`, {
  108. rules: [
  109. { required: true, message: '输入百分比' },
  110. ],
  111. })(
  112. <Input placeholder={'输入百分比'} onChange={(value) => {
  113. this.changeMapValue('video_list', index, 'percent', value);
  114. }} />,
  115. )}
  116. </Form.Item>
  117. </Col>
  118. <Col span={1}>
  119. %
  120. </Col>
  121. <Col span={1} onClick={() => {
  122. this.deleteLength('video_list', index, 1);
  123. }}>
  124. <Button><Icon type="minus" /></Button>
  125. </Col>
  126. </Row>;
  127. })}
  128. <Button onClick={() => {
  129. this.addLength('video_list', { number: 0, precent: 0 });
  130. }}><Icon type={'plus'} /></Button>
  131. <Form.Item labelCol={{ span: 3 }} wrapperCol={{ span: 16 }} label='促销文案'>
  132. {getFieldDecorator('video.text', {
  133. rules: [
  134. { required: true, message: '输入促销文案' },
  135. ],
  136. })(
  137. <Input placeholder='2门9折,3门88折,4门85折(套餐不享受此优惠)' onChange={(value) => {
  138. this.changeValue('video', 'text', value);
  139. }} />,
  140. )}
  141. </Form.Item>
  142. </Form>
  143. </Block>;
  144. }
  145. render1vs1() {
  146. const { getFieldDecorator } = this.props.form;
  147. const { data } = this.state;
  148. const vs = data['1v1_list'] || [];
  149. return <Block>
  150. <h1>1v1课折扣</h1>
  151. <Form>
  152. <Form.Item label='按购买课程数量计算' />
  153. {vs.map((row, index) => {
  154. return <Row>
  155. <Col span={2}>
  156. <Form.Item>
  157. {getFieldDecorator(`1v1_list[${index}].number`, {
  158. rules: [
  159. { required: true, message: '输入数量' },
  160. ],
  161. })(
  162. <Input placeholder={'输入数量'} onChange={(value) => {
  163. this.changeMapValue('1v1_list', index, 'number', value);
  164. }} />,
  165. )}
  166. </Form.Item>
  167. </Col>
  168. <Col span={1}>
  169. </Col>
  170. <Col span={2}>
  171. <Form.Item>
  172. {getFieldDecorator(`1v1_list[${index}].percent`, {
  173. rules: [
  174. { required: true, message: '输入百分比' },
  175. ],
  176. })(
  177. <Input placeholder={'输入百分比'} onChange={(value) => {
  178. this.changeMapValue('1v1_list', index, 'percent', value);
  179. }} />,
  180. )}
  181. </Form.Item>
  182. </Col>
  183. <Col span={1}>
  184. %
  185. </Col>
  186. <Col span={1} onClick={() => {
  187. this.deleteLength('1v1_list', index, 1);
  188. }}>
  189. <Button><Icon type="minus" /></Button>
  190. </Col>
  191. </Row>;
  192. })}
  193. <Button onClick={() => {
  194. this.addLength('1v1_list', { number: 0, precent: 0 });
  195. }}><Icon type={'plus'} /></Button>
  196. <Form.Item labelCol={{ span: 3 }} wrapperCol={{ span: 16 }} label='促销文案'>
  197. {getFieldDecorator('1v1.text', {
  198. rules: [
  199. { required: true, message: '输入促销文案' },
  200. ],
  201. })(
  202. <Input placeholder='满30课时95折' onChange={(value) => {
  203. this.changeValue('1v1', 'text', value);
  204. }} />,
  205. )}
  206. </Form.Item>
  207. </Form>
  208. </Block>;
  209. }
  210. renderGift() {
  211. const { getFieldDecorator } = this.props.form;
  212. const { data } = this.state;
  213. const gifts = data.gifts || [];
  214. return <Block>
  215. <h1>课程赠品</h1>
  216. <Form>
  217. <Form.Item label='满额送回复时长服务' />
  218. {gifts.map((row, index) => {
  219. return <Row>
  220. <Col span={6}>
  221. <Form.Item labelCol={{ span: 10 }} wrapperCol={{ span: 14 }} label='实付金额'>
  222. {getFieldDecorator(`gifts[${index}].money`, {
  223. rules: [
  224. { required: true, message: '输入金额' },
  225. ],
  226. })(
  227. <Input placeholder={'输入金额'} onChange={(value) => {
  228. this.changeMapValue('gifts', index, 'money', value);
  229. }} />,
  230. )}
  231. </Form.Item>
  232. </Col>
  233. <Col span={6}>
  234. <Form.Item labelCol={{ span: 10 }} wrapperCol={{ span: 14 }} label='赠送'>
  235. {getFieldDecorator(`gifts[${index}].hour`, {
  236. rules: [
  237. { required: true, message: '输入小时' },
  238. ],
  239. })(
  240. <Input placeholder={'输入小时'} onChange={(value) => {
  241. this.changeMapValue('gifts', index, 'hour', value);
  242. }} />,
  243. )}
  244. </Form.Item>
  245. </Col>
  246. <Col span={1} onClick={() => {
  247. this.deleteLength('gifts', index, 1);
  248. }}>
  249. <Button><Icon type="minus" /></Button>
  250. </Col>
  251. </Row>;
  252. })}
  253. <Button onClick={() => {
  254. this.addLength('gifts', { money: 0, hour: 0 });
  255. }}><Icon type={'plus'} /></Button>
  256. </Form>
  257. </Block>;
  258. }
  259. renderView() {
  260. const { tab } = this.state;
  261. return <div>
  262. {this.renderVideo()}
  263. {this.render1vs1()}
  264. {this.renderGift()}
  265. <Row type="flex" justify="center">
  266. <Col>
  267. <Button type="primary" onClick={() => {
  268. this.submit(tab);
  269. }}>保存</Button>
  270. </Col>
  271. </Row>
  272. </div>;
  273. }
  274. }