diff --git a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/StockServiceImpl.java b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/StockServiceImpl.java index e633e31..91d428b 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/StockServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/StockServiceImpl.java @@ -344,9 +344,7 @@ public class StockServiceImpl implements StockService { List asnDetails = asnDetailService.existsByboxNumber(barNumbers); if (!asnDetails.isEmpty()) { Set newBarNumbers = asnDetails.stream().map(AsnDetail::getOrderNumber).collect(Collectors.toSet()); - // 取barNumbers和newBarNumbers的差集,即为重复的箱号 - Set diffBarNumbers = barNumbers.stream().filter(boxNumber -> !newBarNumbers.contains(boxNumber)).collect(Collectors.toSet()); - throw new RuntimeException("箱号已入库,请勿重复入库:" + diffBarNumbers); + throw new RuntimeException("箱号已入库,请勿重复入库:" + newBarNumbers); } } @@ -687,7 +685,7 @@ public class StockServiceImpl implements StockService { private void moveInventory(Task task, Stock dstStock, double moveQty) { //将占用数量移位,原库存回库内 - Inventory inventory = task.getInventory(); + Inventory inventory = inventoryRepository.findById(task.getInvId()).get(); inventory.setQueuedQty(inventory.getQueuedQty() - moveQty); inventory.setQuantity(inventory.getQuantity() - moveQty); inventoryRepository.save(inventory); @@ -702,7 +700,7 @@ public class StockServiceImpl implements StockService { newInventory.setQueuedQty(0d); newInventory.setDept(inventory.getDept()); inventoryRepository.save(newInventory); - task.setInventory(newInventory); + task.setInvId(newInventory.getId()); taskRepository.save(task); if (inventory.getQuantity() <= 0) { inventoryRepository.delete(inventory); diff --git a/youchain-system/src/main/java/com/youchain/businessdata/domain/Task.java b/youchain-system/src/main/java/com/youchain/businessdata/domain/Task.java index 2558be2..aaf48a9 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/domain/Task.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/domain/Task.java @@ -147,10 +147,9 @@ public class Task extends BaseEntity implements Serializable { @ApiModelProperty(value = "上架号") private String putCode; - @OneToOne - @JoinColumn(name = "inv_id") + @Column(name = "inv_id") @ApiModelProperty(value = "库存ID") - private Inventory inventory; + private Long invId; @OneToOne @JoinColumn(name = "dept_id") @@ -188,11 +187,11 @@ public class Task extends BaseEntity implements Serializable { * @param taskStatus-任务状态 * @param planQty-计划数量 * @param putCode-上架号 - * @param inventory-库存ID + * @param invId-库存ID * @param dept-仓库 * @param agvTask-AGV */ - public Task(Item item, ItemKey itemKey, String billCode, String taskType, AsnDetail asnDetail, Long moveDetailId, Long waveDetailId, PickDetail pickDetail, Stock srcStock, Stock dstStock, Point srcPoint, Point dstPoint, String srcStockCode, String dstStockCode, String srcPointCode, String dstPointCode, String invStatus, String taskStatus, Double planQty, String putCode, Inventory inventory, Dept dept, AgvTask agvTask) { + public Task(Item item, ItemKey itemKey, String billCode, String taskType, AsnDetail asnDetail, Long moveDetailId, Long waveDetailId, PickDetail pickDetail, Stock srcStock, Stock dstStock, Point srcPoint, Point dstPoint, String srcStockCode, String dstStockCode, String srcPointCode, String dstPointCode, String invStatus, String taskStatus, Double planQty, String putCode, Long invId, Dept dept, AgvTask agvTask) { this.item = item; this.itemKey = itemKey; this.billCode = billCode; @@ -213,7 +212,7 @@ public class Task extends BaseEntity implements Serializable { this.taskStatus = taskStatus; this.planQty = planQty; this.putCode = putCode; - this.inventory = inventory; + this.invId = invId; this.dept = dept; this.agvTask = agvTask; } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/dto/TaskDto.java b/youchain-system/src/main/java/com/youchain/businessdata/service/dto/TaskDto.java index 986d755..1eaff6e 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/dto/TaskDto.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/dto/TaskDto.java @@ -108,7 +108,7 @@ public class TaskDto implements Serializable { private String putCode; /** 库存 */ - private Inventory inventory; + private Long invId; /** 仓库ID */ private DeptDto dept; diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java index 4aa8ac1..c9194e9 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java @@ -353,7 +353,7 @@ public class AgvTaskServiceImpl implements AgvTaskService { } private void sendAgvTask(AgvTask agvTask, String json) { - String resultJson = HttpPostUtil.sendPostReq(UrlApi.submitMission(), json); + /*String resultJson = HttpPostUtil.sendPostReq(UrlApi.submitMission(), json); if (StringUtils.isEmpty(resultJson)) { throw new RuntimeException("AGV返回信息:下发任务接口调用失败!"); } @@ -363,8 +363,10 @@ public class AgvTaskServiceImpl implements AgvTaskService { } String code = resulObject.getString("code"); - String message = resulObject.getString("message"); - + String message = resulObject.getString("message");*/ + String resultJson = null; + String code = "0"; + String message = ""; if (!"0".equals(code)) { throw new RuntimeException("AGV返回信息:" + message); } else { @@ -401,6 +403,9 @@ public class AgvTaskServiceImpl implements AgvTaskService { case "CANCELED": handleCanceledTask(agvTask, containerCode);//容器取消 break; + case "RESEND": + handleResendTask(agvTask);//重新发送 + break; } } @@ -431,6 +436,7 @@ public class AgvTaskServiceImpl implements AgvTaskService { List taskList = taskService.getAgvTaskList(agvTask.getId()); switch (endAreaName) { case AreaNameDic.XJFBQ: + case AreaNameDic.DJFBQ: handleFBQ(taskList, stock, endPoint);//备料完成 break; case AreaNameDic.JLQ: @@ -470,80 +476,47 @@ public class AgvTaskServiceImpl implements AgvTaskService { update(agvTask); } - - /** - * 容器出场 - * - * @param containerCode - */ - @Transactional(rollbackFor = Exception.class) - public void containerOut(String containerCode) { - Stock stock = validateStock(containerCode);//验证容器 - validateAgvResponse(UrlApi.containerOut(), containerOutJson(stock.getCode()));//验证AGV返回信息 - clearInventory(stock);//清空库存 - Point point = stock.getPoint(); - point.setStatus(BaseStatus.FREE); - pointService.update(point); - stock.setStatus(BaseStatus.FREE); - stock.setPoint(null); - stockRepository.save(stock); - } - - /** - * 验证容器 - * - * @param stockCode - */ - private Stock validateStock(String stockCode) { - Stock stock = stockRepository.findByCode(stockCode, null); - if (stock == null) { - throw new RuntimeException("请扫描正确的容器!"); + private synchronized void handleResendTask(AgvTask agvTask) { + List repeatList = agvTaskRepository.findRepeat(agvTask.getStockCode()); + if (!repeatList.isEmpty()) { + throw new RuntimeException("任务已重新生成,请勿重复操作! "); } - return stock; + AgvTask newAgvTask = new AgvTask(); + newAgvTask.setStockCode(agvTask.getStockCode()); + newAgvTask.setStartSlotCode(agvTask.getStartSlotCode()); + newAgvTask.setEndSlotCode(agvTask.getEndSlotCode()); + newAgvTask.setSlotCode(agvTask.getSlotCode()); + newAgvTask.setStatus(BizStatus.OPEN); + newAgvTask.setType(agvTask.getType()); + newAgvTask.setJobType(agvTask.getJobType()); + newAgvTask.setJobPriority(1); + agvTaskRepository.save(newAgvTask); + + //重新发送任务 + List taskList = taskService.getAgvTaskList(agvTask.getId()); + for (Task task : taskList) { + task.setAgvTask(newAgvTask); + taskRepository.save(task); + } + + // 根据任务类型发送不同的实现 + switch (agvTask.getJobType()) { + case "FORKLIFT_MOVE": + sendAgvTaskCCImpl(newAgvTask); + break; + case "RACK_MOVE": + sendAgvTaskHJImpl(newAgvTask); + break; + case "ROLLER_MOVE": + sendAgvTaskGTImpl(newAgvTask); + break; + default: + throw new RuntimeException("任务类型不支持: " + agvTask.getJobType()); + } + + } - /** - * 验证AGV返回信息 - * - * @param jsonObject - */ - private void validateAgvResponse(String url, String jsonObject) { - /*String resultJson = HttpPostUtil.sendPostReq(url, jsonObject); - if (StringUtils.isEmpty(resultJson)) { - throw new RuntimeException("AGV返回信息:容器入场接口调用失败!"); - } - JSONObject resultObject = JSON.parseObject(resultJson); - if (resultObject == null) { - throw new RuntimeException("AGV返回信息:容器入场接口数据返回为空!"); - } - String code = resultObject.getString("code"); - String message = resultObject.getString("message"); - if (!"0".equals(code)) { - throw new RuntimeException("AGV返回信息:容器入场接口调用失败!" + message); - }*/ - } - - public synchronized String containerOutJson(String containerCode) { - JSONObject jsonObject = new JSONObject(new LinkedHashMap<>()); - jsonObject.put("requestId", String.valueOf(new Date().getTime()));//请求 id - jsonObject.put("containerType", "");//容器类型 - jsonObject.put("containerCode", containerCode);//容器编号 - jsonObject.put("position", "");//容器当前位置 - return jsonObject.toJSONString(); - } - - /** - * 清空库存 - * - * @param stock - */ - private void clearInventory(Stock stock) { - List inventoryList = inventoryService.queryInventory(stock); - Long[] ids = inventoryList.stream().map(Inventory::getId).toArray(Long[]::new); - if (ids.length > 0) { - inventoryService.deleteAll(ids); - } - } /** * 满车入库 @@ -677,12 +650,9 @@ public class AgvTaskServiceImpl implements AgvTaskService { for (Task task : taskList) { AsnDetail ad = task.getAsnDetail(); ad.setStatus(BizStatus.CANCEL); - ad.setStock(stock); asnDetailService.update(ad); task.setTaskStatus(BizStatus.CANCEL); - task.setSrcStock(stock); - task.setDstStock(stock); taskService.update(task); } //起点点位释放 diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickDetailServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickDetailServiceImpl.java index bee2ea3..92b970c 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickDetailServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickDetailServiceImpl.java @@ -23,7 +23,6 @@ import com.youchain.basicdata.service.dto.ItemDto; import com.youchain.basicdata.service.mapstruct.ItemMapper; import com.youchain.businessdata.domain.*; import com.youchain.businessdata.repository.*; -import com.youchain.businessdata.service.InventoryService; import com.youchain.businessdata.service.dto.InventoryDto; import com.youchain.modules.quartz.utils.TimeNumberUtils; import com.youchain.modules.system.domain.Dept; @@ -57,7 +56,7 @@ import javax.servlet.http.HttpServletResponse; public class PickDetailServiceImpl implements PickDetailService { private final PickDetailRepository pickDetailRepository; private final PickRepository pickRepository; - private final InventoryService inventoryService; + private final InventoryRepository inventoryRepository; private final TaskRepository taskRepository; private final AgvTaskRepository agvTaskRepository; private final ItemMapper itemMapper; @@ -146,7 +145,7 @@ public class PickDetailServiceImpl implements PickDetailService { return pick.getCode() + "出库单;" + item.getCode() + "数量已分配!"; } String areaCode = stockTypeToAreaMap.getValueByKey(item.getGoodType()); - List inventoryList = inventoryService.findByItemIdAndAreaCode(item.getId(), areaCode); + List inventoryList = inventoryRepository.findByItemIdAndAreaCode(item.getId(), areaCode); if (inventoryList.isEmpty()) { return pick.getCode() + "出库单;" + item.getCode() + "物料库存不足,请先补充库存!"; } @@ -173,7 +172,7 @@ public class PickDetailServiceImpl implements PickDetailService { allocateQty = unQty; } inv.setQueuedQty(inv.getQueuedQty() + allocateQty); - inventoryService.update(inv); + inventoryRepository.save(inv); unQty -= allocateQty; /* 更新出库单明细状态*/ pd.setAllocatedQty(pd.getAllocatedQty() + allocateQty); @@ -209,7 +208,7 @@ public class PickDetailServiceImpl implements PickDetailService { task.setInvStatus(inv.getStatus()); task.setTaskStatus(BizStatus.OPEN); task.setPlanQty(allocateQty); - task.setInventory(inv); + task.setInvId(inv.getId()); task.setDept(dept); taskRepository.save(task); } @@ -222,7 +221,7 @@ public class PickDetailServiceImpl implements PickDetailService { ItemDto itemDto = pickDetailDto.getItem(); Item item = itemMapper.toEntity(itemDto); Dept dept = item.getDept();//仓库 - List Inventorys = inventoryService.findByItemIdAndAreaCode(item.getId(), item.getGoodType()); + List Inventorys = inventoryRepository.findByItemIdAndAreaCode(item.getId(), item.getGoodType()); if (Inventorys.size() > 0) { Inventory inv = Inventorys.get(0); //库存冻结状态不允许出库 @@ -232,7 +231,7 @@ public class PickDetailServiceImpl implements PickDetailService { Stock stock = inv.getStock();//容器 Point startPoint = inv.getPoint();//起始点位 inv.setQueuedQty(inv.getQuantity()); - inventoryService.update(inv); + inventoryRepository.save(inv); pd.setAllocatedQty(inv.getQuantity()); pd.setOrderQty(pd.getAllocatedQty()); if (pd.getOrderQty().equals(pd.getAllocatedQty())) { @@ -258,10 +257,9 @@ public class PickDetailServiceImpl implements PickDetailService { List Tasks = taskRepository.findByPickNotAllTask(id); for (Task task : Tasks) { //根据Taskz找到对应的库存 - InventoryDto inventoryDto = inventoryService.findById(task.getInventory().getId()); - Inventory inv = inventoryService.toEntity(inventoryDto); + Inventory inv = inventoryRepository.findById(task.getInvId()).get(); inv.setQueuedQty(inv.getQueuedQty() - pd.getAllocatedQty()); - inventoryService.update(inv); + inventoryRepository.save(inv); //删除Task taskRepository.delete(task); diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickServiceImpl.java index af457cb..41661d0 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickServiceImpl.java @@ -355,6 +355,7 @@ public class PickServiceImpl implements PickService { agvTaskService.sendAgvTaskCCImpl(agvTask); } task.setAgvTask(agvTask); + task.setTaskStatus(agvTask.getStatus()); taskRepository.save(task); } /*更新出库单状态*/ 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 a59bff4..8f48fe1 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 @@ -154,7 +154,7 @@ public class TaskServiceImpl implements TaskService { task.setMoveQty(pickedQuantity); task.setTaskStatus(BizStatus.FINISH); taskRepository.save(task); - Inventory inv = inventoryRepository.findById(task.getInventory().getId()).get(); + Inventory inv = inventoryRepository.findById(task.getInvId()).get(); if (inv != null) { ItemKey itemKey = inv.getItemKey(); Item item = itemKey.getItem(); @@ -198,7 +198,7 @@ public class TaskServiceImpl implements TaskService { TaskDto taskDto = findById(taskId); Task task = taskMapper.toEntity(taskDto);//Dto转实体 PickDetail pickDetail = task.getPickDetail(); - Inventory inv = inventoryRepository.findById(task.getInventory().getId()).get(); + Inventory inv = inventoryRepository.findById(task.getInvId()).get(); if (inv != null) { //退回库存 double srcQty = inv.getQueuedQty();