| | |
| | | import com.mes.pp.service.OptimizeProjectService; |
| | | import com.mes.rawglassdetails.entity.RawGlassStorageDetails; |
| | | import com.mes.rawglassdetails.service.RawGlassStorageDetailsService; |
| | | import com.mes.s7.entity.S7Data; |
| | | import com.mes.s7.entity.S7DataSP; |
| | | import com.mes.uppattenusage.entity.UpPattenUsage; |
| | | import com.mes.uppattenusage.entity.vo.UpPattenUsageVO; |
| | | import com.mes.uppattenusage.mapper.UpPattenUsageMapper; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Qualifier; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.util.CollectionUtils; |
| | |
| | | @Resource |
| | | private OptimizeProjectService optimizeProjectService; |
| | | |
| | | @Autowired(required = false) |
| | | S7Serializer s7Serializer; |
| | | @Autowired |
| | | @Qualifier("s7SerializerSP1") |
| | | private S7Serializer s7SerializerSPOne; |
| | | |
| | | @Autowired |
| | | @Qualifier("s7SerializerSP2") |
| | | private S7Serializer s7SerializerSPTwo; |
| | | |
| | | private static final List<Integer> LOAD_STATION_01 = Arrays.asList(101, 102); |
| | | private static final List<Integer> LOAD_STATION_02 = Arrays.asList(103, 104); |
| | |
| | | //2、1号上片位是否有原片,原片尺寸是否和上片待上片的尺寸一致 |
| | | //3、1号无原片,且没有架子,2号上片位尺寸是否和带上片尺寸一致 |
| | | //4、不一致可能出现玻璃破损导致的上一架原片数量不够 |
| | | @Scheduled(fixedDelay = 5000) |
| | | @Scheduled(fixedDelay = 2000) |
| | | public void opcLoadGlassOne() { |
| | | opcLoadGlassChild(LOAD_GLASS_DEVICE_ONE_TASK, LOAD_GLASS_ONE_DEVICE); |
| | | } |
| | | |
| | | // @Scheduled(fixedDelay = 5000) |
| | | // @Scheduled(fixedDelay = 5000) |
| | | public void opcLoadGlassTwo() { |
| | | opcLoadGlassChild(LOAD_GLASS_DEVICE_TWO_TASK, LOAD_GLASS_TWO_DEVICE); |
| | | } |
| | | |
| | | @Scheduled(fixedDelay = 5000) |
| | | @Scheduled(fixedDelay = 2000) |
| | | public void opcLoadGlassOneFinish() { |
| | | opcLoadGlassFinishChid(LOAD_GLASS_DEVICE_ONE_TASK, LOAD_GLASS_ONE_DEVICE); |
| | | } |
| | | |
| | | // @Scheduled(fixedDelay = 5000) |
| | | // @Scheduled(fixedDelay = 5000) |
| | | public void opcLoadGlassTwoFinish() { |
| | | opcLoadGlassFinishChid(LOAD_GLASS_DEVICE_TWO_TASK, LOAD_GLASS_TWO_DEVICE); |
| | | } |
| | |
| | | for (Engineering engineering : engineerings) { |
| | | Integer count = upPattenUsageMapper.selectCount(new LambdaQueryWrapper<UpPattenUsage>() |
| | | .eq(UpPattenUsage::getEngineeringId, engineering.getEngineerId()).ne(UpPattenUsage::getState, Const.LOAD_RAW_GLASS_SUCCESS)); |
| | | if (count == 0) { |
| | | OptimizeProject project = optimizeProjectService.getOne(new LambdaUpdateWrapper<OptimizeProject>() |
| | | .eq(OptimizeProject::getProjectNo, 200) |
| | | .eq(OptimizeProject::getState, engineering.getEngineerId())); |
| | | if (count == 0 && project != null) { |
| | | engineeringMapper.update(null, new LambdaUpdateWrapper<Engineering>().set(Engineering::getState, Const.ENGINEERING_SUCCESS) |
| | | .eq(Engineering::getEngineerId, engineering.getEngineerId())); |
| | | optimizeProjectService.update(null, new LambdaUpdateWrapper<OptimizeProject>().set(OptimizeProject::getState, 300) |
| | |
| | | } |
| | | |
| | | private void opcLoadGlassChild(String tableName, Integer deviceId) { |
| | | S7Data S7DataSP1 = s7Serializer.read(S7Data.class); |
| | | S7DataSP s7DataSP = new S7DataSP(); |
| | | // s7DataSP.setPlcRequest(1); |
| | | // s7DataSP.setMesConfirm(0); |
| | | if (tableName.equals(LOAD_GLASS_DEVICE_ONE_TASK)) { |
| | | s7DataSP = s7SerializerSPOne.read(S7DataSP.class); |
| | | } else { |
| | | s7DataSP = s7SerializerSPTwo.read(S7DataSP.class); |
| | | } |
| | | log.info("{}上片线,当前上片位信息:{}", deviceId, s7DataSP); |
| | | |
| | | if (s7DataSP.getPlcRequest() == 0) { |
| | | if (s7DataSP.getMesSend() != 0) { |
| | | S7DataSP resetSend = new S7DataSP(); |
| | | resetSend.setMesSend(0); |
| | | s7SerializerSPOne.write(resetSend); |
| | | log.info("{}上片线,PLC请求清零,MES同步清零mesSend", deviceId); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | // 当PLC请求新任务(plcRequest=1)且无未确认汇报(mesConfirm=0)时处理 |
| | | if (s7DataSP.getPlcRequest() != 1 || s7DataSP.getMesConfirm() != 0) { |
| | | log.info("{}上片线,PLC未请求新任务或存在未确认汇报,跳过本次处理", deviceId); |
| | | return; |
| | | } |
| | | |
| | | Engineering engineering = engineeringMapper.selectOne(new LambdaQueryWrapper<Engineering>() |
| | | .eq(Engineering::getState, Const.ENGINEERING_RUNNING).eq(Engineering::getStationCell, deviceId)); |
| | | .eq(Engineering::getState, Const.ENGINEERING_RUNNING) |
| | | .eq(Engineering::getStationCell, deviceId)); |
| | | if (null == engineering) { |
| | | log.info("{}上片线,没有工程任务", deviceId); |
| | | return; |
| | | } |
| | | //任务暂停 |
| | | LoadGlassDeviceTask task = loadGlassDeviceTaskService.queryTaskMessage(tableName); |
| | | ; |
| | | if ("0".equals(S7DataSP1.getInkageState().toString())) { |
| | | // if (0 == task.getInkageState()) { |
| | | log.info("{}上片线,处于离线状态:{},结束本地上片请求", deviceId, task.getInkageState()); |
| | | return; |
| | | } |
| | | if (S7DataSP1.getTaskRunning().toString().equals(Const.ENGINEERING_RUNNING)) { |
| | | // if (task.getTaskRunning().equals(Const.ENGINEERING_RUNNING)) { |
| | | log.info("{}上片线,有正在执行的任务,结束本地上片请求", deviceId); |
| | | return; |
| | | } |
| | | |
| | | List<UpPattenUsageVO> pattenUsageList = upPattenUsageMapper.queryRawGlassByEngineeringId(engineering.getEngineerId()); |
| | | log.info("按照当前获取到正在需要上片的原片信息有:{}", pattenUsageList); |
| | | if (CollectionUtils.isEmpty(pattenUsageList)) { |
| | | log.info("当前工程需要上片的原片信息为空,任务已结束"); |
| | | //todo:是否将工程状态改为已完成 |
| | | return; |
| | | } |
| | | Map<String, List<UpPattenUsageVO>> upListMap = pattenUsageList.stream() |
| | |
| | | List<Integer> loadStation = LOAD_GLASS_DEVICE_ONE_TASK.equals(tableName) ? LOAD_STATION_01 : LOAD_STATION_02; |
| | | List<RawGlassStorageDetails> loadStationList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper<RawGlassStorageDetails>() |
| | | .inSql(RawGlassStorageDetails::getSlot, "select slot from raw_glass_storage_station where enable_state = 1") |
| | | .in(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN_ALL) |
| | | .in(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) |
| | | .eq(RawGlassStorageDetails::getDeviceId, deviceId)); |
| | | if (CollectionUtils.isEmpty(loadStationList)) { |
| | | log.info("当前上片线路两个上片位都没有原片信息,结束本次上片任务,等待仓储调度任务"); |
| | |
| | | } |
| | | int number = Math.min(twoLoadStation.getRemainQuantity(), usageVOS.size()); |
| | | //生成上片任务 |
| | | LoadGlassDeviceTaskHistory task = new LoadGlassDeviceTaskHistory(); |
| | | task.setTotalCount(number); |
| | | task.setTaskRunning(Const.ENGINEERING_RUNNING); |
| | | task.setTaskRunning(1); |
| | | task.setRawGlassWidth((int) usageVOS.get(0).getWidth()); |
| | | task.setRawGlassHeight((int) usageVOS.get(0).getHeight()); |
| | | task.setSlot(loadStation.get(1)); |
| | | loadGlassDeviceTaskService.updateTaskMessage(tableName, task); |
| | | task.setSlot(loadStation.get(0)); |
| | | task.setRawGlassFilmsId(usageVOS.get(0).getFilmsId()); |
| | | task.setEngineeringId(usageVOS.get(0).getEngineeringId()); |
| | | saveHistoryTask(task, deviceId); |
| | | |
| | | S7DataSP s7DataSPWrite = new S7DataSP(); |
| | | s7DataSPWrite.setMesSend(1); |
| | | s7DataSPWrite.setRawGlassWidth((int) usageVOS.get(0).getWidth()); |
| | | s7DataSPWrite.setRawGlassHeight((int) usageVOS.get(0).getHeight()); |
| | | s7DataSPWrite.setSlot(loadStation.get(1)); |
| | | if (LOAD_GLASS_ONE_DEVICE.equals(deviceId)) { |
| | | s7SerializerSPOne.write(s7DataSPWrite); |
| | | } else { |
| | | s7SerializerSPTwo.write(s7DataSPWrite); |
| | | } |
| | | return; |
| | | } |
| | | //尺寸不一样或者原片数量大于0 |
| | |
| | | } |
| | | //生成上片任务 |
| | | int number = Math.min(oneLoadStation.getRemainQuantity(), usageVOS.size()); |
| | | LoadGlassDeviceTaskHistory task = new LoadGlassDeviceTaskHistory(); |
| | | task.setTotalCount(number); |
| | | task.setTaskRunning(Const.ENGINEERING_RUNNING); |
| | | task.setTaskRunning(1); |
| | | task.setRawGlassWidth((int) usageVOS.get(0).getWidth()); |
| | | task.setRawGlassHeight((int) usageVOS.get(0).getHeight()); |
| | | task.setRawGlassThickness((int) usageVOS.get(0).getThickness()); |
| | | task.setSlot(loadStation.get(0)); |
| | | loadGlassDeviceTaskService.updateTaskMessage(tableName, task); |
| | | task.setRawGlassFilmsId(usageVOS.get(0).getFilmsId()); |
| | | task.setEngineeringId(usageVOS.get(0).getEngineeringId()); |
| | | saveHistoryTask(task, deviceId); |
| | | |
| | | UpPattenUsage upPattenUsage = upPattenUsageMapper.selectById(usageVOS.get(0).getId()); |
| | | upPattenUsage.setState(101); |
| | | upPattenUsageMapper.updateById(upPattenUsage); |
| | | |
| | | S7DataSP s7DataSPWrite = new S7DataSP(); |
| | | s7DataSPWrite.setMesSend(1); |
| | | s7DataSPWrite.setRawGlassWidth((int) usageVOS.get(0).getWidth()); |
| | | s7DataSPWrite.setRawGlassHeight((int) usageVOS.get(0).getHeight()); |
| | | s7DataSPWrite.setSlot(loadStation.get(0)); |
| | | if (LOAD_GLASS_ONE_DEVICE.equals(deviceId)) { |
| | | s7SerializerSPOne.write(s7DataSPWrite); |
| | | } else { |
| | | s7SerializerSPTwo.write(s7DataSPWrite); |
| | | } |
| | | } |
| | | |
| | | private void opcLoadGlassFinishChid(String tableName, Integer deviceId) { |
| | | S7Data S7DataSP1 = s7Serializer.read(S7Data.class); |
| | | LoadGlassDeviceTask task = loadGlassDeviceTaskService.queryTaskMessage(tableName); |
| | | if (S7DataSP1.getTaskRunning().toString().equals(Const.ENGINEERING_NEW)) { |
| | | // if (task.getTaskRunning().equals(Const.ENGINEERING_NEW)) { |
| | | log.info("无任务,结束"); |
| | | S7DataSP s7DataSP = new S7DataSP(); |
| | | // s7DataSP.setPlcReport(1); |
| | | // s7DataSP.setMesConfirm(0); |
| | | if (tableName.equals(LOAD_GLASS_DEVICE_ONE_TASK)) { |
| | | s7DataSP = s7SerializerSPOne.read(S7DataSP.class); |
| | | } else { |
| | | s7DataSP = s7SerializerSPTwo.read(S7DataSP.class); |
| | | } |
| | | log.info("{}上片线,当前上片位信息:{}", deviceId, s7DataSP); |
| | | |
| | | if (s7DataSP.getPlcReport() == 0) { |
| | | if (s7DataSP.getMesConfirm() != 0) { |
| | | S7DataSP resetConfirm = new S7DataSP(); |
| | | resetConfirm.setMesConfirm(0); |
| | | s7SerializerSPOne.write(resetConfirm); |
| | | log.info("{}上片线,PLC汇报清零,MES同步清零mesConfirm", deviceId); |
| | | } |
| | | return; |
| | | } |
| | | if (Integer.parseInt(S7DataSP1.getTaskState().toString()) <= 1) { |
| | | // if (task.getTaskState() <= 1) { |
| | | log.info("任务正在执行,结束"); |
| | | |
| | | if (s7DataSP.getPlcReport() == 0 || s7DataSP.getMesConfirm() != 0) { |
| | | log.info("{}上片线,无PLC汇报或已确认,跳过本次处理", deviceId); |
| | | return; |
| | | } |
| | | //获取任务完成情况 |
| | | // 已完成数量 破损数量 |
| | | Integer finishCount = Integer.parseInt(S7DataSP1.getFinishCount().toString()); |
| | | Integer damageCount = Integer.parseInt(S7DataSP1.getDamageCount().toString()); |
| | | // Integer finishCount = task.getFinishCount(); |
| | | // Integer damageCount = task.getDamageCount(); |
| | | LoadGlassDeviceTaskHistory unconfirmedTask = loadGlassDeviceTaskHistoryService.getOne( |
| | | new LambdaQueryWrapper<LoadGlassDeviceTaskHistory>() |
| | | .eq(LoadGlassDeviceTaskHistory::getStation, deviceId) |
| | | .eq(LoadGlassDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_RUNNING) |
| | | ); |
| | | String upUsageId = unconfirmedTask.getEngineeringId(); |
| | | if (s7DataSP.getPlcReport() == 1) { |
| | | // 汇报成功:更新上片记录为“成功” |
| | | upPattenUsageMapper.update(null, |
| | | new LambdaUpdateWrapper<UpPattenUsage>() |
| | | .set(UpPattenUsage::getState, Const.LOAD_RAW_GLASS_SUCCESS) |
| | | .eq(UpPattenUsage::getEngineeringId, upUsageId) |
| | | .eq(UpPattenUsage::getState, 101) |
| | | ); |
| | | unconfirmedTask.setTaskState(Const.RAW_GLASS_TASK_SUCCESS); |
| | | unconfirmedTask.setFinishCount(unconfirmedTask.getFinishCount() + 1); |
| | | log.info("{}上片线,任务汇报成功,更新上片记录[{}]为成功", deviceId, upUsageId); |
| | | } else if (s7DataSP.getPlcReport() == 2) { |
| | | // 汇报破损 |
| | | unconfirmedTask.setTaskState(200); |
| | | unconfirmedTask.setDamageCount(unconfirmedTask.getDamageCount() + 1); |
| | | log.warn("{}上片线,任务汇报破损,上片记录[{}]标记为破损", deviceId, upUsageId); |
| | | } |
| | | unconfirmedTask.setUpdateTime(new Date()); |
| | | loadGlassDeviceTaskHistoryService.updateById(unconfirmedTask); |
| | | |
| | | //更新当前架子上的原片剩余情况 |
| | | rawGlassStorageDetailsService.update(new UpdateWrapper<RawGlassStorageDetails>() |
| | | .inSql("slot", "select slot from raw_glass_storage_station where enable_state = 1") |
| | | .eq("slot", task.getSlot()) |
| | | // .eq("slot", task.getSlot()) |
| | | .eq("slot", unconfirmedTask.getSlot()) |
| | | .eq("state", Const.RAW_GLASS_STATE_IN) |
| | | .setSql("remain_quantity = remain_quantity - " + (finishCount + damageCount))); |
| | | //更新工程下的原片数量 todo:sql待优化 |
| | | |
| | | if (finishCount > 0) { |
| | | List<Integer> ids = upPattenUsageMapper.queryFinishByEngineering(deviceId, finishCount); |
| | | upPattenUsageMapper.update(null, new LambdaUpdateWrapper<UpPattenUsage>() |
| | | .in(UpPattenUsage::getId, ids) |
| | | .set(UpPattenUsage::getState, Const.LOAD_RAW_GLASS_SUCCESS)); |
| | | } |
| | | //任务表数据情况 |
| | | task.setTaskRunning(0); |
| | | task.setTotalCount(0); |
| | | task.setRawGlassWidth(0); |
| | | task.setRawGlassHeight(0); |
| | | task.setSlot(0); |
| | | loadGlassDeviceTaskService.updateTaskMessage(tableName, task); |
| | | loadGlassDeviceTaskHistoryService.update(new LambdaUpdateWrapper<LoadGlassDeviceTaskHistory>() |
| | | .set(LoadGlassDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_SUCCESS) |
| | | .eq(LoadGlassDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_NEW) |
| | | .eq(LoadGlassDeviceTaskHistory::getStation, deviceId) |
| | | ); |
| | | .setSql("remain_quantity = GREATEST(remain_quantity - 1, 0)")); |
| | | //汇报字给1 |
| | | S7DataSP s7DataSPWrite = new S7DataSP(); |
| | | s7DataSPWrite.setMesConfirm(1); |
| | | s7SerializerSPOne.write(s7DataSPWrite); |
| | | } |
| | | |
| | | private boolean saveHistoryTask(LoadGlassDeviceTask task, Integer deviceId) { |
| | | private boolean saveHistoryTask(LoadGlassDeviceTaskHistory task, Integer deviceId) { |
| | | LoadGlassDeviceTaskHistory taskHistory = new LoadGlassDeviceTaskHistory(); |
| | | BeanUtils.copyProperties(task, taskHistory); |
| | | taskHistory.setStation(deviceId); |
| | | taskHistory.setCreateTime(new Date()); |
| | | taskHistory.setTaskState(Const.RAW_GLASS_TASK_NEW); |
| | | taskHistory.setTaskState(Const.RAW_GLASS_TASK_RUNNING); |
| | | loadGlassDeviceTaskHistoryService.save(taskHistory); |
| | | return Boolean.TRUE; |
| | | } |
| | |
| | | return flag && details.getRemainQuantity() > 0; |
| | | } |
| | | |
| | | } |
| | | } |