diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/TaskService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/TaskService.java index 5b83789..31aced6 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/TaskService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/TaskService.java @@ -205,15 +205,6 @@ public interface TaskService { */ void materialPick(); - - /** - * 定时任务轮询出库单叫料 - * - * @param pick 出库单 - */ - void callJlTask(Pick pick); - - /** * 分配任务 * diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java index 90d40e2..c6c75cc 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java @@ -32,6 +32,7 @@ import com.youchain.businessdata.service.dto.TaskDto; import com.youchain.businessdata.service.dto.TaskQueryCriteria; import com.youchain.businessdata.service.mapstruct.TaskMapper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.domain.Page; @@ -249,76 +250,6 @@ public class TaskServiceImpl implements TaskService { } } - - @Override - @Transactional(rollbackFor = Exception.class) - public void callJlTask(Pick pick) { - - //终点 - Set endPointList = new HashSet<>(Arrays.asList(pick.getCallPoint().split(","))); - - //根据成品和单品分别生成叫料任务 - if (BaseStatus.GD_TYPE_DP.equals(pick.getOrderType())) { - callDP(pick, endPointList); - } else { - callCT(pick, endPointList); - } - - } - - public void callCT(Pick pick, Set endPoints) { - - List taskList = new ArrayList<>(); - - //根据目标托盘进行分组,每次最多送两个托盘 - Map> groupMap = taskList.stream().collect(Collectors.groupingBy(Task::getDstStockCode)); - for (Map.Entry> entry : groupMap.entrySet()) { - String dstStockCode = entry.getKey();//容器 - List tasks = entry.getValue();//任务 - for (String endPointCode : endPoints) { - if (agvTaskService.isStockAvailable(dstStockCode, BizStatus.CALL_PICK, "RACK_MOVE")) { - if (agvTaskService.findByEndSlotCode(endPointCode, BizStatus.CALL_PICK, "RACK_MOVE")) { - Stock stock = stockService.findByCode(dstStockCode); - AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.CALL_PICK, stock, stock.getPoint().getCode(), endPointCode, "RACK_MOVE"); - for (Task task : tasks) { - task.setCallAgvTaskId(agvTask.getId()); - taskRepository.save(task); - } - agvTask.setLineSlotCode(pick.getCode()); - agvTaskService.update(agvTask); - } - } - } - - } - - } - - public void callDP(Pick pick, Set endPoints) { - List taskList = this.findByPickAllTask(pick.getId()); - if (taskList.isEmpty()) { - String logMessage = pick.getGdCode() + "工单没有进行翻包!"; - if (!lastPollLogMessages.containsKey(logMessage)) { - logService.saveLogInfo(pick.getGdCode(), pick.getGdCode(), "/pick/callJlTask", logMessage, "生成叫料任务", 200, "info"); - addLog(logMessage); - } - return; - } - for (Task task : taskList) { - for (String endPointCode : endPoints) { - if (agvTaskService.isStockAvailable(task.getDstStockCode(), BizStatus.CALL_PICK, "RACK_MOVE")) { - if (agvTaskService.findByEndSlotCode(endPointCode, BizStatus.CALL_PICK, "RACK_MOVE")) { - AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.CALL_PICK, task.getDstStock(), task.getDstPointCode(), endPointCode, "RACK_MOVE"); - agvTask.setLineSlotCode(pick.getCode()); - agvTaskService.update(agvTask); - task.setCallAgvTaskId(agvTask.getId()); - taskRepository.save(task); - } - } - } - } - } - @Override @Transactional(rollbackFor = Exception.class) public String allocate(long id, double quantity) { @@ -367,17 +298,22 @@ public class TaskServiceImpl implements TaskService { // 未分配数量 double unQty = quantity; Set tps = new HashSet<>(); + Map containerPointMap = new HashMap<>(); // 记录每个容器对应的点位 for (Inventory inv : inventoryList) { // 判断托盘是否有任务 synchronized (inv.getId()) { + if (unQty == 0) { + break; + } if (this.existsByStock(pick.getCode(), inv.getStockCode()) >= 1) { tps.add(inv.getStockCode()); continue; } - //查询翻包区是否有空闲点位 - List pointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, boxAreaName); - if (pointList.isEmpty()) { + //一个托盘对应一个点位 + Long stockId= inv.getStock().getId(); + Point endPoint = getEndPoint(stockId,containerPointMap, boxAreaName); + if(endPoint==null){ String logMessage = pick.getCode() + "明细分配失败," + (BaseStatus.GD_TYPE_CT.equals(pick.getOrderType()) ? "小件" : "大件") + "翻包区没有空闲点位!"; if (!lastPollLogMessages.containsKey(logMessage)) { logService.saveLogInfo(pick.getCode(), pick.getCode(), "/pick/allocatePick", logMessage, "出库单分配", 200, "info"); @@ -385,23 +321,7 @@ public class TaskServiceImpl implements TaskService { } return logMessage; } - Point endPoint = null; - //大件一个明细可以对应多个点位;小件一个明细只能对应一个点位 - if (BaseStatus.GD_TYPE_CT.equals(pick.getOrderType())) { - if (pickDetail.getPoint() == null) { - endPoint = pointList.get(0); - } else { - endPoint = pickDetail.getPoint(); - } - } else { - endPoint = pointList.get(0); - } - // 起点 - Point startPoint = inv.getPoint(); - if (unQty == 0) { - break; - } // 库存可用数量 allocateQty = inv.getQuantity() - inv.getQueuedQty(); if (allocateQty <= 0) { @@ -416,14 +336,15 @@ public class TaskServiceImpl implements TaskService { unQty -= allocateQty; /* 更新出库单明细状态*/ pickDetail.setAllocatedQty(pickDetail.getAllocatedQty() + allocateQty); - pickDetail.setPoint(endPoint); pickDetailService.update(pickDetail); // 生成Task任务 - Task task = this.createTask(item, allocateQty, inv.getItemKey(), null, BizStatus.PICK, pickDetail, inv.getId(), inv.getStock(), startPoint, endPoint, null); + this.createTask(item, allocateQty, inv.getItemKey(), null, BizStatus.PICK, pickDetail, inv.getId(), inv.getStock(), inv.getPoint(), endPoint, null); //占用点位 pointService.usedPoint(endPoint); + + containerPointMap.put(stockId, endPoint); } } @@ -434,6 +355,35 @@ public class TaskServiceImpl implements TaskService { } + //获取翻包区点位 + private Point getEndPoint(Long stockId,Map containerPointMap,String boxAreaName){ + + //查询翻包区是否有空闲点位 + List pointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, boxAreaName); + if (CollectionUtils.isEmpty(pointList)) { + return null; + } + + Point endPoint = null; + //大件一个托盘对应一个点位;小件一种物料一个点位 + if (containerPointMap.containsKey(stockId)) { + endPoint = containerPointMap.get(stockId); + } else { + // 筛选出未使用的点位 + List availablePoints = new ArrayList<>(); + for (Point point : pointList) { + if (!containerPointMap.containsValue(point)) { + availablePoints.add(point); + } + } + if (CollectionUtils.isEmpty(availablePoints)) { + return null; + } + endPoint = availablePoints.get(0); + } + return endPoint; + } + // 增加物料可替代性判断 private boolean isReplaceableMaterial(String material) { diff --git a/youchain-system/src/main/java/com/youchain/modules/quartz/task/blTask.java b/youchain-system/src/main/java/com/youchain/modules/quartz/task/blTask.java index 3ed1c19..70417a0 100644 --- a/youchain-system/src/main/java/com/youchain/modules/quartz/task/blTask.java +++ b/youchain-system/src/main/java/com/youchain/modules/quartz/task/blTask.java @@ -2,6 +2,7 @@ package com.youchain.modules.quartz.task; import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.domain.Stock; +import com.youchain.basicdata.service.PointService; import com.youchain.basicdata.service.StockService; import com.youchain.businessdata.domain.AgvTask; import com.youchain.businessdata.service.AgvTaskService; @@ -9,6 +10,7 @@ import com.youchain.businessdata.service.KMReService; import com.youchain.businessdata.service.PickService; import com.youchain.businessdata.service.TaskService; import com.youchain.exception.BadRequestException; +import com.youchain.utils.BaseStatus; import com.youchain.utils.BizStatus; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -39,6 +41,9 @@ public class blTask { @Autowired public KMReService kmReService; + @Autowired + public PointService pointService; + // 定义异常信息常量 private static final String NO_EMPTY_SHELVES_ERROR_MSG = "没有备料任务!"; @@ -62,11 +67,6 @@ public class blTask { } private void processAgvTask(AgvTask agvTask) { - //目标点没有托盘继续下发下一个任务 - String endSlotCode = agvTask.getEndSlotCode(); - boolean isTaskFound = agvTaskService.findByCcEndSlotCode(endSlotCode, BizStatus.PICK, "FORKLIFT_MOVE"); - if (isTaskFound) { - kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskCcJson(agvTask)); - } + kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskCcJson(agvTask)); } } diff --git a/youchain-system/src/test/java/com/youchain/EladminSystemApplicationTests.java b/youchain-system/src/test/java/com/youchain/EladminSystemApplicationTests.java index d3d9a98..9f0201d 100644 --- a/youchain-system/src/test/java/com/youchain/EladminSystemApplicationTests.java +++ b/youchain-system/src/test/java/com/youchain/EladminSystemApplicationTests.java @@ -4,6 +4,7 @@ import com.youchain.basicdata.domain.BigItem; import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.vo.BarCodeVo; import com.youchain.businessdata.domain.PickDetail; +import com.youchain.businessdata.domain.Task; import com.youchain.exception.BadRequestException; import com.youchain.utils.BaseStatus; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; @@ -26,17 +27,52 @@ public class EladminSystemApplicationTests { public void contextLoads() { } - public static void main(String[] args) { - String pointCode = "QXJL002"; - String currentCallPoint="QXJL001,QXJL002,QXJL001"; - Set callPointSet = new HashSet<>(Arrays.asList(currentCallPoint.split(","))); - callPointSet.add(pointCode); - String newCallPoint = String.join(",", callPointSet); - System.out.println(newCallPoint); + static class Task { + private int id; + private String dstStockCode; + public int getId() { + return id; + } + + public String getDstStockCode() { + return dstStockCode; + } + + public Task(int id, String dstStockCode) { + this.id = id; + this.dstStockCode = dstStockCode; + } } - public void cc1(){ + public static void main(String[] args) { + List taskList = Arrays.asList( + new Task(1, "1001"), + new Task(2, "1001"), + new Task(3, "1002"), + new Task(4, "1002"), + new Task(5, "1003") + ); + Map> groupMap = taskList.stream().collect(Collectors.groupingBy(Task::getDstStockCode,LinkedHashMap::new, Collectors.toList())); + + if (groupMap.size() > 2) { + groupMap = groupMap.entrySet().stream() + .limit(2) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, + (existing, replacement) -> existing, LinkedHashMap::new)); + + } + // 打印结果 + groupMap.forEach((key, tasks) -> { + System.out.println("Key: " + key); + tasks.forEach(task -> System.out.println(" Task ID: " + task.getId() + ", Group ID: " + task.getDstStockCode())); + }); + + + System.out.println(groupMap.size()); + } + + public void cc1() { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); // 设置服务接口 factory.setServiceClass(TestService.class); @@ -46,7 +82,7 @@ public class EladminSystemApplicationTests { String result = testService.pickAndPost("123"); } - public void cc(){ + public void cc() { // 创建一个 HashSet 实例 Set hashSet = new HashSet<>(); // 向集合中添加元素 @@ -68,9 +104,9 @@ public class EladminSystemApplicationTests { // 打印移除元素后的集合 String result = hashSet.stream() .collect(Collectors.joining(", ")); - if(result.isEmpty()){ + if (result.isEmpty()) { System.out.println("kong"); - }else{ + } else { System.out.println(result); } }