自动化立体仓库 - WMS系统
pang.jiabao
2024-09-03 587fee18e22ed0ceee502ca12025a40e9d63989f
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -12,8 +12,9 @@
import com.zy.asrs.entity.param.FullStoreParam;
import com.zy.asrs.entity.param.LocDetlAdjustParam;
import com.zy.asrs.entity.param.StockOutParam;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.mapper.OrderMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.OutboundAllocationUtil;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.*;
import com.zy.common.model.enums.IoWorkType;
@@ -26,9 +27,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
 * Created by vincent on 2020/6/11
@@ -72,6 +73,10 @@
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Resource
    private OrderMapper orderMapper;
    @Resource
    private OrderDetlMapper orderDetlMapper;
    @Autowired
    private WcsController wcsController;
    @Autowired
@@ -165,10 +170,12 @@
        // 获取库位明细
        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());
//            if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
                LocDetl one = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no",paramLocDetl.getLocNo())
                        .eq("brand",paramLocDetl.getBrand()).eq("model",paramLocDetl.getModel()));
//                        selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch());
                if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount(), param.getOrderNo()));
            }
//            }
        }
        if (!locDetlDtos.isEmpty()) {
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo()));
@@ -255,10 +262,12 @@
                orderDetl.setSpecs(locDetl.getSpecs());//规格
                orderDetl.setBrand(locDetl.getBrand());//木箱类型
                orderDetl.setBarcode(locDetl.getZpallet());//木箱类型
                orderDetl.setWeight(locDetl.getWeight());
//                orderDetl.setWorkQty(locDetl.getAnfme());
                orderDetl.setWorkQty(0.0);
                orderDetl.setOrderId(order.getId());
                orderDetl.setOrderNo(order.getOrderNo());
                orderDetl.setOrigin(locDetl.getOrigin());
                orderDetl.setCreateBy(userId);
                orderDetl.setCreateTime(now);
                orderDetl.setUpdateBy(userId);
@@ -371,7 +380,12 @@
                if (!wrkDetlService.insert(wrkDetl)) {
                    throw new CoolException("保存工作档明细失败");
                }
                // 修改订单明细
                orderDetlMapper.updateOrderDetlByGroupNo(detlDto.getOrderNo(), detlDto.getLocDetl().getBrand(), 1);
                // 修改订单状态
                orderMapper.updateSettleByOrderNo(detlDto.getOrderNo(),2L, userId);
            }
            // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
            locMast = locMastService.selectById(dto.getLocNo());
            if (locMast.getLocSts().equals("F")) {
@@ -401,7 +415,48 @@
        LocMast locMast = locMastService.selectById(taskDto.getLocNo());
        // 获取路径
        int ioType = taskDto.isAll() ? 101 : 103;
        StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo());
//        StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo());
        // 根据库位排号+出库站点,获取出库源站点
        int row = Integer.parseInt(locMast.getLocNo().substring(0, 2));
        int souresStaNo = 0;
        if (taskDto.getStaNo() < 3000) { // 二楼
            switch (row) {
                case 1: case 2: case 3:
                case 4: souresStaNo = 2062; break;
                case 5: case 6: case 7:
                case 8: souresStaNo = 2065; break;
                case 9: case 10: case 11:
                case 12: souresStaNo = 2068; break;
                case 13: case 14: case 15:
                case 16: souresStaNo = 2070; break;
                case 17: case 18: case 19:
                case 20: souresStaNo = 2073; break;
                case 21: case 22: case 23:
                case 24: souresStaNo = 2076; break;
                default:
            }
        } else { // 一楼
            switch (row) {
                case 1: case 2: case 3:
                case 4: souresStaNo = 3002; break;
                case 5: case 6: case 7:
                case 8: souresStaNo = 3003; break;
                case 9: case 10: case 11:
                case 12: souresStaNo = 3006; break;
                case 13: case 14: case 15:
                case 16: souresStaNo = 3008; break;
                case 17: case 18: case 19:
                case 20: souresStaNo = 3009; break;
                case 21: case 22: case 23:
                case 24: souresStaNo = 3012; break;
                default:
            }
        }
        if (souresStaNo == 0) {
            throw new CoolException("源站点转换异常:" + row);
        }
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
        // 生成工作档
@@ -412,8 +467,8 @@
        wrkMast.setIoType(ioType); // 入出库状态
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setCrnNo(locMast.getCrnNo());
        wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
        wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
        wrkMast.setSourceStaNo(souresStaNo); // 源站
        wrkMast.setStaNo(taskDto.getStaNo()); // 目标站
        wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
@@ -436,9 +491,17 @@
                orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null);
            }
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(orderDetl);
//            wrkDetl.sync(orderDetl);
            wrkDetl.setZpallet(wrkMast.getBarcode());
            wrkDetl.setIoTime(now);
            wrkDetl.setMatnr(locDto.getMatnr());
            wrkDetl.setMaktx(locDto.getMaktx());
            wrkDetl.setWeight(locDto.getWeight()); // 净重
            wrkDetl.setVolume(locDto.getVolume()); // 毛重
            wrkDetl.setOrigin(locDto.getOrigin()); // 木箱在托盘位置
            wrkDetl.setPrice(locDto.getPrice());
            wrkDetl.setSpecs(locDto.getSpecs());
            wrkDetl.setModel(locDto.getModel());
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setBatch(locDto.getBatch());
            wrkDetl.setOrderNo(locDto.getOrderNo());
@@ -780,8 +843,10 @@
        if (wrkMast.getWrkSts() < 4 || (wrkMast.getWrkSts() > 10 && wrkMast.getIoType()==11)) {
            wrkMast.setWrkSts(4L);
        // 出库
        } else if (wrkMast.getWrkSts() > 10) {
        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getIoType()!=202) {
            wrkMast.setWrkSts(14L);
        }else if (wrkMast.getIoType()==202){
            wrkMast.setWrkSts(57L);
        }
        Date now = new Date();
        wrkMast.setCrnStrTime(DateUtils.calculate(now, 1L, TimeUnit.SECONDS, true));
@@ -945,7 +1010,7 @@
                locMastService.updateById(locMast);
            }
        // 出库取消(修改源库位)
        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getWrkSts() != 14) {
        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getWrkSts() != 14 && wrkMast.getIoType()!=202) {
            locNo = wrkMast.getSourceLocNo();
            // 出库 ===>> F.在库
            if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 110) {
@@ -966,6 +1031,7 @@
                locMast.setModiUser(userId);
                locMastService.updateById(locMast);
            }
        } else if (wrkMast.getIoType()==202 || wrkMast.getIoType()==212){
        } else {
            throw new CoolException("当前工作状态无法取消");
        }
@@ -987,13 +1053,14 @@
        }
        //取消出库工作档时,查询单据管理表,回滚作业中数量
        if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103) {
        if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107) {
            List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
            for (WrkDetl wrkDetl : wrkDetls) {
                if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
                    if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) {
                        throw new CoolException("订单数据回滚失败");
                    }
//                    if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) {
//                        throw new CoolException("订单数据回滚失败");
//                    }
                    orderDetlMapper.updateOrderDetlByGroupNo(wrkDetl.getOrderNo(),wrkDetl.getBrand(),0);
                    //修改订单主表状态,没有作业数量时才可以修改
                    boolean flag = true;
@@ -1052,6 +1119,9 @@
            }
            // 删除工作档明细
            boolean wrkDetlRes = wrkDetlService.delete(new EntityWrapper<WrkDetl>().eq("wrk_no", workNo));
        }
        if (wrkMast.getIoType()==202 || wrkMast.getIoType()==212){
            return;
        }
        // 修改库位状态
@@ -1239,7 +1309,7 @@
        }
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("matnr", param.getLocDetls().get(0).getMatnr()));
        if (Cools.isEmpty(locDetls) || locDetls.size()<1){
            throw new CoolException("待修改商品无库存,无需修改!  品号:"+param.getLocDetls().get(0).getMatnr());
            throw new CoolException("待修改商品无库存,无需修改!  规格:"+param.getLocDetls().get(0).getMatnr());
        }
        try {
            locDetlService.updateMatTurn(param.getLocDetls().get(0).getMatnr(),mat.getMatnr());