|
@@ -1,7 +1,13 @@
|
|
|
package com.dayou.service.impl;
|
|
|
|
|
|
+import com.dayou.brokerage.BrokerageCalculateSupport;
|
|
|
+import com.dayou.brokerage.NonMarketerMarketerBrokerageCalculator;
|
|
|
+import com.dayou.brokerage.config.LandBrokerageDataConfiguration;
|
|
|
import com.dayou.brokerage.constants.BrokerageBusiness;
|
|
|
+import com.dayou.brokerage.constants.BrokerageMode;
|
|
|
+import com.dayou.brokerage.constants.BrokerageRule;
|
|
|
import com.dayou.brokerage.constants.BrokerageState;
|
|
|
+import com.dayou.brokerage.factory.BrokerageCalculateFactory;
|
|
|
import com.dayou.common.BaseEntity;
|
|
|
import com.dayou.dto.SalarySettleDTO;
|
|
|
import com.dayou.entity.ItemBrokerageDetail;
|
|
@@ -11,6 +17,8 @@ import com.dayou.entity.ItemBrokerageSequenceDetail;
|
|
|
import com.dayou.mapper.ItemBrokerageSequenceMapper;
|
|
|
import com.dayou.service.*;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.dayou.utils.DateUtils;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
@@ -30,15 +38,16 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.util.List;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Set;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import com.dayou.enums.BatchTaskTypeEnum;
|
|
|
|
|
|
+import static com.dayou.brokerage.constants.BrokerageMsg.*;
|
|
|
+
|
|
|
/**
|
|
|
* <p>
|
|
|
* 项目提成流水 服务实现类
|
|
@@ -47,6 +56,7 @@ import com.dayou.enums.BatchTaskTypeEnum;
|
|
|
* @author wucl
|
|
|
* @since 2023-03-03
|
|
|
*/
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageSequenceMapper, ItemBrokerageSequence> implements IItemBrokerageSequenceService {
|
|
|
|
|
@@ -54,14 +64,14 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
|
|
|
private IItemBrokerageSequenceDetailService brokerageSequenceDetailService;
|
|
|
|
|
|
@Autowired
|
|
|
- private IItemService iItemService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
private IItemBrokerageGeneralService brokerageGeneralService;
|
|
|
|
|
|
@Autowired
|
|
|
private IItemBrokerageDetailService brokerageDetailService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private LandBrokerageDataConfiguration landBrokerageDataConfiguration;
|
|
|
+
|
|
|
@Override
|
|
|
@SuppressWarnings("unchecked")
|
|
|
public Page<ItemBrokerageSequence> selectPage(Page page,ItemBrokerageSequence itemBrokerageSequence){
|
|
@@ -90,70 +100,129 @@ public class ItemBrokerageSequenceServiceImpl extends ServiceImpl<ItemBrokerageS
|
|
|
return this.removeById(id);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 非市场人员固定预提结算
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean doNonMarketerAheadSettle() {
|
|
|
+ ConcurrentHashMap<Long, BigDecimal> nonMarketerAheadAmounts = landBrokerageDataConfiguration.userBaseBrokerageAmounts;
|
|
|
+ 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())
|
|
|
+ .cate(BrokerageBusiness.DEFAULT_AHEAD.getCode())
|
|
|
+ .embody(BROKERAGE_SEQUENCE_EMBODY.replace("year-month",year+"-"+(month+1))).remark(NON_MARKETER_BASE_SEQUENCE_REMARK).build();
|
|
|
+ sequences.add(sequence);
|
|
|
+ }
|
|
|
+ return this.saveBatch(sequences);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 结算可结算的项目提成
|
|
|
+ * @return
|
|
|
+ */
|
|
|
@Transactional
|
|
|
@Override
|
|
|
- public Boolean salarySettle() {
|
|
|
- List<ItemBrokerageGeneral> generals = brokerageGeneralService.settleAbleList();
|
|
|
+ public synchronized Boolean doAbleItemBrokerageSettle() {
|
|
|
+ List<ItemBrokerageGeneral> generals = brokerageGeneralService.computedAbleList();
|
|
|
Map<Long, ItemBrokerageGeneral> idGeneral = generals.stream().collect(Collectors.toMap(BaseEntity::getId, ItemBrokerageGeneral -> ItemBrokerageGeneral));
|
|
|
if (CollectionUtils.isNotEmpty(generals)){
|
|
|
Set<Long> generalIds = generals.stream().map(ItemBrokerageGeneral::getId).collect(Collectors.toSet());
|
|
|
List<ItemBrokerageDetail> settleDetails = brokerageDetailService.list(new LambdaQueryWrapper<ItemBrokerageDetail>()
|
|
|
.in(ItemBrokerageDetail::getGeneralId, generalIds).eq(BaseEntity::getDeleted, Boolean.FALSE));
|
|
|
+ List<ItemBrokerageDetail> toUpdateItemBrokerageDetails = new ArrayList<>();
|
|
|
if (CollectionUtils.isNotEmpty(settleDetails)){
|
|
|
Set<ItemBrokerageSequenceDetail> sequenceDetails = settleDetails.stream().map(x -> {
|
|
|
- ItemBrokerageSequenceDetail sequenceDetail = new ItemBrokerageSequenceDetail();
|
|
|
- sequenceDetail.setBrokerageDetailId(x.getId());
|
|
|
- sequenceDetail.setUserId(x.getUserId());
|
|
|
- if (x.getAheadAmount() != null) {
|
|
|
- sequenceDetail.setBrokerageCate(BrokerageBusiness.AHEAD.getCode());
|
|
|
- sequenceDetail.setBrokerageAmount(x.getAheadAmount());
|
|
|
- } else {
|
|
|
- sequenceDetail.setBrokerageCate(BrokerageBusiness.SETTLE.getCode());
|
|
|
- sequenceDetail.setBrokerageAmount(x.getActualAmount());
|
|
|
+ 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 = ItemBrokerageSequenceDetail.builder()
|
|
|
+ .brokerageDetailId(x.getId()).userId(x.getUserId()).brokerageCate(BrokerageBusiness.AHEAD.getCode()).brokerageAmount(x.getAheadAmount()).generalId(x.getGeneralId()).build();
|
|
|
+ x.setAdvanceAmount(x.getAheadAmount());
|
|
|
+ toUpdateItemBrokerageDetails.add(x);
|
|
|
+ return sequenceDetail;
|
|
|
+ }else if (general.getMarketerStatus().equals(BrokerageState.NOT_SETTLE.getCode()) && x.getBrokerageRule().equals(BrokerageRule.LAND_MARKETER_RULE.getCode())) {
|
|
|
+ //减去已预提金额
|
|
|
+ BigDecimal actualAmount = x.getActualAmount();
|
|
|
+ if (general.getMarketerAdvanceBrokerageDone()){
|
|
|
+ actualAmount = x.getActualAmount().subtract(x.getAheadAmount());
|
|
|
+ }
|
|
|
+ ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
|
|
|
+ .brokerageDetailId(x.getId()).userId(x.getUserId()).brokerageCate(BrokerageBusiness.SETTLE.getCode()).brokerageAmount(actualAmount).generalId(x.getGeneralId()).build();
|
|
|
+ x.setAdvanceAmount(actualAmount);
|
|
|
+ toUpdateItemBrokerageDetails.add(x);
|
|
|
+ return sequenceDetail;
|
|
|
+ }else if (general.getParticipantStatus().equals(BrokerageState.NOT_SETTLE.getCode()) && x.getBrokerageRule().equals(BrokerageRule.LAND_OTHER_RULE.getCode())) {
|
|
|
+ ItemBrokerageSequenceDetail sequenceDetail = ItemBrokerageSequenceDetail.builder()
|
|
|
+ .brokerageDetailId(x.getId()).userId(x.getUserId()).brokerageCate(BrokerageBusiness.SETTLE.getCode()).brokerageAmount(x.getActualAmount()).generalId(x.getGeneralId()).build();
|
|
|
+ x.setAdvanceAmount(x.getActualAmount());
|
|
|
+ toUpdateItemBrokerageDetails.add(x);
|
|
|
+ return sequenceDetail;
|
|
|
+ }else {
|
|
|
+ return null;
|
|
|
}
|
|
|
- return sequenceDetail;
|
|
|
}).collect(Collectors.toSet());
|
|
|
|
|
|
- Map<Long, List<ItemBrokerageSequenceDetail>> collect = sequenceDetails.stream().collect(Collectors.groupingBy(ItemBrokerageSequenceDetail::getUserId));
|
|
|
-
|
|
|
+ Map<Long, List<ItemBrokerageSequenceDetail>> collect = sequenceDetails.stream().filter(x->x!=null).collect(Collectors.groupingBy(ItemBrokerageSequenceDetail::getUserId));
|
|
|
+ Date now = new Date();
|
|
|
+ int year = DateUtils.getYear(now);
|
|
|
+ int month = DateUtils.getMonth(now);
|
|
|
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);
|
|
|
- //todo
|
|
|
- ItemBrokerageSequence sequence = ItemBrokerageSequence.builder().brokerageAmount(userTotalAmount).userId(userSequence.getKey()).remark("").embody("").build();
|
|
|
+ ItemBrokerageSequence sequence = ItemBrokerageSequence.builder().brokerageAmount(userTotalAmount).userId(userSequence.getKey())
|
|
|
+ .cate(BrokerageBusiness.ITEM_SETTLE.getCode())
|
|
|
+ .remark(BROKERAGE_SEQUENCE_REMARK.replace("sum",itemSize.size()+"").replace("month",(month+1)+""))
|
|
|
+ .embody(BROKERAGE_SEQUENCE_EMBODY.replace("year-month",year+"-"+(month+1))).build();
|
|
|
this.save(sequence);
|
|
|
values.stream().forEach(x->{x.setSequenceId(sequence.getId());});
|
|
|
brokerageSequenceDetailService.saveBatch(values);
|
|
|
}
|
|
|
+ brokerageDetailService.updateBatchById(toUpdateItemBrokerageDetails);
|
|
|
|
|
|
- Map<Long, List<ItemBrokerageDetail>> itemDetails = settleDetails.stream().collect(Collectors.groupingBy(ItemBrokerageDetail::getGeneralId));
|
|
|
+ Map<Long, List<ItemBrokerageSequenceDetail>> sequenceDetailByGeneral = sequenceDetails.stream().filter(x->x!=null).collect(Collectors.groupingBy(ItemBrokerageSequenceDetail::getGeneralId));
|
|
|
|
|
|
- for (Map.Entry<Long,List<ItemBrokerageDetail>> itemDetail : itemDetails.entrySet()){
|
|
|
+ for (Map.Entry<Long,List<ItemBrokerageSequenceDetail>> sequence : sequenceDetailByGeneral.entrySet()){
|
|
|
BigDecimal gAheadTotal = BigDecimal.ZERO;
|
|
|
BigDecimal gAdvanceTotal = BigDecimal.ZERO;
|
|
|
- for (ItemBrokerageDetail itemBrokerageDetail :itemDetail.getValue()){
|
|
|
+ ItemBrokerageGeneral general = idGeneral.get(sequence.getKey());
|
|
|
+ for (ItemBrokerageSequenceDetail sequenceDetail :sequence.getValue()){
|
|
|
//如果预提金额不为空,且已结算金额为空
|
|
|
- if (itemBrokerageDetail.getAheadAmount().compareTo(BigDecimal.ZERO)!=0 && itemBrokerageDetail.getAdvanceAmount().compareTo(BigDecimal.ZERO) ==0) {
|
|
|
- gAheadTotal.add(itemBrokerageDetail.getAheadAmount());
|
|
|
- gAdvanceTotal.add(itemBrokerageDetail.getAheadAmount());
|
|
|
- }else if (itemBrokerageDetail.getAheadAmount().compareTo(BigDecimal.ZERO)!=0 && itemBrokerageDetail.getAdvanceAmount().compareTo(BigDecimal.ZERO) !=0){
|
|
|
- gAdvanceTotal.add(itemBrokerageDetail.getActualAmount());
|
|
|
- }else {
|
|
|
- continue;
|
|
|
+ if (general.getMarketerStatus().equals(BrokerageState.TO_PREDICTING.getCode()) && sequenceDetail.getBrokerageCate().equals(BrokerageBusiness.AHEAD.getCode())) {
|
|
|
+ gAheadTotal = gAheadTotal.add(sequenceDetail.getBrokerageAmount());
|
|
|
+ }else if (general.getMarketerStatus().equals(BrokerageState.NOT_SETTLE.getCode()) && sequenceDetail.getBrokerageCate().equals(BrokerageBusiness.SETTLE.getCode())){
|
|
|
+ gAdvanceTotal = gAdvanceTotal.add(sequenceDetail.getBrokerageAmount());
|
|
|
+ }else if (general.getParticipantStatus().equals(BrokerageState.NOT_SETTLE.getCode()) && sequenceDetail.getBrokerageCate().equals(BrokerageBusiness.SETTLE.getCode())){
|
|
|
+ gAdvanceTotal = gAdvanceTotal.add(sequenceDetail.getBrokerageAmount());
|
|
|
}
|
|
|
}
|
|
|
- ItemBrokerageGeneral general = idGeneral.get(itemDetail.getKey());
|
|
|
- general.setMarketerAdvanceBrokerageDone(gAheadTotal.compareTo(BigDecimal.ZERO)!=0);
|
|
|
- general.setBrokerageActualAmount(gAdvanceTotal.add(gAheadTotal));
|
|
|
- if (gAheadTotal.compareTo(BigDecimal.ZERO)==0){
|
|
|
- //todo
|
|
|
- general.setStatus(BrokerageState.CLOSED.getCode());
|
|
|
+ general.setBrokerageActualAmount(gAdvanceTotal.add(gAheadTotal).add(general.getBrokerageActualAmount()));
|
|
|
+
|
|
|
+ if (general.getMarketerStatus().equals(BrokerageState.TO_PREDICTING.getCode())){
|
|
|
+ general.setMarketerStatus(BrokerageState.PREDICTED.getCode());
|
|
|
+ general.setMarketerAdvanceBrokerageDone(Boolean.TRUE);
|
|
|
+ }
|
|
|
+ if (general.getMarketerStatus().equals(BrokerageState.NOT_SETTLE.getCode())){
|
|
|
+ general.setMarketerStatus(BrokerageState.CLOSED.getCode());
|
|
|
+ }
|
|
|
+ if (general.getParticipantStatus().equals(BrokerageState.NOT_SETTLE.getCode())){
|
|
|
+ general.setParticipantStatus(BrokerageState.CLOSED.getCode());
|
|
|
+ general.setParticipantAdvanceStatus(Boolean.FALSE);
|
|
|
}
|
|
|
}
|
|
|
- brokerageGeneralService.updateBatchById(generals);
|
|
|
+ log.info("结算完成.");
|
|
|
+ return brokerageGeneralService.updateBatchById(generals);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
- return null;
|
|
|
+ log.info("当前暂无可结算的项目");
|
|
|
+ return Boolean.FALSE;
|
|
|
}
|
|
|
}
|