package com.ruoyi.tms.service.impl; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.SystemDataNoEnum; import com.ruoyi.common.utils.DateUtils; import javax.annotation.Resource; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISystemDataNoService; import com.ruoyi.tms.domain.*; import com.ruoyi.tms.mapper.*; import org.springframework.beans.factory.annotation.Autowired; 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.tms.service.ITmsPayableFeeService; import com.ruoyi.common.core.text.Convert; /** * 应付费用Service业务层处理 * * @author ruoyi * @date 2026-01-12 */ @Service @Transactional(rollbackFor = Exception.class) public class TmsPayableFeeServiceImpl extends BaseService implements ITmsPayableFeeService { protected final Logger logger = LoggerFactory.getLogger(getClass()); @Resource private TmsPayableFeeMapper tmsPayableFeeMapper; @Resource private TmsDispatchOrderMapper tmsDispatchOrderMapper; @Resource private TmsPayableFeeItemMapper tmsPayableFeeItemMapper; @Resource private TmsApBillMapper tmsApBillMapper; @Resource private TmsApBillItemMapper tmsApBillItemMapper; @Resource ISysConfigService sysConfigService; @Autowired ISystemDataNoService systemDataNoService; /** * 查询应付费用 * * @param id 应付费用ID * @return 应付费用 */ @DataSource(DataSourceType.SLAVE) @Override public TmsPayableFee selectTmsPayableFeeById(Integer id) { TmsPayableFee tmsPayableFee = tmsPayableFeeMapper.selectTmsPayableFeeById(id); List tmsPayableFeeItems = tmsPayableFeeItemMapper.selectTmsPayableFeeItemList( new TmsPayableFeeItem() {{ setHeadId(id); }} ); tmsPayableFee.setPayableFeeItems(tmsPayableFeeItems); return tmsPayableFee; } @DataSource(DataSourceType.SLAVE) @Override public List selectTmsPayableFeeByDispatchNo(String dispatchNo) { List tmsPayableFeeList = tmsPayableFeeMapper.selectList(new LambdaQueryWrapper() .eq(TmsPayableFee::getDispatchNo, dispatchNo) .ne(TmsPayableFee::getStatus, 2) ); if (tmsPayableFeeList != null && !tmsPayableFeeList.isEmpty()){ tmsPayableFeeList.forEach(tmsPayableFee -> { List tmsPayableFeeItems = tmsPayableFeeItemMapper.selectTmsPayableFeeItemList( new TmsPayableFeeItem() {{ setHeadId(tmsPayableFee.getId()); }} ); tmsPayableFee.setPayableFeeItems(tmsPayableFeeItems); }); } return tmsPayableFeeList; } /** * 查询应付费用 记录数 * * @param tmsPayableFee 应付费用 * @return 应付费用集合 */ @DataSource(DataSourceType.SLAVE) @Override public int selectTmsPayableFeeCount(TmsPayableFee tmsPayableFee) { return tmsPayableFeeMapper.selectTmsPayableFeeCount(tmsPayableFee); } /** * 查询应付费用列表 * * @param tmsPayableFee 应付费用 * @return 应付费用 */ @DataSource(DataSourceType.SLAVE) @Override public List selectTmsPayableFeeList(TmsPayableFee tmsPayableFee) { return tmsPayableFeeMapper.selectTmsPayableFeeList(tmsPayableFee); } /** * 查询应付费用列表 异步 导出 * * @param tmsPayableFee 应付费用 * @param exportKey 导出功能的唯一标识 * @return 应付费用集合 */ @DataSource(DataSourceType.SLAVE) @Async @Override public void export(TmsPayableFee tmsPayableFee,String exportKey) { super.export(TmsPayableFee.class,exportKey,"tmsPayableFeeData",(pageNum)->{ PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE); return selectTmsPayableFeeList(tmsPayableFee); }); } /** * 新增应付费用 * * @param tmsPayableFee 应付费用 * @return 结果 */ @Override public int insertTmsPayableFee(TmsPayableFee tmsPayableFee) { tmsPayableFee.setCreateTime(DateUtils.getNowDate()); return tmsPayableFeeMapper.insertTmsPayableFee(tmsPayableFee); } /** * 新增应付费用[批量] * * @param tmsPayableFees 应付费用 * @return 结果 */ @Override public int insertTmsPayableFeeBatch(List tmsPayableFees) { int rows = tmsPayableFeeMapper.insertTmsPayableFeeBatch(tmsPayableFees); return rows; } /** * 修改应付费用 * * @param tmsPayableFee 应付费用 * @return 结果 */ @Override public int updateTmsPayableFee(TmsPayableFee tmsPayableFee) { tmsPayableFee.setUpdateTime(DateUtils.getNowDate()); return tmsPayableFeeMapper.updateTmsPayableFee(tmsPayableFee); } /** * 修改应付费用[批量] * * @param tmsPayableFees 应付费用 * @return 结果 */ @Override public int updateTmsPayableFeeBatch(List tmsPayableFees){ return tmsPayableFeeMapper.updateTmsPayableFeeBatch(tmsPayableFees); } @Override public int closeTmsPayableFeeById(Integer id) { TmsPayableFee tmsPayableFee = selectTmsPayableFeeById(id); if(tmsPayableFee != null){ tmsPayableFee.setStatus(2); updateTmsPayableFee(tmsPayableFee); tmsDispatchOrderMapper.update(new LambdaUpdateWrapper() .eq(TmsDispatchOrder::getId,tmsPayableFee.getDispatchId()) .set(TmsDispatchOrder::getAccountsPayableStatus,0) ); }else{ throw new RuntimeException("数据不存在"); } return 1; } /** * 删除应付费用对象 * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteTmsPayableFeeByIds(String ids) { return deleteTmsPayableFeeByIds(Convert.toIntArray(ids)); } /** * 删除应付费用对象 * * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteTmsPayableFeeByIds(Integer[] ids) { return tmsPayableFeeMapper.deleteTmsPayableFeeByIds(ids); } @Override public TmsApBill initApGenerate(Integer[] ids) { List tmsPayableFeeList = tmsPayableFeeMapper.selectBatchIds(Arrays.asList(ids)); boolean hasDifferentCustomers = tmsPayableFeeList.stream() .map(item-> item.getServiceProviderType()+"_"+ item.getServiceProviderId()) .distinct() .count() > 1; if (hasDifferentCustomers) { throw new RuntimeException("所选费用包含不同供应商,无法合并生成应收账单"); } TmsApBill tmsApBill = new TmsApBill(); tmsApBill.setDispatchCount(tmsPayableFeeList.size()); String s = sysConfigService.selectConfigByKey("sys.hk.rmb.rate"); BigDecimal exchangeRate = new BigDecimal(s); tmsApBill.setSettleRate(exchangeRate); TmsPayableFee tmsPayableFee = tmsPayableFeeList.get(0); tmsApBill.setServiceProviderId(tmsPayableFee.getServiceProviderId()); tmsApBill.setServiceProviderName(tmsPayableFee.getServiceProviderName()); tmsApBill.setServiceProviderType(tmsPayableFee.getServiceProviderType()); tmsApBill.setBillName(DateUtils.dateTime()+tmsApBill.getServiceProviderName()+"账单"); tmsApBill.setSettleAmount(BigDecimal.ZERO); tmsPayableFeeList.forEach(item ->{ BigDecimal rmbAmount = item.getPayableHkbAmount() .multiply(exchangeRate) .setScale(2, RoundingMode.HALF_UP); item.setPayableRmbSumAmount( item.getPayableRmbAmount().add(rmbAmount)); tmsApBill.setSettleAmount(tmsApBill.getSettleAmount().add(item.getPayableRmbSumAmount())); }); tmsApBill.setTmsPayableFeeList(tmsPayableFeeList); tmsApBill.setActualSettlementAmount(tmsApBill.getSettleAmount()); return tmsApBill; } @Override public AjaxResult apGenerate(Integer[] ids) { TmsApBill tmsApBill = initApGenerate(ids); tmsApBill.setSystemNo(systemDataNoService.getNoByKey(SystemDataNoEnum.YFZD)); tmsApBill.setSettledAmount(BigDecimal.ZERO); tmsApBill.setInvoiceStatus(0); tmsApBill.setStatus(0); tmsApBill.setCreateBy(SecurityUtils.getUsername()); tmsApBillMapper.insertTmsApBill(tmsApBill); tmsPayableFeeMapper.update(new LambdaUpdateWrapper() .set(TmsPayableFee::getBillPayableId,tmsApBill.getId()) .set(TmsPayableFee::getBillPayableNo,tmsApBill.getSystemNo()) .set(TmsPayableFee::getStatus,1) .in(TmsPayableFee::getId, ids) ); List tmsPayableFeeList = tmsApBill.getTmsPayableFeeList(); List rmb = tmsPayableFeeList.stream().map(item -> { TmsApBillItem billItem = new TmsApBillItem(); billItem.setBillId(tmsApBill.getId()); billItem.setProjectName(item.getProjectName()); billItem.setDispatchNo(item.getDispatchNo()); billItem.setOrderTime(item.getCreateTime()); billItem.setEstimateAmount(item. getPayableRmbSumAmount()); billItem.setCurrency("RMB"); billItem.setApFeeId(item.getId()); billItem.setStatus(0); return billItem; }).collect(Collectors.toList()); if (!rmb.isEmpty()){ tmsApBillItemMapper.insertTmsApBillItemBatch(rmb); } return AjaxResult.success(); } /** * 删除应付费用信息 * * @param id 应付费用ID * @return 结果 */ @Override public int deleteTmsPayableFeeById(Integer id) { return tmsPayableFeeMapper.deleteTmsPayableFeeById(id); } }