package com.zy.asrs.task.handler; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.exception.CoolException; 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.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.List; import java.util.Map; import java.util.stream.Collectors; @Slf4j @Service public class AgvWrkMastHandler extends AbstractHandler { @Value("${agvBasDev.maxWorkNum}") private int maxWrokNum; @Autowired private AgvWrkMastService agvWrkMastService; @Autowired private AgvLocMastService agvLocMastService; @Autowired private AgvLocDetlService agvLocDetlService; @Autowired private AgvWrkMastLogService agvWrkMastLogService; @Autowired private AgvWrkDetlService agvWrkDetlService; @Autowired private AgvWrkDetlLogService agvWrkDetlLogService; @Autowired private AgvWaitPakinService agvWaitPakinService; @Autowired private AgvWaitPakinLogService agvWaitPakinLogService; @Autowired private OrderService orderService; @Autowired private AgvBasDevpService agvBasDevpService; @Transactional public ReturnT completedPutWayWrk(AgvWrkMast agvWrkMast) { int wrkNo = agvWrkMast.getWrkNo(); String barcode = agvWrkMast.getBarcode(); String orderNo = getOrderNoByWrkNo(wrkNo); //修改工作档状态为207.库存更新完成 agvWrkMast.setWrkSts(207L); agvWrkMastService.updateById(agvWrkMast); if(agvWrkMast.getIoType() == 10){ // 空板入库 设置库位状态为D.空桶/空栈板 agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"D",agvWrkMast.getBarcode()); }else{ //修改目标库位状态为F.在库 agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"F",agvWrkMast.getBarcode()); } //生成AGV工作历史档 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().eq("supp_code",barcode)); } //类型为库位移转时 if(agvWrkMast.getIoType() == 11){ //更新库存明细 agvLocDetlService.updateStock(agvWrkMast.getSourceLocNo(),agvWrkMast.getLocNo()); //修改源库位状态为O agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O",""); } //删除AGV工作档 agvWrkMastService.deleteById(wrkNo); //删除AGV工作明细档 agvWrkDetlService.delete(new EntityWrapper().eq("wrk_no",wrkNo)); if(!isJSON(orderNo)){ //检查订单是否已完成 orderService.checkComplete(orderNo); }else{ List maps = JSONArray.parseArray(orderNo, Map.class); maps.forEach(map -> { String o = map.get("orderNo").toString(); orderService.checkComplete(o); }); } return SUCCESS; } @Transactional public ReturnT completedCarryWrk(AgvWrkMast agvWrkMast) { int wrkNo = agvWrkMast.getWrkNo(); String orderNo = getOrderNoByWrkNo(wrkNo); //修改工作档状态为207.库存更新完成 agvWrkMast.setWrkSts(207L); agvWrkMastService.updateById(agvWrkMast); //修改源库位状态为O agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O",""); if(agvWrkMast.getIoType() == 101){ //更新目标库位明细 101.出库 删除源库位库存明细 agvLocDetlService.delete(new EntityWrapper().eq("loc_no",agvWrkMast.getSourceLocNo())); } //生成AGV工作历史档 agvWrkMastLogService.save(agvWrkMast); //生成AGV工作明细历史档 agvWrkDetlLogService.save(wrkNo); //删除AGV工作档 agvWrkMastService.deleteById(wrkNo); //删除AGV工作明细档 agvWrkDetlService.delete(new EntityWrapper().eq("wrk_no",wrkNo)); if(!isJSON(orderNo)){ //检查订单是否已完成 orderService.checkComplete(orderNo); }else{ List maps = JSONArray.parseArray(orderNo, Map.class); maps.forEach(map -> { String o = map.get("orderNo").toString(); orderService.checkComplete(o); }); } return SUCCESS; } @Transactional public ReturnT startPutWayWrk(List agvWrkMastList) throws IOException { //下发任务 int startWrkCode = agvWrkMastService.startWrk(agvWrkMastList,"putaway"); if(startWrkCode != 0){ throw new CoolException("任务下发失败"); } //下发容器入场指令 (缓存货架) int code = agvWrkMastService.containerMoveIn(agvWrkMastList); if(code == 0){ for(AgvWrkMast agvWrkMast : agvWrkMastList){ //下发容器达到通知 (输送线) if("Y".equals(agvWrkMast.getMk())){ int containerArrivedCode = agvWrkMastService.containerArrived(agvWrkMast); if(containerArrivedCode != 0){ log.error("容器到达指令下发失败"); continue; } } //202.RCS取货中 agvWrkMast.setWrkSts(202L); agvWrkMastService.updateById(agvWrkMast); if(agvWrkMast.getIoType() == 1){ //修改AGV入库通知档状态入出状态为Y agvWaitPakinService.updateIoStatus(agvWrkMast.getWrkNo(),"Y"); } } return SUCCESS; } return FAIL; } @Transactional public ReturnT startCarryWrk(List agvWrkMastList) throws IOException { //log.info(agvWrkMastList.toString()); //任务过滤,过滤掉已存在相同目标库位的工作档 //agvWrkMastList = filter(agvWrkMastList); int code = agvWrkMastService.startWrk(agvWrkMastList,"carry"); //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 dealWatiWrk(List agvWrkMastList) throws IOException { agvWrkMastList.forEach(agvWrkMast -> { //查询该站点所有暂存位在工作档中出现的次数 List> devNoMaps = agvBasDevpService.selectDevNoAndNumBystationCode(agvWrkMast.getLocNo()); //取第一个暂存位,并查询其次数与配置的次数做比较 Map 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; } private String getOrderNoByWrkNo(int wrkNo){ AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper().eq("wrk_no", wrkNo)); if(Cools.isEmpty(agvWrkDetl)){ return null; } return agvWrkDetl.getOrderNo(); } private boolean isJSON(String str) { if (Cools.isEmpty(str)) { return false; } else { str = str.trim(); if (str.startsWith("{") && str.endsWith("}")) { return true; } else if (str.startsWith("[") && str.endsWith("]")) { return true; } else { return false; } } } private List filter(List agvWrkMastList){ return agvWrkMastList.stream().filter(agvWrkMast -> { AgvWrkMast agvWrkMastWroking = agvWrkMastService.selectOne(new EntityWrapper().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().eq("loc_no", agvWrkMast.getLocNo())); return num <= maxWrokNum; }).collect(Collectors.toList()); } }