springBoot3 业务笔记

80 阅读1分钟

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;


// 使用不可变Set,线程安全且性能更好
private static final Set<Integer> SEND_SUCCESS_TYPES = Set.of(
        INVOICE_STATUS_SEND_SUCCESS, INVOICE_STATUS_CORRECT, INVOICE_STATUS_REPLACE, INVOICE_STATUS_VOID
);

/**
 * 是否替换发票(更正发票)
 * 使用Set.contains,O(1)时间复杂度
 */
public static boolean isSendSuccess(Integer status) {
    return status != null && SEND_SUCCESS_TYPES.contains(status);
}

2 合并数据

/**
 * 合并发票明细
 * @param verifacInvoice
 */
public void mergeDetailSkuList(VerifacInvoice verifacInvoice) {
    log.info("开始合并发票明细...");
    List<VerifacInvoiceDetailSkuVo> invoiceDetailSkuList = verifacInvoice.getInvoiceDetailSkuList();
    if (CollectionUtils.isEmpty(invoiceDetailSkuList)) {
        throw new ServiceException("合并发票明细异常:发票明细数据不能为空!");
    }
    // 1 删除没有SKU ID的明细
    invoiceDetailSkuList.removeIf(detail -> detail.getSkuId() == null);
    if (invoiceDetailSkuList.isEmpty()) {
        throw new ServiceException("合并发票明细异常:所有明细缺少 SKU ID!");
    }

    // 使用 LinkedHashMap 保证顺序可控(保留第一条的顺序)
    Map<String, VerifacInvoiceDetailSkuVo> mergedMap = new LinkedHashMap<>();

    for (VerifacInvoiceDetailSkuVo detail : invoiceDetailSkuList) {
        // 构造 Key:用几个字段拼接字符串即可,小数据下完全没性能问题
        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());
}

/**
 * 构造唯一 Key(用于判断是否属于同一合并项)
 */
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())));
}