知与行后台管理端

edithelpActivity.jsx 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. import React, { useState, useEffect } from 'react';
  2. import { Form, Input, Button, Icon, Select, Tabs, Radio, DatePicker, message, Upload } from 'antd';
  3. import { FormattedMessage } from 'umi-plugin-react/locale';
  4. import styles from '../../style/GoodsList.less';
  5. import apis from '../../../services/apis';
  6. import moment from 'moment';
  7. import router from 'umi/router';
  8. import BuildSelect from '../../../components/SelectButton/BuildSelect'
  9. import XForm, { FieldTypes } from '../../../components/XForm';
  10. import Wangedit from '../../../components/Wangedit/Wangedit'
  11. import request from '../../../utils/request'
  12. import yinhao from '../../../assets/yinhao.png'
  13. import ImageUploader from '../../../components/XForm/ImageUpload';
  14. import logo from '../../../assets/logo.png';
  15. import touxiang from '../../../assets/touxiang.jpg';
  16. import poster1 from '../../../assets/poster1.png';
  17. import poster2 from '../../../assets/poster2.png';
  18. import xiaochengxu from '../../../assets/xiaochengxu.png'
  19. const { MonthPicker, RangePicker, WeekPicker } = DatePicker;
  20. const { TextArea } = Input;
  21. const header = props => {
  22. const [isEnlist, setIsEnlist] = useState(1)
  23. const radioOnChange = e => {
  24. // console.log(e.target.value)
  25. setIsEnlist(e.target.value)
  26. }
  27. // eslint-disable-next-line react-hooks/rules-of-hooks
  28. const [data, setData] = useState({ channelNmae: [], result: [] })
  29. // eslint-disable-next-line react-hooks/rules-of-hooks
  30. const { helpActivityId } = props
  31. const [dynamicData, setDynamicData] = useState({ isEnlist: 1 })
  32. // 详情
  33. const getDynamicData = helpActivityId => {
  34. request({ ...apis.helpActivity.details, params: { helpActivityId } }).then((data) => {
  35. data.activityTime = [moment(data.startDate), moment(data.endDate)]
  36. const num = data.helpNum > 0 ? 1 : 0
  37. setIsEnlist(num)
  38. data.isEnlist = num
  39. props.form.setFieldsValue(data)
  40. setDynamicData(data)
  41. })
  42. }
  43. // eslint-disable-next-line react-hooks/rules-of-hooks
  44. useEffect(() => {
  45. // eslint-disable-next-line no-use-before-define
  46. if (helpActivityId) {
  47. getDynamicData(helpActivityId)
  48. }
  49. }, [])
  50. // function addChannel(params) {
  51. // request({ ...apis.channelList.addChannel, data: { ...params } }).then((data) => {
  52. // setData(data)
  53. // }).catch((err) => {
  54. // console.log(err)
  55. // message.info(err.msg || err.message)
  56. // })
  57. // }
  58. const cancelPage = () => {
  59. router.push({
  60. pathname: '/activity/helpActivity/list',
  61. });
  62. }
  63. function handleSubmit(e) {
  64. e.preventDefault();
  65. props.form.validateFields((err, values) => {
  66. if (!err) {
  67. if (values.isEnlist === 0) {
  68. values.helpNum = 0
  69. }
  70. // 判断助力人数不得超过200
  71. if (values.personNum > 200) {
  72. message.error('助力邀请人数不能超过200')
  73. return
  74. }
  75. // 助力邀请人数>0
  76. if (values.personNum <= 0) {
  77. message.error('助力邀请人数大于0')
  78. return
  79. }
  80. // 判断助力人数必须大于0
  81. if (values.isEnlist === 1) {
  82. if (values.helpNum <= 0) {
  83. message.error('限制助力次数必须大于0')
  84. return
  85. }
  86. }
  87. const { activityTime, signupTime, ...submitValue } = values
  88. const [startDate, endDate] = activityTime
  89. console.log('startDate', activityTime)
  90. submitValue.startDate = moment(startDate).format('YYYY-MM-DD HH:mm:ss');
  91. submitValue.endDate = moment(endDate).format('YYYY-MM-DD HH:mm:ss');
  92. // const [enlistStart, enlistEnd] = signupTime
  93. // submitValue.enlistStart = moment(enlistStart).format('YYYY-MM-DD HH:mm');
  94. // submitValue.enlistEnd = moment(enlistEnd).format('YYYY-MM-DD HH:mm');
  95. console.log('submit data --->', submitValue)
  96. if (helpActivityId) {
  97. submitValue.helpActivityId = helpActivityId
  98. request({ ...apis.helpActivity.update, data: submitValue }).then((data) => {
  99. message.info("保存成功")
  100. cancelPage()
  101. }).catch((err) => {
  102. message.info(err.msg || err.message)
  103. })
  104. } else {
  105. request({ ...apis.helpActivity.add, data: submitValue }).then((data) => {
  106. message.info("保存成功")
  107. cancelPage()
  108. }).catch((err) => {
  109. message.info(err.msg || err.message)
  110. })
  111. }
  112. }
  113. });
  114. }
  115. const { getFieldDecorator } = props.form;
  116. return (
  117. <>
  118. <Form labelCol={{ span: 7 }} wrapperCol={{ span: 12 }} onSubmit={handleSubmit}>
  119. <Form.Item label="所属项目">
  120. {getFieldDecorator('buildingId', {
  121. rules: [
  122. {
  123. required: true,
  124. message: '请选择所属项目',
  125. },
  126. ],
  127. })(<BuildSelect />)}
  128. </Form.Item>
  129. <Form.Item label="活动标题">
  130. {getFieldDecorator('title', {
  131. rules: [
  132. {
  133. required: true,
  134. message: '请输入活动标题',
  135. },
  136. ],
  137. })(<Input />)}
  138. </Form.Item>
  139. <Form.Item label="活动主图" help="建议尺寸375*312px">
  140. {getFieldDecorator('img', {
  141. rules: [
  142. {
  143. required: true,
  144. message: '活动主图不能为空',
  145. },
  146. ],
  147. })(<ImageUploader />)}
  148. </Form.Item>
  149. <Form.Item label="活动时间">
  150. {getFieldDecorator('activityTime', {
  151. rules: [
  152. {
  153. required: true,
  154. message: '请选择活动时间',
  155. },
  156. ],
  157. })(<RangePicker format="YYYY-MM-DD HH:mm:ss" showTime={{ format: 'HH:mm:ss' }}/>)}
  158. </Form.Item>
  159. <Form.Item label="助力邀请人数" min={1} max={10}>
  160. {getFieldDecorator('personNum', {
  161. rules: [
  162. {
  163. required: true,
  164. message: '请输入活动人数',
  165. },
  166. ],
  167. })(<Input type="number" />)}
  168. </Form.Item>
  169. <Form.Item label="助力次数">
  170. {getFieldDecorator('isEnlist', {
  171. rules: [
  172. {
  173. required: true,
  174. message: '请选择助力次数',
  175. },
  176. ],
  177. })(
  178. <Radio.Group onChange={(e) => radioOnChange(e)}>
  179. <Radio value={0}>不限制</Radio>
  180. <Radio value={1}>限制</Radio>
  181. </Radio.Group>,
  182. )}
  183. </Form.Item>
  184. {
  185. isEnlist === 1 && <Form.Item label=" " min={1} max={10}>
  186. {getFieldDecorator('helpNum', {
  187. rules: [
  188. {
  189. required: true,
  190. message: '请输入助力人数',
  191. },
  192. ],
  193. })(<Input type="number" placeholder="助力人数限制"/>)}
  194. </Form.Item>
  195. }
  196. <Form.Item label="活动说明" help="建议宽度:335px,高度不限">
  197. {getFieldDecorator('activityInstructions', {
  198. rules: [
  199. {
  200. required: true,
  201. message: '活动说明不能为空',
  202. },
  203. ],
  204. })(<ImageUploader />)}
  205. </Form.Item>
  206. <Form.Item wrapperCol={{ span: 12, offset: 8 }}>
  207. <Button type="primary" htmlType="submit">
  208. 确认
  209. </Button>
  210. &nbsp;&nbsp;&nbsp;&nbsp;
  211. <Button onClick={() => router.go(-1)}>
  212. 取消
  213. </Button>
  214. </Form.Item>
  215. </Form>
  216. </>
  217. )
  218. }
  219. const Basic = Form.create({ name: 'header' })(header);
  220. /**
  221. *
  222. *
  223. * @param {*} props
  224. * @returns
  225. */
  226. const Edit = props => {
  227. const [tab, changeTab] = useState('basic')
  228. // 判断是否展示助力次数的输入框
  229. // const [help, helpTab] = useState('1')
  230. const { helpActivityId } = props.location.query
  231. const [dynamicData, setDynamicData] = useState({ isEnlist: 1 })
  232. if (helpActivityId) {
  233. // eslint-disable-next-line react-hooks/rules-of-hooks
  234. useEffect(() => {
  235. // eslint-disable-next-line no-use-before-define
  236. getDynamicData(helpActivityId);
  237. }, [])
  238. // 详情
  239. const getDynamicData = (helpActivityId) => {
  240. request({ ...apis.helpActivity.details, params: { helpActivityId } }).then((data) => {
  241. console.log(data)
  242. setDynamicData(data)
  243. })
  244. }
  245. }
  246. const cancelPage = () => {
  247. router.push({
  248. pathname: '/activity/helpActivity/list',
  249. });
  250. }
  251. const radioOnChange = e => {
  252. console.log(e.target.value)
  253. setDynamicData({ ...dynamicData, isEnlist: e.target.value })
  254. }
  255. const Poster = (props) => {
  256. const [inputValue, changeInput] = useState('')
  257. const [textAreaValue, changeTextArea] = useState('')
  258. const [imgValue, changeImg] = useState('')
  259. const [posterId, setPosterId] = useState('')
  260. if (helpActivityId) {
  261. console.log(helpActivityId, 'helpActivityId')
  262. useEffect(() => {
  263. request({ ...apis.activity.poster, params: { targetId: helpActivityId, targetType: 'helpActivity' } }).then((data) => {
  264. console.log(data, "2222")
  265. if (data.length > 0) {
  266. setPosterId(data[0].posterId)
  267. changeImg(data[0].posterImg)
  268. changeTextArea(data[0].posterDescription)
  269. changeInput(data[0].posterTitle)
  270. }
  271. }).catch((err) => {
  272. message.info(err.msg || err.message)
  273. })
  274. getMiniappName()
  275. }, [])
  276. }else{
  277. getMiniappName()
  278. }
  279. // 获取小程序名称
  280. const [miniappName, setMiniappName] = useState('')
  281. function getMiniappName() {
  282. request({ ...apis.building.getMiniappName }).then(res => {
  283. console.log(res, "0000000000000")
  284. setMiniappName(res)
  285. })
  286. }
  287. const submitPoster = () => {
  288. if (helpActivityId) {
  289. if (posterId) {
  290. request({ ...apis.activity.updatePoster, urlData: { id: posterId }, data: { targetId: helpActivityId, targetType: 'helpActivity', posterImg: imgValue, posterTitle: inputValue, posterDescription: textAreaValue }, }).then((data) => {
  291. message.info("保存成功")
  292. }).catch((err) => {
  293. message.info(err.msg || err.message)
  294. })
  295. } else {
  296. request({ ...apis.activity.addPoster, data: { targetId: helpActivityId, targetType: 'helpActivity', posterImg: imgValue, posterTitle: inputValue, posterDescription: textAreaValue }, }).then((data) => {
  297. setPosterId(data.posterId)
  298. message.info("保存成功")
  299. }).catch((err) => {
  300. message.info(err.msg || err.message)
  301. })
  302. }
  303. } else {
  304. message.warn("请先保存基本信息数据")
  305. }
  306. }
  307. return <div>
  308. <div style={{ display: 'flex' }}>
  309. <div style={{ width: '420px', height: '900px', display: 'inline-block', marginTop: '30px' }}>
  310. <div style={{ width: '375px', height: '700px', backgroundColor: '#fff', boxShadow: '0px 0px 16px 6px rgba(0,0,0,0.15)', position: 'relative', margin: '0 auto' }}>
  311. <img style={{ width: '100%', height: '300px' }} src={imgValue ? imgValue : poster1} alt="" />
  312. <div style={{ display: 'flex', alignItems: 'center', marginTop: '-24px' }}>
  313. <img style={{ width: '70px', height: '70px', border: '4px solid #fff', borderRadius: '35px', marginLeft: '16px' }} src={touxiang} alt="" />
  314. <span style={{ color: '#222', fontWeight: '600', margin: '24px 10px 0 14px', fontSize: '17px' }}>喵喵</span>
  315. <span style={{ color: '#999', marginTop: '25px', fontSize: '17px' }}>邀您参与</span>
  316. <span style={{ color: '#999', margin: '25px 0 0 60px', fontSize: '17px' }}>2019.09.21</span>
  317. </div>
  318. <p style={{
  319. margin: '10px 20px', fontSize: '20px', color: '#222', fontWeight: '600',
  320. display: '-webkit-box', lineClamp: '3', height: '60px',
  321. WebkitLineClamp: '2',
  322. WebkitBoxOrient: 'vertical',
  323. overflow: 'hidden',
  324. textOverflow: 'ellipsis'
  325. }}>{inputValue ? inputValue : '海报标题'}</p>
  326. <img src={yinhao} style={{ width: '30px', marginLeft: '20px' }} alt="" />
  327. <p style={{
  328. margin: '16px 20px 28px 20px', fontSize: '17px', color: '#999',
  329. display: '-webkit-box', lineClamp: '3', height: '72px',
  330. WebkitLineClamp: '3',
  331. WebkitBoxOrient: 'vertical',
  332. overflow: 'hidden',
  333. textOverflow: 'ellipsis'
  334. }}>{textAreaValue ? textAreaValue : '海报描述'}</p>
  335. <div style={{ backgroundColor: '#f1f1f1', padding: '22px 30px', boxShadow: '0px 6px 12px -4px #dcdcdc', position: 'relative' }}>
  336. <p style={{ margin: '0', fontSize: '18px', color: '#888' }}>长按识别小程序码</p>
  337. <p style={{ margin: '0', fontSize: '18px', color: '#888' }}>进入<span style={{ margin: '0 5px', fontSize: '18px', color: '#333', fontWeight: '600' }}>{miniappName || '置业V顾问'}</span>报名活动</p>
  338. <img style={{ width: '80px', position: 'absolute', right: '30px', top: '10px' }} src={xiaochengxu} alt="" />
  339. </div>
  340. </div>
  341. <p style={{ textAlign: 'center', fontSize: '19px', color: '#666', marginTop: '30px' }}>海报模板</p>
  342. </div>
  343. <div >
  344. <div style={{ display: 'flex', width: '100%', margin: '60px 0' }}>
  345. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>海报图片</p>
  346. <ImageUploader value={imgValue} onChange={e => changeImg(e)} />
  347. </div>
  348. <div style={{ display: 'flex', alignItems: 'center', width: '100%', marginBottom: '60px' }}>
  349. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>海报标题</p>
  350. <Input style={{ width: '20vw' }} value={inputValue} placeholder="请输入海报标题" onChange={e => changeInput(e.target.value)} />
  351. </div>
  352. <div style={{ display: 'flex', margin: '10px 0 40px 0', width: '100%' }}>
  353. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>海报描述</p>
  354. <TextArea rows={5} value={textAreaValue} onChange={e => changeTextArea(e.target.value)} />
  355. </div>
  356. </div>
  357. </div>
  358. <Button type="primary" onClick={submitPoster} style={{ margin: '40px 40px 40px 30vw' }}> 确定</Button>
  359. <Button onClick={() => router.go(-1)}>取消</Button>
  360. </div>
  361. }
  362. const Share = (props) => {
  363. const [inputValue, changeInput] = useState('')
  364. const [imgValue, changeImg] = useState('')
  365. const [shareContentId, setShareContentId] = useState('')
  366. if (helpActivityId) {
  367. useEffect(() => {
  368. request({ ...apis.activity.shareContent, params: { targetId: helpActivityId, targetType: 'helpActivity' }, }).then((data) => {
  369. console.log(data, "2222")
  370. if (data.length > 0) {
  371. setShareContentId(data[0].shareContentId)
  372. changeImg(data[0].shareContentImg)
  373. changeInput(data[0].shareContentTitle)
  374. }
  375. }).catch((err) => {
  376. message.info(err.msg || err.message)
  377. })
  378. }, [])
  379. }
  380. const submitShare = () => {
  381. if (helpActivityId) {
  382. if (shareContentId) {
  383. request({ ...apis.activity.updateShareContent, urlData: { id: shareContentId }, data: { targetId: helpActivityId, shareContentType: 'helpActivity', shareContentImg: imgValue, shareContentTitle: inputValue }, }).then((data) => {
  384. message.info("保存成功")
  385. }).catch((err) => {
  386. message.info(err.msg || err.message)
  387. })
  388. } else {
  389. request({ ...apis.activity.addShareContent, data: { targetId: helpActivityId, shareContentType: 'helpActivity', shareContentImg: imgValue, shareContentTitle: inputValue }, }).then((data) => {
  390. setShareContentId(data.shareContentId)
  391. message.info("保存成功")
  392. }).catch((err) => {
  393. message.info(err.msg || err.message)
  394. })
  395. }
  396. } else {
  397. message.warn("请先保存基本信息数据")
  398. }
  399. }
  400. return <div style={{ padding: '20px' }}>
  401. <div style={{ display: 'flex', margin: '10px 0 40px 0', width: '100%' }}>
  402. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>分享模板</p>
  403. <div>
  404. <p style={{ display: 'flex', alignItems: 'center', fontSize: '14px', color: '#999', margin: '0', lineHeight: '0' }}><img src={logo} style={{ width: '22px', marginRight: '10px' }} />知与行互动</p>
  405. <p style={{ fontSize: '16px', color: '#222', fontWeight: '600', margin: '0' }}>{inputValue ? inputValue : '置业V客厅 精准获客平台'}</p>
  406. <img style={{ width: '200px', height: '140px' }} src={imgValue ? imgValue : poster2} alt="" />
  407. </div>
  408. </div>
  409. <div style={{ display: 'flex', alignItems: 'center', width: '100%' }}>
  410. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>分享标题</p>
  411. <Input placeholder="请输入分享标题" value={inputValue} onChange={e => changeInput(e.target.value)} />
  412. </div>
  413. <div style={{ display: 'flex', width: '100%', marginTop: '40px' }}>
  414. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>分享图片</p>
  415. <ImageUploader value={imgValue} onChange={e => changeImg(e)} />
  416. </div>
  417. <p style={{ fontSize: '0.5vw', color: '#A9A9A9', marginLeft: '250px' }}>图片比例: 5:4</p>
  418. <Button type="primary" htmlType="submit" onClick={submitShare} style={{ margin: '40px 40px 40px 220px' }}> 确定</Button>
  419. <Button onClick={() => router.go(-1)}>取消</Button>
  420. </div>
  421. }
  422. return (
  423. <div>
  424. <div>
  425. <Radio.Group value={tab} buttonStyle="solid" onChange={e => changeTab(e.target.value)}>
  426. <Radio.Button value="basic">基本信息</Radio.Button>
  427. <Radio.Button value="poster">海报图片</Radio.Button>
  428. <Radio.Button value="share">分享设置</Radio.Button>
  429. </Radio.Group>
  430. </div>
  431. <div>
  432. {tab === 'basic' && <Basic helpActivityId={helpActivityId}/>}
  433. {tab === 'poster' && <Poster />}
  434. {tab === 'share' && <Share />}
  435. </div>
  436. </div>
  437. );
  438. }
  439. export default Edit