自动化立体仓库 - WMS系统
skyouc
4 天以前 41411a57fc0d237577aa10ccfc1aded50556f5ba
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -22,10 +22,7 @@
import com.zy.common.constant.HIKApiConstant;
import com.zy.common.constant.MesConstant;
import com.zy.common.entity.Parameter;
import com.zy.common.model.DetlDto;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.MesCombParam;
import com.zy.common.model.StartupDto;
import com.zy.common.model.*;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.properties.SlaveProperties;
import com.zy.common.service.CommonService;
@@ -2883,6 +2880,130 @@
    }
    /**
     * 按台车出库
     *
     * @param params
     * @return com.core.common.R
     * @author Ryan
     * @date 2026/3/28 8:41
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R outStockByTc(AgvCallParams params) {
        if (Objects.isNull(params.getCarBarcode())) {
            return R.error("台车码不能为空!!");
        }
        LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("barcode", params.getCarBarcode()));
        if (Objects.isNull(locCache)) {
            return R.error("当前台车不在缓冲库区!!");
        }
        if (Objects.isNull(params.getTarSite())) {
            return R.error("目标站点不能为空!!");
        }
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locCache.getLocNo()));
        if (Objects.isNull(locDetls) || locDetls.isEmpty()) {
            return R.error("台车上没有对应明细信息!!");
        }
        List<LocDto> locDtos = new ArrayList<>();
        locDetls.forEach(locDetl -> {
            OrderPakout orderPakout = orderPakoutService.selectOne(new EntityWrapper<OrderPakout>()
                    .eq("doc_type", 5)
                    .eq("number", locDetl.getOrderNo()));
            if (!Objects.isNull(orderPakout)) {
                locDetl.setMemo(orderPakout.getShipCode());
                locDetl.setOrderNo(orderPakout.getOrderNo());
            }
            OrderDetlPakout orderDetl = orderDetlPakoutService.selectOne(new EntityWrapper<OrderDetlPakout>()
                    .eq("matnr", locDetl.getMatnr())
                    .eq("supp_code", locDetl.getSuppCode())
                    .eq("order_no", orderPakout.getOrderNo()));
            if (Objects.isNull(orderDetl)) {
                throw new CoolException("订单明细不存在!!");
            }
            LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
                    locDetl.getAnfme());
            locDto.setFrozen(locDetl.getFrozen());
            locDto.setFrozenLoc(locCache.getFrozen());
//            List<BasStation> basStations = basStationService.selectList(new EntityWrapper<BasStation>().in("area_id", areaIds));
//            List<String> collect = basStations.stream().map(BasStation::getDevNo).collect(Collectors.toList());
//            locDto.setAgvStaNos(collect);
            locDto.setAgvStaNo(params.getTarSite());
            locDto.setBrand(orderDetl.getBrand());
            locDto.setSuppCode(orderDetl.getSuppCode());
            locDto.setStandby1(orderDetl.getStandby1());
            locDto.setStandby2(orderDetl.getStandby2());
            locDto.setStandby3(orderDetl.getStandby3());
            locDto.setBoxType1(orderDetl.getBoxType1());
            locDto.setBoxType2(orderDetl.getBoxType2());
            locDto.setBoxType3(orderDetl.getBoxType3());
            locDtos.add(locDto);
//            exist.add(locDetl.getLocNo());
        });
        generateAgvTaskByTc(locDtos);
        return R.ok();
    }
    @Transactional(rollbackFor = Exception.class)
    public void generateAgvTaskByTc(List<LocDto> locDtos) {
        List<LocDto> locDtoArrayList = new ArrayList<>();
        for (LocDto locDto : locDtos){
            if (locDto.getFrozen()!=1 && locDto.getFrozenLoc()!=1){
                locDtoArrayList.add(locDto);
            }
        }
        locDtos = locDtoArrayList;
        if (Cools.isEmpty(locDtos)) {
            throw new CoolException("库存/库位被冻结,请处理后出库!!!");
        }
        boolean lack = true;
        for (LocDto locDto : locDtos) {
            if (!locDto.isLack()) {
                lack = false;
                break;
            }
        }
        if (lack) {
            throw new CoolException("库存不足");
        }
        try {
            Thread.sleep(300L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        List<TaskDto> taskDtos = new ArrayList<>();
        // 根据 (库位 & 出库站) 分组; 理想状态:一组为一次出库任务
        for (LocDto locDto : locDtos) {
            if (locDto.isLack()) { continue; }
            TaskDto taskDto = new TaskDto(locDto.getLocNo(), locDto.getAgvStaNo(), locDto);
            if (TaskDto.hasAgv(taskDtos, taskDto)) {
                TaskDto dto = TaskDto.findAgv(taskDtos, taskDto);
                assert dto != null;
                dto.getLocDtos().addAll(taskDto.getLocDtos());
            } else {
                taskDtos.add(taskDto);
            }
        }
        // -----------------------------------------------------------------------------------------------
        Map<String, List<TaskDto>> listMap = taskDtos.stream().collect(Collectors.groupingBy(TaskDto::getLocNo));
        listMap.keySet().forEach(locNo -> {
            listMap.get(locNo).forEach(taskDto -> {
                BasStation station = basStationService.selectOne(new EntityWrapper<BasStation>()
                        .in("loc_sts", Arrays.asList(LocStsType.LOC_STS_TYPE_O.type, LocStsType.LOC_STS_TYPE_O.type))
                        .eq("dev_no", taskDto.getAgvStaNo()));
                if (Objects.isNull(station)) { throw new CoolException("数据错误,站点不存在或已使用!!"); }
                workService.agvStockOut(station, taskDto, 9527L);
            });
        });
    }
    /**
     * 确认捆包出库
     *
     * @param combParam
@@ -3007,6 +3128,7 @@
        return R.ok().add(wrkMast);
    }
    /**
     * 生成移库任务
     *