新增webcad生产单导入:1、新增生产单2w片数限制检查;2、暂时移除order_item、order_plate线程池插入操作;

This commit is contained in:
gaoqr
2025-04-11 12:12:26 +08:00
parent c13e19bc60
commit 1014eb3a48
3 changed files with 59 additions and 43 deletions
@@ -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片,本次拆单超出部分不计入生产单");
}
@@ -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;
@@ -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<PlateDO>()
.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<OrderItemDO> list, boolean isLast) {
// 达到批量的阈值就做一次插入
if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) {
// 深拷贝list
List<OrderItemDO> 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<PlateDO> list, boolean isLast) {
// 达到批量的阈值就做一次插入
if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) {
// 深拷贝list
List<PlateDO> 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<OrderPartsDO> list, boolean isLast) {
// 达到批量的阈值就做一次插入
if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) {
// 深拷贝list
List<OrderPartsDO> 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();