# 运维工单域功能详细设计文档(代码反推版) **文档来源**: 基于 module-wo 模块实际代码反推 **生成日期**: 2026-04-23 **代码基线**: ether-pms/module-wo, ether-admin **对照文档**: 02-OPERATIONS.md(运营调度领域技术方案) --- ## 一、领域概述 ### 1.1 领域职责 运维工单域(module-wo)负责管理物业运维全生命周期,涵盖: - **综合工单管理**:多来源工单的创建、分配、执行、完成、验收全流程 - **维保计划管理**:设备周期性维保计划的制定与调度 - **维保任务管理**:维保工单的触发、执行、验收闭环 - **巡检模板管理**:设备点检模板与检查项的配置 - **工单明细管理**:工单下的备件/巡检项/检查点明细 - **统计看板**:工单与维保任务的多维度统计 ### 1.2 核心概念 | 概念 | 说明 | 对应实体 | 数据库表 | |------|------|----------|----------| | **工单** | 综合业务单据,支持6种来源6种类型 | WorkOrder | ops_work_order | | **工单明细** | 工单下的备件/巡检项/检查点 | WorkOrderItem | ops_work_order_item | | **维保计划** | 设备周期性维保计划 | MaintenancePlan | ops_maintenance_plan | | **维保任务** | 维保工单(设备维保执行单元) | MaintenanceTask | ops_maintenance_task | | **巡检模板** | 设备点检模板 | InspectionTemplate | ops_inspection_template | | **巡检项** | 模板下的检查项 | InspectionItem | ops_inspection_item | ### 1.3 领域边界 实际实现中,运维工单域与原需求文档的边界存在显著差异: - **原需求**:运营调度域(ether-ops)包含工单 + 消息通知系统 - **实际实现**:module-wo 仅包含工单/维保/巡检,消息通知系统未实现 - **前端分裂**:维保计划存在两套前端 API(`maintenance.ts` vs `maintenance-plan.ts`),巡检标准项归属 MDM 域 --- ## 二、数据结构设计 ### 2.1 WorkOrder(工单) **表名**: `ops_work_order` | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | UUID | 是 | 自动生成 | 主键 | | workNo | VARCHAR(50) | 是 | 自动生成 | 工单编号,格式: WO-YYYYMMDD-XXXX | | source | ENUM | 是 | - | 工单来源 | | type | ENUM | 是 | - | 工单类型 | | priority | ENUM | 否 | MEDIUM | 优先级 | | status | ENUM | 否 | PENDING | 工单状态 | | title | VARCHAR(200) | 是 | - | 工单标题 | | description | VARCHAR(2000) | 否 | - | 工单描述 | | projectId | UUID | 是 | - | 所属项目 | | equipmentId | UUID | 否 | - | 关联设备 | | spaceId | UUID | 否 | - | 关联空间 | | planId | UUID | 否 | - | 关联维保计划 | | triggerType | ENUM | 否 | - | 触发类型 | | assignedTo | VARCHAR(200) | 否 | - | 负责人 | | assignedVendor | VARCHAR(200) | 否 | - | 服务商 | | assignedDate | DATE | 否 | - | 派单日期 | | actualStart | TIMESTAMP | 否 | - | 实际开始时间 | | actualEnd | TIMESTAMP | 否 | - | 实际结束时间 | | actualHours | DECIMAL(6,2) | 否 | - | 实际工时(小时) | | faultCause | VARCHAR(2000) | 否 | - | 故障原因 | | solution | VARCHAR(5000) | 否 | - | 解决方案 | | result | VARCHAR(2000) | 否 | - | 处理结果 | | laborCost | DECIMAL(12,2) | 否 | - | 人工费 | | partsCost | DECIMAL(12,2) | 否 | - | 备件费 | | totalCost | DECIMAL(12,2) | 否 | - | 总费用 | | completedBy | VARCHAR(200) | 否 | - | 完成人 | | completedDate | DATE | 否 | - | 完成日期 | | verifiedBy | VARCHAR(200) | 否 | - | 验收人 | | verifiedDate | DATE | 否 | - | 验收日期 | | rating | INTEGER | 否 | - | 评分(1-5星) | | remark | VARCHAR(1000) | 否 | - | 备注 | | photos | JSONB | 否 | - | 照片URL列表 | | signature | VARCHAR(2000) | 否 | - | 签名 | | createdAt | TIMESTAMP | 是 | now() | 创建时间 | | updatedAt | TIMESTAMP | 是 | now() | 更新时间 | | createdBy | VARCHAR(200) | 否 | - | 创建人 | **枚举定义**: | 枚举 | 值 | 中文 | |------|-----|------| | Source | OWNER | 业主报修 | | | MAINTENANCE | 维保计划 | | | INSPECTION | 巡检触发 | | | FAULT | 故障触发 | | | REGULATORY | 法规巡检 | | | MANUAL | 手动创建 | | Type | REPAIR | 维修 | | | INSPECTION | 巡检 | | | SECURITY | 安保 | | | CLEANING | 保洁 | | | PROPERTY | 物业 | | | CONSULTATION | 咨询 | | Priority | LOW / MEDIUM / HIGH / URGENT | 低/中/高/紧急 | | Status | PENDING / ASSIGNED / IN_PROGRESS / COMPLETED / VERIFIED / CANCELLED | 见状态机 | | TriggerType | PLAN / INSPECTION / FAULT / MANUAL | 计划/巡检/故障/手动 | **索引**: | 索引名 | 字段 | 用途 | |--------|------|------| | idx_wo_project_status | project_id, status | 项目+状态查询 | | idx_wo_priority_status | priority, status | 优先级+状态查询 | | idx_wo_plan_createdat | plan_id, created_at | 计划关联查询 | | idx_wo_status_createdat | status, created_at | 状态+时间查询 | | idx_wo_createdat_desc | created_at DESC | 时间倒序 | ### 2.2 WorkOrderItem(工单明细) **表名**: `ops_work_order_item` | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | UUID | 是 | 自动生成 | 主键 | | workOrderId | UUID | 是 | - | 所属工单ID | | itemType | ENUM | 是 | - | 明细类型 | | itemName | VARCHAR(200) | 是 | - | 明细名称 | | quantity | DECIMAL(10,2) | 否 | 1 | 数量 | | unit | VARCHAR(50) | 否 | - | 单位 | | unitPrice | DECIMAL(12,2) | 否 | - | 单价 | | totalPrice | DECIMAL(12,2) | 否 | - | 总价 | | isNormal | BOOLEAN | 否 | - | 是否正常 | | observation | VARCHAR(2000) | 否 | - | 观察记录 | | suggestion | VARCHAR(2000) | 否 | - | 建议 | | sortOrder | INTEGER | 否 | 0 | 排序序号 | | createdAt | TIMESTAMP | 否 | now() | 创建时间 | **枚举定义**: | 枚举 | 值 | 中文 | |------|-----|------| | ItemType | PART | 备件 | | | INSPECTION_ITEM | 巡检项 | | | CHECKPOINT | 检查点 | ### 2.3 MaintenanceTask(维保任务) **表名**: `ops_maintenance_task` | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | UUID | 是 | 自动生成 | 主键 | | taskNo | VARCHAR(50) | 否 | 自动生成 | 任务编号,格式: EQ-YYYYMMDD-XXXX | | planId | UUID | 否 | - | 关联维保计划ID | | equipmentId | UUID | 是 | - | 关联设备ID | | projectId | UUID | 否 | - | 所属项目 | | taskType | ENUM | 否 | - | 任务类型 | | triggerType | ENUM | 否 | - | 触发类型 | | priority | ENUM | 否 | 自动判定 | 优先级 | | status | ENUM | 否 | PENDING | 任务状态 | | title | VARCHAR(200) | 否 | - | 任务标题 | | description | VARCHAR(2000) | 否 | - | 任务描述 | | assignedTo | VARCHAR(200) | 否 | - | 负责人 | | assignedVendor | VARCHAR(200) | 否 | - | 服务商 | | assignedDate | DATE | 否 | - | 派单日期 | | actualStart | TIMESTAMP | 否 | - | 实际开始时间 | | actualEnd | TIMESTAMP | 否 | - | 实际结束时间 | | actualHours | DECIMAL(6,2) | 否 | - | 实际工时 | | faultCause | VARCHAR(2000) | 否 | - | 故障原因 | | solution | VARCHAR(5000) | 否 | - | 解决方案 | | result | VARCHAR(2000) | 否 | - | 处理结果 | | partsUsed | JSONB | 否 | - | 使用备件列表 | | laborCost | DECIMAL(12,2) | 否 | - | 人工费 | | partsCost | DECIMAL(12,2) | 否 | - | 备件费 | | totalCost | DECIMAL(12,2) | 否 | - | 总费用 | | completedBy | VARCHAR(200) | 否 | - | 完成人 | | completedDate | DATE | 否 | - | 完成日期 | | verifiedBy | VARCHAR(200) | 否 | - | 验收人 | | verifiedDate | DATE | 否 | - | 验收日期 | | rating | INTEGER | 否 | - | 评分(1-5) | | remark | VARCHAR(1000) | 否 | - | 备注 | | photos | JSONB | 否 | - | 照片URL列表 | | signature | VARCHAR(2000) | 否 | - | 签名 | | createdAt | TIMESTAMP | 否 | now() | 创建时间 | | updatedAt | TIMESTAMP | 否 | now() | 更新时间 | | createdBy | VARCHAR(200) | 否 | - | 创建人 | **枚举定义**: | 枚举 | 值 | 中文 | |------|-----|------| | TaskType | PREVENTIVE | 预防性维护 | | | CORRECTIVE | 纠正性维护 | | | EMERGENCY | 紧急维修 | | TriggerType | PLAN | 计划触发 | | | INSPECTION | 巡检触发 | | | FAULT | 故障触发 | | | MANUAL | 手动创建 | | Priority | LOW / MEDIUM / HIGH / URGENT | 低/中/高/紧急 | | Status | PENDING / ASSIGNED / IN_PROGRESS / COMPLETED / VERIFIED / CANCELLED | 见状态机 | **partsUsed JSONB 结构**: ```json [ { "partsId": "uuid", "partsName": "备件名称", "quantity": 2, "unitPrice": 100.00, "totalPrice": 200.00 } ] ``` **索引**: | 索引名 | 字段 | 用途 | |--------|------|------| | idx_mt_equipment_status | equipment_id, status | 设备+状态查询 | | idx_mt_project_status | project_id, status | 项目+状态查询 | | idx_mt_plan_createdat | plan_id, created_at | 计划关联查询 | | idx_mt_status_assigneddate | status, assigned_date | 状态+派单日期查询 | ### 2.4 MaintenancePlan(维保计划) **表名**: `ops_maintenance_plan` | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | UUID | 是 | 自动生成 | 主键 | | planCode | VARCHAR(50) | 是 | 自动生成 | 计划编码(唯一) | | planName | VARCHAR(200) | 是 | - | 计划名称 | | planContent | VARCHAR(5000) | 否 | - | 计划内容 | | projectId | UUID | 否 | - | 所属项目 | | equipmentId | UUID | 是 | - | 关联设备 | | planType | ENUM | 是 | - | 计划类型 | | cycleDays | INTEGER | 否 | - | 周期天数 | | estimatedHours | DECIMAL(6,2) | 否 | - | 预估工时 | | assignedVendor | VARCHAR(200) | 否 | - | 指定服务商 | | status | ENUM | 否 | ACTIVE | 计划状态 | | lastDate | DATE | 否 | - | 上次执行日期 | | nextDate | DATE | 否 | - | 下次执行日期 | | createdAt | TIMESTAMP | 否 | now() | 创建时间 | | updatedAt | TIMESTAMP | 否 | now() | 更新时间 | | createdBy | VARCHAR(200) | 否 | - | 创建人 | **枚举定义**: | 枚举 | 值 | 中文 | |------|-----|------| | PlanType | PREVENTIVE | 预防性维护 | | | CORRECTIVE | 纠正性维护 | | PlanStatus | ACTIVE | 启用 | | | INACTIVE | 停用 | | | SUSPENDED | 暂停 | ### 2.5 InspectionTemplate(巡检模板) **表名**: `ops_inspection_template` | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | UUID | 是 | 自动生成 | 主键 | | templateCode | VARCHAR(50) | 是 | 自动生成 | 模板编码(唯一) | | templateName | VARCHAR(200) | 是 | - | 模板名称 | | description | VARCHAR(2000) | 否 | - | 描述 | | projectId | UUID | 否 | - | 所属项目 | | spaceId | UUID | 否 | - | 关联空间 | | category | VARCHAR(50) | 否 | - | 分类 | | status | ENUM | 否 | ACTIVE | 模板状态 | | createdAt | TIMESTAMP | 否 | now() | 创建时间 | | updatedAt | TIMESTAMP | 否 | now() | 更新时间 | | createdBy | VARCHAR(200) | 否 | - | 创建人 | | items | List\ | - | - | 检查项列表(@Transient,非持久化) | **枚举定义**: | 枚举 | 值 | 中文 | |------|-----|------| | TemplateStatus | ACTIVE | 启用 | | | INACTIVE | 停用 | ### 2.6 InspectionItem(巡检项) **表名**: `ops_inspection_item` | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | UUID | 是 | 自动生成 | 主键 | | templateId | UUID | 是 | - | 所属模板ID | | itemName | VARCHAR(200) | 是 | - | 检查项名称 | | description | VARCHAR(2000) | 否 | - | 描述 | | checkMethod | VARCHAR(2000) | 否 | - | 检查方法 | | standard | VARCHAR(2000) | 否 | - | 检查标准 | | isMandatory | BOOLEAN | 否 | true | 是否必检 | | isNormalRequired | BOOLEAN | 否 | true | 是否需要正常判定 | | sortOrder | INTEGER | 否 | 0 | 排序序号 | | createdAt | TIMESTAMP | 否 | now() | 创建时间 | ### 2.7 实体关系图 ``` MaintenancePlan ──1:N──> MaintenanceTask │ │ │ planId │ equipmentId ▼ ▼ WorkOrder ──1:N──> WorkOrderItem │ │ (关联) ▼ InspectionTemplate ──1:N──> InspectionItem ``` **关系说明**: - WorkOrder.planId → MaintenancePlan.id(工单可关联维保计划) - WorkOrderItem.workOrderId → WorkOrder.id(工单明细属于工单) - MaintenanceTask.planId → MaintenancePlan.id(维保任务由计划触发) - InspectionItem.templateId → InspectionTemplate.id(检查项属于模板) - WorkOrder 与 MaintenanceTask 为独立实体,无直接外键关联 --- ## 三、API 接口设计 ### 3.1 WorkOrderController **基础路径**: `/api/wo/work-orders` | 方法 | 路径 | 说明 | 请求体 | 响应 | |------|------|------|--------|------| | POST | / | 创建工单 | WorkOrder | WorkOrder | | GET | / | 查询工单列表 | QueryParams | List\ | | GET | /{id} | 获取工单详情 | - | WorkOrder | | PUT | /{id} | 更新工单 | WorkOrder | WorkOrder | | DELETE | /{id} | 删除工单 | - | Void | | POST | /{id}/assign | 派单 | AssignRequest | WorkOrder | | POST | /{id}/start | 开始执行 | - | WorkOrder | | POST | /{id}/complete | 完成工单 | WorkOrder | WorkOrder | | POST | /{id}/verify | 验收工单 | VerifyRequest | WorkOrder | | POST | /{id}/cancel | 取消工单 | - | WorkOrder | | GET | /stats | 工单统计 | - | WorkOrderStatsDTO | | GET | /{id}/items | 获取工单明细 | - | List\ | | POST | /{id}/items | 批量添加工单明细 | List\ | WorkOrder | **查询参数**(GET /): | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | projectId | UUID | 否 | 按项目筛选 | | equipmentId | UUID | 否 | 按设备筛选 | | source | Enum | 否 | 按来源筛选 | | type | Enum | 否 | 按类型筛选 | | status | Enum | 否 | 按状态筛选 | | assignedTo | String | 否 | 按负责人筛选 | > 注意:查询参数互斥,按优先级 projectId > equipmentId > source > type > status > assignedTo 依次判断 **请求体定义**: ```java // 派单请求 AssignRequest { String assignedTo; // 负责人 String assignedVendor; // 服务商 LocalDate assignedDate; // 派单日期 } // 验收请求 VerifyRequest { String verifiedBy; // 验收人 String remark; // 备注 Integer rating; // 评分(1-5) } ``` **WorkOrderStatsDTO**: | 字段 | 类型 | 说明 | |------|------|------| | total | long | 工单总数 | | pending | long | 待分配数 | | assigned | long | 已派单数 | | inProgress | long | 执行中数 | | completed | long | 已完成数 | | verified | long | 已验收数 | | cancelled | long | 已取消数 | | completedToday | long | 今日完成数 | | createdToday | long | 今日创建数 | | overdue | long | 逾期数 | | avgCompleteHours | BigDecimal | 平均完成工时 | | avgRating | BigDecimal | 平均评分 | | bySource | Map\ | 按来源分布 | | byType | Map\ | 按类型分布 | | byPriority | Map\ | 按优先级分布 | ### 3.2 MaintenanceTaskController **基础路径**: `/api/ops/maintenance-tasks` | 方法 | 路径 | 说明 | 请求体 | 响应 | |------|------|------|--------|------| | POST | / | 创建维保任务 | MaintenanceTask | MaintenanceTask | | GET | / | 查询维保任务列表 | QueryParams | List\ | | GET | /{id} | 获取任务详情 | - | MaintenanceTask | | PUT | /{id} | 更新任务 | MaintenanceTask | MaintenanceTask | | DELETE | /{id} | 删除任务 | - | Void | | POST | /{id}/assign | 分配任务 | AssignRequest | MaintenanceTask | | POST | /{id}/start | 开始执行 | - | MaintenanceTask | | POST | /{id}/complete | 完成任务(简版) | CompleteRequest | MaintenanceTask | | POST | /{id}/complete-details | 完成任务(详版) | MaintenanceTask | MaintenanceTask | | POST | /{id}/verify | 验收任务 | VerifyRequest | MaintenanceTask | | POST | /{id}/cancel | 取消任务 | - | MaintenanceTask | | POST | /{id}/rate | 评分 | rating (query) | MaintenanceTask | | GET | /stats | 任务统计 | - | MaintenanceTaskStatsDTO | **查询参数**(GET /): | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | equipmentId | UUID | 否 | 按设备筛选 | | planId | UUID | 否 | 按计划筛选 | | status | Enum | 否 | 按状态筛选 | | priority | Enum | 否 | 按优先级筛选 | | assignedTo | String | 否 | 按负责人筛选 | | overdueDate | LocalDate | 否 | 逾期截止日期 | > 同样互斥优先级:equipmentId > planId > status > priority > assignedTo > overdueDate **请求体定义**: ```java // 分配请求 AssignRequest { String assignedTo; // 负责人 LocalDate assignedDate; // 派单日期 } // 完成请求(简版) CompleteRequest { String result; // 处理结果 BigDecimal actualHours; // 实际工时 BigDecimal cost; // 总费用 String completedBy; // 完成人 } // 验收请求 VerifyRequest { String verifiedBy; // 验收人 String remark; // 备注 Integer rating; // 评分 } ``` **MaintenanceTaskStatsDTO**: | 字段 | 类型 | 说明 | |------|------|------| | total | long | 任务总数 | | pending | long | 待分配数 | | assigned | long | 已派单数 | | inProgress | long | 执行中数 | | completed | long | 已完成数 | | verified | long | 已验收数 | | cancelled | long | 已取消数 | | completedToday | long | 今日完成数 | | createdToday | long | 今日创建数 | | overdue | long | 逾期数 | | avgCompleteHours | BigDecimal | 平均完成工时 | | avgRating | BigDecimal | 平均评分 | | byPriority | Map\ | 按优先级分布 | | byTriggerType | Map\ | 按触发类型分布 | | totalLaborCost | BigDecimal | 人工费总计 | | totalPartsCost | BigDecimal | 备件费总计 | | totalCost | BigDecimal | 费用总计 | ### 3.3 前端独立 API(无后端 Controller 对应) 以下前端 API 存在但后端无对应 Controller 实现: | 前端文件 | API 路径 | 说明 | |----------|----------|------| | maintenance-plan.ts | /api/mdm/maintenance-plans | 维保计划 CRUD(归属 MDM 域) | | maintenance.ts | /api/ops/maintenance-plans | 维保计划 CRUD(另一套,含 accept 操作) | | maintenance.ts | /api/ops/maintenance-tasks | 维保任务(含 accept 操作,状态含 ACCEPTED) | | inspection-template.ts | /api/ops/inspection-templates | 巡检模板 CRUD | | inspection-item.ts | /api/mdm/inspection-items | 巡检标准项 CRUD(归属 MDM 域) | | inspection-record.ts | /api/mdm/inspection-records | 巡检记录 CRUD(归属 MDM 域) | --- ## 四、业务规则 ### 4.1 工单状态机 ``` ┌─────────────┐ │ PENDING │ ← 创建工单(默认状态) │ (待分配) │ └──────┬──────┘ │ 派单 (assign) ▼ ┌─────────────┐ │ ASSIGNED │ ← 分配负责人/服务商 │ (已派单) │ └──────┬──────┘ │ 开始执行 (start) ▼ ┌─────────────┐ │ IN_PROGRESS │ ← 记录实际开始时间 │ (执行中) │ └──────┬──────┘ │ 完成 (complete) ▼ ┌─────────────┐ │ COMPLETED │ ← 记录故障原因/解决方案/费用 │ (已完成) │ └──────┬──────┘ │ 验收 (verify) ▼ ┌─────────────┐ │ VERIFIED │ ← 记录验收人/评分/备注 │ (已验收) │ └─────────────┘ 特殊状态: - CANCELLED (已取消): PENDING/ASSIGNED/IN_PROGRESS 可转入 ``` **状态流转规则**: | 当前状态 | 允许操作 | 下一状态 | 前置条件 | 自动处理 | |---------|---------|---------|---------|---------| | PENDING | 派单 | ASSIGNED | - | 设置 assignedTo/assignedVendor/assignedDate | | ASSIGNED | 开始执行 | IN_PROGRESS | - | 设置 actualStart = now() | | IN_PROGRESS | 完成 | COMPLETED | - | 设置 actualEnd = now(),自动计算 actualHours | | COMPLETED | 验收 | VERIFIED | - | 设置 verifiedBy/verifiedDate/rating | | PENDING/ASSIGNED/IN_PROGRESS | 取消 | CANCELLED | - | - | | COMPLETED/VERIFIED | 取消 | ❌ 不允许 | - | 抛出异常"无法取消已完成的工单" | **工单编号生成规则**:`WO-YYYYMMDD-XXXX`(4位序号,按日期递增) **完成工单自动计算工时**: ```java actualHours = Duration.between(actualStart, actualEnd).toMinutes() / 60.0 ``` ### 4.2 维保任务状态机 ``` ┌─────────────┐ │ PENDING │ ← 创建任务(默认状态) │ (待分配) │ └──────┬──────┘ │ 分配 (assign) ▼ ┌─────────────┐ │ ASSIGNED │ ← 指定负责人 │ (已派单) │ └──────┬──────┘ │ 开始执行 (start) ▼ ┌─────────────┐ │ IN_PROGRESS │ ← 记录实际开始时间 │ (执行中) │ └──────┬──────┘ │ 完成 (complete / complete-details) ▼ ┌─────────────┐ │ COMPLETED │ ← 记录执行详情/费用/备件 │ (已完成) │ └──────┬──────┘ │ 验收 (verify) ▼ ┌─────────────┐ │ VERIFIED │ ← 记录验收人/评分 │ (已验收) │ └─────────────┘ 特殊状态: - CANCELLED (已取消): PENDING/ASSIGNED/IN_PROGRESS 可转入 ``` **与工单状态机的差异**: | 差异点 | WorkOrder | MaintenanceTask | |--------|-----------|-----------------| | 完成方式 | 仅一种 complete | 两种:complete(简版)+ complete-details(详版) | | 评分方式 | 验收时评分 | 验收时评分 + 独立 rate 接口 | | 取消条件 | COMPLETED/VERIFIED 不可取消 | 同 | | 删除行为 | 物理删除 | 逻辑删除(设为 CANCELLED) | | 完成后联动 | 无 | 自动更新设备维保记录(maintenanceVendor/nextInspectionDate) | **任务编号生成规则**:`EQ-YYYYMMDD-XXXX`(4位序号,按日期递增) ### 4.3 维保任务触发机制 | 触发类型 | 枚举值 | 说明 | 优先级自动判定规则 | |---------|--------|------|-------------------| | 计划触发 | PLAN | 由维保计划周期性触发 | MEDIUM | | 巡检触发 | INSPECTION | 巡检发现异常时触发 | HIGH | | 故障触发 | FAULT | 设备故障时触发 | HIGH(含紧急关键词时 URGENT) | | 手动创建 | MANUAL | 人工手动创建 | MEDIUM | **自动优先级判定规则**(MaintenanceTaskServiceImpl.autoDeterminePriority): ``` 1. 紧急维修类型(EMERGENCY) → URGENT 2. 故障触发(FAULT) + 紧急关键词 → URGENT 紧急关键词: 困人/漏水/停电/火灾/爆炸/漏电/冒烟/故障停机 3. 故障触发(FAULT) 无紧急关键词 → HIGH 4. 巡检触发(INSPECTION) → HIGH 5. 计划触发(PLAN) → MEDIUM 6. 其他 → MEDIUM ``` ### 4.4 维保计划管理规则 | 规则 | 说明 | |------|------| | 计划状态 | ACTIVE(启用)/ INACTIVE(停用)/ SUSPENDED(暂停) | | 删除行为 | 逻辑删除,将状态设为 INACTIVE | | 周期调度 | 通过 cycleDays 计算下次执行日期(nextDate) | | 计划类型 | PREVENTIVE(预防性)/ CORRECTIVE(纠正性) | ### 4.5 巡检模板管理规则 | 规则 | 说明 | |------|------| | 模板状态 | ACTIVE(启用)/ INACTIVE(停用) | | 检查项关联 | InspectionItem 通过 templateId 关联模板 | | 必检项 | isMandatory = true 的检查项不可跳过 | | 正常判定 | isNormalRequired = true 的检查项需要判定正常/异常 | | 排序 | 通过 sortOrder 控制检查项顺序 | ### 4.6 工单明细管理规则 | 规则 | 说明 | |------|------| | 明细类型 | PART(备件)/ INSPECTION_ITEM(巡检项)/ CHECKPOINT(检查点) | | 批量添加 | 支持批量添加,受 BatchOperationValidator 限制 | | 费用计算 | 前端计算:totalPrice = quantity × unitPrice,partsCost = Σ totalPrice | | 总费用 | totalCost = laborCost + partsCost | ### 4.7 维保任务完成后联动 维保任务完成(completeTaskWithDetails)时自动更新设备信息: ``` 1. 更新设备维保商: equipment.maintenanceVendor = task.assignedVendor 2. 更新下次巡检日期(仅预防性维护): equipment.nextInspectionDate = now() + equipment.inspectionCycle 默认周期: 30天 3. 异常容错: 更新设备失败不影响工单完成 ``` --- ## 五、前端操作流程 ### 5.1 工单管理(WorkOrder.vue) **页面路径**: /ops/work-order **操作流程**: ``` 1. 选择项目 → 加载工单列表 2. 筛选: 项目/来源/类型/状态/优先级/关键词 3. 查看统计卡片: 总工单/待分配/执行中/今日完成/逾期/平均评分 4. 工单操作: ├─ 新建工单 → 填写来源/类型/优先级/标题/描述/负责人/服务商 ├─ 查看详情 → 抽屉展示: 基本信息/问题描述/派单信息/执行信息/工单项/费用/验收 ├─ 编辑工单 → 修改基本信息 ├─ 派单 → 指定负责人/服务商/派单日期(PENDING → ASSIGNED) ├─ 开始执行 → 确认弹窗(ASSIGNED → IN_PROGRESS) ├─ 完成工单 → 填写工时/故障原因/解决方案/结果/工单项/费用(IN_PROGRESS → COMPLETED) ├─ 验收工单 → 填写验收人/评分/备注(COMPLETED → VERIFIED) ├─ 取消工单 → 确认弹窗(PENDING/ASSIGNED/IN_PROGRESS → CANCELLED) └─ 删除工单 → 确认弹窗 ``` **完成工单时的工单项录入**: ``` 添加工单项: ├─ 选择类型: 备件/巡检项/检查点 ├─ 输入名称 ├─ 输入数量 + 单价 → 自动计算 totalPrice └─ 自动汇总: partsCost = Σ(各工单项totalPrice) totalCost = laborCost + partsCost ``` **前端状态颜色映射**: | 状态 | 颜色 | 优先级 | 颜色 | |------|------|--------|------| | PENDING | default (灰) | LOW | green | | ASSIGNED | blue | MEDIUM | blue | | IN_PROGRESS | orange | HIGH | orange | | COMPLETED | green | URGENT | red | | VERIFIED | cyan | | | | CANCELLED | red | | | ### 5.2 维保计划(PlanList.vue) **页面路径**: /maintenance/plans > 注意:此页面使用 `maintenance.ts` API(/api/ops/maintenance-plans),与后端 MaintenancePlan 实体对应的是 `maintenance-plan.ts` API(/api/mdm/maintenance-plans),存在两套前端实现 **操作流程**: ``` 1. 选择项目 → 加载维保计划列表 2. 筛选: 项目/触发类型 3. 计划操作: ├─ 新建计划 → 填写名称/项目/触发类型/Cron表达式/描述/启用状态 ├─ 编辑计划 → 修改计划信息 └─ 停用计划 → 确认弹窗(逻辑删除) ``` **前端触发类型**(与后端不一致): | 前端枚举 | 中文 | 后端枚举 | 差异 | |---------|------|---------|------| | MANUAL | 手动 | - | 前端独有 | | SCHEDULED | 定时 | - | 前端独有 | | AUTOMATIC | 自动 | - | 前端独有 | | - | - | PLAN | 后端独有 | | - | - | INSPECTION | 后端独有 | | - | - | FAULT | 后端独有 | | - | - | MANUAL | 后端有但含义不同 | ### 5.3 维保任务(TaskList.vue) **页面路径**: /maintenance/tasks > 注意:此页面使用 `maintenance.ts` API,状态包含 ACCEPTED,与后端 MaintenanceTaskController 的6状态不一致 **操作流程**: ``` 1. 选择项目 → 加载维保任务列表 2. 筛选: 项目/状态/负责人 3. 任务操作: ├─ 接受任务 → PENDING → ACCEPTED(前端独有状态) ├─ 开始任务 → ACCEPTED → IN_PROGRESS ├─ 完成任务 → 弹窗输入完成备注 → IN_PROGRESS → COMPLETED └─ 取消任务 → 确认弹窗 ``` **前端状态映射**(与后端不一致): | 前端状态 | 中文 | 后端状态 | 差异 | |---------|------|---------|------| | PENDING | 待接受 | PENDING (待分配) | 含义不同 | | ACCEPTED | 已接受 | - | 前端独有 | | IN_PROGRESS | 进行中 | IN_PROGRESS | 一致 | | COMPLETED | 已完成 | COMPLETED | 一致 | | CANCELLED | 已取消 | CANCELLED | 一致 | | - | - | ASSIGNED | 后端独有 | | - | - | VERIFIED | 后端独有 | ### 5.4 点检模板管理(TemplateList.vue) **页面路径**: /inspection/templates **操作流程**: ``` 1. 选择项目 → 加载模板列表 2. 模板操作: ├─ 新建模板 → 填写名称/设备类型/项目/启用状态 + 添加点检项目 ├─ 编辑模板 → 修改模板信息 + 编辑点检项目 ├─ 复制模板 → 创建副本(名称加"_副本"后缀) └─ 删除模板 → 确认弹窗 添加点检项目: ├─ 输入项目名称 ├─ 输入检查方法 ├─ 输入检查标准 ├─ 设置是否必检 └─ 添加到列表 ``` **前端设备类型选项**(中文,与后端 category 字段不一致): 电梯/消防设备/空调/给排水/配电/安防/其他 ### 5.5 前端页面与 API 对照表 | 页面 | 前端文件 | API 文件 | 后端 Controller | API 基础路径 | |------|---------|----------|----------------|-------------| | 工单管理 | WorkOrder.vue | work-order.ts | WorkOrderController | /api/wo/work-orders | | 维保计划 | PlanList.vue | maintenance.ts | ❌ 无对应 | /api/ops/maintenance-plans | | 维保任务 | TaskList.vue | maintenance.ts | MaintenanceTaskController | /api/ops/maintenance-tasks | | 点检模板 | TemplateList.vue | inspection-template.ts | ❌ 无对应 | /api/ops/inspection-templates | --- ## 六、与原需求文档 02-OPERATIONS.md 的差异对比 ### 6.1 状态机差异(核心差异) | 对比项 | 需求文档 | 实际实现 | 差异分析 | |--------|----------|----------|----------| | **工单初始状态** | CREATED(已创建) | PENDING(待分配) | 实现简化,合并创建与待分配 | | **接单状态** | ACCEPTED(已接单) | ❌ 不存在 | 实现中 ASSIGNED 直接进入 IN_PROGRESS,省略接单环节 | | **关闭状态** | CLOSED(已关闭) | ❌ 不存在 | 实现用 VERIFIED(已验收)替代关闭 | | **验收状态** | ❌ 不存在 | VERIFIED(已验收) | 实现新增,强调验收确认环节 | | **挂起状态** | SUSPENDED(已挂起) | ❌ 不存在 | 实现未支持挂起/恢复 | | **退回状态** | RETURNED(已退回) | ❌ 不存在 | 实现未支持退回重分配 | | **取消状态** | ❌ 未提及 | CANCELLED(已取消) | 实现新增,支持工单取消 | **状态机对比图**: ``` 需求文档: CREATED → ASSIGNED → ACCEPTED → IN_PROGRESS → COMPLETED → CLOSED + SUSPENDED(任意状态可挂起) + RETURNED(ASSIGNED 可退回) 实际实现: PENDING → ASSIGNED → IN_PROGRESS → COMPLETED → VERIFIED + CANCELLED(PENDING/ASSIGNED/IN_PROGRESS 可取消) ``` ### 6.2 实体差异 | 对比项 | 需求文档 | 实际实现 | 差异分析 | |--------|----------|----------|----------| | **WorkOrderFlow** | 有(工单流转记录) | ❌ 不存在 | 实现未记录流转历史 | | **NotificationChannel** | 有(通知渠道) | ❌ 不存在 | 消息通知系统未实现 | | **NotificationTemplate** | 有(消息模板) | ❌ 不存在 | 消息通知系统未实现 | | **NotificationRule** | 有(通知规则) | ❌ 不存在 | 消息通知系统未实现 | | **NotificationHistory** | 有(通知历史) | ❌ 不存在 | 消息通知系统未实现 | | **WorkOrderItem** | ❌ 不存在 | 有(工单明细) | 实现新增,支持备件/巡检项/检查点 | | **MaintenancePlan** | ❌ 不存在 | 有(维保计划) | 实现新增,支持周期性维保调度 | | **MaintenanceTask** | ❌ 不存在 | 有(维保任务) | 实现新增,独立于 WorkOrder 的维保工单 | | **InspectionTemplate** | ❌ 不存在 | 有(巡检模板) | 实现新增,支持点检模板管理 | | **InspectionItem** | ❌ 不存在 | 有(巡检项) | 实现新增,模板下的检查项 | ### 6.3 字段差异(WorkOrder) | 字段 | 需求文档 | 实际实现 | 差异分析 | |------|----------|----------|----------| | orderNo | WO2024021000001 | workNo: WO-YYYYMMDD-XXXX | 编号格式不同,实现用连字符分隔 | | orderType | REPAIR/COMPLAINT/CLEANING/SECURITY/OTHER | type: REPAIR/INSPECTION/SECURITY/CLEANING/PROPERTY/CONSULTATION | 枚举值完全不同 | | source | APP/PHONE/INSPECTION/IOT/SYSTEM | OWNER/MAINTENANCE/INSPECTION/FAULT/REGULATORY/MANUAL | 枚举值完全不同 | | reporterId/reporterName/reporterPhone/reporterAddress | 有 | ❌ 不存在 | 实现无报修人信息 | | assigneeId/assigneeName | UUID引用 | assignedTo: String | 实现用字符串而非用户ID引用 | | acceptedAt/startedAt/completedAt/closedAt | 有 | actualStart/actualEnd/completedDate/verifiedDate | 字段名和粒度不同 | | materialCost | 有 | partsCost | 字段名不同 | | resultDescription | 有 | result + faultCause + solution | 实现拆分为3个字段 | | satisfactionScore/satisfactionComment | 有 | rating + remark | 实现简化,无评论字段 | | images/attachments | String | photos: JSONB (List\) | 实现用JSONB数组 | | attributes | JSONB | ❌ 不存在 | 实现无扩展属性 | | spaceNodeId | 有 | spaceId | 字段名不同 | | planId/triggerType | ❌ 不存在 | 有 | 实现新增,关联维保计划 | | assignedVendor | ❌ 不存在 | 有 | 实现新增,支持服务商 | | laborCost/partsCost/totalCost | ❌ 不存在 | 有 | 实现新增,费用明细 | | signature | ❌ 不存在 | 有 | 实现新增,签名确认 | ### 6.4 API 差异 | 对比项 | 需求文档 | 实际实现 | 差异分析 | |--------|----------|----------|----------| | API 版本 | /api/v1/ops/work-orders | /api/wo/work-orders | 路径不同,实现无版本号 | | 分页查询 | Page\ | List\ | 实现无分页,全量返回 | | 接单接口 | POST /{id}/accept | ❌ 不存在 | 无 ACCEPTED 状态 | | 关闭接口 | POST /{id}/close | ❌ 不存在 | 用 verify 替代 | | 挂起/恢复 | POST /{id}/suspend, /{id}/resume | ❌ 不存在 | 未实现 | | 退回 | ❌ 不存在 | ❌ 不存在 | 需求有但实现无 | | 流转记录 | GET /{id}/flows | ❌ 不存在 | 未实现 WorkOrderFlow | | 通知 API | 完整的渠道/模板/规则/历史 | ❌ 不存在 | 消息通知系统未实现 | | 统计 API | 独立 Controller,多维度 | GET /stats(嵌入工单 Controller) | 实现简化 | | 工单明细 | ❌ 不存在 | GET/POST /{id}/items | 实现新增 | | 维保任务 API | ❌ 不存在 | 完整的 CRUD + 状态流转 | 实现新增 | ### 6.5 业务规则差异 | 对比项 | 需求文档 | 实际实现 | 差异分析 | |--------|----------|----------|----------| | 工单编号格式 | WO + yyyyMMdd + 5位序号 | WO-YYYYMMDD-XXXX(4位) | 格式不同 | | 通知触发 | 工单状态变更自动触发通知 | ❌ 无通知 | 消息通知未实现 | | SLA 监控 | 提及但未实现 | ❌ 未实现 | 均未实现 | | 智能派单 | 提及但未实现 | ❌ 未实现 | 均未实现 | | 维保优先级自动判定 | ❌ 未提及 | 有(基于触发类型+关键词) | 实现新增 | | 设备联动更新 | ❌ 未提及 | 有(完成维保后更新设备记录) | 实现新增 | | 维保任务双完成接口 | ❌ 未提及 | complete + complete-details | 实现新增,简版/详版 | | 删除策略 | 未明确 | WorkOrder 物理删除,MaintenanceTask 逻辑删除 | 不一致 | ### 6.6 前端实现差异 | 对比项 | 需求文档 | 实际实现 | 差异分析 | |--------|----------|----------|----------| | 维保计划 API | 单一 | 两套(maintenance.ts + maintenance-plan.ts) | 前端分裂 | | 维保计划触发类型 | - | MANUAL/SCHEDULED/AUTOMATIC vs PLAN/INSPECTION/FAULT/MANUAL | 前后端不一致 | | 维保任务状态 | - | 前端含 ACCEPTED,后端含 ASSIGNED/VERIFIED | 前后端不一致 | | 巡检模板 | ❌ 未提及 | 有(inspection-template.ts + TemplateList.vue) | 实现新增 | | 巡检标准项 | ❌ 未提及 | 有(inspection-item.ts,归属 MDM 域) | 实现新增 | | 巡检记录 | ❌ 未提及 | 有(inspection-record.ts,归属 MDM 域) | 实现新增 | ### 6.7 差异总结 | 类别 | 需求文档有/实现无 | 实现有/需求文档无 | 说明 | |------|-----------------|-----------------|------| | 状态 | CREATED, ACCEPTED, CLOSED, SUSPENDED, RETURNED | VERIFIED, CANCELLED | 状态机完全重构 | | 实体 | WorkOrderFlow, NotificationChannel/Template/Rule/History | WorkOrderItem, MaintenancePlan/Task, InspectionTemplate/Item | 实体体系完全不同 | | 功能 | 消息通知系统, 工单流转记录 | 维保计划/任务, 巡检模板, 工单明细 | 功能重心偏移 | | 字段 | 报修人信息, 扩展属性 | 服务商, 费用明细, 签名, 触发类型 | 字段侧重不同 | > **核心结论**: 实际实现与需求文档是两套不同的设计方案。需求文档侧重"运营调度+消息通知",实际实现侧重"运维工单+维保管理+巡检模板"。状态机从7状态简化为6状态,去掉了接单/挂起/退回环节,新增了验收/取消环节。消息通知系统完全未实现,但新增了维保计划/任务/巡检模板等需求文档未涵盖的功能。