package com.ruoyi.cwgl.service.impl;
|
|
import java.math.BigDecimal;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.Set;
|
import java.util.stream.Collectors;
|
|
import com.ruoyi.common.utils.DateUtils;
|
import javax.annotation.Resource;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.stereotype.Service;
|
import org.springframework.scheduling.annotation.Async;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import com.ruoyi.common.utils.PageUtils;
|
import com.ruoyi.common.constant.Constants;
|
import com.ruoyi.common.annotation.DataSource;
|
import com.ruoyi.common.enums.DataSourceType;
|
import com.ruoyi.common.core.service.BaseService;
|
import com.ruoyi.common.exception.ServiceException;
|
import com.ruoyi.common.utils.SecurityUtils;
|
|
import com.ruoyi.cwgl.mapper.PayableBillSettlementDetailMapper;
|
import com.ruoyi.cwgl.domain.PayableBillSettlementDetail;
|
import com.ruoyi.cwgl.service.IPayableBillSettlementDetailService;
|
import com.ruoyi.cwgl.service.IPayableBillManagementService;
|
import com.ruoyi.cwgl.domain.PayableBillManagement;
|
import com.ruoyi.cwgl.service.IPayableBillManagementLogService;
|
import com.ruoyi.cwgl.domain.PayableBillManagementLog;
|
import com.ruoyi.common.core.text.Convert;
|
|
/**
|
* 应付账单结算明细Service业务层处理
|
*
|
* @author ruoyi
|
* @date 2025-12-17
|
*/
|
@Service
|
@Transactional(rollbackFor = Exception.class)
|
public class PayableBillSettlementDetailServiceImpl extends BaseService<PayableBillSettlementDetailMapper, PayableBillSettlementDetail> implements IPayableBillSettlementDetailService
|
{
|
protected final Logger logger = LoggerFactory.getLogger(getClass());
|
@Resource
|
private PayableBillSettlementDetailMapper payableBillSettlementDetailMapper;
|
|
@Resource
|
private IPayableBillManagementService payableBillManagementService;
|
|
@Resource
|
private IPayableBillManagementLogService payableBillManagementLogService;
|
|
|
/**
|
* 查询应付账单结算明细
|
*
|
* @param id 应付账单结算明细ID
|
* @return 应付账单结算明细
|
*/
|
@DataSource(DataSourceType.SLAVE)
|
@Override
|
public PayableBillSettlementDetail selectPayableBillSettlementDetailById(Integer id)
|
{
|
return payableBillSettlementDetailMapper.selectPayableBillSettlementDetailById(id);
|
}
|
|
/**
|
* 查询应付账单结算明细 记录数
|
*
|
* @param payableBillSettlementDetail 应付账单结算明细
|
* @return 应付账单结算明细集合
|
*/
|
@DataSource(DataSourceType.SLAVE)
|
@Override
|
public int selectPayableBillSettlementDetailCount(PayableBillSettlementDetail payableBillSettlementDetail)
|
{
|
return payableBillSettlementDetailMapper.selectPayableBillSettlementDetailCount(payableBillSettlementDetail);
|
}
|
|
/**
|
* 查询应付账单结算明细列表
|
*
|
* @param payableBillSettlementDetail 应付账单结算明细
|
* @return 应付账单结算明细
|
*/
|
@DataSource(DataSourceType.SLAVE)
|
@Override
|
public List<PayableBillSettlementDetail> selectPayableBillSettlementDetailList(PayableBillSettlementDetail payableBillSettlementDetail)
|
{
|
return payableBillSettlementDetailMapper.selectPayableBillSettlementDetailList(payableBillSettlementDetail);
|
}
|
|
/**
|
* 查询应付账单结算明细列表 异步 导出
|
*
|
* @param payableBillSettlementDetail 应付账单结算明细
|
* @param exportKey 导出功能的唯一标识
|
* @return 应付账单结算明细集合
|
*/
|
@DataSource(DataSourceType.SLAVE)
|
@Async
|
@Override
|
public void export(PayableBillSettlementDetail payableBillSettlementDetail,String exportKey) {
|
|
super.export(PayableBillSettlementDetail.class,exportKey,"payableBillSettlementDetailData",(pageNum)->{
|
PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE);
|
return selectPayableBillSettlementDetailList(payableBillSettlementDetail);
|
});
|
}
|
|
|
/**
|
* 新增应付账单结算明细
|
*
|
* @param payableBillSettlementDetail 应付账单结算明细
|
* @return 结果
|
*/
|
@Override
|
public int insertPayableBillSettlementDetail(PayableBillSettlementDetail payableBillSettlementDetail)
|
{
|
// 1. 设置创建时间
|
payableBillSettlementDetail.setCreateTime(DateUtils.getNowDate());
|
|
// 2. 插入结算明细记录
|
int result = payableBillSettlementDetailMapper.insertPayableBillSettlementDetail(payableBillSettlementDetail);
|
|
// 3. 如果插入成功且billId不为空,则更新主表金额和状态
|
if (result > 0 && payableBillSettlementDetail.getBillId() != null) {
|
updatePayableBillAmountAndStatus(payableBillSettlementDetail.getBillId());
|
|
// 记录添加结算明细操作日志
|
PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(payableBillSettlementDetail.getBillId());
|
if (billManagement != null) {
|
PayableBillManagementLog log = new PayableBillManagementLog();
|
log.setBillId(payableBillSettlementDetail.getBillId());
|
log.setCreateBy(SecurityUtils.getUsername());
|
log.setCreateTime(DateUtils.getNowDate());
|
log.setOperation("添加结算明细,账单编号:" + billManagement.getSystemNo());
|
payableBillManagementLogService.insertPayableBillManagementLog(log);
|
}
|
}
|
|
return result;
|
}
|
|
/**
|
* 新增应付账单结算明细[批量]
|
*
|
* @param payableBillSettlementDetails 应付账单结算明细
|
* @return 结果
|
*/
|
@Override
|
public int insertPayableBillSettlementDetailBatch(List<PayableBillSettlementDetail> payableBillSettlementDetails)
|
{
|
// 1. 设置创建时间
|
for (PayableBillSettlementDetail detail : payableBillSettlementDetails) {
|
detail.setCreateTime(DateUtils.getNowDate());
|
}
|
|
// 2. 批量插入结算明细记录
|
int rows = payableBillSettlementDetailMapper.insertPayableBillSettlementDetailBatch(payableBillSettlementDetails);
|
|
// 3. 如果插入成功,则更新相关主表金额和状态
|
if (rows > 0) {
|
// 获取所有不重复的billId
|
Set<Integer> billIds = payableBillSettlementDetails.stream()
|
.map(PayableBillSettlementDetail::getBillId)
|
.filter(Objects::nonNull)
|
.collect(Collectors.toSet());
|
|
// 更新每个账单主表的金额和状态
|
for (Integer billId : billIds) {
|
updatePayableBillAmountAndStatus(billId);
|
}
|
|
// 记录添加结算明细操作日志
|
if (!billIds.isEmpty()) {
|
for (Integer billId : billIds) {
|
PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(billId);
|
if (billManagement != null) {
|
PayableBillManagementLog log = new PayableBillManagementLog();
|
log.setBillId(billId);
|
log.setCreateBy(SecurityUtils.getUsername());
|
log.setCreateTime(DateUtils.getNowDate());
|
|
// 计算本次添加的明细数量
|
long detailCount = payableBillSettlementDetails.stream()
|
.filter(detail -> billId.equals(detail.getBillId()))
|
.count();
|
|
log.setOperation("添加" + detailCount + "条结算明细,账单编号:" + billManagement.getSystemNo());
|
payableBillManagementLogService.insertPayableBillManagementLog(log);
|
}
|
}
|
}
|
}
|
|
return rows;
|
}
|
|
/**
|
* 修改应付账单结算明细
|
*
|
* @param payableBillSettlementDetail 应付账单结算明细
|
* @return 结果
|
*/
|
@Override
|
public int updatePayableBillSettlementDetail(PayableBillSettlementDetail payableBillSettlementDetail)
|
{
|
// 1. 获取修改前的记录,用于后续更新主表
|
PayableBillSettlementDetail oldDetail = null;
|
if (payableBillSettlementDetail.getId() != null) {
|
oldDetail = payableBillSettlementDetailMapper.selectPayableBillSettlementDetailById(payableBillSettlementDetail.getId());
|
}
|
|
// 2. 设置更新时间
|
payableBillSettlementDetail.setUpdateTime(DateUtils.getNowDate());
|
|
// 3. 更新结算明细记录
|
int result = payableBillSettlementDetailMapper.updatePayableBillSettlementDetail(payableBillSettlementDetail);
|
|
// 4. 如果更新成功,则更新相关主表金额和状态
|
if (result > 0) {
|
// 获取需要更新的billId(优先使用新记录的billId,如果没有则使用旧记录的billId)
|
Integer billId = payableBillSettlementDetail.getBillId();
|
if (billId == null && oldDetail != null) {
|
billId = oldDetail.getBillId();
|
}
|
|
if (billId != null) {
|
updatePayableBillAmountAndStatus(billId);
|
}
|
}
|
|
return result;
|
}
|
|
/**
|
* 修改应付账单结算明细[批量]
|
*
|
* @param payableBillSettlementDetails 应付账单结算明细
|
* @return 结果
|
*/
|
@Override
|
public int updatePayableBillSettlementDetailBatch(List<PayableBillSettlementDetail> payableBillSettlementDetails)
|
{
|
// 1. 设置更新时间
|
for (PayableBillSettlementDetail detail : payableBillSettlementDetails) {
|
detail.setUpdateTime(DateUtils.getNowDate());
|
}
|
|
// 2. 批量更新结算明细记录
|
int rows = payableBillSettlementDetailMapper.updatePayableBillSettlementDetailBatch(payableBillSettlementDetails);
|
|
// 3. 如果更新成功,则更新相关主表金额和状态
|
if (rows > 0) {
|
// 获取所有不重复的billId
|
Set<Integer> billIds = payableBillSettlementDetails.stream()
|
.map(PayableBillSettlementDetail::getBillId)
|
.filter(Objects::nonNull)
|
.collect(Collectors.toSet());
|
|
// 更新每个账单主表的金额和状态
|
for (Integer billId : billIds) {
|
updatePayableBillAmountAndStatus(billId);
|
}
|
|
// 记录修改结算明细操作日志
|
if (!billIds.isEmpty()) {
|
for (Integer billId : billIds) {
|
PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(billId);
|
if (billManagement != null) {
|
PayableBillManagementLog log = new PayableBillManagementLog();
|
log.setBillId(billId);
|
log.setCreateBy(SecurityUtils.getUsername());
|
log.setCreateTime(DateUtils.getNowDate());
|
|
// 计算本次修改的明细数量
|
long detailCount = payableBillSettlementDetails.stream()
|
.filter(detail -> billId.equals(detail.getBillId()))
|
.count();
|
|
log.setOperation("修改" + detailCount + "条结算明细,账单编号:" + billManagement.getSystemNo());
|
payableBillManagementLogService.insertPayableBillManagementLog(log);
|
}
|
}
|
}
|
}
|
|
return rows;
|
}
|
|
/**
|
* 删除应付账单结算明细对象
|
*
|
* @param ids 需要删除的数据ID
|
* @return 结果
|
*/
|
@Override
|
public int deletePayableBillSettlementDetailByIds(String ids)
|
{
|
return deletePayableBillSettlementDetailByIds(Convert.toIntArray(ids));
|
}
|
|
/**
|
* 删除应付账单结算明细对象
|
*
|
*
|
* @param ids 需要删除的数据ID
|
* @return 结果
|
*/
|
@Override
|
public int deletePayableBillSettlementDetailByIds(Integer[] ids)
|
{
|
return payableBillSettlementDetailMapper.deletePayableBillSettlementDetailByIds(ids);
|
}
|
|
/**
|
* 删除应付账单结算明细信息
|
*
|
* @param id 应付账单结算明细ID
|
* @return 结果
|
*/
|
@Override
|
public int deletePayableBillSettlementDetailById(Integer id)
|
{
|
return payableBillSettlementDetailMapper.deletePayableBillSettlementDetailById(id);
|
}
|
|
/**
|
* 更新应付账单主表的金额和状态
|
*
|
* @param billId 应付账单ID
|
*/
|
private void updatePayableBillAmountAndStatus(Integer billId) {
|
// 1. 查询应付账单主表记录
|
PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(billId);
|
if (billManagement == null) {
|
throw new ServiceException("应付账单主表记录不存在,ID:" + billId);
|
}
|
|
// 2. 查询该账单的所有结算明细记录
|
PayableBillSettlementDetail queryDetail = new PayableBillSettlementDetail();
|
queryDetail.setBillId(billId);
|
List<PayableBillSettlementDetail> settlementDetails = payableBillSettlementDetailMapper.selectPayableBillSettlementDetailList(queryDetail);
|
|
// 3. 计算总付款金额
|
BigDecimal totalPaymentAmount = settlementDetails.stream()
|
.map(PayableBillSettlementDetail::getPaymentAmount)
|
.filter(amount -> amount != null)
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
// 4. 验证金额不能为负数
|
if (totalPaymentAmount.compareTo(BigDecimal.ZERO) < 0) {
|
throw new ServiceException("付款金额不能为负数");
|
}
|
|
// 5. 计算待付金额(应结算金额 - 已付金额 - 减免金额)
|
BigDecimal totalAmount = billManagement.getTotalAmount() != null ? billManagement.getTotalAmount() : BigDecimal.ZERO;
|
BigDecimal discountAmount = billManagement.getDiscountAmount() != null ? billManagement.getDiscountAmount() : BigDecimal.ZERO;
|
BigDecimal pendingAmount = totalAmount.subtract(totalPaymentAmount).subtract(discountAmount);
|
|
// 6. 验证待付金额不能为负数
|
if (pendingAmount.compareTo(BigDecimal.ZERO) < 0) {
|
throw new ServiceException("待付金额不能为负数,当前计算值:" + pendingAmount);
|
}
|
|
// 7. 更新主表金额
|
billManagement.setPaidAmount(totalPaymentAmount);
|
billManagement.setPendingAmount(pendingAmount);
|
|
// 8. 根据待付金额更新状态
|
if (pendingAmount.compareTo(BigDecimal.ZERO) == 0) {
|
// 待付金额为0,状态改为3(已结算)
|
billManagement.setStatus("3");
|
} else {
|
// 待付金额大于0,状态改为1(结算中)
|
billManagement.setStatus("1");
|
}
|
|
// 9. 更新主表记录
|
billManagement.setUpdateTime(DateUtils.getNowDate());
|
payableBillManagementService.updatePayableBillManagement(billManagement);
|
}
|
}
|