package com.ruoyi.cwgl.service.impl; import java.util.List; import com.ruoyi.common.utils.DateUtils; import javax.annotation.Resource; import com.ruoyi.cwgl.domain.*; import com.ruoyi.cwgl.domain.vo.ReceivableBillAgingAnalysisVo; import com.ruoyi.cwgl.domain.vo.ReceivableBillAccountAnalysisVo; import com.ruoyi.cwgl.mapper.*; import com.ruoyi.cwgl.service.IAgingLogService; 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.cwgl.service.IReceivableBillManagementService; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; /** * 应收账单管理Service业务层处理 * * @author ruoyi * @date 2025-12-17 */ @Service @Transactional(rollbackFor = Exception.class) public class ReceivableBillManagementServiceImpl extends BaseService implements IReceivableBillManagementService { protected final Logger logger = LoggerFactory.getLogger(getClass()); @Resource private ReceivableBillManagementMapper receivableBillManagementMapper; @Resource private ReceivableFeeManagementMapper receivableFeeManagementMapper; @Resource private ReceivableBillManagementLogMapper receivableBillManagementLogMapper; @Resource private AgingLogMapper agingLogMapper; @Resource private AccountLogMapper accountLogMapper; /** * 查询应收账单管理 * * @param id 应收账单管理ID * @return 应收账单管理 */ @DataSource(DataSourceType.SLAVE) @Override public ReceivableBillManagement selectReceivableBillManagementById(Integer id) { return receivableBillManagementMapper.selectReceivableBillManagementById(id); } /** * 查询应收账单管理 记录数 * * @param receivableBillManagement 应收账单管理 * @return 应收账单管理集合 */ @DataSource(DataSourceType.SLAVE) @Override public int selectReceivableBillManagementCount(ReceivableBillManagement receivableBillManagement) { return receivableBillManagementMapper.selectReceivableBillManagementCount(receivableBillManagement); } /** * 查询应收账单管理列表 * * @param receivableBillManagement 应收账单管理 * @return 应收账单管理 */ @DataSource(DataSourceType.SLAVE) @Override public List selectReceivableBillManagementList(ReceivableBillManagement receivableBillManagement) { return receivableBillManagementMapper.selectReceivableBillManagementList(receivableBillManagement); } /** * 查询应收账单管理列表 异步 导出 * * @param receivableBillManagement 应收账单管理 * @param exportKey 导出功能的唯一标识 * @return 应收账单管理集合 */ @DataSource(DataSourceType.SLAVE) @Async @Override public void export(ReceivableBillManagement receivableBillManagement,String exportKey) { super.export(ReceivableBillManagement.class,exportKey,"receivableBillManagementData",(pageNum)->{ PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE); return selectReceivableBillManagementList(receivableBillManagement); }); } /** * 查询应收账单管理列表 异步 导出 * * @param receivableBillManagement 应收账单管理 * @param exportKey 导出功能的唯一标识 * @return 应收账单管理集合 */ @DataSource(DataSourceType.SLAVE) @Async @Override public void customerSummaryExport(ReceivableBillManagement receivableBillManagement,String exportKey) { super.export2(ReceivableBillCustomerSummary.class,exportKey,"应收账款分析管理",(pageNum)->{ PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE); return selectReceivableBillCustomerSummaryList(receivableBillManagement); }); } @DataSource(DataSourceType.SLAVE) @Async @Override public void agingAnalysisExport(ReceivableBillManagement receivableBillManagement,String exportKey) { super.export2(ReceivableBillAgingAnalysisVo.class,exportKey,"应收账款分析管理",(pageNum)->{ PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE); return selectReceivableBillAgingAnalysisList(receivableBillManagement); }); } @Async @Override public void accountAnalysisExport(ReceivableBillManagement receivableBillManagement,String exportKey) { super.export2(ReceivableBillAccountAnalysisVo.class,exportKey,"应收账款分析管理",(pageNum)->{ PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE); return selectReceivableBillAccountAnalysisList(receivableBillManagement); }); } /** * 新增应收账单管理 * * @param receivableBillManagement 应收账单管理 * @return 结果 */ @Override public int insertReceivableBillManagement(ReceivableBillManagement receivableBillManagement) { receivableBillManagement.setCreateTime(DateUtils.getNowDate()); return receivableBillManagementMapper.insertReceivableBillManagement(receivableBillManagement); } /** * 新增应收账单管理[批量] * * @param receivableBillManagements 应收账单管理 * @return 结果 */ @Override public int insertReceivableBillManagementBatch(List receivableBillManagements) { int rows = receivableBillManagementMapper.insertReceivableBillManagementBatch(receivableBillManagements); return rows; } /** * 修改应收账单管理 * * @param receivableBillManagement 应收账单管理 * @return 结果 */ @Override public int updateReceivableBillManagement(ReceivableBillManagement receivableBillManagement) { receivableBillManagement.setUpdateTime(DateUtils.getNowDate()); int result = receivableBillManagementMapper.updateReceivableBillManagement(receivableBillManagement); // 记录操作日志 if (result > 0) { ReceivableBillManagementLog log = new ReceivableBillManagementLog(); log.setBillId(receivableBillManagement.getId()); log.setCreateBy(SecurityUtils.getUsername()); log.setCreateTime(DateUtils.getNowDate()); log.setOperation("修改应收账单,账单编号:" + receivableBillManagement.getSystemNo()); receivableBillManagementLogMapper.insertReceivableBillManagementLog(log); } return result; } @Override public int aging(ReceivableBillManagement receivableBillManagement) { receivableBillManagement.setUpdateTime(DateUtils.getNowDate()); int result = receivableBillManagementMapper.updateReceivableBillManagement(receivableBillManagement); // 记录操作日志 if (result > 0) { AgingLog log = new AgingLog(); log.setHeadId(receivableBillManagement.getId()); log.setCreateBy(SecurityUtils.getUsername()); log.setCreateTime(DateUtils.getNowDate()); log.setOperation("编辑账龄分析信息"); agingLogMapper.insertAgingLog(log); } return result; } @Override public int account(ReceivableBillManagement receivableBillManagement) { receivableBillManagement.setUpdateTime(DateUtils.getNowDate()); int result = receivableBillManagementMapper.updateReceivableBillManagement(receivableBillManagement); // 记录操作日志 if (result > 0) { AccountLog log = new AccountLog(); log.setHeadId(receivableBillManagement.getId()); log.setCreateBy(SecurityUtils.getUsername()); log.setCreateTime(DateUtils.getNowDate()); log.setOperation("编辑账款分析信息"); accountLogMapper.insertAccountLog(log); } return result; } /** * 修改应收账单管理[批量] * * @param receivableBillManagements 应收账单管理 * @return 结果 */ @Override public int updateReceivableBillManagementBatch(List receivableBillManagements){ return receivableBillManagementMapper.updateReceivableBillManagementBatch(receivableBillManagements); } /** * 删除应收账单管理对象 * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteReceivableBillManagementByIds(String ids) { return deleteReceivableBillManagementByIds(Convert.toIntArray(ids)); } /** * 删除应收账单管理对象 * * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteReceivableBillManagementByIds(Integer[] ids) { return receivableBillManagementMapper.deleteReceivableBillManagementByIds(ids); } /** * 删除应收账单管理信息 * * @param id 应收账单管理ID * @return 结果 */ @Override public int deleteReceivableBillManagementById(Integer id) { return receivableBillManagementMapper.deleteReceivableBillManagementById(id); } /** * 作废应收账单管理记录 * * @param id 应收账单管理ID * @return 结果 */ @Override public int voidReceivableBillManagement(Integer id) { // 1. 查询应收账单记录 ReceivableBillManagement billManagement = receivableBillManagementMapper.selectReceivableBillManagementById(id); if (billManagement == null) { throw new ServiceException("应收账单记录不存在"); } // 2. 判断状态是否为0(未结算),只有状态为0才能作废 if (!"0".equals(billManagement.getStatus())) { throw new ServiceException("只有状态为未结算的账单才能作废"); } // 3. 设置状态为作废 billManagement.setStatus("2"); billManagement.setUpdateTime(DateUtils.getNowDate()); // 4. 更新应收账单记录 int result = receivableBillManagementMapper.updateReceivableBillManagement(billManagement); // 5. 如果更新成功,清除关联应收费用的账单编号并更新状态 if (result > 0) { // 获取账单系统编号 String billSystemNo = billManagement.getSystemNo(); if (billSystemNo != null && !billSystemNo.trim().isEmpty()) { // 查询关联该账单的应收费用记录 // ReceivableFeeManagement queryFee = new ReceivableFeeManagement(); // queryFee.setRelatedBillNo(billSystemNo); // List feeList = receivableFeeManagementMapper.selectReceivableFeeManagementList(queryFee); // 清除关联账单编号并将状态改为0(待生成账单) receivableFeeManagementMapper.updateReceivableFeeManagementByRelatedBillNo(billSystemNo); } // 记录作废操作日志 ReceivableBillManagementLog log = new ReceivableBillManagementLog(); log.setBillId(id); try { log.setCreateBy(SecurityUtils.getUsername()); } catch (Exception e) { // 远程调用时没有登录信息,使用api作为创建人 log.setCreateBy("api"); } log.setCreateTime(DateUtils.getNowDate()); log.setOperation("作废应收账单,账单编号:" + billManagement.getSystemNo()); receivableBillManagementLogMapper.insertReceivableBillManagementLog(log); } return result; } /** * 根据系统编号查询应收账单管理 * * @param systemNo 系统编号 * @return 应收账单管理 */ @DataSource(DataSourceType.SLAVE) @Override public ReceivableBillManagement selectReceivableBillManagementBySystemNo(String systemNo) { return receivableBillManagementMapper.selectReceivableBillManagementBySystemNo(systemNo); } /** * 查询应收账单客户汇总列表 * * @param receivableBillManagement 查询条件 * @return 应收账单客户汇总列表 */ @DataSource(DataSourceType.SLAVE) @Override public List selectReceivableBillCustomerSummaryList(ReceivableBillManagement receivableBillManagement) { return receivableBillManagementMapper.selectReceivableBillCustomerSummaryList(receivableBillManagement); } /** * 查询应收账单账龄分析列表 * * @param receivableBillManagement 查询条件 * @return 应收账单账龄分析列表 */ @DataSource(DataSourceType.SLAVE) @Override public List selectReceivableBillAgingAnalysisList(ReceivableBillManagement receivableBillManagement) { // 直接查询数据库中的预计算账龄数据 List result = receivableBillManagementMapper.selectReceivableBillAgingAnalysisList(receivableBillManagement); return result; } /** * 批量更新应收账单账龄分析数据 * 直接在数据库层面计算账龄分段,避免查询大量数据到应用层 * * @return 更新的记录数 */ @Override public int batchUpdateAgingAnalysisData() { return receivableBillManagementMapper.batchUpdateAgingAnalysisData(); } /** * 查询应收账单账款分析列表 * * @param receivableBillManagement 查询条件 * @return 应收账单账款分析列表 */ @DataSource(DataSourceType.SLAVE) @Override public List selectReceivableBillAccountAnalysisList(ReceivableBillManagement receivableBillManagement) { // 直接查询数据库中的账款分析数据 List result = receivableBillManagementMapper.selectReceivableBillAccountAnalysisList(receivableBillManagement); return result; } }