settingsUserlnherit.tsx 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. import NewSteps from '@/pages/weComTask/components/newSteps';
  2. import { App, Button, Card, Form, Input, Modal, Radio } from 'antd';
  3. import React, { useEffect, useRef, useState } from 'react';
  4. import '../../global.less';
  5. import SendTimeSet from '@/pages/weComTask/components/sendTimeSet';
  6. import { PlusOutlined, DeleteOutlined } from '@ant-design/icons';
  7. import style from '../massSending/index.less'
  8. import FilterUser from '@/pages/weComTask/components/filterUser';
  9. import dayjs from 'dayjs';
  10. /**
  11. * 客户继承
  12. * @param param0
  13. * @returns
  14. */
  15. const SettingsUserInherit: React.FC<TASK_CREATE.UserInheritProps<any>> = ({ value, visible, onClose, onChange }) => {
  16. /***************************************************/
  17. const ref1 = useRef<HTMLDivElement>(null)
  18. const { message } = App.useApp()
  19. const [form] = Form.useForm();
  20. const schedulingStrategyDTO = Form.useWatch('schedulingStrategyDTO', form)
  21. const [stepsList, setStepsList] = useState<any>([
  22. { title: '客户继承配置', description: '标题', id: 'basicInfo' },
  23. {
  24. title: '策略1', d: `strategy_0`, children: [
  25. { title: '发送时间', id: `strategy_0_sendTime` },
  26. {
  27. title: '继承转移1', id: `strategy_0_0_inheritDto`, children: [
  28. { title: '智能标签', id: `strategy_0_0_inheritDto_sendMsgTag` },
  29. { title: '转移对象', id: `strategy_0_0_inheritDto_object`, description: '对象筛选,人群包,文本消息' }
  30. ]
  31. },
  32. { title: '完成' }
  33. ]
  34. },
  35. { title: '完成' }
  36. ])
  37. /***************************************************/
  38. // 回填
  39. useEffect(() => {
  40. if (value && Object.keys(value).length) {
  41. const data = {
  42. ...value, schedulingStrategyDTO: value?.schedulingStrategyDTO?.map(item => {
  43. const { sendTime, startTime, endTime, sendDay, timeRepeatType } = item
  44. if (timeRepeatType === 'TIME_TYPE_SINGLE_PLACE') {
  45. const data = {
  46. ...item,
  47. timeRepeatType,
  48. sendDay: sendDay ? dayjs(sendDay + ' ' + sendTime) : undefined
  49. }
  50. delete data?.sendTime
  51. return data
  52. }
  53. return {
  54. ...item,
  55. timeRepeatType,
  56. sendTime: sendTime ? dayjs('2025-04-25 ' + sendTime) : undefined,
  57. startTime: startTime ? dayjs(startTime) : undefined,
  58. endTime: endTime ? dayjs(endTime) : undefined,
  59. sendDay: sendDay ? dayjs(sendDay) : undefined
  60. }
  61. })
  62. }
  63. filedUpdateChange(data)
  64. form.setFieldsValue(data)
  65. }
  66. }, [value])
  67. const handleOk = () => {
  68. form.validateFields().then((values) => {
  69. const data = {
  70. ...values,
  71. schedulingStrategyDTO: values?.schedulingStrategyDTO?.map(item => {
  72. const { startTime, endTime, sendDay, sendTime, timeRepeatType, repeatArray, ...rest } = item
  73. const data = { ...rest, timeRepeatType }
  74. if (timeRepeatType === 'TIME_TYPE_SINGLE_PLACE') {
  75. // 定时发送
  76. data.sendDay = dayjs(sendDay).format('YYYY-MM-DD')
  77. data.sendTime = dayjs(sendDay).format('HH:mm:ss')
  78. } else if (timeRepeatType === 'TIME_TYPE_REPEAT_DAY') {
  79. // 每日循环
  80. data.startTime = dayjs(startTime).format('YYYY-MM-DD')
  81. if (endTime) {
  82. data.endTime = dayjs(endTime).format('YYYY-MM-DD')
  83. }
  84. data.sendTime = dayjs(sendTime).format('HH:mm:ss')
  85. } else if (timeRepeatType === 'TIME_TYPE_REPEAT_WEEK' || timeRepeatType === 'TIME_TYPE_REPEAT_MONTH') {
  86. // 每周循环、每月循环
  87. data.startTime = dayjs(startTime).format('YYYY-MM-DD')
  88. data.sendTime = dayjs(sendTime).format('HH:mm:ss')
  89. if (endTime) {
  90. data.endTime = dayjs(endTime).format('YYYY-MM-DD')
  91. }
  92. data.repeatArray = repeatArray
  93. }
  94. return data
  95. })
  96. }
  97. console.log(values)
  98. onChange(data)
  99. }).catch(() => {
  100. form.submit()
  101. });
  102. };
  103. const filedUpdateChange = ({ taskName, schedulingStrategyDTO }: any) => {
  104. const content = schedulingStrategyDTO?.map((item, index) => {
  105. const { timeRepeatType, sendDay, startTime, sendTime, repeatArray, inheritDto } = item
  106. const sendTimeChecked =
  107. timeRepeatType === "TIME_TYPE_SINGLE_TIMELY" ||
  108. (timeRepeatType === "TIME_TYPE_SINGLE_PLACE" && sendDay) ||
  109. (timeRepeatType === "TIME_TYPE_REPEAT_DAY" && startTime && sendTime) ||
  110. ((timeRepeatType === "TIME_TYPE_REPEAT_WEEK" || timeRepeatType === "TIME_TYPE_REPEAT_MONTH") && startTime && sendTime && repeatArray)
  111. const contentChildren = inheritDto?.map((ii, ni) => {
  112. const objectChecked = ii?.transferType === 'all' ? true : ii?.transferUserDto && Object.values(ii?.transferUserDto).every(item => item)
  113. return {
  114. title: '继承转移' + (ni + 1),
  115. id: `strategy_${index}_${ni}_inheritDto`,
  116. checked: objectChecked,
  117. children: [
  118. { title: '转移对象', description: '对象筛选,人群包', id: `strategy_${index}_${ni}_inheritDto_object`, checked: objectChecked }
  119. ]
  120. }
  121. })
  122. return {
  123. title: `策略${index + 1}`,
  124. id: `strategy_${index}`,
  125. checked: sendTimeChecked && contentChildren.every(i => i.checked),
  126. children: [
  127. { title: '发送时间', checked: sendTimeChecked, id: `strategy_${index}_sendTime` },
  128. ...contentChildren,
  129. { title: '完成', checked: sendTimeChecked && contentChildren.every(i => i.checked) }
  130. ]
  131. }
  132. })
  133. const stepsData = [
  134. { title: '客户继承配置', description: '标题', checked: taskName, id: 'basicInfo' },
  135. ...content,
  136. { title: '完成', checked: taskName && content.every(i => i.checked) }
  137. ]
  138. setStepsList(stepsData)
  139. }
  140. return <Modal
  141. title={<strong>客户继承模板配置</strong>}
  142. open={visible}
  143. onCancel={onClose}
  144. width={850}
  145. onOk={handleOk}
  146. className={`settingsModal`}
  147. >
  148. <div className={`body_steps`}>
  149. <NewSteps
  150. items={stepsList}
  151. onChange={(e) => {
  152. if (e?.id)
  153. ref1.current?.querySelector('#' + e?.id)?.scrollIntoView({ behavior: 'smooth' })
  154. }}
  155. />
  156. </div>
  157. <div className={`body_content`} ref={ref1}>
  158. <Form
  159. form={form}
  160. name="newUserInherit"
  161. labelAlign='left'
  162. labelCol={{ span: 5 }}
  163. colon={false}
  164. scrollToFirstError={{
  165. behavior: 'smooth',
  166. block: 'center'
  167. }}
  168. onFinishFailed={({ errorFields }) => {
  169. message.error(errorFields?.[0]?.errors?.[0])
  170. }}
  171. onFinish={handleOk}
  172. initialValues={{
  173. schedulingStrategyDTO: [{ inheritDto: [{ transferType: 'specify' }] }],
  174. }}
  175. onFieldsChange={() => {
  176. filedUpdateChange(form.getFieldsValue())
  177. }}
  178. preserve={true}
  179. >
  180. <Card title={<strong>基础信息配置</strong>} hoverable style={{ background: '#fff', marginBottom: 10 }} id='basicInfo'>
  181. <Form.Item label={<strong>客户继承标题</strong>} name="taskName" rules={[{ required: true, message: '请输入标题!' }]}>
  182. <Input placeholder="请输入标题" style={{ width: 358 }} allowClear />
  183. </Form.Item>
  184. </Card>
  185. <Form.List name="schedulingStrategyDTO">
  186. {(fields, { add, remove }) => (
  187. <>
  188. {fields.map(({ key, name, ...restField }, index) => {
  189. const timeRepeatType = schedulingStrategyDTO?.[index]?.timeRepeatType
  190. const inheritDto = schedulingStrategyDTO?.[index]?.inheritDto
  191. return <Card
  192. key={key}
  193. title={<strong>策略{index + 1}配置</strong>}
  194. style={{ background: '#fff', marginBottom: 10 }}
  195. hoverable
  196. id={`strategy_${index}`}
  197. extra={schedulingStrategyDTO?.length > 1 ? <Button icon={<DeleteOutlined />} type='link' style={{ color: 'red' }} onClick={() => remove(name)}></Button> : null}
  198. >
  199. <div className={style.strategy_item} id={`strategy_${index}_strategyName`}>
  200. <Form.Item
  201. {...restField}
  202. label={<strong>策略名称</strong>}
  203. name={[name, 'strategyName']}
  204. rules={[{ required: false, message: '请输入策略名称!' }]}
  205. >
  206. <Input placeholder="请输入标题" style={{ width: 358 }} allowClear />
  207. </Form.Item>
  208. <div id={`strategy_${index}_sendTime`}>
  209. <SendTimeSet active='all' form={form} restField={restField} name={name} timeRepeatType={timeRepeatType} />
  210. </div>
  211. <Form.List name={[name, 'inheritDto']}>
  212. {(fields, { add, remove }) => (
  213. <>
  214. {fields.map(({ key, name, ...restField }, i) => {
  215. return <Card
  216. key={i}
  217. title={<strong>策略{index + 1} 继承转移{i + 1}</strong>}
  218. extra={inheritDto?.length > 1 ? <Button icon={<DeleteOutlined />} type='link' style={{ color: 'red' }} onClick={() => remove(name)}></Button> : null}
  219. id={`strategy_${index}_${i}_inheritDto`}
  220. style={{ background: '#fff', marginBottom: 10 }}
  221. >
  222. <div id={`strategy_${index}_${i}_inheritDto_object`}>
  223. <Form.Item
  224. label={<strong>转移对象</strong>}
  225. required
  226. >
  227. <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start' }}>
  228. <Form.Item
  229. {...restField}
  230. name={[name, 'transferType']}
  231. rules={[{ required: true, message: '请选择转移对象!' }]}
  232. noStyle
  233. >
  234. <Radio.Group options={[{ label: '全部', value: 'all' }, { label: '指定', value: 'specify' }]} />
  235. </Form.Item>
  236. {inheritDto?.[i]?.transferType === 'specify' && <div style={{ marginTop: 8, width: '100%' }}>
  237. <Form.Item
  238. {...restField}
  239. name={[name, 'transferUserDto']}
  240. rules={[{ required: true, message: '请选择人群包!' }]}
  241. noStyle
  242. >
  243. <FilterUser configType='USER_GROUP' />
  244. </Form.Item>
  245. </div>}
  246. </div>
  247. </Form.Item>
  248. </div>
  249. <Form.Item {...restField} name={[name, 'transferSuccessMsg']} label={<strong>文本消息</strong>} >
  250. <Input.TextArea placeholder={`客户转移成功后发给客户的消息,最多200个字符,不填则使用默认文案`} rows={2} />
  251. </Form.Item>
  252. </Card>
  253. })}
  254. <Form.Item>
  255. <Button type="dashed" onClick={() => add({ transferType: 'specify' })} block icon={<PlusOutlined />}>
  256. 新增继承转移
  257. </Button>
  258. </Form.Item>
  259. </>
  260. )}
  261. </Form.List>
  262. </div>
  263. </Card>
  264. })}
  265. <Form.Item>
  266. <Button type="primary" onClick={() => add({ inheritDto: [{ transferType: 'specify' }] })} block icon={<PlusOutlined />}>
  267. 新增策略组
  268. </Button>
  269. </Form.Item>
  270. </>
  271. )}
  272. </Form.List>
  273. </Form>
  274. </div>
  275. </Modal>
  276. };
  277. export default SettingsUserInherit;