diff --git a/src/api/maintenance.ts b/src/api/maintenance.ts new file mode 100644 index 00000000..52a9b29f --- /dev/null +++ b/src/api/maintenance.ts @@ -0,0 +1,156 @@ +import request from '@/utils/request' + +// ==================== 维保计划相关类型 ==================== + +export interface MaintenancePlan { + id: string + name: string + projectId: string + projectName?: string + triggerType: 'MANUAL' | 'SCHEDULED' | 'AUTOMATIC' + equipmentId?: string + equipmentName?: string + spaceNodeId?: string + spaceNodeName?: string + description?: string + enabled: boolean + cronExpression?: string + nextTriggerTime?: string + createdAt?: string + updatedAt?: string +} + +export interface MaintenancePlanForm { + id?: string + name: string + projectId: string + triggerType: 'MANUAL' | 'SCHEDULED' | 'AUTOMATIC' + equipmentId?: string + spaceNodeId?: string + description?: string + enabled?: boolean + cronExpression?: string +} + +// ==================== 维保任务相关类型 ==================== + +export type TaskStatus = 'PENDING' | 'ACCEPTED' | 'IN_PROGRESS' | 'COMPLETED' | 'CANCELLED' + +export interface MaintenanceTask { + id: string + planId?: string + planName?: string + projectId: string + projectName?: string + equipmentId?: string + equipmentName?: string + spaceNodeId?: string + spaceNodeName?: string + title: string + description?: string + status: TaskStatus + assigneeId?: string + assigneeName?: string + scheduledDate?: string + startTime?: string + completedTime?: string + cancellationReason?: string + completionNotes?: string + createdAt?: string + updatedAt?: string +} + +export interface TaskQueryParams { + projectId?: string + status?: TaskStatus + assigneeId?: string + page?: number + size?: number +} + +// ==================== 维保计划 API ==================== + +// 获取维保计划列表 +export function getMaintenancePlans(projectId: string, triggerType?: string) { + return request.get({ + url: '/api/v1/ops/maintenance-plans', + params: { projectId, triggerType } + }) +} + +// 获取维保计划详情 +export function getMaintenancePlan(id: string) { + return request.get({ + url: `/api/v1/ops/maintenance-plans/${id}` + }) +} + +// 创建维保计划 +export function createMaintenancePlan(data: MaintenancePlanForm) { + return request.post({ + url: '/api/v1/ops/maintenance-plans', + data + }) +} + +// 更新维保计划 +export function updateMaintenancePlan(id: string, data: MaintenancePlanForm) { + return request.put({ + url: `/api/v1/ops/maintenance-plans/${id}`, + data + }) +} + +// 删除/停用维保计划 +export function deleteMaintenancePlan(id: string) { + return request.delete({ + url: `/api/v1/ops/maintenance-plans/${id}` + }) +} + +// ==================== 维保任务 API ==================== + +// 获取维保任务列表 +export function getMaintenanceTasks(params: TaskQueryParams) { + return request.get({ + url: '/api/v1/ops/maintenance-tasks', + params + }) +} + +// 获取维保任务详情 +export function getMaintenanceTask(id: string) { + return request.get({ + url: `/api/v1/ops/maintenance-tasks/${id}` + }) +} + +// 接受任务 +export function acceptMaintenanceTask(id: string, userId: string) { + return request.post({ + url: `/api/v1/ops/maintenance-tasks/${id}/accept`, + params: { userId } + }) +} + +// 开始执行任务 +export function startMaintenanceTask(id: string) { + return request.post({ + url: `/api/v1/ops/maintenance-tasks/${id}/start` + }) +} + +// 完成维保 +export function completeMaintenanceTask(id: string, data: { completionNotes?: string }) { + return request.post({ + url: `/api/v1/ops/maintenance-tasks/${id}/complete`, + data + }) +} + +// 取消任务 +export function cancelMaintenanceTask(id: string) { + return request.post({ + url: `/api/v1/ops/maintenance-tasks/${id}/cancel` + }) +} diff --git a/src/components/PageHeader/index.vue b/src/components/PageHeader/index.vue index 4e03042c..c1a4abcd 100644 --- a/src/components/PageHeader/index.vue +++ b/src/components/PageHeader/index.vue @@ -2,12 +2,18 @@ import { useRouter } from 'vue-router' interface Props { - title: string + title?: string showBack?: boolean actions?: { icon: string; text: string; onClick?: () => void }[] } -defineProps() +const props = withDefaults(defineProps(), { + title: '' +}) + +defineEmits<{ + (e: 'back'): void +}>() const router = useRouter() @@ -24,7 +30,8 @@ const handleBack = () => { -

{{ title }}

+

{{ title }}

+
+ diff --git a/src/router/index.ts b/src/router/index.ts index 8fe9a3b8..c3ea0afa 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -80,6 +80,18 @@ const router = createRouter({ name: 'EquipmentDetail', component: () => import('@/views/equipment/EquipmentDetail.vue'), meta: { title: '设备详情' } + }, + { + path: 'maintenance/plans', + name: 'MaintenancePlans', + component: () => import('@/views/maintenance/PlanList.vue'), + meta: { title: '维保计划' } + }, + { + path: 'maintenance/tasks', + name: 'MaintenanceTasks', + component: () => import('@/views/maintenance/TaskList.vue'), + meta: { title: '维保任务' } } ] } diff --git a/src/views/Layout.vue b/src/views/Layout.vue index e3f15bfb..18f6b88d 100644 --- a/src/views/Layout.vue +++ b/src/views/Layout.vue @@ -45,7 +45,18 @@ const menuItems: MenuProps['items'] = [ key: 'operation', label: '运营管理', type: 'group', - children: [] + children: [ + { + key: '/maintenance/plans', + icon: () => h(ToolOutlined), + label: '维保计划' + }, + { + key: '/maintenance/tasks', + icon: () => h(ToolOutlined), + label: '维保任务' + } + ] }, { key: 'system', diff --git a/src/views/maintenance/PlanList.vue b/src/views/maintenance/PlanList.vue new file mode 100644 index 00000000..302f0dfb --- /dev/null +++ b/src/views/maintenance/PlanList.vue @@ -0,0 +1,397 @@ + + + + + diff --git a/src/views/maintenance/TaskList.vue b/src/views/maintenance/TaskList.vue new file mode 100644 index 00000000..67d943d0 --- /dev/null +++ b/src/views/maintenance/TaskList.vue @@ -0,0 +1,401 @@ + + + + + diff --git a/src/views/project/List.vue b/src/views/project/List.vue index 1c1b0e49..f4bd4e2a 100644 --- a/src/views/project/List.vue +++ b/src/views/project/List.vue @@ -1,12 +1,13 @@