blob: e4bfc749bf4d88cb3f7583337607c86482c5c142 [file] [log] [blame]
86133aaa3f5d2025-04-20 21:33:29 +08001import React, { useEffect } from 'react';
2import {
3 ProForm,
4 ProFormDigit,
5 ProFormText,
6 ProFormTextArea,
7 ProFormRadio,
8 ProFormSelect,
9 ProFormCaptcha,
10} from '@ant-design/pro-components';
11import { Form, Modal } from 'antd';
12import { useIntl, FormattedMessage } from '@umijs/max';
13import { DictOptionType, DictValueEnumObj } from '@/components/DictTag';
14
15/**
16 * 定时任务调度 Edit Form
17 *
18 * @author whiteshader
19 * @date 2023-02-07
20 */
21
22export type JobFormData = Record<string, unknown> & Partial<API.Monitor.Job>;
23
24export type JobFormProps = {
25 onCancel: (flag?: boolean, formVals?: JobFormData) => void;
26 onSubmit: (values: JobFormData) => Promise<void>;
27 open: boolean;
28 values: Partial<API.Monitor.Job>;
29 jobGroupOptions: DictOptionType[];
30 statusOptions: DictValueEnumObj;
31};
32
33const JobForm: React.FC<JobFormProps> = (props) => {
34 const [form] = Form.useForm();
35 const { jobGroupOptions, statusOptions } = props;
36
37 useEffect(() => {
38 form.resetFields();
39 form.setFieldsValue({
40 jobId: props.values.jobId,
41 jobName: props.values.jobName,
42 jobGroup: props.values.jobGroup,
43 invokeTarget: props.values.invokeTarget,
44 cronExpression: props.values.cronExpression,
45 misfirePolicy: props.values.misfirePolicy,
46 concurrent: props.values.concurrent,
47 status: props.values.status,
48 createBy: props.values.createBy,
49 createTime: props.values.createTime,
50 updateBy: props.values.updateBy,
51 updateTime: props.values.updateTime,
52 remark: props.values.remark,
53 });
54 }, [form, props]);
55
56 const intl = useIntl();
57 const handleOk = () => {
58 form.submit();
59 };
60 const handleCancel = () => {
61 props.onCancel();
62 form.resetFields();
63 };
64 const handleFinish = async (values: Record<string, any>) => {
65 props.onSubmit(values as JobFormData);
66 };
67
68 return (
69 <Modal
70 width={640}
71 title={intl.formatMessage({
72 id: 'monitor.job.title',
73 defaultMessage: '编辑定时任务调度',
74 })}
75 open={props.open}
76 forceRender
77 destroyOnClose
78 onOk={handleOk}
79 onCancel={handleCancel}
80 >
81 <ProForm
82 form={form}
83 grid={true}
84 submitter={false}
85 layout="horizontal"
86 onFinish={handleFinish}>
87 <ProFormDigit
88 name="jobId"
89 label={intl.formatMessage({
90 id: 'monitor.job.job_id',
91 defaultMessage: '任务编号',
92 })}
93 colProps={{ md: 24 }}
94 placeholder="请输入任务编号"
95 disabled
96 hidden={true}
97 rules={[
98 {
99 required: false,
100 message: <FormattedMessage id="请输入任务编号!" defaultMessage="请输入任务编号!" />,
101 },
102 ]}
103 />
104 <ProFormText
105 name="jobName"
106 label={intl.formatMessage({
107 id: 'monitor.job.job_name',
108 defaultMessage: '任务名称',
109 })}
110 colProps={{ md: 24 }}
111 placeholder="请输入任务名称"
112 rules={[
113 {
114 required: false,
115 message: <FormattedMessage id="请输入任务名称!" defaultMessage="请输入任务名称!" />,
116 },
117 ]}
118 />
119 <ProFormSelect
120 name="jobGroup"
121 options={jobGroupOptions}
122 label={intl.formatMessage({
123 id: 'monitor.job.job_group',
124 defaultMessage: '任务组名',
125 })}
126 colProps={{ md: 24 }}
127 placeholder="请输入任务组名"
128 rules={[
129 {
130 required: false,
131 message: <FormattedMessage id="请输入任务组名!" defaultMessage="请输入任务组名!" />,
132 },
133 ]}
134 />
135 <ProFormTextArea
136 name="invokeTarget"
137 label={intl.formatMessage({
138 id: 'monitor.job.invoke_target',
139 defaultMessage: '调用目标字符串',
140 })}
141 colProps={{ md: 24 }}
142 placeholder="请输入调用目标字符串"
143 rules={[
144 {
145 required: true,
146 message: <FormattedMessage id="请输入调用目标字符串!" defaultMessage="请输入调用目标字符串!" />,
147 },
148 ]}
149 />
150 <ProFormCaptcha
151 name="cronExpression"
152 label={intl.formatMessage({
153 id: 'monitor.job.cron_expression',
154 defaultMessage: 'cron执行表达式',
155 })}
156 captchaTextRender={() => "生成表达式"}
157 onGetCaptcha={() => {
158 // form.setFieldValue('cronExpression', '0/20 * * * * ?');
159 return new Promise((resolve, reject) => {
160 reject();
161 });
162 }}
163 />
164 <ProFormRadio.Group
165 name="misfirePolicy"
166 label={intl.formatMessage({
167 id: 'monitor.job.misfire_policy',
168 defaultMessage: '计划执行错误策略',
169 })}
170 colProps={{ md: 24 }}
171 placeholder="请输入计划执行错误策略"
172 valueEnum={{
173 0: '立即执行',
174 1: '执行一次',
175 3: '放弃执行'
176 }}
177 rules={[
178 {
179 required: false,
180 message: <FormattedMessage id="请输入计划执行错误策略!" defaultMessage="请输入计划执行错误策略!" />,
181 },
182 ]}
183 fieldProps={{
184 optionType: "button",
185 buttonStyle: "solid"
186 }}
187 />
188 <ProFormRadio.Group
189 name="concurrent"
190 label={intl.formatMessage({
191 id: 'monitor.job.concurrent',
192 defaultMessage: '是否并发执行',
193 })}
194 colProps={{ md: 24 }}
195 placeholder="请输入是否并发执行"
196 valueEnum={{
197 0: '允许',
198 1: '禁止',
199 }}
200 rules={[
201 {
202 required: false,
203 message: <FormattedMessage id="请输入是否并发执行!" defaultMessage="请输入是否并发执行!" />,
204 },
205 ]}
206 fieldProps={{
207 optionType: "button",
208 buttonStyle: "solid"
209 }}
210 />
211 <ProFormRadio.Group
212 valueEnum={statusOptions}
213 name="status"
214 label={intl.formatMessage({
215 id: 'monitor.job.status',
216 defaultMessage: '状态',
217 })}
218 colProps={{ md: 24 }}
219 placeholder="请输入状态"
220 rules={[
221 {
222 required: false,
223 message: <FormattedMessage id="请输入状态!" defaultMessage="请输入状态!" />,
224 },
225 ]}
226 />
227 </ProForm>
228 </Modal>
229 );
230};
231
232export default JobForm;