| | |
| | | package com.zy.asrs.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.annotations.ManagerAuth; |
| | | import com.core.common.BaseRes; |
| | | import com.core.common.Cools; |
| | | import com.core.common.R; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.entity.param.CombParam; |
| | | import com.zy.asrs.entity.param.MobileAdjustParam; |
| | | import com.zy.asrs.entity.param.PickParam; |
| | | import com.zy.asrs.entity.param.*; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.common.model.DetlDto; |
| | | import com.zy.common.service.AgvCommonService; |
| | | import lombok.Synchronized; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | private AgvWorkService agvWorkService; |
| | | @Autowired |
| | | private AgvWrkDetlService agvWrkDetlService; |
| | | @Autowired |
| | | private AgvLocMastService agvLocMastService; |
| | | @Autowired |
| | | private AgvCommonService agvCommonService; |
| | | @Autowired |
| | | private AgvWrkMastLogService agvWrkMastLogService; |
| | | @Autowired |
| | | private AgvWrkDetlLogService agvWrkDetlLogService; |
| | | |
| | | |
| | | /* |
| | |
| | | } |
| | | |
| | | /* |
| | | 组托 + 绑定暂存位 |
| | | 再次拣料 |
| | | */ |
| | | @Override |
| | | @Transactional |
| | |
| | | |
| | | } |
| | | |
| | | /* |
| | | 手动移库 |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public String handControlLocMove(LocMoveParam param, Long userId) { |
| | | String fl = String.valueOf(param.getFloor()); |
| | | short floor =(short)Integer.parseInt(fl.substring(0, 1)); |
| | | Integer ioType = 0; |
| | | AgvLocMast agvLocMast = agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>().eq("loc_no", param.getLocNo())); |
| | | if (Cools.isEmpty(agvLocMast)) { |
| | | throw new CoolException("当前库位为空,请检查库位!"); |
| | | } |
| | | // if (agvLocMast.getLocSts() == "F") { |
| | | // return R.error("当前库位不为在库,或者空货架,不支持移库"); |
| | | |
| | | // 校验楼层 |
| | | if (agvLocMast.getLocType1() != 3) { // 不为箱壳区域 |
| | | if (agvLocMast.getFloor() != floor) { |
| | | throw new CoolException("当前库位不支持跨楼层转移"); |
| | | } else { |
| | | ioType = 11; |
| | | } |
| | | } else { |
| | | ioType = 12; |
| | | } |
| | | Date now = new Date(); |
| | | //查询工作档 |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectByContainerCode(agvLocMast.getBarcode()); |
| | | if(!Cools.isEmpty(agvWrkMast)){ |
| | | throw new CoolException("当前"+agvLocMast.getBarcode()+"货架码已在工作档中"); |
| | | } |
| | | //检索库位,选择合适的库位 |
| | | AgvLocMast locMast = agvCommonService.getLocNo(agvLocMast.getLocType1(),floor); |
| | | if (Cools.isEmpty(locMast)) { |
| | | throw new CoolException("当前楼层没有空库位"); |
| | | } |
| | | //生成工作档 |
| | | AgvWrkMast mast = new AgvWrkMast(); |
| | | //工作状态 |
| | | mast.setWrkSts(201L); |
| | | //入出库类型 |
| | | mast.setIoType(ioType); |
| | | mast.setIoTime(now); |
| | | //优先级 |
| | | mast.setIoPri(300.0); |
| | | //源站点 |
| | | mast.setSourceLocNo(agvLocMast.getLocNo()); |
| | | //目标站点 |
| | | mast.setLocNo(locMast.getLocNo()); |
| | | //容器编码 |
| | | mast.setBarcode(agvLocMast.getBarcode()); |
| | | //容器类型 |
| | | mast.setWhsType(30); |
| | | |
| | | mast.setAppeUser(userId); |
| | | mast.setAppeTime(now); |
| | | mast.setModiUser(userId); |
| | | mast.setModiTime(now); |
| | | if (!agvWrkMastService.insertByIncrease(mast)) { |
| | | throw new CoolException("保存工作档失败"); |
| | | } |
| | | 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())); |
| | | agvLocDetls.forEach(agvLocDetl -> { |
| | | AgvWrkDetl wrkDetl = new AgvWrkDetl(); |
| | | wrkDetl.setWrkNo(mast1.getWrkNo()); |
| | | wrkDetl.sync(agvLocDetl); |
| | | wrkDetl.setSuppCode(agvLocDetl.getSuppCode()); |
| | | wrkDetl.setIoTime(now); |
| | | wrkDetl.setAppeUser(9527L); |
| | | wrkDetl.setAppeTime(now); |
| | | wrkDetl.setModiUser(9527L); |
| | | wrkDetl.setModiTime(now); |
| | | if (!agvWrkDetlService.insert(wrkDetl)) { |
| | | throw new CoolException("保存工作明细失败"); |
| | | } |
| | | }); |
| | | } |
| | | //更新目标库位状态 |
| | | updateAgvLocMast(agvLocMast,"P"); |
| | | updateAgvLocMast(locMast,"Q"); |
| | | return "ok"; |
| | | } |
| | | |
| | | /* |
| | | 调拨离场 |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | @Synchronized |
| | | public String allocationOut(AgvMobileStartPakin param, Long userId) { |
| | | Date now = new Date(); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", param.getDevNo())); |
| | | Integer oldWrkNo = agvWrkMast.getWrkNo(); |
| | | if (Cools.isEmpty(agvWrkMast)) { |
| | | throw new CoolException("工作档中没有此站点任务"); |
| | | } |
| | | |
| | | //生成AGV工作历史档 + 生成AGV工作明细历史档 |
| | | agvWrkMastLogService.save(agvWrkMast); |
| | | agvWrkDetlLogService.save(agvWrkMast.getWrkNo()); |
| | | //删除AGV工作档 |
| | | agvWrkMastService.deleteById(agvWrkMast); |
| | | //生成工作档 |
| | | AgvWrkMast wrkMast = createWrkMast(111, 210L, "", "", agvWrkMast.getBarcode(), now, userId, 30, agvWrkMast.getCrnNo()); |
| | | // 更新工作明细 |
| | | List<AgvWrkDetl> agvWrkDetls = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("supp_code", agvWrkMast.getBarcode())); |
| | | for (AgvWrkDetl agvWrkDetl : agvWrkDetls) { |
| | | agvWrkDetl.setWrkNo(wrkMast.getWrkNo()); |
| | | // 保持工作档明细 |
| | | agvWrkDetl.setWrkNo(wrkMast.getWrkNo()); |
| | | agvWrkDetl.setModiUser(userId); |
| | | agvWrkDetl.setModiTime(now); |
| | | if (!agvWrkDetlService.insert(agvWrkDetl)) { |
| | | throw new CoolException("保存工作明细失败"); |
| | | } |
| | | } |
| | | // 更新站点状态 |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","",null); |
| | | // 更新源库位状态 |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"O","",agvWrkMast.getWhsType().shortValue()); |
| | | |
| | | //删除AGV工作明细档 |
| | | agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",oldWrkNo)); |
| | | return "ok"; |
| | | } |
| | | /* |
| | | 调拨进场 |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public String allocationIn(AgvMobileStartPakin param, Long userId) { |
| | | Date now = new Date(); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("barcode", param.getBarcode())); |
| | | AgvBasDevp agvBasDevp = agvBasDevpService.selectByDevNo(param.getDevNo()); |
| | | if (Cools.isEmpty(agvWrkMast)) { |
| | | throw new CoolException("工作档中没有此货架任务"); |
| | | } |
| | | if (agvWrkMast.getCrnNo() != agvBasDevp.getFloor()) { |
| | | throw new CoolException("请移动到->" + agvWrkMast.getCrnNo() + "楼入库点入库"); |
| | | } |
| | | //工作状态 |
| | | agvWrkMast.setWrkSts(211L); |
| | | //入出库类型 |
| | | agvWrkMast.setIoType(112); |
| | | agvWrkMast.setSourceLocNo(param.getDevNo()); |
| | | agvWrkMast.setModiUser(userId); |
| | | agvWrkMast.setModiTime(now); |
| | | if (!agvWrkMastService.update(agvWrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no",agvWrkMast.getWrkNo()))) { |
| | | throw new CoolException("更新工作档失败"); |
| | | } |
| | | // 更新源库位状态 |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(param.getDevNo(),"F",agvWrkMast.getBarcode(),agvWrkMast.getWhsType().shortValue()); |
| | | //删除AGV工作档 |
| | | return "ok"; |
| | | } |
| | | /* |
| | | * 站点回退 |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public String doBack(AgvMobileStartPakin param, Long userId) { |
| | | Date now = new Date(); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", param.getDevNo())); |
| | | Integer oldWrkNo = agvWrkMast.getWrkNo(); |
| | | // 新建回退工作档 |
| | | AgvWrkMast wrkMast = createWrkMast(58, 201L, agvWrkMast.getLocNo(), agvWrkMast.getSourceLocNo(), agvWrkMast.getBarcode(), now, userId, agvWrkMast.getWhsType(), 0); |
| | | // 更新接驳位,更新库位状态 |
| | | agvLocMastService.updateLocStsByLocNo(wrkMast.getLocNo(),"S",wrkMast.getBarcode(),wrkMast.getWhsType().shortValue()); |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getSourceLocNo(),"R",wrkMast.getBarcode(),agvWrkMast.getWhsType().shortValue()); |
| | | // 更新工作明细 |
| | | List<AgvWrkDetl> agvWrkDetls = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("supp_code", agvWrkMast.getBarcode())); |
| | | for (AgvWrkDetl agvWrkDetl : agvWrkDetls) { |
| | | agvWrkDetl.setWrkNo(wrkMast.getWrkNo()); |
| | | // 保持工作档明细 |
| | | agvWrkDetl.setWrkNo(wrkMast.getWrkNo()); |
| | | agvWrkDetl.setModiUser(userId); |
| | | agvWrkDetl.setModiTime(now); |
| | | if (!agvWrkDetlService.insert(agvWrkDetl)) { |
| | | throw new CoolException("保存工作明细失败"); |
| | | } |
| | | // 同步订单数量 |
| | | OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("matnr", agvWrkDetl.getMatnr()).eq("three_code",agvWrkDetl.getThreeCode()).in("source",18,31,34)); |
| | | orderDetl.setQty(orderDetl.getQty() - agvWrkDetl.getAnfme()); |
| | | if (!orderDetlService.update(orderDetl,new EntityWrapper<OrderDetl>().eq("order_no",orderDetl.getOrderNo()).eq("matnr", orderDetl.getMatnr()).eq("three_code",orderDetl.getThreeCode()))){ |
| | | throw new CoolException("修改订单明细失败,请联系管理员"+orderDetl.getOrderNo()+orderDetl.getMatnr()); |
| | | } |
| | | } |
| | | |
| | | //生成AGV工作历史档 + 生成AGV工作明细历史档 |
| | | agvWrkMastLogService.save(agvWrkMast); |
| | | agvWrkDetlLogService.save(agvWrkMast.getWrkNo()); |
| | | //删除AGV工作档 |
| | | agvWrkMastService.deleteById(agvWrkMast); |
| | | //删除AGV工作明细档 |
| | | agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",oldWrkNo)); |
| | | return "ok"; |
| | | } |
| | | /* |
| | | 更新目标库位信息 |
| | | */ |
| | | private void updateAgvLocMast(AgvLocMast locMast, String locSts){ |
| | | locMast.setLocSts(locSts); |
| | | agvLocMastService.updateById(locMast); |
| | | } |
| | | |
| | | /* |
| | | 生成工作档 |
| | | */ |
| | | private AgvWrkMast createWrkMast(int ioType, long wrkSts, String sourceLocNo, String locNo, String barcode, Date now, Long userId, int containerType,int floor){ |
| | | AgvWrkMast wrkMast = new AgvWrkMast(); |
| | | //工作状态 |
| | | wrkMast.setWrkSts(wrkSts); |
| | | //入出库类型 |
| | | wrkMast.setIoType(ioType); |
| | | wrkMast.setIoTime(now); |
| | | //优先级 |
| | | wrkMast.setIoPri(300.0); |
| | | //源站点 |
| | | wrkMast.setSourceLocNo(sourceLocNo); |
| | | //目标站点 |
| | | wrkMast.setLocNo(locNo); |
| | | //容器编码 |
| | | wrkMast.setBarcode(barcode); |
| | | //容器类型 |
| | | wrkMast.setWhsType(containerType); |
| | | // 目标楼层 |
| | | wrkMast.setCrnNo(floor); |
| | | |
| | | wrkMast.setAppeUser(userId); |
| | | wrkMast.setAppeTime(now); |
| | | wrkMast.setModiUser(userId); |
| | | wrkMast.setModiTime(now); |
| | | |
| | | if (!agvWrkMastService.insertByIncrease(wrkMast)) { |
| | | throw new CoolException("保存工作档失败"); |
| | | } |
| | | |
| | | wrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", locNo).eq("source_loc_no",sourceLocNo).eq("barcode",barcode).orderBy("modi_time",false)); |
| | | |
| | | return wrkMast; |
| | | } |
| | | |
| | | } |