自动化立体仓库 - WMS系统
zyx
2023-10-18 080fdceed464c56f43633e85daeaf929d40496af
src/main/java/com/zy/asrs/controller/OutController.java
@@ -17,9 +17,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -51,6 +49,12 @@
    private AgvBasDevpService agvBasDevpService;
    @Autowired
    private AgvWorkService agvWorkService;
    @Autowired
    private ManLocDetlService manLocDetlService;
    @Autowired
    private ManPakOutService manPakOutService;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private AgvLocDetlService agvLocDetlService;
@@ -67,66 +71,78 @@
    @ManagerAuth
    public R pakoutPreview(@RequestBody List<Long> ids) {
//        Order order = orderService.selectById(ids.get(0));
//
//        DocType docType = docTypeService.selectById(order.getDocType());
//
//        if("人工补货单".equals(docType.getDocName())){
//            List<OrderDetl> orderDetlList = orderDetlService.selectBatchIds(ids);
//            //返回给前端的库位以及站点信息
//            List<LocDto> locDtoList = new ArrayList<>();
//
//            for (OrderDetl orderDetl : orderDetlList) {
//
//                double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty()).orElse(0.0D);
//                if (issued <= 0.0D) { continue; }
//
//                //从平库寻找
//                //issued = manLocDetlService.queryStockAndSetLocDto(orderDetl.getMatnr(),orderDetl.getBatch(),orderDetl.getOrderNo(),locDtoList,issued,orderDetl.getThreeCode(),orderDetl.getDeadTime());
//
//                //先找AGV的库存,如果返回的issued大于0,则去四项库找
//                //issued = agvLocDetlService.queryStockAndSetLocDto(orderDetl.getMatnr(),orderDetl.getBatch(),orderDetl.getOrderNo(),locDtoList,issued,orderDetl.getThreeCode(),orderDetl.getDeadTime());
//
//                //从四项库的库存里面找,
//                issued = locDetlService.queryStockAndSetLocDto1(orderDetl.getMatnr(),orderDetl.getBatch(),orderDetl.getOrderNo(),locDtoList,issued,orderDetl.getThreeCode(),orderDetl.getDeadTime());
//
//                if (issued > 0) {
//                    LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
//                    locDto.setLack(Boolean.TRUE);
//                    locDtoList.add(locDto);
//                }
//            }
//            return R.ok().add(locDtoList);
//        }
        List<OrderDetl> orderDetlList = orderDetlService.selectBatchIds(ids);
        //返回给前端的库位以及站点信息
        List<LocDto> locDtoList = new ArrayList<>();
        for (OrderDetl orderDetl : orderDetlList) {
            double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty()).orElse(0.0D);
            if (issued <= 0.0D) { continue; }
            Order order = orderService.selectByNo(orderDetl.getOrderNo());
            DocType docType = docTypeService.selectById(order.getDocType());
            if("人工补货单".equals(docType.getDocName())){
                if (issued <= 0.0D) { continue; }
                issued = locDetlService.queryStockAndSetLocDto1(orderDetl.getMatnr(),orderDetl.getBatch(),orderDetl.getOrderNo(),locDtoList,issued,orderDetl.getThreeCode(),orderDetl.getDeadTime());
                if (issued > 0) {
                    LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
                    locDto.setLack(Boolean.TRUE);
                    locDtoList.add(locDto);
                }
            }else {
                //double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty()).orElse(0.0D);
                if (issued <= 0.0D) { continue; }
            //先找AGV的库存,如果返回的issued大于0,则去四项库找
            issued = agvLocDetlService.queryStockAndSetLocDto(orderDetl.getMatnr(),orderDetl.getBatch(),orderDetl.getOrderNo(),locDtoList,issued,orderDetl.getThreeCode(),orderDetl.getDeadTime());
                //从平库寻找
                issued = manLocDetlService.queryStockAndSetLocDto(orderDetl.getMatnr(),orderDetl.getBatch(),orderDetl.getOrderNo(),locDtoList,issued,orderDetl.getThreeCode(),orderDetl.getDeadTime());
            //从四项库的库存里面找,
            issued = locDetlService.queryStockAndSetLocDto(orderDetl.getMatnr(),orderDetl.getBatch(),orderDetl.getOrderNo(),locDtoList,issued,orderDetl.getThreeCode(),orderDetl.getDeadTime());
                //先找AGV的库存,如果返回的issued大于0,则去四项库找
                issued = agvLocDetlService.queryStockAndSetLocDto(orderDetl.getMatnr(),orderDetl.getBatch(),orderDetl.getOrderNo(),locDtoList,issued,orderDetl.getThreeCode(),orderDetl.getDeadTime());
            if (issued > 0) {
                LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
                locDto.setLack(Boolean.TRUE);
                locDtoList.add(locDto);
                //从四项库的库存里面找,
                issued = locDetlService.queryStockAndSetLocDto(orderDetl.getMatnr(),orderDetl.getBatch(),orderDetl.getOrderNo(),locDtoList,issued,orderDetl.getThreeCode(),orderDetl.getDeadTime());
                if (issued > 0) {
                    LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
                    locDto.setLack(Boolean.TRUE);
                    locDtoList.add(locDto);
                }
            }
        }
        return R.ok().add(locDtoList);
        /*
        if (Cools.isEmpty(ids)) {
            return R.parse(BaseRes.PARAM);
        }
        List<OrderDetl> orderDetls = orderDetlService.selectBatchIds(ids);
        List<LocDto> locDtos = new ArrayList<>();
        Set<String> exist = new HashSet<>();
        for (OrderDetl orderDetl : orderDetls) {
            double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty()).orElse(0.0D);
            if (issued <= 0.0D) { continue; }
            List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMatnr(), orderDetl.getBatch(), null, exist);
            for (LocDetl locDetl : locDetls) {
                if (issued > 0) {
//                    LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
//                            issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued);
                    LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
                            locDetl.getAnfme());
//                    int ioType = (issued >= locDetl.getAnfme() && locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("loc_no", locDto.getLocNo())) == 1) ? 101 : 103;
                    int ioType = 101;
                    List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), ioType);
                    locDto.setStaNos(staNos);
                    locDtos.add(locDto);
                    exist.add(locDetl.getLocNo());
                    // 剩余待出数量递减
                    issued = issued - locDetl.getAnfme();
                } else {
                    break;
                }
            }
            if (issued > 0) {
                LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
                locDto.setLack(Boolean.TRUE);
                locDtos.add(locDto);
            }
        }
        return R.ok().add(locDtos); */
    }
    @PostMapping("/out/pakout/auth")
@@ -165,11 +181,10 @@
        agvWorkService.stockOutWrkMast(agvTaskDtos, getUserId());
        // 生成出库任务
        List<String> excludeLocNos = taskDtos.stream().map(TaskDto::getLocNo).distinct().collect(Collectors.toList());
        taskDtos.stream().map(TaskDto::getLocNo).distinct().collect(Collectors.toList());
        for (TaskDto taskDto : taskDtos) {
            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
            workService.stockOut(staNo, taskDto, getUserId());
            locMastService.breakUp(taskDto.getLocNo(), excludeLocNos);
        }
        return R.ok();
@@ -351,6 +366,10 @@
            if (locDto.isLack()) { continue; }
            //AGV库
            if(!Cools.isEmpty(locDto.getAgvStaNos())){
                //平库
                if("无需站点".equals(locDto.getAgvStaNo())){
                    generateManPakout(locDto);
                }
                generateTaskDtoForAgv(locDto,agvTaskDtos);
                //四项库
@@ -407,6 +426,76 @@
    }
    /*
    生成平库拣货单
     */
    private void generateManPakout(LocDto locDto){
        ManLocDetl manLocDetl = manLocDetlService.selectItem(locDto.getLocNo(), locDto.getMatnr(), locDto.getBatch());
        if (!Cools.isEmpty(manLocDetl) && !(locDto.getAnfme()>manLocDetl.getAnfme())) {
            manLocDetl.setStatus(0);
            manLocDetlService.update(manLocDetl, new EntityWrapper<ManLocDetl>().eq("loc_no", manLocDetl.getLocNo()).eq("matnr",manLocDetl.getMatnr()));
            if (addPakOUT(locDto).equals(R.ok())) {
                Order order = orderService.selectByNo(locDto.getOrderNo());
                if (Cools.isEmpty(order)){
                    throw new CoolException("查询订单失败,请联系管理员"+locDto.getOrderNo());
                }
                if (order.getSettle()==1){
                    if (!orderService.updateSettle(order.getId(),2L,null)){
                        throw new CoolException("修改订单状态失败,请联系管理员"+locDto.getOrderNo());
                    }
                }
                OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("order_no", locDto.getOrderNo()).eq("matnr", locDto.getMatnr()));
                if (Cools.isEmpty(orderDetl)){
                    throw new CoolException("查询订单明细失败,请联系管理员"+locDto.getOrderNo()+locDto.getMatnr());
                }
                orderDetl.setQty(orderDetl.getQty() + locDto.getAnfme());
                if (!orderDetlService.update(orderDetl,new EntityWrapper<OrderDetl>().eq("order_no", locDto.getOrderNo()).eq("matnr", locDto.getMatnr()))){
                    throw new CoolException("修改订单明细失败,请联系管理员"+locDto.getOrderNo()+locDto.getMatnr());
                }
            }
        }else {
            throw new CoolException("库存不足");
        }
    }
    private R addPakOUT(LocDto locDto){
        ManPakOut manPakOut=new ManPakOut();
        manPakOut.setWrkNo(locDto.getOrderNo()+"-"+System.currentTimeMillis());
        manPakOut.setWrkSts((long)1);
        manPakOut.setAnfme(locDto.getAnfme());
        manPakOut.setLocNo(locDto.getLocNo());
        manPakOut.setMatnr(locDto.getMatnr());
        manPakOut.setMaktx(locDto.getMaktx());
        manPakOut.setDocNum(locDto.getOrderNo());
        manPakOut.setCount(0.0);
        manPakOut.setStatus(0);
        manPakOut.setCreateTime(new Date());
        manPakOut.setBatch(locDto.getBatch());
        manPakOut.setUpdateTime(new Date());
        manPakOut.setUuid(UUID.randomUUID().toString());
        manPakOut.setContainerCode(locDto.getContainerCode());
        manPakOut.setCsocode(locDto.getCsocode());
        manPakOut.setIsoseq(locDto.getIsoseq());
        ManPakOut manPakOutExist = manPakOutService.selectOne(new EntityWrapper<ManPakOut>().eq("doc_num", locDto.getOrderNo()));
        if (Cools.isEmpty(manPakOutExist)){
            manPakOut.setName(locDto.getMaktx());
        }else{
            manPakOut.setUuid(manPakOutExist.getUuid());
        }
        manPakOutService.insert(manPakOut);
//        try{
//            if (!manPakOutService.insert(manPakOut)){
//                return R.error("添加拣货明细失败,请联系管理员");
//            }
//        }catch (Exception e){
//            return R.error("添加拣货明细失败,请联系管理员");
//        }
        return R.ok();
    }
    /*
    订单预校验  ===>> 1.订单状态; 2.订单带出数量
     */
    private List<OrderDto> orderPreVerification(List<LocDto> locDtos){