Browse Source

提成功能自测修改

wucl 2 năm trước cách đây
mục cha
commit
dea7682575

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

@@ -47,7 +47,7 @@ import java.util.stream.Collectors;
 public class BrokerageTest {
 
     @Autowired
-    private IUserService userService;
+    private ITeamMemberService teamMemberService;
     
     @Autowired
     private IItemBrokerageSequenceService itemBrokerageSequenceService;
@@ -57,7 +57,7 @@ public class BrokerageTest {
 
     @Test
     public void testBrokerageCache() throws ExecutionException {
-        itemBrokerageSequenceService.doAbleItemBrokerageSettle();
+        //itemBrokerageSequenceService.doAbleItemBrokerageSettle();
     }
 
     public static void main(String ages []) {

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

@@ -69,6 +69,9 @@
         <if test="itemBrokerageGeneral!=null and itemBrokerageGeneral.marketerAdvanceBrokerageAble!=null">
             and ibg.marketer_advance_brokerage_able = #{itemBrokerageGeneral.marketerAdvanceBrokerageAble}
         </if>
+        <if test="itemBrokerageGeneral!=null and itemBrokerageGeneral.marketerAdvanceBrokerageDone!=null">
+            and ibg.marketer_advance_brokerage_done = #{itemBrokerageGeneral.marketerAdvanceBrokerageDone}
+        </if>
         <if test="itemBrokerageGeneral!=null and itemBrokerageGeneral.name!=null and itemBrokerageGeneral.name!='' ">
             and i.name like concat ('%',#{itemBrokerageGeneral.name},'%')
         </if>

+ 8 - 9
dao/src/main/resources/mapper/MarketStatMapper.xml

@@ -4,22 +4,21 @@
 
    <select id="marketStat" resultType="com.dayou.vo.MarketStatVO" parameterType="com.dayou.dto.MarketStatDTO">
       SELECT
-      ( SELECT sum(ifnull(sale_target,0)) FROM user_target
+       ifnull(( SELECT sum(ifnull(sale_target,0)) FROM user_target
           <where>
-       <if test="dto!=null and dto.userIds!=null and dto.userIds.size!=0">
-          and user_id in
-           <foreach collection="dto.userIds" open="(" close=")" separator="," item="userId">
+              <if test="dto!=null and dto.userIds!=null and dto.userIds.size!=0">and user_id in
+                  <foreach collection="dto.userIds" open="(" close=")" separator="," item="userId">
                #{userId}
            </foreach>
-       </if> </where>) AS yearSaleTarget,
-      ( SELECT sum(ifnull(payment_target,0)) FROM user_target
+       </if> </where> ),0) AS yearSaleTarget,
+       ifnull(( SELECT sum(ifnull(payment_target,0)) FROM user_target
       <where>
        <if test="dto!=null and dto.userIds!=null and dto.userIds.size!=0">
            and user_id in
            <foreach collection="dto.userIds" open="(" close=")" separator="," item="userId">
                #{userId}
            </foreach>
-       </if> </where>) AS yearPaymentTarget,
+       </if> </where>),0) AS yearPaymentTarget,
       ( SELECT count(*) FROM business_opportunity WHERE state = '跟进中' AND deleted = 0
             <if test="dto!=null and dto.userIds!=null and dto.userIds.size!=0">
                 and user_id in
@@ -76,14 +75,14 @@
          </foreach>
       </if>
         ) AS monthPaymentDone,
-       ( select sum(estimate_amount) from business_opportunity where deleted = 0 and state = '跟进中'
+       ifnull(( select sum(estimate_amount) from business_opportunity where deleted = 0 and state = '跟进中'
        <if test="dto!=null and dto.userIds!=null and dto.userIds.size!=0">
            and user_id in
            <foreach collection="dto.userIds" open="(" close=")" separator="," item="userId">
                #{userId}
            </foreach>
        </if>
-       ) AS estimateAmount
+       ),0) AS estimateAmount
    </select>
 
     <select id="currentMonthPayment" resultType="java.math.BigDecimal">

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

@@ -114,13 +114,11 @@ public class ItemBrokerageGeneralDTO {
     /**
      * 合同金额
      */
-    @TableField(exist = false,select = false)
     private BigDecimal amount;
 
     /**
      * 客户经理id
      */
-    @TableField(exist = false,select = false)
     private Long userId;
 
 }

+ 9 - 3
service/src/main/java/com/dayou/aspect/DataPermissionAop.java

@@ -106,9 +106,15 @@ public class DataPermissionAop {
             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());
+                Team team = teamService.getOne(new LambdaQueryWrapper<Team>().eq(Team::getSupervisorId, userId).eq(BaseEntity::getDeleted, Boolean.FALSE));
+                if (team!=null){
+                    Long teamId = team.getId();
+                    users = teamMemberService.list(new LambdaQueryWrapper<TeamMember>()
+                            .eq(TeamMember::getTeamId,teamId).eq(BaseEntity::getDeleted,Boolean.FALSE)).stream().map(TeamMember::getMemberId).collect(Collectors.toSet());
+                }
+                else {
+                    users.add(userId);
+                }
             }
             else if (postModel.getName().equals(MARKET_MANAGER)){
                 users = userService.getJuniorUserId(userId);

+ 11 - 8
service/src/main/java/com/dayou/brokerage/MarketerBrokerageCalculator.java

@@ -24,6 +24,16 @@ public interface MarketerBrokerageCalculator extends BrokerageCalculator {
     BrokerageDetailBO predictPersonalAmount(BrokerageDetailBO bo);
 
     /**
+     * 营销主管个人 提成部分 计算
+     */
+    BrokerageDetailBO supervisorPersonalAmount(BrokerageDetailBO bo);
+
+    /**
+     * 营销经理个人 提成部分 计算
+     */
+    BrokerageDetailBO managerPersonalAmount(BrokerageDetailBO bo);
+
+    /**
      * 预估提成金额(团队抽成计算)
      */
     Set<ItemBrokerageDetail> predictTeamShareAmount(BrokerageDetailBO bo, Set<LeaderRatioBO> leaderRatioBOSet);
@@ -33,10 +43,7 @@ public interface MarketerBrokerageCalculator extends BrokerageCalculator {
      */
     BigDecimal actualTeamShareAmount(ItemBrokerageDetail itemBrokerageDetail);
 
-    /**
-     * 营销主管个人 提成部分 计算
-     */
-    BrokerageDetailBO supervisorPersonalAmount(BrokerageDetailBO bo);
+
 
     /**
      * 营销主管团队提成部分 计算
@@ -70,8 +77,4 @@ public interface MarketerBrokerageCalculator extends BrokerageCalculator {
     BigDecimal aheadAmount(BigDecimal predictAmount);
 
 
-
-
-
-
 }

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

@@ -11,7 +11,7 @@ import java.math.BigDecimal;
  */
 public class BrokerageMsg {
 
-    public static final String BROKERAGE_SEQUENCE_REMARK = "系统每月23日零点自动结算项目提成,您上月可结算(包含预提)项目个数:[sum]个,提成奖励预计体现在[month]月薪资中体现.";
+    public static final String BROKERAGE_SEQUENCE_REMARK = "系统每月23日零点自动结算项目提成,您上月可结算(包含预提)项目个数:[sum]个,提成奖励在[month]月薪资中体现.";
 
     public static final String NON_MARKETER_BASE_SEQUENCE_REMARK = "非市场人员默认提成,此提成与项目暂不挂钩.若有项目结算将与固定提成抵扣.";
 

+ 26 - 6
service/src/main/java/com/dayou/brokerage/handler/LandMarketerBrokerageHandler.java

@@ -29,6 +29,7 @@ import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 import static com.dayou.brokerage.constants.BrokerageMsg.*;
+import static com.dayou.brokerage.constants.BrokerageRule.LAND_MANAGER_RULE;
 import static com.dayou.brokerage.constants.BrokerageRule.LAND_SUPERVISOR_RULE;
 import static com.dayou.common.Constants.*;
 
@@ -116,6 +117,7 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
                     itemBrokerageDetail.setUserId(x.getUserId());
                     itemBrokerageDetail.setAheadAmount(BigDecimal.ZERO);
                     itemBrokerageDetail.setAdvanceAmount(BigDecimal.ZERO);
+                    itemBrokerageDetail.setActualAmount(BigDecimal.ZERO);
                     itemBrokerageDetail.setBrokerageMode(BrokerageMode.TEAM_SHARE.getCode());
                     itemBrokerageDetail.setBrokerageRule(x.getBrokerageRule());
                     BrokerageRule brokerageRuleEnum = BrokerageRule.brokerageRule(x.getBrokerageRule());
@@ -179,6 +181,21 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
     }
 
     @Override
+    public BrokerageDetailBO managerPersonalAmount(BrokerageDetailBO bo) {
+        checkItemBrokerageStatus(bo);
+        BigDecimal brokerageRatio = brokeragePostRatioService.getOne(new LambdaQueryWrapper<BrokeragePostRatio>()
+                .eq(BrokeragePostRatio::getBrokerageRule, LAND_MANAGER_RULE.getCode()).eq(BaseEntity::getDeleted, Boolean.FALSE)).getBrokerageRatio();
+        BigDecimal amount = managerAmount(bo.getAmount(), null, bo.getUserId(), brokerageRatio);
+        bo.setPredictAmount(amount);
+        bo.setBrokerageMode(BrokerageMode.PERSONAL.getCode());
+        bo.setRate(BigDecimal.ZERO);
+        bo.setMarketerAdvanceBrokerageAble(Boolean.FALSE);
+        bo.setBrokerageRule(LAND_MANAGER_RULE.getCode());
+        return bo;
+    }
+
+
+    @Override
     public BigDecimal supervisorAmount(BigDecimal signAmount,Long supervisorId,BigDecimal postRatio, BigDecimal ratio) {
         //营销主管的团队提成规则 : (合同额(团队签的)*项目类型提成系数 * 40% *0.5 )+ [合同额(团队签的)*项目类型提成系数*40%*0.5 * 实发系数(取决于团队回款目标是否完成)]
         BigDecimal amount = signAmount
@@ -203,13 +220,16 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
                 .multiply(postRatio.divide(HUNDRED))
                 .multiply(new BigDecimal("2"));
         BigDecimal areaAmount = BigDecimal.ZERO;
-        //开单人员的营销主管集合
-        Set<LeaderRatioBO> leaders = teamMemberService.getLeader(marketerId, MARKET_DEPARTMENT).stream().filter(x->x.getPostName().equals(SUPERVISOR)).collect(Collectors.toSet());
-        //Set<LeaderRatioBO> leaders = userService.getLeaderRatioBO(marketerId).stream().filter(x->x.getPostName().equals(SUPERVISOR)).collect(Collectors.toSet());
 
-        if (!CollectionUtils.isEmpty(leaders)){
-            //区域产值
-            areaAmount = signAmount.multiply(postRatio.divide(HUNDRED));
+        if (marketerId!=null){
+            //开单人员的营销主管集合
+            Set<LeaderRatioBO> leaders = teamMemberService.getLeader(marketerId, MARKET_DEPARTMENT).stream().filter(x->x.getPostName().equals(SUPERVISOR)).collect(Collectors.toSet());
+            //Set<LeaderRatioBO> leaders = userService.getLeaderRatioBO(marketerId).stream().filter(x->x.getPostName().equals(SUPERVISOR)).collect(Collectors.toSet());
+
+            if (!CollectionUtils.isEmpty(leaders)){
+                //区域产值
+                areaAmount = signAmount.multiply(postRatio.divide(HUNDRED));
+            }
         }
 
         // 获取发展的营销主管个数

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

@@ -44,4 +44,6 @@ public interface IUserPostService extends IService<UserPost> {
     Set<Long> getPostUserId(Set<Long> juniorPost);
 
     SimplePostModel getMarketPostList(Long userId);
+
+    void checkMultiPostInMarketDepartment(Set<Long> postIds);
 }

+ 163 - 65
service/src/main/java/com/dayou/service/impl/ItemBrokerageGeneralServiceImpl.java

@@ -134,18 +134,25 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         BigDecimal paymentTarget = new BigDecimal(userTarget.getPaymentTarget());
         bo.setCurrentPayment(currentYearPayment);
         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());
+        //创建下单人领导提成记录
+        Set<ItemBrokerageDetail> brokerageLeaderDetailBOS = Sets.newHashSet();
+        BigDecimal leaderPredictTotalAmount = BigDecimal.ZERO;
         //创建下单人(客户经理或营销主管个人提成部分)提成记录
         if (bo.getBrokerageRule().equals(LAND_MARKETER_RULE.getCode())){
             bo = calculator.predictPersonalAmount(bo);
+            brokerageLeaderDetailBOS.addAll(calculator.predictTeamShareAmount(bo, leaderRatioBO));
+            leaderPredictTotalAmount = brokerageLeaderDetailBOS.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
         }
         if (bo.getBrokerageRule().equals(BrokerageRule.LAND_SUPERVISOR_RULE.getCode())){
             bo = calculator.supervisorPersonalAmount(bo);
+            brokerageLeaderDetailBOS.addAll(calculator.predictTeamShareAmount(bo, leaderRatioBO));
+            leaderPredictTotalAmount = brokerageLeaderDetailBOS.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        }
+        if (bo.getBrokerageRule().equals(BrokerageRule.LAND_MANAGER_RULE.getCode())){
+            bo = calculator.managerPersonalAmount(bo);
         }
-        //创建下单人领导提成记录
-        Set<ItemBrokerageDetail> brokerageLeaderDetailBOS = calculator.predictTeamShareAmount(bo, leaderRatioBO);
-        BigDecimal leaderPredictTotalAmount = brokerageLeaderDetailBOS.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
         //构建提成总表对象
         ItemBrokerageGeneral general = ItemBrokerageGeneral.builder()
                 .itemId(bo.getItemId())
@@ -205,33 +212,42 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         }
         MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(LAND_MARKETER_RULE);
         //更新客户经理的提成记录
-        UserTarget userTarget = userTargetService.getUserTarget(marketerDetail.getUserId());
-        BigDecimal currentMonthPayment = marketStatService.currentMonthPayment(marketerDetail.getUserId());
-        BigDecimal paymentTarget = new BigDecimal(userTarget.getPaymentTarget());
-        BrokerageDetailBO brokerageDetailBO = BrokerageDetailBO.builder().amount(itemDTO.getAmount()).cate(itemDTO.getCate()).businessSource(itemDTO.getBusinessSource()).itemId(itemDTO.getId()).paymentTarget(paymentTarget).currentPayment(currentMonthPayment).build();
+
+        BrokerageDetailBO brokerageDetailBO = BrokerageDetailBO.builder().amount(itemDTO.getAmount()).cate(itemDTO.getCate()).businessSource(itemDTO.getBusinessSource()).itemId(itemDTO.getId()).build();
         brokerageDetailBO.setUserId(marketerDetail.getUserId());
         brokerageDetailBO.setId(marketerDetail.getId());
         brokerageDetailBO.setGeneralId(general.getId());
         brokerageDetailBO.setMarketerStatus(general.getMarketerStatus());
         brokerageDetailBO.setBrokerageRule(marketerDetail.getBrokerageRule());
-        //创建下单人(客户经理或营销主管个人提成部分)提成记录
+        //创建下单人提成记录
         if (brokerageDetailBO.getBrokerageRule().equals(LAND_MARKETER_RULE.getCode())){
+            UserTarget userTarget = userTargetService.getUserTarget(marketerDetail.getUserId());
+            BigDecimal currentMonthPayment = marketStatService.currentMonthPayment(marketerDetail.getUserId());
+            BigDecimal paymentTarget = new BigDecimal(userTarget.getPaymentTarget());
+            brokerageDetailBO.setPaymentTarget(paymentTarget);
+            brokerageDetailBO.setCurrentPayment(currentMonthPayment);
             brokerageDetailBO = calculator.predictPersonalAmount(brokerageDetailBO);
         }
         if (brokerageDetailBO.getBrokerageRule().equals(BrokerageRule.LAND_SUPERVISOR_RULE.getCode())){
             brokerageDetailBO = calculator.supervisorPersonalAmount(brokerageDetailBO);
         }
+        if (brokerageDetailBO.getBrokerageRule().equals(BrokerageRule.LAND_MANAGER_RULE.getCode())){
+            brokerageDetailBO = calculator.managerPersonalAmount(brokerageDetailBO);
+        }
         iItemBrokerageDetailService.update(brokerageDetailBO);
 
 
-        //更新领导提成记录
-        Set<LeaderRatioBO> leaderRatioBO = teamMemberService.getLeader(marketerDetail.getUserId(), MARKET_DEPARTMENT).stream().filter(x->x.getRatio()!=null).collect(Collectors.toSet());
-        Set<ItemBrokerageDetail> itemBrokerageDetails = calculator.predictTeamShareAmount(brokerageDetailBO, leaderRatioBO);
-        iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId,general.getId()).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.TEAM_SHARE.getCode()));
-        iItemBrokerageDetailService.saveBatch(itemBrokerageDetails);
+        BigDecimal leaderPredictTotalAmount = BigDecimal.ZERO;
+        if (!brokerageDetailBO.getBrokerageRule().equals(BrokerageRule.LAND_MANAGER_RULE.getCode())){
+            //更新领导提成记录
+            Set<LeaderRatioBO> leaderRatioBO = teamMemberService.getLeader(marketerDetail.getUserId(), MARKET_DEPARTMENT).stream().filter(x->x.getRatio()!=null).collect(Collectors.toSet());
+            Set<ItemBrokerageDetail> itemBrokerageDetails = calculator.predictTeamShareAmount(brokerageDetailBO, leaderRatioBO);
+            iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>().eq(ItemBrokerageDetail::getGeneralId,general.getId()).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.TEAM_SHARE.getCode()));
+            iItemBrokerageDetailService.saveBatch(itemBrokerageDetails);
+            leaderPredictTotalAmount = itemBrokerageDetails.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        }
 
         //更新总表
-        BigDecimal leaderPredictTotalAmount = itemBrokerageDetails.stream().map(ItemBrokerageDetail::getPredictAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
         general.setMarketerBrokerageAmount(brokerageDetailBO.getPredictAmount().add(leaderPredictTotalAmount));
         general.setMarketerAdvanceBrokerageAble(brokerageDetailBO.getMarketerAdvanceBrokerageAble());
         general.setBrokerageRate(brokerageDetailBO.getRate());
@@ -374,56 +390,7 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
             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);
-            });
+            checkReturnPayment(payment, item, userId, currentYearPaymentAmount, userTarget);
 
             if (brokerageCalculateSupport.checkMarketerPredictBrokerage(currentYearPaymentAmount, userTarget)){
                 //则需要将上月签订的合同的预提状态改为 可预提
@@ -450,6 +417,134 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
         }
     }
 
+    /**
+     * 回款目标变动后,需重新计算客户经理的预提状态,和营销主管,营销经理的预提金额
+     * @param userId
+     * @param currentYearPaymentAmount
+     * @param userTarget
+     */
+    private void checkUserTarget(Long userId,BigDecimal currentYearPaymentAmount, BigDecimal userTarget){
+        Set<ItemBrokerageGeneralDTO> lastMonthTeamBrokerages = getLeaderBrokerageDetailsByCustomerManagerId(userId);
+        MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(LAND_MARKETER_RULE);
+        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(userId).getName();
+            //如果该比提成总表显示客户经理 已预提,则不需要再次计算个人提成。
+            if (postName.equals(CUSTOMER_MANAGER) && (userId.equals(oGeneral.getUserId())) && !oGeneral.getMarketerAdvanceBrokerageDone()){
+                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()));
+            }
+            //如果这些单子中下单人是营销经理
+            if (userPostService.getMarketPostList(oGeneral.getUserId()).getName().equals(MARKET_MANAGER)){
+                iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>()
+                        .eq(ItemBrokerageDetail::getGeneralId,oGeneral.getId()).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode()));
+                brokerageDetailBO = calculator.managerPersonalAmount(brokerageDetailBO);
+                iItemBrokerageDetailService.save(brokerageDetailBO);
+            }else {
+                //更新领导的预计提成
+                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);
+        });
+    }
+
+    /**
+     * 回款金额变动,需校验客户经理,营销主管,营销经理的回款目标是否达成,若达成需修改其他合同的预估提成金额
+     * @param payment
+     * @param item
+     * @param userId
+     * @param currentYearPaymentAmount
+     * @param userTarget
+     */
+    private void checkReturnPayment(PaymentCollection payment, Item item, Long userId, BigDecimal currentYearPaymentAmount, BigDecimal userTarget) {
+
+        Set<ItemBrokerageGeneralDTO> lastMonthTeamBrokerages = getLeaderBrokerageDetailsByCustomerManagerId(userId);
+        MarketerBrokerageCalculator calculator = (MarketerBrokerageCalculator) brokerageCalculateSupport.getCalculator(LAND_MARKETER_RULE);
+        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.getMarketerAdvanceBrokerageDone() && ( 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()));
+            }
+            //如果这些单子中下单人是营销经理
+            if (userPostService.getMarketPostList(oGeneral.getUserId()).getName().equals(MARKET_MANAGER)){
+                iItemBrokerageDetailService.remove(new LambdaQueryWrapper<ItemBrokerageDetail>()
+                        .eq(ItemBrokerageDetail::getGeneralId,oGeneral.getId()).eq(ItemBrokerageDetail::getBrokerageMode,BrokerageMode.PERSONAL.getCode()));
+                brokerageDetailBO = calculator.managerPersonalAmount(brokerageDetailBO);
+                iItemBrokerageDetailService.save(brokerageDetailBO);
+            }else {
+                //更新领导的预计提成
+                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);
+        });
+    }
+    /**
+     * 根据客户经理或营销主管的id获取其上级领导在上个月所生成的提成详情记录
+     * @param userId 客户经理或营销主管的id
+     * @return
+     */
+    private Set<ItemBrokerageGeneralDTO> getLeaderBrokerageDetailsByCustomerManagerId(Long userId) {
+        //当某个客户经理达成当月回款目标后,需校验团队和部门是否达到当月回款目标。若达到则需重新就算 营销主管和营销经理的项目预计提成金额
+        Set<LeaderRatioBO> leader = teamMemberService.getLeader(userId, MARKET_DEPARTMENT);
+        Set<ItemBrokerageGeneralDTO> lastMonthTeamBrokerages = Sets.newHashSet();
+        //找到当前回款订单的客户经理的领导,然后获取领导们的上月可提成的项目,由于营销主管和营销经理的项目存在重复,所以这里做了并集处理
+        leader.stream().forEach(x->{
+            //获取团队或部门上月签单的提成记录
+            Set<Long> juniorUserIds = teamMemberService.getJuniorUserIds(x.getUserId());
+            // 需要加上营销经理的userId,因为营销经理也可能下单
+            juniorUserIds.add(x.getUserId());
+            Set<ItemBrokerageGeneralDTO> xItemBrokerageGeneral = itemMapper.getLastMonthTeamItems(DateUtils.getLastMonth23(LocalDate.now().getYear(),
+                    LocalDate.now().getMonthValue() - 1),juniorUserIds);
+            lastMonthTeamBrokerages.addAll(xItemBrokerageGeneral);
+        });
+        return lastMonthTeamBrokerages;
+    }
+
+
+
     private BrokerageDetailBO buildBrokerageDetailBO(ItemBrokerageGeneralDTO oGeneral) {
         BrokerageDetailBO bo = BrokerageDetailBO.builder().amount(oGeneral.getAmount()).marketerStatus(BrokerageState.NOT_PAYMENT.getCode()).build();
         bo.setGeneralId(oGeneral.getId());
@@ -577,6 +672,9 @@ public class ItemBrokerageGeneralServiceImpl extends ServiceImpl<ItemBrokerageGe
     public void updateAheadStatus(Long userId) {
         BigDecimal currentYearPaymentAmount = marketStatService.currentYearPayment(userId);
         BigDecimal userTarget = new BigDecimal(userTargetService.getUserTarget(userId).getPaymentTarget());
+
+        checkUserTarget(userId,currentYearPaymentAmount,userTarget);
+
         List<ItemBrokerageGeneral> lastMonthItemsBrokerages = itemMapper.getLastMonthItemsInStatus(DateUtils.getLastMonth23(LocalDate.now().getYear(), LocalDate.now().getMonthValue() - 1),userId);
         if (brokerageCalculateSupport.checkMarketerPredictBrokerage(currentYearPaymentAmount, userTarget) && CollectionUtils.isNotEmpty(lastMonthItemsBrokerages)){
             lastMonthItemsBrokerages.stream().forEach(

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

@@ -153,7 +153,7 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
                             actualAmount = landMarketerBrokerageHandler.actualTeamShareAmount(x);
                         }
                         if (general.getMarketerAdvanceBrokerageDone()) {
-                            actualAmount = x.getActualAmount().subtract(x.getAheadAmount());
+                            actualAmount = actualAmount.subtract(x.getAheadAmount());
                         }
                         ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
                                 .brokerageDetailId(x.getId()).userId(x.getUserId()).brokerageCate(BrokerageBusiness.SETTLE.getCode()).brokerageAmount(actualAmount).generalId(x.getGeneralId()).build();

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

@@ -79,6 +79,10 @@ public class PaymentCollectionServiceImpl extends ServiceImpl<PaymentCollectionM
     @DoBrokerage(operation = OperationTypeEnum.SETTLE,rule = BrokerageRule.LAND_MARKETER_RULE)
     @Override
     public Boolean add(PaymentCollection paymentCollection){
+        Double amount = paymentCollection.getAmount();
+        if (amount==null || amount<0){
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"抱歉!回款金额不能小于0");
+        }
         BigDecimal totalAmount = iItemService.getById(paymentCollection.getItemId()).getAmount();
         if (totalAmount==null){
             ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"抱歉!该项目合同金额未填写,请先完善合同金额再操作。");
@@ -90,7 +94,8 @@ public class PaymentCollectionServiceImpl extends ServiceImpl<PaymentCollectionM
 
 
         BigDecimal sum = BigDecimal.valueOf(doneAmount.stream().reduce(0D, Double::sum));
-        BigDecimal payment = BigDecimal.valueOf(paymentCollection.getAmount());
+
+        BigDecimal payment = BigDecimal.valueOf(amount);
         BigDecimal add = sum.add(payment);
         if (add.compareTo(totalAmount)==1){
             ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"新增回款金额已大于合同签订金额,请检查.");

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

@@ -14,6 +14,7 @@ import com.dayou.service.IUserService;
 import com.dayou.vo.TeamMemberVO;
 import com.dayou.vo.TeamVO;
 import com.google.common.collect.Sets;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -45,6 +46,8 @@ import com.dayou.enums.BatchTaskTypeEnum;
  * @author wucl
  * @since 2023-04-07
  */
+
+@Slf4j
 @Service
 public class TeamMemberServiceImpl extends ServiceImpl<TeamMemberMapper, TeamMember> implements ITeamMemberService {
 
@@ -108,6 +111,9 @@ public class TeamMemberServiceImpl extends ServiceImpl<TeamMemberMapper, TeamMem
         }
         //如果没有加入团队,则团队领导为营销经理
         Set<LeaderRatioBO> set = userService.marketManagerRatioBO();
+        if (CollectionUtils.isEmpty(set)){
+            log.info("警告!市场部经理人员暂未设置");
+        }
         return set;
     }
 

+ 10 - 3
service/src/main/java/com/dayou/service/impl/TeamServiceImpl.java

@@ -1,6 +1,7 @@
 package com.dayou.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.dayou.common.BaseEntity;
 import com.dayou.entity.Team;
 import com.dayou.entity.TeamMember;
 import com.dayou.exception.ErrorCode;
@@ -69,16 +70,22 @@ public class TeamServiceImpl extends ServiceImpl<TeamMapper, Team> implements IT
     @Transactional
     @Override
     public Boolean add(Team team){
-        Set<Long> departmentIdByUserId = userService.getDepartmentIdByUserId(team.getSupervisorId());
+        Long supervisorId = team.getSupervisorId();
+        Set<Long> departmentIdByUserId = userService.getDepartmentIdByUserId(supervisorId);
         if (CollectionUtils.isEmpty(departmentIdByUserId) || departmentIdByUserId.size()!=1){
-            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"该主管存在多个岗位分属不同部门,暂不支持创建团队");
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"该员工存在多个岗位分属不同部门,暂不支持创建团队");
+        }
+        List<TeamMember> list = teamMemberService.list(new LambdaQueryWrapper<TeamMember>().eq(TeamMember::getMemberId, supervisorId).eq(BaseEntity::getDeleted, Boolean.FALSE));
+
+        if (CollectionUtils.isNotEmpty(list)){
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"该员工目前存在于其他团队中,若将其设置为主管请先从其他团队中移除。");
         }
         team.setDepartmentId(departmentIdByUserId.stream().findFirst().get());
         this.save(team);
         //创建团队的时候,营销主管默认加入该团队
         TeamMember tm = new TeamMember();
         tm.setTeamId(team.getId());
-        tm.setMemberId(team.getSupervisorId());
+        tm.setMemberId(supervisorId);
         return teamMemberService.save(tm);
     }
 

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

@@ -3,8 +3,13 @@ package com.dayou.service.impl;
 import com.dayou.common.BaseEntity;
 import com.dayou.common.SimpleListModel;
 import com.dayou.dto.SimplePostModel;
+import com.dayou.entity.Department;
+import com.dayou.entity.Post;
 import com.dayou.entity.UserPost;
+import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.UserPostMapper;
+import com.dayou.service.IDepartmentService;
+import com.dayou.service.IPostService;
 import com.dayou.service.IUserPostService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,14 +27,19 @@ import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.springframework.transaction.annotation.Transactional;
 import com.dayou.enums.BatchTaskTypeEnum;
 
+import static com.dayou.common.Constants.MARKET_DEPARTMENT;
+import static com.dayou.common.Constants.MARKET_MANAGER;
+
 /**
  * <p>
  * 用户岗位 服务实现类
@@ -46,6 +56,12 @@ public class UserPostServiceImpl extends ServiceImpl<UserPostMapper, UserPost> i
     @Autowired
     private UserPostMapper userPostMapper;
 
+    @Autowired
+    private IPostService postService;
+
+    @Autowired
+    private IDepartmentService departmentService;
+
 
     @Override
     @SuppressWarnings("unchecked")
@@ -142,4 +158,22 @@ public class UserPostServiceImpl extends ServiceImpl<UserPostMapper, UserPost> i
         return postModel;
     }
 
+    @Override
+    public void checkMultiPostInMarketDepartment(Set<Long> postIds) {
+        List<Post> list = postService.list(new LambdaQueryWrapper<Post>().in(BaseEntity::getId, postIds).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        Long marketDepId = departmentService.getOne(new LambdaQueryWrapper<Department>().eq(Department::getName, MARKET_DEPARTMENT).eq(BaseEntity::getDeleted, Boolean.FALSE)).getId();
+        Post manager = postService.getOne(new LambdaQueryWrapper<Post>().eq(Post::getName, MARKET_MANAGER).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        if (manager==null){
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"警告! 系统还未设置市场部经理岗位");
+        }
+        List<UserPost> managers = this.list(new LambdaQueryWrapper<UserPost>().eq(UserPost::getPostId, manager.getId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        if (!CollectionUtils.isEmpty(managers) && list.stream().map(BaseEntity::getId).filter(x->x.equals(manager.getId())).collect(Collectors.toSet()).size()!=0){
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"抱歉!市场部经理已存在任职人员,暂不支持设置多个市场部经理人员。");
+        }
+        List<Post> collect = list.stream().filter(x -> x.getDepartmentId().equals(marketDepId)).collect(Collectors.toList());
+        if (collect.size()>1){
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"抱歉!员工在市场部只能担任一个岗位。");
+        }
+    }
+
 }

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

@@ -350,6 +350,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         this.update(user);
         userPostService.remove(new LambdaQueryWrapper<UserPost>().eq(UserPost::getUserId,user.getId()));
         List<IdNameVO> vos = user.getUserPosts();
+        Set<Long> postIds = vos.stream().map(IdNameVO::getId).collect(Collectors.toSet());
+        userPostService.checkMultiPostInMarketDepartment(postIds);
         Set<UserPost> xUserPosts = vos.stream().map(x -> {
             UserPost userPost = new UserPost();
             userPost.setUserId(user.getId());
@@ -359,6 +361,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return userPostService.saveBatch(xUserPosts);
     }
 
+    @Transactional
     @Override
     public Boolean xSave(UserVO user) {
         //生成员工工号,生成规则:公司前缀+入职年份+身份证号码后三位
@@ -367,6 +370,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         user.setPassword(DigestUtils.getMD5String(DEFAULT_PASSWORD));
         this.save(user);
         List<IdNameVO> userPosts = user.getUserPosts();
+        Set<Long> postIds = userPosts.stream().map(IdNameVO::getId).collect(Collectors.toSet());
+        userPostService.checkMultiPostInMarketDepartment(postIds);
         Set<UserPost> xUserPosts = userPosts.stream().map(x -> {
             UserPost userPost = new UserPost();
             userPost.setUserId(user.getId());

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

@@ -4,6 +4,7 @@ import com.dayou.common.BaseEntity;
 import com.dayou.entity.Team;
 import com.dayou.entity.TeamMember;
 import com.dayou.entity.UserTarget;
+import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.UserTargetMapper;
 import com.dayou.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -55,6 +56,12 @@ public class UserTargetServiceImpl extends ServiceImpl<UserTargetMapper, UserTar
 
     @Override
     public Boolean add(UserTarget userTarget){
+        if (userTarget.getPaymentTarget()!=null && userTarget.getPaymentTarget() <= 0){
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"目标金额不能小于或等于0");
+        }
+        if (userTarget.getSaleTarget() !=null && userTarget.getSaleTarget() <= 0){
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"目标金额不能小于或等于0");
+        }
         Long userId = LoginContext.getUserId();
         UserTarget ut = this.getOne(new LambdaQueryWrapper<UserTarget>().eq(UserTarget::getUserId, userId));
         if (ut==null){