|
@@ -9,21 +9,26 @@ import com.dayou.brokerage.constants.BrokerageRule;
|
|
|
import com.dayou.brokerage.constants.BrokerageState;
|
|
|
import com.dayou.brokerage.handler.LandMarketerBrokerageHandler;
|
|
|
import com.dayou.common.BaseEntity;
|
|
|
+import com.dayou.dto.DeductionDTO;
|
|
|
import com.dayou.dto.ItemDTO;
|
|
|
import com.dayou.dto.PaymentDetailDTO;
|
|
|
import com.dayou.dto.SequenceSimpleDTO;
|
|
|
import com.dayou.entity.*;
|
|
|
import com.dayou.mapper.ItemBrokerageSequenceMapper;
|
|
|
+import com.dayou.mapper.ItemBrokerageTechnicistDeductionMapper;
|
|
|
+import com.dayou.mapper.ItemBrokerageTechnicistMapper;
|
|
|
import com.dayou.service.*;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.dayou.utils.DateUtils;
|
|
|
import com.dayou.vo.BrokerageSequenceDetailVO;
|
|
|
import com.dayou.vo.BrokerageSequenceVO;
|
|
|
+import com.dayou.vo.IdNameVO;
|
|
|
import com.google.common.cache.Cache;
|
|
|
import com.google.common.cache.LoadingCache;
|
|
|
import com.google.common.collect.Sets;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.apache.commons.compress.utils.Lists;
|
|
|
import org.checkerframework.checker.units.qual.A;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -39,8 +44,7 @@ import java.util.stream.Collectors;
|
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import static com.dayou.brokerage.constants.BrokerageBusiness.COMPENSATION;
|
|
|
-import static com.dayou.brokerage.constants.BrokerageBusiness.PAYMENT_SETTLE;
|
|
|
+import static com.dayou.brokerage.constants.BrokerageBusiness.*;
|
|
|
import static com.dayou.brokerage.constants.BrokerageMsg.*;
|
|
|
import static com.dayou.brokerage.constants.BrokerageRule.LAND_SUPERVISOR_RULE;
|
|
|
import static com.dayou.common.Constants.*;
|
|
@@ -90,6 +94,21 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
|
|
|
@Autowired
|
|
|
private IMarketStatService marketStatService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IUserService userService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IItemBrokerageTechnicistService technicistService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ItemBrokerageTechnicistMapper technicistMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IItemBrokerageTechnicistDeductionService deductionService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ItemBrokerageTechnicistDeductionMapper deductionMapper;
|
|
|
+
|
|
|
@Override
|
|
|
@SuppressWarnings("unchecked")
|
|
|
public Page<BrokerageSequenceVO> selectPage(Page page, BrokerageSequenceVO itemBrokerageSequence){
|
|
@@ -123,26 +142,137 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
|
|
|
* 非市场人员固定预提结算
|
|
|
* @return
|
|
|
*/
|
|
|
+ @Transactional
|
|
|
@Override
|
|
|
public synchronized Boolean doNonMarketerAheadSettle() {
|
|
|
ConcurrentMap<Long, BigDecimal> nonMarketerAheadAmounts = baseAmountsCache.asMap();
|
|
|
Date now = new Date();
|
|
|
int year = DateUtils.getYear(now);
|
|
|
int month = DateUtils.getMonth(now);
|
|
|
- List<ItemBrokerageSequence> sequences = new ArrayList<>();
|
|
|
for (Map.Entry<Long,BigDecimal> nonMarketerAheadAmount : nonMarketerAheadAmounts.entrySet()){
|
|
|
- ItemBrokerageSequence sequence = ItemBrokerageSequence.builder()
|
|
|
- .brokerageAmount(nonMarketerAheadAmount.getValue())
|
|
|
- .userId(nonMarketerAheadAmount.getKey())
|
|
|
+ Long userId = nonMarketerAheadAmount.getKey();
|
|
|
+ BigDecimal defaultAmount = nonMarketerAheadAmount.getValue();
|
|
|
+ ItemBrokerageSequence defaultSequence = ItemBrokerageSequence.builder()
|
|
|
+ .brokerageAmount(defaultAmount)
|
|
|
+ .userId(userId)
|
|
|
.cate(BrokerageBusiness.DEFAULT_AHEAD.getCode())
|
|
|
- .embody(BROKERAGE_SEQUENCE_EMBODY.replace(YEARMONTH,year+"-"+(month+1)))
|
|
|
+ .embody(BROKERAGE_SEQUENCE_EMBODY.replace(YEARMONTH,year+"-"+month))
|
|
|
.remark(NON_MARKETER_BASE_SEQUENCE_REMARK)
|
|
|
.year(year)
|
|
|
- .month(month+1)
|
|
|
+ .month(month)
|
|
|
.build();
|
|
|
- sequences.add(sequence);
|
|
|
+ this.save(defaultSequence);
|
|
|
+ //若有全额回款的项目一次性结算提成
|
|
|
+ List<ItemBrokerageTechnicist> brokerages = technicistMapper.notSettleForTechnicist(userId);
|
|
|
+ if (CollectionUtils.isNotEmpty(brokerages)){
|
|
|
+ for (ItemBrokerageTechnicist brokerage : brokerages){
|
|
|
+ if (brokerage!=null && brokerage.getResidueAmount()!=null){
|
|
|
+ ItemBrokerageSequence itemSequence = ItemBrokerageSequence.builder()
|
|
|
+ .brokerageAmount(brokerage.getResidueAmount())
|
|
|
+ .userId(userId)
|
|
|
+ .cate(BrokerageBusiness.ONCE_SETTLE.getCode())
|
|
|
+ .embody(BROKERAGE_SEQUENCE_EMBODY.replace(YEARMONTH,year+"-"+month))
|
|
|
+ .remark(NON_MARKETER_ALL_PAYMENT_REMARK)
|
|
|
+ .year(year)
|
|
|
+ .month(month)
|
|
|
+ .build();
|
|
|
+ technicistService.update(new LambdaUpdateWrapper<ItemBrokerageTechnicist>().set(ItemBrokerageTechnicist::getResidueAmount,BigDecimal.ZERO).eq(BaseEntity::getId,brokerage.getId()));
|
|
|
+ this.save(itemSequence);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //抵扣逻辑
|
|
|
+ //可抵扣的项目
|
|
|
+ List<ItemBrokerageTechnicist> deductionAble = technicistService.list(new LambdaQueryWrapper<ItemBrokerageTechnicist>()
|
|
|
+ .eq(ItemBrokerageTechnicist::getUserId, userId).ne(ItemBrokerageTechnicist::getResidueAmount, BigDecimal.ZERO).orderByAsc(BaseEntity::getId));
|
|
|
+
|
|
|
+ //存在可抵扣的项目
|
|
|
+ if (CollectionUtils.isNotEmpty(deductionAble)) {
|
|
|
+ List<ItemBrokerageTechnicistDeduction> deductionDoneList = new ArrayList<>();
|
|
|
+ List<ItemBrokerageTechnicist> xdeductionAble = new ArrayList<>();
|
|
|
+ BigDecimal res = BigDecimal.ZERO;
|
|
|
+ for (ItemBrokerageTechnicist deduction : deductionAble) {
|
|
|
+ if (defaultAmount.compareTo(BigDecimal.ZERO) != 1) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (res.compareTo(BigDecimal.ZERO) == -1) {
|
|
|
+ res = deduction.getResidueAmount().subtract(res.negate());
|
|
|
+ }else {
|
|
|
+ res = deduction.getResidueAmount().subtract(defaultSequence.getBrokerageAmount());
|
|
|
+ }
|
|
|
+ //可抵扣减去预提的金额 剩余部分
|
|
|
+ //剩下为大于等于0
|
|
|
+ if (res.compareTo(BigDecimal.ZERO) != -1) {
|
|
|
+ ItemBrokerageTechnicistDeduction deductionDone = ItemBrokerageTechnicistDeduction.builder()
|
|
|
+ .brokerageSequenceId(defaultSequence.getId())
|
|
|
+ .brokerageTechnicistId(deduction.getId())
|
|
|
+ .deductionAmount(defaultAmount)
|
|
|
+ .build();
|
|
|
+ deductionDoneList.add(deductionDone);
|
|
|
+ deduction.setResidueAmount(res);
|
|
|
+ xdeductionAble.add(deduction);
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ ItemBrokerageTechnicistDeduction deductionDone = ItemBrokerageTechnicistDeduction.builder()
|
|
|
+ .brokerageSequenceId(defaultSequence.getId())
|
|
|
+ .brokerageTechnicistId(deduction.getId())
|
|
|
+ .deductionAmount(deduction.getResidueAmount())
|
|
|
+ .build();
|
|
|
+ deductionDoneList.add(deductionDone);
|
|
|
+ deduction.setResidueAmount(BigDecimal.ZERO);
|
|
|
+ xdeductionAble.add(deduction);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ deductionService.saveBatch(deductionDoneList);
|
|
|
+ technicistService.updateBatchById(xdeductionAble);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Boolean.TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ //仅供单元测试用,后面删掉
|
|
|
+ @Override
|
|
|
+ public void extracted(BigDecimal defaultAmount, ItemBrokerageSequence defaultSequence, List<ItemBrokerageTechnicist> deductionAble) {
|
|
|
+ if (CollectionUtils.isNotEmpty(deductionAble)) {
|
|
|
+ List<ItemBrokerageTechnicistDeduction> deductionDoneList = new ArrayList<>();
|
|
|
+ List<ItemBrokerageTechnicist> xdeductionAble = new ArrayList<>();
|
|
|
+ BigDecimal res = BigDecimal.ZERO;
|
|
|
+ for (ItemBrokerageTechnicist deduction : deductionAble) {
|
|
|
+ if (defaultAmount.compareTo(BigDecimal.ZERO) != 1) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (res.compareTo(BigDecimal.ZERO) == -1) {
|
|
|
+ res = deduction.getResidueAmount().subtract(res.negate());
|
|
|
+ }else {
|
|
|
+ res = deduction.getResidueAmount().subtract(defaultSequence.getBrokerageAmount());
|
|
|
+ }
|
|
|
+ //可抵扣减去预提的金额 剩余部分
|
|
|
+ //剩下为大于等于0
|
|
|
+ if (res.compareTo(BigDecimal.ZERO) != -1) {
|
|
|
+ ItemBrokerageTechnicistDeduction deductionDone = ItemBrokerageTechnicistDeduction.builder()
|
|
|
+ .brokerageSequenceId(defaultSequence.getId())
|
|
|
+ .brokerageTechnicistId(deduction.getId())
|
|
|
+ .deductionAmount(defaultAmount)
|
|
|
+ .build();
|
|
|
+ deductionDoneList.add(deductionDone);
|
|
|
+ deduction.setResidueAmount(res);
|
|
|
+ xdeductionAble.add(deduction);
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ ItemBrokerageTechnicistDeduction deductionDone = ItemBrokerageTechnicistDeduction.builder()
|
|
|
+ .brokerageSequenceId(defaultSequence.getId())
|
|
|
+ .brokerageTechnicistId(deduction.getId())
|
|
|
+ .deductionAmount(deduction.getResidueAmount())
|
|
|
+ .build();
|
|
|
+ deductionDoneList.add(deductionDone);
|
|
|
+ deduction.setResidueAmount(BigDecimal.ZERO);
|
|
|
+ xdeductionAble.add(deduction);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ deductionService.saveBatch(deductionDoneList);
|
|
|
+ technicistService.updateBatchById(xdeductionAble);
|
|
|
}
|
|
|
- return this.saveBatch(sequences);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -163,16 +293,18 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
|
|
|
Set<ItemBrokerageSequenceDetail> sequenceDetails = Sets.newHashSet();
|
|
|
for (ItemBrokerageDetail x : settleDetails){
|
|
|
ItemBrokerageGeneral general = idGeneral.get(x.getGeneralId());
|
|
|
+ //客户经理预提
|
|
|
if (general.getMarketerStatus().equals(BrokerageState.TO_PREDICTING.getCode())
|
|
|
&& x.getBrokerageMode().equals(BrokerageMode.PERSONAL.getCode())
|
|
|
&& x.getBrokerageRule().equals(BrokerageRule.LAND_MARKETER_RULE.getCode())) {
|
|
|
ItemBrokerageSequenceDetail sequenceDetail = getItemBrokerageSequenceDetail(x);
|
|
|
toUpdateItemBrokerageDetails.add(x);
|
|
|
sequenceDetails.add(sequenceDetail);
|
|
|
+ //
|
|
|
}else if (general.getMarketerStatus().equals(BrokerageState.NOT_SETTLE.getCode())
|
|
|
&& x.getBrokerageMode().equals(BrokerageMode.PERSONAL.getCode())
|
|
|
&& ( x.getBrokerageRule().equals(BrokerageRule.LAND_MARKETER_RULE.getCode()) ||x.getBrokerageRule().equals(BrokerageRule.LAND_SUPERVISOR_RULE.getCode()) )) {
|
|
|
- //减去已预提金额 ,这个地方需要再次根据 [结算时间节点] 去重新计算 营销主管和营销经理的 实际提成金额,因为 回款金额等因素可能有变动。
|
|
|
+ //减去已预提金额 ,这个地方需要再次根据 [结算时间节点] 去重新计算 营销主管或客户经理的 实际提成金额,因为 回款金额等因素可能有变动。
|
|
|
//客户经理的实际提成金额则根据预估计算时得出的金额为准
|
|
|
ItemBrokerageSequenceDetail sequenceDetail = getItemBrokerageSequenceDetail(x, general);
|
|
|
toUpdateItemBrokerageDetails.add(x);
|
|
@@ -194,7 +326,7 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
|
|
|
toUpdateItemBrokerageDetails.add(x);
|
|
|
}
|
|
|
else if (general.getParticipantStatus().equals(BrokerageState.NOT_SETTLE.getCode()) && x.getBrokerageRule().equals(BrokerageRule.LAND_OTHER_RULE.getCode())) {
|
|
|
- ItemBrokerageSequenceDetail sequenceDetail = otherRuleSettle(x);
|
|
|
+ ItemBrokerageSequenceDetail sequenceDetail = otherRuleSettle(x,general.getItemId());
|
|
|
toUpdateItemBrokerageDetails.add(x);
|
|
|
sequenceDetails.add(sequenceDetail);
|
|
|
}
|
|
@@ -204,19 +336,37 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
|
|
|
Date now = new Date();
|
|
|
int year = DateUtils.getYear(now);
|
|
|
int month = DateUtils.getMonth(now);
|
|
|
+ Set<Long> marketers = userService.usersByDepartment(MARKET_DEPARTMENT).stream().map(IdNameVO::getId).collect(Collectors.toSet());
|
|
|
for (Map.Entry<Long,List<ItemBrokerageSequenceDetail>> userSequence : collect.entrySet()){
|
|
|
List<ItemBrokerageSequenceDetail> values = userSequence.getValue();
|
|
|
Set<Long> itemSize = values.stream().map(ItemBrokerageSequenceDetail::getGeneralId).collect(Collectors.toSet());
|
|
|
BigDecimal userTotalAmount = values.stream().map(ItemBrokerageSequenceDetail::getBrokerageAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- ItemBrokerageSequence sequence = ItemBrokerageSequence.builder().brokerageAmount(userTotalAmount).userId(userSequence.getKey())
|
|
|
- .cate(BrokerageBusiness.ITEM_SETTLE.getCode())
|
|
|
- .remark(BROKERAGE_SEQUENCE_REMARK.replace("sum",String.valueOf(itemSize.size())))
|
|
|
- .embody(BROKERAGE_SEQUENCE_EMBODY.replace(YEARMONTH,year+"-"+(month+1)))
|
|
|
- .year(year)
|
|
|
- .month(month+1)
|
|
|
- .build();
|
|
|
- this.save(sequence);
|
|
|
- values.stream().forEach(x->{x.setSequenceId(sequence.getId());});
|
|
|
+ if (marketers.contains(userSequence.getKey())){
|
|
|
+ //市场人员直接结算
|
|
|
+ ItemBrokerageSequence sequence = ItemBrokerageSequence.builder().brokerageAmount(userTotalAmount).userId(userSequence.getKey())
|
|
|
+ .cate(BrokerageBusiness.ITEM_SETTLE.getCode())
|
|
|
+ .remark(BROKERAGE_SEQUENCE_REMARK.replace("sum",String.valueOf(itemSize.size())))
|
|
|
+ .embody(BROKERAGE_SEQUENCE_EMBODY.replace(YEARMONTH,year+"-"+month))
|
|
|
+ .year(year)
|
|
|
+ .month(month)
|
|
|
+ .build();
|
|
|
+ this.save(sequence);
|
|
|
+ values.stream().forEach(x->{x.setSequenceId(sequence.getId());});
|
|
|
+ }else {
|
|
|
+ //技术人员 转移奖金池
|
|
|
+ ItemBrokerageSequence sequence = ItemBrokerageSequence.builder().brokerageAmount(userTotalAmount).userId(userSequence.getKey())
|
|
|
+ .cate(BrokerageBusiness.POOL_SETTLE.getCode())
|
|
|
+ .remark(POOL_SETTLE_REMARK)
|
|
|
+ .embody(BROKERAGE_POOL_EMBODY.replace(YEARMONTH,year+"-"+month))
|
|
|
+ .year(year)
|
|
|
+ .month(month)
|
|
|
+ .build();
|
|
|
+ this.save(sequence);
|
|
|
+ values.stream().forEach(x->{x.setSequenceId(sequence.getId());});
|
|
|
+ //技术人员提成汇总
|
|
|
+ doTechnicistBrokerageCollect(userSequence,sequence.getId());
|
|
|
+
|
|
|
+ }
|
|
|
brokerageSequenceDetailService.saveBatch(values);
|
|
|
}
|
|
|
brokerageDetailService.updateBatchById(toUpdateItemBrokerageDetails);
|
|
@@ -250,14 +400,146 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 技术人员的提成在项目维度汇总
|
|
|
+ * @param userSequence
|
|
|
+ */
|
|
|
+ private void doTechnicistBrokerageCollect(Map.Entry<Long, List<ItemBrokerageSequenceDetail>> userSequence,Long sequenceId) {
|
|
|
+ Long userId = userSequence.getKey();
|
|
|
+ List<ItemBrokerageSequenceDetail> sequenceValue = userSequence.getValue();
|
|
|
+ List<ItemBrokerageTechnicist> itemBrokerages = Lists.newArrayList();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ Map<Long, List<ItemBrokerageSequenceDetail>> collectByItemId = sequenceValue.stream().collect(Collectors.groupingBy(ItemBrokerageSequenceDetail::getItemId));
|
|
|
+ for (Map.Entry<Long,List<ItemBrokerageSequenceDetail>> item : collectByItemId.entrySet()){
|
|
|
+ BigDecimal brokerageTotal = item.getValue().stream().map(ItemBrokerageSequenceDetail::getBrokerageAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ ItemBrokerageTechnicist itemBrokerage = ItemBrokerageTechnicist.builder()
|
|
|
+ .itemId(item.getKey())
|
|
|
+ .userId(userId)
|
|
|
+ .sequenceId(sequenceId)
|
|
|
+ .amount(brokerageTotal)
|
|
|
+ .residueAmount(brokerageTotal)
|
|
|
+ .build();
|
|
|
+ itemBrokerages.add(itemBrokerage);
|
|
|
+ }
|
|
|
+ technicistService.saveBatch(itemBrokerages);
|
|
|
+ List<ItemBrokerageTechnicist> technicistsBrokerages = technicistService.list(new LambdaQueryWrapper<ItemBrokerageTechnicist>().eq(ItemBrokerageTechnicist::getUserId, userId).gt(ItemBrokerageTechnicist::getResidueAmount,BigDecimal.ZERO));
|
|
|
+ //检查是否存在预提记录,产生真实提成需冲抵技术人员预提记录
|
|
|
+ List<DeductionDTO> deductionDTOS = deductionMapper.notDeductionDefaultSettle(userId);
|
|
|
+
|
|
|
+ //技术人员提成抵扣
|
|
|
+ deduction(technicistsBrokerages, deductionDTOS);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 技术人员的默认预提与项目结算抵扣逻辑
|
|
|
+ * @param itemBrokerages
|
|
|
+ * @param deductionDTOS
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ @Override
|
|
|
+ public void deduction(List<ItemBrokerageTechnicist> itemBrokerages, List<DeductionDTO> deductionDTOS) {
|
|
|
+ BigDecimal res = null;
|
|
|
+ Long sequenceId = null;
|
|
|
+ BigDecimal notDeduAmount = null;
|
|
|
+ int j = 0;
|
|
|
+ List<ItemBrokerageTechnicistDeduction> newDeductions = new ArrayList<>();
|
|
|
+ List<ItemBrokerageTechnicist> updateTechnicists = new ArrayList<>();
|
|
|
+ if (CollectionUtils.isNotEmpty(deductionDTOS)){
|
|
|
+ for (ItemBrokerageTechnicist deductionAble : itemBrokerages){
|
|
|
+ //余数大于等于0
|
|
|
+ if (res!=null && res.compareTo(BigDecimal.ZERO)!=-1){
|
|
|
+ // 未抵扣的已抵扣完 退出外层循环
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ //在外循环中一直抵扣
|
|
|
+ if (res!=null && res.compareTo(BigDecimal.ZERO) == -1){
|
|
|
+ res = deductionAble.getResidueAmount().subtract(res.negate());
|
|
|
+ if (res!=null && res.compareTo(BigDecimal.ZERO) == -1){
|
|
|
+ ItemBrokerageTechnicistDeduction allDeduction = ItemBrokerageTechnicistDeduction.builder()
|
|
|
+ .brokerageTechnicistId(deductionAble.getId()).brokerageSequenceId(sequenceId).deductionAmount(deductionAble.getResidueAmount()).build();
|
|
|
+ deductionAble.setResidueAmount(BigDecimal.ZERO);
|
|
|
+ newDeductions.add(allDeduction);
|
|
|
+ updateTechnicists.add(deductionAble);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ ItemBrokerageTechnicistDeduction departDeduction = ItemBrokerageTechnicistDeduction.builder()
|
|
|
+ .brokerageTechnicistId(deductionAble.getId()).brokerageSequenceId(sequenceId).deductionAmount(deductionAble.getResidueAmount().subtract(res)).build();
|
|
|
+ newDeductions.add(departDeduction);
|
|
|
+ //减去外循环中已抵扣的一部分,重新设置余额再进入内循环抵扣
|
|
|
+ deductionAble.setResidueAmount(res);
|
|
|
+ }
|
|
|
+ //在外循环中某一笔抵扣完上一笔还有剩余,进入内循环中抵扣
|
|
|
+ for (int i =j;i<deductionDTOS.size(); i++){
|
|
|
+ //余数小于0
|
|
|
+ if (res!=null && res.compareTo(BigDecimal.ZERO) == -1){
|
|
|
+ res = deductionAble.getResidueAmount().subtract(res.negate());
|
|
|
+ //余数大于等于0
|
|
|
+ if (res!=null && res.compareTo(BigDecimal.ZERO)!=-1){
|
|
|
+ //继续内循环中抵扣 插入
|
|
|
+ ItemBrokerageTechnicistDeduction allDeduction = ItemBrokerageTechnicistDeduction.builder()
|
|
|
+ .brokerageTechnicistId(deductionAble.getId()).brokerageSequenceId(sequenceId).deductionAmount(notDeduAmount).build();
|
|
|
+ deductionAble.setResidueAmount(res);
|
|
|
+ newDeductions.add(allDeduction);
|
|
|
+ updateTechnicists.add(deductionAble);
|
|
|
+ continue;
|
|
|
+ }else {
|
|
|
+ //说明外层循环可抵扣的值不足,调出内层循环
|
|
|
+ ItemBrokerageTechnicistDeduction departDeduction = ItemBrokerageTechnicistDeduction.builder()
|
|
|
+ .brokerageTechnicistId(deductionAble.getId()).brokerageSequenceId(sequenceId).deductionAmount(res.negate()).build();
|
|
|
+ deductionAble.setResidueAmount(BigDecimal.ZERO);
|
|
|
+ newDeductions.add(departDeduction);
|
|
|
+ updateTechnicists.add(deductionAble);
|
|
|
+ j = i+1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ sequenceId = deductionDTOS.get(i).getSequenceId();
|
|
|
+ notDeduAmount = deductionDTOS.get(i).getNotDeduAmount();
|
|
|
+ res = deductionAble.getResidueAmount().subtract(notDeduAmount);
|
|
|
+ //余数大于等于0
|
|
|
+ if (res!=null && res.compareTo(BigDecimal.ZERO)!=-1){
|
|
|
+ //继续内循环中抵扣 插入 (完全抵扣完)
|
|
|
+ ItemBrokerageTechnicistDeduction allDeduction = ItemBrokerageTechnicistDeduction.builder()
|
|
|
+ .brokerageTechnicistId(deductionAble.getId()).brokerageSequenceId(sequenceId).deductionAmount(notDeduAmount).build();
|
|
|
+ deductionAble.setResidueAmount(res);
|
|
|
+ newDeductions.add(allDeduction);
|
|
|
+ updateTechnicists.add(deductionAble);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ //说明外层循环可抵扣的值不足,调出内层循环 (部分抵扣完)
|
|
|
+ ItemBrokerageTechnicistDeduction departDeduction = ItemBrokerageTechnicistDeduction.builder()
|
|
|
+ .brokerageTechnicistId(deductionAble.getId()).brokerageSequenceId(sequenceId).deductionAmount(notDeduAmount.subtract(res.negate())).build();
|
|
|
+ deductionAble.setResidueAmount(BigDecimal.ZERO);
|
|
|
+ newDeductions.add(departDeduction);
|
|
|
+ updateTechnicists.add(deductionAble);
|
|
|
+ j = i+1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ updateTechnicists.add(deductionAble);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ deductionService.saveBatch(newDeductions);
|
|
|
+ technicistService.updateBatchById(updateTechnicists);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 参与人人员结算
|
|
|
* @param x
|
|
|
* @return
|
|
|
*/
|
|
|
- private ItemBrokerageSequenceDetail otherRuleSettle(ItemBrokerageDetail x) {
|
|
|
+ private ItemBrokerageSequenceDetail otherRuleSettle(ItemBrokerageDetail x,Long itemId) {
|
|
|
ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
|
|
|
.brokerageDetailId(x.getId()).unsettledAmount(BigDecimal.ZERO).userId(x.getUserId())
|
|
|
- .brokerageCate(BrokerageBusiness.SETTLE.getCode()).brokerageAmount(x.getActualAmount()).generalId(x.getGeneralId()).build();
|
|
|
+ .brokerageCate(BrokerageBusiness.SETTLE.getCode()).brokerageAmount(x.getActualAmount()).generalId(x.getGeneralId()).itemId(itemId).build();
|
|
|
x.setAdvanceAmount(x.getActualAmount());
|
|
|
return sequenceDetail;
|
|
|
}
|