自动化立体仓库 - WMS系统
#
lsh
2025-03-16 92c2c71666ff1a1c7b151d75f64674b7ee8840c0
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -1,8 +1,10 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
@@ -11,9 +13,17 @@
import com.zy.asrs.entity.result.StockVo;
import com.zy.asrs.mapper.TagMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.MatUtils;
import com.zy.asrs.utils.PostMesDataUtils;
import com.zy.common.model.DetlDto;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.StartupDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.utils.NodeUtils;
import com.zy.common.web.WcsController;
import com.zy.common.web.param.SearchLocParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -54,6 +64,24 @@
    private BasDevpService basDevpService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private WaitPakinService waitPakinService;
    @Autowired
    private CommonService commonService;
    @Autowired
    private LocDetlRullUpDetailService locDetlRullUpDetailService;
    @Autowired
    private WrkDetlSingleService wrkDetlSingleService;
    @Autowired
    private WrkMastStaService wrkMastStaService;
    @Autowired
    private WrkMastStaLogService wrkMastStaLogService;
    @Autowired
    private StaDescService staDescService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private RgvOneSignService rgvOneSignService;
    @Override
    @Transactional
@@ -586,19 +614,28 @@
        LabellerMatParam labellerMatParam = new LabellerMatParam();
        labellerMatParam.setDevNo(param.getDevNo());
        labellerMatParam.setLabNo(param.getLabNo());
        ArrayList<LabellerMatParam.CombMat> combMats = new ArrayList<>();
        String orderNo = "";
        for (WrkDetl wrkDetl:wrkDetls){
            LabellerMatParam.CombMat combMat = new LabellerMatParam.CombMat(wrkDetl);
            orderNo=wrkDetl.getOrderNo();
            combMat.setTemp1("1");
            combMats.add(combMat);
        }
        labellerMatParam.setCombMats(combMats);
        labellerMatParam.setLabellingTime(DateUtils.convert(new Date()));
        labellerMatParam.setWrkNo(basDevp.getWrkNo().toString());
        labellerMatParam.setLabTemplate("1");
        labellerMatParam.setOrderNo(orderNo);
//        ArrayList<LabellerMatParam.CombMat> combMats = new ArrayList<>();
        ArrayList<LabellerMatParam.BoxNo> boxNos = new ArrayList<>();
//        String orderNo = "";
        for (WrkDetl wrkDetl:wrkDetls){
            LabellerMatParam.BoxNo boxNo = new LabellerMatParam.BoxNo();
            boxNo.setBoxNo(wrkDetl.getBatch());
            boxNos.add(boxNo);
        }
        labellerMatParam.setBoxNos(boxNos);
//        for (WrkDetl wrkDetl:wrkDetls){
//            LabellerMatParam.CombMat combMat = new LabellerMatParam.CombMat(wrkDetl);
//            orderNo=wrkDetl.getOrderNo();
//            combMat.setTemp1("1");
//            combMats.add(combMat);
//        }
//        labellerMatParam.setCombMats(combMats);
//        labellerMatParam.setLabellingTime(DateUtils.convert(new Date()));
//        labellerMatParam.setLabTemplate("1");
//        labellerMatParam.setOrderNo(orderNo);
        wrkMast.setWrkSts(53L);
        if (!wrkMastService.updateById(wrkMast)){
            throw new CoolException("异常,请重新申请");
@@ -612,7 +649,46 @@
    @Override
    @Transactional
    public void labellerComplete(LabellerCompleteParam param) {
        //
        if (Cools.isEmpty(param.getDevNo())){
            throw new CoolException("参数:站点号 devNo为空");
        }else if (Cools.isEmpty(param.getLabNo())){
            throw new CoolException("参数:贴标机号 labNo为空");
        }else if (Cools.isEmpty(param.getLabResult())){
            throw new CoolException("参数:贴标结果 labResult为空");
        }else if (Cools.isEmpty(param.getWrkNo())){
            throw new CoolException("参数:贴标任务号 wrkNo为空");
        }
        BasDevp basDevp = basDevpService.selectById(param.getDevNo());
        if (Cools.isEmpty(basDevp)){
            throw new CoolException("参数:站点号 devNo="+param.getDevNo()+"不存在");
        }else if (Cools.isEmpty(basDevp.getWrkNo()) || basDevp.getWrkNo()==0 ){
            throw new CoolException("站点:"+param.getDevNo()+" 不存在工作中任务");
        }else if(!basDevp.getWrkNo().toString().equals(param.getWrkNo())){
            throw new CoolException("站点:"+param.getDevNo()+" 进行中任务号="+basDevp.getWrkNo()+" 与贴标结果返回任务号="+param.getWrkNo()+" 不一致");
        }
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", basDevp.getWrkNo()));
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException("站点:"+param.getDevNo()+" 工作中任务不存在,任务号:"+basDevp.getWrkNo());
        }else if (!wrkMast.getWrkSts().equals(53L)){
            throw new CoolException("站点:"+param.getDevNo()+" 工作中任务状态已变更,请勿重复申请,任务号:"+basDevp.getWrkNo()+",任务状态:"+wrkMast.getWrkSts$());
        }
        if (param.getLabResult().equals("OK")){
            wrkMast.setWrkSts(54L);
            wrkMast.setStaNo(144);
            if (!wrkMastService.updateById(wrkMast)){
                throw new CoolException("异常,请重新申请");
            }
        }else if (param.getLabResult().equals("NG")){
            wrkMast.setWrkSts(52L);//重新贴标
            if (!wrkMastService.updateById(wrkMast)){
                throw new CoolException("异常,请重新申请");
            }
        }else {
            throw new CoolException("参数:贴标结果:labResult"+param.getLabResult()+";请按规则发送:成功:OK 、失败:NG");
        }
    }
    /*
@@ -620,8 +696,177 @@
     * */
    @Override
    @Transactional
    public void palletizingComplete(PalletizingCompleteParam param) {
    public void PalletizingCompleteTwoFloorParam(PalletizingCompleteTwoFloorParam param) {
        Long userId = 7777L;//中控
        //判断param参数
        if (Cools.isEmpty(param.getBarcode())){
            throw new CoolException("参数:托盘码 barcode为空");
        }else if (Cools.isEmpty(param.getPalletizingNo())){
            throw new CoolException("参数:码垛位编号 palletizingNo为空");
        }else if (Cools.isEmpty(param.getBoxType())){
            throw new CoolException("参数:木箱类型 boxType为空");
        }else if (Cools.isEmpty(param.getMatList()) || param.getMatList().size()==0){
            throw new CoolException("参数:物料明细 matLists为空");
        }
        String matnrOne = "";//木箱相同位置 规格 matnr校验  1、左
        String matnrTwo = "";//木箱相同位置 规格 matnr校验  2、右
        ArrayList<String> boxNos = new ArrayList<>();   //木箱唯一编码查重  (batch)
        //判断matLists参数
        for (PalletizingCompleteTwoFloorParam.MatList matList:param.getMatList()){
            if (Cools.isEmpty(matList.getMatnr())){
                throw new CoolException("参数:规格 matnr为空");
            }else if (Cools.isEmpty(matList.getPosition())){
                throw new CoolException("规格:"+matList.getMatnr()+"、参数:码垛位置 position为空");
            }else if (Cools.isEmpty(matList.getBatch())){
                throw new CoolException("规格:"+matList.getMatnr()+"、参数:木箱编号 batch为空");
            }else if (Cools.isEmpty(matList.getModel())){
                throw new CoolException("规格:"+matList.getMatnr()+"、参数:卷号 model为空");
            }else if (Cools.isEmpty(matList.getBatch())){
                throw new CoolException("规格:"+matList.getMatnr()+"、参数:木箱编号 boxNo为空");
            }else if (Cools.isEmpty(matList.getWeight()) || matList.getWeight().equals(0D)){
                throw new CoolException("规格:"+matList.getMatnr()+"、参数:净重 weight为空");
            }else if (Cools.isEmpty(matList.getRoughWeight()) || matList.getRoughWeight().equals(0D)){
                throw new CoolException("规格:"+matList.getMatnr()+"、参数:毛重 roughWeight为空");
            }else if (Cools.isEmpty(matList.getRollExtent()) || matList.getRollExtent().equals(0D)){
                throw new CoolException("规格:"+matList.getMatnr()+"、参数:卷长度 rollExtent为空");
            }
//            else if (Cools.isEmpty(matList.getJoint()) || matList.getJoint()==0){
//                throw new CoolException("规格:"+matList.getMatnr()+"、参数:接头数 joint");
//            }
            if (matList.getPosition().equals("1")){//1、左  2、右
                if (!matnrOne.equals("")){
                    if (!matnrOne.equals(matList.getMatnr())){
                        throw new CoolException("木箱位置:"+matList.getPosition()+"存在不同规格卷信息");
                    }
                }else {
                    matnrOne=matList.getMatnr();
                }
            }else if (matList.getPosition().equals("2")){
                if (!matnrTwo.equals("")){
                    if (!matnrTwo.equals(matList.getMatnr())){
                        throw new CoolException("木箱位置:"+matList.getPosition()+"存在不同规格卷信息");
                    }
                }else {
                    matnrTwo=matList.getMatnr();
                }
            }else {
                throw new CoolException("参数:木箱编号 boxNo:"+matList.getBatch()+",木箱位置错误:"+matList.getPosition());
            }
            if (!boxNos.contains(matList.getBatch())){
                boxNos.add(matList.getBatch());
            }else {
                throw new CoolException("参数:木箱编号 boxNo:"+matList.getBatch()+",木箱编码存在重复");
            }
        }
//        BasDevp basDevp = basDevpService.selectById(Integer.parseInt(param.getDevNo$()));
//        if (Cools.isEmpty(basDevp)){
//            throw new CoolException("参数:码垛位编号 palletizingNo="+param.getPalletizingNo()+"不存在");
//        }
//        if (Cools.isEmpty(basDevp.getAutoing()) || !basDevp.getAutoing().equals("Y")){
//            throw new CoolException("码垛位编号 palletizingNo="+param.getPalletizingNo()+" 所处站点不是自动状态");
//        }
//        if (Cools.isEmpty(basDevp.getLoading()) || !basDevp.getLoading().equals("Y")){
//            throw new CoolException("码垛位编号 palletizingNo="+param.getPalletizingNo()+" 所处站点不是有物状态");
//        }
//        if (Cools.isEmpty(basDevp.getCanining()) || !basDevp.getCanining().equals("Y")){
//            throw new CoolException("码垛位编号 palletizingNo="+param.getPalletizingNo()+" 所处站点不是能入状态");
//        }
        if (locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", param.getBarcode()))!=0
            || wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet", param.getBarcode()))!=0
            || waitPakinService.selectCount(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()))!=0){
            throw new CoolException("托盘条码:"+param.getBarcode()+"已存在,请勿重复组托");
        }
        Date now = new Date();
        for (PalletizingCompleteTwoFloorParam.MatList matList:param.getMatList()){
            Mat mat = matService.selectByMatnr(matList.getMatnr());
            if (Cools.isEmpty(mat)) {
                mat = new Mat();
                mat.setMatnr(matList.getMatnr());
                mat.setMaktx(matList.getMatnr());
                mat.setTagId(tagService.getTop().getId());
                mat.setCreateBy(userId);
                mat.setCreateTime(now);
                mat.setUpdateBy(userId);
                mat.setUpdateTime(now);
                mat.setStatus(1);
                if (!matService.insert(mat)) {
                    throw new CoolException("规格添加失败,请联系管理员");
                }
            }
            WaitPakin waitPakin = new WaitPakin();
            waitPakin.sync(mat);
            waitPakin.setBatch(matList.getBatch());       //木箱编码  //批次  唯一值  箱号
            waitPakin.setModel(matList.getModel());       //卷号  唯一值
            waitPakin.setBrand(param.getBoxType());     //木箱类型
            waitPakin.setZpallet(param.getBarcode());   //托盘码
            waitPakin.setOrigin(matList.getPosition()); //木箱在托盘上的位置
            waitPakin.setWeight(matList.getWeight());  //净重
            waitPakin.setVolume(matList.getRoughWeight());  //毛重
            waitPakin.setPrice(matList.getRollExtent());   //长度
            waitPakin.setSpecs(String.valueOf(matList.getJoint()));   //接头
            waitPakin.setIoStatus("N");     // 入出状态
            waitPakin.setAnfme(matList.getAnfme());  // 数量
            waitPakin.setStatus("Y");    // 状态
            waitPakin.setAppeUser(userId);
            waitPakin.setAppeTime(now);
            waitPakin.setModiUser(userId);
            waitPakin.setModiTime(now);
            if (!waitPakinService.insert(waitPakin)) {
                throw new CoolException("保存入库通知档失败");
            }
            RgvOneSign armNo = rgvOneSignService.selectOne(new EntityWrapper<RgvOneSign>().eq("rgv_one_type","armNo"+param.getPalletizingNo()));
            armNo.setRgvOneSign(1);
            rgvOneSignService.updateById(armNo);
        }
    }
    /*
     * 松盛(1楼):码垛完成下发入库信息
     * */
    @Override
    @Transactional
    public void palletizingCompleteS(PalletizingCompleteParam param) {
        //判断param参数
        if (Cools.isEmpty(param.getBarcode())){
            throw new CoolException("参数:托盘码 barcode为空");
        }
        WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
        if (Cools.isEmpty(wrkMast) || wrkMast.getWrkSts()!=2){
            log.error("退库码垛完成,返回托盘码未查询到工作档案!");
            throw new CoolException("参数:托盘码 barcode未查询到工作档案");
        }
        wrkMast.setSheetNo("4");
        wrkMastService.updateById(wrkMast);
    }
    /*
     *中控:出库完成月台相关
     * */
    @Override
    @Transactional
    public void balconyComplete(LabellerMatParam param) {
        if (Cools.isEmpty(param.getWrkNo())){
            throw new CoolException("工作号为空!");
        }
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", param.getWrkNo()));
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException("工作号为空!");
        }
        wrkMast.setWrkSts(57L);
        wrkMastService.updateById(wrkMast);
    }
    /*
@@ -630,6 +875,89 @@
    @Override
    @Transactional
    public void singleUnstackingComplete(SingleUnstackingCompleteParam param) {
        Long userId = 8888L;//桁架上位软件
        //判断param参数
        if (Cools.isEmpty(param.getPalletizingNo())){
            throw new CoolException("参数:码垛位编号 palletizingNo为空");
        }else if (Cools.isEmpty(param.getMatList()) || param.getMatList().size()==0){
            throw new CoolException("参数:物料明细 matLists为空");
        }
        if (Cools.isEmpty(param.getBarcode())){
            throw new CoolException("参数:托盘码 barcode为空");
        }
        WrkMast wrkMastMatrix = wrkMastService.selectByBarcode(param.getBarcode());
        if (Cools.isEmpty(wrkMastMatrix)){
            throw new CoolException("参数:托盘码查询工作档失败:"+param.getBarcode());
        }
        if (!wrkMastMatrix.getSheetNo().equals("1")){
            throw new CoolException("参数:此任务未上报禁止完成:"+param.getBarcode());
        }
        ArrayList<WrkDetl> wrkDetlsNew = new ArrayList<>();
        ArrayList<WrkDetlSingle> wrkDetlsOld = new ArrayList<>();
        //判断matLists参数
        for (SingleUnstackingCompleteParam.MatList matList:param.getMatList()){
            if (Cools.isEmpty(matList.getPosition())){
                throw new CoolException("参数:码垛位置 position为空");
            }else if (Cools.isEmpty(matList.getBoxNo())){
                throw new CoolException("参数:木箱编号 boxNo为空");
            }
            WrkDetlSingle wrkDetlSingleOne = wrkDetlSingleService.selectOne(new EntityWrapper<WrkDetlSingle>().eq("batch", matList.getBoxNo()));
            List<WrkDetlSingle> wrkDetlSingles = wrkDetlSingleService.selectList(new EntityWrapper<WrkDetlSingle>()
                    .eq("wrk_no", wrkDetlSingleOne.getWrkNo()).eq("io_time", wrkDetlSingleOne.getIoTime()));
            boolean sign=true;
            for (WrkDetlSingle wrkDetlSingle:wrkDetlSingles){
                WrkDetl wrkDetl = new WrkDetl();
                wrkDetl.sync(wrkDetlSingle);
                wrkDetlsNew.add(wrkDetl);
                wrkDetlsOld.add(wrkDetlSingle);
                sign=false;
                break;
            }
            if (sign){
                throw new CoolException("参数:木箱编号 boxNo未查询到对应的工作明细!");
            }
        }
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(202));
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(51L); // 工作状态:生成入库ID
        wrkMast.setIoType(202); // 入出库状态:202.拆垛后出库
        wrkMast.setIoPri(99D); // 优先级
        wrkMast.setSourceStaNo(param.getDevNo$());
        wrkMast.setStaNo(144); //贴标站点  直接到尾端
        // 操作人员数据
        wrkMast.setAppeUser(userId);
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        if (!wrkMastService.insert(wrkMast)) {
            throw new CoolException("生成工作档失败==》桁架上位软件:单次拆垛完成通知");
        }
        for (WrkDetl wrkDetl : wrkDetlsNew){
            wrkDetl.setWrkNo(wrkMast.getWrkNo());
            wrkDetl.setIoTime(wrkMast.getIoTime());
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiTime(now);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作明细失败==》桁架上位软件:单次拆垛完成通知");
            }
        }
        for (WrkDetlSingle wrkDetlSingle : wrkDetlsOld) {
            wrkDetlSingleService.delete(new EntityWrapper<WrkDetlSingle>()
                    .eq("batch",wrkDetlSingle.getBatch())
                    .eq("wrk_no",wrkDetlSingle.getWrkNo())
                    .eq("io_time",wrkDetlSingle.getIoTime()));
        }
    }
@@ -639,7 +967,101 @@
    @Override
    @Transactional
    public void singleMountUnstackingComplete(SingleMountUnstackingCompleteParam param) {
//        Long userId = 8888L;//桁架上位软件
        //判断param参数
        if (Cools.isEmpty(param.getBarcode())){
            throw new CoolException("参数:托盘码 barcode为空");
        }
        WrkMast wrkMastMatrix = wrkMastService.selectByBarcode(param.getBarcode());
        if (Cools.isEmpty(wrkMastMatrix)){
            throw new CoolException("参数:托盘码查询工作档失败:"+param.getBarcode());
        }
        if (!wrkMastMatrix.getSheetNo().equals("1")){
            throw new CoolException("参数:此任务未上报禁止完成:"+param.getBarcode());
        }
        wrkMastMatrix.setSheetNo("3");
        if (!wrkMastService.updateById(wrkMastMatrix)){
            throw new CoolException("更新工作档失败==》桁架上位软件:单托拆垛完成通知");
        }
    }
    /*
     *
     * */
    @Override
    @Transactional
    public void cs2() {
//        int[] staNos =new int[]{122};
//        for (Integer staNo:staNos){
//            int[] crnNos =new int[]{6};
//            for (Integer crnNo:crnNos){
//                descSta(staNo,crnNo);
//            }
//        }
    }
    private void descSta(Integer staNo,Integer crnNo){
//        int[] typeNos =new int[]{1,10,53,101,103,110};
        int[] typeNos =new int[]{10,110};
        for (Integer typeNo:typeNos){
            descSta3(staNo,crnNo,typeNo);
        }
    }
    private void descSta3(Integer staNo,Integer crnNo,Integer typeNo){
        StaDesc staDesc = new StaDesc();
        staDesc.setTypeNo(typeNo);
        staDesc.setStnNo(staNo);
        staDesc.setCrnNo(crnNo);
        staDesc.setCrnStn(CrnNoRC(crnNo,staDesc.getTypeNo()>100));
        descSta2(staDesc);
    }
    private void descSta2(StaDesc staDesc){
        Date now = new Date();
        //入库
        int sameRes = staDescService.selectCount(new EntityWrapper<StaDesc>()
                .eq("type_no", staDesc.getTypeNo())
                .eq("stn_no", staDesc.getStnNo())
                .eq("crn_no", staDesc.getCrnNo())
                .eq("crn_stn", staDesc.getCrnStn()));
        if (sameRes == 0) {
            staDesc.setModiUser(9527L);
            staDesc.setModiTime(now);
            staDesc.setAppeUser(9527L);
            staDesc.setAppeTime(now);
            staDescService.insert(staDesc);
        }
    }
    private Integer CrnNoRC(Integer crnNo,boolean sign){
        Integer crnStn = 0;
        switch (crnNo){
            case 1:
                crnStn = 102;
                break;
            case 2:
                crnStn = 105;
                break;
            case 3:
                crnStn = 108;
                break;
            case 4:
                crnStn = 111;
                break;
            case 5:
                crnStn = 114;
                break;
            case 6:
                crnStn = 117;
                break;
        }
        if (sign){
            return crnStn-2;
        }
        return crnStn;
    }
    /*...........................上饶江铜..............以上.............徐工汉云...........................*/