# 前端 API 文档(基于《系统设计方案.md》) > 版本依据:`系统设计方案.md` V2.4(2026-05-01,最终生产版·固定槽位与批量补料) > 适用对象:React 前端、API 对接、联调、后续接口生成 > 说明:本文描述目标设计契约,不以当前过渡期 `apis/*.api` 的实现为准。若当前实现与本文不一致,应以本文作为后续对齐目标。 --- ## 1. 通用约定 ### 1.1 Base URL ```text /api/v1 ``` ### 1.2 鉴权 除登录、刷新 token 外,所有接口默认需要登录态。 ```http Authorization: ``` ### 1.3 时间格式 前端统一按 ISO 8601 字符串处理时间。 ```ts type ISODateTime = string // 例:2026-05-01T10:30:00+08:00 ``` ### 1.4 分页参数 ```ts interface PageReq { page?: number // 默认 1 limit?: number // 默认 10,最大 100 } interface PageReply { page: number limit: number total: number } ``` ### 1.5 排序参数 ```ts interface SortReq { sort?: string order?: 'asc' | 'desc' | 'ascend' | 'descend' } ``` ### 1.6 通用响应 envelope 目标设计建议前端统一按如下响应格式接入;如果后端某些接口仍返回裸数据,需要在请求封装层兼容。 ```ts interface ApiResponse { code: number message: string data: T } ``` 成功: ```json { "code": 0, "message": "ok", "data": {} } ``` 失败: ```json { "code": 40001, "message": "工件状态不允许执行该操作", "data": null } ``` --- ## 2. 核心枚举 ### 2.1 工单状态 `WorkOrderStatus` ```ts type WorkOrderStatus = | 'CREATED' | 'IN_PROGRESS' | 'PAUSED' | 'COMPLETED' | 'CANCELLED' | 'ERROR' ``` ### 2.2 工件状态 `JobStatus` 来自设计第 7.1 节。 ```ts type JobStatus = | 'CREATED' | 'IN_HANDLING' | 'PROCESSING' | 'WAITING_UNLOAD' | 'ON_BUFFER' | 'WAITING_DECISION' | 'COMPLETED' | 'SCRAPPED' | 'SUSPENDED' ``` ### 2.3 工件位置类型 `PositionType` ```ts type PositionType = 'ON_EQUIPMENT' | 'ON_BUFFER' | 'IN_HAND' ``` ### 2.4 设备状态 `StationStatus` ```ts type StationStatus = 'IDLE' | 'BUSY' | 'WAITING' | 'FAULT' | 'OFFLINE' ``` ### 2.5 任务状态 `TaskStatus` 来自设计第 9 节。 ```ts type TaskStatus = | 'CREATED' | 'DISPATCHED' | 'RUNNING' | 'SUCCESS' | 'FAILED' | 'TIMEOUT' ``` ### 2.6 工序类型 `RecipeStepType` 来自设计第 5.1 节。 ```ts type RecipeStepType = | 'LOAD' | 'BUFFER_STAGE' | 'MACHINING' | 'UNLOAD' | 'WASH' | 'INSPECTION' | 'JUDGE' | 'DEBURR' | 'RUST_WASH' | 'FINAL_SCAN' | 'LASER_MARK' | 'DECISION' | 'PLACE_SAMPLING' | 'PLACE_AGV' ``` --- ## 3. 登录与当前用户 ### 3.1 登录 ```http POST /api/v1/login ``` 请求: ```ts interface LoginReq { username: string password: string captchaId?: string captchaCode?: string } ``` 响应: ```ts interface TokenReply { accessToken: string accessExpire: number refreshToken: string refreshExpire: number } ``` ### 3.2 刷新 token ```http POST /api/v1/refreshToken ``` 请求: ```ts interface RefreshTokenReq { refreshToken: string } ``` 响应:`TokenReply` ### 3.3 当前用户信息 ```http GET /api/v1/userinfo ``` 响应: ```ts interface UserInfoReply { id: number name: string username: string mobile: string gender: number roleId: number roleName: string deptId: number deptName: string position: string status: number createdAt: number updatedAt: number } ``` --- ## 4. 产品类型与工艺路线 设计依据:第 1.1 节机床绑定关系、第 5 节工艺路线定义、第 6.1 节 `product_type/recipe/recipe_step`。 ### 4.1 产品类型列表 ```http GET /api/v1/product-types/list ``` 查询: ```ts interface ListProductTypesReq { keyword?: string activeOnly?: boolean } ``` 响应: ```ts interface ProductTypeReply { id: string // 例:A6VM107 code: string name: string recipeId: string cncMachineIds: string[] // 例:['CNC_3', 'CNC_4'] isActive: boolean remark: string } ``` ### 4.2 产品类型详情 ```http GET /api/v1/product-types/:id ``` 响应:`ProductTypeReply` ### 4.3 工艺路线详情 ```http GET /api/v1/recipes/:id ``` 响应: ```ts interface RecipeReply { id: string name: string version: number steps: RecipeStepReply[] } interface RecipeStepReply { stepId: string stepName: string stepType: RecipeStepType resourceType?: string toolType?: 'SCANNER' | 'LASER' allowedResources?: string[] processingParams?: Record nextStepDefault?: string nextStepBranches?: Record stepTimeout?: number description?: string } ``` --- ## 5. 工单管理 设计依据:第 10 节。 ### 5.1 工单分页列表 ```http GET /api/v1/work-orders ``` 查询: ```ts interface QueryWorkOrdersReq extends PageReq, SortReq { keyword?: string statuses?: WorkOrderStatus[] productTypeId?: string } ``` 响应: ```ts interface QueryWorkOrdersReply extends PageReply { data: WorkOrderReply[] } interface WorkOrderReply { id: string no: string productTypeId: string quantity: number finishedNum: number failNum: number status: WorkOrderStatus sourceBaySlotId?: string context?: Record createdTime: ISODateTime updatedTime: ISODateTime completedTime?: ISODateTime } ``` ### 5.2 工单详情 ```http GET /api/v1/work-orders/:id ``` 响应:`WorkOrderReply` ### 5.3 创建工单 ```http POST /api/v1/work-orders ``` 请求: ```ts interface CreateWorkOrderReq { productTypeId: string quantity: number dockSlots: string[] // 格式:dockNo.slotNo,例如 '1.3' context?: Record remark?: string } ``` 响应: ```ts interface CreateWorkOrderReply { id: string } ``` ### 5.4 更新工单 ```http PUT /api/v1/work-orders/:id ``` 请求: ```ts interface UpdateWorkOrderReq { productTypeId?: string quantity?: number remark?: string context?: Record } ``` ### 5.5 开始工单 ```http POST /api/v1/work-orders/:id/start ``` 效果:工单进入 `IN_PROGRESS`,触发初始补料/调度。 ### 5.6 暂停工单 ```http POST /api/v1/work-orders/:id/pause ``` 效果:只修改工单为 `PAUSED`,调度过滤层排除该工单,不污染工件状态。 ### 5.7 恢复工单 ```http POST /api/v1/work-orders/:id/resume ``` 效果:工单从 `PAUSED` 回到 `IN_PROGRESS`,调度重新纳入。 ### 5.8 断电恢复工单 ```http POST /api/v1/work-orders/:id/restore ``` 效果:按设计第 15 节恢复等级执行恢复。 响应: ```ts interface RestoreWorkOrderReply { orderId: string restoredJobs: number level: 'L1' | 'L2' | 'L3' manualRequired: boolean message?: string } ``` ### 5.9 取消工单 ```http POST /api/v1/work-orders/:id/cancel ``` 效果:终止未完成工件,释放可释放资源。 ### 5.10 删除工单 ```http DELETE /api/v1/work-orders/:id ``` 约束:仅允许删除未运行或已终态工单。 --- ## 6. 工件 / Job 管理 设计依据:第 6.2 节 `job`,第 7 节工件生命周期。 ### 6.1 工件分页列表 ```http GET /api/v1/jobs ``` 查询: ```ts interface QueryJobsReq extends PageReq, SortReq { keyword?: string workOrderId?: string productTypeId?: string statuses?: JobStatus[] positionType?: PositionType } ``` 响应: ```ts interface QueryJobsReply extends PageReply { data: JobReply[] } interface JobReply { id: string workOrderId: string workpieceNo: string productTypeId: string recipeId: string currentStepId: string currentStepName: string status: JobStatus positionType: PositionType positionRefId: string priority: number suspendedReason?: string context?: Record version: number createdTime: ISODateTime lastUpdated: ISODateTime } ``` ### 6.2 工单下工件分页 ```http GET /api/v1/work-orders/:id/jobs ``` 查询: ```ts interface QueryJobsOfWorkOrderReq extends PageReq, SortReq { statuses?: JobStatus[] } ``` 响应:`QueryJobsReply` ### 6.3 工件详情 ```http GET /api/v1/jobs/:id ``` 响应:`JobReply` ### 6.4 挂起工件 ```http POST /api/v1/jobs/:id/suspend ``` 请求: ```ts interface SuspendJobReq { reason?: string } ``` 效果:工件进入 `SUSPENDED`。如果当前 `IN_HANDLING` 或设备处理中,按后端策略延迟挂起或要求人工确认。 ### 6.5 恢复工件 ```http POST /api/v1/jobs/:id/resume ``` 效果:从 `SUSPENDED` 恢复到可调度状态。 ### 6.6 返工工件 ```http POST /api/v1/jobs/:id/rework ``` 请求: ```ts interface ReworkJobReq { targetStepId: string reason?: string } ``` 效果:修改 `current_step_id`,新增 `job_step_instance`。 --- ## 7. 看板 / 监控 API 设计依据:第 3 节人工终端、第 7 节状态管理、第 11 节工站接口、第 16 节 Redis SSOT。 ### 7.1 生产线总览 ```http GET /api/v1/dashboard/overview ``` 响应: ```ts interface DashboardOverviewReply { activeOrderCount: number activeJobCount: number completedToday: number scrappedToday: number stationFaultCount: number buffer: BufferSummary } interface BufferSummary { total: number occupied: number free: number needRefill: boolean } ``` ### 7.2 工站监控 ```http GET /api/v1/stations/monitor ``` 响应: ```ts interface StationMonitorReply { stations: StationMonitorItem[] activeOrders: ActiveOrderSummary[] } interface StationMonitorItem { id: string // 例:CNC_1、WASHER_1、BUFFER、SAMPLING_1 type: string name: string status: StationStatus heartbeatOnline: boolean currentJobs: StationJobBrief[] waitingUnloadJobs: StationJobBrief[] updatedAt: ISODateTime } interface StationJobBrief { jobId: string workOrderId: string productTypeId: string status: JobStatus positionRefId: string currentStepId: string currentStepName: string } interface ActiveOrderSummary { orderId: string orderNo: string status: WorkOrderStatus productTypeId: string totalJobs: number completedJobs: number scrappedJobs: number } ``` > 设计说明:工站对外不暴露内部槽位写接口;前端仅展示 Redis 推导出的当前工件、等待下料工件和设备状态。设备槽位属于后端工站内部实现细节,不作为前端操作入口。 ### 7.3 暂存台槽位监控 ```http GET /api/v1/buffer/slots ``` 响应: ```ts interface BufferSlotsReply { slots: BufferSlotReply[] occupied: number free: number total: 8 refillThreshold: 4 needRefill: boolean } interface BufferSlotReply { slotNo: number // 1~8 occupied: boolean job?: JobBrief } interface JobBrief { id: string workOrderId: string workpieceNo: string productTypeId: string status: JobStatus currentStepId: string currentStepName: string } ``` ### 7.4 接驳台槽位监控 ```http GET /api/v1/docks/loading/slots GET /api/v1/docks/unloading/slots ``` 响应: ```ts interface DockSlotsReply { docks: DockReply[] } interface DockReply { dockNo: number type: 'LOADING' | 'UNLOADING' slots: DockSlotReply[] } interface DockSlotReply { slotNo: number status: 'EMPTY' | 'UNPUBLISHED' | 'PUBLISHED' | 'SCAN_FAILED' | 'PROCESSING' | 'COMPLETED' job?: JobBrief } ``` --- ## 8. 调度与任务 API 设计依据:第 8 节调度器三层架构、第 9 节任务状态机。 ### 8.1 当前调度队列 ```http GET /api/v1/scheduler/ready-jobs ``` 响应: ```ts interface ReadyJobsReply { jobs: ReadyJobReply[] } interface ReadyJobReply { jobId: string workOrderId: string status: JobStatus priority: number reason: string queuedAt: ISODateTime } ``` ### 8.2 当前任务列表 ```http GET /api/v1/tasks ``` 查询: ```ts interface QueryTasksReq extends PageReq, SortReq { jobId?: string workOrderId?: string statuses?: TaskStatus[] type?: string } ``` 响应: ```ts interface QueryTasksReply extends PageReply { data: TaskReply[] } interface TaskReply { id: string jobId: string type: string status: TaskStatus fromPos?: PositionRef toPos?: PositionRef assignedRobot?: string startedTime?: ISODateTime completedTime?: ISODateTime result?: Record } interface PositionRef { type: PositionType | 'DOCK' | 'AGV' | 'SAMPLING' refId: string } ``` ### 8.3 任务详情 ```http GET /api/v1/tasks/:id ``` 响应:`TaskReply` ### 8.4 任务日志 ```http GET /api/v1/work-orders/:id/task-logs ``` 查询: ```ts interface QueryTaskLogsReq extends PageReq, SortReq { jobId?: string status?: TaskStatus taskKind?: string startTime?: ISODateTime endTime?: ISODateTime } ``` 响应: ```ts interface QueryTaskLogsReply extends PageReply { data: TaskLogReply[] } interface TaskLogReply { id: number workOrderId: string jobId: string stepId: string stepName: string taskKind: string status: TaskStatus content: string durationMs: number createdAt: ISODateTime } ``` --- ## 9. 人工交互 API 设计依据:第 10 节单工件暂存/返工、第 15 节 L3 人工恢复、第 18 节人工终端。 ### 9.1 待人工处理事项 ```http GET /api/v1/manual-actions ``` 查询: ```ts interface QueryManualActionsReq extends PageReq, SortReq { type?: string resolved?: boolean } ``` 响应: ```ts interface QueryManualActionsReply extends PageReply { data: ManualActionReply[] } interface ManualActionReply { id: string type: 'SCAN_FAILED' | 'RECOVERY_REQUIRED' | 'INSPECTION_DECISION' | 'FAULT_CONFIRM' jobId?: string workOrderId?: string message: string payload?: Record resolved: boolean createdAt: ISODateTime resolvedAt?: ISODateTime } ``` ### 9.2 确认扫码失败处理 ```http POST /api/v1/manual-actions/:id/resolve-scan-failed ``` 请求: ```ts interface ResolveScanFailedReq { action: 'RETRY_SCAN' | 'RETURN_BAY' | 'SCRAP' remark?: string } ``` ### 9.3 检测结果人工判定 ```http POST /api/v1/jobs/:id/inspection-decision ``` 请求: ```ts interface InspectionDecisionReq { result: 'PASS' | 'FAIL' needSampling?: boolean remark?: string } ``` ### 9.4 L3 断电恢复人工确认 ```http POST /api/v1/recovery/actions/:id/confirm ``` 请求: ```ts interface ConfirmRecoveryReq { decision: 'RESUME' | 'WAIT_UNLOAD' | 'SUSPEND' | 'SCRAP' confirmedPosition?: PositionRef remark?: string } ``` --- ## 10. 设备与心跳 API 设计依据:第 6.1 节 `equipment`、第 13 节心跳。 ### 10.1 设备列表 ```http GET /api/v1/equipments ``` 查询: ```ts interface QueryEquipmentsReq extends PageReq, SortReq { keyword?: string typeCode?: string status?: StationStatus } ``` 响应: ```ts interface QueryEquipmentsReply extends PageReply { data: EquipmentReply[] } interface EquipmentReply { id: string typeCode: string name: string status: StationStatus slotCount: number ipAddress?: string location?: string heartbeatOnline: boolean lastHeartbeatAt?: ISODateTime } ``` ### 10.2 设备详情 ```http GET /api/v1/equipments/:id ``` 响应:`EquipmentReply` ### 10.3 设备心跳状态 ```http GET /api/v1/equipments/:id/heartbeat ``` 响应: ```ts interface EquipmentHeartbeatReply { equipmentId: string online: boolean ttlMs: number lastHeartbeatAt?: ISODateTime } ``` --- ## 11. 报警与运行校验 设计依据:第 14 节运行期状态校验、附录 PLC 错误码。 ### 11.1 报警分页列表 ```http GET /api/v1/alarms ``` 查询: ```ts interface QueryAlarmsReq extends PageReq, SortReq { equipmentId?: string level?: 'INFO' | 'WARN' | 'ERROR' | 'CRITICAL' resolved?: boolean startTime?: ISODateTime endTime?: ISODateTime } ``` 响应: ```ts interface QueryAlarmsReply extends PageReply { data: AlarmReply[] } interface AlarmReply { id: string alarmCode: string alarmMessage: string level: 'INFO' | 'WARN' | 'ERROR' | 'CRITICAL' equipmentId?: string jobId?: string resolved: boolean createdAt: ISODateTime resolvedAt?: ISODateTime } ``` ### 11.2 确认报警 ```http POST /api/v1/alarms/:id/ack ``` 请求: ```ts interface AckAlarmReq { remark?: string } ``` ### 11.3 状态一致性校验结果 ```http GET /api/v1/state-checks/latest ``` 响应: ```ts interface StateCheckReply { checkedAt: ISODateTime ok: boolean issues: StateCheckIssue[] } interface StateCheckIssue { type: 'PLC_REDIS_MISMATCH' | 'MISSING_HEARTBEAT' | 'UNKNOWN_POSITION' equipmentId?: string jobId?: string message: string } ``` --- ## 12. 事件流 API 设计依据:第 3 节 WebSocket/HTTP、第 4 节事件总线、第 16 节 Redis Stream。 ### 12.1 WebSocket 实时事件 ```text WS /api/v1/events/ws ``` 前端连接后接收统一事件: ```ts interface RealtimeEvent { id: string entityId: string entityVersion: number type: RealtimeEventType source: string timestamp: ISODateTime payload: T } type RealtimeEventType = | 'PALLET_ARRIVED' | 'PALLET_REMOVED' | 'MACHINE_TASK_COMPLETE' | 'ROBOT_ACTION_DONE' | 'SCAN_RESULT' | 'JOB_STATUS_CHANGED' | 'STATION_READY' | 'STATION_REQUEST_LOAD' | 'INSPECTION_PASS' | 'INSPECTION_FAIL' | 'SAMPLING_REQUEST' | 'SAMPLING_COMPLETE_OK' | 'SAMPLING_COMPLETE_NG' | 'ROBOT_ERROR' ``` 常用 payload: ```ts interface JobStatusChangedPayload { jobId: string workOrderId: string fromStatus: JobStatus toStatus: JobStatus positionType: PositionType positionRefId: string } interface MachineTaskCompletePayload { equipmentId: string jobId?: string slotNo?: number } interface ScanResultPayload { jobId: string success: boolean scanCode?: string reason?: string } ``` ### 12.2 SSE 兼容事件流(可选) ```http GET /api/v1/events/sse ``` 返回格式:标准 `text/event-stream`。 --- ## 13. 断电恢复 API 设计依据:第 15 节。 ### 13.1 恢复扫描 ```http POST /api/v1/recovery/scan ``` 效果:扫描 Redis/PG/PLC 状态,生成恢复建议。 响应: ```ts interface RecoveryScanReply { items: RecoveryItem[] summary: { l1: number l2: number l3: number } } interface RecoveryItem { id: string level: 'L1' | 'L2' | 'L3' jobId?: string workOrderId?: string equipmentId?: string currentStatus?: JobStatus suggestedAction: string manualRequired: boolean message: string } ``` ### 13.2 执行自动恢复 ```http POST /api/v1/recovery/auto-restore ``` 请求: ```ts interface AutoRestoreReq { levels?: Array<'L1' | 'L2'> } ``` 响应: ```ts interface AutoRestoreReply { restoredCount: number skippedCount: number failedItems: Array<{ id: string message: string }> } ``` ### 13.3 事件重放 ```http POST /api/v1/recovery/replay-events ``` 请求: ```ts interface ReplayEventsReq { afterEventId?: string dryRun?: boolean } ``` 响应: ```ts interface ReplayEventsReply { applied: number skipped: number lastEventId?: string } ``` --- ## 14. 前端模块建议 建议前端按以下 client 模块组织: ```text frontend/src/api/auth.ts frontend/src/api/product-type.ts frontend/src/api/recipe.ts frontend/src/api/work-order.ts frontend/src/api/job.ts frontend/src/api/dashboard.ts frontend/src/api/station-monitor.ts frontend/src/api/buffer.ts frontend/src/api/dock.ts frontend/src/api/task.ts frontend/src/api/manual-action.ts frontend/src/api/equipment.ts frontend/src/api/alarm.ts frontend/src/api/recovery.ts frontend/src/api/events.ts ``` --- ## 15. 与当前实现的主要差异提示 以下是前端联调时需要注意的目标差异: 1. **工件资源命名**:目标设计使用 `job` 作为运行时工件实体;当前实现部分接口仍使用 `workpiece` 命名。 2. **ID 类型**:目标设计中 `product_type/equipment/work_order/job` 更偏向字符串业务 ID;当前实现大量使用 int ID。前端新契约应优先按本文类型建模。 3. **工站监控**:目标契约不要求前端直接操作或依赖工站内部槽位写方法;监控数据应来自 Redis SSOT 推导结果。 4. **暂存台**:目标设计明确为 8 个固定槽位,工件全周期独占槽位,接口应体现 `slotNo 1~8` 和 `needRefill`。 5. **事件流**:目标架构要求 WebSocket/SSE 实时推送;仅轮询 `/stations/monitor` 不能满足最终生产版看板体验。 6. **恢复 API**:目标设计需要 L1/L2/L3 分级恢复接口;当前实现如果只有单个 restore endpoint,应继续补齐扫描、自动恢复和人工确认能力。 --- ## 16. 最小前端接入优先级 建议按以下顺序落地: 1. `auth`:登录、刷新 token、当前用户。 2. `product-type/recipe`:产品与工艺路线展示。 3. `work-order/job`:工单创建、启动、暂停、恢复、工件列表。 4. `buffer/dock/station-monitor`:生产线看板。 5. `events`:实时事件流。 6. `manual-action/recovery`:异常处理和断电恢复。 7. `task/alarm/equipment`:任务追踪、报警、设备运维。