@jiangood/open-admin 2.5.2 → 2.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"dev": "umi dev",
|
|
38
38
|
"build": "umi build"
|
|
39
39
|
},
|
|
40
|
-
"version": "2.5.
|
|
40
|
+
"version": "2.5.5"
|
|
41
41
|
},
|
|
42
42
|
"pkgPath": "/home/runner/work/open-admin/open-admin/web/package.json",
|
|
43
43
|
"plugins": {
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"config": {},
|
|
51
51
|
"time": {
|
|
52
52
|
"hooks": {},
|
|
53
|
-
"register":
|
|
53
|
+
"register": 1
|
|
54
54
|
},
|
|
55
55
|
"enableBy": "register"
|
|
56
56
|
},
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
0
|
|
81
81
|
]
|
|
82
82
|
},
|
|
83
|
-
"register":
|
|
83
|
+
"register": 2
|
|
84
84
|
},
|
|
85
85
|
"enableBy": "register"
|
|
86
86
|
},
|
|
@@ -94,10 +94,10 @@
|
|
|
94
94
|
"time": {
|
|
95
95
|
"hooks": {
|
|
96
96
|
"onStart": [
|
|
97
|
-
|
|
97
|
+
0
|
|
98
98
|
]
|
|
99
99
|
},
|
|
100
|
-
"register":
|
|
100
|
+
"register": 2
|
|
101
101
|
},
|
|
102
102
|
"enableBy": "register"
|
|
103
103
|
},
|
|
@@ -174,7 +174,7 @@
|
|
|
174
174
|
0
|
|
175
175
|
],
|
|
176
176
|
"onCheck": [
|
|
177
|
-
|
|
177
|
+
1
|
|
178
178
|
]
|
|
179
179
|
},
|
|
180
180
|
"register": 1
|
|
@@ -191,7 +191,7 @@
|
|
|
191
191
|
"time": {
|
|
192
192
|
"hooks": {
|
|
193
193
|
"onCheck": [
|
|
194
|
-
|
|
194
|
+
0
|
|
195
195
|
]
|
|
196
196
|
},
|
|
197
197
|
"register": 1
|
|
@@ -1090,7 +1090,7 @@
|
|
|
1090
1090
|
"time": {
|
|
1091
1091
|
"hooks": {
|
|
1092
1092
|
"onStart": [
|
|
1093
|
-
|
|
1093
|
+
1
|
|
1094
1094
|
]
|
|
1095
1095
|
},
|
|
1096
1096
|
"register": 1
|
|
@@ -1119,7 +1119,7 @@
|
|
|
1119
1119
|
"config": {},
|
|
1120
1120
|
"time": {
|
|
1121
1121
|
"hooks": {},
|
|
1122
|
-
"register":
|
|
1122
|
+
"register": 95
|
|
1123
1123
|
},
|
|
1124
1124
|
"enableBy": "register"
|
|
1125
1125
|
},
|
|
@@ -1132,7 +1132,7 @@
|
|
|
1132
1132
|
"config": {},
|
|
1133
1133
|
"time": {
|
|
1134
1134
|
"hooks": {},
|
|
1135
|
-
"register":
|
|
1135
|
+
"register": 27
|
|
1136
1136
|
},
|
|
1137
1137
|
"enableBy": "config"
|
|
1138
1138
|
},
|
|
@@ -1162,7 +1162,7 @@
|
|
|
1162
1162
|
0
|
|
1163
1163
|
]
|
|
1164
1164
|
},
|
|
1165
|
-
"register":
|
|
1165
|
+
"register": 0
|
|
1166
1166
|
},
|
|
1167
1167
|
"enableBy": "register"
|
|
1168
1168
|
},
|
|
@@ -1175,7 +1175,7 @@
|
|
|
1175
1175
|
"config": {},
|
|
1176
1176
|
"time": {
|
|
1177
1177
|
"hooks": {},
|
|
1178
|
-
"register":
|
|
1178
|
+
"register": 1
|
|
1179
1179
|
},
|
|
1180
1180
|
"enableBy": "register"
|
|
1181
1181
|
},
|
|
@@ -1188,7 +1188,7 @@
|
|
|
1188
1188
|
"config": {},
|
|
1189
1189
|
"time": {
|
|
1190
1190
|
"hooks": {},
|
|
1191
|
-
"register":
|
|
1191
|
+
"register": 1
|
|
1192
1192
|
},
|
|
1193
1193
|
"enableBy": "config"
|
|
1194
1194
|
},
|
|
@@ -1213,7 +1213,7 @@
|
|
|
1213
1213
|
"config": {},
|
|
1214
1214
|
"time": {
|
|
1215
1215
|
"hooks": {},
|
|
1216
|
-
"register":
|
|
1216
|
+
"register": 1
|
|
1217
1217
|
},
|
|
1218
1218
|
"enableBy": "config"
|
|
1219
1219
|
},
|
|
@@ -1226,7 +1226,7 @@
|
|
|
1226
1226
|
"config": {},
|
|
1227
1227
|
"time": {
|
|
1228
1228
|
"hooks": {},
|
|
1229
|
-
"register":
|
|
1229
|
+
"register": 0
|
|
1230
1230
|
}
|
|
1231
1231
|
},
|
|
1232
1232
|
"./node_modules/@umijs/preset-umi/dist/features/overrides/overrides": {
|
|
@@ -1280,7 +1280,7 @@
|
|
|
1280
1280
|
"config": {},
|
|
1281
1281
|
"time": {
|
|
1282
1282
|
"hooks": {},
|
|
1283
|
-
"register":
|
|
1283
|
+
"register": 1
|
|
1284
1284
|
},
|
|
1285
1285
|
"enableBy": "register"
|
|
1286
1286
|
},
|
|
@@ -1306,7 +1306,7 @@
|
|
|
1306
1306
|
"config": {},
|
|
1307
1307
|
"time": {
|
|
1308
1308
|
"hooks": {},
|
|
1309
|
-
"register":
|
|
1309
|
+
"register": 0
|
|
1310
1310
|
},
|
|
1311
1311
|
"enableBy": "config"
|
|
1312
1312
|
},
|
|
@@ -1319,7 +1319,7 @@
|
|
|
1319
1319
|
"config": {},
|
|
1320
1320
|
"time": {
|
|
1321
1321
|
"hooks": {},
|
|
1322
|
-
"register":
|
|
1322
|
+
"register": 1
|
|
1323
1323
|
},
|
|
1324
1324
|
"enableBy": "config"
|
|
1325
1325
|
},
|
|
@@ -1332,7 +1332,7 @@
|
|
|
1332
1332
|
"config": {},
|
|
1333
1333
|
"time": {
|
|
1334
1334
|
"hooks": {},
|
|
1335
|
-
"register":
|
|
1335
|
+
"register": 0
|
|
1336
1336
|
},
|
|
1337
1337
|
"enableBy": "register"
|
|
1338
1338
|
},
|
|
@@ -1371,7 +1371,7 @@
|
|
|
1371
1371
|
"config": {},
|
|
1372
1372
|
"time": {
|
|
1373
1373
|
"hooks": {},
|
|
1374
|
-
"register":
|
|
1374
|
+
"register": 1
|
|
1375
1375
|
}
|
|
1376
1376
|
},
|
|
1377
1377
|
"./node_modules/@umijs/preset-umi/dist/features/ssr/ssr": {
|
|
@@ -1396,7 +1396,7 @@
|
|
|
1396
1396
|
"config": {},
|
|
1397
1397
|
"time": {
|
|
1398
1398
|
"hooks": {},
|
|
1399
|
-
"register":
|
|
1399
|
+
"register": 1
|
|
1400
1400
|
},
|
|
1401
1401
|
"enableBy": "register"
|
|
1402
1402
|
},
|
|
@@ -1422,7 +1422,7 @@
|
|
|
1422
1422
|
"config": {},
|
|
1423
1423
|
"time": {
|
|
1424
1424
|
"hooks": {},
|
|
1425
|
-
"register":
|
|
1425
|
+
"register": 3
|
|
1426
1426
|
},
|
|
1427
1427
|
"enableBy": "config"
|
|
1428
1428
|
},
|
|
@@ -1460,7 +1460,7 @@
|
|
|
1460
1460
|
"config": {},
|
|
1461
1461
|
"time": {
|
|
1462
1462
|
"hooks": {},
|
|
1463
|
-
"register":
|
|
1463
|
+
"register": 22
|
|
1464
1464
|
},
|
|
1465
1465
|
"enableBy": "config"
|
|
1466
1466
|
},
|
|
@@ -1473,7 +1473,7 @@
|
|
|
1473
1473
|
"config": {},
|
|
1474
1474
|
"time": {
|
|
1475
1475
|
"hooks": {},
|
|
1476
|
-
"register":
|
|
1476
|
+
"register": 0
|
|
1477
1477
|
}
|
|
1478
1478
|
},
|
|
1479
1479
|
"./node_modules/@umijs/preset-umi/dist/features/clickToComponent/clickToComponent": {
|
|
@@ -1485,7 +1485,7 @@
|
|
|
1485
1485
|
"config": {},
|
|
1486
1486
|
"time": {
|
|
1487
1487
|
"hooks": {},
|
|
1488
|
-
"register":
|
|
1488
|
+
"register": 0
|
|
1489
1489
|
}
|
|
1490
1490
|
},
|
|
1491
1491
|
"./node_modules/@umijs/preset-umi/dist/features/legacy/legacy": {
|
|
@@ -1539,7 +1539,7 @@
|
|
|
1539
1539
|
0
|
|
1540
1540
|
]
|
|
1541
1541
|
},
|
|
1542
|
-
"register":
|
|
1542
|
+
"register": 1
|
|
1543
1543
|
},
|
|
1544
1544
|
"enableBy": "register"
|
|
1545
1545
|
},
|
|
@@ -1552,7 +1552,7 @@
|
|
|
1552
1552
|
"config": {},
|
|
1553
1553
|
"time": {
|
|
1554
1554
|
"hooks": {},
|
|
1555
|
-
"register":
|
|
1555
|
+
"register": 2
|
|
1556
1556
|
}
|
|
1557
1557
|
},
|
|
1558
1558
|
"./node_modules/@umijs/preset-umi/dist/features/mako/mako": {
|
|
@@ -1601,7 +1601,7 @@
|
|
|
1601
1601
|
"config": {},
|
|
1602
1602
|
"time": {
|
|
1603
1603
|
"hooks": {},
|
|
1604
|
-
"register":
|
|
1604
|
+
"register": 27
|
|
1605
1605
|
}
|
|
1606
1606
|
},
|
|
1607
1607
|
"./node_modules/@umijs/preset-umi/dist/features/forget/forget": {
|
|
@@ -1652,7 +1652,7 @@
|
|
|
1652
1652
|
"config": {},
|
|
1653
1653
|
"time": {
|
|
1654
1654
|
"hooks": {},
|
|
1655
|
-
"register":
|
|
1655
|
+
"register": 42
|
|
1656
1656
|
},
|
|
1657
1657
|
"enableBy": "register"
|
|
1658
1658
|
},
|
|
@@ -1690,7 +1690,7 @@
|
|
|
1690
1690
|
"config": {},
|
|
1691
1691
|
"time": {
|
|
1692
1692
|
"hooks": {},
|
|
1693
|
-
"register":
|
|
1693
|
+
"register": 0
|
|
1694
1694
|
},
|
|
1695
1695
|
"enableBy": "register"
|
|
1696
1696
|
},
|
|
@@ -1703,7 +1703,7 @@
|
|
|
1703
1703
|
"config": {},
|
|
1704
1704
|
"time": {
|
|
1705
1705
|
"hooks": {},
|
|
1706
|
-
"register":
|
|
1706
|
+
"register": 1
|
|
1707
1707
|
},
|
|
1708
1708
|
"enableBy": "register"
|
|
1709
1709
|
},
|
|
@@ -1716,7 +1716,7 @@
|
|
|
1716
1716
|
"config": {},
|
|
1717
1717
|
"time": {
|
|
1718
1718
|
"hooks": {},
|
|
1719
|
-
"register":
|
|
1719
|
+
"register": 0
|
|
1720
1720
|
},
|
|
1721
1721
|
"enableBy": "register"
|
|
1722
1722
|
},
|
|
@@ -1729,7 +1729,7 @@
|
|
|
1729
1729
|
"config": {},
|
|
1730
1730
|
"time": {
|
|
1731
1731
|
"hooks": {},
|
|
1732
|
-
"register":
|
|
1732
|
+
"register": 1
|
|
1733
1733
|
},
|
|
1734
1734
|
"enableBy": "register"
|
|
1735
1735
|
},
|
|
@@ -1742,7 +1742,7 @@
|
|
|
1742
1742
|
"config": {},
|
|
1743
1743
|
"time": {
|
|
1744
1744
|
"hooks": {},
|
|
1745
|
-
"register":
|
|
1745
|
+
"register": 1
|
|
1746
1746
|
},
|
|
1747
1747
|
"enableBy": "register"
|
|
1748
1748
|
},
|
|
@@ -1755,7 +1755,7 @@
|
|
|
1755
1755
|
"config": {},
|
|
1756
1756
|
"time": {
|
|
1757
1757
|
"hooks": {},
|
|
1758
|
-
"register":
|
|
1758
|
+
"register": 1
|
|
1759
1759
|
},
|
|
1760
1760
|
"enableBy": "register"
|
|
1761
1761
|
},
|
|
@@ -1807,7 +1807,7 @@
|
|
|
1807
1807
|
"config": {},
|
|
1808
1808
|
"time": {
|
|
1809
1809
|
"hooks": {},
|
|
1810
|
-
"register":
|
|
1810
|
+
"register": 0
|
|
1811
1811
|
},
|
|
1812
1812
|
"enableBy": "register"
|
|
1813
1813
|
},
|
|
@@ -2114,7 +2114,7 @@
|
|
|
2114
2114
|
"parentId": "@@/global-layout",
|
|
2115
2115
|
"file": "system/job/index.jsx",
|
|
2116
2116
|
"absPath": "/system/job",
|
|
2117
|
-
"__content": "import React from 'react'\nimport {\n Alert,\n AutoComplete,\n Button,\n Divider,\n Form,\n Input,\n message,\n Modal,\n Popconfirm,\n Select,\n Space,\n Switch,\n Tag\n} from 'antd'\nimport {PlusOutlined} from \"@ant-design/icons\";\nimport {ButtonList, HttpUtils, Page, ProTable, StringUtils, SysUtils, ValueType} from \"../../../framework\";\n\n\nconst cronOptions = [\n {\n label: '*/5 * * * * ? 每隔5秒',\n value: '*/5 * * * * ?'\n },\n {\n label: '0 */5 * * * ? 每隔5分钟',\n value: '0 */5 * * * ?'\n },\n {\n label: '0 0 22 * * ? 每天22点',\n value: '0 0 22 * * ?'\n },\n {\n label: '0 0 1 * * ? 每天1点',\n value: '0 0 1 * * ?'\n },\n {\n label: '0 0 1 1 * ? 每月1号凌晨1点',\n value: '0 0 1 1 * ?'\n }\n]\n\n\nexport default class extends React.Component {\n\n state = {\n formValues: {},\n formOpen: false,\n\n selectedRowKeys: [],\n\n jobClassOptions: [],\n\n paramList: [],\n\n statusOpen: false,\n status: null,\n\n executeRecordOpen: false,\n }\n tableRef = React.createRef()\n formRef = React.createRef()\n\n componentDidMount() {\n HttpUtils.get('admin/job/job-class-options').then(rs => {\n this.setState({jobClassOptions: rs})\n }).catch(e => {\n console.error('[Job] 加载作业类选项失败:', e);\n })\n }\n\n handleAdd = () => {\n this.setState({formOpen: true, formValues: {}, paramList: []})\n }\n\n handleEdit = (record) => {\n this.loadJobParamFields(record.jobClass, record.jobData)\n this.setState({formOpen: true, formValues: record,})\n }\n\n loadJobParamFields(className, jobData) {\n HttpUtils.post(\"admin/job/get-job-param-fields\", jobData || {}, {className}).then(rs => {\n this.setState({paramList: rs})\n }).catch(e => {\n console.error('[Job] 加载作业参数字段失败:', e);\n })\n }\n\n onFinish = (values) => {\n const isNew = !values.id;\n const url = isNew ? 'admin/job/create' : 'admin/job/update';\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 保存作业失败:', e);\n })\n }\n\n handleDelete = row => {\n const hide = message.loading(\"删除作业中...\")\n HttpUtils.post('admin/job/delete', {id: row.id}).then(rs => {\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 删除作业失败:', e);\n hide();\n })\n }\n\n handleTriggerJob = row => {\n HttpUtils.get('admin/job/trigger-job', {id: row.id}).then(rs => {\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 触发作业失败:', e);\n })\n }\n\n columns = [\n {\n title: '名称',\n dataIndex: 'name',\n\n },\n {\n title: '执行类',\n dataIndex: 'jobClass',\n\n },\n\n {\n title: 'cron',\n dataIndex: 'cron',\n },\n\n\n {\n title: '参数',\n dataIndex: 'jobData',\n render(list) {\n if (list)\n return JSON.stringify(list)\n }\n },\n\n\n {\n title: '启用状态',\n dataIndex: 'enabled',\n render: (v, record) => {\n return record.enabled ? <Tag color='green'>启用</Tag> : <Tag color='red'>停用</Tag>\n },\n },\n\n {\n title: '操作',\n dataIndex: 'option',\n fixed: 'right',\n render: (_, record) => {\n\n return (\n <Space>\n <Button size='small' onClick={() => this.showExecuteRecord(record)}>执行记录</Button>\n <Button size='small' perm='job:trigger' onClick={() => this.handleTriggerJob(record)}>执行一次</Button>\n <Button size='small' perm='job:update' onClick={() => this.handleEdit(record)}> 编辑 </Button>\n <Popconfirm perm='job:delete' title='是否确定删除?' onConfirm={() => this.handleDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </Space>\n );\n },\n },\n\n ]\n\n showStatus = () => {\n this.setState({statusOpen: true})\n HttpUtils.get('admin/job/status').then(rs => {\n this.setState({status: rs})\n }).catch(e => {\n console.error('[Job] 加载状态失败:', e);\n })\n };\n\n showExecuteRecord(record) {\n this.setState({executeRecordOpen: true, formValues: record})\n }\n\n\n render() {\n return <Page title=\"作业调度\" description=\"管理定时作业任务\" actions={<><Button type='primary' icon={<PlusOutlined/>} onClick={() => this.handleAdd()}>新增</Button><Button onClick={this.showStatus}>查看状态</Button></>}>\n <ProTable\n actionRef={this.tableRef}\n request={(params) => HttpUtils.get('admin/job/page', params)}\n columns={this.columns}\n >\n <Form.Item label='名称' name='name'>\n <Input/>\n </Form.Item>\n <Form.Item label='执行类' name='jobClass'>\n <Input/>\n </Form.Item>\n </ProTable>\n\n\n <Modal title='作业调度'\n open={this.state.formOpen}\n destroyOnHidden\n width={800}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n >\n\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onValuesChange={this.onValuesChange}\n onFinish={this.onFinish}>\n <Form.Item name='id' noStyle>\n </Form.Item>\n <Form.Item label='执行类' name='jobClass' rules={[{required: true}]}\n tooltip='org.quartz.Job接口,参考io.tmgg.job.builtin.DemoJob'>\n <Select options={this.state.jobClassOptions}/>\n </Form.Item>\n <Form.Item label='名称' name='name' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n\n <Form.Item label='cron表达式' name='cron' help='格式:秒分时日月周,留空表示手动执行'\n rules={[{required: true}]}>\n <AutoComplete placeholder='如 0 */5 * * * ?' options={cronOptions}/>\n </Form.Item>\n\n <Form.Item label='启用' name='enabled' valuePropName='checked' rules={[{required: true}]}>\n <Switch/>\n </Form.Item>\n\n\n {this.state.paramList?.map(p => (\n <div key={p.name}>\n <Divider>作业参数</Divider>\n <Form.Item label={p.label}\n name={['jobData', p.name]}\n key={p.name}\n rules={[{required: p.required}]}>\n {ValueType.renderField(p.componentType, p.componentProps)}\n </Form.Item>\n </div>\n ))}\n </Form>\n </Modal>\n\n <Modal title='作业调度状态'\n open={this.state.statusOpen}\n onCancel={() => this.setState({statusOpen: false})}\n footer={null}\n width={1024}\n >\n <Alert title={<pre>{this.state.status}</pre>}></Alert>\n\n </Modal>\n\n <Modal title='作业调度记录'\n open={this.state.executeRecordOpen}\n onCancel={() => this.setState({executeRecordOpen: false})}\n footer={null}\n width={1024}\n destroyOnHidden\n >\n <ProTable columns={[{\n title: '开始时间',\n dataIndex: 'beginTime',\n },\n {\n title: '结束时间',\n dataIndex: 'endTime',\n },\n {\n title: '耗时',\n dataIndex: 'jobRunTimeLabel',\n\n },\n {\n title: '是否成功',\n dataIndex: 'success',\n width: 200,\n render: v => {\n if (v != null) {\n return v ? '成功' : '异常'\n }\n }\n },\n {\n title: '返回结果',\n dataIndex: 'result',\n width: 300\n },\n\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => {\n const url = SysUtils.contextPath('/admin/sys/log/' + record.id);\n return <a href={url} target='_blank'>日志</a>;\n },\n }\n ]} request={params => {\n params.jobId = this.state.formValues.id\n return HttpUtils.get('admin/job/execute-record', params);\n }}></ProTable>\n\n </Modal>\n </Page>\n }\n\n onValuesChange = (changed, values) => {\n if (changed.jobClass) {\n this.loadJobParamFields(values.jobClass)\n const option = this.state.jobClassOptions.find(o => o.value === changed.jobClass)\n if (option) {\n const {label} = option;\n if (StringUtils.contains(label, \" \")) { // 取中文名部门设置为name\n this.formRef.current.setFieldValue(\"name\", label.split(\" \")[1])\n }\n }\n }\n\n if (changed.jobData) {\n this.loadJobParamFields(values.jobClass, values.jobData)\n }\n\n };\n}\n\n\n\n",
|
|
2117
|
+
"__content": "import React from 'react'\nimport {\n Alert,\n AutoComplete,\n Button,\n Divider,\n Form,\n Input,\n message,\n Modal,\n Popconfirm,\n Select,\n Space,\n Switch,\n Tag\n} from 'antd'\nimport {PlusOutlined} from \"@ant-design/icons\";\nimport {ButtonList, HttpUtils, Page, ProTable, StringUtils, SysUtils, ValueType} from \"../../../framework\";\n\n\nconst cronOptions = [\n {\n label: '*/5 * * * * ? 每隔5秒',\n value: '*/5 * * * * ?'\n },\n {\n label: '0 */5 * * * ? 每隔5分钟',\n value: '0 */5 * * * ?'\n },\n {\n label: '0 0 22 * * ? 每天22点',\n value: '0 0 22 * * ?'\n },\n {\n label: '0 0 1 * * ? 每天1点',\n value: '0 0 1 * * ?'\n },\n {\n label: '0 0 1 1 * ? 每月1号凌晨1点',\n value: '0 0 1 1 * ?'\n }\n]\n\n\nexport default class extends React.Component {\n\n state = {\n formValues: {},\n formOpen: false,\n\n selectedRowKeys: [],\n\n jobClassOptions: [],\n\n paramList: [],\n\n statusOpen: false,\n status: null,\n\n executeRecordOpen: false,\n }\n tableRef = React.createRef()\n formRef = React.createRef()\n\n componentDidMount() {\n HttpUtils.get('admin/job/job-class-options').then(rs => {\n this.setState({jobClassOptions: rs})\n }).catch(e => {\n console.error('[Job] 加载作业类选项失败:', e);\n })\n }\n\n handleAdd = () => {\n this.setState({formOpen: true, formValues: {}, paramList: []})\n }\n\n handleEdit = (record) => {\n this.loadJobParamFields(record.jobClass, record.jobData)\n this.setState({formOpen: true, formValues: record,})\n }\n\n loadJobParamFields(className, jobData) {\n HttpUtils.post(\"admin/job/get-job-param-fields\", jobData || {}, {className}).then(rs => {\n this.setState({paramList: rs})\n }).catch(e => {\n console.error('[Job] 加载作业参数字段失败:', e);\n })\n }\n\n onFinish = (values) => {\n const isNew = !values.id;\n const url = isNew ? 'admin/job/create' : 'admin/job/update';\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 保存作业失败:', e);\n })\n }\n\n handleDelete = row => {\n const hide = message.loading(\"删除作业中...\")\n HttpUtils.post('admin/job/delete', {id: row.id}).then(rs => {\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 删除作业失败:', e);\n hide();\n })\n }\n\n handleTriggerJob = row => {\n HttpUtils.get('admin/job/trigger-job', {id: row.id}).then(rs => {\n this.tableRef.current.reload();\n }).catch(e => {\n console.error('[Job] 触发作业失败:', e);\n })\n }\n\n columns = [\n {\n title: '名称',\n dataIndex: 'name',\n\n },\n {\n title: '执行类',\n dataIndex: 'jobClass',\n\n },\n\n {\n title: 'cron',\n dataIndex: 'cron',\n },\n\n\n {\n title: '参数',\n dataIndex: 'jobData',\n render(list) {\n if (list)\n return JSON.stringify(list)\n }\n },\n\n\n {\n title: '启用状态',\n dataIndex: 'enabled',\n render: (v, record) => {\n return record.enabled ? <Tag color='green'>启用</Tag> : <Tag color='red'>停用</Tag>\n },\n },\n\n {\n title: '操作',\n dataIndex: 'option',\n fixed: 'right',\n render: (_, record) => {\n\n return (\n <Space>\n <Button size='small' onClick={() => this.showExecuteRecord(record)}>执行记录</Button>\n <Button size='small' perm='job:trigger' onClick={() => this.handleTriggerJob(record)}>执行一次</Button>\n <Button size='small' perm='job:update' onClick={() => this.handleEdit(record)}> 编辑 </Button>\n <Popconfirm perm='job:delete' title='是否确定删除?' onConfirm={() => this.handleDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </Space>\n );\n },\n },\n\n ]\n\n showStatus = () => {\n this.setState({statusOpen: true})\n HttpUtils.get('admin/job/status').then(rs => {\n this.setState({status: rs})\n }).catch(e => {\n console.error('[Job] 加载状态失败:', e);\n })\n };\n\n showExecuteRecord(record) {\n this.setState({executeRecordOpen: true, formValues: record})\n }\n\n\n render() {\n return <Page title=\"作业调度\" description=\"管理定时作业任务\" actions={<><Button type='primary' icon={<PlusOutlined/>} onClick={() => this.handleAdd()}>新增</Button><Button onClick={this.showStatus}>查看状态</Button></>}>\n <ProTable\n actionRef={this.tableRef}\n request={(params) => HttpUtils.get('admin/job/page', params)}\n columns={this.columns}\n >\n <Form.Item label='名称' name='name'>\n <Input/>\n </Form.Item>\n <Form.Item label='执行类' name='jobClass'>\n <Input/>\n </Form.Item>\n </ProTable>\n\n\n <Modal title='作业调度'\n open={this.state.formOpen}\n destroyOnHidden\n width={800}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n >\n\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onValuesChange={this.onValuesChange}\n onFinish={this.onFinish}>\n <Form.Item name='id' noStyle>\n </Form.Item>\n <Form.Item label='执行类' name='jobClass' rules={[{required: true}]}\n tooltip='org.quartz.Job接口,参考io.tmgg.job.builtin.DemoJob'>\n <Select options={this.state.jobClassOptions}/>\n </Form.Item>\n <Form.Item label='名称' name='name' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n\n <Form.Item label='cron表达式' name='cron' help='格式:秒分时日月周,留空表示手动执行'\n rules={[{required: true}]}>\n <AutoComplete placeholder='如 0 */5 * * * ?' options={cronOptions}/>\n </Form.Item>\n\n <Form.Item label='启用' name='enabled' valuePropName='checked' rules={[{required: true}]}>\n <Switch/>\n </Form.Item>\n\n\n {this.state.paramList?.map(p => (\n <div key={p.name}>\n <Divider>作业参数</Divider>\n <Form.Item label={p.label}\n name={['jobData', p.name]}\n key={p.name}\n initialValue={p.defaultValue}\n rules={[{required: p.required}]}>\n {ValueType.renderField(p.componentType, {\n ...p.componentProps,\n placeholder: p.placeholder || '请输入'\n })}\n </Form.Item>\n </div>\n ))}\n </Form>\n </Modal>\n\n <Modal title='作业调度状态'\n open={this.state.statusOpen}\n onCancel={() => this.setState({statusOpen: false})}\n footer={null}\n width={1024}\n >\n <Alert title={<pre>{this.state.status}</pre>}></Alert>\n\n </Modal>\n\n <Modal title='作业调度记录'\n open={this.state.executeRecordOpen}\n onCancel={() => this.setState({executeRecordOpen: false})}\n footer={null}\n width={1024}\n destroyOnHidden\n >\n <ProTable columns={[{\n title: '开始时间',\n dataIndex: 'beginTime',\n },\n {\n title: '结束时间',\n dataIndex: 'endTime',\n },\n {\n title: '耗时',\n dataIndex: 'jobRunTimeLabel',\n\n },\n {\n title: '是否成功',\n dataIndex: 'success',\n width: 200,\n render: v => {\n if (v != null) {\n return v ? '成功' : '异常'\n }\n }\n },\n {\n title: '返回结果',\n dataIndex: 'result',\n width: 300\n },\n\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => {\n const url = SysUtils.contextPath('/admin/sys/log/' + record.id);\n return <a href={url} target='_blank'>日志</a>;\n },\n }\n ]} request={params => {\n params.jobId = this.state.formValues.id\n return HttpUtils.get('admin/job/execute-record', params);\n }}></ProTable>\n\n </Modal>\n </Page>\n }\n\n onValuesChange = (changed, values) => {\n if (changed.jobClass) {\n this.loadJobParamFields(values.jobClass)\n const option = this.state.jobClassOptions.find(o => o.value === changed.jobClass)\n if (option) {\n const {label} = option;\n if (StringUtils.contains(label, \" \")) { // 取中文名部门设置为name\n this.formRef.current.setFieldValue(\"name\", label.split(\" \")[1])\n }\n }\n }\n\n if (changed.jobData) {\n this.loadJobParamFields(values.jobClass, values.jobData)\n }\n\n };\n}\n\n\n\n",
|
|
2118
2118
|
"__isJSFile": true,
|
|
2119
2119
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/job/index.jsx"
|
|
2120
2120
|
},
|
|
@@ -241,8 +241,12 @@ export default class extends React.Component {
|
|
|
241
241
|
<Form.Item label={p.label}
|
|
242
242
|
name={['jobData', p.name]}
|
|
243
243
|
key={p.name}
|
|
244
|
+
initialValue={p.defaultValue}
|
|
244
245
|
rules={[{required: p.required}]}>
|
|
245
|
-
{ValueType.renderField(p.componentType,
|
|
246
|
+
{ValueType.renderField(p.componentType, {
|
|
247
|
+
...p.componentProps,
|
|
248
|
+
placeholder: p.placeholder || '请输入'
|
|
249
|
+
})}
|
|
246
250
|
</Form.Item>
|
|
247
251
|
</div>
|
|
248
252
|
))}
|