From f5ea373be271976580dd4bbe75968cdd9dc2a750 Mon Sep 17 00:00:00 2001 From: liuy <37787198+LiuyCodes@users.noreply.github.com> Date: Fri, 27 Dec 2024 14:52:22 +0800 Subject: [PATCH] =?UTF-8?q?refactor(sales):=20=E4=BC=98=E5=8C=96=E9=94=80?= =?UTF-8?q?=E5=94=AE=E5=87=BA=E5=BA=93=E5=8D=95=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -为 getSetStock 和 getSetStockTran 方法添加同步锁,防止并发执行 - 移除冗余的 SQL 查询判断逻辑,简化代码结构 - 优化 createSuccessFulTradeDate 方法,使用明细行的交易成功时间 - 修改异常处理,增加日志记录并保留原始逻辑 --- .../sales/SoSaleOutPluginInitializerToB.java | 152 ++++++++++-------- .../dto/ofssaleorderoutsearch/DetailsDto.java | 2 +- 2 files changed, 88 insertions(+), 66 deletions(-) diff --git a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToB.java b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToB.java index f50b6800..9c8221b9 100644 --- a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToB.java +++ b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/plugin/sales/SoSaleOutPluginInitializerToB.java @@ -42,6 +42,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.locks.ReentrantLock; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -116,6 +117,10 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity { private static final String PROD_FILED = "prod"; + private static final ReentrantLock LOCK1 = new ReentrantLock(true); + + private static final ReentrantLock LOCK2 = new ReentrantLock(true); + @Autowired private QueryU8CEntityUtil queryU8CEntityUtil; @@ -426,24 +431,38 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity { * 出库完成 */ private void getSetStock(List headerDetailsDtoList) throws Exception { - //保存到mysql - batchInsert(headerDetailsDtoList); - //过滤成功的数据 - List headerDetailsDtos = filterDataStock(headerDetailsDtoList); - //执行推送主逻辑 - implementStock(headerDetailsDtos); + LOCK1.lock(); + try { + //保存到mysql + batchInsert(headerDetailsDtoList); + //过滤成功的数据 + List headerDetailsDtos = filterDataStock(headerDetailsDtoList); + //执行推送主逻辑 + implementStock(headerDetailsDtos); + } catch (Exception e) { + logger.error("TOB销售-库存:getSetStock方法抛出异常", e); + } finally { + LOCK1.unlock(); + } } /** * 交易成功 */ private void getSetStockTran(List headerDetailsDtoList) throws Exception { - //保存到mysql - batchInsert(headerDetailsDtoList); - //过滤成功的数据 - List headerDetailsDtos = filterDataTran(headerDetailsDtoList); - //执行主推送逻辑 - implementSuccessfulTrade(headerDetailsDtos); + LOCK2.lock(); + try { + //保存到mysql + batchInsert(headerDetailsDtoList); + //过滤成功的数据 + List headerDetailsDtos = filterDataTran(headerDetailsDtoList); + //执行主推送逻辑 + implementSuccessfulTrade(headerDetailsDtos); + } catch (Exception e) { + logger.error("TOB销售-确认收入:getSetStockTran方法抛出异常", e); + } finally { + LOCK2.unlock(); + } } /** @@ -905,32 +924,32 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity { List saleorderRequestDtoList = new ArrayList<>(); saleorderRequestDtoList.add(saleorderRequestDto); - synchronized (PUSH_LOCK1) { - Boolean aBoolean = checkTobOrder(header.getId(), header.getCode()); - if (aBoolean) { - logger.error("经过SQL查询判断,在U8C销售订单已经存在OFS入库单号为:{} OFS入库主键为:{}的单据,为了避免造成单据重复,不推送到U8C!", header.getCode(), header.getId()); - } else { - logger.error("经过SQL查询判断,在U8C销售订单不存在OFS入库单号为:{} OFS入库主键为:{}的单据,将调用U8C接口执行推送!", header.getCode(), header.getId()); - Map> stringStringMap = new HashMap<>(); - stringStringMap.put("saleorder", saleorderRequestDtoList); - SoSaleResultRootDto soSaleResultRootDto = sendU8CTOCOrder(JSON.toJSONString(stringStringMap)); - String vreceiptcode = null; - String pk_corp = null; - String csaleid = null; - //成功 - if (soSaleResultRootDto != null) { - SoSaleResultHeadDto parentvo = soSaleResultRootDto.getParentvo(); - List childrenvo = soSaleResultRootDto.getChildrenvo(); +// synchronized (PUSH_LOCK1) { +// Boolean aBoolean = checkTobOrder(header.getId(), header.getCode()); +// if (aBoolean) { +// logger.error("经过SQL查询判断,在U8C销售订单已经存在OFS入库单号为:{} OFS入库主键为:{}的单据,为了避免造成单据重复,不推送到U8C!", header.getCode(), header.getId()); +// } else { + logger.error("经过SQL查询判断,在U8C销售订单不存在OFS入库单号为:{} OFS入库主键为:{}的单据,将调用U8C接口执行推送!", header.getCode(), header.getId()); + Map> stringStringMap = new HashMap<>(); + stringStringMap.put("saleorder", saleorderRequestDtoList); + SoSaleResultRootDto soSaleResultRootDto = sendU8CTOCOrder(JSON.toJSONString(stringStringMap)); + String vreceiptcode = null; + String pk_corp = null; + String csaleid = null; + //成功 + if (soSaleResultRootDto != null) { + SoSaleResultHeadDto parentvo = soSaleResultRootDto.getParentvo(); + List childrenvo = soSaleResultRootDto.getChildrenvo(); - vreceiptcode = parentvo.getVreceiptcode(); - pk_corp = parentvo.getPk_corp(); - csaleid = parentvo.getCsaleid(); - } - logger.info("TOB销售订单编号:{} 主键:{} 公司:{}", vreceiptcode, csaleid, pk_corp); - //记录成功 - updateSuccessOrFail2(details, "Y", "success", vreceiptcode, csaleid); - } + vreceiptcode = parentvo.getVreceiptcode(); + pk_corp = parentvo.getPk_corp(); + csaleid = parentvo.getCsaleid(); } + logger.info("TOB销售订单编号:{} 主键:{} 公司:{}", vreceiptcode, csaleid, pk_corp); + //记录成功 + updateSuccessOrFail2(details, "Y", "success", vreceiptcode, csaleid); +// } +// } } catch (Exception e) { logger.error("推送TOB销售订单失败", e); //记录失败 @@ -985,13 +1004,16 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity { * @author liuyang */ private String createSuccessFulTradeDate(OrderOutTobHeaderDto orderOutTobHeaderDto) throws Exception { + //改为取明细行的交易成功时间 String code = null; - if (orderOutTobHeaderDto != null && orderOutTobHeaderDto.getHeader() != null) { - code = orderOutTobHeaderDto.getHeader().getCode(); + String detailedId = null; + if (orderOutTobHeaderDto != null && orderOutTobHeaderDto.getDetails() != null) { + code = orderOutTobHeaderDto.getDetails().get(0).getTradeSuccessAt(); + detailedId = orderOutTobHeaderDto.getDetails().get(0).getId(); } - if (orderOutTobHeaderDto != null && orderOutTobHeaderDto.getHeader() != null && orderOutTobHeaderDto.getHeader().getTradeSuccessAt() != null) { - HeaderDto header = orderOutTobHeaderDto.getHeader(); - String tradeSuccessAt = header.getTradeSuccessAt(); + if (orderOutTobHeaderDto != null && orderOutTobHeaderDto.getDetails() != null && orderOutTobHeaderDto.getDetails().size() > 0) { + String tradeSuccessAt = orderOutTobHeaderDto.getDetails().get(0).getTradeSuccessAt(); +// String tradeSuccessAt = header.getTradeSuccessAt(); String businessFormat = null; try { Date dbill = DateUtil.parse(tradeSuccessAt); @@ -1002,8 +1024,8 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity { } return businessFormat; } else { - logger.error("业务日期生成失败tradeSuccessAt(O交易成功时间)不能为空! O销售出库单编码:{}", code); - Assert.state(false, "业务日期生成失败tradeSuccessAt(O交易成功日期)不能为空! O销售出库单编码:{}", code); + logger.error("业务日期生成失败tradeSuccessAt(O交易成功时间)不能为空! O销售出库单编码:{} 明细行主键:{}", code, detailedId); + Assert.state(false, "业务日期生成失败tradeSuccessAt(O交易成功日期)不能为空! O销售出库单编码:{} 明细行主键:{}", code, detailedId); return null; } } @@ -2025,29 +2047,29 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity { stringListMap.put("billvos", salesInvoiceDtoList); //推送到U8C之前,再次验证,在U8C是否已经存在 - synchronized (PUSH_LOCK2) { - Boolean aBoolean = checkTobSalesInvoice(header.getId(), header.getCode()); - if (aBoolean) { - logger.error("经过SQL查询判断,在U8C销售发票中已经存在OFS入库单号为:{} OFS入库主键为:{}的单据,为了避免造成单据重复,不推送到U8C!", header.getCode(), header.getId()); - } else { - logger.error("经过SQL查询判断,在U8C销售发票中不存在OFS入库单号为:{} OFS入库主键为:{}的单据,将调用U8C接口执行推送!", header.getCode(), header.getId()); - SaleinvoiceDto saleinvoiceDto = sendU8CTOCSoSaleinvoiceB(JSON.toJSONString(stringListMap)); - //成功 - String vreceiptcode = null; - String csaleid = null; - String pk_corp = null; - if (saleinvoiceDto != null && saleinvoiceDto.getParentvo() != null && saleinvoiceDto.getChildrenvo() != null) { - SaleinvoiceHeadDto parentvo = saleinvoiceDto.getParentvo(); - List childrenvo = saleinvoiceDto.getChildrenvo(); - vreceiptcode = parentvo.getVreceiptcode(); - csaleid = parentvo.getCsaleid(); - pk_corp = parentvo.getPk_corp(); - } - logger.info("TOB销售发票生成成功 编码:{} 主键:{} 发票公司:{}", vreceiptcode, csaleid, pk_corp); - //记录成功 - updateSuccessOrFail3(details, "Y", "success", vreceiptcode, csaleid); - } +// synchronized (PUSH_LOCK2) { +// Boolean aBoolean = checkTobSalesInvoice(header.getId(), header.getCode()); +// if (aBoolean) { +// logger.error("经过SQL查询判断,在U8C销售发票中已经存在OFS入库单号为:{} OFS入库主键为:{}的单据,为了避免造成单据重复,不推送到U8C!", header.getCode(), header.getId()); +// } else { + logger.error("经过SQL查询判断,在U8C销售发票中不存在OFS入库单号为:{} OFS入库主键为:{}的单据,将调用U8C接口执行推送!", header.getCode(), header.getId()); + SaleinvoiceDto saleinvoiceDto = sendU8CTOCSoSaleinvoiceB(JSON.toJSONString(stringListMap)); + //成功 + String vreceiptcode = null; + String csaleid = null; + String pk_corp = null; + if (saleinvoiceDto != null && saleinvoiceDto.getParentvo() != null && saleinvoiceDto.getChildrenvo() != null) { + SaleinvoiceHeadDto parentvo = saleinvoiceDto.getParentvo(); + List childrenvo = saleinvoiceDto.getChildrenvo(); + vreceiptcode = parentvo.getVreceiptcode(); + csaleid = parentvo.getCsaleid(); + pk_corp = parentvo.getPk_corp(); } + logger.info("TOB销售发票生成成功 编码:{} 主键:{} 发票公司:{}", vreceiptcode, csaleid, pk_corp); + //记录成功 + updateSuccessOrFail3(details, "Y", "success", vreceiptcode, csaleid); +// } +// } } catch (Exception e) { logger.error("TOB的销售发票传输失败,抛出异常", e); //记录失败 diff --git a/service/src/main/java/com/hzya/frame/ttxofs/dto/ofssaleorderoutsearch/DetailsDto.java b/service/src/main/java/com/hzya/frame/ttxofs/dto/ofssaleorderoutsearch/DetailsDto.java index aaff29a3..0feebd44 100755 --- a/service/src/main/java/com/hzya/frame/ttxofs/dto/ofssaleorderoutsearch/DetailsDto.java +++ b/service/src/main/java/com/hzya/frame/ttxofs/dto/ofssaleorderoutsearch/DetailsDto.java @@ -66,7 +66,7 @@ public class DetailsDto { * 计算公式 */ private String def8; - + private String shipAt; private String sourceLineNum;