import axios from 'axios' import request from '@/utils/request' export interface TaskChainVO { id: number code: string warehouse: string firstTaskVendor: string status: string type: string businessNo: string description: string sourceLocation: string sourcePoint: string sourceContainer: string targetType: string targetCode: string targetLocation: string targetPoint: string elevatorId: number priority: number executionTime: number completeTime?: string cancelReason: string cancelTime: string createTime: string } export interface TaskVO { id: number chainCode: string code: string machineCallCode: string vendor: string status: string type: string exceptionReason: string sourceLocation: string sourcePoint: string sourceContainer: string targetLocation: string targetPoint: string targetType: string targetCode: string executionTime: number startTime: string completeTime: string cancelReason: string cancelTime: string batchNo: number remark: string createTime: string } export interface TaskChainDetailVO extends TaskChainVO { tasks: TaskVO[] } export interface PageResult { records: T[] total: number size: number current: number pages: number } export interface ChainQueryParams { page: number size: number code?: string warehouse?: string status?: string type?: string businessNo?: string sourceContainer?: string targetCode?: string startTime?: string endTime?: string } export function getChainPage(params: ChainQueryParams) { return request.get }>( '/api/robot/external/admin/machine-task/chain/page', { params }, ) } export interface TaskChainStatsVO { inProgress: number waiting: number completedToday: number failedToday: number } export function getChainStats() { return request.get( '/api/robot/external/admin/machine-task/chain/stats', ) } export function getChainDetail(code: string) { return request.get( `/api/robot/external/admin/machine-task/chain/detail/${code}`, ) } export function dispatchScan(warehouse: string) { return request.get( '/api/robot/external/admin/machine-task/dispatch/scan', { params: { warehouse } }, ) } export function dispatchExecute(warehouse: string, chainCode: string) { return request.get( '/api/robot/external/admin/machine-task/dispatch/execute', { params: { warehouse, chainCode } }, ) } export const taskStatusOptions = [ { value: 'CREATED', label: '已创建' }, { value: 'READY', label: '准备就绪' }, { value: 'IN_PROGRESS', label: '进行中' }, { value: 'WAITING_WAKE', label: '待唤醒' }, { value: 'WAITING_RELEASE', label: '待释放' }, { value: 'COMPLETED', label: '已完成' }, { value: 'CANCELED', label: '已取消' }, { value: 'FAILED', label: '失败' }, ] export function cancelChain(chainCode: string, reason?: string) { return request.post( '/api/robot/external/admin/machine-task/chain/cancel', null, { params: { chainCode, reason } }, ) } /** 业务取消(MachineTaskController POST /task/cancel,@RequestBody MachineCancelReqDTO) */ export function cancelTaskByBusinessNo(businessNo: string, reason?: string) { return request.post< never, { code: number; data: string[] | null } >('/api/robot/external/admin/machine-task/task/cancel', { businessNo, ...(reason != null && reason !== '' ? { reason } : {}), }) } export function deleteTask(taskCode: string) { return request.post( '/api/robot/external/admin/machine-task/task/delete', null, { params: { taskCode } }, ) } export function forceTaskStatus(taskCode: string, status: string) { return request.post( '/api/robot/external/admin/machine-task/task/forceStatus', null, { params: { taskCode, status } }, ) } // ==================== 模拟回调 ==================== export interface CallbackScenario { key: string label: string url: string fields: CallbackField[] } export interface CallbackField { name: string label: string type: 'string' | 'select' | 'number' | 'boolean' options?: { value: string; label: string }[] } const hkFields: CallbackField[] = [ { name: 'robotTaskCode', label: '任务编号(任务链编号)', type: 'string' }, { name: 'singleRobotCode', label: '机器人标识', type: 'string' }, { name: 'currentSeq', label: '当前执行顺序', type: 'string' }, ] const zsTaskStatusOptions = [ { value: 'RUNNING', label: '执行中' }, { value: 'FINISHED', label: '已完成' }, { value: 'TERMINATED', label: '取消' }, { value: 'PENDING', label: '挂起' }, ] const zsTaskStepOptions = [ { value: '', label: '无' }, { value: 'CHAIN', label: '托盘到达输送' }, { value: 'IN_LIFTER', label: '托盘进提升机' }, { value: 'OUT_LIFTER', label: '托盘出提升机' }, { value: 'VEHICLE_MOVE', label: '四向车搬运' }, ] const zsTaskInfoBackFields: CallbackField[] = [ { name: 'taskCode', label: '任务编号(任务链编号)', type: 'string' }, { name: 'palletCode', label: '托盘码', type: 'string' }, { name: 'status', label: '任务状态', type: 'select', options: zsTaskStatusOptions }, { name: 'taskStep', label: '任务步骤', type: 'select', options: zsTaskStepOptions }, { name: 'hasPick', label: '是否取货', type: 'boolean' }, { name: 'start', label: '取货点', type: 'string' }, { name: 'end', label: '放货点', type: 'string' }, { name: 'actualStart', label: '实际取货点', type: 'string' }, { name: 'actualEnd', label: '实际放货点', type: 'string' }, { name: 'statusCode', label: '取消原因', type: 'string' }, { name: 'pendingCode', label: '挂起原因', type: 'string' }, ] const zsExceptionFields: CallbackField[] = [ { name: 'location', label: '点位ID', type: 'string' }, { name: 'palletCode', label: '托盘码', type: 'string' }, { name: 'reason', label: '异常原因', type: 'string' }, ] const zsPalletCodeInFields: CallbackField[] = [ { name: 'location', label: '点位ID', type: 'string' }, { name: 'palletCode', label: '托盘码', type: 'string' }, { name: 'warehouseCode', label: '仓库编号', type: 'string' }, { name: 'weigth', label: '物料重量(g)', type: 'number' }, { name: 'longLevel', label: '长度等级', type: 'number' }, { name: 'widthLevel', label: '宽度等级', type: 'number' }, { name: 'highLevel', label: '高度等级', type: 'number' }, ] const hkArriveWcs: CallbackScenario = { key: 'arriveWcs', label: 'AGV到达立库提升机', url: '/api/robot/external/hk/arriveWcs', fields: hkFields, } const hkArriveStation: CallbackScenario = { key: 'arriveStation', label: 'AGV到达工作站点', url: '/api/robot/external/hk/arriveStation', fields: hkFields, } export const callbackScenarioMap: Record = { HK_INBOUND: [hkArriveWcs], HK_MOVE: [hkArriveWcs], HK_OUTBOUND_WAIT: [hkArriveWcs, hkArriveStation], HK_ARRIVE_STATION: [hkArriveStation], HK_PICK_PALLET: [{ key: 'pickPalletDone', label: 'AGV完成取货', url: '/api/robot/external/hk/pickPalletDone', fields: hkFields }], HK_PICK_UP: [{ key: 'pickUp', label: '海康举起托盘', url: '/api/robot/external/hk/pickUp', fields: hkFields }], HK_PUT_PALLET: [{ key: 'putPalletDone', label: 'AGV完成放货', url: '/api/robot/external/hk/putPalletDone', fields: hkFields }], HK_LEAVE_START_POINT: [{ key: 'leaveStartPoint', label: 'AGV离开起点', url: '/api/robot/external/hk/leaveStartPoint', fields: hkFields }], ZS_INBOUND: [{ key: 'taskInfoBack', label: '任务状态回传', url: '/api/robot/external/zs/wms/taskInfoBack', fields: zsTaskInfoBackFields }], ZS_OUTBOUND: [{ key: 'taskInfoBack', label: '任务状态回传', url: '/api/robot/external/zs/wms/taskInfoBack', fields: zsTaskInfoBackFields }], ZS_MOVE: [{ key: 'taskInfoBack', label: '任务状态回传', url: '/api/robot/external/zs/wms/taskInfoBack', fields: zsTaskInfoBackFields }], ZS_OUTER_DETECT: [{ key: 'exceptionPickUpNotify', label: '外形检测异常', url: '/api/robot/external/zs/wms/exceptionPickUpNotify', fields: zsExceptionFields }], ZS_APPLY_INBOUND: [{ key: 'palletCodeIn', label: '请求入库', url: '/api/robot/external/zs/wms/palletCodeIn', fields: zsPalletCodeInFields }], } export function sendMockCallback(url: string, data: Record) { const base = import.meta.env.VITE_API_BASE || '' const token = localStorage.getItem('token') return axios.post(`${base}${url}`, data, { headers: { Authorization: token || '', Source: 'web', }, timeout: 15000, }) }