Browse Source

市场部领导按照回款来结算

wucl 2 years ago
parent
commit
2d09795bc4
46 changed files with 910 additions and 188 deletions
  1. 15 0
      biz-base/src/main/java/com/dayou/controller/ItemBrokerageDetailController.java
  2. 15 0
      biz-base/src/main/java/com/dayou/controller/ItemBrokerageGeneralController.java
  3. 19 0
      biz-base/src/main/java/com/dayou/controller/ItemBrokerageSequenceController.java
  4. 17 0
      biz-base/src/main/java/com/dayou/controller/ItemBrokerageSequenceDetailController.java
  5. 21 16
      biz-base/src/test/java/BrokerageTest.java
  6. 4 0
      dao/src/main/java/com/dayou/mapper/BrokerageVariableMapper.java
  7. 4 0
      dao/src/main/java/com/dayou/mapper/ItemBrokerageDetailMapper.java
  8. 4 0
      dao/src/main/java/com/dayou/mapper/ItemBrokerageGeneralMapper.java
  9. 4 0
      dao/src/main/java/com/dayou/mapper/ItemBrokerageSequenceDetailMapper.java
  10. 2 0
      dao/src/main/java/com/dayou/mapper/ItemBrokerageSequenceMapper.java
  11. 6 0
      dao/src/main/java/com/dayou/mapper/PaymentCollectionMapper.java
  12. 18 0
      dao/src/main/resources/mapper/BrokerageVariableMapper.xml
  13. 42 0
      dao/src/main/resources/mapper/ItemBrokerageDetailMapper.xml
  14. 65 0
      dao/src/main/resources/mapper/ItemBrokerageGeneralMapper.xml
  15. 60 1
      dao/src/main/resources/mapper/ItemBrokerageSequenceDetailMapper.xml
  16. 36 2
      dao/src/main/resources/mapper/ItemBrokerageSequenceMapper.xml
  17. 19 0
      dao/src/main/resources/mapper/PaymentCollectionMapper.xml
  18. 1 1
      dao/src/main/resources/mapper/TeamMapper.xml
  19. 11 2
      service/src/main/java/com/dayou/dto/PaymentDetailDTO.java
  20. 22 0
      domain/src/main/java/com/dayou/dto/SequenceSimpleDTO.java
  21. 4 2
      domain/src/main/java/com/dayou/entity/BrokerageVariable.java
  22. 8 0
      domain/src/main/java/com/dayou/entity/ItemBrokerageDetail.java
  23. 10 0
      domain/src/main/java/com/dayou/entity/ItemBrokerageSequence.java
  24. 12 0
      domain/src/main/java/com/dayou/entity/ItemBrokerageSequenceDetail.java
  25. 6 0
      domain/src/main/java/com/dayou/vo/BrokerageDetailVO.java
  26. 65 47
      domain/src/main/java/com/dayou/vo/BrokerageGeneralVO.java
  27. 44 1
      domain/src/main/java/com/dayou/vo/BrokerageSequenceDetailVO.java
  28. 14 0
      domain/src/main/java/com/dayou/vo/BrokerageSequenceVO.java
  29. 8 0
      service/src/main/java/com/dayou/brokerage/MarketerBrokerageCalculator.java
  30. 5 1
      service/src/main/java/com/dayou/brokerage/constants/BrokerageBusiness.java
  31. 1 1
      service/src/main/java/com/dayou/brokerage/constants/BrokerageMsg.java
  32. 55 19
      service/src/main/java/com/dayou/brokerage/handler/LandMarketerBrokerageHandler.java
  33. 0 1
      service/src/main/java/com/dayou/dto/ParticipantSettleDTO.java
  34. 2 0
      service/src/main/java/com/dayou/service/IBrokerageVariableService.java
  35. 4 0
      service/src/main/java/com/dayou/service/IItemBrokerageDetailService.java
  36. 2 0
      service/src/main/java/com/dayou/service/IItemBrokerageGeneralService.java
  37. 4 0
      service/src/main/java/com/dayou/service/IItemBrokerageSequenceDetailService.java
  38. 2 0
      service/src/main/java/com/dayou/service/IItemBrokerageSequenceService.java
  39. 5 0
      service/src/main/java/com/dayou/service/IPaymentCollectionService.java
  40. 14 2
      service/src/main/java/com/dayou/service/impl/BrokerageVariableServiceImpl.java
  41. 7 0
      service/src/main/java/com/dayou/service/impl/ItemBrokerageDetailServiceImpl.java
  42. 47 30
      service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java
  43. 5 0
      service/src/main/java/com/dayou/service/impl/ItemBrokerageSequenceDetailServiceImpl.java
  44. 193 62
      service/src/main/java/com/dayou/service/impl/ItemBrokerageSequenceServiceImpl.java
  45. 7 0
      service/src/main/java/com/dayou/service/impl/PaymentCollectionServiceImpl.java
  46. 1 0
      service/src/main/java/com/dayou/service/impl/UserTargetServiceImpl.java

+ 15 - 0
biz-base/src/main/java/com/dayou/controller/ItemBrokerageDetailController.java

@@ -2,6 +2,7 @@ package com.dayou.controller;
 
 import com.dayou.annotation.DataPermission;
 import com.dayou.vo.BrokerageDetailVO;
+import com.dayou.vo.BrokerageGeneralVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,11 +18,16 @@ import org.springframework.web.bind.annotation.*;
 import com.dayou.utils.ConvertUtil;
 import com.dayou.utils.HttpKit;
 import com.dayou.exception.ErrorCode;
+
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.http.MediaType;
 import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
 /**
  * 项目提成明细
  *
@@ -46,6 +52,15 @@ public class ItemBrokerageDetailController extends BaseController {
     }
 
     /**
+     * 提成明细导出
+     */
+    @DataPermission
+    @GetMapping("/export")
+    public void exportData(BrokerageDetailVO itemBrokerageDetailVO, HttpServletResponse response) throws IOException {
+        List<BrokerageDetailVO> list = itemBrokerageDetailService.xList(itemBrokerageDetailVO);
+        exportPlus(response,"提成明细",list,BrokerageDetailVO.class);
+    }
+    /**
      * 项目提成明细详情
      */
     @GetMapping("/{id}")

+ 15 - 0
biz-base/src/main/java/com/dayou/controller/ItemBrokerageGeneralController.java

@@ -3,6 +3,7 @@ package com.dayou.controller;
 import com.dayou.annotation.DataPermission;
 import com.dayou.annotation.IgnoreAuth;
 import com.dayou.vo.BrokerageGeneralVO;
+import com.dayou.vo.BrokerageSequenceVO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
@@ -19,11 +20,16 @@ import org.springframework.web.bind.annotation.*;
 import com.dayou.utils.ConvertUtil;
 import com.dayou.utils.HttpKit;
 import com.dayou.exception.ErrorCode;
+
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.http.MediaType;
 import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
 /**
  * 项目提成总表
  *
@@ -48,6 +54,15 @@ public class ItemBrokerageGeneralController extends BaseController {
     }
 
     /**
+     * 提成总览导出
+     */
+    @DataPermission
+    @GetMapping("/export")
+    public void exportData(BrokerageGeneralVO brokerageGeneralVO, HttpServletResponse response) throws IOException {
+        List<BrokerageGeneralVO> list = itemBrokerageGeneralService.xList(brokerageGeneralVO);
+        exportPlus(response,"提成总览",list,BrokerageGeneralVO.class);
+    }
+    /**
      * 项目提成总表详情
      */
     @GetMapping("/{id}")

+ 19 - 0
biz-base/src/main/java/com/dayou/controller/ItemBrokerageSequenceController.java

@@ -2,7 +2,9 @@ package com.dayou.controller;
 
 import com.dayou.annotation.DataPermission;
 import com.dayou.annotation.IgnoreAuth;
+import com.dayou.dto.ItemDTO;
 import com.dayou.vo.BrokerageSequenceVO;
+import com.dayou.vo.ItemVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,11 +20,18 @@ import org.springframework.web.bind.annotation.*;
 import com.dayou.utils.ConvertUtil;
 import com.dayou.utils.HttpKit;
 import com.dayou.exception.ErrorCode;
+
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.http.MediaType;
 import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
+import static com.dayou.common.Constants.MANAGER_OFFICE;
+
 /**
  * 项目提成流水
  *
@@ -92,6 +101,16 @@ public class ItemBrokerageSequenceController extends BaseController {
     }
 
     /**
+     * 提成结算导出
+     */
+    @DataPermission
+    @GetMapping("/export")
+    public void exportData(BrokerageSequenceVO brokerageSequenceVO, HttpServletResponse response) throws IOException {
+        List<BrokerageSequenceVO> list = itemBrokerageSequenceService.xList(brokerageSequenceVO);
+        exportPlus(response,"提成结算",list,BrokerageSequenceVO.class);
+    }
+
+    /**
      * 提成结算接口,开发测试用
      * @return
      */

+ 17 - 0
biz-base/src/main/java/com/dayou/controller/ItemBrokerageSequenceDetailController.java

@@ -1,6 +1,8 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.DataPermission;
 import com.dayou.vo.BrokerageSequenceDetailVO;
+import com.dayou.vo.BrokerageSequenceVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,11 +18,16 @@ import org.springframework.web.bind.annotation.*;
 import com.dayou.utils.ConvertUtil;
 import com.dayou.utils.HttpKit;
 import com.dayou.exception.ErrorCode;
+
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.http.MediaType;
 import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
 /**
  * 提成流水明细表
  *
@@ -37,6 +44,7 @@ public class ItemBrokerageSequenceDetailController extends BaseController {
     /**
     * 提成流水明细表列表
     */
+    @DataPermission
     @GetMapping("")
     public RestResponse<Page<BrokerageSequenceDetailVO>> page(BrokerageSequenceDetailVO brokerageSequenceDetailVO, Page page){
         Page<BrokerageSequenceDetailVO> pages=itemBrokerageSequenceDetailService.selectPage(page,brokerageSequenceDetailVO);
@@ -44,6 +52,15 @@ public class ItemBrokerageSequenceDetailController extends BaseController {
     }
 
     /**
+     * 提成流水明细导出
+     */
+    @DataPermission
+    @GetMapping("/export")
+    public void exportData(BrokerageSequenceDetailVO brokerageSequenceDetailVO, HttpServletResponse response) throws IOException {
+        List<BrokerageSequenceDetailVO> list = itemBrokerageSequenceDetailService.xList(brokerageSequenceDetailVO);
+        exportPlus(response,"提成结算明细",list,BrokerageSequenceDetailVO.class);
+    }
+    /**
      * 提成流水明细表详情
      */
     @GetMapping("/{id}")

+ 21 - 16
biz-base/src/test/java/BrokerageTest.java

@@ -8,14 +8,17 @@ import com.dayou.dto.ItemDTO;
 import com.dayou.entity.BrokerageMarketerRatio;
 import com.dayou.entity.Customer;
 import com.dayou.entity.ItemBrokerageGeneral;
+import com.dayou.entity.UserTarget;
 import com.dayou.service.*;
 import com.dayou.service.impl.ItemBrokerageSequenceServiceImpl;
+import com.dayou.utils.Md5Utils;
 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.apache.commons.lang3.RandomUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -52,29 +55,31 @@ public class BrokerageTest {
     @Autowired
     private IItemBrokerageSequenceService itemBrokerageSequenceService;
 
+    @Autowired
+    private IUserTargetService userTargetService;
 
 
 
     @Test
     public void testBrokerageCache() throws ExecutionException {
-        itemBrokerageSequenceService.doNonMarketerAheadSettle();
+        userTargetService.getTeamTarget(140L);
     }
 
-    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();
-    }
+//    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();
+//    }
 
 
 

+ 4 - 0
dao/src/main/java/com/dayou/mapper/BrokerageVariableMapper.java

@@ -2,6 +2,9 @@ package com.dayou.mapper;
 
 import com.dayou.entity.BrokerageVariable;
 import com.dayou.dao.CustomBaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,5 @@ import com.dayou.dao.CustomBaseMapper;
  */
 public interface BrokerageVariableMapper extends CustomBaseMapper<BrokerageVariable> {
 
+    List<BrokerageVariable> getCompensationBrokerage(@Param("userId") Long userId,@Param("generalId") Long generalId);
 }

+ 4 - 0
dao/src/main/java/com/dayou/mapper/ItemBrokerageDetailMapper.java

@@ -6,6 +6,8 @@ import com.dayou.dao.CustomBaseMapper;
 import com.dayou.vo.BrokerageDetailVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * <p>
  * 项目提成明细 Mapper 接口
@@ -17,4 +19,6 @@ import org.apache.ibatis.annotations.Param;
 public interface ItemBrokerageDetailMapper extends CustomBaseMapper<ItemBrokerageDetail> {
 
     Page getPage(Page page, @Param("vo") BrokerageDetailVO brokerageDetailVO);
+
+    List<BrokerageDetailVO> xList( @Param("vo") BrokerageDetailVO brokerageDetailVO);
 }

+ 4 - 0
dao/src/main/java/com/dayou/mapper/ItemBrokerageGeneralMapper.java

@@ -6,6 +6,8 @@ import com.dayou.dao.CustomBaseMapper;
 import com.dayou.vo.BrokerageGeneralVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * <p>
  * 项目提成总表 Mapper 接口
@@ -19,4 +21,6 @@ public interface ItemBrokerageGeneralMapper extends CustomBaseMapper<ItemBrokera
     Page<BrokerageGeneralVO> aheadPage(Page page, @Param("itemBrokerageGeneral") BrokerageGeneralVO itemBrokerageGeneral);
 
     ItemBrokerageGeneral getByItemId(@Param("itemId") Long itemId);
+
+    List<BrokerageGeneralVO> xList(@Param("itemBrokerageGeneral") BrokerageGeneralVO itemBrokerageGeneral);
 }

+ 4 - 0
dao/src/main/java/com/dayou/mapper/ItemBrokerageSequenceDetailMapper.java

@@ -6,6 +6,8 @@ import com.dayou.dao.CustomBaseMapper;
 import com.dayou.vo.BrokerageSequenceDetailVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * <p>
  * 提成流水明细表 Mapper 接口
@@ -17,4 +19,6 @@ import org.apache.ibatis.annotations.Param;
 public interface ItemBrokerageSequenceDetailMapper extends CustomBaseMapper<ItemBrokerageSequenceDetail> {
 
     Page<BrokerageSequenceDetailVO> xPage(Page page, @Param("vo") BrokerageSequenceDetailVO vo);
+
+    List<BrokerageSequenceDetailVO> xList(@Param("vo")  BrokerageSequenceDetailVO vo);
 }

+ 2 - 0
dao/src/main/java/com/dayou/mapper/ItemBrokerageSequenceMapper.java

@@ -21,4 +21,6 @@ public interface ItemBrokerageSequenceMapper extends CustomBaseMapper<ItemBroker
     Page<BrokerageSequenceVO> getPage(Page page, @Param("vo") BrokerageSequenceVO vo);
 
     List<BrokerageSequenceVO> deduction( @Param("vo") BrokerageSequenceVO brokerageSequenceVO);
+
+    List<BrokerageSequenceVO> xList(@Param("vo") BrokerageSequenceVO vo);
 }

+ 6 - 0
dao/src/main/java/com/dayou/mapper/PaymentCollectionMapper.java

@@ -2,12 +2,16 @@ package com.dayou.mapper;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dayou.dto.PaymentDetailDTO;
 import com.dayou.entity.PaymentCollection;
 import com.dayou.dao.CustomBaseMapper;
 import com.dayou.vo.ItemPaymentVO;
 import com.dayou.vo.PaymentCollectionVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
+
 /**
  * <p>
  * 回款记录 Mapper 接口
@@ -23,4 +27,6 @@ public interface PaymentCollectionMapper extends CustomBaseMapper<PaymentCollect
     Page<PaymentCollectionVO> page(Page page, @Param("dto") PaymentCollectionVO paymentCollection);
 
     PaymentCollection getDeleted(@Param("id") Long id);
+
+    List<PaymentDetailDTO> getPaymentDetailListByItemId(@Param("itemId") Long itemId ,@Param("userId") Long userId);
 }

+ 18 - 0
dao/src/main/resources/mapper/BrokerageVariableMapper.xml

@@ -25,4 +25,22 @@
         payment_id, user_id, user_type, brokerage_amount, settled_amount, unsettled_amount
     </sql>
 
+    <select id="getCompensationBrokerage" parameterType="java.lang.Long" resultType="com.dayou.entity.BrokerageVariable">
+        SELECT
+            bv.id,
+            bv.payment_id,
+            bv.unsettled_amount,
+            bv.brokerage_amount,
+            bv.user_id,
+            ibd.id as brokerageDetailId
+        FROM
+            brokerage_variable bv
+                left join payment_collection pc on bv.payment_id = pc.id
+                left join item_brokerage_general ibg on ibg.item_id = pc.item_id
+                left join item_brokerage_detail ibd on ibg.id = ibd.general_id and ibd.user_id = bv.user_id
+        WHERE
+        bv.user_id = #{userId} and bv.unsettled_amount != 0 and ibd.general_id = #{generalId} and bv.deleted = 0 and ibd.deleted = 0
+        and pc.payment_date &gt;= concat( YEAR ( now())- 1, '-12-23' )
+        AND pc.payment_date &lt;=   concat( YEAR ( now()), '-12-22' )
+    </select>
 </mapper>

+ 42 - 0
dao/src/main/resources/mapper/ItemBrokerageDetailMapper.xml

@@ -68,4 +68,46 @@
         </if>
         order by ibd.id DESC
     </select>
+
+    <select id="xList" parameterType="com.dayou.vo.BrokerageDetailVO" resultType="com.dayou.vo.BrokerageDetailVO">
+        SELECT
+        ibd.*,
+        u.name as userName,
+        i.name as itemName,
+        i.amount,
+        s.name as stageName,
+        (case ibd.brokerage_rule when 'LAND_MARKETER_RULE' then '市场人员'
+        when 'LAND_SUPERVISOR_RULE' then '营销主管'
+        when 'LAND_MANAGER_RULE' then '营销经理'
+        when 'LAND_OTHER_RULE' then '参与人员' end) as userType
+        FROM
+        item_brokerage_detail ibd
+        LEFT JOIN item_brokerage_general ibg ON ibg.id = ibd.general_id
+        LEFT JOIN item i ON i.id = ibg.item_id
+        LEFT JOIN user u ON u.id = ibd.user_id
+        LEFT JOIN item_stage s on s.id = ibd.brokerage_stage_id
+        where ibd.deleted = 0 and ibg.deleted = 0 and i.deleted = 0
+        <if test="vo!=null and vo.generalId!=null">
+            and ibd.general_id = #{vo.generalId}
+        </if>
+        <if test="vo!=null and vo.userName!=null and vo.userName!='' ">
+            and u.name like concat ('%',#{vo.userName},'%')
+        </if>
+        <if test="vo!=null and vo.itemName!=null and vo.itemName!='' ">
+            and i.name like concat ('%',#{vo.itemName},'%')
+        </if>
+        <if test="vo!=null and vo.brokerageRule!=null and vo.brokerageRule!='' ">
+            and ibd.brokerage_rule =  #{vo.brokerageRule}
+        </if>
+        <if test="vo!=null and vo.brokerageMode!=null and vo.brokerageMode!='' ">
+            and ibd.brokerage_mode =  #{vo.brokerageMode}
+        </if>
+        <if test="vo!=null and vo.userIds!=null and vo.userIds.size!=0">
+            and  ibd.user_id in
+            <foreach collection="vo.userIds" open="(" close=")" separator="," item="userId">
+                #{userId}
+            </foreach>
+        </if>
+        order by ibd.id DESC
+    </select>
 </mapper>

+ 65 - 0
dao/src/main/resources/mapper/ItemBrokerageGeneralMapper.xml

@@ -100,4 +100,69 @@
     <select id="getByItemId" parameterType="java.lang.Long" resultType="com.dayou.entity.ItemBrokerageGeneral">
         select * from item_brokerage_general where item_id= #{itemId} and deleted = 0
     </select>
+
+    <select id="xList" parameterType="com.dayou.vo.BrokerageGeneralVO" resultType="com.dayou.vo.BrokerageGeneralVO">
+        SELECT
+        ibg.id,
+        ibg.marketer_brokerage_amount,
+        ibg.marketer_advance_brokerage_able as marketerAdvanceBrokerageAble,
+        ibg.brokerage_rate,
+        ibg.marketer_advance_brokerage_done,
+        ibg.participant_predict_brokerage_amount,
+        ibg.participant_actual_brokerage_amount,
+        ibg.brokerage_predict_amount,
+        ibg.brokerage_actual_amount,
+        ibg.participant_status,
+        ibg.marketer_status,
+        dd1.name AS cateName,
+        dd2.name AS businessSourceName,
+        i.id as itemId,
+        i.deleted,
+        i.business_no,
+        i.oa_no,
+        i.name,
+        i.client_unit,
+        i.client_name,
+        i.client_manager,
+        i.amount
+        FROM
+        item_brokerage_general ibg
+        LEFT JOIN item i ON i.id = ibg.item_id
+        LEFT JOIN dict_data dd1 ON i.cate = dd1.id
+        LEFT JOIN dict_data dd2 ON i.business_source = dd2.id
+        WHERE
+        i.deleted = 0
+        AND ibg.deleted = 0
+        AND dd1.deleted = 0
+        AND dd2.deleted = 0
+        <if test="itemBrokerageGeneral!=null and itemBrokerageGeneral.marketerAdvanceBrokerageAble!=null">
+            and ibg.marketer_advance_brokerage_able = #{itemBrokerageGeneral.marketerAdvanceBrokerageAble}
+        </if>
+        <if test="itemBrokerageGeneral!=null and itemBrokerageGeneral.marketerAdvanceBrokerageDone!=null">
+            and ibg.marketer_advance_brokerage_done = #{itemBrokerageGeneral.marketerAdvanceBrokerageDone}
+        </if>
+        <if test="itemBrokerageGeneral!=null and itemBrokerageGeneral.name!=null and itemBrokerageGeneral.name!='' ">
+            and i.name like concat ('%',#{itemBrokerageGeneral.name},'%')
+        </if>
+        <if test="itemBrokerageGeneral!=null and itemBrokerageGeneral.businessNo!=null and itemBrokerageGeneral.businessNo!='' ">
+            and i.business_no like concat ('%',#{itemBrokerageGeneral.businessNo},'%')
+        </if>
+        <if test="itemBrokerageGeneral!=null and itemBrokerageGeneral.clientManager!=null and itemBrokerageGeneral.clientManager!='' ">
+            and i.client_manager like concat ('%',#{itemBrokerageGeneral.clientManager},'%')
+        </if>
+        <if test="itemBrokerageGeneral!=null and itemBrokerageGeneral.participantStatus!=null and itemBrokerageGeneral.participantStatus!='' ">
+            and ibg.participant_status = #{itemBrokerageGeneral.participantStatus}
+        </if>
+        <if test="itemBrokerageGeneral!=null and itemBrokerageGeneral.marketerStatus!=null and itemBrokerageGeneral.marketerStatus!='' ">
+            and ibg.marketer_status=#{itemBrokerageGeneral.marketerStatus}
+        </if>
+        <if test="itemBrokerageGeneral!=null and itemBrokerageGeneral.userIds!=null and itemBrokerageGeneral.userIds.size!=0">
+            and  i.user_id in
+            <foreach collection="itemBrokerageGeneral.userIds" open="(" close=")" separator="," item="userId">
+                #{userId}
+            </foreach>
+        </if>
+        ORDER BY
+        ibg.id DESC
+    </select>
 </mapper>

+ 60 - 1
dao/src/main/resources/mapper/ItemBrokerageSequenceDetailMapper.xml

@@ -31,7 +31,11 @@
             ibd.brokerage_rule,
             ibd.brokerage_mode ,
             s.name as stageName,
-            i.name as itemName
+            i.name as itemName,
+        pc.amount as paymentAmount,
+        pc.name as paymentName,
+        ibs.year,
+        ibs.month
         FROM
             item_brokerage_sequence_detail ibsd
                 LEFT JOIN item_brokerage_detail ibd ON ibd.id = ibsd.brokerage_detail_id
@@ -39,22 +43,77 @@
                 LEFT JOIN item_stage s ON s.id = ibd.brokerage_stage_id
                 left join item_brokerage_general g on g.id = ibd.general_id
                 left join item i on i.id = g.item_id
+        left join payment_collection pc on ibsd.payment_id = pc.id
+        left join item_brokerage_sequence ibs on ibsd.sequence_id = ibs.id
         WHERE
             ibsd.deleted = 0
           AND ibd.deleted = 0
           AND u.deleted = 0
           and g.deleted = 0
           and i.deleted = 0
+          and ibs.deleted = 0
         <if test="vo!=null and vo.userName!=null and vo.userName!='' ">
             and u.name like concat ('%',#{vo.userName},'%')
         </if>
         <if test="vo!=null and vo.itemName!=null and vo.itemName!='' ">
             and i.name like concat ('%',#{vo.itemName},'%')
         </if>
+        <if test="vo!=null and vo.year!=null ">
+            and ibs.year = #{vo.year}
+        </if>
+        <if test="vo!=null and vo.month!=null ">
+            and ibs.month = #{vo.month}
+        </if>
         <if test="vo!=null and vo.brokerageCate!=null and vo.brokerageCate!='' ">
             and ibsd.brokerage_cate = #{vo.brokerageCate}
         </if>
         order by ibsd.id DESC
     </select>
 
+    <select id="xList" parameterType="com.dayou.vo.BrokerageSequenceDetailVO" resultType="com.dayou.vo.BrokerageSequenceDetailVO">
+        SELECT
+        ibsd.*,
+        u.NAME AS userName,
+        ibd.predict_amount,
+        ibd.brokerage_rule,
+        ibd.brokerage_mode ,
+        s.name as stageName,
+        i.name as itemName,
+        pc.amount as paymentAmount,
+        pc.name as paymentName,
+        ibs.year,
+        ibs.month
+        FROM
+        item_brokerage_sequence_detail ibsd
+        LEFT JOIN item_brokerage_detail ibd ON ibd.id = ibsd.brokerage_detail_id
+        LEFT JOIN user u ON u.id = ibsd.user_id
+        LEFT JOIN item_stage s ON s.id = ibd.brokerage_stage_id
+        left join item_brokerage_general g on g.id = ibd.general_id
+        left join item i on i.id = g.item_id
+        left join payment_collection pc on ibsd.payment_id = pc.id
+        left join item_brokerage_sequence ibs on ibsd.sequence_id = ibs.id
+        WHERE
+        ibsd.deleted = 0
+        AND ibd.deleted = 0
+        AND u.deleted = 0
+        and g.deleted = 0
+        and i.deleted = 0
+        and ibs.deleted = 0
+        <if test="vo!=null and vo.userName!=null and vo.userName!='' ">
+            and u.name like concat ('%',#{vo.userName},'%')
+        </if>
+        <if test="vo!=null and vo.itemName!=null and vo.itemName!='' ">
+            and i.name like concat ('%',#{vo.itemName},'%')
+        </if>
+        <if test="vo!=null and vo.year!=null ">
+            and ibs.year = #{vo.year}
+        </if>
+        <if test="vo!=null and vo.month!=null ">
+            and ibs.month = #{vo.month}
+        </if>
+        <if test="vo!=null and vo.brokerageCate!=null and vo.brokerageCate!='' ">
+            and ibsd.brokerage_cate = #{vo.brokerageCate}
+        </if>
+        order by ibsd.id DESC
+    </select>
 </mapper>

+ 36 - 2
dao/src/main/resources/mapper/ItemBrokerageSequenceMapper.xml

@@ -35,6 +35,12 @@
         <if test="vo!=null and vo.cate!=null and vo.cate!='' ">
             and ibs.cate =#{vo.cate}
         </if>
+        <if test="vo!=null and vo.year!=null ">
+            and ibs.year = #{vo.year}
+        </if>
+        <if test="vo!=null and vo.month!=null ">
+            and ibs.month = #{vo.month}
+        </if>
         <if test="vo!=null and vo.userIds!=null and vo.userIds.size!=0">
             and  ibs.user_id in
             <foreach collection="vo.userIds" open="(" close=")" separator="," item="userId">
@@ -51,19 +57,23 @@
             ibd.brokerage_rule,
             ibd.brokerage_mode ,
             s.name as stageName,
-            i.name as itemName
+            i.name as itemName,
+            pc.amount as paymentAmount,
+            pc.name as paymentName
         FROM
             item_brokerage_sequence_detail ibsd
                 LEFT JOIN item_brokerage_detail ibd ON ibd.id = ibsd.brokerage_detail_id
                 LEFT JOIN item_stage s ON s.id = ibd.brokerage_stage_id
                 left join item_brokerage_general g on g.id = ibd.general_id
                 left join item i on i.id = g.item_id
+                left join payment_collection pc on ibsd.payment_id = pc.id
+
         WHERE
             ibsd.deleted = 0
           AND ibd.deleted = 0
           and g.deleted = 0
           and i.deleted = 0
-            and ibsd.sequence_id = #{id}
+          and ibsd.sequence_id = #{id}
     </select>
 
     <select id="deduction" parameterType="com.dayou.vo.BrokerageSequenceVO" resultType="com.dayou.vo.BrokerageSequenceVO">
@@ -90,4 +100,28 @@
         </if>
         order by ibs.id DESC
     </select>
+
+    <select id="xList" parameterType="com.dayou.vo.BrokerageSequenceVO" resultType="com.dayou.vo.BrokerageSequenceVO">
+        select ibs.*,u.name as userName from item_brokerage_sequence ibs left join user u on u.id = ibs.user_id
+        where u.deleted = 0 and ibs.deleted = 0
+        <if test="vo!=null and vo.userName!=null and vo.userName!='' ">
+            and u.name like concat ('%',#{vo.userName},'%')
+        </if>
+        <if test="vo!=null and vo.cate!=null and vo.cate!='' ">
+            and ibs.cate =#{vo.cate}
+        </if>
+        <if test="vo!=null and vo.year!=null ">
+            and ibs.year = #{vo.year}
+        </if>
+        <if test="vo!=null and vo.month!=null ">
+            and ibs.month = #{vo.month}
+        </if>
+        <if test="vo!=null and vo.userIds!=null and vo.userIds.size!=0">
+            and  ibs.user_id in
+            <foreach collection="vo.userIds" open="(" close=")" separator="," item="userId">
+                #{userId}
+            </foreach>
+        </if>
+        order by ibs.id DESC
+    </select>
 </mapper>

+ 19 - 0
dao/src/main/resources/mapper/PaymentCollectionMapper.xml

@@ -91,4 +91,23 @@ order by i.id DESC
     <select id="getDeleted" parameterType="java.lang.Long" resultType="com.dayou.entity.PaymentCollection">
         select * from payment_collection where id = #{id} and deleted = 1
     </select>
+
+    <select id="getPaymentDetailListByItemId" resultType="com.dayou.dto.PaymentDetailDTO">
+        SELECT
+        i.id AS itemId,
+        pc.id AS paymentId,
+        pc.amount AS paymentAmount,
+        i.upload_date
+        FROM
+        `payment_collection` pc
+        LEFT JOIN item i ON i.id = pc.item_id
+        LEFT JOIN brokerage_variable bv ON bv.payment_id = pc.id
+        WHERE
+        pc.payment_date &gt;= concat( YEAR ( now())- 1, '-12-23' )
+        AND pc.payment_date &lt;=  concat( YEAR ( now()), '-12-22' )
+        AND i.id = #{itemId}
+        AND NOT EXISTS(select * from brokerage_variable where user_id = #{userId} and payment_id= pc.id and deleted = 0)
+        AND pc.deleted = 0
+        AND i.deleted = 0
+    </select>
 </mapper>

+ 1 - 1
dao/src/main/resources/mapper/TeamMapper.xml

@@ -33,7 +33,7 @@
         from team t left join user u on u.id = t.supervisor_id left join user u1 on u1.id = t.cultivate_id
         left join department d on d.id = t.department_id LEFT JOIN user_post up ON up.user_id = t.cultivate_id
         LEFT JOIN post p ON p.id = up.post_id
-        where t.deleted = 0 and u.deleted =0 and u1.deleted = 0 and d.deleted = 0 and d.name = #{vo.departmentName}
+        where t.deleted = 0 and u.deleted =0 and u1.deleted = 0 and d.deleted = 0 and up.deleted = 0 and d.name = #{vo.departmentName}
         <if test="vo!=null and vo.name!=null and vo.name!= ''">
             and t.name like concat ('%',#{vo.name},'%')
         </if>

+ 11 - 2
service/src/main/java/com/dayou/dto/PaymentDetailDTO.java

@@ -1,10 +1,9 @@
 package com.dayou.dto;
 
-import com.dayou.annotation.ExportCell;
-import com.dayou.annotation.ImportCell;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 
 /**
  * 类说明:
@@ -22,6 +21,11 @@ public class PaymentDetailDTO {
     private Long id;
 
     /**
+     * 项目id
+     */
+    private Long itemId;
+
+    /**
      * 回款金额
      */
     private BigDecimal paymentAmount;
@@ -55,4 +59,9 @@ public class PaymentDetailDTO {
      * 未结算金额
      */
     private BigDecimal unsettledAmount;
+
+    /**
+     * 上传合同时间(合同签订时间)
+     */
+    private LocalDate uploadDate;
 }

+ 22 - 0
domain/src/main/java/com/dayou/dto/SequenceSimpleDTO.java

@@ -0,0 +1,22 @@
+package com.dayou.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/4/17
+ * created with IntelliJ IDEA.
+ */
+@Data
+@Builder
+public class SequenceSimpleDTO {
+
+    private Long paymentId;
+
+    private BigDecimal amount;
+}

+ 4 - 2
domain/src/main/java/com/dayou/entity/BrokerageVariable.java

@@ -1,5 +1,7 @@
 package com.dayou.entity;
 import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.dayou.common.BaseEntity;
 import lombok.Builder;
 import lombok.Data;
@@ -15,7 +17,6 @@ import com.dayou.annotation.ImportCell;
  * @author wucl
  * @since 2023-04-14
  */
-@Builder
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ExcelSheet(sheetName = "浮动提成")
@@ -61,5 +62,6 @@ public class BrokerageVariable extends BaseEntity {
     @ExportCell(columnName = "未结算金额")
     private BigDecimal unsettledAmount;
 
-
+    @TableField(exist = false)
+    private Long brokerageDetailId;
 }

+ 8 - 0
domain/src/main/java/com/dayou/entity/ItemBrokerageDetail.java

@@ -1,5 +1,7 @@
 package com.dayou.entity;
 import java.math.BigDecimal;
+
+import com.dayou.annotation.Excel;
 import com.dayou.common.BaseEntity;
 import lombok.Builder;
 import lombok.Data;
@@ -35,30 +37,36 @@ public class ItemBrokerageDetail extends BaseEntity {
     /**
      * 预计提成金额
      */
+    @Excel(name = "预计提成金额")
     private BigDecimal predictAmount;
 
     /**
      * 预提金额
      */
+    @Excel(name = "预提金额")
     private BigDecimal aheadAmount;
     /**
      * 实际提成金额
      */
+    @Excel(name = "实际提成金额")
     private BigDecimal actualAmount;
 
     /**
      * 已结算金额
      */
+    @Excel(name = "已结算金额")
     private BigDecimal advanceAmount;
 
     /**
      * 提成规则
      */
+    @Excel(name = "提成规则",readConverterExp=("LAND_OTHER_RULE=参与人员规则,LAND_MARKETER_RULE=市场人员规则,LAND_SUPERVISOR_RULE=营销主管规则,LAND_MANAGER_RULE=营销经理规则"))
     private String brokerageRule;
 
     /**
      * 提成方式
      */
+    @Excel(name = "提成方式",readConverterExp=("PERSONAL=个人提成,TEAM_SHARE=团队提成"))
     private String brokerageMode;
 
     /**

+ 10 - 0
domain/src/main/java/com/dayou/entity/ItemBrokerageSequence.java

@@ -43,6 +43,16 @@ public class ItemBrokerageSequence extends BaseEntity {
     private String embody;
 
     /**
+     * 年份
+     */
+    private Integer year;
+
+    /**
+     * 月份
+     */
+    private Integer month;
+
+    /**
      * 备注
      */
     @ImportCell

+ 12 - 0
domain/src/main/java/com/dayou/entity/ItemBrokerageSequenceDetail.java

@@ -36,6 +36,11 @@ public class ItemBrokerageSequenceDetail extends BaseEntity {
     private Long sequenceId;
 
     /**
+     * 回款id
+     */
+    private Long paymentId;
+
+    /**
      * 用户id
      */
     private Long userId;
@@ -48,6 +53,13 @@ public class ItemBrokerageSequenceDetail extends BaseEntity {
     private BigDecimal brokerageAmount;
 
     /**
+     * 未结算金额
+     */
+    @ImportCell
+    @ExportCell(columnName = "提成金额")
+    private BigDecimal unsettledAmount;
+
+    /**
      * 提成类型(预提,结算)
      */
     @ImportCell

+ 6 - 0
domain/src/main/java/com/dayou/vo/BrokerageDetailVO.java

@@ -1,5 +1,6 @@
 package com.dayou.vo;
 
+import com.dayou.annotation.Excel;
 import com.dayou.entity.ItemBrokerageDetail;
 import lombok.Data;
 
@@ -17,14 +18,19 @@ import java.util.Set;
 public class BrokerageDetailVO extends ItemBrokerageDetail {
 
 
+    @Excel(name = "人员名称")
     private String userName;
 
+    @Excel(name = "项目名称")
     private String itemName;
 
+    @Excel(name = "人员类型")
     private String userType;
 
+    @Excel(name = "合同金额")
     private BigDecimal amount;
 
+    @Excel(name = "阶段名称")
     private String stageName;
 
     private Set<Long> userIds;

+ 65 - 47
domain/src/main/java/com/dayou/vo/BrokerageGeneralVO.java

@@ -1,6 +1,7 @@
 package com.dayou.vo;
 
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.dayou.annotation.Excel;
 import lombok.Data;
 
 
@@ -17,112 +18,129 @@ import java.util.Set;
 @Data
 public class BrokerageGeneralVO {
 
-    private BigDecimal amount;
-
-    private Long id;
-
-    private Boolean deleted;
+    /**
+     * 项目名称
+     */
+    @Excel(name = "项目名称")
+    private String name;
 
     /**
-     * 项目id
+     * 事业部流水号
      */
-    private Long itemId;
+    @Excel(name = "事业部流水号")
+    private String businessNo;
+
+    @Excel(name = "合同金额")
+    private BigDecimal amount;
 
     /**
-     * 客户经理提成金额
+     * 客户经理
      */
-    private BigDecimal marketerBrokerageAmount;
+    @Excel(name = "客户经理")
+    private String clientManager;
 
     /**
      * 客户经理 是否可预提
      */
+    @Excel(name = "客户经理可预提" ,readConverterExp=("true=是,false=否"))
     private Boolean marketerAdvanceBrokerageAble;
 
     /**
-     * 提成率
+     * 客户经理已预
      */
-    private BigDecimal brokerageRate;
+    @Excel(name = "客户经理已预提",readConverterExp=("true=是,false=否"))
+    private Boolean marketerAdvanceBrokerageDone;
 
     /**
-     * 客户经理提成状态
+     * 营销人员总提成
      */
-    private String marketerStatus;
-    /**
-     * 项目类型
-     */
-    private String cateName;
+    @Excel(name = "营销人员总提成")
+    private BigDecimal marketerBrokerageAmount;
 
     /**
-     * 业务来源
+     * 营销人员总提成状态
      */
-    private String businessSourceName;
+    @Excel(name = "营销人员总提成状态",readConverterExp=("NOT_START=未开始,PREDICTING=预提中,TO_PREDICTING=待预提,PREDICTED=已预提,NOT_PAYMENT=回款中,FREEZE=冻结,NOT_SETTLE=待结算,CLOSED=已结算") )
+    private String marketerStatus;
 
     /**
-     * 事业部流水号
+     * 提成率
      */
-    private String businessNo;
+    @Excel(name = "客户经理提成率")
+    private BigDecimal brokerageRate;
 
     /**
-     * 公司OA流水号(项目编号)
+     * 参与人预计提成总金额
      */
-    private String oaNo;
+    @Excel(name = "参与人预计提成总金额")
+    @TableField("participant_predict_brokerage_amount")
+    private BigDecimal participantPredictBrokerageAmount;
 
     /**
-     * 项目名称
+     * 参与人实际提成总金额
      */
-    private String name;
+    @Excel(name = "参与人实际提成总金额")
+    @TableField("participant_actual_brokerage_amount")
+    private BigDecimal participantActualBrokerageAmount;
 
     /**
-     * 委托单位
+     * 参与人提成状态
      */
-    private String clientUnit;
+    @Excel(name = "参与人提成状态",readConverterExp=("NOT_START=未开始,PREDICTING=预提中,TO_PREDICTING=待预提,PREDICTED=已预提,NOT_PAYMENT=回款中,FREEZE=冻结,NOT_SETTLE=待结算,CLOSED=已结算"))
+    private String participantStatus;
 
     /**
-     * 委托人
+     * 预计提成总金额
      */
-    private String clientName;
+    @Excel(name = "预计提成总金额")
+    private BigDecimal brokeragePredictAmount;
 
     /**
-     * 客户经理
+     * 已提成总金额
      */
-    private String clientManager;
+    @Excel(name = "已提成总金额")
+    private BigDecimal brokerageActualAmount;
 
     /**
-     * 客户经理已预提
+     * 参与人预提中
      */
-    private Boolean marketerAdvanceBrokerageDone;
+    private Boolean participantAdvanceStatus;
+
+    private Long id;
+
+    private Boolean deleted;
 
     /**
-     * 参与人预计提成总金额
+     * 项目id
      */
-    @TableField("participant_predict_brokerage_amount")
-    private BigDecimal participantPredictBrokerageAmount;
+    private Long itemId;
 
     /**
-     * 参与人实际提成总金额
+     * 项目类型
      */
-    @TableField("participant_actual_brokerage_amount")
-    private BigDecimal participantActualBrokerageAmount;
+    private String cateName;
 
     /**
-     * 参与人预提中
+     * 业务来源
      */
-    private Boolean participantAdvanceStatus;
+    private String businessSourceName;
+
 
     /**
-     * 预计提成总金额
+     * 公司OA流水号(项目编号)
      */
-    private BigDecimal brokeragePredictAmount;
+    private String oaNo;
 
     /**
-     * 已提成总金额
+     * 委托单位
      */
-    private BigDecimal brokerageActualAmount;
+    private String clientUnit;
 
     /**
-     * 参与人提成状态
+     * 委托人
      */
-    private String participantStatus;
+    private String clientName;
+
 
     private Set<Long> userIds;
 

+ 44 - 1
domain/src/main/java/com/dayou/vo/BrokerageSequenceDetailVO.java

@@ -1,11 +1,13 @@
 package com.dayou.vo;
 
+import com.dayou.annotation.Excel;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Data;
 
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 /**
  * 类说明:
@@ -25,26 +27,54 @@ public class BrokerageSequenceDetailVO {
     /**
      * 项目名称
      */
+    @Excel(name = "项目名称")
     private String itemName;
     /**
      * 阶段名称
      */
+    @Excel(name = "阶段名称")
     private String stageName;
 
     /**
+     * 结算年份
+     */
+    @Excel(name = "结算年份")
+    private Integer year;
+
+    /**
+     * 结算月份
+     */
+    @Excel(name = "结算月份")
+    private Integer month;
+
+    /**
+     * 回款名称
+     */
+    @Excel(name = "回款名称")
+    private String paymentName;
+
+    /**
+     * 回款金额
+     */
+    @Excel(name = "回款金额")
+    private BigDecimal paymentAmount;
+
+    /**
      * 人员名称
      */
+    @Excel(name = "人员名称")
     private String userName;
 
-
     /**
      * 结算金额
      */
+    @Excel(name = "结算金额")
     private BigDecimal brokerageAmount;
 
     /**
      * 结算类型
      */
+    @Excel(name = "结算类型",readConverterExp=("AHEAD=预提,SETTLE=结算,PAYMENT_SETTLE=回款结算,COMPENSATION=补偿结算"))
     private String brokerageCate;
 
     /**
@@ -55,16 +85,19 @@ public class BrokerageSequenceDetailVO {
     /**
      * 提成规则
      */
+    @Excel(name = "提成规则" ,readConverterExp=("LAND_OTHER_RULE=参与人员规则,LAND_MARKETER_RULE=市场人员规则,LAND_SUPERVISOR_RULE=营销主管规则,LAND_MANAGER_RULE=营销经理规则"))
     private String brokerageRule;
 
     /**
      * 提成方式
      */
+    @Excel(name = "提成方式",readConverterExp=("PERSONAL=个人提成,TEAM_SHARE=团队提成"))
     private String brokerageMode;
 
     /**
      * 结算时间
      */
+    @Excel(name = "结算时间" ,dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date created;
 
 
@@ -83,4 +116,14 @@ public class BrokerageSequenceDetailVO {
     private Boolean deleted;
 
 
+    /**
+     * 未结算金额
+     */
+    private BigDecimal unsettledAmount;
+
+    /**
+     * 所属员工查询条件
+     */
+    private Set<Long> userIds;
+
 }

+ 14 - 0
domain/src/main/java/com/dayou/vo/BrokerageSequenceVO.java

@@ -1,5 +1,6 @@
 package com.dayou.vo;
 
+import com.dayou.annotation.Excel;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -30,31 +31,43 @@ public class BrokerageSequenceVO  {
     /**
      * 人员姓名
      */
+    @Excel(name = "人员姓名")
     private String userName;
 
     /**
      * 提成总金额
      */
+    @Excel(name = "提成金额")
     private BigDecimal brokerageAmount;
 
+    @Excel(name = "结算年份")
+    private Integer year;
+
+    @Excel(name = "结算月份")
+    private Integer month;
+
     /**
      * 提成体现
      */
+    @Excel(name = "提成体现")
     private String embody;
 
     /**
      * 备注
      */
+    @Excel(name = "备注")
     private String remark;
 
     /**
      * 结算类型(项目结算,默认预提)
      */
+    @Excel(name = "结算类型" ,readConverterExp=("DEFAULT_AHEAD=默认预提,ITEM_SETTLE=项目结算"))
     private String cate;
 
     /**
      * 结算时间
      */
+    @Excel(name = "结算时间",dateFormat = "yyyy-MM-dd HH:mm:ss" )
     private Date created;
 
     /**
@@ -82,4 +95,5 @@ public class BrokerageSequenceVO  {
     private Set<Long> userIds;
 
 
+
 }

+ 8 - 0
service/src/main/java/com/dayou/brokerage/MarketerBrokerageCalculator.java

@@ -8,6 +8,7 @@ import com.dayou.entity.BrokerageVariable;
 import com.dayou.entity.ItemBrokerageDetail;
 
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -101,4 +102,11 @@ public interface MarketerBrokerageCalculator extends BrokerageCalculator {
     BigDecimal managerAmount(BigDecimal signAmount,Long marketerId, Long managerId,BigDecimal postRatio);
 
 
+    /**
+     * 更新市场部领导提成详情
+     * @param list
+     * @param bo
+     * @return
+     */
+    List<ItemBrokerageDetail> updateTeamShareAmount(List<ItemBrokerageDetail> list,BrokerageDetailBO bo);
 }

+ 5 - 1
service/src/main/java/com/dayou/brokerage/constants/BrokerageBusiness.java

@@ -16,7 +16,11 @@ public enum BrokerageBusiness {
     DEFAULT_AHEAD("默认预提","DEFAULT_AHEAD"),
 
     AHEAD("提成预提","AHEAD"),
-    SETTLE("提成结算","SETTLE");
+    SETTLE("提成结算","SETTLE"),
+
+    PAYMENT_SETTLE("回款结算","PAYMENT_SETTLE"),
+
+    COMPENSATION("补偿结算","COMPENSATION");
 
     private String name;
 

+ 1 - 1
service/src/main/java/com/dayou/brokerage/constants/BrokerageMsg.java

@@ -11,7 +11,7 @@ import java.math.BigDecimal;
  */
 public class BrokerageMsg {
 
-    public static final String BROKERAGE_SEQUENCE_REMARK = "系统每月23日零点自动结算项目提成,您上月可结算(包含预提)项目个数:[sum]个,提成奖励在[month]月薪资中体现.";
+    public static final String BROKERAGE_SEQUENCE_REMARK = "系统每月23日零点自动结算项目提成,您上月可结算(包含预提)项目个数:[sum]个.";
 
     public static final String NON_MARKETER_BASE_SEQUENCE_REMARK = "非市场人员默认提成,此提成与项目暂不挂钩.若有项目结算将与固定提成抵扣.";
 

+ 55 - 19
service/src/main/java/com/dayou/brokerage/handler/LandMarketerBrokerageHandler.java

@@ -15,6 +15,7 @@ import com.dayou.enums.GlobalConfigEnum;
 import com.dayou.exception.BusinessException;
 import com.dayou.service.*;
 import com.google.common.cache.LoadingCache;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,6 +23,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
@@ -229,15 +231,14 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
         if (checkTeamMonthlyPayment(teamCurrentYearPayment, teamPaymentTarget)){
             variableAmount = brokerageAmount.multiply(BigDecimal.ONE.subtract(SUPERVISOR_BROKERAGE_SCALE));
         }
-        return BrokerageVariable
-                .builder()
-                .paymentId(paymentId)
-                .userId(supervisorId)
-                .userType(SUPERVISOR)
-                .brokerageAmount(brokerageAmount)
-                .settledAmount(defaultAmount.add(variableAmount))
-                .unsettledAmount(brokerageAmount.subtract(defaultAmount.add(variableAmount)))
-                .build();
+        BrokerageVariable brokerageVariable = new BrokerageVariable();
+        brokerageVariable.setPaymentId(paymentId);
+        brokerageVariable.setUserId(supervisorId);
+        brokerageVariable.setUserType(SUPERVISOR);
+        brokerageVariable.setBrokerageAmount(brokerageAmount);
+        brokerageVariable.setSettledAmount(defaultAmount.add(variableAmount));
+        brokerageVariable.setUnsettledAmount(brokerageAmount.subtract(defaultAmount.add(variableAmount)));
+        return brokerageVariable;
     }
 
     @Override
@@ -280,16 +281,14 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
         if (checkTeamMonthlyPayment(teamCurrentYearPayment, teamPaymentTarget)){
             floatAmount = floatAmount.add(variableAmount);
         }
-
-        return BrokerageVariable
-                .builder()
-                .paymentId(paymentId)
-                .userId(managerId)
-                .userType(MARKET_MANAGER)
-                .brokerageAmount(brokerageAmount)
-                .settledAmount(departmentAmount.add(areaAmount).add(floatAmount))
-                .unsettledAmount(variableAmount)
-                .build();
+        BrokerageVariable brokerageVariable = new BrokerageVariable();
+        brokerageVariable.setPaymentId(paymentId);
+        brokerageVariable.setUserId(managerId);
+        brokerageVariable.setUserType(MARKET_MANAGER);
+        brokerageVariable.setBrokerageAmount(brokerageAmount);
+        brokerageVariable.setSettledAmount(departmentAmount.add(areaAmount).add(floatAmount));
+        brokerageVariable.setUnsettledAmount(brokerageAmount.subtract(brokerageVariable.getSettledAmount()));
+        return brokerageVariable;
     }
 
     @Override
@@ -332,6 +331,43 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
         return departmentAmount.add(areaAmount).add(floatAmount);
     }
 
+    /**
+     * 更新下单时的领导提成详情,暂不考虑领导人员变动情况
+     * @param list
+     * @param bo
+     * @return
+     */
+    @Override
+    public List<ItemBrokerageDetail> updateTeamShareAmount(List<ItemBrokerageDetail> list,BrokerageDetailBO bo) {
+
+        try {
+            BigDecimal ratio = bo.getRate()!=null?bo.getRate():marketerRatioCache.get(bo.mergeKey());
+            if (ratio!=null){
+                checkItemBrokerageStatus(bo);
+                for (ItemBrokerageDetail itemBrokerageDetail : list){
+                    if (itemBrokerageDetail.getGeneralId().equals(bo.getGeneralId())){
+                        BrokerageRule brokerageRuleEnum = BrokerageRule.brokerageRule(itemBrokerageDetail.getBrokerageRule());
+                        switch (brokerageRuleEnum){
+                            case LAND_SUPERVISOR_RULE:
+                                BrokeragePostRatio supervisorRatio = brokeragePostRatioService.getOne(new LambdaQueryWrapper<BrokeragePostRatio>().eq(BrokeragePostRatio::getBrokerageRule, LAND_SUPERVISOR_RULE.getCode()));
+                                itemBrokerageDetail.setPredictAmount(supervisorAmount(bo.getAmount(),itemBrokerageDetail.getUserId(),supervisorRatio.getBrokerageRatio(),ratio));
+                                break;
+                            case LAND_MANAGER_RULE:
+                                BrokeragePostRatio managerRatio = brokeragePostRatioService.getOne(new LambdaQueryWrapper<BrokeragePostRatio>().eq(BrokeragePostRatio::getBrokerageRule, LAND_MANAGER_RULE.getCode()));
+                                itemBrokerageDetail.setPredictAmount(managerAmount(bo.getAmount(),bo.getUserId(),itemBrokerageDetail.getUserId(),managerRatio.getBrokerageRatio()));
+                                break;
+                        }
+                    }
+                }
+            }else {
+                log.info("项目id:[{}],合同金额:[{}],提成系数:[null],[未设置提成系数,无法计算客户经理领导提成]",bo.getId(),bo.getAmount());
+            }
+        } catch (ExecutionException e) {
+            log.error("获取提成缓存数据失败");
+        }
+        return list;
+    }
+
     @Override
     public BigDecimal actualAmount(BigDecimal predictAmount) {
         //客户经理的提成不存在考核,即 预计提成金额 == 实际提成金额

+ 0 - 1
service/src/main/java/com/dayou/dto/ParticipantSettleDTO.java

@@ -1,6 +1,5 @@
 package com.dayou.dto;
 
-import com.dayou.brokerage.constants.BrokerageState;
 import com.dayou.entity.ItemStage;
 import lombok.Builder;
 import lombok.Data;

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

@@ -30,4 +30,6 @@ public interface IBrokerageVariableService extends IService<BrokerageVariable> {
         Boolean delete(Long id);
 
     List<PaymentDetailDTO> getPaymentDetailListByItemId(Long id,Long userId);
+
+    List<BrokerageVariable> getCompensationBrokerage(Long userId,Long generalId);
 }

+ 4 - 0
service/src/main/java/com/dayou/service/IItemBrokerageDetailService.java

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.dayou.vo.BrokerageDetailVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
 /**
  * <p>
  * 项目提成明细 服务类
@@ -29,4 +32,5 @@ public interface IItemBrokerageDetailService extends IService<ItemBrokerageDetai
 
         Boolean crateBrokerageDetail(ItemDTO itemDTO);
 
+    List<BrokerageDetailVO> xList(BrokerageDetailVO itemBrokerageDetailVO);
 }

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

@@ -72,4 +72,6 @@ public interface IItemBrokerageGeneralService extends IService<ItemBrokerageGene
     void updateAheadStatus(Long userId);
 
     ItemDTO getItemByBrokerageGeneralId(Long generalId);
+
+    List<BrokerageGeneralVO> xList(BrokerageGeneralVO brokerageGeneralVO);
 }

+ 4 - 0
service/src/main/java/com/dayou/service/IItemBrokerageSequenceDetailService.java

@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.dayou.vo.BrokerageSequenceDetailVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
 /**
  * <p>
  * 提成流水明细表 服务类
@@ -26,4 +29,5 @@ public interface IItemBrokerageSequenceDetailService extends IService<ItemBroker
 
         Boolean delete(Long id);
 
+    List<BrokerageSequenceDetailVO> xList(BrokerageSequenceDetailVO brokerageSequenceDetailVO);
 }

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

@@ -35,4 +35,6 @@ public interface IItemBrokerageSequenceService extends IService<ItemBrokerageSeq
         Boolean doAbleItemBrokerageSettle();
 
         List<BrokerageSequenceVO> deduction(BrokerageSequenceVO brokerageSequenceVO);
+
+        List<BrokerageSequenceVO> xList(BrokerageSequenceVO brokerageSequenceVO);
 }

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

@@ -1,4 +1,5 @@
 package com.dayou.service;
+import com.dayou.dto.PaymentDetailDTO;
 import com.dayou.entity.PaymentCollection;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -8,6 +9,9 @@ import com.dayou.vo.ItemPaymentVO;
 import com.dayou.vo.PaymentCollectionVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
 /**
  * <p>
  * 回款记录 服务类
@@ -30,4 +34,5 @@ public interface IPaymentCollectionService extends IService<PaymentCollection> {
 
     IPage<ItemPaymentVO> getItemPayment(Page page,PaymentCollectionVO paymentCollectionVO);
 
+    List<PaymentDetailDTO> getPaymentDetailListByItemId(Long id,Long userId);
 }

+ 14 - 2
service/src/main/java/com/dayou/service/impl/BrokerageVariableServiceImpl.java

@@ -5,6 +5,8 @@ import com.dayou.entity.BrokerageVariable;
 import com.dayou.mapper.BrokerageVariableMapper;
 import com.dayou.service.IBrokerageVariableService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayou.service.IPaymentCollectionService;
+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;
@@ -36,6 +38,11 @@ import com.dayou.enums.BatchTaskTypeEnum;
 @Service
 public class BrokerageVariableServiceImpl extends ServiceImpl<BrokerageVariableMapper, BrokerageVariable> implements IBrokerageVariableService {
 
+    @Autowired
+    private IPaymentCollectionService paymentCollectionService;
+
+    @Autowired
+    private BrokerageVariableMapper brokerageVariableMapper;
 
     @Override
     @SuppressWarnings("unchecked")
@@ -67,7 +74,12 @@ public class BrokerageVariableServiceImpl extends ServiceImpl<BrokerageVariableM
 
     @Override
     public List<PaymentDetailDTO> getPaymentDetailListByItemId(Long id,Long userId) {
-        //todo
-        return null;
+        List<PaymentDetailDTO> list = paymentCollectionService.getPaymentDetailListByItemId(id,userId);
+        return list;
+    }
+
+    @Override
+    public List<BrokerageVariable> getCompensationBrokerage(Long userId,Long generalId) {
+        return brokerageVariableMapper.getCompensationBrokerage(userId,generalId);
     }
 }

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

@@ -16,6 +16,8 @@ import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 
+import java.util.List;
+
 /**
  * <p>
  * 项目提成明细 服务实现类
@@ -69,5 +71,10 @@ public class ItemBrokerageDetailServiceImpl extends ServiceImpl<ItemBrokerageDet
         return null;
     }
 
+    @Override
+    public List<BrokerageDetailVO> xList(BrokerageDetailVO itemBrokerageDetailVO) {
+        return itemBrokerageDetailMapper.xList(itemBrokerageDetailVO);
+    }
+
 
 }

+ 47 - 30
service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java

@@ -205,7 +205,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     public void editMarketerBrokerage(ItemDTO itemDTO) {
         ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(itemDTO.getId());
         ItemBrokerageDetail marketerDetail = iItemBrokerageDetailService.getOne(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId, general.getId())
-                .eq(BaseEntity::getDeleted, Boolean.FALSE).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode()));
+                .eq(BaseEntity::getDeleted, Boolean.FALSE).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode()).eq(ItemBrokerageDetail::getBrokerageRule, LAND_MARKETER_RULE.getCode()));
         if (general == null || marketerDetail == null){
             log.info("更新项目信息时发现未创建提成总表和明细表记录,更新提成信息逻辑终止。");
             return;
@@ -240,10 +240,12 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         BigDecimal leaderPredictTotalAmount = BigDecimal.ZERO;
         if (!brokerageDetailBO.getBrokerageRule().equals(BrokerageRule.LAND_MANAGER_RULE.getCode())){
             //更新领导提成记录
-            Set<LeaderRatioBO> leaderRatioBO = teamMemberService.getLeader(marketerDetail.getUserId(), MARKET_DEPARTMENT).stream().filter(x->x.getRatio()!=null).collect(Collectors.toSet());
-            Set<ItemBrokerageDetail> itemBrokerageDetails = calculator.predictTeamShareAmount(brokerageDetailBO, leaderRatioBO);
-            iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId,general.getId()).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.TEAM_SHARE.getCode()));
-            iItemBrokerageDetailService.saveBatch(itemBrokerageDetails);
+            //Set<LeaderRatioBO> leaderRatioBO = teamMemberService.getLeader(marketerDetail.getUserId(), MARKET_DEPARTMENT).stream().filter(x->x.getRatio()!=null).collect(Collectors.toSet());
+            //Set<ItemBrokerageDetail> itemBrokerageDetails = calculator.predictTeamShareAmount(brokerageDetailBO, leaderRatioBO);
+            List<ItemBrokerageDetail> list = iItemBrokerageDetailService.list(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId, general.getId()).eq(ItemBrokerageDetail::getBrokerageMode, BrokerageMode.TEAM_SHARE.getCode()));
+            //iItemBrokerageDetailService.saveBatch(itemBrokerageDetails);
+            List<ItemBrokerageDetail>  itemBrokerageDetails = calculator.updateTeamShareAmount(list,brokerageDetailBO);
+            iItemBrokerageDetailService.saveOrUpdateBatch(itemBrokerageDetails);
             leaderPredictTotalAmount = itemBrokerageDetails.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
         }
 
@@ -438,24 +440,28 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
                 brokerageDetailBO.setCurrentPayment(currentYearPaymentAmount);
                 brokerageDetailBO.setPaymentTarget(userTarget);
                 BrokerageDetailBO xBrokerageDetailBO = calculator.predictPersonalAmount(brokerageDetailBO);
+
+                Long id = iItemBrokerageDetailService.getOne(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId, oGeneral.getId())
+                        .eq(ItemBrokerageDetail::getBrokerageMode, BrokerageMode.PERSONAL.getCode())
+                        .eq(ItemBrokerageDetail::getBrokerageRule, LAND_MARKETER_RULE.getCode())).getId();
+                xBrokerageDetailBO.setId(id);
                 itemBrokerageDetails.add(xBrokerageDetailBO);
-                iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId,oGeneral.getId())
-                        .eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode())
-                        .eq(ItemBrokerageDetail::getBrokerageRule, LAND_MARKETER_RULE.getCode()));
             }
             //如果这些单子中下单人是营销经理
             if (userPostService.getMarketPostList(oGeneral.getUserId()).getName().equals(MARKET_MANAGER)){
-                iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>()
-                        .eq(ItemBrokerageDetail::getGeneralId,oGeneral.getId()).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode()));
+                ItemBrokerageDetail one = iItemBrokerageDetailService.getOne(new LambdaQueryWrapper<ItemBrokerageDetail>()
+                        .eq(ItemBrokerageDetail::getGeneralId, oGeneral.getId()).eq(ItemBrokerageDetail::getBrokerageMode, BrokerageMode.PERSONAL.getCode()));
                 brokerageDetailBO = calculator.managerPersonalAmount(brokerageDetailBO);
-                iItemBrokerageDetailService.save(brokerageDetailBO);
+                brokerageDetailBO.setId(one.getId());
+                iItemBrokerageDetailService.updateById(brokerageDetailBO);
             }else {
                 //更新领导的预计提成
-                Set<ItemBrokerageDetail> itemBrokerageLeaderDetails = calculator.predictTeamShareAmount(brokerageDetailBO, leaderRatioBO);
-                itemBrokerageDetails.addAll(itemBrokerageLeaderDetails);
-                iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>()
-                        .eq(ItemBrokerageDetail::getGeneralId,oGeneral.getId()).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.TEAM_SHARE.getCode()));
-                iItemBrokerageDetailService.saveBatch(itemBrokerageDetails);
+                List<ItemBrokerageDetail> list = iItemBrokerageDetailService.list(new LambdaQueryWrapper<ItemBrokerageDetail>()
+                        .eq(ItemBrokerageDetail::getGeneralId, oGeneral.getId()).eq(ItemBrokerageDetail::getBrokerageMode, BrokerageMode.TEAM_SHARE.getCode()));
+                List<ItemBrokerageDetail> itemBrokerageDetails1 = calculator.updateTeamShareAmount(list, brokerageDetailBO);
+                //Set<ItemBrokerageDetail> itemBrokerageLeaderDetails = calculator.predictTeamShareAmount(brokerageDetailBO, leaderRatioBO);
+                itemBrokerageDetails.addAll(itemBrokerageDetails1);
+                iItemBrokerageDetailService.saveOrUpdateBatch(itemBrokerageDetails);
             }
             BigDecimal leaderPredictTotalAmount = itemBrokerageDetails.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
             oGeneral.setMarketerBrokerageAmount(brokerageDetailBO.getPredictAmount().add(leaderPredictTotalAmount));
@@ -482,7 +488,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(LAND_MARKETER_RULE);
         lastMonthTeamBrokerages.stream().forEach(oGeneral->{
             Set<LeaderRatioBO> xLeader = teamMemberService.getLeader(oGeneral.getUserId(), MARKET_DEPARTMENT);
-            Set<LeaderRatioBO> leaderRatioBO = xLeader.stream().filter(y->y.getRatio()!=null).collect(Collectors.toSet());
+            //Set<LeaderRatioBO> leaderRatioBO = xLeader.stream().filter(y->y.getRatio()!=null).collect(Collectors.toSet());
             BrokerageDetailBO brokerageDetailBO = buildBrokerageDetailBO(oGeneral);
             //本人的其他项目需计算预提金额
             Set<ItemBrokerageDetail> itemBrokerageDetails = Sets.newHashSet();
@@ -491,31 +497,35 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
                 brokerageDetailBO.setCurrentPayment(currentYearPaymentAmount);
                 brokerageDetailBO.setPaymentTarget(userTarget);
                 BrokerageDetailBO xBrokerageDetailBO = calculator.predictPersonalAmount(brokerageDetailBO);
+
+                Long id = iItemBrokerageDetailService.getOne(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId, oGeneral.getId())
+                        .eq(ItemBrokerageDetail::getBrokerageMode, BrokerageMode.PERSONAL.getCode())
+                        .eq(ItemBrokerageDetail::getBrokerageRule, LAND_MARKETER_RULE.getCode())).getId();
+                xBrokerageDetailBO.setId(id);
                 itemBrokerageDetails.add(xBrokerageDetailBO);
-                iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId,oGeneral.getId())
-                        .eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode())
-                        .eq(ItemBrokerageDetail::getBrokerageRule, LAND_MARKETER_RULE.getCode()));
             }
             //如果这些单子中下单人是营销经理
             if (userPostService.getMarketPostList(oGeneral.getUserId()).getName().equals(MARKET_MANAGER)){
-                iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>()
-                        .eq(ItemBrokerageDetail::getGeneralId,oGeneral.getId()).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode()));
+                ItemBrokerageDetail one = iItemBrokerageDetailService.getOne(new LambdaQueryWrapper<ItemBrokerageDetail>()
+                        .eq(ItemBrokerageDetail::getGeneralId, oGeneral.getId()).eq(ItemBrokerageDetail::getBrokerageMode, BrokerageMode.PERSONAL.getCode()));
                 brokerageDetailBO = calculator.managerPersonalAmount(brokerageDetailBO);
-                iItemBrokerageDetailService.save(brokerageDetailBO);
+                brokerageDetailBO.setId(one.getId());
+                iItemBrokerageDetailService.updateById(brokerageDetailBO);
             }else {
                 //更新领导的预计提成
-                Set<ItemBrokerageDetail> itemBrokerageLeaderDetails = calculator.predictTeamShareAmount(brokerageDetailBO, leaderRatioBO);
-                itemBrokerageDetails.addAll(itemBrokerageLeaderDetails);
-                iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>()
-                        .eq(ItemBrokerageDetail::getGeneralId,oGeneral.getId()).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.TEAM_SHARE.getCode()));
-                iItemBrokerageDetailService.saveBatch(itemBrokerageDetails);
+                List<ItemBrokerageDetail> list = iItemBrokerageDetailService.list(new LambdaQueryWrapper<ItemBrokerageDetail>()
+                        .eq(ItemBrokerageDetail::getGeneralId, oGeneral.getId()).eq(ItemBrokerageDetail::getBrokerageMode, BrokerageMode.TEAM_SHARE.getCode()));
+                List<ItemBrokerageDetail> itemBrokerageDetails1 = calculator.updateTeamShareAmount(list, brokerageDetailBO);
+                //Set<ItemBrokerageDetail> itemBrokerageLeaderDetails = calculator.predictTeamShareAmount(brokerageDetailBO, leaderRatioBO);
+                itemBrokerageDetails.addAll(itemBrokerageDetails1);
+                iItemBrokerageDetailService.saveOrUpdateBatch(itemBrokerageDetails);
             }
 
             BigDecimal leaderPredictTotalAmount = itemBrokerageDetails.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-            oGeneral.setMarketerBrokerageAmount(brokerageDetailBO.getPredictAmount().add(leaderPredictTotalAmount));
+            oGeneral.setMarketerBrokerageAmount(leaderPredictTotalAmount);
             oGeneral.setMarketerAdvanceBrokerageAble(brokerageDetailBO.getMarketerAdvanceBrokerageAble());
             oGeneral.setBrokerageRate(brokerageDetailBO.getRate());
-            oGeneral.setBrokeragePredictAmount(brokerageDetailBO.getPredictAmount().add(oGeneral.getParticipantPredictBrokerageAmount()).add(leaderPredictTotalAmount));
+            oGeneral.setBrokeragePredictAmount(oGeneral.getParticipantPredictBrokerageAmount().add(leaderPredictTotalAmount));
             ItemBrokerageGeneral original = ItemBrokerageGeneral.builder().build();
             BeanUtil.copyProperties(oGeneral,original);
             this.update(original);
@@ -571,6 +581,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         status.add(BrokerageState.TO_PREDICTING.getCode());
         status.add(BrokerageState.NOT_SETTLE.getCode());
         status.add(BrokerageState.NOT_PAYMENT.getCode());
+        status.add(BrokerageState.PREDICTED.getCode());
         List<ItemBrokerageGeneral> ableSettleList = this.list(new LambdaQueryWrapper<ItemBrokerageGeneral>().in(ItemBrokerageGeneral::getMarketerStatus,status)
                 .or().eq(ItemBrokerageGeneral::getParticipantStatus,BrokerageState.NOT_SETTLE.getCode()));
         return ableSettleList;
@@ -698,4 +709,10 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         return itemMapper.getItemByBrokerageGeneralId(generalId);
     }
 
+    @Override
+    public List<BrokerageGeneralVO> xList(BrokerageGeneralVO brokerageGeneralVO) {
+        List<BrokerageGeneralVO> list = brokerageGeneralMapper.xList(brokerageGeneralVO);
+        return list;
+    }
+
 }

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

@@ -68,4 +68,9 @@ public class ItemBrokerageSequenceDetailServiceImpl extends ServiceImpl<ItemBrok
         //逻辑删除
         return this.removeById(id);
     }
+
+    @Override
+    public List<BrokerageSequenceDetailVO> xList(BrokerageSequenceDetailVO brokerageSequenceDetailVO) {
+        return sequenceDetailMapper.xList(brokerageSequenceDetailVO);
+    }
 }

+ 193 - 62
service/src/main/java/com/dayou/service/impl/ItemBrokerageSequenceServiceImpl.java

@@ -1,13 +1,17 @@
 package com.dayou.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.dayou.brokerage.MarketerBrokerageCalculator;
 import com.dayou.brokerage.constants.BrokerageBusiness;
 import com.dayou.brokerage.constants.BrokerageMode;
 import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.brokerage.constants.BrokerageState;
+import com.dayou.brokerage.handler.LandMarketerBrokerageHandler;
 import com.dayou.common.BaseEntity;
 import com.dayou.dto.ItemDTO;
 import com.dayou.dto.PaymentDetailDTO;
+import com.dayou.dto.SequenceSimpleDTO;
 import com.dayou.entity.*;
 import com.dayou.mapper.ItemBrokerageSequenceMapper;
 import com.dayou.service.*;
@@ -17,8 +21,11 @@ import com.dayou.vo.BrokerageSequenceDetailVO;
 import com.dayou.vo.BrokerageSequenceVO;
 import com.google.common.cache.Cache;
 import com.google.common.cache.LoadingCache;
+import com.google.common.collect.Sets;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -32,7 +39,10 @@ import java.util.stream.Collectors;
 
 import org.springframework.transaction.annotation.Transactional;
 
+import static com.dayou.brokerage.constants.BrokerageBusiness.COMPENSATION;
+import static com.dayou.brokerage.constants.BrokerageBusiness.PAYMENT_SETTLE;
 import static com.dayou.brokerage.constants.BrokerageMsg.*;
+import static com.dayou.brokerage.constants.BrokerageRule.LAND_SUPERVISOR_RULE;
 import static com.dayou.common.Constants.*;
 
 /**
@@ -66,11 +76,20 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
     private MarketerBrokerageCalculator landMarketerBrokerageHandler;
 
     @Autowired
+    private LandMarketerBrokerageHandler marketerBrokerageHandler;
+
+    @Autowired
     private IBrokerageVariableService brokerageVariableService;
 
     @Autowired
     private IBrokeragePostRatioService brokeragePostRatioService;
 
+    @Autowired
+    private IUserTargetService userTargetService;
+
+    @Autowired
+    private IMarketStatService marketStatService;
+
     @Override
     @SuppressWarnings("unchecked")
     public Page<BrokerageSequenceVO> selectPage(Page page, BrokerageSequenceVO itemBrokerageSequence){
@@ -116,7 +135,11 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
                     .brokerageAmount(nonMarketerAheadAmount.getValue())
                     .userId(nonMarketerAheadAmount.getKey())
                     .cate(BrokerageBusiness.DEFAULT_AHEAD.getCode())
-                    .embody(BROKERAGE_SEQUENCE_EMBODY.replace(YEARMONTH,year+"-"+(month+1))).remark(NON_MARKETER_BASE_SEQUENCE_REMARK).build();
+                    .embody(BROKERAGE_SEQUENCE_EMBODY.replace(YEARMONTH,year+"-"+(month+1)))
+                    .remark(NON_MARKETER_BASE_SEQUENCE_REMARK)
+                    .year(year)
+                    .month(month+1)
+                    .build();
             sequences.add(sequence);
         }
         return this.saveBatch(sequences);
@@ -137,58 +160,45 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
                     .in(ItemBrokerageDetail::getGeneralId, generalIds).eq(BaseEntity::getDeleted, Boolean.FALSE));
             List<ItemBrokerageDetail> toUpdateItemBrokerageDetails = new ArrayList<>();
             if (CollectionUtils.isNotEmpty(settleDetails)){
-                Set<ItemBrokerageSequenceDetail> sequenceDetails = settleDetails.stream().map(x -> {
+                Set<ItemBrokerageSequenceDetail> sequenceDetails = Sets.newHashSet();
+                for (ItemBrokerageDetail x : settleDetails){
                     ItemBrokerageGeneral general = idGeneral.get(x.getGeneralId());
                     if (general.getMarketerStatus().equals(BrokerageState.TO_PREDICTING.getCode())
                             && x.getBrokerageMode().equals(BrokerageMode.PERSONAL.getCode())
                             && x.getBrokerageRule().equals(BrokerageRule.LAND_MARKETER_RULE.getCode())) {
-                        ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
-                                .brokerageDetailId(x.getId()).userId(x.getUserId()).brokerageCate(BrokerageBusiness.AHEAD.getCode()).brokerageAmount(x.getAheadAmount()).generalId(x.getGeneralId()).build();
-                        x.setAdvanceAmount(x.getAheadAmount());
+                        ItemBrokerageSequenceDetail sequenceDetail = getItemBrokerageSequenceDetail(x);
                         toUpdateItemBrokerageDetails.add(x);
-                        return sequenceDetail;
+                        sequenceDetails.add(sequenceDetail);
                     }else if (general.getMarketerStatus().equals(BrokerageState.NOT_SETTLE.getCode())
                             && x.getBrokerageMode().equals(BrokerageMode.PERSONAL.getCode())
-                            && x.getBrokerageRule().equals(BrokerageRule.LAND_MARKETER_RULE.getCode())
-                        ) {
+                            && x.getBrokerageRule().equals(BrokerageRule.LAND_MARKETER_RULE.getCode())) {
                         //减去已预提金额 ,这个地方需要再次根据 [结算时间节点] 去重新计算 营销主管和营销经理的 实际提成金额,因为 回款金额等因素可能有变动。
                         //客户经理的实际提成金额则根据预估计算时得出的金额为准
-                        BigDecimal actualAmount = x.getActualAmount();
-                        if (general.getMarketerAdvanceBrokerageDone()) {
-                            actualAmount = actualAmount.subtract(x.getAheadAmount());
-                        }
-                        ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
-                                .brokerageDetailId(x.getId()).userId(x.getUserId()).brokerageCate(BrokerageBusiness.SETTLE.getCode()).brokerageAmount(actualAmount).generalId(x.getGeneralId()).build();
-                        x.setAdvanceAmount(actualAmount);
-                        x.setActualAmount(actualAmount);
+                        ItemBrokerageSequenceDetail sequenceDetail = getItemBrokerageSequenceDetail(x, general);
                         toUpdateItemBrokerageDetails.add(x);
-                        return sequenceDetail;
+                        sequenceDetails.add(sequenceDetail);
                     }
                     //市场部领导的团队抽成部分,是跟具回款金额来结算,即使合同金额未完全回款,市场部领导的团队抽成部分也可以根据目前回款金额来结算。
                     else if( x.getBrokerageMode().equals(BrokerageMode.TEAM_SHARE.getCode())
                             && (x.getBrokerageRule().equals(BrokerageRule.LAND_MANAGER_RULE.getCode())
-                            || x.getBrokerageRule().equals(BrokerageRule.LAND_SUPERVISOR_RULE.getCode()))){
-
-                        BigDecimal actualAmount = leaderBrokerageHandle(x);
-
-                        ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
-                                .brokerageDetailId(x.getId()).userId(x.getUserId()).brokerageCate(BrokerageBusiness.SETTLE.getCode()).brokerageAmount(actualAmount).generalId(x.getGeneralId()).build();
-                        x.setAdvanceAmount(actualAmount);
-                        x.setActualAmount(actualAmount);
+                            || x.getBrokerageRule().equals(LAND_SUPERVISOR_RULE.getCode()))){
+                        Map<Boolean, List<BrokerageVariable>> leaderSettles = leaderBrokerageHandle(x);
+                        List<BrokerageVariable> coll = leaderSettles.get(Boolean.TRUE);
+                        List<BrokerageVariable> variables = leaderSettles.get(Boolean.FALSE);
+                        if (CollectionUtils.isNotEmpty(coll)){
+                            compensationSettle(sequenceDetails, x, coll);
+                        }
+                        if (CollectionUtils.isNotEmpty(variables)){
+                            newPaymentSettle(sequenceDetails, x, variables);
+                        }
                         toUpdateItemBrokerageDetails.add(x);
-                        return sequenceDetail;
                     }
                     else if (general.getParticipantStatus().equals(BrokerageState.NOT_SETTLE.getCode()) && x.getBrokerageRule().equals(BrokerageRule.LAND_OTHER_RULE.getCode())) {
-                        ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
-                                .brokerageDetailId(x.getId()).userId(x.getUserId()).brokerageCate(BrokerageBusiness.SETTLE.getCode()).brokerageAmount(x.getActualAmount()).generalId(x.getGeneralId()).build();
-                        x.setAdvanceAmount(x.getActualAmount());
+                        ItemBrokerageSequenceDetail sequenceDetail = otherRuleSettle(x);
                         toUpdateItemBrokerageDetails.add(x);
-                        return sequenceDetail;
+                        sequenceDetails.add(sequenceDetail);
                     }
-                    else {
-                        return null;
-                    }
-                }).collect(Collectors.toSet());
+                }
 
                 Map<Long, List<ItemBrokerageSequenceDetail>> collect = sequenceDetails.stream().filter(x->x!=null).collect(Collectors.groupingBy(ItemBrokerageSequenceDetail::getUserId));
                 Date now = new Date();
@@ -200,8 +210,11 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
                     BigDecimal userTotalAmount = values.stream().map(ItemBrokerageSequenceDetail::getBrokerageAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
                     ItemBrokerageSequence sequence = ItemBrokerageSequence.builder().brokerageAmount(userTotalAmount).userId(userSequence.getKey())
                             .cate(BrokerageBusiness.ITEM_SETTLE.getCode())
-                            .remark(BROKERAGE_SEQUENCE_REMARK.replace("sum",itemSize.size()+"").replace("month",(month+1)+""))
-                            .embody(BROKERAGE_SEQUENCE_EMBODY.replace(YEARMONTH,year+"-"+(month+1))).build();
+                            .remark(BROKERAGE_SEQUENCE_REMARK.replace("sum",String.valueOf(itemSize.size())))
+                            .embody(BROKERAGE_SEQUENCE_EMBODY.replace(YEARMONTH,year+"-"+(month+1)))
+                            .year(year)
+                            .month(month+1)
+                            .build();
                     this.save(sequence);
                     values.stream().forEach(x->{x.setSequenceId(sequence.getId());});
                     brokerageSequenceDetailService.saveBatch(values);
@@ -211,22 +224,9 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
                 Map<Long, List<ItemBrokerageSequenceDetail>> sequenceDetailByGeneral = sequenceDetails.stream().filter(x->x!=null).collect(Collectors.groupingBy(ItemBrokerageSequenceDetail::getGeneralId));
 
                 for (Map.Entry<Long,List<ItemBrokerageSequenceDetail>> sequence : sequenceDetailByGeneral.entrySet()){
-                    BigDecimal gAheadTotal = BigDecimal.ZERO;
-                    BigDecimal gAdvanceTotal = BigDecimal.ZERO;
                     ItemBrokerageGeneral general = idGeneral.get(sequence.getKey());
-                    for (ItemBrokerageSequenceDetail sequenceDetail :sequence.getValue()){
-                        //如果预提金额不为空,且已结算金额为空
-                        if (general.getMarketerStatus().equals(BrokerageState.TO_PREDICTING.getCode()) && sequenceDetail.getBrokerageCate().equals(BrokerageBusiness.AHEAD.getCode())) {
-                            gAheadTotal = gAheadTotal.add(sequenceDetail.getBrokerageAmount());
-                        }else if (general.getMarketerStatus().equals(BrokerageState.PREDICTED.getCode()) && sequenceDetail.getBrokerageCate().equals(BrokerageBusiness.SETTLE.getCode())){
-                            gAdvanceTotal = gAdvanceTotal.add(sequenceDetail.getBrokerageAmount());
-                        }else if (general.getMarketerStatus().equals(BrokerageState.NOT_SETTLE.getCode()) && sequenceDetail.getBrokerageCate().equals(BrokerageBusiness.SETTLE.getCode())){
-                            gAdvanceTotal = gAdvanceTotal.add(sequenceDetail.getBrokerageAmount());
-                        }else if (general.getParticipantStatus().equals(BrokerageState.NOT_SETTLE.getCode()) && sequenceDetail.getBrokerageCate().equals(BrokerageBusiness.SETTLE.getCode())){
-                            gAdvanceTotal = gAdvanceTotal.add(sequenceDetail.getBrokerageAmount());
-                        }
-                    }
-                    general.setBrokerageActualAmount(gAdvanceTotal.add(gAheadTotal).add(general.getBrokerageActualAmount()));
+                    BigDecimal reduce = sequence.getValue().stream().map(ItemBrokerageSequenceDetail::getBrokerageAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    general.setBrokerageActualAmount(reduce.add(general.getBrokerageActualAmount()));
 
                     if (general.getMarketerStatus().equals(BrokerageState.TO_PREDICTING.getCode())){
                         general.setMarketerStatus(BrokerageState.PREDICTED.getCode());
@@ -250,39 +250,170 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
     }
 
     /**
-     * 处理领导的提成逻辑
+     * 参与人人员结算
+     * @param x
+     * @return
+     */
+    private ItemBrokerageSequenceDetail otherRuleSettle(ItemBrokerageDetail x) {
+        ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
+                .brokerageDetailId(x.getId()).unsettledAmount(BigDecimal.ZERO).userId(x.getUserId())
+                .brokerageCate(BrokerageBusiness.SETTLE.getCode()).brokerageAmount(x.getActualAmount()).generalId(x.getGeneralId()).build();
+        x.setAdvanceAmount(x.getActualAmount());
+        return sequenceDetail;
+    }
+
+    /**
+     * 市场部领导新增回款结算
+     * @param sequenceDetails
+     * @param x
+     * @param variables
+     */
+    private void newPaymentSettle(Set<ItemBrokerageSequenceDetail> sequenceDetails, ItemBrokerageDetail x, List<BrokerageVariable> variables) {
+        List<ItemBrokerageSequenceDetail> newPayments = variables.stream().map(v -> {
+            ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
+                    .brokerageDetailId(x.getId())
+                    .userId(x.getUserId())
+                    .brokerageCate(BrokerageBusiness.PAYMENT_SETTLE.getCode())
+                    .brokerageAmount(v.getSettledAmount())
+                    .unsettledAmount(v.getUnsettledAmount())
+                    .paymentId(v.getPaymentId())
+                    .generalId(x.getGeneralId()).build();
+            return sequenceDetail;
+        }).collect(Collectors.toList());
+
+        BigDecimal reduce = variables.stream().map(BrokerageVariable::getSettledAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        x.setAdvanceAmount(x.getAdvanceAmount().add(reduce));
+        x.setActualAmount(x.getActualAmount().add(reduce));
+        sequenceDetails.addAll(newPayments);
+    }
+
+    /**
+     * 市场部领导补偿结算
+     * @param sequenceDetails
+     * @param x
+     * @param coll
+     */
+    private void compensationSettle(Set<ItemBrokerageSequenceDetail> sequenceDetails, ItemBrokerageDetail x, List<BrokerageVariable> coll) {
+        List<ItemBrokerageSequenceDetail> compensations = coll.stream().map(v -> {
+            ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
+                    .brokerageDetailId(v.getBrokerageDetailId())
+                    .userId(x.getUserId())
+                    .brokerageCate(BrokerageBusiness.COMPENSATION.getCode())
+                    .brokerageAmount(v.getUnsettledAmount())
+                    .unsettledAmount(BigDecimal.ZERO)
+                    .paymentId(v.getPaymentId())
+                    .generalId(x.getGeneralId()).build();
+            return sequenceDetail;
+        }).collect(Collectors.toList());
+
+        BigDecimal reduce = coll.stream().map(BrokerageVariable::getUnsettledAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        x.setAdvanceAmount(x.getAdvanceAmount().add(reduce));
+        x.setActualAmount(x.getActualAmount().add(reduce));
+        sequenceDetails.addAll(compensations);
+
+        //更新补偿结算表
+        coll.stream().forEach(c->{
+            c.setUnsettledAmount(BigDecimal.ZERO);
+            c.setSettledAmount(c.getBrokerageAmount());
+        });
+        brokerageVariableService.updateBatchById(coll);
+    }
+
+    /**
+     * 合同状态为待结算,处理客户经理结算逻辑
+     * @param x
+     * @param general
+     * @return
+     */
+    private ItemBrokerageSequenceDetail getItemBrokerageSequenceDetail(ItemBrokerageDetail x, ItemBrokerageGeneral general) {
+        BigDecimal actualAmount = x.getActualAmount();
+        if (general.getMarketerAdvanceBrokerageDone()) {
+            actualAmount = actualAmount.subtract(x.getAheadAmount());
+        }
+        ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
+                .brokerageDetailId(x.getId()).userId(x.getUserId()).brokerageCate(BrokerageBusiness.SETTLE.getCode())
+                .brokerageAmount(actualAmount).unsettledAmount(BigDecimal.ZERO).generalId(x.getGeneralId()).build();
+        x.setAdvanceAmount(x.getActualAmount());
+        x.setActualAmount(x.getActualAmount());
+        return sequenceDetail;
+    }
+
+    /**
+     * 合同状态为待预提,处理客户经理预提逻辑
+     * @param x
+     * @return
+     */
+    private ItemBrokerageSequenceDetail getItemBrokerageSequenceDetail(ItemBrokerageDetail x) {
+        ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
+                .brokerageDetailId(x.getId()).userId(x.getUserId()).brokerageCate(BrokerageBusiness.AHEAD.getCode()).brokerageAmount(x.getAheadAmount())
+                .unsettledAmount(x.getPredictAmount().subtract(x.getAheadAmount())).generalId(x.getGeneralId()).build();
+        x.setAdvanceAmount(x.getAheadAmount());
+        return sequenceDetail;
+    }
+
+    /**
+     * 处理领导的提成逻辑 (包含两部分:1由于回款目标达成的补偿结算 (True),2,新增回款的结算 (False))
      * @param brokerageDetail
      * @return
      */
-    private BigDecimal leaderBrokerageHandle(ItemBrokerageDetail brokerageDetail) {
+    private Map<Boolean,List<BrokerageVariable>> leaderBrokerageHandle(ItemBrokerageDetail brokerageDetail) {
+
         ItemDTO item = brokerageGeneralService.getItemByBrokerageGeneralId(brokerageDetail.getGeneralId());
         ItemBrokerageGeneral general = brokerageGeneralService.getById(brokerageDetail.getGeneralId());
+        Map<Boolean,List<BrokerageVariable>> map = new HashMap<>();
+                //团队回款目标
+        BigDecimal teamPaymentTarget = BigDecimal.valueOf(userTargetService.getTeamTarget(brokerageDetail.getUserId()).getPaymentTarget());
+        BigDecimal teamCurrentYearPayment = marketStatService.currentYearTeamPayment(brokerageDetail.getUserId());
+
+        if (marketerBrokerageHandler.checkTeamMonthlyPayment(teamCurrentYearPayment, teamPaymentTarget)){
+            List<BrokerageVariable>  compensations = compensationBrokerage(brokerageDetail.getUserId(),brokerageDetail.getGeneralId());
+            if (CollectionUtils.isNotEmpty(compensations)){
+                map.put(Boolean.TRUE,compensations);
+            }
+        }
+
         //这个方法要获取 新增的 且未被结算过的回款 。
         List<PaymentDetailDTO> list = brokerageVariableService.getPaymentDetailListByItemId(item.getId(),brokerageDetail.getUserId());
         if (CollectionUtils.isNotEmpty(list)){
             BrokeragePostRatio postRatio = brokeragePostRatioService.getOne(new LambdaQueryWrapper<BrokeragePostRatio>()
                     .eq(BrokeragePostRatio::getBrokerageRule, brokerageDetail.getBrokerageRule()).eq(BaseEntity::getDeleted, Boolean.FALSE));
             if (postRatio!=null && postRatio.getBrokerageRatio()!=null){
-                List<BrokerageVariable> variables = list.stream().map(x->{
-                    if (SUPERVISOR.equals(x.getUserType())){
-                        return  landMarketerBrokerageHandler.supervisorSettle(x.getPaymentId(), x.getPaymentAmount(), x.getUserId(), postRatio.getBrokerageRatio(), general.getBrokerageRate());
+                List<BrokerageVariable> newPayments = list.stream().map(x->{
+                    if (LAND_SUPERVISOR_RULE.getCode().equals(brokerageDetail.getBrokerageRule())){
+                        return  landMarketerBrokerageHandler.supervisorSettle(x.getPaymentId(), x.getPaymentAmount(), brokerageDetail.getUserId(), postRatio.getBrokerageRatio(), general.getBrokerageRate());
                     }else{
-                        return landMarketerBrokerageHandler.managerSettle(x.getPaymentId(),x.getPaymentAmount(),item.getUserId(),x.getUserId(),postRatio.getBrokerageRatio());
+                        return landMarketerBrokerageHandler.managerSettle(x.getPaymentId(),x.getPaymentAmount(),item.getUserId(),brokerageDetail.getUserId(),postRatio.getBrokerageRatio());
                     }
                 }).collect(Collectors.toList());
-                if (CollectionUtils.isNotEmpty(variables)){
-                    brokerageVariableService.saveBatch(variables);
+                if (CollectionUtils.isNotEmpty(newPayments)){
+                    brokerageVariableService.saveBatch(newPayments);
+                    map.put(Boolean.FALSE,newPayments);
                 }
-                BigDecimal sum = variables.stream().map(BrokerageVariable::getSettledAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-                return sum;
+
             }
         }
-        return BigDecimal.ZERO;
+        return map;
     }
 
+    /**
+     * 回款目标达到时,结算以前未结算的提成部分
+     * @return
+     */
+    private List<BrokerageVariable>  compensationBrokerage(Long userId,Long generalId){
+        List<BrokerageVariable> list = brokerageVariableService.getCompensationBrokerage(userId,generalId);
+        return list;
+    }
+
+
     @Override
     public List<BrokerageSequenceVO> deduction(BrokerageSequenceVO brokerageSequenceVO) {
         List<BrokerageSequenceVO> list = brokerageSequenceMapper.deduction(brokerageSequenceVO);
         return list;
     }
+
+    @Override
+    public List<BrokerageSequenceVO> xList(BrokerageSequenceVO brokerageSequenceVO) {
+        List<BrokerageSequenceVO> list =  brokerageSequenceMapper.xList(brokerageSequenceVO);
+        return list;
+    }
 }

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

@@ -6,6 +6,7 @@ import com.dayou.brokerage.annotation.DoBrokerage;
 import com.dayou.brokerage.constants.BrokerageBusiness;
 import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.common.BaseEntity;
+import com.dayou.dto.PaymentDetailDTO;
 import com.dayou.entity.PaymentCollection;
 import com.dayou.entity.UserTarget;
 import com.dayou.enums.OperationTypeEnum;
@@ -120,4 +121,10 @@ public class PaymentCollectionServiceImpl extends ServiceImpl<PaymentCollectionM
         return result;
     }
 
+    @Override
+    public List<PaymentDetailDTO> getPaymentDetailListByItemId(Long id,Long userId) {
+        List<PaymentDetailDTO> list = paymentCollectionMapper.getPaymentDetailListByItemId(id,userId);
+        return list;
+    }
+
 }

+ 1 - 0
service/src/main/java/com/dayou/service/impl/UserTargetServiceImpl.java

@@ -108,6 +108,7 @@ public class UserTargetServiceImpl extends ServiceImpl<UserTargetMapper, UserTar
                     .eq(TeamMember::getTeamId,team.getId()).eq(BaseEntity::getDeleted,Boolean.FALSE)).stream().map(TeamMember::getMemberId).collect(Collectors.toSet());
         }else {
             juniorUserId = userService.getJuniorUserId(userId);
+            juniorUserId.add(userId);
         }
 
         UserTarget userTarget = new UserTarget();