package com.by4cloud.platformx.business.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.by4cloud.platformx.business.entity.*; import com.by4cloud.platformx.business.mapper.*; import com.by4cloud.platformx.business.service.ContractService; import com.by4cloud.platformx.business.service.PaymentOffsetService; import com.by4cloud.platformx.common.core.util.R; import com.by4cloud.platformx.common.security.util.SecurityUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.List; import java.util.Objects; /** * 抵抹账 * * @author syt * @date 2026-05-19 10:38:26 */ @Service @RequiredArgsConstructor public class PaymentOffsetServiceImpl extends ServiceImpl implements PaymentOffsetService { private final ContractService contractService; private final PaymentConfirmMapper paymentConfirmMapper; private final ContractPaymentScheduleMapper contractPaymentScheduleMapper; private final CurrentOverdueMapper currentOverdueMapper; private final HistoryOverdueMapper historyOverdueMapper; private final PaymentSlipMapper paymentSlipMapper; @Override public R add(PaymentOffset paymentOffset) { baseMapper.insert(paymentOffset); Contract contract = contractService.getById(paymentOffset.getContractId()); //新增付款单 PaymentSlip slip = new PaymentSlip(); slip.setBusGuestId(paymentOffset.getBusGuestId()); slip.setBusGuestName(paymentOffset.getBusGuestName()); slip.setPayeeCompId(contract.getPartyBId()); slip.setPayee(contract.getPartyB()); slip.setPaymentTime(paymentOffset.getOffsetTime()); slip.setPaymentAmount(paymentOffset.getOffsetAmount()); slip.setPayType("3"); paymentSlipMapper.insert(slip); PaymentConfirm lastConfirm = paymentConfirmMapper.selectOne(Wrappers.lambdaQuery().eq(PaymentConfirm::getContractId,contract.getId()) .orderByDesc(PaymentConfirm::getCreateTime).last("limit 1")); BigDecimal lastTotal = new BigDecimal("0"); if(ObjUtil.isNotNull(lastConfirm)){ lastTotal = lastConfirm.getTotalAmount(); } PaymentConfirm entity = new PaymentConfirm(); entity.setContractId(contract.getId()); entity.setContractName(contract.getContractName()); entity.setContractNo(contract.getContractNo()); entity.setBusGuestId(paymentOffset.getBusGuestId()); entity.setBusGuestName(paymentOffset.getBusGuestName()); entity.setBusinessType("抵抹账"); entity.setConfirmTime(paymentOffset.getOffsetTime()); entity.setTransationAmount(paymentOffset.getOffsetAmount()); entity.setTotalAmount(paymentOffset.getOffsetAmount().add(lastTotal)); entity.setPayType(2); paymentConfirmMapper.insert(entity); //更新付款阶段付款 List scheduleList = contractPaymentScheduleMapper.selectList(Wrappers.lambdaQuery() .eq(ContractPaymentSchedule::getContractId,contract.getId()).ne(ContractPaymentSchedule::getPaymentStatus,2) .ne(ContractPaymentSchedule::getPaymentStatus,3).orderByAsc(ContractPaymentSchedule::getCreateTime)); if (ArrayUtil.isNotEmpty(scheduleList.toArray())){ BigDecimal remain = paymentOffset.getOffsetAmount(); for (ContractPaymentSchedule schedule:scheduleList) { BigDecimal lastRemain = remain; remain = remain.subtract(StrUtil.equals(schedule.getPaymentStatus()+"","0")?schedule.getPlannedAmount(): schedule.getPlannedAmount().subtract(schedule.getActualAmount())); if (remain.compareTo(new BigDecimal("0"))>=0){ schedule.setActualAmount(schedule.getPlannedAmount()); schedule.setPaymentDate(paymentOffset.getOffsetTime()); schedule.setPaymentStatus(2); contractPaymentScheduleMapper.updateById(schedule); //查询是否有当前逾期 CurrentOverdue currentOverdue = currentOverdueMapper.selectOne(Wrappers.lambdaQuery().eq(CurrentOverdue::getScheduleId,schedule.getId()) .eq(CurrentOverdue::getContractId,schedule.getContractId()).last("limit 1")); if (ObjUtil.isNotNull(currentOverdue)){ //新增逾期历史 HistoryOverdue historyOverdue = BeanUtil.copyProperties(currentOverdue,HistoryOverdue.class,"id"); historyOverdue.setPaymentTime(paymentOffset.getOffsetTime()); historyOverdue.setCompId(schedule.getCompId()); historyOverdueMapper.insert(historyOverdue); //删除当前逾期 currentOverdueMapper.deleteById(currentOverdue); } }else { schedule.setActualAmount(StrUtil.equals(schedule.getPaymentStatus()+"","0")?schedule.getPlannedAmount().add(remain): schedule.getActualAmount().add(lastRemain)); schedule.setPaymentDate(paymentOffset.getOffsetTime()); schedule.setPaymentStatus(1); contractPaymentScheduleMapper.updateById(schedule); //查询是否有当前逾期 CurrentOverdue currentOverdue = currentOverdueMapper.selectOne(Wrappers.lambdaQuery().eq(CurrentOverdue::getScheduleId,schedule.getId()) .eq(CurrentOverdue::getContractId,schedule.getContractId()).last("limit 1")); if (ObjUtil.isNotNull(currentOverdue)){ //新增逾期历史 HistoryOverdue historyOverdue = BeanUtil.copyProperties(currentOverdue,HistoryOverdue.class,"id"); historyOverdue.setReceivableAmount(lastRemain); historyOverdue.setPaymentTime(paymentOffset.getOffsetTime()); historyOverdue.setCompId(schedule.getCompId()); historyOverdueMapper.insert(historyOverdue); //查询历史已付逾期金额 List historyOverdueList = historyOverdueMapper.selectList(Wrappers.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)); currentOverdueMapper.updateById(currentOverdue); } break; } } } //更新合同已付款 BigDecimal paid = new BigDecimal("0"); if (ObjUtil.isNotNull(contract.getPaidAmount())){ paid = contract.getPaidAmount(); } paid = paid.add(paymentOffset.getOffsetAmount()); contract.setPaidAmount(paid); if (paid.compareTo(contract.getAmount())==0){ contract.setBillingStatus("2"); contract.setContractStatus(3); } contractService.updateById(contract); // 查询所有付款阶段是否都付款完成 // if (ArrayUtil.isNotEmpty(scheduleList.toArray())){ // if (scheduleList.stream().allMatch(item -> Objects.equals(item.getPaymentStatus(), 2))){ // contract.setContractStatus(3); // contractService.updateById(contract); // }; // } return R.ok(); } }