|
@@ -1,21 +1,35 @@
|
|
|
package com.dayou.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.dayou.common.BaseEntity;
|
|
|
+import com.dayou.dto.PersonalClaimDTO;
|
|
|
import com.dayou.entity.FinanceClaim;
|
|
|
+import com.dayou.entity.FinanceRealFund;
|
|
|
+import com.dayou.entity.OrderFund;
|
|
|
+import com.dayou.entity.Personal;
|
|
|
+import com.dayou.enums.MainBusinessEnum;
|
|
|
import com.dayou.exception.ErrorCode;
|
|
|
import com.dayou.mapper.FinanceClaimMapper;
|
|
|
-import com.dayou.service.IFinanceClaimService;
|
|
|
+import com.dayou.mapper.OrderFundMapper;
|
|
|
+import com.dayou.service.*;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
-import com.dayou.service.IFinanceRealFundService;
|
|
|
-import com.dayou.service.IProductionFundService;
|
|
|
+import com.dayou.utils.ExcelUtil;
|
|
|
import com.dayou.utils.LoginContext;
|
|
|
import com.dayou.vo.FinanceClaimVO;
|
|
|
+import org.springframework.aop.framework.AopContext;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.time.LocalDateTime;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
@@ -39,6 +53,18 @@ public class FinanceClaimServiceImpl extends ServiceImpl<FinanceClaimMapper, Fin
|
|
|
@Autowired
|
|
|
private IProductionFundService productionFundService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IPersonalService personalService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IOrderFundService orderFundService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private OrderFundMapper orderFundMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IFinanceClaimService financeClaimService;
|
|
|
+
|
|
|
@Override
|
|
|
@SuppressWarnings("unchecked")
|
|
|
public Page<FinanceClaim> selectPage(Page page,FinanceClaim financeClaim){
|
|
@@ -56,10 +82,11 @@ public class FinanceClaimServiceImpl extends ServiceImpl<FinanceClaimMapper, Fin
|
|
|
|
|
|
@Override
|
|
|
public synchronized Boolean add(FinanceClaim financeClaim){
|
|
|
- return doClaim(financeClaim);
|
|
|
+ return financeClaimService.doClaim(financeClaim);
|
|
|
}
|
|
|
|
|
|
@Transactional
|
|
|
+ @Override
|
|
|
public Boolean doClaim(FinanceClaim financeClaim){
|
|
|
BigDecimal notClaimAmount = financeRealFundService.getNotClaimAmount(financeClaim.getRealFundId());
|
|
|
if (financeClaim.getClaimAmount().compareTo(notClaimAmount)<=0){
|
|
@@ -76,9 +103,10 @@ public class FinanceClaimServiceImpl extends ServiceImpl<FinanceClaimMapper, Fin
|
|
|
|
|
|
@Override
|
|
|
public synchronized Boolean update(FinanceClaim financeClaim){
|
|
|
- return doClaimUpdate(financeClaim);
|
|
|
+ return financeClaimService.doClaimUpdate(financeClaim);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
@Transactional
|
|
|
public Boolean doClaimUpdate(FinanceClaim financeClaim){
|
|
|
FinanceClaim xFinanceClaim = this.getById(financeClaim.getId());
|
|
@@ -117,12 +145,102 @@ public class FinanceClaimServiceImpl extends ServiceImpl<FinanceClaimMapper, Fin
|
|
|
BigDecimal totalClaimAmount = financeClaimMapper.getTotalClaimAmountByProductionFundId(id);
|
|
|
return totalClaimAmount;
|
|
|
}
|
|
|
+ @Override
|
|
|
+ public synchronized Boolean personalClaimByTemplate(MultipartFile file,Long financeFundId) {
|
|
|
+ //检查这笔实收款剩余金额
|
|
|
+ BigDecimal residueAmount = checkFinanceFound(financeFundId);
|
|
|
+ List<PersonalClaimDTO> personalClaimDTOS = ExcelUtil.importExcel(PersonalClaimDTO.class,
|
|
|
+ personalClaimDTO->{
|
|
|
+ String orderId = personalClaimDTO.getOrderId();
|
|
|
+ BigDecimal amount = personalClaimDTO.getAmount();
|
|
|
+ if (StrUtil.isNotBlank(orderId)){
|
|
|
+ checkOrderId(orderId);
|
|
|
+ }
|
|
|
+ if (amount!=null){
|
|
|
+ checkAmount(orderId,amount);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ },file, 1);
|
|
|
+ return financeClaimService.doClaimByTemplateDTO(personalClaimDTOS,financeFundId,residueAmount);
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
- public Boolean personalClaimByTemplate(MultipartFile file) {
|
|
|
+ public synchronized BigDecimal residueAmount(Long financeFundId) {
|
|
|
+ return financeClaimMapper.residueAmount(financeFundId);
|
|
|
+ }
|
|
|
+
|
|
|
+ private BigDecimal checkFinanceFound(Long financeFundId) {
|
|
|
+ BigDecimal residueAmount = residueAmount(financeFundId);
|
|
|
+ if (residueAmount==null){
|
|
|
+ ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"未查询到此笔实收款");
|
|
|
+ }
|
|
|
+ if (residueAmount.compareTo(BigDecimal.ZERO)<=0){
|
|
|
+ ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"该笔实收款余额为0,无法再次认领");
|
|
|
+ }
|
|
|
+ return residueAmount;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ @Override
|
|
|
+ public Boolean doClaimByTemplateDTO(List<PersonalClaimDTO> personalClaimDTOS,Long financeFundId,BigDecimal residueAmount) {
|
|
|
+ if (CollectionUtil.isEmpty(personalClaimDTOS)){
|
|
|
+ ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"未解析到模板数据,请检查模板。");
|
|
|
+ }
|
|
|
+ BigDecimal thisTimeClaimTotalAmount = personalClaimDTOS.stream().collect(Collectors.mapping(PersonalClaimDTO::getAmount,
|
|
|
+ Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)));
|
|
|
+
|
|
|
+ if (thisTimeClaimTotalAmount.compareTo(residueAmount)>0){
|
|
|
+ ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"模板认领总金额大于实收款剩余金额,请检查。");
|
|
|
+ }
|
|
|
+ personalClaimDTOS.stream().forEach(x->{
|
|
|
+ //检查该订单是否创建应收款记录
|
|
|
+ OrderFund orderFund = orderFundService.getOne(new LambdaQueryWrapper<OrderFund>().eq(OrderFund::getOrderId, x.getOrderId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
|
|
|
+ if (orderFund==null){
|
|
|
+ Personal personal = personalService.getOne(new LambdaQueryWrapper<Personal>().select(BaseEntity::getId, Personal::getLocation).eq(Personal::getOrderId, x.getOrderId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
|
|
|
+ if (personal!=null){
|
|
|
+ orderFund = new OrderFund();
|
|
|
+ orderFund.setOrderId(x.getOrderId());
|
|
|
+ orderFund.setBusinessType(MainBusinessEnum.PERSONAL_BUSINESS.name());
|
|
|
+ orderFund.setBusinessId(personal.getId());
|
|
|
+ orderFund.setOrderName(personal.getLocation());
|
|
|
+ orderFundService.save(orderFund);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ FinanceClaim financeClaim = new FinanceClaim();
|
|
|
+ financeClaim.setRealFundId(financeFundId);
|
|
|
+ financeClaim.setOrderFundId(orderFund.getId());
|
|
|
+ financeClaim.setClaimId(LoginContext.getCurrentUserId());
|
|
|
+ financeClaim.setClaimDatetime(LocalDateTime.now());
|
|
|
+ financeClaim.setClaimAmount(x.getAmount());
|
|
|
+ this.save(financeClaim);
|
|
|
+ });
|
|
|
+
|
|
|
+ //更新订单认领总金额
|
|
|
+ Map<String, BigDecimal> orderIdGroup = personalClaimDTOS.stream()
|
|
|
+ .collect(Collectors.groupingBy(PersonalClaimDTO::getOrderId,
|
|
|
+ Collectors.mapping(PersonalClaimDTO::getAmount, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
|
|
|
+
|
|
|
+ for(Map.Entry<String,BigDecimal> orderAmount :orderIdGroup.entrySet()){
|
|
|
+ orderFundMapper.updateRealAmountByOrderId(orderAmount.getKey(),orderAmount.getValue());
|
|
|
+ }
|
|
|
|
|
|
return Boolean.TRUE;
|
|
|
}
|
|
|
|
|
|
+ private void checkAmount(String orderId,BigDecimal amount) {
|
|
|
+ if (amount.compareTo(BigDecimal.ZERO)<0){
|
|
|
+ ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"个贷项目编号["+orderId+"]认领金额不能为负数");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void checkOrderId(String orderId) {
|
|
|
+ int count = personalService.count(new LambdaQueryWrapper<Personal>().eq(Personal::getOrderId, orderId).eq(BaseEntity::getDeleted, Boolean.FALSE));
|
|
|
+ if (count!=1){
|
|
|
+ ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"个贷项目编号["+orderId+"]不存在或有多个");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
|
|
|
}
|