Explorar el Código

项目提成业务代码

wucl hace 2 años
padre
commit
19f87c40c8
Se han modificado 37 ficheros con 540 adiciones y 47 borrados
  1. 2 1
      biz-base.iml
  2. 13 0
      biz-base/pom.xml
  3. 3 0
      biz-base/src/main/java/com/dayou/controller/BrokerageMarketerRatioController.java
  4. 4 1
      biz-base/src/main/java/com/dayou/controller/GlobalConfigController.java
  5. 1 0
      biz-base/src/main/java/com/dayou/controller/ItemBrokerageDetailController.java
  6. 71 0
      biz-base/src/test/java/BrokerageTest.java
  7. 2 1
      common.iml
  8. 2 2
      common/src/main/java/com/dayou/configuration/CacheConfig.java
  9. 6 0
      common/src/main/java/com/dayou/exception/ErrorCode.java
  10. 2 1
      dao.iml
  11. 2 0
      dao/src/main/java/com/dayou/mapper/GlobalConfigMapper.java
  12. 8 5
      dao/src/main/resources/mapper/GlobalConfigMapper.xml
  13. 2 1
      domain.iml
  14. 1 0
      domain/src/main/java/com/dayou/common/Constants.java
  15. 8 1
      domain/src/main/java/com/dayou/dto/ItemDTO.java
  16. 0 1
      domain/src/main/java/com/dayou/entity/BrokerageMarketerRatio.java
  17. 1 1
      domain/src/main/java/com/dayou/entity/GlobalConfig.java
  18. 7 2
      domain/src/main/java/com/dayou/entity/Item.java
  19. 28 1
      domain/src/main/java/com/dayou/enums/GlobalConfigEnum.java
  20. 16 0
      domain/src/main/java/com/dayou/enums/MergeKeyInterface.java
  21. 2 1
      gen.iml
  22. 2 1
      service.iml
  23. 1 1
      service/pom.xml
  24. 37 0
      service/src/main/java/com/dayou/bo/BrokerageDetailBO.java
  25. 55 1
      service/src/main/java/com/dayou/brokerage/BrokerageCalculateSupport.java
  26. 10 9
      service/src/main/java/com/dayou/brokerage/BrokerageCalculator.java
  27. 16 0
      service/src/main/java/com/dayou/brokerage/Factory/BrokerageCalculateFactory.java
  28. 24 0
      service/src/main/java/com/dayou/brokerage/NonMarketerBrokerageCalculator.java
  29. 16 9
      service/src/main/java/com/dayou/brokerage/config/BrokerageConfig.java
  30. 51 0
      service/src/main/java/com/dayou/brokerage/config/BrokerageMarketerRatioSet.java
  31. 60 0
      service/src/main/java/com/dayou/brokerage/handler/MarketerBrokerageHandler.java
  32. 53 5
      service/src/main/java/com/dayou/brokerage/validator/BrokerageValidator.java
  33. 5 0
      service/src/main/java/com/dayou/processor/AppBootProcessor.java
  34. 2 0
      service/src/main/java/com/dayou/service/IGlobalConfigService.java
  35. 3 0
      service/src/main/java/com/dayou/service/IItemBrokerageDetailService.java
  36. 10 2
      service/src/main/java/com/dayou/service/impl/GlobalConfigServiceImpl.java
  37. 14 0
      service/src/main/java/com/dayou/service/impl/ItemBrokerageDetailServiceImpl.java

+ 2 - 1
biz-base.iml

@@ -7,9 +7,10 @@
           <map>
             <entry key="com.zeroturnaround.jrebel.FormatVersion" value="7.0.0" />
             <entry key="jrebelEnabled" value="true" />
+            <entry key="lastExternalPluginCheckTime" value="1678063381765" />
           </map>
         </option>
-        <option name="version" value="4" />
+        <option name="version" value="5" />
       </configuration>
     </facet>
   </component>

+ 13 - 0
biz-base/pom.xml

@@ -92,6 +92,19 @@
             <artifactId>poi-ooxml</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 
     <build>

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

@@ -55,6 +55,7 @@ public class BrokerageMarketerRatioController extends BaseController {
     /**
      * 项目提成比例(市场人员)新增
      */
+    //todo 添加注解拦截更新操作,刷新BrokerageMarketerRatioSet Bean
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody BrokerageMarketerRatio brokerageMarketerRatio) {
         Boolean ret = brokerageMarketerRatioService.add(brokerageMarketerRatio);
@@ -64,6 +65,7 @@ public class BrokerageMarketerRatioController extends BaseController {
     /**
      * 项目提成比例(市场人员)更新
      */
+    //todo 添加注解拦截更新操作,刷新BrokerageMarketerRatioSet Bean
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody BrokerageMarketerRatio brokerageMarketerRatio) {
         Boolean ret = brokerageMarketerRatioService.update(brokerageMarketerRatio);
@@ -73,6 +75,7 @@ public class BrokerageMarketerRatioController extends BaseController {
     /**
      * 项目提成比例(市场人员)删除
      */
+    //todo 添加注解拦截更新操作,刷新BrokerageMarketerRatioSet Bean
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = brokerageMarketerRatioService.delete(id);

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

@@ -58,6 +58,7 @@ public class GlobalConfigController extends BaseController {
     /**
      * 全局配置新增
      */
+    //todo 添加注解拦截更新操作,刷新BrokerageValidator Bean
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody GlobalConfig globalConfig) {
         Boolean ret = globalConfigService.add(globalConfig);
@@ -67,6 +68,7 @@ public class GlobalConfigController extends BaseController {
     /**
      * 全局配置更新
      */
+    //todo 添加注解拦截更新操作,刷新BrokerageValidator Bean
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody GlobalConfig globalConfig) {
         Boolean ret = globalConfigService.update(globalConfig);
@@ -76,6 +78,7 @@ public class GlobalConfigController extends BaseController {
     /**
      * 全局配置删除
      */
+    //todo 添加注解拦截更新操作,刷新BrokerageValidator Bean
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = globalConfigService.delete(id);
@@ -89,7 +92,7 @@ public class GlobalConfigController extends BaseController {
     @GetMapping("/simpleAll")
     public RestResponse<List<PullDownModel>> simpleAll(){
         LambdaQueryWrapper<GlobalConfig> lambdaQueryWrapper = new LambdaQueryWrapper<GlobalConfig>()
-        .select(GlobalConfig::getId,GlobalConfig::getName)
+        .select(GlobalConfig::getId,GlobalConfig::getKey)
         .eq(GlobalConfig::getDeleted,false);
         List<GlobalConfig> list= globalConfigService.list(lambdaQueryWrapper);
         List<PullDownModel> ret=ConvertUtil.copyList(list, PullDownModel.class);

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

@@ -54,6 +54,7 @@ public class ItemBrokerageDetailController extends BaseController {
     /**
      * 项目提成明细新增
      */
+    @Deprecated
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody ItemBrokerageDetail itemBrokerageDetail) {
         Boolean ret = itemBrokerageDetailService.add(itemBrokerageDetail);

+ 71 - 0
biz-base/src/test/java/BrokerageTest.java

@@ -0,0 +1,71 @@
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.dayou.BaseApplication;
+import com.dayou.brokerage.config.BrokerageMarketerRatioSet;
+import com.dayou.brokerage.validator.BrokerageValidator;
+import com.dayou.common.BaseEntity;
+import com.dayou.dto.ItemDTO;
+import com.dayou.entity.GlobalConfig;
+import com.dayou.entity.ItemBrokerageDetail;
+import com.dayou.service.IGlobalConfigService;
+import com.dayou.service.IItemBrokerageDetailService;
+import lombok.extern.slf4j.Slf4j;
+import org.checkerframework.checker.units.qual.A;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.support.DefaultListableBeanFactory;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationContext;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/3/6
+ * created with IntelliJ IDEA.
+ */
+@Slf4j
+@SpringBootTest(classes = BaseApplication.class)
+@RunWith(SpringJUnit4ClassRunner.class)
+public class BrokerageTest {
+
+    @Autowired
+    private ApplicationContext applicationContext;
+
+    @Autowired
+    private IGlobalConfigService globalConfigService;
+
+    @Autowired
+    private IItemBrokerageDetailService iItemBrokerageDetailService;
+
+    @Test
+    public void testBrokerageValidator(){
+        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
+        BrokerageValidator brokerageValidator = defaultListableBeanFactory.getBean("brokerageValidator",BrokerageValidator.class);
+        log.info("brokerageValidator ===="+ brokerageValidator.monthOfYear.toPlainString());
+        log.info("brokerageValidator ===="+ brokerageValidator.nonMarketerMonthBrokerage.toPlainString());
+        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 ===="+ brokerageValidatorNew.monthOfYear.toPlainString());
+        log.info("brokerageValidatorNew ===="+ brokerageValidatorNew.nonMarketerMonthBrokerage.toPlainString());
+        System.out.println(brokerageValidatorNew);
+    }
+
+    @Test
+    public void testBrokerageMarketerRatioSet(){
+        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
+        BrokerageMarketerRatioSet brokerageMarketerRatioSet = defaultListableBeanFactory.getBean("brokerageMarketerRatioSet", BrokerageMarketerRatioSet.class);
+        System.out.println(brokerageMarketerRatioSet);
+    }
+
+    @Test
+    public void testCreate(){
+        ItemDTO itemDTO = new ItemDTO();
+        iItemBrokerageDetailService.crateBrokerageDetail(itemDTO);
+    }
+}

+ 2 - 1
common.iml

@@ -7,9 +7,10 @@
           <map>
             <entry key="com.zeroturnaround.jrebel.FormatVersion" value="7.0.0" />
             <entry key="jrebelEnabled" value="true" />
+            <entry key="lastExternalPluginCheckTime" value="1678063381765" />
           </map>
         </option>
-        <option name="version" value="4" />
+        <option name="version" value="5" />
       </configuration>
     </facet>
   </component>

+ 2 - 2
common/src/main/java/com/dayou/configuration/CacheConfig.java

@@ -22,8 +22,6 @@ public class CacheConfig {
      */
     public static final String USER_AUTH_MENU_API = "USER_AUTH_MENU_API";
 
-
-
     @Value("${baidu.ai.tokenexpire:20}")
     private Integer tokenExpire;
     @Value("${sms.expire:15}")
@@ -31,6 +29,8 @@ public class CacheConfig {
     @Value("${system.login.error-limit.lock-time:30}")
     private Integer accountLockingExpire;
 
+
+
     @Bean
     @Qualifier("loginCache")
     public Cache<Long, LoginCacheUserBO> loginCache() {

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

@@ -37,6 +37,12 @@ public class ErrorCode {
 
     public static final ErrorCode FILE_EXT_ERROR = ErrorCode("10016", "不支持此文件扩展名");
 
+    public static final ErrorCode BROKERAGE_ITEM_STATE_ERROR = ErrorCode("10017", "项目已被结算或冻结,无法计算提成");
+
+    public static final ErrorCode BROKERAGE_ITEM_STATE_ERROR1 = ErrorCode("10018", "项目未开始,无法计算提成");
+
+    public static final ErrorCode BROKERAGE_ITEM_STATE_ERROR2 = ErrorCode("10019", "客户经理未达到回款目标,无法计算提成");
+
 
 
 

+ 2 - 1
dao.iml

@@ -7,9 +7,10 @@
           <map>
             <entry key="com.zeroturnaround.jrebel.FormatVersion" value="7.0.0" />
             <entry key="jrebelEnabled" value="true" />
+            <entry key="lastExternalPluginCheckTime" value="1678063381765" />
           </map>
         </option>
-        <option name="version" value="4" />
+        <option name="version" value="5" />
       </configuration>
     </facet>
   </component>

+ 2 - 0
dao/src/main/java/com/dayou/mapper/GlobalConfigMapper.java

@@ -19,4 +19,6 @@ public interface GlobalConfigMapper extends BaseMapper<GlobalConfig> {
     void insertOrUpdateBatch(@Param("list") List<GlobalConfig> list);
 
     Boolean updateBatchByKey(@Param("list") List<GlobalConfig> globalConfigs);
+
+    String getValueByKeyFiled(@Param("key") String key, @Param("field") String field);
 }

+ 8 - 5
dao/src/main/resources/mapper/GlobalConfigMapper.xml

@@ -8,7 +8,7 @@
         <result column="deleted" property="deleted" />
         <result column="created" property="created" />
         <result column="modified" property="modified" />
-        <result column="name" property="name" />
+        <result column="key" property="key" />
         <result column="field" property="field" />
         <result column="value" property="value" />
         <result column="description" property="description" />
@@ -20,13 +20,13 @@
         deleted,
         created,
         modified,
-        name, field, value, description
+        `key`, field, value, description
     </sql>
 
     <insert id="insertOrUpdateBatch">
         insert into global_config(`key`, `value`,field,description) values
         <foreach collection="list" item="o" separator="," >
-            (#{o.name},#{o.value},#{o.field},#{o.description})
+            (#{o.key},#{o.value},#{o.field},#{o.description})
         </foreach>
         on duplicate key update
         <![CDATA[`value` = case when values(`value`) <> '' then values(`value`) else `value` end,
@@ -38,13 +38,13 @@
         update global_config
         set `value` = case
         <foreach collection="list" item="g" separator=" ">
-            when `key`=#{g.name} and field = #{g.field} then #{g.value}
+            when `key`=#{g.key} and field = #{g.field} then #{g.value}
         </foreach>
         end
         where
         `key` in
         <foreach collection="list" item="g" separator="," open="(" close=")">
-            #{g.name}
+            #{g.key}
         </foreach>
         and field in
         <foreach collection="list" item="g" separator="," open="(" close=")">
@@ -52,4 +52,7 @@
         </foreach>
     </update>
 
+    <select id="getValueByKeyFiled" resultType="java.lang.String">
+        select value from global_config where deleted=0 and `key` = #{key} and field = #{field}
+    </select>
 </mapper>

+ 2 - 1
domain.iml

@@ -7,9 +7,10 @@
           <map>
             <entry key="com.zeroturnaround.jrebel.FormatVersion" value="7.0.0" />
             <entry key="jrebelEnabled" value="true" />
+            <entry key="lastExternalPluginCheckTime" value="1678063381765" />
           </map>
         </option>
-        <option name="version" value="4" />
+        <option name="version" value="5" />
       </configuration>
     </facet>
   </component>

+ 1 - 0
domain/src/main/java/com/dayou/common/Constants.java

@@ -68,4 +68,5 @@ public interface Constants {
 
     String ADMIN_PASSWORD = "admin123";
 
+    static final String MERGE_SYMBOL = "&";
 }

+ 8 - 1
domain/src/main/java/com/dayou/dto/ItemDTO.java

@@ -1,11 +1,14 @@
 package com.dayou.dto;
 
 import com.dayou.entity.Item;
+import com.dayou.enums.MergeKeyInterface;
 import lombok.Data;
 
 import java.util.List;
 import java.util.Set;
 
+import static com.dayou.common.Constants.MERGE_SYMBOL;
+
 /**
  * 类说明:
  *
@@ -14,7 +17,7 @@ import java.util.Set;
  * created with IntelliJ IDEA.
  */
 @Data
-public class ItemDTO extends Item {
+public class ItemDTO extends Item implements MergeKeyInterface {
 
     /**
      * 项目配置人员id列表
@@ -26,4 +29,8 @@ public class ItemDTO extends Item {
      */
     private List<Long> departmentIds;
 
+    @Override
+    public String mergeKey() {
+        return super.getCate() +MERGE_SYMBOL+ super.getBusinessSource();
+    }
 }

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

@@ -44,5 +44,4 @@ public class BrokerageMarketerRatio extends BaseEntity {
     @ExportCell(columnName = "备注")
     private String remark;
 
-
 }

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

@@ -25,7 +25,7 @@ public class GlobalConfig extends BaseEntity {
      */
     @ImportCell
     @ExportCell(columnName = "键")
-    private String name;
+    private String key;
 
     @ImportCell
     @ExportCell(columnName = "")

+ 7 - 2
domain/src/main/java/com/dayou/entity/Item.java

@@ -5,6 +5,9 @@ import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.dayou.common.BaseEntity;
 import java.time.LocalDate;
+
+import com.github.liangbaika.validate.annations.AbcValidate;
+import com.github.liangbaika.validate.enums.Check;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import com.dayou.annotation.ExcelSheet;
@@ -49,16 +52,18 @@ public class Item extends BaseEntity {
     /**
      * 项目类型
      */
+    @AbcValidate(required = true,message = "项目类型不能为空",fun = Check.NotNull)
     @ImportCell
     @ExportCell(columnName = "项目类型")
-    private String cate;
+    private Long cate;
 
     /**
      * 业务来源
      */
+    @AbcValidate(required = true,message = "业务来源不能为空",fun = Check.NotNull)
     @ImportCell
     @ExportCell(columnName = "业务来源")
-    private String businessSource;
+    private Long businessSource;
 
     /**
      * 归属单位

+ 28 - 1
domain/src/main/java/com/dayou/enums/GlobalConfigEnum.java

@@ -9,7 +9,8 @@ package com.dayou.enums;
  */
 public enum GlobalConfigEnum implements CodeMsgEnumInterface<String,CodeMsgEnumInterface<?,?>[]>{
 
-    FINANCE("FINANCE",Finance.values(),"财务配置")
+    FINANCE("FINANCE",Finance.values(),"财务配置"),
+    SYS("SYS",Sys.values(),"系统配置")
     ;
 
     private String key;
@@ -42,6 +43,32 @@ public enum GlobalConfigEnum implements CodeMsgEnumInterface<String,CodeMsgEnumI
         this.desc = desc;
     }
 
+    public enum Sys implements CodeMsgEnumInterface<String,String>{
+
+        MONTH_OF_YEAR("MONTH_OF_YEAR",null,"系统自定义一年月份")
+        ;
+        private String filed;
+
+        private String value;
+
+        private String desc;
+
+        Sys(String filed, String value, String desc) {
+            this.filed = filed;
+            this.value = value;
+            this.desc = desc;
+        }
+
+        @Override
+        public String getCode() {
+            return filed;
+        }
+
+        @Override
+        public String getMsg() {
+            return desc;
+        }
+    }
     public enum Finance implements CodeMsgEnumInterface<String,String>{
 
         NON_MARKETER_MONTH_BROKERAGE("NON_MARKETER_MONTH_BROKERAGE",null,"土规部非市场人员每月固定预提金额")

+ 16 - 0
domain/src/main/java/com/dayou/enums/MergeKeyInterface.java

@@ -0,0 +1,16 @@
+package com.dayou.enums;
+
+import org.apache.poi.ss.formula.functions.T;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/3/6
+ * created with IntelliJ IDEA.
+ */
+public interface MergeKeyInterface {
+
+   String mergeKey();
+
+}

+ 2 - 1
gen.iml

@@ -7,9 +7,10 @@
           <map>
             <entry key="com.zeroturnaround.jrebel.FormatVersion" value="7.0.0" />
             <entry key="jrebelEnabled" value="true" />
+            <entry key="lastExternalPluginCheckTime" value="1678063381765" />
           </map>
         </option>
-        <option name="version" value="4" />
+        <option name="version" value="5" />
       </configuration>
     </facet>
   </component>

+ 2 - 1
service.iml

@@ -7,9 +7,10 @@
           <map>
             <entry key="com.zeroturnaround.jrebel.FormatVersion" value="7.0.0" />
             <entry key="jrebelEnabled" value="true" />
+            <entry key="lastExternalPluginCheckTime" value="1678063381765" />
           </map>
         </option>
-        <option name="version" value="4" />
+        <option name="version" value="5" />
       </configuration>
     </facet>
   </component>

+ 1 - 1
service/pom.xml

@@ -31,7 +31,7 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
-            <version>4.11</version>
+            <version>4.12</version>
             <scope>test</scope>
         </dependency>
         <!-- excel工具 -->

+ 37 - 0
service/src/main/java/com/dayou/bo/BrokerageDetailBO.java

@@ -0,0 +1,37 @@
+package com.dayou.bo;
+
+import com.dayou.entity.ItemBrokerageDetail;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/3/6
+ * created with IntelliJ IDEA.
+ */
+@Data
+public class BrokerageDetailBO extends ItemBrokerageDetail {
+
+    /**
+     * 市场人员是否可以预提
+     */
+    private Boolean marketerAdvanceBrokerageAble;
+
+    /**
+     * 项目提成状态
+     */
+    private String itemBrokerageStatus;
+
+    /**
+     * 本年回款目标金额
+     */
+    private BigDecimal paymentTarget;
+
+    /**
+     * 当前回款金额
+     */
+    private BigDecimal currentPayment;
+}

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

@@ -1,5 +1,19 @@
 package com.dayou.brokerage;
 
+import com.dayou.bo.BrokerageDetailBO;
+import com.dayou.brokerage.Factory.BrokerageCalculateFactory;
+import com.dayou.brokerage.constants.BrokerageRule;
+import com.dayou.brokerage.handler.MarketerBrokerageHandler;
+import com.dayou.brokerage.validator.BrokerageValidator;
+import com.dayou.dto.ItemDTO;
+import com.dayou.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+
 /**
  * 类说明:
  *
@@ -7,7 +21,47 @@ package com.dayou.brokerage;
  * @since: 2023/3/3
  * created with IntelliJ IDEA.
  */
-public abstract class BrokerageCalculateSupport implements BrokerageCalculator {
+public abstract class BrokerageCalculateSupport  implements BrokerageCalculateFactory {
+
+    @Autowired
+    private BrokerageValidator brokerageValidator;
+
+    @Autowired
+    private MarketerBrokerageHandler marketerBrokerageHandler;
+
+    public BrokerageCalculator getCalculator(BrokerageRule rule){
+        switch (rule){
+            case LAND_MARKETER_RULE:
+                return marketerBrokerageHandler;
+            case LAND_OTHER_RULE:
+                return null;
+        }
+        return null;
+    }
+    /**
+     * 校验项目提成状态
+     * @param brokerageDetailBo
+     * @return
+     */
+    protected void checkItemBrokerageStatus(BrokerageDetailBO brokerageDetailBo){
+        brokerageValidator.checkItemBrokerageStatus(brokerageDetailBo);
+    }
 
+    /**
+     * 市场人员预提校验
+     * @param brokerageDetailBo
+     * @return
+     */
+    protected BrokerageDetailBO checkMarketerPredictBrokerage(BrokerageDetailBO brokerageDetailBo){
+        @NotNull
+        BigDecimal paymentTarget = brokerageDetailBo.getPaymentTarget();
+        BigDecimal avgMonthTarget = paymentTarget.divide(brokerageValidator.monthOfYear, 2, RoundingMode.HALF_UP);
+        int month = DateUtils.getMonth(new Date());
+        //当月应完成回款金额
+        BigDecimal brokerageTarget = avgMonthTarget.multiply(new BigDecimal(month));
+        brokerageValidator.checkMarketerPredictBrokerage(brokerageDetailBo,brokerageTarget);
+        return brokerageDetailBo;
+    }
 
+    public abstract BigDecimal predictAmount(ItemDTO itemDTO);
 }

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

@@ -1,5 +1,10 @@
 package com.dayou.brokerage;
 
+import com.dayou.brokerage.Factory.BrokerageCalculateFactory;
+import com.dayou.dto.ItemDTO;
+
+import java.math.BigDecimal;
+
 /**
  * 类说明:
  *
@@ -7,30 +12,26 @@ package com.dayou.brokerage;
  * @since: 2023/3/3
  * created with IntelliJ IDEA.
  */
-public interface BrokerageCalculator {
+public interface BrokerageCalculator extends BrokerageCalculateFactory {
 
     /**
      * 预估提成金额
      */
-    void predictAmount();
+    BigDecimal predictAmount(ItemDTO itemDTO);
 
     /**
      * 实际提成金额
      */
-    void actualAmount();
+    BigDecimal actualAmount(ItemDTO itemDTO);
 
     /**
      * 预提金额
      */
-    void advanceAmount();
+    BigDecimal advanceAmount();
 
-    /**
-     * 预提金额总和
-     */
-    void advanceTotalAmount();
 
     /**
      * 剩余未提金额
      */
-    void residueAmount();
+    BigDecimal residueAmount();
 }

+ 16 - 0
service/src/main/java/com/dayou/brokerage/Factory/BrokerageCalculateFactory.java

@@ -0,0 +1,16 @@
+package com.dayou.brokerage.Factory;
+
+import com.dayou.brokerage.BrokerageCalculator;
+import com.dayou.brokerage.constants.BrokerageRule;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/3/6
+ * created with IntelliJ IDEA.
+ */
+public interface BrokerageCalculateFactory {
+
+    BrokerageCalculator getCalculator(BrokerageRule rule);
+}

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

@@ -0,0 +1,24 @@
+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
+     */
+    BigDecimal advanceTimes();
+}

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

@@ -1,9 +1,15 @@
 package com.dayou.brokerage.config;
 
+import cn.hutool.core.util.StrUtil;
 import com.dayou.brokerage.validator.BrokerageValidator;
+import com.dayou.enums.GlobalConfigEnum;
+import com.dayou.service.IGlobalConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import java.math.BigDecimal;
+
 /**
  * 类说明:
  *
@@ -14,16 +20,17 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 public class BrokerageConfig {
 
-    private BrokerageValidator brokerageValidator;
-
-    @Bean
-    public BrokerageConfig getBrokerageConfig(BrokerageValidator brokerageValidator) {
-        BrokerageConfig brokerageConfig = new BrokerageConfig();
-        brokerageConfig.setBrokerageValidator(brokerageValidator);
-        return brokerageConfig;
+    @Bean(initMethod = "setStatus")
+    public BrokerageValidator brokerageValidator() {
+        BrokerageValidator brokerageValidator = new BrokerageValidator();
+        return brokerageValidator;
     }
 
-    public void setBrokerageValidator(BrokerageValidator brokerageValidator) {
-        this.brokerageValidator = brokerageValidator;
+    @Bean(initMethod = "loadRatioList")
+    public BrokerageMarketerRatioSet brokerageMarketerRatioSet(){
+        BrokerageMarketerRatioSet brokerageMarketerRatioSet = new BrokerageMarketerRatioSet();
+        return brokerageMarketerRatioSet;
     }
+
+
 }

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

@@ -0,0 +1,51 @@
+package com.dayou.brokerage.config;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.dayou.common.BaseEntity;
+import com.dayou.entity.BrokerageMarketerRatio;
+import com.dayou.enums.MergeKeyInterface;
+import com.dayou.service.IBrokerageMarketerRatioService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static com.dayou.common.Constants.MERGE_SYMBOL;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/3/6
+ * created with IntelliJ IDEA.
+ */
+public class BrokerageMarketerRatioSet extends BrokerageMarketerRatio implements MergeKeyInterface {
+
+
+    @Autowired
+    private IBrokerageMarketerRatioService brokerageMarketerRatioService;
+
+    private ConcurrentHashMap<String, BigDecimal> ratioList = new ConcurrentHashMap<String,BigDecimal>(256);
+
+
+    @Override
+    public String mergeKey() {
+        return super.getItemCate() +MERGE_SYMBOL+ super.getItemSource();
+    }
+
+    public void loadRatioList(){
+        List<BrokerageMarketerRatio> list = brokerageMarketerRatioService.list(new LambdaQueryWrapper<BrokerageMarketerRatio>()
+                .eq(BaseEntity::getDeleted, Boolean.FALSE));
+        list.stream().forEach(x->{
+            BrokerageMarketerRatioSet brokerageMarketerRatioSet = new BrokerageMarketerRatioSet();
+            BeanUtils.copyProperties(x,brokerageMarketerRatioSet);
+            ratioList.put(brokerageMarketerRatioSet.mergeKey(),new BigDecimal(x.getRatio().toString()));
+        });
+    }
+
+    public ConcurrentHashMap<String, BigDecimal> getRatioList() {
+        return ratioList;
+    }
+}

+ 60 - 0
service/src/main/java/com/dayou/brokerage/handler/MarketerBrokerageHandler.java

@@ -0,0 +1,60 @@
+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.config.BrokerageMarketerRatioSet;
+import com.dayou.brokerage.constants.BrokerageRule;
+import com.dayou.dto.ItemDTO;
+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/6
+ * created with IntelliJ IDEA.
+ */
+@Component
+@Slf4j
+public class MarketerBrokerageHandler extends BrokerageCalculateSupport implements BrokerageCalculator{
+
+    @Autowired
+    private BrokerageMarketerRatioSet brokerageMarketerRatioSet;
+
+    @Override
+    public BigDecimal predictAmount(ItemDTO itemDTO) {
+//        BrokerageDetailBO brokerageDetailBO = new BrokerageDetailBO();
+//        brokerageDetailBO.setItemBrokerageStatus("CLOSED");
+//        checkItemBrokerageStatus(brokerageDetailBO);
+//        checkMarketerPredictBrokerage(brokerageDetailBO);
+        String mergeKey = itemDTO.mergeKey();
+        BigDecimal ratio = brokerageMarketerRatioSet.getRatioList().get(mergeKey);
+        if (itemDTO.getAmount()!=null && ratio !=null){
+            return itemDTO.getAmount().multiply(ratio);
+        }
+        return BigDecimal.ZERO;
+    }
+
+    @Override
+    public BigDecimal actualAmount(ItemDTO itemDTO) {
+        return null;
+    }
+
+    @Override
+    public BigDecimal advanceAmount() {
+        return null;
+    }
+
+    @Override
+    public BigDecimal residueAmount() {
+        return null;
+    }
+
+
+}

+ 53 - 5
service/src/main/java/com/dayou/brokerage/validator/BrokerageValidator.java

@@ -1,6 +1,19 @@
 package com.dayou.brokerage.validator;
 
-import org.springframework.stereotype.Component;
+import cn.hutool.core.util.StrUtil;
+import com.dayou.bo.BrokerageDetailBO;
+import com.dayou.brokerage.config.BrokerageConfig;
+import com.dayou.brokerage.constants.BrokerageRule;
+import com.dayou.brokerage.constants.BrokerageState;
+import com.dayou.enums.GlobalConfigEnum;
+import com.dayou.exception.ErrorCode;
+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;
 
 /**
  * 类说明:提成校验器
@@ -9,16 +22,51 @@ import org.springframework.stereotype.Component;
  * @since: 2023/3/3
  * created with IntelliJ IDEA.
  */
-@Component
 public class BrokerageValidator {
 
+    @Autowired
+    private ApplicationContext applicationContext;
 
-    //todo m1 校验客户经理对此单是否可以预提
+    @Autowired
+    private IGlobalConfigService globalConfigService;
 
+    @Nullable
+    public BigDecimal monthOfYear;
 
-    //todo m2 校验项目提成状态是否被冻结
+    @Nullable
+    public BigDecimal nonMarketerMonthBrokerage;
 
-    //todo m3 校验参与者是否可继续预提
+    //todo 通过切面实现校验器更新
+    public void reloadBrokerageValidator(){
+        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
+        defaultListableBeanFactory.destroySingleton("brokerageValidator");
+        defaultListableBeanFactory.getBean("brokerageValidator",BrokerageValidator.class);
+    }
+    //校验客户经理对此单是否可以预提
+    public void checkMarketerPredictBrokerage(BrokerageDetailBO brokerageDetailBo, BigDecimal brokerageTarget){
+        if (brokerageDetailBo.getCurrentPayment().compareTo(brokerageTarget)== -1){
+            ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR2);
+        }
+    }
 
+    //校验项目提成状态
+    public void checkItemBrokerageStatus(BrokerageDetailBO brokerageDetailBo){
+        if (StrUtil.equals(BrokerageState.CLOSED.getCode(),brokerageDetailBo.getItemBrokerageStatus()) ||
+                StrUtil.equals(BrokerageState.FREEZE.getCode(),brokerageDetailBo.getItemBrokerageStatus())){
+            ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR);
+        }
+        if (StrUtil.equals(BrokerageRule.LAND_OTHER_RULE.getCode(),brokerageDetailBo.getBrokerageRule())
+                && StrUtil.equals(BrokerageState.NOT_START.getCode(),brokerageDetailBo.getItemBrokerageStatus())){
+            ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR1);
+        }
+    }
 
+    public void setStatus(){
+        nonMarketerMonthBrokerage = new BigDecimal(globalConfigService.getValue(GlobalConfigEnum.FINANCE.getCode(),
+                GlobalConfigEnum.Finance.NON_MARKETER_MONTH_BROKERAGE.getCode()));
+        monthOfYear = new BigDecimal(globalConfigService.getValue(GlobalConfigEnum.SYS.getCode(),
+                GlobalConfigEnum.Sys.MONTH_OF_YEAR.getCode()));
+    }
+
+    //todo m3 校验参与者是否可继续预提
 }

+ 5 - 0
service/src/main/java/com/dayou/processor/AppBootProcessor.java

@@ -3,8 +3,10 @@ package com.dayou.processor;
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.dayou.bo.PrivilegeTreeBO;
+import com.dayou.brokerage.validator.BrokerageValidator;
 import com.dayou.common.BaseEntity;
 import com.dayou.entity.*;
+import com.dayou.enums.GlobalConfigEnum;
 import com.dayou.enums.SexEnum;
 import com.dayou.service.*;
 import com.dayou.utils.DigestUtils;
@@ -20,6 +22,7 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -53,6 +56,7 @@ public class AppBootProcessor implements BeanPostProcessor, CommandLineRunner {
     @Autowired
     private IUserPostService userPostService;
 
+
     private Gson gson = new Gson();
 
     @Transactional(rollbackFor = Exception.class)
@@ -63,6 +67,7 @@ public class AppBootProcessor implements BeanPostProcessor, CommandLineRunner {
         initializeAdmin();
     }
 
+
     private void initializeAdmin() {
         //初始化超级管理员岗位
         Post superAdminPost = new Post();

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

@@ -25,4 +25,6 @@ public interface IGlobalConfigService extends IService<GlobalConfig> {
 
         Boolean delete(Long id);
 
+        String getValue(String key,String field);
+
 }

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

@@ -1,4 +1,5 @@
 package com.dayou.service;
+import com.dayou.dto.ItemDTO;
 import com.dayou.entity.ItemBrokerageDetail;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -25,4 +26,6 @@ public interface IItemBrokerageDetailService extends IService<ItemBrokerageDetai
 
         Boolean delete(Long id);
 
+        Boolean crateBrokerageDetail(ItemDTO itemDTO);
+
 }

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

@@ -9,6 +9,7 @@ import com.dayou.service.IGlobalConfigService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import org.springframework.beans.factory.InitializingBean;
+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;
@@ -50,6 +51,8 @@ public class GlobalConfigServiceImpl extends ServiceImpl<GlobalConfigMapper, Glo
     }
 
 
+    @Autowired
+    private GlobalConfigMapper globalConfigMapper;
     @Override
     @SuppressWarnings("unchecked")
     public Page<GlobalConfig> selectPage(Page page,GlobalConfig globalConfig){
@@ -65,7 +68,7 @@ public class GlobalConfigServiceImpl extends ServiceImpl<GlobalConfigMapper, Glo
     @Override
     public Boolean add(GlobalConfig globalConfig){
         GlobalConfig config = this.getOne(new LambdaQueryWrapper<GlobalConfig>()
-                .eq(GlobalConfig::getName, globalConfig.getName())
+                .eq(GlobalConfig::getKey, globalConfig.getKey())
                 .eq(GlobalConfig::getField, globalConfig.getField())
                 .eq(BaseEntity::getDeleted, Boolean.FALSE));
 
@@ -88,6 +91,11 @@ public class GlobalConfigServiceImpl extends ServiceImpl<GlobalConfigMapper, Glo
     }
 
     @Override
+    public String getValue(String key, String field) {
+        return globalConfigMapper.getValueByKeyFiled(key,field);
+    }
+
+    @Override
     public void afterPropertiesSet() throws Exception {
 
         List<GlobalConfig> list = Lists.newLinkedList();
@@ -100,7 +108,7 @@ public class GlobalConfigServiceImpl extends ServiceImpl<GlobalConfigMapper, Glo
                 String field = c.getCode();
                 String description = c.getMsg();
                 GlobalConfig g = new GlobalConfig();
-                g.setName(key);
+                g.setKey(key);
                 g.setField(field);
                 g.setDescription(description);
                 fieldList.add(g);

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

@@ -1,9 +1,14 @@
 package com.dayou.service.impl;
 
+import com.dayou.brokerage.BrokerageCalculator;
+import com.dayou.brokerage.Factory.BrokerageCalculateFactory;
+import com.dayou.brokerage.constants.BrokerageRule;
+import com.dayou.dto.ItemDTO;
 import com.dayou.entity.ItemBrokerageDetail;
 import com.dayou.mapper.ItemBrokerageDetailMapper;
 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;
@@ -36,6 +41,8 @@ import com.dayou.enums.BatchTaskTypeEnum;
 public class ItemBrokerageDetailServiceImpl extends ServiceImpl<ItemBrokerageDetailMapper, ItemBrokerageDetail> implements IItemBrokerageDetailService {
 
 
+    @Autowired
+    private BrokerageCalculateFactory brokerageCalculateFactory;
     @Override
     @SuppressWarnings("unchecked")
     public Page<ItemBrokerageDetail> selectPage(Page page,ItemBrokerageDetail itemBrokerageDetail){
@@ -63,4 +70,11 @@ public class ItemBrokerageDetailServiceImpl extends ServiceImpl<ItemBrokerageDet
         //逻辑删除
         return this.removeById(id);
     }
+
+    @Override
+    public Boolean crateBrokerageDetail(ItemDTO itemDTO) {
+        BrokerageCalculator calculator = brokerageCalculateFactory.getCalculator(BrokerageRule.LAND_MARKETER_RULE);
+        calculator.predictAmount(itemDTO);
+        return null;
+    }
 }