mirror of
http://192.168.1.205:9980/cf_devdept2/cf_imes_server.git
synced 2026-08-12 21:02:08 +08:00
新增webcad生产单导入:1、新增生产单2w片数限制检查;2、暂时移除order_item、order_plate线程池插入操作;
This commit is contained in:
+2
@@ -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片,本次拆单超出部分不计入生产单");
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-1
@@ -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;
|
||||||
|
|||||||
+52
-42
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user