فهرست منبع

提成功能自测修改

wucl 2 سال پیش
والد
کامیت
db2a3affa9
31فایلهای تغییر یافته به همراه481 افزوده شده و 49 حذف شده
  1. 4 1
      biz-base/src/main/java/com/dayou/controller/BusinessOpportunityController.java
  2. 1 1
      biz-base/src/main/java/com/dayou/controller/CustomerController.java
  3. 2 2
      biz-base/src/main/java/com/dayou/controller/ItemController.java
  4. 4 1
      biz-base/src/main/java/com/dayou/controller/MarketLogController.java
  5. 3 1
      biz-base/src/main/java/com/dayou/controller/MarketStatController.java
  6. 4 2
      biz-base/src/main/java/com/dayou/controller/PaymentCollectionController.java
  7. 3 1
      biz-base/src/main/java/com/dayou/controller/UserTargetController.java
  8. 4 1
      biz-base/src/main/java/com/dayou/controller/VisitController.java
  9. 2 0
      dao/src/main/java/com/dayou/mapper/ItemBrokerageGeneralMapper.java
  10. 4 0
      dao/src/main/java/com/dayou/mapper/ItemMapper.java
  11. 5 0
      dao/src/main/java/com/dayou/mapper/UserPostMapper.java
  12. 4 0
      dao/src/main/resources/mapper/ItemBrokerageGeneralMapper.xml
  13. 18 0
      dao/src/main/resources/mapper/ItemMapper.xml
  14. 20 0
      dao/src/main/resources/mapper/UserPostMapper.xml
  15. 6 0
      domain/src/main/java/com/dayou/annotation/DataPermission.java
  16. 2 0
      domain/src/main/java/com/dayou/common/Constants.java
  17. 126 0
      domain/src/main/java/com/dayou/dto/ItemBrokerageGeneralDTO.java
  18. 13 0
      domain/src/main/java/com/dayou/entity/ItemBrokerageGeneral.java
  19. 37 4
      service/src/main/java/com/dayou/aspect/DataPermissionAop.java
  20. 1 1
      service/src/main/java/com/dayou/brokerage/BrokerageCalculateSupport.java
  21. 6 1
      service/src/main/java/com/dayou/brokerage/MarketerBrokerageCalculator.java
  22. 7 1
      service/src/main/java/com/dayou/brokerage/constants/BrokerageMsg.java
  23. 24 4
      service/src/main/java/com/dayou/brokerage/handler/LandMarketerBrokerageHandler.java
  24. 2 0
      service/src/main/java/com/dayou/service/ITeamMemberService.java
  25. 5 0
      service/src/main/java/com/dayou/service/IUserPostService.java
  26. 119 22
      service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java
  27. 12 2
      service/src/main/java/com/dayou/service/impl/MarketStatServiceImpl.java
  28. 21 0
      service/src/main/java/com/dayou/service/impl/TeamMemberServiceImpl.java
  29. 7 1
      service/src/main/java/com/dayou/service/impl/TeamServiceImpl.java
  30. 14 0
      service/src/main/java/com/dayou/service/impl/UserPostServiceImpl.java
  31. 1 3
      service/src/main/java/com/dayou/service/impl/UserServiceImpl.java

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

@@ -23,6 +23,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.common.Constants.MANAGER_OFFICE;
+
 /**
  * 商机
  *
@@ -39,7 +42,7 @@ public class BusinessOpportunityController extends BaseController {
     /**
     * 商机列表
     */
-    @DataPermission
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
     @GetMapping("")
     public RestResponse<Page<BusinessOpportunityVO>> page(BusinessOpportunityVO businessOpportunity, Page page){
         Page<BusinessOpportunityVO> pages=businessOpportunityService.selectPage(page,businessOpportunity);

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

@@ -49,7 +49,7 @@ public class CustomerController extends BaseController {
     /**
     * 客户表列表
     */
-    @DataPermission(ignoreDepartment = {MANAGER_OFFICE})
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
     @GetMapping("")
     public RestResponse<Page<CustomerDTO>> page(CustomerDTO customer, Page page){
         Page<CustomerDTO> pages=customerService.selectPage(page,customer);

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

@@ -75,7 +75,7 @@ public class ItemController extends BaseController {
     /**
      * 市场部项目列表 (包含客户经理是自己或客户经理是自己下属的项目)
      */
-    @DataPermission
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
     @GetMapping("/mine")
     public RestResponse<Page<ItemVO>> xPage(ItemDTO item, Page page){
         Page<ItemVO> pages=itemService.selectPage(page,item);
@@ -85,7 +85,7 @@ public class ItemController extends BaseController {
     /**
      * 市场部项目列表 (包含客户经理是自己或客户经理是自己下属的项目) 导出
      */
-    @DataPermission
+    @DataPermission(teamData = true,postChild = false)
     @GetMapping("/mine/export")
     public void exportDataMine(ItemDTO item, HttpServletResponse response) throws IOException {
         List<ItemVO> list = itemService.xMineList(item);

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

@@ -27,6 +27,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.common.Constants.MANAGER_OFFICE;
+
 /**
  * 市场人员日志
  *
@@ -92,7 +95,7 @@ public class MarketLogController extends BaseController {
      * 日志汇总列表
      * @return
      */
-    @DataPermission
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
     @GetMapping("/collect")
     public RestResponse<List<ItemLogCollectVO>> logCollect(DataPermissionCondition condition){
         List<ItemLogCollectVO> result = marketLogService.logCollect(condition);

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

@@ -11,6 +11,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import static com.dayou.common.Constants.MANAGER_OFFICE;
+
 /**
  * 全局配置
  *
@@ -29,7 +31,7 @@ public class MarketStatController {
      * 市场首页统计数据
      * @return
      */
-    @DataPermission
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
     @GetMapping("")
     public RestResponse<MarketStatVO> marketStat(MarketStatDTO dto){
         MarketStatVO marketStatVO = marketStatService.marketStat(dto);

+ 4 - 2
biz-base/src/main/java/com/dayou/controller/PaymentCollectionController.java

@@ -28,6 +28,8 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.xml.crypto.dsig.keyinfo.RetrievalMethod;
 
+import static com.dayou.common.Constants.MANAGER_OFFICE;
+
 /**
  * 回款记录
  *
@@ -44,7 +46,7 @@ public class PaymentCollectionController extends BaseController {
     /**
     * 回款记录列表
     */
-    @DataPermission
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
     @GetMapping("")
     public RestResponse<Page<PaymentCollectionVO>> page(PaymentCollectionVO paymentCollection, Page page){
         Page<PaymentCollectionVO> pages=paymentCollectionService.selectPage(page,paymentCollection);
@@ -108,7 +110,7 @@ public class PaymentCollectionController extends BaseController {
      * 项目回款列表
      * @return
      */
-    @DataPermission
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
     @GetMapping("/item")
     public RestResponse<IPage<ItemPaymentVO>> getItemPayment(PaymentCollectionVO paymentCollectionVO,Page page){
         IPage<ItemPaymentVO> result = paymentCollectionService.getItemPayment(page,paymentCollectionVO);

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

@@ -13,6 +13,8 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
+import static com.dayou.common.Constants.MANAGER_OFFICE;
+
 /**
  * 员工目标
  *
@@ -26,7 +28,7 @@ public class UserTargetController extends BaseController {
     @Autowired
     private IUserTargetService userTargetService;
 
-    @DataPermission
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
     @GetMapping("/list")
     public RestResponse<List<UserTargetVO>> list(UserTargetVO userTargetVO){
         List<UserTargetVO> result = userTargetService.getList(userTargetVO);

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

@@ -24,6 +24,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.common.Constants.MANAGER_OFFICE;
+
 /**
  * 拜访记录表
  *
@@ -40,7 +43,7 @@ public class VisitController extends BaseController {
     /**
     * 拜访记录表列表
     */
-    @DataPermission
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
     @GetMapping("")
     public RestResponse<Page<VisitVO>> page(VisitVO visit, Page page,String keyword){
         Page<VisitVO> pages=visitService.selectPage(page,visit,keyword);

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

@@ -17,4 +17,6 @@ import org.apache.ibatis.annotations.Param;
 public interface ItemBrokerageGeneralMapper extends CustomBaseMapper<ItemBrokerageGeneral> {
 
     Page<BrokerageGeneralVO> aheadPage(Page page, @Param("itemBrokerageGeneral") BrokerageGeneralVO itemBrokerageGeneral);
+
+    ItemBrokerageGeneral getByItemId(@Param("itemId") Long itemId);
 }

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

@@ -1,6 +1,7 @@
 package com.dayou.mapper;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dayou.dto.ItemBrokerageGeneralDTO;
 import com.dayou.dto.ItemDTO;
 import com.dayou.entity.Item;
 import com.dayou.dao.CustomBaseMapper;
@@ -12,6 +13,7 @@ import org.apache.ibatis.annotations.Param;
 
 import java.time.LocalDate;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -43,4 +45,6 @@ public interface ItemMapper extends CustomBaseMapper<Item> {
     List<ItemVO> xMineList( @Param("item") ItemDTO item);
 
     ItemDTO  getItemByBrokerageGeneralId(@Param("generalId") Long generalId);
+
+    Set<ItemBrokerageGeneralDTO> getLastMonthTeamItems(@Param("lastMonth23")LocalDate lastMonth23, @Param("juniorUserIds") Set<Long> juniorUserIds);
 }

+ 5 - 0
dao/src/main/java/com/dayou/mapper/UserPostMapper.java

@@ -7,6 +7,7 @@ import com.dayou.dao.CustomBaseMapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -21,4 +22,8 @@ public interface UserPostMapper extends CustomBaseMapper<UserPost> {
     List<SimplePostModel> getPostList(@Param("userId") Long userId);
 
     void saveOrUpdateById(@Param("userPost") UserPost userPost);
+
+    Set<Long> getPostUserId(@Param("juniorPost") Set<Long> juniorPost);
+
+    SimplePostModel getMarketPostList(@Param("userId") Long userId);
 }

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

@@ -93,4 +93,8 @@
         ORDER BY
             ibg.id DESC
     </select>
+
+    <select id="getByItemId" parameterType="java.lang.Long" resultType="com.dayou.entity.ItemBrokerageGeneral">
+        select * from item_brokerage_general where item_id= #{itemId} and deleted = 0
+    </select>
 </mapper>

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

@@ -374,4 +374,22 @@
     <select id="getItemByBrokerageGeneralId" parameterType="java.lang.Long" resultType="com.dayou.dto.ItemDTO">
         select <include refid="Base_Column_List"/>,ibg.brokerage_rate as ratio from item_brokerage_general ibg left join item i on i.id = ibg.item_id where i.deleted = 0 and ibg.deleted = 0 and ibg.id = #{generalId}
     </select>
+
+    <select id="getLastMonthTeamItems" resultType="com.dayou.dto.ItemBrokerageGeneralDTO">
+        select ibg.*,i.amount,i.user_id
+        FROM
+            item i
+                left join item_brokerage_general ibg on ibg.item_id = i.id
+        WHERE
+            i.deleted = 0
+          and i.upload_date is not null
+          AND i.upload_date &gt;= #{lastMonth23}
+          AND i.upload_date &lt;= concat( date_format( LAST_DAY( now()), '%Y-%m-' ), '22' )
+          AND i.user_id in (
+              <foreach collection="juniorUserIds" index="index" item="item" separator=",">
+                  #{item}
+              </foreach>
+            )
+          and ibg.marketer_status != 'CLOSED'
+    </select>
 </mapper>

+ 20 - 0
dao/src/main/resources/mapper/UserPostMapper.xml

@@ -39,4 +39,24 @@
         on duplicate key update
         id=id
     </insert>
+
+    <select id="getPostUserId" parameterType="java.util.Set" resultType="java.lang.Long">
+        select id from user u right join (select distinct user_id from user_post where post_id in (
+            <foreach collection="juniorPost" item="item" index="index" separator=",">
+                #{item}
+            </foreach>
+            ) and deleted = 0 ) up on up.user_id = u.id where u.deleted = 0 and enable = 1
+    </select>
+
+    <select id="getMarketPostList" parameterType="java.lang.Long" resultType="com.dayou.dto.SimplePostModel">
+        select p.id as id,p.name as name,p.department_id as departmentId,p.parent_id as parentId
+        from user_post t
+                 join
+             post p
+             on t.post_id = p.id
+        left join department d on d.id = p.department_id
+        where t.user_id = #{userId} and d.name = '市场部'
+          and t.deleted = false
+          and p.deleted = false
+    </select>
 </mapper>

+ 6 - 0
domain/src/main/java/com/dayou/annotation/DataPermission.java

@@ -44,4 +44,10 @@ public @interface DataPermission {
      * @return
      */
     String[] ignorePost() default {};
+
+    /**
+     * 团队数据 主要针对主管级别
+     * @return
+     */
+    boolean teamData() default false;
 }

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

@@ -88,4 +88,6 @@ public interface Constants {
     String SALESMAN = "客户经理-业务员";
 
     String SUPERVISOR = "营销主管";
+
+    String MARKET_MANAGER = "市场部经理";
 }

+ 126 - 0
domain/src/main/java/com/dayou/dto/ItemBrokerageGeneralDTO.java

@@ -0,0 +1,126 @@
+package com.dayou.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/4/11
+ * created with IntelliJ IDEA.
+ */
+@Data
+public class ItemBrokerageGeneralDTO {
+
+    /**
+     * 主键自增id
+     *
+     * @ignore
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    protected Long id;
+
+    /**
+     * 创建时间
+     *
+     * @ignore
+     */
+    private Date created;
+
+    /**
+     * 修改时间
+     *
+     * @ignore
+     */
+    private Date modified;
+
+    /**
+     * 标志位
+     *
+     * @ignore
+     */
+    @JsonIgnore
+    private Boolean deleted;
+
+    /**
+     * 项目id
+     */
+    private Long itemId;
+
+    /**
+     * 客户经理提成金额
+     */
+    private BigDecimal marketerBrokerageAmount;
+
+    /**
+     * 客户经理预提
+     */
+    private Boolean marketerAdvanceBrokerageAble;
+
+    /**
+     * 客户经理已预提
+     */
+    private Boolean marketerAdvanceBrokerageDone;
+
+    /**
+     * 参与人预计提成总金额
+     */
+    @TableField("participant_predict_brokerage_amount")
+    private BigDecimal participantPredictBrokerageAmount;
+
+    /**
+     * 参与人实际提成总金额
+     */
+    @TableField("participant_actual_brokerage_amount")
+    private BigDecimal participantActualBrokerageAmount;
+
+    /**
+     * 参与人预提中
+     */
+    private Boolean participantAdvanceStatus;
+
+    /**
+     * 预计提成总金额
+     */
+    private BigDecimal brokeragePredictAmount;
+
+    /**
+     * 已提成总金额
+     */
+    private BigDecimal brokerageActualAmount;
+
+    /**
+     * 提成率
+     */
+    private BigDecimal brokerageRate;
+
+    /**
+     * 参与人提成状态
+     */
+    private String participantStatus;
+
+    /**
+     * 客户经理提成状态
+     */
+    private String marketerStatus;
+
+    /**
+     * 合同金额
+     */
+    @TableField(exist = false,select = false)
+    private BigDecimal amount;
+
+    /**
+     * 客户经理id
+     */
+    @TableField(exist = false,select = false)
+    private Long userId;
+
+}

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

@@ -2,6 +2,7 @@ package com.dayou.entity;
 import java.math.BigDecimal;
 
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.dayou.common.BaseEntity;
 import lombok.Builder;
 import lombok.Data;
@@ -86,5 +87,17 @@ public class ItemBrokerageGeneral extends BaseEntity {
      * 客户经理提成状态
      */
     private String marketerStatus;
+//
+//    /**
+//     * 合同金额
+//     */
+//    @TableField(exist = false,select = false)
+//    private BigDecimal amount;
+//
+//    /**
+//     * 客户经理id
+//     */
+//    @TableField(exist = false,select = false)
+//    private Long userId;
 
 }

+ 37 - 4
service/src/main/java/com/dayou/aspect/DataPermissionAop.java

@@ -1,11 +1,15 @@
 package com.dayou.aspect;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.dayou.annotation.DataPermission;
 import com.dayou.bo.SimpleParentModel;
+import com.dayou.brokerage.constants.BrokerageRule;
+import com.dayou.common.BaseEntity;
 import com.dayou.common.SimpleListModel;
 import com.dayou.dto.SimplePostModel;
-import com.dayou.service.IPostService;
-import com.dayou.service.IUserService;
+import com.dayou.entity.Team;
+import com.dayou.entity.TeamMember;
+import com.dayou.service.*;
 import com.dayou.utils.LoginContext;
 import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.ProceedingJoinPoint;
@@ -20,6 +24,9 @@ import java.lang.reflect.Field;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.dayou.common.Constants.MARKET_MANAGER;
+import static com.dayou.common.Constants.SUPERVISOR;
+
 /**
  * 类说明:
  *
@@ -39,6 +46,15 @@ public class DataPermissionAop {
     @Autowired
     private IPostService postService;
 
+    @Autowired
+    private ITeamMemberService teamMemberService;
+
+    @Autowired
+    private IUserPostService userPostService;
+
+    @Autowired
+    private ITeamService teamService;
+
     @Pointcut("@annotation(com.dayou.annotation.DataPermission)")
     public void dataPermissionPointcut(){
 
@@ -51,6 +67,7 @@ public class DataPermissionAop {
         List<SimpleParentModel> departmentList = LoginContext.getLoginCacheUserBO().getDepartmentList();
         List<String> departmentNames = departmentList.stream().map(SimpleListModel::getName).collect(Collectors.toList());
         List<SimplePostModel> postList = LoginContext.getLoginCacheUserBO().getPostList();
+        Long userId = LoginContext.getUserId();
 
         List<String> ignores = Arrays.asList(dataPermission.ignoreDepartment());
         if (!CollectionUtils.isEmpty(ignores) && !Collections.disjoint(departmentNames,ignores)){
@@ -79,15 +96,31 @@ public class DataPermissionAop {
 
         if (dataPermission.postChild()){
             Set<Long> users = new HashSet<>();
-            Long userId = LoginContext.getUserId();
             //根据当前登录人获取下属员工id
             users = userService.getJuniorUserId(userId);
             users.add(userId);
             Field userIds = arg.getClass().getDeclaredField("userIds");
             userIds.setAccessible(Boolean.TRUE);
             userIds.set(arg,users);
+        }else if(dataPermission.teamData()){
+            Set<Long> users = new HashSet<>();
+            SimplePostModel postModel = userPostService.getMarketPostList(userId);
+            if (postModel.getName().equals(SUPERVISOR)){
+                Long teamId = teamService.getOne(new LambdaQueryWrapper<Team>().eq(Team::getSupervisorId, userId).eq(BaseEntity::getDeleted, Boolean.FALSE)).getId();
+                users = teamMemberService.list(new LambdaQueryWrapper<TeamMember>()
+                        .eq(TeamMember::getTeamId,teamId).eq(BaseEntity::getDeleted,Boolean.FALSE)).stream().map(TeamMember::getMemberId).collect(Collectors.toSet());
+            }
+            else if (postModel.getName().equals(MARKET_MANAGER)){
+                users = userService.getJuniorUserId(userId);
+                users.add(userId);
+
+            }else {
+                users.add(userId);
+            }
+            Field userIds = arg.getClass().getDeclaredField("userIds");
+            userIds.setAccessible(Boolean.TRUE);
+            userIds.set(arg,users);
         }else {
-            Long userId = LoginContext.getUserId();
             Set<Long> users = new HashSet<>();
             users.add(userId);
             Field userIds = arg.getClass().getDeclaredField("userIds");

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

@@ -125,7 +125,7 @@ public class BrokerageCalculateSupport implements BrokerageCalculateFactory,Brok
      * @param teamPaymentTarget
      * @return
      */
-    protected Boolean checkTeamMonthlyPayment(BigDecimal teamCurrentYearPayment,BigDecimal teamPaymentTarget){
+    public Boolean checkTeamMonthlyPayment(BigDecimal teamCurrentYearPayment,BigDecimal teamPaymentTarget){
         if (teamPaymentTarget.compareTo(BigDecimal.ZERO)!=0){
             BigDecimal avgMonthTarget = teamPaymentTarget.divide(MONTH_OF_YEAR, 2, RoundingMode.HALF_UP);
             int month = DateUtils.getMonth(new Date());

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

@@ -34,7 +34,12 @@ public interface MarketerBrokerageCalculator extends BrokerageCalculator {
     BigDecimal actualTeamShareAmount(ItemBrokerageDetail itemBrokerageDetail);
 
     /**
-     * 营销主管提成计算
+     * 营销主管个人 提成部分 计算
+     */
+    BrokerageDetailBO supervisorPersonalAmount(BrokerageDetailBO bo);
+
+    /**
+     * 营销主管团队提成部分 计算
      * @param signAmount 合同签约金额
      * @param userId 提成用户id
      * @param postRatio 岗位提成率

+ 7 - 1
service/src/main/java/com/dayou/brokerage/constants/BrokerageMsg.java

@@ -22,9 +22,13 @@ public class BrokerageMsg {
      */
     public static final BigDecimal MARKETER_AHEAD_SCALE = new BigDecimal("0.4");
 
+    /**
+     * 营销主管固定提成系数
+     */
+    public static final BigDecimal SUPERVISOR_DEFAULT_BROKERAGE_SCALE = new BigDecimal("0.4");
 
     /**
-     * 营销主管提成系数
+     * 营销主管浮动提成系数
      */
     public static final BigDecimal SUPERVISOR_BROKERAGE_SCALE = new BigDecimal("0.5");
 
@@ -67,4 +71,6 @@ public class BrokerageMsg {
      * 市场部部门经理浮动提成系数
      */
     public static final BigDecimal MANAGER_FLOAT_RATIO_8 = new BigDecimal("0.8");
+
+
 }

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

@@ -74,8 +74,7 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
     @Override
     public BrokerageDetailBO predictPersonalAmount(BrokerageDetailBO bo) {
         try {
-            String mergeKey = bo.mergeKey();
-            BigDecimal ratio = marketerRatioCache.get(mergeKey);
+            BigDecimal ratio = bo.getRate()!=null?bo.getRate():marketerRatioCache.get(bo.mergeKey());
             bo.setRate(ratio);
             if (ratio !=null){
                 checkItemBrokerageStatus(bo);
@@ -108,8 +107,7 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
     public Set<ItemBrokerageDetail> predictTeamShareAmount(BrokerageDetailBO bo, Set<LeaderRatioBO> leaderRatioBOSet) {
         Set<ItemBrokerageDetail> itemBrokerageDetails = Sets.newHashSet();
         try {
-            String mergeKey = bo.mergeKey();
-            BigDecimal ratio = marketerRatioCache.get(mergeKey);
+            BigDecimal ratio = bo.getRate()!=null?bo.getRate():marketerRatioCache.get(bo.mergeKey());
             if (ratio!=null){
                 checkItemBrokerageStatus(bo);
                 itemBrokerageDetails = leaderRatioBOSet.stream().map(x -> {
@@ -159,6 +157,28 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
     }
 
     @Override
+    public BrokerageDetailBO supervisorPersonalAmount(BrokerageDetailBO bo) {
+        try {
+            String mergeKey = bo.mergeKey();
+            BigDecimal ratio = marketerRatioCache.get(mergeKey);
+            bo.setRate(ratio);
+            if (ratio !=null){
+                checkItemBrokerageStatus(bo);
+                bo.setPredictAmount(bo.getAmount().multiply(ratio.divide(HUNDRED)).multiply(SUPERVISOR_DEFAULT_BROKERAGE_SCALE));
+                bo.setBrokerageMode(BrokerageMode.PERSONAL.getCode());
+                bo.setActualAmount(actualAmount(bo.getPredictAmount()));
+            }else {
+                log.info("项目id:[{}],合同金额:[{}],提成系数:[null],[未设置提成系数,无法计算个人提成]",bo.getId(),bo.getAmount());
+            }
+        }   catch (BusinessException e) {
+            log.info("项目id:[{}],人员id:[{}],[{}]",bo.getId(),bo.getUserId(),e.getMessage());
+        } catch (ExecutionException e) {
+            throw new RuntimeException(e);
+        }
+        return bo;
+    }
+
+    @Override
     public BigDecimal supervisorAmount(BigDecimal signAmount,Long supervisorId,BigDecimal postRatio, BigDecimal ratio) {
         //营销主管的团队提成规则 : (合同额(团队签的)*项目类型提成系数 * 40% *0.5 )+ [合同额(团队签的)*项目类型提成系数*40%*0.5 * 实发系数(取决于团队回款目标是否完成)]
         BigDecimal amount = signAmount

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

@@ -32,4 +32,6 @@ public interface ITeamMemberService extends IService<TeamMember> {
 
         Set<LeaderRatioBO> getLeader(Long userId,String departmentName);
 
+        Set<Long> getJuniorUserIds(Long userId);
+
 }

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

@@ -9,6 +9,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -39,4 +40,8 @@ public interface IUserPostService extends IService<UserPost> {
         List<SimplePostModel> getPostList(Long userId);
 
     void saveOrUpdateById(UserPost userPost);
+
+    Set<Long> getPostUserId(Set<Long> juniorPost);
+
+    SimplePostModel getMarketPostList(Long userId);
 }

+ 119 - 22
service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java

@@ -1,10 +1,12 @@
 package com.dayou.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.dayou.bo.BrokerageDetailBO;
 import com.dayou.bo.LeaderRatioBO;
 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;
@@ -12,8 +14,10 @@ import com.dayou.brokerage.constants.BrokerageRule;
 import com.dayou.brokerage.constants.BrokerageState;
 import com.dayou.brokerage.validator.BrokerageValidator;
 import com.dayou.common.BaseEntity;
+import com.dayou.dto.ItemBrokerageGeneralDTO;
 import com.dayou.dto.ItemDTO;
 import com.dayou.dto.ParticipantSettleDTO;
+import com.dayou.dto.SimplePostModel;
 import com.dayou.entity.*;
 import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.*;
@@ -24,6 +28,7 @@ import com.dayou.vo.BrokerageGeneralVO;
 import com.dayou.vo.ItemStageVO;
 import com.google.common.collect.Sets;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.beanutils.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -32,6 +37,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -39,7 +45,8 @@ import java.util.stream.Collectors;
 
 import org.springframework.transaction.annotation.Transactional;
 
-import static com.dayou.common.Constants.MARKET_DEPARTMENT;
+import static com.dayou.brokerage.constants.BrokerageRule.LAND_MARKETER_RULE;
+import static com.dayou.common.Constants.*;
 
 /**
  * <p>
@@ -67,7 +74,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     private IMarketStatService marketStatService;
 
     @Autowired
-    private IUserService userService;
+    private IUserPostService userPostService;
 
     @Autowired
     private ItemMapper itemMapper;
@@ -120,7 +127,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     @Transactional
     @Override
     public void doCreateBrokerageGeneralAndDetail(BrokerageDetailBO bo) {
-        MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(BrokerageRule.LAND_MARKETER_RULE);
+        MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(LAND_MARKETER_RULE);
             Long userId = bo.getUserId();
         UserTarget userTarget = userTargetService.getUserTarget(userId);
         BigDecimal currentYearPayment = marketStatService.currentYearPayment(userId);
@@ -129,8 +136,13 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         bo.setPaymentTarget(paymentTarget);
         //Set<LeaderRatioBO> leaderRatioBO = userService.getLeaderRatioBO(userId).stream().filter(x->x.getRatio()!=null).collect(Collectors.toSet());
         Set<LeaderRatioBO> leaderRatioBO = teamMemberService.getLeader(bo.getUserId(), MARKET_DEPARTMENT).stream().filter(x->x.getRatio()!=null).collect(Collectors.toSet());
-        //创建下单人(客户经理)提成记录
-        bo = calculator.predictPersonalAmount(bo);
+        //创建下单人(客户经理或营销主管个人提成部分)提成记录
+        if (bo.getBrokerageRule().equals(LAND_MARKETER_RULE.getCode())){
+            bo = calculator.predictPersonalAmount(bo);
+        }
+        if (bo.getBrokerageRule().equals(BrokerageRule.LAND_SUPERVISOR_RULE.getCode())){
+            bo = calculator.supervisorPersonalAmount(bo);
+        }
         //创建下单人领导提成记录
         Set<ItemBrokerageDetail> brokerageLeaderDetailBOS = calculator.predictTeamShareAmount(bo, leaderRatioBO);
         BigDecimal leaderPredictTotalAmount = brokerageLeaderDetailBOS.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -155,9 +167,19 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     @Override
     public void addMarketerBrokerage(Long id) {
         Item item = itemMapper.selectById(id);
+        //下单人id
+        Long userId = item.getUserId();
+        SimplePostModel postModel = userPostService.getMarketPostList(userId);
+        String brokerageRule = LAND_MARKETER_RULE.getCode();
+        if (postModel.getName().equals(SUPERVISOR)){
+            brokerageRule = BrokerageRule.LAND_SUPERVISOR_RULE.getCode();
+        }
+        if (postModel.getName().equals(MARKET_MANAGER)){
+            brokerageRule = BrokerageRule.LAND_MANAGER_RULE.getCode();
+        }
         if (item.getAmount()!=null){
             BrokerageDetailBO brokerageDetailBO = BrokerageDetailBO.builder().amount(item.getAmount()).cate(item.getCate()).businessSource(item.getBusinessSource()).itemId(id).build();
-            brokerageDetailBO.setBrokerageRule(BrokerageRule.LAND_MARKETER_RULE.getCode());
+            brokerageDetailBO.setBrokerageRule(brokerageRule);
             brokerageDetailBO.setAdvanceAmount(BigDecimal.ZERO);
             brokerageDetailBO.setPredictAmount(BigDecimal.ZERO);
             brokerageDetailBO.setActualAmount(BigDecimal.ZERO);
@@ -174,14 +196,14 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     @Transactional
     @Override
     public void editMarketerBrokerage(ItemDTO itemDTO) {
-        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemDTO.getId()).eq(BaseEntity::getDeleted,Boolean.FALSE));
+        ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(itemDTO.getId());
         ItemBrokerageDetail marketerDetail = iItemBrokerageDetailService.getOne(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId, general.getId())
-                .eq(BaseEntity::getDeleted, Boolean.FALSE).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode()).eq(ItemBrokerageDetail::getBrokerageRule,BrokerageRule.LAND_MARKETER_RULE.getCode()));
+                .eq(BaseEntity::getDeleted, Boolean.FALSE).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode()));
         if (general == null || marketerDetail == null){
             log.info("更新项目信息时发现未创建提成总表和明细表记录,更新提成信息逻辑终止。");
             return;
         }
-        MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(BrokerageRule.LAND_MARKETER_RULE);
+        MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(LAND_MARKETER_RULE);
         //更新客户经理的提成记录
         UserTarget userTarget = userTargetService.getUserTarget(marketerDetail.getUserId());
         BigDecimal currentMonthPayment = marketStatService.currentMonthPayment(marketerDetail.getUserId());
@@ -191,7 +213,14 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         brokerageDetailBO.setId(marketerDetail.getId());
         brokerageDetailBO.setGeneralId(general.getId());
         brokerageDetailBO.setMarketerStatus(general.getMarketerStatus());
-        brokerageDetailBO = calculator.predictPersonalAmount(brokerageDetailBO);
+        brokerageDetailBO.setBrokerageRule(marketerDetail.getBrokerageRule());
+        //创建下单人(客户经理或营销主管个人提成部分)提成记录
+        if (brokerageDetailBO.getBrokerageRule().equals(LAND_MARKETER_RULE.getCode())){
+            brokerageDetailBO = calculator.predictPersonalAmount(brokerageDetailBO);
+        }
+        if (brokerageDetailBO.getBrokerageRule().equals(BrokerageRule.LAND_SUPERVISOR_RULE.getCode())){
+            brokerageDetailBO = calculator.supervisorPersonalAmount(brokerageDetailBO);
+        }
         iItemBrokerageDetailService.update(brokerageDetailBO);
 
 
@@ -213,7 +242,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     @Transactional
     @Override
     public void removeMarketerBrokerage(Long itemId) {
-        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemId));
+        ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(itemId);
         this.removeById(general.getId());
         iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId,general.getId()));
     }
@@ -224,7 +253,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         Item item = itemMapper.selectById(itemStageVO.getItemId());
         if (item.getAmount()!=null){
             NonMarketerMarketerBrokerageCalculator calculator = (NonMarketerMarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(BrokerageRule.LAND_OTHER_RULE);
-            ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemStageVO.getItemId()));
+            ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(itemStageVO.getItemId());
             Set<ItemStageVO.ParticipatorWeight> participators = itemStageVO.getParticipators();
             Set<ItemBrokerageDetail> participatorBrokerageDetails = participators.stream().filter(s->s.getWeight()!=null).map(x -> {
                 BrokerageDetailBO brokerageDetailBO = BrokerageDetailBO.builder().build();
@@ -270,7 +299,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         List<ItemBrokerageDetail> list = iItemBrokerageDetailService.list(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getBrokerageStageId, itemStageVO.getId()));
         BigDecimal predictAmounts = list.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
         BigDecimal actualAmounts = list.stream().map(ItemBrokerageDetail::getActualAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemStageVO.getItemId()));
+        ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(itemStageVO.getItemId());
         general.setParticipantPredictBrokerageAmount(general.getParticipantPredictBrokerageAmount().subtract(predictAmounts));
         general.setParticipantActualBrokerageAmount(general.getParticipantActualBrokerageAmount().subtract(actualAmounts));
         general.setBrokeragePredictAmount(general.getBrokeragePredictAmount().subtract(predictAmounts));
@@ -307,7 +336,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     @Transactional
     @Override
     public void toSettleParticipatorBrokerage(Long itemId) {
-        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemId).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(itemId);
         List<ItemStage> stages = itemStageMapper.selectList(new LambdaQueryWrapper<ItemStage>().eq(ItemStage::getItemId, itemId));
         ItemEvaluate settle = itemEvaluateMapper.selectOne(new LambdaQueryWrapper<ItemEvaluate>().eq(ItemEvaluate::getItemId, itemId).eq(BaseEntity::getDeleted, Boolean.FALSE));
         if (general!=null && CollectionUtils.isNotEmpty(stages) && settle!=null && settle.getWeight()!=null){
@@ -331,7 +360,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     @Transactional
     @Override
     public void toSettleMarketerBrokerage(PaymentCollection payment) {
-        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, payment.getItemId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(payment.getItemId());
         if (general!=null){
             Item item = itemMapper.selectById(payment.getItemId());
             List<PaymentCollection> paymentList = paymentCollectionMapper.selectList(new LambdaQueryWrapper<PaymentCollection>()
@@ -344,6 +373,58 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
             Long userId = itemMapper.selectById(payment.getItemId()).getUserId();
             BigDecimal currentYearPaymentAmount = marketStatService.currentYearPayment(userId);
             BigDecimal userTarget = new BigDecimal(userTargetService.getUserTarget(userId).getPaymentTarget());
+
+            //////////
+            //当某个客户经理达成当月回款目标后,需校验团队和部门是否达到当月回款目标。若达到则需重新就算 营销主管和营销经理的项目预计提成金额
+            Set<LeaderRatioBO> leader = teamMemberService.getLeader(userId, MARKET_DEPARTMENT);
+            MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(LAND_MARKETER_RULE);
+            Set<ItemBrokerageGeneralDTO> lastMonthTeamBrokerages = Sets.newHashSet();
+            //找到当前回款订单的客户经理的领导,然后获取领导们的上月可提成的项目,由于营销主管和营销经理的项目存在重复,所以这里做了并集处理
+            leader.stream().forEach(x->{
+                BigDecimal teamPaymentTarget = BigDecimal.valueOf(userTargetService.getTeamTarget(x.getUserId()).getPaymentTarget());
+                BigDecimal teamCurrentYearPayment = marketStatService.currentYearTeamPayment(x.getUserId());
+                if (brokerageCalculateSupport.checkTeamMonthlyPayment(teamCurrentYearPayment, teamPaymentTarget)){
+                    //获取团队或部门上月签单的提成记录
+                    Set<Long> juniorUserIds = teamMemberService.getJuniorUserIds(x.getUserId());
+                    Set<ItemBrokerageGeneralDTO> xItemBrokerageGeneral = itemMapper.getLastMonthTeamItems(DateUtils.getLastMonth23(LocalDate.now().getYear(),
+                            LocalDate.now().getMonthValue() - 1),juniorUserIds);
+                    lastMonthTeamBrokerages.addAll(xItemBrokerageGeneral);
+                }
+            });
+
+            lastMonthTeamBrokerages.stream().forEach(oGeneral->{
+                Set<LeaderRatioBO> xLeader = teamMemberService.getLeader(oGeneral.getUserId(), MARKET_DEPARTMENT);
+                Set<LeaderRatioBO> leaderRatioBO = xLeader.stream().filter(y->y.getRatio()!=null).collect(Collectors.toSet());
+                BrokerageDetailBO brokerageDetailBO = buildBrokerageDetailBO(oGeneral);
+                //本人的其他项目需计算预提金额
+                Set<ItemBrokerageDetail> itemBrokerageDetails = Sets.newHashSet();
+                String postName = userPostService.getMarketPostList(item.getUserId()).getName();
+                if (postName.equals(CUSTOMER_MANAGER) && ( oGeneral.getItemId().equals(payment.getItemId()) || item.getUserId().equals(oGeneral.getUserId()))){
+                    brokerageDetailBO.setCurrentPayment(currentYearPaymentAmount);
+                    brokerageDetailBO.setPaymentTarget(userTarget);
+                    BrokerageDetailBO xBrokerageDetailBO = calculator.predictPersonalAmount(brokerageDetailBO);
+                    itemBrokerageDetails.add(xBrokerageDetailBO);
+                    iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId,oGeneral.getId())
+                            .eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode())
+                            .eq(ItemBrokerageDetail::getBrokerageRule, LAND_MARKETER_RULE.getCode()));
+                }
+                //更新领导的预计提成
+                Set<ItemBrokerageDetail> itemBrokerageLeaderDetails = calculator.predictTeamShareAmount(brokerageDetailBO, leaderRatioBO);
+                itemBrokerageDetails.addAll(itemBrokerageLeaderDetails);
+                iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>()
+                        .eq(ItemBrokerageDetail::getGeneralId,oGeneral.getId()).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.TEAM_SHARE.getCode()));
+                iItemBrokerageDetailService.saveBatch(itemBrokerageDetails);
+
+                BigDecimal leaderPredictTotalAmount = itemBrokerageDetails.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+                oGeneral.setMarketerBrokerageAmount(brokerageDetailBO.getPredictAmount().add(leaderPredictTotalAmount));
+                oGeneral.setMarketerAdvanceBrokerageAble(brokerageDetailBO.getMarketerAdvanceBrokerageAble());
+                oGeneral.setBrokerageRate(brokerageDetailBO.getRate());
+                oGeneral.setBrokeragePredictAmount(brokerageDetailBO.getPredictAmount().add(oGeneral.getParticipantPredictBrokerageAmount()).add(leaderPredictTotalAmount));
+                ItemBrokerageGeneral original = ItemBrokerageGeneral.builder().build();
+                BeanUtil.copyProperties(oGeneral,original);
+                this.update(original);
+            });
+
             if (brokerageCalculateSupport.checkMarketerPredictBrokerage(currentYearPaymentAmount, userTarget)){
                 //则需要将上月签订的合同的预提状态改为 可预提
                 List<ItemBrokerageGeneral> lastMonthItemsBrokerages = itemMapper.getLastMonthItems(DateUtils.getLastMonth23(LocalDate.now().getYear(), LocalDate.now().getMonthValue() - 1),userId,BrokerageState.NOT_PAYMENT.getCode());
@@ -355,6 +436,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
                     this.updateBatchById(lastMonthItemsBrokerages);
                     log.info("更新了客户经理预提状态待预提");
                 }
+
             }
             if (item.getAmount()!=null && item.getAmount().compareTo(payDone)==0){
                 general.setMarketerStatus(BrokerageState.NOT_SETTLE.getCode());
@@ -368,6 +450,22 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         }
     }
 
+    private BrokerageDetailBO buildBrokerageDetailBO(ItemBrokerageGeneralDTO oGeneral) {
+        BrokerageDetailBO bo = BrokerageDetailBO.builder().amount(oGeneral.getAmount()).marketerStatus(BrokerageState.NOT_PAYMENT.getCode()).build();
+        bo.setGeneralId(oGeneral.getId());
+        bo.setUserId(oGeneral.getUserId());
+        bo.setBrokerageRule(LAND_MARKETER_RULE.getCode());
+        bo.setMarketerStatus(BrokerageState.NOT_PAYMENT.getCode());
+        bo.setRate(oGeneral.getBrokerageRate());
+        bo.setAdvanceAmount(BigDecimal.ZERO);
+        bo.setPredictAmount(BigDecimal.ZERO);
+        bo.setActualAmount(BigDecimal.ZERO);
+        bo.setAheadAmount(BigDecimal.ZERO);
+        //客户经理预提金额
+        bo.setPredictAmount(oGeneral.getAmount().multiply(oGeneral.getBrokerageRate()).divide(HUNDRED));
+        return bo;
+    }
+
     /**
      * 获取计算提成的项目 (待预提,待结算)
      * @return
@@ -390,7 +488,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
 
     @Override
     public void beforeToSettleParticipatorBrokerage(Long itemId) {
-        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemId).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(itemId);
         if (general!=null && general.getParticipantStatus().equals(BrokerageState.CLOSED.getCode())){
             ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR1);
         }
@@ -398,7 +496,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
 
     @Override
     public void beforeToSettleMarketerBrokerage(PaymentCollection payment) {
-        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, payment.getItemId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(payment.getItemId());
         if (general!=null && general.getMarketerStatus().equals(BrokerageState.CLOSED.getCode())){
             ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR1);
         }
@@ -406,7 +504,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
 
     @Override
     public void beforeEditMarketerBrokerage(ItemDTO itemDTO) {
-        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemDTO.getId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(itemDTO.getId());
         if (general == null){
             addMarketerBrokerage(itemDTO.getId());
             log.info("更新项目信息时创建了相关的提成记录");
@@ -419,7 +517,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
 
     @Override
     public void beforeAddParticipatorBrokerage(ItemStageVO itemStageVO) {
-        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemStageVO.getItemId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(itemStageVO.getItemId());
         if (general == null){
             addMarketerBrokerage(itemStageVO.getItemId());
             addParticipatorBrokerage(itemStageVO,itemStageVO.getId());
@@ -434,7 +532,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     @Override
     public void beforeRemoveParticipatorBrokerage(Long itemStageId) {
         ItemStage itemStage = itemStageMapper.selectById(itemStageId);
-        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, itemStage.getItemId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(itemStage.getItemId());
         if (general!=null && general.getParticipantStatus().equals(BrokerageState.CLOSED.getCode())){
             ErrorCode.throwBusinessException(ErrorCode.BROKERAGE_ITEM_STATE_ERROR1);
         }
@@ -468,8 +566,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
                 log.info("更新了客户经理预提状态为回款中");
             }
         }
-
-        ItemBrokerageGeneral general = this.getOne(new LambdaQueryWrapper<ItemBrokerageGeneral>().eq(ItemBrokerageGeneral::getItemId, payment.getItemId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        ItemBrokerageGeneral general = brokerageGeneralMapper.getByItemId(payment.getItemId());
         if (general.getMarketerStatus().equals(BrokerageState.NOT_SETTLE.getCode())){
             general.setMarketerStatus(BrokerageState.NOT_PAYMENT.getCode());
             this.updateById(general);

+ 12 - 2
service/src/main/java/com/dayou/service/impl/MarketStatServiceImpl.java

@@ -19,6 +19,7 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -41,6 +42,9 @@ public class MarketStatServiceImpl implements IMarketStatService {
     @Autowired
     private ITeamMemberService teamMemberService;
 
+    @Autowired
+    private IUserService userService;
+
     @Override
     public MarketStatVO marketStat(MarketStatDTO dto) {
 
@@ -68,9 +72,15 @@ public class MarketStatServiceImpl implements IMarketStatService {
 
     @Override
     public BigDecimal currentYearTeamPayment(Long userId) {
+        Set<Long> juniorUserId = new HashSet<>();
         Team team = teamService.getOne(new LambdaQueryWrapper<Team>().eq(Team::getSupervisorId, userId).eq(BaseEntity::getDeleted, Boolean.FALSE));
-        Set<Long> juniorUserId = teamMemberService.list(new LambdaQueryWrapper<TeamMember>()
-                .eq(TeamMember::getTeamId,team.getId()).eq(BaseEntity::getDeleted,Boolean.FALSE)).stream().map(TeamMember::getMemberId).collect(Collectors.toSet());
+        if (team==null){
+
+            juniorUserId = userService.getJuniorUserId(userId);
+        }else {
+            juniorUserId = teamMemberService.list(new LambdaQueryWrapper<TeamMember>()
+                    .eq(TeamMember::getTeamId,team.getId()).eq(BaseEntity::getDeleted,Boolean.FALSE)).stream().map(TeamMember::getMemberId).collect(Collectors.toSet());
+        }
         if (CollectionUtils.isNotEmpty(juniorUserId)){
             return marketStatMapper.currentYearTeamPayment(juniorUserId);
         }

+ 21 - 0
service/src/main/java/com/dayou/service/impl/TeamMemberServiceImpl.java

@@ -2,12 +2,14 @@ package com.dayou.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.dayou.bo.LeaderRatioBO;
+import com.dayou.common.BaseEntity;
 import com.dayou.dto.TeamLeaderDTO;
 import com.dayou.entity.Team;
 import com.dayou.entity.TeamMember;
 import com.dayou.mapper.TeamMemberMapper;
 import com.dayou.service.ITeamMemberService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayou.service.ITeamService;
 import com.dayou.service.IUserService;
 import com.dayou.vo.TeamMemberVO;
 import com.dayou.vo.TeamVO;
@@ -50,6 +52,9 @@ public class TeamMemberServiceImpl extends ServiceImpl<TeamMemberMapper, TeamMem
     private TeamMemberMapper teamMemberMapper;
 
     @Autowired
+    private ITeamService teamService;
+
+    @Autowired
     private IUserService userService;
 
     @Override
@@ -105,4 +110,20 @@ public class TeamMemberServiceImpl extends ServiceImpl<TeamMemberMapper, TeamMem
         Set<LeaderRatioBO> set = userService.marketManagerRatioBO();
         return set;
     }
+
+    @Override
+    public Set<Long> getJuniorUserIds(Long userId) {
+        Set<Long> juniorUserIds = new HashSet<>();
+        Team team = teamService.getOne(new LambdaQueryWrapper<Team>().eq(Team::getSupervisorId, userId).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        //当team为空时,则userId代表营销经理
+        if (team!=null){
+            juniorUserIds = this.list(new LambdaQueryWrapper<TeamMember>()
+                    .eq(TeamMember::getTeamId,team.getId()).eq(BaseEntity::getDeleted,Boolean.FALSE)).stream().map(TeamMember::getMemberId).collect(Collectors.toSet());
+        }else {
+            juniorUserIds = userService.getJuniorUserId(userId);
+        }
+        return juniorUserIds;
+    }
+
+
 }

+ 7 - 1
service/src/main/java/com/dayou/service/impl/TeamServiceImpl.java

@@ -66,6 +66,7 @@ public class TeamServiceImpl extends ServiceImpl<TeamMapper, Team> implements IT
         return this.getById(id);
     }
 
+    @Transactional
     @Override
     public Boolean add(Team team){
         Set<Long> departmentIdByUserId = userService.getDepartmentIdByUserId(team.getSupervisorId());
@@ -73,7 +74,12 @@ public class TeamServiceImpl extends ServiceImpl<TeamMapper, Team> implements IT
             ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"该主管存在多个岗位分属不同部门,暂不支持创建团队");
         }
         team.setDepartmentId(departmentIdByUserId.stream().findFirst().get());
-        return  this.save(team);
+        this.save(team);
+        //创建团队的时候,营销主管默认加入该团队
+        TeamMember tm = new TeamMember();
+        tm.setTeamId(team.getId());
+        tm.setMemberId(team.getSupervisorId());
+        return teamMemberService.save(tm);
     }
 
     @Override

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

@@ -25,6 +25,8 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
 import java.util.List;
 import java.util.ArrayList;
+import java.util.Set;
+
 import org.springframework.transaction.annotation.Transactional;
 import com.dayou.enums.BatchTaskTypeEnum;
 
@@ -128,4 +130,16 @@ public class UserPostServiceImpl extends ServiceImpl<UserPostMapper, UserPost> i
         userPostMapper.saveOrUpdateById(userPost);
     }
 
+    @Override
+    public Set<Long> getPostUserId(Set<Long> juniorPost) {
+        Set<Long> userIds = userPostMapper.getPostUserId(juniorPost);
+        return userIds;
+    }
+
+    @Override
+    public SimplePostModel getMarketPostList(Long userId) {
+        SimplePostModel postModel = userPostMapper.getMarketPostList(userId);
+        return postModel;
+    }
+
 }

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

@@ -419,9 +419,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
 
             if (CollectionUtils.isNotEmpty(juniorPost)){
                 //获取下属岗位的员工
-                juniorUser = userPostService.list(new LambdaQueryWrapper<UserPost>().select(UserPost::getUserId).in(UserPost::getPostId, juniorPost)
-                                .eq(BaseEntity::getDeleted,Boolean.FALSE))
-                        .stream().map(UserPost::getUserId).collect(Collectors.toSet());
+                juniorUser = userPostService.getPostUserId(juniorPost);
             }
         }
         return juniorUser;