package com.ruoyi.tms.service.impl; import java.math.BigDecimal; import java.util.Collections; import java.util.List; import cn.hutool.core.bean.BeanUtil; 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.common.utils.StringUtils; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISystemDataNoService; import com.ruoyi.tms.domain.TmsDispatchOrder; import com.ruoyi.tms.domain.TmsFinance; import com.ruoyi.tms.domain.vo.FinanceDetailItem; import com.ruoyi.tms.mapper.TmsDispatchOrderMapper; import com.ruoyi.tms.mapper.TmsFinanceMapper; 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.mapper.TmsFinanceDetailMapper; import com.ruoyi.tms.domain.TmsFinanceDetail; import com.ruoyi.tms.service.ITmsFinanceDetailService; import com.ruoyi.common.core.text.Convert; /** * 费用明细Service业务层处理 * * @author ruoyi * @date 2025-11-13 */ @Service @Transactional(rollbackFor = Exception.class) public class TmsFinanceDetailServiceImpl extends BaseService implements ITmsFinanceDetailService { protected final Logger logger = LoggerFactory.getLogger(getClass()); @Resource private TmsFinanceDetailMapper tmsFinanceDetailMapper; @Resource private TmsFinanceMapper tmsFinanceMapper; @Resource private TmsDispatchOrderMapper tmsDispatchOrderMapper; @Autowired ISystemDataNoService systemDataNoService; @Autowired private ISysUserService userService; /** * 查询费用明细 * * @param id 费用明细ID * @return 费用明细 */ @DataSource(DataSourceType.SLAVE) @Override public TmsFinanceDetail selectTmsFinanceDetailById(Integer id) { return tmsFinanceDetailMapper.selectTmsFinanceDetailById(id); } /** * 查询费用明细 记录数 * * @param tmsFinanceDetail 费用明细 * @return 费用明细集合 */ @DataSource(DataSourceType.SLAVE) @Override public int selectTmsFinanceDetailCount(TmsFinanceDetail tmsFinanceDetail) { return tmsFinanceDetailMapper.selectTmsFinanceDetailCount(tmsFinanceDetail); } /** * 查询费用明细列表 * * @param tmsFinanceDetail 费用明细 * @return 费用明细 */ @DataSource(DataSourceType.SLAVE) @Override public List selectTmsFinanceDetailList(TmsFinanceDetail tmsFinanceDetail) { return tmsFinanceDetailMapper.selectTmsFinanceDetailList(tmsFinanceDetail); } @Override public List getTmsFinanceDetailList(Integer dispatchId) { Integer deviceId = userService.getDeviceId(SecurityUtils.getUserId()); if (deviceId == null){ return null; } LambdaQueryWrapper eq = new LambdaQueryWrapper() .eq(TmsFinanceDetail::getFinanceType, 2) .eq(TmsFinanceDetail::getCreateId, SecurityUtils.getUserId()); if (dispatchId !=null){ eq.eq(TmsFinanceDetail::getDispatchOrderId, dispatchId); } List tmsFinanceDetails = tmsFinanceDetailMapper.selectList(eq); if (tmsFinanceDetails != null && !tmsFinanceDetails.isEmpty()){ tmsFinanceDetails.forEach(tmsFinanceDetail -> { TmsDispatchOrder tmsDispatchOrder = tmsDispatchOrderMapper.selectById(tmsFinanceDetail.getDispatchOrderId()); if (tmsDispatchOrder != null){ tmsFinanceDetail.setDispatchNo(tmsDispatchOrder.getDispatchNo()); tmsFinanceDetail.setCustomerName(tmsDispatchOrder.getCustomerName()); } }); } return tmsFinanceDetails; } /** * 查询费用明细列表 异步 导出 * * @param tmsFinanceDetail 费用明细 * @param exportKey 导出功能的唯一标识 * @return 费用明细集合 */ @DataSource(DataSourceType.SLAVE) @Async @Override public void export(TmsFinanceDetail tmsFinanceDetail,String exportKey) { super.export(TmsFinanceDetail.class,exportKey,"tmsFinanceDetailData",(pageNum)->{ PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE); return selectTmsFinanceDetailList(tmsFinanceDetail); }); } /** * 新增费用明细 * * @param tmsFinanceDetail 费用明细 * @return 结果 */ @Override public int insertTmsFinanceDetail(TmsFinanceDetail tmsFinanceDetail) { TmsFinance tmsFinance = tmsFinanceMapper.selectOne(new LambdaQueryWrapper() .eq(TmsFinance::getType, tmsFinanceDetail.getFinanceType()) .eq(TmsFinance::getDispatchId, tmsFinanceDetail.getDispatchOrderId()) .ne(TmsFinance::getStatus, 2) .last("limit 1") ); if (StringUtils.isNotEmpty(tmsFinanceDetail.getFeeType())){ addItem(tmsFinance, tmsFinanceDetail); } // 1、查询当前调度单对应的费用 List items = tmsFinanceDetail.getItems(); if (items != null && !items.isEmpty()){ items.forEach(item->{ TmsFinanceDetail tmsFinanceDetailNew = BeanUtil.copyProperties(tmsFinanceDetail, TmsFinanceDetail.class); BeanUtil.copyProperties(item, tmsFinanceDetailNew); tmsFinanceDetailNew.setActualFeeAmount(item.getPrice().multiply(BigDecimal.valueOf(item.getCount()))); addItem(tmsFinance, tmsFinanceDetailNew); }); } return 1; } public void addItem (TmsFinance tmsFinance, TmsFinanceDetail tmsFinanceDetail){ if (tmsFinance == null){ TmsDispatchOrder tmsDispatchOrder = tmsDispatchOrderMapper.selectTmsDispatchOrderById(tmsFinanceDetail.getDispatchOrderId()); if (tmsDispatchOrder == null){ throw new RuntimeException("未找到对应的调度单"); } tmsFinance = BeanUtil.copyProperties(tmsDispatchOrder,TmsFinance.class); SystemDataNoEnum systemDataNoEnum = tmsFinanceDetail.getFinanceType() == 0 ? SystemDataNoEnum.YFD : tmsFinanceDetail.getFinanceType() == 1 ? SystemDataNoEnum.YSD : SystemDataNoEnum.OF; tmsFinance.setSystemCode(systemDataNoService.getNoByKey(systemDataNoEnum)); tmsFinance.setDispatchId(tmsFinanceDetail.getDispatchOrderId()); tmsFinance.setType(tmsFinanceDetail.getFinanceType()); tmsFinance.setStatus(0); tmsFinance.setTotalAmount(tmsFinanceDetail.getActualFeeAmount()); tmsFinance.setCreateBy(SecurityUtils.getUsername()); tmsFinance.setUpdateBy(SecurityUtils.getUsername()); tmsFinance.setCreateTime(DateUtils.getNowDate()); tmsFinance.setUpdateTime(DateUtils.getNowDate()); // 添加费用主表 tmsFinanceMapper.insertTmsFinance(tmsFinance); }else{ tmsFinance.setTotalAmount(tmsFinance. getTotalAmount().add(tmsFinanceDetail.getActualFeeAmount())); tmsFinanceMapper.updateTmsFinance(tmsFinance); } tmsFinanceDetail.setFinanceId(tmsFinance.getId()); tmsFinanceDetail.setCreateBy(SecurityUtils.getUsername()); tmsFinanceDetail.setInitialFeeAmount(tmsFinanceDetail.getActualFeeAmount()); tmsFinanceDetail.setCreateId(SecurityUtils.getUserId()); tmsFinanceDetail.setFeeCreateTime(DateUtils.getNowDate()); tmsFinanceDetail.setCreateTime(DateUtils.getNowDate()); tmsFinanceDetailMapper.insertTmsFinanceDetail(tmsFinanceDetail); } /** * 新增费用明细[批量] * * @param tmsFinanceDetails 费用明细 * @return 结果 */ @Override public int insertTmsFinanceDetailBatch(List tmsFinanceDetails) { int rows = tmsFinanceDetailMapper.insertTmsFinanceDetailBatch(tmsFinanceDetails); return rows; } /** * 修改费用明细 * * @param tmsFinanceDetail 费用明细 * @return 结果 */ @Override public int updateTmsFinanceDetail(TmsFinanceDetail tmsFinanceDetail) { Integer financeId = tmsFinanceDetail.getFinanceId(); TmsFinance tmsFinance = tmsFinanceMapper.selectTmsFinanceById(financeId); if (tmsFinance == null){ throw new RuntimeException("未找到对应的费用单"); } tmsFinanceDetail.setUpdateBy(SecurityUtils.getUsername()); tmsFinanceDetail.setUpdateTime(DateUtils.getNowDate()); tmsFinanceDetailMapper.updateTmsFinanceDetail(tmsFinanceDetail); // 查询该费用单下所有状态为0的费用明细的实际费用金额总和 List detailList = tmsFinanceDetailMapper.selectList(new LambdaQueryWrapper() .eq(TmsFinanceDetail::getFinanceId, financeId) .eq(TmsFinanceDetail::getStatus, 0) ); // 计算总和 // 计算总和 double totalAmount = detailList.stream() .mapToDouble(detail -> detail.getActualFeeAmount().doubleValue()) .sum(); TmsFinance tmsFinance1 = new TmsFinance() {{ setId(financeId); setTotalAmount(new BigDecimal(totalAmount)); }}; return tmsFinanceMapper.updateTmsFinance(tmsFinance1); } @Override public AjaxResult cancelFinanceDetail(Integer id) { TmsFinanceDetail tmsFinanceDetail = tmsFinanceDetailMapper.selectById(id); if (tmsFinanceDetail == null){ return AjaxResult.error("未找到对应的费用明细"); } tmsFinanceDetail.setStatus(1); tmsFinanceDetail.setUpdateBy(SecurityUtils.getUsername()); tmsFinanceDetailMapper.updateTmsFinanceDetail(tmsFinanceDetail); // 查询该费用单下所有状态为0的费用明细的实际费用金额总和 List detailList = tmsFinanceDetailMapper.selectList(new LambdaQueryWrapper() .eq(TmsFinanceDetail::getFinanceId, tmsFinanceDetail.getFinanceId()) .eq(TmsFinanceDetail::getStatus, 0) ); // 计算总和 // 计算总和 double totalAmount = detailList.stream() .mapToDouble(detail -> detail.getActualFeeAmount().doubleValue()) .sum(); TmsFinance tmsFinance1 = new TmsFinance() {{ setId( tmsFinanceDetail.getFinanceId()); setTotalAmount(new BigDecimal(totalAmount)); }}; tmsFinanceMapper.updateTmsFinance(tmsFinance1); return AjaxResult.success("取消成功"); } /** * 修改费用明细[批量] * * @param tmsFinanceDetails 费用明细 * @return 结果 */ @Override public int updateTmsFinanceDetailBatch(List tmsFinanceDetails){ return tmsFinanceDetailMapper.updateTmsFinanceDetailBatch(tmsFinanceDetails); } /** * 删除费用明细对象 * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteTmsFinanceDetailByIds(String ids) { return deleteTmsFinanceDetailByIds(Convert.toIntArray(ids)); } /** * 删除费用明细对象 * * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteTmsFinanceDetailByIds(Integer[] ids) { return tmsFinanceDetailMapper.deleteTmsFinanceDetailByIds(ids); } /** * 删除费用明细信息 * * @param id 费用明细ID * @return 结果 */ @Override public int deleteTmsFinanceDetailById(Integer id) { return tmsFinanceDetailMapper.deleteTmsFinanceDetailById(id); } }