Browse Source

增加技术人员提成抵扣功能

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

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

@@ -82,7 +82,7 @@ public class ItemBrokerageTechnicistController extends BaseController {
     /**
      * 全额回款户一次性结算项目
      */
-    @GetMapping("/list")
+    @GetMapping("/once")
     public RestResponse<Page<DeductionTechItemVO>> oncePage(DeductionTechItemVO deductionTechItemVO, Page page){
         Page<DeductionTechItemVO> pages=itemBrokerageTechnicistService.oncePage(page,deductionTechItemVO);
         return RestResponse.data(pages);

+ 2 - 1
common/src/main/java/com/dayou/exception/ErrorCode.java

@@ -51,8 +51,9 @@ public class ErrorCode {
 
     public static final ErrorCode GIS_USER_DISABLE = ErrorCode("10023", "抱歉!该账号已被禁用,请联系管理员。");
 
+    public static final ErrorCode STAGE_NODE_ERROR2 = ErrorCode("10024", "抱歉,该项目阶段权重之和已超过100%,请检查后修改。");
 
-
+    public static final ErrorCode STAGE_NODE_ERROR3 = ErrorCode("10025", "抱歉,该阶段参与人员提成系数之和已超过100%,请检查后修改。");
 
     private String code;
     private String errorMsg;

+ 1 - 1
dao/src/main/resources/mapper/ItemBrokerageSequenceMapper.xml

@@ -81,7 +81,7 @@
         ibs.id,
         ibs.created,
         (case ibs.cate when 'DEFAULT_AHEAD' then
-        - ibs.brokerage_amount else ibs.brokerage_amount end) brokerageAmount,
+        - ibs.brokerage_amount when 'ONCE_SETTLE' then -ibs.brokerage_amount   else ibs.brokerage_amount end) brokerageAmount,
         ibs.embody,
         ibs.cate,
         u.NAME AS userName  from item_brokerage_sequence ibs left join user u on u.id = ibs.user_id

+ 7 - 6
dao/src/main/resources/mapper/ItemBrokerageTechnicistDeductionMapper.xml

@@ -98,14 +98,15 @@ order by ibs.id DESC
             (
                     ( SELECT ifnull( sum( residue_amount ), 0 ) FROM `item_brokerage_technicist` WHERE user_id = #{userId} AND deleted = 0 ) -(
                     SELECT
-                        ifnull( sum( brokerage_amount ), 0 )
+                        ifnull( sum( ibs.brokerage_amount ), 0 ) -  ifnull(sum( ibtd.deductionAmount ),0)
                     FROM
-                        item_brokerage_sequence
+                        item_brokerage_sequence ibs
+                            LEFT JOIN ( SELECT brokerage_sequence_id AS seId, sum( deduction_amount ) AS deductionAmount FROM item_brokerage_technicist_deduction GROUP BY brokerage_sequence_id ) ibtd ON ibs.id = ibtd.seId
                     WHERE
-                        user_id = #{userId}
-                      AND cate = 'DEFAULT_AHEAD'
-                      AND deleted = 0
+                        ibs.user_id = #{userId}
+                      AND ibs.cate = 'DEFAULT_AHEAD'
+                      AND ibs.deleted = 0
                 )
-                ) AS poolResidueAmount
+                ) AS poolResidueAmount;
     </select>
 </mapper>

+ 21 - 2
dao/src/main/resources/mapper/ItemBrokerageTechnicistMapper.xml

@@ -62,7 +62,7 @@
             item_brokerage_technicist ibt
                 LEFT JOIN item_brokerage_sequence ibs ON ibs.id = ibt.sequence_id
                 LEFT JOIN item i ON i.id = ibt.item_id
-                LEFT JOIN USER u ON u.id = ibt.user_id
+                LEFT JOIN user u ON u.id = ibt.user_id
         WHERE
             ibt.deleted = 0
           AND ibs.deleted = 0
@@ -93,6 +93,25 @@
     </select>
 
     <select id="oncePage" parameterType="com.dayou.vo.DeductionTechItemVO" resultType="com.dayou.vo.DeductionTechItemVO">
-    //todo
+        SELECT
+            ibs.id,
+            u.NAME AS userName,
+            i.NAME AS itemName,
+            ibs.brokerage_amount AS onceAmount,
+            ibs.created,
+            ibs.remark
+        FROM
+            item_brokerage_sequence ibs
+                LEFT JOIN item_brokerage_technicist_deduction ibtd ON ibtd.brokerage_sequence_id = ibs.id
+                LEFT JOIN item_brokerage_technicist ibt ON ibt.id = ibtd.brokerage_technicist_id
+                LEFT JOIN item i ON i.id = ibt.item_id
+                LEFT JOIN user u ON u.id = ibt.user_id
+        WHERE
+            ibs.cate = 'ONCE_SETTLE'
+          AND ibt.user_id = #{vo.userId}
+        <if test="vo.itemName!=null and vo.itemName!='' ">
+            and i.name like concat ('%',#{vo.itemName},'%')
+        </if>
+          AND ibs.deleted = 0 and ibt.deleted = 0 and ibtd.deleted = 0
     </select>
 </mapper>

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

@@ -139,6 +139,9 @@
         <if test="item!=null and item.clientManager!=null and item.clientManager!='' ">
             and u.name like concat ('%',#{item.clientManager},'%')
         </if>
+        <if test="item!=null and item.skiller!=null and item.skiller!='' ">
+            and i.skiller =#{item.skiller}
+        </if>
         <if test="item!=null and item.userIds!=null and item.userIds.size!=0">
             and i.user_id in
             <foreach collection="item.userIds" open="(" close=")" separator="," item="userId">
@@ -171,6 +174,9 @@
         <if test="item!=null and item.clientManager!=null and item.clientManager!='' ">
             and u.name like concat ('%',#{item.clientManager},'%')
         </if>
+        <if test="item!=null and item.skiller!=null and item.skiller!='' ">
+            and i.skiller =#{item.skiller}
+        </if>
         <if test="item!=null and item.userIds!=null and item.userIds.size!=0 and item!=null and item.departmentIds!=null and item.departmentIds.size==0">
             <if test="item!=null and item.userIds!=null and item.userIds.size!=0">
                 and EXISTS ( SELECT item_id FROM item_user iu WHERE iu.item_id = i.id AND iu.user_id in

+ 1 - 0
domain/src/main/java/com/dayou/vo/DeductionTechItemVO.java

@@ -68,6 +68,7 @@ public class DeductionTechItemVO {
      */
     private LocalDate created;
 
+
     /**
      * 抵扣默认预提
      */

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

@@ -179,6 +179,9 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
                                 .build();
                         technicistService.update(new LambdaUpdateWrapper<ItemBrokerageTechnicist>().set(ItemBrokerageTechnicist::getResidueAmount,BigDecimal.ZERO).eq(BaseEntity::getId,brokerage.getId()));
                         this.save(itemSequence);
+                        ItemBrokerageTechnicistDeduction deduction = ItemBrokerageTechnicistDeduction.builder()
+                                .brokerageTechnicistId(brokerage.getId()).brokerageSequenceId(itemSequence.getId()).deductionAmount(itemSequence.getBrokerageAmount()).build();
+                        deductionService.save(deduction);
                     }
                 }
             }
@@ -208,7 +211,7 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
                         ItemBrokerageTechnicistDeduction deductionDone = ItemBrokerageTechnicistDeduction.builder()
                                 .brokerageSequenceId(defaultSequence.getId())
                                 .brokerageTechnicistId(deduction.getId())
-                                .deductionAmount(defaultAmount)
+                                .deductionAmount(deduction.getResidueAmount().subtract(res))
                                 .build();
                         deductionDoneList.add(deductionDone);
                         deduction.setResidueAmount(res);

+ 51 - 4
service/src/main/java/com/dayou/service/impl/ItemStageServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.lang.UUID;
 import cn.hutool.core.util.StrUtil;
 import com.dayou.brokerage.annotation.DoBrokerage;
 import com.dayou.brokerage.constants.BrokerageRule;
+import com.dayou.entity.BrokerageVariable;
 import com.dayou.entity.Item;
 import com.dayou.entity.ItemStage;
 import com.dayou.entity.ItemStageUser;
@@ -28,16 +29,17 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.springframework.transaction.annotation.Transactional;
 import com.dayou.enums.BatchTaskTypeEnum;
 
 import static com.dayou.enums.OperationTypeEnum.*;
-import static com.dayou.exception.ErrorCode.STAGE_NODE_ERROR;
-import static com.dayou.exception.ErrorCode.STAGE_NODE_ERROR1;
+import static com.dayou.exception.ErrorCode.*;
 
 /**
  * <p>
@@ -96,9 +98,35 @@ public class ItemStageServiceImpl extends ServiceImpl<ItemStageMapper, ItemStage
             }
             itemStageVO.setFooterId(UUID.randomUUID().toString());
         }
+
+        if (itemStageVO.getWeight().compareTo(BigDecimal.TEN.multiply(BigDecimal.TEN))== 1){
+            ErrorCode.throwBusinessException(STAGE_NODE_ERROR2);
+        }
+        List<BigDecimal> sumWeight = this.list(new LambdaQueryWrapper<ItemStage>().eq(ItemStage::getItemId, itemStageVO.getItemId())).stream().map(ItemStage::getWeight).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(sumWeight)){
+            BigDecimal sum = sumWeight.stream().reduce(BigDecimal.ZERO, BigDecimal::add).add(itemStageVO.getWeight());
+            if (sum.compareTo(BigDecimal.TEN.multiply(BigDecimal.TEN)) == 1){
+                ErrorCode.throwBusinessException(STAGE_NODE_ERROR2);
+            }
+        }
         this.save(itemStageVO);
-        Set<ItemStageVO.ParticipatorWeight> participators = itemStageVO.getParticipators();
-        Set<ItemStageUser> itemStageUsers = participators.stream().filter(s->s.getWeight()!=null).map(x -> {
+
+        Set<ItemStageVO.ParticipatorWeight> partWeights = itemStageVO.getParticipators().stream().filter(s -> s.getWeight() != null).collect(Collectors.toSet());
+        if (CollectionUtils.isNotEmpty(partWeights)){
+            BigDecimal reduce = partWeights.stream().map(ItemStageVO.ParticipatorWeight::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
+            if (reduce.compareTo(BigDecimal.TEN.multiply(BigDecimal.TEN)) == 1){
+                ErrorCode.throwBusinessException(STAGE_NODE_ERROR3);
+            }
+        }
+
+        List<ItemStageUser> list = iItemStageUserService.list(new LambdaQueryWrapper<ItemStageUser>().eq(ItemStageUser::getItemId, itemStageVO.getItemId()).eq(ItemStageUser::getStageId, itemStageVO.getId()));
+        if (CollectionUtils.isNotEmpty(list)){
+            BigDecimal reduce = list.stream().map(ItemStageUser::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add).add(partWeights.stream().map(ItemStageVO.ParticipatorWeight::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add));
+            if (reduce.compareTo(BigDecimal.TEN.multiply(BigDecimal.TEN)) == 1){
+                ErrorCode.throwBusinessException(STAGE_NODE_ERROR3);
+            }
+        }
+        Set<ItemStageUser> itemStageUsers = partWeights.stream().map(x -> {
             return ItemStageUser.builder().itemId(itemStageVO.getItemId()).stageId(itemStageVO.getId()).userId(x.getUserId()).weight(x.getWeight()).build();
         }).collect(Collectors.toSet());
         iItemStageUserService.saveBatch(itemStageUsers);
@@ -127,6 +155,25 @@ public class ItemStageServiceImpl extends ServiceImpl<ItemStageMapper, ItemStage
             ErrorCode.throwBusinessException(STAGE_NODE_ERROR1);
         }
 
+        if (itemStageVO.getWeight().compareTo(BigDecimal.TEN.multiply(BigDecimal.TEN))== 1){
+            ErrorCode.throwBusinessException(STAGE_NODE_ERROR2);
+        }
+        List<BigDecimal> sumWeight = this.list(new LambdaQueryWrapper<ItemStage>().eq(ItemStage::getItemId, itemStageVO.getItemId())).stream().map(ItemStage::getWeight).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(sumWeight)){
+            BigDecimal sum = sumWeight.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+            if (sum.compareTo(BigDecimal.TEN.multiply(BigDecimal.TEN)) == 1){
+                ErrorCode.throwBusinessException(STAGE_NODE_ERROR2);
+            }
+        }
+
+        Set<ItemStageVO.ParticipatorWeight> partWeights = itemStageVO.getParticipators().stream().filter(s -> s.getWeight() != null).collect(Collectors.toSet());
+        if (CollectionUtils.isNotEmpty(partWeights)){
+            BigDecimal reduce = partWeights.stream().map(ItemStageVO.ParticipatorWeight::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
+            if (reduce.compareTo(BigDecimal.TEN.multiply(BigDecimal.TEN)) == 1){
+                ErrorCode.throwBusinessException(STAGE_NODE_ERROR3);
+            }
+        }
+
         ItemStage stage1 = this.getOne(new LambdaQueryWrapper<ItemStage>().eq(ItemStage::getHeaderId, itemStageVO.getHeaderId()));
         ItemStage stage2 = this.getOne(new LambdaQueryWrapper<ItemStage>().eq(ItemStage::getHeaderId, oldStage.getFooterId()));
         if (stage1!=null && stage1.getId() != itemStageVO.getId()){