xuqiang преди 1 година
родител
ревизия
6977f8af13

+ 2 - 2
src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java

@@ -337,7 +337,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             details.setJqpremium(insAreaCompany.getJqpremium());
             details.setSypremium(insAreaCompany.getSypremium());
             details.setJypremium(insAreaCompany.getJypremium());
-            BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(user.getGrade()));
+            BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(user.getGrade()),user.getUserId());
             details.setProportional(String.valueOf(bigDecimal));
             details.setExtractFee(details.getSumpremium().multiply(bigDecimal
                     .divide(new BigDecimal("100"))).setScale(2, RoundingMode.DOWN));
@@ -374,7 +374,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         details.setJqpremium(insAreaCompany.getJqpremium());
         details.setSypremium(insAreaCompany.getSypremium());
         details.setJypremium(insAreaCompany.getJypremium());
-        BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()));
+        BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()),partnerUser.getUserId());
         details.setProportional(String.valueOf(bigDecimal));
         details.setExtractFee(details.getSumpremium().multiply(bigDecimal
                 .divide(new BigDecimal("100"))).setScale(2, RoundingMode.DOWN));

+ 181 - 22
src/main/java/com/ydtech/modules/partner/CalculateCommissionUtils.java

@@ -1,56 +1,215 @@
 package com.ydtech.modules.partner;
 
-
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ydtech.modules.partner.dao.PartnerPremiumDetailsMapper;
+import com.ydtech.modules.partner.dao.PartnerUserMapper;
 import com.ydtech.modules.partner.model.PartnerCommissionRules;
+import com.ydtech.modules.partner.model.PartnerPremiumDetails;
+import com.ydtech.modules.partner.model.PartnerRatio;
+import com.ydtech.modules.partner.model.param.CommissionValidityPeriod;
 import com.ydtech.modules.partner.model.vo.CommissionRulesVo;
+import com.ydtech.modules.partner.model.vo.PartnerRulesRatio;
 import com.ydtech.modules.partner.service.PartnerCommissionService;
+import com.ydtech.modules.partner.service.PartnerUserService;
 import com.ydtech.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import javax.annotation.PostConstruct;
 import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Component
 public class CalculateCommissionUtils {
 
+    private static final Logger log = LoggerFactory.getLogger(CalculateCommissionUtils.class);
 
-    private static  PartnerCommissionService commissionService;
+    private static PartnerCommissionService commissionService;
+    private static PartnerUserMapper partnerUserMapper;
+    private static PartnerPremiumDetailsMapper partnerPremiumDetailsMapper;
+    private static PartnerUserService partnerUserService;
 
     @Autowired
-    public void setCommissionService(PartnerCommissionService commissionService) {
-        this.commissionService = commissionService;
+    public void setCommissionService(PartnerCommissionService commissionService,
+                                     PartnerUserMapper partnerUserMapper,
+                                     PartnerPremiumDetailsMapper partnerPremiumDetailsMapper,
+                                     PartnerUserService partnerUserService) {
+        CalculateCommissionUtils.commissionService = commissionService;
+        CalculateCommissionUtils.partnerUserMapper = partnerUserMapper;
+        CalculateCommissionUtils.partnerPremiumDetailsMapper = partnerPremiumDetailsMapper;
+        CalculateCommissionUtils.partnerUserService = partnerUserService;
     }
 
+    @PostConstruct
+    public void init() {
+    }
 
-
-    public static BigDecimal calculateCommission(String grade) {
+    public static BigDecimal calculateCommission(String grade, String userId) {
         CommissionRulesVo rulesVo = commissionService.queryAll();
-        if (StringUtils.equals("1",grade)){
+        if (rulesVo == null) return BigDecimal.ZERO;
+        BigDecimal gl = ladderCommission(StringUtils.equals("3", grade) ? "2" : grade,
+                rulesVo.getAdministrator().getRulesRatioList(),
+                StringUtils.equals("3", grade) ? partnerUserMapper.queryReferrerId(userId) : userId,
+                rulesVo.getAdministrator());
+        BigDecimal hh = ladderCommission(StringUtils.equals("4", grade) ? "3" : grade,
+                rulesVo.getPartner().getRulesRatioList(),
+                StringUtils.equals("4", grade) ? partnerUserMapper.queryReferrerId(userId) : userId,
+                rulesVo.getPartner());
+        if (StringUtils.equals("1", grade)) {
             return new BigDecimal(rulesVo.getOriginator());
         }
-        if (StringUtils.equals("2",grade)){
+        if (StringUtils.equals("2", grade)) {
             PartnerCommissionRules administrator = rulesVo.getAdministrator();
-            return new BigDecimal(administrator.getDefaultRatio());
+            if (isZero(gl) && isZero(hh)) {
+                return subtractRatios(administrator.getSharedRatio(), administrator.getDefaultRatio())
+                        .add(subtractRatios(rulesVo.getPartner().getSharedRatio(), rulesVo.getPartner().getDefaultRatio()));
+            } else if (isZero(hh)) {
+                return new BigDecimal(administrator.getSharedRatio()).subtract(gl)
+                        .add(subtractRatios(rulesVo.getPartner().getSharedRatio(), rulesVo.getPartner().getDefaultRatio()));
+            } else if (isZero(gl)) {
+                return new BigDecimal(rulesVo.getPartner().getSharedRatio()).subtract(hh)
+                        .add(subtractRatios(administrator.getSharedRatio(), administrator.getDefaultRatio()));
+            }
         }
-        if (StringUtils.equals("3",grade)){
-            PartnerCommissionRules administrator = rulesVo.getAdministrator();
-            String sharedRatio = administrator.getSharedRatio();
-            String defaultRatio = administrator.getDefaultRatio();
-            BigDecimal subtract = new BigDecimal(sharedRatio).subtract(new BigDecimal(defaultRatio));
+        if (StringUtils.equals("3", grade)) {
             PartnerCommissionRules partner = rulesVo.getPartner();
-            String defaultRatio1 = partner.getDefaultRatio();
-            return subtract.add(new BigDecimal(defaultRatio1));
+            if (isZero(gl) && isZero(hh)) {
+                return new BigDecimal(partner.getDefaultRatio())
+                        .add(subtractRatios(rulesVo.getAdministrator().getSharedRatio(), rulesVo.getAdministrator().getDefaultRatio()));
+            } else if (isZero(hh)) {
+                return new BigDecimal(rulesVo.getAdministrator().getSharedRatio())
+                        .subtract(new BigDecimal(rulesVo.getAdministrator().getDefaultRatio()))
+                        .add(new BigDecimal(partner.getDefaultRatio()));
+            } else if (isZero(gl)) {
+                return new BigDecimal(partner.getSharedRatio()).subtract(hh)
+                        .add(subtractRatios(rulesVo.getAdministrator().getSharedRatio(), rulesVo.getAdministrator().getDefaultRatio()));
+            }
+        }
+        if (StringUtils.equals("4", grade)) {
+            return isZero(hh) ? subtractRatios(rulesVo.getPartner().getSharedRatio(), rulesVo.getPartner().getDefaultRatio()) : hh;
         }
-        if (StringUtils.equals("4",grade)){
+        return BigDecimal.ZERO;
+    }
 
-            PartnerCommissionRules partner = rulesVo.getPartner();
-            String defaultRatio1 = partner.getDefaultRatio();
-            String sharedRatio = partner.getSharedRatio();
-            return new BigDecimal(sharedRatio).subtract(new BigDecimal(defaultRatio1));
+    private static boolean isZero(BigDecimal value) {
+        return value.compareTo(BigDecimal.ZERO) == 0;
+    }
+
+    private static BigDecimal subtractRatios(String a, String b) {
+        return new BigDecimal(a).subtract(new BigDecimal(b));
+    }
+
+    public static BigDecimal ladderCommission(String grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules) {
+        if (CollectionUtil.isEmpty(rulesRatioList) || StringUtils.equals("1", grade)) {
+            return BigDecimal.ZERO;
+        }
+        CommissionValidityPeriod period = getCommissionValidityPeriod(rules, userId, grade);
+        List<PartnerRulesRatio> sortedList = rulesRatioList.stream()
+                .sorted(Comparator.comparing(PartnerRulesRatio::getKickback).reversed())
+                .collect(Collectors.toList());
+        Set<String> userIdList = getUserIdList(userId);
+        BigDecimal sumPremium = BigDecimal.ZERO;
+        if (CollectionUtil.isNotEmpty(userIdList)) {
+            try {
+                QueryWrapper<PartnerPremiumDetails> queryWrapper = new QueryWrapper<>();
+                queryWrapper.in("user_id", userIdList);
+                if (StringUtils.isNotEmpty(period.getStartDate()) && StringUtils.isNotEmpty(period.getEndDate())) {
+                    queryWrapper.between("create_time", period.getStartDate(), period.getEndDate());
+                }
+                BigDecimal totalSumPremium = partnerPremiumDetailsMapper.selectTotalSumPremium(queryWrapper);
+                sumPremium = Optional.ofNullable(totalSumPremium).orElse(BigDecimal.ZERO);
+            } catch (Exception e) {
+                log.error("查询保费失败", e);
+            }
+        } else {
+            return BigDecimal.ZERO;
+        }
+        Integer number;
+        switch (grade) {
+            case "2":
+                number = partnerUserMapper.selectNumber(userId, "4", period);
+                break;
+            case "3":
+                number = partnerUserMapper.selectNumber(userId, "5", period);
+                break;
+            default:
+                return BigDecimal.ZERO;
+        }
+        BigDecimal numberBD = BigDecimal.valueOf(number);
+        for (PartnerRulesRatio ratio : sortedList) {
+            int allSatisfied = ratio.getAllSatisfied();
+            List<PartnerRatio> ratioList = ratio.getPartnerRatioList();
+            if (CollectionUtil.isEmpty(ratioList)) continue;
+
+            BigDecimal min = ratioList.get(0).getMin();
+            if (allSatisfied == 1) {
+                if (numberBD.compareTo(min) >= 0 && sumPremium.compareTo(min) >= 0) {
+                    return ratio.getKickback();
+                }
+            } else {
+                if (numberBD.compareTo(min) >= 0 || sumPremium.compareTo(min) >= 0) {
+                    return ratio.getKickback();
+                }
+            }
         }
         return BigDecimal.ZERO;
     }
 
+    public static CommissionValidityPeriod getCommissionValidityPeriod(PartnerCommissionRules rules, String userId, String grade) {
+        CommissionValidityPeriod period = new CommissionValidityPeriod();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date assessmentTime = partnerUserMapper.selectAssessmentTime(userId, grade);
+        if (assessmentTime == null) {
+            partnerUserMapper.updateAssessmentTime(userId);
+            assessmentTime = partnerUserMapper.selectAssessmentTime(userId, grade);
+            if (assessmentTime == null) return period;
+        }
+        if (StringUtils.equals("1", rules.getValidityPeriod())) {
+            return period;
+        } else if (StringUtils.equals("2", rules.getValidityPeriod())) {
+            if (isAfterNDays(assessmentTime, rules.getFixedDays())) {
+                if (isAfterNDays(assessmentTime, rules.getFixedDays() * 2)) {
+                    partnerUserMapper.updateAssessmentTimeByDate(userId, new Date());
+                } else {
+                    Date date = addDays(assessmentTime, rules.getFixedDays());
+                    partnerUserMapper.updateAssessmentTimeByDate(userId, date);
+                }
+            } else {
+                period.setStartDate(dateFormat.format(assessmentTime));
+                period.setEndDate(dateFormat.format(addDays(assessmentTime, rules.getFixedDays())));
+            }
+        } else if (StringUtils.equals("3", rules.getValidityPeriod())) {
+            period.setStartDate(rules.getStartDate());
+            period.setEndDate(rules.getEndDate());
+        }
+        return period;
+    }
+
+    public static boolean isAfterNDays(Date targetDate, int days) {
+        LocalDateTime targetDateTime = targetDate.toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDateTime();
+        LocalDateTime currentDateTime = LocalDateTime.now();
+        LocalDateTime nDaysLater = currentDateTime.plusDays(days);
+        return targetDateTime.isAfter(nDaysLater);
+    }
 
+    public static Date addDays(Date date, int days) {
+        LocalDateTime localDate = date.toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDateTime();
+        LocalDateTime newLocalDate = localDate.plusDays(days);
+        return Date.from(newLocalDate.atZone(ZoneId.systemDefault()).toInstant());
+    }
 
+    public static Set<String> getUserIdList(String userId) {
+        Set<String> list = new HashSet<>();
+        partnerUserService.getLevelUserId(userId, list);
+        return list;
+    }
 }

+ 12 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerPremiumDetailsMapper.java

@@ -1,10 +1,22 @@
 package com.ydtech.modules.partner.dao;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ydtech.modules.partner.model.PartnerPremiumDetails;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.math.BigDecimal;
+import java.util.Set;
 
 @Mapper
 public interface PartnerPremiumDetailsMapper extends BaseMapper<PartnerPremiumDetails> {
+
+
+
+    @Select("SELECT SUM(sumpremium) FROM partner_premium_details ${ew.customSqlSegment} ")
+    BigDecimal selectTotalSumPremium(@Param("ew") QueryWrapper<PartnerPremiumDetails> queryWrapper);
+
 }

+ 33 - 5
src/main/java/com/ydtech/modules/partner/dao/PartnerUserMapper.java

@@ -2,24 +2,23 @@ package com.ydtech.modules.partner.dao;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.partner.model.PartnerUser;
 import com.ydtech.modules.partner.model.param.AppHomeParams;
+import com.ydtech.modules.partner.model.param.CommissionValidityPeriod;
 import com.ydtech.modules.partner.model.param.QueryVo;
 import com.ydtech.modules.partner.model.vo.*;
 import org.apache.ibatis.annotations.*;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 @Mapper
 public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
 
     //分页查询
-    Page<PartnerUserVo> selectPage( Page page, @Param("queryVo")QueryVo queryVo);
+    IPage<PartnerUserVo> selectPage(Page page, @Param("queryVo")QueryVo queryVo);
 
     @MapKey("userId")
     List<Map<String, String>> selectRecommender(@Param("level") String level);
@@ -79,4 +78,33 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     JSONObject myPerformanceTotal(@Param("map")Map<String, String> map, @Param("list") Set<String> list);
 
     List<JSONObject> queryDataList(@Param("map")Map<String, String> map, @Param("list") Set<String> list);
+
+
+    Integer selectNumber(@Param("userId") String userId, @Param("number") String number,@Param("period") CommissionValidityPeriod period);
+
+    @Select("SELECT referrer_id FROM partner_user WHERE user_id = #{userId} ")
+    String queryReferrerId(String userId);
+
+    @Select("SELECT   " +
+            "   COUNT( p.user_id )    " +
+            "FROM   " +
+            "   partner_user p   " +
+            "   LEFT JOIN sys_user u ON u.id = p.user_id    " +
+            "WHERE   " +
+            "   u.`status` = 1    " +
+            "   AND p.referrer_id = #{userId}    " +
+            "   AND p.grade = #{number}")
+    Integer selectNumberGzs(@Param("userId") String userId,@Param("number") String number);
+
+
+    @Select("SELECT assessment_time FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
+    Date selectAssessmentTime(@Param("userId") String userId, @Param("grade")String grade);
+
+    @Update("UPDATE partner_user SET assessment_time = ( " +
+            " SELECT approve_time FROM sys_user_track WHERE user_id = #{userId} " +
+            " ) WHERE  user_id = #{userId} ")
+    void updateAssessmentTime(String userId);
+
+    @Update("UPDATE partner_user SET assessment_time = #{date} WHERE  user_id = #{userId} ")
+    void updateAssessmentTimeByDate(@Param("userId") String userId,@Param("date") Date date);
 }

+ 17 - 0
src/main/java/com/ydtech/modules/partner/model/param/CommissionValidityPeriod.java

@@ -0,0 +1,17 @@
+package com.ydtech.modules.partner.model.param;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class CommissionValidityPeriod {
+
+    @ApiModelProperty(value = "开始时间")
+    private String startDate;
+
+    @ApiModelProperty(value = "结束时间")
+    private String endDate;
+
+
+}

+ 6 - 4
src/main/java/com/ydtech/modules/partner/service/Impl/PartnerUserServiceImpl.java

@@ -9,6 +9,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ydtech.core.page.HttpResult;
@@ -68,8 +69,8 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
     }
 
     @Override
-    public Page<PartnerUserVo> queryPage(QueryVo queryVo) {
-        Page<PartnerUserVo> page = baseMapper.selectPage(queryVo.getPage(),queryVo);
+    public IPage<PartnerUserVo> queryPage(QueryVo queryVo) {
+        IPage<PartnerUserVo> page = baseMapper.selectPage(queryVo.getPage(),queryVo);
         return page;
     }
 
@@ -252,6 +253,7 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
         return HttpResult.ok(homeVo);
     }
 
+    @Override
     public void getLevelUserId(String userId,Set<String> list){
         List<String> level = baseMapper.selectByLevelUserId(userId);
         if (CollectionUtil.isNotEmpty(level)){
@@ -813,7 +815,7 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
 
         BigDecimal totalAmountSafe = BigDecimal.ZERO;
         for (PartnerUser partnerUser : partnerUsers) {
-            BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()));
+            BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()),partnerUser.getUserId());
             totalAmountSafe = totalAmountSafe.add(bigDecimal);
         }
         JSONObject jsonObject = new JSONObject();
@@ -826,7 +828,7 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
             JSONObject object = new JSONObject();
             object.put("grade",user.getGrade());
             object.put("gradeName",rule.getOrDefault(user.getGrade(),""));
-            object.put("commissionRate",CalculateCommissionUtils.calculateCommission(String.valueOf(user.getGrade())));
+            object.put("commissionRate",CalculateCommissionUtils.calculateCommission(String.valueOf(user.getGrade()),user.getUserId()));
             list.add(object);
         }
         jsonObject.put("data",list);

+ 5 - 3
src/main/java/com/ydtech/modules/partner/service/PartnerUserService.java

@@ -1,9 +1,8 @@
 package com.ydtech.modules.partner.service;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ydtech.core.page.HttpResult;
-import com.ydtech.modules.admin.model.vo.AppPartnerNumVo;
 import com.ydtech.modules.admin.model.vo.AppUserInfoVo;
 import com.ydtech.modules.partner.model.PartnerPartnerAccount;
 import com.ydtech.modules.partner.model.PartnerUser;
@@ -15,6 +14,7 @@ import com.ydtech.modules.partner.model.vo.RelationalVo;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 
 public interface PartnerUserService extends IService<PartnerUser> {
@@ -23,7 +23,7 @@ public interface PartnerUserService extends IService<PartnerUser> {
     int insert(PartnerUser partnerUser);
 
 
-    Page<PartnerUserVo> queryPage(QueryVo queryVo);
+    IPage<PartnerUserVo> queryPage(QueryVo queryVo);
 
 
     List<RelationalVo>  relationalQuery(String id);
@@ -73,4 +73,6 @@ public interface PartnerUserService extends IService<PartnerUser> {
     PartnerPartnerAccount newGetFee(String userId);
 
 
+    void  getLevelUserId(String userId, Set<String> list);
+
 }

+ 55 - 33
src/main/resources/mapper/modules/partner/PartnerUserMapper.xml

@@ -92,26 +92,29 @@
 
     <select id="selectTodayOverview" resultType="com.ydtech.modules.partner.model.vo.TodayOverview">
         SELECT
-        (
+        ifnull((
         SELECT COUNT(DISTINCT company_id) FROM partner_premium_details WHERE DATE(create_time) = CURDATE() AND user_id IN
-            <foreach collection="params.relatedPerList" item="item" index="index" separator="," open="(" close=")">
-                #{item}
-            </foreach>
+        <foreach collection="params.relatedPerList" item="item" index="index" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+        ),0
+
         ) numberOrders,
-        (
-            SELECT count(id) FROM partner_user WHERE DATE(create_time) = CURDATE() AND referrer_id = #{params.userId}
+        ifnull(
+            (SELECT count(id) FROM partner_user WHERE DATE(create_time) = CURDATE() AND referrer_id = #{params.userId}),0
 
         ) addPerNumber,
-        (
-        SELECT SUM(db.sumpremium) FROM (SELECT DISTINCT company_id,sumpremium  FROM partner_premium_details
+        ifnull((
+            SELECT SUM(db.sumpremium) FROM (SELECT DISTINCT company_id,sumpremium  FROM partner_premium_details
             WHERE DATE(create_time) = CURDATE() AND  user_id IN
             <foreach collection="params.relatedPerList" item="item" index="index" separator="," open="(" close=")">
                 #{item}
             </foreach>
             ) db
+            ),0
         ) premium,
-        (
-        SELECT SUM(extract_fee) FROM partner_premium_details where DATE(create_time) = CURDATE() AND user_id  = #{params.userId}
+        ifnull(
+            (SELECT SUM(extract_fee) FROM partner_premium_details where DATE(create_time) = CURDATE() AND user_id  = #{params.userId}),0
         ) commission
 
     </select>
@@ -241,32 +244,37 @@ select grade,grade_name from  partner_rule
         </if>
         <if test="grade == 3">
             SELECT
-            (  SELECT count(1) FROM partner_user WHERE grade = 4 and referrer_id = #{params.userId} ) v1,
-            ( SELECT COUNT(1) FROM partner_user WHERE referrer_id IN (
-            SELECT user_id FROM partner_user WHERE grade = 4 and referrer_id = #{params.userId} )) v2,
-            (
-            SELECT
-            COUNT( 1 )
-            FROM
-            partner_user
-            WHERE
-            grade = 4
-            AND to_days(create_time) = to_days(now())
+            ifnull((SELECT count(1) FROM partner_user WHERE grade = 4 and referrer_id = #{params.userId}),) v1,
+            ifnull((
+                SELECT COUNT(1) FROM partner_user WHERE referrer_id IN (
+                SELECT user_id FROM partner_user WHERE grade = 4 and referrer_id = #{params.userId} )
+            ),0) v2,
+            ifnull((
+                SELECT
+                COUNT( 1 )
+                FROM
+                partner_user
+                WHERE
+                grade = 4
+                AND to_days(create_time) = to_days(now())
+                ),0
             ) v3,
-            (
-            SELECT COUNT(1) FROM partner_user WHERE  to_days(create_time) = to_days(now()) and referrer_id IN (
-            SELECT user_id FROM partner_user WHERE grade = 4 and referrer_id = #{params.userId} )
+            ifnull((
+                SELECT COUNT(1) FROM partner_user WHERE  to_days(create_time) = to_days(now()) and referrer_id IN (
+                SELECT user_id FROM partner_user WHERE grade = 4 and referrer_id = #{params.userId} )
+                ),0
             ) v4,
-            (
-            SELECT SUM(db.sumpremium) FROM (
-            SELECT sumpremium FROM partner_premium_details WHERE  to_days(create_time) = to_days(now()) AND user_id in
-            <foreach collection="params.relatedPerList" item="item" index="index" separator="," open="(" close=")">
-                #{item}
-            </foreach>
-            GROUP BY issuer_id,sumpremium ) db
+            ifnull((
+                SELECT SUM(db.sumpremium) FROM (
+                SELECT sumpremium FROM partner_premium_details WHERE  to_days(create_time) = to_days(now()) AND user_id in
+                <foreach collection="params.relatedPerList" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+                GROUP BY issuer_id,sumpremium ) db
+                ),0
             ) v5,
-            (
-            SELECT SUM(extract_fee) FROM partner_premium_details WHERE  to_days(create_time) = to_days(now()) AND user_id = #{params.userId}
+            ifnull(
+            (SELECT SUM(extract_fee) FROM partner_premium_details WHERE  to_days(create_time) = to_days(now()) AND user_id = #{params.userId}),0
             ) v6
         </if>
         <if test="grade == 4">
@@ -787,4 +795,18 @@ select grade,grade_name from  partner_rule
     </select>
 
 
+    <select id="selectNumber" resultType="java.lang.Integer">
+        SELECT
+             COUNT( p.user_id )
+            FROM
+             partner_user p
+             LEFT JOIN sys_user_track t ON t.user_id = p.user_id
+             WHERE
+             t.`status` = 1 AND grade = #{number}
+             <if test="period.startDate != null and period.endDate != null">
+                 AND t.approve_time BETWEEN #{period.startDate} AND #{period.endDate}
+             </if>
+             AND p.referrer_id IN ( SELECT user_id FROM partner_user WHERE referrer_id = #{userId} )
+    </select>
+
 </mapper>