Browse Source

项目提成业务代码

wucl 2 years ago
parent
commit
5b0668f65d
30 changed files with 350 additions and 157 deletions
  1. 1 0
      biz-base/src/main/java/com/dayou/controller/BrokerageBaseAmountController.java
  2. 1 3
      biz-base/src/main/java/com/dayou/controller/BrokerageMarketerRatioController.java
  3. 1 3
      biz-base/src/main/java/com/dayou/controller/GlobalConfigController.java
  4. 9 1
      biz-base/src/test/java/BrokerageTest.java
  5. 2 0
      common/src/main/java/com/dayou/exception/ErrorCode.java
  6. 4 2
      dao/src/main/resources/mapper/ItemBrokerageGeneralMapper.xml
  7. 0 1
      domain/src/main/java/com/dayou/entity/ItemBrokerageDetail.java
  8. 9 3
      domain/src/main/java/com/dayou/entity/ItemBrokerageGeneral.java
  9. 4 0
      domain/src/main/java/com/dayou/entity/ItemBrokerageSequence.java
  10. 10 0
      domain/src/main/java/com/dayou/entity/ItemBrokerageSequenceDetail.java
  11. 9 5
      service/src/main/java/com/dayou/bo/BrokerageDetailBO.java
  12. 2 2
      service/src/main/java/com/dayou/brokerage/BrokerageCalculateSupport.java
  13. 28 0
      service/src/main/java/com/dayou/brokerage/annotation/RefreshBrokerageDate.java
  14. 11 0
      service/src/main/java/com/dayou/brokerage/config/LandBrokerageDataConfiguration.java
  15. 4 2
      service/src/main/java/com/dayou/brokerage/constants/BrokerageBusiness.java
  16. 17 0
      service/src/main/java/com/dayou/brokerage/constants/BrokerageMsg.java
  17. 10 9
      service/src/main/java/com/dayou/brokerage/constants/BrokerageState.java
  18. 7 4
      service/src/main/java/com/dayou/brokerage/handler/LandMarketerBrokerageHandler.java
  19. 4 0
      service/src/main/java/com/dayou/brokerage/handler/LandNonMarketerBrokerageHandler.java
  20. 30 9
      service/src/main/java/com/dayou/brokerage/interceptor/BrokerageInterceptor.java
  21. 16 32
      service/src/main/java/com/dayou/brokerage/validator/BrokerageValidator.java
  22. 1 1
      service/src/main/java/com/dayou/dto/ParticipantSettleDTO.java
  23. 1 1
      service/src/main/java/com/dayou/service/IItemBrokerageGeneralService.java
  24. 6 1
      service/src/main/java/com/dayou/service/IItemBrokerageSequenceService.java
  25. 7 0
      service/src/main/java/com/dayou/service/impl/BrokerageBaseAmountServiceImpl.java
  26. 4 0
      service/src/main/java/com/dayou/service/impl/BrokerageMarketerRatioServiceImpl.java
  27. 2 0
      service/src/main/java/com/dayou/service/impl/GlobalConfigServiceImpl.java
  28. 26 37
      service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java
  29. 110 41
      service/src/main/java/com/dayou/service/impl/ItemBrokerageSequenceServiceImpl.java
  30. 14 0
      service/src/main/java/com/dayou/service/impl/ItemEvaluateServiceImpl.java

+ 1 - 0
biz-base/src/main/java/com/dayou/controller/BrokerageBaseAmountController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.brokerage.annotation.RefreshBrokerageDate;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;

+ 1 - 3
biz-base/src/main/java/com/dayou/controller/BrokerageMarketerRatioController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.brokerage.annotation.RefreshBrokerageDate;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,7 +56,6 @@ public class BrokerageMarketerRatioController extends BaseController {
     /**
      * 项目提成比例(市场人员)新增
      */
-    //todo 添加注解拦截更新操作,刷新BrokerageMarketerRatioSet Bean
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody BrokerageMarketerRatio brokerageMarketerRatio) {
         Boolean ret = brokerageMarketerRatioService.add(brokerageMarketerRatio);
@@ -65,7 +65,6 @@ public class BrokerageMarketerRatioController extends BaseController {
     /**
      * 项目提成比例(市场人员)更新
      */
-    //todo 添加注解拦截更新操作,刷新BrokerageMarketerRatioSet Bean
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody BrokerageMarketerRatio brokerageMarketerRatio) {
         Boolean ret = brokerageMarketerRatioService.update(brokerageMarketerRatio);
@@ -75,7 +74,6 @@ public class BrokerageMarketerRatioController extends BaseController {
     /**
      * 项目提成比例(市场人员)删除
      */
-    //todo 添加注解拦截更新操作,刷新BrokerageMarketerRatioSet Bean
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = brokerageMarketerRatioService.delete(id);

+ 1 - 3
biz-base/src/main/java/com/dayou/controller/GlobalConfigController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.brokerage.annotation.RefreshBrokerageDate;
 import com.dayou.utils.EnumFactory;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
@@ -58,7 +59,6 @@ public class GlobalConfigController extends BaseController {
     /**
      * 全局配置新增
      */
-    //todo 添加注解拦截更新操作,刷新BrokerageValidator Bean
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody GlobalConfig globalConfig) {
         Boolean ret = globalConfigService.add(globalConfig);
@@ -68,7 +68,6 @@ public class GlobalConfigController extends BaseController {
     /**
      * 全局配置更新
      */
-    //todo 添加注解拦截更新操作,刷新BrokerageValidator Bean
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody GlobalConfig globalConfig) {
         Boolean ret = globalConfigService.update(globalConfig);
@@ -78,7 +77,6 @@ public class GlobalConfigController extends BaseController {
     /**
      * 全局配置删除
      */
-    //todo 添加注解拦截更新操作,刷新BrokerageValidator Bean
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = globalConfigService.delete(id);

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

@@ -59,6 +59,9 @@ public class BrokerageTest {
     @Autowired
     private IUserService userService;
 
+    @Autowired
+    private IItemBrokerageSequenceService iItemBrokerageSequenceService;
+
     @Test
     public void testBrokerageValidator(){
         DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
@@ -68,7 +71,6 @@ public class BrokerageTest {
         System.out.println(brokerageValidator);
         globalConfigService.update(new LambdaUpdateWrapper<GlobalConfig>().eq(BaseEntity::getId,18).set(GlobalConfig::getValue,"100"));
         globalConfigService.update(new LambdaUpdateWrapper<GlobalConfig>().eq(BaseEntity::getId,17).set(GlobalConfig::getValue,"999"));
-        brokerageValidator.reloadBrokerageValidator();
         BrokerageValidator brokerageValidatorNew = defaultListableBeanFactory.getBean("brokerageValidator",BrokerageValidator.class);
         log.info("brokerageValidatorNew ===="+ brokerageMarketerRatioSet.monthOfYear.toPlainString());
         log.info("brokerageValidatorNew ===="+ brokerageMarketerRatioSet.nonMarketerMonthBrokerage.toPlainString());
@@ -110,4 +112,10 @@ public class BrokerageTest {
         Set<LeaderRatioBO> leaderRatioBO = userService.getLeaderRatioBO(129L);
         System.out.println(leaderRatioBO);
     }
+
+    @Test
+    public void testSettle(){
+        Boolean aBoolean = iItemBrokerageSequenceService.doAbleItemBrokerageSettle();
+        System.out.println(aBoolean);
+    }
 }

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

@@ -45,6 +45,8 @@ public class ErrorCode {
 
     public static final ErrorCode BROKERAGE_SETTLE_FAILED = ErrorCode("10020", "项目结算失败,请检查项目排期或提成权重。");
 
+    public static final ErrorCode ITEM_EVALUATE_ERROR = ErrorCode("10021", "当前项目仍有未确认是否逾期的阶段,请先确认后再评价。");
+
 
 
 

+ 4 - 2
dao/src/main/resources/mapper/ItemBrokerageGeneralMapper.xml

@@ -18,7 +18,8 @@
         <result column="brokerage_predict_amount" property="brokeragePredictAmount" />
         <result column="brokerage_actual_amount" property="brokerageActualAmount" />
         <result column="brokerage_rate" property="brokerageRate" />
-        <result column="status" property="status" />
+        <result column="participant_status" property="participantStatus" />
+        <result column="marketer_status" property="marketerStatus" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
@@ -27,6 +28,7 @@
         deleted,
         created,
         modified,
-        item_id, marketer_brokerage_amount, marketer_advance_brokerage_able, marketer_advance_brokerage_done, participant_predict_brokerage_amount, participant_actual_brokerage_amount, participant_advance_status, brokerage_predict_amount, brokerage_actual_amount, brokerage_rate, status
+        item_id, marketer_brokerage_amount, marketer_advance_brokerage_able, marketer_advance_brokerage_done, participant_predict_brokerage_amount, participant_actual_brokerage_amount, participant_advance_status, brokerage_predict_amount, brokerage_actual_amount, brokerage_rate,
+            participant_status,marketer_status
     </sql>
 </mapper>

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

@@ -67,5 +67,4 @@ public class ItemBrokerageDetail extends BaseEntity {
     private Long brokerageStageId;
 
 
-
 }

+ 9 - 3
domain/src/main/java/com/dayou/entity/ItemBrokerageGeneral.java

@@ -96,11 +96,17 @@ public class ItemBrokerageGeneral extends BaseEntity {
     private BigDecimal brokerageRate;
 
     /**
-     * 状态
+     * 参与人提成状态
      */
     @ImportCell
-    @ExportCell(columnName = "状态")
-    private String status;
+    @ExportCell(columnName = "参与人提成状态")
+    private String participantStatus;
 
+    /**
+     * 客户经理提成状态
+     */
+    @ImportCell
+    @ExportCell(columnName = "客户经理提成状态")
+    private String marketerStatus;
 
 }

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

@@ -49,5 +49,9 @@ public class ItemBrokerageSequence extends BaseEntity {
     @ExportCell(columnName = "备注")
     private String remark;
 
+    /**
+     * 结算类型(项目结算,默认预提)
+     */
+    private String cate;
 
 }

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

@@ -1,6 +1,9 @@
 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;
 import lombok.EqualsAndHashCode;
 import com.dayou.annotation.ExcelSheet;
@@ -17,6 +20,7 @@ import com.dayou.annotation.ImportCell;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ExcelSheet(sheetName = "提成流水明细表")
+@Builder
 public class ItemBrokerageSequenceDetail extends BaseEntity {
 
     private static final long serialVersionUID=1L;
@@ -50,5 +54,11 @@ public class ItemBrokerageSequenceDetail extends BaseEntity {
     @ExportCell(columnName = "提成类型(预提,结算)")
     private String brokerageCate;
 
+    /**
+     * 提成总表id
+     */
+    @TableField(exist = false)
+    private Long generalId;
+
 
 }

+ 9 - 5
service/src/main/java/com/dayou/bo/BrokerageDetailBO.java

@@ -27,11 +27,6 @@ public class BrokerageDetailBO extends ItemBrokerageDetail implements MergeKeyIn
     private Boolean marketerAdvanceBrokerageAble;
 
     /**
-     * 项目提成状态
-     */
-    private String itemBrokerageStatus;
-
-    /**
      * 本年回款目标金额
      */
     private BigDecimal paymentTarget;
@@ -76,6 +71,15 @@ public class BrokerageDetailBO extends ItemBrokerageDetail implements MergeKeyIn
      */
     private BigDecimal participantWeight;
 
+    /**
+     * 参与人提成状态
+     */
+    private String participantStatus;
+    /**
+     * 客户经理提成状态
+     */
+    private String marketerStatus;
+
     @Override
     public String mergeKey() {
         return this.cate +MERGE_SYMBOL+ this.businessSource;

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

@@ -90,14 +90,14 @@ public class BrokerageCalculateSupport implements BrokerageCalculateFactory,Brok
      * @param brokerageDetailBo
      * @return
      */
-    protected void checkMarketerPredictBrokerage(BrokerageDetailBO brokerageDetailBo){
+    protected Boolean checkMarketerPredictBrokerage(BrokerageDetailBO brokerageDetailBo){
         @NotNull
         BigDecimal paymentTarget = brokerageDetailBo.getPaymentTarget();
         BigDecimal avgMonthTarget = paymentTarget.divide(landBrokerageDataConfiguration.monthOfYear, 2, RoundingMode.HALF_UP);
         int month = DateUtils.getMonth(new Date());
         //当月应完成回款金额
         BigDecimal brokerageTarget = avgMonthTarget.multiply(new BigDecimal(month));
-        brokerageValidator.checkMarketerPredictBrokerage(brokerageDetailBo,brokerageTarget);
+        return brokerageValidator.checkMarketerPredictBrokerage(brokerageDetailBo,brokerageTarget);
     }
 
     /**

+ 28 - 0
service/src/main/java/com/dayou/brokerage/annotation/RefreshBrokerageDate.java

@@ -0,0 +1,28 @@
+package com.dayou.brokerage.annotation;
+
+
+import com.dayou.enums.CodeMsgEnumInterface;
+import com.dayou.enums.GlobalConfigEnum;
+
+import java.lang.annotation.*;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/3/14
+ * created with IntelliJ IDEA.
+ */
+@Target({ElementType.PARAMETER, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface RefreshBrokerageDate {
+
+    List<String> fields = Arrays.asList(GlobalConfigEnum.Finance.NON_MARKETER_MONTH_BROKERAGE.getCode(),
+                                                            GlobalConfigEnum.Finance.MARKETER_BROKERAGE_PERCENTAGE.getCode(),
+                                                            GlobalConfigEnum.Finance.PARTICIPANT_BROKERAGE_PERCENTAGE.getCode(),
+                                                            GlobalConfigEnum.Sys.MONTH_OF_YEAR.getCode() ) ;
+    boolean globalConfig() default false;
+}

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

@@ -1,6 +1,7 @@
 package com.dayou.brokerage.config;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.dayou.brokerage.validator.BrokerageValidator;
 import com.dayou.common.BaseEntity;
 import com.dayou.entity.BrokerageBaseAmount;
 import com.dayou.entity.BrokerageMarketerRatio;
@@ -10,6 +11,8 @@ import com.dayou.service.IBrokerageBaseAmountService;
 import com.dayou.service.IBrokerageMarketerRatioService;
 import com.dayou.service.IGlobalConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.support.DefaultListableBeanFactory;
+import org.springframework.context.ApplicationContext;
 
 import javax.annotation.Nullable;
 import java.math.BigDecimal;
@@ -30,6 +33,9 @@ public class LandBrokerageDataConfiguration extends BrokerageMarketerRatio imple
 
 
     @Autowired
+    private ApplicationContext applicationContext;
+
+    @Autowired
     private IBrokerageMarketerRatioService brokerageMarketerRatioService;
 
     @Autowired
@@ -60,6 +66,11 @@ public class LandBrokerageDataConfiguration extends BrokerageMarketerRatio imple
     @Nullable
     public BigDecimal participantBrokeragePercentage;
 
+    public void reloadLandBrokerageData(){
+        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
+        defaultListableBeanFactory.destroySingleton("landBrokerageDataConfiguration");
+        defaultListableBeanFactory.getBean("landBrokerageDataConfiguration", LandBrokerageDataConfiguration.class);
+    }
 
     public void loadRatioList(){
         List<BrokerageMarketerRatio> list = brokerageMarketerRatioService.list(new LambdaQueryWrapper<BrokerageMarketerRatio>()

+ 4 - 2
service/src/main/java/com/dayou/brokerage/constants/BrokerageBusiness.java

@@ -13,8 +13,10 @@ public enum BrokerageBusiness {
 
     ITEM_SETTLE("项目结算","ITEM_SETTLE"),
 
-    AHEAD("提成预提","ITEM_PREDICT"),
-    SETTLE("提成结算","ITEM_SETTLE");
+    DEFAULT_AHEAD("默认预提","DEFAULT_AHEAD"),
+
+    AHEAD("提成预提","AHEAD"),
+    SETTLE("提成结算","SETTLE");
 
     private String name;
 

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

@@ -0,0 +1,17 @@
+package com.dayou.brokerage.constants;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/3/14
+ * created with IntelliJ IDEA.
+ */
+public class BrokerageMsg {
+
+    public static final String BROKERAGE_SEQUENCE_REMARK = "系统每月23日零点自动结算项目提成,您上月可结算(包含预提)项目个数:[sum]个,提成奖励预计体现在[month]月薪资中体现.";
+
+    public static final String NON_MARKETER_BASE_SEQUENCE_REMARK = "非市场人员默认提成,此提成与项目暂不挂钩.若有项目结算将于固定提成抵扣.";
+
+    public static final String BROKERAGE_SEQUENCE_EMBODY = "[year-month]薪资";
+}

+ 10 - 9
service/src/main/java/com/dayou/brokerage/constants/BrokerageState.java

@@ -9,19 +9,20 @@ package com.dayou.brokerage.constants;
  */
 public enum BrokerageState {
 
+    //参与人提成状态
     NOT_START("未开始","NOT_START"),
+    PREDICTING("预提中","PREDICTING"),
 
-    NOT_SETTLE("待结算","NOT_SETTLE"),
-    PREDICTING("参与人预提中","PREDICTING"),
-    FREEZE("冻结","FREEZE"),
-
-    PARTICIPANT_SETTLE("参与人已结算","PARTICIPANT_SETTLE"),
+    //客户经理提成状态
+    TO_PREDICTING("待预提","TO_PREDICTING"),
+    PREDICTED("已预提","PREDICTED"),
 
-    MARKETER_SETTLE("客户经理已结算","MARKETER_SETTLE"),
+    NOT_PAYMENT("回款中","NOT_PAYMENT"),
 
-    ITEM_SETTLE("项目已结算","ITEM_SETTLE"),
-
-    CLOSED("提成已结算","CLOSED");
+    //公用状态
+    FREEZE("冻结","FREEZE"),
+    NOT_SETTLE("待结算","NOT_SETTLE"),
+    CLOSED("已结算","CLOSED");
     ;
 
     private String name;

+ 7 - 4
service/src/main/java/com/dayou/brokerage/handler/LandMarketerBrokerageHandler.java

@@ -7,6 +7,7 @@ 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.brokerage.constants.BrokerageState;
 import com.dayou.entity.ItemBrokerageDetail;
 import com.dayou.exception.BusinessException;
 import com.google.common.collect.Sets;
@@ -40,12 +41,14 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
         if (ratio !=null){
             checkItemBrokerageStatus(bo);
             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());
+                bo.setActualAmount(actualAmount(bo.getPredictAmount()));
+                bo.setMarketerAdvanceBrokerageAble(checkMarketerPredictBrokerage(bo));
+                if (checkMarketerPredictBrokerage(bo)){
+                    bo.setMarketerStatus(BrokerageState.TO_PREDICTING.getCode());
+                    bo.setAheadAmount(aheadAmount(bo.getPredictAmount()));
+                }
             } catch (BusinessException e) {
                 log.info("项目id:[{}],客户经理id:[{}],[{}]",bo.getId(),bo.getUserId(),e.getMessage());
             }

+ 4 - 0
service/src/main/java/com/dayou/brokerage/handler/LandNonMarketerBrokerageHandler.java

@@ -13,6 +13,7 @@ import com.dayou.dto.SalarySettleDTO;
 import com.dayou.entity.ItemBrokerageDetail;
 import com.dayou.entity.ItemStage;
 import com.dayou.service.IItemBrokerageDetailService;
+import com.dayou.service.IItemBrokerageSequenceService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -39,6 +40,9 @@ public class LandNonMarketerBrokerageHandler extends BrokerageCalculateSupport i
     @Autowired
     private IItemBrokerageDetailService brokerageDetailService;
 
+    @Autowired
+    private IItemBrokerageSequenceService brokerageSequenceService;
+
     @Override
     public ItemBrokerageDetail predictAmount(BrokerageDetailBO brokerageDetailBO) {
         checkItemBrokerageStatus(brokerageDetailBO);

+ 30 - 9
service/src/main/java/com/dayou/brokerage/interceptor/BrokerageInterceptor.java

@@ -1,10 +1,14 @@
 package com.dayou.brokerage.interceptor;
 
 import com.dayou.brokerage.annotation.DoBrokerage;
+import com.dayou.brokerage.annotation.RefreshBrokerageDate;
+import com.dayou.brokerage.config.LandBrokerageDataConfiguration;
 import com.dayou.brokerage.constants.BrokerageBusiness;
 import com.dayou.dto.ItemDTO;
+import com.dayou.entity.GlobalConfig;
 import com.dayou.entity.ItemEvaluate;
 import com.dayou.entity.PaymentCollection;
+import com.dayou.enums.CodeMsgEnumInterface;
 import com.dayou.enums.OperationTypeEnum;
 import com.dayou.mapper.ItemMapper;
 import com.dayou.service.IItemBrokerageGeneralService;
@@ -18,6 +22,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.lang.reflect.Method;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import static com.dayou.brokerage.constants.BrokerageBusiness.ITEM_SETTLE;
 import static com.dayou.brokerage.constants.BrokerageBusiness.SETTLE;
@@ -39,56 +45,71 @@ public class BrokerageInterceptor implements MethodInterceptor {
     @Autowired
     private IItemBrokerageGeneralService iItemBrokerageGeneralService;
 
+
     @Override
     public Object invoke(MethodInvocation methodInvocation) throws Throwable {
         Method method = methodInvocation.getMethod();
-        DoBrokerage annotation = method.getAnnotation(DoBrokerage.class);
+        DoBrokerage doBrokerageAnnotation = method.getAnnotation(DoBrokerage.class);
+        RefreshBrokerageDate refreshAnnotation = method.getAnnotation(RefreshBrokerageDate.class);
         Object result = methodInvocation.proceed();
-        if (annotation!=null && annotation.rule() == LAND_MARKETER_RULE && annotation.operation() == ADD){
+        if (refreshAnnotation !=null && refreshAnnotation.globalConfig()){
+            GlobalConfig config = (GlobalConfig) methodInvocation.getArguments()[0];
+            List<String> fields = refreshAnnotation.fields;
+            if (fields.contains(config.getField())){
+               // configuration.reloadLandBrokerageData();
+                return result;
+            }
+        }
+        if (refreshAnnotation !=null){
+            //configuration.reloadLandBrokerageData();
+            return result;
+        }
+
+        if (doBrokerageAnnotation!=null && doBrokerageAnnotation.rule() == LAND_MARKETER_RULE && doBrokerageAnnotation.operation() == ADD){
             if (result instanceof Long){
                 iItemBrokerageGeneralService.addMarketerBrokerage((Long) result);
                 log.info("created general and marketer detail,itemId[{}]", result);
             };
         }
-        if (annotation!=null && annotation.rule() == LAND_MARKETER_RULE && annotation.operation() == EDIT){
+        if (doBrokerageAnnotation!=null && doBrokerageAnnotation.rule() == LAND_MARKETER_RULE && doBrokerageAnnotation.operation() == EDIT){
             ItemDTO itemDTO = (ItemDTO) methodInvocation.getArguments()[0];
             iItemBrokerageGeneralService.editMarketerBrokerage(itemDTO);
             log.info("updated general and marketer detail,itemId[{}]", itemDTO.getId());
         }
-        if (annotation!=null && annotation.rule() == LAND_MARKETER_RULE && annotation.operation() == DELETE){
+        if (doBrokerageAnnotation!=null && doBrokerageAnnotation.rule() == LAND_MARKETER_RULE && doBrokerageAnnotation.operation() == DELETE){
             Long itemId = (Long) methodInvocation.getArguments()[0];
             iItemBrokerageGeneralService.removeMarketerBrokerage(itemId);
             log.info("deleted general and marketer and non-marketer detail,itemId[{}]", itemId);
         }
-        if (annotation!=null && annotation.rule() == LAND_OTHER_RULE && annotation.operation() == ADD){
+        if (doBrokerageAnnotation!=null && doBrokerageAnnotation.rule() == LAND_OTHER_RULE && doBrokerageAnnotation.operation() == ADD){
             if (result instanceof Long){
                 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 (doBrokerageAnnotation!=null && doBrokerageAnnotation.rule() == LAND_OTHER_RULE && doBrokerageAnnotation.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 (doBrokerageAnnotation!=null && doBrokerageAnnotation.rule() == LAND_OTHER_RULE && doBrokerageAnnotation.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 (doBrokerageAnnotation!=null && doBrokerageAnnotation.rule() == LAND_OTHER_RULE && doBrokerageAnnotation.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 (doBrokerageAnnotation!=null && doBrokerageAnnotation.rule() == LAND_MARKETER_RULE && doBrokerageAnnotation.business() == ITEM_SETTLE){
             if (result instanceof Boolean && (Boolean) result){
                 PaymentCollection payment = (PaymentCollection) methodInvocation.getArguments()[0];
                 iItemBrokerageGeneralService.settleMarketerBrokerage(payment);

+ 16 - 32
service/src/main/java/com/dayou/brokerage/validator/BrokerageValidator.java

@@ -8,6 +8,7 @@ import com.dayou.brokerage.constants.BrokerageState;
 import com.dayou.enums.GlobalConfigEnum;
 import com.dayou.exception.ErrorCode;
 import com.dayou.service.IGlobalConfigService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
 import org.springframework.context.ApplicationContext;
@@ -22,22 +23,16 @@ import java.math.BigDecimal;
  * @since: 2023/3/3
  * created with IntelliJ IDEA.
  */
+@Slf4j
 public class BrokerageValidator {
 
-    @Autowired
-    private ApplicationContext applicationContext;
-
-    //todo 通过切面实现校验器更新
-    public void reloadBrokerageValidator(){
-        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
-        defaultListableBeanFactory.destroySingleton("brokerageValidator");
-        defaultListableBeanFactory.getBean("brokerageValidator",BrokerageValidator.class);
-    }
     //校验客户经理对此单是否可以预提
-    public void checkMarketerPredictBrokerage(BrokerageDetailBO brokerageDetailBo, BigDecimal brokerageTarget){
+    public Boolean checkMarketerPredictBrokerage(BrokerageDetailBO brokerageDetailBo, BigDecimal brokerageTarget){
         if (brokerageDetailBo.getCurrentPayment().compareTo(brokerageTarget)== -1){
-            ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR2);
+            log.info(ErrorCode.BROKERAGE_ITEM_STATE_ERROR2.getErrorMsg());
+            return Boolean.FALSE;
         }
+        return Boolean.TRUE;
     }
 
     /**
@@ -47,35 +42,27 @@ public class BrokerageValidator {
     //校验项目提成状态
     public void checkItemBrokerageStatus(BrokerageDetailBO brokerageDetailBo){
         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())){
+            if (StrUtil.equals(BrokerageState.CLOSED.getCode(),brokerageDetailBo.getMarketerStatus()) ||
+                    StrUtil.equals(BrokerageState.FREEZE.getCode(),brokerageDetailBo.getMarketerStatus())){
                                     ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR);
             }
         }
 
         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);
+                if (StrUtil.equals(BrokerageState.NOT_START.getCode(),brokerageDetailBo.getParticipantStatus()) ||
+                    StrUtil.equals(BrokerageState.CLOSED.getCode(),brokerageDetailBo.getParticipantStatus()) ||
+                        StrUtil.equals(BrokerageState.FREEZE.getCode(),brokerageDetailBo.getParticipantStatus())){
+                            ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR);
                 }
         }
     }
 
     /**
      * 项目状态验证(结算非市场人员)
-     * @param brokerageStatus
+     * @param participantStatus
      */
-    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)){
+    public void checkItemBrokerageStatusOnParticipantSettle(String participantStatus){
+        if (!StrUtil.equals(BrokerageState.NOT_SETTLE.getCode(),participantStatus) ){
             ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR);
         }
     }
@@ -85,10 +72,7 @@ public class BrokerageValidator {
      * @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)){
+        if (!StrUtil.equals(BrokerageState.NOT_SETTLE.getCode(),brokerageStatus) && !StrUtil.equals(BrokerageState.TO_PREDICTING.getCode(),brokerageStatus)){
             ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR);
         }
     }

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

@@ -32,7 +32,7 @@ public class ParticipantSettleDTO {
      */
     private BigDecimal weight;
     /**
-     * 项目状态
+     * 参与人提成状态
      */
     private String brokerageState;
 

+ 1 - 1
service/src/main/java/com/dayou/service/IItemBrokerageGeneralService.java

@@ -50,5 +50,5 @@ public interface IItemBrokerageGeneralService extends IService<ItemBrokerageGene
 
     void settleMarketerBrokerage(PaymentCollection payment);
 
-    List<ItemBrokerageGeneral> settleAbleList();
+    List<ItemBrokerageGeneral> computedAbleList();
 }

+ 6 - 1
service/src/main/java/com/dayou/service/IItemBrokerageSequenceService.java

@@ -6,6 +6,9 @@ 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>
  * 项目提成流水 服务类
@@ -26,6 +29,8 @@ public interface IItemBrokerageSequenceService extends IService<ItemBrokerageSeq
 
         Boolean delete(Long id);
 
-        Boolean salarySettle();
+        Boolean doNonMarketerAheadSettle();
+
+        Boolean doAbleItemBrokerageSettle();
 
 }

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

@@ -1,5 +1,6 @@
 package com.dayou.service.impl;
 
+import com.dayou.brokerage.annotation.RefreshBrokerageDate;
 import com.dayou.entity.BrokerageBaseAmount;
 import com.dayou.mapper.BrokerageBaseAmountMapper;
 import com.dayou.service.IBrokerageBaseAmountService;
@@ -48,16 +49,22 @@ public class BrokerageBaseAmountServiceImpl extends ServiceImpl<BrokerageBaseAmo
         return this.getById(id);
     }
 
+    @RefreshBrokerageDate
+
     @Override
     public Boolean add(BrokerageBaseAmount brokerageBaseAmount){
         return  this.save(brokerageBaseAmount);
     }
 
+    @RefreshBrokerageDate
+
     @Override
     public Boolean update(BrokerageBaseAmount brokerageBaseAmount){
         return  this.updateById(brokerageBaseAmount);
     }
 
+    @RefreshBrokerageDate
+
     @Override
     public Boolean delete(Long id){
         //逻辑删除

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

@@ -1,5 +1,6 @@
 package com.dayou.service.impl;
 
+import com.dayou.brokerage.annotation.RefreshBrokerageDate;
 import com.dayou.entity.BrokerageMarketerRatio;
 import com.dayou.mapper.BrokerageMarketerRatioMapper;
 import com.dayou.service.IBrokerageMarketerRatioService;
@@ -48,16 +49,19 @@ public class BrokerageMarketerRatioServiceImpl extends ServiceImpl<BrokerageMark
         return this.getById(id);
     }
 
+    @RefreshBrokerageDate
     @Override
     public Boolean add(BrokerageMarketerRatio brokerageMarketerRatio){
         return  this.save(brokerageMarketerRatio);
     }
 
+    @RefreshBrokerageDate
     @Override
     public Boolean update(BrokerageMarketerRatio brokerageMarketerRatio){
         return  this.updateById(brokerageMarketerRatio);
     }
 
+    @RefreshBrokerageDate
     @Override
     public Boolean delete(Long id){
         //逻辑删除

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

@@ -1,6 +1,7 @@
 package com.dayou.service.impl;
 
 import cn.hutool.core.util.StrUtil;
+import com.dayou.brokerage.annotation.RefreshBrokerageDate;
 import com.dayou.common.BaseEntity;
 import com.dayou.entity.GlobalConfig;
 import com.dayou.enums.CodeMsgEnumInterface;
@@ -73,6 +74,7 @@ public class GlobalConfigServiceImpl extends ServiceImpl<GlobalConfigMapper, Glo
         return this.update(globalConfig);
     }
 
+    @RefreshBrokerageDate(globalConfig = true)
     @Override
     public Boolean update(GlobalConfig globalConfig){
         return  this.updateById(globalConfig);

+ 26 - 37
service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java

@@ -14,8 +14,7 @@ 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.mapper.*;
 import com.dayou.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dayou.vo.ItemStageVO;
@@ -27,7 +26,6 @@ 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;
@@ -62,22 +60,19 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     private IMarketStatService marketStatService;
 
     @Autowired
-    private ItemMapper itemMapper;
-
-    @Autowired
-    private IItemService iItemService;
+    private IUserService userService;
 
     @Autowired
-    private IUserService userService;
+    private ItemMapper itemMapper;
 
     @Autowired
-    private IItemStageService itemStageService;
+    private ItemStageMapper itemStageMapper;
 
     @Autowired
-    private IItemEvaluateService iItemEvaluateService;
+    private ItemEvaluateMapper itemEvaluateMapper;
 
     @Autowired
-    private IPaymentCollectionService paymentCollectionService;
+    private PaymentCollectionMapper paymentCollectionMapper;
 
     @Override
     @SuppressWarnings("unchecked")
@@ -131,6 +126,8 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
                 .participantPredictBrokerageAmount(BigDecimal.ZERO)
                 .brokeragePredictAmount(bo.getPredictAmount().add(leaderPredictTotalAmount))
                 .brokerageActualAmount(BigDecimal.ZERO)
+                .participantStatus(BrokerageState.NOT_START.getCode())
+                .marketerStatus(bo.getMarketerStatus())
                 .brokerageRate(bo.getRate()).build();
         this.save(general);
         brokerageLeaderDetailBOS.add(bo);
@@ -148,6 +145,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
             brokerageDetailBO.setPredictAmount(BigDecimal.ZERO);
             brokerageDetailBO.setActualAmount(BigDecimal.ZERO);
             brokerageDetailBO.setAheadAmount(BigDecimal.ZERO);
+            brokerageDetailBO.setMarketerStatus(BrokerageState.NOT_PAYMENT.getCode());
             brokerageDetailBO.setUserId(item.getUserId());
             this.doCreateBrokerageGeneralAndDetail(brokerageDetailBO);
         }else {
@@ -238,11 +236,11 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
             //创建参与人的项目提成详情
             iItemBrokerageDetailService.saveBatch(participatorBrokerageDetails);
             //更新项目提成总表信息
-            general.setParticipantPredictBrokerageAmount(participatorPredictTotalAmount);
+            general.setParticipantPredictBrokerageAmount(participatorPredictTotalAmount.add(general.getParticipantPredictBrokerageAmount()));
             general.setParticipantAdvanceStatus(Boolean.TRUE);
-            general.setBrokeragePredictAmount(general.getMarketerBrokerageAmount().add(participatorPredictTotalAmount));
+            general.setBrokeragePredictAmount(general.getMarketerBrokerageAmount().add(general.getParticipantPredictBrokerageAmount()));
             general.setParticipantActualBrokerageAmount(BigDecimal.ZERO);
-            general.setStatus(BrokerageState.PREDICTING.getCode());
+            general.setParticipantStatus(BrokerageState.PREDICTING.getCode());
 
             this.updateById(general);
 
@@ -283,11 +281,11 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     @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));
+        List<ItemStage> stages = itemStageMapper.selectList(new LambdaQueryWrapper<ItemStage>().eq(ItemStage::getItemId, itemId));
+        ItemEvaluate settle = itemEvaluateMapper.selectOne(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();
+            ParticipantSettleDTO participantSettle = ParticipantSettleDTO.builder().generalId(general.getId()).stages(stages).brokerageState(general.getParticipantStatus()).weight(settle.getWeight()).build();
             List<ItemBrokerageDetail> itemBrokerageDetails = calculator.actualAmount(participantSettle);
             iItemBrokerageDetailService.updateBatchById(itemBrokerageDetails);
             //结算后更新总表参与人提成总金额
@@ -295,11 +293,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
             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());
-            }
+            general.setParticipantStatus(BrokerageState.CLOSED.getCode());
             this.updateById(general);
         }else {
             log.info(ErrorCode.BROKERAGE_SETTLE_FAILED.getErrorMsg()+"项目id:[{}]",itemId);
@@ -310,34 +304,29 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     @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>()
+        Item item = itemMapper.selectById(payment.getItemId());
+        List<PaymentCollection> paymentList = paymentCollectionMapper.selectList(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());
+        brokerageCalculateSupport.checkItemBrokerageStatusOnMarketerSettle(general.getMarketerStatus());
         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());
-            }
+            general.setMarketerStatus(BrokerageState.NOT_SETTLE.getCode());
             this.updateById(general);
         }
         log.info("还有未回款项,暂不执行客户经理提成结算。");
     }
 
     /**
-     * 获取当月可结算提成的项目
+     * 获取计算提成的项目 (待预提,待结算)
      * @return
      */
     @Override
-    public List<ItemBrokerageGeneral> settleAbleList() {
-        // 获取当前时间节点项目提成状态为已结算的项目 ,包括 市场人和参与人员已结算和项目已结算
+    public List<ItemBrokerageGeneral> computedAbleList() {
         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));
+        status.add(BrokerageState.TO_PREDICTING.getCode());
+        status.add(BrokerageState.NOT_SETTLE.getCode());
+        List<ItemBrokerageGeneral> ableSettleList = this.list(new LambdaQueryWrapper<ItemBrokerageGeneral>().in(ItemBrokerageGeneral::getMarketerStatus,status)
+                .or().eq(ItemBrokerageGeneral::getParticipantStatus,BrokerageState.NOT_SETTLE.getCode()));
         return ableSettleList;
     }
 

+ 110 - 41
service/src/main/java/com/dayou/service/impl/ItemBrokerageSequenceServiceImpl.java

@@ -1,7 +1,13 @@
 package com.dayou.service.impl;
 
+import com.dayou.brokerage.BrokerageCalculateSupport;
+import com.dayou.brokerage.NonMarketerMarketerBrokerageCalculator;
+import com.dayou.brokerage.config.LandBrokerageDataConfiguration;
 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.factory.BrokerageCalculateFactory;
 import com.dayou.common.BaseEntity;
 import com.dayou.dto.SalarySettleDTO;
 import com.dayou.entity.ItemBrokerageDetail;
@@ -11,6 +17,8 @@ import com.dayou.entity.ItemBrokerageSequenceDetail;
 import com.dayou.mapper.ItemBrokerageSequenceMapper;
 import com.dayou.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayou.utils.DateUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -30,15 +38,16 @@ 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.time.LocalDate;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 import org.springframework.transaction.annotation.Transactional;
 import com.dayou.enums.BatchTaskTypeEnum;
 
+import static com.dayou.brokerage.constants.BrokerageMsg.*;
+
 /**
  * <p>
  * 项目提成流水 服务实现类
@@ -47,6 +56,7 @@ import com.dayou.enums.BatchTaskTypeEnum;
  * @author wucl
  * @since 2023-03-03
  */
+@Slf4j
 @Service
 public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageSequenceMapper, ItemBrokerageSequence> implements IItemBrokerageSequenceService {
 
@@ -54,14 +64,14 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
     private IItemBrokerageSequenceDetailService brokerageSequenceDetailService;
 
     @Autowired
-    private IItemService iItemService;
-
-    @Autowired
     private IItemBrokerageGeneralService brokerageGeneralService;
 
     @Autowired
     private IItemBrokerageDetailService brokerageDetailService;
 
+    @Autowired
+    private LandBrokerageDataConfiguration landBrokerageDataConfiguration;
+
     @Override
     @SuppressWarnings("unchecked")
     public Page<ItemBrokerageSequence> selectPage(Page page,ItemBrokerageSequence itemBrokerageSequence){
@@ -90,70 +100,129 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
         return this.removeById(id);
     }
 
+    /**
+     * 非市场人员固定预提结算
+     * @return
+     */
+    @Override
+    public Boolean doNonMarketerAheadSettle() {
+        ConcurrentHashMap<Long, BigDecimal> nonMarketerAheadAmounts = landBrokerageDataConfiguration.userBaseBrokerageAmounts;
+        Date now = new Date();
+        int year = DateUtils.getYear(now);
+        int month = DateUtils.getMonth(now);
+        List<ItemBrokerageSequence> sequences = new ArrayList<>();
+        for (Map.Entry<Long,BigDecimal> nonMarketerAheadAmount : nonMarketerAheadAmounts.entrySet()){
+            ItemBrokerageSequence sequence = ItemBrokerageSequence.builder()
+                    .brokerageAmount(nonMarketerAheadAmount.getValue())
+                    .userId(nonMarketerAheadAmount.getKey())
+                    .cate(BrokerageBusiness.DEFAULT_AHEAD.getCode())
+                    .embody(BROKERAGE_SEQUENCE_EMBODY.replace("year-month",year+"-"+(month+1))).remark(NON_MARKETER_BASE_SEQUENCE_REMARK).build();
+            sequences.add(sequence);
+        }
+        return this.saveBatch(sequences);
+    }
+
+    /**
+     * 结算可结算的项目提成
+     * @return
+     */
     @Transactional
     @Override
-    public Boolean salarySettle() {
-        List<ItemBrokerageGeneral> generals = brokerageGeneralService.settleAbleList();
+    public synchronized Boolean  doAbleItemBrokerageSettle() {
+        List<ItemBrokerageGeneral> generals = brokerageGeneralService.computedAbleList();
         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));
+            List<ItemBrokerageDetail> toUpdateItemBrokerageDetails = new ArrayList<>();
             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());
+                    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());
+                        toUpdateItemBrokerageDetails.add(x);
+                        return sequenceDetail;
+                    }else if (general.getMarketerStatus().equals(BrokerageState.NOT_SETTLE.getCode()) && x.getBrokerageRule().equals(BrokerageRule.LAND_MARKETER_RULE.getCode())) {
+                        //减去已预提金额
+                        BigDecimal actualAmount = x.getActualAmount();
+                        if (general.getMarketerAdvanceBrokerageDone()){
+                            actualAmount = x.getActualAmount().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);
+                        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());
+                        toUpdateItemBrokerageDetails.add(x);
+                        return sequenceDetail;
+                    }else {
+                        return null;
                     }
-                    return sequenceDetail;
                 }).collect(Collectors.toSet());
 
-                Map<Long, List<ItemBrokerageSequenceDetail>> collect = sequenceDetails.stream().collect(Collectors.groupingBy(ItemBrokerageSequenceDetail::getUserId));
-
+                Map<Long, List<ItemBrokerageSequenceDetail>> collect = sequenceDetails.stream().filter(x->x!=null).collect(Collectors.groupingBy(ItemBrokerageSequenceDetail::getUserId));
+                Date now = new Date();
+                int year = DateUtils.getYear(now);
+                int month = DateUtils.getMonth(now);
                 for (Map.Entry<Long,List<ItemBrokerageSequenceDetail>> userSequence : collect.entrySet()){
                     List<ItemBrokerageSequenceDetail> values = userSequence.getValue();
+                    Set<Long> itemSize = values.stream().map(ItemBrokerageSequenceDetail::getGeneralId).collect(Collectors.toSet());
                     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();
+                    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("year-month",year+"-"+(month+1))).build();
                     this.save(sequence);
                     values.stream().forEach(x->{x.setSequenceId(sequence.getId());});
                     brokerageSequenceDetailService.saveBatch(values);
                 }
+                brokerageDetailService.updateBatchById(toUpdateItemBrokerageDetails);
 
-                Map<Long, List<ItemBrokerageDetail>> itemDetails = settleDetails.stream().collect(Collectors.groupingBy(ItemBrokerageDetail::getGeneralId));
+                Map<Long, List<ItemBrokerageSequenceDetail>> sequenceDetailByGeneral = sequenceDetails.stream().filter(x->x!=null).collect(Collectors.groupingBy(ItemBrokerageSequenceDetail::getGeneralId));
 
-                for (Map.Entry<Long,List<ItemBrokerageDetail>> itemDetail : itemDetails.entrySet()){
+                for (Map.Entry<Long,List<ItemBrokerageSequenceDetail>> sequence : sequenceDetailByGeneral.entrySet()){
                     BigDecimal gAheadTotal = BigDecimal.ZERO;
                     BigDecimal gAdvanceTotal = BigDecimal.ZERO;
-                    for (ItemBrokerageDetail itemBrokerageDetail :itemDetail.getValue()){
+                    ItemBrokerageGeneral general = idGeneral.get(sequence.getKey());
+                    for (ItemBrokerageSequenceDetail sequenceDetail :sequence.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;
+                        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.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());
                         }
                     }
-                    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());
+                    general.setBrokerageActualAmount(gAdvanceTotal.add(gAheadTotal).add(general.getBrokerageActualAmount()));
+
+                    if (general.getMarketerStatus().equals(BrokerageState.TO_PREDICTING.getCode())){
+                        general.setMarketerStatus(BrokerageState.PREDICTED.getCode());
+                        general.setMarketerAdvanceBrokerageDone(Boolean.TRUE);
+                    }
+                    if (general.getMarketerStatus().equals(BrokerageState.NOT_SETTLE.getCode())){
+                        general.setMarketerStatus(BrokerageState.CLOSED.getCode());
+                    }
+                    if (general.getParticipantStatus().equals(BrokerageState.NOT_SETTLE.getCode())){
+                        general.setParticipantStatus(BrokerageState.CLOSED.getCode());
+                        general.setParticipantAdvanceStatus(Boolean.FALSE);
                     }
                 }
-                brokerageGeneralService.updateBatchById(generals);
+                log.info("结算完成.");
+                return brokerageGeneralService.updateBatchById(generals);
             }
 
         }
-        return null;
+        log.info("当前暂无可结算的项目");
+        return Boolean.FALSE;
     }
 }

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

@@ -1,13 +1,18 @@
 package com.dayou.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 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.entity.ItemStage;
 import com.dayou.enums.OperationTypeEnum;
+import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.ItemEvaluateMapper;
 import com.dayou.service.IItemEvaluateService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayou.service.IItemStageService;
+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;
@@ -28,6 +33,8 @@ import java.util.ArrayList;
 import org.springframework.transaction.annotation.Transactional;
 import com.dayou.enums.BatchTaskTypeEnum;
 
+import static com.dayou.exception.ErrorCode.ITEM_EVALUATE_ERROR;
+
 /**
  * <p>
  * 项目完结评价表 服务实现类
@@ -40,6 +47,9 @@ import com.dayou.enums.BatchTaskTypeEnum;
 public class ItemEvaluateServiceImpl extends ServiceImpl<ItemEvaluateMapper, ItemEvaluate> implements IItemEvaluateService {
 
 
+    @Autowired
+    private IItemStageService itemStageService;
+
     @Override
     @SuppressWarnings("unchecked")
     public Page<ItemEvaluate> selectPage(Page page,ItemEvaluate itemEvaluate){
@@ -55,6 +65,10 @@ public class ItemEvaluateServiceImpl extends ServiceImpl<ItemEvaluateMapper, Ite
     @DoBrokerage(operation = OperationTypeEnum.EDIT,rule = BrokerageRule.LAND_OTHER_RULE ,business = BrokerageBusiness.SETTLE)
     @Override
     public Boolean add(ItemEvaluate itemEvaluate){
+        List<ItemStage> stages = itemStageService.list(new LambdaQueryWrapper<ItemStage>().eq(ItemStage::getItemId, itemEvaluate.getItemId()).isNull(ItemStage::getOverdue));
+        if (CollectionUtils.isNotEmpty(stages)){
+            ErrorCode.throwBusinessException(ITEM_EVALUATE_ERROR);
+        }
         return  this.save(itemEvaluate);
     }