diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/order/OrderInputProcessor.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/order/OrderInputProcessor.java index dab80f2d3..45ffa8724 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/order/OrderInputProcessor.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/order/OrderInputProcessor.java @@ -92,14 +92,32 @@ public class OrderInputProcessor { public void deleteByOrderIdBatch(Long orderId, Long batchId, String index) { DeleteByQueryRequest.Builder builder = new DeleteByQueryRequest.Builder(); builder.index(index); - builder.query(q -> q.term(t -> t.field(FIELD_ORDER_ID).value(orderId))); - builder.query(q -> q.term(t -> t.field(FIELD_BATCH_ID).value(batchId))); + builder.query(q -> q.bool(b -> b + .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 { - DeleteByQueryResponse response = elasticsearchClient.deleteByQuery(builder.build()); - log.info("Deleted {} documents with planId {}", response.deleted(), orderId); + DeleteByQueryRequest deleteBuild = builder.build(); + // 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) { - 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); } } 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 5203f84a2..1d24f487f 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 @@ -60,6 +60,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -127,6 +128,9 @@ public class WebCadOrderImportFactory { // 是否入库的第一块板件 private boolean isFirstPlate; + // 是否有插入es数据 + private boolean esInsert; + private CustomPlateNoGenerateConfigVO plateNoGenerateConfigVO; // 操作人 @@ -221,8 +225,12 @@ public class WebCadOrderImportFactory { saveData(); } catch (Exception e) { - // 数据库数据回滚,此时删除 ES 里的数据 - orderInputProcessor.deleteByOrderIdBatch(orderId, batchId, ORDER_PLATE_MODEL); + if (esInsert) { + CompletableFuture.runAsync(() -> { + // 数据库数据回滚,此时删除 ES 里的数据 + orderInputProcessor.deleteByOrderIdBatch(orderId, batchId, ORDER_PLATE_MODEL); + }); + } throw e; } finally { // 清理数据 @@ -269,54 +277,65 @@ public class WebCadOrderImportFactory { String plateGoodsId = materialReqVO.getId(); String plateGoodsGoodsId = materialReqVO.getGoodsId(); PlateGoodDO plateGoodDO = plateGoodMapper.selectById(plateGoodsId); + // 检查板材库 if (ObjectUtil.isNull(plateGoodDO)) { throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_PLATE_NOT_EXIST_ERROR, plateGoodsId); } - // 创建设计端商品 - Long rawGoodsId = (Long) snowFlakeGenerator.nextId(null); - RawGoodsDO rawGoodsDO = RawGoodsDO.builder() - .id(rawGoodsId) - .orderId(orderId) - .rawGoodsId(plateGoodsGoodsId) - .goodsName(plateGoodDO.getGoodsName()) - .material(plateGoodDO.getMaterial()) - .texture(plateGoodDO.getTexture()) - .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(); - Long orderGoodsId = (Long) snowFlakeGenerator.nextId(null); + // 检查生产单下是否已经有板材下的order_goods,有不再创建 + List existOrderGoods = goodsMapper.selectList(new LambdaUpdateWrapper() + .eq(GoodsDO::getGoodsId, plateGoodsGoodsId) + .eq(GoodsDO::getOrderId, orderId) + .eq(GoodsDO::getOrganId, organId)); + Long orderGoodsId; + if (CollUtil.isNotEmpty(existOrderGoods)) { + orderGoodsId = existOrderGoods.get(0).getId(); + } else { + // 创建设计端商品 + Long rawGoodsId = (Long) snowFlakeGenerator.nextId(null); + RawGoodsDO rawGoodsDO = RawGoodsDO.builder() + .id(rawGoodsId) + .orderId(orderId) + .rawGoodsId(plateGoodsGoodsId) + .goodsName(plateGoodDO.getGoodsName()) + .material(plateGoodDO.getMaterial()) + .texture(plateGoodDO.getTexture()) + .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() - .id(orderGoodsId) - .orderId(orderId) - .rawGoodsId(String.valueOf(rawGoodsId)) - .goodsId(plateGoodsGoodsId) - .goodsName(plateGoodDO.getGoodsName()) - .material(plateGoodDO.getMaterial()) - .texture(plateGoodDO.getTexture()) - .color(plateGoodDO.getColor()) - .colorBlack(StringUtils.isNotEmpty(plateGoodDO.getColorBlack()) ? plateGoodDO.getColorBlack() : EMPTY_STRING) - .width(BigDecimal.valueOf(plateGoodDO.getWidth())) - .height(BigDecimal.valueOf(plateGoodDO.getHeight())) - .thickness(BigDecimal.valueOf(plateGoodDO.getThickness())) - .spec(plateGoodDO.getSpec()) - .brand(plateGoodDO.getBrand()) - .remark(EMPTY_STRING) - .planId(0L) - .price(0.00) - .deleted(false) - .organId(organId) - .build(); + // 创建生产单商品 + GoodsDO goodsDO = GoodsDO.builder() + .id(orderGoodsId) + .orderId(orderId) + .rawGoodsId(String.valueOf(rawGoodsId)) + .goodsId(plateGoodsGoodsId) + .goodsName(plateGoodDO.getGoodsName()) + .material(plateGoodDO.getMaterial()) + .texture(plateGoodDO.getTexture()) + .color(plateGoodDO.getColor()) + .colorBlack(StringUtils.isNotEmpty(plateGoodDO.getColorBlack()) ? plateGoodDO.getColorBlack() : EMPTY_STRING) + .width(BigDecimal.valueOf(plateGoodDO.getWidth())) + .height(BigDecimal.valueOf(plateGoodDO.getHeight())) + .thickness(BigDecimal.valueOf(plateGoodDO.getThickness())) + .spec(plateGoodDO.getSpec()) + .brand(plateGoodDO.getBrand()) + .remark(EMPTY_STRING) + .planId(0L) + .price(0.00) + .deleted(false) + .organId(organId) + .build(); - goodsDOS.add(goodsDO); - rawGoodsDOS.add(rawGoodsDO); + goodsDOS.add(goodsDO); + rawGoodsDOS.add(rawGoodsDO); + } for (Integer blockIndex : materialReqVO.getOrginIds()) { // blockIndex序号获取对应板件a WebCadDataBlockReqVO webCadDataBlockReqVO = blockReqVOS.get(blockIndex - 1); @@ -631,6 +650,9 @@ public class WebCadOrderImportFactory { orderModelDO.setCreator(operatorName); orderModelDO.setUpdater(operatorName); orderModelDOS.add(orderModelDO); + if (!esInsert) { + esInsert = true; + } // 批量插入造型数据 orderModelsBatchInsertWithinThreshold(false); @@ -999,14 +1021,16 @@ public class WebCadOrderImportFactory { if (PART_CATEGORY_ONE.equals(partType)) { // 封边对应查询配件库中的封边条配件,使用配件库的model、spec、brand、factory String sealPartId = part.getPartId(); - PartsDO partsDO = partsMapper.selectById(sealPartId); - if (ObjectUtil.isNotNull(partsDO)) { - model = partsDO.getModel(); - spec = partsDO.getSpec(); - brand = partsDO.getBrand(); - factory = partsDO.getFactory(); - } else { - throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_SEAL_NOT_EXIST_ERROR, sealPartId); + if (ObjectUtil.isNotNull(sealPartId)) { + PartsDO partsDO = partsMapper.selectById(sealPartId); + if (ObjectUtil.isNotNull(partsDO)) { + model = partsDO.getModel(); + spec = partsDO.getSpec(); + brand = partsDO.getBrand(); + factory = partsDO.getFactory(); + } else { + throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_SEAL_NOT_EXIST_ERROR, sealPartId); + } } }