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.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<HeaderDetailsDto> headerDetailsDtoList) throws Exception {
//保存到mysql
batchInsert(headerDetailsDtoList);
//过滤成功的数据
List<HeaderDetailsDto> headerDetailsDtos = filterDataStock(headerDetailsDtoList);
//执行推送主逻辑
implementStock(headerDetailsDtos);
LOCK1.lock();
try {
//保存到mysql
batchInsert(headerDetailsDtoList);
//过滤成功的数据
List<HeaderDetailsDto> headerDetailsDtos = filterDataStock(headerDetailsDtoList);
//执行推送主逻辑
implementStock(headerDetailsDtos);
} catch (Exception e) {
logger.error("TOB销售-库存getSetStock方法抛出异常", e);
} finally {
LOCK1.unlock();
}
}
/**
* 交易成功
*/
private void getSetStockTran(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception {
//保存到mysql
batchInsert(headerDetailsDtoList);
//过滤成功的数据
List<HeaderDetailsDto> headerDetailsDtos = filterDataTran(headerDetailsDtoList);
//执行主推送逻辑
implementSuccessfulTrade(headerDetailsDtos);
LOCK2.lock();
try {
//保存到mysql
batchInsert(headerDetailsDtoList);
//过滤成功的数据
List<HeaderDetailsDto> 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<SaleorderRequestDto> 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<String, List<SaleorderRequestDto>> 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<SoSaleResultBodyDto> 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<String, List<SaleorderRequestDto>> 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<SoSaleResultBodyDto> 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<SaleinvoiceBodyDto> 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<SaleinvoiceBodyDto> 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);
//记录失败

View File

@ -66,7 +66,7 @@ public class DetailsDto {
* 计算公式
*/
private String def8;
private String shipAt;
private String sourceLineNum;