addEdit.tsx 8.8 KB

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