refactor(sales): 优化销售出库单处理逻辑
-为 getSetStock 和 getSetStockTran 方法添加同步锁,防止并发执行 - 移除冗余的 SQL 查询判断逻辑,简化代码结构 - 优化 createSuccessFulTradeDate 方法,使用明细行的交易成功时间 - 修改异常处理,增加日志记录并保留原始逻辑
This commit is contained in:
parent
b28c0edbad
commit
f5ea373be2
|
@ -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 {
|
||||||
//保存到mysql
|
LOCK1.lock();
|
||||||
batchInsert(headerDetailsDtoList);
|
try {
|
||||||
//过滤成功的数据
|
//保存到mysql
|
||||||
List<HeaderDetailsDto> headerDetailsDtos = filterDataStock(headerDetailsDtoList);
|
batchInsert(headerDetailsDtoList);
|
||||||
//执行推送主逻辑
|
//过滤成功的数据
|
||||||
implementStock(headerDetailsDtos);
|
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 {
|
private void getSetStockTran(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception {
|
||||||
//保存到mysql
|
LOCK2.lock();
|
||||||
batchInsert(headerDetailsDtoList);
|
try {
|
||||||
//过滤成功的数据
|
//保存到mysql
|
||||||
List<HeaderDetailsDto> headerDetailsDtos = filterDataTran(headerDetailsDtoList);
|
batchInsert(headerDetailsDtoList);
|
||||||
//执行主推送逻辑
|
//过滤成功的数据
|
||||||
implementSuccessfulTrade(headerDetailsDtos);
|
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<>();
|
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);
|
||||||
SoSaleResultRootDto soSaleResultRootDto = sendU8CTOCOrder(JSON.toJSONString(stringStringMap));
|
SoSaleResultRootDto soSaleResultRootDto = sendU8CTOCOrder(JSON.toJSONString(stringStringMap));
|
||||||
String vreceiptcode = null;
|
String vreceiptcode = null;
|
||||||
String pk_corp = null;
|
String pk_corp = null;
|
||||||
String csaleid = null;
|
String csaleid = null;
|
||||||
//成功
|
//成功
|
||||||
if (soSaleResultRootDto != null) {
|
if (soSaleResultRootDto != null) {
|
||||||
SoSaleResultHeadDto parentvo = soSaleResultRootDto.getParentvo();
|
SoSaleResultHeadDto parentvo = soSaleResultRootDto.getParentvo();
|
||||||
List<SoSaleResultBodyDto> childrenvo = soSaleResultRootDto.getChildrenvo();
|
List<SoSaleResultBodyDto> childrenvo = soSaleResultRootDto.getChildrenvo();
|
||||||
|
|
||||||
vreceiptcode = parentvo.getVreceiptcode();
|
vreceiptcode = parentvo.getVreceiptcode();
|
||||||
pk_corp = parentvo.getPk_corp();
|
pk_corp = parentvo.getPk_corp();
|
||||||
csaleid = parentvo.getCsaleid();
|
csaleid = parentvo.getCsaleid();
|
||||||
}
|
|
||||||
logger.info("TOB销售订单编号:{} 主键:{} 公司:{}", vreceiptcode, csaleid, pk_corp);
|
|
||||||
//记录成功
|
|
||||||
updateSuccessOrFail2(details, "Y", "success", vreceiptcode, csaleid);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
logger.info("TOB销售订单编号:{} 主键:{} 公司:{}", vreceiptcode, csaleid, pk_corp);
|
||||||
|
//记录成功
|
||||||
|
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,29 +2047,29 @@ 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));
|
||||||
//成功
|
//成功
|
||||||
String vreceiptcode = null;
|
String vreceiptcode = null;
|
||||||
String csaleid = null;
|
String csaleid = null;
|
||||||
String pk_corp = null;
|
String pk_corp = null;
|
||||||
if (saleinvoiceDto != null && saleinvoiceDto.getParentvo() != null && saleinvoiceDto.getChildrenvo() != null) {
|
if (saleinvoiceDto != null && saleinvoiceDto.getParentvo() != null && saleinvoiceDto.getChildrenvo() != null) {
|
||||||
SaleinvoiceHeadDto parentvo = saleinvoiceDto.getParentvo();
|
SaleinvoiceHeadDto parentvo = saleinvoiceDto.getParentvo();
|
||||||
List<SaleinvoiceBodyDto> childrenvo = saleinvoiceDto.getChildrenvo();
|
List<SaleinvoiceBodyDto> childrenvo = saleinvoiceDto.getChildrenvo();
|
||||||
vreceiptcode = parentvo.getVreceiptcode();
|
vreceiptcode = parentvo.getVreceiptcode();
|
||||||
csaleid = parentvo.getCsaleid();
|
csaleid = parentvo.getCsaleid();
|
||||||
pk_corp = parentvo.getPk_corp();
|
pk_corp = parentvo.getPk_corp();
|
||||||
}
|
|
||||||
logger.info("TOB销售发票生成成功 编码:{} 主键:{} 发票公司:{}", vreceiptcode, csaleid, pk_corp);
|
|
||||||
//记录成功
|
|
||||||
updateSuccessOrFail3(details, "Y", "success", vreceiptcode, csaleid);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
logger.info("TOB销售发票生成成功 编码:{} 主键:{} 发票公司:{}", vreceiptcode, csaleid, pk_corp);
|
||||||
|
//记录成功
|
||||||
|
updateSuccessOrFail3(details, "Y", "success", vreceiptcode, csaleid);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("TOB的销售发票传输失败,抛出异常", e);
|
logger.error("TOB的销售发票传输失败,抛出异常", e);
|
||||||
//记录失败
|
//记录失败
|
||||||
|
|
|
@ -66,7 +66,7 @@ public class DetailsDto {
|
||||||
* 计算公式
|
* 计算公式
|
||||||
*/
|
*/
|
||||||
private String def8;
|
private String def8;
|
||||||
|
|
||||||
private String shipAt;
|
private String shipAt;
|
||||||
|
|
||||||
private String sourceLineNum;
|
private String sourceLineNum;
|
||||||
|
|
Loading…
Reference in New Issue