| | |
| | | import com.mes.device.vo.DevicePlcVO; |
| | | import com.mes.interaction.workstation.base.WorkstationBaseHandler; |
| | | import com.mes.interaction.workstation.config.WorkstationLogicConfig; |
| | | import com.mes.s7.enhanced.EnhancedS7Serializer; |
| | | import com.mes.s7.provider.S7SerializerProvider; |
| | | import com.mes.service.PlcDynamicDataService; |
| | | import com.mes.plc.client.PlcClient; |
| | | import com.mes.plc.factory.PlcClientFactory; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Qualifier; |
| | |
| | | @Component |
| | | public class HorizontalTransferLogicHandler extends WorkstationBaseHandler { |
| | | |
| | | private final PlcDynamicDataService plcDynamicDataService; |
| | | private final GlassInfoService glassInfoService; |
| | | private final S7SerializerProvider s7SerializerProvider; |
| | | private final PlcClientFactory plcClientFactory; |
| | | |
| | | @Autowired(required = false) |
| | | private DeviceGlassInfoMapper glassInfoMapper; |
| | |
| | | |
| | | @Autowired |
| | | public HorizontalTransferLogicHandler(DevicePlcOperationService devicePlcOperationService, |
| | | PlcDynamicDataService plcDynamicDataService, |
| | | @Qualifier("deviceGlassInfoService") GlassInfoService glassInfoService, |
| | | S7SerializerProvider s7SerializerProvider) { |
| | | PlcClientFactory plcClientFactory) { |
| | | super(devicePlcOperationService); |
| | | this.plcDynamicDataService = plcDynamicDataService; |
| | | this.glassInfoService = glassInfoService; |
| | | this.s7SerializerProvider = s7SerializerProvider; |
| | | this.plcClientFactory = plcClientFactory; |
| | | // 设置 PlcClientFactory 到基类 |
| | | this.setPlcClientFactory(plcClientFactory); |
| | | } |
| | | |
| | | @Override |
| | |
| | | Map<String, Object> params) { |
| | | |
| | | String deviceId = deviceConfig.getDeviceId(); |
| | | EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig); |
| | | if (serializer == null) { |
| | | PlcClient plcClient = getPlcClient(deviceConfig); |
| | | if (plcClient == null) { |
| | | return buildResult(deviceConfig, "checkAndProcess", false, |
| | | "获取PLC序列化器失败"); |
| | | "获取PLC客户端失败"); |
| | | } |
| | | |
| | | try { |
| | |
| | | |
| | | // 6. 写入PLC(尝试从任务参数中获取卧转立编号) |
| | | DevicePlcVO.OperationResult writeResult = writeBatchToPlc( |
| | | deviceConfig, batch, serializer, logicParams, params); |
| | | deviceConfig, batch, plcClient, logicParams, params); |
| | | |
| | | if (!Boolean.TRUE.equals(writeResult.getSuccess())) { |
| | | return writeResult; |
| | |
| | | // 从配置中获取workLine,用于过滤(配置中是Integer类型) |
| | | Integer workLine = getLogicParam(logicParams, "workLine", null); |
| | | |
| | | // 查询最近2分钟内的玻璃记录(扩大时间窗口,确保不遗漏) |
| | | Date twoMinutesAgo = new Date(System.currentTimeMillis() - 120000); |
| | | |
| | | // 查询state=1的玻璃记录(已扫码交互完成,等待卧转立处理) |
| | | LambdaQueryWrapper<GlassInfo> wrapper = new LambdaQueryWrapper<>(); |
| | | wrapper.in(GlassInfo::getStatus, GlassInfo.Status.PENDING, GlassInfo.Status.ACTIVE) |
| | | .ge(GlassInfo::getCreatedTime, twoMinutesAgo) |
| | | .eq(GlassInfo::getState, 1) // 只查询state=1的玻璃(已扫码完成) |
| | | .orderByDesc(GlassInfo::getCreatedTime) |
| | | .last("LIMIT 20"); // 限制查询数量,避免过多 |
| | | |
| | |
| | | private DevicePlcVO.OperationResult writeBatchToPlc( |
| | | DeviceConfig deviceConfig, |
| | | List<GlassInfo> batch, |
| | | EnhancedS7Serializer serializer, |
| | | PlcClient plcClient, |
| | | Map<String, Object> logicParams, |
| | | Map<String, Object> params) { |
| | | |
| | |
| | | // 写入玻璃数量 |
| | | payload.put("plcGlassCount", count); |
| | | |
| | | // 写入卧转立编号(优先从任务参数获取,其次从设备配置获取) |
| | | Integer inPosition = null; |
| | | // 写入卧转立编号(优先从任务参数获取,其次从设备配置获取,直接写入编号,不进行位置映射) |
| | | Object inPosition = null; |
| | | if (params != null) { |
| | | try { |
| | | Object ctxObj = params.get("_taskContext"); |
| | | if (ctxObj instanceof com.mes.task.model.TaskExecutionContext) { |
| | | com.mes.task.model.TaskExecutionContext ctx = |
| | | (com.mes.task.model.TaskExecutionContext) ctxObj; |
| | | Object positionObj = ctx.getParameters().getExtra() != null |
| | | inPosition = ctx.getParameters().getExtra() != null |
| | | ? ctx.getParameters().getExtra().get("inPosition") : null; |
| | | if (positionObj instanceof Number) { |
| | | inPosition = ((Number) positionObj).intValue(); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | log.debug("从任务参数获取卧转立编号失败: deviceId={}", deviceConfig.getId(), e); |
| | |
| | | inPosition = getLogicParam(logicParams, "inPosition", null); |
| | | } |
| | | if (inPosition != null) { |
| | | // 直接写入编号本身,不进行位置映射转换 |
| | | payload.put("inPosition", inPosition); |
| | | log.info("写入卧转立编号: deviceId={}, inPosition={}", deviceConfig.getId(), inPosition); |
| | | } else { |
| | |
| | | payload.put("plcRequest", 1); |
| | | |
| | | try { |
| | | plcDynamicDataService.writePlcData(deviceConfig, payload, serializer); |
| | | plcClient.writeData(payload); |
| | | log.info("批次已写入PLC: deviceId={}, glassCount={}, inPosition={}", |
| | | deviceConfig.getId(), count, inPosition); |
| | | return buildResult(deviceConfig, "writeBatchToPlc", true, |
| | |
| | | */ |
| | | private DevicePlcVO.OperationResult handleClearPlc(DeviceConfig deviceConfig) { |
| | | try { |
| | | EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig); |
| | | if (serializer == null) { |
| | | return buildResult(deviceConfig, "clearPlc", false, "获取PLC序列化器失败"); |
| | | PlcClient plcClient = getPlcClient(deviceConfig); |
| | | if (plcClient == null) { |
| | | return buildResult(deviceConfig, "clearPlc", false, "获取PLC客户端失败"); |
| | | } |
| | | |
| | | Map<String, Object> payload = new HashMap<>(); |
| | |
| | | payload.put("plcRequest", 0); |
| | | payload.put("inPosition", 0); |
| | | |
| | | plcDynamicDataService.writePlcData(deviceConfig, payload, serializer); |
| | | plcClient.writeData(payload); |
| | | log.info("卧转立主体清空PLC字段完成: deviceId={}", deviceConfig.getId()); |
| | | return buildResult(deviceConfig, "clearPlc", true, "已清空卧转立主体PLC字段"); |
| | | } catch (Exception e) { |