| | |
| | | import java.util.Collections; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.concurrent.atomic.AtomicBoolean; |
| | | |
| | | /** |
| | | * ASN 单据压测数据定时生成器。 |
| | |
| | | private static final Integer TENANT_ID = 1; |
| | | private static final Long USER_ID = 51L; |
| | | private static final String MEMO = "ASN_PRESSURE_TEST"; |
| | | private final AtomicBoolean running = new AtomicBoolean(false); |
| | | |
| | | @Autowired |
| | | private AsnOrderService asnOrderService; |
| | |
| | | |
| | | @Scheduled(cron = "${pressure.asn-order.cron:0/10 * * * * ?}") |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public synchronized void insertPressureOrders() { |
| | | public void insertPressureOrders() { |
| | | if (!enabled) { |
| | | return; |
| | | } |
| | | if (orderCountPerRun <= 0 || itemCountPerOrder <= 0 || itemQty <= 0) { |
| | | log.warn("ASN压测任务配置无效,跳过执行: orderCountPerRun={}, itemCountPerOrder={}, itemQty={}", |
| | | orderCountPerRun, itemCountPerOrder, itemQty); |
| | | if (!running.compareAndSet(false, true)) { |
| | | log.warn("ASN压测任务仍在执行中,本轮跳过"); |
| | | return; |
| | | } |
| | | |
| | | List<Matnr> matnrs = loadMatnrs(); |
| | | if (matnrs.isEmpty()) { |
| | | log.warn("ASN压测任务未获取到可用物料,跳过执行"); |
| | | return; |
| | | } |
| | | Collections.shuffle(matnrs); |
| | | |
| | | Date now = new Date(); |
| | | LocalDateTime nowTime = LocalDateTime.now(); |
| | | double totalQty = itemCountPerOrder * itemQty; |
| | | |
| | | List<WkOrder> orders = new ArrayList<>(orderCountPerRun); |
| | | for (int i = 0; i < orderCountPerRun; i++) { |
| | | orders.add(buildOrder(now, nowTime, totalQty, i)); |
| | | } |
| | | if (!asnOrderService.saveBatch(orders, 200)) { |
| | | throw new CoolException("ASN压测主单插入失败"); |
| | | } |
| | | |
| | | List<WkOrderItem> items = new ArrayList<>(orderCountPerRun * itemCountPerOrder); |
| | | for (int orderIndex = 0; orderIndex < orders.size(); orderIndex++) { |
| | | WkOrder order = orders.get(orderIndex); |
| | | for (int itemIndex = 0; itemIndex < itemCountPerOrder; itemIndex++) { |
| | | Matnr matnr = matnrs.get((orderIndex * itemCountPerOrder + itemIndex) % matnrs.size()); |
| | | items.add(buildOrderItem(order, matnr, now, orderIndex, itemIndex)); |
| | | try { |
| | | if (orderCountPerRun <= 0 || itemCountPerOrder <= 0 || itemQty <= 0) { |
| | | log.warn("ASN压测任务配置无效,跳过执行: orderCountPerRun={}, itemCountPerOrder={}, itemQty={}", |
| | | orderCountPerRun, itemCountPerOrder, itemQty); |
| | | return; |
| | | } |
| | | } |
| | | if (!asnOrderItemService.saveBatch(items, 500)) { |
| | | throw new CoolException("ASN压测明细插入失败"); |
| | | } |
| | | |
| | | log.info("ASN压测任务执行完成,本次插入主单 {} 条,明细 {} 条", orders.size(), items.size()); |
| | | List<Matnr> matnrs = loadMatnrs(); |
| | | if (matnrs.isEmpty()) { |
| | | log.warn("ASN压测任务未获取到可用物料,跳过执行"); |
| | | return; |
| | | } |
| | | Collections.shuffle(matnrs); |
| | | |
| | | Date now = new Date(); |
| | | LocalDateTime nowTime = LocalDateTime.now(); |
| | | double totalQty = itemCountPerOrder * itemQty; |
| | | |
| | | List<WkOrder> orders = new ArrayList<>(orderCountPerRun); |
| | | for (int i = 0; i < orderCountPerRun; i++) { |
| | | orders.add(buildOrder(now, nowTime, totalQty, i)); |
| | | } |
| | | if (!asnOrderService.saveBatch(orders, 200)) { |
| | | throw new CoolException("ASN压测主单插入失败"); |
| | | } |
| | | |
| | | List<WkOrderItem> items = new ArrayList<>(orderCountPerRun * itemCountPerOrder); |
| | | for (int orderIndex = 0; orderIndex < orders.size(); orderIndex++) { |
| | | WkOrder order = orders.get(orderIndex); |
| | | for (int itemIndex = 0; itemIndex < itemCountPerOrder; itemIndex++) { |
| | | Matnr matnr = matnrs.get((orderIndex * itemCountPerOrder + itemIndex) % matnrs.size()); |
| | | items.add(buildOrderItem(order, matnr, now, orderIndex, itemIndex)); |
| | | } |
| | | } |
| | | if (!asnOrderItemService.saveBatch(items, 500)) { |
| | | throw new CoolException("ASN压测明细插入失败"); |
| | | } |
| | | |
| | | log.info("ASN压测任务执行完成,本次插入主单 {} 条,明细 {} 条", orders.size(), items.size()); |
| | | } finally { |
| | | running.set(false); |
| | | } |
| | | } |
| | | |
| | | private List<Matnr> loadMatnrs() { |