huang
2025-10-22 78d73df2f8e0c6855d65eb1f2c6df08e0f99bab1
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java
@@ -19,9 +19,13 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -43,6 +47,12 @@
    @Autowired(required = false)
    MiloService miloService;
    @Resource
    private MessageSource messageSource;
    // 吊装位
    private static final Integer LEFTING_01 = 99;
    @Override
    public boolean deleteRawGlassStorageDetails(String device_id) {
        QueryWrapper<RawGlassStorageDetails> queryWrapper = new QueryWrapper<>();
@@ -59,28 +69,58 @@
        return list();
    }
    // 空架子到吊装位
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String warehousingRequest(int leftingStation) {
        RawGlassStorageDetails storageDetails = getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
                .in(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN_ALL)
                .eq(RawGlassStorageDetails::getSlot, leftingStation));
                .eq(RawGlassStorageDetails::getSlot, leftingStation)
                // 添加行锁,其他请求需等待锁释放
                .last("FOR UPDATE"));
        if (null != storageDetails) {
            log.info("当前吊装位有架子,结束本地入库请求");
            return "fail";
            return messageSource.getMessage(
                    "rawglass.warehousing.slot.occupied",
                    null,
                    LocaleContextHolder.getLocale()
            );
        }
        List<RawGlassStorageDetails> shelfList = listBySlotState(Const.RAW_GLASS_DEVICE, Const.RAW_GLASS_STATE_IN_ALL);
        if (CollectionUtils.isEmpty(shelfList)) {
            log.info("当前工位不存在可用的空架子");
            return "fail";
            return messageSource.getMessage(
                    "rawglass.no.empty.shelf",
                    null,
                    LocaleContextHolder.getLocale()
            );
        }
        if (rawGlassStorageTaskService.count(new LambdaQueryWrapper<RawGlassStorageTask>()
                .eq(RawGlassStorageTask::getEndSlot, leftingStation)
                .in(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_NEW, Const.RAW_GLASS_TASK_RUNNING)) > 0) {
            log.info("吊装位 {} 已有未完成任务,拒绝重复下发", leftingStation);
            return messageSource.getMessage(
                    "rawglass.warehousing.task.exists",
                    null,
                    LocaleContextHolder.getLocale()
            );
        }
        Integer shelf = shelfList.get(0).getSlot();
        Integer deviceId = shelfList.get(0).getDeviceId();
        log.info("生成任务");
        try {
            generateTask(shelf, leftingStation, shelf, 0, Const.RAW_GLASS_TASK_TYPE_IN_REQUEST);
        } catch (Exception e) {
            return "fail";
            return messageSource.getMessage(
                    "rawglass.task.generate.error",
                    null,
                    LocaleContextHolder.getLocale()
            );
        }
        //生成一条详情数据  仅记录架子状态
        RawGlassStorageDetails details = new RawGlassStorageDetails();
@@ -92,13 +132,24 @@
        return "success";
    }
    /**
     * 原片入库
     *
     * @param request
     * @return
     */
    @Override
    public String patternWarehousing(RawGlassRequest request) {
        RawGlassStorageDetails glassStorageDetails = getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
                .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
                .eq(RawGlassStorageDetails::getSlot, request.getSlot()));
        if (null == glassStorageDetails) {
            log.info("当前吊装位没有架子");
            log.info("当前工位不存在可用的架子");
            return messageSource.getMessage(
                    "rawglass.no.empty.shelf",
                    null,
                    LocaleContextHolder.getLocale()
            );
        }
        //原片信息存入详情表
        BeanUtils.copyProperties(request, glassStorageDetails);
@@ -138,13 +189,51 @@
        return "success";
    }
    // 出库
    @Override
    public String outWarehousing(Long slotId) {
        update(new LambdaUpdateWrapper<RawGlassStorageDetails>().eq(RawGlassStorageDetails::getSlot, slotId)
                .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
        // 1. 检查当前架子状态
        RawGlassStorageDetails details = getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
                .eq(RawGlassStorageDetails::getSlot, slotId)
                .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN));
        if (details == null) {
            log.info("架子状态异常,无法执行出库操作");
            return messageSource.getMessage(
                    "rawglass.outWarehousing.error",
                    null,
                    LocaleContextHolder.getLocale()
            );
        }
        // 2. 将架子状态改为“待出库”(标记为可执行)
        update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
                .eq(RawGlassStorageDetails::getSlot, slotId)
                .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_WAIT_OUT));
        //生成一条详情数据  仅记录架子状态
        // 3. 直接生成出库任务(关键:在页面点击时就创建任务记录)
        try {
            // 起始位:仓库存储位(slotId),目标位:吊装位99
            generateTask(
                    slotId.intValue(),          // 起始位:仓库存储位(slotId)
                    LEFTING_01,                 // 目标位:吊装位99
                    slotId.intValue(),          // 架子号
                    details.getRemainQuantity(), // 数量
                    Const.RAW_GLASS_TASK_TYPE_OUT // 任务类型:出库
            );
            log.info("出库任务生成成功,架子:{},目标位:{}", slotId, LEFTING_01);
        return "success";
        } catch (Exception e) {
            log.error("生成出库任务失败", e);
            // 失败时回滚状态
            update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
                    .eq(RawGlassStorageDetails::getSlot, slotId)
                    .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN));
            return messageSource.getMessage(
                    "rawglass.task.generate.error",
                    null,
                    LocaleContextHolder.getLocale()
            );
        }
    }
    @Override
@@ -152,15 +241,19 @@
        return baseMapper.listBySlotState(liftingStation, state);
    }
    // 回库
    @Override
    public String outWarehousingRequest(int leftingStation) {
        //对应工位是否有空架子
        RawGlassStorageDetails details = getOne(new LambdaQueryWrapper<RawGlassStorageDetails>().eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN)
                .eq(RawGlassStorageDetails::getSlot, leftingStation));
        if (null == details) {
            log.info("无空架子,结束本地出片请求");
            return "fail";
            log.info("无空架子,结束回库任务");
            return messageSource.getMessage(
                    "rawglass.no.empty.shelf",
                    null,
                    LocaleContextHolder.getLocale()
            );
        }
        //生成一条详情数据  仅记录架子状态
        update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
@@ -168,9 +261,13 @@
                .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN)
                .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
        try {
            generateTask(leftingStation, details.getShelf(), details.getShelf(), details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_OUT_REQUEST);
            generateTask(leftingStation, details.getShelf(), details.getShelf(), details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_IN);
        } catch (Exception e) {
            return "fail";
            return messageSource.getMessage(
                    "rawglass.task.generate.error",
                    null,
                    LocaleContextHolder.getLocale()
            );
        }
        return "success";
    }
@@ -195,11 +292,11 @@
                .shelf(shelf)
                .createTime(new Date()).build();
        rawGlassStorageTaskService.save(task);
        List<ReadWriteEntity> list = new ArrayList<>();
        list.add(generateReadWriteEntity("CC.CC.taskWord", 1));
        list.add(generateReadWriteEntity("CC.CC.startSlot", startSlot));
        list.add(generateReadWriteEntity("CC.CC.endSlot", endSlot));
        miloService.writeToOpcWord(list);
//        List<ReadWriteEntity> list = new ArrayList<>();
//        list.add(generateReadWriteEntity("CC.CC.taskWord", 1));
//        list.add(generateReadWriteEntity("CC.CC.startSlot", startSlot));
//        list.add(generateReadWriteEntity("CC.CC.endSlot", endSlot));
//        miloService.writeToOpcWord(list);
        return Boolean.TRUE;
    }