Sfoglia il codice sorgente

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

wucl 2 anni fa
parent
commit
b9e3ec2336

+ 83 - 0
biz-base/src/main/java/com/dayou/controller/BrokerageVariableController.java

@@ -0,0 +1,83 @@
+package com.dayou.controller;
+
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.bind.annotation.RestController;
+import com.dayou.controller.BaseController;
+import com.dayou.service.IBrokerageVariableService;
+import com.dayou.entity.BrokerageVariable;
+import com.dayou.common.RestResponse;
+import org.springframework.web.bind.annotation.*;
+import com.dayou.utils.ConvertUtil;
+import com.dayou.utils.HttpKit;
+import com.dayou.exception.ErrorCode;
+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;
+/**
+ * 浮动提成
+ *
+ * @author wucl
+ * @since 2023-04-14
+ */
+@RestController
+@RequestMapping("brokerageVariable")
+@Slf4j
+public class BrokerageVariableController extends BaseController {
+    @Autowired
+    private IBrokerageVariableService brokerageVariableService;
+
+    /**
+    * 浮动提成列表
+    */
+    @GetMapping("")
+    public RestResponse<Page<BrokerageVariable>> page(BrokerageVariable brokerageVariable, Page page){
+        Page<BrokerageVariable> pages=brokerageVariableService.selectPage(page,brokerageVariable);
+        return RestResponse.data(pages);
+    }
+
+    /**
+     * 浮动提成详情
+     */
+    @GetMapping("/{id}")
+    public RestResponse<BrokerageVariable> detail(@PathVariable Long id){
+        BrokerageVariable xBrokerageVariable =brokerageVariableService.detail(id);
+        return RestResponse.data(xBrokerageVariable);
+     }
+
+    /**
+     * 浮动提成新增
+     */
+    @PostMapping("")
+    public RestResponse<Boolean> save(@RequestBody BrokerageVariable brokerageVariable) {
+        Boolean ret = brokerageVariableService.add(brokerageVariable);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 浮动提成更新
+     */
+    @PutMapping("")
+    public RestResponse<Boolean> update(@RequestBody BrokerageVariable brokerageVariable) {
+        Boolean ret = brokerageVariableService.update(brokerageVariable);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 浮动提成删除
+     */
+    @DeleteMapping("/{id}")
+    public RestResponse<Boolean> delete(@PathVariable Long id) {
+        Boolean ret = brokerageVariableService.delete(id);
+        return RestResponse.data(ret);
+    }
+
+
+}
+

+ 1 - 1
biz-base/src/test/java/BrokerageTest.java

@@ -57,7 +57,7 @@ public class BrokerageTest {
 
     @Test
     public void testBrokerageCache() throws ExecutionException {
-        //itemBrokerageSequenceService.doAbleItemBrokerageSettle();
+        itemBrokerageSequenceService.doNonMarketerAheadSettle();
     }
 
     public static void main(String ages []) {

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

@@ -0,0 +1,16 @@
+package com.dayou.mapper;
+
+import com.dayou.entity.BrokerageVariable;
+import com.dayou.dao.CustomBaseMapper;
+
+/**
+ * <p>
+ * 浮动提成 Mapper 接口
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-04-14
+ */
+public interface BrokerageVariableMapper extends CustomBaseMapper<BrokerageVariable> {
+
+}

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

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dayou.mapper.BrokerageVariableMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.dayou.entity.BrokerageVariable">
+        <result column="id" property="id" />
+        <result column="deleted" property="deleted" />
+        <result column="created" property="created" />
+        <result column="modified" property="modified" />
+        <result column="payment_id" property="paymentId" />
+        <result column="user_id" property="userId" />
+        <result column="user_type" property="userType" />
+        <result column="brokerage_amount" property="brokerageAmount" />
+        <result column="settled_amount" property="settledAmount" />
+        <result column="unsettled_amount" property="unsettledAmount" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,
+        deleted,
+        created,
+        modified,
+        payment_id, user_id, user_type, brokerage_amount, settled_amount, unsettled_amount
+    </sql>
+
+</mapper>

+ 65 - 0
domain/src/main/java/com/dayou/entity/BrokerageVariable.java

@@ -0,0 +1,65 @@
+package com.dayou.entity;
+import java.math.BigDecimal;
+import com.dayou.common.BaseEntity;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.dayou.annotation.ExcelSheet;
+import com.dayou.annotation.ExportCell;
+import com.dayou.annotation.ImportCell;
+/**
+ * <p>
+ * 浮动提成
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-04-14
+ */
+@Builder
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ExcelSheet(sheetName = "浮动提成")
+public class BrokerageVariable extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 回款id
+     */
+    private Long paymentId;
+
+    /**
+     * 市场部领导id
+     */
+    private Long userId;
+
+    /**
+     * 岗位类型(营销主管,市场部经理)
+     */
+    @ImportCell
+    @ExportCell(columnName = "岗位类型(营销主管,市场部经理)")
+    private String userType;
+
+    /**
+     * 总提成金额
+     */
+    @ImportCell
+    @ExportCell(columnName = "总提成金额")
+    private BigDecimal brokerageAmount;
+
+    /**
+     * 已结算金额
+     */
+    @ImportCell
+    @ExportCell(columnName = "已结算金额")
+    private BigDecimal settledAmount;
+
+    /**
+     * 未结算金额
+     */
+    @ImportCell
+    @ExportCell(columnName = "未结算金额")
+    private BigDecimal unsettledAmount;
+
+
+}

+ 33 - 9
service/src/main/java/com/dayou/brokerage/MarketerBrokerageCalculator.java

@@ -4,6 +4,7 @@ import com.dayou.bo.BrokerageDetailBO;
 import com.dayou.bo.LeaderRatioBO;
 import com.dayou.brokerage.factory.BrokerageCalculateFactory;
 import com.dayou.dto.ItemDTO;
+import com.dayou.entity.BrokerageVariable;
 import com.dayou.entity.ItemBrokerageDetail;
 
 import java.math.BigDecimal;
@@ -39,31 +40,34 @@ public interface MarketerBrokerageCalculator extends BrokerageCalculator {
     Set<ItemBrokerageDetail> predictTeamShareAmount(BrokerageDetailBO bo, Set<LeaderRatioBO> leaderRatioBOSet);
 
     /**
-     * 预估提成金额(团队抽成计算)
+     * 实际提成金额(团队抽成计算)
      */
     BigDecimal actualTeamShareAmount(ItemBrokerageDetail itemBrokerageDetail);
 
 
 
     /**
-     * 营销主管团队提成部分 计算
-     * @param signAmount 合同签约金额
+     * 营销主管团队提成部分 计算 (按回款金额)
+     * @param paymentId 回款id
+     * @param paymentAmount 回款金额
      * @param userId 提成用户id
      * @param postRatio 岗位提成率
      * @param ratio 项目提成系数
      * @return
      */
-    BigDecimal supervisorAmount(BigDecimal signAmount, Long userId ,BigDecimal postRatio, BigDecimal ratio);
+    BrokerageVariable supervisorSettle(Long paymentId,BigDecimal paymentAmount, Long userId , BigDecimal postRatio, BigDecimal ratio);
+
 
     /**
-     * 市场部部门经理提成计算
-     * @param signAmount 合同签约金额
+     * 市场部部门经理提成计算 (按回款金额)
+     * @param paymentId 回款id
+     * @param paymentAmount 回款金额
      * @param marketerId 客户经理id
-     * @param managerId  营销经理id
-     * @param postRatio  岗位提成率
+     * @param managerId 部门经理id
+     * @param postRatio 岗位提成率
      * @return
      */
-    BigDecimal managerAmount(BigDecimal signAmount,Long marketerId, Long managerId,BigDecimal postRatio);
+    BrokerageVariable managerSettle(Long paymentId,BigDecimal paymentAmount,Long marketerId, Long managerId,BigDecimal postRatio);
 
     /**
      * 市场人员实际提成金额
@@ -76,5 +80,25 @@ public interface MarketerBrokerageCalculator extends BrokerageCalculator {
      */
     BigDecimal aheadAmount(BigDecimal predictAmount);
 
+    /**
+     * 营销主管团队提成部分 计算 (按合同金额)
+     * @param signAmount 合同签约金额
+     * @param userId 提成用户id
+     * @param postRatio 岗位提成率
+     * @param ratio 项目提成系数
+     * @return
+     */
+    BigDecimal supervisorAmount(BigDecimal signAmount, Long userId ,BigDecimal postRatio, BigDecimal ratio);
+
+    /**
+     * 市场部部门经理提成计算 (按合同金额)
+     * @param signAmount 合同签约金额
+     * @param marketerId 客户经理id
+     * @param managerId  营销经理id
+     * @param postRatio  岗位提成率
+     * @return
+     */
+    BigDecimal managerAmount(BigDecimal signAmount,Long marketerId, Long managerId,BigDecimal postRatio);
+
 
 }

+ 88 - 8
service/src/main/java/com/dayou/brokerage/handler/LandMarketerBrokerageHandler.java

@@ -179,6 +179,23 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
     }
 
     @Override
+    public BigDecimal supervisorAmount(BigDecimal signAmount,Long supervisorId,BigDecimal postRatio, BigDecimal ratio) {
+        //营销主管的团队提成规则 : (合同额(团队签的)*项目类型提成系数 * 40% *0.5 )+ [合同额(团队签的)*项目类型提成系数*40%*0.5 * 实发系数(取决于团队回款目标是否完成)]
+        BigDecimal amount = signAmount
+                .multiply(ratio.divide(HUNDRED))
+                .multiply(postRatio.divide(HUNDRED))
+                .multiply(SUPERVISOR_BROKERAGE_SCALE);
+
+        //团队回款目标
+        BigDecimal teamPaymentTarget = BigDecimal.valueOf(userTargetService.getTeamTarget(supervisorId).getPaymentTarget());
+        BigDecimal teamCurrentYearPayment = marketStatService.currentYearTeamPayment(supervisorId);
+        if (checkTeamMonthlyPayment(teamCurrentYearPayment, teamPaymentTarget)){
+            return amount.multiply(BigDecimal.valueOf(2L));
+        }
+        return amount;
+    }
+
+    @Override
     public BrokerageDetailBO managerPersonalAmount(BrokerageDetailBO bo) {
         checkItemBrokerageStatus(bo);
         BigDecimal brokerageRatio = brokeragePostRatioService.getOne(new LambdaQueryWrapper<BrokeragePostRatio>()
@@ -194,20 +211,85 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
 
 
     @Override
-    public BigDecimal supervisorAmount(BigDecimal signAmount,Long supervisorId,BigDecimal postRatio, BigDecimal ratio) {
+    public BrokerageVariable supervisorSettle(Long paymentId,BigDecimal paymentAmount,Long supervisorId,BigDecimal postRatio, BigDecimal ratio) {
         //营销主管的团队提成规则 : (合同额(团队签的)*项目类型提成系数 * 40% *0.5 )+ [合同额(团队签的)*项目类型提成系数*40%*0.5 * 实发系数(取决于团队回款目标是否完成)]
-        BigDecimal amount = signAmount
+        //针对这笔回款,营销主管总提成金额
+        BigDecimal brokerageAmount = paymentAmount
                 .multiply(ratio.divide(HUNDRED))
-                .multiply(postRatio.divide(HUNDRED))
-                .multiply(SUPERVISOR_BROKERAGE_SCALE);
+                .multiply(postRatio.divide(HUNDRED));
 
+        //固定提成部分
+        BigDecimal defaultAmount = brokerageAmount.multiply(SUPERVISOR_BROKERAGE_SCALE);
+
+        //浮动提成部分  需要判断这个团队的回款达成目标
+        BigDecimal variableAmount = BigDecimal.ZERO;
         //团队回款目标
         BigDecimal teamPaymentTarget = BigDecimal.valueOf(userTargetService.getTeamTarget(supervisorId).getPaymentTarget());
         BigDecimal teamCurrentYearPayment = marketStatService.currentYearTeamPayment(supervisorId);
         if (checkTeamMonthlyPayment(teamCurrentYearPayment, teamPaymentTarget)){
-            return amount.multiply(BigDecimal.valueOf(2L));
+            variableAmount = brokerageAmount.multiply(BigDecimal.ONE.subtract(SUPERVISOR_BROKERAGE_SCALE));
         }
-        return amount;
+        return BrokerageVariable
+                .builder()
+                .paymentId(paymentId)
+                .userId(supervisorId)
+                .userType(SUPERVISOR)
+                .brokerageAmount(brokerageAmount)
+                .settledAmount(defaultAmount.add(variableAmount))
+                .unsettledAmount(brokerageAmount.subtract(defaultAmount.add(variableAmount)))
+                .build();
+    }
+
+    @Override
+    public BrokerageVariable managerSettle(Long paymentId, BigDecimal paymentAmount, Long marketerId, Long managerId, BigDecimal postRatio) {
+        //部门经理的团队提成规则 :部门产值*3%+区域产值1.5%  +  (部门产值*浮动提成比例*0.2)+(部门产值*浮动提成比例*0.8*实发比例) 实发比例(取决于团队回款目标是否完成)
+        //部门产值
+        BigDecimal departmentAmount = paymentAmount
+                .multiply(postRatio.divide(HUNDRED))
+                .multiply(new BigDecimal("2"));
+        BigDecimal areaAmount = BigDecimal.ZERO;
+
+        if (marketerId!=null){
+            //开单人员的营销主管集合
+            Set<LeaderRatioBO> leaders = teamMemberService.getLeader(marketerId, MARKET_DEPARTMENT).stream().filter(x->x.getPostName().equals(SUPERVISOR)).collect(Collectors.toSet());
+
+            if (!CollectionUtils.isEmpty(leaders)){
+                //区域产值
+                areaAmount = paymentAmount.multiply(postRatio.divide(HUNDRED));
+            }
+        }
+
+        // 获取发展的营销主管个数
+        int cultivateNum = teamService.count(new LambdaQueryWrapper<Team>().eq(Team::getCultivateId, managerId).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        BigDecimal cultivateRate ;
+        if (cultivateNum<4){
+            cultivateRate = CULTIVATE_LOW_4;
+        }else if(cultivateNum>=4 && cultivateNum<=6){
+            cultivateRate = CULTIVATE_4_6;
+        }else {
+            cultivateRate = CULTIVATE_HIGH_6;
+        }
+        BigDecimal floatAmount = paymentAmount.multiply(cultivateRate).multiply(MANAGER_FLOAT_RATIO_2);
+
+        BigDecimal variableAmount = paymentAmount.multiply(cultivateRate).multiply(MANAGER_FLOAT_RATIO_8);
+
+        BigDecimal brokerageAmount = departmentAmount.add(areaAmount).add(floatAmount).add(variableAmount);
+        //团队回款目标
+        BigDecimal teamPaymentTarget = BigDecimal.valueOf(userTargetService.getTeamTarget(managerId).getPaymentTarget());
+        BigDecimal teamCurrentYearPayment = marketStatService.currentYearTeamPayment(managerId);
+        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();
     }
 
     @Override
@@ -222,7 +304,6 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
         if (marketerId!=null){
             //开单人员的营销主管集合
             Set<LeaderRatioBO> leaders = teamMemberService.getLeader(marketerId, MARKET_DEPARTMENT).stream().filter(x->x.getPostName().equals(SUPERVISOR)).collect(Collectors.toSet());
-            //Set<LeaderRatioBO> leaders = userService.getLeaderRatioBO(marketerId).stream().filter(x->x.getPostName().equals(SUPERVISOR)).collect(Collectors.toSet());
 
             if (!CollectionUtils.isEmpty(leaders)){
                 //区域产值
@@ -232,7 +313,6 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
 
         // 获取发展的营销主管个数
         int cultivateNum = teamService.count(new LambdaQueryWrapper<Team>().eq(Team::getCultivateId, managerId).eq(BaseEntity::getDeleted, Boolean.FALSE));
-        //Integer cultivateNum = postCultivateService.countCultivate(SUPERVISOR, managerId);
         BigDecimal cultivateRate ;
         if (cultivateNum<4){
             cultivateRate = CULTIVATE_LOW_4;

+ 58 - 0
service/src/main/java/com/dayou/dto/PaymentDetailDTO.java

@@ -0,0 +1,58 @@
+package com.dayou.dto;
+
+import com.dayou.annotation.ExportCell;
+import com.dayou.annotation.ImportCell;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/4/14
+ * created with IntelliJ IDEA.
+ */
+@Data
+public class PaymentDetailDTO {
+
+    /**
+     * variableId
+     */
+    private Long id;
+
+    /**
+     * 回款金额
+     */
+    private BigDecimal paymentAmount;
+
+    /**
+     * 回款id
+     */
+    private Long paymentId;
+
+    /**
+     * 市场部领导id
+     */
+    private Long userId;
+
+    /**
+     * 岗位类型(营销主管,市场部经理)
+     */
+    private String userType;
+
+    /**
+     * 总提成金额
+     */
+    private BigDecimal brokerageAmount;
+
+    /**
+     * 已结算金额
+     */
+    private BigDecimal settledAmount;
+
+    /**
+     * 未结算金额
+     */
+    private BigDecimal unsettledAmount;
+}

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

@@ -0,0 +1,33 @@
+package com.dayou.service;
+import com.dayou.dto.PaymentDetailDTO;
+import com.dayou.entity.BrokerageVariable;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 浮动提成 服务类
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-04-14
+ */
+public interface IBrokerageVariableService extends IService<BrokerageVariable> {
+
+        Page<BrokerageVariable> selectPage(Page page,BrokerageVariable brokerageVariable);
+
+        BrokerageVariable detail(Long id);
+
+        Boolean add(BrokerageVariable brokerageVariable);
+
+        Boolean update(BrokerageVariable brokerageVariable);
+
+        Boolean delete(Long id);
+
+    List<PaymentDetailDTO> getPaymentDetailListByItemId(Long id,Long userId);
+}

+ 73 - 0
service/src/main/java/com/dayou/service/impl/BrokerageVariableServiceImpl.java

@@ -0,0 +1,73 @@
+package com.dayou.service.impl;
+
+import com.dayou.dto.PaymentDetailDTO;
+import com.dayou.entity.BrokerageVariable;
+import com.dayou.mapper.BrokerageVariableMapper;
+import com.dayou.service.IBrokerageVariableService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.dayou.utils.ExcelUtil;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+import java.util.List;
+import java.util.ArrayList;
+import org.springframework.transaction.annotation.Transactional;
+import com.dayou.enums.BatchTaskTypeEnum;
+
+/**
+ * <p>
+ * 浮动提成 服务实现类
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-04-14
+ */
+@Service
+public class BrokerageVariableServiceImpl extends ServiceImpl<BrokerageVariableMapper, BrokerageVariable> implements IBrokerageVariableService {
+
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Page<BrokerageVariable> selectPage(Page page,BrokerageVariable brokerageVariable){
+        return this.page(page, new QueryWrapper<BrokerageVariable>(brokerageVariable));
+    }
+
+
+    @Override
+    public BrokerageVariable detail(Long id){
+        return this.getById(id);
+    }
+
+    @Override
+    public Boolean add(BrokerageVariable brokerageVariable){
+        return  this.save(brokerageVariable);
+    }
+
+    @Override
+    public Boolean update(BrokerageVariable brokerageVariable){
+        return  this.updateById(brokerageVariable);
+    }
+
+    @Override
+    public Boolean delete(Long id){
+        //逻辑删除
+        return this.removeById(id);
+    }
+
+    @Override
+    public List<PaymentDetailDTO> getPaymentDetailListByItemId(Long id,Long userId) {
+        //todo
+        return null;
+    }
+}

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

@@ -570,6 +570,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         HashSet<String> status = Sets.newHashSet();
         status.add(BrokerageState.TO_PREDICTING.getCode());
         status.add(BrokerageState.NOT_SETTLE.getCode());
+        status.add(BrokerageState.NOT_PAYMENT.getCode());
         List<ItemBrokerageGeneral> ableSettleList = this.list(new LambdaQueryWrapper<ItemBrokerageGeneral>().in(ItemBrokerageGeneral::getMarketerStatus,status)
                 .or().eq(ItemBrokerageGeneral::getParticipantStatus,BrokerageState.NOT_SETTLE.getCode()));
         return ableSettleList;

+ 60 - 12
service/src/main/java/com/dayou/service/impl/ItemBrokerageSequenceServiceImpl.java

@@ -6,10 +6,9 @@ import com.dayou.brokerage.constants.BrokerageMode;
 import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.brokerage.constants.BrokerageState;
 import com.dayou.common.BaseEntity;
-import com.dayou.entity.ItemBrokerageDetail;
-import com.dayou.entity.ItemBrokerageGeneral;
-import com.dayou.entity.ItemBrokerageSequence;
-import com.dayou.entity.ItemBrokerageSequenceDetail;
+import com.dayou.dto.ItemDTO;
+import com.dayou.dto.PaymentDetailDTO;
+import com.dayou.entity.*;
 import com.dayou.mapper.ItemBrokerageSequenceMapper;
 import com.dayou.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -34,7 +33,7 @@ import java.util.stream.Collectors;
 import org.springframework.transaction.annotation.Transactional;
 
 import static com.dayou.brokerage.constants.BrokerageMsg.*;
-import static com.dayou.common.Constants.YEARMONTH;
+import static com.dayou.common.Constants.*;
 
 /**
  * <p>
@@ -66,6 +65,12 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
     @Autowired
     private MarketerBrokerageCalculator landMarketerBrokerageHandler;
 
+    @Autowired
+    private IBrokerageVariableService brokerageVariableService;
+
+    @Autowired
+    private IBrokeragePostRatioService brokeragePostRatioService;
+
     @Override
     @SuppressWarnings("unchecked")
     public Page<BrokerageSequenceVO> selectPage(Page page, BrokerageSequenceVO itemBrokerageSequence){
@@ -143,15 +148,12 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
                         toUpdateItemBrokerageDetails.add(x);
                         return sequenceDetail;
                     }else if (general.getMarketerStatus().equals(BrokerageState.NOT_SETTLE.getCode())
-                            && (x.getBrokerageRule().equals(BrokerageRule.LAND_MARKETER_RULE.getCode())
-                            || x.getBrokerageRule().equals(BrokerageRule.LAND_MANAGER_RULE.getCode())
-                            || x.getBrokerageRule().equals(BrokerageRule.LAND_SUPERVISOR_RULE.getCode()))) {
+                            && x.getBrokerageMode().equals(BrokerageMode.PERSONAL.getCode())
+                            && x.getBrokerageRule().equals(BrokerageRule.LAND_MARKETER_RULE.getCode())
+                        ) {
                         //减去已预提金额 ,这个地方需要再次根据 [结算时间节点] 去重新计算 营销主管和营销经理的 实际提成金额,因为 回款金额等因素可能有变动。
                         //客户经理的实际提成金额则根据预估计算时得出的金额为准
                         BigDecimal actualAmount = x.getActualAmount();
-                        if (x.getBrokerageRule().equals(BrokerageRule.LAND_MANAGER_RULE.getCode()) || x.getBrokerageRule().equals(BrokerageRule.LAND_SUPERVISOR_RULE.getCode())){
-                            actualAmount = landMarketerBrokerageHandler.actualTeamShareAmount(x);
-                        }
                         if (general.getMarketerAdvanceBrokerageDone()) {
                             actualAmount = actualAmount.subtract(x.getAheadAmount());
                         }
@@ -161,7 +163,22 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
                         x.setActualAmount(actualAmount);
                         toUpdateItemBrokerageDetails.add(x);
                         return sequenceDetail;
-                    } else if (general.getParticipantStatus().equals(BrokerageState.NOT_SETTLE.getCode()) && x.getBrokerageRule().equals(BrokerageRule.LAND_OTHER_RULE.getCode())) {
+                    }
+                    //市场部领导的团队抽成部分,是跟具回款金额来结算,即使合同金额未完全回款,市场部领导的团队抽成部分也可以根据目前回款金额来结算。
+                    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);
+                        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());
@@ -232,6 +249,37 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
         return Boolean.FALSE;
     }
 
+    /**
+     * 处理领导的提成逻辑
+     * @param brokerageDetail
+     * @return
+     */
+    private BigDecimal leaderBrokerageHandle(ItemBrokerageDetail brokerageDetail) {
+        ItemDTO item = brokerageGeneralService.getItemByBrokerageGeneralId(brokerageDetail.getGeneralId());
+        ItemBrokerageGeneral general = brokerageGeneralService.getById(brokerageDetail.getGeneralId());
+        //这个方法要获取 新增的 且未被结算过的回款 。
+        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());
+                    }else{
+                        return landMarketerBrokerageHandler.managerSettle(x.getPaymentId(),x.getPaymentAmount(),item.getUserId(),x.getUserId(),postRatio.getBrokerageRatio());
+                    }
+                }).collect(Collectors.toList());
+                if (CollectionUtils.isNotEmpty(variables)){
+                    brokerageVariableService.saveBatch(variables);
+                }
+                BigDecimal sum = variables.stream().map(BrokerageVariable::getSettledAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+                return sum;
+            }
+        }
+        return BigDecimal.ZERO;
+    }
+
     @Override
     public List<BrokerageSequenceVO> deduction(BrokerageSequenceVO brokerageSequenceVO) {
         List<BrokerageSequenceVO> list = brokerageSequenceMapper.deduction(brokerageSequenceVO);