From ba115da9bb8889dc03ac82f1f80aa6ba69f4fb48 Mon Sep 17 00:00:00 2001 From: liuy <37787198+LiuyCodes@users.noreply.github.com> Date: Sat, 26 Oct 2024 15:27:56 +0800 Subject: [PATCH] =?UTF-8?q?perf(buildpackage):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=E5=92=8C?= =?UTF-8?q?=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调整了数据过滤和保存的顺序,先过滤再保存,提高效率 - 使用流式处理和并发插入数据,提升性能 -修复了一些潜在的空指针异常问题 - 优化了日志输出,增加了耗时记录 --- .../sales/SoSaleOutPluginInitializerToC.java | 67 +++++++++++++------ .../SoSaleReturnPluginInitializerToC.java | 48 ++++++++----- 2 files changed, 79 insertions(+), 36 deletions(-) diff --git a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToC.java b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToC.java index 00b2c471..86721e49 100644 --- a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToC.java +++ b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToC.java @@ -405,10 +405,10 @@ public class SoSaleOutPluginInitializerToC extends PluginBaseEntity { * @author liuyang */ private void getSetStock(List headerDetailsDtoList) throws Exception { - //保存到mysql底表 - batchInsert(headerDetailsDtoList); //过滤成功的数据 List headerDetailsDtos = filterDataStock(headerDetailsDtoList); + //保存到mysql底表 + batchInsert(headerDetailsDtos); //执行推送主逻辑 implementStock(headerDetailsDtos); } @@ -419,11 +419,11 @@ public class SoSaleOutPluginInitializerToC extends PluginBaseEntity { * @author liuyang */ private void getSetTran(List headerDetailsDtoList) throws Exception { - //保存到mysql底表 - batchInsert(headerDetailsDtoList); - //过滤成功的数据 + //先过滤成功的数据,再保存到低表 //headerDetailsDtos携带红、蓝单据推送成功与否的明细行 List headerDetailsDtos = filterDataTran(headerDetailsDtoList); + //保存到mysql底表 + batchInsert(headerDetailsDtos); //执行推送采购主逻辑 implementTran(headerDetailsDtos); } @@ -587,6 +587,18 @@ public class SoSaleOutPluginInitializerToC extends PluginBaseEntity { private List filterDataRowsAsPushOrFailedTran(List allTocofsSaleoutDetailedEntityList, List headerDetailsDtoList) throws Exception { List targetHeaderDetailsDtoList = new ArrayList<>(); if (headerDetailsDtoList != null && headerDetailsDtoList.size() > 0) { + List resultList2 = allTocofsSaleoutDetailedEntityList.stream().map(obj -> { + if (obj.getNewstate2() == null) { + obj.setNewstate2(""); + } + if (obj.getNewstate3() == null) { + obj.setNewstate3(""); + } + return obj; + }).collect(Collectors.toList()); + Map no2NameMap2 = resultList2.stream().collect(Collectors.toMap(TocofsSaleoutDetailedEntity::getId, TocofsSaleoutDetailedEntity::getNewstate2)); + Map no2NameMap3 = resultList2.stream().collect(Collectors.toMap(TocofsSaleoutDetailedEntity::getId, TocofsSaleoutDetailedEntity::getNewstate3)); + //字段Y(成功)或者为H(待处理)可以视为成功,完成了小段业务闭环的数据行 String succeseeY = "Y"; String succeseeH = "H"; @@ -603,21 +615,28 @@ public class SoSaleOutPluginInitializerToC extends PluginBaseEntity { String newstate2 = null; String newstate3 = null; // TocofsSaleoutDetailedEntity targetTocofsSaleoutDetailedEntity = null; - if (allTocofsSaleoutDetailedEntityList != null && allTocofsSaleoutDetailedEntityList.size() > 0) { - for (int k = 0; k < allTocofsSaleoutDetailedEntityList.size(); k++) { - TocofsSaleoutDetailedEntity tocofsSaleoutDetailedEntity = allTocofsSaleoutDetailedEntityList.get(k); - if (tocofsSaleoutDetailedEntity.getId().equals(detailsDto.getId())) { - newstate2 = tocofsSaleoutDetailedEntity.getNewstate2(); - newstate3 = tocofsSaleoutDetailedEntity.getNewstate3(); -// targetTocofsSaleoutDetailedEntity = tocofsSaleoutDetailedEntity; - //验证交易成功(红)是否成功、(销售)交易成功(蓝)是否成功 两者如果都成功,则过滤掉,如果其中一个不能成功,则还是需要进行补推! - //验证红或蓝单据是否推送成功的代码,在implementTran中实现 - if ((succeseeY.equals(newstate2) || succeseeH.equals(newstate2)) && (succeseeY.equals(newstate3) || succeseeH.equals(newstate3))) { - isSuccess = true; - } - } - } +// if (allTocofsSaleoutDetailedEntityList != null && allTocofsSaleoutDetailedEntityList.size() > 0) { +// for (int k = 0; k < allTocofsSaleoutDetailedEntityList.size(); k++) { +// TocofsSaleoutDetailedEntity tocofsSaleoutDetailedEntity = allTocofsSaleoutDetailedEntityList.get(k); +// if (tocofsSaleoutDetailedEntity.getId().equals(detailsDto.getId())) { +// newstate2 = tocofsSaleoutDetailedEntity.getNewstate2(); +// newstate3 = tocofsSaleoutDetailedEntity.getNewstate3(); +//// targetTocofsSaleoutDetailedEntity = tocofsSaleoutDetailedEntity; +// //验证交易成功(红)是否成功、(销售)交易成功(蓝)是否成功 两者如果都成功,则过滤掉,如果其中一个不能成功,则还是需要进行补推! +// //验证红或蓝单据是否推送成功的代码,在implementTran中实现 +// if ((succeseeY.equals(newstate2) || succeseeH.equals(newstate2)) && (succeseeY.equals(newstate3) || succeseeH.equals(newstate3))) { +// isSuccess = true; +// } +// } +// } +// } + //交易成功红 + newstate2 = no2NameMap2.get(detailsDto.getId()); + newstate3 = no2NameMap3.get(detailsDto.getId()); + if ((newstate2 != null && newstate3 != null) && (succeseeY.equals(newstate2) || succeseeH.equals(newstate2)) && (succeseeY.equals(newstate3) || succeseeH.equals(newstate3))) { + isSuccess = true; } + if (!isSuccess) { //拷贝推送状态参数,方便推送是进行判断 detailsDto.setNewState2(newstate2); @@ -681,8 +700,9 @@ public class SoSaleOutPluginInitializerToC extends PluginBaseEntity { } //每50作为一个批次插入主表,根据主键(id)判断是否重复,如果重复的,则不进行插入 - List> ofssaleorderoutsearchList = SplitListByCountUtil.splitListByCount(headerDetailsDtoList1, 500); + List> ofssaleorderoutsearchList = SplitListByCountUtil.splitListByCount(headerDetailsDtoList1, 200); for (int i = 0; i < ofssaleorderoutsearchList.size(); i++) { + long startTime = System.currentTimeMillis(); List headerDtoList = ofssaleorderoutsearchList.get(i); Thread thread = new Thread(new Runnable() { @Override @@ -706,12 +726,15 @@ public class SoSaleOutPluginInitializerToC extends PluginBaseEntity { } catch (Exception e) { logger.error("堵塞线程抛出异常", e); } + long endTime = System.currentTimeMillis(); + logger.info("插入或更新TOC销售出库表头-耗时:{}", (endTime - startTime)); } //插入明细表 - List> detailsDtoList = SplitListByCountUtil.splitListByCount(headerDetailsDtoList2, 500); + List> detailsDtoList = SplitListByCountUtil.splitListByCount(headerDetailsDtoList2, 200); for (int i = 0; i < detailsDtoList.size(); i++) { List detailsDtos = detailsDtoList.get(i); + long startTime = System.currentTimeMillis(); Thread thread = new Thread(new Runnable() { @Override public void run() { @@ -734,6 +757,8 @@ public class SoSaleOutPluginInitializerToC extends PluginBaseEntity { } catch (Exception e) { logger.error("堵塞线程抛出异常", e); } + long endTime = System.currentTimeMillis(); + logger.info("插入或更新TOC销售出库表体-耗时:{}", (endTime - startTime)); } } catch (Exception e) { logger.error("TOC业务保存到Mysql底表失败!TocofsSaleoutEntity、TocofsSaleoutDetailedEntity保存失败", e); diff --git a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleReturnPluginInitializerToC.java b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleReturnPluginInitializerToC.java index 73b29948..4900a5a2 100644 --- a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleReturnPluginInitializerToC.java +++ b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleReturnPluginInitializerToC.java @@ -332,10 +332,10 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { * @author liuyang */ private void getSetStock(List returnGoodHeaderDetailsDataDtoArrayList) throws Exception { - //保存到mysql - batchInsert(returnGoodHeaderDetailsDataDtoArrayList); //过滤成功的数据 List stockinOrderList = filterDataStock(returnGoodHeaderDetailsDataDtoArrayList); + //保存到mysql + batchInsert(stockinOrderList); //执行推送主逻辑 implementStock(stockinOrderList); } @@ -346,10 +346,10 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { * @author liuyang */ private void getSetTran(List returnGoodHeaderDetailsDataDtoArrayList) throws Exception { - //保存到mysql - batchInsert(returnGoodHeaderDetailsDataDtoArrayList); //过滤成功的数据 List stockinOrderList = filterDataTran(returnGoodHeaderDetailsDataDtoArrayList); + //保存到mysql + batchInsert(stockinOrderList); //执行推送主逻辑 implementTran(stockinOrderList); } @@ -462,9 +462,10 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { } //每250作为一个批次插入主表,根据主键(id)判断是否重复,如果重复的,则不进行插入 - List> lists = SplitListByCountUtil.splitListByCount(headerDetailsDtoList1, 500); + List> lists = SplitListByCountUtil.splitListByCount(headerDetailsDtoList1, 100); for (int i = 0; i < lists.size(); i++) { List stockinHS = lists.get(i); + long startTime = System.currentTimeMillis(); Thread thread = new Thread(new Runnable() { @Override public void run() { @@ -487,13 +488,16 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { } catch (Exception e) { logger.error("线程保存TOC退货主表抛出异常", e); } + long endTime = System.currentTimeMillis(); + logger.info("插入或更新TOC退货入库表头-耗时:{}", (endTime - startTime)); } //插入明细表 - List> lists1 = SplitListByCountUtil.splitListByCount(headerDetailsDtoList2, 500); + List> lists1 = SplitListByCountUtil.splitListByCount(headerDetailsDtoList2, 100); for (int i = 0; i < lists1.size(); i++) { List stockinBS = lists1.get(i); List tocofsReturngoodsDetailedEntities = copyDetailsDto(stockinBS); + long startTime = System.currentTimeMillis(); Thread thread = new Thread(new Runnable() { @Override public void run() { @@ -515,6 +519,8 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { } catch (Exception e) { logger.error("线程保存TOC退货明细抛出异常", e); } + long endTime = System.currentTimeMillis(); + logger.info("插入或更新TOC退货入库表体-耗时:{}", (endTime - startTime)); } } } @@ -2182,8 +2188,15 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { Assert.notNull(returnGoodHeaderDetailsDataDtoArrayList, "returnGoodHeaderDetailsDataDtoArrayList不能为空"); List targetHeaderDetailsDtoList = new ArrayList<>(); - if (tocofsReturngoodsDetailedEntityList != null && tocofsReturngoodsDetailedEntityList.size() > 0 && returnGoodHeaderDetailsDataDtoArrayList != null && returnGoodHeaderDetailsDataDtoArrayList.size() > 0) { + List collect = tocofsReturngoodsDetailedEntityList.stream().map(obj -> { + if (obj.getNewstate4() == null) { + obj.setNewstate4(""); + } + return obj; + }).collect(Collectors.toList()); + Map no2NameMap2 = collect.stream().collect(Collectors.toMap(TocofsReturngoodsDetailedEntity::getId, TocofsReturngoodsDetailedEntity::getNewstate4)); + //字段Y(成功)或者为H(待处理)可以视为成功,完成了小段业务闭环的数据行 String succeseeY = "Y"; String succeseeH = "H"; @@ -2197,15 +2210,20 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { StockinOrderSearchResponse.StockinOrder.StockinB stockinB = details.get(j); Boolean isSuccess = false; String newstate = null; - for (int k = 0; k < tocofsReturngoodsDetailedEntityList.size(); k++) { - TocofsReturngoodsDetailedEntity tocofsReturngoodsDetailedEntity = tocofsReturngoodsDetailedEntityList.get(k); - if (tocofsReturngoodsDetailedEntity.getId().equals(stockinB.getId())) { - newstate = tocofsReturngoodsDetailedEntity.getNewstate4(); - if (succeseeY.equals(newstate) || succeseeH.equals(newstate)) { - isSuccess = true; - } - } +// for (int k = 0; k < tocofsReturngoodsDetailedEntityList.size(); k++) { +// TocofsReturngoodsDetailedEntity tocofsReturngoodsDetailedEntity = tocofsReturngoodsDetailedEntityList.get(k); +// if (tocofsReturngoodsDetailedEntity.getId().equals(stockinB.getId())) { +// newstate = tocofsReturngoodsDetailedEntity.getNewstate4(); +// if (succeseeY.equals(newstate) || succeseeH.equals(newstate)) { +// isSuccess = true; +// } +// } +// } + newstate = no2NameMap2.get(stockinB.getId()); + if (newstate != null && !"".equals(newstate) && (succeseeY.equals(newstate) || succeseeH.equals(newstate))) { + isSuccess = true; } + if (!isSuccess) { stockinB.setNewstate4(newstate); targetDetails.add(stockinB);