From ff228f6f88fc7b281bd299b780aaed05ee1aee65 Mon Sep 17 00:00:00 2001 From: "HUOJIN\\92525" <925258474@qq.com> Date: Mon, 29 Apr 2024 10:25:55 +0800 Subject: [PATCH] no message --- .../service/InventoryService.java | 2 + .../businessdata/service/MoService.java | 14 ---- .../businessdata/service/OrderService.java | 10 --- .../service/PickDetailService.java | 2 + .../service/impl/MlsServiceImpl.java | 84 ++++++++++++++----- .../service/impl/MoServiceImpl.java | 31 ------- .../service/impl/OrderServiceImpl.java | 31 ------- .../service/impl/PickDetailServiceImpl.java | 7 +- .../youchain/utils/BatchCreateOrUpdate.java | 80 ++++++++++++++++++ 9 files changed, 148 insertions(+), 113 deletions(-) create mode 100644 youchain-system/src/main/java/com/youchain/utils/BatchCreateOrUpdate.java diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/InventoryService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/InventoryService.java index fdd4047..0149eda 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/InventoryService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/InventoryService.java @@ -26,6 +26,8 @@ import com.youchain.businessdata.service.dto.InventoryDto; import com.youchain.businessdata.service.dto.InventoryQueryCriteria; import com.youchain.modules.system.domain.Dept; import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Async; + import java.util.Map; import java.util.List; import java.io.IOException; diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/MoService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/MoService.java index 51caac0..cc4cdaf 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/MoService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/MoService.java @@ -105,18 +105,4 @@ public interface MoService { * @return Map */ Map findBylabelNos(Set labelNos); - - /** - * 批量创建MO - * @param mos MO集合 - */ - @Async - void batchCreateMos(List mos); - - /** - * 批量修改MO - * @param mos MO集合 - */ - @Async - void batchUpdateMos(List mos); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/OrderService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/OrderService.java index 5908a29..0ecc18a 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/OrderService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/OrderService.java @@ -82,16 +82,6 @@ public interface OrderService { */ OrderDto create(Order resources); - /** - * 批量创建 - * @param orders 订单列表 - */ - @Async - void batchCreateOrders(List orders); - - @Async - void batchUpdateOrders(List orders); - /** * 编辑 * @param resources / diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/PickDetailService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/PickDetailService.java index 7a7244a..4d44cee 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/PickDetailService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/PickDetailService.java @@ -23,6 +23,8 @@ import com.youchain.businessdata.domain.PickDetail; import com.youchain.businessdata.service.dto.PickDetailDto; import com.youchain.businessdata.service.dto.PickDetailQueryCriteria; import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Async; + import java.util.Map; import java.util.List; import java.io.IOException; diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java index 6c8c9e5..03d7d8c 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java @@ -9,13 +9,9 @@ import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.domain.Stock; import com.youchain.basicdata.service.ItemService; import com.youchain.basicdata.service.PointService; -import com.youchain.basicdata.service.dto.ItemDto; import com.youchain.businessdata.domain.*; import com.youchain.businessdata.inputJson.*; import com.youchain.businessdata.service.*; -import com.youchain.businessdata.service.dto.MoDto; -import com.youchain.businessdata.service.dto.OrderDto; -import com.youchain.exception.handler.ApiResult; import com.youchain.modules.system.domain.Dept; import com.youchain.modules.system.service.DeptService; import com.youchain.modules.system.service.dto.DeptDto; @@ -36,12 +32,10 @@ public class MlsServiceImpl implements MlsService { private final ItemService itemService; private final DeptService deptService; private final MoService moService; - private final TaskService taskService; private final PointService pointService; - private final AgvTaskService agvTaskService; - private final PickDetailService pickDetailService; private final InventoryService inventoryService; private final RedisUtils redisUtils; + private final BatchCreateOrUpdate batchCreateOrUpdate; /** @@ -150,11 +144,11 @@ public class MlsServiceImpl implements MlsService { } //批量新增订单 if (!ordersToCreate.isEmpty()) { - orderService.batchCreateOrders(ordersToCreate); + batchCreateOrUpdate.batchCreate(ordersToCreate); } //批量更新订单 if (!ordersToUpdate.isEmpty()) { - orderService.batchUpdateOrders(ordersToUpdate); + batchCreateOrUpdate.batchUpdate(ordersToUpdate); } } @@ -283,6 +277,7 @@ public class MlsServiceImpl implements MlsService { //获取已存在的MO票 Map existingMos = moService.findBylabelNos(labelNos); + //获取仓库 Dept dept = null; boolean flag = redisUtils.hasKey("dept"); if (flag) { @@ -325,11 +320,11 @@ public class MlsServiceImpl implements MlsService { //批量新增Mo票 if (!mosToCreate.isEmpty()) { - moService.batchCreateMos(mosToCreate); + batchCreateOrUpdate.batchCreate(mosToCreate); } //批量更新Mo票 if (!mosToUpdate.isEmpty()) { - moService.batchUpdateMos(mosToUpdate); + batchCreateOrUpdate.batchUpdate(mosToUpdate); } } @@ -403,12 +398,12 @@ public class MlsServiceImpl implements MlsService { @Override @Transactional(rollbackFor = Exception.class) - public void getIssueInfo(IssueInfo issueInfo) { + public synchronized void getIssueInfo(IssueInfo issueInfo) { String taskNumber = issueInfo.getTaskNumber();//任务号 // 指定Set的类型 Set workOrderNameSet = issueInfo.getWorkOrderName(); if (workOrderNameSet.isEmpty()) { - throw new RuntimeException("没有获取到工单号!"); + throw new IllegalArgumentException("没有获取到工单号!"); } List inventoryList = inventoryService.findInvByBillCode(workOrderNameSet);//根据工单号查询库存信息 @@ -417,15 +412,30 @@ public class MlsServiceImpl implements MlsService { } //目标点 - Point endPoint = pointService.findByCode(null, null, null, "出库接驳口", null); + Point endPoint = null; + boolean flag = redisUtils.hasKey("endPoint"); + if (flag) { + endPoint = (Point) redisUtils.get("endPoint"); + } else { + endPoint = pointService.findByCode(null, null, null, "出库接驳口", null); + redisUtils.set("endPoint", endPoint, 0); + } + + List inventoryToUpdate = new ArrayList<>(); + List pickDetailToCreate = new ArrayList<>(); + List taskToCreate = new ArrayList<>(); + List agvTaskToCreate = new ArrayList<>(); + for (Inventory inv : inventoryList) { //根据库存信息生成叫料任务 Stock stock = inv.getStock();//容器 Point startPoint = inv.getPoint();//起始点位 Item item = inv.getItemKey().getItem(); - inv.setQueuedQty(inv.getQuantity()); - inventoryService.update(inv); + //更新库存信息 + inventoryToUpdate.add(updateInventory(inv)); + + //生成出库明细 PickDetail pd = new PickDetail(); pd.setItem(item); pd.setPo(inv.getBillCode()); @@ -434,22 +444,23 @@ public class MlsServiceImpl implements MlsService { pd.setOrderQty(inv.getQuantity()); pd.setAllocatedQty(inv.getQuantity()); pd.setStatus(BizStatus.ALLOCATE); - pickDetailService.create(pd); + pickDetailToCreate.add(pd); //生成搬运任务 AgvTask agvTask = new AgvTask(BizStatus.PICK, stock.getCode(), startPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "01"); - agvTaskService.create(agvTask); + agvTaskToCreate.add(agvTask); + //生成Task Task task = new Task(); task.setItem(item); task.setItemKey(inv.getItemKey()); task.setPickDetail(pd); task.setBillCode(taskNumber); - task.setSrcStock(inv.getStock()); - task.setDstStock(inv.getStock()); + task.setSrcStock(stock); + task.setDstStock(stock); task.setSrcPoint(startPoint); task.setDstPoint(endPoint); - task.setSrcStockCode(inv.getStock().getCode()); + task.setSrcStockCode(stock.getCode()); task.setSrcPointCode(startPoint.getCode()); task.setDstPointCode(endPoint.getCode()); task.setInvStatus(inv.getStatus()); @@ -459,12 +470,41 @@ public class MlsServiceImpl implements MlsService { task.setInvId(inv.getId()); task.setDept(item.getDept()); task.setAgvTask(agvTask); - taskService.create(task); + taskToCreate.add(task); + } + + //批量更新库存信息 + if (!inventoryToUpdate.isEmpty()) { + batchCreateOrUpdate.batchUpdate(inventoryToUpdate); + } + + if (!pickDetailToCreate.isEmpty()) { + batchCreateOrUpdate.batchCreate(pickDetailToCreate); + } + + if (!agvTaskToCreate.isEmpty()) { + batchCreateOrUpdate.batchCreate(agvTaskToCreate); + } + + if (!taskToCreate.isEmpty()) { + batchCreateOrUpdate.batchCreate(taskToCreate); } } + /** + * 更新库存信息 + * + * @param inventory + * @return + */ + private Inventory updateInventory(Inventory inventory) { + inventory.setQueuedQty(inventory.getQuantity()); + return inventory; + } + + /** * Mo票回传 * diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MoServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MoServiceImpl.java index 4212a03..6ddb96d 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MoServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MoServiceImpl.java @@ -233,37 +233,6 @@ public class MoServiceImpl implements MoService { return map; } - @Override - @Transactional(rollbackFor = Exception.class) - public void batchCreateMos(List mos) { - int batchSize = 50; // 根据需求调整批处理大小 - for (int i = 0; i < mos.size(); i++) { - entityManager.persist(mos.get(i)); - if (i % batchSize == 0 && i > 0) { - entityManager.flush(); // 批量提交 - entityManager.clear(); // 清理缓存 - } - } - entityManager.flush(); // 最后确保所有剩余的实体也被flush到数据库 - entityManager.clear(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void batchUpdateMos(List mos) { - int batchSize = 50; // 根据需求调整批处理大小 - for (int i = 0; i < mos.size(); i++) { - Mo mo = mos.get(i); - entityManager.merge(mo); // 更新实体 - if (i % batchSize == 0 && i > 0) { // 每处理50个实体执行一次flush和clear - entityManager.flush(); - entityManager.clear(); - } - } - entityManager.flush(); // 确保最后的更改也被写入数据库 - entityManager.clear(); // 清理持久化上下文以释放内存 - } - public void createTasks(Item item, Stock stock, Point srcPoint, Point endPoint, String propC1, MoDto moDto, OrderDto orderDto) { // 生成AGV任务 AgvTask agvTask = new AgvTask(BizStatus.ASN, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "RACK_MOVE_FULL"); diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/OrderServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/OrderServiceImpl.java index f9117e0..5d9721d 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/OrderServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/OrderServiceImpl.java @@ -121,37 +121,6 @@ public class OrderServiceImpl implements OrderService { return orderMapper.toDto(orderRepository.save(resources)); } - @Override - @Transactional(rollbackFor = Exception.class) - public void batchCreateOrders(List orders) { - int batchSize = 50; // 根据需求调整批处理大小 - for (int i = 0; i < orders.size(); i++) { - entityManager.persist(orders.get(i)); - if (i % batchSize == 0 && i > 0) { - entityManager.flush(); // 批量提交 - entityManager.clear(); // 清理缓存 - } - } - entityManager.flush(); // 最后确保所有剩余的实体也被flush到数据库 - entityManager.clear(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void batchUpdateOrders(List orders) { - int batchSize = 50; // 根据需求调整批处理大小 - for (int i = 0; i < orders.size(); i++) { - Order order = orders.get(i); - entityManager.merge(order); // 更新实体 - if (i % batchSize == 0 && i > 0) { // 每处理50个实体执行一次flush和clear - entityManager.flush(); - entityManager.clear(); - } - } - entityManager.flush(); // 确保最后的更改也被写入数据库 - entityManager.clear(); // 清理持久化上下文以释放内存 - } - @Override @Transactional(rollbackFor = Exception.class) public void update(Order resources) { 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 f3cfb4d..4dde063 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 @@ -68,7 +68,6 @@ import static org.springframework.http.HttpStatus.BAD_REQUEST; @Service @RequiredArgsConstructor public class PickDetailServiceImpl implements PickDetailService { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH"); private final PickDetailRepository pickDetailRepository; private final PickDetailMapper pickDetailMapper; private final InventoryService inventoryService; @@ -76,9 +75,7 @@ public class PickDetailServiceImpl implements PickDetailService { private final AgvTaskRepository agvTaskRepository; private final TaskRepository taskRepository; private final ItemService itemService; - private final PointService pointService; - private final StockRepository stockRepository; - private final EntityManager entityMapper; + private final EntityManager entityManager; @Override public Map queryAll(PickDetailQueryCriteria criteria, Pageable pageable) { @@ -316,7 +313,7 @@ public class PickDetailServiceImpl implements PickDetailService { " where DATE_FORMAT(d.createTime,'%Y-%m-%d')>='"+date+"' " + " group by DATE_FORMAT(d.createTime,'%Y-%m-%d')"; } - Query query=entityMapper.createQuery(hql); + Query query=entityManager.createQuery(hql); List ts=query.getResultList(); return ts; } diff --git a/youchain-system/src/main/java/com/youchain/utils/BatchCreateOrUpdate.java b/youchain-system/src/main/java/com/youchain/utils/BatchCreateOrUpdate.java new file mode 100644 index 0000000..bb00274 --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/utils/BatchCreateOrUpdate.java @@ -0,0 +1,80 @@ +package com.youchain.utils; + +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.List; + +@Component +public class BatchCreateOrUpdate { + + @PersistenceContext + private EntityManager entityManager; + + /** + * 批量插入实体。 + * + * @param entities 要插入的实体列表 + * @param 实体类型 + */ + @Async + @Transactional + public void batchCreate(List entities) { + int batchSize = 100; + if (entities == null || entities.isEmpty()) { + return; + } + + int i = 0; + for (T entity : entities) { + entityManager.persist(entity); + i++; + if (i % batchSize == 0) { + // 执行flush将实体状态同步到数据库,并清理持久化上下文 + entityManager.flush(); + entityManager.clear(); + } + } + + // 确保最后未达到batchSize的数据也能被flush到数据库 + if (i % batchSize != 0) { + entityManager.flush(); + entityManager.clear(); + } + } + + /** + * 批量更新实体。 + * + * @param entities 要更新的实体列表 + * @param 实体类型 + */ + @Async + @Transactional + public void batchUpdate(List entities) { + int batchSize = 100; + if (entities == null || entities.isEmpty()) { + return; + } + + int i = 0; + for (T entity : entities) { + entityManager.merge(entity); + i++; + if (i % batchSize == 0) { + // 执行flush和clear以同步状态到数据库并清理上下文,减少内存使用 + entityManager.flush(); + entityManager.clear(); + } + } + + if (i % batchSize != 0) { + entityManager.flush(); + entityManager.clear(); + } + } + +}