From d8f31648f8d3d651dfeba9ebfac47ba86a86bd61 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Fri, 17 Oct 2025 15:12:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E6=96=B0=E5=A2=9E=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/InAppPurchaseDetailsClientApi.java | 8 ++ .../cmd/inapp/InAppPurchaseDetailsQryCmd.java | 2 + .../order/InAppPurchaseRestController.java | 11 +++ .../order/InAppPurchaseBackServiceImpl.java | 7 ++ .../app/order/InAppPurchaseBackService.java | 6 ++ .../order/InAppPurchaseDetailsService.java | 5 ++ .../impl/InAppPurchaseDetailsServiceImpl.java | 82 +++++++++++++++++++ .../query/InAppPurchaseDetailsQuery.java | 2 + .../InAppPurchaseDetailsClientEndpoint.java | 8 ++ .../InAppPurchaseDetailsClientService.java | 6 ++ ...InAppPurchaseDetailsClientServiceImpl.java | 8 ++ 11 files changed, 145 insertions(+) diff --git a/rc-service/rc-inner-api/order-inner/order-inner-api/src/main/java/com/red/circle/order/inner/endpoint/api/InAppPurchaseDetailsClientApi.java b/rc-service/rc-inner-api/order-inner/order-inner-api/src/main/java/com/red/circle/order/inner/endpoint/api/InAppPurchaseDetailsClientApi.java index e93f06c3..52c9703f 100644 --- a/rc-service/rc-inner-api/order-inner/order-inner-api/src/main/java/com/red/circle/order/inner/endpoint/api/InAppPurchaseDetailsClientApi.java +++ b/rc-service/rc-inner-api/order-inner/order-inner-api/src/main/java/com/red/circle/order/inner/endpoint/api/InAppPurchaseDetailsClientApi.java @@ -6,6 +6,7 @@ import com.red.circle.order.inner.model.dto.inapp.CountUserInAppPurchaseDTO; import com.red.circle.order.inner.model.dto.inapp.InAppPurchaseDetailsDTO; import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -43,4 +44,11 @@ public interface InAppPurchaseDetailsClientApi { @RequestParam("startTime")LocalDateTime startTime, @RequestParam("endTime")LocalDateTime endTime, @RequestParam("limit")Integer limit); + + /** + * 订单统计查询 - 返回金额总数和订单总数 + */ + @PostMapping("/statistics") + ResultResponse> statistics( + @RequestBody @Validated InAppPurchaseDetailsQryCmd qryCmd); } diff --git a/rc-service/rc-inner-api/order-inner/order-inner-model/src/main/java/com/red/circle/order/inner/model/cmd/inapp/InAppPurchaseDetailsQryCmd.java b/rc-service/rc-inner-api/order-inner/order-inner-model/src/main/java/com/red/circle/order/inner/model/cmd/inapp/InAppPurchaseDetailsQryCmd.java index 8e5054fe..4b1018e0 100644 --- a/rc-service/rc-inner-api/order-inner/order-inner-model/src/main/java/com/red/circle/order/inner/model/cmd/inapp/InAppPurchaseDetailsQryCmd.java +++ b/rc-service/rc-inner-api/order-inner/order-inner-model/src/main/java/com/red/circle/order/inner/model/cmd/inapp/InAppPurchaseDetailsQryCmd.java @@ -80,6 +80,8 @@ public class InAppPurchaseDetailsQryCmd extends Command { */ private InAppPurchaseStatus status; + private String countryCode; + /** * 开始时间. */ diff --git a/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/order/InAppPurchaseRestController.java b/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/order/InAppPurchaseRestController.java index 5c2be266..d8dcd5f1 100644 --- a/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/order/InAppPurchaseRestController.java +++ b/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/order/InAppPurchaseRestController.java @@ -5,8 +5,11 @@ import com.red.circle.console.app.service.app.order.InAppPurchaseBackService; import com.red.circle.framework.web.controller.BaseController; import com.red.circle.order.inner.model.cmd.inapp.InAppPurchaseDetailsQryCmd; import java.util.List; +import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; +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.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -39,4 +42,12 @@ public class InAppPurchaseRestController extends BaseController { return inAppPurchaseBackService.listDetails(query); } + /** + * 订单统计查询 - 返回金额总数和订单总数 + */ + @GetMapping("/statistics") + public Map statistics(InAppPurchaseDetailsQryCmd query) { + return inAppPurchaseBackService.statistics(query); + } + } diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/order/InAppPurchaseBackServiceImpl.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/order/InAppPurchaseBackServiceImpl.java index 63fcc8b2..d1b00e6f 100644 --- a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/order/InAppPurchaseBackServiceImpl.java +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/order/InAppPurchaseBackServiceImpl.java @@ -126,4 +126,11 @@ public class InAppPurchaseBackServiceImpl implements InAppPurchaseBackService { }).collect(Collectors.toList()); } + @Override + public Map statistics(InAppPurchaseDetailsQryCmd query) { + return ResponseAssert.requiredSuccess( + inAppPurchaseDetailsClient.statistics(query) + ); + } + } diff --git a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/service/app/order/InAppPurchaseBackService.java b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/service/app/order/InAppPurchaseBackService.java index d57216cc..b7baeb9a 100644 --- a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/service/app/order/InAppPurchaseBackService.java +++ b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/service/app/order/InAppPurchaseBackService.java @@ -3,6 +3,7 @@ package com.red.circle.console.app.service.app.order; import com.red.circle.console.app.dto.clienobject.order.InAppPurchaseDetailsCO; import com.red.circle.order.inner.model.cmd.inapp.InAppPurchaseDetailsQryCmd; import java.util.List; +import java.util.Map; /** * 内购服务. @@ -21,4 +22,9 @@ public interface InAppPurchaseBackService extends IOrderService { */ List listDetails(InAppPurchaseDetailsQryCmd query); + /** + * 订单统计查询 - 返回金额总数和订单总数 + */ + Map statistics(InAppPurchaseDetailsQryCmd query); + } diff --git a/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/InAppPurchaseDetailsService.java b/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/InAppPurchaseDetailsService.java index 4cde0be8..7c589d9a 100644 --- a/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/InAppPurchaseDetailsService.java +++ b/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/InAppPurchaseDetailsService.java @@ -74,6 +74,11 @@ public interface InAppPurchaseDetailsService { */ List list(InAppPurchaseDetailsQuery query); + /** + * 订单统计查询 - 返回金额总数和订单总数 + */ + Map statistics(InAppPurchaseDetailsQuery query); + /** * 统计用户内购. */ diff --git a/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/impl/InAppPurchaseDetailsServiceImpl.java b/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/impl/InAppPurchaseDetailsServiceImpl.java index e0071eca..fc1fe9b3 100644 --- a/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/impl/InAppPurchaseDetailsServiceImpl.java +++ b/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/impl/InAppPurchaseDetailsServiceImpl.java @@ -16,6 +16,7 @@ import com.red.circle.tool.core.text.StringUtils; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -195,6 +196,9 @@ public class InAppPurchaseDetailsServiceImpl implements InAppPurchaseDetailsServ if (Objects.nonNull(query.getStatus())) { criteria.and("status").is(query.getStatus()); } + if (Objects.nonNull(query.getCountryCode())) { + criteria.and("countryCode").is(query.getCountryCode()); + } if (Objects.nonNull(query.getStartTime()) && Objects.nonNull(query.getEndTime())) { criteria.andOperator( @@ -217,6 +221,84 @@ public class InAppPurchaseDetailsServiceImpl implements InAppPurchaseDetailsServ .limit(query.getLimit()), InAppPurchaseDetails.class); } + @Override + public Map statistics(InAppPurchaseDetailsQuery query) { + Criteria criteria = new Criteria(); + + if (StringUtils.isNotBlank(query.getId())) { + criteria.and("id").is(query.getId()); + } + if (Objects.nonNull(query.getReceiptType())) { + criteria.and("receiptType").is(query.getReceiptType()); + } + if (StringUtils.isNotBlank(query.getTrackId())) { + criteria.and("trackId").is(query.getTrackId()); + } + if (StringUtils.isNotBlank(query.getSysOrigins())) { + List sysOrigins = Arrays.stream(query.getSysOrigins().split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(sysOrigins)) { + criteria.and("sysOrigin").in(sysOrigins); + } + } + if (Objects.nonNull(query.getAcceptUserId())) { + criteria.and("acceptUserId").is(query.getAcceptUserId()); + } + if (StringUtils.isNotEmpty(query.getSubscribeId())) { + criteria.and("subscribeId").is(query.getSubscribeId()); + } + if (StringUtils.isNotEmpty(query.getOrderId())) { + criteria.and("orderId").is(query.getOrderId()); + } + if (StringUtils.isNotEmpty(query.getEnv())) { + criteria.and("env").is(query.getEnv()); + } + if (StringUtils.isNotBlank(query.getFactoryPlatform())) { + criteria.and("factory.platform").is(query.getFactoryPlatform()); + } + if (Objects.nonNull(query.getStatus())) { + criteria.and("status").is(query.getStatus()); + } + if (Objects.nonNull(query.getCountryCode())) { + criteria.and("countryCode").is(query.getCountryCode()); + } + if (Objects.nonNull(query.getStartTime()) && Objects.nonNull(query.getEndTime())) { + criteria.andOperator( + Criteria.where("createTime").gte(query.getStartTime()), + Criteria.where("createTime").lte(query.getEndTime()) + ); + } + + // 使用聚合管道计算统计 + AggregationResults results = mongoTemplate.aggregate( + Aggregation.newAggregation( + Aggregation.match(criteria), + Aggregation.group() + .count().as("totalOrderCount") + .sum("amount").as("totalAmount") + .sum("amountUsd").as("totalAmountUsd") + .avg("amount").as("averageOrderAmount") + ), + InAppPurchaseDetails.class, + BasicDBObject.class); + + Map resultMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(results.getMappedResults())) { + BasicDBObject obj = results.getMappedResults().get(0); + resultMap.put("totalOrderCount", obj.getLong("totalOrderCount")); + resultMap.put("totalAmount", obj.get("totalAmount") != null ? new BigDecimal(obj.get("totalAmount").toString()) : BigDecimal.ZERO); + resultMap.put("totalAmountUsd", obj.get("totalAmountUsd") != null ? new BigDecimal(obj.get("totalAmountUsd").toString()) : BigDecimal.ZERO); + resultMap.put("averageOrderAmount", obj.get("averageOrderAmount") != null ? new BigDecimal(obj.get("averageOrderAmount").toString()) : BigDecimal.ZERO); + } else { + resultMap.put("totalOrderCount", 0L); + resultMap.put("totalAmount", BigDecimal.ZERO); + resultMap.put("totalAmountUsd", BigDecimal.ZERO); + resultMap.put("averageOrderAmount", BigDecimal.ZERO); + } + return resultMap; + } + @Override public List countUserInAppPurchase(String sysOrigin, LocalDateTime startTime, diff --git a/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/query/InAppPurchaseDetailsQuery.java b/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/query/InAppPurchaseDetailsQuery.java index 0bcf860a..11041bff 100644 --- a/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/query/InAppPurchaseDetailsQuery.java +++ b/rc-service/rc-service-order/order-infrastructure/src/main/java/com/red/circle/order/infra/database/mongo/order/query/InAppPurchaseDetailsQuery.java @@ -78,6 +78,8 @@ public class InAppPurchaseDetailsQuery implements Serializable { */ private InAppPurchaseStatus status; + private String countryCode; + /** * 开始时间. */ diff --git a/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/endpoint/InAppPurchaseDetailsClientEndpoint.java b/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/endpoint/InAppPurchaseDetailsClientEndpoint.java index 3321084d..b8c72e38 100644 --- a/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/endpoint/InAppPurchaseDetailsClientEndpoint.java +++ b/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/endpoint/InAppPurchaseDetailsClientEndpoint.java @@ -8,6 +8,7 @@ import com.red.circle.order.inner.model.dto.inapp.InAppPurchaseDetailsDTO; import com.red.circle.order.inner.service.InAppPurchaseDetailsClientService; import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.validation.annotation.Validated; @@ -41,6 +42,13 @@ public class InAppPurchaseDetailsClientEndpoint implements InAppPurchaseDetailsC ); } + @Override + public ResultResponse> statistics(InAppPurchaseDetailsQryCmd qryCmd) { + return ResultResponse.success( + inAppPurchaseDetailsClientService.statistics(qryCmd) + ); + } + @Override public ResultResponse> countUserInAppPurchase(String sysOrigin, LocalDateTime startTime, LocalDateTime endTime, Integer limit) { diff --git a/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/service/InAppPurchaseDetailsClientService.java b/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/service/InAppPurchaseDetailsClientService.java index d22bd6bf..5b94aef4 100644 --- a/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/service/InAppPurchaseDetailsClientService.java +++ b/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/service/InAppPurchaseDetailsClientService.java @@ -5,6 +5,7 @@ import com.red.circle.order.inner.model.dto.inapp.CountUserInAppPurchaseDTO; import com.red.circle.order.inner.model.dto.inapp.InAppPurchaseDetailsDTO; import java.time.LocalDateTime; import java.util.List; +import java.util.Map; /** * 内购详情. @@ -23,6 +24,11 @@ public interface InAppPurchaseDetailsClientService { */ List list(InAppPurchaseDetailsQryCmd qryCmd); + /** + * 订单统计查询 - 返回金额总数和订单总数 + */ + Map statistics(InAppPurchaseDetailsQryCmd qryCmd); + List countUserInAppPurchase(String sysOrigin, LocalDateTime startTime, LocalDateTime endTime, Integer limit); } diff --git a/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/service/impl/InAppPurchaseDetailsClientServiceImpl.java b/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/service/impl/InAppPurchaseDetailsClientServiceImpl.java index 9fa7a98a..d85d79b3 100644 --- a/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/service/impl/InAppPurchaseDetailsClientServiceImpl.java +++ b/rc-service/rc-service-order/order-inner-endpoint/src/main/java/com/red/circle/order/inner/service/impl/InAppPurchaseDetailsClientServiceImpl.java @@ -9,6 +9,7 @@ import com.red.circle.order.inner.model.dto.inapp.InAppPurchaseDetailsDTO; import com.red.circle.order.inner.service.InAppPurchaseDetailsClientService; import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -39,6 +40,13 @@ public class InAppPurchaseDetailsClientServiceImpl implements InAppPurchaseDetai ); } + @Override + public Map statistics(InAppPurchaseDetailsQryCmd qryCmd) { + return inAppPurchaseDetailsService.statistics( + inAppPurchaseDetailsInnerConvert.toInAppPurchaseDetailsQuery(qryCmd) + ); + } + @Override public List countUserInAppPurchase(String sysOrigin, LocalDateTime startTime, LocalDateTime endTime, Integer limit) {