Merge branch 'main' of https://git.ngsk.tech/linweidong/besure_web
commit
a455acdd33
@ -1,45 +1,50 @@
|
||||
import request from '@/config/axios'
|
||||
|
||||
// 维保项目 VO
|
||||
export interface DvSubjectVO {
|
||||
id: number // ID
|
||||
subjectCode: string // 项目编码
|
||||
subjectName: string // 项目名称
|
||||
subjectType: string // 项目类型
|
||||
subjectContent: string // 项目内容
|
||||
subjectStandard: string // 标准
|
||||
isEnable: boolean // 是否启用
|
||||
}
|
||||
|
||||
// 维保项目 API
|
||||
export const DvSubjectApi = {
|
||||
// 查询维保项目分页
|
||||
getDvSubjectPage: async (params: any) => {
|
||||
return await request.get({ url: `/mes/dv-subject/page`, params })
|
||||
},
|
||||
|
||||
// 查询维保项目详情
|
||||
getDvSubject: async (id: number) => {
|
||||
return await request.get({ url: `/mes/dv-subject/get?id=` + id })
|
||||
},
|
||||
|
||||
// 新增维保项目
|
||||
createDvSubject: async (data: DvSubjectVO) => {
|
||||
return await request.post({ url: `/mes/dv-subject/create`, data })
|
||||
},
|
||||
|
||||
// 修改维保项目
|
||||
updateDvSubject: async (data: DvSubjectVO) => {
|
||||
return await request.put({ url: `/mes/dv-subject/update`, data })
|
||||
},
|
||||
|
||||
// 删除维保项目
|
||||
deleteDvSubject: async (id: number) => {
|
||||
return await request.delete({ url: `/mes/dv-subject/delete?id=` + id })
|
||||
},
|
||||
|
||||
// 导出维保项目 Excel
|
||||
exportDvSubject: async (params) => {
|
||||
return await request.download({ url: `/mes/dv-subject/export-excel`, params })
|
||||
},
|
||||
}
|
||||
import request from '@/config/axios'
|
||||
|
||||
// 维保项目 VO
|
||||
export interface DvSubjectVO {
|
||||
id?: number // ID
|
||||
subjectCode: string // 项目编码
|
||||
subjectName: string // 项目名称
|
||||
subjectType?: string // 项目类型
|
||||
subjectContent?: string // 项目内容
|
||||
subjectStandard?: string // 标准
|
||||
isEnable: string // 是否启用
|
||||
inspectionMethod: string // 检验方式
|
||||
valueType: string // 值类型
|
||||
judgmentCriteria: string // 判定基准
|
||||
creator?: string // 创建人
|
||||
createTime?: string | number | Date // 创建时间
|
||||
}
|
||||
|
||||
// 维保项目 API
|
||||
export const DvSubjectApi = {
|
||||
// 查询维保项目分页
|
||||
getDvSubjectPage: async (params: any) => {
|
||||
return await request.get({ url: `/mes/dv-subject/page`, params })
|
||||
},
|
||||
|
||||
// 查询维保项目详情
|
||||
getDvSubject: async (id: number) => {
|
||||
return await request.get({ url: `/mes/dv-subject/get?id=` + id })
|
||||
},
|
||||
|
||||
// 新增维保项目
|
||||
createDvSubject: async (data: DvSubjectVO) => {
|
||||
return await request.post({ url: `/mes/dv-subject/create`, data })
|
||||
},
|
||||
|
||||
// 修改维保项目
|
||||
updateDvSubject: async (data: DvSubjectVO) => {
|
||||
return await request.put({ url: `/mes/dv-subject/update`, data })
|
||||
},
|
||||
|
||||
// 删除维保项目
|
||||
deleteDvSubject: async (ids: string) => {
|
||||
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