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 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<PaymentOffsetMapper, PaymentOffset> implements PaymentOffsetService {
|
|
private final ContractService contractService;
|
private final PaymentConfirmMapper paymentConfirmMapper;
|
private final ContractPaymentScheduleMapper contractPaymentScheduleMapper;
|
private final CurrentOverdueMapper currentOverdueMapper;
|
private final HistoryOverdueMapper historyOverdueMapper;
|
|
@Override
|
public R add(PaymentOffset paymentOffset) {
|
baseMapper.insert(paymentOffset);
|
Contract contract = contractService.getById(paymentOffset.getContractId());
|
|
PaymentConfirm lastConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>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<ContractPaymentSchedule> scheduleList = contractPaymentScheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery()
|
.eq(ContractPaymentSchedule::getContractId,contract.getId()).ne(ContractPaymentSchedule::getPaymentStatus,2)
|
.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.<CurrentOverdue>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.<CurrentOverdue>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<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));
|
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.setPaidAmount(contract.getAmount());
|
}
|
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();
|
}
|
}
|