import React, { useEffect, useState, useMemo } from 'react'; import { Form, Select, Checkbox, Input, Row, Col, Switch, Tooltip } from 'antd'; import { get, has } from 'lodash'; import { PlusCircleOutlined, MinusCircleOutlined, QuestionCircleOutlined, } from '@ant-design/icons'; import FormModal, { FormModalProps } from '../form-modal'; import { CONDITIONS, RANGES, NOTICE_TYPES_ARRAY, getRangesByCategory, } from '../../config'; import { NoticeTypes, Ranges, Conditions, NewNoticeRuleItem, NoticeRuleItem, MultiLevel, } from '../../services/notice-rules/type'; import styles from './index.less'; import { telephoneRegexp } from '@/utils/regexp'; import { checkNickname } from '@/utils/utils'; import TransformTime from '../transform-time'; import { Category } from '../../types'; import useRoleList from './hooks/use-role-list'; import TransformField from '../transform-field'; const getOptimalValue = (min: number, max: number, value: number): number => { if (value >= min && value <= max) { if (value - min > max - value) { return max; } else { return min; } } if (value > max) { return max; } if (value < min) { return min; } return min; }; const layout = { labelCol: { span: 4 }, wrapperCol: { span: 18 }, }; export interface LevelModalProps extends FormModalProps { category?: Category; timeList?: any; data: NewNoticeRuleItem | NoticeRuleItem; onChange?: (value: NewNoticeRuleItem | NoticeRuleItem) => void; } const { Item } = Form; const LevelModal: React.FC = props => { const { timeList, data = { multilevel: 1 }, onCancel, visible, onChange, category = Category.GROUP_DEFENSE, ...rest } = props; const [rangesRequired, setRangesRequired] = useState(() => { return !get(data, 'contactsSwitch', false); }); const [timeValue, setTimeValue] = useState(0); const [second, setSecond] = useState(0); const roleListResult = useRoleList(); const [form] = Form.useForm(); useEffect(() => { setRangesRequired(!get(data, 'contactsSwitch', false)); }, [get(data, 'contactsSwitch', false)]); useEffect(() => { form.validateFields(['ranges']); }, [rangesRequired]); useEffect(() => { form.validateFields(['time']); }, [timeValue]); useEffect(() => { form.validateFields(['time']); }, [second]); useEffect(() => { form.resetFields(); visible && form.setFieldsValue(data); }, [data, visible]); // 失去焦点填充数据 const handleBlur = (multilevel: MultiLevel) => { if (multilevel > 1) { // 填充值 timeValue && form.setFieldsValue({ time: timeValue }); // 清除值 setTimeValue(0); } else { // 填充值 second && form.setFieldsValue({ time: second }); // 清除值 setSecond(0); } }; // 渲染通知条件 const renderConditions = useMemo(() => { if ( [ Category.CAMERA_CAPTURE_GB_THERMAL_CAMERA, Category.ILLEGAL_CONSTRUCTION, Category.WEATHER_DISASTER, Category.ILLEGAL_WORK_ON_RIVER, Category.JIN_SHU_JU, ].includes(category) ) { return ( item.value === Conditions.EVENT_NOT_ON_PROCESS, )} > ); } else { if (data.multilevel === 1) { return ( item.value == Conditions.DEVICE_NOT_RECOVERY, )} > ); } else { return ( item.value !== Conditions.DEVICE_ALARM_CREATE, )} > ); } } }, [data, category, Conditions, CONDITIONS]); return (
{ if (has(changeValue, 'contactsSwitch')) { setRangesRequired(!changeValue?.contactsSwitch); } }, ...layout, }} onSubmit={form => { form.validateFields().then((values: NewNoticeRuleItem) => { // 自定义联系人 加入 if (values.contactsSwitch) { values?.ranges?.push(Ranges.CUSTOM_CONTACTS); } else { // 空数组 values.contacts = []; } values.noticeTypes = values.noticeTypes?.sort(); delete values.contactsSwitch; onChange && onChange({ ...data, ...values }); }); }} >
{data.multilevel === 1 ? (
预警发生后 ({ validator(rule, value) { if (value <= 15 && value >= 0) { setSecond(0); return Promise.resolve(); } setSecond(getOptimalValue(1, 15, value)); return Promise.reject('输入范围 0 - 15 秒'); }, }), ]} noStyle > handleBlur(data?.multilevel || 1)} />
) : (
预警发生后 ({ validator(rule, value) { const multilevel = data.multilevel; const nextTime = get( timeList, `${String(Number(multilevel) + 1)}.time`, ); const prevTime = Number(multilevel) - 1 === 1 ? 0 : get( timeList, `${String(Number(multilevel) - 1)}.time`, ); const max = nextTime ? Number(nextTime) - 60 : 6000; const min = prevTime ? Number(prevTime) + 60 : 60; let maxTime = max; let minTime = min; // 最小值 大于 100分钟 说明没有值可以用 if (min > 6000) { setTimeValue(6000); return Promise.reject( `没有可用值,请调整上一级通知时间`, ); } if (value) { if (!Number.isInteger(Number(value))) { return Promise.reject('输入整数数值'); } if (value >= minTime && value <= maxTime) { // 清理 推荐优化的值, 使用用户填写的值 setTimeValue(0); return Promise.resolve(); } else { // 设置最优值 setTimeValue( getOptimalValue(minTime, maxTime, value), ); return Promise.reject( `输入 ${minTime / 60} ~ ${maxTime / 60} 之间的值`, ); } } else { // 设置最优值 setTimeValue( getOptimalValue(minTime, maxTime, value), ); return Promise.reject( `输入 ${minTime / 60} ~ ${maxTime / 60} 之间的值`, ); } }, }), ]} > handleBlur(data?.multilevel || 1)} />
)}
{data.multilevel !== 1 && ( 上一级电话拨打失败时立刻通知 )} {renderConditions} {({ getFieldValue }) => { return getFieldValue('ranges')?.includes( Ranges?.MERCHANT_ROLE_CONTACTS, ) ? ( ) : null; }} 自定义联系人 prevValues.contactsSwitch !== curValues.contactsSwitch } > {({ getFieldValue }) => { return getFieldValue('contactsSwitch') ? ( {(fields, { add, remove }) => { return (
*  姓名 职位 *  电话 {fields.map((field, index) => ( fields.length < 10 && add()} /> 1 ? styles.contactUsable : styles.contactDisabled } onClick={() => fields.length > 1 && remove(field.name) } /> ))}
); }}
) : null; }}
强制通知
); }; export default LevelModal;