|
@@ -978,6 +978,175 @@ public class CommissionService {
|
|
|
return funnel;
|
|
return funnel;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * 获取团队成长曲线数据(按注册时间分段的成员数量)
|
|
|
|
|
+ */
|
|
|
|
|
+ public Map<String, Object> getTeamGrowthCurve(Long userId, Integer months) {
|
|
|
|
|
+ if (months == null || months <= 0) months = 12;
|
|
|
|
|
+ if (months > 36) months = 36;
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> result = new LinkedHashMap<>();
|
|
|
|
|
+ List<String> labels = new ArrayList<>();
|
|
|
|
|
+ List<Integer> data = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ Date now = new Date();
|
|
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
|
|
+ calendar.setTime(now);
|
|
|
|
|
+ calendar.add(Calendar.MONTH, -months + 1);
|
|
|
|
|
+ Date startMonth = calendar.getTime();
|
|
|
|
|
+
|
|
|
|
|
+ Map<Long, Integer> monthCountMap = new LinkedHashMap<>();
|
|
|
|
|
+ for (int i = 0; i < months; i++) {
|
|
|
|
|
+ Calendar c = Calendar.getInstance();
|
|
|
|
|
+ c.setTime(startMonth);
|
|
|
|
|
+ c.add(Calendar.MONTH, i);
|
|
|
|
|
+ int dayOfMonth = c.getActualMinimum(Calendar.DAY_OF_MONTH);
|
|
|
|
|
+ int lastDayOfMonth = c.getActualMaximum(Calendar.DAY_OF_MONTH);
|
|
|
|
|
+ long monthBegin = dayOfMonth * 24 * 60 * 60 * 1000;
|
|
|
|
|
+ long monthLast = lastDayOfMonth * 24 * 60 * 60 * 1000;
|
|
|
|
|
+
|
|
|
|
|
+ LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
|
|
|
|
|
+ .ge(User::getCreatedAt, monthBegin)
|
|
|
|
|
+ .le(User::getCreatedAt, monthLast)
|
|
|
|
|
+ .eq(User::getReferrerId, userId);
|
|
|
|
|
+ int count = userMapper.selectCount(wrapper);
|
|
|
|
|
+ monthCountMap.put((long) i, count);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for (int i = 0; i < months; i++) {
|
|
|
|
|
+ Calendar labelCal = Calendar.getInstance();
|
|
|
|
|
+ labelCal.setTime(startMonth);
|
|
|
|
|
+ labelCal.add(Calendar.MONTH, i);
|
|
|
|
|
+ int year = labelCal.get(Calendar.YEAR);
|
|
|
|
|
+ int month = labelCal.get(Calendar.MONTH) + 1;
|
|
|
|
|
+ labels.add(year + "-" + String.format("%02d", month));
|
|
|
|
|
+ data.add(monthCountMap.getOrDefault((long) i, 0));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ result.put("labels", labels);
|
|
|
|
|
+ result.put("data", data);
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取团队所有成员消费曲线数据(按月份统计成员消费总额)
|
|
|
|
|
+ */
|
|
|
|
|
+ public Map<String, Object> getTeamAllMembersConsumptionCurve(Long userId, Integer months) {
|
|
|
|
|
+ if (months == null || months <= 0) months = 12;
|
|
|
|
|
+ if (months > 36) months = 36;
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> result = new LinkedHashMap<>();
|
|
|
|
|
+ List<String> labels = new ArrayList<>();
|
|
|
|
|
+ List<Integer> data = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ Date now = new Date();
|
|
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
|
|
+ calendar.setTime(now);
|
|
|
|
|
+ calendar.add(Calendar.MONTH, -months + 1);
|
|
|
|
|
+ Date startMonth = calendar.getTime();
|
|
|
|
|
+
|
|
|
|
|
+ // 获取所有团队成员buyerId
|
|
|
|
|
+ List<Long> memberIds = new ArrayList<>();
|
|
|
|
|
+ LambdaQueryWrapper<ReferralTree> treeWrapper = new LambdaQueryWrapper<ReferralTree>()
|
|
|
|
|
+ .eq(ReferralTree::getParentId, userId);
|
|
|
|
|
+ List<ReferralTree> trees = referralTreeMapper.selectList(treeWrapper);
|
|
|
|
|
+ for (ReferralTree tree : trees) {
|
|
|
|
|
+ if (tree.getChildId() != null) {
|
|
|
|
|
+ memberIds.add(tree.getChildId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Map<Long, Integer> monthConsumptionMap = new LinkedHashMap<>();
|
|
|
|
|
+ for (int i = 0; i < months; i++) {
|
|
|
|
|
+ Calendar c = Calendar.getInstance();
|
|
|
|
|
+ c.setTime(startMonth);
|
|
|
|
|
+ c.add(Calendar.MONTH, i);
|
|
|
|
|
+ int dayOfMonth = c.getActualMinimum(Calendar.DAY_OF_MONTH);
|
|
|
|
|
+ int lastDayOfMonth = c.getActualMaximum(Calendar.DAY_OF_MONTH);
|
|
|
|
|
+ long monthBegin = dayOfMonth * 24 * 60 * 60 * 1000;
|
|
|
|
|
+ long monthLast = lastDayOfMonth * 24 * 60 * 60 * 1000;
|
|
|
|
|
+
|
|
|
|
|
+ LambdaQueryWrapper<ProductOrder> wrapper = new LambdaQueryWrapper<ProductOrder>()
|
|
|
|
|
+ .ge(ProductOrder::getCreatedAt, monthBegin)
|
|
|
|
|
+ .le(ProductOrder::getCreatedAt, monthLast)
|
|
|
|
|
+ .eq(ProductOrder::getFulfillStatus, "completed");
|
|
|
|
|
+ if (!memberIds.isEmpty()) {
|
|
|
|
|
+ wrapper.in(ProductOrder::getBuyerId, memberIds);
|
|
|
|
|
+ }
|
|
|
|
|
+ int sum = productOrderMapper.selectList(wrapper).stream()
|
|
|
|
|
+ .mapToLong(o -> o.getTotalAmount() != null ? o.getTotalAmount() : 0)
|
|
|
|
|
+ .sum();
|
|
|
|
|
+ monthConsumptionMap.put((long) i, sum);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for (int i = 0; i < months; i++) {
|
|
|
|
|
+ Calendar labelCal = Calendar.getInstance();
|
|
|
|
|
+ labelCal.setTime(startMonth);
|
|
|
|
|
+ labelCal.add(Calendar.MONTH, i);
|
|
|
|
|
+ int year = labelCal.get(Calendar.YEAR);
|
|
|
|
|
+ int month = labelCal.get(Calendar.MONTH) + 1;
|
|
|
|
|
+ labels.add(year + "-" + String.format("%02d", month));
|
|
|
|
|
+ data.add(monthConsumptionMap.getOrDefault((long) i, 0));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ result.put("labels", labels);
|
|
|
|
|
+ result.put("data", data);
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取直推团队(L1)消费曲线数据(按月份统计L1成员消费总额)
|
|
|
|
|
+ */
|
|
|
|
|
+ public Map<String, Object> getTeamL1ConsumptionCurve(Long userId, Integer months) {
|
|
|
|
|
+ if (months == null || months <= 0) months = 12;
|
|
|
|
|
+ if (months > 36) months = 36;
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> result = new LinkedHashMap<>();
|
|
|
|
|
+ List<String> labels = new ArrayList<>();
|
|
|
|
|
+ List<Integer> data = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ Date now = new Date();
|
|
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
|
|
+ calendar.setTime(now);
|
|
|
|
|
+ calendar.add(Calendar.MONTH, -months + 1);
|
|
|
|
|
+ Date startMonth = calendar.getTime();
|
|
|
|
|
+
|
|
|
|
|
+ Map<Long, Integer> monthL1ConsumptionMap = new LinkedHashMap<>();
|
|
|
|
|
+ for (int i = 0; i < months; i++) {
|
|
|
|
|
+ Calendar c = Calendar.getInstance();
|
|
|
|
|
+ c.setTime(startMonth);
|
|
|
|
|
+ c.add(Calendar.MONTH, i);
|
|
|
|
|
+ int dayOfMonth = c.getActualMinimum(Calendar.DAY_OF_MONTH);
|
|
|
|
|
+ int lastDayOfMonth = c.getActualMaximum(Calendar.DAY_OF_MONTH);
|
|
|
|
|
+ long monthBegin = dayOfMonth * 24 * 60 * 60 * 1000;
|
|
|
|
|
+ long monthLast = lastDayOfMonth * 24 * 60 * 60 * 1000;
|
|
|
|
|
+
|
|
|
|
|
+ LambdaQueryWrapper<ProductOrder> wrapper = new LambdaQueryWrapper<ProductOrder>()
|
|
|
|
|
+ .ge(ProductOrder::getCreatedAt, monthBegin)
|
|
|
|
|
+ .le(ProductOrder::getCreatedAt, monthLast)
|
|
|
|
|
+ .eq(ProductOrder::getFulfillStatus, "completed")
|
|
|
|
|
+ .eq(ProductOrder::getReferrerId, userId);
|
|
|
|
|
+ int sum = productOrderMapper.selectList(wrapper).stream()
|
|
|
|
|
+ .mapToLong(o -> o.getTotalAmount() != null ? o.getTotalAmount() : 0)
|
|
|
|
|
+ .sum();
|
|
|
|
|
+ monthL1ConsumptionMap.put((long) i, sum);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for (int i = 0; i < months; i++) {
|
|
|
|
|
+ Calendar labelCal = Calendar.getInstance();
|
|
|
|
|
+ labelCal.setTime(startMonth);
|
|
|
|
|
+ labelCal.add(Calendar.MONTH, i);
|
|
|
|
|
+ int year = labelCal.get(Calendar.YEAR);
|
|
|
|
|
+ int month = labelCal.get(Calendar.MONTH) + 1;
|
|
|
|
|
+ labels.add(year + "-" + String.format("%02d", month));
|
|
|
|
|
+ data.add(monthL1ConsumptionMap.getOrDefault((long) i, 0));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ result.put("labels", labels);
|
|
|
|
|
+ result.put("data", data);
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private String generateReferralCode(Long userId) {
|
|
private String generateReferralCode(Long userId) {
|
|
|
String chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
|
|
String chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
|
|
|
Random random = new Random();
|
|
Random random = new Random();
|