From 29a17362b201bff59453e26d4a2e668e69770806 Mon Sep 17 00:00:00 2001 From: liuy <37787198+LiuyCodes@users.noreply.github.com> Date: Sat, 26 Oct 2024 13:36:24 +0800 Subject: [PATCH] =?UTF-8?q?refactor(sales):=20=E4=BC=98=E5=8C=96=E5=94=AE?= =?UTF-8?q?=E5=90=8E=E8=AE=A2=E5=8D=95=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 去除无效的售后订单号,避免不必要的查询 - 优化批量查询逻辑,提高查询效率 -修复可能的空指针异常,提升代码稳定性 --- .../SoSaleReturnPluginInitializerToC.java | 185 +++++++++++++----- .../SoSaleOutPluginInitializerToBTest.java | 6 +- 2 files changed, 137 insertions(+), 54 deletions(-) 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 c83bc6ac..c69c28b6 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 @@ -1664,26 +1664,51 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { List rerturnGoodsOrderSearchDataList = new ArrayList<>(); if (returnGoodHeaderDetailsDataDtoList1 != null && returnGoodHeaderDetailsDataDtoList1.size() > 0) { try { - List> splitListByCount = SplitListByCountUtil.splitListByCount(returnGoodHeaderDetailsDataDtoList1, 50); - for (int i = 0; i < splitListByCount.size(); i++) { - List stockinOrderList = splitListByCount.get(i); - //50个原始一个批次进行分割 - StringBuffer idStr = new StringBuffer(); - for (int j = 0; j < stockinOrderList.size(); j++) { - StockinOrderSearchResponse.StockinOrder stockinOrder = stockinOrderList.get(j); - StockinOrderSearchResponse.StockinOrder.StockinH header = stockinOrder.getHeader(); -// List details = stockinOrder.getDetails(); - idStr.append(header.getRefOrderCode()); - idStr.append(","); + //完成去重 + Set refOrderCodeSet = new HashSet<>(); +// List> splitListByCount = SplitListByCountUtil.splitListByCount(returnGoodHeaderDetailsDataDtoList1, 50); +// for (int i = 0; i < splitListByCount.size(); i++) { +// List stockinOrderList = splitListByCount.get(i); +// //50个原始一个批次进行分割 +// StringBuffer idStr = new StringBuffer(); +// for (int j = 0; j < stockinOrderList.size(); j++) { +// StockinOrderSearchResponse.StockinOrder stockinOrder = stockinOrderList.get(j); +// StockinOrderSearchResponse.StockinOrder.StockinH header = stockinOrder.getHeader(); +//// List details = stockinOrder.getDetails(); +// idStr.append(header.getRefOrderCode()); +// idStr.append(","); +// } +// String idsStr = idStr.substring(0, idStr.length() - 1); +// +// QueryOfsSoSaleOutVo queryOfsSoSaleOutVo = new QueryOfsSoSaleOutVo(); +// queryOfsSoSaleOutVo.setCode(idsStr); +// afterSalesOrderUtil.getBatchOfsRertunOrder(queryOfsSoSaleOutVo, rerturnGoodsOrderSearchDataList, 1L); +// } + //已经和万万确认,售后入库单明细行不会有合单的情况 + for (int i = 0; i < returnGoodHeaderDetailsDataDtoList1.size(); i++) { + StockinOrderSearchResponse.StockinOrder stockinOrder = returnGoodHeaderDetailsDataDtoList1.get(i); + StockinOrderSearchResponse.StockinOrder.StockinH header = stockinOrder.getHeader(); + List details = stockinOrder.getDetails(); + String refOrderCode = header.getRefOrderCode(); + if (refOrderCode != null && !"".equals(refOrderCode.trim())) { + refOrderCodeSet.add(refOrderCode.trim()); + } + } + if (refOrderCodeSet.size() > 0) { + List stringList = refOrderCodeSet.stream().collect(Collectors.toList()); + List> lists = SplitListByCountUtil.splitListByCount(stringList, 100); + for (int i = 0; i < lists.size(); i++) { + List strings = lists.get(i); + String result = strings.stream().map(s -> s.trim()).collect(Collectors.joining(",")); + if (result != null && result.length() > 0) { + QueryOfsSoSaleOutVo queryOfsSoSaleOutVo = new QueryOfsSoSaleOutVo(); + queryOfsSoSaleOutVo.setCode(result); + afterSalesOrderUtil.getBatchOfsRertunOrder(queryOfsSoSaleOutVo, rerturnGoodsOrderSearchDataList, 1L); + } } - String idsStr = idStr.substring(0, idStr.length() - 1); - - QueryOfsSoSaleOutVo queryOfsSoSaleOutVo = new QueryOfsSoSaleOutVo(); - queryOfsSoSaleOutVo.setCode(idsStr); - afterSalesOrderUtil.getBatchOfsRertunOrder(queryOfsSoSaleOutVo, rerturnGoodsOrderSearchDataList, 1L); } } catch (Exception e) { - logger.error("批量查询售后订单", e); + logger.error("批量查询关联售后订单抛出异常", e); } } return rerturnGoodsOrderSearchDataList; @@ -1699,17 +1724,32 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { private void findAfterSalesOrder(List rerturnGoodsOrderSearchDataList, List returnGoodHeaderDetailsDataDtoList1) throws Exception { if (rerturnGoodsOrderSearchDataList != null && rerturnGoodsOrderSearchDataList.size() > 0 && returnGoodHeaderDetailsDataDtoList1 != null && returnGoodHeaderDetailsDataDtoList1.size() > 0) { try { + //如果id为空,则这里会报错,所以把id设置为"" + rerturnGoodsOrderSearchDataList.forEach(dto -> { + if (dto.getHeader() != null && dto.getHeader().getId() == null) { + dto.getHeader().setId(""); + } + }); + Map collect = rerturnGoodsOrderSearchDataList.stream().collect(Collectors.toMap(dto -> dto.getHeader().getId(), dto -> dto)); + for (int i = 0; i < returnGoodHeaderDetailsDataDtoList1.size(); i++) { StockinOrderSearchResponse.StockinOrder stockinOrder = returnGoodHeaderDetailsDataDtoList1.get(i); StockinOrderSearchResponse.StockinOrder.StockinH header = stockinOrder.getHeader(); List details = stockinOrder.getDetails(); - Assert.notNull(header.getId(), "OFS售后入库单主键不能为空!"); - for (int j = 0; j < rerturnGoodsOrderSearchDataList.size(); j++) { - RerturnGoodsOrderSearchData rerturnGoodsOrderSearchData = rerturnGoodsOrderSearchDataList.get(j); - RerturnGoodsOrderSearchHeader header1 = rerturnGoodsOrderSearchData.getHeader(); - List details1 = rerturnGoodsOrderSearchData.getDetails(); - if (header.getRefOrderId().equals(header1.getId())) { +// Assert.notNull(header.getId(), "OFS售后入库单主键不能为空!"); +// for (int j = 0; j < rerturnGoodsOrderSearchDataList.size(); j++) { +// RerturnGoodsOrderSearchData rerturnGoodsOrderSearchData = rerturnGoodsOrderSearchDataList.get(j); +// RerturnGoodsOrderSearchHeader header1 = rerturnGoodsOrderSearchData.getHeader(); +// List details1 = rerturnGoodsOrderSearchData.getDetails(); +// if (header.getRefOrderId().equals(header1.getId())) { +// header.setRerturnGoodsOrderSearchData(rerturnGoodsOrderSearchData); +// } +// } + String id = header.getId(); + if (id != null && !"".equals(id)) { + RerturnGoodsOrderSearchData rerturnGoodsOrderSearchData = collect.get(id); + if (rerturnGoodsOrderSearchData != null) { header.setRerturnGoodsOrderSearchData(rerturnGoodsOrderSearchData); } } @@ -1749,7 +1789,7 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { } /** - * 通过售后订单,匹配OFS销售订单 + * 通过售后入库单对应的售后订单,查询OFS销售订单 * * @param returnGoodHeaderDetailsDataDtoList1 OFS售后入库单集合 * @author liuyang @@ -1759,29 +1799,60 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { if (returnGoodHeaderDetailsDataDtoList1 != null && returnGoodHeaderDetailsDataDtoList1.size() > 0) { try { - //每50个作为一批,拆分 - List> splitListByCount = SplitListByCountUtil.splitListByCount(returnGoodHeaderDetailsDataDtoList1, 50); - for (int i = 0; i < splitListByCount.size(); i++) { - List stockinOrderList = splitListByCount.get(i); - - StringBuffer codes = new StringBuffer(); - for (int j = 0; j < stockinOrderList.size(); j++) { - StockinOrderSearchResponse.StockinOrder stockinOrder = stockinOrderList.get(j); - StockinOrderSearchResponse.StockinOrder.StockinH header = stockinOrder.getHeader(); - List details = stockinOrder.getDetails(); - RerturnGoodsOrderSearchData rerturnGoodsOrderSearchData1 = header.getRerturnGoodsOrderSearchData();//OFS售后订单 - if (rerturnGoodsOrderSearchData1 != null) { - RerturnGoodsOrderSearchHeader header1 = rerturnGoodsOrderSearchData1.getHeader(); - List details1 = rerturnGoodsOrderSearchData1.getDetails(); - codes.append(header1.getRefOrderCode()); - codes.append(","); + Set refOrderCodeSet = new HashSet<>(); + for (int i = 0; i < returnGoodHeaderDetailsDataDtoList1.size(); i++) { + StockinOrderSearchResponse.StockinOrder stockinOrder = returnGoodHeaderDetailsDataDtoList1.get(i); + StockinOrderSearchResponse.StockinOrder.StockinH header = stockinOrder.getHeader(); + List details = stockinOrder.getDetails(); + if (header.getRerturnGoodsOrderSearchData() != null) { + RerturnGoodsOrderSearchData rerturnGoodsOrderSearchData = header.getRerturnGoodsOrderSearchData();//OFS售后入库单对应的「售后订单」 + RerturnGoodsOrderSearchHeader header1 = rerturnGoodsOrderSearchData.getHeader(); + List details1 = rerturnGoodsOrderSearchData.getDetails(); + //得到「售后订单」关联的销售订单号 + if (header1.getRefOrderCode() != null && !"".equals(header1.getRefOrderCode())) { + refOrderCodeSet.add(header1.getRefOrderCode().trim()); } } - String codesStr = codes.substring(0, codes.length() - 1); + } - QueryOfsSoSaleOutVo queryOfsSoSaleOutVo = new QueryOfsSoSaleOutVo(); - queryOfsSoSaleOutVo.setCode(codesStr); - ofsStandardUtil.getOfsSaleOrder(queryOfsSoSaleOutVo, headerDetailsDtoArrayList, 1L); + //每50个作为一批,拆分 +// List> splitListByCount = SplitListByCountUtil.splitListByCount(returnGoodHeaderDetailsDataDtoList1, 50); +// for (int i = 0; i < splitListByCount.size(); i++) { +// List stockinOrderList = splitListByCount.get(i); +// +// StringBuffer codes = new StringBuffer(); +// for (int j = 0; j < stockinOrderList.size(); j++) { +// StockinOrderSearchResponse.StockinOrder stockinOrder = stockinOrderList.get(j); +// StockinOrderSearchResponse.StockinOrder.StockinH header = stockinOrder.getHeader(); +// List details = stockinOrder.getDetails(); +// RerturnGoodsOrderSearchData rerturnGoodsOrderSearchData1 = header.getRerturnGoodsOrderSearchData();//OFS售后订单 +// if (rerturnGoodsOrderSearchData1 != null) { +// RerturnGoodsOrderSearchHeader header1 = rerturnGoodsOrderSearchData1.getHeader(); +// List details1 = rerturnGoodsOrderSearchData1.getDetails(); +// codes.append(header1.getRefOrderCode()); +// codes.append(","); +// } +// } +// String codesStr = codes.substring(0, codes.length() - 1); +// +// QueryOfsSoSaleOutVo queryOfsSoSaleOutVo = new QueryOfsSoSaleOutVo(); +// queryOfsSoSaleOutVo.setCode(codesStr); +// ofsStandardUtil.getOfsSaleOrder(queryOfsSoSaleOutVo, headerDetailsDtoArrayList, 1L); +// } + + //Set集合转List集合 + if (refOrderCodeSet.size() > 0) { + List stringList = refOrderCodeSet.stream().collect(Collectors.toList()); + List> lists = SplitListByCountUtil.splitListByCount(stringList, 100); + for (int i = 0; i < lists.size(); i++) { + List strings = lists.get(i); + String result = strings.stream().map(s -> s.trim()).collect(Collectors.joining(",")); + if (result != null && result.length() > 0) { + QueryOfsSoSaleOutVo queryOfsSoSaleOutVo = new QueryOfsSoSaleOutVo(); + queryOfsSoSaleOutVo.setCode(result); + ofsStandardUtil.getOfsSaleOrder(queryOfsSoSaleOutVo, headerDetailsDtoArrayList, 1L); + } + } } } catch (Exception e) { logger.error("queryBatchOfsOrder方法抛出异常", e); @@ -1800,20 +1871,32 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity { private void findOfsOrder(List headerDetailsDtoList, List returnGoodHeaderDetailsDataDtoList1) { if (headerDetailsDtoList != null && headerDetailsDtoList.size() > 0 && returnGoodHeaderDetailsDataDtoList1 != null && returnGoodHeaderDetailsDataDtoList1.size() > 0) { try { + headerDetailsDtoList.forEach(dto -> { + if (dto.getHeader() != null && dto.getHeader().getId() == null) { + dto.getHeader().setId(""); + } + }); + Map collect = headerDetailsDtoList.stream().collect(Collectors.toMap(dto -> dto.getHeader().getId(), dto -> dto)); + for (int i = 0; i < returnGoodHeaderDetailsDataDtoList1.size(); i++) { StockinOrderSearchResponse.StockinOrder stockinOrder = returnGoodHeaderDetailsDataDtoList1.get(i); StockinOrderSearchResponse.StockinOrder.StockinH header = stockinOrder.getHeader(); List details = stockinOrder.getDetails(); - + RerturnGoodsOrderSearchData rerturnGoodsOrderSearchData = header.getRerturnGoodsOrderSearchData();//OFS售后订单 RerturnGoodsOrderSearchHeader header2 = rerturnGoodsOrderSearchData.getHeader(); List details2 = rerturnGoodsOrderSearchData.getDetails(); - - for (int j = 0; j < headerDetailsDtoList.size(); j++) { - com.hzya.frame.ttxofs.dto.ofssalesordersearch.HeaderDetailsDto headerDetailsDto = headerDetailsDtoList.get(j); - com.hzya.frame.ttxofs.dto.ofssalesordersearch.HeaderDto header1 = headerDetailsDto.getHeader(); - List details1 = headerDetailsDto.getDetails(); - if (header2.getRefOrderId().equals(header1.getId())) { +// for (int j = 0; j < headerDetailsDtoList.size(); j++) { +// com.hzya.frame.ttxofs.dto.ofssalesordersearch.HeaderDetailsDto headerDetailsDto = headerDetailsDtoList.get(j); +// com.hzya.frame.ttxofs.dto.ofssalesordersearch.HeaderDto header1 = headerDetailsDto.getHeader(); +// List details1 = headerDetailsDto.getDetails(); +// if (header2.getRefOrderId().equals(header1.getId())) { +// header.setHeaderDetailsDto(headerDetailsDto); +// } +// } + if (header2.getRefOrderId() != null && !"".equals(header2.getRefOrderId().trim())) { + com.hzya.frame.ttxofs.dto.ofssalesordersearch.HeaderDetailsDto headerDetailsDto = collect.get(header2.getRefOrderId().trim()); + if (headerDetailsDto != null) { header.setHeaderDetailsDto(headerDetailsDto); } } diff --git a/buildpackage/src/test/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToBTest.java b/buildpackage/src/test/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToBTest.java index 8e99ae0f..39b63da5 100644 --- a/buildpackage/src/test/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToBTest.java +++ b/buildpackage/src/test/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToBTest.java @@ -80,10 +80,10 @@ public class SoSaleOutPluginInitializerToBTest { try { // soSaleOutPluginInitializerToB.startImplementByCode("LETS-SH2024101800025544", "stock"); -// soSaleOutPluginInitializerToB.startImplementByStockTime("2024-10-18 00:00:00", "2024-10-18 23:59:59"); + soSaleOutPluginInitializerToB.startImplementByStockTime("2024-10-23 16:09:59", "2024-10-23 16:10:01"); - String aaa = "LETS-RE2024102200000018"; - soSaleOutPluginInitializerToB.startImplementByCode(aaa, "stock"); +// String aaa = "LETS-SH2024102300043720"; +// soSaleOutPluginInitializerToB.startImplementByCode(aaa, "stock"); } catch (Exception e) { e.printStackTrace(); }