Browse Source

fix(commission): 修复月度曲线月份边界计算错误 + 阈值默认值改1980元

Sisyphus 1 day ago
parent
commit
73ce927579

+ 1 - 1
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -1047,7 +1047,7 @@ public class DatabaseInitializer implements CommandLineRunner {
             insertSysConfigSeed("trial_days", "7", "试用天数");
             insertSysConfigSeed("trial_days", "7", "试用天数");
             insertSysConfigSeed("trial_features", "[\"free_activities\",\"free_courses\",\"teacher_consultation\"]", "试用期间可用功能");
             insertSysConfigSeed("trial_features", "[\"free_activities\",\"free_courses\",\"teacher_consultation\"]", "试用期间可用功能");
             insertSysConfigSeed("member_pay_virtual_enabled", "1", "会员支付是否使用虚拟支付通道(1=虚拟,0=普通微信)");
             insertSysConfigSeed("member_pay_virtual_enabled", "1", "会员支付是否使用虚拟支付通道(1=虚拟,0=普通微信)");
-            insertSysConfigSeed("gift_membership_threshold", "20000", "购买送会员商品累计达到该金额(分)赠送会员");
+            insertSysConfigSeed("gift_membership_threshold", "198000", "购买送会员商品累计达到该金额(分)赠送会员");
             insertSysConfigSeed("gift_membership_level", "FAMILY", "达到送会员额度后赠送的会员等级");
             insertSysConfigSeed("gift_membership_level", "FAMILY", "达到送会员额度后赠送的会员等级");
             insertSysConfigSeed("health_dimension_weights", "{\"growth\":0.20,\"sleep\":0.15,\"vision\":0.10,\"immunity\":0.15,\"nutrition\":0.15,\"gut\":0.10,\"exercise\":0.15}", "7维健康→身能量权重配置");
             insertSysConfigSeed("health_dimension_weights", "{\"growth\":0.20,\"sleep\":0.15,\"vision\":0.10,\"immunity\":0.15,\"nutrition\":0.15,\"gut\":0.10,\"exercise\":0.15}", "7维健康→身能量权重配置");
             insertSysConfigSeed("health_dimension_sync_factor", "0.5", "7维健康同步至身能量系数");
             insertSysConfigSeed("health_dimension_sync_factor", "0.5", "7维健康同步至身能量系数");

+ 41 - 19
cfc-backend/src/main/java/com/etotem/cfc/service/CommissionService.java

@@ -23,11 +23,11 @@ import com.etotem.cfc.mapper.UserMapper;
 import com.etotem.cfc.mapper.WithdrawalRequestMapper;
 import com.etotem.cfc.mapper.WithdrawalRequestMapper;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
-import java.util.Calendar;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashMap;
@@ -1000,11 +1000,15 @@ public class CommissionService {
         for (int i = 0; i < months; i++) {
         for (int i = 0; i < months; i++) {
             Calendar c = Calendar.getInstance();
             Calendar c = Calendar.getInstance();
             c.setTime(startMonth);
             c.setTime(startMonth);
+            c.set(Calendar.DAY_OF_MONTH, 1);
             c.add(Calendar.MONTH, i);
             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;
+            long monthBegin = c.getTimeInMillis();
+            c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
+            c.set(Calendar.HOUR_OF_DAY, 23);
+            c.set(Calendar.MINUTE, 59);
+            c.set(Calendar.SECOND, 59);
+            c.set(Calendar.MILLISECOND, 999);
+            long monthLast = c.getTimeInMillis();
 
 
             LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
             LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
                     .ge(User::getCreatedAt, monthBegin)
                     .ge(User::getCreatedAt, monthBegin)
@@ -1061,11 +1065,15 @@ public class CommissionService {
         for (int i = 0; i < months; i++) {
         for (int i = 0; i < months; i++) {
             Calendar c = Calendar.getInstance();
             Calendar c = Calendar.getInstance();
             c.setTime(startMonth);
             c.setTime(startMonth);
+            c.set(Calendar.DAY_OF_MONTH, 1);
             c.add(Calendar.MONTH, i);
             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;
+            long monthBegin = c.getTimeInMillis();
+            c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
+            c.set(Calendar.HOUR_OF_DAY, 23);
+            c.set(Calendar.MINUTE, 59);
+            c.set(Calendar.SECOND, 59);
+            c.set(Calendar.MILLISECOND, 999);
+            long monthLast = c.getTimeInMillis();
 
 
             LambdaQueryWrapper<ProductOrder> wrapper = new LambdaQueryWrapper<ProductOrder>()
             LambdaQueryWrapper<ProductOrder> wrapper = new LambdaQueryWrapper<ProductOrder>()
                     .ge(ProductOrder::getCreatedAt, monthBegin)
                     .ge(ProductOrder::getCreatedAt, monthBegin)
@@ -1112,25 +1120,39 @@ public class CommissionService {
         calendar.add(Calendar.MONTH, -months + 1);
         calendar.add(Calendar.MONTH, -months + 1);
         Date startMonth = calendar.getTime();
         Date startMonth = calendar.getTime();
 
 
+        // L1 直属下级 userId 列表(ProductOrder 无 referrerId 列,需经 users.referrer_id 关联)
+        List<Long> l1UserIds = userMapper.selectList(
+                        new LambdaQueryWrapper<User>().eq(User::getReferrerId, userId))
+                .stream().map(User::getId).collect(Collectors.toList());
+
         Map<Long, Integer> monthL1ConsumptionMap = new LinkedHashMap<>();
         Map<Long, Integer> monthL1ConsumptionMap = new LinkedHashMap<>();
         for (int i = 0; i < months; i++) {
         for (int i = 0; i < months; i++) {
             Calendar c = Calendar.getInstance();
             Calendar c = Calendar.getInstance();
             c.setTime(startMonth);
             c.setTime(startMonth);
+            c.set(Calendar.DAY_OF_MONTH, 1);
             c.add(Calendar.MONTH, i);
             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;
+            long monthBegin = c.getTimeInMillis();
+            c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
+            c.set(Calendar.HOUR_OF_DAY, 23);
+            c.set(Calendar.MINUTE, 59);
+            c.set(Calendar.SECOND, 59);
+            c.set(Calendar.MILLISECOND, 999);
+            long monthLast = c.getTimeInMillis();
+
+            if (l1UserIds.isEmpty()) {
+                monthL1ConsumptionMap.put((long) i, 0);
+                continue;
+            }
 
 
             LambdaQueryWrapper<ProductOrder> wrapper = new LambdaQueryWrapper<ProductOrder>()
             LambdaQueryWrapper<ProductOrder> wrapper = new LambdaQueryWrapper<ProductOrder>()
                     .ge(ProductOrder::getCreatedAt, monthBegin)
                     .ge(ProductOrder::getCreatedAt, monthBegin)
                     .le(ProductOrder::getCreatedAt, monthLast)
                     .le(ProductOrder::getCreatedAt, monthLast)
-.eq(ProductOrder::getFulfillStatus, "completed")
-            .eq(ProductOrder::getBuyerId, userId);
-             int sum = (int) productOrderMapper.selectList(wrapper).stream()
-                     .mapToLong(o -> o.getTotalAmount() != null ? o.getTotalAmount() : 0)
-                     .sum();
-             monthL1ConsumptionMap.put((long) i, sum);
+                    .eq(ProductOrder::getFulfillStatus, "completed")
+                    .in(ProductOrder::getBuyerId, l1UserIds);
+            int sum = (int) 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++) {
         for (int i = 0; i < months; i++) {