huang
2025-10-22 78d73df2f8e0c6855d65eb1f2c6df08e0f99bab1
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java
@@ -15,13 +15,14 @@
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;
@@ -56,8 +57,13 @@
    @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);
@@ -75,22 +81,22 @@
    //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);
    }
@@ -105,7 +111,10 @@
        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)
@@ -115,31 +124,44 @@
    }
    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()
@@ -150,7 +172,7 @@
        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("当前上片线路两个上片位都没有原片信息,结束本次上片任务,等待仓储调度任务");
@@ -165,13 +187,26 @@
            }
            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
@@ -181,69 +216,103 @@
        }
        //生成上片任务
        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;
    }
@@ -261,4 +330,4 @@
        return flag && details.getRemainQuantity() > 0;
    }
}
}