settingsStrategy.tsx 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import { App, Button, Card, Form, Input, Modal } from 'antd';
  2. import React, { useEffect, useRef, useState } from 'react';
  3. import '../../../../businessPlan/create/global.less'
  4. import NewSteps from '@/pages/weComTask/components/newSteps';
  5. import { PlusOutlined, MinusCircleOutlined } from '@ant-design/icons';
  6. import SendTimeSet from '@/pages/weComTask/components/sendTimeSet';
  7. import dayjs from 'dayjs';
  8. /**
  9. * 群聊创建策略配置
  10. * @param param0
  11. * @returns
  12. */
  13. const SettingsStrategy: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ visible, onClose, value, onChange }) => {
  14. /************************************/
  15. const { message } = App.useApp()
  16. const ref1 = useRef<HTMLDivElement>(null)
  17. const [form] = Form.useForm();
  18. const strategyList = Form.useWatch('strategyList', form)
  19. const [stepsList, setStepsList] = useState<any>([
  20. // { title: '群聊创建配置', description: '任务名称', id: 'basicInfo' },
  21. { title: '策略配置', children: [{ title: `策略${1}`, id: 'strategy_1' }] },
  22. { title: '完成' }
  23. ])
  24. /************************************/
  25. // 回填
  26. useEffect(() => {
  27. if (value && Object.keys(value).length) {
  28. const data = {
  29. ...value, strategyList: value?.strategyList?.map(item => {
  30. const { sendTime, startTime, endTime, sendDay, timeRepeatType } = item
  31. if (timeRepeatType === 'TIME_TYPE_SINGLE_PLACE') {
  32. const data = {
  33. ...item,
  34. timeRepeatType,
  35. sendDay: sendDay ? dayjs(sendDay + ' ' + sendTime) : undefined
  36. }
  37. delete data?.sendTime
  38. return data
  39. }
  40. return {
  41. ...item,
  42. timeRepeatType,
  43. sendTime: sendTime ? dayjs('2025-04-25 ' + sendTime) : undefined,
  44. startTime: startTime ? dayjs(startTime) : undefined,
  45. endTime: endTime ? dayjs(endTime) : undefined,
  46. sendDay: sendDay ? dayjs(sendDay) : undefined
  47. }
  48. })
  49. }
  50. console.log('=================>', data)
  51. filedUpdateChange(data)
  52. form.setFieldsValue(data)
  53. }
  54. }, [value])
  55. const handleOk = () => {
  56. form.validateFields().then((values) => {
  57. const data = {
  58. ...values,
  59. strategyList: values?.strategyList?.map(item => {
  60. const { startTime, endTime, sendDay, sendTime, timeRepeatType, repeatArray, ...rest } = item
  61. const data = { ...rest, timeRepeatType }
  62. if (timeRepeatType === 'TIME_TYPE_SINGLE_PLACE') {
  63. // 定时发送
  64. data.sendDay = dayjs(sendDay).format('YYYY-MM-DD')
  65. data.sendTime = dayjs(sendDay).format('HH:mm:ss')
  66. } else if (timeRepeatType === 'TIME_TYPE_REPEAT_DAY') {
  67. // 每日循环
  68. data.startTime = dayjs(startTime).format('YYYY-MM-DD')
  69. if (endTime) {
  70. data.endTime = dayjs(endTime).format('YYYY-MM-DD')
  71. }
  72. data.sendTime = dayjs(sendTime).format('HH:mm:ss')
  73. } else if (timeRepeatType === 'TIME_TYPE_REPEAT_WEEK' || timeRepeatType === 'TIME_TYPE_REPEAT_MONTH') {
  74. // 每周循环、每月循环
  75. data.startTime = dayjs(startTime).format('YYYY-MM-DD')
  76. data.sendTime = dayjs(sendTime).format('HH:mm:ss')
  77. if (endTime) {
  78. data.endTime = dayjs(endTime).format('YYYY-MM-DD')
  79. }
  80. data.repeatArray = repeatArray
  81. }
  82. return data
  83. })
  84. }
  85. onChange(data)
  86. }).catch(() => {
  87. form.submit()
  88. });
  89. };
  90. const filedUpdateChange = ({ strategyList }: any) => {
  91. const strategyChildren = strategyList?.map((item, index) => {
  92. const { strategyName, timeRepeatType, sendDay, startTime, sendTime, repeatArray } = item
  93. const sendTimeChecked =
  94. timeRepeatType === "TIME_TYPE_SINGLE_TIMELY" ||
  95. (timeRepeatType === "TIME_TYPE_SINGLE_PLACE" && sendDay) ||
  96. (timeRepeatType === "TIME_TYPE_REPEAT_DAY" && startTime && sendTime) ||
  97. ((timeRepeatType === "TIME_TYPE_REPEAT_WEEK" || timeRepeatType === "TIME_TYPE_REPEAT_MONTH") && startTime && sendTime && repeatArray)
  98. return { title: `策略${index + 1}`, description: `策略名称、执行时间`, id: `strategy_${index + 1}`, checked: sendTimeChecked && strategyName }
  99. })
  100. const stepsData = [
  101. { title: '策略配置', children: strategyChildren, checked: strategyChildren.some(item => item.checked) },
  102. {
  103. title: '完成', checked: strategyChildren.some(item => item.checked)
  104. }
  105. ]
  106. setStepsList(stepsData)
  107. }
  108. return <Modal
  109. title={<strong>群聊创建策略配置 &nbsp;&nbsp;&nbsp;<span style={{ color: 'red' }}>对于执行时间冲突的策略,按照策略的排序执行</span></strong>}
  110. open={visible}
  111. onCancel={onClose}
  112. width={850}
  113. onOk={handleOk}
  114. className={`settingsModal`}
  115. >
  116. <div className={`body_steps`}>
  117. <NewSteps
  118. items={stepsList}
  119. onChange={(e) => {
  120. if (e?.id)
  121. ref1.current?.querySelector('#' + e?.id)?.scrollIntoView({ behavior: 'smooth' })
  122. }}
  123. />
  124. </div>
  125. <div className={`body_content`} ref={ref1}>
  126. <Form
  127. form={form}
  128. name="newGroupChatStrategy"
  129. labelAlign='left'
  130. labelCol={{ span: 5 }}
  131. colon={false}
  132. scrollToFirstError={{
  133. behavior: 'smooth',
  134. block: 'center'
  135. }}
  136. onFinishFailed={({ errorFields }) => {
  137. message.error(errorFields?.[0]?.errors?.[0])
  138. }}
  139. onFinish={handleOk}
  140. initialValues={{
  141. strategyList: [{ id: Date.now() }]
  142. }}
  143. onFieldsChange={() => {
  144. filedUpdateChange(form.getFieldsValue())
  145. }}
  146. preserve={true}
  147. >
  148. <Form.List name="strategyList">
  149. {(fields, { add, remove }) => (
  150. <>
  151. {fields.map(({ key, name, ...restField }, index) => {
  152. const timeRepeatType = strategyList?.[index]?.timeRepeatType
  153. return <Card
  154. key={key}
  155. title={<strong>策略{index + 1} 配置</strong>}
  156. style={{ background: '#fff', marginBottom: 10 }}
  157. extra={strategyList?.length > 1 && <div style={{ color: 'red', cursor: 'pointer' }} onClick={() => remove(name)}>
  158. <MinusCircleOutlined />
  159. </div>}
  160. id={`strategy_${index + 1}`}
  161. >
  162. <Form.Item
  163. {...restField}
  164. name={[name, 'strategyName']}
  165. label={<strong>策略名称</strong>}
  166. rules={[{ required: true, message: '请输入策略名称!' }]}
  167. >
  168. <Input placeholder='请输入策略名称' allowClear style={{ width: 358 }} />
  169. </Form.Item>
  170. <SendTimeSet active='all' form={form} restField={restField} name={name} timeRepeatType={timeRepeatType} />
  171. </Card>
  172. })}
  173. <Form.Item>
  174. <Button type="dashed" onClick={() => add({ id: Date.now() })} block icon={<PlusOutlined />}>
  175. 新增策略
  176. </Button>
  177. </Form.Item>
  178. </>
  179. )}
  180. </Form.List>
  181. </Form>
  182. </div>
  183. </Modal>
  184. };
  185. export default React.memo(SettingsStrategy);