1 静态数据
public final static Integer INVOICE_STATUS_INIT = 0;
public final static Integer INVOICE_STATUS_UNSENT = 1;
public final static Integer INVOICE_STATUS_SEND_ERROR = 2;
public final static Integer INVOICE_STATUS_SEND_SUCCESS = 3;
public final static Integer INVOICE_STATUS_CORRECT = 4;
public final static Integer INVOICE_STATUS_REPLACE = 5;
public final static Integer INVOICE_STATUS_VOID = 6;
private static final Set<Integer> SEND_SUCCESS_TYPES = Set.of(
INVOICE_STATUS_SEND_SUCCESS, INVOICE_STATUS_CORRECT, INVOICE_STATUS_REPLACE, INVOICE_STATUS_VOID
);
public static boolean isSendSuccess(Integer status) {
return status != null && SEND_SUCCESS_TYPES.contains(status);
}
2 合并数据
public void mergeDetailSkuList(VerifacInvoice verifacInvoice) {
log.info("开始合并发票明细...");
List<VerifacInvoiceDetailSkuVo> invoiceDetailSkuList = verifacInvoice.getInvoiceDetailSkuList();
if (CollectionUtils.isEmpty(invoiceDetailSkuList)) {
throw new ServiceException("合并发票明细异常:发票明细数据不能为空!");
}
invoiceDetailSkuList.removeIf(detail -> detail.getSkuId() == null);
if (invoiceDetailSkuList.isEmpty()) {
throw new ServiceException("合并发票明细异常:所有明细缺少 SKU ID!");
}
Map<String, VerifacInvoiceDetailSkuVo> mergedMap = new LinkedHashMap<>();
for (VerifacInvoiceDetailSkuVo detail : invoiceDetailSkuList) {
String key = buildKey(detail);
VerifacInvoiceDetailSkuVo existing = mergedMap.get(key);
if (existing == null) {
mergedMap.put(key, detail);
} else {
mergeDetails(existing, detail);
}
}
invoiceDetailSkuList.clear();
invoiceDetailSkuList.addAll(mergedMap.values());
log.info("订单明细汇总完成,汇总后明细数: {}", invoiceDetailSkuList.size());
}
private String buildKey(VerifacInvoiceDetailSkuVo detail) {
return detail.getSkuId() + "|" +
BigDecimalUtils.safeValue(detail.getDetailPrice()).stripTrailingZeros().toPlainString() + "|" +
BigDecimalUtils.safeValue(detail.getDetailDiscountRate()).stripTrailingZeros().toPlainString() + "|" +
detail.getPromotionId() + "|" +
detail.getIsGift();
}
private void mergeDetails(VerifacInvoiceDetailSkuVo existing, VerifacInvoiceDetailSkuVo incoming) {
existing.setDetailQuantity(BigDecimalUtils.safeValue(existing.getDetailQuantity())
.add(BigDecimalUtils.safeValue(incoming.getDetailQuantity())));
existing.setDetailAmount(BigDecimalUtils.safeValue(existing.getDetailAmount())
.add(BigDecimalUtils.safeValue(incoming.getDetailAmount())));
existing.setDetailDiscountAmount(BigDecimalUtils.safeValue(existing.getDetailDiscountAmount())
.add(BigDecimalUtils.safeValue(incoming.getDetailDiscountAmount())));
existing.setDetailSalesAmount(BigDecimalUtils.safeValue(existing.getDetailSalesAmount())
.add(BigDecimalUtils.safeValue(incoming.getDetailSalesAmount())));
}