feat:添加任务管理页面

main
黄伟杰 4 weeks ago
parent 3649df0547
commit adcc386002

@ -25,6 +25,10 @@ export const TaskManagementApi = {
return await request.get({ url: `/mes/task-management/page`, params })
},
createTaskManagementTicket: async (id: number | string) => {
return await request.post({ url: `/mes/task-management/createTicket`, params: { id } })
},
createTaskManagement: async (data: TaskManagementVO) => {
return await request.post({ url: `/mes/task-management/create`, data })
},
@ -41,4 +45,3 @@ export const TaskManagementApi = {
return await request.download({ url: `/mes/task-management/export-excel`, params })
}
}

@ -17,10 +17,28 @@
</el-radio-group>
</el-form-item>
<el-form-item label="设备列表" prop="deviceList">
<el-input v-model="formData.deviceList" placeholder="请输入设备列表" />
<el-select
v-model="formData.deviceList"
multiple
filterable
clearable
placeholder="请选择设备列表"
class="!w-full"
>
<el-option v-for="item in deviceOptions" :key="String(item.id)" :label="item.deviceName" :value="String(item.id)" />
</el-select>
</el-form-item>
<el-form-item label="项目表单" prop="projectForm">
<el-input v-model="formData.projectForm" placeholder="请输入项目表单" />
<el-select
v-model="formData.projectForm"
multiple
filterable
clearable
placeholder="请选择项目表单"
class="!w-full"
>
<el-option v-for="item in planOptions" :key="String(item.id)" :label="item.planName" :value="String(item.id)" />
</el-select>
</el-form-item>
<el-form-item label="起止日期" prop="dateRange">
<el-date-picker
@ -33,10 +51,19 @@
/>
</el-form-item>
<el-form-item label="cron 表达式" prop="cronExpression">
<el-input v-model="formData.cronExpression" placeholder="请输入 cron 表达式" />
<crontab v-model="formData.cronExpression" />
</el-form-item>
<el-form-item label="可操作人" prop="operableUsers">
<el-input v-model="formData.operableUsers" placeholder="请输入可操作人" />
<el-select
v-model="formData.operableUsers"
multiple
filterable
clearable
placeholder="请选择可操作人"
class="!w-full"
>
<el-option v-for="item in users" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" />
</el-select>
</el-form-item>
<el-form-item label="是否启用" prop="enabled">
<el-radio-group v-model="formData.enabled">
@ -56,6 +83,9 @@
<script setup lang="ts">
import { DICT_TYPE, getBoolDictOptions } from '@/utils/dict'
import { TaskManagementApi, TaskManagementVO } from '@/api/mes/taskManagement'
import { DeviceLedgerApi } from '@/api/mes/deviceledger'
import { PlanMaintenanceApi } from '@/api/mes/planmaintenance'
import { getSimpleUserList, UserVO } from '@/api/system/user'
defineOptions({ name: 'TaskManagementForm' })
@ -68,15 +98,54 @@ const formLoading = ref(false)
const formType = ref('')
const formRef = ref()
type DeviceOption = {
id: number | string
deviceName: string
}
type PlanOption = {
id: number | string
planName: string
}
const deviceOptions = ref<DeviceOption[]>([])
const planOptions = ref<PlanOption[]>([])
const users = ref<UserVO[]>([])
const parseIdsValue = (value: any): string[] => {
if (!value) return []
if (Array.isArray(value)) return value.map((v) => String(v).trim()).filter(Boolean)
return String(value)
.split(',')
.map((v) => v.trim())
.filter(Boolean)
}
const toCommaSeparatedIds = (value: any): string | undefined => {
const ids = parseIdsValue(value)
return ids.length ? ids.join(',') : undefined
}
const ensureOptionsLoaded = async () => {
const [deviceRes, planRes, userRes] = await Promise.all([
DeviceLedgerApi.getDeviceLedgerPage({}),
PlanMaintenanceApi.getPlanMaintenancePage({ pageNo: 1, pageSize: 100 }),
getSimpleUserList()
])
deviceOptions.value = (deviceRes?.list ?? []) as DeviceOption[]
planOptions.value = (planRes?.list ?? []) as PlanOption[]
users.value = userRes ?? []
}
const formData = ref({
id: undefined as number | undefined,
name: undefined as string | undefined,
taskType: undefined as number | undefined,
deviceList: undefined as string | undefined,
projectForm: undefined as string | undefined,
deviceList: [] as string[],
projectForm: [] as string[],
dateRange: [] as string[],
cronExpression: undefined as string | undefined,
operableUsers: undefined as string | undefined,
operableUsers: [] as string[],
enabled: true as boolean
})
@ -91,11 +160,11 @@ const resetForm = () => {
id: undefined,
name: undefined,
taskType: undefined,
deviceList: undefined,
projectForm: undefined,
deviceList: [],
projectForm: [],
dateRange: [],
cronExpression: undefined,
operableUsers: undefined,
operableUsers: [],
enabled: true
}
formRef.value?.resetFields()
@ -106,17 +175,34 @@ const open = async (type: string, row?: TaskManagementVO) => {
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
await ensureOptionsLoaded()
if (type === 'update' && row) {
formData.value.id = row.id
formData.value.name = row.name
formData.value.taskType = row.taskType
formData.value.deviceList = row.deviceList
formData.value.projectForm = row.projectForm
formData.value.deviceList = parseIdsValue((row as any).deviceList)
const projectFormIds = parseIdsValue((row as any).projectForm)
if (projectFormIds.length) {
formData.value.projectForm = projectFormIds
} else {
const projectFormNames = parseIdsValue((row as any).projectFormName)
const mappedIds = projectFormNames
.map((name) => planOptions.value.find((p) => p.planName === name)?.id)
.filter((id) => id !== undefined && id !== null)
.map((id) => String(id))
formData.value.projectForm = mappedIds
}
formData.value.dateRange = [row.startDate, row.endDate].filter(Boolean) as string[]
formData.value.cronExpression = row.cronExpression
formData.value.operableUsers = row.operableUsers
formData.value.enabled = typeof row.enabled === 'boolean' ? row.enabled : true
formData.value.operableUsers = parseIdsValue((row as any).operableUsers)
if (typeof row.enabled === 'boolean') {
formData.value.enabled = row.enabled
} else if (row.enabled === 'true' || row.enabled === 'false') {
formData.value.enabled = row.enabled === 'true'
} else {
formData.value.enabled = true
}
}
}
@ -133,12 +219,12 @@ const submitForm = async () => {
id: formData.value.id,
name: formData.value.name,
taskType: formData.value.taskType,
deviceList: formData.value.deviceList,
projectForm: formData.value.projectForm,
deviceList: toCommaSeparatedIds((formData.value as any).deviceList),
projectForm: toCommaSeparatedIds((formData.value as any).projectForm),
startDate: startDate || undefined,
endDate: endDate || undefined,
cronExpression: formData.value.cronExpression,
operableUsers: formData.value.operableUsers,
operableUsers: toCommaSeparatedIds((formData.value as any).operableUsers),
enabled: formData.value.enabled
}
@ -156,4 +242,3 @@ const submitForm = async () => {
}
}
</script>

@ -31,8 +31,12 @@
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['mes:task-management:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
@ -70,10 +74,7 @@
<el-table-column label="项目表单" align="center" prop="projectForm" min-width="140" />
<el-table-column label="开始日期" align="center" prop="startDate" :formatter="dateFormatter2" width="120" />
<el-table-column label="结束日期" align="center" prop="endDate" :formatter="dateFormatter2" width="120" />
<el-table-column label="执行频率" align="center" prop="execFrequency" width="100" />
<el-table-column label="频率值" align="center" prop="frequencyValue" min-width="120" />
<el-table-column label="时间" align="center" prop="time" min-width="140" />
<el-table-column label="有效期(分钟)" align="center" prop="validMinutes" width="120" />
<el-table-column label="cron 表达式" align="center" prop="cronExpression" min-width="180" />
<el-table-column label="启用" align="center" prop="enabled" width="90">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.enabled" />
@ -82,9 +83,22 @@
<el-table-column label="创建人" align="center" prop="creator" width="120" />
<el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="180" />
<el-table-column label="更新时间" align="center" prop="updateTime" :formatter="dateFormatter" width="180" />
<el-table-column label="操作" fixed="right" align="center" width="140">
<el-table-column label="操作" fixed="right" align="center" width="230">
<template #default="scope">
<el-button link type="primary" @click="openForm('update', scope.row)" v-hasPermi="['mes:task-management:update']">
<el-button
link
type="success"
@click="handleCreateTicket(scope.row.id)"
:loading="ticketLoadingId === scope.row.id"
>
新增工单管理
</el-button>
<el-button
link
type="primary"
@click="openForm('update', scope.row)"
v-hasPermi="['mes:task-management:update']"
>
编辑
</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:task-management:delete']">
@ -176,7 +190,21 @@ const handleDelete = async (id?: number) => {
await TaskManagementApi.deleteTaskManagement(String(id))
message.success(t('common.delSuccess'))
await getList()
} catch {}
} catch { }
}
const ticketLoadingId = ref<number | undefined>(undefined)
const handleCreateTicket = async (id?: number) => {
if (!id) return
ticketLoadingId.value = id
try {
await TaskManagementApi.createTaskManagementTicket(id)
message.success('创建工单成功')
} catch {
message.error('创建工单失败')
} finally {
ticketLoadingId.value = undefined
}
}
const handleExport = async () => {
@ -199,4 +227,3 @@ onMounted(() => {
getList()
})
</script>

Loading…
Cancel
Save