| | |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.entity.param.*; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.utils.CodeDetectionUtil; |
| | | import com.zy.common.model.DetlDto; |
| | | import com.zy.common.service.AgvCommonService; |
| | | import lombok.Synchronized; |
| | |
| | | if (Cools.isEmpty(param.getBarcode(), param.getCombMats())) { |
| | | throw new CoolException(BaseRes.PARAM); |
| | | } |
| | | if (!CodeDetectionUtil.barcodeDetection(param.getBarcode())){ |
| | | throw new CoolException(param.getBarcode() + "货架码有误,请正确扫码!!!"); |
| | | } |
| | | param.setContainerType(Short.valueOf(param.getBarcode().substring(0,2))); |
| | | |
| | | // //检查是否已存在相同的托盘条码,存在则抛出异常 |
| | | // //检查是否已存在相同的货架条码,存在则抛出异常 |
| | | // if (agvWaitPakinService.selectCount(new EntityWrapper<AgvWaitPakin>().eq("supp_code", param.getBarcode())) > 0) { |
| | | // throw new CoolException(param.getBarcode() + "料想码已存在AGV入库通知档中"); |
| | | // } |
| | | |
| | | //检查库存是否有相同料箱,存在则抛出异常 |
| | | //检查库存是否有相同货架,存在则抛出异常 |
| | | if(!Cools.isEmpty(agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("supp_code",param.getBarcode())))){ |
| | | throw new CoolException(param.getBarcode() + "料箱码已存在AGV库存明细中"); |
| | | throw new CoolException(param.getBarcode() + "货架码已存在AGV库存明细中"); |
| | | } |
| | | |
| | | //查看工作档是否有相同料箱,存在则抛出异常 |
| | | //检查库存是否有相同货架,存在则抛出异常 |
| | | if(!Cools.isEmpty(agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>().eq("barcode",param.getBarcode())))){ |
| | | throw new CoolException(param.getBarcode() + "货架码已存在AGV库存主档中"); |
| | | } |
| | | |
| | | //查看工作档是否有相同货架,存在则抛出异常 |
| | | if(!Cools.isEmpty(agvWrkMastService.selectByContainerCode(param.getBarcode()))){ |
| | | throw new CoolException(param.getBarcode() + "料箱码已存在AGV工作档中"); |
| | | throw new CoolException(param.getBarcode() + "货架码已存在AGV工作档中"); |
| | | } |
| | | |
| | | if (Cools.isEmpty(param.getOrderNo())) { |
| | |
| | | Date now = new Date(); |
| | | List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", pickParams.getLocNo())); |
| | | |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("wrk_no", pickParams.getWrkNo())); |
| | | |
| | | if (Cools.isEmpty(agvWrkMast)){ |
| | | return "失败,未查到工作主档,工作号:"+pickParams.getWrkNo(); |
| | | } |
| | | for (PickParam.Pick pick : pickParams.getPicks()) { |
| | | if (pick.getCount().equals(0D)) continue; |
| | | AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper<AgvWrkDetl>().eq("matnr", pick.getMatnr()).eq("three_code", pick.getThreeCode())); |
| | | Double count = 0.0D; |
| | | AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper<AgvWrkDetl>().eq("matnr", pick.getMatnr()).eq("three_code", pick.getThreeCode()).eq("supp_code",pick.getSuppCode())); |
| | | |
| | | if (Cools.isEmpty(agvWrkDetl)) { |
| | | AgvWrkDetl wrkDetl = new AgvWrkDetl(); |
| | | Mat mat = matService.selectByMatnr(pick.getMatnr()); |
| | |
| | | wrkDetl.sync(mat); |
| | | wrkDetl.setWrkNo(pickParams.getWrkNo()); |
| | | wrkDetl.setOrderNo(pick.getOrderNo()); |
| | | wrkDetl.setIoTime(now); |
| | | wrkDetl.setIoTime(agvWrkMast.getIoTime()); |
| | | wrkDetl.setAnfme(pick.getCount()); // 数量 |
| | | wrkDetl.setSuppCode(pick.getSuppCode()); // 托盘条码 |
| | | wrkDetl.setSuppCode(pick.getSuppCode()); // 货架条码 |
| | | wrkDetl.setAppeUser(userId); |
| | | wrkDetl.setAppeTime(now); |
| | | wrkDetl.setModiUser(userId); |
| | |
| | | } else { |
| | | Double anfme = agvWrkDetl.getAnfme() + pick.getCount(); |
| | | agvWrkDetl.setAnfme(anfme); |
| | | agvWrkDetlService.update(agvWrkDetl,new EntityWrapper<AgvWrkDetl>().eq("matnr",agvWrkDetl.getMatnr()).eq("three_code",agvWrkDetl.getThreeCode())); |
| | | agvWrkDetlService.update(agvWrkDetl,new EntityWrapper<AgvWrkDetl>().eq("matnr",agvWrkDetl.getMatnr()).eq("three_code",agvWrkDetl.getThreeCode()).eq("supp_code",pick.getSuppCode())); |
| | | |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | if (agvLocDetls.size() == sameNumber) { |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("wrk_no", pickParams.getWrkNo())); |
| | | agvWrkMast.setIoType(101); |
| | | agvWrkMastService.update(agvWrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no", pickParams.getWrkNo())); |
| | | } |
| | |
| | | private void NoOrderComb(CombParam param, Long userId){ |
| | | List<DetlDto> detlDtos = mappingDetlDtoByCombMat(param,null); |
| | | |
| | | //用于统一一个托盘下的入库通知档的生成时间 |
| | | //用于统一一个货架下的入库通知档的生成时间 |
| | | Date now = new Date(); |
| | | detlDtos.forEach(detlDto -> { |
| | | syncWaitPakin(detlDto,"",param.getBarcode(),userId,now); |
| | |
| | | } |
| | | // 用于生成入库通知档所需参数 |
| | | List<DetlDto> detlDtos = mappingDetlDtoByCombMat(param,order); |
| | | //用于统一一个托盘下的入库通知档的生成时间 |
| | | //用于统一一个货架下的入库通知档的生成时间 |
| | | Date now = new Date(); |
| | | for (DetlDto detlDto : detlDtos) { |
| | | //同步生成入库通知档 |
| | |
| | | } |
| | | |
| | | DetlDto detlDto = new DetlDto(combMat.getMatnr(), combMat.getBatch(), combMat.getAnfme(), combMat.getCsocode(), combMat.getIsoseq(),combMat.getContainerCode(),param.getLocType()); |
| | | //同一托盘下相同物料信息和批号转为一个入库通知档 |
| | | //同一货架下相同物料信息和批号转为一个入库通知档 |
| | | if (DetlDto.has(detlDtos, detlDto)) { |
| | | DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch(), detlDto.getCsocode(), detlDto.getIsoseq(),detlDto.getContainerCode()); |
| | | assert one != null; |
| | |
| | | waitPakin.sync(mat); |
| | | waitPakin.setOrderNo(orderNo); // 单据编号 |
| | | waitPakin.setBatch(detlDto.getBatch()); // 序列码 |
| | | //waitPakin.setZpallet(zpallet); // 托盘码 |
| | | waitPakin.setSuppCode(zpallet); // 托盘码 |
| | | //waitPakin.setZpallet(zpallet); // 货架码 |
| | | waitPakin.setSuppCode(zpallet); // 货架码 |
| | | waitPakin.setIoStatus("N"); // 入出状态 |
| | | waitPakin.setAnfme(detlDto.getAnfme()); // 数量 |
| | | waitPakin.setStatus("Y"); // 状态 |
| | |
| | | } |
| | | |
| | | if(Cools.isEmpty(agvWaitPakinService.selectByContainerCode(barcode))){ |
| | | throw new CoolException("该料箱未组托,无法绑定站点"); |
| | | throw new CoolException("该货架未组托,无法绑定站点"); |
| | | } |
| | | |
| | | AgvBasDevp agvBasDevp1 = agvBasDevpService.selectOne(new EntityWrapper<AgvBasDevp>().eq("barcode", barcode)); |
| | |
| | | ioType = 11; |
| | | } |
| | | } else { |
| | | ioType = 12; |
| | | if (agvLocMast.getFloor() != floor) { |
| | | // if (floor==1 && agvLocMast.getFloor()!=1){ |
| | | // ioType = 121; |
| | | // }else { |
| | | if (agvLocMast.getFloor() == 1) { |
| | | throw new CoolException("当前库位请选择调拨单调拨!"); |
| | | } else { |
| | | ioType = 12; |
| | | } |
| | | // } |
| | | } else { |
| | | ioType = 11; |
| | | } |
| | | } |
| | | Date now = new Date(); |
| | | //查询工作档 |
| | |
| | | //生成工作档 |
| | | AgvWrkMast mast = new AgvWrkMast(); |
| | | //工作状态 |
| | | mast.setWrkSts(201L); |
| | | if (ioType==121) { |
| | | mast.setWrkSts(11L); |
| | | }else { |
| | | mast.setWrkSts(201L); |
| | | } |
| | | //入出库类型 |
| | | mast.setIoType(ioType); |
| | | mast.setIoTime(now); |
| | |
| | | mast.setSourceLocNo(agvLocMast.getLocNo()); |
| | | //目标站点 |
| | | mast.setLocNo(locMast.getLocNo()); |
| | | //容器编码 |
| | | //货架编码 |
| | | mast.setBarcode(agvLocMast.getBarcode()); |
| | | //容器类型 |
| | | //货架类型 |
| | | mast.setWhsType(30); |
| | | |
| | | mast.setAppeUser(userId); |
| | |
| | | if (!agvWrkMastService.insertByIncrease(mast)) { |
| | | throw new CoolException("保存工作档失败"); |
| | | } |
| | | if (!agvLocMast.getLocSts().equals("F")) { |
| | | if (agvLocMast.getLocSts().equals("F")) { |
| | | AgvWrkMast mast1 = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", locMast.getLocNo()).eq("source_loc_no",agvLocMast.getLocNo())); |
| | | //生成工作档明细 |
| | | List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", agvLocMast.getLocNo())); |
| | |
| | | throw new CoolException("保存工作明细失败"); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // 如果当前任务是箱壳二三楼回退一楼的 回滚调拨单 |
| | | if (ioType == 12 && locMast.getFloor() == 1) { |
| | | List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", agvLocMast.getLocNo())); |
| | | for (AgvLocDetl agvLocDetl : agvLocDetls) { |
| | | OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("three_code", agvLocDetl.getThreeCode()).eq("matnr", agvLocDetl.getMatnr()).eq("order_no", "DB" + agvLocDetl.getOrderNo())); |
| | | orderDetl.setQty(orderDetl.getQty() - agvLocDetl.getAnfme()); |
| | | if (!orderDetlService.updateById(orderDetl)) { |
| | | throw new CoolException("保存工作明细失败"); |
| | | } |
| | | } |
| | | } |
| | | //更新目标库位状态 |
| | | updateAgvLocMast(agvLocMast,"P"); |
| | |
| | | Integer oldWrkNo = agvWrkMast.getWrkNo(); |
| | | if (Cools.isEmpty(agvWrkMast)) { |
| | | throw new CoolException("工作档中没有此站点任务"); |
| | | } |
| | | if (!agvWrkMast.getWrkSts().equals(207L)) { |
| | | throw new CoolException("工作状态不符合离场条件"); |
| | | } |
| | | |
| | | //生成AGV工作历史档 + 生成AGV工作明细历史档 |
| | |
| | | public String allocationIn(AgvMobileStartPakin param, Long userId) { |
| | | Date now = new Date(); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("barcode", param.getBarcode())); |
| | | if (agvWrkMast.getIoType() != 111) { |
| | | throw new CoolException("非手动调拨任务,不支持次功能"); |
| | | } |
| | | AgvBasDevp agvBasDevp = agvBasDevpService.selectByDevNo(param.getDevNo()); |
| | | if (Cools.isEmpty(agvWrkMast)) { |
| | | throw new CoolException("工作档中没有此货架任务"); |
| | |
| | | if (agvWrkMast.getCrnNo() != agvBasDevp.getFloor()) { |
| | | throw new CoolException("请移动到->" + agvWrkMast.getCrnNo() + "楼入库点入库"); |
| | | } |
| | | AgvLocMast locNo = agvCommonService.getLocNo(3, 1); |
| | | //工作状态 |
| | | agvWrkMast.setWrkSts(211L); |
| | | //入出库类型 |
| | |
| | | if (!agvWrkMastService.update(agvWrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no",agvWrkMast.getWrkNo()))) { |
| | | throw new CoolException("更新工作档失败"); |
| | | } |
| | | // |
| | | agvLocMastService.updateLocStsByLocNo(locNo.getLocNo(),"S",agvWrkMast.getBarcode(),agvWrkMast.getWhsType().shortValue()); |
| | | // 更新源库位状态 |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(param.getDevNo(),"F",agvWrkMast.getBarcode(),agvWrkMast.getWhsType().shortValue()); |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(param.getDevNo(),"R",agvWrkMast.getBarcode(),agvWrkMast.getWhsType().shortValue()); |
| | | //删除AGV工作档 |
| | | return "ok"; |
| | | } |
| | | /* |
| | | 空架离场 |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | @Synchronized |
| | | public String empOut(AgvMobileStartPakin param, Long userId) { |
| | | Date now = new Date(); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("source_loc_no", param.getDevNo())); |
| | | Integer oldWrkNo = agvWrkMast.getWrkNo(); |
| | | if (Cools.isEmpty(agvWrkMast)) { |
| | | throw new CoolException("工作档中没有此站点任务"); |
| | | } |
| | | agvWrkMast.setWrkSts(213L); |
| | | agvWrkMast.setSourceLocNo(""); |
| | | if (!agvWrkMastService.update(agvWrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no",agvWrkMast.getWrkNo()))) { |
| | | throw new CoolException("更新工作档失败"); |
| | | } |
| | | // 更新源库位状态 |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(param.getDevNo(),"O","",agvWrkMast.getWhsType().shortValue()); |
| | | return "ok"; |
| | | } |
| | | /* |
| | | 空架进场 |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | @Synchronized |
| | | public String empIn(AgvMobileStartPakin param, Long userId) { |
| | | Date now = new Date(); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("barcode", param.getBarcode())); |
| | | if (Cools.isEmpty(agvWrkMast)) { |
| | | throw new CoolException("工作档中没有此站点任务"); |
| | | } |
| | | agvWrkMast.setWrkSts(214L); |
| | | agvWrkMast.setSourceLocNo(param.getDevNo()); |
| | | if (!agvWrkMastService.update(agvWrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no",agvWrkMast.getWrkNo()))) { |
| | | throw new CoolException("更新工作档失败"); |
| | | } |
| | | // 更新源库位状态 |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(param.getDevNo(),"F",param.getBarcode(),agvWrkMast.getWhsType().shortValue()); |
| | | return "ok"; |
| | | } |
| | | /* |
| | |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public String handBack(AgvMobileStartPakin param, Long userId) { |
| | | Date now = new Date(); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("source_loc_no", param.getDevNo())); |
| | | agvWrkMast.setIoType(113); |
| | | agvWrkMast.setModiUser(userId); |
| | | agvWrkMast.setModiTime(now); |
| | | if (!agvWrkMastService.update(agvWrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no",agvWrkMast.getWrkNo()))) { |
| | | throw new CoolException("更新工作档失败"); |
| | | } |
| | | return "ok"; |
| | | } |
| | | |
| | | /* |
| | | * 站点回退 |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public String doBack(AgvMobileStartPakin param, Long userId) { |
| | | if (Cools.isEmpty(param.getBarcode()) || !CodeDetectionUtil.barcodeDetection(param.getBarcode())){ |
| | | throw new CoolException(param.getBarcode() + "货架码有误,请正确扫码!!!"); |
| | | } |
| | | if (Cools.isEmpty(param.getDevNo()) || !CodeDetectionUtil.carCodeDetection(param.getDevNo())){ |
| | | throw new CoolException(param.getDevNo() + "小车地码有误,请正确扫码!!!"); |
| | | } |
| | | Date now = new Date(); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", param.getDevNo())); |
| | | AgvWrkMast agvWrkMastSource = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("source_loc_no", param.getDevNo())); |
| | | if (!Cools.isEmpty(agvWrkMastSource)) { |
| | | throw new CoolException("当前站点已有退库任务"); |
| | | } |
| | | Integer oldWrkNo = agvWrkMast.getWrkNo(); |
| | | if (agvWrkMast.getBarcode() != param.getBarcode()) { |
| | | throw new CoolException("回退任务的货架码与当前货架码不一致1"); |
| | | if (!agvWrkMast.getBarcode().equals(param.getBarcode())) { |
| | | throw new CoolException("回退任务的货架码与当前货架码不一致!"); |
| | | } |
| | | if (agvWrkMast.getWrkSts() != 205) { |
| | | throw new CoolException("出库任务未完成!"); |
| | | } |
| | | // 新建回退工作档 |
| | | AgvWrkMast wrkMast = createWrkMast(58, 201L, agvWrkMast.getLocNo(), agvWrkMast.getSourceLocNo(), agvWrkMast.getBarcode(), now, userId, agvWrkMast.getWhsType(), 0); |
| | |
| | | wrkMast.setSourceLocNo(sourceLocNo); |
| | | //目标站点 |
| | | wrkMast.setLocNo(locNo); |
| | | //容器编码 |
| | | //货架编码 |
| | | wrkMast.setBarcode(barcode); |
| | | //容器类型 |
| | | //货架类型 |
| | | wrkMast.setWhsType(containerType); |
| | | // 目标楼层 |
| | | wrkMast.setCrnNo(floor); |