Showing
8 changed files
with
430 additions
and
383 deletions
| @@ -9,6 +9,7 @@ export type SchedueParam = { | @@ -9,6 +9,7 @@ export type SchedueParam = { | ||
| 9 | orderType: string; | 9 | orderType: string; |
| 10 | data?: any; | 10 | data?: any; |
| 11 | code?: number; | 11 | code?: number; |
| 12 | + jobId?: string; | ||
| 12 | }; | 13 | }; |
| 13 | 14 | ||
| 14 | export interface ReportModel { | 15 | export interface ReportModel { |
| @@ -31,7 +31,7 @@ const [register] = useModalInner((data) => { | @@ -31,7 +31,7 @@ const [register] = useModalInner((data) => { | ||
| 31 | const resMap = res.data.executeAttributes.map(d => { | 31 | const resMap = res.data.executeAttributes.map(d => { |
| 32 | return { | 32 | return { |
| 33 | device: d.name, | 33 | device: d.name, |
| 34 | - attribute: d.attribute | 34 | + attribute: d.attributes.join(',') |
| 35 | } | 35 | } |
| 36 | }) | 36 | }) |
| 37 | tableData.value = resMap | 37 | tableData.value = resMap |
| 1 | <template> | 1 | <template> |
| 2 | - <BasicDrawer v-bind="$attrs" @register="registerDrawer" showFooter :title="getTitle" width="30%" @ok="handleSubmit"> | 2 | + <BasicDrawer :maskClosable="false" @close="handleClose" destroyOnClose v-bind="$attrs" @register="registerDrawer" |
| 3 | + showFooter :title="getTitle" width="30%" @ok="handleSubmit"> | ||
| 3 | <BasicForm @register="registerForm"> | 4 | <BasicForm @register="registerForm"> |
| 4 | <template #devices> | 5 | <template #devices> |
| 5 | <Select placeholder="请选择设备" v-model:value="selectDevice" style="width: 100%" :options="selectOptions" | 6 | <Select placeholder="请选择设备" v-model:value="selectDevice" style="width: 100%" :options="selectOptions" |
| @@ -12,7 +13,7 @@ | @@ -12,7 +13,7 @@ | ||
| 12 | </BasicDrawer> | 13 | </BasicDrawer> |
| 13 | </template> | 14 | </template> |
| 14 | <script lang="ts" setup> | 15 | <script lang="ts" setup> |
| 15 | -import { ref, computed, unref, reactive, watch, nextTick, Ref } from 'vue'; | 16 | +import { ref, computed, unref, reactive, watch, Ref } from 'vue'; |
| 16 | import { BasicForm, useForm } from '/@/components/Form'; | 17 | import { BasicForm, useForm } from '/@/components/Form'; |
| 17 | import { formSchema, organizationId } from './config.data'; | 18 | import { formSchema, organizationId } from './config.data'; |
| 18 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; | 19 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; |
| @@ -25,6 +26,7 @@ import DeviceAttrCpns from './cpns/DeviceAttrCpns.vue'; | @@ -25,6 +26,7 @@ import DeviceAttrCpns from './cpns/DeviceAttrCpns.vue'; | ||
| 25 | import { SelectTypes } from 'ant-design-vue/es/select'; | 26 | import { SelectTypes } from 'ant-design-vue/es/select'; |
| 26 | import { SchemaFiled } from './config.data'; | 27 | import { SchemaFiled } from './config.data'; |
| 27 | import { QueryWay } from '../../device/localtion/cpns/TimePeriodForm/config'; | 28 | import { QueryWay } from '../../device/localtion/cpns/TimePeriodForm/config'; |
| 29 | +import { AggregateDataEnum } from '../../device/localtion/cpns/TimePeriodForm/config'; | ||
| 28 | 30 | ||
| 29 | type TDeviceList = { | 31 | type TDeviceList = { |
| 30 | key?: string, | 32 | key?: string, |
| @@ -45,6 +47,7 @@ const deviceList: Ref<TDeviceList[]> = ref([]); | @@ -45,6 +47,7 @@ const deviceList: Ref<TDeviceList[]> = ref([]); | ||
| 45 | const editDeviceList: Ref<TDeviceList[]> = ref([]); | 47 | const editDeviceList: Ref<TDeviceList[]> = ref([]); |
| 46 | let editResData: any = reactive({}) | 48 | let editResData: any = reactive({}) |
| 47 | const watchOrgId = ref('') | 49 | const watchOrgId = ref('') |
| 50 | +const editDeviceAttr: any = ref([]) | ||
| 48 | 51 | ||
| 49 | watch(organizationId, async (newValue: string) => { | 52 | watch(organizationId, async (newValue: string) => { |
| 50 | if (!newValue) return; | 53 | if (!newValue) return; |
| @@ -65,7 +68,7 @@ const handleDeviceChange = (e) => { | @@ -65,7 +68,7 @@ const handleDeviceChange = (e) => { | ||
| 65 | console.log(e) | 68 | console.log(e) |
| 66 | deviceList.value = e; | 69 | deviceList.value = e; |
| 67 | }; | 70 | }; |
| 68 | -const [registerForm, { validate, setFieldsValue, resetFields }] = useForm({ | 71 | +const [registerForm, { validate, setFieldsValue, resetFields, updateSchema, getFieldsValue }] = useForm({ |
| 69 | labelWidth: 120, | 72 | labelWidth: 120, |
| 70 | schemas: formSchema, | 73 | schemas: formSchema, |
| 71 | showActionButtonGroup: false, | 74 | showActionButtonGroup: false, |
| @@ -75,13 +78,6 @@ const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async ( | @@ -75,13 +78,6 @@ const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async ( | ||
| 75 | await resetFields(); | 78 | await resetFields(); |
| 76 | setDrawerProps({ confirmLoading: false }); | 79 | setDrawerProps({ confirmLoading: false }); |
| 77 | isUpdate.value = !!data?.isUpdate; | 80 | isUpdate.value = !!data?.isUpdate; |
| 78 | - editId.value = ''; | ||
| 79 | - orgId.value = ''; | ||
| 80 | - selectDevice.value = []; | ||
| 81 | - selectOptions.value = []; | ||
| 82 | - deviceList.value = []; | ||
| 83 | - getAttrDevice.value = [] | ||
| 84 | - editDeviceList.value = [] | ||
| 85 | if (unref(isUpdate)) { | 81 | if (unref(isUpdate)) { |
| 86 | //编辑回显数据 | 82 | //编辑回显数据 |
| 87 | editResData = await reportEditDetailPage(data.record.id) | 83 | editResData = await reportEditDetailPage(data.record.id) |
| @@ -89,13 +85,46 @@ const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async ( | @@ -89,13 +85,46 @@ const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async ( | ||
| 89 | editId.value = editResData.data.id; | 85 | editId.value = editResData.data.id; |
| 90 | await setFieldsValue(editResData.data); | 86 | await setFieldsValue(editResData.data); |
| 91 | //回显嵌套数据 | 87 | //回显嵌套数据 |
| 92 | - setFieldsValue({ | 88 | + await setFieldsValue({ |
| 93 | agg: editResData.data.queryCondition?.agg, | 89 | agg: editResData.data.queryCondition?.agg, |
| 94 | interval: editResData.data.queryCondition?.interval, | 90 | interval: editResData.data.queryCondition?.interval, |
| 95 | - limit: editResData.data.queryCondition?.limit, | 91 | + limit1: editResData.data.queryCondition?.limit, |
| 96 | orderBy: editResData.data.queryCondition?.orderBy, | 92 | orderBy: editResData.data.queryCondition?.orderBy, |
| 97 | useStrictDataTypes: editResData.data.queryCondition?.useStrictDataTypes | 93 | useStrictDataTypes: editResData.data.queryCondition?.useStrictDataTypes |
| 98 | }); | 94 | }); |
| 95 | + //回显聚合条件 | ||
| 96 | + const dataCompareOpions = [ | ||
| 97 | + { label: '最小值', value: AggregateDataEnum.MIN }, | ||
| 98 | + { label: '最大值', value: AggregateDataEnum.MAX }, | ||
| 99 | + { label: '平均值', value: AggregateDataEnum.AVG }, | ||
| 100 | + { label: '求和', value: AggregateDataEnum.SUM }, | ||
| 101 | + { label: '空', value: AggregateDataEnum.NONE } | ||
| 102 | + ] | ||
| 103 | + const updateSchemaAgg = (options: {}) => { | ||
| 104 | + updateSchema({ | ||
| 105 | + field: SchemaFiled.AGG, | ||
| 106 | + componentProps: { | ||
| 107 | + options, | ||
| 108 | + }, | ||
| 109 | + }); | ||
| 110 | + } | ||
| 111 | + if (editResData.data.dataType == 1) updateSchemaAgg(dataCompareOpions.slice(0, 4)) | ||
| 112 | + else updateSchemaAgg(dataCompareOpions.slice(4, 5)) | ||
| 113 | + //回显执行方式和查询周期 | ||
| 114 | + const dataQueryOpions = [ | ||
| 115 | + { label: '固定周期', value: QueryWay.LATEST }, | ||
| 116 | + { label: '自定义周期', value: QueryWay.TIME_PERIOD }, | ||
| 117 | + ]; | ||
| 118 | + const updateSchemaQuery = (options: {}) => { | ||
| 119 | + updateSchema({ | ||
| 120 | + field: SchemaFiled.WAY, | ||
| 121 | + componentProps: { | ||
| 122 | + options, | ||
| 123 | + }, | ||
| 124 | + }); | ||
| 125 | + } | ||
| 126 | + if (editResData.data.executeWay == 0) updateSchemaQuery(dataQueryOpions) | ||
| 127 | + else updateSchemaQuery(dataQueryOpions.slice(0, 1)) | ||
| 99 | //回显设备 | 128 | //回显设备 |
| 100 | orgId.value = editResData.data.organizationId; | 129 | orgId.value = editResData.data.organizationId; |
| 101 | const { items } = await screenLinkPageByDeptIdGetDevice({ | 130 | const { items } = await screenLinkPageByDeptIdGetDevice({ |
| @@ -116,18 +145,49 @@ const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async ( | @@ -116,18 +145,49 @@ const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async ( | ||
| 116 | }) | 145 | }) |
| 117 | selectDevice.value = deviceIds; | 146 | selectDevice.value = deviceIds; |
| 118 | //回显设备属性 | 147 | //回显设备属性 |
| 119 | - const editDeviceAttr = editResData.data.executeAttributes?.map(item => { | 148 | + editDeviceAttr.value = editResData.data.executeAttributes?.map(item => { |
| 120 | return { | 149 | return { |
| 121 | label: item.name, | 150 | label: item.name, |
| 122 | value: item.device, | 151 | value: item.device, |
| 123 | - attribute: item.attribute, | 152 | + attributes: item.attributes, |
| 124 | } | 153 | } |
| 125 | }) | 154 | }) |
| 126 | - deviceList.value = editDeviceAttr | 155 | + deviceList.value = editDeviceAttr.value |
| 127 | editDeviceList.value = editResData.data.executeAttributes | 156 | editDeviceList.value = editResData.data.executeAttributes |
| 128 | - nextTick(() => { }); | 157 | + } else { |
| 158 | + editId.value = ''; | ||
| 159 | + orgId.value = ''; | ||
| 160 | + selectDevice.value = []; | ||
| 161 | + selectOptions.value = []; | ||
| 162 | + deviceList.value = []; | ||
| 163 | + getAttrDevice.value = [] | ||
| 164 | + editDeviceList.value = [] | ||
| 165 | + editDeviceAttr.value = [] | ||
| 166 | + updateSchema({ | ||
| 167 | + field: SchemaFiled.AGG, | ||
| 168 | + componentProps: { | ||
| 169 | + options: [], | ||
| 170 | + }, | ||
| 171 | + }); | ||
| 172 | + //新增显示执行方式和查询周期 | ||
| 173 | + const dataQueryOpions = [ | ||
| 174 | + { label: '固定周期', value: QueryWay.LATEST }, | ||
| 175 | + { label: '自定义周期', value: QueryWay.TIME_PERIOD }, | ||
| 176 | + ]; | ||
| 177 | + const updateSchemaQuery = (options: {}) => { | ||
| 178 | + updateSchema({ | ||
| 179 | + field: SchemaFiled.WAY, | ||
| 180 | + componentProps: { | ||
| 181 | + options, | ||
| 182 | + }, | ||
| 183 | + }); | ||
| 184 | + } | ||
| 185 | + if (getFieldsValue().executeWay == 0) updateSchemaQuery(dataQueryOpions) | ||
| 129 | } | 186 | } |
| 130 | }); | 187 | }); |
| 188 | +const handleClose = () => { | ||
| 189 | + deviceList.value = []; | ||
| 190 | +} | ||
| 131 | const getAttrDevice: Ref<TDeviceList[]> = ref([]); | 191 | const getAttrDevice: Ref<TDeviceList[]> = ref([]); |
| 132 | const getTitle = computed(() => (!unref(isUpdate) ? '新增报表配置' : '编辑报表配置')); | 192 | const getTitle = computed(() => (!unref(isUpdate) ? '新增报表配置' : '编辑报表配置')); |
| 133 | const handleChange = (e: any) => { | 193 | const handleChange = (e: any) => { |
| @@ -157,7 +217,7 @@ async function handleSubmit() { | @@ -157,7 +217,7 @@ async function handleSubmit() { | ||
| 157 | queryCondition = { | 217 | queryCondition = { |
| 158 | agg: values.agg, | 218 | agg: values.agg, |
| 159 | interval: values.interval, | 219 | interval: values.interval, |
| 160 | - limit: values.limit, | 220 | + limit: values.limit1, |
| 161 | }; | 221 | }; |
| 162 | if (values.way === QueryWay.LATEST) { | 222 | if (values.way === QueryWay.LATEST) { |
| 163 | startTs.value = moment().subtract(values.startTs, 'ms').valueOf() | 223 | startTs.value = moment().subtract(values.startTs, 'ms').valueOf() |
| @@ -174,6 +234,7 @@ async function handleSubmit() { | @@ -174,6 +234,7 @@ async function handleSubmit() { | ||
| 174 | delete values.cronTime; | 234 | delete values.cronTime; |
| 175 | delete values.cronWeek; | 235 | delete values.cronWeek; |
| 176 | delete values.cronYear; | 236 | delete values.cronYear; |
| 237 | + delete values.limit1; | ||
| 177 | postObj = { | 238 | postObj = { |
| 178 | ...values, | 239 | ...values, |
| 179 | ...{ executeAttributes: getAttrDevice.value.length == 0 ? editDeviceList.value : getAttrDevice.value }, | 240 | ...{ executeAttributes: getAttrDevice.value.length == 0 ? editDeviceList.value : getAttrDevice.value }, |
| @@ -5,7 +5,7 @@ import moment from 'moment'; | @@ -5,7 +5,7 @@ import moment from 'moment'; | ||
| 5 | import { getOrganizationList } from '/@/api/system/system'; | 5 | import { getOrganizationList } from '/@/api/system/system'; |
| 6 | import { copyTransFun } from '/@/utils/fnUtils'; | 6 | import { copyTransFun } from '/@/utils/fnUtils'; |
| 7 | import { findDictItemByCode } from '/@/api/system/dict'; | 7 | import { findDictItemByCode } from '/@/api/system/dict'; |
| 8 | -import { isTiming, isWeek, isMonth } from './timeConfig'; | 8 | +import { isTiming, isWeek, isMonth, isFixedTime } from './timeConfig'; |
| 9 | import { AggregateDataEnum } from '../../device/localtion/cpns/TimePeriodForm/config'; | 9 | import { AggregateDataEnum } from '../../device/localtion/cpns/TimePeriodForm/config'; |
| 10 | import { Moment } from 'moment'; | 10 | import { Moment } from 'moment'; |
| 11 | import { | 11 | import { |
| @@ -13,6 +13,8 @@ import { | @@ -13,6 +13,8 @@ import { | ||
| 13 | getPacketIntervalByValue, | 13 | getPacketIntervalByValue, |
| 14 | intervalOption, | 14 | intervalOption, |
| 15 | } from '../../device/localtion/cpns/TimePeriodForm/helper'; | 15 | } from '../../device/localtion/cpns/TimePeriodForm/helper'; |
| 16 | +import { USER_INFO_KEY } from '/@/enums/cacheEnum'; | ||
| 17 | +import { getAuthCache } from '/@/utils/auth'; | ||
| 16 | 18 | ||
| 17 | export enum QueryWay { | 19 | export enum QueryWay { |
| 18 | LATEST = 'latest', | 20 | LATEST = 'latest', |
| @@ -45,10 +47,10 @@ export const columns: BasicColumn[] = [ | @@ -45,10 +47,10 @@ export const columns: BasicColumn[] = [ | ||
| 45 | }, | 47 | }, |
| 46 | { | 48 | { |
| 47 | title: '数据类型', | 49 | title: '数据类型', |
| 48 | - dataIndex: 'dataCompare', | 50 | + dataIndex: 'dataType', |
| 49 | width: 120, | 51 | width: 120, |
| 50 | format: (_text: string, record: Recordable) => { | 52 | format: (_text: string, record: Recordable) => { |
| 51 | - return record.dataCompare === 0 ? '历史数据' : record.dataCompare === 1 ? '同比' : '环比'; | 53 | + return record.dataType === 0 ? '历史数据' : record.dataType === 1 ? '同比' : '环比'; |
| 52 | }, | 54 | }, |
| 53 | }, | 55 | }, |
| 54 | { | 56 | { |
| @@ -75,6 +77,10 @@ export const columns: BasicColumn[] = [ | @@ -75,6 +77,10 @@ export const columns: BasicColumn[] = [ | ||
| 75 | title: '创建人', | 77 | title: '创建人', |
| 76 | dataIndex: 'creator', | 78 | dataIndex: 'creator', |
| 77 | width: 180, | 79 | width: 180, |
| 80 | + format: (_text: string, record: Recordable) => { | ||
| 81 | + const userInfo: any = getAuthCache(USER_INFO_KEY); | ||
| 82 | + if (record.creator == userInfo.userId) return userInfo.realName || userInfo.username; | ||
| 83 | + }, | ||
| 78 | }, | 84 | }, |
| 79 | { | 85 | { |
| 80 | title: '创建日期', | 86 | title: '创建日期', |
| @@ -191,9 +197,9 @@ export const formSchema: QFormSchema[] = [ | @@ -191,9 +197,9 @@ export const formSchema: QFormSchema[] = [ | ||
| 191 | span: 24, | 197 | span: 24, |
| 192 | }, | 198 | }, |
| 193 | defaultValue: 0, | 199 | defaultValue: 0, |
| 194 | - componentProps: { | ||
| 195 | - placeholder: '请选择执行方式', | ||
| 196 | - options: [ | 200 | + componentProps: ({ formActionType }) => { |
| 201 | + const { updateSchema, setFieldsValue } = formActionType; | ||
| 202 | + const options = [ | ||
| 197 | { | 203 | { |
| 198 | label: '立即执行', | 204 | label: '立即执行', |
| 199 | value: 0, | 205 | value: 0, |
| @@ -202,7 +208,38 @@ export const formSchema: QFormSchema[] = [ | @@ -202,7 +208,38 @@ export const formSchema: QFormSchema[] = [ | ||
| 202 | label: '定时执行', | 208 | label: '定时执行', |
| 203 | value: 1, | 209 | value: 1, |
| 204 | }, | 210 | }, |
| 205 | - ], | 211 | + ]; |
| 212 | + return { | ||
| 213 | + options, | ||
| 214 | + placeholder: '请选择执行方式', | ||
| 215 | + onChange(e) { | ||
| 216 | + let dataCompareOpions: any = []; | ||
| 217 | + if (e.target.value == 0) { | ||
| 218 | + setFieldsValue({ way: QueryWay.LATEST }); | ||
| 219 | + dataCompareOpions = [ | ||
| 220 | + { label: '固定周期', value: QueryWay.LATEST }, | ||
| 221 | + { label: '自定义周期', value: QueryWay.TIME_PERIOD }, | ||
| 222 | + ]; | ||
| 223 | + updateSchema({ | ||
| 224 | + field: SchemaFiled.WAY, | ||
| 225 | + componentProps: { | ||
| 226 | + options: dataCompareOpions, | ||
| 227 | + }, | ||
| 228 | + }); | ||
| 229 | + } else { | ||
| 230 | + setFieldsValue({ way: QueryWay.LATEST }); | ||
| 231 | + dataCompareOpions = [{ label: '固定周期', value: QueryWay.LATEST }]; | ||
| 232 | + updateSchema({ | ||
| 233 | + defaultValue: QueryWay.LATEST, | ||
| 234 | + field: SchemaFiled.WAY, | ||
| 235 | + componentProps: { | ||
| 236 | + options: dataCompareOpions, | ||
| 237 | + }, | ||
| 238 | + }); | ||
| 239 | + } | ||
| 240 | + }, | ||
| 241 | + maxLength: 250, | ||
| 242 | + }; | ||
| 206 | }, | 243 | }, |
| 207 | }, | 244 | }, |
| 208 | { | 245 | { |
| @@ -276,63 +313,6 @@ export const formSchema: QFormSchema[] = [ | @@ -276,63 +313,6 @@ export const formSchema: QFormSchema[] = [ | ||
| 276 | }, | 313 | }, |
| 277 | ifShow: ({ values }) => isTiming(values.executeWay), | 314 | ifShow: ({ values }) => isTiming(values.executeWay), |
| 278 | }, | 315 | }, |
| 279 | - | ||
| 280 | - { | ||
| 281 | - field: 'attributeNature', | ||
| 282 | - component: 'RadioGroup', | ||
| 283 | - label: '属性性质', | ||
| 284 | - required: true, | ||
| 285 | - colProps: { | ||
| 286 | - span: 24, | ||
| 287 | - }, | ||
| 288 | - defaultValue: 0, | ||
| 289 | - componentProps: ({ formActionType }) => { | ||
| 290 | - const { updateSchema, setFieldsValue } = formActionType; | ||
| 291 | - const options = [ | ||
| 292 | - { | ||
| 293 | - label: '共有', | ||
| 294 | - value: 0, | ||
| 295 | - }, | ||
| 296 | - { | ||
| 297 | - label: '全部', | ||
| 298 | - value: 1, | ||
| 299 | - }, | ||
| 300 | - ]; | ||
| 301 | - return { | ||
| 302 | - options, | ||
| 303 | - async onChange(e) { | ||
| 304 | - if (e) { | ||
| 305 | - let dataCompareOpions: any = []; | ||
| 306 | - if (e.target.value == 1) { | ||
| 307 | - setFieldsValue({ dataCompare: '' }); | ||
| 308 | - dataCompareOpions = [{ label: '历史数据', value: 0 }]; | ||
| 309 | - updateSchema({ | ||
| 310 | - field: 'dataCompare', | ||
| 311 | - componentProps: { | ||
| 312 | - options: dataCompareOpions, | ||
| 313 | - }, | ||
| 314 | - }); | ||
| 315 | - } else { | ||
| 316 | - setFieldsValue({ dataCompare: '' }); | ||
| 317 | - dataCompareOpions = [ | ||
| 318 | - { label: '历史数据', value: 0 }, | ||
| 319 | - { label: '同比', value: 1 }, | ||
| 320 | - { label: '环比', value: 2 }, | ||
| 321 | - ]; | ||
| 322 | - updateSchema({ | ||
| 323 | - field: 'dataCompare', | ||
| 324 | - componentProps: { | ||
| 325 | - options: dataCompareOpions, | ||
| 326 | - }, | ||
| 327 | - }); | ||
| 328 | - } | ||
| 329 | - } | ||
| 330 | - }, | ||
| 331 | - maxLength: 250, | ||
| 332 | - placeholder: '请选择属性性质', | ||
| 333 | - }; | ||
| 334 | - }, | ||
| 335 | - }, | ||
| 336 | { | 316 | { |
| 337 | field: 'devices', | 317 | field: 'devices', |
| 338 | label: '设备', | 318 | label: '设备', |
| @@ -347,17 +327,49 @@ export const formSchema: QFormSchema[] = [ | @@ -347,17 +327,49 @@ export const formSchema: QFormSchema[] = [ | ||
| 347 | colProps: { span: 24 }, | 327 | colProps: { span: 24 }, |
| 348 | }, | 328 | }, |
| 349 | { | 329 | { |
| 350 | - field: 'dataCompare', | 330 | + field: 'dataType', |
| 351 | label: '数据类型', | 331 | label: '数据类型', |
| 352 | required: true, | 332 | required: true, |
| 353 | component: 'Select', | 333 | component: 'Select', |
| 354 | - componentProps: { | ||
| 355 | - placeholder: '请选择数据类型', | ||
| 356 | - options: [ | ||
| 357 | - { label: '历史数据', value: 0 }, | ||
| 358 | - { label: '同比', value: 1 }, | ||
| 359 | - { label: '环比', value: 2 }, | ||
| 360 | - ], | 334 | + componentProps: ({ formActionType }) => { |
| 335 | + const { updateSchema, setFieldsValue } = formActionType; | ||
| 336 | + const options = [ | ||
| 337 | + { label: '原始数据', value: 0 }, | ||
| 338 | + { label: '聚合数据', value: 1 }, | ||
| 339 | + ]; | ||
| 340 | + return { | ||
| 341 | + options, | ||
| 342 | + onSelect(e) { | ||
| 343 | + let dataCompareOpions: any = []; | ||
| 344 | + if (e == 0) { | ||
| 345 | + setFieldsValue({ agg: 'NONE' }); | ||
| 346 | + dataCompareOpions = [{ label: '空', value: AggregateDataEnum.NONE }]; | ||
| 347 | + updateSchema({ | ||
| 348 | + field: SchemaFiled.AGG, | ||
| 349 | + componentProps: { | ||
| 350 | + options: dataCompareOpions, | ||
| 351 | + }, | ||
| 352 | + }); | ||
| 353 | + } else { | ||
| 354 | + setFieldsValue({ agg: '' }); | ||
| 355 | + dataCompareOpions = [ | ||
| 356 | + { label: '最小值', value: AggregateDataEnum.MIN }, | ||
| 357 | + { label: '最大值', value: AggregateDataEnum.MAX }, | ||
| 358 | + { label: '平均值', value: AggregateDataEnum.AVG }, | ||
| 359 | + { label: '求和', value: AggregateDataEnum.SUM }, | ||
| 360 | + { label: '计数', value: AggregateDataEnum.COUNT }, | ||
| 361 | + ]; | ||
| 362 | + updateSchema({ | ||
| 363 | + field: SchemaFiled.AGG, | ||
| 364 | + componentProps: { | ||
| 365 | + options: dataCompareOpions, | ||
| 366 | + }, | ||
| 367 | + }); | ||
| 368 | + } | ||
| 369 | + }, | ||
| 370 | + maxLength: 250, | ||
| 371 | + placeholder: '请选择属性性质', | ||
| 372 | + }; | ||
| 361 | }, | 373 | }, |
| 362 | colProps: { span: 24 }, | 374 | colProps: { span: 24 }, |
| 363 | }, | 375 | }, |
| @@ -369,30 +381,22 @@ export const formSchema: QFormSchema[] = [ | @@ -369,30 +381,22 @@ export const formSchema: QFormSchema[] = [ | ||
| 369 | componentProps: { | 381 | componentProps: { |
| 370 | placeholder: '请选择聚合条件', | 382 | placeholder: '请选择聚合条件', |
| 371 | getPopupContainer: () => document.body, | 383 | getPopupContainer: () => document.body, |
| 372 | - options: [ | ||
| 373 | - { label: '最小值', value: AggregateDataEnum.MIN }, | ||
| 374 | - { label: '最大值', value: AggregateDataEnum.MAX }, | ||
| 375 | - { label: '平均值', value: AggregateDataEnum.AVG }, | ||
| 376 | - { label: '求和', value: AggregateDataEnum.SUM }, | ||
| 377 | - { label: '计数', value: AggregateDataEnum.COUNT }, | ||
| 378 | - { label: '空', value: AggregateDataEnum.NONE }, | ||
| 379 | - ], | ||
| 380 | }, | 384 | }, |
| 381 | }, | 385 | }, |
| 382 | { | 386 | { |
| 383 | - field: SchemaFiled.LIMIT, | 387 | + field: 'limit1', |
| 388 | + required: true, | ||
| 384 | label: '最大值', | 389 | label: '最大值', |
| 385 | component: 'InputNumber', | 390 | component: 'InputNumber', |
| 386 | - required: true, | 391 | + defaultValue: 200, |
| 387 | ifShow({ values }) { | 392 | ifShow({ values }) { |
| 388 | return values[SchemaFiled.AGG] === AggregateDataEnum.NONE; | 393 | return values[SchemaFiled.AGG] === AggregateDataEnum.NONE; |
| 389 | }, | 394 | }, |
| 390 | - defaultValue: 200, | ||
| 391 | - componentProps() { | ||
| 392 | - return { | ||
| 393 | - max: 50000, | ||
| 394 | - min: 7, | ||
| 395 | - }; | 395 | + colProps: { span: 12 }, |
| 396 | + componentProps: { | ||
| 397 | + placeholder: '请输入最大值', | ||
| 398 | + min: 7, | ||
| 399 | + max: 50000, | ||
| 396 | }, | 400 | }, |
| 397 | }, | 401 | }, |
| 398 | { | 402 | { |
| @@ -404,7 +408,7 @@ export const formSchema: QFormSchema[] = [ | @@ -404,7 +408,7 @@ export const formSchema: QFormSchema[] = [ | ||
| 404 | componentProps({ formActionType }) { | 408 | componentProps({ formActionType }) { |
| 405 | const { setFieldsValue } = formActionType; | 409 | const { setFieldsValue } = formActionType; |
| 406 | return { | 410 | return { |
| 407 | - getPopupContainer: () => document.body, | 411 | + getPopupContainer: () => document.body, |
| 408 | placeholder: '请选择查询周期', | 412 | placeholder: '请选择查询周期', |
| 409 | options: [ | 413 | options: [ |
| 410 | { label: '固定周期', value: QueryWay.LATEST }, | 414 | { label: '固定周期', value: QueryWay.LATEST }, |
| @@ -428,13 +432,13 @@ export const formSchema: QFormSchema[] = [ | @@ -428,13 +432,13 @@ export const formSchema: QFormSchema[] = [ | ||
| 428 | component: 'RangePicker', | 432 | component: 'RangePicker', |
| 429 | required: true, | 433 | required: true, |
| 430 | ifShow({ values }) { | 434 | ifShow({ values }) { |
| 431 | - return values[SchemaFiled.WAY] === QueryWay.TIME_PERIOD; | 435 | + return values[SchemaFiled.WAY] === QueryWay.TIME_PERIOD && !isFixedTime(values.executeWay); |
| 432 | }, | 436 | }, |
| 433 | componentProps({ formActionType }) { | 437 | componentProps({ formActionType }) { |
| 434 | const { setFieldsValue } = formActionType; | 438 | const { setFieldsValue } = formActionType; |
| 435 | let dates: Moment[] = []; | 439 | let dates: Moment[] = []; |
| 436 | return { | 440 | return { |
| 437 | - placeholder: ['请选择开始时间','请选择结束时间'], | 441 | + placeholder: ['请选择开始时间', '请选择结束时间'], |
| 438 | showTime: true, | 442 | showTime: true, |
| 439 | onCalendarChange(value: Moment[]) { | 443 | onCalendarChange(value: Moment[]) { |
| 440 | dates = value; | 444 | dates = value; |
| @@ -460,17 +464,14 @@ export const formSchema: QFormSchema[] = [ | @@ -460,17 +464,14 @@ export const formSchema: QFormSchema[] = [ | ||
| 460 | field: SchemaFiled.START_TS, | 464 | field: SchemaFiled.START_TS, |
| 461 | label: '时间周期', | 465 | label: '时间周期', |
| 462 | component: 'Select', | 466 | component: 'Select', |
| 463 | - // defaultValue: 1000, | ||
| 464 | required: true, | 467 | required: true, |
| 465 | ifShow({ values }) { | 468 | ifShow({ values }) { |
| 466 | - return ( | ||
| 467 | - values[SchemaFiled.AGG] !== AggregateDataEnum.NONE && | ||
| 468 | - values[SchemaFiled.WAY] == QueryWay.LATEST | ||
| 469 | - ); | 469 | + return values[SchemaFiled.WAY] == QueryWay.LATEST; |
| 470 | }, | 470 | }, |
| 471 | componentProps({ formActionType }) { | 471 | componentProps({ formActionType }) { |
| 472 | const { setFieldsValue } = formActionType; | 472 | const { setFieldsValue } = formActionType; |
| 473 | return { | 473 | return { |
| 474 | + defaultValue: 1000, | ||
| 474 | placeholder: '请选择时间周期', | 475 | placeholder: '请选择时间周期', |
| 475 | options: intervalOption, | 476 | options: intervalOption, |
| 476 | onChange() { | 477 | onChange() { |
| @@ -484,12 +485,8 @@ export const formSchema: QFormSchema[] = [ | @@ -484,12 +485,8 @@ export const formSchema: QFormSchema[] = [ | ||
| 484 | label: '间隔时间', | 485 | label: '间隔时间', |
| 485 | component: 'Select', | 486 | component: 'Select', |
| 486 | required: true, | 487 | required: true, |
| 487 | - // defaultValue: 1000, | ||
| 488 | ifShow({ values }) { | 488 | ifShow({ values }) { |
| 489 | - return ( | ||
| 490 | - values[SchemaFiled.AGG] !== AggregateDataEnum.NONE && | ||
| 491 | - values[SchemaFiled.WAY] == QueryWay.LATEST | ||
| 492 | - ); | 489 | + return values[SchemaFiled.WAY] == QueryWay.LATEST; |
| 493 | }, | 490 | }, |
| 494 | componentProps({ formModel, formActionType }) { | 491 | componentProps({ formModel, formActionType }) { |
| 495 | const options = | 492 | const options = |
| @@ -500,6 +497,7 @@ export const formSchema: QFormSchema[] = [ | @@ -500,6 +497,7 @@ export const formSchema: QFormSchema[] = [ | ||
| 500 | formActionType.setFieldsValue({ [SchemaFiled.LIMIT]: null }); | 497 | formActionType.setFieldsValue({ [SchemaFiled.LIMIT]: null }); |
| 501 | } | 498 | } |
| 502 | return { | 499 | return { |
| 500 | + // defaultValue: 1000, | ||
| 503 | placeholder: '请选择间隔时间', | 501 | placeholder: '请选择间隔时间', |
| 504 | options, | 502 | options, |
| 505 | }; | 503 | }; |
| @@ -2,8 +2,8 @@ | @@ -2,8 +2,8 @@ | ||
| 2 | <div v-for="param in dynamicInput.params" :key="param.key" style="display: flex; margin-top: 0.25vh"> | 2 | <div v-for="param in dynamicInput.params" :key="param.key" style="display: flex; margin-top: 0.25vh"> |
| 3 | <a-input :disabled="true" v-model:value="param.device" style="width: 38%; margin-bottom: 5px; margin-left: 1vh" | 3 | <a-input :disabled="true" v-model:value="param.device" style="width: 38%; margin-bottom: 5px; margin-left: 1vh" |
| 4 | @change="emitChange" /> | 4 | @change="emitChange" /> |
| 5 | - <Select placeholder="请选择设备属性" v-model:value="param.attribute" style="width: 160px; margin-left: 1.8vw" | ||
| 6 | - :options="selectOptions" @change="emitChange" allowClear /> | 5 | + <Select placeholder="请选择设备属性" v-model:value="param.attributes" style="width: 160px; margin-left: 1.8vw" |
| 6 | + :options="selectOptions" @change="emitChange" allowClear mode="multiple" /> | ||
| 7 | </div> | 7 | </div> |
| 8 | </template> | 8 | </template> |
| 9 | <script lang="ts"> | 9 | <script lang="ts"> |
| @@ -20,7 +20,7 @@ import { getAttribute } from '/@/api/ruleengine/ruleengineApi'; | @@ -20,7 +20,7 @@ import { getAttribute } from '/@/api/ruleengine/ruleengineApi'; | ||
| 20 | 20 | ||
| 21 | interface Params { | 21 | interface Params { |
| 22 | [x: string]: string; | 22 | [x: string]: string; |
| 23 | - attribute: string; | 23 | + attributes: any; |
| 24 | device: string; | 24 | device: string; |
| 25 | } | 25 | } |
| 26 | const props = defineProps({ | 26 | const props = defineProps({ |
| @@ -49,13 +49,14 @@ watchEffect(() => { | @@ -49,13 +49,14 @@ watchEffect(() => { | ||
| 49 | * 初始化数值 | 49 | * 初始化数值 |
| 50 | */ | 50 | */ |
| 51 | async function initVal() { | 51 | async function initVal() { |
| 52 | + dynamicInput.params = [] | ||
| 52 | if (props.value && props.orgId) { | 53 | if (props.value && props.orgId) { |
| 53 | let jsonObj = props.value; | 54 | let jsonObj = props.value; |
| 54 | const deviceId = jsonObj.map((m: any) => m.value); | 55 | const deviceId = jsonObj.map((m: any) => m.value); |
| 55 | await getAttr(props.orgId, deviceId); | 56 | await getAttr(props.orgId, deviceId); |
| 56 | dynamicInput.params = jsonObj.map((item: any) => { | 57 | dynamicInput.params = jsonObj.map((item: any) => { |
| 57 | return { | 58 | return { |
| 58 | - attribute: item.attribute, | 59 | + attributes: item.attributes, |
| 59 | device: item.label, | 60 | device: item.label, |
| 60 | value: item.value, | 61 | value: item.value, |
| 61 | } | 62 | } |
| @@ -70,7 +71,7 @@ function emitChange() { | @@ -70,7 +71,7 @@ function emitChange() { | ||
| 70 | if (dynamicInput.params.length > 0) { | 71 | if (dynamicInput.params.length > 0) { |
| 71 | dynamicInput.params.forEach((item: Params) => { | 72 | dynamicInput.params.forEach((item: Params) => { |
| 72 | obj.push({ | 73 | obj.push({ |
| 73 | - attribute: item.attribute, | 74 | + attributes: item.attributes, |
| 74 | device: item.value, | 75 | device: item.value, |
| 75 | name: item.device | 76 | name: item.device |
| 76 | }); | 77 | }); |
| @@ -86,6 +86,7 @@ export enum TypeEnum { | @@ -86,6 +86,7 @@ export enum TypeEnum { | ||
| 86 | IS_AVG = 'AVG', | 86 | IS_AVG = 'AVG', |
| 87 | IS_SUM = 'SUM', | 87 | IS_SUM = 'SUM', |
| 88 | COUNT = 'COUNT', | 88 | COUNT = 'COUNT', |
| 89 | + IS_FIXED_TIME = 1, | ||
| 89 | } | 90 | } |
| 90 | 91 | ||
| 91 | export enum AggregateDataEnum { | 92 | export enum AggregateDataEnum { |
| @@ -96,6 +97,9 @@ export enum AggregateDataEnum { | @@ -96,6 +97,9 @@ export enum AggregateDataEnum { | ||
| 96 | COUNT = 'COUNT', | 97 | COUNT = 'COUNT', |
| 97 | NONE = 'NONE', | 98 | NONE = 'NONE', |
| 98 | } | 99 | } |
| 100 | +export const isFixedTime = (type: string) => { | ||
| 101 | + return type === TypeEnum.IS_FIXED_TIME; | ||
| 102 | +}; | ||
| 99 | 103 | ||
| 100 | export const isTiming = (type: string) => { | 104 | export const isTiming = (type: string) => { |
| 101 | return type === TypeEnum.IS_TIMING; | 105 | return type === TypeEnum.IS_TIMING; |
| 1 | <template> | 1 | <template> |
| 2 | <div> | 2 | <div> |
| 3 | - <BasicModal | ||
| 4 | - v-bind="$attrs" | ||
| 5 | - width="110rem" | ||
| 6 | - :height="heightNum" | ||
| 7 | - @register="register" | ||
| 8 | - title="调度日志" | ||
| 9 | - @cancel="handleCancel" | ||
| 10 | - :showOkBtn="false" | ||
| 11 | - destroyOnClose | ||
| 12 | - > | 3 | + <BasicModal v-bind="$attrs" width="110rem" :height="heightNum" @register="register" title="调度日志" |
| 4 | + @cancel="handleCancel" :showOkBtn="false" destroyOnClose> | ||
| 13 | <div> | 5 | <div> |
| 14 | <BasicTable @register="registerTable"> | 6 | <BasicTable @register="registerTable"> |
| 15 | <template #toolbar> | 7 | <template #toolbar> |
| 16 | - <Popconfirm | ||
| 17 | - title="您确定要清空全部数据" | ||
| 18 | - ok-text="确定" | ||
| 19 | - cancel-text="取消" | ||
| 20 | - @confirm="handleClear" | ||
| 21 | - > | 8 | + <Popconfirm title="您确定要清空全部数据" ok-text="确定" cancel-text="取消" @confirm="handleClear"> |
| 22 | <a-button type="primary"> 清空 </a-button> | 9 | <a-button type="primary"> 清空 </a-button> |
| 23 | </Popconfirm> | 10 | </Popconfirm> |
| 24 | <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消"> | 11 | <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消"> |
| @@ -28,24 +15,22 @@ | @@ -28,24 +15,22 @@ | ||
| 28 | </Popconfirm> | 15 | </Popconfirm> |
| 29 | </template> | 16 | </template> |
| 30 | <template #action="{ record }"> | 17 | <template #action="{ record }"> |
| 31 | - <TableAction | ||
| 32 | - :actions="[ | ||
| 33 | - { | ||
| 34 | - label: '查看', | ||
| 35 | - icon: 'clarity:note-edit-line', | ||
| 36 | - onClick: handleView.bind(null, record), | 18 | + <TableAction :actions="[ |
| 19 | + { | ||
| 20 | + label: '查看', | ||
| 21 | + icon: 'clarity:note-edit-line', | ||
| 22 | + onClick: handleView.bind(null, record), | ||
| 23 | + }, | ||
| 24 | + { | ||
| 25 | + label: '删除', | ||
| 26 | + icon: 'ant-design:delete-outlined', | ||
| 27 | + color: 'error', | ||
| 28 | + popConfirm: { | ||
| 29 | + title: '是否确认删除', | ||
| 30 | + confirm: handleDeleteOrBatchDelete.bind(null, record), | ||
| 37 | }, | 31 | }, |
| 38 | - { | ||
| 39 | - label: '删除', | ||
| 40 | - icon: 'ant-design:delete-outlined', | ||
| 41 | - color: 'error', | ||
| 42 | - popConfirm: { | ||
| 43 | - title: '是否确认删除', | ||
| 44 | - confirm: handleDeleteOrBatchDelete.bind(null, record), | ||
| 45 | - }, | ||
| 46 | - }, | ||
| 47 | - ]" | ||
| 48 | - /> | 32 | + }, |
| 33 | + ]" /> | ||
| 49 | </template> | 34 | </template> |
| 50 | </BasicTable> | 35 | </BasicTable> |
| 51 | <ScheduleLogViewModal @register="registerModalScheduleLogView" /> | 36 | <ScheduleLogViewModal @register="registerModalScheduleLogView" /> |
| @@ -54,80 +39,85 @@ | @@ -54,80 +39,85 @@ | ||
| 54 | </div> | 39 | </div> |
| 55 | </template> | 40 | </template> |
| 56 | <script setup lang="ts"> | 41 | <script setup lang="ts"> |
| 57 | - import { ref, nextTick } from 'vue'; | ||
| 58 | - import { BasicModal, useModalInner } from '/@/components/Modal'; | ||
| 59 | - import { BasicTable, useTable, TableAction } from '/@/components/Table'; | ||
| 60 | - import { columnSchedue, searchSchedueFormSchema } from './config.data'; | ||
| 61 | - import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 62 | - import { | ||
| 63 | - deleteSchedueLogManage, | ||
| 64 | - schedueLogPage, | ||
| 65 | - schedueLogCleanPage, | ||
| 66 | - } from '/@/api/schedue/schedueManager'; | ||
| 67 | - import { Popconfirm } from 'ant-design-vue'; | ||
| 68 | - import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 69 | - import ScheduleLogViewModal from './ScheduleLogViewModal.vue'; | ||
| 70 | - import { useModal } from '/@/components/Modal'; | 42 | +import { ref, nextTick } from 'vue'; |
| 43 | +import { BasicModal, useModalInner } from '/@/components/Modal'; | ||
| 44 | +import { BasicTable, useTable, TableAction } from '/@/components/Table'; | ||
| 45 | +import { columnSchedue, searchSchedueFormSchema } from './config.data'; | ||
| 46 | +import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 47 | +import { | ||
| 48 | + deleteSchedueLogManage, | ||
| 49 | + schedueLogPage, | ||
| 50 | + schedueLogCleanPage, | ||
| 51 | +} from '/@/api/schedue/schedueManager'; | ||
| 52 | +import { Popconfirm } from 'ant-design-vue'; | ||
| 53 | +import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 54 | +import ScheduleLogViewModal from './ScheduleLogViewModal.vue'; | ||
| 55 | +import { useModal } from '/@/components/Modal'; | ||
| 71 | 56 | ||
| 72 | - const { createMessage } = useMessage(); | ||
| 73 | - const heightNum = ref(800); | ||
| 74 | - const [registerTable, { setProps, reload, getForm }] = useTable({ | ||
| 75 | - title: '调度日志列表', | ||
| 76 | - api: schedueLogPage, | ||
| 77 | - columns: columnSchedue, | ||
| 78 | - showIndexColumn: false, | ||
| 79 | - clickToRowSelect: false, | ||
| 80 | - useSearchForm: true, | ||
| 81 | - ellipsis: true, | ||
| 82 | - showTableSetting: true, | ||
| 83 | - bordered: true, | ||
| 84 | - formConfig: { | ||
| 85 | - labelWidth: 120, | ||
| 86 | - schemas: searchSchedueFormSchema, | ||
| 87 | - fieldMapToTime: [['sendTime', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']], | ||
| 88 | - }, | ||
| 89 | - rowKey: 'id', | ||
| 90 | - actionColumn: { | ||
| 91 | - width: 200, | ||
| 92 | - title: '操作', | ||
| 93 | - dataIndex: 'action', | ||
| 94 | - slots: { customRender: 'action' }, | ||
| 95 | - fixed: 'right', | ||
| 96 | - }, | ||
| 97 | - }); | ||
| 98 | - // 刷新 | ||
| 99 | - const handleSuccess = () => { | ||
| 100 | - reload(); | ||
| 101 | - }; | ||
| 102 | - const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete( | ||
| 103 | - deleteSchedueLogManage, | ||
| 104 | - handleSuccess, | ||
| 105 | - setProps | ||
| 106 | - ); | 57 | +const { createMessage } = useMessage(); |
| 58 | +const heightNum = ref(800); | ||
| 59 | +const [registerTable, { setProps, reload, getForm, setTableData }] = useTable({ | ||
| 60 | + title: '调度日志列表', | ||
| 61 | + // api: schedueLogPage, | ||
| 62 | + columns: columnSchedue, | ||
| 63 | + showIndexColumn: false, | ||
| 64 | + clickToRowSelect: false, | ||
| 65 | + useSearchForm: true, | ||
| 66 | + ellipsis: true, | ||
| 67 | + showTableSetting: true, | ||
| 68 | + bordered: true, | ||
| 69 | + formConfig: { | ||
| 70 | + labelWidth: 120, | ||
| 71 | + schemas: searchSchedueFormSchema, | ||
| 72 | + fieldMapToTime: [['sendTime', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']], | ||
| 73 | + }, | ||
| 74 | + rowKey: 'id', | ||
| 75 | + actionColumn: { | ||
| 76 | + width: 200, | ||
| 77 | + title: '操作', | ||
| 78 | + dataIndex: 'action', | ||
| 79 | + slots: { customRender: 'action' }, | ||
| 80 | + fixed: 'right', | ||
| 81 | + }, | ||
| 82 | +}); | ||
| 83 | +// 刷新 | ||
| 84 | +const handleSuccess = () => { | ||
| 85 | + reload(); | ||
| 86 | +}; | ||
| 87 | +const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete( | ||
| 88 | + deleteSchedueLogManage, | ||
| 89 | + handleSuccess, | ||
| 90 | + setProps | ||
| 91 | +); | ||
| 107 | 92 | ||
| 108 | - const [register] = useModalInner(() => { | ||
| 109 | - nextTick(() => { | ||
| 110 | - setProps(selectionOptions); | ||
| 111 | - setProps({ | ||
| 112 | - rowKey: 'id', | ||
| 113 | - }); | ||
| 114 | - //重置清空搜索表单 | ||
| 115 | - const { resetFields } = getForm(); | ||
| 116 | - resetFields(); | 93 | +const [register] = useModalInner(async (data) => { |
| 94 | + console.log(data.record) | ||
| 95 | + const res: any = await schedueLogPage({ jobId: data.record.id, page: 1, pageSize: 10 }) | ||
| 96 | + nextTick(() => { | ||
| 97 | + console.log(res) | ||
| 98 | + setTableData(res.items) | ||
| 99 | + setProps(selectionOptions); | ||
| 100 | + setProps({ | ||
| 101 | + rowKey: 'id', | ||
| 117 | }); | 102 | }); |
| 103 | + //重置清空搜索表单 | ||
| 104 | + const { resetFields } = getForm(); | ||
| 105 | + resetFields(); | ||
| 118 | }); | 106 | }); |
| 119 | - const handleCancel = () => {}; | ||
| 120 | - const handleClear = async () => { | ||
| 121 | - await schedueLogCleanPage(); | ||
| 122 | - createMessage.success(`清空成功`); | ||
| 123 | - handleSuccess(); | ||
| 124 | - }; | ||
| 125 | - const [registerModalScheduleLogView, { openModal: openModalLogView }] = useModal(); | ||
| 126 | - const handleView = (record: Recordable) => { | ||
| 127 | - openModalLogView(true, { | ||
| 128 | - isUpdate: true, | ||
| 129 | - record, | ||
| 130 | - }); | ||
| 131 | - }; | 107 | +}); |
| 108 | +const handleCancel = () => { }; | ||
| 109 | +const handleClear = async () => { | ||
| 110 | + await schedueLogCleanPage(); | ||
| 111 | + createMessage.success(`清空成功`); | ||
| 112 | + handleSuccess(); | ||
| 113 | +}; | ||
| 114 | +const [registerModalScheduleLogView, { openModal: openModalLogView }] = useModal(); | ||
| 115 | +const handleView = (record: Recordable) => { | ||
| 116 | + openModalLogView(true, { | ||
| 117 | + isUpdate: true, | ||
| 118 | + record, | ||
| 119 | + }); | ||
| 120 | +}; | ||
| 132 | </script> | 121 | </script> |
| 133 | -<style lang="less" scoped></style> | 122 | +<style lang="less" scoped> |
| 123 | +</style> |
| @@ -9,62 +9,53 @@ | @@ -9,62 +9,53 @@ | ||
| 9 | <a-button type="primary"> 导出 </a-button> | 9 | <a-button type="primary"> 导出 </a-button> |
| 10 | </Authority> | 10 | </Authority> |
| 11 | <Authority value="api:yt:schedule:delete"> | 11 | <Authority value="api:yt:schedule:delete"> |
| 12 | - <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消"> | 12 | + <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消" @confirm="handleDeleteOrBatchDelete(null)"> |
| 13 | <a-button type="primary" color="error" :disabled="hasBatchDelete"> 批量删除 </a-button> | 13 | <a-button type="primary" color="error" :disabled="hasBatchDelete"> 批量删除 </a-button> |
| 14 | </Popconfirm> | 14 | </Popconfirm> |
| 15 | </Authority> | 15 | </Authority> |
| 16 | </template> | 16 | </template> |
| 17 | <template #action="{ record }"> | 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), | 18 | + <TableAction :actions="[ |
| 19 | + { | ||
| 20 | + label: '编辑', | ||
| 21 | + icon: 'clarity:note-edit-line', | ||
| 22 | + auth: 'api:yt:schedule:update', | ||
| 23 | + onClick: handleCreateOrEdit.bind(null, record), | ||
| 24 | + }, | ||
| 25 | + { | ||
| 26 | + label: '删除', | ||
| 27 | + icon: 'ant-design:delete-outlined', | ||
| 28 | + color: 'error', | ||
| 29 | + auth: 'api:yt:schedule:delete', | ||
| 30 | + popConfirm: { | ||
| 31 | + title: '是否确认删除', | ||
| 32 | + confirm: handleDeleteOrBatchDelete.bind(null, record), | ||
| 25 | }, | 33 | }, |
| 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.jobName + '”' + '任务吗?', | ||
| 43 | - confirm: handleRunOne.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 | - /> | 34 | + }, |
| 35 | + ]" :dropDownActions="[ | ||
| 36 | + { | ||
| 37 | + label: '执行一次', | ||
| 38 | + icon: 'ant-design:caret-right-filled', | ||
| 39 | + popConfirm: { | ||
| 40 | + title: '确认要立即执行一次' + '“' + record.jobName + '”' + '任务吗?', | ||
| 41 | + confirm: handleRunOne.bind(null, record), | ||
| 42 | + }, | ||
| 43 | + }, | ||
| 44 | + { | ||
| 45 | + label: '任务详细', | ||
| 46 | + icon: 'ant-design:eye-outlined', | ||
| 47 | + onClick: handleTaskDetailModal.bind(null, record), | ||
| 48 | + }, | ||
| 49 | + { | ||
| 50 | + label: '调度日志', | ||
| 51 | + icon: 'ant-design:insert-row-below-outlined', | ||
| 52 | + onClick: handleSchedulingLogFunc.bind(null, record), | ||
| 53 | + }, | ||
| 54 | +]" /> | ||
| 58 | </template> | 55 | </template> |
| 59 | <template #status="{ record }"> | 56 | <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 | - /> | 57 | + <Switch :disabled="disabledSwitch" :checked="record.status === 1" :loading="record.pendingStatus" |
| 58 | + checkedChildren="启用" unCheckedChildren="禁用" @change="(checked: boolean) => statusChange(checked, record)" /> | ||
| 68 | </template> | 59 | </template> |
| 69 | </BasicTable> | 60 | </BasicTable> |
| 70 | <ScheduledDrawer @register="registerDrawer" @success="handleSuccess" /> | 61 | <ScheduledDrawer @register="registerDrawer" @success="handleSuccess" /> |
| @@ -73,120 +64,121 @@ | @@ -73,120 +64,121 @@ | ||
| 73 | </div> | 64 | </div> |
| 74 | </template> | 65 | </template> |
| 75 | <script setup lang="ts"> | 66 | <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 { | ||
| 81 | - deleteSchedueManage, | ||
| 82 | - scheduePage, | ||
| 83 | - putSchedueByidAndStatusManage, | ||
| 84 | - postRunSchedueConfigManage, | ||
| 85 | - } from '/@/api/schedue/schedueManager'; | ||
| 86 | - import { Popconfirm, Switch } from 'ant-design-vue'; | ||
| 87 | - import { useModal } from '/@/components/Modal'; | ||
| 88 | - import TaskDetailPreviewModal from './TaskDetailPreviewModal.vue'; | ||
| 89 | - import SchedueLog from './SchedueLog.vue'; | ||
| 90 | - import ScheduledDrawer from './ScheduledDrawer.vue'; | ||
| 91 | - import { useDrawer } from '/@/components/Drawer'; | ||
| 92 | - import { Authority } from '/@/components/Authority'; | ||
| 93 | - import { useMessage } from '/@/hooks/web/useMessage'; | 67 | +import { nextTick, ref } from 'vue'; |
| 68 | +import { BasicTable, useTable, TableAction } from '/@/components/Table'; | ||
| 69 | +import { columnSchedue, searchSchedueFormSchema } from './config.form.data'; | ||
| 70 | +import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 71 | +import { | ||
| 72 | + deleteSchedueManage, | ||
| 73 | + scheduePage, | ||
| 74 | + putSchedueByidAndStatusManage, | ||
| 75 | + postRunSchedueConfigManage, | ||
| 76 | +} from '/@/api/schedue/schedueManager'; | ||
| 77 | +import { Popconfirm, Switch } from 'ant-design-vue'; | ||
| 78 | +import { useModal } from '/@/components/Modal'; | ||
| 79 | +import TaskDetailPreviewModal from './TaskDetailPreviewModal.vue'; | ||
| 80 | +import SchedueLog from './SchedueLog.vue'; | ||
| 81 | +import ScheduledDrawer from './ScheduledDrawer.vue'; | ||
| 82 | +import { useDrawer } from '/@/components/Drawer'; | ||
| 83 | +import { Authority } from '/@/components/Authority'; | ||
| 84 | +import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 94 | 85 | ||
| 95 | - const disabledSwitch = ref(false); | ||
| 96 | - const { createMessage } = useMessage(); | ||
| 97 | - const [registerTable, { setProps, reload }] = useTable({ | ||
| 98 | - title: '定时任务列表', | ||
| 99 | - api: scheduePage, | ||
| 100 | - columns: columnSchedue, | ||
| 101 | - showIndexColumn: false, | ||
| 102 | - clickToRowSelect: false, | ||
| 103 | - useSearchForm: true, | ||
| 104 | - ellipsis: true, | ||
| 105 | - showTableSetting: true, | ||
| 106 | - bordered: true, | ||
| 107 | - formConfig: { | ||
| 108 | - labelWidth: 120, | ||
| 109 | - schemas: searchSchedueFormSchema, | ||
| 110 | - fieldMapToTime: [['sendTime', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']], | ||
| 111 | - }, | ||
| 112 | - actionColumn: { | ||
| 113 | - width: 200, | ||
| 114 | - title: '操作', | ||
| 115 | - dataIndex: 'action', | ||
| 116 | - slots: { customRender: 'action' }, | ||
| 117 | - fixed: 'right', | ||
| 118 | - }, | ||
| 119 | - }); | ||
| 120 | - // 刷新 | ||
| 121 | - const handleSuccess = () => { | ||
| 122 | - reload(); | ||
| 123 | - }; | ||
| 124 | - const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete( | ||
| 125 | - deleteSchedueManage, | ||
| 126 | - handleSuccess, | ||
| 127 | - setProps | ||
| 128 | - ); | 86 | +const disabledSwitch = ref(false); |
| 87 | +const { createMessage } = useMessage(); | ||
| 88 | +const [registerTable, { setProps, reload }] = useTable({ | ||
| 89 | + title: '定时任务列表', | ||
| 90 | + api: scheduePage, | ||
| 91 | + columns: columnSchedue, | ||
| 92 | + showIndexColumn: false, | ||
| 93 | + clickToRowSelect: false, | ||
| 94 | + useSearchForm: true, | ||
| 95 | + ellipsis: true, | ||
| 96 | + showTableSetting: true, | ||
| 97 | + bordered: true, | ||
| 98 | + formConfig: { | ||
| 99 | + labelWidth: 120, | ||
| 100 | + schemas: searchSchedueFormSchema, | ||
| 101 | + fieldMapToTime: [['sendTime', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']], | ||
| 102 | + }, | ||
| 103 | + actionColumn: { | ||
| 104 | + width: 200, | ||
| 105 | + title: '操作', | ||
| 106 | + dataIndex: 'action', | ||
| 107 | + slots: { customRender: 'action' }, | ||
| 108 | + fixed: 'right', | ||
| 109 | + }, | ||
| 110 | +}); | ||
| 111 | +// 刷新 | ||
| 112 | +const handleSuccess = () => { | ||
| 113 | + reload(); | ||
| 114 | +}; | ||
| 115 | +const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete( | ||
| 116 | + deleteSchedueManage, | ||
| 117 | + handleSuccess, | ||
| 118 | + setProps | ||
| 119 | +); | ||
| 129 | 120 | ||
| 130 | - nextTick(() => { | ||
| 131 | - setProps(selectionOptions); | 121 | +nextTick(() => { |
| 122 | + setProps(selectionOptions); | ||
| 123 | +}); | ||
| 124 | +const [registerDrawer, { openDrawer }] = useDrawer(); | ||
| 125 | +const [registerModalTaskDetail, { openModal: openModalTaskDetail }] = useModal(); | ||
| 126 | +const [registerModalSchedueLog, { openModal: openModalSchedueLog }] = useModal(); | ||
| 127 | +const handleSchedulingLogFunc = (record: Recordable) => { | ||
| 128 | + openModalSchedueLog(true, { | ||
| 129 | + isUpdate: 2, | ||
| 130 | + record, | ||
| 132 | }); | 131 | }); |
| 133 | - const [registerDrawer, { openDrawer }] = useDrawer(); | ||
| 134 | - const [registerModalTaskDetail, { openModal: openModalTaskDetail }] = useModal(); | ||
| 135 | - const [registerModalSchedueLog, { openModal: openModalSchedueLog }] = useModal(); | ||
| 136 | - const handleSchedulingLogFunc = (record: Recordable) => { | ||
| 137 | - openModalSchedueLog(true, { | ||
| 138 | - isUpdate: 2, | ||
| 139 | - record, | ||
| 140 | - }); | ||
| 141 | - }; | ||
| 142 | - const handleTaskDetailModal = (record: Recordable) => { | ||
| 143 | - openModalTaskDetail(true, { | 132 | +}; |
| 133 | +const handleTaskDetailModal = (record: Recordable) => { | ||
| 134 | + openModalTaskDetail(true, { | ||
| 135 | + isUpdate: true, | ||
| 136 | + record, | ||
| 137 | + }); | ||
| 138 | +}; | ||
| 139 | +// 新增或编辑 | ||
| 140 | +const handleCreateOrEdit = (record: Recordable | null) => { | ||
| 141 | + if (record) { | ||
| 142 | + openDrawer(true, { | ||
| 144 | isUpdate: true, | 143 | isUpdate: true, |
| 145 | record, | 144 | record, |
| 146 | }); | 145 | }); |
| 147 | - }; | ||
| 148 | - // 新增或编辑 | ||
| 149 | - const handleCreateOrEdit = (record: Recordable | null) => { | ||
| 150 | - if (record) { | ||
| 151 | - openDrawer(true, { | ||
| 152 | - isUpdate: true, | ||
| 153 | - record, | ||
| 154 | - }); | 146 | + } else { |
| 147 | + openDrawer(true, { | ||
| 148 | + isUpdate: false, | ||
| 149 | + }); | ||
| 150 | + } | ||
| 151 | +}; | ||
| 152 | + | ||
| 153 | +const statusChange = async (checked, record) => { | ||
| 154 | + try { | ||
| 155 | + setProps({ | ||
| 156 | + loading: true, | ||
| 157 | + }); | ||
| 158 | + disabledSwitch.value = true; | ||
| 159 | + const newStatus = checked ? 1 : 0; | ||
| 160 | + const res = await putSchedueByidAndStatusManage(record.id, newStatus); | ||
| 161 | + if (res && newStatus) { | ||
| 162 | + createMessage.success(`启用成功`); | ||
| 155 | } else { | 163 | } else { |
| 156 | - openDrawer(true, { | ||
| 157 | - isUpdate: false, | ||
| 158 | - }); | 164 | + createMessage.success('禁用成功'); |
| 159 | } | 165 | } |
| 160 | - }; | ||
| 161 | - | ||
| 162 | - const statusChange = async (checked, record) => { | ||
| 163 | - try { | 166 | + } finally { |
| 167 | + setTimeout(() => { | ||
| 164 | setProps({ | 168 | setProps({ |
| 165 | - loading: true, | 169 | + loading: false, |
| 166 | }); | 170 | }); |
| 167 | - disabledSwitch.value = true; | ||
| 168 | - const newStatus = checked ? 1 : 0; | ||
| 169 | - const res = await putSchedueByidAndStatusManage(record.id, newStatus); | ||
| 170 | - if (res && newStatus) { | ||
| 171 | - createMessage.success(`启用成功`); | ||
| 172 | - } else { | ||
| 173 | - createMessage.success('禁用成功'); | ||
| 174 | - } | ||
| 175 | - } finally { | ||
| 176 | - setTimeout(() => { | ||
| 177 | - setProps({ | ||
| 178 | - loading: false, | ||
| 179 | - }); | ||
| 180 | - disabledSwitch.value = false; | ||
| 181 | - }, 500); | ||
| 182 | - reload(); | ||
| 183 | - } | ||
| 184 | - }; | ||
| 185 | - const handleRunOne = async (record: Recordable) => { | ||
| 186 | - const res = await postRunSchedueConfigManage(record.id); | ||
| 187 | - if (res?.code === 200) { | ||
| 188 | - createMessage.success(`执行一次任务"${record.jobName}"成功`); | ||
| 189 | - } | ||
| 190 | - }; | 171 | + disabledSwitch.value = false; |
| 172 | + }, 500); | ||
| 173 | + reload(); | ||
| 174 | + } | ||
| 175 | +}; | ||
| 176 | +const handleRunOne = async (record: Recordable) => { | ||
| 177 | + const res = await postRunSchedueConfigManage(record.id); | ||
| 178 | + if (res?.code === 200) { | ||
| 179 | + createMessage.success(`执行一次任务"${record.jobName}"成功`); | ||
| 180 | + } | ||
| 181 | +}; | ||
| 191 | </script> | 182 | </script> |
| 192 | -<style lang="less" scoped></style> | 183 | +<style lang="less" scoped> |
| 184 | +</style> |