Merge branch 'main' of https://git.ngsk.tech/linweidong/besure_web
commit
a455acdd33
@ -1,45 +1,50 @@
|
|||||||
import request from '@/config/axios'
|
import request from '@/config/axios'
|
||||||
|
|
||||||
// 维保项目 VO
|
// 维保项目 VO
|
||||||
export interface DvSubjectVO {
|
export interface DvSubjectVO {
|
||||||
id: number // ID
|
id?: number // ID
|
||||||
subjectCode: string // 项目编码
|
subjectCode: string // 项目编码
|
||||||
subjectName: string // 项目名称
|
subjectName: string // 项目名称
|
||||||
subjectType: string // 项目类型
|
subjectType?: string // 项目类型
|
||||||
subjectContent: string // 项目内容
|
subjectContent?: string // 项目内容
|
||||||
subjectStandard: string // 标准
|
subjectStandard?: string // 标准
|
||||||
isEnable: boolean // 是否启用
|
isEnable: string // 是否启用
|
||||||
}
|
inspectionMethod: string // 检验方式
|
||||||
|
valueType: string // 值类型
|
||||||
// 维保项目 API
|
judgmentCriteria: string // 判定基准
|
||||||
export const DvSubjectApi = {
|
creator?: string // 创建人
|
||||||
// 查询维保项目分页
|
createTime?: string | number | Date // 创建时间
|
||||||
getDvSubjectPage: async (params: any) => {
|
}
|
||||||
return await request.get({ url: `/mes/dv-subject/page`, params })
|
|
||||||
},
|
// 维保项目 API
|
||||||
|
export const DvSubjectApi = {
|
||||||
// 查询维保项目详情
|
// 查询维保项目分页
|
||||||
getDvSubject: async (id: number) => {
|
getDvSubjectPage: async (params: any) => {
|
||||||
return await request.get({ url: `/mes/dv-subject/get?id=` + id })
|
return await request.get({ url: `/mes/dv-subject/page`, params })
|
||||||
},
|
},
|
||||||
|
|
||||||
// 新增维保项目
|
// 查询维保项目详情
|
||||||
createDvSubject: async (data: DvSubjectVO) => {
|
getDvSubject: async (id: number) => {
|
||||||
return await request.post({ url: `/mes/dv-subject/create`, data })
|
return await request.get({ url: `/mes/dv-subject/get?id=` + id })
|
||||||
},
|
},
|
||||||
|
|
||||||
// 修改维保项目
|
// 新增维保项目
|
||||||
updateDvSubject: async (data: DvSubjectVO) => {
|
createDvSubject: async (data: DvSubjectVO) => {
|
||||||
return await request.put({ url: `/mes/dv-subject/update`, data })
|
return await request.post({ url: `/mes/dv-subject/create`, data })
|
||||||
},
|
},
|
||||||
|
|
||||||
// 删除维保项目
|
// 修改维保项目
|
||||||
deleteDvSubject: async (id: number) => {
|
updateDvSubject: async (data: DvSubjectVO) => {
|
||||||
return await request.delete({ url: `/mes/dv-subject/delete?id=` + id })
|
return await request.put({ url: `/mes/dv-subject/update`, data })
|
||||||
},
|
},
|
||||||
|
|
||||||
// 导出维保项目 Excel
|
// 删除维保项目
|
||||||
exportDvSubject: async (params) => {
|
deleteDvSubject: async (ids: string) => {
|
||||||
return await request.download({ url: `/mes/dv-subject/export-excel`, params })
|
return await request.delete({ url: `/mes/dv-subject/delete?ids=` + ids })
|
||||||
},
|
},
|
||||||
}
|
|
||||||
|
// 导出维保项目 Excel
|
||||||
|
exportDvSubject: async (params) => {
|
||||||
|
return await request.download({ url: `/mes/dv-subject/export-excel`, params })
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|||||||
@ -0,0 +1,47 @@
|
|||||||
|
import request from '@/config/axios'
|
||||||
|
|
||||||
|
export interface PlanMaintenanceVO {
|
||||||
|
id?: number | string
|
||||||
|
planName: string
|
||||||
|
planType: number | string
|
||||||
|
description?: string
|
||||||
|
subjectIdS?: string
|
||||||
|
creator?: string
|
||||||
|
creatorName?: string
|
||||||
|
createTime?: string | number | Date
|
||||||
|
updateTime?: string | number | Date
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PlanMaintenanceSubjectVO {
|
||||||
|
id?: number | string
|
||||||
|
subjectCode?: string
|
||||||
|
subjectName?: string
|
||||||
|
inspectionMethod?: string
|
||||||
|
judgmentCriteria?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export const PlanMaintenanceApi = {
|
||||||
|
getPlanMaintenancePage: async (params: any) => {
|
||||||
|
return await request.get({ url: `/mes/plan-maintenance/page`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
getSubjectList: async (id: number | string) => {
|
||||||
|
return await request.get({ url: `/mes/plan-maintenance/getSubjectList`, params: { id } })
|
||||||
|
},
|
||||||
|
|
||||||
|
createPlanMaintenance: async (data: any) => {
|
||||||
|
return await request.post({ url: `/mes/plan-maintenance/create`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
updatePlanMaintenance: async (data: any) => {
|
||||||
|
return await request.put({ url: `/mes/plan-maintenance/update`, params: data })
|
||||||
|
},
|
||||||
|
|
||||||
|
deletePlanMaintenance: async (ids: string) => {
|
||||||
|
return await request.delete({ url: `/mes/plan-maintenance/delete?ids=` + ids })
|
||||||
|
},
|
||||||
|
|
||||||
|
exportPlanMaintenance: async (params: any) => {
|
||||||
|
return await request.download({ url: `/mes/plan-maintenance/export-excel`, params })
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
import request from '@/config/axios'
|
||||||
|
|
||||||
|
export interface TaskManagementVO {
|
||||||
|
id?: number
|
||||||
|
name?: string
|
||||||
|
taskType?: number
|
||||||
|
deviceList?: string
|
||||||
|
projectForm?: string
|
||||||
|
startDate?: string
|
||||||
|
endDate?: string
|
||||||
|
cronExpression?: string
|
||||||
|
operableUsers?: string
|
||||||
|
enabled?: boolean
|
||||||
|
execFrequency?: string
|
||||||
|
frequencyValue?: string
|
||||||
|
time?: string
|
||||||
|
validMinutes?: number
|
||||||
|
creator?: string
|
||||||
|
createTime?: string
|
||||||
|
updateTime?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TaskManagementApi = {
|
||||||
|
getTaskManagementPage: async (params: any) => {
|
||||||
|
return await request.get({ url: `/mes/task-management/page`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
createTaskManagement: async (data: TaskManagementVO) => {
|
||||||
|
return await request.post({ url: `/mes/task-management/create`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
updateTaskManagement: async (data: TaskManagementVO) => {
|
||||||
|
return await request.put({ url: `/mes/task-management/update`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteTaskManagement: async (ids: string) => {
|
||||||
|
return await request.delete({ url: `/mes/task-management/delete?ids=` + ids })
|
||||||
|
},
|
||||||
|
|
||||||
|
exportTaskManagement: async (params: any) => {
|
||||||
|
return await request.download({ url: `/mes/task-management/export-excel`, params })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,150 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog :title="dialogTitle" v-model="dialogVisible" width="720px">
|
||||||
|
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
|
||||||
|
<el-form-item label="方案名称" prop="planName" required>
|
||||||
|
<el-input v-model="formData.planName" placeholder="请输入方案名称" />
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="方案类型" prop="planType" required>
|
||||||
|
<el-select v-model="formData.planType" placeholder="请选择方案类型" class="!w-full">
|
||||||
|
<el-option :value="1" label="保养" />
|
||||||
|
<el-option :value="2" label="维护" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="描述" prop="description">
|
||||||
|
<el-input v-model="formData.description" placeholder="请输入描述" type="textarea" />
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="关联项目" prop="subjectIds">
|
||||||
|
<el-select
|
||||||
|
v-model="formData.subjectIds"
|
||||||
|
multiple
|
||||||
|
filterable
|
||||||
|
clearable
|
||||||
|
placeholder="请选择关联项目"
|
||||||
|
class="!w-full"
|
||||||
|
>
|
||||||
|
<el-option v-for="item in subjectOptions" :key="item.id" :label="item.subjectName" :value="item.id" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<template #footer>
|
||||||
|
<el-button type="primary" @click="submitForm" :disabled="formLoading">确 定</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { FormRules } from 'element-plus'
|
||||||
|
import { DvSubjectApi, DvSubjectVO } from '@/api/mes/dvsubject'
|
||||||
|
import { PlanMaintenanceApi, PlanMaintenanceVO } from '@/api/mes/planmaintenance'
|
||||||
|
|
||||||
|
defineOptions({ name: 'PlanMaintenanceForm' })
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
const message = useMessage()
|
||||||
|
|
||||||
|
const dialogVisible = ref(false)
|
||||||
|
const dialogTitle = ref('')
|
||||||
|
const formLoading = ref(false)
|
||||||
|
const formType = ref<'create' | 'update'>('create')
|
||||||
|
|
||||||
|
const subjectOptions = ref<DvSubjectVO[]>([])
|
||||||
|
const ensureSubjectOptionsLoaded = async () => {
|
||||||
|
if (subjectOptions.value.length) return
|
||||||
|
const res = await DvSubjectApi.getDvSubjectPage({})
|
||||||
|
const list = Array.isArray(res) ? res : res?.list
|
||||||
|
subjectOptions.value = (list ?? []) as DvSubjectVO[]
|
||||||
|
}
|
||||||
|
|
||||||
|
const parseIds = (value: any): Array<number | string> => {
|
||||||
|
if (!value) return []
|
||||||
|
const raw = Array.isArray(value)
|
||||||
|
? value
|
||||||
|
: String(value)
|
||||||
|
.split(',')
|
||||||
|
.map((v) => v.trim())
|
||||||
|
.filter((v) => v !== '')
|
||||||
|
|
||||||
|
return raw
|
||||||
|
.map((v) => {
|
||||||
|
if (typeof v === 'number') return v
|
||||||
|
const s = String(v).trim()
|
||||||
|
if (!s) return undefined
|
||||||
|
const n = Number(s)
|
||||||
|
if (Number.isFinite(n) && String(n) === s) return n
|
||||||
|
return s
|
||||||
|
})
|
||||||
|
.filter((v): v is number | string => v !== undefined)
|
||||||
|
}
|
||||||
|
|
||||||
|
const initFormData = () => ({
|
||||||
|
id: undefined as PlanMaintenanceVO['id'],
|
||||||
|
planName: '' as string,
|
||||||
|
planType: undefined as any,
|
||||||
|
description: '' as string,
|
||||||
|
subjectIds: [] as Array<number | string>
|
||||||
|
})
|
||||||
|
|
||||||
|
const formData = ref(initFormData())
|
||||||
|
const formRules = reactive<FormRules>({
|
||||||
|
planName: [{ required: true, message: '方案名称不能为空', trigger: 'blur' }],
|
||||||
|
planType: [{ required: true, message: '方案类型不能为空', trigger: 'change' }]
|
||||||
|
})
|
||||||
|
const formRef = ref()
|
||||||
|
|
||||||
|
const open = async (type: 'create' | 'update', row?: Partial<PlanMaintenanceVO>) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
dialogTitle.value = t('action.' + type)
|
||||||
|
formType.value = type
|
||||||
|
resetForm()
|
||||||
|
await ensureSubjectOptionsLoaded()
|
||||||
|
|
||||||
|
if (type === 'update' && row) {
|
||||||
|
formData.value = {
|
||||||
|
...initFormData(),
|
||||||
|
id: row.id,
|
||||||
|
planName: (row.planName as any) ?? '',
|
||||||
|
planType: (row.planType as any) ?? undefined,
|
||||||
|
description: (row.description as any) ?? '',
|
||||||
|
subjectIds: parseIds((row as any).subjectIds ?? (row as any).subjectIdS)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ open })
|
||||||
|
|
||||||
|
const emit = defineEmits(['success'])
|
||||||
|
const submitForm = async () => {
|
||||||
|
await formRef.value.validate()
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
const data = {
|
||||||
|
id: formData.value.id,
|
||||||
|
planName: formData.value.planName,
|
||||||
|
planType: formData.value.planType,
|
||||||
|
description: formData.value.description,
|
||||||
|
subjectIdS: formData.value.subjectIds?.length ? formData.value.subjectIds.join(',') : undefined
|
||||||
|
}
|
||||||
|
if (formType.value === 'create') {
|
||||||
|
await PlanMaintenanceApi.createPlanMaintenance(data)
|
||||||
|
message.success(t('common.createSuccess'))
|
||||||
|
} else {
|
||||||
|
await PlanMaintenanceApi.updatePlanMaintenance(data)
|
||||||
|
message.success(t('common.updateSuccess'))
|
||||||
|
}
|
||||||
|
dialogVisible.value = false
|
||||||
|
emit('success')
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const resetForm = () => {
|
||||||
|
formData.value = initFormData()
|
||||||
|
formRef.value?.resetFields()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@ -0,0 +1,327 @@
|
|||||||
|
<template>
|
||||||
|
<ContentWrap>
|
||||||
|
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="60px">
|
||||||
|
<el-form-item label="名称" prop="planName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.planName"
|
||||||
|
placeholder="请输入名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="类型" prop="planType">
|
||||||
|
<el-select v-model="queryParams.planType" placeholder="请选择类型" clearable class="!w-240px">
|
||||||
|
<el-option :value="1" label="保养" />
|
||||||
|
<el-option :value="2" label="维护" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="描述" prop="description">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.description"
|
||||||
|
placeholder="请输入描述"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</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 type="primary" plain @click="openForm('create')" v-hasPermi="['mes:plan-maintenance:create']">
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-button type="danger" plain @click="handleBatchDelete" v-hasPermi="['mes:plan-maintenance:delete']">
|
||||||
|
<Icon icon="ep:delete" class="mr-5px" /> 批量删除
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
@click="handleExport"
|
||||||
|
:loading="exportLoading"
|
||||||
|
v-hasPermi="['mes:plan-maintenance:export']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:download" class="mr-5px" /> 导出
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<el-table
|
||||||
|
ref="tableRef"
|
||||||
|
v-loading="loading"
|
||||||
|
:data="list"
|
||||||
|
row-key="id"
|
||||||
|
:stripe="true"
|
||||||
|
:show-overflow-tooltip="true"
|
||||||
|
@expand-change="handleExpandChange"
|
||||||
|
@selection-change="handleSelectionChange"
|
||||||
|
>
|
||||||
|
<el-table-column type="selection" width="55" fixed="left" reserve-selection />
|
||||||
|
<el-table-column type="expand" width="48">
|
||||||
|
<template #default="scope">
|
||||||
|
<div class="p-12px">
|
||||||
|
<el-table
|
||||||
|
v-loading="subjectLoadingMap[String(scope.row.id)]"
|
||||||
|
:data="subjectListMap[String(scope.row.id)] ?? []"
|
||||||
|
:stripe="true"
|
||||||
|
:show-overflow-tooltip="true"
|
||||||
|
size="small"
|
||||||
|
>
|
||||||
|
<el-table-column label="序号" align="center" width="80">
|
||||||
|
<template #default="s2">
|
||||||
|
{{ s2.$index + 1 }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="编码" align="center" prop="subjectCode" />
|
||||||
|
<el-table-column label="名称" align="center" prop="subjectName" />
|
||||||
|
<el-table-column label="检验方式" align="center" prop="inspectionMethod" width="120">
|
||||||
|
<template #default="s2">
|
||||||
|
<span v-if="s2.row.inspectionMethod === undefined || s2.row.inspectionMethod === null || s2.row.inspectionMethod === ''">-</span>
|
||||||
|
<el-tag
|
||||||
|
v-else
|
||||||
|
effect="light"
|
||||||
|
:type="getTagType('Inspection_method', s2.row.inspectionMethod)"
|
||||||
|
:color="getTagColor('Inspection_method', s2.row.inspectionMethod)"
|
||||||
|
:style="getTagStyle('Inspection_method', s2.row.inspectionMethod)"
|
||||||
|
disable-transitions
|
||||||
|
>
|
||||||
|
{{ getTagLabel('Inspection_method', s2.row.inspectionMethod) }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="判定基准" align="center" prop="judgmentCriteria" />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
|
<el-table-column label="序号" align="center" width="80">
|
||||||
|
<template #default="scope">
|
||||||
|
{{ (queryParams.pageNo - 1) * queryParams.pageSize + scope.$index + 1 }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="名称" align="center" prop="planName" min-width="160" />
|
||||||
|
<el-table-column label="类型" align="center" prop="planType" width="110">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-tag effect="light" :type="getPlanTypeTagType(scope.row.planType)">
|
||||||
|
{{ getPlanTypeLabel(scope.row.planType) }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="描述" align="center" prop="description" min-width="220" />
|
||||||
|
<el-table-column label="创建人" align="center" prop="creatorName" width="140" />
|
||||||
|
<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="操作" align="center" fixed="right" width="160">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button link type="primary" @click="openForm('update', scope.row)" v-hasPermi="['mes:plan-maintenance:update']">
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:plan-maintenance:delete']">
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<PlanMaintenanceForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { getStrDictOptions } from '@/utils/dict'
|
||||||
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
|
import download from '@/utils/download'
|
||||||
|
import { PlanMaintenanceApi, PlanMaintenanceSubjectVO, PlanMaintenanceVO } from '@/api/mes/planmaintenance'
|
||||||
|
import PlanMaintenanceForm from './PlanMaintenanceForm.vue'
|
||||||
|
import { isHexColor } from '@/utils/color'
|
||||||
|
import { useDictStoreWithOut } from '@/store/modules/dict'
|
||||||
|
|
||||||
|
defineOptions({ name: 'PlanMaintenance' })
|
||||||
|
|
||||||
|
const message = useMessage()
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
const dictStore = useDictStoreWithOut()
|
||||||
|
const dictReady = ref(false)
|
||||||
|
|
||||||
|
const loading = ref(false)
|
||||||
|
const list = ref<PlanMaintenanceVO[]>([])
|
||||||
|
const total = ref(0)
|
||||||
|
const exportLoading = ref(false)
|
||||||
|
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
planName: undefined as string | undefined,
|
||||||
|
planType: undefined as number | undefined,
|
||||||
|
description: undefined as string | undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
const queryFormRef = ref()
|
||||||
|
|
||||||
|
const tableRef = ref()
|
||||||
|
const selectedIds = ref<(number | string)[]>([])
|
||||||
|
const handleSelectionChange = (rows: any[]) => {
|
||||||
|
selectedIds.value = rows?.map((row) => row.id).filter((id) => id !== undefined && id !== null && id !== '') ?? []
|
||||||
|
}
|
||||||
|
|
||||||
|
const subjectListMap = ref<Record<string, PlanMaintenanceSubjectVO[]>>({})
|
||||||
|
const subjectLoadingMap = ref<Record<string, boolean>>({})
|
||||||
|
|
||||||
|
const getTagDict = (dictType: string, value: any) => {
|
||||||
|
if (!dictReady.value) return undefined
|
||||||
|
const v = value === '' || value === null || value === undefined ? undefined : String(value)
|
||||||
|
if (!v) return undefined
|
||||||
|
return getStrDictOptions(dictType).find((d) => d.value === v)
|
||||||
|
}
|
||||||
|
|
||||||
|
const getTagLabel = (dictType: string, value: any) => {
|
||||||
|
const found = getTagDict(dictType, value)
|
||||||
|
return found?.label ?? (value ?? '')
|
||||||
|
}
|
||||||
|
|
||||||
|
const getTagType = (dictType: string, value: any) => {
|
||||||
|
const found = getTagDict(dictType, value)
|
||||||
|
const type = found?.colorType
|
||||||
|
if (type + '' === 'primary' || type + '' === 'default') return '' as any
|
||||||
|
return (type ?? '') as any
|
||||||
|
}
|
||||||
|
|
||||||
|
const getTagColor = (dictType: string, value: any) => {
|
||||||
|
const found = getTagDict(dictType, value)
|
||||||
|
if (found?.cssClass && isHexColor(found.cssClass)) return found.cssClass
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const getTagStyle = (dictType: string, value: any) => {
|
||||||
|
const color = getTagColor(dictType, value)
|
||||||
|
if (!color) return ''
|
||||||
|
return 'color: #fff'
|
||||||
|
}
|
||||||
|
|
||||||
|
const normalizeList = (res: any): { list: any[]; total: number } => {
|
||||||
|
if (Array.isArray(res)) return { list: res, total: res.length }
|
||||||
|
return { list: res?.list ?? [], total: res?.total ?? 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const res = await PlanMaintenanceApi.getPlanMaintenancePage({
|
||||||
|
pageNo: queryParams.pageNo,
|
||||||
|
pageSize: queryParams.pageSize,
|
||||||
|
planName: queryParams.planName,
|
||||||
|
planType: queryParams.planType,
|
||||||
|
description: queryParams.description
|
||||||
|
})
|
||||||
|
const normalized = normalizeList(res)
|
||||||
|
list.value = normalized.list as PlanMaintenanceVO[]
|
||||||
|
total.value = normalized.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value?.resetFields?.()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
const ensureSubjectListLoaded = async (id: number | string) => {
|
||||||
|
const key = String(id)
|
||||||
|
if (!key) return
|
||||||
|
if (subjectListMap.value[key]) return
|
||||||
|
subjectLoadingMap.value[key] = true
|
||||||
|
try {
|
||||||
|
const res = await PlanMaintenanceApi.getSubjectList(id)
|
||||||
|
const data = Array.isArray(res) ? res : res?.list ?? res ?? []
|
||||||
|
subjectListMap.value[key] = (data ?? []) as PlanMaintenanceSubjectVO[]
|
||||||
|
} finally {
|
||||||
|
subjectLoadingMap.value[key] = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleExpandChange = async (row: PlanMaintenanceVO, expandedRows: PlanMaintenanceVO[]) => {
|
||||||
|
const isExpanded = expandedRows.some((r) => String(r.id) === String(row.id))
|
||||||
|
if (!isExpanded) return
|
||||||
|
if (row?.id === undefined || row?.id === null || row?.id === '') return
|
||||||
|
await ensureSubjectListLoaded(row.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
const getPlanTypeLabel = (value: any) => {
|
||||||
|
const v = value === '' || value === null || value === undefined ? undefined : Number(value)
|
||||||
|
if (v === 1) return '保养'
|
||||||
|
if (v === 2) return '维护'
|
||||||
|
return value ?? ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const getPlanTypeTagType = (value: any) => {
|
||||||
|
const v = value === '' || value === null || value === undefined ? undefined : Number(value)
|
||||||
|
if (v === 1) return 'success'
|
||||||
|
if (v === 2) return 'primary'
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: 'create' | 'update', row?: PlanMaintenanceVO) => {
|
||||||
|
formRef.value?.open(type, row)
|
||||||
|
}
|
||||||
|
|
||||||
|
const buildIdsParam = (ids: number | string | Array<number | string>) => {
|
||||||
|
return Array.isArray(ids) ? ids.join(',') : String(ids)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleDelete = async (ids: number | string | Array<number | string>) => {
|
||||||
|
try {
|
||||||
|
await message.delConfirm()
|
||||||
|
await PlanMaintenanceApi.deletePlanMaintenance(buildIdsParam(ids))
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
selectedIds.value = []
|
||||||
|
tableRef.value?.clearSelection?.()
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleBatchDelete = async () => {
|
||||||
|
if (!selectedIds.value.length) {
|
||||||
|
message.error('请选择需要删除的数据')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
await handleDelete(selectedIds.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleExport = async () => {
|
||||||
|
if (!selectedIds.value.length) {
|
||||||
|
message.error('请选择需要导出的数据')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await message.exportConfirm()
|
||||||
|
exportLoading.value = true
|
||||||
|
const data = await PlanMaintenanceApi.exportPlanMaintenance({ ids: selectedIds.value.join(',') })
|
||||||
|
download.excel(data, '方案维护.xls')
|
||||||
|
} catch {
|
||||||
|
} finally {
|
||||||
|
exportLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
await dictStore.setDictMap()
|
||||||
|
dictReady.value = true
|
||||||
|
getList()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
@ -0,0 +1,159 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog :title="dialogTitle" v-model="dialogVisible">
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="110px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="名称" prop="name">
|
||||||
|
<el-input v-model="formData.name" placeholder="请输入名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="类型" prop="taskType">
|
||||||
|
<el-radio-group v-model="formData.taskType">
|
||||||
|
<el-radio :label="1">点检</el-radio>
|
||||||
|
<el-radio :label="2">保养</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="设备列表" prop="deviceList">
|
||||||
|
<el-input v-model="formData.deviceList" placeholder="请输入设备列表" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目表单" prop="projectForm">
|
||||||
|
<el-input v-model="formData.projectForm" placeholder="请输入项目表单" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="起止日期" prop="dateRange">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.dateRange"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
|
type="daterange"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
class="!w-320px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="cron 表达式" prop="cronExpression">
|
||||||
|
<el-input v-model="formData.cronExpression" placeholder="请输入 cron 表达式" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="可操作人" prop="operableUsers">
|
||||||
|
<el-input v-model="formData.operableUsers" placeholder="请输入可操作人" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="是否启用" prop="enabled">
|
||||||
|
<el-radio-group v-model="formData.enabled">
|
||||||
|
<el-radio v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)" :key="String(dict.value)" :label="dict.value">
|
||||||
|
{{ dict.label }}
|
||||||
|
</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { DICT_TYPE, getBoolDictOptions } from '@/utils/dict'
|
||||||
|
import { TaskManagementApi, TaskManagementVO } from '@/api/mes/taskManagement'
|
||||||
|
|
||||||
|
defineOptions({ name: 'TaskManagementForm' })
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
const message = useMessage()
|
||||||
|
|
||||||
|
const dialogVisible = ref(false)
|
||||||
|
const dialogTitle = ref('')
|
||||||
|
const formLoading = ref(false)
|
||||||
|
const formType = ref('')
|
||||||
|
const formRef = ref()
|
||||||
|
|
||||||
|
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,
|
||||||
|
dateRange: [] as string[],
|
||||||
|
cronExpression: undefined as string | undefined,
|
||||||
|
operableUsers: undefined as string | undefined,
|
||||||
|
enabled: true as boolean
|
||||||
|
})
|
||||||
|
|
||||||
|
const formRules = reactive({
|
||||||
|
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
|
||||||
|
taskType: [{ required: true, message: '类型不能为空', trigger: 'change' }],
|
||||||
|
enabled: [{ required: true, message: '是否启用不能为空', trigger: 'change' }]
|
||||||
|
})
|
||||||
|
|
||||||
|
const resetForm = () => {
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
name: undefined,
|
||||||
|
taskType: undefined,
|
||||||
|
deviceList: undefined,
|
||||||
|
projectForm: undefined,
|
||||||
|
dateRange: [],
|
||||||
|
cronExpression: undefined,
|
||||||
|
operableUsers: undefined,
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
formRef.value?.resetFields()
|
||||||
|
}
|
||||||
|
|
||||||
|
const open = async (type: string, row?: TaskManagementVO) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
dialogTitle.value = t('action.' + type)
|
||||||
|
formType.value = type
|
||||||
|
resetForm()
|
||||||
|
|
||||||
|
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.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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ open })
|
||||||
|
|
||||||
|
const emit = defineEmits(['success'])
|
||||||
|
|
||||||
|
const submitForm = async () => {
|
||||||
|
await formRef.value.validate()
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
const [startDate, endDate] = Array.isArray(formData.value.dateRange) ? formData.value.dateRange : []
|
||||||
|
const payload: TaskManagementVO = {
|
||||||
|
id: formData.value.id,
|
||||||
|
name: formData.value.name,
|
||||||
|
taskType: formData.value.taskType,
|
||||||
|
deviceList: formData.value.deviceList,
|
||||||
|
projectForm: formData.value.projectForm,
|
||||||
|
startDate: startDate || undefined,
|
||||||
|
endDate: endDate || undefined,
|
||||||
|
cronExpression: formData.value.cronExpression,
|
||||||
|
operableUsers: formData.value.operableUsers,
|
||||||
|
enabled: formData.value.enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
if (formType.value === 'create') {
|
||||||
|
await TaskManagementApi.createTaskManagement(payload)
|
||||||
|
message.success(t('common.createSuccess'))
|
||||||
|
} else {
|
||||||
|
await TaskManagementApi.updateTaskManagement(payload)
|
||||||
|
message.success(t('common.updateSuccess'))
|
||||||
|
}
|
||||||
|
dialogVisible.value = false
|
||||||
|
emit('success')
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
@ -0,0 +1,202 @@
|
|||||||
|
<template>
|
||||||
|
<ContentWrap>
|
||||||
|
<el-form
|
||||||
|
class="-mb-15px"
|
||||||
|
:model="queryParams"
|
||||||
|
ref="queryFormRef"
|
||||||
|
:inline="true"
|
||||||
|
label-width="68px"
|
||||||
|
>
|
||||||
|
<el-form-item label="名称" prop="name">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.name"
|
||||||
|
placeholder="请输入名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="类型" prop="taskType">
|
||||||
|
<el-select v-model="queryParams.taskType" placeholder="请选择类型" clearable class="!w-240px">
|
||||||
|
<el-option v-for="opt in taskTypeOptions" :key="opt.value" :label="opt.label" :value="opt.value" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目表单" prop="projectForm">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.projectForm"
|
||||||
|
placeholder="请输入项目表单"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</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 type="primary" plain @click="openForm('create')" v-hasPermi="['mes:task-management:create']">
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
@click="handleExport"
|
||||||
|
:loading="exportLoading"
|
||||||
|
v-hasPermi="['mes:task-management:export']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:download" class="mr-5px" /> 导出
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<ContentWrap>
|
||||||
|
<el-table
|
||||||
|
v-loading="loading"
|
||||||
|
:data="list"
|
||||||
|
:stripe="true"
|
||||||
|
:show-overflow-tooltip="true"
|
||||||
|
@selection-change="handleSelectionChange"
|
||||||
|
>
|
||||||
|
<el-table-column type="selection" width="55" />
|
||||||
|
<el-table-column type="index" label="序号" align="center" width="70" />
|
||||||
|
<el-table-column label="名称" align="center" prop="name" min-width="140" />
|
||||||
|
<el-table-column label="类型" align="center" prop="taskType" width="90">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-tag v-if="scope.row.taskType === 1" type="primary">点检</el-tag>
|
||||||
|
<el-tag v-else-if="scope.row.taskType === 2" type="success">保养</el-tag>
|
||||||
|
<span v-else>-</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<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="启用" align="center" prop="enabled" width="90">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.enabled" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<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">
|
||||||
|
<template #default="scope">
|
||||||
|
<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']">
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<TaskManagementForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { DICT_TYPE } from '@/utils/dict'
|
||||||
|
import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'
|
||||||
|
import download from '@/utils/download'
|
||||||
|
import { TaskManagementApi, TaskManagementVO } from '@/api/mes/taskManagement'
|
||||||
|
import TaskManagementForm from './TaskManagementForm.vue'
|
||||||
|
|
||||||
|
defineOptions({ name: 'TaskManagement' })
|
||||||
|
|
||||||
|
const message = useMessage()
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
const taskTypeOptions = [
|
||||||
|
{ label: '点检', value: 1 },
|
||||||
|
{ label: '保养', value: 2 }
|
||||||
|
]
|
||||||
|
|
||||||
|
const loading = ref(true)
|
||||||
|
const list = ref<TaskManagementVO[]>([])
|
||||||
|
const total = ref(0)
|
||||||
|
const exportLoading = ref(false)
|
||||||
|
const selectedIds = ref<number[]>([])
|
||||||
|
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
name: undefined as string | undefined,
|
||||||
|
taskType: undefined as number | undefined,
|
||||||
|
projectForm: undefined as string | undefined
|
||||||
|
})
|
||||||
|
const queryFormRef = ref()
|
||||||
|
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await TaskManagementApi.getTaskManagementPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSelectionChange = (rows: TaskManagementVO[]) => {
|
||||||
|
selectedIds.value = rows
|
||||||
|
.map((r) => r.id)
|
||||||
|
.filter((id): id is number => typeof id === 'number')
|
||||||
|
}
|
||||||
|
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, row?: TaskManagementVO) => {
|
||||||
|
formRef.value.open(type, row)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleDelete = async (id?: number) => {
|
||||||
|
if (!id) return
|
||||||
|
try {
|
||||||
|
await message.delConfirm()
|
||||||
|
await TaskManagementApi.deleteTaskManagement(String(id))
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleExport = async () => {
|
||||||
|
try {
|
||||||
|
await message.exportConfirm()
|
||||||
|
exportLoading.value = true
|
||||||
|
const params: Record<string, any> = { ...queryParams }
|
||||||
|
if (selectedIds.value.length > 0) {
|
||||||
|
params.ids = selectedIds.value.join(',')
|
||||||
|
}
|
||||||
|
const data = await TaskManagementApi.exportTaskManagement(params)
|
||||||
|
download.excel(data, '任务管理.xls')
|
||||||
|
} catch {
|
||||||
|
} finally {
|
||||||
|
exportLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
Loading…
Reference in New Issue