Pārlūkot izejas kodu

团队年回款目标和已回款目标

wucl 2 gadi atpakaļ
vecāks
revīzija
9a0b27293d

+ 100 - 116
biz-base/src/test/java/BrokerageTest.java

@@ -1,116 +1,100 @@
-//import cn.hutool.core.lang.Assert;
-//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-//import com.dayou.BaseApplication;
-//import com.dayou.bo.LeaderRatioBO;
-//import com.dayou.configuration.AsyncManager;
-//import com.dayou.dto.ItemDTO;
-//import com.dayou.entity.BrokerageMarketerRatio;
-//import com.dayou.entity.Customer;
-//import com.dayou.entity.ItemBrokerageGeneral;
-//import com.dayou.service.*;
-//import com.dayou.service.impl.ItemBrokerageSequenceServiceImpl;
-//import com.google.common.cache.Cache;
-//import com.google.common.cache.LoadingCache;
-//import com.google.common.collect.Lists;
-//import com.zaxxer.hikari.HikariDataSource;
-//import lombok.extern.slf4j.Slf4j;
-//import org.junit.Test;
-//import org.junit.runner.RunWith;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.boot.test.context.SpringBootTest;
-//import org.springframework.context.ApplicationContext;
-//import org.springframework.jdbc.core.JdbcTemplate;
-//import org.springframework.scheduling.annotation.Scheduled;
-//import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-//
-//import java.math.BigDecimal;
-//import java.util.List;
-//import java.util.Set;
-//import java.util.concurrent.ExecutionException;
-//
-///**
-// * 类说明:
-// *
-// * @author: wucl
-// * @since: 2023/3/6
-// * created with IntelliJ IDEA.
-// */
-//@Slf4j
-//@SpringBootTest(classes = BaseApplication.class)
-//@RunWith(SpringJUnit4ClassRunner.class)
-//public class BrokerageTest {
-//
-//    @Autowired
-//    private LoadingCache<String,BigDecimal> marketerRatioCache;
-//
-//    @Autowired
-//    private LoadingCache<Long,BigDecimal> baseAmountsCache;
-//
-//    @Autowired
-//    private LoadingCache<String,BigDecimal> globalConfigCache;
-//
-//    @Autowired
-//    private ICustomerService customerService;
-//
-//    @Autowired
-//    private IItemBrokerageSequenceService itemBrokerageSequenceService;
-//
-//    private HikariDataSource hikariDataSource;
-//
-//
-//
-//
-//    @Test
-//    public void testBrokerageCache() throws ExecutionException {
-//        System.out.println(marketerRatioCache.size());
-//        BigDecimal ifPresent = marketerRatioCache.get("2&3");
-//        System.out.println(marketerRatioCache.size());
-//    }
-//
-//    public static void main(String ages []) {
-////        itemBrokerageSequenceService.doNonMarketerAheadSettle();
-////        itemBrokerageSequenceService.doAbleItemBrokerageSettle();
-//
-//        HikariDataSource hikariDataSource = initDataSource();
-//
-//        for (int i =0 ;i<100000;i++){
-//            new Thread(new Runnable() {
-//                @Override
-//                public void run() {
-//                    StringBuffer sb = new StringBuffer("insert into customer (name) values");
-//                    Thread threadName = Thread.currentThread();
-//                    System.out.println(threadName +"线程开始执行...");
-//                    long start = System.currentTimeMillis();
-//                    for (int j =0;j<100;j++){
-//                        if (j!=99){
-//                            sb.append("('"+Thread.currentThread().getName()+"["+j+"]'),");
-//                        }else {
-//                            sb.append("('"+Thread.currentThread().getName()+"["+j+"]')");
-//                        }
-//
-//                    }
-//                    JdbcTemplate jdbcTemplate = new JdbcTemplate(hikariDataSource);
-//                    jdbcTemplate.execute(sb.toString());
-//                    long end = System.currentTimeMillis();
-//                    System.out.println(threadName +"现成执行完毕,耗时:" + (end-start)+"毫秒");
-//                }
-//            }).start();
-//        }
-//        System.out.println("主线程退出...");
-//    }
-//
-//    public static HikariDataSource initDataSource(){
-//        HikariDataSource hikariDataSource = new HikariDataSource();
-//        hikariDataSource.setConnectionTimeout(600000);
-//        hikariDataSource.setMinimumIdle(100);
-//        hikariDataSource.setMaximumPoolSize(100000);
-//        hikariDataSource.setValidationTimeout(5000);
-//        hikariDataSource.setIdleTimeout(300000);
-//        hikariDataSource.setLeakDetectionThreshold(500000);
-//        hikariDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/item-management?autoReconnect=true&useUnicode=true&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true");
-//        hikariDataSource.setUsername("root");
-//        hikariDataSource.setPassword("914851221");
-//        return hikariDataSource;
-//    }
-//
-//}
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.dayou.BaseApplication;
+import com.dayou.bo.LeaderRatioBO;
+import com.dayou.configuration.AsyncManager;
+import com.dayou.controller.ItemController;
+import com.dayou.dto.ItemDTO;
+import com.dayou.entity.BrokerageMarketerRatio;
+import com.dayou.entity.Customer;
+import com.dayou.entity.ItemBrokerageGeneral;
+import com.dayou.service.*;
+import com.dayou.service.impl.ItemBrokerageSequenceServiceImpl;
+import com.dayou.vo.ItemStatVO;
+import com.google.common.cache.Cache;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.Lists;
+import com.zaxxer.hikari.HikariDataSource;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationContext;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.ExecutionException;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.function.ToDoubleFunction;
+import java.util.stream.Collectors;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/3/6
+ * created with IntelliJ IDEA.
+ */
+@Slf4j
+@SpringBootTest(classes = BaseApplication.class)
+@RunWith(SpringJUnit4ClassRunner.class)
+public class BrokerageTest {
+
+    @Autowired
+    private LoadingCache<String,BigDecimal> marketerRatioCache;
+
+    @Autowired
+    private LoadingCache<Long,BigDecimal> baseAmountsCache;
+
+    @Autowired
+    private LoadingCache<String,BigDecimal> globalConfigCache;
+
+    @Autowired
+    private ICustomerService customerService;
+
+    @Autowired
+    private IItemBrokerageSequenceService itemBrokerageSequenceService;
+
+    private HikariDataSource hikariDataSource;
+
+    @Autowired
+    private IUserService userService;
+    
+    @Autowired
+    private IMarketStatService marketStatService;
+
+
+
+
+    @Test
+    public void testBrokerageCache() throws ExecutionException {
+        Set<Long> juniorUserId = userService.getJuniorUserId(117L);
+        BigDecimal bigDecimal = marketStatService.currentYearTeamPayment(juniorUserId);
+        System.out.println(bigDecimal);
+    }
+
+    public static void main(String ages []) {
+
+        new Thread(()->{System.out.println("xxx");}).start();
+        List<Integer> list = Arrays.asList(1,2,3,4,5,6);
+
+        List<Integer> collect = list.stream().map(x->(x+1)).collect(Collectors.toList());
+
+        ItemController itemController = new ItemController();
+        List<Integer> collect1 = list.stream().map(x->x+1).collect(Collectors.toList());
+        list.stream().filter(x->x>2).collect(Collectors.toList());
+        list.stream().forEach(x->System.out.println(x));
+        List<Integer> collect2 = list.stream().limit(3L).collect(Collectors.toList());
+        list.stream().sorted((x,y)->-1).collect(Collectors.toList());
+        double sum = list.stream().mapToDouble(value->Double.valueOf(value)).sum();
+    }
+
+
+
+}

+ 3 - 0
dao/src/main/java/com/dayou/mapper/MarketStatMapper.java

@@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.Set;
 
 /**
  * 类说明:
@@ -20,4 +21,6 @@ public interface MarketStatMapper {
     BigDecimal currentMonthPayment(@Param("userId") Long userId, @Param("lastMonth23") LocalDate lastMonth23);
 
     BigDecimal currentYearPayment(@Param("userId") Long userId);
+
+    BigDecimal currentYearTeamPayment(@Param("userIds") Set<Long> userIds);
 }

+ 25 - 0
dao/src/main/resources/mapper/MarketStatMapper.xml

@@ -111,4 +111,29 @@
             )
           and i.user_id = #{userId}
     </select>
+
+    <select id="currentYearTeamPayment" parameterType="java.util.Set" resultType="java.math.BigDecimal">
+        SELECT
+            ifnull( sum( pc.amount ), 0 )
+        FROM
+            payment_collection pc
+                LEFT JOIN item i ON i.id = pc.item_id
+        WHERE
+            pc.deleted = 0
+          AND pc.payment_date &gt;= concat(
+            YEAR (
+       now())-1,
+                '-12-23'
+            )
+          AND pc.payment_date &lt;=  concat(
+            YEAR (
+       now()),
+                '-12-22'
+            )
+          and i.user_id in (
+        <foreach collection="userIds" item="item" index="index" separator=",">
+            #{item}
+        </foreach>
+              )
+    </select>
 </mapper>

+ 1 - 0
domain/src/main/java/com/dayou/entity/UserTarget.java

@@ -2,6 +2,7 @@ package com.dayou.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.dayou.common.BaseEntity;
+import lombok.Builder;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import com.dayou.annotation.ExcelSheet;

+ 1 - 1
domain/src/main/java/com/dayou/enums/GlobalConfigEnum.java

@@ -73,7 +73,7 @@ public enum GlobalConfigEnum implements CodeMsgEnumInterface<String,CodeMsgEnumI
 
         NON_MARKETER_MONTH_BROKERAGE("NON_MARKETER_MONTH_BROKERAGE",null,"土规部非市场人员每月固定预提金额"),
 
-        MARKETER_BROKERAGE_PERCENTAGE("MARKETER_BROKERAGE_PERCENTAGE",null,"土规部市场人员提成比例"),
+        MARKETER_BROKERAGE_PERCENTAGE("MARKETER_BROKERAGE_PERCENTAGE",null,"土规部客户经理预提比例"),
 
         PARTICIPANT_BROKERAGE_PERCENTAGE("PARTICIPANT_BROKERAGE_PERCENTAGE",null,"土规部参与项目整体提成比例"),
 

+ 2 - 0
service/src/main/java/com/dayou/service/IMarketStatService.java

@@ -4,6 +4,7 @@ import com.dayou.dto.MarketStatDTO;
 import com.dayou.vo.MarketStatVO;
 
 import java.math.BigDecimal;
+import java.util.Set;
 
 /**
  * 类说明:
@@ -18,4 +19,5 @@ public interface IMarketStatService {
     BigDecimal currentMonthPayment(Long userId);
 
     BigDecimal currentYearPayment(Long userId);
+    BigDecimal currentYearTeamPayment(Set<Long> userIds);
 }

+ 2 - 0
service/src/main/java/com/dayou/service/IPaymentCollectionService.java

@@ -3,6 +3,7 @@ import com.dayou.entity.PaymentCollection;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayou.entity.UserTarget;
 import com.dayou.vo.ItemPaymentVO;
 import com.dayou.vo.PaymentCollectionVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -28,4 +29,5 @@ public interface IPaymentCollectionService extends IService<PaymentCollection> {
         Boolean delete(Long id);
 
     IPage<ItemPaymentVO> getItemPayment(Page page,PaymentCollectionVO paymentCollectionVO);
+
 }

+ 14 - 0
service/src/main/java/com/dayou/service/IUserTargetService.java

@@ -27,4 +27,18 @@ public interface IUserTargetService extends IService<UserTarget> {
         Boolean update(UserTarget userTarget);
 
         List<UserTargetVO> getList(UserTargetVO userTargetVO);
+
+        /**
+         * 获取客户经理年目标
+         * @param userId 客户经理
+         * @return
+         */
+        UserTarget getUserTarget(Long userId);
+
+        /**
+         * 获取团队年目标
+         * @param userId 客户经理上层领导(主管 || 部门经理)
+         * @return
+         */
+        UserTarget getTeamTarget(Long userId);
 }

+ 5 - 21
service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java

@@ -117,7 +117,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     public void doCreateBrokerageGeneralAndDetail(BrokerageDetailBO bo) {
         MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(BrokerageRule.LAND_MARKETER_RULE);
             Long userId = bo.getUserId();
-        UserTarget userTarget = getUserTarget(userId);
+        UserTarget userTarget = userTargetService.getUserTarget(userId);
         BigDecimal currentYearPayment = marketStatService.currentYearPayment(userId);
         BigDecimal paymentTarget = new BigDecimal(userTarget.getPaymentTarget());
         bo.setCurrentPayment(currentYearPayment);
@@ -176,7 +176,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         }
         MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(BrokerageRule.LAND_MARKETER_RULE);
         //更新客户经理的提成记录
-        UserTarget userTarget = getUserTarget(marketerDetail.getUserId());
+        UserTarget userTarget = userTargetService.getUserTarget(marketerDetail.getUserId());
         BigDecimal currentMonthPayment = marketStatService.currentMonthPayment(marketerDetail.getUserId());
         BigDecimal paymentTarget = new BigDecimal(userTarget.getPaymentTarget());
         BrokerageDetailBO brokerageDetailBO = BrokerageDetailBO.builder().amount(itemDTO.getAmount()).cate(itemDTO.getCate()).businessSource(itemDTO.getBusinessSource()).itemId(itemDTO.getId()).paymentTarget(paymentTarget).currentPayment(currentMonthPayment).build();
@@ -336,7 +336,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
             //获取此笔回款项目的客户经理本年回款总额
             Long userId = itemMapper.selectById(payment.getItemId()).getUserId();
             BigDecimal currentYearPaymentAmount = marketStatService.currentYearPayment(userId);
-            BigDecimal userTarget = new BigDecimal(getUserTarget(userId).getPaymentTarget());
+            BigDecimal userTarget = new BigDecimal(userTargetService.getUserTarget(userId).getPaymentTarget());
             if (brokerageCalculateSupport.checkMarketerPredictBrokerage(currentYearPaymentAmount, userTarget)){
                 //则需要将上月签订的合同的预提状态改为 可预提
                 List<ItemBrokerageGeneral> lastMonthItemsBrokerages = itemMapper.getLastMonthItems(DateUtils.getLastMonth23(LocalDate.now().getYear(), LocalDate.now().getMonthValue() - 1),userId,BrokerageState.NOT_PAYMENT.getCode());
@@ -448,7 +448,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         //获取此笔回款项目的客户经理本年回款总额
         Long userId = itemMapper.selectById(payment.getItemId()).getUserId();
         BigDecimal currentYearPaymentAmount = marketStatService.currentYearPayment(userId);
-        BigDecimal userTarget = new BigDecimal(getUserTarget(userId).getPaymentTarget());
+        BigDecimal userTarget = new BigDecimal(userTargetService.getUserTarget(userId).getPaymentTarget());
         if (!brokerageCalculateSupport.checkMarketerPredictBrokerage(currentYearPaymentAmount, userTarget)){
             //则需要将上月签订的合同的预提状态改为 不可预提
             List<ItemBrokerageGeneral> lastMonthItemsBrokerages = itemMapper.getLastMonthItems(DateUtils.getLastMonth23(LocalDate.now().getYear(), LocalDate.now().getMonthValue() - 1),userId,BrokerageState.TO_PREDICTING.getCode());
@@ -472,7 +472,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     @Override
     public void updateAheadStatus(Long userId) {
         BigDecimal currentYearPaymentAmount = marketStatService.currentYearPayment(userId);
-        BigDecimal userTarget = new BigDecimal(getUserTarget(userId).getPaymentTarget());
+        BigDecimal userTarget = new BigDecimal(userTargetService.getUserTarget(userId).getPaymentTarget());
         List<ItemBrokerageGeneral> lastMonthItemsBrokerages = itemMapper.getLastMonthItemsInStatus(DateUtils.getLastMonth23(LocalDate.now().getYear(), LocalDate.now().getMonthValue() - 1),userId);
         if (brokerageCalculateSupport.checkMarketerPredictBrokerage(currentYearPaymentAmount, userTarget) && CollectionUtils.isNotEmpty(lastMonthItemsBrokerages)){
             lastMonthItemsBrokerages.stream().forEach(
@@ -490,20 +490,4 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         }
     }
 
-    /**
-     * 获取客户经理年回款目标
-     * @param userId
-     * @return
-     */
-    private UserTarget getUserTarget(Long userId) {
-        UserTarget userTarget = userTargetService.getOne(new LambdaQueryWrapper<UserTarget>().eq(UserTarget::getUserId, userId));
-        if (userTarget==null || userTarget.getPaymentTarget()==null){
-            userTarget = new UserTarget();
-            userTarget.setPaymentTarget(0d);
-            log.info("客户经理id[{}]未设置年回款目标。", userId);
-        }
-        return userTarget;
-    }
-
-
 }

+ 7 - 0
service/src/main/java/com/dayou/service/impl/MarketStatServiceImpl.java

@@ -11,6 +11,7 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.Date;
+import java.util.Set;
 
 /**
  * 类说明:
@@ -50,5 +51,11 @@ public class MarketStatServiceImpl implements IMarketStatService {
         return currentYearPayment;
     }
 
+    @Override
+    public BigDecimal currentYearTeamPayment(Set<Long> userIds) {
+        BigDecimal currentYearTeamPayment = marketStatMapper.currentYearTeamPayment(userIds);
+        return currentYearTeamPayment;
+    }
+
 
 }

+ 2 - 0
service/src/main/java/com/dayou/service/impl/PaymentCollectionServiceImpl.java

@@ -7,6 +7,7 @@ import com.dayou.brokerage.constants.BrokerageBusiness;
 import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.common.BaseEntity;
 import com.dayou.entity.PaymentCollection;
+import com.dayou.entity.UserTarget;
 import com.dayou.enums.OperationTypeEnum;
 import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.PaymentCollectionMapper;
@@ -108,4 +109,5 @@ public class PaymentCollectionServiceImpl extends ServiceImpl<PaymentCollectionM
         IPage<ItemPaymentVO> result = paymentCollectionMapper.getItemPayment(page,paymentCollectionVO);
         return result;
     }
+
 }

+ 5 - 0
service/src/main/java/com/dayou/service/impl/UserServiceImpl.java

@@ -402,6 +402,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return update;
     }
 
+    /**
+     * 获取登录人下属员工集合
+     * @param userId
+     * @return
+     */
     @Override
     public Set<Long> getJuniorUserId(Long userId) {
         Set<Long> juniorUser = new HashSet<>();

+ 39 - 16
service/src/main/java/com/dayou/service/impl/UserTargetServiceImpl.java

@@ -3,30 +3,19 @@ package com.dayou.service.impl;
 import com.dayou.entity.UserTarget;
 import com.dayou.mapper.UserTargetMapper;
 import com.dayou.service.IItemBrokerageGeneralService;
+import com.dayou.service.IUserService;
 import com.dayou.service.IUserTargetService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dayou.utils.LoginContext;
 import com.dayou.vo.UserTargetVO;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.dayou.utils.ExcelUtil;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.springframework.web.multipart.MultipartFile;
+import org.springframework.util.CollectionUtils;
 import java.util.List;
-import java.util.ArrayList;
-import org.springframework.transaction.annotation.Transactional;
-import com.dayou.enums.BatchTaskTypeEnum;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -36,6 +25,7 @@ import com.dayou.enums.BatchTaskTypeEnum;
  * @author wucl
  * @since 2023-02-14
  */
+@Slf4j
 @Service
 public class UserTargetServiceImpl extends ServiceImpl<UserTargetMapper, UserTarget> implements IUserTargetService {
 
@@ -46,6 +36,9 @@ public class UserTargetServiceImpl extends ServiceImpl<UserTargetMapper, UserTar
     @Autowired
     private IItemBrokerageGeneralService iItemBrokerageGeneralService;
 
+    @Autowired
+    private IUserService userService;
+
     @Override
     public UserTarget detail(Long id){
         return this.getById(id);
@@ -77,4 +70,34 @@ public class UserTargetServiceImpl extends ServiceImpl<UserTargetMapper, UserTar
         return list;
     }
 
+    @Override
+    public UserTarget getUserTarget(Long userId) {
+        UserTarget userTarget = this.getOne(new LambdaQueryWrapper<UserTarget>().eq(UserTarget::getUserId, userId));
+        if (userTarget==null || userTarget.getPaymentTarget()==null){
+            userTarget.setSaleTarget(0d);
+            userTarget.setPaymentTarget(0d);
+            log.info("客户经理id[{}]未设置年回款目标。", userId);
+        }
+        return userTarget;
+    }
+
+    @Override
+    public UserTarget getTeamTarget(Long userId) {
+        Set<Long> juniorUserId = userService.getJuniorUserId(userId);
+        UserTarget userTarget = new UserTarget();
+        userTarget.setUserId(userId);
+        if (!CollectionUtils.isEmpty(juniorUserId)){
+            List<UserTarget> list = this.list(new LambdaQueryWrapper<UserTarget>().in(UserTarget::getUserId, juniorUserId));
+            double paymentSum = list.stream().filter(x -> x.getPaymentTarget() != null).collect(Collectors.summarizingDouble(UserTarget::getPaymentTarget)).getSum();
+            double saleSum = list.stream().filter(x -> x.getSaleTarget() != null).collect(Collectors.summarizingDouble(UserTarget::getSaleTarget)).getSum();
+            userTarget.setPaymentTarget(paymentSum);
+            userTarget.setSaleTarget(saleSum);
+            return userTarget;
+        }
+        log.info("员工id[{}]非部门领导。", userId);
+        userTarget.setPaymentTarget(0d);
+        userTarget.setSaleTarget(0d);
+        return userTarget;
+    }
+
 }