Browse Source

项目提成业务代码

wucl 2 years ago
parent
commit
23e4d38868
33 changed files with 534 additions and 87 deletions
  1. 12 0
      biz-base/src/main/java/com/dayou/controller/ItemStageController.java
  2. 2 0
      common/src/main/java/com/dayou/exception/ErrorCode.java
  3. 3 0
      dao/src/main/java/com/dayou/mapper/ItemMapper.java
  4. 1 0
      dao/src/main/resources/mapper/ItemMapper.xml
  5. 1 1
      domain/src/main/java/com/dayou/entity/ItemBrokerageDetail.java
  6. 2 0
      domain/src/main/java/com/dayou/entity/ItemBrokerageSequence.java
  7. 5 0
      domain/src/main/java/com/dayou/entity/ItemBrokerageSequenceDetail.java
  8. 4 1
      domain/src/main/java/com/dayou/entity/ItemEvaluate.java
  9. 35 14
      service/src/main/java/com/dayou/brokerage/BrokerageCalculateSupport.java
  10. 9 16
      service/src/main/java/com/dayou/brokerage/BrokerageCalculator.java
  11. 11 0
      service/src/main/java/com/dayou/brokerage/MarketerBrokerageCalculator.java
  12. 17 0
      service/src/main/java/com/dayou/brokerage/NonMarketerMarketerBrokerageCalculator.java
  13. 4 0
      service/src/main/java/com/dayou/brokerage/annotation/DoBrokerage.java
  14. 13 0
      service/src/main/java/com/dayou/brokerage/config/LandBrokerageDataConfiguration.java
  15. 9 6
      service/src/main/java/com/dayou/brokerage/constants/BrokerageType.java
  16. 12 2
      service/src/main/java/com/dayou/brokerage/constants/BrokerageState.java
  17. 6 9
      service/src/main/java/com/dayou/brokerage/handler/LandMarketerBrokerageHandler.java
  18. 34 14
      service/src/main/java/com/dayou/brokerage/handler/LandNonMarketerBrokerageHandler.java
  19. 22 3
      service/src/main/java/com/dayou/brokerage/interceptor/BrokerageInterceptor.java
  20. 45 7
      service/src/main/java/com/dayou/brokerage/validator/BrokerageValidator.java
  21. 39 0
      service/src/main/java/com/dayou/dto/ParticipantSettleDTO.java
  22. 25 0
      service/src/main/java/com/dayou/dto/SalarySettleDTO.java
  23. 18 8
      service/src/main/java/com/dayou/service/IItemBrokerageGeneralService.java
  24. 3 0
      service/src/main/java/com/dayou/service/IItemBrokerageSequenceService.java
  25. 3 0
      service/src/main/java/com/dayou/service/IItemService.java
  26. 2 0
      service/src/main/java/com/dayou/service/IItemStageService.java
  27. 81 5
      service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java
  28. 94 1
      service/src/main/java/com/dayou/service/impl/ItemBrokerageSequenceServiceImpl.java
  29. 5 0
      service/src/main/java/com/dayou/service/impl/ItemEvaluateServiceImpl.java
  30. 2 0
      service/src/main/java/com/dayou/service/impl/ItemServiceImpl.java
  31. 9 0
      service/src/main/java/com/dayou/service/impl/ItemStageServiceImpl.java
  32. 5 0
      service/src/main/java/com/dayou/service/impl/PaymentCollectionServiceImpl.java
  33. 1 0
      sql/brokerage_about.sql

+ 12 - 0
biz-base/src/main/java/com/dayou/controller/ItemStageController.java

@@ -121,5 +121,17 @@ public class ItemStageController extends BaseController {
         List<List<ItemStageVO>> list = itemStageService.stageList(itemStageVO);
         return RestResponse.data(list);
     }
+
+    /**
+     * 阶段确认
+     * @param stageId
+     * @param overdue
+     * @return
+     */
+    @GetMapping("/confirm")
+    public RestResponse<Boolean> confirmation(Long stageId,Boolean overdue){
+        Boolean result = itemStageService.confirmation(stageId,overdue);
+        return RestResponse.data(result);
+    }
 }
 

+ 2 - 0
common/src/main/java/com/dayou/exception/ErrorCode.java

@@ -43,6 +43,8 @@ public class ErrorCode {
 
     public static final ErrorCode BROKERAGE_ITEM_STATE_ERROR2 = ErrorCode("10019", "客户经理未达到回款目标,无法计算提成");
 
+    public static final ErrorCode BROKERAGE_SETTLE_FAILED = ErrorCode("10020", "项目结算失败,请检查项目排期或提成权重。");
+
 
 
 

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

@@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dayou.dto.ItemDTO;
 import com.dayou.entity.Item;
 import com.dayou.dao.CustomBaseMapper;
+import com.dayou.entity.ItemBrokerageGeneral;
 import com.dayou.vo.ItemStageVO;
 import com.dayou.vo.ItemStatVO;
 import com.dayou.vo.ItemVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDate;
 import java.util.List;
 
 /**
@@ -30,4 +32,5 @@ public interface ItemMapper extends CustomBaseMapper<Item> {
     Page<ItemVO> getXPage(Page page, @Param("item")ItemDTO item);
 
     List<Item> xSelectList(@Param("item")ItemStageVO item);
+
 }

+ 1 - 0
dao/src/main/resources/mapper/ItemMapper.xml

@@ -184,4 +184,5 @@
             )
         </if>
     </select>
+
 </mapper>

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

@@ -47,7 +47,7 @@ public class ItemBrokerageDetail extends BaseEntity {
     private BigDecimal actualAmount;
 
     /**
-     * 已预提金额
+     * 已结算金额
      */
     private BigDecimal advanceAmount;
 

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

@@ -1,6 +1,7 @@
 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;
@@ -17,6 +18,7 @@ import com.dayou.annotation.ImportCell;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ExcelSheet(sheetName = "项目提成流水")
+@Builder
 public class ItemBrokerageSequence extends BaseEntity {
 
     private static final long serialVersionUID=1L;

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

@@ -32,6 +32,11 @@ public class ItemBrokerageSequenceDetail extends BaseEntity {
     private Long sequenceId;
 
     /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
      * 提成金额
      */
     @ImportCell

+ 4 - 1
domain/src/main/java/com/dayou/entity/ItemEvaluate.java

@@ -5,6 +5,9 @@ import lombok.EqualsAndHashCode;
 import com.dayou.annotation.ExcelSheet;
 import com.dayou.annotation.ExportCell;
 import com.dayou.annotation.ImportCell;
+
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 项目完结评价表
@@ -30,7 +33,7 @@ public class ItemEvaluate extends BaseEntity {
      */
     @ImportCell
     @ExportCell(columnName = "项目整体提成权重")
-    private Double weight;
+    private BigDecimal weight;
 
     /**
      * 项目评价

+ 35 - 14
service/src/main/java/com/dayou/brokerage/BrokerageCalculateSupport.java

@@ -8,6 +8,11 @@ import com.dayou.brokerage.handler.LandMarketerBrokerageHandler;
 import com.dayou.brokerage.handler.LandNonMarketerBrokerageHandler;
 import com.dayou.brokerage.validator.BrokerageValidator;
 import com.dayou.dto.ItemDTO;
+import com.dayou.dto.ParticipantSettleDTO;
+import com.dayou.dto.SalarySettleDTO;
+import com.dayou.entity.ItemBrokerageDetail;
+import com.dayou.entity.ItemBrokerageGeneral;
+import com.dayou.entity.ItemStage;
 import com.dayou.utils.DateUtils;
 import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,6 +23,7 @@ import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 类说明:
@@ -54,7 +60,7 @@ public class BrokerageCalculateSupport implements BrokerageCalculateFactory,Brok
         return null;
     }
     /**
-     * 校验项目提成状态
+     * 校验项目提成状态 (预计提成)
      * @param brokerageDetailBo
      * @return
      */
@@ -63,6 +69,23 @@ public class BrokerageCalculateSupport implements BrokerageCalculateFactory,Brok
     }
 
     /**
+     * 校验项目提成状态 (参与人实际提成)
+     * @param brokerageStatus
+     * @return
+     */
+    protected void checkItemBrokerageStatusOnParticipantSettle(String brokerageStatus){
+        brokerageValidator.checkItemBrokerageStatusOnParticipantSettle(brokerageStatus);
+    }
+
+    /**
+     * 校验项目提成状态 (客户经理实际提成)
+     * @param brokerageStatus
+     * @return
+     */
+    public void checkItemBrokerageStatusOnMarketerSettle(String brokerageStatus){
+        brokerageValidator.checkItemBrokerageStatusOnMarketerSettle(brokerageStatus);
+    }
+    /**
      * 市场人员预提校验
      * @param brokerageDetailBo
      * @return
@@ -77,24 +100,22 @@ public class BrokerageCalculateSupport implements BrokerageCalculateFactory,Brok
         brokerageValidator.checkMarketerPredictBrokerage(brokerageDetailBo,brokerageTarget);
     }
 
+    /**
+     * 未结算金额 = 实际提成金额 - 已结算金额
+     * @param actualAmount
+     * @param advanceAmount
+     * @return
+     */
     @Override
-    public BigDecimal residueAmount(BigDecimal predictAmount,BigDecimal aheadAmount) {
-        return predictAmount.subtract(aheadAmount);
-    }
-
-    @Override
-    public BigDecimal actualAmount(ItemDTO itemDTO) {
-        return null;
+    public BigDecimal residueAmount(BigDecimal actualAmount,BigDecimal advanceAmount) {
+        return actualAmount.subtract(advanceAmount);
     }
 
-    @Override
-    public BigDecimal aheadAmount(BigDecimal predictAmount) {
-        return null;
-    }
 
     @Override
-    public BigDecimal advanceAmount() {
-        return null;
+    public BigDecimal advanceAmount(BigDecimal actualAmount) {
+        //提成结算金额 == 实际提成金额
+        return actualAmount;
     }
 
 }

+ 9 - 16
service/src/main/java/com/dayou/brokerage/BrokerageCalculator.java

@@ -2,9 +2,13 @@ package com.dayou.brokerage;
 
 import com.dayou.bo.BrokerageDetailBO;
 import com.dayou.brokerage.factory.BrokerageCalculateFactory;
-import com.dayou.dto.ItemDTO;
+import com.dayou.dto.SalarySettleDTO;
+import com.dayou.entity.ItemBrokerageDetail;
+import com.dayou.entity.ItemBrokerageGeneral;
+import com.dayou.entity.ItemStage;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 类说明:
@@ -17,24 +21,13 @@ public interface BrokerageCalculator extends BrokerageCalculateFactory {
 
 
     /**
-     * 实际提成金额
+     * 提成结算金额
      */
-    BigDecimal actualAmount(ItemDTO itemDTO);
-
-    /**
-     * 预提金额
-     * @return
-     */
-    BigDecimal aheadAmount(BigDecimal predictAmount);
-
-    /**
-     * 已预提金额
-     */
-    BigDecimal advanceAmount();
+    BigDecimal advanceAmount(BigDecimal actualAmount);
 
 
     /**
-     * 剩余未提金额
+     * 未结算金额
      */
-    BigDecimal residueAmount(BigDecimal predictAmount,BigDecimal aheadAmount);
+    BigDecimal residueAmount(BigDecimal actualAmount,BigDecimal advanceAmount);
 }

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

@@ -28,6 +28,17 @@ public interface MarketerBrokerageCalculator extends BrokerageCalculator {
      */
     Set<ItemBrokerageDetail> predictTeamShareAmount(BrokerageDetailBO bo, Set<LeaderRatioBO> leaderRatioBOSet);
 
+    /**
+     * 市场人员实际提成金额
+     */
+    BigDecimal actualAmount(BigDecimal predictAmount);
+
+    /**
+     * 市场人员预提金额
+     * @return
+     */
+    BigDecimal aheadAmount(BigDecimal predictAmount);
+
 
 
 

+ 17 - 0
service/src/main/java/com/dayou/brokerage/NonMarketerMarketerBrokerageCalculator.java

@@ -1,9 +1,12 @@
 package com.dayou.brokerage;
 
 import com.dayou.bo.BrokerageDetailBO;
+import com.dayou.dto.ParticipantSettleDTO;
 import com.dayou.entity.ItemBrokerageDetail;
+import com.dayou.entity.ItemStage;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 类说明:非市场人员提成计算器接口
@@ -21,6 +24,20 @@ public interface NonMarketerMarketerBrokerageCalculator extends BrokerageCalcula
      */
     ItemBrokerageDetail predictAmount(BrokerageDetailBO bo);
 
+
+    /**
+     * 非市场人员实际提成金额
+     * @param participantSettleDTO 参与人员结算DTO
+     */
+    List<ItemBrokerageDetail> actualAmount(ParticipantSettleDTO participantSettleDTO);
+
+    /**
+     * 非市场人员预提金额
+     * @return
+     */
+    BigDecimal aheadAmount(Long userId);
+
+
     /**
      * 预提金额总和
      */

+ 4 - 0
service/src/main/java/com/dayou/brokerage/annotation/DoBrokerage.java

@@ -1,5 +1,6 @@
 package com.dayou.brokerage.annotation;
 
+import com.dayou.brokerage.constants.BrokerageBusiness;
 import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.enums.OperationTypeEnum;
 import org.apache.poi.ss.formula.functions.T;
@@ -21,5 +22,8 @@ public @interface DoBrokerage {
     OperationTypeEnum operation();
 
     BrokerageRule rule();
+    BrokerageBusiness business() default BrokerageBusiness.ITEM_PREDICT;
+
+
 
 }

+ 13 - 0
service/src/main/java/com/dayou/brokerage/config/LandBrokerageDataConfiguration.java

@@ -2,9 +2,11 @@ package com.dayou.brokerage.config;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.dayou.common.BaseEntity;
+import com.dayou.entity.BrokerageBaseAmount;
 import com.dayou.entity.BrokerageMarketerRatio;
 import com.dayou.enums.GlobalConfigEnum;
 import com.dayou.enums.MergeKeyInterface;
+import com.dayou.service.IBrokerageBaseAmountService;
 import com.dayou.service.IBrokerageMarketerRatioService;
 import com.dayou.service.IGlobalConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -12,7 +14,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import javax.annotation.Nullable;
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 
 /**
@@ -31,6 +35,9 @@ public class LandBrokerageDataConfiguration extends BrokerageMarketerRatio imple
     @Autowired
     private IGlobalConfigService globalConfigService;
 
+    @Autowired
+    private IBrokerageBaseAmountService brokerageBaseAmountService;
+
     /**
      * 由项目类型和项目来源决定的提成系数集合
      */
@@ -74,5 +81,11 @@ public class LandBrokerageDataConfiguration extends BrokerageMarketerRatio imple
 
         participantBrokeragePercentage = globalConfigService.getMathValue(GlobalConfigEnum.FINANCE.getCode(),
                 GlobalConfigEnum.Finance.PARTICIPANT_BROKERAGE_PERCENTAGE.getCode());
+
+        List<BrokerageBaseAmount> baseAmounts = brokerageBaseAmountService.list();
+
+        baseAmounts.stream().forEach(x->{
+            userBaseBrokerageAmounts.put(x.getUserId(), x.getBaseAmount());
+        });
     }
 }

+ 9 - 6
service/src/main/java/com/dayou/brokerage/constants/BrokerageType.java

@@ -4,20 +4,23 @@ package com.dayou.brokerage.constants;
  * 类说明:
  *
  * @author: wucl
- * @since: 2023/3/3
+ * @since: 2023/3/13
  * created with IntelliJ IDEA.
  */
-public enum BrokerageType {
+public enum BrokerageBusiness {
 
-    PREDICT("预提","PREDICT"),
-    CLOSE("结算","CLOSE")
-    ;
+    ITEM_PREDICT("项目预算","ITEM_PREDICT"),
+
+    ITEM_SETTLE("项目结算","ITEM_SETTLE"),
+
+    AHEAD("提成预提","ITEM_PREDICT"),
+    SETTLE("提成结算","ITEM_SETTLE");
 
     private String name;
 
     private String code;
 
-    BrokerageType(String name, String code) {
+    BrokerageBusiness(String name, String code) {
         this.name = name;
         this.code = code;
     }

+ 12 - 2
service/src/main/java/com/dayou/brokerage/constants/BrokerageState.java

@@ -10,9 +10,18 @@ package com.dayou.brokerage.constants;
 public enum BrokerageState {
 
     NOT_START("未开始","NOT_START"),
-    PREDICTING("预提中","PREDICTING"),
+
+    NOT_SETTLE("待结算","NOT_SETTLE"),
+    PREDICTING("参与人预提中","PREDICTING"),
     FREEZE("冻结","FREEZE"),
-    CLOSED("已结算","CLOSED")
+
+    PARTICIPANT_SETTLE("参与人已结算","PARTICIPANT_SETTLE"),
+
+    MARKETER_SETTLE("客户经理已结算","MARKETER_SETTLE"),
+
+    ITEM_SETTLE("项目已结算","ITEM_SETTLE"),
+
+    CLOSED("提成已结算","CLOSED");
     ;
 
     private String name;
@@ -31,4 +40,5 @@ public enum BrokerageState {
     public String getCode() {
         return code;
     }
+
 }

+ 6 - 9
service/src/main/java/com/dayou/brokerage/handler/LandMarketerBrokerageHandler.java

@@ -1,6 +1,5 @@
 package com.dayou.brokerage.handler;
 
-import cn.hutool.core.bean.BeanUtil;
 import com.dayou.bo.BrokerageDetailBO;
 import com.dayou.bo.LeaderRatioBO;
 import com.dayou.brokerage.BrokerageCalculateSupport;
@@ -8,7 +7,6 @@ import com.dayou.brokerage.MarketerBrokerageCalculator;
 import com.dayou.brokerage.config.LandBrokerageDataConfiguration;
 import com.dayou.brokerage.constants.BrokerageMode;
 import com.dayou.brokerage.constants.BrokerageRule;
-import com.dayou.dto.ItemDTO;
 import com.dayou.entity.ItemBrokerageDetail;
 import com.dayou.exception.BusinessException;
 import com.google.common.collect.Sets;
@@ -44,6 +42,7 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
             try {
                 checkMarketerPredictBrokerage(bo);
                 bo.setPredictAmount(bo.getAmount().multiply(ratio));
+                bo.setActualAmount(actualAmount(bo.getPredictAmount()));
                 bo.setAheadAmount(aheadAmount(bo.getPredictAmount()));
                 bo.setMarketerAdvanceBrokerageAble(Boolean.TRUE);
                 bo.setBrokerageMode(BrokerageMode.PERSONAL.getCode());
@@ -76,7 +75,7 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
                 itemBrokerageDetail.setPredictAmount(bo.getAmount().multiply(ratio).multiply(x.getRatio()));
                 itemBrokerageDetail.setUserId(x.getUserId());
                 itemBrokerageDetail.setAheadAmount(BigDecimal.ZERO);
-                itemBrokerageDetail.setActualAmount(BigDecimal.ZERO);
+                itemBrokerageDetail.setActualAmount(actualAmount(itemBrokerageDetail.getPredictAmount()));
                 itemBrokerageDetail.setAdvanceAmount(BigDecimal.ZERO);
                 itemBrokerageDetail.setBrokerageMode(BrokerageMode.TEAM_SHARE.getCode());
                 itemBrokerageDetail.setBrokerageRule(BrokerageRule.LAND_MARKETER_RULE.getCode());
@@ -88,13 +87,11 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
         }
         return itemBrokerageDetails;
     }
+
     @Override
-    public BigDecimal advanceAmount() {
-        return null;
-    }
-    @Override
-    public BigDecimal actualAmount(ItemDTO itemDTO) {
-        return null;
+    public BigDecimal actualAmount(BigDecimal predictAmount) {
+        //客户经理的提成不存在考核,即 预计提成金额 == 实际提成金额
+        return predictAmount;
     }
 
 }

+ 34 - 14
service/src/main/java/com/dayou/brokerage/handler/LandNonMarketerBrokerageHandler.java

@@ -1,18 +1,26 @@
 package com.dayou.brokerage.handler;
 
 import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.dayou.bo.BrokerageDetailBO;
 import com.dayou.brokerage.BrokerageCalculateSupport;
 import com.dayou.brokerage.NonMarketerMarketerBrokerageCalculator;
 import com.dayou.brokerage.config.LandBrokerageDataConfiguration;
-import com.dayou.brokerage.validator.BrokerageValidator;
-import com.dayou.dto.ItemDTO;
+import com.dayou.brokerage.constants.BrokerageRule;
+import com.dayou.common.BaseEntity;
+import com.dayou.dto.ParticipantSettleDTO;
+import com.dayou.dto.SalarySettleDTO;
 import com.dayou.entity.ItemBrokerageDetail;
+import com.dayou.entity.ItemStage;
+import com.dayou.service.IItemBrokerageDetailService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 类说明:土地规划部 非 市场人员提成计算处理器
@@ -26,14 +34,14 @@ import java.math.BigDecimal;
 public class LandNonMarketerBrokerageHandler extends BrokerageCalculateSupport implements NonMarketerMarketerBrokerageCalculator {
 
     @Autowired
-    private BrokerageValidator brokerageValidator;
+    private LandBrokerageDataConfiguration landBrokerageDataConfiguration;
 
     @Autowired
-    private LandBrokerageDataConfiguration landBrokerageDataConfiguration;
+    private IItemBrokerageDetailService brokerageDetailService;
 
     @Override
     public ItemBrokerageDetail predictAmount(BrokerageDetailBO brokerageDetailBO) {
-        brokerageValidator.checkItemBrokerageStatus(brokerageDetailBO);
+        checkItemBrokerageStatus(brokerageDetailBO);
         ItemBrokerageDetail itemBrokerageDetail = new ItemBrokerageDetail();
         if (landBrokerageDataConfiguration.participantBrokeragePercentage!=null){
             //合同金额
@@ -52,19 +60,31 @@ public class LandNonMarketerBrokerageHandler extends BrokerageCalculateSupport i
     }
 
     @Override
-    public BigDecimal aheadAmount(BigDecimal predictAmount){
-        //todo 配置基础预提金额
-        BigDecimal baseAheadAmount = landBrokerageDataConfiguration.userBaseBrokerageAmounts.get(null);
+    public BigDecimal aheadAmount(Long userId){
+        BigDecimal baseAheadAmount = landBrokerageDataConfiguration.userBaseBrokerageAmounts.get(userId);
         return baseAheadAmount;
     }
     @Override
-    public BigDecimal actualAmount(ItemDTO itemDTO) {
-        return null;
-    }
+    public List<ItemBrokerageDetail> actualAmount(ParticipantSettleDTO participantSettleDTO) {
+        checkItemBrokerageStatusOnParticipantSettle(participantSettleDTO.getBrokerageState());
+        List<ItemBrokerageDetail> participantBrokerageDetails = brokerageDetailService.list(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId, participantSettleDTO.getGeneralId())
+                .eq(BaseEntity::getDeleted, Boolean.FALSE).eq(ItemBrokerageDetail::getBrokerageRule, BrokerageRule.LAND_OTHER_RULE.getCode()));
+        Map<Long, List<ItemBrokerageDetail>> brokerageByStage = participantBrokerageDetails.stream().collect(Collectors.groupingBy(ItemBrokerageDetail::getBrokerageStageId));
+        for (Map.Entry<Long,List<ItemBrokerageDetail>> detail : brokerageByStage.entrySet()){
+            for (ItemStage stage : participantSettleDTO.getStages()){
+                if (detail.getKey().equals(stage.getId())){
+                    List<ItemBrokerageDetail> value = detail.getValue();
+                    for (ItemBrokerageDetail brokerage :value){
+                        brokerage.setActualAmount(brokerage.getPredictAmount().multiply(participantSettleDTO.getWeight()));
+                        if (stage.getOverdue()){
+                            brokerage.setActualAmount(brokerage.getActualAmount().multiply(stage.getCoefficient()));
+                        }
+                    }
+                }
+            }
+        }
 
-    @Override
-    public BigDecimal advanceAmount() {
-        return null;
+        return participantBrokerageDetails;
     }
 
     @Override

+ 22 - 3
service/src/main/java/com/dayou/brokerage/interceptor/BrokerageInterceptor.java

@@ -1,7 +1,10 @@
 package com.dayou.brokerage.interceptor;
 
 import com.dayou.brokerage.annotation.DoBrokerage;
+import com.dayou.brokerage.constants.BrokerageBusiness;
 import com.dayou.dto.ItemDTO;
+import com.dayou.entity.ItemEvaluate;
+import com.dayou.entity.PaymentCollection;
 import com.dayou.enums.OperationTypeEnum;
 import com.dayou.mapper.ItemMapper;
 import com.dayou.service.IItemBrokerageGeneralService;
@@ -16,6 +19,8 @@ import org.springframework.stereotype.Component;
 
 import java.lang.reflect.Method;
 
+import static com.dayou.brokerage.constants.BrokerageBusiness.ITEM_SETTLE;
+import static com.dayou.brokerage.constants.BrokerageBusiness.SETTLE;
 import static com.dayou.brokerage.constants.BrokerageRule.LAND_MARKETER_RULE;
 import static com.dayou.brokerage.constants.BrokerageRule.LAND_OTHER_RULE;
 import static com.dayou.enums.OperationTypeEnum.*;
@@ -60,21 +65,35 @@ public class BrokerageInterceptor implements MethodInterceptor {
                 ItemStageVO itemStageVO = (ItemStageVO) methodInvocation.getArguments()[0];
                 iItemBrokerageGeneralService.addParticipatorBrokerage(itemStageVO,(Long) result);
                 log.info("created participator detail,itemId[{}]", itemStageVO.getItemId());
-            };
+            }
         }
         if (annotation!=null && annotation.rule() == LAND_OTHER_RULE && annotation.operation() == EDIT){
             if (result instanceof Boolean && (Boolean) result){
                 ItemStageVO itemStageVO = (ItemStageVO) methodInvocation.getArguments()[0];
                 iItemBrokerageGeneralService.editParticipatorBrokerage(itemStageVO);
                 log.info("created participator detail,itemId[{}]", itemStageVO.getItemId());
-            };
+            }
         }
         if (annotation!=null && annotation.rule() == LAND_OTHER_RULE && annotation.operation() == DELETE){
             if (result instanceof Boolean && (Boolean) result){
                 Long itemStageId = (Long) methodInvocation.getArguments()[0];
                 iItemBrokerageGeneralService.removeParticipatorBrokerage(itemStageId);
                 log.info("deleted non-marketer detail,itemId[{}]", itemStageId);
-            };
+            }
+        }
+        if (annotation!=null && annotation.rule() == LAND_OTHER_RULE && annotation.business() == ITEM_SETTLE){
+            if (result instanceof Boolean && (Boolean) result){
+                ItemEvaluate evaluate = (ItemEvaluate) methodInvocation.getArguments()[0];
+                iItemBrokerageGeneralService.settleParticipatorBrokerage(evaluate.getItemId());
+                log.info("settle non-marketer detail,itemId[{}]", evaluate.getItemId());
+            }
+        }
+        if (annotation!=null && annotation.rule() == LAND_MARKETER_RULE && annotation.business() == ITEM_SETTLE){
+            if (result instanceof Boolean && (Boolean) result){
+                PaymentCollection payment = (PaymentCollection) methodInvocation.getArguments()[0];
+                iItemBrokerageGeneralService.settleMarketerBrokerage(payment);
+                log.info("try settle marketer detail,itemId[{}]", payment.getItemId());
+            }
         }
         return result;
     }

+ 45 - 7
service/src/main/java/com/dayou/brokerage/validator/BrokerageValidator.java

@@ -40,19 +40,57 @@ public class BrokerageValidator {
         }
     }
 
+    /**
+     * 项目状态验证(预算)
+     * @param brokerageDetailBo
+     */
     //校验项目提成状态
     public void checkItemBrokerageStatus(BrokerageDetailBO brokerageDetailBo){
-        if (StrUtil.equals(BrokerageState.CLOSED.getCode(),brokerageDetailBo.getItemBrokerageStatus()) ||
-                StrUtil.equals(BrokerageState.FREEZE.getCode(),brokerageDetailBo.getItemBrokerageStatus())){
-            ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR);
+        if (StrUtil.equals(BrokerageRule.LAND_MARKETER_RULE.getCode(),brokerageDetailBo.getBrokerageRule())){
+            if (StrUtil.equals(BrokerageState.CLOSED.getCode(),brokerageDetailBo.getItemBrokerageStatus()) ||
+                    StrUtil.equals(BrokerageState.FREEZE.getCode(),brokerageDetailBo.getItemBrokerageStatus()) ||
+                        StrUtil.equals(BrokerageState.MARKETER_SETTLE.getCode(),brokerageDetailBo.getItemBrokerageStatus()) ||
+                                StrUtil.equals(BrokerageState.ITEM_SETTLE.getCode(),brokerageDetailBo.getItemBrokerageStatus())){
+                                    ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR);
+            }
         }
-        if (StrUtil.equals(BrokerageRule.LAND_OTHER_RULE.getCode(),brokerageDetailBo.getBrokerageRule())
-                && StrUtil.equals(BrokerageState.NOT_START.getCode(),brokerageDetailBo.getItemBrokerageStatus())){
-            ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR1);
+
+        if (StrUtil.equals(BrokerageRule.LAND_OTHER_RULE.getCode(),brokerageDetailBo.getBrokerageRule())){
+                if (StrUtil.equals(BrokerageState.NOT_START.getCode(),brokerageDetailBo.getItemBrokerageStatus()) ||
+                        StrUtil.equals(BrokerageState.PARTICIPANT_SETTLE.getCode(),brokerageDetailBo.getItemBrokerageStatus()) ||
+                            StrUtil.equals(BrokerageState.CLOSED.getCode(),brokerageDetailBo.getItemBrokerageStatus()) ||
+                                StrUtil.equals(BrokerageState.FREEZE.getCode(),brokerageDetailBo.getItemBrokerageStatus()) ||
+                                    StrUtil.equals(BrokerageState.ITEM_SETTLE.getCode(),brokerageDetailBo.getItemBrokerageStatus())){
+                                    ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR);
+                }
         }
     }
 
+    /**
+     * 项目状态验证(结算非市场人员)
+     * @param brokerageStatus
+     */
+    public void checkItemBrokerageStatusOnParticipantSettle(String brokerageStatus){
+        if (StrUtil.equals(BrokerageState.CLOSED.getCode(),brokerageStatus) ||
+                StrUtil.equals(BrokerageState.FREEZE.getCode(),brokerageStatus) ||
+                    StrUtil.equals(BrokerageState.PARTICIPANT_SETTLE.getCode(),brokerageStatus)||
+                        StrUtil.equals(BrokerageState.NOT_START.getCode(),brokerageStatus) ||
+                             StrUtil.equals(BrokerageState.ITEM_SETTLE.getCode(),brokerageStatus)){
+            ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR);
+        }
+    }
 
+    /**
+     * 项目状态验证(结算市场人员)
+     * @param brokerageStatus
+     */
+    public void checkItemBrokerageStatusOnMarketerSettle(String brokerageStatus){
+        if (StrUtil.equals(BrokerageState.CLOSED.getCode(),brokerageStatus) ||
+                StrUtil.equals(BrokerageState.FREEZE.getCode(),brokerageStatus) ||
+                    StrUtil.equals(BrokerageState.MARKETER_SETTLE.getCode(),brokerageStatus) ||
+                        StrUtil.equals(BrokerageState.ITEM_SETTLE.getCode(),brokerageStatus)){
+            ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR);
+        }
+    }
 
-    //todo m3 校验参与者是否可继续预提
 }

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

@@ -0,0 +1,39 @@
+package com.dayou.dto;
+
+import com.dayou.brokerage.constants.BrokerageState;
+import com.dayou.entity.ItemStage;
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/3/13
+ * created with IntelliJ IDEA.
+ */
+@Data
+@Builder
+public class ParticipantSettleDTO {
+
+    /**
+     * 提成总表id
+     */
+    private Long generalId;
+    /**
+     * 项目阶段
+     */
+    private List<ItemStage> stages;
+    /**
+     * 项目整体提成比例
+     */
+    private BigDecimal weight;
+    /**
+     * 项目状态
+     */
+    private String brokerageState;
+
+}

+ 25 - 0
service/src/main/java/com/dayou/dto/SalarySettleDTO.java

@@ -0,0 +1,25 @@
+package com.dayou.dto;
+
+import lombok.Builder;
+
+import java.time.LocalDate;
+
+/**
+ * 类说明:薪水结算DTO
+ *
+ * @author: wucl
+ * @since: 2023/3/13
+ * created with IntelliJ IDEA.
+ */
+@Builder
+public class SalarySettleDTO {
+
+    private LocalDate startDate;
+
+    private LocalDate endDate;
+
+    private Long userId;
+
+    private Integer month;
+
+}

+ 18 - 8
service/src/main/java/com/dayou/service/IItemBrokerageGeneralService.java

@@ -5,9 +5,13 @@ import com.dayou.entity.ItemBrokerageGeneral;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayou.entity.PaymentCollection;
 import com.dayou.vo.ItemStageVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
 /**
  * <p>
  * 项目提成总表 服务类
@@ -18,21 +22,21 @@ import org.springframework.web.multipart.MultipartFile;
  */
 public interface IItemBrokerageGeneralService extends IService<ItemBrokerageGeneral> {
 
-        Page<ItemBrokerageGeneral> selectPage(Page page,ItemBrokerageGeneral itemBrokerageGeneral);
+    Page<ItemBrokerageGeneral> selectPage(Page page,ItemBrokerageGeneral itemBrokerageGeneral);
 
-        ItemBrokerageGeneral detail(Long id);
+    ItemBrokerageGeneral detail(Long id);
 
-        Boolean add(ItemBrokerageGeneral itemBrokerageGeneral);
+    Boolean add(ItemBrokerageGeneral itemBrokerageGeneral);
 
-        Boolean update(ItemBrokerageGeneral itemBrokerageGeneral);
+    Boolean update(ItemBrokerageGeneral itemBrokerageGeneral);
 
-        Boolean delete(Long id);
+    Boolean delete(Long id);
 
-        void doCreateBrokerageGeneralAndDetail(BrokerageDetailBO bo);
+    void doCreateBrokerageGeneralAndDetail(BrokerageDetailBO bo);
 
-        void addMarketerBrokerage(Long id);
+    void addMarketerBrokerage(Long id);
 
-        void editMarketerBrokerage(ItemDTO itemDTO);
+    void editMarketerBrokerage(ItemDTO itemDTO);
 
     void removeMarketerBrokerage(Long itemId);
 
@@ -41,4 +45,10 @@ public interface IItemBrokerageGeneralService extends IService<ItemBrokerageGene
     void editParticipatorBrokerage(ItemStageVO itemStageVO);
 
     void removeParticipatorBrokerage(Long itemStageId);
+
+    void settleParticipatorBrokerage(Long itemId);
+
+    void settleMarketerBrokerage(PaymentCollection payment);
+
+    List<ItemBrokerageGeneral> settleAbleList();
 }

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

@@ -1,4 +1,5 @@
 package com.dayou.service;
+import com.dayou.dto.SalarySettleDTO;
 import com.dayou.entity.ItemBrokerageSequence;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -25,4 +26,6 @@ public interface IItemBrokerageSequenceService extends IService<ItemBrokerageSeq
 
         Boolean delete(Long id);
 
+        Boolean salarySettle();
+
 }

+ 3 - 0
service/src/main/java/com/dayou/service/IItemService.java

@@ -6,11 +6,14 @@ import com.dayou.entity.Item;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayou.entity.ItemBrokerageGeneral;
 import com.dayou.vo.ItemStatVO;
 import com.dayou.vo.ItemVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 import static com.dayou.enums.OperationTypeEnum.ADD;
 
 /**

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

@@ -32,4 +32,6 @@ public interface IItemStageService extends IService<ItemStage> {
     List<ItemStageVO> listByItemId(Long itemId);
 
     List<List<ItemStageVO>> stageList(ItemStageVO itemStageVO);
+
+    Boolean confirmation(Long stageId, Boolean overdue);
 }

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

@@ -1,6 +1,5 @@
 package com.dayou.service.impl;
 
-import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.dayou.bo.BrokerageDetailBO;
 import com.dayou.bo.LeaderRatioBO;
@@ -12,21 +11,25 @@ import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.brokerage.constants.BrokerageState;
 import com.dayou.common.BaseEntity;
 import com.dayou.dto.ItemDTO;
+import com.dayou.dto.ParticipantSettleDTO;
 import com.dayou.entity.*;
+import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.ItemBrokerageGeneralMapper;
 import com.dayou.mapper.ItemMapper;
 import com.dayou.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dayou.vo.ItemStageVO;
+import com.google.common.collect.Sets;
 import lombok.extern.slf4j.Slf4j;
-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;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 
+import java.awt.geom.Rectangle2D;
 import java.math.BigDecimal;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -62,8 +65,20 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     private ItemMapper itemMapper;
 
     @Autowired
+    private IItemService iItemService;
+
+    @Autowired
     private IUserService userService;
 
+    @Autowired
+    private IItemStageService itemStageService;
+
+    @Autowired
+    private IItemEvaluateService iItemEvaluateService;
+
+    @Autowired
+    private IPaymentCollectionService paymentCollectionService;
+
     @Override
     @SuppressWarnings("unchecked")
     public Page<ItemBrokerageGeneral> selectPage(Page page,ItemBrokerageGeneral itemBrokerageGeneral){
@@ -102,7 +117,6 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         BigDecimal paymentTarget = new BigDecimal(userTarget.getPaymentTarget());
         bo.setCurrentPayment(currentMonthPayment);
         bo.setPaymentTarget(paymentTarget);
-        bo.setItemBrokerageStatus(BrokerageState.NOT_START.getCode());
         Set<LeaderRatioBO> leaderRatioBO = userService.getLeaderRatioBO(userId).stream().filter(x->x.getRatio()!=null).collect(Collectors.toSet());
         bo = calculator.predictPersonalAmount(bo);
         //创建下单人领导提成记录
@@ -149,7 +163,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         ItemBrokerageDetail marketerDetail = iItemBrokerageDetailService.getOne(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId, general.getId()).eq(BaseEntity::getDeleted, Boolean.FALSE).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode()));
         if (general == null || marketerDetail == null){
             addMarketerBrokerage(itemDTO.getId());
-            log.info("非正常情况下,更新项目信息时创建了相关的提成记录");
+            log.info("更新项目信息时创建了相关的提成记录");
             return;
         }
 
@@ -199,7 +213,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
             if (general == null){
                 addMarketerBrokerage(itemStageVO.getItemId());
                 addParticipatorBrokerage(itemStageVO,brokerageStageId);
-                log.info("非正常情况下,更新项目信息时创建了相关的提成记录");
+                log.info("更新项目信息时创建了相关的提成记录");
                 return;
             }
             Set<ItemStageVO.ParticipatorWeight> participators = itemStageVO.getParticipators();
@@ -265,6 +279,68 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getBrokerageStageId,itemStageId));
     }
 
+    @Transactional
+    @Override
+    public void settleParticipatorBrokerage(Long itemId) {
+        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemId).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        List<ItemStage> stages = itemStageService.list(new LambdaQueryWrapper<ItemStage>().eq(ItemStage::getItemId, itemId));
+        ItemEvaluate settle = iItemEvaluateService.getOne(new LambdaQueryWrapper<ItemEvaluate>().eq(ItemEvaluate::getItemId, itemId).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        if (general!=null && CollectionUtils.isNotEmpty(stages) && settle!=null && settle.getWeight()!=null){
+            NonMarketerMarketerBrokerageCalculator calculator = (NonMarketerMarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(BrokerageRule.LAND_OTHER_RULE);
+            ParticipantSettleDTO participantSettle = ParticipantSettleDTO.builder().generalId(general.getId()).stages(stages).brokerageState(general.getStatus()).weight(settle.getWeight()).build();
+            List<ItemBrokerageDetail> itemBrokerageDetails = calculator.actualAmount(participantSettle);
+            iItemBrokerageDetailService.updateBatchById(itemBrokerageDetails);
+            //结算后更新总表参与人提成总金额
+            BigDecimal participatorActualTotalAmount = itemBrokerageDetails.stream().map(ItemBrokerageDetail::getActualAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+            general.setParticipantActualBrokerageAmount(participatorActualTotalAmount);
+            general.setParticipantAdvanceStatus(Boolean.FALSE);
+            general.setBrokerageActualAmount(participatorActualTotalAmount.add(general.getBrokerageActualAmount()));
+            if (general.getStatus().equals(BrokerageState.MARKETER_SETTLE.getCode())){
+                general.setStatus(BrokerageState.CLOSED.getCode());
+            }else {
+                general.setStatus(BrokerageState.PARTICIPANT_SETTLE.getCode());
+            }
+            this.updateById(general);
+        }else {
+            log.info(ErrorCode.BROKERAGE_SETTLE_FAILED.getErrorMsg()+"项目id:[{}]",itemId);
+        }
+
+    }
+
+    @Override
+    public void settleMarketerBrokerage(PaymentCollection payment) {
+        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, payment.getItemId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        Item item = iItemService.getById(payment.getItemId());
+        List<PaymentCollection> paymentList = paymentCollectionService.list(new LambdaQueryWrapper<PaymentCollection>()
+                .eq(PaymentCollection::getItemId, payment.getItemId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        BigDecimal payDone = BigDecimal.valueOf(paymentList.stream().mapToDouble(PaymentCollection::getAmount).sum());
+        brokerageCalculateSupport.checkItemBrokerageStatusOnMarketerSettle(general.getStatus());
+        if (item.getAmount()!=null && item.getAmount().compareTo(payDone)==0){
+            if (general.getStatus().equals(BrokerageState.PARTICIPANT_SETTLE.getCode())){
+                general.setStatus(BrokerageState.CLOSED.getCode());
+            }else {
+                general.setStatus(BrokerageState.MARKETER_SETTLE.getCode());
+            }
+            this.updateById(general);
+        }
+        log.info("还有未回款项,暂不执行客户经理提成结算。");
+    }
+
+    /**
+     * 获取当月可结算提成的项目
+     * @return
+     */
+    @Override
+    public List<ItemBrokerageGeneral> settleAbleList() {
+        // 获取当前时间节点项目提成状态为已结算的项目 ,包括 市场人和参与人员已结算和项目已结算
+        HashSet<String> status = Sets.newHashSet();
+        status.add(BrokerageState.MARKETER_SETTLE.getCode());
+        status.add(BrokerageState.PARTICIPANT_SETTLE.getCode());
+        status.add(BrokerageState.ITEM_SETTLE.getCode());
+        List<ItemBrokerageGeneral> ableSettleList = this.list(new LambdaQueryWrapper<ItemBrokerageGeneral>().in(ItemBrokerageGeneral::getStatus,status).eq(BaseEntity::getDeleted,Boolean.FALSE));
+        return ableSettleList;
+    }
+
     /**
      * 获取客户经理年回款目标
      * @param userId

+ 94 - 1
service/src/main/java/com/dayou/service/impl/ItemBrokerageSequenceServiceImpl.java

@@ -1,9 +1,18 @@
 package com.dayou.service.impl;
 
+import com.dayou.brokerage.constants.BrokerageBusiness;
+import com.dayou.brokerage.constants.BrokerageState;
+import com.dayou.common.BaseEntity;
+import com.dayou.dto.SalarySettleDTO;
+import com.dayou.entity.ItemBrokerageDetail;
+import com.dayou.entity.ItemBrokerageGeneral;
 import com.dayou.entity.ItemBrokerageSequence;
+import com.dayou.entity.ItemBrokerageSequenceDetail;
 import com.dayou.mapper.ItemBrokerageSequenceMapper;
-import com.dayou.service.IItemBrokerageSequenceService;
+import com.dayou.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.collections4.CollectionUtils;
+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;
@@ -19,8 +28,14 @@ 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.math.BigDecimal;
 import java.util.List;
 import java.util.ArrayList;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import org.springframework.transaction.annotation.Transactional;
 import com.dayou.enums.BatchTaskTypeEnum;
 
@@ -35,6 +50,17 @@ import com.dayou.enums.BatchTaskTypeEnum;
 @Service
 public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageSequenceMapper, ItemBrokerageSequence> implements IItemBrokerageSequenceService {
 
+    @Autowired
+    private IItemBrokerageSequenceDetailService brokerageSequenceDetailService;
+
+    @Autowired
+    private IItemService iItemService;
+
+    @Autowired
+    private IItemBrokerageGeneralService brokerageGeneralService;
+
+    @Autowired
+    private IItemBrokerageDetailService brokerageDetailService;
 
     @Override
     @SuppressWarnings("unchecked")
@@ -63,4 +89,71 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
         //逻辑删除
         return this.removeById(id);
     }
+
+    @Transactional
+    @Override
+    public Boolean salarySettle() {
+        List<ItemBrokerageGeneral> generals = brokerageGeneralService.settleAbleList();
+        Map<Long, ItemBrokerageGeneral> idGeneral = generals.stream().collect(Collectors.toMap(BaseEntity::getId, ItemBrokerageGeneral -> ItemBrokerageGeneral));
+        if (CollectionUtils.isNotEmpty(generals)){
+            Set<Long> generalIds = generals.stream().map(ItemBrokerageGeneral::getId).collect(Collectors.toSet());
+            List<ItemBrokerageDetail> settleDetails = brokerageDetailService.list(new LambdaQueryWrapper<ItemBrokerageDetail>()
+                    .in(ItemBrokerageDetail::getGeneralId, generalIds).eq(BaseEntity::getDeleted, Boolean.FALSE));
+            if (CollectionUtils.isNotEmpty(settleDetails)){
+                Set<ItemBrokerageSequenceDetail> sequenceDetails = settleDetails.stream().map(x -> {
+                    ItemBrokerageSequenceDetail sequenceDetail = new ItemBrokerageSequenceDetail();
+                    sequenceDetail.setBrokerageDetailId(x.getId());
+                    sequenceDetail.setUserId(x.getUserId());
+                    if (x.getAheadAmount() != null) {
+                        sequenceDetail.setBrokerageCate(BrokerageBusiness.AHEAD.getCode());
+                        sequenceDetail.setBrokerageAmount(x.getAheadAmount());
+                    } else {
+                        sequenceDetail.setBrokerageCate(BrokerageBusiness.SETTLE.getCode());
+                        sequenceDetail.setBrokerageAmount(x.getActualAmount());
+                    }
+                    return sequenceDetail;
+                }).collect(Collectors.toSet());
+
+                Map<Long, List<ItemBrokerageSequenceDetail>> collect = sequenceDetails.stream().collect(Collectors.groupingBy(ItemBrokerageSequenceDetail::getUserId));
+
+                for (Map.Entry<Long,List<ItemBrokerageSequenceDetail>> userSequence : collect.entrySet()){
+                    List<ItemBrokerageSequenceDetail> values = userSequence.getValue();
+                    BigDecimal userTotalAmount = values.stream().map(ItemBrokerageSequenceDetail::getBrokerageAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    //todo
+                    ItemBrokerageSequence sequence = ItemBrokerageSequence.builder().brokerageAmount(userTotalAmount).userId(userSequence.getKey()).remark("").embody("").build();
+                    this.save(sequence);
+                    values.stream().forEach(x->{x.setSequenceId(sequence.getId());});
+                    brokerageSequenceDetailService.saveBatch(values);
+                }
+
+                Map<Long, List<ItemBrokerageDetail>> itemDetails = settleDetails.stream().collect(Collectors.groupingBy(ItemBrokerageDetail::getGeneralId));
+
+                for (Map.Entry<Long,List<ItemBrokerageDetail>> itemDetail : itemDetails.entrySet()){
+                    BigDecimal gAheadTotal = BigDecimal.ZERO;
+                    BigDecimal gAdvanceTotal = BigDecimal.ZERO;
+                    for (ItemBrokerageDetail itemBrokerageDetail :itemDetail.getValue()){
+                        //如果预提金额不为空,且已结算金额为空
+                        if (itemBrokerageDetail.getAheadAmount().compareTo(BigDecimal.ZERO)!=0 && itemBrokerageDetail.getAdvanceAmount().compareTo(BigDecimal.ZERO) ==0) {
+                            gAheadTotal.add(itemBrokerageDetail.getAheadAmount());
+                            gAdvanceTotal.add(itemBrokerageDetail.getAheadAmount());
+                        }else if (itemBrokerageDetail.getAheadAmount().compareTo(BigDecimal.ZERO)!=0 && itemBrokerageDetail.getAdvanceAmount().compareTo(BigDecimal.ZERO) !=0){
+                            gAdvanceTotal.add(itemBrokerageDetail.getActualAmount());
+                        }else {
+                            continue;
+                        }
+                    }
+                    ItemBrokerageGeneral general = idGeneral.get(itemDetail.getKey());
+                    general.setMarketerAdvanceBrokerageDone(gAheadTotal.compareTo(BigDecimal.ZERO)!=0);
+                    general.setBrokerageActualAmount(gAdvanceTotal.add(gAheadTotal));
+                    if (gAheadTotal.compareTo(BigDecimal.ZERO)==0){
+                        //todo
+                        general.setStatus(BrokerageState.CLOSED.getCode());
+                    }
+                }
+                brokerageGeneralService.updateBatchById(generals);
+            }
+
+        }
+        return null;
+    }
 }

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

@@ -1,6 +1,10 @@
 package com.dayou.service.impl;
 
+import com.dayou.brokerage.annotation.DoBrokerage;
+import com.dayou.brokerage.constants.BrokerageBusiness;
+import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.entity.ItemEvaluate;
+import com.dayou.enums.OperationTypeEnum;
 import com.dayou.mapper.ItemEvaluateMapper;
 import com.dayou.service.IItemEvaluateService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -48,6 +52,7 @@ public class ItemEvaluateServiceImpl extends ServiceImpl<ItemEvaluateMapper, Ite
         return this.getById(id);
     }
 
+    @DoBrokerage(operation = OperationTypeEnum.EDIT,rule = BrokerageRule.LAND_OTHER_RULE ,business = BrokerageBusiness.SETTLE)
     @Override
     public Boolean add(ItemEvaluate itemEvaluate){
         return  this.save(itemEvaluate);

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

@@ -7,6 +7,7 @@ import com.dayou.brokerage.annotation.DoBrokerage;
 import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.dto.ItemDTO;
 import com.dayou.entity.Item;
+import com.dayou.entity.ItemBrokerageGeneral;
 import com.dayou.entity.ItemUser;
 import com.dayou.enums.ItemStateEnum;
 import com.dayou.enums.UnitEnum;
@@ -157,6 +158,7 @@ public class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements II
         return result;
     }
 
+
     /**
      * 获取项目状态
      * @param id 项目id

+ 9 - 0
service/src/main/java/com/dayou/service/impl/ItemStageServiceImpl.java

@@ -219,6 +219,15 @@ public class ItemStageServiceImpl extends ServiceImpl<ItemStageMapper, ItemStage
         return list;
     }
 
+    @Override
+    public Boolean confirmation(Long stageId, Boolean overdue) {
+        if (stageId!=null && overdue!=null){
+            boolean update = this.update(new LambdaUpdateWrapper<ItemStage>().eq(ItemStage::getId, stageId).set(ItemStage::getOverdue, overdue));
+            return update;
+        }
+        return Boolean.FALSE;
+    }
+
     /**
      * 递归排序
      */

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

@@ -1,7 +1,11 @@
 package com.dayou.service.impl;
 
+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.entity.PaymentCollection;
+import com.dayou.enums.OperationTypeEnum;
 import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.PaymentCollectionMapper;
 import com.dayou.service.IItemService;
@@ -64,6 +68,7 @@ public class PaymentCollectionServiceImpl extends ServiceImpl<PaymentCollectionM
         return this.getById(id);
     }
 
+    @DoBrokerage(operation = OperationTypeEnum.EDIT,rule = BrokerageRule.LAND_MARKETER_RULE,business = BrokerageBusiness.SETTLE)
     @Override
     public Boolean add(PaymentCollection paymentCollection){
         BigDecimal totalAmount = iItemService.getById(paymentCollection.getItemId()).getAmount();

+ 1 - 0
sql/brokerage_about.sql

@@ -1,6 +1,7 @@
 alter table item_stage add COLUMN weight double(16,2) DEFAULT NULL comment '提成权重';
 alter table item_stage add COLUMN coefficient double(16,2) DEFAULT NULL comment '逾期提成系数';
 alter table item_stage add COLUMN overdue bit(1) DEFAULT 0 comment '是否逾期';
+alter table item add COLUMN upload_date date DEFAULT null comment '合同上传日期';
 
 CREATE TABLE `brokerage_marketer_ratio` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',