新增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_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_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_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 com.cf.imes.module.system.api.systemconfig.SystemConfigApi;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -101,6 +102,9 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
@Resource(name = PLAN_IMPOT_THREAD_POOL_TASK_EXECUTOR) @Resource(name = PLAN_IMPOT_THREAD_POOL_TASK_EXECUTOR)
private ThreadPoolTaskExecutor threadPoolTaskExecutor; private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Value("${chenfeng.plan.impot.cadImportPlateNumThreshold:20000}")
private int cadImportPlateNumThreshold;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void webCadOrderImport(WebCadDataReqVO webCadDataReqVO) { public void webCadOrderImport(WebCadDataReqVO webCadDataReqVO) {
@@ -117,7 +121,7 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR); throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR);
} }
WebCadOrderImportFactory webCadOrderImportFactory = new WebCadOrderImportFactory(organId, orderMapper, snowFlakeGenerator, orderBodyMapper, plateMapper, orderItemMapper, orderGroupMapper, 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); webCadOrderImportFactory.analyzeTempData(webCadDataReqVO);
} catch (ServiceException se) { } catch (ServiceException se) {
throw se; throw se;
@@ -1,6 +1,5 @@
package com.cf.imes.module.plan.service.orderImport.factory; 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.collection.CollUtil;
import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
@@ -85,6 +84,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors; 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_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_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_PLATE_NOT_EXIST_ERROR;
import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_SAVEDATA_ERROR; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_SAVEDATA_ERROR;
@@ -194,6 +195,15 @@ public class WebCadOrderImportFactory {
// 主线程的data_code // 主线程的data_code
private String peek; private String peek;
// 当前拆单导入的板件数量(初始包含前n次导入的板件总数)
private int currentPlateNum;
// cad拆单板件数量阈值
private int cadImportPlateNumThreshold;
// 板件数量是否已达到阈值
private boolean plateNumReachThreshold = false;
public WebCadOrderImportFactory(Long organId, public WebCadOrderImportFactory(Long organId,
OrderMapper orderMapper, OrderMapper orderMapper,
SnowFlakeGenerator snowFlakeGenerator, SnowFlakeGenerator snowFlakeGenerator,
@@ -210,7 +220,8 @@ public class WebCadOrderImportFactory {
CustomPlateNoGenerateService customPlateNoGenerateService, CustomPlateNoGenerateService customPlateNoGenerateService,
DataSourceTransactionManager transactionManager, DataSourceTransactionManager transactionManager,
SystemConfigApi systemConfigApi, SystemConfigApi systemConfigApi,
ThreadPoolTaskExecutor threadPoolTaskExecutor) { ThreadPoolTaskExecutor threadPoolTaskExecutor,
int cadImportPlateNumThreshold) {
this.organId = organId; this.organId = organId;
this.orderMapper = orderMapper; this.orderMapper = orderMapper;
this.snowFlakeGenerator = snowFlakeGenerator; this.snowFlakeGenerator = snowFlakeGenerator;
@@ -233,6 +244,7 @@ public class WebCadOrderImportFactory {
batchId = (Long) snowFlakeGenerator.nextId(null); batchId = (Long) snowFlakeGenerator.nextId(null);
sealEdgeConfigList = new ArrayList<>(); sealEdgeConfigList = new ArrayList<>();
peek = DynamicDataSourceContextHolder.peek(); peek = DynamicDataSourceContextHolder.peek();
this.cadImportPlateNumThreshold = cadImportPlateNumThreshold;
} }
public void analyzeTempData(WebCadDataReqVO webCadDataReqVO) { public void analyzeTempData(WebCadDataReqVO webCadDataReqVO) {
@@ -282,6 +294,8 @@ public class WebCadOrderImportFactory {
saveDataAsync(); saveDataAsync();
log.debug("====================【cad拆单异步保存结束】===================="); log.debug("====================【cad拆单异步保存结束】====================");
log.warn(ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_REACH_THRESHOLD_ERROR, orderId).getMessage());
} catch (Exception e) { } catch (Exception e) {
if (esInsert) { if (esInsert) {
CompletableFuture.runAsync(() -> { CompletableFuture.runAsync(() -> {
@@ -359,6 +373,19 @@ public class WebCadOrderImportFactory {
} }
orderDO = orderDOFromOrderNo; orderDO = orderDOFromOrderNo;
orderId = orderDOFromOrderNo.getId(); 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); orderBodyDO.setMultiRoomBodyName(multiRoomBodyName);
bodyMap.put(multiRoomBodyName, orderBodyDO); bodyMap.put(multiRoomBodyName, orderBodyDO);
listBody.forEach(block -> { // 达到阈值了不再创建板件
// 创建板件相关数据:order_plate、order_item、es.orderModels if(plateNumReachThreshold) {
createPlate(orderBodyDO, block); 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()); calculateSealThickness(plateDO, boardData.getSealing());
//批量保存板件 //批量保存板件
// 达到板件数量阈值,停止入库,更新全局参数停止后续入库
currentPlateNum+=1;
if (currentPlateNum > cadImportPlateNumThreshold) {
plateNumReachThreshold = true;
return;
}
plateDOS.add(plateDO); plateDOS.add(plateDO);
orderPlateBatchInsertWithinThreshold(plateDOS, false); orderPlateBatchInsertWithinThreshold(plateDOS, false);
@@ -1742,18 +1785,7 @@ public class WebCadOrderImportFactory {
private void orderItemBatchInsertWithinThreshold(List<OrderItemDO> list, boolean isLast) { private void orderItemBatchInsertWithinThreshold(List<OrderItemDO> list, boolean isLast) {
// 达到批量的阈值就做一次插入 // 达到批量的阈值就做一次插入
if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) { if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) {
// 深拷贝list orderItemMapper.insertBatchSomeColumn(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);
}
});
if (!isLast) { if (!isLast) {
// 存储完成清理 list // 存储完成清理 list
list.clear(); list.clear();
@@ -1770,18 +1802,7 @@ public class WebCadOrderImportFactory {
private void orderPlateBatchInsertWithinThreshold(List<PlateDO> list, boolean isLast) { private void orderPlateBatchInsertWithinThreshold(List<PlateDO> list, boolean isLast) {
// 达到批量的阈值就做一次插入 // 达到批量的阈值就做一次插入
if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) { if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) {
// 深拷贝list plateMapper.insertBatchSomeColumn(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);
}
});
if (!isLast) { if (!isLast) {
// 存储完成清理 list // 存储完成清理 list
list.clear(); list.clear();
@@ -1798,18 +1819,7 @@ public class WebCadOrderImportFactory {
private void orderPartBatchInsertWithinThreshold(List<OrderPartsDO> list, boolean isLast) { private void orderPartBatchInsertWithinThreshold(List<OrderPartsDO> list, boolean isLast) {
// 达到批量的阈值就做一次插入 // 达到批量的阈值就做一次插入
if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) { if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) {
// 深拷贝list orderPartsMapper.insertBatchSomeColumn(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);
}
});
if (!isLast) { if (!isLast) {
// 存储完成清理 list // 存储完成清理 list
list.clear(); list.clear();