addEdit.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. import { useAjax } from "@/Hook/useAjax"
  2. import { addSysWarningRuleApi, editSysWarningRuleApi } from "@/services/adMonitor/earlyWarning"
  3. import { DeleteOutlined, PlusOutlined } from "@ant-design/icons"
  4. import { Button, Form, Input, InputNumber, message, Modal, Popconfirm, Select, Space, Switch } from "antd"
  5. import React, { useEffect } from "react"
  6. import { MonitorFieldEnum, WarningTypeEnum } from "./config"
  7. import './index.less'
  8. import PriceInput from "./priceInput"
  9. import { OperationType } from "./ruleLog"
  10. interface Props {
  11. visible?: boolean
  12. onClose?: () => void
  13. onChange?: () => void,
  14. initialValues?: any
  15. }
  16. const AddEdit: React.FC<Props> = (props) => {
  17. /******************************/
  18. const { visible, onClose, onChange, initialValues } = props
  19. const [form] = Form.useForm();
  20. const rules = Form.useWatch('rules', form);
  21. const addSysWarningRule = useAjax((params) => addSysWarningRuleApi(params))
  22. const editSysWarningRule = useAjax((params) => editSysWarningRuleApi(params))
  23. /******************************/
  24. useEffect(() => {
  25. if (rules?.some((item: { field: string[] }) => item?.field?.includes('cost_trend_last_three_hour') && !(item?.['cost_trend_last_three_hour']?.value === 1))) {
  26. form.setFieldsValue({ rules: rules.map((item: any) => ({ ...item, cost_trend_last_three_hour: { value: 1, condition: '=' } })) })
  27. }
  28. }, [rules])
  29. const handleOk = () => {
  30. form.validateFields().then(values => {
  31. if (values?.rules) {
  32. let newValues = JSON.parse(JSON.stringify(values))
  33. let { rules, defaultRule, enable, notifyFrequency, ruleName, warningType, unTipWhenStop } = newValues
  34. console.log(rules)
  35. let params = rules?.map((item: any) => {
  36. const { field, operationType, operationValue, ...newItem } = item
  37. let ov = {}
  38. if (operationValue) {
  39. ov = { operationValue }
  40. }
  41. return {
  42. rule: Object.keys(newItem).filter(key => field.includes(key)).map(key => {
  43. return {
  44. ...newItem[key],
  45. field: key
  46. }
  47. }),
  48. operationType,
  49. ...ov
  50. }
  51. })
  52. if (initialValues?.id) {
  53. editSysWarningRule.run({ ruleId: initialValues.id, rules: params, notifyFrequency, ruleName, warningType, defaultRule: defaultRule ? 1 : 0, enable: enable ? 1 : 0, unTipWhenStop }).then(res => {
  54. message.success('修改成功')
  55. onChange?.()
  56. })
  57. } else {
  58. addSysWarningRule.run({ rules: params, notifyFrequency, ruleName, warningType, defaultRule: defaultRule ? 1 : 0, enable: enable ? 1 : 0, unTipWhenStop }).then(res => {
  59. message.success('新增成功')
  60. onChange?.()
  61. })
  62. }
  63. } else {
  64. message.error('请添加最少一项规则')
  65. }
  66. })
  67. }
  68. return <Modal
  69. title={<Space size={2} align='end'>
  70. <strong>{initialValues?.id ? '修改预警规则' : '新增预警规则'}</strong>
  71. <span style={{ fontSize: 12, color: 'red' }}>(条件与条件之间是或者关系,条件内字段是并且关系, 满足任意一条件立即触发报警提醒)</span>
  72. </Space>}
  73. visible={visible}
  74. onOk={handleOk}
  75. width={750}
  76. confirmLoading={addSysWarningRule.loading || editSysWarningRule.loading}
  77. onCancel={() => onClose?.()}
  78. >
  79. <Form
  80. name="dynamic_form_nest_item"
  81. form={form}
  82. className="addEdit_form"
  83. labelCol={{ span: 6 }}
  84. colon={false}
  85. initialValues={initialValues || {
  86. enable: true,
  87. notifyFrequency: 5,
  88. defaultRule: false,
  89. rules: [{
  90. field: []
  91. }],
  92. unTipWhenStop: true
  93. }}
  94. labelAlign="left"
  95. >
  96. <div style={{ padding: '0 4px' }}>
  97. <Form.Item name="ruleName" label={<strong>规则名称</strong>} rules={[{ required: true, message: '请输入规则名称' }]}>
  98. <Input placeholder="规则名称" />
  99. </Form.Item>
  100. <Form.Item name="warningType" label={<strong>告警方式</strong>} rules={[{ required: true, message: '请选择通知频率' }]}>
  101. <Select
  102. mode="multiple"
  103. showSearch
  104. allowClear
  105. placeholder="选择告警方式"
  106. filterOption={(input, option) =>
  107. ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
  108. }
  109. >
  110. {Object.keys(WarningTypeEnum).map((item, index) => <Select.Option value={item} key={index}>{WarningTypeEnum[item]}</Select.Option>)}
  111. </Select>
  112. </Form.Item>
  113. <Form.Item name="notifyFrequency" label={<strong>通知频率</strong>} rules={[{ required: true, message: '请选择通知频率' }]}>
  114. <InputNumber min={5} addonAfter="分钟" />
  115. </Form.Item>
  116. <Form.Item name="enable" label={<strong>Enable?</strong>} valuePropName="checked" rules={[{ required: true }]}>
  117. <Switch />
  118. </Form.Item>
  119. <Form.Item name="defaultRule" label={<strong>是否默认规则</strong>} valuePropName="checked" rules={[{ required: true }]}>
  120. <Switch />
  121. </Form.Item>
  122. <Form.Item name="unTipWhenStop" label={<strong>暂停/删除广告不通知</strong>} valuePropName="checked" rules={[{ required: true }]}>
  123. <Switch />
  124. </Form.Item>
  125. </div>
  126. <Form.List name="rules">
  127. {(fields, { add, remove }) => <>
  128. <>{fields.map(({ key, name, ...restField }) => {
  129. return <div key={key} style={{ width: '100%' }} className="field">
  130. <Space className="field_name">
  131. <span>条件{key + 1}</span>
  132. {fields.length > 1 && <Popconfirm
  133. title="确定删除"
  134. onConfirm={() => remove(name)}
  135. okText="Yes"
  136. cancelText="No"
  137. >
  138. <DeleteOutlined style={{ color: 'red' }} />
  139. </Popconfirm>}
  140. </Space>
  141. <Form.Item
  142. {...restField}
  143. label={<strong>字段</strong>}
  144. name={[name, 'field']}
  145. rules={[{ required: true, message: '请选择字段' }]}
  146. >
  147. <Select
  148. mode="multiple"
  149. showSearch
  150. allowClear
  151. placeholder="选择要设置的字段"
  152. filterOption={(input, option) =>
  153. ((option?.children ?? '') as any).toLowerCase().includes(input.toLowerCase())
  154. }
  155. >
  156. {Object.keys(MonitorFieldEnum).map((item, index) => <Select.Option disabled={rules?.[key]?.['field']?.length >= 3 && !rules?.[key]['field'].includes(item)} value={item} key={index}>{MonitorFieldEnum[item]}</Select.Option>)}
  157. </Select>
  158. </Form.Item>
  159. {rules?.[key]?.['field']?.map((field: string, index: number) => <Form.Item
  160. {...restField}
  161. key={index}
  162. label={<strong>{MonitorFieldEnum[field]}</strong>}
  163. name={[name, field]}
  164. rules={[{
  165. required: true, message: MonitorFieldEnum[field] + '的值不能为0', validator(rule, value, callback) {
  166. if (!value?.value) {
  167. return Promise.reject()
  168. }
  169. return Promise.resolve()
  170. },
  171. }]}
  172. >
  173. <PriceInput disabled={field === 'cost_trend_last_three_hour'} />
  174. </Form.Item>)}
  175. <Form.Item
  176. {...restField}
  177. label={<strong>操作类型</strong>}
  178. name={[name, 'operationType']}
  179. rules={[{ required: true }]}
  180. >
  181. <Select
  182. showSearch
  183. allowClear
  184. placeholder="选择操作类型"
  185. filterOption={(input, option) =>
  186. ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
  187. }
  188. >
  189. {OperationType.map((item, index) => <Select.Option value={item.value} key={item.value}>{item.label}</Select.Option>)}
  190. </Select>
  191. </Form.Item>
  192. {[3, 4].includes(rules?.[key]?.['operationType']) && <Form.Item
  193. {...restField}
  194. label={<strong>操作值</strong>}
  195. name={[name, 'operationValue']}
  196. rules={[{ required: true }]}
  197. >
  198. <InputNumber style={{ width: '100%' }} min={0} placeholder="请输入操作值" />
  199. </Form.Item>}
  200. </div>
  201. })}</>
  202. <Form.Item>
  203. <Button type="dashed" onClick={() => add({
  204. field: []
  205. })} block icon={<PlusOutlined />}>新增条件</Button>
  206. </Form.Item>
  207. </>}
  208. </Form.List>
  209. </Form>
  210. </Modal>
  211. }
  212. export default React.memo(AddEdit)