wucl 2 роки тому
батько
коміт
eb8bd4ba25
25 змінених файлів з 411 додано та 160 видалено
  1. 3 3
      biz-base/src/main/java/com/dayou/controller/ItemStageController.java
  2. 2 1
      dao/src/main/resources/mapper/ItemBrokerageDetailMapper.xml
  3. 5 0
      domain/src/main/java/com/dayou/entity/ItemBrokerageDetail.java
  4. 6 3
      domain/src/main/java/com/dayou/entity/ItemStageUser.java
  5. 10 1
      domain/src/main/java/com/dayou/vo/ItemStageVO.java
  6. 29 7
      service/src/main/java/com/dayou/brokerage/BrokerageCalculateSupport.java
  7. 2 6
      service/src/main/java/com/dayou/brokerage/BrokerageCalculator.java
  8. 29 0
      service/src/main/java/com/dayou/brokerage/MarketerBrokerageCalculator.java
  9. 0 24
      service/src/main/java/com/dayou/brokerage/NonMarketerBrokerageCalculator.java
  10. 34 0
      service/src/main/java/com/dayou/brokerage/NonMarketerMarketerBrokerageCalculator.java
  11. 2 2
      service/src/main/java/com/dayou/brokerage/annotation/DoBrokerage.java
  12. 1 2
      service/src/main/java/com/dayou/brokerage/config/BrokerageConfig.java
  13. 1 1
      service/src/main/java/com/dayou/brokerage/config/BrokerageMarketerRatioSet.java
  14. 2 2
      service/src/main/java/com/dayou/brokerage/constants/BrokerageRule.java
  15. 3 2
      service/src/main/java/com/dayou/brokerage/Factory/BrokerageCalculateFactory.java
  16. 9 12
      service/src/main/java/com/dayou/brokerage/handler/MarketerBrokerageHandler.java
  17. 63 0
      service/src/main/java/com/dayou/brokerage/handler/LandNonMarketerBrokerageHandler.java
  18. 31 8
      service/src/main/java/com/dayou/brokerage/interceptor/BrokerageInterceptor.java
  19. 11 1
      service/src/main/java/com/dayou/service/IItemBrokerageGeneralService.java
  20. 6 1
      service/src/main/java/com/dayou/service/IItemService.java
  21. 1 1
      service/src/main/java/com/dayou/service/IItemStageService.java
  22. 8 19
      service/src/main/java/com/dayou/service/impl/ItemBrokerageDetailServiceImpl.java
  23. 124 36
      service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java
  24. 7 17
      service/src/main/java/com/dayou/service/impl/ItemServiceImpl.java
  25. 22 11
      service/src/main/java/com/dayou/service/impl/ItemStageServiceImpl.java

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

@@ -63,9 +63,9 @@ public class ItemStageController extends BaseController {
      */
     @OperLog(title = "新增项目阶段")
     @PostMapping("")
-    public RestResponse<Boolean> save(@RequestBody @Valid  ItemStage itemStage) {
-        Boolean ret = itemStageService.add(itemStage);
-        return RestResponse.data(ret);
+    public RestResponse<Long> save(@RequestBody @Valid  ItemStageVO itemStageVO) {
+        Long ret = itemStageService.add(itemStageVO);
+        return RestResponse.success(ret);
     }
 
     /**

+ 2 - 1
dao/src/main/resources/mapper/ItemBrokerageDetailMapper.xml

@@ -15,6 +15,7 @@
         <result column="advance_amount" property="advanceAmount" />
         <result column="brokerage_rule" property="brokerageRule" />
         <result column="brokerage_mode" property="brokerageMode" />
+        <result column="brokerage_stage_id" property="brokerageStageId" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
@@ -23,7 +24,7 @@
         deleted,
         created,
         modified,
-        general_id, user_id, predict_amount, actual_amount, advance_amount, brokerage_rule, brokerage_mode
+        general_id, user_id, predict_amount, actual_amount, advance_amount, brokerage_rule, brokerage_mode,brokerage_stage_id
     </sql>
 
 </mapper>

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

@@ -67,5 +67,10 @@ public class ItemBrokerageDetail extends BaseEntity {
     @ExportCell(columnName = "提成方式")
     private String brokerageMode;
 
+    /**
+     * 项目提成阶段id(非市场人员用)
+     */
+    private Long brokerageStageId;
+
 
 }

+ 6 - 3
domain/src/main/java/com/dayou/entity/ItemStageUser.java

@@ -1,10 +1,14 @@
 package com.dayou.entity;
 import com.dayou.common.BaseEntity;
+import lombok.Builder;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import com.dayou.annotation.ExcelSheet;
 import com.dayou.annotation.ExportCell;
 import com.dayou.annotation.ImportCell;
+
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 项目人员阶段参与表
@@ -16,6 +20,7 @@ import com.dayou.annotation.ImportCell;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ExcelSheet(sheetName = "项目人员阶段参与表")
+@Builder
 public class ItemStageUser extends BaseEntity {
 
     private static final long serialVersionUID=1L;
@@ -38,9 +43,7 @@ public class ItemStageUser extends BaseEntity {
     /**
      * 提成比例
      */
-    @ImportCell
-    @ExportCell(columnName = "提成比例")
-    private Double weight;
+    private BigDecimal weight;
 
 
 }

+ 10 - 1
domain/src/main/java/com/dayou/vo/ItemStageVO.java

@@ -3,6 +3,7 @@ package com.dayou.vo;
 import com.dayou.entity.ItemStage;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Set;
 
@@ -25,8 +26,16 @@ public class ItemStageVO extends ItemStage {
 
     private String itemName;
 
-    private Set<Long> userIds;
+    private Set<ParticipatorWeight> participators;
 
     private List<Long> departmentIds;
 
+    @Data
+    public static class ParticipatorWeight{
+
+        private Long userId;
+
+        private BigDecimal weight;
+    }
+
 }

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

@@ -1,13 +1,16 @@
 package com.dayou.brokerage;
 
 import com.dayou.bo.BrokerageDetailBO;
-import com.dayou.brokerage.Factory.BrokerageCalculateFactory;
+import com.dayou.brokerage.factory.BrokerageCalculateFactory;
 import com.dayou.brokerage.constants.BrokerageRule;
-import com.dayou.brokerage.handler.MarketerBrokerageHandler;
+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.utils.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
 
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
@@ -21,21 +24,27 @@ import java.util.Date;
  * @since: 2023/3/3
  * created with IntelliJ IDEA.
  */
-public abstract class BrokerageCalculateSupport implements BrokerageCalculator ,BrokerageCalculateFactory {
+@Component
+public class BrokerageCalculateSupport implements BrokerageCalculateFactory,BrokerageCalculator{
 
     @Autowired
     private BrokerageValidator brokerageValidator;
 
     @Autowired
-    private MarketerBrokerageHandler marketerBrokerageHandler;
+    @Qualifier("landMarketerBrokerageHandler")
+    private LandMarketerBrokerageHandler landMarketerBrokerageHandler;
+
+    @Autowired
+    @Qualifier("landNonMarketerBrokerageHandler")
+    private LandNonMarketerBrokerageHandler landNonMarketerBrokerageHandler;
 
     @Override
     public BrokerageCalculator getCalculator(BrokerageRule rule){
         switch (rule){
             case LAND_MARKETER_RULE:
-                return marketerBrokerageHandler;
+                return landMarketerBrokerageHandler;
             case LAND_OTHER_RULE:
-                return null;
+                return landNonMarketerBrokerageHandler;
         }
         return null;
     }
@@ -63,5 +72,18 @@ public abstract class BrokerageCalculateSupport implements BrokerageCalculator ,
         brokerageValidator.checkMarketerPredictBrokerage(brokerageDetailBo,brokerageTarget);
     }
 
-    public abstract BrokerageDetailBO predictAmount(BrokerageDetailBO brokerageDetailBo);
+    @Override
+    public BigDecimal actualAmount(ItemDTO itemDTO) {
+        return null;
+    }
+
+    @Override
+    public BigDecimal advanceAmount() {
+        return null;
+    }
+
+    @Override
+    public BigDecimal residueAmount() {
+        return null;
+    }
 }

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

@@ -1,7 +1,7 @@
 package com.dayou.brokerage;
 
 import com.dayou.bo.BrokerageDetailBO;
-import com.dayou.brokerage.Factory.BrokerageCalculateFactory;
+import com.dayou.brokerage.factory.BrokerageCalculateFactory;
 import com.dayou.dto.ItemDTO;
 
 import java.math.BigDecimal;
@@ -10,15 +10,11 @@ import java.math.BigDecimal;
  * 类说明:
  *
  * @author: wucl
- * @since: 2023/3/3
+ * @since: 2023/3/8
  * created with IntelliJ IDEA.
  */
 public interface BrokerageCalculator extends BrokerageCalculateFactory {
 
-    /**
-     * 预估提成金额
-     */
-    BrokerageDetailBO predictAmount(BrokerageDetailBO bo);
 
     /**
      * 实际提成金额

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

@@ -0,0 +1,29 @@
+package com.dayou.brokerage;
+
+import com.dayou.bo.BrokerageDetailBO;
+import com.dayou.brokerage.factory.BrokerageCalculateFactory;
+import com.dayou.dto.ItemDTO;
+
+import java.math.BigDecimal;
+
+/**
+ * 类说明:市场人员提成计算器接口
+ *
+ * @author: wucl
+ * @since: 2023/3/3
+ * created with IntelliJ IDEA.
+ */
+public interface MarketerBrokerageCalculator extends BrokerageCalculator {
+
+    /**
+     * 预估提成金额(个人计算)
+     */
+    BrokerageDetailBO predictPersonalAmount(BrokerageDetailBO bo);
+
+    /**
+     * 预估提成金额(团队抽成计算)
+     */
+    BrokerageDetailBO predictTeamShareAmount(BrokerageDetailBO bo);
+
+
+}

+ 0 - 24
service/src/main/java/com/dayou/brokerage/NonMarketerBrokerageCalculator.java

@@ -1,24 +0,0 @@
-package com.dayou.brokerage;
-
-import java.math.BigDecimal;
-
-/**
- * 类说明:
- *
- * @author: wucl
- * @since: 2023/3/6
- * created with IntelliJ IDEA.
- */
-public interface NonMarketerBrokerageCalculator extends BrokerageCalculator{
-
-    /**
-     * 预提金额总和
-     */
-    BigDecimal advanceTotalAmount();
-
-    /**
-     * 预提次数
-     * @return
-     */
-    int advanceTimes();
-}

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

@@ -0,0 +1,34 @@
+package com.dayou.brokerage;
+
+import com.dayou.bo.BrokerageDetailBO;
+import com.dayou.entity.ItemBrokerageDetail;
+
+import java.math.BigDecimal;
+
+/**
+ * 类说明:非市场人员提成计算器接口
+ *
+ * @author: wucl
+ * @since: 2023/3/6
+ * created with IntelliJ IDEA.
+ */
+public interface NonMarketerMarketerBrokerageCalculator extends BrokerageCalculator  {
+
+    /**
+     * 预估提成金额
+     * @param bo
+     * @return
+     */
+    ItemBrokerageDetail predictAmount(BrokerageDetailBO bo);
+
+    /**
+     * 预提金额总和
+     */
+    BigDecimal advanceTotalAmount();
+
+    /**
+     * 预提次数
+     * @return
+     */
+    int advanceTimes();
+}

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

@@ -18,8 +18,8 @@ import java.lang.annotation.*;
 @Documented
 public @interface DoBrokerage {
 
-    OperationTypeEnum operation() ;
+    OperationTypeEnum operation();
 
-    BrokerageRule  rule();
+    BrokerageRule rule() default BrokerageRule.NULL;
 
 }

+ 1 - 2
service/src/main/java/com/dayou/brokerage/config/BrokerageConfig.java

@@ -2,7 +2,6 @@ package com.dayou.brokerage.config;
 
 import com.dayou.brokerage.interceptor.BrokerageInterceptor;
 import com.dayou.brokerage.validator.BrokerageValidator;
-import com.dayou.service.IItemService;
 import org.springframework.aop.aspectj.AspectJExpressionPointcut;
 import org.springframework.aop.support.DefaultPointcutAdvisor;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -10,7 +9,7 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 /**
- * 类说明:
+ * 类说明:提成逻辑相关配置类
  *
  * @author: wucl
  * @since: 2023/3/3

+ 1 - 1
service/src/main/java/com/dayou/brokerage/config/BrokerageMarketerRatioSet.java

@@ -15,7 +15,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import static com.dayou.common.Constants.MERGE_SYMBOL;
 
 /**
- * 类说明:
+ * 类说明:市场人员提成系数表
  *
  * @author: wucl
  * @since: 2023/3/6

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

@@ -10,8 +10,8 @@ package com.dayou.brokerage.constants;
 public enum BrokerageRule {
 
     LAND_MARKETER_RULE("土地规划部市场人员规则","LAND_MARKETER_RULE"),
-    LAND_OTHER_RULE("土地规划部参与人员规则","LAND_OTHER_RULE")
-
+    LAND_OTHER_RULE("土地规划部参与人员规则","LAND_OTHER_RULE"),
+    NULL("NULL","NULL")
     ;
 
     private String name;

+ 3 - 2
service/src/main/java/com/dayou/brokerage/Factory/BrokerageCalculateFactory.java

@@ -1,10 +1,11 @@
-package com.dayou.brokerage.Factory;
+package com.dayou.brokerage.factory;
 
 import com.dayou.brokerage.BrokerageCalculator;
+import com.dayou.brokerage.MarketerBrokerageCalculator;
 import com.dayou.brokerage.constants.BrokerageRule;
 
 /**
- * 类说明:
+ * 类说明:提成计算器抽象工厂
  *
  * @author: wucl
  * @since: 2023/3/6

+ 9 - 12
service/src/main/java/com/dayou/brokerage/handler/MarketerBrokerageHandler.java

@@ -2,11 +2,8 @@ package com.dayou.brokerage.handler;
 
 import com.dayou.bo.BrokerageDetailBO;
 import com.dayou.brokerage.BrokerageCalculateSupport;
-import com.dayou.brokerage.BrokerageCalculator;
-import com.dayou.brokerage.Factory.BrokerageCalculateFactory;
+import com.dayou.brokerage.MarketerBrokerageCalculator;
 import com.dayou.brokerage.config.BrokerageMarketerRatioSet;
-import com.dayou.brokerage.constants.BrokerageMode;
-import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.dto.ItemDTO;
 import com.dayou.exception.BusinessException;
 import lombok.extern.slf4j.Slf4j;
@@ -16,7 +13,7 @@ import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
 
 /**
- * 类说明:
+ * 类说明:土地规划部市场人员提成计算处理器
  *
  * @author: wucl
  * @since: 2023/3/6
@@ -24,20 +21,15 @@ import java.math.BigDecimal;
  */
 @Component
 @Slf4j
-public class MarketerBrokerageHandler extends BrokerageCalculateSupport implements BrokerageCalculator{
+public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport implements MarketerBrokerageCalculator {
 
     @Autowired
     private BrokerageMarketerRatioSet brokerageMarketerRatioSet;
 
     @Override
-    public BrokerageDetailBO predictAmount(BrokerageDetailBO bo) {
+    public BrokerageDetailBO predictPersonalAmount(BrokerageDetailBO bo) {
         String mergeKey = bo.mergeKey();
         BigDecimal ratio = brokerageMarketerRatioSet.getRatioList().get(mergeKey);
-        bo.setBrokerageRule(BrokerageRule.LAND_MARKETER_RULE.getCode());
-        bo.setBrokerageMode(BrokerageMode.PERSONAL.getCode());
-        bo.setAdvanceAmount(BigDecimal.ZERO);
-        bo.setPredictAmount(BigDecimal.ZERO);
-        bo.setActualAmount(BigDecimal.ZERO);
         bo.setRate(ratio);
         if (bo.getAmount()!=null && ratio !=null){
             checkItemBrokerageStatus(bo);
@@ -59,6 +51,11 @@ public class MarketerBrokerageHandler extends BrokerageCalculateSupport implemen
     }
 
     @Override
+    public BrokerageDetailBO predictTeamShareAmount(BrokerageDetailBO bo) {
+        return null;
+    }
+
+    @Override
     public BigDecimal actualAmount(ItemDTO itemDTO) {
         return null;
     }

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

@@ -0,0 +1,63 @@
+package com.dayou.brokerage.handler;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.dayou.bo.BrokerageDetailBO;
+import com.dayou.brokerage.BrokerageCalculateSupport;
+import com.dayou.brokerage.NonMarketerMarketerBrokerageCalculator;
+import com.dayou.brokerage.validator.BrokerageValidator;
+import com.dayou.dto.ItemDTO;
+import com.dayou.entity.ItemBrokerageDetail;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+
+/**
+ * 类说明:土地规划部 非 市场人员提成计算处理器
+ *
+ * @author: wucl
+ * @since: 2023/3/8
+ * created with IntelliJ IDEA.
+ */
+@Component
+@Slf4j
+public class LandNonMarketerBrokerageHandler extends BrokerageCalculateSupport implements NonMarketerMarketerBrokerageCalculator {
+
+    @Autowired
+    private BrokerageValidator brokerageValidator;
+    @Override
+    public ItemBrokerageDetail predictAmount(BrokerageDetailBO brokerageDetailBO) {
+        brokerageValidator.checkItemBrokerageStatus(brokerageDetailBO);
+        //todo 非市场人与对一个项目的金额
+        ItemBrokerageDetail itemBrokerageDetail = new ItemBrokerageDetail();
+        brokerageDetailBO.setPredictAmount(brokerageValidator.nonMarketerMonthBrokerage);
+        BeanUtil.copyProperties(brokerageDetailBO,itemBrokerageDetail);
+        return itemBrokerageDetail;
+    }
+
+    @Override
+    public BigDecimal actualAmount(ItemDTO itemDTO) {
+        return null;
+    }
+
+    @Override
+    public BigDecimal advanceAmount() {
+        return null;
+    }
+
+    @Override
+    public BigDecimal residueAmount() {
+        return null;
+    }
+
+    @Override
+    public BigDecimal advanceTotalAmount() {
+        return null;
+    }
+
+    @Override
+    public int advanceTimes() {
+        return 0;
+    }
+}

+ 31 - 8
service/src/main/java/com/dayou/brokerage/interceptor/BrokerageInterceptor.java

@@ -1,10 +1,13 @@
 package com.dayou.brokerage.interceptor;
 
 import com.dayou.brokerage.annotation.DoBrokerage;
-import com.dayou.brokerage.constants.BrokerageRule;
+import com.dayou.dto.ItemDTO;
+import com.dayou.enums.OperationTypeEnum;
+import com.dayou.mapper.ItemMapper;
 import com.dayou.service.IItemBrokerageGeneralService;
 import com.dayou.service.IItemService;
-import lombok.Setter;
+import com.dayou.service.IItemStageService;
+import com.dayou.vo.ItemStageVO;
 import lombok.extern.slf4j.Slf4j;
 import org.aopalliance.intercept.MethodInterceptor;
 import org.aopalliance.intercept.MethodInvocation;
@@ -14,9 +17,11 @@ import org.springframework.stereotype.Component;
 import java.lang.reflect.Method;
 
 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.*;
 
 /**
- * 类说明:
+ * 类说明:提成切面
  *
  * @author: wucl
  * @since: 2023/3/7
@@ -26,20 +31,38 @@ import static com.dayou.brokerage.constants.BrokerageRule.LAND_MARKETER_RULE;
 @Component
 public class BrokerageInterceptor implements MethodInterceptor {
 
-    //注入service Bean 后,拦截该bean中的方法失效。
-    private IItemService iItemService;
+    @Autowired
+    private IItemBrokerageGeneralService iItemBrokerageGeneralService;
 
     @Override
     public Object invoke(MethodInvocation methodInvocation) throws Throwable {
         Method method = methodInvocation.getMethod();
         DoBrokerage annotation = method.getAnnotation(DoBrokerage.class);
         Object result = methodInvocation.proceed();
-        if (annotation!=null && annotation.rule() == LAND_MARKETER_RULE){
+        if (annotation!=null && annotation.rule() == LAND_MARKETER_RULE && annotation.operation() == ADD){
             if (result instanceof Long){
-                iItemService.createBrokerageGeneral((Long) result);
-                log.info("created marketer brokerage general and detail");
+                iItemBrokerageGeneralService.addMarketerBrokerage((Long) result);
+                log.info("created general and marketer detail,itemId[{}]", result);
             };
         }
+        if (annotation!=null && annotation.rule() == LAND_MARKETER_RULE && annotation.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.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 (result instanceof Long){
+                ItemStageVO itemStageVO = (ItemStageVO) methodInvocation.getArguments()[0];
+                iItemBrokerageGeneralService.addParticipatorBrokerage(itemStageVO,(Long) result);
+                log.info("created participator detail,itemId[{}]", itemStageVO.getItemId());
+            };
+
+        }
         return result;
     }
 }

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

@@ -1,9 +1,11 @@
 package com.dayou.service;
 import com.dayou.bo.BrokerageDetailBO;
+import com.dayou.dto.ItemDTO;
 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.vo.ItemStageVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
 /**
@@ -26,5 +28,13 @@ public interface IItemBrokerageGeneralService extends IService<ItemBrokerageGene
 
         Boolean delete(Long id);
 
-        void doCreateBrokerageGeneral(BrokerageDetailBO bo);
+        void doCreateBrokerageGeneralAndDetail(BrokerageDetailBO bo);
+
+        void addMarketerBrokerage(Long id);
+
+        void editMarketerBrokerage(ItemDTO itemDTO);
+
+    void removeMarketerBrokerage(Long itemId);
+
+    void addParticipatorBrokerage(ItemStageVO itemStageVO,Long brokerageStageId);
 }

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

@@ -1,4 +1,6 @@
 package com.dayou.service;
+import com.dayou.brokerage.annotation.DoBrokerage;
+import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.dto.ItemDTO;
 import com.dayou.entity.Item;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -8,6 +10,9 @@ import com.dayou.vo.ItemStatVO;
 import com.dayou.vo.ItemVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
+
+import static com.dayou.enums.OperationTypeEnum.ADD;
+
 /**
  * <p>
  * 项目信息表 服务类
@@ -32,5 +37,5 @@ public interface IItemService extends IService<Item> {
 
         Page<ItemVO> xSelectPage(Page page, ItemDTO item);
 
-        void createBrokerageGeneral(Long id);
+
 }

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

@@ -23,7 +23,7 @@ public interface IItemStageService extends IService<ItemStage> {
 
         ItemStage detail(Long id);
 
-        Boolean add(ItemStage itemStage);
+    Long add(ItemStageVO itemStageVO);
 
         Boolean update(ItemStage itemStage);
 

+ 8 - 19
service/src/main/java/com/dayou/service/impl/ItemBrokerageDetailServiceImpl.java

@@ -1,7 +1,9 @@
 package com.dayou.service.impl;
 
+import com.dayou.brokerage.BrokerageCalculateSupport;
 import com.dayou.brokerage.BrokerageCalculator;
-import com.dayou.brokerage.Factory.BrokerageCalculateFactory;
+import com.dayou.brokerage.MarketerBrokerageCalculator;
+import com.dayou.brokerage.factory.BrokerageCalculateFactory;
 import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.dto.ItemDTO;
 import com.dayou.entity.ItemBrokerageDetail;
@@ -10,24 +12,8 @@ import com.dayou.service.IItemBrokerageDetailService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.dayou.utils.ExcelUtil;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.springframework.web.multipart.MultipartFile;
-import java.util.List;
-import java.util.ArrayList;
-import org.springframework.transaction.annotation.Transactional;
-import com.dayou.enums.BatchTaskTypeEnum;
 
 /**
  * <p>
@@ -42,7 +28,8 @@ public class ItemBrokerageDetailServiceImpl extends ServiceImpl<ItemBrokerageDet
 
 
     @Autowired
-    private BrokerageCalculateFactory brokerageCalculateFactory;
+    private BrokerageCalculateSupport brokerageCalculateSupport;
+
     @Override
     @SuppressWarnings("unchecked")
     public Page<ItemBrokerageDetail> selectPage(Page page,ItemBrokerageDetail itemBrokerageDetail){
@@ -73,7 +60,9 @@ public class ItemBrokerageDetailServiceImpl extends ServiceImpl<ItemBrokerageDet
 
     @Override
     public Boolean crateBrokerageDetail(ItemDTO itemDTO) {
-        BrokerageCalculator calculator = brokerageCalculateFactory.getCalculator(BrokerageRule.LAND_MARKETER_RULE);
+        BrokerageCalculator calculator = brokerageCalculateSupport.getCalculator(BrokerageRule.LAND_MARKETER_RULE);
         return null;
     }
+
+
 }

+ 124 - 36
service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java

@@ -3,41 +3,33 @@ package com.dayou.service.impl;
 import com.dayou.bo.BrokerageDetailBO;
 import com.dayou.brokerage.BrokerageCalculateSupport;
 import com.dayou.brokerage.BrokerageCalculator;
+import com.dayou.brokerage.MarketerBrokerageCalculator;
+import com.dayou.brokerage.NonMarketerMarketerBrokerageCalculator;
+import com.dayou.brokerage.constants.BrokerageMode;
 import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.brokerage.constants.BrokerageState;
-import com.dayou.entity.ItemBrokerageGeneral;
-import com.dayou.entity.PaymentCollection;
-import com.dayou.entity.UserTarget;
-import com.dayou.exception.BusinessException;
+import com.dayou.brokerage.factory.BrokerageCalculateFactory;
+import com.dayou.common.BaseEntity;
+import com.dayou.dto.ItemDTO;
+import com.dayou.entity.*;
 import com.dayou.mapper.ItemBrokerageGeneralMapper;
-import com.dayou.service.IItemBrokerageDetailService;
-import com.dayou.service.IItemBrokerageGeneralService;
+import com.dayou.mapper.ItemMapper;
+import com.dayou.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.dayou.service.IMarketStatService;
-import com.dayou.service.IUserTargetService;
+import com.dayou.vo.ItemStageVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.dayou.utils.ExcelUtil;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.math.BigDecimal;
-import java.util.List;
-import java.util.ArrayList;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import org.springframework.transaction.annotation.Transactional;
-import com.dayou.enums.BatchTaskTypeEnum;
 
 /**
  * <p>
@@ -53,7 +45,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
 
 
     @Autowired
-    private BrokerageCalculator brokerageCalculator;
+    private BrokerageCalculateSupport brokerageCalculateSupport;
 
     @Autowired
     private IUserTargetService userTargetService;
@@ -64,6 +56,9 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     @Autowired
     private IMarketStatService marketStatService;
 
+    @Autowired
+    private ItemMapper itemMapper;
+
     @Override
     @SuppressWarnings("unchecked")
     public Page<ItemBrokerageGeneral> selectPage(Page page,ItemBrokerageGeneral itemBrokerageGeneral){
@@ -94,26 +89,18 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
 
     @Transactional
     @Override
-    public void doCreateBrokerageGeneral(BrokerageDetailBO bo) {
-        BrokerageCalculator calculator = brokerageCalculator.getCalculator(BrokerageRule.LAND_MARKETER_RULE);
-
+    public void doCreateBrokerageGeneralAndDetail(BrokerageDetailBO bo) {
+        MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(BrokerageRule.LAND_MARKETER_RULE);
         Long userId = bo.getUserId();
-        UserTarget userTarget = userTargetService.getOne(new LambdaQueryWrapper<UserTarget>().eq(UserTarget::getUserId,userId));
-        if (userTarget==null || userTarget.getPaymentTarget()==null){
-            userTarget = new UserTarget();
-            userTarget.setPaymentTarget(0d);
-            log.info("客户经理id[{}]未设置年回款目标。",userId);
-        }
-
+        UserTarget userTarget = getUserTarget(userId);
         BigDecimal currentMonthPayment = marketStatService.currentMonthPayment(userId);
         BigDecimal paymentTarget = new BigDecimal(userTarget.getPaymentTarget());
         bo.setCurrentPayment(currentMonthPayment);
         bo.setPaymentTarget(paymentTarget);
         bo.setItemBrokerageStatus(BrokerageState.NOT_START.getCode());
-
-        bo = calculator.predictAmount(bo);
+        bo = calculator.predictPersonalAmount(bo);
         ItemBrokerageGeneral general = ItemBrokerageGeneral.builder()
-                .itemId(bo.getId())
+                .itemId(bo.getItemId())
                 .marketerBrokerageAmount(bo.getPredictAmount())
                 .marketerAdvanceBrokerageAble(bo.getMarketerAdvanceBrokerageAble())
                 .brokeragePredictAmount(bo.getPredictAmount())
@@ -123,4 +110,105 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         bo.setGeneralId(general.getId());
         iItemBrokerageDetailService.save(bo);
     }
+    @Override
+    public void addMarketerBrokerage(Long id) {
+        Item item = itemMapper.selectById(id);
+        BrokerageDetailBO brokerageDetailBO = BrokerageDetailBO.builder().amount(item.getAmount()).cate(item.getCate()).businessSource(item.getBusinessSource()).itemId(id).build();
+        brokerageDetailBO.setBrokerageRule(BrokerageRule.LAND_MARKETER_RULE.getCode());
+        brokerageDetailBO.setBrokerageMode(BrokerageMode.PERSONAL.getCode());
+        brokerageDetailBO.setAdvanceAmount(BigDecimal.ZERO);
+        brokerageDetailBO.setPredictAmount(BigDecimal.ZERO);
+        brokerageDetailBO.setActualAmount(BigDecimal.ZERO);
+        brokerageDetailBO.setUserId(item.getUserId());
+        this.doCreateBrokerageGeneralAndDetail(brokerageDetailBO);
+    }
+
+    @Transactional
+    @Override
+    public void editMarketerBrokerage(ItemDTO itemDTO) {
+        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemDTO.getId()).eq(BaseEntity::getDeleted,Boolean.FALSE));
+        if (general == null){
+            addMarketerBrokerage(itemDTO.getId());
+            log.info("非正常情况下,更新项目信息时创建了相关的提成记录");
+            return;
+        }
+        ItemBrokerageDetail marketerDetail = iItemBrokerageDetailService.getOne(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId, general.getId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(BrokerageRule.LAND_MARKETER_RULE);
+        UserTarget userTarget = getUserTarget(marketerDetail.getUserId());
+        BigDecimal currentMonthPayment = marketStatService.currentMonthPayment(marketerDetail.getUserId());
+        BigDecimal paymentTarget = new BigDecimal(userTarget.getPaymentTarget());
+        BrokerageDetailBO brokerageDetailBO = BrokerageDetailBO.builder().amount(itemDTO.getAmount()).cate(itemDTO.getCate()).businessSource(itemDTO.getBusinessSource()).itemId(itemDTO.getId()).paymentTarget(paymentTarget).currentPayment(currentMonthPayment).build();
+        brokerageDetailBO.setUserId(marketerDetail.getUserId());
+        brokerageDetailBO.setId(marketerDetail.getId());
+        brokerageDetailBO = calculator.predictPersonalAmount(brokerageDetailBO);
+        iItemBrokerageDetailService.update(brokerageDetailBO);
+        general.setMarketerBrokerageAmount(brokerageDetailBO.getPredictAmount());
+        general.setMarketerAdvanceBrokerageAble(brokerageDetailBO.getMarketerAdvanceBrokerageAble());
+        general.setBrokerageRate(brokerageDetailBO.getRate());
+        general.setBrokeragePredictAmount(brokerageDetailBO.getPredictAmount().add(general.getParticipantPredictBrokerageAmount()));
+        this.update(general);
+    }
+
+    @Transactional
+    @Override
+    public void removeMarketerBrokerage(Long itemId) {
+        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemId));
+        this.removeById(general.getId());
+        iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId,general.getId()));
+    }
+
+    @Transactional
+    @Override
+    public void addParticipatorBrokerage(ItemStageVO itemStageVO,Long brokerageStageId) {
+        NonMarketerMarketerBrokerageCalculator calculator = (NonMarketerMarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(BrokerageRule.LAND_OTHER_RULE);
+        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemStageVO.getItemId()));
+        if (general == null){
+            addMarketerBrokerage(itemStageVO.getItemId());
+            addParticipatorBrokerage(itemStageVO,brokerageStageId);
+            log.info("非正常情况下,更新项目信息时创建了相关的提成记录");
+            return;
+        }
+        Set<ItemStageVO.ParticipatorWeight> participators = itemStageVO.getParticipators();
+        Set<ItemBrokerageDetail> participatorBrokerageDetails = participators.stream().map(x -> {
+            BrokerageDetailBO brokerageDetailBO = BrokerageDetailBO.builder().build();
+            brokerageDetailBO.setBrokerageRule(BrokerageRule.LAND_OTHER_RULE.getCode());
+            brokerageDetailBO.setBrokerageMode(BrokerageMode.PERSONAL.getCode());
+            brokerageDetailBO.setAdvanceAmount(BigDecimal.ZERO);
+            brokerageDetailBO.setPredictAmount(BigDecimal.ZERO);
+            brokerageDetailBO.setActualAmount(BigDecimal.ZERO);
+            brokerageDetailBO.setUserId(x.getUserId());
+            brokerageDetailBO.setGeneralId(general.getId());
+            brokerageDetailBO.setBrokerageStageId(brokerageStageId);
+            ItemBrokerageDetail itemBrokerageDetail = calculator.predictAmount(brokerageDetailBO);
+            return itemBrokerageDetail;
+        }).collect(Collectors.toSet());
+        BigDecimal participatorPredictTotalAmount = participatorBrokerageDetails.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        //创建参与人的项目提成详情
+        iItemBrokerageDetailService.saveBatch(participatorBrokerageDetails);
+        //更新项目提成总表信息
+        general.setParticipantPredictBrokerageAmount(participatorPredictTotalAmount);
+        general.setParticipantAdvanceStatus(Boolean.TRUE);
+        general.setBrokeragePredictAmount(general.getBrokeragePredictAmount().add(participatorPredictTotalAmount));
+        general.setStatus(BrokerageState.PREDICTING.getCode());
+
+        this.updateById(general);
+
+
+    }
+
+    /**
+     * 获取客户经理年回款目标
+     * @param userId
+     * @return
+     */
+    private UserTarget getUserTarget(Long userId) {
+        UserTarget userTarget = userTargetService.getOne(new LambdaQueryWrapper<UserTarget>().eq(UserTarget::getUserId, userId));
+        if (userTarget==null || userTarget.getPaymentTarget()==null){
+            userTarget = new UserTarget();
+            userTarget.setPaymentTarget(0d);
+            log.info("客户经理id[{}]未设置年回款目标。", userId);
+        }
+        return userTarget;
+    }
 }

+ 7 - 17
service/src/main/java/com/dayou/service/impl/ItemServiceImpl.java

@@ -10,6 +10,7 @@ import com.dayou.entity.Item;
 import com.dayou.entity.ItemUser;
 import com.dayou.enums.ItemStateEnum;
 import com.dayou.enums.UnitEnum;
+import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.ItemMapper;
 import com.dayou.service.IItemBrokerageGeneralService;
 import com.dayou.service.IItemService;
@@ -34,7 +35,7 @@ import java.util.stream.Collectors;
 
 import org.springframework.transaction.annotation.Transactional;
 
-import static com.dayou.enums.OperationTypeEnum.ADD;
+import static com.dayou.enums.OperationTypeEnum.*;
 
 /**
  * <p>
@@ -56,9 +57,6 @@ public class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements II
     @Autowired
     private IItemStageService itemStageService;
 
-    @Autowired
-    private IItemBrokerageGeneralService iItemBrokerageGeneralService;
-
     @Override
     @SuppressWarnings("unchecked")
     public Page<ItemVO> selectPage(Page page, ItemDTO item){
@@ -108,7 +106,11 @@ public class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements II
 
     @Transactional
     @Override
+    @DoBrokerage(operation = EDIT,rule = BrokerageRule.LAND_MARKETER_RULE)
     public Boolean update(ItemDTO itemDTO){
+        if (itemDTO.getId()==null){
+            ErrorCode.throwBusinessException(ErrorCode.PARAM_ERROR);
+        }
         this.updateById(itemDTO);
         Set<Long> userIds = itemDTO.getUserIds();
         iItemUserService.remove(new LambdaQueryWrapper<ItemUser>().eq(ItemUser::getItemId,itemDTO.getId()));
@@ -122,6 +124,7 @@ public class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements II
     }
 
     @Override
+    @DoBrokerage(operation = DELETE)
     public Boolean delete(Long id){
         //逻辑删除
         return this.removeById(id);
@@ -154,19 +157,6 @@ public class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements II
         return result;
     }
 
-    @Override
-    public void createBrokerageGeneral(Long id) {
-        Item item = this.getById(id);
-        BrokerageDetailBO brokerageDetailBO = BrokerageDetailBO.builder()
-                .amount(item.getAmount())
-                .cate(item.getCate())
-                .businessSource(item.getBusinessSource())
-                .itemId(id)
-                .build();
-        brokerageDetailBO.setUserId(item.getUserId());
-        iItemBrokerageGeneralService.doCreateBrokerageGeneral(brokerageDetailBO);
-    }
-
     /**
      * 获取项目状态
      * @param id 项目id

+ 22 - 11
service/src/main/java/com/dayou/service/impl/ItemStageServiceImpl.java

@@ -7,6 +7,7 @@ import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.common.BaseEntity;
 import com.dayou.entity.Item;
 import com.dayou.entity.ItemStage;
+import com.dayou.entity.ItemStageUser;
 import com.dayou.enums.ItemStateEnum;
 import com.dayou.enums.OperationTypeEnum;
 import com.dayou.exception.ErrorCode;
@@ -14,6 +15,7 @@ import com.dayou.mapper.ItemMapper;
 import com.dayou.mapper.ItemStageMapper;
 import com.dayou.service.IItemStageService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayou.service.IItemStageUserService;
 import com.dayou.vo.ItemStageVO;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.ibatis.annotations.Case;
@@ -64,6 +66,9 @@ public class ItemStageServiceImpl extends ServiceImpl<ItemStageMapper, ItemStage
     @Autowired
     private ItemMapper itemMapper;
 
+    @Autowired
+    private IItemStageUserService iItemStageUserService;
+
     @Override
     @SuppressWarnings("unchecked")
     public Page<ItemStage> selectPage(Page page,ItemStage itemStage){
@@ -78,27 +83,33 @@ public class ItemStageServiceImpl extends ServiceImpl<ItemStageMapper, ItemStage
 
     @Override
     @DoBrokerage(operation = ADD,rule = BrokerageRule.LAND_OTHER_RULE)
-    public Boolean add(ItemStage itemStage){
+    public Long add(ItemStageVO itemStageVO){
         //判断阶段时间是否与已有阶段时间重复
-        LocalDate startDate = itemStage.getStartDate();
-        LocalDate endDate = itemStage.getEndDate();
-        int check = itemStageMapper.checkDate(itemStage.getId(),itemStage.getItemId(),startDate,endDate);
+        LocalDate startDate = itemStageVO.getStartDate();
+        LocalDate endDate = itemStageVO.getEndDate();
+        int check = itemStageMapper.checkDate(itemStageVO.getId(),itemStageVO.getItemId(),startDate,endDate);
         if (check!=0){
             ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"日期段与已存在的排期日期重复,请检查.");
         }
-        if (StrUtil.isNotBlank(itemStage.getHeaderId())){
-            itemStage.setFooterId(UUID.randomUUID().toString());
+        if (StrUtil.isNotBlank(itemStageVO.getHeaderId())){
+            itemStageVO.setFooterId(UUID.randomUUID().toString());
             this.update(new LambdaUpdateWrapper<ItemStage>()
-                    .set(ItemStage::getHeaderId,itemStage.getFooterId())
-                    .eq(ItemStage::getHeaderId,itemStage.getHeaderId()));
+                    .set(ItemStage::getHeaderId,itemStageVO.getFooterId())
+                    .eq(ItemStage::getHeaderId,itemStageVO.getHeaderId()));
         }else {
-            int count = this.count(new LambdaQueryWrapper<ItemStage>().eq(ItemStage::getItemId, itemStage.getItemId()));
+            int count = this.count(new LambdaQueryWrapper<ItemStage>().eq(ItemStage::getItemId, itemStageVO.getItemId()));
             if (count>0){
                 ErrorCode.throwBusinessException(STAGE_NODE_ERROR);
             }
-            itemStage.setFooterId(UUID.randomUUID().toString());
+            itemStageVO.setFooterId(UUID.randomUUID().toString());
         }
-        return  this.save(itemStage);
+        this.save(itemStageVO);
+        Set<ItemStageVO.ParticipatorWeight> joiners = itemStageVO.getParticipators();
+        Set<ItemStageUser> itemStageUsers = joiners.stream().map(x -> {
+            return ItemStageUser.builder().itemId(itemStageVO.getItemId()).stageId(itemStageVO.getId()).userId(x.getUserId()).weight(x.getWeight()).build();
+        }).collect(Collectors.toSet());
+        iItemStageUserService.saveBatch(itemStageUsers);
+        return itemStageVO.getId();
     }
 
     @Transactional