From 1d98af568d076c067f50729ea0b421ff388d2c73 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 2 Apr 2025 12:07:02 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E7=A6=85=E9=81=93#1456=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D=EF=BC=9B2=E3=80=81webcad=E6=8B=86?= =?UTF-8?q?=E5=8D=95=E5=AF=BC=E5=85=A5=E4=BC=98=E5=8C=96=E3=80=81=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E5=AE=8C=E5=96=84=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webcad/vo/WebCadDataBlockReqVO.java | 2 +- .../webcad/vo/WebCadDataPartsReqVO.java | 2 +- .../config/PlanThreadPoolConfiguration.java | 30 +++ .../WebCadOrderImportServiceImpl.java | 7 +- .../factory/WebCadOrderImportFactory.java | 251 +++++++++++------- 5 files changed, 200 insertions(+), 92 deletions(-) create mode 100644 cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/framework/executor/config/PlanThreadPoolConfiguration.java diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/controller/admin/orderImport/webcad/vo/WebCadDataBlockReqVO.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/controller/admin/orderImport/webcad/vo/WebCadDataBlockReqVO.java index 0a833fd81..a6945f8f8 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/controller/admin/orderImport/webcad/vo/WebCadDataBlockReqVO.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/controller/admin/orderImport/webcad/vo/WebCadDataBlockReqVO.java @@ -61,7 +61,7 @@ public class WebCadDataBlockReqVO { private Long plateGoodsId; private String goodsId; - private List groupInfos = new ArrayList<>(); + private List groupIds = new ArrayList<>(); @NoArgsConstructor @Data diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/controller/admin/orderImport/webcad/vo/WebCadDataPartsReqVO.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/controller/admin/orderImport/webcad/vo/WebCadDataPartsReqVO.java index 6a138de53..354329c42 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/controller/admin/orderImport/webcad/vo/WebCadDataPartsReqVO.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/controller/admin/orderImport/webcad/vo/WebCadDataPartsReqVO.java @@ -62,7 +62,7 @@ public class WebCadDataPartsReqVO { private Long imesPartsId; - private List groupInfos = new ArrayList<>(); + private List groupIds = new ArrayList<>(); private GroupDataDTO groupData; diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/framework/executor/config/PlanThreadPoolConfiguration.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/framework/executor/config/PlanThreadPoolConfiguration.java new file mode 100644 index 000000000..6a7cf1736 --- /dev/null +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/framework/executor/config/PlanThreadPoolConfiguration.java @@ -0,0 +1,30 @@ +package com.cf.imes.module.plan.framework.executor.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * @author Gqr + * @since 2025/3/24 15:21 + */ +@Configuration(proxyBeanMethods = false) +public class PlanThreadPoolConfiguration { + public static final String PLAN_IMPOT_THREAD_POOL_TASK_EXECUTOR = "PLAN_IMPORT_THREAD_POOL_TASK_EXECUTOR"; + + @Bean(PLAN_IMPOT_THREAD_POOL_TASK_EXECUTOR) + public ThreadPoolTaskExecutor planThreadPoolTaskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(8); // 设置核心线程数 + executor.setMaxPoolSize(8); // 设置最大线程数 + executor.setKeepAliveSeconds(60); // 设置空闲时间 + executor.setQueueCapacity(100); // 设置队列大小 + executor.setThreadNamePrefix("plan-import-Executor-"); // 配置线程池的前缀 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 进行加载 + executor.initialize(); + return executor; + } +} diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/WebCadOrderImportServiceImpl.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/WebCadOrderImportServiceImpl.java index ebcbeb5e9..9fd340e74 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/WebCadOrderImportServiceImpl.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/WebCadOrderImportServiceImpl.java @@ -26,6 +26,7 @@ import com.cf.imes.module.system.api.systemconfig.SystemConfigApi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,6 +35,7 @@ import javax.annotation.Resource; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORGAN_LOCK_ERROR; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_FAILED; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORGANID_EMPTY_ERROR; +import static com.cf.imes.module.plan.framework.executor.config.PlanThreadPoolConfiguration.PLAN_IMPOT_THREAD_POOL_TASK_EXECUTOR; /** * 生产单导入服务Service实现类 @@ -96,6 +98,9 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService { @Resource private SystemConfigApi systemConfigApi; + @Resource(name = PLAN_IMPOT_THREAD_POOL_TASK_EXECUTOR) + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Override @Transactional(rollbackFor = Exception.class) public void webCadOrderImport(WebCadDataReqVO webCadDataReqVO) { @@ -112,7 +117,7 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService { throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR); } WebCadOrderImportFactory webCadOrderImportFactory = new WebCadOrderImportFactory(organId, orderMapper, snowFlakeGenerator, orderBodyMapper, plateMapper, orderItemMapper, orderGroupMapper, - idWorker, orderInputProcessor, orderPartsMapper, goodsMapper, rawGoodsMapper, plateGoodMapper, customPlateNoGenerateService, transactionManager, systemConfigApi); + idWorker, orderInputProcessor, orderPartsMapper, goodsMapper, rawGoodsMapper, plateGoodMapper, customPlateNoGenerateService, transactionManager, systemConfigApi, threadPoolTaskExecutor); webCadOrderImportFactory.analyzeTempData(webCadDataReqVO); } catch (ServiceException se) { throw se; diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportFactory.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportFactory.java index 64db2122e..d00ed9ef1 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportFactory.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/WebCadOrderImportFactory.java @@ -65,6 +65,7 @@ import com.cf.imes.module.system.api.systemconfig.dto.SystemConfigSealEdgeRespDT import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; @@ -77,8 +78,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @@ -98,9 +97,9 @@ import static com.cf.imes.module.plan.service.order.OrderInputProcessor.ORDER_PL @Slf4j public class WebCadOrderImportFactory { /** - * 分组中做分页的阈值,如:总数100以上就边分组边分页,否则一次性查出来 + * 批量操作阈值 */ - private static final int BATCH_THRESHOLD_NUMBER = 100; + private static final int BATCH_THRESHOLD_NUMBER = 300; private OrderMapper orderMapper; @@ -132,6 +131,8 @@ public class WebCadOrderImportFactory { private DataSourceTransactionManager transactionManager; + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + private Long organId; // 批次id @@ -163,6 +164,9 @@ public class WebCadOrderImportFactory { // 房间名+柜体名+加工组名 private Map orderGroupMap = new HashMap<>(); + // 加工组缓存 + private Map processGroupMap = new HashMap<>(); + private List plateDOS = ListUtils.newArrayListWithExpectedSize(BATCH_THRESHOLD_NUMBER); private List orderItemDOS = ListUtils.newArrayListWithExpectedSize(BATCH_THRESHOLD_NUMBER); private List orderGroupDOS = ListUtils.newArrayListWithExpectedSize(BATCH_THRESHOLD_NUMBER); @@ -173,9 +177,9 @@ public class WebCadOrderImportFactory { private List sealEdgeConfigList; - private static String PART_CATEGORY_ONE = "封边条"; - private static String PART_CATEGORY_TWO = "五金"; - private static String PART_CATEGORY_THREE = "组件"; + private static final String PART_CATEGORY_ONE = "封边条"; + private static final String PART_CATEGORY_TWO = "五金"; + private static final String PART_CATEGORY_THREE = "组件"; private static final String EMPTY_STRING = new String(); public WebCadOrderImportFactory(Long organId, @@ -193,7 +197,8 @@ public class WebCadOrderImportFactory { PlateGoodMapper plateGoodMapper, CustomPlateNoGenerateService customPlateNoGenerateService, DataSourceTransactionManager transactionManager, - SystemConfigApi systemConfigApi) { + SystemConfigApi systemConfigApi, + ThreadPoolTaskExecutor threadPoolTaskExecutor) { this.organId = organId; this.orderMapper = orderMapper; this.snowFlakeGenerator = snowFlakeGenerator; @@ -210,6 +215,7 @@ public class WebCadOrderImportFactory { this.customPlateNoGenerateService = customPlateNoGenerateService; this.transactionManager = transactionManager; this.systemConfigApi = systemConfigApi; + this.threadPoolTaskExecutor = threadPoolTaskExecutor; operatorName = SecurityFrameworkUtils.getLoginUser().getNickname(); now = LocalDateTime.now(); batchId = (Long) snowFlakeGenerator.nextId(null); @@ -242,8 +248,8 @@ public class WebCadOrderImportFactory { // 解析配件列表 analyzeParts(webCadDataReqVO.getParts()); - // 数据保存入库 - saveData(); + // 异步保存数据 + saveDataAsync(); } catch (Exception e) { if (esInsert) { @@ -419,10 +425,18 @@ public class WebCadOrderImportFactory { // 加工组信息缓存到cad block和part上 if (CollUtil.isNotEmpty(projects)) { for (WebCadDataProcessGroupReqVO.ProjectsDTO project : projects) { + // 缓存加工组信息 + WebCadDataBlockReqVO.GroupInfo processGroupInfo = new WebCadDataBlockReqVO.GroupInfo(); + processGroupInfo.setGroupName(project.getProjName()); + processGroupInfo.setGroupTypeName(groupTypeName); + processGroupInfo.setHeight(project.getBoxSize().getHeight()); + processGroupInfo.setWidth(project.getBoxSize().getWidth()); + processGroupInfo.setDepth(project.getBoxSize().getDepth()); + processGroupMap.put(project.getGroupID(), processGroupInfo); // 板件 - processBlocksGroup(project, blockReqVOS, groupTypeName); + processBlocksGroup(project, blockReqVOS); // 配件 - processPartsGroup(project, partsReqVO, groupTypeName); + processPartsGroup(project, partsReqVO); } } } @@ -430,49 +444,35 @@ public class WebCadOrderImportFactory { } /** - * 存板件加工组 + * 加工组缓存到对应的板件下 * * @param project * @param blockReqVOS - * @param groupTypeName */ - private void processBlocksGroup(WebCadDataProcessGroupReqVO.ProjectsDTO project, List blockReqVOS, String groupTypeName) { + private void processBlocksGroup(WebCadDataProcessGroupReqVO.ProjectsDTO project, List blockReqVOS) { List brIds = project.getBrIds(); if (CollUtil.isNotEmpty(brIds)) { for (Integer brId : brIds) { // brId 板件序号获取板件 WebCadDataBlockReqVO webCadDataBlockReqVO = blockReqVOS.get(brId - 1); - WebCadDataBlockReqVO.GroupInfo groupInfo = new WebCadDataBlockReqVO.GroupInfo(); - groupInfo.setGroupTypeName(groupTypeName); - groupInfo.setGroupName(project.getProjName()); - groupInfo.setWidth(project.getBoxSize().getWidth()); - groupInfo.setHeight(project.getBoxSize().getHeight()); - groupInfo.setDepth(project.getBoxSize().getDepth()); - webCadDataBlockReqVO.getGroupInfos().add(groupInfo); + webCadDataBlockReqVO.getGroupIds().add(project.getGroupID()); } } } /** - * 存配件加工组 + * 加工组缓存到对应的配件下 * * @param project * @param partsReqVO - * @param groupTypeName */ - private void processPartsGroup(WebCadDataProcessGroupReqVO.ProjectsDTO project, WebCadDataPartsReqVO partsReqVO, String groupTypeName) { + private void processPartsGroup(WebCadDataProcessGroupReqVO.ProjectsDTO project, WebCadDataPartsReqVO partsReqVO) { List objIds = project.getObjIds(); if (CollUtil.isNotEmpty(objIds)) { for (Integer objId : objIds) { // objId 配件序号获取配件 WebCadDataPartsReqVO.BlockObjectListDTO part = partsReqVO.getBlockObjectList().get(objId - 1); - WebCadDataBlockReqVO.GroupInfo groupInfo = new WebCadDataBlockReqVO.GroupInfo(); - groupInfo.setGroupTypeName(groupTypeName); - groupInfo.setGroupName(project.getProjName()); - groupInfo.setWidth(project.getBoxSize().getWidth()); - groupInfo.setHeight(project.getBoxSize().getHeight()); - groupInfo.setDepth(project.getBoxSize().getDepth()); - part.getGroupInfos().add(groupInfo); + part.getGroupIds().add(project.getGroupID()); } } } @@ -632,7 +632,7 @@ public class WebCadOrderImportFactory { // 从info.remarks中获取备注相关 WebCadDataBlockRemarkVO plateRemark = getPlateRemark(blockInfo); List remarks = plateRemark.getRemarks(); - StringBuffer remark = new StringBuffer(); + StringBuilder remark = new StringBuilder(); if (CollUtil.isNotEmpty(remarks)) { for (String remarkStr : remarks) { remark.append(remarkStr).append(","); @@ -1063,10 +1063,11 @@ public class WebCadOrderImportFactory { // 是否矩形,不是矩形那就是异形 Boolean unRegular = !infoDTO.getIsRect(); - List groupInfos = block.getGroupInfos(); - if (CollUtil.isNotEmpty(groupInfos)) { + List groupIds = block.getGroupIds(); + if (CollUtil.isNotEmpty(groupIds)) { // 加工组缓存存在,一个加工组一个orderGroup+orderItem - for (WebCadDataBlockReqVO.GroupInfo groupInfo : groupInfos) { + for (Integer groupId : groupIds) { + WebCadDataBlockReqVO.GroupInfo groupInfo = processGroupMap.get(groupId); String groupMapKey = orderBodyDO.getMultiRoomBodyName() + groupInfo.getGroupName(); OrderGroupDO orderGroupDO = orderGroupMap.get(groupMapKey); // 房间+柜体+加工组名称存在累加板件和异形数量,不存在新增groupDO和orderGroupMap缓存 @@ -1245,12 +1246,13 @@ public class WebCadOrderImportFactory { Long roomId = orderBodyDO.getRoomId(); // 遍历加工组信息,生成对应的orderItem - List groupInfos = part.getGroupInfos(); - if (CollUtil.isNotEmpty(groupInfos)) { + List groupIds = part.getGroupIds(); + if (CollUtil.isNotEmpty(groupIds)) { Double partNum = 0.0; // 带加工组的配件增加item只记录配件id和数量 partNum += part.getNum(); - for (WebCadDataBlockReqVO.GroupInfo groupInfo : groupInfos) { + for (Integer groupId : groupIds) { + WebCadDataBlockReqVO.GroupInfo groupInfo = processGroupMap.get(groupId); String groupMapKey = orderBodyDO.getMultiRoomBodyName() + groupInfo.getGroupName(); OrderGroupDO orderGroupDO = orderGroupMap.get(groupMapKey); // 房间+柜体+加工组名称存在累加配件item,不存在新增groupDO和orderGroupMap缓存 @@ -1485,6 +1487,8 @@ public class WebCadOrderImportFactory { } /** + * 根据对应的宽度修改spec规格中的第二段宽度 + * * @param spec * @param width * @return @@ -1492,6 +1496,10 @@ public class WebCadOrderImportFactory { private String modifySealEdgeSpec(String spec, String width) { if (StringUtils.isNotEmpty(spec)) { String[] specSplit = spec.split("-"); + // 例:15mm-18mm + if (specSplit.length == 2) { + return specSplit[0] + "-" + width + "mm-"; + } // 例:9mm-18mm-经典檀木 if (specSplit.length == 3) { return specSplit[0] + "-" + width + "mm-" + specSplit[2]; @@ -1600,62 +1608,21 @@ public class WebCadOrderImportFactory { } } - /** - * 数据保存入库 + * 异步保存数据 * orderBody、orderItem、orderGroup */ - private void saveData() { + private void saveDataAsync() { TransactionStatus transactionStatus = transactionManager.getTransaction(TransactionDefinition.withDefaults()); - ExecutorService executorService = Executors.newFixedThreadPool(3); AtomicBoolean hasError = new AtomicBoolean(false); CountDownLatch latch = new CountDownLatch(3); // 当前数据源data_code String peek = DynamicDataSourceContextHolder.peek(); - Runnable bodyTask = () -> { - try { - // 子线程同步主线程的多数据源 - DynamicDataSourceContextHolder.push(peek); - orderInfoBatchInsertWithinThreshold(orderBodyMapper, bodyMap.values().stream().toList(), true); - } catch (Exception e) { - hasError.set(true); - log.error("Error saving order bodies", e); - } finally { - latch.countDown(); - } - }; - - Runnable itemTask = () -> { - try { - // 子线程同步主线程的多数据源 - DynamicDataSourceContextHolder.push(peek); - orderInfoBatchInsertWithinThreshold(orderItemMapper, orderItemDOS, true); - } catch (Exception e) { - hasError.set(true); - log.error("Error saving order items", e); - } finally { - latch.countDown(); - } - }; - - Runnable groupTask = () -> { - try { - // 子线程同步主线程的多数据源 - DynamicDataSourceContextHolder.push(peek); - orderInfoBatchInsertWithinThreshold(orderGroupMapper, orderGroupDOS, true); - } catch (Exception e) { - hasError.set(true); - log.error("Error saving order groups", e); - } finally { - latch.countDown(); - } - }; - - // 执行子线程 - executorService.submit(bodyTask); - executorService.submit(itemTask); - executorService.submit(groupTask); + // 保存 + saveBodyAsync(latch, hasError, peek); + saveGroupAsync(latch, hasError, peek); + saveItemAsync(latch, hasError, peek); try { // 等待所有任务完成 @@ -1664,9 +1631,6 @@ public class WebCadOrderImportFactory { Thread.currentThread().interrupt(); hasError.set(true); log.error("WEBCAD import saveData Thread interrupted", e); - } finally { - // 中止所有任务 - executorService.shutdown(); } if (hasError.get()) { @@ -1680,6 +1644,114 @@ public class WebCadOrderImportFactory { } } + /** + * 异步插入柜体 + * + * @param latch + * @param hasError + * @param peek + */ + private void saveBodyAsync(CountDownLatch latch, AtomicBoolean hasError, String peek) { + List orderBodyDOS = bodyMap.values().stream().toList(); + List> bodyList = batchProcess(orderBodyDOS); + for (List bodyDOS : bodyList) { + threadPoolTaskExecutor.submit(() -> { + try { + // 子线程同步主线程的多数据源 + DynamicDataSourceContextHolder.push(peek); + orderBodyMapper.insertBatchSomeColumn(bodyDOS); + } catch (Exception e) { + log.error("WEBCAD import saveBodyAsync error", e); + boolean b = hasError.get(); + if (!b) { + hasError.set(true); + } + } finally { + latch.countDown(); // 任务完成,计数器减1 + } + }); + } + } + + /** + * 异步插入加工组 + * + * @param latch + * @param hasError + * @param peek + */ + private void saveGroupAsync(CountDownLatch latch, AtomicBoolean hasError, String peek) { + List> groupList = batchProcess(orderGroupDOS); + for (List orderGroupDOS : groupList) { + threadPoolTaskExecutor.submit(() -> { + try { + // 子线程同步主线程的多数据源 + DynamicDataSourceContextHolder.push(peek); + orderGroupMapper.insertBatchSomeColumn(orderGroupDOS); + } catch (Exception e) { + log.error("WEBCAD import saveGroupAsync error", e); + boolean b = hasError.get(); + if (!b) { + hasError.set(true); + } + } finally { + latch.countDown(); // 任务完成,计数器减1 + } + }); + } + } + + /** + * 异步插入明细item + * + * @param latch + * @param hasError + * @param peek + */ + private void saveItemAsync(CountDownLatch latch, AtomicBoolean hasError, String peek) { + List> itemList = batchProcess(orderItemDOS); + for (List itemDOS : itemList) { + threadPoolTaskExecutor.submit(() -> { + try { + // 子线程同步主线程的多数据源 + DynamicDataSourceContextHolder.push(peek); + orderItemMapper.insertBatchSomeColumn(itemDOS); + } catch (Exception e) { + log.error("WEBCAD import saveItemAsync error", e); + boolean b = hasError.get(); + if (!b) { + hasError.set(true); + } + } finally { + latch.countDown(); // 任务完成,计数器减1 + } + }); + } + } + + /** + * 每batchSize条拆分dataList + * + * @param dataList + */ + private List> batchProcess(List dataList) { + List> resultList = new ArrayList<>(); + if (CollUtil.isEmpty(dataList)) { + return resultList; + } + + int total = dataList.size(); + for (int i = 0; i < total; i += BATCH_THRESHOLD_NUMBER) { + int end = Math.min(i + BATCH_THRESHOLD_NUMBER, total); + List subList = dataList.subList(i, end); + + if (!subList.isEmpty()) { + resultList.add(subList); + } + } + return resultList; + } + /** * 清空所有列表 */ @@ -1693,5 +1765,6 @@ public class WebCadOrderImportFactory { roomBodyMap.clear(); bodyMap.clear(); sealEdgeConfigList.clear(); + processGroupMap.clear(); } }