package com.ruoyi.cwgl.service.impl; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; import com.ruoyi.common.utils.DateUtils; import javax.annotation.Resource; import com.ruoyi.cwgl.domain.DispatchOrderItem; import com.ruoyi.cwgl.domain.vo.DispatchOrderItemVo; 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.mapper.DispatchOrderMapper; import com.ruoyi.cwgl.domain.DispatchOrder; import com.ruoyi.cwgl.service.IDispatchOrderService; import com.ruoyi.common.core.text.Convert; /** * 调度单Service业务层处理 * * @author ruoyi * @date 2025-07-29 */ @Service @Transactional(rollbackFor = Exception.class) public class DispatchOrderServiceImpl extends BaseService implements IDispatchOrderService { protected final Logger logger = LoggerFactory.getLogger(getClass()); @Resource private DispatchOrderMapper dispatchOrderMapper; /** * 查询调度单 * * @param id 调度单ID * @return 调度单 */ @DataSource(DataSourceType.SLAVE) @Override public DispatchOrder selectDispatchOrderById(Integer id) { return dispatchOrderMapper.selectDispatchOrderById(id); } /** * 查询调度单 记录数 * * @param dispatchOrder 调度单 * @return 调度单集合 */ @DataSource(DataSourceType.SLAVE) @Override public int selectDispatchOrderCount(DispatchOrder dispatchOrder) { return dispatchOrderMapper.selectDispatchOrderCount(dispatchOrder); } /** * 查询调度单列表 * * @param dispatchOrder 调度单 * @return 调度单 */ @DataSource(DataSourceType.SLAVE) @Override public List selectDispatchOrderList(DispatchOrder dispatchOrder) { return dispatchOrderMapper.selectDispatchOrderList(dispatchOrder); } /** * 查询调度单列表 * * @param dispatchOrder 调度单 * @return 调度单 */ @DataSource(DataSourceType.CWSJ) @Override public List selectDispatchOrderList2(DispatchOrder dispatchOrder) { return dispatchOrderMapper.selectDispatchOrderList2(dispatchOrder); } /** * 查询调度单列表 异步 导出 * * @param dispatchOrder 调度单 * @param exportKey 导出功能的唯一标识 * @return 调度单集合 */ @DataSource(DataSourceType.SLAVE) @Async @Override public void export(DispatchOrder dispatchOrder,String exportKey) { super.export(DispatchOrder.class,exportKey,"dispatchOrderData",(pageNum)->{ PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE); return selectDispatchOrderList(dispatchOrder); }); } /** * 新增调度单 * * @param dispatchOrder 调度单 * @return 结果 */ @Override public int insertDispatchOrder(DispatchOrder dispatchOrder) { dispatchOrder.setCreateTime(DateUtils.getNowDate()); return dispatchOrderMapper.insertDispatchOrder(dispatchOrder); } /** * 新增调度单[批量] * * @param dispatchOrders 调度单 * @return 结果 */ @Override public int insertDispatchOrderBatch(List dispatchOrders) { int rows = dispatchOrderMapper.insertDispatchOrderBatch(dispatchOrders); return rows; } /** * 修改调度单 * * @param dispatchOrder 调度单 * @return 结果 */ @Override public int updateDispatchOrder(DispatchOrder dispatchOrder) { dispatchOrder.setUpdateTime(DateUtils.getNowDate()); return dispatchOrderMapper.updateDispatchOrder(dispatchOrder); } /** * 修改调度单[批量] * * @param dispatchOrders 调度单 * @return 结果 */ @Override public int updateDispatchOrderBatch(List dispatchOrders){ return dispatchOrderMapper.updateDispatchOrderBatch(dispatchOrders); } /** * 删除调度单对象 * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteDispatchOrderByIds(String ids) { return deleteDispatchOrderByIds(Convert.toIntArray(ids)); } /** * 删除调度单对象 * * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteDispatchOrderByIds(Integer[] ids) { return dispatchOrderMapper.deleteDispatchOrderByIds(ids); } /** * 删除调度单信息 * * @param id 调度单ID * @return 结果 */ @Override public int deleteDispatchOrderById(Integer id) { return dispatchOrderMapper.deleteDispatchOrderById(id); } @DataSource(DataSourceType.CWSJ) @Override public List selectDispatchOrderItem(String no) { // 使用Map来临时存储分组结果 Map summaryMap = new HashMap<>(); List dispatchOrderItems=dispatchOrderMapper.selectDispatchOrderItemByNo(no); Set settableFeeItemSet = null; for (DispatchOrderItem dispatchOrderItem : dispatchOrderItems) { String settableFeeItems = dispatchOrderItem.getSettableFeeItems(); if (settableFeeItemSet==null) { settableFeeItemSet = new HashSet<>( Arrays.asList(settableFeeItems.split(","))); } // 判断是否可结算 String feeItem = dispatchOrderItem.getFeeItem(); int isSettable = isFeeItemSettable(feeItem, settableFeeItemSet); // 如果Map中不存在该费用类型,则创建新条目 if (!summaryMap.containsKey(feeItem)) { DispatchOrderItemVo summary = new DispatchOrderItemVo(); summary.setFeeItem(feeItem); summary.setReceivableFee(BigDecimal.ZERO); summary.setActualFee(BigDecimal.ZERO); summary.setIsSettlement(isSettable); summaryMap.put(feeItem, summary); } // 根据账单类型累加金额 DispatchOrderItemVo summary = summaryMap.get(feeItem); if ("R".equals(dispatchOrderItem.getBillType())) { // 应收 summary.setReceivableFee(summary.getReceivableFee().add(dispatchOrderItem.getSettleFee())); summary.setReceivableFeeCurrency(dispatchOrderItem.getCurrencyType()); } else if ("P".equals(dispatchOrderItem.getBillType())) { // 应付 summary.setActualFee(summary.getActualFee().add(dispatchOrderItem.getSettleFee())); summary.setActualFeeCurrency(dispatchOrderItem.getCurrencyType()); } } // 转换为List并过滤、排序 return summaryMap.values().stream() // 过滤掉应收应付都为0的记录 .filter(dto -> dto.getReceivableFee().compareTo(BigDecimal.ZERO) != 0 || dto.getActualFee().compareTo(BigDecimal.ZERO) != 0) // 排序:可结算的在前,不可结算的在后;然后按总金额降序 .sorted(Comparator.comparing(DispatchOrderItemVo::getIsSettlement).reversed() .thenComparing(dto -> dto.getReceivableFee().add(dto.getActualFee()), Comparator.reverseOrder())) .collect(Collectors.toList()); } /** * 判断费用类型是否可结算 */ private static int isFeeItemSettable(String feeItem, Set settableFeeItemSet) { if (feeItem == null || settableFeeItemSet == null) { return 0; } if (settableFeeItemSet.contains(feeItem)) { return 1; } return 0; } }