自动化立体仓库 - WMS系统
Junjie
2023-12-23 a0abdbc0b19c855fa53e47a9196dfa2cd41e8e9d
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -1,6 +1,8 @@
package com.zy.asrs.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.BaseRes;
@@ -23,6 +25,7 @@
import com.zy.common.web.BaseController;
import com.zy.common.web.WcsController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -77,6 +80,10 @@
    private RowLastnoService rowLastnoService;
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private AgvWaitPakinService agvWaitPakinService;
    @Override
    @Transactional
@@ -124,8 +131,7 @@
        // 生成工作档明细
        List<DetlDto> detlDtos = new ArrayList<>();
        param.getList().forEach(elem -> {
            DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme(), elem.getCsocode(), elem.getIsoseq());
            detlDto.setContainerCode(elem.getContainerCode());
            DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme(), elem.getCsocode(), elem.getIsoseq(),elem.getContainerCode());
            if (DetlDto.has(detlDtos, detlDto)) {
                DetlDto detlDto1 = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch(),detlDto.getCsocode(),detlDto.getIsoseq(),detlDto.getContainerCode());
                assert detlDto1 != null;
@@ -217,7 +223,7 @@
        List<LocDetlDto> locDetlDtos = new ArrayList<>();
        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
            if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch(), null);
                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch(), paramLocDetl.getSuppCode());
                if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount()));
            }
        }
@@ -277,6 +283,69 @@
                dtos.add(new OutLocDto(locNo, locDetlDto));
            }
        }
        ArrayList<String> outerLocs = new ArrayList<>();
        //检测是否为浅库位
        boolean sign=false;
        String th = "";
        for (String locNo : locNos) {
            if (sign) {
                break;
            }
            List<String> groupOuterLoc = Utils.getGroupOuterLoc(locNo);
            if (!Cools.isEmpty(groupOuterLoc)) {
                for (String outerLoc : groupOuterLoc) {
                    if (locNos.contains(outerLoc)) {
                        continue;
                    }
                    LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", outerLoc));
                    if (locMast != null) {
                        if (!locMast.getLocSts().equals("O") && !locMast.getLocSts().equals("R")) {
//                            sign = true;
//                            th = "库位号:" + locNo + " 浅库位有非空库位!";
//                            break;
                            OutLocDto outLocDto = new OutLocDto();
                            outLocDto.setLocNo(locMast.getLocNo());
                            List<LocDetlDto> locDetlDtos1 = new ArrayList<>();
                            for (LocDetl locDetl : locDetlService.selectByLocNo(locMast.getLocNo())) {
                                LocDetlDto locDetlDto = new LocDetlDto();
                                locDetlDto.setLocDetl(locDetl);
                                locDetlDto.setCount(locDetl.getAnfme());
                                locDetlDtos1.add(locDetlDto);
                            }
                            outLocDto.setLocDetlDtos(locDetlDtos1);
                            if (!outerLocs.contains(locMast.getLocNo())) {
                                dtos.add(outLocDto);
                                outerLocs.add(locMast.getLocNo());
                            }
                        }
                    }
                }
            }
        }
//        if (sign){
//            throw new CoolException("出库失败;"+th);
//        }
        //**************325、331、333、339站点额外逻辑代码**************
        HashMap<String, Object> tmpMap = new HashMap<>();
        if (staNo.getDevNo() == 325 || staNo.getDevNo() == 331 || staNo.getDevNo() == 333 || staNo.getDevNo() == 339) {
            int[] data = {325,331,333,339};
            for (String locNo : locNos) {
                List<String> groupOuterLoc = Utils.getGroupDeepLoc(locNo);
                if (groupOuterLoc.isEmpty()) {
                    continue;
                }
                int index = 0;
                for (String loc : groupOuterLoc) {
                    tmpMap.put(loc, data[index++]);
                }
            }
        }
        //**************325、331、333、339站点额外逻辑代码**************
        Integer ioType = null;
        List<String> excludeLocNos = dtos.stream().map(OutLocDto::getLocNo).distinct().collect(Collectors.toList());
        // 生成工作档
@@ -310,6 +379,20 @@
            if (stnNo == 325 || stnNo == 331 || stnNo == 333 || stnNo == 339) {
                stnNo = staDesc.getCrnStn();
                sourceStaNo = staDesc.getStnNo();
                //**************325、331、333、339站点额外逻辑代码**************
                Object autoStnNo = tmpMap.get(dto.getLocNo());//获取系统自动分配站点
                if (autoStnNo != null) {
                    sourceStaNo = Integer.parseInt(autoStnNo.toString());
                }
                //**************325、331、333、339站点额外逻辑代码**************
            }
            int lev = Utils.getLev(dto.getLocNo());
            if (lev == 1 || lev == 2) {
                if (!(stnNo == 100 || stnNo == 103 || stnNo == 105)) {
                    throw new CoolException("1、2层货物仅允许在一楼进行出库");
                }
            }
            // 生成工作档
@@ -398,6 +481,13 @@
            sourceStaNo = staDesc.getStnNo();
        }
        int lev = Utils.getLev(taskDto.getLocNo());
        if (lev == 1 || lev == 2) {
            if (!(stnNo == 100 || stnNo == 103 || stnNo == 105)) {
                throw new CoolException("1、2层货物仅允许在一楼进行出库");
            }
        }
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
@@ -410,6 +500,10 @@
        wrkMast.setCrnNo(outMost?outCrnNo:locMast.getCrnNo());
        wrkMast.setSourceStaNo(sourceStaNo); // 源站
        wrkMast.setStaNo(stnNo); // 目标站
        if(ioType == 101 && taskDto.getStaNo()>=300){
            wrkMast.setSourceStaNo(346); // 源站
            wrkMast.setStaNo(346); // 目标站
        }
        wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
@@ -451,13 +545,16 @@
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
            //补货单则生成AGV入库通知档
            generateAgvWaitpakin(wrkDetl);
            // 修改订单明细
            if (!BaseController.isJSON(locDto.getOrderNo())) {
                OrderDetl orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
                OrderDetl orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch(),locDto.getCsocode(),locDto.getIsoseq());
                if (orderDetl == null) {
                    orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null);
                    orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null,locDto.getCsocode(),locDto.getIsoseq());
                }
                if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), locDto.getAnfme())) {
                if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), locDto.getAnfme(),locDto.getCsocode(),locDto.getIsoseq())) {
                    throw new CoolException("修改订单明细数量失败");
                }
                orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
@@ -471,9 +568,9 @@
                Double orderAnfme;
                for (OrderDto orderDto : orderDtoList) {
                    OrderDetl orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
                    OrderDetl orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch(),locDto.getCsocode(),locDto.getIsoseq());
                    if (orderDetl == null) {
                        orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), null);
                        orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), null,locDto.getCsocode(),locDto.getIsoseq());
                    }
                    if(locAnfme > orderDetl.getAnfme()){
@@ -483,7 +580,7 @@
                        orderAnfme = locAnfme;
                    }
                    if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), orderAnfme)) {
                    if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), orderAnfme,orderDetl.getThreeCode(),orderDetl.getDeadTime())) {
                        throw new CoolException("修改订单明细数量失败");
                    }
                    orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
@@ -673,7 +770,7 @@
        List<LocDetlDto> locDetlDtos = new ArrayList<>();
        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
            if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch(),paramLocDetl.getContainerCode());
                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch(),paramLocDetl.getSuppCode());
                if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount()));
            }
        }
@@ -774,6 +871,13 @@
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException(workNo+"工作档不存在");
        }
        if (wrkMast.getIoType() == 200) {
            //小车移库任务,直接删除工作档
            wrkMastService.deleteById(wrkMast);
            return;
        }
        if (wrkMast.getWrkSts() == 9 || wrkMast.getWrkSts() == 29) {
            throw new CoolException("当前工作档已完成");
        }
@@ -822,11 +926,11 @@
            while (iterator1.hasNext()) {
                LocDetlAdjustParam.LocDetlAdjust adjust = iterator1.next();
                if (adjust.getCount() == 0) { continue; }
                if (locDetl.getMatnr().equals(adjust.getMatnr()) && Cools.eq(locDetl.getBatch(), adjust.getBatch())) {
                if (locDetl.getMatnr().equals(adjust.getMatnr()) && Cools.eq(locDetl.getBatch(), adjust.getBatch()) && Cools.eq(locDetl.getSuppCode(),adjust.getSuppCode()) && Cools.eq(locDetl.getThreeCode(),adjust.getThreeCode()) && Cools.eq(locDetl.getDeadTime(),adjust.getDeadTime())) {
                    if (!locDetl.getAnfme().equals(adjust.getCount())) {
                        // todo 盘点记录
                        // 修改库存
                        if (!locDetlService.updateAnfme(adjust.getCount(), locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch())) {
                        if (!locDetlService.updateAnfme(adjust.getCount(), locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(),locDetl.getSuppCode(),locDetl.getThreeCode(),locDetl.getDeadTime())) {
                            throw new CoolException(locDetl.getLocNo() + "库位," + locDetl.getMatnr() + "商品," + locDetl.getBatch() + "序列码修改数量失败");
                        }
                        // 保存调整记录
@@ -840,9 +944,7 @@
                        adjDetl.setModiUser(userId);
                        adjDetl.setAppeTime(now);
                        adjDetl.setAppeUser(userId);
                        UUID uuid = UUID.randomUUID();
                        adjDetl.setOrderNo(uuid.toString());
                        adjDetl.setOrderNo(Utils.generateAdjustOrderNo());
                        adjDetl.setCsocode(locDetl.getThreeCode());
                        adjDetl.setIsoseq(locDetl.getDeadTime());
@@ -857,7 +959,7 @@
        // 删除库存
        for (LocDetl locDetl : locDetls) {
            // todo 盘点记录
            if (!locDetlService.updateAnfme(-1.0D, locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch())) {
            if (!locDetlService.updateAnfme(-1.0D, locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(),locDetl.getSuppCode(),locDetl.getThreeCode(),locDetl.getDeadTime())) {
                throw new CoolException("删除" + locDetl.getLocNo() + "库位," + locDetl.getMatnr() + "商品," + locDetl.getBatch() + "序列码库存明细失败");
            }
            // 保存调整记录
@@ -871,7 +973,7 @@
            adjDetl.setModiUser(userId);
            adjDetl.setAppeTime(now);
            adjDetl.setAppeUser(userId);
            adjDetl.setOrderNo(Utils.generateAdjustOrderNo());
            adjDetlService.save(adjDetl, userId);
        }
@@ -904,11 +1006,9 @@
            adjDetl.setModiUser(userId);
            adjDetl.setAppeTime(now);
            adjDetl.setAppeUser(userId);
            UUID uuid = UUID.randomUUID();
            adjDetl.setOrderNo(uuid.toString());
            adjDetl.setCsocode(locDetl.getThreeCode());
            adjDetl.setIsoseq(locDetl.getDeadTime());
            adjDetl.setOrderNo(Utils.generateAdjustOrderNo());
            adjDetlService.save(adjDetl, userId);
        }
@@ -940,7 +1040,7 @@
            throw new CoolException(workNo+"工作档不存在");
        }
        if (wrkMast.getWrkSts() == 200) {
        if (wrkMast.getIoType() == 200) {
            //小车移库任务,直接删除工作档
            wrkMastService.deleteById(wrkMast);
            return;
@@ -995,7 +1095,7 @@
        for (WrkDetl wrkDetl : wrkDetls) {
            if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
                if (!BaseController.isJSON(wrkDetl.getOrderNo())) {
                    if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) {
                    if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme(),wrkDetl.getThreeCode(),wrkDetl.getDeadTime())) {
                        throw new CoolException("订单数据回滚失败");
                    }
                } else {
@@ -1016,7 +1116,7 @@
                            orderAnfme = wrkDetlAnfme;
                        }
                        if (!orderDetlService.decrease(orderDto.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), orderAnfme)) {
                        if (!orderDetlService.decrease(orderDto.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), orderAnfme,wrkDetl.getThreeCode(),wrkDetl.getDeadTime())) {
                            throw new CoolException("订单数据回滚失败");
                        }
                    }
@@ -1130,4 +1230,29 @@
        return "";
    }
    private void generateAgvWaitpakin(WrkDetl wrkDetl){
        String orderNo = wrkDetl.getOrderNo();
        if(orderNo.contains("{")){
            JSONArray orderArray = JSON.parseArray(orderNo);
            for (Object o : orderArray){
                JSONObject jsonobject = (JSONObject) o;
                Order order = orderService.selectByNo(jsonobject.get("orderNo").toString());
                DocType docType = docTypeService.selectById(order.getDocType());
                if("人工补货单".equals(docType.getDocName())){
                    throw new CoolException("合并单据中包含人工补货单,单据为: " + jsonobject.get("orderNo"));
                }
            }
        }else {
            Order order = orderService.selectByNo(orderNo);
            DocType docType = docTypeService.selectById(order.getDocType());
            if("人工补货单".equals(docType.getDocName())){
                AgvWaitPakin agvWaitPakin = new AgvWaitPakin();
                BeanUtils.copyProperties(wrkDetl,agvWaitPakin);
                agvWaitPakinService.insert(agvWaitPakin);
            }
        }
    }
}