Browse Source

项目提成业务代码

wucl 2 years ago
parent
commit
3abcddc34a
23 changed files with 307 additions and 52 deletions
  1. 7 3
      biz-base/src/main/java/com/dayou/controller/ItemController.java
  2. 18 2
      biz-base/src/test/java/BrokerageTest.java
  3. 3 0
      dao/src/main/java/com/dayou/mapper/MarketStatMapper.java
  4. 2 2
      dao/src/main/resources/mapper/ItemBrokerageDetailMapper.xml
  5. 5 0
      dao/src/main/resources/mapper/MarketStatMapper.xml
  6. 2 1
      domain/src/main/java/com/dayou/entity/ItemBrokerageDetail.java
  7. 2 0
      domain/src/main/java/com/dayou/entity/ItemBrokerageGeneral.java
  8. 36 1
      service/src/main/java/com/dayou/bo/BrokerageDetailBO.java
  9. 4 4
      service/src/main/java/com/dayou/brokerage/BrokerageCalculateSupport.java
  10. 2 1
      service/src/main/java/com/dayou/brokerage/BrokerageCalculator.java
  11. 1 1
      service/src/main/java/com/dayou/brokerage/NonMarketerBrokerageCalculator.java
  12. 25 0
      service/src/main/java/com/dayou/brokerage/annotation/DoBrokerage.java
  13. 20 5
      service/src/main/java/com/dayou/brokerage/config/BrokerageConfig.java
  14. 26 9
      service/src/main/java/com/dayou/brokerage/handler/MarketerBrokerageHandler.java
  15. 45 0
      service/src/main/java/com/dayou/brokerage/interceptor/BrokerageInterceptor.java
  16. 2 0
      service/src/main/java/com/dayou/service/IItemBrokerageGeneralService.java
  17. 3 1
      service/src/main/java/com/dayou/service/IItemService.java
  18. 4 0
      service/src/main/java/com/dayou/service/IMarketStatService.java
  19. 0 1
      service/src/main/java/com/dayou/service/impl/ItemBrokerageDetailServiceImpl.java
  20. 60 0
      service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java
  21. 27 18
      service/src/main/java/com/dayou/service/impl/ItemServiceImpl.java
  22. 5 0
      service/src/main/java/com/dayou/service/impl/ItemStageServiceImpl.java
  23. 8 3
      service/src/main/java/com/dayou/service/impl/MarketStatServiceImpl.java

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

@@ -2,6 +2,7 @@ package com.dayou.controller;
 
 import com.dayou.annotation.DataPermission;
 import com.dayou.annotation.OperLog;
+import com.dayou.brokerage.annotation.DoBrokerage;
 import com.dayou.dto.ItemDTO;
 import com.dayou.utils.LoginContext;
 import com.dayou.vo.DepartmentStatVO;
@@ -29,6 +30,9 @@ import java.util.List;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.http.MediaType;
 import org.springframework.web.multipart.MultipartFile;
+
+import static com.dayou.enums.OperationTypeEnum.ADD;
+
 /**
  * 项目信息表
  *
@@ -88,9 +92,9 @@ public class ItemController extends BaseController {
      */
     @OperLog(title = "新增项目")
     @PostMapping("")
-    public RestResponse<Boolean> save(@RequestBody ItemDTO itemDTO) {
-        Boolean ret = itemService.add(itemDTO);
-        return RestResponse.data(ret);
+    public RestResponse<Long> save(@RequestBody ItemDTO itemDTO) {
+        Long ret = itemService.add(itemDTO);
+        return RestResponse.success(ret);
     }
 
     /**

+ 18 - 2
biz-base/src/test/java/BrokerageTest.java

@@ -9,6 +9,7 @@ import com.dayou.entity.GlobalConfig;
 import com.dayou.entity.ItemBrokerageDetail;
 import com.dayou.service.IGlobalConfigService;
 import com.dayou.service.IItemBrokerageDetailService;
+import com.dayou.service.IItemService;
 import lombok.extern.slf4j.Slf4j;
 import org.checkerframework.checker.units.qual.A;
 import org.junit.Test;
@@ -19,6 +20,8 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.context.ApplicationContext;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
+import java.math.BigDecimal;
+
 /**
  * 类说明:
  *
@@ -40,6 +43,9 @@ public class BrokerageTest {
     @Autowired
     private IItemBrokerageDetailService iItemBrokerageDetailService;
 
+    @Autowired
+    private IItemService iItemService;
+
     @Test
     public void testBrokerageValidator(){
         DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
@@ -65,7 +71,17 @@ public class BrokerageTest {
 
     @Test
     public void testCreate(){
-        ItemDTO itemDTO = new ItemDTO();
-        iItemBrokerageDetailService.crateBrokerageDetail(itemDTO);
+        ItemDTO dto = new ItemDTO();
+        dto.setName("BROKERAGE_TEST");
+        dto.setBelongTo("TJC");
+        dto.setCate(3L);
+        dto.setBusinessSource(2L);
+        dto.setUserId(117L);
+        dto.setCustomerId(57L);
+        dto.setAmount(new BigDecimal("200000"));
+        dto.setPaymentMethod("分期付款");
+        dto.setDepartmentId(26L);
+        Long add = iItemService.add(dto);
+        Assert.isTrue(add!=null);
     }
 }

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

@@ -4,6 +4,7 @@ import com.dayou.dto.MarketStatDTO;
 import com.dayou.vo.MarketStatVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 
 /**
@@ -15,4 +16,6 @@ import java.time.LocalDate;
  */
 public interface MarketStatMapper {
     MarketStatVO marketStat(@Param("dto") MarketStatDTO dto, @Param("lastMonth23")LocalDate lastMonth23);
+
+    BigDecimal currentMonthPayment(@Param("userId") Long userId, @Param("lastMonth23") LocalDate lastMonth23);
 }

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

@@ -11,7 +11,7 @@
         <result column="general_id" property="generalId" />
         <result column="user_id" property="userId" />
         <result column="predict_amount" property="predictAmount" />
-        <result column="atcual_amount" property="atcualAmount" />
+        <result column="actual_amount" property="actualAmount" />
         <result column="advance_amount" property="advanceAmount" />
         <result column="brokerage_rule" property="brokerageRule" />
         <result column="brokerage_mode" property="brokerageMode" />
@@ -23,7 +23,7 @@
         deleted,
         created,
         modified,
-        general_id, user_id, predict_amount, atcual_amount, advance_amount, brokerage_rule, brokerage_mode
+        general_id, user_id, predict_amount, actual_amount, advance_amount, brokerage_rule, brokerage_mode
     </sql>
 
 </mapper>

+ 5 - 0
dao/src/main/resources/mapper/MarketStatMapper.xml

@@ -63,4 +63,9 @@
         ) AS monthPaymentDone
    </select>
 
+    <select id="currentMonthPayment" resultType="java.math.BigDecimal">
+        SELECT ifnull(sum( pc.amount ),0) FROM payment_collection pc left join item i on i.id = pc.item_id WHERE pc.deleted = 0 AND pc.payment_date >= #{lastMonth23}
+            AND pc.payment_date &lt;= concat( date_format( LAST_DAY( now()), '%Y-%m-' ), '22' ) and i.user_id = #{userId}
+    </select>
+
 </mapper>

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

@@ -1,6 +1,7 @@
 package com.dayou.entity;
 import java.math.BigDecimal;
 import com.dayou.common.BaseEntity;
+import lombok.Builder;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import com.dayou.annotation.ExcelSheet;
@@ -43,7 +44,7 @@ public class ItemBrokerageDetail extends BaseEntity {
      */
     @ImportCell
     @ExportCell(columnName = "实际提成金额")
-    private BigDecimal atcualAmount;
+    private BigDecimal actualAmount;
 
     /**
      * 已预提金额

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

@@ -1,6 +1,7 @@
 package com.dayou.entity;
 import java.math.BigDecimal;
 import com.dayou.common.BaseEntity;
+import lombok.Builder;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import com.dayou.annotation.ExcelSheet;
@@ -17,6 +18,7 @@ import com.dayou.annotation.ImportCell;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ExcelSheet(sheetName = "项目提成总表")
+@Builder
 public class ItemBrokerageGeneral extends BaseEntity {
 
     private static final long serialVersionUID=1L;

+ 36 - 1
service/src/main/java/com/dayou/bo/BrokerageDetailBO.java

@@ -1,10 +1,14 @@
 package com.dayou.bo;
 
 import com.dayou.entity.ItemBrokerageDetail;
+import com.dayou.enums.MergeKeyInterface;
+import lombok.Builder;
 import lombok.Data;
 
 import java.math.BigDecimal;
 
+import static com.dayou.common.Constants.MERGE_SYMBOL;
+
 /**
  * 类说明:
  *
@@ -13,7 +17,8 @@ import java.math.BigDecimal;
  * created with IntelliJ IDEA.
  */
 @Data
-public class BrokerageDetailBO extends ItemBrokerageDetail {
+@Builder
+public class BrokerageDetailBO extends ItemBrokerageDetail implements MergeKeyInterface {
 
     /**
      * 市场人员是否可以预提
@@ -34,4 +39,34 @@ public class BrokerageDetailBO extends ItemBrokerageDetail {
      * 当前回款金额
      */
     private BigDecimal currentPayment;
+
+    /**
+     * 项目类型id
+     */
+    private Long cate;
+
+    /**
+     * 业务来源id
+     */
+    private Long businessSource;
+
+    /**
+     * 合同金额
+     */
+    private BigDecimal amount;
+
+    /**
+     * 客户经理提成系数
+     */
+    private BigDecimal rate;
+
+    /**
+     * 项目id
+     */
+    private Long itemId;
+
+    @Override
+    public String mergeKey() {
+        return this.cate +MERGE_SYMBOL+ this.businessSource;
+    }
 }

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

@@ -21,7 +21,7 @@ import java.util.Date;
  * @since: 2023/3/3
  * created with IntelliJ IDEA.
  */
-public abstract class BrokerageCalculateSupport  implements BrokerageCalculateFactory {
+public abstract class BrokerageCalculateSupport implements BrokerageCalculator ,BrokerageCalculateFactory {
 
     @Autowired
     private BrokerageValidator brokerageValidator;
@@ -29,6 +29,7 @@ public abstract class BrokerageCalculateSupport  implements BrokerageCalculateFa
     @Autowired
     private MarketerBrokerageHandler marketerBrokerageHandler;
 
+    @Override
     public BrokerageCalculator getCalculator(BrokerageRule rule){
         switch (rule){
             case LAND_MARKETER_RULE:
@@ -52,7 +53,7 @@ public abstract class BrokerageCalculateSupport  implements BrokerageCalculateFa
      * @param brokerageDetailBo
      * @return
      */
-    protected BrokerageDetailBO checkMarketerPredictBrokerage(BrokerageDetailBO brokerageDetailBo){
+    protected void checkMarketerPredictBrokerage(BrokerageDetailBO brokerageDetailBo){
         @NotNull
         BigDecimal paymentTarget = brokerageDetailBo.getPaymentTarget();
         BigDecimal avgMonthTarget = paymentTarget.divide(brokerageValidator.monthOfYear, 2, RoundingMode.HALF_UP);
@@ -60,8 +61,7 @@ public abstract class BrokerageCalculateSupport  implements BrokerageCalculateFa
         //当月应完成回款金额
         BigDecimal brokerageTarget = avgMonthTarget.multiply(new BigDecimal(month));
         brokerageValidator.checkMarketerPredictBrokerage(brokerageDetailBo,brokerageTarget);
-        return brokerageDetailBo;
     }
 
-    public abstract BigDecimal predictAmount(ItemDTO itemDTO);
+    public abstract BrokerageDetailBO predictAmount(BrokerageDetailBO brokerageDetailBo);
 }

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

@@ -1,5 +1,6 @@
 package com.dayou.brokerage;
 
+import com.dayou.bo.BrokerageDetailBO;
 import com.dayou.brokerage.Factory.BrokerageCalculateFactory;
 import com.dayou.dto.ItemDTO;
 
@@ -17,7 +18,7 @@ public interface BrokerageCalculator extends BrokerageCalculateFactory {
     /**
      * 预估提成金额
      */
-    BigDecimal predictAmount(ItemDTO itemDTO);
+    BrokerageDetailBO predictAmount(BrokerageDetailBO bo);
 
     /**
      * 实际提成金额

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

@@ -20,5 +20,5 @@ public interface NonMarketerBrokerageCalculator extends BrokerageCalculator{
      * 预提次数
      * @return
      */
-    BigDecimal advanceTimes();
+    int advanceTimes();
 }

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

@@ -0,0 +1,25 @@
+package com.dayou.brokerage.annotation;
+
+import com.dayou.brokerage.constants.BrokerageRule;
+import com.dayou.enums.OperationTypeEnum;
+import org.apache.poi.ss.formula.functions.T;
+
+import java.lang.annotation.*;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/3/7
+ * created with IntelliJ IDEA.
+ */
+@Target({ElementType.PARAMETER, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DoBrokerage {
+
+    OperationTypeEnum operation() ;
+
+    BrokerageRule  rule();
+
+}

+ 20 - 5
service/src/main/java/com/dayou/brokerage/config/BrokerageConfig.java

@@ -1,15 +1,14 @@
 package com.dayou.brokerage.config;
 
-import cn.hutool.core.util.StrUtil;
+import com.dayou.brokerage.interceptor.BrokerageInterceptor;
 import com.dayou.brokerage.validator.BrokerageValidator;
-import com.dayou.enums.GlobalConfigEnum;
-import com.dayou.service.IGlobalConfigService;
+import com.dayou.service.IItemService;
+import org.springframework.aop.aspectj.AspectJExpressionPointcut;
+import org.springframework.aop.support.DefaultPointcutAdvisor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-import java.math.BigDecimal;
-
 /**
  * 类说明:
  *
@@ -20,6 +19,12 @@ import java.math.BigDecimal;
 @Configuration
 public class BrokerageConfig {
 
+    private static final String allServiceImpl = "execution(* com.dayou.service.impl.*.*(..))";
+
+    @Autowired
+    private BrokerageInterceptor brokerageInterceptor;
+
+
     @Bean(initMethod = "setStatus")
     public BrokerageValidator brokerageValidator() {
         BrokerageValidator brokerageValidator = new BrokerageValidator();
@@ -32,5 +37,15 @@ public class BrokerageConfig {
         return brokerageMarketerRatioSet;
     }
 
+    @Bean
+    public DefaultPointcutAdvisor brokerageAdvisor(){
+        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
+        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
+        pointcut.setExpression(allServiceImpl);
+        advisor.setPointcut(pointcut);
+        advisor.setAdvice(brokerageInterceptor);
+        return advisor;
+    }
+
 
 }

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

@@ -5,8 +5,10 @@ import com.dayou.brokerage.BrokerageCalculateSupport;
 import com.dayou.brokerage.BrokerageCalculator;
 import com.dayou.brokerage.Factory.BrokerageCalculateFactory;
 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;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -28,17 +30,32 @@ public class MarketerBrokerageHandler extends BrokerageCalculateSupport implemen
     private BrokerageMarketerRatioSet brokerageMarketerRatioSet;
 
     @Override
-    public BigDecimal predictAmount(ItemDTO itemDTO) {
-//        BrokerageDetailBO brokerageDetailBO = new BrokerageDetailBO();
-//        brokerageDetailBO.setItemBrokerageStatus("CLOSED");
-//        checkItemBrokerageStatus(brokerageDetailBO);
-//        checkMarketerPredictBrokerage(brokerageDetailBO);
-        String mergeKey = itemDTO.mergeKey();
+    public BrokerageDetailBO predictAmount(BrokerageDetailBO bo) {
+        String mergeKey = bo.mergeKey();
         BigDecimal ratio = brokerageMarketerRatioSet.getRatioList().get(mergeKey);
-        if (itemDTO.getAmount()!=null && ratio !=null){
-            return itemDTO.getAmount().multiply(ratio);
+        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);
+            try {
+                checkMarketerPredictBrokerage(bo);
+                //todo 可提成金额计算规则这个地方应该要改
+                bo.setPredictAmount(bo.getAmount().multiply(ratio));
+                //todo 实际提成金额可能与可提成金额不一致,可能存在考核指标打折
+                bo.setActualAmount(bo.getPredictAmount());
+                bo.setMarketerAdvanceBrokerageAble(Boolean.TRUE);
+            } catch (BusinessException e) {
+                log.info("项目id:[{}],客户经理id:[{}],[{}]",bo.getId(),bo.getUserId(),e.getMessage());
+            }
+        }else {
+            log.info("项目id:[{}],合同金额:[{}],提成系数:[{}],[未填写合同金额或未设置提成系数,无法计算客户经理提成]",bo.getId(),bo.getAmount(),ratio);
         }
-        return BigDecimal.ZERO;
+        return bo;
+
     }
 
     @Override

+ 45 - 0
service/src/main/java/com/dayou/brokerage/interceptor/BrokerageInterceptor.java

@@ -0,0 +1,45 @@
+package com.dayou.brokerage.interceptor;
+
+import com.dayou.brokerage.annotation.DoBrokerage;
+import com.dayou.brokerage.constants.BrokerageRule;
+import com.dayou.service.IItemBrokerageGeneralService;
+import com.dayou.service.IItemService;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+
+import static com.dayou.brokerage.constants.BrokerageRule.LAND_MARKETER_RULE;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/3/7
+ * created with IntelliJ IDEA.
+ */
+@Slf4j
+@Component
+public class BrokerageInterceptor implements MethodInterceptor {
+
+    //注入service Bean 后,拦截该bean中的方法失效。
+    private IItemService iItemService;
+
+    @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 (result instanceof Long){
+                iItemService.createBrokerageGeneral((Long) result);
+                log.info("created marketer brokerage general and detail");
+            };
+        }
+        return result;
+    }
+}

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

@@ -1,4 +1,5 @@
 package com.dayou.service;
+import com.dayou.bo.BrokerageDetailBO;
 import com.dayou.entity.ItemBrokerageGeneral;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -25,4 +26,5 @@ public interface IItemBrokerageGeneralService extends IService<ItemBrokerageGene
 
         Boolean delete(Long id);
 
+        void doCreateBrokerageGeneral(BrokerageDetailBO bo);
 }

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

@@ -22,7 +22,7 @@ public interface IItemService extends IService<Item> {
 
         ItemVO detail(Long id);
 
-        Boolean add(ItemDTO itemDTO);
+        Long add(ItemDTO itemDTO);
 
         Boolean update(ItemDTO itemDTO);
 
@@ -31,4 +31,6 @@ public interface IItemService extends IService<Item> {
         ItemStatVO stat();
 
         Page<ItemVO> xSelectPage(Page page, ItemDTO item);
+
+        void createBrokerageGeneral(Long id);
 }

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

@@ -3,6 +3,8 @@ package com.dayou.service;
 import com.dayou.dto.MarketStatDTO;
 import com.dayou.vo.MarketStatVO;
 
+import java.math.BigDecimal;
+
 /**
  * 类说明:
  *
@@ -12,4 +14,6 @@ import com.dayou.vo.MarketStatVO;
  */
 public interface IMarketStatService {
     MarketStatVO marketStat(MarketStatDTO dto);
+
+    BigDecimal currentMonthPayment(Long userId);
 }

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

@@ -74,7 +74,6 @@ public class ItemBrokerageDetailServiceImpl extends ServiceImpl<ItemBrokerageDet
     @Override
     public Boolean crateBrokerageDetail(ItemDTO itemDTO) {
         BrokerageCalculator calculator = brokerageCalculateFactory.getCalculator(BrokerageRule.LAND_MARKETER_RULE);
-        calculator.predictAmount(itemDTO);
         return null;
     }
 }

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

@@ -1,9 +1,22 @@
 package com.dayou.service.impl;
 
+import com.dayou.bo.BrokerageDetailBO;
+import com.dayou.brokerage.BrokerageCalculateSupport;
+import com.dayou.brokerage.BrokerageCalculator;
+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.mapper.ItemBrokerageGeneralMapper;
+import com.dayou.service.IItemBrokerageDetailService;
 import com.dayou.service.IItemBrokerageGeneralService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayou.service.IMarketStatService;
+import com.dayou.service.IUserTargetService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -19,6 +32,8 @@ 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 org.springframework.transaction.annotation.Transactional;
@@ -32,10 +47,23 @@ import com.dayou.enums.BatchTaskTypeEnum;
  * @author wucl
  * @since 2023-03-03
  */
+@Slf4j
 @Service
 public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGeneralMapper, ItemBrokerageGeneral> implements IItemBrokerageGeneralService {
 
 
+    @Autowired
+    private BrokerageCalculator brokerageCalculator;
+
+    @Autowired
+    private IUserTargetService userTargetService;
+
+    @Autowired
+    private IItemBrokerageDetailService iItemBrokerageDetailService;
+
+    @Autowired
+    private IMarketStatService marketStatService;
+
     @Override
     @SuppressWarnings("unchecked")
     public Page<ItemBrokerageGeneral> selectPage(Page page,ItemBrokerageGeneral itemBrokerageGeneral){
@@ -63,4 +91,36 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         //逻辑删除
         return this.removeById(id);
     }
+
+    @Transactional
+    @Override
+    public void doCreateBrokerageGeneral(BrokerageDetailBO bo) {
+        BrokerageCalculator calculator = brokerageCalculator.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);
+        }
+
+        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);
+        ItemBrokerageGeneral general = ItemBrokerageGeneral.builder()
+                .itemId(bo.getId())
+                .marketerBrokerageAmount(bo.getPredictAmount())
+                .marketerAdvanceBrokerageAble(bo.getMarketerAdvanceBrokerageAble())
+                .brokeragePredictAmount(bo.getPredictAmount())
+                .brokerageActualAmount(BigDecimal.ZERO)
+                .brokerageRate(bo.getRate()).build();
+        this.save(general);
+        bo.setGeneralId(general.getId());
+        iItemBrokerageDetailService.save(bo);
+    }
 }

+ 27 - 18
service/src/main/java/com/dayou/service/impl/ItemServiceImpl.java

@@ -1,13 +1,17 @@
 package com.dayou.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.dayou.bo.BrokerageDetailBO;
+import com.dayou.brokerage.annotation.DoBrokerage;
+import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.dto.ItemDTO;
 import com.dayou.entity.Item;
 import com.dayou.entity.ItemUser;
 import com.dayou.enums.ItemStateEnum;
 import com.dayou.enums.UnitEnum;
 import com.dayou.mapper.ItemMapper;
-import com.dayou.mapper.ItemUserMapper;
+import com.dayou.service.IItemBrokerageGeneralService;
 import com.dayou.service.IItemService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dayou.service.IItemStageService;
@@ -20,29 +24,17 @@ import com.dayou.vo.ItemVO;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-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.time.LocalDate;
 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;
+
+import static com.dayou.enums.OperationTypeEnum.ADD;
 
 /**
  * <p>
@@ -64,6 +56,9 @@ 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){
@@ -90,7 +85,8 @@ public class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements II
 
     @Transactional
     @Override
-    public Boolean add(ItemDTO itemDTO){
+    @DoBrokerage(operation = ADD,rule = BrokerageRule.LAND_MARKETER_RULE)
+    public Long add(ItemDTO itemDTO){
         itemDTO.setBusinessNo(DateUtils.dateTimeNow());
         itemDTO.setUserId(LoginContext.getUserId());
         if (itemDTO.getBelongTo().equals(UnitEnum.TJC.name())){
@@ -105,9 +101,9 @@ public class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements II
                 itemUser.setUserId(x);
                 return itemUser;
             }).collect(Collectors.toSet());
-            return  iItemUserService.saveBatch(itemUsers);
+            iItemUserService.saveBatch(itemUsers);
         }
-        return Boolean.TRUE;
+        return itemDTO.getId();
     }
 
     @Transactional
@@ -158,6 +154,19 @@ 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

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

@@ -2,10 +2,13 @@ package com.dayou.service.impl;
 
 import cn.hutool.core.lang.UUID;
 import cn.hutool.core.util.StrUtil;
+import com.dayou.brokerage.annotation.DoBrokerage;
+import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.common.BaseEntity;
 import com.dayou.entity.Item;
 import com.dayou.entity.ItemStage;
 import com.dayou.enums.ItemStateEnum;
+import com.dayou.enums.OperationTypeEnum;
 import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.ItemMapper;
 import com.dayou.mapper.ItemStageMapper;
@@ -39,6 +42,7 @@ import java.util.stream.Collectors;
 import org.springframework.transaction.annotation.Transactional;
 import com.dayou.enums.BatchTaskTypeEnum;
 
+import static com.dayou.enums.OperationTypeEnum.*;
 import static com.dayou.exception.ErrorCode.STAGE_NODE_ERROR;
 import static com.dayou.exception.ErrorCode.STAGE_NODE_ERROR1;
 
@@ -73,6 +77,7 @@ public class ItemStageServiceImpl extends ServiceImpl<ItemStageMapper, ItemStage
     }
 
     @Override
+    @DoBrokerage(operation = ADD,rule = BrokerageRule.LAND_OTHER_RULE)
     public Boolean add(ItemStage itemStage){
         //判断阶段时间是否与已有阶段时间重复
         LocalDate startDate = itemStage.getStartDate();

+ 8 - 3
service/src/main/java/com/dayou/service/impl/MarketStatServiceImpl.java

@@ -8,6 +8,7 @@ import com.dayou.vo.MarketStatVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.Date;
 
@@ -37,8 +38,12 @@ public class MarketStatServiceImpl implements IMarketStatService {
         return marketStatMapper.marketStat(dto,lastMonth23);
     }
 
-    public static void main(String[] args) {
-        LocalDate lastMonth23 = DateUtils.getLastMonth23(2024,0);
-        System.out.println(lastMonth23);
+    @Override
+    public BigDecimal currentMonthPayment(Long userId) {
+        LocalDate lastMonth23 = DateUtils.getLastMonth23(LocalDate.now().getYear(), LocalDate.now().getMonthValue() - 1);
+        BigDecimal currentMontAmount = marketStatMapper.currentMonthPayment(userId,lastMonth23);
+        return currentMontAmount;
     }
+
+
 }