diff --git a/cf-module-prod-plan/cf-module-prod-plan-api/src/main/java/com/cf/imes/module/plan/enums/ErrorCodeConstants.java b/cf-module-prod-plan/cf-module-prod-plan-api/src/main/java/com/cf/imes/module/plan/enums/ErrorCodeConstants.java index b36bf411e..b863d35f0 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-api/src/main/java/com/cf/imes/module/plan/enums/ErrorCodeConstants.java +++ b/cf-module-prod-plan/cf-module-prod-plan-api/src/main/java/com/cf/imes/module/plan/enums/ErrorCodeConstants.java @@ -18,4 +18,6 @@ public class ErrorCodeConstants { public static final ErrorCode WEBCAD_ORDER_IMPORT_SAVEDATA_ERROR = new ErrorCode(1_005_000_008, "导入失败:数据保存异常,请检查拆单数据"); public static final ErrorCode WEBCAD_ORDER_IMPORT_GET_ORG_SEALEDGE_ERROR = new ErrorCode(1_005_000_009, "导入失败:获取组织封边对应配置异常,请检查服务"); public static final ErrorCode WEBCAD_ORDER_IMPORT_ORG_SEALEDGE_ANALYZE_ERROR = new ErrorCode(1_005_000_010, "导入失败:组织封边对应配置解析异常,请检查配置"); + public static final ErrorCode WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_CHECK_ERROR = new ErrorCode(1_005_000_011, "导入失败:生产单【{}】下板件数量已达到20000片,无法继续导入"); + public static final ErrorCode WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_REACH_THRESHOLD_ERROR = new ErrorCode(1_005_000_012, "部分导入成功,生产单【{}】下板件数量已达到20000片,本次拆单超出部分不计入生产单"); } 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 9fd340e74..b105dac9d 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 @@ -25,6 +25,7 @@ import com.cf.imes.module.plan.service.orderImport.factory.WebCadOrderImportFact import com.cf.imes.module.system.api.systemconfig.SystemConfigApi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; @@ -101,6 +102,9 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService { @Resource(name = PLAN_IMPOT_THREAD_POOL_TASK_EXECUTOR) private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Value("${chenfeng.plan.impot.cadImportPlateNumThreshold:20000}") + private int cadImportPlateNumThreshold; + @Override @Transactional(rollbackFor = Exception.class) public void webCadOrderImport(WebCadDataReqVO webCadDataReqVO) { @@ -117,7 +121,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, threadPoolTaskExecutor); + idWorker, orderInputProcessor, orderPartsMapper, goodsMapper, rawGoodsMapper, plateGoodMapper, customPlateNoGenerateService, transactionManager, systemConfigApi, threadPoolTaskExecutor, cadImportPlateNumThreshold); 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 45d299a7b..7137beee0 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 @@ -1,6 +1,5 @@ package com.cf.imes.module.plan.service.orderImport.factory; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.NumberUtil; @@ -85,6 +84,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_GET_ORG_SEALEDGE_ERROR; +import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_CHECK_ERROR; +import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_REACH_THRESHOLD_ERROR; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORG_SEALEDGE_ANALYZE_ERROR; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_PLATE_NOT_EXIST_ERROR; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_SAVEDATA_ERROR; @@ -194,6 +195,15 @@ public class WebCadOrderImportFactory { // 主线程的data_code private String peek; + // 当前拆单导入的板件数量(初始包含前n次导入的板件总数) + private int currentPlateNum; + + // cad拆单板件数量阈值 + private int cadImportPlateNumThreshold; + + // 板件数量是否已达到阈值 + private boolean plateNumReachThreshold = false; + public WebCadOrderImportFactory(Long organId, OrderMapper orderMapper, SnowFlakeGenerator snowFlakeGenerator, @@ -210,7 +220,8 @@ public class WebCadOrderImportFactory { CustomPlateNoGenerateService customPlateNoGenerateService, DataSourceTransactionManager transactionManager, SystemConfigApi systemConfigApi, - ThreadPoolTaskExecutor threadPoolTaskExecutor) { + ThreadPoolTaskExecutor threadPoolTaskExecutor, + int cadImportPlateNumThreshold) { this.organId = organId; this.orderMapper = orderMapper; this.snowFlakeGenerator = snowFlakeGenerator; @@ -233,6 +244,7 @@ public class WebCadOrderImportFactory { batchId = (Long) snowFlakeGenerator.nextId(null); sealEdgeConfigList = new ArrayList<>(); peek = DynamicDataSourceContextHolder.peek(); + this.cadImportPlateNumThreshold = cadImportPlateNumThreshold; } public void analyzeTempData(WebCadDataReqVO webCadDataReqVO) { @@ -282,6 +294,8 @@ public class WebCadOrderImportFactory { saveDataAsync(); log.debug("====================【cad拆单异步保存结束】===================="); + log.warn(ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_REACH_THRESHOLD_ERROR, orderId).getMessage()); + } catch (Exception e) { if (esInsert) { CompletableFuture.runAsync(() -> { @@ -359,6 +373,19 @@ public class WebCadOrderImportFactory { } orderDO = orderDOFromOrderNo; orderId = orderDOFromOrderNo.getId(); + + // 解析已有生产单下板件数量,超过两万不再导入 + Long existPlateCount = plateMapper.selectCount(new LambdaQueryWrapper() + .eq(PlateDO::getOrderId, orderId) + .eq(PlateDO::getOrganId, organId) + .eq(PlateDO::getDeleted, false) + ); + // 2万片阻止继续拆单 + if (existPlateCount >= cadImportPlateNumThreshold) { + throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_CHECK_ERROR, orderId); + } else { + currentPlateNum = existPlateCount.intValue(); + } } /** @@ -629,10 +656,20 @@ public class WebCadOrderImportFactory { orderBodyDO.setMultiRoomBodyName(multiRoomBodyName); bodyMap.put(multiRoomBodyName, orderBodyDO); - listBody.forEach(block -> { - // 创建板件相关数据:order_plate、order_item、es.orderModels - createPlate(orderBodyDO, block); - }); + // 达到阈值了不再创建板件 + if(plateNumReachThreshold) { + continue; + } + + for (WebCadDataBlockReqVO block : listBody) { + if (!plateNumReachThreshold) { + // 创建板件相关数据:order_plate、order_item、es.orderModels + createPlate(orderBodyDO, block); + } else { + // 达到阈值了跳出循环,不再创建板件 + break; + } + } } } } @@ -775,6 +812,12 @@ public class WebCadOrderImportFactory { calculateSealThickness(plateDO, boardData.getSealing()); //批量保存板件 + // 达到板件数量阈值,停止入库,更新全局参数停止后续入库 + currentPlateNum+=1; + if (currentPlateNum > cadImportPlateNumThreshold) { + plateNumReachThreshold = true; + return; + } plateDOS.add(plateDO); orderPlateBatchInsertWithinThreshold(plateDOS, false); @@ -1742,18 +1785,7 @@ public class WebCadOrderImportFactory { private void orderItemBatchInsertWithinThreshold(List list, boolean isLast) { // 达到批量的阈值就做一次插入 if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) { - // 深拷贝list - List deepCopyList = list.stream().map(item -> new OrderItemDO(item)).collect(Collectors.toList()); - threadPoolTaskExecutor.submit(() -> { - try { - // 子线程同步主线程的多数据源 - DynamicDataSourceContextHolder.push(peek); - orderItemMapper.insertBatchSomeColumn(deepCopyList); - deepCopyList.clear(); - } catch (Exception e) { - log.error("WEBCAD import saveItemAsync error", e); - } - }); + orderItemMapper.insertBatchSomeColumn(list); if (!isLast) { // 存储完成清理 list list.clear(); @@ -1770,18 +1802,7 @@ public class WebCadOrderImportFactory { private void orderPlateBatchInsertWithinThreshold(List list, boolean isLast) { // 达到批量的阈值就做一次插入 if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) { - // 深拷贝list - List deepCopyList = list.stream().map(item -> new PlateDO(item)).collect(Collectors.toList()); - threadPoolTaskExecutor.submit(() -> { - try { - // 子线程同步主线程的多数据源 - DynamicDataSourceContextHolder.push(peek); - plateMapper.insertBatchSomeColumn(deepCopyList); - deepCopyList.clear(); - } catch (Exception e) { - log.error("WEBCAD import savePlateAsync error", e); - } - }); + plateMapper.insertBatchSomeColumn(list); if (!isLast) { // 存储完成清理 list list.clear(); @@ -1798,18 +1819,7 @@ public class WebCadOrderImportFactory { private void orderPartBatchInsertWithinThreshold(List list, boolean isLast) { // 达到批量的阈值就做一次插入 if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) { - // 深拷贝list - List deepCopyList = list.stream().map(item -> new OrderPartsDO(item)).collect(Collectors.toList()); - threadPoolTaskExecutor.submit(() -> { - try { - // 子线程同步主线程的多数据源 - DynamicDataSourceContextHolder.push(peek); - orderPartsMapper.insertBatchSomeColumn(deepCopyList); - deepCopyList.clear(); - } catch (Exception e) { - log.error("WEBCAD import savePartAsync error", e); - } - }); + orderPartsMapper.insertBatchSomeColumn(list); if (!isLast) { // 存储完成清理 list list.clear();