shiyunteng
2026-07-17 8de09297dcc5393cc8542f29318b17f5696d4f8d
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/PaymentConfirmServiceImpl.java
@@ -13,6 +13,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.by4cloud.platformx.admin.api.entity.SysDept;
import com.by4cloud.platformx.admin.api.feign.RemoteDeptService;
import com.by4cloud.platformx.business.dto.AgingQueryDTO;
import com.by4cloud.platformx.business.dto.PaymentConfirmAddDTO;
import com.by4cloud.platformx.business.entity.*;
import com.by4cloud.platformx.business.mapper.*;
@@ -20,7 +21,11 @@
import com.by4cloud.platformx.business.service.ContractService;
import com.by4cloud.platformx.business.service.PaymentConfirmService;
import com.by4cloud.platformx.business.utils.SignHelper;
import com.by4cloud.platformx.business.vo.AgingAnalysisVo;
import com.by4cloud.platformx.business.vo.AgingCompanyVo;
import com.by4cloud.platformx.business.vo.AgingVo;
import com.by4cloud.platformx.common.core.util.R;
import com.by4cloud.platformx.common.data.datascope.DataScope;
import com.by4cloud.platformx.common.security.util.SecurityUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -30,10 +35,13 @@
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
 * 收款确认
@@ -73,9 +81,10 @@
   public R add(PaymentConfirmAddDTO addDTO) {
      if (StrUtil.isNotBlank(addDTO.getContractNo())) {
         Contract contract = contractService.getOne(Wrappers.<Contract>lambdaQuery().eq(Contract::getContractNo, addDTO.getContractNo()));
         BusinessCustomer customer = businessCustomerService.getOne(Wrappers.<BusinessCustomer>lambdaQuery()
               .eq(StrUtil.isNotBlank(addDTO.getBusGuestName()), BusinessCustomer::getRegisterName, addDTO.getBusGuestName())
               .eq(StrUtil.isNotBlank(addDTO.getBusGuestId()), BusinessCustomer::getId, addDTO.getBusGuestId()));
         if (ObjUtil.isNull(contract)) {
            return R.failed("合同查询失败,请检查合同编号");
         }
         BusinessCustomer customer = businessCustomerService.getById(contract.getPartyAId());
         if (ObjUtil.isNull(customer)) {
            return R.failed("客商查询失败,请检查客商");
         }
@@ -87,8 +96,21 @@
            lastTotal = lastConfirm.getTotalAmount();
         }
         //转入
         if (StrUtil.equals(addDTO.getInOrOut(), "1")) {
            //新增付款单
            PaymentSlip slip = new PaymentSlip();
            slip.setBusGuestId(customer.getId());
            slip.setBusGuestName(customer.getRegisterName());
            slip.setPayeeCompId(SecurityUtils.getUser().getCompId());
            slip.setPaymentTime(addDTO.getConfirmTime());
            slip.setPaymentAmount(addDTO.getTransationAmount());
            slip.setPayType(addDTO.getPayType());
            paymentSlipMapper.insert(slip);
            BigDecimal newtotal = addDTO.getTransationAmount().add(lastTotal);
            PaymentConfirm entity = new PaymentConfirm();
            entity.setContractId(contract.getId());
@@ -162,11 +184,8 @@
                        historyOverdue.setPaymentTime(addDTO.getConfirmTime());
                        historyOverdue.setCompId(schedule.getCompId());
                        historyOverdueMapper.insert(historyOverdue);
                        //查询历史已付逾期金额
                        List<HistoryOverdue> historyOverdueList = historyOverdueMapper.selectList(Wrappers.<HistoryOverdue>lambdaQuery().eq(HistoryOverdue::getScheduleId, currentOverdue.getScheduleId()));
                        BigDecimal hisTotal = historyOverdueList.stream().map(item -> item.getReceivableAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
                        //更新当前逾期
                        currentOverdue.setReceivableAmount(schedule.getPlannedAmount().subtract(hisTotal));
                        currentOverdue.setReceivableAmount(schedule.getPlannedAmount().subtract(schedule.getActualAmount()));
                        currentOverdueMapper.updateById(currentOverdue);
                     }
                     break;
@@ -194,7 +213,7 @@
            entity.setBusGuestId(customer.getId());
            entity.setBusGuestName(customer.getRegisterName());
            entity.setBusinessType("");
            entity.setBusinessType("退款");
            entity.setTransationAmount(addDTO.getTransationAmount());
            BigDecimal newtotal = addDTO.getTransationAmount().multiply(new BigDecimal("-1")).add(lastConfirm.getTotalAmount());
            if (newtotal.compareTo(new BigDecimal("0")) > 0) {
@@ -839,4 +858,102 @@
      }
      baseMapper.insert(entity);
   }
   @Override
   public R queryAllBusinessType() {
      return R.ok(baseMapper.selectList(Wrappers.<PaymentConfirm>lambdaQuery().select(PaymentConfirm::getBusinessType).isNotNull(PaymentConfirm::getBusinessType)
                  .groupBy(PaymentConfirm::getBusinessType)).stream().map(PaymentConfirm::getBusinessType).collect(Collectors.toList()));
   }
   @Override
   public R queryAging() {
      List<AgingCompanyVo> companys = contractPaymentScheduleMapper.selectAgingCompany(null,DataScope.of("comp_id"));
      if (ArrayUtil.isEmpty(companys.toArray())){
         return R.failed("暂无账龄");
      }
      List<AgingAnalysisVo> result = new ArrayList<>();
      AgingQueryDTO queryDTO = new AgingQueryDTO();
      List<AgingVo> agingVoList = contractPaymentScheduleMapper.selectAgingTotal(null);
      companys.stream().forEach(company->{
         BusinessCustomer businessCustomer = businessCustomerService.getById(company.getCompanyId());
         AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
         agingAnalysisVo.setCompanyName(businessCustomer.getCompanyName());
         queryDTO.setCompanyId(company.getCompanyId());
         List<AgingVo> companyAgingVo = contractPaymentScheduleMapper.selectAgingTotal(queryDTO);
         //补全数据
         if (ArrayUtil.isEmpty(companyAgingVo.toArray())){
            companyAgingVo = new ArrayList<>();
            AgingVo agingVo1 = new AgingVo("0-30天",new BigDecimal("0"),null);
            AgingVo agingVo2 = new AgingVo("31-60天",new BigDecimal("0"),null);
            AgingVo agingVo3 = new AgingVo("61-90天",new BigDecimal("0"),null);
            AgingVo agingVo4 = new AgingVo("91-180天",new BigDecimal("0"),null);
            AgingVo agingVo5 = new AgingVo("181-365天",new BigDecimal("0"),null);
            AgingVo agingVo6 = new AgingVo("1年以上",new BigDecimal("0"),null);
            companyAgingVo.add(agingVo1);
            companyAgingVo.add(agingVo2);
            companyAgingVo.add(agingVo3);
            companyAgingVo.add(agingVo4);
            companyAgingVo.add(agingVo5);
            companyAgingVo.add(agingVo6);
         }else {
            List<String> overdueRanges = companyAgingVo.stream().map(AgingVo::getOverdueRange).collect(Collectors.toList());
            if (!ArrayUtil.contains(overdueRanges.toArray(),"0-30天")){
               AgingVo agingVo1 = new AgingVo("0-30天",new BigDecimal("0"),null);
               companyAgingVo.add(agingVo1);
            }
            if (!ArrayUtil.contains(overdueRanges.toArray(),"31-60天")){
               AgingVo agingVo2 = new AgingVo("31-60天",new BigDecimal("0"),null);
               companyAgingVo.add(agingVo2);
            }
            if (!ArrayUtil.contains(overdueRanges.toArray(),"61-90天")){
               AgingVo agingVo3 = new AgingVo("61-90天",new BigDecimal("0"),null);
               companyAgingVo.add(agingVo3);
            }
            if (!ArrayUtil.contains(overdueRanges.toArray(),"91-180天")){
               AgingVo agingVo4 = new AgingVo("91-180天",new BigDecimal("0"),null);
               companyAgingVo.add(agingVo4);
            }
            if (!ArrayUtil.contains(overdueRanges.toArray(),"181-365天")){
               AgingVo agingVo5 = new AgingVo("181-365天",new BigDecimal("0"),null);
               companyAgingVo.add(agingVo5);
            }
            if (!ArrayUtil.contains(overdueRanges.toArray(),"1年以上")){
               AgingVo agingVo6 = new AgingVo("1年以上",new BigDecimal("0"),null);
               companyAgingVo.add(agingVo6);
            }
         }
         agingAnalysisVo.setAmount(companyAgingVo.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
         List<AgingVo> finalCompanyAgingVo = companyAgingVo;
         agingAnalysisVo.setPercent(IntStream.range(0, agingVoList.size())
               .mapToObj(i -> {
                  BigDecimal part = finalCompanyAgingVo.get(i).getTotalAmount();
                  BigDecimal total = agingVoList.get(i).getTotalAmount();
                  if (total == null || total.compareTo(BigDecimal.ZERO) == 0) {
                     return null;
                  }
                  return part.divide(total, 4, RoundingMode.HALF_UP)
                        .multiply(new BigDecimal("100"))
                        .setScale(2, RoundingMode.HALF_UP);
               })
               .collect(Collectors.toList()));
         result.add(agingAnalysisVo);
      });
      //合计
      AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
      agingAnalysisVo.setCompanyName("合计");
      agingAnalysisVo.setAmount(agingVoList.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
      List<BigDecimal> percent = IntStream.range(0, agingAnalysisVo.getAmount().size())
            .mapToObj(i -> {
               if (agingAnalysisVo.getAmount().get(i) == null || agingAnalysisVo.getAmount().get(i).compareTo(BigDecimal.ZERO) == 0) {
                  return null;
               }else {
                  return new BigDecimal("100");
               }
            })
            .collect(Collectors.toList());
      agingAnalysisVo.setPercent(percent);
      result.add(agingAnalysisVo);
      return R.ok(result);
   }
}