新增webcad生产单导入:1、封边条非必须对应修复;2、es回滚批次数据增加异步两次等待删除;3、多次拆单已有板材对应处理;

This commit is contained in:
gaoqr
2025-03-20 11:07:33 +08:00
parent 2f1478688c
commit 0bf1ebd5f1
2 changed files with 100 additions and 58 deletions
@@ -92,14 +92,32 @@ public class OrderInputProcessor {
public void deleteByOrderIdBatch(Long orderId, Long batchId, String index) { public void deleteByOrderIdBatch(Long orderId, Long batchId, String index) {
DeleteByQueryRequest.Builder builder = new DeleteByQueryRequest.Builder(); DeleteByQueryRequest.Builder builder = new DeleteByQueryRequest.Builder();
builder.index(index); builder.index(index);
builder.query(q -> q.term(t -> t.field(FIELD_ORDER_ID).value(orderId))); builder.query(q -> q.bool(b -> b
builder.query(q -> q.term(t -> t.field(FIELD_BATCH_ID).value(batchId))); .must(must -> must.term(t -> t.field(FIELD_ORDER_ID).value(orderId)))
.must(must -> must.term(t -> t.field(FIELD_BATCH_ID).value(batchId)))
));
try { try {
DeleteByQueryResponse response = elasticsearchClient.deleteByQuery(builder.build()); DeleteByQueryRequest deleteBuild = builder.build();
log.info("Deleted {} documents with planId {}", response.deleted(), orderId); // es刚插入有可能无法马上查询删除(默认1s的可见时间),线程每1s删除一次,再删除两次
DeleteByQueryResponse response = elasticsearchClient.deleteByQuery(deleteBuild);
if (response.deleted() == 0) {
for (int i = 0; i < 2; i++) {
response = elasticsearchClient.deleteByQuery(deleteBuild);
// 删除成功,不再继续
if (response.deleted() > 0) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
log.error("====================【线程中断异常】====================");
}
}
}
log.info("Deleted {} documents with orderId {}", response.deleted(), orderId);
} catch (IOException | ElasticsearchException e) { } catch (IOException | ElasticsearchException e) {
log.error("Error deleting documents with planId {}: {}", orderId, e.getMessage()); log.error("Error deleting documents with orderId {}: {}", orderId, e.getMessage());
throw new ServiceException(INTERNAL_SERVER_ERROR); throw new ServiceException(INTERNAL_SERVER_ERROR);
} }
} }
@@ -60,6 +60,7 @@ import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@@ -127,6 +128,9 @@ public class WebCadOrderImportFactory {
// 是否入库的第一块板件 // 是否入库的第一块板件
private boolean isFirstPlate; private boolean isFirstPlate;
// 是否有插入es数据
private boolean esInsert;
private CustomPlateNoGenerateConfigVO plateNoGenerateConfigVO; private CustomPlateNoGenerateConfigVO plateNoGenerateConfigVO;
// 操作人 // 操作人
@@ -221,8 +225,12 @@ public class WebCadOrderImportFactory {
saveData(); saveData();
} catch (Exception e) { } catch (Exception e) {
// 数据库数据回滚,此时删除 ES 里的数据 if (esInsert) {
orderInputProcessor.deleteByOrderIdBatch(orderId, batchId, ORDER_PLATE_MODEL); CompletableFuture.runAsync(() -> {
// 数据库数据回滚,此时删除 ES 里的数据
orderInputProcessor.deleteByOrderIdBatch(orderId, batchId, ORDER_PLATE_MODEL);
});
}
throw e; throw e;
} finally { } finally {
// 清理数据 // 清理数据
@@ -269,54 +277,65 @@ public class WebCadOrderImportFactory {
String plateGoodsId = materialReqVO.getId(); String plateGoodsId = materialReqVO.getId();
String plateGoodsGoodsId = materialReqVO.getGoodsId(); String plateGoodsGoodsId = materialReqVO.getGoodsId();
PlateGoodDO plateGoodDO = plateGoodMapper.selectById(plateGoodsId); PlateGoodDO plateGoodDO = plateGoodMapper.selectById(plateGoodsId);
// 检查板材库
if (ObjectUtil.isNull(plateGoodDO)) { if (ObjectUtil.isNull(plateGoodDO)) {
throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_PLATE_NOT_EXIST_ERROR, plateGoodsId); throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_PLATE_NOT_EXIST_ERROR, plateGoodsId);
} }
// 创建设计端商品 // 检查生产单下是否已经有板材下的order_goods,有不再创建
Long rawGoodsId = (Long) snowFlakeGenerator.nextId(null); List<GoodsDO> existOrderGoods = goodsMapper.selectList(new LambdaUpdateWrapper<GoodsDO>()
RawGoodsDO rawGoodsDO = RawGoodsDO.builder() .eq(GoodsDO::getGoodsId, plateGoodsGoodsId)
.id(rawGoodsId) .eq(GoodsDO::getOrderId, orderId)
.orderId(orderId) .eq(GoodsDO::getOrganId, organId));
.rawGoodsId(plateGoodsGoodsId) Long orderGoodsId;
.goodsName(plateGoodDO.getGoodsName()) if (CollUtil.isNotEmpty(existOrderGoods)) {
.material(plateGoodDO.getMaterial()) orderGoodsId = existOrderGoods.get(0).getId();
.texture(plateGoodDO.getTexture()) } else {
.color(plateGoodDO.getColor()) // 创建设计端商品
.colorBlack(StringUtils.isNotEmpty(plateGoodDO.getColorBlack()) ? plateGoodDO.getColorBlack() : EMPTY_STRING) Long rawGoodsId = (Long) snowFlakeGenerator.nextId(null);
.thickness(plateGoodDO.getThickness()) RawGoodsDO rawGoodsDO = RawGoodsDO.builder()
.spec(plateGoodDO.getSpec()) .id(rawGoodsId)
.brand(plateGoodDO.getBrand()) .orderId(orderId)
.price(0.00) .rawGoodsId(plateGoodsGoodsId)
.deleted(false) .goodsName(plateGoodDO.getGoodsName())
.organId(organId) .material(plateGoodDO.getMaterial())
.build(); .texture(plateGoodDO.getTexture())
Long orderGoodsId = (Long) snowFlakeGenerator.nextId(null); .color(plateGoodDO.getColor())
.colorBlack(StringUtils.isNotEmpty(plateGoodDO.getColorBlack()) ? plateGoodDO.getColorBlack() : EMPTY_STRING)
.thickness(plateGoodDO.getThickness())
.spec(plateGoodDO.getSpec())
.brand(plateGoodDO.getBrand())
.price(0.00)
.deleted(false)
.organId(organId)
.build();
orderGoodsId = (Long) snowFlakeGenerator.nextId(null);
// 创建生产单商品 // 创建生产单商品
GoodsDO goodsDO = GoodsDO.builder() GoodsDO goodsDO = GoodsDO.builder()
.id(orderGoodsId) .id(orderGoodsId)
.orderId(orderId) .orderId(orderId)
.rawGoodsId(String.valueOf(rawGoodsId)) .rawGoodsId(String.valueOf(rawGoodsId))
.goodsId(plateGoodsGoodsId) .goodsId(plateGoodsGoodsId)
.goodsName(plateGoodDO.getGoodsName()) .goodsName(plateGoodDO.getGoodsName())
.material(plateGoodDO.getMaterial()) .material(plateGoodDO.getMaterial())
.texture(plateGoodDO.getTexture()) .texture(plateGoodDO.getTexture())
.color(plateGoodDO.getColor()) .color(plateGoodDO.getColor())
.colorBlack(StringUtils.isNotEmpty(plateGoodDO.getColorBlack()) ? plateGoodDO.getColorBlack() : EMPTY_STRING) .colorBlack(StringUtils.isNotEmpty(plateGoodDO.getColorBlack()) ? plateGoodDO.getColorBlack() : EMPTY_STRING)
.width(BigDecimal.valueOf(plateGoodDO.getWidth())) .width(BigDecimal.valueOf(plateGoodDO.getWidth()))
.height(BigDecimal.valueOf(plateGoodDO.getHeight())) .height(BigDecimal.valueOf(plateGoodDO.getHeight()))
.thickness(BigDecimal.valueOf(plateGoodDO.getThickness())) .thickness(BigDecimal.valueOf(plateGoodDO.getThickness()))
.spec(plateGoodDO.getSpec()) .spec(plateGoodDO.getSpec())
.brand(plateGoodDO.getBrand()) .brand(plateGoodDO.getBrand())
.remark(EMPTY_STRING) .remark(EMPTY_STRING)
.planId(0L) .planId(0L)
.price(0.00) .price(0.00)
.deleted(false) .deleted(false)
.organId(organId) .organId(organId)
.build(); .build();
goodsDOS.add(goodsDO); goodsDOS.add(goodsDO);
rawGoodsDOS.add(rawGoodsDO); rawGoodsDOS.add(rawGoodsDO);
}
for (Integer blockIndex : materialReqVO.getOrginIds()) { for (Integer blockIndex : materialReqVO.getOrginIds()) {
// blockIndex序号获取对应板件a // blockIndex序号获取对应板件a
WebCadDataBlockReqVO webCadDataBlockReqVO = blockReqVOS.get(blockIndex - 1); WebCadDataBlockReqVO webCadDataBlockReqVO = blockReqVOS.get(blockIndex - 1);
@@ -631,6 +650,9 @@ public class WebCadOrderImportFactory {
orderModelDO.setCreator(operatorName); orderModelDO.setCreator(operatorName);
orderModelDO.setUpdater(operatorName); orderModelDO.setUpdater(operatorName);
orderModelDOS.add(orderModelDO); orderModelDOS.add(orderModelDO);
if (!esInsert) {
esInsert = true;
}
// 批量插入造型数据 // 批量插入造型数据
orderModelsBatchInsertWithinThreshold(false); orderModelsBatchInsertWithinThreshold(false);
@@ -999,14 +1021,16 @@ public class WebCadOrderImportFactory {
if (PART_CATEGORY_ONE.equals(partType)) { if (PART_CATEGORY_ONE.equals(partType)) {
// 封边对应查询配件库中的封边条配件,使用配件库的model、spec、brand、factory // 封边对应查询配件库中的封边条配件,使用配件库的model、spec、brand、factory
String sealPartId = part.getPartId(); String sealPartId = part.getPartId();
PartsDO partsDO = partsMapper.selectById(sealPartId); if (ObjectUtil.isNotNull(sealPartId)) {
if (ObjectUtil.isNotNull(partsDO)) { PartsDO partsDO = partsMapper.selectById(sealPartId);
model = partsDO.getModel(); if (ObjectUtil.isNotNull(partsDO)) {
spec = partsDO.getSpec(); model = partsDO.getModel();
brand = partsDO.getBrand(); spec = partsDO.getSpec();
factory = partsDO.getFactory(); brand = partsDO.getBrand();
} else { factory = partsDO.getFactory();
throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_SEAL_NOT_EXIST_ERROR, sealPartId); } else {
throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_SEAL_NOT_EXIST_ERROR, sealPartId);
}
} }
} }