Showing
11 changed files
with
686 additions
and
116 deletions
@@ -67,7 +67,7 @@ export const SchedueLog: AppRouteRecordRaw = { | @@ -67,7 +67,7 @@ export const SchedueLog: AppRouteRecordRaw = { | ||
67 | { | 67 | { |
68 | path: 'schedue_log/:id', | 68 | path: 'schedue_log/:id', |
69 | name: 'Schedue_Log', | 69 | name: 'Schedue_Log', |
70 | - component: () => import('/@/views/report/config/SchedueLog.vue'), | 70 | + component: () => import('../../views/system/scheduled/SchedueLog.vue'), |
71 | meta: { | 71 | meta: { |
72 | title: '调度日志', | 72 | title: '调度日志', |
73 | }, | 73 | }, |
@@ -16,13 +16,14 @@ | @@ -16,13 +16,14 @@ | ||
16 | :options="selectOptions" | 16 | :options="selectOptions" |
17 | @change="handleDeviceChange" | 17 | @change="handleDeviceChange" |
18 | mode="multiple" | 18 | mode="multiple" |
19 | + labelInValue | ||
19 | /> | 20 | /> |
20 | <div style="margin-top: 1.5vh"></div> | 21 | <div style="margin-top: 1.5vh"></div> |
21 | <DeviceAttrCpns | 22 | <DeviceAttrCpns |
22 | ref="deviceAttrRef" | 23 | ref="deviceAttrRef" |
23 | @change="handleChange" | 24 | @change="handleChange" |
24 | :value="deviceList" | 25 | :value="deviceList" |
25 | - :orgId="organizationId" | 26 | + :orgId="organizationId || orgId" |
26 | /> | 27 | /> |
27 | </template> | 28 | </template> |
28 | </BasicForm> | 29 | </BasicForm> |
@@ -64,7 +65,6 @@ | @@ -64,7 +65,6 @@ | ||
64 | }); | 65 | }); |
65 | }); | 66 | }); |
66 | const handleDeviceChange = (e) => { | 67 | const handleDeviceChange = (e) => { |
67 | - console.log('e', e); | ||
68 | deviceList.value = e; | 68 | deviceList.value = e; |
69 | }; | 69 | }; |
70 | const [registerForm, { validate, setFieldsValue, resetFields }] = useForm({ | 70 | const [registerForm, { validate, setFieldsValue, resetFields }] = useForm({ |
@@ -101,10 +101,22 @@ | @@ -101,10 +101,22 @@ | ||
101 | }); | 101 | }); |
102 | //TODO 模拟的数据 待服务端返回 | 102 | //TODO 模拟的数据 待服务端返回 |
103 | const deviceIds: any = [ | 103 | const deviceIds: any = [ |
104 | - '8943f0b0-f1f7-11ec-98ad-a9680487d1e0', | ||
105 | - '8f5b4280-f29e-11ec-98ad-a9680487d1e0', | ||
106 | - '54e199d0-f1f7-11ec-98ad-a9680487d1e0', | ||
107 | - '6d9043f0-f1f7-11ec-98ad-a9680487d1e0', | 104 | + { |
105 | + label: '奥迪网关子设备', | ||
106 | + key: '8a4cc9a0-f201-11ec-98ad-a9680487d1e0', | ||
107 | + }, | ||
108 | + { | ||
109 | + label: '宝马默认设备', | ||
110 | + key: '8943f0b0-f1f7-11ec-98ad-a9680487d1e0', | ||
111 | + }, | ||
112 | + { | ||
113 | + label: '奔驰默认设备', | ||
114 | + key: '6d9043f0-f1f7-11ec-98ad-a9680487d1e0', | ||
115 | + }, | ||
116 | + { | ||
117 | + label: '新增奥迪测试设备', | ||
118 | + key: '8f5b4280-f29e-11ec-98ad-a9680487d1e0', | ||
119 | + }, | ||
108 | ]; | 120 | ]; |
109 | selectDevice.value = deviceIds; | 121 | selectDevice.value = deviceIds; |
110 | //回显设备属性 TODO 模拟的数据 待服务端返回 | 122 | //回显设备属性 TODO 模拟的数据 待服务端返回 |
@@ -133,6 +145,7 @@ | @@ -133,6 +145,7 @@ | ||
133 | deviceAttrRef.value?.echoDynamicInputFunc(deviceAttrData.value); | 145 | deviceAttrRef.value?.echoDynamicInputFunc(deviceAttrData.value); |
134 | } else { | 146 | } else { |
135 | editId.value = ''; | 147 | editId.value = ''; |
148 | + orgId.value = ''; | ||
136 | selectDevice.value = []; | 149 | selectDevice.value = []; |
137 | selectOptions.value = []; | 150 | selectOptions.value = []; |
138 | deviceList.value = []; | 151 | deviceList.value = []; |
@@ -20,7 +20,6 @@ import { | @@ -20,7 +20,6 @@ import { | ||
20 | isCountAll, | 20 | isCountAll, |
21 | } from './timeConfig'; | 21 | } from './timeConfig'; |
22 | import { AggregateDataEnum } from '../../device/localtion/cpns/TimePeriodForm/config'; | 22 | import { AggregateDataEnum } from '../../device/localtion/cpns/TimePeriodForm/config'; |
23 | -import { JCronValidator } from '/@/components/Form'; | ||
24 | 23 | ||
25 | export enum SchemaFiled { | 24 | export enum SchemaFiled { |
26 | WAY = 'way', | 25 | WAY = 'way', |
@@ -210,13 +209,6 @@ export const formSchema: QFormSchema[] = [ | @@ -210,13 +209,6 @@ export const formSchema: QFormSchema[] = [ | ||
210 | }, | 209 | }, |
211 | }, | 210 | }, |
212 | { | 211 | { |
213 | - field: 'cronExpression', | ||
214 | - label: 'Cron表达式', | ||
215 | - component: 'JEasyCron', | ||
216 | - defaultValue: '* * * * * ? *', | ||
217 | - rules: [{ required: true, message: '请输入Cron表达式' }, { validator: JCronValidator }], | ||
218 | - }, | ||
219 | - { | ||
220 | field: 'timeWeek', | 212 | field: 'timeWeek', |
221 | component: 'Select', | 213 | component: 'Select', |
222 | label: '周期', | 214 | label: '周期', |
@@ -29,9 +29,7 @@ | @@ -29,9 +29,7 @@ | ||
29 | import { propTypes } from '/@/utils/propTypes'; | 29 | import { propTypes } from '/@/utils/propTypes'; |
30 | import { SelectTypes } from 'ant-design-vue/es/select'; | 30 | import { SelectTypes } from 'ant-design-vue/es/select'; |
31 | import { Select } from 'ant-design-vue'; | 31 | import { Select } from 'ant-design-vue'; |
32 | - import { screenLinkPageByDeptIdGetDevice } from '/@/api/ruleengine/ruleengineApi'; | ||
33 | import { getAttribute } from '/@/api/ruleengine/ruleengineApi'; | 32 | import { getAttribute } from '/@/api/ruleengine/ruleengineApi'; |
34 | - // import { getDeviceAttribute } from '/@/api/alarm/position'; | ||
35 | 33 | ||
36 | interface Params { | 34 | interface Params { |
37 | [x: string]: string; | 35 | [x: string]: string; |
@@ -44,15 +42,9 @@ | @@ -44,15 +42,9 @@ | ||
44 | }); | 42 | }); |
45 | const emits = defineEmits(['change', 'update:value', 'dynamicReduceHeight', 'dynamicAddHeight']); | 43 | const emits = defineEmits(['change', 'update:value', 'dynamicReduceHeight', 'dynamicAddHeight']); |
46 | const selectOptions = ref<SelectTypes['options']>([]); | 44 | const selectOptions = ref<SelectTypes['options']>([]); |
47 | - //动态数据 | ||
48 | - const dynamicInput: UnwrapRef<{ params: Params[] }> = reactive({ params: [] }); | ||
49 | - //监听传入数据value | ||
50 | - watchEffect(() => { | ||
51 | - initVal(); | ||
52 | - }); | ||
53 | //获取属性 | 45 | //获取属性 |
54 | - const getAttr = async (orgId, value) => { | ||
55 | - const res = await getAttribute(orgId, value.join(',')); | 46 | + const getAttr = async (orgId, deviceId) => { |
47 | + const res = await getAttribute(orgId, deviceId.join(',')); | ||
56 | selectOptions.value = res.map((o) => { | 48 | selectOptions.value = res.map((o) => { |
57 | return { | 49 | return { |
58 | label: o, | 50 | label: o, |
@@ -60,43 +52,25 @@ | @@ -60,43 +52,25 @@ | ||
60 | }; | 52 | }; |
61 | }); | 53 | }); |
62 | }; | 54 | }; |
63 | - //获取设备 | ||
64 | - const deviceOptions: any = ref([]); | ||
65 | - const getDevice = async (orgId) => { | ||
66 | - const { items } = await screenLinkPageByDeptIdGetDevice({ | ||
67 | - organizationId: orgId, | ||
68 | - }); | ||
69 | - deviceOptions.value = items.map((item) => { | ||
70 | - return { | ||
71 | - label: item.name, | ||
72 | - value: item.tbDeviceId, | ||
73 | - }; | ||
74 | - }); | ||
75 | - }; | 55 | + //动态数据 |
56 | + const dynamicInput: UnwrapRef<{ params: Params[] }> = reactive({ params: [] }); | ||
57 | + //监听传入数据value | ||
58 | + watchEffect(() => { | ||
59 | + initVal(); | ||
60 | + }); | ||
76 | /** | 61 | /** |
77 | * 初始化数值 | 62 | * 初始化数值 |
78 | */ | 63 | */ |
79 | async function initVal() { | 64 | async function initVal() { |
80 | dynamicInput.params = []; | 65 | dynamicInput.params = []; |
81 | if (props.value && props.orgId) { | 66 | if (props.value && props.orgId) { |
82 | - const getPropsDevice = props.value; | ||
83 | - const getPropsOrgId = props.orgId; | ||
84 | - await getAttr(getPropsOrgId, getPropsDevice); | ||
85 | - await getDevice(getPropsOrgId); | ||
86 | - const temp: any = []; | ||
87 | - deviceOptions.value.forEach((f) => { | ||
88 | - getPropsDevice.forEach((f1) => { | ||
89 | - if (f1 == f.value) { | ||
90 | - temp.push({ | ||
91 | - label: f.label, | ||
92 | - value: f.value, | ||
93 | - }); | ||
94 | - } | ||
95 | - }); | ||
96 | - }); | ||
97 | - temp.forEach((item: Params) => { | 67 | + let jsonObj = props.value; |
68 | + const deviceId = jsonObj.map((m: any) => m.value); | ||
69 | + await getAttr(props.orgId, deviceId); | ||
70 | + console.log(jsonObj); | ||
71 | + jsonObj.forEach((item: any) => { | ||
98 | dynamicInput.params.push({ | 72 | dynamicInput.params.push({ |
99 | - attribute: item.attribute, | 73 | + attribute: '', |
100 | device: item.label, | 74 | device: item.label, |
101 | value: item.value, | 75 | value: item.value, |
102 | }); | 76 | }); |
@@ -116,6 +90,7 @@ | @@ -116,6 +90,7 @@ | ||
116 | }); | 90 | }); |
117 | }); | 91 | }); |
118 | } | 92 | } |
93 | + console.log('emitChange', obj); | ||
119 | emits('change', obj); | 94 | emits('change', obj); |
120 | emits('update:value', obj); | 95 | emits('update:value', obj); |
121 | } | 96 | } |
@@ -44,26 +44,6 @@ | @@ -44,26 +44,6 @@ | ||
44 | }, | 44 | }, |
45 | }, | 45 | }, |
46 | ]" | 46 | ]" |
47 | - :dropDownActions="[ | ||
48 | - { | ||
49 | - label: '执行一次', | ||
50 | - icon: 'ant-design:caret-right-filled', | ||
51 | - popConfirm: { | ||
52 | - title: '确认要立即执行一次' + '“' + record.name + '”' + '任务吗?', | ||
53 | - confirm: handleDeleteOrBatchDelete.bind(null, record), | ||
54 | - }, | ||
55 | - }, | ||
56 | - { | ||
57 | - label: '任务详细', | ||
58 | - icon: 'ant-design:eye-outlined', | ||
59 | - onClick: handleTaskDetailModal.bind(null, record), | ||
60 | - }, | ||
61 | - { | ||
62 | - label: '调度日志', | ||
63 | - icon: 'ant-design:insert-row-below-outlined', | ||
64 | - onClick: handleSchedulingLogFunc.bind(null, record), | ||
65 | - }, | ||
66 | - ]" | ||
67 | /> | 47 | /> |
68 | </template> | 48 | </template> |
69 | <template #status="{ record }"> | 49 | <template #status="{ record }"> |
@@ -79,8 +59,6 @@ | @@ -79,8 +59,6 @@ | ||
79 | </BasicTable> | 59 | </BasicTable> |
80 | <ReportConfigDrawer @register="registerDrawer" @success="handleSuccess" /> | 60 | <ReportConfigDrawer @register="registerDrawer" @success="handleSuccess" /> |
81 | <DevicePreviewModal @register="registerModal" /> | 61 | <DevicePreviewModal @register="registerModal" /> |
82 | - <TaskDetailPreviewModal @register="registerModalTaskDetail" /> | ||
83 | - <SchedueLog @register="registerModalSchedueLog" /> | ||
84 | </div> | 62 | </div> |
85 | </template> | 63 | </template> |
86 | 64 | ||
@@ -90,8 +68,6 @@ | @@ -90,8 +68,6 @@ | ||
90 | import { useDrawer } from '/@/components/Drawer'; | 68 | import { useDrawer } from '/@/components/Drawer'; |
91 | import ReportConfigDrawer from './ReportConfigDrawer.vue'; | 69 | import ReportConfigDrawer from './ReportConfigDrawer.vue'; |
92 | import DevicePreviewModal from './DevicePreviewModal.vue'; | 70 | import DevicePreviewModal from './DevicePreviewModal.vue'; |
93 | - import TaskDetailPreviewModal from './TaskDetailPreviewModal.vue'; | ||
94 | - import SchedueLog from './SchedueLog.vue'; | ||
95 | import { | 71 | import { |
96 | reportPage, | 72 | reportPage, |
97 | deleteReportManage, | 73 | deleteReportManage, |
@@ -166,8 +142,6 @@ | @@ -166,8 +142,6 @@ | ||
166 | 142 | ||
167 | //查看设备 | 143 | //查看设备 |
168 | const [registerModal, { openModal }] = useModal(); | 144 | const [registerModal, { openModal }] = useModal(); |
169 | - const [registerModalTaskDetail, { openModal: openModalTaskDetail }] = useModal(); | ||
170 | - const [registerModalSchedueLog, { openModal: openModalSchedueLog }] = useModal(); | ||
171 | const handleDeviceView = (record) => { | 145 | const handleDeviceView = (record) => { |
172 | openModal(true, { | 146 | openModal(true, { |
173 | isUpdate: true, | 147 | isUpdate: true, |
@@ -198,17 +172,4 @@ | @@ -198,17 +172,4 @@ | ||
198 | } | 172 | } |
199 | }; | 173 | }; |
200 | const go = useGo(); | 174 | const go = useGo(); |
201 | - const handleSchedulingLogFunc = (record: Recordable) => { | ||
202 | - // go('/report/schedue_log/' + record.id); | ||
203 | - openModalSchedueLog(true, { | ||
204 | - isUpdate: 2, | ||
205 | - record, | ||
206 | - }); | ||
207 | - }; | ||
208 | - const handleTaskDetailModal = (record: Recordable) => { | ||
209 | - openModalTaskDetail(true, { | ||
210 | - isUpdate: true, | ||
211 | - record, | ||
212 | - }); | ||
213 | - }; | ||
214 | </script> | 175 | </script> |
src/views/system/scheduled/SchedueLog.vue
renamed from
src/views/report/config/SchedueLog.vue
@@ -10,11 +10,9 @@ | @@ -10,11 +10,9 @@ | ||
10 | :showOkBtn="false" | 10 | :showOkBtn="false" |
11 | > | 11 | > |
12 | <div> | 12 | <div> |
13 | - <BasicTable @register="registerTable" :dataSource="tableData"> | 13 | + <BasicTable @register="registerTable"> |
14 | <template #toolbar> | 14 | <template #toolbar> |
15 | - <a-button type="primary"> 清空 </a-button> | ||
16 | <a-button type="primary"> 导出 </a-button> | 15 | <a-button type="primary"> 导出 </a-button> |
17 | - <a-button type="primary"> 关闭 </a-button> | ||
18 | <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消"> | 16 | <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消"> |
19 | <a-button type="primary" color="error" :disabled="hasBatchDelete"> | 17 | <a-button type="primary" color="error" :disabled="hasBatchDelete"> |
20 | 批量删除 | 18 | 批量删除 |
@@ -40,6 +38,16 @@ | @@ -40,6 +38,16 @@ | ||
40 | ]" | 38 | ]" |
41 | /> | 39 | /> |
42 | </template> | 40 | </template> |
41 | + <template #doStatus="{ record }"> | ||
42 | + <Switch | ||
43 | + :disabled="disabledSwitch" | ||
44 | + :checked="record.status === 1" | ||
45 | + :loading="record.pendingStatus" | ||
46 | + checkedChildren="启用" | ||
47 | + unCheckedChildren="禁用" | ||
48 | + @change="(checked:boolean)=>statusChange(checked,record)" | ||
49 | + /> | ||
50 | + </template> | ||
43 | </BasicTable> | 51 | </BasicTable> |
44 | </div> | 52 | </div> |
45 | </BasicModal> | 53 | </BasicModal> |
@@ -49,15 +57,15 @@ | @@ -49,15 +57,15 @@ | ||
49 | import { ref, nextTick } from 'vue'; | 57 | import { ref, nextTick } from 'vue'; |
50 | import { BasicModal, useModalInner } from '/@/components/Modal'; | 58 | import { BasicModal, useModalInner } from '/@/components/Modal'; |
51 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; | 59 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
52 | - import { columnSchedue, searchSchedueFormSchema } from './config.data'; | 60 | + import { columnSchedue, searchSchedueFormSchema } from '../../report/config/config.data'; |
53 | import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | 61 | import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; |
54 | import { deleteReportManage, reportPage } from '/@/api/report/reportManager'; | 62 | import { deleteReportManage, reportPage } from '/@/api/report/reportManager'; |
55 | - import { Popconfirm } from 'ant-design-vue'; | 63 | + import { Popconfirm, Switch } from 'ant-design-vue'; |
56 | 64 | ||
65 | + const disabledSwitch = ref(false); | ||
57 | const heightNum = ref(800); | 66 | const heightNum = ref(800); |
58 | - const tableData: any = ref([]); | ||
59 | const [registerTable, { setProps, reload }] = useTable({ | 67 | const [registerTable, { setProps, reload }] = useTable({ |
60 | - title: '调度日志表格列表', | 68 | + title: '调度日志列表', |
61 | api: reportPage, | 69 | api: reportPage, |
62 | columns: columnSchedue, | 70 | columns: columnSchedue, |
63 | showIndexColumn: false, | 71 | showIndexColumn: false, |
@@ -71,6 +79,7 @@ | @@ -71,6 +79,7 @@ | ||
71 | schemas: searchSchedueFormSchema, | 79 | schemas: searchSchedueFormSchema, |
72 | fieldMapToTime: [['sendTime', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']], | 80 | fieldMapToTime: [['sendTime', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']], |
73 | }, | 81 | }, |
82 | + rowKey: 'id', | ||
74 | actionColumn: { | 83 | actionColumn: { |
75 | width: 200, | 84 | width: 200, |
76 | title: '操作', | 85 | title: '操作', |
@@ -91,24 +100,37 @@ | @@ -91,24 +100,37 @@ | ||
91 | 100 | ||
92 | const [register] = useModalInner((data) => { | 101 | const [register] = useModalInner((data) => { |
93 | console.log(data); | 102 | console.log(data); |
94 | - const getTableData = () => { | ||
95 | - for (let i = 0; i < 100; i++) { | ||
96 | - tableData.value.push({ | ||
97 | - name: `${i}`, | ||
98 | - organizationId: `${i}`, | ||
99 | - dataCompare: `${i}`, | ||
100 | - status: `${i}`, | ||
101 | - executeWay: `${i}`, | ||
102 | - devices: `${i}`, | ||
103 | - creator: `${i}`, | ||
104 | - }); | ||
105 | - } | ||
106 | - }; | ||
107 | nextTick(() => { | 103 | nextTick(() => { |
108 | setProps(selectionOptions); | 104 | setProps(selectionOptions); |
109 | - getTableData(); | 105 | + setProps({ |
106 | + rowKey: 'id', | ||
107 | + }); | ||
110 | }); | 108 | }); |
111 | }); | 109 | }); |
112 | const handleCancel = () => {}; | 110 | const handleCancel = () => {}; |
111 | + const statusChange = async (checked, record) => { | ||
112 | + try { | ||
113 | + setProps({ | ||
114 | + loading: true, | ||
115 | + }); | ||
116 | + disabledSwitch.value = true; | ||
117 | + const newStatus = checked ? 1 : 0; | ||
118 | + console.log(checked, record, newStatus); | ||
119 | + // const res = await putReportByidAndStatusManage(record.id, newStatus); | ||
120 | + // if (res && newStatus) { | ||
121 | + // createMessage.success(`启用成功`); | ||
122 | + // } else { | ||
123 | + // createMessage.success('禁用成功'); | ||
124 | + // } | ||
125 | + } finally { | ||
126 | + setTimeout(() => { | ||
127 | + setProps({ | ||
128 | + loading: false, | ||
129 | + }); | ||
130 | + disabledSwitch.value = false; | ||
131 | + }, 500); | ||
132 | + reload(); | ||
133 | + } | ||
134 | + }; | ||
113 | </script> | 135 | </script> |
114 | <style lang="less" scoped></style> | 136 | <style lang="less" scoped></style> |
1 | +<template> | ||
2 | + <BasicDrawer | ||
3 | + v-bind="$attrs" | ||
4 | + @register="registerDrawer" | ||
5 | + showFooter | ||
6 | + :title="getTitle" | ||
7 | + width="30%" | ||
8 | + @ok="handleSubmit" | ||
9 | + > | ||
10 | + <BasicForm @register="registerForm" /> | ||
11 | + </BasicDrawer> | ||
12 | +</template> | ||
13 | +<script lang="ts" setup> | ||
14 | + import { ref, computed, unref, reactive } from 'vue'; | ||
15 | + import { BasicForm, useForm } from '/@/components/Form'; | ||
16 | + import { formSchema } from './config.form.data'; | ||
17 | + import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; | ||
18 | + // import { createOrEditReportManage, putReportConfigManage } from '/@/api/report/reportManager'; | ||
19 | + import { useMessage } from '/@/hooks/web/useMessage'; | ||
20 | + | ||
21 | + const emit = defineEmits(['success', 'register']); | ||
22 | + const isUpdate = ref(true); | ||
23 | + const editId = ref(''); | ||
24 | + const [registerForm, { validate, setFieldsValue, resetFields }] = useForm({ | ||
25 | + labelWidth: 120, | ||
26 | + schemas: formSchema, | ||
27 | + showActionButtonGroup: false, | ||
28 | + fieldMapToTime: [['timeZone', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']], | ||
29 | + }); | ||
30 | + const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | ||
31 | + await resetFields(); | ||
32 | + setDrawerProps({ confirmLoading: false }); | ||
33 | + isUpdate.value = !!data?.isUpdate; | ||
34 | + if (unref(isUpdate)) { | ||
35 | + //回显基础数据 | ||
36 | + await setFieldsValue(data.record); | ||
37 | + } else { | ||
38 | + editId.value = ''; | ||
39 | + } | ||
40 | + }); | ||
41 | + const getTitle = computed(() => (!unref(isUpdate) ? '新增定时任务' : '编辑定时任务')); | ||
42 | + let postObj: any = reactive({}); | ||
43 | + async function handleSubmit() { | ||
44 | + setDrawerProps({ confirmLoading: true }); | ||
45 | + try { | ||
46 | + const { createMessage } = useMessage(); | ||
47 | + const values = await validate(); | ||
48 | + if (!values) return; | ||
49 | + postObj = {}; | ||
50 | + let saveMessage = '添加成功'; | ||
51 | + let updateMessage = '修改成功'; | ||
52 | + // editId.value !== '' | ||
53 | + // ? await putReportConfigManage(postObj) | ||
54 | + // : await createOrEditReportManage(postObj); | ||
55 | + | ||
56 | + closeDrawer(); | ||
57 | + emit('success'); | ||
58 | + createMessage.success(unref(isUpdate) ? updateMessage : saveMessage); | ||
59 | + } finally { | ||
60 | + setTimeout(() => { | ||
61 | + setDrawerProps({ confirmLoading: false }); | ||
62 | + }, 300); | ||
63 | + } | ||
64 | + } | ||
65 | +</script> |
src/views/system/scheduled/TaskDetailPreviewModal.vue
renamed from
src/views/report/config/TaskDetailPreviewModal.vue
@@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
18 | <script setup lang="ts"> | 18 | <script setup lang="ts"> |
19 | import { ref, nextTick, reactive } from 'vue'; | 19 | import { ref, nextTick, reactive } from 'vue'; |
20 | import { BasicModal, useModalInner } from '/@/components/Modal'; | 20 | import { BasicModal, useModalInner } from '/@/components/Modal'; |
21 | - import { personSchema } from './config.data'; | 21 | + import { personSchema } from '../../report/config/config.data'; |
22 | import { Description } from '/@/components/Description/index'; | 22 | import { Description } from '/@/components/Description/index'; |
23 | import { useDescription } from '/@/components/Description'; | 23 | import { useDescription } from '/@/components/Description'; |
24 | 24 |
src/views/system/scheduled/config.data.ts
0 → 100644
1 | +import { DescItem } from '/@/components/Description/index'; | ||
2 | +import { BasicColumn, FormSchema } from '/@/components/Table'; | ||
3 | +import moment from 'moment'; | ||
4 | + | ||
5 | +export const personSchema: DescItem[] = [ | ||
6 | + { | ||
7 | + field: 'b1', | ||
8 | + label: '任务编号:', | ||
9 | + }, | ||
10 | + { | ||
11 | + field: 'b2', | ||
12 | + label: '任务分组:', | ||
13 | + }, | ||
14 | + { | ||
15 | + field: 'b3', | ||
16 | + label: '任务名称:', | ||
17 | + }, | ||
18 | + { | ||
19 | + field: 'b4', | ||
20 | + label: '创建时间:', | ||
21 | + }, | ||
22 | + { | ||
23 | + field: 'b5', | ||
24 | + label: 'cron表达式:', | ||
25 | + }, | ||
26 | + { | ||
27 | + field: 'b6', | ||
28 | + label: '下次执行时间:', | ||
29 | + }, | ||
30 | + { | ||
31 | + field: 'b7', | ||
32 | + label: '调用目标方法:', | ||
33 | + }, | ||
34 | + { | ||
35 | + field: 'b8', | ||
36 | + label: '任务状态:', | ||
37 | + }, | ||
38 | + { | ||
39 | + field: 'b9', | ||
40 | + label: '是否并发:', | ||
41 | + }, | ||
42 | + { | ||
43 | + field: 'b10', | ||
44 | + label: '执行策略:', | ||
45 | + }, | ||
46 | +]; | ||
47 | + | ||
48 | +// 调度日志表格配置 | ||
49 | +export const columnSchedue: BasicColumn[] = [ | ||
50 | + { | ||
51 | + title: '日志编号', | ||
52 | + dataIndex: 'name', | ||
53 | + width: 80, | ||
54 | + }, | ||
55 | + { | ||
56 | + title: '任务名称', | ||
57 | + dataIndex: 'organizationId', | ||
58 | + width: 120, | ||
59 | + }, | ||
60 | + { | ||
61 | + title: '任务组名', | ||
62 | + dataIndex: 'dataCompare', | ||
63 | + width: 120, | ||
64 | + }, | ||
65 | + { | ||
66 | + title: '调用目标字符串', | ||
67 | + dataIndex: 'status', | ||
68 | + width: 120, | ||
69 | + }, | ||
70 | + { | ||
71 | + title: '日志信息', | ||
72 | + dataIndex: 'executeWay', | ||
73 | + width: 160, | ||
74 | + }, | ||
75 | + { | ||
76 | + title: '执行状态', | ||
77 | + dataIndex: 'devices', | ||
78 | + width: 160, | ||
79 | + slots: { customRender: 'doStatus' }, | ||
80 | + }, | ||
81 | + { | ||
82 | + title: '执行时间', | ||
83 | + dataIndex: 'creator', | ||
84 | + width: 180, | ||
85 | + }, | ||
86 | +]; | ||
87 | + | ||
88 | +// 调度日志表格查询配置 | ||
89 | +export const searchSchedueFormSchema: FormSchema[] = [ | ||
90 | + { | ||
91 | + field: 'name', | ||
92 | + label: '任务名称', | ||
93 | + component: 'Input', | ||
94 | + colProps: { span: 4 }, | ||
95 | + componentProps: { | ||
96 | + maxLength: 36, | ||
97 | + placeholder: '请输入任务名称', | ||
98 | + }, | ||
99 | + }, | ||
100 | + { | ||
101 | + field: 'status', | ||
102 | + label: '任务组名', | ||
103 | + component: 'Select', | ||
104 | + colProps: { span: 4 }, | ||
105 | + componentProps: { | ||
106 | + options: [ | ||
107 | + { | ||
108 | + label: '默认', | ||
109 | + value: 1, | ||
110 | + }, | ||
111 | + { | ||
112 | + label: '系统', | ||
113 | + value: 0, | ||
114 | + }, | ||
115 | + ], | ||
116 | + placeholder: '请选择任务组名', | ||
117 | + }, | ||
118 | + }, | ||
119 | + { | ||
120 | + field: 'status1', | ||
121 | + label: '执行状态', | ||
122 | + component: 'Select', | ||
123 | + colProps: { span: 4 }, | ||
124 | + componentProps: { | ||
125 | + options: [ | ||
126 | + { | ||
127 | + label: '成功', | ||
128 | + value: 1, | ||
129 | + }, | ||
130 | + { | ||
131 | + label: '失败', | ||
132 | + value: 0, | ||
133 | + }, | ||
134 | + ], | ||
135 | + placeholder: '请选择执行状态', | ||
136 | + }, | ||
137 | + }, | ||
138 | + { | ||
139 | + field: 'sendTime', | ||
140 | + label: '执行时间', | ||
141 | + component: 'RangePicker', | ||
142 | + componentProps: { | ||
143 | + showTime: { | ||
144 | + defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('23:59:59', 'HH:mm:ss')], | ||
145 | + }, | ||
146 | + }, | ||
147 | + colProps: { span: 4 }, | ||
148 | + }, | ||
149 | +]; |
1 | +import { BasicColumn, FormSchema } from '/@/components/Table'; | ||
2 | +import type { FormSchema as QFormSchema } from '/@/components/Form/index'; | ||
3 | +import { JCronValidator } from '/@/components/Form'; | ||
4 | + | ||
5 | +// 调度日志表格配置 | ||
6 | +export const columnSchedue: BasicColumn[] = [ | ||
7 | + { | ||
8 | + title: '任务编号', | ||
9 | + dataIndex: 'name', | ||
10 | + width: 80, | ||
11 | + }, | ||
12 | + { | ||
13 | + title: '任务组名', | ||
14 | + dataIndex: 'organizationId', | ||
15 | + width: 120, | ||
16 | + }, | ||
17 | + { | ||
18 | + title: '调用目标字符串', | ||
19 | + dataIndex: 'status', | ||
20 | + width: 120, | ||
21 | + }, | ||
22 | + { | ||
23 | + title: 'cron执行表达式', | ||
24 | + dataIndex: 'executeWay', | ||
25 | + width: 160, | ||
26 | + }, | ||
27 | + { | ||
28 | + title: '状态', | ||
29 | + dataIndex: 'devices', | ||
30 | + width: 160, | ||
31 | + slots: { customRender: 'status' }, | ||
32 | + }, | ||
33 | +]; | ||
34 | + | ||
35 | +// 调度日志表格查询配置 | ||
36 | +export const searchSchedueFormSchema: FormSchema[] = [ | ||
37 | + { | ||
38 | + field: 'name', | ||
39 | + label: '任务名称', | ||
40 | + component: 'Input', | ||
41 | + colProps: { span: 6 }, | ||
42 | + componentProps: { | ||
43 | + maxLength: 36, | ||
44 | + placeholder: '请输入任务名称', | ||
45 | + }, | ||
46 | + }, | ||
47 | + { | ||
48 | + field: 'status', | ||
49 | + label: '任务组名', | ||
50 | + component: 'Select', | ||
51 | + colProps: { span: 6 }, | ||
52 | + componentProps: { | ||
53 | + options: [ | ||
54 | + { | ||
55 | + label: '默认', | ||
56 | + value: 1, | ||
57 | + }, | ||
58 | + { | ||
59 | + label: '系统', | ||
60 | + value: 0, | ||
61 | + }, | ||
62 | + ], | ||
63 | + placeholder: '请选择任务组名', | ||
64 | + }, | ||
65 | + }, | ||
66 | + { | ||
67 | + field: 'status1', | ||
68 | + label: '任务状态', | ||
69 | + component: 'Select', | ||
70 | + colProps: { span: 6 }, | ||
71 | + componentProps: { | ||
72 | + options: [ | ||
73 | + { | ||
74 | + label: '正常', | ||
75 | + value: 1, | ||
76 | + }, | ||
77 | + { | ||
78 | + label: '暂停', | ||
79 | + value: 0, | ||
80 | + }, | ||
81 | + ], | ||
82 | + placeholder: '请选择任务状态', | ||
83 | + }, | ||
84 | + }, | ||
85 | +]; | ||
86 | + | ||
87 | +// 新增编辑配置 | ||
88 | +export const formSchema: QFormSchema[] = [ | ||
89 | + { | ||
90 | + field: 'name', | ||
91 | + label: '任务名称', | ||
92 | + colProps: { span: 24 }, | ||
93 | + required: true, | ||
94 | + component: 'Input', | ||
95 | + componentProps: { | ||
96 | + maxLength: 255, | ||
97 | + placeholder: '请输入任务名称', | ||
98 | + }, | ||
99 | + }, | ||
100 | + { | ||
101 | + field: 'executeWay', | ||
102 | + component: 'Select', | ||
103 | + label: '任务分组', | ||
104 | + colProps: { | ||
105 | + span: 24, | ||
106 | + }, | ||
107 | + componentProps: { | ||
108 | + placeholder: '请选择任务分组', | ||
109 | + options: [ | ||
110 | + { | ||
111 | + label: '默认', | ||
112 | + value: 0, | ||
113 | + }, | ||
114 | + { | ||
115 | + label: '系统', | ||
116 | + value: 1, | ||
117 | + }, | ||
118 | + ], | ||
119 | + }, | ||
120 | + }, | ||
121 | + { | ||
122 | + field: 'name1', | ||
123 | + label: ' 调用方法', | ||
124 | + helpMessage: [ | ||
125 | + "Bean调用示例:ryTask.ryParams('ry')Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry')参数说明:支持字符串,布尔类型,长整型,浮点型,整型", | ||
126 | + ], | ||
127 | + colProps: { span: 24 }, | ||
128 | + required: true, | ||
129 | + component: 'Input', | ||
130 | + componentProps: { | ||
131 | + maxLength: 255, | ||
132 | + placeholder: '请输入调用方法', | ||
133 | + }, | ||
134 | + }, | ||
135 | + { | ||
136 | + field: 'cronExpression', | ||
137 | + label: 'Cron表达式', | ||
138 | + component: 'JEasyCron', | ||
139 | + defaultValue: '* * * * * ? *', | ||
140 | + colProps: { | ||
141 | + span: 24, | ||
142 | + }, | ||
143 | + rules: [{ required: true, message: '请输入Cron表达式' }, { validator: JCronValidator }], | ||
144 | + }, | ||
145 | + { | ||
146 | + field: 'field10', | ||
147 | + component: 'RadioButtonGroup', | ||
148 | + label: '执行策略', | ||
149 | + colProps: { | ||
150 | + span: 24, | ||
151 | + }, | ||
152 | + defaultValue: '1', | ||
153 | + componentProps: { | ||
154 | + options: [ | ||
155 | + { | ||
156 | + label: '立即执行', | ||
157 | + value: '1', | ||
158 | + }, | ||
159 | + { | ||
160 | + label: '执行一次', | ||
161 | + value: '2', | ||
162 | + }, | ||
163 | + { | ||
164 | + label: '放弃执行', | ||
165 | + value: '3', | ||
166 | + }, | ||
167 | + ], | ||
168 | + }, | ||
169 | + }, | ||
170 | + { | ||
171 | + field: 'field11', | ||
172 | + component: 'RadioButtonGroup', | ||
173 | + label: '是否并发', | ||
174 | + colProps: { | ||
175 | + span: 24, | ||
176 | + }, | ||
177 | + defaultValue: '2', | ||
178 | + componentProps: { | ||
179 | + options: [ | ||
180 | + { | ||
181 | + label: '允许', | ||
182 | + value: '1', | ||
183 | + }, | ||
184 | + { | ||
185 | + label: '禁止', | ||
186 | + value: '2', | ||
187 | + }, | ||
188 | + ], | ||
189 | + }, | ||
190 | + }, | ||
191 | + { | ||
192 | + field: 'field7', | ||
193 | + component: 'RadioGroup', | ||
194 | + label: '状态', | ||
195 | + colProps: { | ||
196 | + span: 24, | ||
197 | + }, | ||
198 | + defaultValue: '1', | ||
199 | + componentProps: { | ||
200 | + options: [ | ||
201 | + { | ||
202 | + label: '正常', | ||
203 | + value: '1', | ||
204 | + }, | ||
205 | + { | ||
206 | + label: '暂停', | ||
207 | + value: '2', | ||
208 | + }, | ||
209 | + ], | ||
210 | + }, | ||
211 | + }, | ||
212 | +]; |
src/views/system/scheduled/index.vue
0 → 100644
1 | +<template> | ||
2 | + <div> | ||
3 | + <BasicTable @register="registerTable"> | ||
4 | + <template #toolbar> | ||
5 | + <Authority value="api:yt:schedule:post"> | ||
6 | + <a-button type="primary" @click="handleCreateOrEdit(null)"> 新增 </a-button> | ||
7 | + </Authority> | ||
8 | + <Authority value="api:yt:schedule:get"> | ||
9 | + <a-button type="primary"> 导出 </a-button> | ||
10 | + </Authority> | ||
11 | + <Authority value="api:yt:schedule:delete"> | ||
12 | + <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消"> | ||
13 | + <a-button type="primary" color="error" :disabled="hasBatchDelete"> 批量删除 </a-button> | ||
14 | + </Popconfirm> | ||
15 | + </Authority> | ||
16 | + </template> | ||
17 | + <template #action="{ record }"> | ||
18 | + <TableAction | ||
19 | + :actions="[ | ||
20 | + { | ||
21 | + label: '编辑', | ||
22 | + icon: 'clarity:note-edit-line', | ||
23 | + auth: 'api:yt:schedule:update', | ||
24 | + onClick: handleCreateOrEdit.bind(null, record), | ||
25 | + }, | ||
26 | + { | ||
27 | + label: '删除', | ||
28 | + icon: 'ant-design:delete-outlined', | ||
29 | + color: 'error', | ||
30 | + auth: 'api:yt:schedule:delete', | ||
31 | + popConfirm: { | ||
32 | + title: '是否确认删除', | ||
33 | + confirm: handleDeleteOrBatchDelete.bind(null, record), | ||
34 | + }, | ||
35 | + }, | ||
36 | + ]" | ||
37 | + :dropDownActions="[ | ||
38 | + { | ||
39 | + label: '执行一次', | ||
40 | + icon: 'ant-design:caret-right-filled', | ||
41 | + popConfirm: { | ||
42 | + title: '确认要立即执行一次' + '“' + record.name + '”' + '任务吗?', | ||
43 | + confirm: handleDeleteOrBatchDelete.bind(null, record), | ||
44 | + }, | ||
45 | + }, | ||
46 | + { | ||
47 | + label: '任务详细', | ||
48 | + icon: 'ant-design:eye-outlined', | ||
49 | + onClick: handleTaskDetailModal.bind(null, record), | ||
50 | + }, | ||
51 | + { | ||
52 | + label: '调度日志', | ||
53 | + icon: 'ant-design:insert-row-below-outlined', | ||
54 | + onClick: handleSchedulingLogFunc.bind(null, record), | ||
55 | + }, | ||
56 | + ]" | ||
57 | + /> | ||
58 | + </template> | ||
59 | + <template #status="{ record }"> | ||
60 | + <Switch | ||
61 | + :disabled="disabledSwitch" | ||
62 | + :checked="record.status === 1" | ||
63 | + :loading="record.pendingStatus" | ||
64 | + checkedChildren="启用" | ||
65 | + unCheckedChildren="禁用" | ||
66 | + @change="(checked:boolean)=>statusChange(checked,record)" | ||
67 | + /> | ||
68 | + </template> | ||
69 | + </BasicTable> | ||
70 | + <ScheduledDrawer @register="registerDrawer" @success="handleSuccess" /> | ||
71 | + <TaskDetailPreviewModal @register="registerModalTaskDetail" /> | ||
72 | + <SchedueLog @register="registerModalSchedueLog" /> | ||
73 | + </div> | ||
74 | +</template> | ||
75 | +<script setup lang="ts"> | ||
76 | + import { nextTick, ref } from 'vue'; | ||
77 | + import { BasicTable, useTable, TableAction } from '/@/components/Table'; | ||
78 | + import { columnSchedue, searchSchedueFormSchema } from './config.form.data'; | ||
79 | + import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
80 | + import { deleteReportManage, reportPage } from '/@/api/report/reportManager'; | ||
81 | + import { Popconfirm, Switch } from 'ant-design-vue'; | ||
82 | + import { useModal } from '/@/components/Modal'; | ||
83 | + import TaskDetailPreviewModal from './TaskDetailPreviewModal.vue'; | ||
84 | + import SchedueLog from './SchedueLog.vue'; | ||
85 | + import ScheduledDrawer from './ScheduledDrawer.vue'; | ||
86 | + import { useDrawer } from '/@/components/Drawer'; | ||
87 | + import { Authority } from '/@/components/Authority'; | ||
88 | + | ||
89 | + const disabledSwitch = ref(false); | ||
90 | + const [registerTable, { setProps, reload }] = useTable({ | ||
91 | + title: '定时任务列表', | ||
92 | + api: reportPage, | ||
93 | + columns: columnSchedue, | ||
94 | + showIndexColumn: false, | ||
95 | + clickToRowSelect: false, | ||
96 | + useSearchForm: true, | ||
97 | + ellipsis: true, | ||
98 | + showTableSetting: true, | ||
99 | + bordered: true, | ||
100 | + formConfig: { | ||
101 | + labelWidth: 120, | ||
102 | + schemas: searchSchedueFormSchema, | ||
103 | + fieldMapToTime: [['sendTime', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']], | ||
104 | + }, | ||
105 | + actionColumn: { | ||
106 | + width: 200, | ||
107 | + title: '操作', | ||
108 | + dataIndex: 'action', | ||
109 | + slots: { customRender: 'action' }, | ||
110 | + fixed: 'right', | ||
111 | + }, | ||
112 | + }); | ||
113 | + // 刷新 | ||
114 | + const handleSuccess = () => { | ||
115 | + reload(); | ||
116 | + }; | ||
117 | + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete( | ||
118 | + deleteReportManage, | ||
119 | + handleSuccess, | ||
120 | + setProps | ||
121 | + ); | ||
122 | + | ||
123 | + nextTick(() => { | ||
124 | + setProps(selectionOptions); | ||
125 | + }); | ||
126 | + const [registerDrawer, { openDrawer }] = useDrawer(); | ||
127 | + const [registerModalTaskDetail, { openModal: openModalTaskDetail }] = useModal(); | ||
128 | + const [registerModalSchedueLog, { openModal: openModalSchedueLog }] = useModal(); | ||
129 | + const handleSchedulingLogFunc = (record: Recordable) => { | ||
130 | + // go('/report/schedue_log/' + record.id); | ||
131 | + openModalSchedueLog(true, { | ||
132 | + isUpdate: 2, | ||
133 | + record, | ||
134 | + }); | ||
135 | + }; | ||
136 | + const handleTaskDetailModal = (record: Recordable) => { | ||
137 | + openModalTaskDetail(true, { | ||
138 | + isUpdate: true, | ||
139 | + record, | ||
140 | + }); | ||
141 | + }; | ||
142 | + // 新增或编辑 | ||
143 | + const handleCreateOrEdit = (record: Recordable | null) => { | ||
144 | + if (record) { | ||
145 | + openDrawer(true, { | ||
146 | + isUpdate: true, | ||
147 | + record, | ||
148 | + }); | ||
149 | + } else { | ||
150 | + openDrawer(true, { | ||
151 | + isUpdate: false, | ||
152 | + }); | ||
153 | + } | ||
154 | + }; | ||
155 | + | ||
156 | + const statusChange = async (checked, record) => { | ||
157 | + try { | ||
158 | + setProps({ | ||
159 | + loading: true, | ||
160 | + }); | ||
161 | + disabledSwitch.value = true; | ||
162 | + const newStatus = checked ? 1 : 0; | ||
163 | + console.log(checked, record, newStatus); | ||
164 | + // const res = await putReportByidAndStatusManage(record.id, newStatus); | ||
165 | + // if (res && newStatus) { | ||
166 | + // createMessage.success(`启用成功`); | ||
167 | + // } else { | ||
168 | + // createMessage.success('禁用成功'); | ||
169 | + // } | ||
170 | + } finally { | ||
171 | + setTimeout(() => { | ||
172 | + setProps({ | ||
173 | + loading: false, | ||
174 | + }); | ||
175 | + disabledSwitch.value = false; | ||
176 | + }, 500); | ||
177 | + reload(); | ||
178 | + } | ||
179 | + }; | ||
180 | +</script> | ||
181 | +<style lang="less" scoped></style> |