| | |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.Cools; |
| | | import com.zy.asrs.entity.AgvLocDetl; |
| | | import com.zy.asrs.entity.AgvWaitPakin; |
| | | import com.zy.asrs.entity.AgvWrkDetl; |
| | | import com.zy.asrs.entity.AgvWrkMast; |
| | | import com.core.common.R; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.task.AbstractHandler; |
| | | import com.zy.asrs.task.core.ReturnT; |
| | | import lombok.Synchronized; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Slf4j |
| | | @Service |
| | | public class AgvWrkMastHandler extends AbstractHandler<String> { |
| | | |
| | | @Value("${agvBasDev.maxWorkNum}") |
| | | private int maxWrokNum; |
| | | |
| | | @Autowired |
| | | AgvWrkMastService agvWrkMastService; |
| | | private AgvWrkMastService agvWrkMastService; |
| | | @Autowired |
| | | AgvLocMastService agvLocMastService; |
| | | private AgvLocMastService agvLocMastService; |
| | | @Autowired |
| | | AgvLocDetlService agvLocDetlService; |
| | | private AgvLocDetlService agvLocDetlService; |
| | | @Autowired |
| | | AgvWrkMastLogService agvWrkMastLogService; |
| | | private AgvWrkMastLogService agvWrkMastLogService; |
| | | @Autowired |
| | | AgvWrkDetlService agvWrkDetlService; |
| | | private AgvWrkDetlService agvWrkDetlService; |
| | | @Autowired |
| | | AgvWrkDetlLogService agvWrkDetlLogService; |
| | | private AgvWrkDetlLogService agvWrkDetlLogService; |
| | | @Autowired |
| | | AgvWaitPakinService agvWaitPakinService; |
| | | private AgvWaitPakinService agvWaitPakinService; |
| | | @Autowired |
| | | AgvWaitPakinLogService agvWaitPakinLogService; |
| | | private AgvWaitPakinLogService agvWaitPakinLogService; |
| | | @Autowired |
| | | OrderService orderService; |
| | | private OrderService orderService; |
| | | @Autowired |
| | | private AgvBasDevpService agvBasDevpService; |
| | | @Autowired |
| | | private AgvWorkService agvWorkService; |
| | | |
| | | @Transactional |
| | | public ReturnT<String> completedPutWayWrk(AgvWrkMast agvWrkMast) { |
| | | int wrkNo = agvWrkMast.getWrkNo(); |
| | | String barcode = agvWrkMast.getBarcode(); |
| | | String orderNo = getOrderNoByWrkNo(wrkNo); |
| | | String agvBasDevp = ""; |
| | | if (agvWrkMast.getIoType() > 100) { |
| | | agvBasDevp = agvWrkMast.getLocNo(); |
| | | } else { |
| | | agvBasDevp = agvWrkMast.getSourceLocNo(); |
| | | } |
| | | |
| | | //修改工作档状态为206.库存更新完成 |
| | | agvWrkMast.setWrkSts(206L); |
| | | |
| | | //修改工作档状态为207.库存更新完成 |
| | | agvWrkMast.setWrkSts(207L); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | //修改目标库位状态为F.在库 |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"F"); |
| | | // 空板入库 设置库位状态为D.空桶/空栈板 |
| | | String locSts = agvWrkMast.getIoType() == 10 ? "D" : "F"; |
| | | if (agvWrkMast.getIoType() == 10 || agvWrkMast.getIoType() == 109) { |
| | | if (agvWrkMast.getIoType() == 109 && agvWrkMast.getLocNo().substring(0,2).equals("DB")) { |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"R",agvWrkMast.getBarcode(),agvWrkMast.getWhsType().shortValue()); |
| | | } else { |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"D",agvWrkMast.getBarcode(),agvWrkMast.getWhsType().shortValue()); |
| | | } |
| | | } else { |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"F",agvWrkMast.getBarcode(),agvWrkMast.getWhsType().shortValue()); |
| | | } |
| | | |
| | | //生成AGV工作历史档 |
| | | agvWrkMastLogService.save(wrkNo); |
| | | agvWrkMastLogService.save(agvWrkMast); |
| | | //生成AGV工作明细历史档 |
| | | agvWrkDetlLogService.save(wrkNo); |
| | | //类型为入库时 |
| | | if(agvWrkMast.getIoType() == 1){ |
| | | //更新目标库位明细 |
| | | log.info("更新目标库位明细 agvWrkMast.getLocNo(): " + agvWrkMast.getLocNo() + ", wrkNo: " + wrkNo); |
| | | agvLocDetlService.addLocDetlInfo(agvWrkMast.getLocNo(),wrkNo); |
| | | //生成入库通知历史档 |
| | | boolean save = agvWaitPakinLogService.save(barcode); |
| | | //删除入库通知档 |
| | | log.info("删除入库通知档 supp_code: " + barcode); |
| | | agvWaitPakinService.delete(new EntityWrapper<AgvWaitPakin>().eq("supp_code",barcode)); |
| | | } |
| | | //类型为库位移转时 |
| | | if(agvWrkMast.getIoType() == 11 || agvWrkMast.getIoType() == 12){ |
| | | //更新库存明细 |
| | | agvLocDetlService.updateStock(agvWrkMast.getSourceLocNo(),agvWrkMast.getLocNo()); |
| | | //修改源库位状态为O |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","",null); |
| | | } |
| | | |
| | | //类型为库位移转时 |
| | | if(agvWrkMast.getIoType() == 108){ |
| | | //更新库存明细 |
| | | agvLocDetlService.updateStock(agvWrkMast.getSourceLocNo(),agvWrkMast.getLocNo()); |
| | | //修改源库位状态为O |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","",agvWrkMast.getWhsType().shortValue(),"",(short)0); |
| | | } |
| | | |
| | | if(agvWrkMast.getIoType() == 109){ |
| | | if (agvWrkMast.getSourceLocNo().substring(0,2).equals("DB")) { |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(),"O","",(short)0); |
| | | } else { |
| | | //修改源库位状态为O |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","",agvWrkMast.getWhsType().shortValue(),"",(short)0); |
| | | // 新建工作档 |
| | | Date now = new Date(); |
| | | createWrkMast(109, 201L, agvWrkMast.getLocNo(), "", agvWrkMast.getBarcode(), now, 9527L, agvWrkMast.getWhsType(), 0); |
| | | } |
| | | } |
| | | if (agvWrkMast.getIoType() == 58) { |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(),"O","",agvWrkMast.getWhsType().shortValue()); |
| | | } |
| | | |
| | | |
| | | |
| | | //删除AGV工作档 |
| | | agvWrkMastService.deleteById(wrkNo); |
| | | //删除AGV工作明细档 |
| | | agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo)); |
| | | if(agvWrkMast.getIoType() == 1){ |
| | | //更新目标库位明细 |
| | | agvLocDetlService.addLocDetlInfo(agvWrkMast.getLocNo(),wrkNo); |
| | | //生成入库通知历史档 |
| | | agvWaitPakinLogService.save(barcode); |
| | | //删除入库通知档 |
| | | agvWaitPakinService.delete(new EntityWrapper<AgvWaitPakin>().eq("zpallet",barcode)); |
| | | |
| | | } |
| | | if(!isJSON(orderNo)){ |
| | | //检查订单是否已完成 |
| | | orderService.checkComplete(orderNo); |
| | |
| | | |
| | | return SUCCESS; |
| | | } |
| | | |
| | | |
| | | @Transactional |
| | | public ReturnT<String> completedCarryWrk(AgvWrkMast agvWrkMast) { |
| | | int wrkNo = agvWrkMast.getWrkNo(); |
| | | String orderNo = getOrderNoByWrkNo(wrkNo); |
| | | //修改工作档状态为206.库存更新完成 |
| | | agvWrkMast.setWrkSts(206L); |
| | | //修改工作档状态为207.库存更新完成 |
| | | agvWrkMast.setWrkSts(207L); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | //修改源库位状态为O |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O"); |
| | | //更新目标库位明细 |
| | | agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvWrkMast.getSourceLocNo())); |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","",null); |
| | | if(agvWrkMast.getIoType() == 101){ |
| | | //更新目标库位明细 101.出库 删除源库位库存明细 |
| | | agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvWrkMast.getSourceLocNo())); |
| | | //生成空板入库任务 |
| | | Short containerType = Short.valueOf(agvWrkMast.getBarcode().substring(0, 2)); |
| | | try { |
| | | agvWorkService.emptyPlateIn(agvWrkMast.getLocNo(),agvWrkMast.getBarcode(),containerType,9527L,true); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | log.error(e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | //生成AGV工作历史档 |
| | | agvWrkMastLogService.save(wrkNo); |
| | | agvWrkMastLogService.save(agvWrkMast); |
| | | //生成AGV工作明细历史档 |
| | | agvWrkDetlLogService.save(wrkNo); |
| | | //删除AGV工作档 |
| | |
| | | } |
| | | |
| | | @Transactional |
| | | public ReturnT<String> startPutWayWrk(List<AgvWrkMast> agvWrkMastList) throws IOException { |
| | | |
| | | int startWwrkCode = agvWrkMastService.startWrk(agvWrkMastList,"putaway"); |
| | | |
| | | int code = agvWrkMastService.containerMove(agvWrkMastList); |
| | | |
| | | if(code == 0){ |
| | | agvWrkMastList.forEach(agvWrkMast -> { |
| | | //202.RCS取货中 |
| | | agvWrkMast.setWrkSts((long)202); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | if(agvWrkMast.getIoType() == 1){ |
| | | //修改AGV入库通知档状态入出状态为Y |
| | | agvWaitPakinService.updateIoStatus(agvWrkMast.getWrkNo(),"Y"); |
| | | } |
| | | |
| | | }); |
| | | //agvWrkMastService.updateBatchById(agvWrkMastList); |
| | | |
| | | return SUCCESS; |
| | | public ReturnT<String> completedCarryWrk2(AgvWrkMast agvWrkMast) { |
| | | int wrkNo = agvWrkMast.getWrkNo(); |
| | | String orderNo = getOrderNoByWrkNo(wrkNo); |
| | | String agvBasDevp = ""; |
| | | if (agvWrkMast.getIoType() > 100) { |
| | | agvBasDevp = agvWrkMast.getLocNo(); |
| | | } else { |
| | | agvBasDevp = agvWrkMast.getSourceLocNo(); |
| | | } |
| | | //修改工作档状态为207.库存更新完成 |
| | | agvWrkMast.setWrkSts(207L); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | //修改源库位状态为O |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","",null); |
| | | if(agvWrkMast.getIoType() == 101){ |
| | | //更新目标库位明细 101.出库 删除源库位库存明细 |
| | | agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvWrkMast.getSourceLocNo())); |
| | | } |
| | | |
| | | return FAIL; |
| | | //生成AGV工作历史档 |
| | | agvWrkMastLogService.save(agvWrkMast); |
| | | //生成AGV工作明细历史档 |
| | | agvWrkDetlLogService.save(wrkNo); |
| | | //删除AGV工作档 |
| | | agvWrkMastService.deleteById(wrkNo); |
| | | //删除AGV工作明细档 |
| | | agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo)); |
| | | if(!isJSON(orderNo)){ |
| | | //检查订单是否已完成 |
| | | orderService.checkComplete(orderNo); |
| | | }else{ |
| | | List<Map> maps = JSONArray.parseArray(orderNo, Map.class); |
| | | maps.forEach(map -> { |
| | | String o = map.get("orderNo").toString(); |
| | | orderService.checkComplete(o); |
| | | }); |
| | | } |
| | | return SUCCESS; |
| | | } |
| | | |
| | | @Transactional |
| | | public ReturnT<String> startCarryWrk(List<AgvWrkMast> agvWrkMastList) throws IOException { |
| | | int code = agvWrkMastService.startWrk(agvWrkMastList,"carry"); |
| | | if(code == 0){ |
| | | agvWrkMastList.forEach(agvWrkMast -> { |
| | | //202.RCS取货中 |
| | | agvWrkMast.setWrkSts((long)202); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | }); |
| | | //agvWrkMastService.updateBatchById(agvWrkMastList); |
| | | @Synchronized |
| | | public ReturnT<String> startPutWayWrk(AgvWrkMast agvWrkMast) throws IOException { |
| | | |
| | | return SUCCESS; |
| | | //下发任务 |
| | | int startWrkCode = agvWrkMastService.startWrk(agvWrkMast); |
| | | if(startWrkCode != 0){ |
| | | throw new CoolException("任务下发失败"); |
| | | } |
| | | |
| | | return FAIL; |
| | | agvWrkMast.setWrkSts(202L); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | if(agvWrkMast.getIoType() == 1){ |
| | | //修改AGV入库通知档状态入出状态为Y |
| | | agvWaitPakinService.updateIoStatus(agvWrkMast.getWrkNo(),"Y"); |
| | | } |
| | | return SUCCESS; |
| | | |
| | | } |
| | | |
| | | @Transactional |
| | | @Synchronized |
| | | public ReturnT<String> startAllcationIn(AgvWrkMast agvWrkMast) throws IOException { |
| | | |
| | | //下发任务 |
| | | int startWrkCode = agvWrkMastService.startAllcationIn(agvWrkMast); |
| | | if(startWrkCode != 0){ |
| | | throw new CoolException("任务下发失败"); |
| | | } |
| | | return SUCCESS; |
| | | |
| | | } |
| | | |
| | | // @Transactional |
| | | // public ReturnT<String> startCarryWrk(AgvWrkMast agvWrkMast) throws IOException { |
| | | // //log.info(agvWrkMastList.toString()); |
| | | // //任务过滤,过滤掉已存在相同目标库位的工作档 |
| | | // //agvWrkMastList = filter(agvWrkMastList); |
| | | // int code = agvWrkMastService.startWrk(agvWrkMast); |
| | | // //log.info(agvWrkMastList.toString()); |
| | | // if (Cools.isEmpty(agvWrkMastList)){ |
| | | // return SUCCESS; |
| | | // } |
| | | // if(code == 0){ |
| | | // agvWrkMastList.forEach(agvWrkMast -> { |
| | | // //202.RCS取货中 |
| | | // agvWrkMast.setWrkSts(202L); |
| | | // agvWrkMastService.updateById(agvWrkMast); |
| | | // }); |
| | | // //agvWrkMastService.updateBatchById(agvWrkMastList); |
| | | // |
| | | // return SUCCESS; |
| | | // } |
| | | // |
| | | // return FAIL; |
| | | // } |
| | | |
| | | @Synchronized |
| | | @Transactional |
| | | public ReturnT<String> dealWatiWrk(List<AgvWrkMast> agvWrkMastList) throws IOException { |
| | | |
| | | agvWrkMastList.forEach(agvWrkMast -> { |
| | | //查询该站点所有暂存位在工作档中出现的次数 |
| | | List<Map<String, Object>> devNoMaps = agvBasDevpService.selectDevNoAndNumBystationCode(agvWrkMast.getLocNo()); |
| | | //取第一个暂存位,并查询其次数与配置的次数做比较 |
| | | Map<String, Object> devNoMap = devNoMaps.get(0); |
| | | if((int)devNoMap.get("num") < maxWrokNum){ |
| | | agvWrkMast.setLocNo(devNoMap.get("dev_no").toString()); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | log.info("after:" + devNoMap.toString() + ", wrkNo:" + agvWrkMast.getWrkNo() + ", locNo: " + agvWrkMast.getLocNo()); |
| | | } |
| | | }); |
| | | |
| | | return SUCCESS; |
| | | } |
| | | |
| | | @Synchronized |
| | | @Transactional |
| | | public ReturnT<String> autoEmptyOut(AgvBasDevp agvBasDevp) { |
| | | |
| | | agvWorkService.emptyPlateOut(agvBasDevp.getDevNo(),0,9527L); |
| | | |
| | | return SUCCESS; |
| | | } |
| | | |
| | | private String getOrderNoByWrkNo(int wrkNo){ |
| | | AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", wrkNo)); |
| | | if(Cools.isEmpty(agvWrkDetl)){ |
| | | return null; |
| | | } |
| | | return agvWrkDetl.getOrderNo(); |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | String order = "[{\"anfme\":50.0,\"orderNo\":\"CS110011001111\"},{\"anfme\":50.0,\"orderNo\":\"CS110011001110\"}]"; |
| | | List<Map> maps = JSONArray.parseArray(order, Map.class); |
| | | maps.forEach(map -> { |
| | | Object orderNo = map.get("orderNo"); |
| | | System.out.println(orderNo ); |
| | | }); |
| | | } |
| | | |
| | | private boolean isJSON(String str) { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | private List<AgvWrkMast> filter(List<AgvWrkMast> agvWrkMastList){ |
| | | return agvWrkMastList.stream().filter(agvWrkMast -> { |
| | | AgvWrkMast agvWrkMastWroking = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("source_loc_no", agvWrkMast.getLocNo())); |
| | | if(!Cools.isEmpty(agvWrkMastWroking) && agvWrkMastWroking.getWrkSts()<=202){ |
| | | System.out.println("source_loc_no > 1"); |
| | | return false; |
| | | } |
| | | log.info(agvWrkMast.toString()); |
| | | int num = agvWrkMastService.selectCount(new EntityWrapper<AgvWrkMast>().eq("loc_no", agvWrkMast.getLocNo())); |
| | | return num <= maxWrokNum; |
| | | }).collect(Collectors.toList()); |
| | | } |
| | | |
| | | /* |
| | | 生成工作档 |
| | | */ |
| | | 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; |
| | | } |
| | | } |