| | |
| | | result = handleSetOnlineState(deviceConfig, params, logicParams); |
| | | break; |
| | | case "checkMesConfirm": |
| | | result = checkMesConfirm(deviceConfig, logicParams); |
| | | result = checkMesConfirm(deviceConfig, params, logicParams); |
| | | break; |
| | | case "markBroken": |
| | | result = handleMarkBroken(deviceConfig, params, logicParams); |
| | |
| | | * 返回OperationResult.data中的 completed 标志表示是否已确认完成 |
| | | */ |
| | | public DevicePlcVO.OperationResult checkMesConfirm(DeviceConfig deviceConfig, |
| | | Map<String, Object> params, |
| | | Map<String, Object> logicParams) { |
| | | if (plcDynamicDataService == null || s7SerializerProvider == null) { |
| | | return DevicePlcVO.OperationResult.builder() |
| | |
| | | data.put("completed", completed); |
| | | |
| | | if (completed) { |
| | | // MES已确认,检查是否还有未出片的玻璃(仅对出片任务) |
| | | boolean hasMoreGlass = false; |
| | | int completedCount = 0; |
| | | int totalCount = 0; |
| | | |
| | | if (taskInfo.isOutbound && params != null) { |
| | | // 从TaskExecutionContext中获取已出片的玻璃ID列表和初始玻璃ID列表 |
| | | Object contextObj = params.get("_taskContext"); |
| | | if (contextObj instanceof com.mes.task.model.TaskExecutionContext) { |
| | | com.mes.task.model.TaskExecutionContext context = |
| | | (com.mes.task.model.TaskExecutionContext) contextObj; |
| | | |
| | | @SuppressWarnings("unchecked") |
| | | List<String> initialGlassIds = (List<String>) context.getSharedData().get("initialGlassIds"); |
| | | @SuppressWarnings("unchecked") |
| | | List<String> outboundGlassIds = (List<String>) context.getSharedData().get("outboundGlassIds"); |
| | | |
| | | if (initialGlassIds != null && !initialGlassIds.isEmpty()) { |
| | | totalCount = initialGlassIds.size(); |
| | | completedCount = (outboundGlassIds != null) ? outboundGlassIds.size() : 0; |
| | | |
| | | // 检查是否所有玻璃都已出片 |
| | | if (outboundGlassIds == null || !outboundGlassIds.containsAll(initialGlassIds)) { |
| | | hasMoreGlass = true; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 如果还有未出片的玻璃,保持plcRequest=1,清理本次任务状态,等待下次交互 |
| | | // 这样第二次交互时,checkMesTask可以检测到mesSend=1,创建新任务,完整地走一遍逻辑 |
| | | if (hasMoreGlass) { |
| | | // 清空state和汇报字(本次交互已完成) |
| | | clearTaskStates(deviceConfig, serializer); |
| | | |
| | | // 注意:不记录lastCompletedMesRecords,因为还有未出片的玻璃,任务未真正完成 |
| | | // 这样第二次交互时,即使MES发送新任务(新的玻璃ID),也不会被误判为旧任务 |
| | | |
| | | // 任务完成,恢复为空闲状态(本次交互已完成) |
| | | statusManager.updateVehicleStatus( |
| | | deviceConfig.getDeviceId(), VehicleState.IDLE); |
| | | statusManager.clearVehicleTask(deviceConfig.getDeviceId()); |
| | | |
| | | // 移除任务记录(本次交互已完成,等待下次交互时创建新任务) |
| | | currentTasks.remove(deviceConfig.getDeviceId()); |
| | | |
| | | // 停止任务监控(本次交互已完成) |
| | | handleStopTaskMonitor(deviceConfig); |
| | | |
| | | // 保持plcRequest=1(可以接收下次任务) |
| | | Map<String, Object> payload = new HashMap<>(); |
| | | payload.put("plcRequest", 1); |
| | | plcDynamicDataService.writePlcData(deviceConfig, payload, serializer); |
| | | |
| | | log.info("出片任务本次交互完成,还有未出片的玻璃,等待下次交互: deviceId={}, completedCount={}, totalCount={}", |
| | | deviceConfig.getDeviceId(), completedCount, totalCount); |
| | | |
| | | String progressMessage = String.format("目前完成出片玻璃数量%d/%d,等待下次交互任务", completedCount, totalCount); |
| | | data.put("completed", false); // 标记为未完成,因为还有未出片的玻璃 |
| | | data.put("waiting", true); |
| | | data.put("waitingReason", "moreGlassToOutbound"); |
| | | data.put("completedCount", completedCount); |
| | | data.put("totalCount", totalCount); |
| | | |
| | | return DevicePlcVO.OperationResult.builder() |
| | | .success(true) |
| | | .message(String.format("出片任务本次交互完成:MES已确认(mesConfirm=1),已清空state和汇报字。%s。大车空闲(plcRequest=1),等待MES发送下次任务", progressMessage)) |
| | | .data(data) |
| | | .build(); |
| | | } |
| | | |
| | | // 所有玻璃都已出片,正常完成流程 |
| | | // MES已确认,清空state和汇报字 |
| | | clearTaskStates(deviceConfig, serializer); |
| | | |