refactor(sales): 优化销售出库单处理逻辑

-为 getSetStock 和 getSetStockTran 方法添加同步锁,防止并发执行
- 移除冗余的 SQL 查询判断逻辑,简化代码结构
- 优化 createSuccessFulTradeDate 方法,使用明细行的交易成功时间
- 修改异常处理,增加日志记录并保留原始逻辑
This commit is contained in:
liuy 2024-12-27 14:52:22 +08:00
parent b28c0edbad
commit f5ea373be2
2 changed files with 88 additions and 66 deletions

View File

@ -42,6 +42,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -116,6 +117,10 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
private static final String PROD_FILED = "prod"; private static final String PROD_FILED = "prod";
private static final ReentrantLock LOCK1 = new ReentrantLock(true);
private static final ReentrantLock LOCK2 = new ReentrantLock(true);
@Autowired @Autowired
private QueryU8CEntityUtil queryU8CEntityUtil; private QueryU8CEntityUtil queryU8CEntityUtil;
@ -426,24 +431,38 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
* 出库完成 * 出库完成
*/ */
private void getSetStock(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception { private void getSetStock(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception {
LOCK1.lock();
try {
//保存到mysql //保存到mysql
batchInsert(headerDetailsDtoList); batchInsert(headerDetailsDtoList);
//过滤成功的数据 //过滤成功的数据
List<HeaderDetailsDto> headerDetailsDtos = filterDataStock(headerDetailsDtoList); List<HeaderDetailsDto> headerDetailsDtos = filterDataStock(headerDetailsDtoList);
//执行推送主逻辑 //执行推送主逻辑
implementStock(headerDetailsDtos); implementStock(headerDetailsDtos);
} catch (Exception e) {
logger.error("TOB销售-库存getSetStock方法抛出异常", e);
} finally {
LOCK1.unlock();
}
} }
/** /**
* 交易成功 * 交易成功
*/ */
private void getSetStockTran(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception { private void getSetStockTran(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception {
LOCK2.lock();
try {
//保存到mysql //保存到mysql
batchInsert(headerDetailsDtoList); batchInsert(headerDetailsDtoList);
//过滤成功的数据 //过滤成功的数据
List<HeaderDetailsDto> headerDetailsDtos = filterDataTran(headerDetailsDtoList); List<HeaderDetailsDto> headerDetailsDtos = filterDataTran(headerDetailsDtoList);
//执行主推送逻辑 //执行主推送逻辑
implementSuccessfulTrade(headerDetailsDtos); implementSuccessfulTrade(headerDetailsDtos);
} catch (Exception e) {
logger.error("TOB销售-确认收入getSetStockTran方法抛出异常", e);
} finally {
LOCK2.unlock();
}
} }
/** /**
@ -905,11 +924,11 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
List<SaleorderRequestDto> saleorderRequestDtoList = new ArrayList<>(); List<SaleorderRequestDto> saleorderRequestDtoList = new ArrayList<>();
saleorderRequestDtoList.add(saleorderRequestDto); saleorderRequestDtoList.add(saleorderRequestDto);
synchronized (PUSH_LOCK1) { // synchronized (PUSH_LOCK1) {
Boolean aBoolean = checkTobOrder(header.getId(), header.getCode()); // Boolean aBoolean = checkTobOrder(header.getId(), header.getCode());
if (aBoolean) { // if (aBoolean) {
logger.error("经过SQL查询判断在U8C销售订单已经存在OFS入库单号为{} OFS入库主键为{}的单据为了避免造成单据重复不推送到U8C", header.getCode(), header.getId()); // logger.error("经过SQL查询判断在U8C销售订单已经存在OFS入库单号为{} OFS入库主键为{}的单据为了避免造成单据重复不推送到U8C", header.getCode(), header.getId());
} else { // } else {
logger.error("经过SQL查询判断在U8C销售订单不存在OFS入库单号为{} OFS入库主键为{}的单据将调用U8C接口执行推送", header.getCode(), header.getId()); logger.error("经过SQL查询判断在U8C销售订单不存在OFS入库单号为{} OFS入库主键为{}的单据将调用U8C接口执行推送", header.getCode(), header.getId());
Map<String, List<SaleorderRequestDto>> stringStringMap = new HashMap<>(); Map<String, List<SaleorderRequestDto>> stringStringMap = new HashMap<>();
stringStringMap.put("saleorder", saleorderRequestDtoList); stringStringMap.put("saleorder", saleorderRequestDtoList);
@ -929,8 +948,8 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
logger.info("TOB销售订单编号{} 主键:{} 公司:{}", vreceiptcode, csaleid, pk_corp); logger.info("TOB销售订单编号{} 主键:{} 公司:{}", vreceiptcode, csaleid, pk_corp);
//记录成功 //记录成功
updateSuccessOrFail2(details, "Y", "success", vreceiptcode, csaleid); updateSuccessOrFail2(details, "Y", "success", vreceiptcode, csaleid);
} // }
} // }
} catch (Exception e) { } catch (Exception e) {
logger.error("推送TOB销售订单失败", e); logger.error("推送TOB销售订单失败", e);
//记录失败 //记录失败
@ -985,13 +1004,16 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
* @author liuyang * @author liuyang
*/ */
private String createSuccessFulTradeDate(OrderOutTobHeaderDto orderOutTobHeaderDto) throws Exception { private String createSuccessFulTradeDate(OrderOutTobHeaderDto orderOutTobHeaderDto) throws Exception {
//改为取明细行的交易成功时间
String code = null; String code = null;
if (orderOutTobHeaderDto != null && orderOutTobHeaderDto.getHeader() != null) { String detailedId = null;
code = orderOutTobHeaderDto.getHeader().getCode(); 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) { if (orderOutTobHeaderDto != null && orderOutTobHeaderDto.getDetails() != null && orderOutTobHeaderDto.getDetails().size() > 0) {
HeaderDto header = orderOutTobHeaderDto.getHeader(); String tradeSuccessAt = orderOutTobHeaderDto.getDetails().get(0).getTradeSuccessAt();
String tradeSuccessAt = header.getTradeSuccessAt(); // String tradeSuccessAt = header.getTradeSuccessAt();
String businessFormat = null; String businessFormat = null;
try { try {
Date dbill = DateUtil.parse(tradeSuccessAt); Date dbill = DateUtil.parse(tradeSuccessAt);
@ -1002,8 +1024,8 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
} }
return businessFormat; return businessFormat;
} else { } else {
logger.error("业务日期生成失败tradeSuccessAt(O交易成功时间)不能为空! O销售出库单编码{}", code); logger.error("业务日期生成失败tradeSuccessAt(O交易成功时间)不能为空! O销售出库单编码{} 明细行主键:{}", code, detailedId);
Assert.state(false, "业务日期生成失败tradeSuccessAt(O交易成功日期)不能为空! O销售出库单编码{}", code); Assert.state(false, "业务日期生成失败tradeSuccessAt(O交易成功日期)不能为空! O销售出库单编码{} 明细行主键:{}", code, detailedId);
return null; return null;
} }
} }
@ -2025,11 +2047,11 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
stringListMap.put("billvos", salesInvoiceDtoList); stringListMap.put("billvos", salesInvoiceDtoList);
//推送到U8C之前再次验证在U8C是否已经存在 //推送到U8C之前再次验证在U8C是否已经存在
synchronized (PUSH_LOCK2) { // synchronized (PUSH_LOCK2) {
Boolean aBoolean = checkTobSalesInvoice(header.getId(), header.getCode()); // Boolean aBoolean = checkTobSalesInvoice(header.getId(), header.getCode());
if (aBoolean) { // if (aBoolean) {
logger.error("经过SQL查询判断在U8C销售发票中已经存在OFS入库单号为{} OFS入库主键为{}的单据为了避免造成单据重复不推送到U8C", header.getCode(), header.getId()); // logger.error("经过SQL查询判断在U8C销售发票中已经存在OFS入库单号为{} OFS入库主键为{}的单据为了避免造成单据重复不推送到U8C", header.getCode(), header.getId());
} else { // } else {
logger.error("经过SQL查询判断在U8C销售发票中不存在OFS入库单号为{} OFS入库主键为{}的单据将调用U8C接口执行推送", header.getCode(), header.getId()); logger.error("经过SQL查询判断在U8C销售发票中不存在OFS入库单号为{} OFS入库主键为{}的单据将调用U8C接口执行推送", header.getCode(), header.getId());
SaleinvoiceDto saleinvoiceDto = sendU8CTOCSoSaleinvoiceB(JSON.toJSONString(stringListMap)); SaleinvoiceDto saleinvoiceDto = sendU8CTOCSoSaleinvoiceB(JSON.toJSONString(stringListMap));
//成功 //成功
@ -2046,8 +2068,8 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
logger.info("TOB销售发票生成成功 编码:{} 主键:{} 发票公司:{}", vreceiptcode, csaleid, pk_corp); logger.info("TOB销售发票生成成功 编码:{} 主键:{} 发票公司:{}", vreceiptcode, csaleid, pk_corp);
//记录成功 //记录成功
updateSuccessOrFail3(details, "Y", "success", vreceiptcode, csaleid); updateSuccessOrFail3(details, "Y", "success", vreceiptcode, csaleid);
} // }
} // }
} catch (Exception e) { } catch (Exception e) {
logger.error("TOB的销售发票传输失败抛出异常", e); logger.error("TOB的销售发票传输失败抛出异常", e);
//记录失败 //记录失败