package com.ruoyi.cwgl.service.impl; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import cn.hutool.core.collection.CollectionUtil; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.*; import javax.annotation.Resource; import com.ruoyi.cwgl.domain.EstimatedReceivableBill; import com.ruoyi.cwgl.domain.ReceivableLineTruckPriceRule; import com.ruoyi.cwgl.domain.vo.CreateBillVo; import com.ruoyi.cwgl.mapper.EstimatedReceivableBillMapper; import com.ruoyi.cwgl.mapper.EstimatedReceivableMapper; import com.ruoyi.cwgl.service.IEstimatedReceivableBillService; 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.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.mapper.PendingSettlementBusinessMapper; import com.ruoyi.cwgl.domain.PendingSettlementBusiness; import com.ruoyi.cwgl.service.IPendingSettlementBusinessService; import com.ruoyi.common.core.text.Convert; /** * 待入账业务Service业务层处理 * * @author ruoyi * @date 2025-08-07 */ @Service @Transactional(rollbackFor = Exception.class) public class PendingSettlementBusinessServiceImpl extends BaseService implements IPendingSettlementBusinessService { protected final Logger logger = LoggerFactory.getLogger(getClass()); @Resource private PendingSettlementBusinessMapper pendingSettlementBusinessMapper; @Resource private EstimatedReceivableBillMapper estimatedReceivableBillMapper; @Resource private EstimatedReceivableMapper estimatedReceivableMapper; /** * 查询待入账业务 * * @param id 待入账业务ID * @return 待入账业务 */ @DataSource(DataSourceType.SLAVE) @Override public PendingSettlementBusiness selectPendingSettlementBusinessById(Integer id) { return pendingSettlementBusinessMapper.selectPendingSettlementBusinessById(id); } /** * 查询待入账业务 记录数 * * @param pendingSettlementBusiness 待入账业务 * @return 待入账业务集合 */ @DataSource(DataSourceType.SLAVE) @Override public int selectPendingSettlementBusinessCount(PendingSettlementBusiness pendingSettlementBusiness) { return pendingSettlementBusinessMapper.selectPendingSettlementBusinessCount(pendingSettlementBusiness); } /** * 查询待入账业务列表 * * @param pendingSettlementBusiness 待入账业务 * @return 待入账业务 */ @DataSource(DataSourceType.SLAVE) @Override public List selectPendingSettlementBusinessList(PendingSettlementBusiness pendingSettlementBusiness) { return pendingSettlementBusinessMapper.selectPendingSettlementBusinessList(pendingSettlementBusiness); } /** * 查询待入账业务列表 异步 导出 * * @param pendingSettlementBusiness 待入账业务 * @param exportKey 导出功能的唯一标识 * @return 待入账业务集合 */ @DataSource(DataSourceType.SLAVE) @Async @Override public void export(PendingSettlementBusiness pendingSettlementBusiness,String exportKey) { super.export(PendingSettlementBusiness.class,exportKey,"pendingSettlementBusinessData",(pageNum)->{ PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE); return selectPendingSettlementBusinessList(pendingSettlementBusiness); }); } /** * 新增待入账业务 * * @param pendingSettlementBusiness 待入账业务 * @return 结果 */ @Override public int insertPendingSettlementBusiness(PendingSettlementBusiness pendingSettlementBusiness) { pendingSettlementBusiness.setCreateTime(DateUtils.getNowDate()); return pendingSettlementBusinessMapper.insertPendingSettlementBusiness(pendingSettlementBusiness); } /** * 新增待入账业务[批量] * * @param pendingSettlementBusinesss 待入账业务 * @return 结果 */ @Override public int insertPendingSettlementBusinessBatch(List pendingSettlementBusinesss) { int rows = pendingSettlementBusinessMapper.insertPendingSettlementBusinessBatch(pendingSettlementBusinesss); return rows; } /** * 修改待入账业务 * * @param pendingSettlementBusiness 待入账业务 * @return 结果 */ @Override public int updatePendingSettlementBusiness(PendingSettlementBusiness pendingSettlementBusiness) { pendingSettlementBusiness.setUpdateTime(DateUtils.getNowDate()); return pendingSettlementBusinessMapper.updatePendingSettlementBusiness(pendingSettlementBusiness); } /** * 修改待入账业务[批量] * * @param pendingSettlementBusinesss 待入账业务 * @return 结果 */ @Override public int updatePendingSettlementBusinessBatch(List pendingSettlementBusinesss){ return pendingSettlementBusinessMapper.updatePendingSettlementBusinessBatch(pendingSettlementBusinesss); } /** * 删除待入账业务对象 * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deletePendingSettlementBusinessByIds(String ids) { return deletePendingSettlementBusinessByIds(Convert.toIntArray(ids)); } /** * 删除待入账业务对象 * * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deletePendingSettlementBusinessByIds(Integer[] ids) { return pendingSettlementBusinessMapper.deletePendingSettlementBusinessByIds(ids); } /** * 删除待入账业务信息 * * @param id 待入账业务ID * @return 结果 */ @Override public int deletePendingSettlementBusinessById(Integer id) { return pendingSettlementBusinessMapper.deletePendingSettlementBusinessById(id); } @Override public void insertPendingSettlement(List pendingSettlementBusinesses ) { if (CollectionUtil.isNotEmpty(pendingSettlementBusinesses)) { pendingSettlementBusinessMapper.insertPendingSettlementBusinessBatch(pendingSettlementBusinesses); } } @DataSource(DataSourceType.CWSJ) @Override public List selectPendingSettlement2Cw() { List pendingSettlementBusinesses = pendingSettlementBusinessMapper.selectPendingSettlement2Cw(); //更新同步状态用 /* Integer[] ids = pendingSettlementBusinesses.stream().map(PendingSettlementBusiness::getServiceId).toArray(Integer[]::new); int i = pendingSettlementBusinessMapper.updeteCwData(ids); if (i>0){ logger.info("同步状态更新成功"); }*/ return pendingSettlementBusinesses; } @DataSource(DataSourceType.CWSJ) @Override public int updateCwData(Integer[] ids) { return pendingSettlementBusinessMapper.updeteCwData(ids); } @DataSource(DataSourceType.CWSJ) @Override public List selectReceivableLineTruckPriceRule() { return pendingSettlementBusinessMapper.selectReceivableLineTruckPriceRule(); } @DataSource(DataSourceType.CWSJ) @Override public List selectPayableLineTruckPriceRule() { return pendingSettlementBusinessMapper.selectPayableLineTruckPriceRule(); } @Override public CreateBillVo billIds(Integer[] ids) { List pendingSettlementBusinesses = pendingSettlementBusinessMapper.selectBatchIds(Arrays.asList(ids)); if (CollectionUtil.isEmpty(pendingSettlementBusinesses)){ throw new ServiceException("账单不存在"); } CreateBillVo createBillVo = new CreateBillVo(); String customerName = pendingSettlementBusinesses.get(0).getCustomerName(); createBillVo.setCustomerName(customerName); createBillVo.setCount(pendingSettlementBusinesses.size()); long priceTotal = 0L; for (PendingSettlementBusiness pendingSettlementBusiness : pendingSettlementBusinesses) { if (pendingSettlementBusiness.getIsCreate().equals(1)){ throw new ServiceException(pendingSettlementBusiness.getDispatchNo()+"已入账"); } if (!pendingSettlementBusiness.getCustomerName().equals(customerName)){ throw new ServiceException("只能选择相同客户名称的数据"); } priceTotal += pendingSettlementBusiness.getEstimatedTotalIncome()==null?0L:pendingSettlementBusiness.getEstimatedTotalIncome(); } createBillVo.setPrice(priceTotal); return createBillVo; } @Override public CreateBillVo billList(PendingSettlementBusiness pendingSettlementBusiness) { String customerName = pendingSettlementBusiness.getCustomerName(); if (StringUtils.isEmpty(customerName)){ throw new ServiceException("客户名称不能为空"); } pendingSettlementBusiness.setIsCreate(0); List pendingSettlementBusinesses = pendingSettlementBusinessMapper.selectPendingSettlementBusinessList(pendingSettlementBusiness); long priceTotal = pendingSettlementBusinesses.stream() .mapToLong(b -> Optional.ofNullable(b.getEstimatedTotalIncome()).orElse(0L)) .sum(); CreateBillVo createBillVo = new CreateBillVo(); createBillVo.setCustomerName(customerName); createBillVo.setCount(pendingSettlementBusinesses.size()); createBillVo.setPrice(priceTotal); return createBillVo; } @Override public int createBillIds(Integer[] ids, CreateBillVo createBillVo) { String username = SecurityUtils.getUsername(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd"); Date date = new Date(); String datePart = dateFormat.format(date); List pendingSettlementBusinesses = pendingSettlementBusinessMapper.selectBatchIds(Arrays.asList(ids)); if (CollectionUtil.isEmpty(pendingSettlementBusinesses)){ throw new ServiceException("账单不存在"); } for (PendingSettlementBusiness pendingSettlementBusiness : pendingSettlementBusinesses) { if (pendingSettlementBusiness.getIsCreate().equals(1)){ throw new ServiceException(pendingSettlementBusiness.getDispatchNo()+"已入账"); } String customerName = pendingSettlementBusinesses.get(0).getCustomerName(); if (!pendingSettlementBusiness.getCustomerName().equals(customerName)){ throw new ServiceException("只能选择相同客户名称的数据"); } } //调度单集合 List collect = pendingSettlementBusinesses.stream().map(PendingSettlementBusiness::getDispatchNo).collect(Collectors.toList()); EstimatedReceivableBill estimatedReceivableBill = new EstimatedReceivableBill(); estimatedReceivableBill.setCreateTime(date); estimatedReceivableBill.setBillSystemNo("ZD"+datePart+RandomUtils.random(4)); estimatedReceivableBill.setBillName(createBillVo.getBillName()); estimatedReceivableBill.setCustomerName(createBillVo.getCustomerName()); estimatedReceivableBill.setDispatchCount(createBillVo.getCount()); estimatedReceivableBill.setTotalAmount(createBillVo.getPrice()); estimatedReceivableBill.setSettledAmount(0L); estimatedReceivableBill.setInvoiceStatus(0); estimatedReceivableBill.setStatus(0); estimatedReceivableBill.setCreateBy(username); estimatedReceivableBillMapper.insertEstimatedReceivableBill(estimatedReceivableBill); //修改入账 estimatedReceivableMapper.updateEstimatedReceivableBillStatus(collect,1); //修改调度单为已创建账单 return pendingSettlementBusinessMapper.updatePendingSettlementBusinessIsCreate(collect,estimatedReceivableBill.getId(),createBillVo.getBillName()); } @Override public int createBillList(PendingSettlementBusiness pendingSettlementBusiness) { String customerName = pendingSettlementBusiness.getCustomerName(); if (StringUtils.isEmpty(customerName)){ throw new ServiceException("客户名称不能为空"); } String billName = pendingSettlementBusiness.getBillName(); if (StringUtils.isEmpty(billName)){ throw new ServiceException("账单名称不能为空"); } pendingSettlementBusiness.setIsCreate(0); List pendingSettlementBusinesses = pendingSettlementBusinessMapper.selectPendingSettlementBusinessList(pendingSettlementBusiness); if (CollectionUtil.isEmpty(pendingSettlementBusinesses)){ throw new ServiceException("填写的客户没有能入账数据"); } String username = SecurityUtils.getUsername(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd"); Date date = new Date(); String datePart = dateFormat.format(date); long priceTotal = pendingSettlementBusinesses.stream() .mapToLong(b -> Optional.ofNullable(b.getEstimatedTotalIncome()).orElse(0L)) .sum(); //调度单集合 List collect = pendingSettlementBusinesses.stream().map(PendingSettlementBusiness::getDispatchNo).collect(Collectors.toList()); EstimatedReceivableBill estimatedReceivableBill = new EstimatedReceivableBill(); estimatedReceivableBill.setCreateTime(date); estimatedReceivableBill.setBillSystemNo("ZD"+datePart+RandomUtils.random(4)); estimatedReceivableBill.setBillName(billName); estimatedReceivableBill.setCustomerName(customerName); estimatedReceivableBill.setDispatchCount(pendingSettlementBusinesses.size()); estimatedReceivableBill.setTotalAmount(priceTotal); estimatedReceivableBill.setSettledAmount(0L); estimatedReceivableBill.setInvoiceStatus(0); estimatedReceivableBill.setStatus(0); estimatedReceivableBill.setCreateBy(username); estimatedReceivableBillMapper.insertEstimatedReceivableBill(estimatedReceivableBill); //修改应收管理表已入账 estimatedReceivableMapper.updateEstimatedReceivableBillStatus(collect,1); //修改调度单为已创建账单 return pendingSettlementBusinessMapper.updatePendingSettlementBusinessIsCreate(collect,estimatedReceivableBill.getId(),billName); } @Override public List selectCustomName() { return pendingSettlementBusinessMapper.selectCustomName(); } }