diff --git a/cash-api/order-server/src/main/java/com/czg/controller/DistributionPayController.java b/cash-api/order-server/src/main/java/com/czg/controller/DistributionPayController.java index e37851930..d5eb12f1f 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/DistributionPayController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/DistributionPayController.java @@ -3,16 +3,16 @@ package com.czg.controller; import com.czg.annotation.Debounce; import com.czg.order.dto.MkDistributionPayDTO; import com.czg.resp.CzgResult; -import com.czg.sa.StpKit; import com.czg.service.order.service.DistributionPayService; -import com.czg.system.service.SysParamsService; import com.czg.utils.AssertUtil; import com.czg.utils.ServletUtil; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; -import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.Map; @@ -27,16 +27,6 @@ import java.util.Map; public class DistributionPayController { @Resource private DistributionPayService payService; - @DubboReference - private SysParamsService paramsService; - - -// @PostMapping("/cashPay") -// @Debounce(value = "#payParam.checkOrderPay.orderId") -// public CzgResult cashPayOrder(@RequestHeader Long shopId, @Validated @RequestBody MkDistributionPayDTO payParam) { -// payParam.setShopId(shopId); -// return payService.cashPayOrder(payParam); -// } /** * 小程序支付 @@ -60,26 +50,4 @@ public class DistributionPayController { AssertUtil.isBlank(payParam.getCode(), "微信code不为空"); return CzgResult.success(payService.mchRecharge(ServletUtil.getClientIP(request), payParam)); } -// -// /** -// * 正扫 -// */ -// @PostMapping("/scanPay") -// @Debounce(value = "#payParam.checkOrderPay.orderId") -// public CzgResult> scanPayOrder(@RequestHeader Long shopId, HttpServletRequest request, @Validated @RequestBody MkDistributionPayDTO payParam) { -// payParam.setShopId(shopId); -// return payService.scanPayOrder(ServletUtil.getClientIP(request), payParam); -// } -// -// /** -// * 反扫 -// * authCode 必填 扫描码 -// */ -// @PostMapping("/microPay") -// @Debounce(value = "#payParam.checkOrderPay.orderId") -// public CzgResult> microPayOrder(@RequestHeader Long shopId, @Validated @RequestBody MkDistributionPayDTO payParam) { -// payParam.setShopId(shopId); -// return payService.microPayOrder(payParam); -// } - } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java index 8a178a1b0..07fd21710 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java @@ -14,10 +14,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -167,44 +164,99 @@ public class ShopProdStatisticServiceImpl extends ServiceImpl mergeProdStatistic(List realTimeDataByDay, List dateRange) { - if (realTimeDataByDay == null) { - realTimeDataByDay = new ArrayList<>(); - } - if (dateRange == null) { - dateRange = new ArrayList<>(); - } + // 1. 使用防御性编程,确保非空列表 + List realTimeData = Optional.ofNullable(realTimeDataByDay).orElseGet(ArrayList::new); + List rangeData = Optional.ofNullable(dateRange).orElseGet(ArrayList::new); - return Stream.concat(realTimeDataByDay.stream(), dateRange.stream()) + calculateValidData(realTimeData); + calculateValidData(rangeData); + + return Stream.concat(realTimeData.stream(), rangeData.stream()) .filter(Objects::nonNull) .collect(Collectors.toMap( ShopProdStatistic::getProdId, Function.identity(), - (stat1, stat2) -> { - // 创建合并后的对象 - ShopProdStatistic merged = new ShopProdStatistic(); - merged.setId(stat1.getId()); - merged.setShopId(stat1.getShopId()); - merged.setProdId(stat1.getProdId()); - merged.setProductName(stat1.getProductName()); - - // 安全处理BigDecimal相加,处理null值 - merged.setSaleCount(safeAdd(stat1.getSaleCount(), stat2.getSaleCount())); - merged.setSaleAmount(safeAdd(stat1.getSaleAmount(), stat2.getSaleAmount())); - merged.setRefundCount(safeAdd(stat1.getRefundCount(), stat2.getRefundCount())); - merged.setRefundAmount(safeAdd(stat1.getRefundAmount(), stat2.getRefundAmount())); - - return merged; - } + this::mergeStatistics )) .values() .stream() + .peek(this::recalculateValidData) .toList(); } + /** + * 计算有效销售数据 + */ + private void calculateValidData(List statistics) { + if (statistics == null || statistics.isEmpty()) { + return; + } + statistics.forEach(stat -> { + if (stat != null) { + stat.setValidSaleCount(safeSubtract(stat.getSaleCount(), stat.getRefundCount())); + stat.setValidSaleAmount(safeSubtract(stat.getValidSaleAmount(), stat.getRefundAmount())); + } + }); + } + + /** + * 合并两个统计对象 + */ + private ShopProdStatistic mergeStatistics(ShopProdStatistic stat1, ShopProdStatistic stat2) { + // 使用第一个非空对象作为基准 + ShopProdStatistic baseStat = Optional.ofNullable(stat1).orElse(stat2); + ShopProdStatistic otherStat = stat1 == null ? null : stat2; + + if (otherStat == null) { + return baseStat; + } + + ShopProdStatistic merged = new ShopProdStatistic(); + + // 设置基本信息(优先使用非空值) + merged.setId(baseStat.getId()); + merged.setShopId(baseStat.getShopId()); + merged.setProdId(baseStat.getProdId()); + merged.setProductName( + Optional.ofNullable(baseStat.getProductName()) + .orElse(otherStat.getProductName()) + ); + + // 合并数值字段 + merged.setSaleCount(safeAdd(baseStat.getSaleCount(), otherStat.getSaleCount())); + merged.setSaleAmount(safeAdd(baseStat.getSaleAmount(), otherStat.getSaleAmount())); + merged.setRefundCount(safeAdd(baseStat.getRefundCount(), otherStat.getRefundCount())); + merged.setRefundAmount(safeAdd(baseStat.getRefundAmount(), otherStat.getRefundAmount())); + + return merged; + } + + /** + * 重新计算合并后的有效数据 + */ + private void recalculateValidData(ShopProdStatistic stat) { + if (stat != null) { + stat.setValidSaleCount(safeSubtract(stat.getSaleCount(), stat.getRefundCount())); + stat.setValidSaleAmount(safeSubtract(stat.getSaleAmount(), stat.getRefundAmount())); + } + } + + /** + * 安全的BigDecimal加法(处理null值) + */ private BigDecimal safeAdd(BigDecimal num1, BigDecimal num2) { - BigDecimal safeNum1 = num1 != null ? num1 : BigDecimal.ZERO; - BigDecimal safeNum2 = num2 != null ? num2 : BigDecimal.ZERO; + BigDecimal safeNum1 = Optional.ofNullable(num1).orElse(BigDecimal.ZERO); + BigDecimal safeNum2 = Optional.ofNullable(num2).orElse(BigDecimal.ZERO); return safeNum1.add(safeNum2); } + + /** + * 安全的BigDecimal减法(处理null值) + */ + private BigDecimal safeSubtract(BigDecimal num1, BigDecimal num2) { + BigDecimal safeNum1 = Optional.ofNullable(num1).orElse(BigDecimal.ZERO); + BigDecimal safeNum2 = Optional.ofNullable(num2).orElse(BigDecimal.ZERO); + return safeNum1.subtract(safeNum2); + } }