| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.vincent.rsf.framework.exception.CoolException; |
| | | import com.vincent.rsf.server.manager.entity.AsnOrderItemLog; |
| | | import com.vincent.rsf.server.manager.entity.AsnOrderLog; |
| | | import com.vincent.rsf.server.manager.entity.Matnr; |
| | | import com.vincent.rsf.server.manager.entity.WkOrder; |
| | | import com.vincent.rsf.server.manager.entity.WkOrderItem; |
| | | import com.vincent.rsf.server.manager.service.AsnOrderItemService; |
| | | import com.vincent.rsf.server.manager.service.AsnOrderService; |
| | | import com.vincent.rsf.server.manager.service.AsnOrderItemLogService; |
| | | import com.vincent.rsf.server.manager.service.AsnOrderLogService; |
| | | import com.vincent.rsf.server.manager.service.MatnrService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang3.StringUtils; |
| | |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | 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; |
| | | private AsnOrderLogService asnOrderLogService; |
| | | @Autowired |
| | | private AsnOrderItemService asnOrderItemService; |
| | | private AsnOrderItemLogService asnOrderItemLogService; |
| | | @Autowired |
| | | private MatnrService matnrService; |
| | | |
| | |
| | | |
| | | @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<AsnOrderLog> orders = new ArrayList<>(orderCountPerRun); |
| | | for (int i = 0; i < orderCountPerRun; i++) { |
| | | orders.add(buildOrder(now, nowTime, totalQty, i)); |
| | | } |
| | | if (!asnOrderLogService.saveBatch(orders, 200)) { |
| | | throw new CoolException("ASN压测主单插入失败"); |
| | | } |
| | | |
| | | List<AsnOrderLog> persistedOrders = asnOrderLogService.list(new LambdaQueryWrapper<AsnOrderLog>() |
| | | .in(AsnOrderLog::getCode, extractOrderCodes(orders))); |
| | | Map<String, AsnOrderLog> orderMap = new HashMap<>(persistedOrders.size()); |
| | | for (AsnOrderLog order : persistedOrders) { |
| | | orderMap.put(order.getCode(), order); |
| | | } |
| | | |
| | | List<AsnOrderItemLog> items = new ArrayList<>(orderCountPerRun * itemCountPerOrder); |
| | | for (int orderIndex = 0; orderIndex < orders.size(); orderIndex++) { |
| | | AsnOrderLog order = orderMap.get(orders.get(orderIndex).getCode()); |
| | | if (order == null) { |
| | | throw new CoolException("ASN压测主单回查失败"); |
| | | } |
| | | 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 (!asnOrderItemLogService.saveBatch(items, 500)) { |
| | | throw new CoolException("ASN压测明细插入失败"); |
| | | } |
| | | |
| | | log.info("ASN压测任务执行完成,本次插入主单 {} 条,明细 {} 条", orders.size(), items.size()); |
| | | } finally { |
| | | running.set(false); |
| | | } |
| | | } |
| | | |
| | | private List<Matnr> loadMatnrs() { |
| | |
| | | .last("limit " + needCount)); |
| | | } |
| | | |
| | | private WkOrder buildOrder(Date now, LocalDateTime nowTime, double totalQty, int sequence) { |
| | | private List<String> extractOrderCodes(List<AsnOrderLog> orders) { |
| | | List<String> codes = new ArrayList<>(orders.size()); |
| | | for (AsnOrderLog order : orders) { |
| | | codes.add(order.getCode()); |
| | | } |
| | | return codes; |
| | | } |
| | | |
| | | private AsnOrderLog buildOrder(Date now, LocalDateTime nowTime, double totalQty, int sequence) { |
| | | String suffix = String.format("%04d", sequence + 1); |
| | | String code = "erp" + nowTime.format(ORDER_CODE_FORMATTER) + suffix; |
| | | long serialNo = System.currentTimeMillis() * 1000 + sequence; |
| | | |
| | | return new WkOrder() |
| | | .setCode(code) |
| | | .setPoCode(code) |
| | | .setPoId(serialNo) |
| | | .setType(ORDER_TYPE) |
| | | .setWkType(ORDER_WORK_TYPE) |
| | | .setAnfme(totalQty) |
| | | .setQty(totalQty) |
| | | .setWorkQty(0.0) |
| | | .setCheckType(0) |
| | | .setRleStatus((short) 0) |
| | | .setNtyStatus(0) |
| | | .setExceStatus((short) 4) |
| | | .setStatus(1) |
| | | .setDeleted(0) |
| | | .setTenantId(TENANT_ID) |
| | | .setCreateBy(USER_ID) |
| | | .setCreateTime(now) |
| | | .setUpdateBy(USER_ID) |
| | | .setUpdateTime(now) |
| | | .setMemo(MEMO) |
| | | .setReportOnce(4) |
| | | .setBusinessTime(now) |
| | | .setStationId("1215") |
| | | .setOrderInternalCode(String.valueOf(serialNo)) |
| | | .setStockDirect("stockDirect") |
| | | .setCustomerId("custom1") |
| | | .setCustomerName("客户1") |
| | | .setSupplierId("gongys1") |
| | | .setSupplierName("供应商1") |
| | | .setStockOrgId("stockYH") |
| | | .setStockOrgName("浙江银湖箱包有限公司仓库") |
| | | .setPurchaseOrgId("yhcaigou") |
| | | .setPurchaseOrgName("浙江银湖箱包有限公司采购") |
| | | .setPurchaseUserId("caigouyuan1") |
| | | .setPurchaseUserName("采购员1") |
| | | .setPrdOrgId("prdYH") |
| | | .setPrdOrgName("浙江银湖箱包有限公司") |
| | | .setSaleOrgId("sale1") |
| | | .setSaleOrgName("生产组1") |
| | | .setSaleUserId("shengchanyuan1") |
| | | .setSaleUserName("生产员1") |
| | | .setVersion(0); |
| | | AsnOrderLog order = new AsnOrderLog(); |
| | | order.setCode(code); |
| | | order.setPoCode(code); |
| | | order.setPoId(serialNo); |
| | | order.setType(ORDER_TYPE); |
| | | order.setWkType(ORDER_WORK_TYPE); |
| | | order.setAnfme(totalQty); |
| | | order.setQty(totalQty); |
| | | order.setRleStatus((short) 0); |
| | | order.setNtyStatus((short) 0); |
| | | order.setExceStatus((short) 4); |
| | | order.setStatus(1); |
| | | order.setDeleted(0); |
| | | order.setTenantId(TENANT_ID); |
| | | order.setCreateBy(USER_ID); |
| | | order.setCreateTime(now); |
| | | order.setUpdateBy(USER_ID); |
| | | order.setUpdateTime(now); |
| | | order.setMemo(MEMO); |
| | | return order; |
| | | } |
| | | |
| | | private WkOrderItem buildOrderItem(WkOrder order, Matnr matnr, Date now, int orderIndex, int itemIndex) { |
| | | private AsnOrderItemLog buildOrderItem(AsnOrderLog order, Matnr matnr, Date now, int orderIndex, int itemIndex) { |
| | | String stockUnit = StringUtils.firstNonBlank(matnr.getStockUnit(), matnr.getPurUnit(), matnr.getUnit(), matnr.getBaseUnit()); |
| | | String purUnit = StringUtils.firstNonBlank(matnr.getPurUnit(), matnr.getUnit(), matnr.getStockUnit(), matnr.getBaseUnit()); |
| | | String baseUnit = StringUtils.firstNonBlank(matnr.getBaseUnit(), matnr.getUnit(), matnr.getStockUnit(), matnr.getPurUnit()); |
| | | String batchCode = "B" + new SimpleDateFormat("yyyyMMddHHmmss").format(now) |
| | | + String.format("%02d%02d", orderIndex + 1, itemIndex + 1); |
| | | String trackCode = "T" + System.currentTimeMillis() + String.format("%02d%02d", orderIndex + 1, itemIndex + 1); |
| | | |
| | | return new WkOrderItem() |
| | | .setOrderId(order.getId()) |
| | | .setOrderCode(order.getCode()) |
| | | return new AsnOrderItemLog() |
| | | .setLogId(order.getId()) |
| | | .setAsnId(order.getAsnId()) |
| | | .setAsnCode(order.getCode()) |
| | | .setPlatItemId("M" + (itemIndex + 1)) |
| | | .setPoCode(order.getPoCode()) |
| | | .setFieldsIndex(matnr.getFieldsIndex()) |
| | | .setMatnrId(matnr.getId()) |
| | | .setMatnrCode(matnr.getCode()) |
| | | .setMaktx(matnr.getName()) |
| | | .setSpec(matnr.getSpec()) |
| | | .setModel(matnr.getModel()) |
| | | .setAnfme(itemQty) |
| | | .setWorkQty(0.0) |
| | | .setPurQty(itemQty) |
| | | .setQty(itemQty) |
| | | .setStockUnit(stockUnit) |
| | | .setPurUnit(purUnit) |
| | | .setBatch(batchCode) |
| | | .setSplrBatch(batchCode) |
| | | .setSplrCode("gongys1") |
| | | .setSplrName("供应商1") |
| | | .setTrackCode(trackCode) |
| | | .setBarcode(trackCode) |
| | | .setProdTime(new SimpleDateFormat("yyyy-MM-dd").format(now)) |
| | | .setNtyStatus(0) |
| | | .setNtyStatus((short) 0) |
| | | .setStatus(1) |
| | | .setDeleted(0) |
| | | .setTenantId(TENANT_ID) |
| | |
| | | .setCreateTime(now) |
| | | .setUpdateBy(USER_ID) |
| | | .setUpdateTime(now) |
| | | .setMemo(MEMO) |
| | | .setBaseUnit(baseUnit) |
| | | .setUseOrgId(matnr.getUseOrgId()) |
| | | .setUseOrgName(matnr.getUseOrgName()) |
| | | .setErpClsId(matnr.getErpClsId()) |
| | | .setPriceUnitId(baseUnit); |
| | | .setMemo(MEMO); |
| | | } |
| | | } |