设备管理
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

309 lines
8.0 KiB

<template>
<EdfsDialog
@on-close="onClone"
@on-save="onSave"
title="新建升级任务"
:is-show="isShow"
width="44%"
class="create-task-dlg"
>
<div class="dlg-body">
<el-row>
<FormItemInput label="任务名称" v-model="formData.name" require />
</el-row>
<el-row>
<span class="label">固件选择</span>
<el-cascader
:props="cascaderFirmware"
v-model="firmwareSelect"
ref="firmwareCascaderRef"
:show-all-levels="false"
placeholder="请选择"
/>
</el-row>
<el-row v-if="isShowDeviceSelect">
<!-- <span class="label">设备选择</span>
<el-cascader
style="flex: 1"
v-model="deviceSelect"
:props="cascaderDevice"
@change="devChange"
ref="deviceCascaderRef"
:show-all-levels="false"
popper-class="task-device-select-cascader"
placeholder="请选择"
collapse-tags
:max-collapse-tags="4"
collapse-tags-tooltip
@expand-change="changeSourceType"
/> -->
</el-row>
<el-row>
<span class="label">是否立即执行</span>
<el-switch
v-model="formData.executeNow"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
/>
</el-row>
<el-row v-if="!formData.executeNow">
<span class="label">任务执行时间</span>
<el-date-picker
v-model="formData.executeTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm"
format="YYYY-MM-DD HH:mm"
placeholder="Pick a day"
:disabled-date="disabledExecuteDate"
/>
</el-row>
<el-row>
<EdfsNumberInput labelName="监控超时" v-model="formData.monitorTimeout" require />
</el-row>
<el-row>
<EdfsNumberInput labelName="重试次数" v-model="formData.retryCount" require />
</el-row>
<el-row>
<EdfsNumberInput labelName="重试间隔" v-model="formData.retryInterval" require />
</el-row>
</div>
</EdfsDialog>
</template>
<script setup lang="ts">
import EdfsDialog from '@/components/dashboard/Edfs-dialog.vue'
import FormItemInput from '@/components/dashboard/FormItemInput.vue'
import { isResError, useMessage } from '@/hooks/useMessage'
import EdfsNumberInput from '@/components/dashboard/Edfs-number-item-input.vue'
import FormItemSelect from '@/components/dashboard/FormItemSelect.vue'
import type { CascaderProps, CascaderValue, ElCascader } from 'element-plus'
// import { getSimpleStationList } from '@/api/module/app/station'
// import { getSimpleDeviceList } from '@/api/module/app/device'
import { getIntDictOptions } from '@/utils/dict'
import { getSimpleFirmwareList } from '@/api/module/eam/device/firmware'
import { isEmpty } from '@/utils/is'
import { clone, cloneDeep } from 'lodash'
import { createTask } from '@/api/module/eam/device/task'
const message = useMessage()
interface Props {
isShow: boolean
}
const emits = defineEmits(['on-save', 'on-close'])
const props = withDefaults(defineProps<Props>(), {
isShow: false,
})
const firmwareSelect = ref<CascaderValue>([])
const firmwareCascaderRef = ref<InstanceType<typeof ElCascader>>()
const cascaderFirmware: CascaderProps = {
lazy: true,
async lazyLoad(node, resolve) {
const { level } = node
if (level === 0) {
const deviceTypes = getIntDictOptions('device_entity_type').map(item => ({
value: item.value,
label: item.label,
isLeaf: false,
}))
resolve(deviceTypes)
}
if (level === 1) {
const res = await getSimpleFirmwareList({
type: node.data?.value as number,
})
const data = Array.isArray(res?.data) ? res.data : []
const firmware = data.map((item: any) => ({
value: item.id,
label: item.name,
isLeaf: true,
leaf: true,
}))
resolve(firmware)
}
},
}
const selectFirmwareType = ref()
watch(firmwareSelect, (value: any) => {
selectFirmwareType.value = value[0] ?? ''
formData.value.firmwareId = String(value[1]) ?? ''
})
const isShowDeviceSelect = ref(false)
watch(
() => selectFirmwareType.value,
() => {
isShowDeviceSelect.value = false
nextTick(() => {
isShowDeviceSelect.value =
!isEmpty(selectFirmwareType.value) &&
typeof selectFirmwareType.value !== 'undefined'
})
}
)
// const deviceCascaderRef = ref<InstanceType<typeof ElCascader>>()
// const cascaderDevice: CascaderProps = {
// lazy: true,
// multiple: true,
// async lazyLoad(node, resolve) {
// const { level } = node
// if (level === 0) {
// const res = await getSimpleStationList()
// if (isResError(res)) return
// const data = Array.isArray(res?.data) ? res.data : []
// const nodes = data.map((item: any) => ({
// value: item.id,
// label: item.name,
// isLeaf: false,
// }))
// resolve(nodes)
// }
// if (level === 1) {
// const res = await getSimpleDeviceList({
// siteId: node.data?.value as number,
// type: selectFirmwareType.value,
// })
// const data = Array.isArray(res?.data) ? res.data : []
// const devices = data.map((item: any) => ({
// value: item.sn,
// label: item.name,
// isLeaf: true,
// leaf: true,
// }))
// resolve(devices)
// }
// },
// }
const deviceSelect = ref<CascaderValue>([])
watch(deviceSelect, (value: any) => {
formData.value.deviceSns = value.map((item: any) => item[1])
})
function devChange() {}
const cascaderTag = ref<any[]>([])
function changeSourceType(selectItem: any) {
if (!cascaderTag.value.includes(selectItem[0])) {
deviceSelect.value = []
}
cascaderTag.value = selectItem
}
const form = {
name: '',
executeNow: false, // 立即执行
executeTime: '', // 执行时间
retryCount: 3, // 重试次数
retryInterval: 1000, // 重试间隔
monitorTimeout: 1000, // 监控超时
firmwareId: '', // 固件ID
deviceSns: [], // 设备SN
}
const formData = ref(cloneDeep(form))
function validate() {
if (!formData.value.name) {
message.error('请输入任务名称')
return true
}
if (!formData.value.firmwareId) {
message.error('请选择固件')
return true
}
if (!formData.value.deviceSns.length) {
message.error('请选择设备')
return true
}
if (!formData.value.executeNow && !formData.value.executeTime) {
message.error('请选择执行时间')
return true
}
if (!formData.value.monitorTimeout) {
message.error('请输入监控超时')
return true
}
if (!formData.value.retryCount) {
message.error('请输入重试次数')
return true
}
if (!formData.value.retryInterval) {
message.error('请输入重试间隔')
return true
}
return false
}
function disabledExecuteDate(time: Date) {
return time.getTime() < Date.now() - 8.64e7
}
async function onSave() {
if (validate()) return
const res = await createTask(formData.value)
if (isResError(res)) return
emits('on-save')
clearData()
}
function onClone() {
clearData()
emits('on-close')
}
function clearData() {
formData.value = cloneDeep(form)
firmwareSelect.value = []
cascaderTag.value = []
deviceSelect.value = []
}
</script>
<style lang="scss">
.task-device-select-cascader {
.el-cascader-panel {
.el-cascader-menu:first-child {
.el-cascader-node {
.el-checkbox {
display: none !important;
}
}
}
}
}
</style>
<style scoped lang="scss">
.create-task-dlg {
.dlg-body {
max-height: 400px;
}
.el-row {
height: 32px;
width: 74%;
margin-bottom: 20px;
:deep(.label) {
margin-right: 10px;
}
span {
width: 110px;
height: 32px;
line-height: 32px;
text-align: right;
}
:deep(.el-radio-group) {
height: 100%;
}
:deep(.el-radio) {
height: 100%;
}
}
.require {
color: red;
margin-right: 4px;
}
}
</style>