package com.ruoyi.tms.service.impl; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.IdUtil; 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.core.domain.entity.SysUser; 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.ISysDictDataService; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISystemDataNoService; import com.ruoyi.tms.domain.*; import com.ruoyi.tms.domain.vo.DpDriverDispatchVo; import com.ruoyi.tms.domain.vo.DriverDispatchVo; import com.ruoyi.tms.domain.vo.ServiceProviderVo; import com.ruoyi.tms.mapper.*; import com.ruoyi.tms.service.*; 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.common.core.text.Convert; /** * 调度单管理Service业务层处理 * * @author ruoyi * @date 2025-11-04 */ @Service @Transactional(rollbackFor = Exception.class) public class TmsDispatchOrderServiceImpl extends BaseService implements ITmsDispatchOrderService { protected final Logger logger = LoggerFactory.getLogger(getClass()); @Resource private TmsDispatchOrderMapper tmsDispatchOrderMapper; @Autowired ISystemDataNoService systemDataNoService; @Autowired private ISysUserService userService; @Autowired private ITmsDriverDispatchService tmsDriverDispatchService; @Resource private TmsQuoteDetailMapper tmsQuoteDetailMapper; @Resource private TmsQuotePlanMapper tmsQuotePlanMapper; @Autowired ITmsFinanceService tmsFinanceService; @Autowired private ITmsFinanceDetailService tmsFinanceDetailService; @Autowired private ITmsQuoteFeeService tmsQuoteFeeService; @Autowired ISysDictDataService sysDictDataService; @Autowired private ITmsReceivableFeeService tmsReceivableFeeService; @Autowired private ITmsReceivableFeeItemService tmsReceivableFeeItemService; @Autowired private TmsDriverDispatchServiceImpl tmsDriverDispatchServiceImpl; @Resource private TmsLoadingServiceProviderMapper tmsLoadingServiceProviderMapper; @Resource private TmsServiceProviderMapper tmsServiceProviderMapper; @Resource private TmsCustomsServiceProviderMapper tmsCustomsServiceProviderMapper; /** * 查询调度单管理 * * @param id 调度单管理ID * @return 调度单管理 */ @DataSource(DataSourceType.SLAVE) @Override public TmsDispatchOrder selectTmsDispatchOrderById(Integer id) { return tmsDispatchOrderMapper.selectTmsDispatchOrderById(id); } @Override public AjaxResult confirmOrder(Integer id) { TmsDispatchOrder tmsDispatchOrder = selectTmsDispatchOrderById(id); if (tmsDispatchOrder == null){ return AjaxResult.error("未找到该数据"); } if (tmsDispatchOrder.getStatus() != 0){ return AjaxResult.error("该调度单数据状态异常"); } if (tmsDispatchOrder.getMainDriverId() == null){ return AjaxResult.error("请先选择主驾司机"); } if (tmsDispatchOrder.getVehicleId() == null){ return AjaxResult.error("请先选择车辆"); } tmsDispatchOrder.setConfirmTime(DateUtils.getNowDate()); tmsDispatchOrder.setStatus(1); tmsDispatchOrder.setUpdateBy(SecurityUtils.getUsername()); int i = tmsDispatchOrderMapper.updateTmsDispatchOrder(tmsDispatchOrder); TmsDriverDispatch tmsDriverDispatch = new TmsDriverDispatch(); tmsDriverDispatch.setDriverId(tmsDispatchOrder.getMainDriverId()); tmsDriverDispatch.setDispatchId(tmsDispatchOrder.getId()); tmsDriverDispatch.setStatus(0); tmsDriverDispatchService.insertTmsDriverDispatch(tmsDriverDispatch); if (i > 0){ return AjaxResult.success("操作成功"); } return AjaxResult.error("操作失败"); } @Override public AjaxResult okOrder(Integer id) { TmsDispatchOrder tmsDispatchOrder = selectTmsDispatchOrderById(id); if (tmsDispatchOrder == null){ return AjaxResult.error("未找到该数据"); } if (tmsDispatchOrder.getStatus() != 2){ return AjaxResult.error("该调度单数据状态异常"); } tmsDispatchOrder.setStatus(3); tmsDispatchOrder.setOkTime(DateUtils.getNowDate()); tmsDispatchOrder.setUpdateBy(SecurityUtils.getUsername()); int i = tmsDispatchOrderMapper.updateTmsDispatchOrder(tmsDispatchOrder); if (i > 0){ return AjaxResult.success("操作成功"); } return AjaxResult.error("操作失败"); } @Override public AjaxResult copyOrder(Integer id) { TmsDispatchOrder tmsDispatchOrder = selectTmsDispatchOrderById(id); if (tmsDispatchOrder == null){ return AjaxResult.error("未找到该数据"); } TmsDispatchOrder tmsDispatchOrderNew = BeanUtil.copyProperties(tmsDispatchOrder, TmsDispatchOrder.class); tmsDispatchOrderNew.setStatus(0); tmsDispatchOrderNew.setMainDriverId(null); tmsDispatchOrderNew.setMainDriverName(null); tmsDispatchOrderNew.setAssistantDriverId(null); tmsDispatchOrderNew.setAssistantDriverName(null); tmsDispatchOrderNew.setVehicleId(null); tmsDispatchOrderNew.setLicensePlate(null); tmsDispatchOrderNew.setUpdateBy(null); tmsDispatchOrderNew.setId(null); int i = insertTmsDispatchOrder(tmsDispatchOrderNew); if (i > 0){ return AjaxResult.success("操作成功"); } return AjaxResult.error("操作失败"); } @Override public AjaxResult dropHook(Integer id) { TmsDispatchOrder tmsDispatchOrder = selectTmsDispatchOrderById(id); if (tmsDispatchOrder == null){ return AjaxResult.error("未找到该数据"); } tmsDriverDispatchService.update( null, new LambdaUpdateWrapper() .eq(TmsDriverDispatch::getDispatchId, tmsDispatchOrder.getId()) .eq(TmsDriverDispatch::getDriverId, tmsDispatchOrder.getMainDriverId()) .set(TmsDriverDispatch::getStatus, 1) ); tmsDispatchOrderMapper.update(new LambdaUpdateWrapper() .eq(TmsDispatchOrder::getId, tmsDispatchOrder.getId()) .set(TmsDispatchOrder::getStatus, 6) ); return AjaxResult.success("操作成功"); } @Override public AjaxResult connectHang(TmsDriverDispatch driverDispatch) { TmsDispatchOrder tmsDispatchOrder = selectTmsDispatchOrderById(driverDispatch.getDispatchId()); if (tmsDispatchOrder == null){ return AjaxResult.error("未找到该数据"); } driverDispatch.setStatus(2); tmsDriverDispatchService.insertTmsDriverDispatch(driverDispatch); return AjaxResult.success(); } @Override public int customsOrder(TmsDispatchOrder tmsDispatchOrder) { return tmsDispatchOrderMapper.update(new LambdaUpdateWrapper() .eq(TmsDispatchOrder::getId, tmsDispatchOrder.getId()) .set(TmsDispatchOrder::getCustomsServiceProviderId, tmsDispatchOrder.getCustomsServiceProviderId()) .set(TmsDispatchOrder::getCustomsServiceProviderName, tmsDispatchOrder.getCustomsServiceProviderName()) ); } @Override public int loadingOrder(TmsDispatchOrder tmsDispatchOrder) { return tmsDispatchOrderMapper.update(new LambdaUpdateWrapper() .eq(TmsDispatchOrder::getId, tmsDispatchOrder.getId()) .set(TmsDispatchOrder::getLoadingServiceProviderId, tmsDispatchOrder.getLoadingServiceProviderId()) .set(TmsDispatchOrder::getLoadingServiceProviderName, tmsDispatchOrder.getLoadingServiceProviderName()) ); } @Override public AjaxResult assignedItineraryList() { Integer deviceId = userService.getDeviceId(SecurityUtils.getUserId()); if (deviceId == null){ return AjaxResult.success(); } DriverDispatchVo vo = new DriverDispatchVo(); vo.setDriverId(deviceId); vo.setInStatusList(Arrays.asList(0, 1, 2,4)); vo.setInTdoStatusList(Arrays.asList(1, 2)); List driverDispatchVos = tmsDispatchOrderMapper.selectAssignedItineraryList(vo); if (driverDispatchVos != null && !driverDispatchVos.isEmpty()){ driverDispatchVos.forEach(item ->{ if (item.getTddStatus() == 1 ){ item.setStatusStr("待甩挂"); }else if (item.getTddStatus() == 2){ item.setStatusStr("待接挂"); }else if (item.getStatus() == 1){ item.setStatusStr("待发车"); }else if (item.getStatus() == 2){ item.setStatusStr("在途"); }else { item.setStatusStr("完成行程"); } }); } return AjaxResult.success(driverDispatchVos); } @Override public AjaxResult assignedItineraryLogList() { Integer deviceId = userService.getDeviceId(SecurityUtils.getUserId()); if (deviceId == null){ return AjaxResult.success(); } DriverDispatchVo vo = new DriverDispatchVo(); vo.setDriverId(deviceId); vo.setInStatusList(Arrays.asList(3,5)); // vo.setInTdoStatusList(Arrays.asList(1, 2)); List driverDispatchVos = tmsDispatchOrderMapper.selectAssignedItineraryList(vo); if (driverDispatchVos != null && !driverDispatchVos.isEmpty()){ driverDispatchVos.forEach(item ->{ item.setStatusStr("完成行程"); }); } return AjaxResult.success(driverDispatchVos); } @Override public AjaxResult selectAssignedItineraryDetail(Integer dispatchId) { Integer deviceId = userService.getDeviceId(SecurityUtils.getUserId()); if (deviceId == null){ return AjaxResult.success(); } DriverDispatchVo vo = new DriverDispatchVo(); vo.setDriverId(deviceId); vo.setDispatchId(dispatchId); DriverDispatchVo driverDispatchVo = tmsDispatchOrderMapper.selectAssignedItineraryDetail(vo); if (driverDispatchVo != null){ if (driverDispatchVo.getTddStatus() == 1 ){ driverDispatchVo.setStatusStr("待甩挂"); }else if (driverDispatchVo.getTddStatus() == 2){ driverDispatchVo.setStatusStr("待接挂"); }else if (driverDispatchVo.getStatus() == 1){ driverDispatchVo.setStatusStr("待发车"); }else if (driverDispatchVo.getStatus() == 2){ driverDispatchVo.setStatusStr("在途"); }else{ driverDispatchVo.setStatusStr("完成行程"); } } return AjaxResult.success(driverDispatchVo); } /** * 查询调度单管理 记录数 * * @param tmsDispatchOrder 调度单管理 * @return 调度单管理集合 */ @DataSource(DataSourceType.SLAVE) @Override public int selectTmsDispatchOrderCount(TmsDispatchOrder tmsDispatchOrder) { return tmsDispatchOrderMapper.selectTmsDispatchOrderCount(tmsDispatchOrder); } /** * 查询调度单管理列表 * * @param tmsDispatchOrder 调度单管理 * @return 调度单管理 */ @DataSource(DataSourceType.SLAVE) @Override public List selectTmsDispatchOrderList(TmsDispatchOrder tmsDispatchOrder) { return tmsDispatchOrderMapper.selectTmsDispatchOrderList(tmsDispatchOrder); } /** * 查询调度单管理列表 异步 导出 * * @param tmsDispatchOrder 调度单管理 * @param exportKey 导出功能的唯一标识 * @return 调度单管理集合 */ @DataSource(DataSourceType.SLAVE) @Async @Override public void export(TmsDispatchOrder tmsDispatchOrder,String exportKey) { super.export(TmsDispatchOrder.class,exportKey,"tmsDispatchOrderData",(pageNum)->{ PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE); return selectTmsDispatchOrderList(tmsDispatchOrder); }); } /** * 新增调度单管理 * * @param tmsDispatchOrder 调度单管理 * @return 结果 */ @Override public int insertTmsDispatchOrder(TmsDispatchOrder tmsDispatchOrder) { String noByKey = systemDataNoService.getNoByKey(SystemDataNoEnum.DL); tmsDispatchOrder.setDispatchNo(noByKey); tmsDispatchOrder.setCreateBy(SecurityUtils.getUsername()); tmsDispatchOrder.setCreateTime(DateUtils.getNowDate()); return tmsDispatchOrderMapper.insertTmsDispatchOrder(tmsDispatchOrder); } /** * 新增调度单管理[批量] * * @param tmsDispatchOrders 调度单管理 * @return 结果 */ @Override public int insertTmsDispatchOrderBatch(List tmsDispatchOrders) { int rows = tmsDispatchOrderMapper.insertTmsDispatchOrderBatch(tmsDispatchOrders); return rows; } /** * 修改调度单管理 * * @param tmsDispatchOrder 调度单管理 * @return 结果 */ @Override public int updateTmsDispatchOrder(TmsDispatchOrder tmsDispatchOrder) { tmsDispatchOrder.setUpdateBy(SecurityUtils.getUsername()); tmsDispatchOrder.setUpdateTime(DateUtils.getNowDate()); return tmsDispatchOrderMapper.updateTmsDispatchOrder(tmsDispatchOrder); } /** * 修改调度单管理[批量] * * @param tmsDispatchOrders 调度单管理 * @return 结果 */ @Override public int updateTmsDispatchOrderBatch(List tmsDispatchOrders){ return tmsDispatchOrderMapper.updateTmsDispatchOrderBatch(tmsDispatchOrders); } /** * 删除调度单管理对象 * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteTmsDispatchOrderByIds(String ids) { return deleteTmsDispatchOrderByIds(Convert.toIntArray(ids)); } /** * 删除调度单管理对象 * * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteTmsDispatchOrderByIds(Integer[] ids) { return tmsDispatchOrderMapper.deleteTmsDispatchOrderByIds(ids); } /** * 删除调度单管理信息 * * @param id 调度单管理ID * @return 结果 */ @Override public int deleteTmsDispatchOrderById(Integer id) { return tmsDispatchOrderMapper.deleteTmsDispatchOrderById(id); } @Override public List initGenerate(List ids) { List tmsDispatchOrders = tmsDispatchOrderMapper.selectBatchIds(ids); if (tmsDispatchOrders != null && !tmsDispatchOrders.isEmpty()){ tmsDispatchOrders.forEach(tmsDispatchOrder -> { // 1、是否是外协 // tmsDispatchOrder.is // 客户ID Integer customerId = tmsDispatchOrder.getCustomerId(); // 车型 String actualVehicleType = tmsDispatchOrder.getActualVehicleType(); // 运输路线 = 发货地行政区域 + 收货地行政区域 String shipperRegionCode = tmsDispatchOrder.getShipperRegionCode(); String receiverRegionCode = tmsDispatchOrder.getReceiverRegionCode(); if (tmsDispatchOrder.getAccountsReceivableStatus() != null && tmsDispatchOrder.getAccountsReceivableStatus() == 1){ TmsQuotePlan tmsQuotePlan = tmsQuotePlanMapper.selectTmsQuotePlanById(tmsDispatchOrder.getCollectionPlanId()); tmsDispatchOrder.setCollectionPlanId(tmsQuotePlan.getId()); tmsDispatchOrder.setCollectionPlanName(tmsQuotePlan.getPlanName()); }else{ // 查询应收规则 TmsQuoteDetail tmsQuoteDetail = tmsQuoteDetailMapper.selectOne(new LambdaQueryWrapper() .eq(TmsQuoteDetail::getCustomerId, customerId) .eq(TmsQuoteDetail::getVehicleType, actualVehicleType) .eq(TmsQuoteDetail::getStartRegionCode, shipperRegionCode) .eq(TmsQuoteDetail::getEndRegionCode, receiverRegionCode) .eq(TmsQuoteDetail::getPlanType, 0) .last("limit 1") ); if (tmsQuoteDetail != null){ TmsQuotePlan tmsQuotePlan = tmsQuotePlanMapper.selectTmsQuotePlanById(tmsQuoteDetail.getQuotePlanId()); tmsDispatchOrder.setCollectionPlanId(tmsQuotePlan.getId()); tmsDispatchOrder.setCollectionPlanName(tmsQuotePlan.getPlanName()); tmsDispatchOrder.setCollectionPlanDetailId(tmsQuoteDetail.getId()); tmsDispatchOrder.setCollectionPlanAmount(tmsQuoteDetail.getFreightPrice()); }else{ tmsDispatchOrder.setAccountsReceivableStatus(2); } } if (tmsDispatchOrder.getAccountsPayableStatus() != null && tmsDispatchOrder.getAccountsPayableStatus() == 1){ TmsQuotePlan tmsQuotePlan = tmsQuotePlanMapper.selectTmsQuotePlanById(tmsDispatchOrder.getPaymentPlanId()); tmsDispatchOrder.setPaymentPlanId(tmsQuotePlan.getId()); tmsDispatchOrder.setPaymentPlanName(tmsQuotePlan.getPlanName()); }else{ // 查询应付规则 TmsQuoteDetail tmsQuoteDetail2 = tmsQuoteDetailMapper.selectOne(new LambdaQueryWrapper() .eq(TmsQuoteDetail::getCustomerId, customerId) .eq(TmsQuoteDetail::getVehicleType, actualVehicleType) .eq(TmsQuoteDetail::getStartRegionCode, shipperRegionCode) .eq(TmsQuoteDetail::getEndRegionCode, receiverRegionCode) .eq(TmsQuoteDetail::getPlanType, 1) .last("limit 1") ); if (tmsQuoteDetail2 != null){ TmsQuotePlan tmsQuotePlan = tmsQuotePlanMapper.selectTmsQuotePlanById(tmsQuoteDetail2.getQuotePlanId()); tmsDispatchOrder.setPaymentPlanId(tmsQuotePlan.getId()); tmsDispatchOrder.setPaymentPlanName(tmsQuotePlan.getPlanName()); tmsDispatchOrder.setPaymentPlanDetailId(tmsQuoteDetail2.getId()); tmsDispatchOrder.setPaymentPlanAmount(tmsQuoteDetail2.getFreightPrice()); }else{ tmsDispatchOrder.setAccountsPayableStatus(2); } } }); } return tmsDispatchOrders; } @Override public List initYSGenerate(List ids) { List tmsDispatchOrders = tmsDispatchOrderMapper.selectBatchIds(ids); if (tmsDispatchOrders != null && !tmsDispatchOrders.isEmpty()){ tmsDispatchOrders.forEach(tmsDispatchOrder -> { List tmsReceivableFeeItems = new ArrayList<>(); if (tmsDispatchOrder.getAccountsReceivableStatus() != null && tmsDispatchOrder.getAccountsReceivableStatus() == 1){ throw new RuntimeException(tmsDispatchOrder.getDispatchNo()+"应收账单已生成,请先作废"); } // 客户ID Integer customerId = tmsDispatchOrder.getCustomerId(); // 1、是否是自营 0 = 是 1 = 否 获取运费 //if(tmsDispatchOrder.getOperationMode().equals(1)){ // 非自营需要有运费 // 车辆服务商 // 实际车型 String actualVehicleType = tmsDispatchOrder.getActualVehicleType(); // 出发路线 44,4404,440402,440402102 String shipperRegionCode = tmsDispatchOrder.getStartRegionCode(); // 目的地路线 81,8100,810000 String receiverRegionCode = tmsDispatchOrder.getEndRegionCode(); // 查询应收规则 TmsQuoteDetail tmsQuoteDetail = tmsQuoteDetailMapper.selectOne(new LambdaQueryWrapper() .eq(TmsQuoteDetail::getCustomerId, customerId) .eq(TmsQuoteDetail::getVehicleType, actualVehicleType) .eq(TmsQuoteDetail::getStartRegionCode, shipperRegionCode) .eq(TmsQuoteDetail::getEndRegionCode, receiverRegionCode) .eq(TmsQuoteDetail::getPlanType, 0) .last("limit 1") ); if (tmsQuoteDetail == null){ throw new RuntimeException("调度单"+tmsDispatchOrder.getDispatchNo()+"未维护应收运费报价,请维护数据后再重新生成"); } if (tmsQuoteDetail.getIsSegmentedInvoice() == 1){ TmsReceivableFeeItem tmsReceivableFeeItem = new TmsReceivableFeeItem(); tmsReceivableFeeItem.setFeeType(0); tmsReceivableFeeItem.setFeeName("运费"); tmsReceivableFeeItem.setTypeId(tmsQuoteDetail.getId()); tmsReceivableFeeItem.setRegisterAmount(tmsQuoteDetail.getFreightPrice()); tmsReceivableFeeItem.setRegisterTime(tmsDispatchOrder.getConfirmTime()); tmsReceivableFeeItem.setCurrency(tmsQuoteDetail.getCurrency()); tmsReceivableFeeItem.setRowKey(IdUtil.objectId()); tmsReceivableFeeItems.add(tmsReceivableFeeItem); }else{ TmsReceivableFeeItem tmsReceivableFeeItemOne = new TmsReceivableFeeItem(); tmsReceivableFeeItemOne.setFeeType(0); tmsReceivableFeeItemOne.setFeeName("一段运费"); tmsReceivableFeeItemOne.setTypeId(tmsQuoteDetail.getId()); tmsReceivableFeeItemOne.setRegisterAmount(tmsQuoteDetail.getSegment1FreightQuote()); tmsReceivableFeeItemOne.setRegisterTime(tmsDispatchOrder.getConfirmTime()); tmsReceivableFeeItemOne.setCurrency(tmsQuoteDetail.getSegment1Currency()); tmsReceivableFeeItemOne.setRowKey(IdUtil.objectId()); tmsReceivableFeeItems.add(tmsReceivableFeeItemOne); TmsReceivableFeeItem tmsReceivableFeeItemTwo = new TmsReceivableFeeItem(); tmsReceivableFeeItemTwo.setFeeType(0); tmsReceivableFeeItemTwo.setFeeName("二段运费"); tmsReceivableFeeItemTwo.setTypeId(tmsQuoteDetail.getId()); tmsReceivableFeeItemTwo.setRegisterAmount(tmsQuoteDetail.getSegment2FreightQuote()); tmsReceivableFeeItemTwo.setRegisterTime(tmsDispatchOrder.getConfirmTime()); tmsReceivableFeeItemTwo.setCurrency(tmsQuoteDetail.getSegment2Currency()); tmsReceivableFeeItemTwo.setRowKey(IdUtil.objectId()); tmsReceivableFeeItems.add(tmsReceivableFeeItemTwo); } //} // 2、 获取实报实销费用 List tmsFinanceDetails = tmsFinanceDetailService.selectTmsFinanceDetailList(new TmsFinanceDetail() {{ setDispatchOrderId(tmsDispatchOrder.getId()); }}); if (tmsFinanceDetails != null && !tmsFinanceDetails.isEmpty()){ tmsFinanceDetails.forEach(tmsFinanceDetail -> { TmsReceivableFeeItem tmsReceivableFeeItem = new TmsReceivableFeeItem(); tmsReceivableFeeItem.setFeeType(2); String feeName = sysDictDataService.selectDictLabel("fee_type", tmsFinanceDetail.getFeeType()); tmsReceivableFeeItem.setFeeName(feeName); tmsReceivableFeeItem.setTypeId(tmsFinanceDetail.getId()); tmsReceivableFeeItem.setRegisterAmount(tmsFinanceDetail.getActualFeeAmount()); tmsReceivableFeeItem.setRegisterTime(tmsFinanceDetail.getUpdateTime()); tmsReceivableFeeItem.setCurrency(tmsFinanceDetail.getCurrency()); tmsReceivableFeeItem.setRowKey(IdUtil.objectId()); tmsReceivableFeeItems.add(tmsReceivableFeeItem); }); } // 3、 获取报价费用 // tmsDispatchOrder.is List tmsQuoteFees = tmsQuoteFeeService.selectTmsQuoteFeeList(new TmsQuoteFee() {{ setDispatchId(tmsDispatchOrder.getId()); }}); if (tmsQuoteFees != null && !tmsQuoteFees.isEmpty()){ tmsQuoteFees.forEach(item -> { TmsReceivableFeeItem tmsReceivableFeeItem = new TmsReceivableFeeItem(); tmsReceivableFeeItem.setFeeType(1); tmsReceivableFeeItem.setFeeName(item.getFreeName()); tmsReceivableFeeItem.setTypeId(item.getId()); tmsReceivableFeeItem.setRegisterAmount(item.getSum()); tmsReceivableFeeItem.setRegisterTime(item.getCreateTime()); tmsReceivableFeeItem.setCurrency(item.getCurrency()); tmsReceivableFeeItem.setRowKey(IdUtil.objectId()); tmsReceivableFeeItems.add(tmsReceivableFeeItem); }); } tmsDispatchOrder.setTmsReceivableFeeItems(tmsReceivableFeeItems); }); } return tmsDispatchOrders; } @Override public List initYFGenerate(List ids) { List tmsDispatchOrders = tmsDispatchOrderMapper.selectBatchIds(ids); if (tmsDispatchOrders != null && !tmsDispatchOrders.isEmpty()){ tmsDispatchOrders.forEach(tmsDispatchOrder -> { List tmsReceivableFeeItems = new ArrayList<>(); if (tmsDispatchOrder.getAccountsPayableStatus() != null && tmsDispatchOrder.getAccountsPayableStatus() == 1){ throw new RuntimeException(tmsDispatchOrder.getDispatchNo()+"应付账单已生成,请先作废"); } // 客户ID Integer customerId = tmsDispatchOrder.getCustomerId(); // 1、是否是自营 0 = 是 1 = 否 获取运费 if(tmsDispatchOrder.getOperationMode().equals(1)){ // 非自营需要有运费 // 车辆服务商 Integer vehicleProviderId = tmsDispatchOrder.getVehicleProviderId(); // 实际车型 String actualVehicleType = tmsDispatchOrder.getActualVehicleType(); // 出发路线 44,4404,440402,440402102 String shipperRegionCode = tmsDispatchOrder.getStartRegionCode(); // 目的地路线 81,8100,810000 String receiverRegionCode = tmsDispatchOrder.getEndRegionCode(); // 查询应收规则 TmsQuoteDetail tmsQuoteDetail = tmsQuoteDetailMapper.selectOne( new LambdaQueryWrapper() .eq(TmsQuoteDetail::getVehicleType, actualVehicleType) .eq(TmsQuoteDetail::getStartRegionCode, shipperRegionCode) .eq(TmsQuoteDetail::getEndRegionCode, receiverRegionCode) .eq(TmsQuoteDetail::getPlanType, 1) .exists( "SELECT 1 " + "FROM tms_quote_plan tqp " + "WHERE tqp.id = tms_quote_detail.quote_plan_id " + "AND tqp.provider_id = {0} " + "AND tqp.plan_type = 1 " + "AND tqp.provider_type = 0", vehicleProviderId ) .last("LIMIT 1") ); if (tmsQuoteDetail == null){ throw new RuntimeException("调度单"+tmsDispatchOrder.getDispatchNo()+"未维护应付运费报价,请维护数据后再重新生成"); } TmsReceivableFeeItem tmsReceivableFeeItem = new TmsReceivableFeeItem(); tmsReceivableFeeItem.setFeeType(0); tmsReceivableFeeItem.setFeeName("运费"); tmsReceivableFeeItem.setTypeId(tmsQuoteDetail.getId()); tmsReceivableFeeItem.setRegisterAmount(tmsQuoteDetail.getFreightPrice()); tmsReceivableFeeItem.setRegisterTime(tmsDispatchOrder.getConfirmTime()); tmsReceivableFeeItem.setCurrency(tmsQuoteDetail.getCurrency()); tmsReceivableFeeItem.setRowKey(IdUtil.objectId()); tmsReceivableFeeItems.add(tmsReceivableFeeItem); } // 2、 获取实报实销费用 List tmsFinanceDetails = tmsFinanceDetailService.selectTmsFinanceDetailList(new TmsFinanceDetail() {{ setDispatchOrderId(tmsDispatchOrder.getId()); setIsYF(1); }}); if (tmsFinanceDetails != null && !tmsFinanceDetails.isEmpty()){ tmsFinanceDetails.forEach(tmsFinanceDetail -> { TmsReceivableFeeItem tmsReceivableFeeItem = new TmsReceivableFeeItem(); tmsReceivableFeeItem.setFeeType(2); String feeName = sysDictDataService.selectDictLabel("fee_type", tmsFinanceDetail.getFeeType()); tmsReceivableFeeItem.setFeeName(feeName); tmsReceivableFeeItem.setTypeId(tmsFinanceDetail.getId()); tmsReceivableFeeItem.setRegisterAmount(tmsFinanceDetail.getYfPrice()); tmsReceivableFeeItem.setRegisterTime(tmsFinanceDetail.getUpdateTime()); tmsReceivableFeeItem.setCurrency(tmsFinanceDetail.getYfCurrency()); tmsReceivableFeeItem.setRowKey(IdUtil.objectId()); tmsReceivableFeeItems.add(tmsReceivableFeeItem); }); } // 3、 获取报价费用 // tmsDispatchOrder.is List tmsQuoteFees = tmsQuoteFeeService.selectTmsQuoteFeeList(new TmsQuoteFee() {{ setDispatchId(tmsDispatchOrder.getId()); setIsYF(1); }}); if (tmsQuoteFees != null && !tmsQuoteFees.isEmpty()){ tmsQuoteFees.forEach(item -> { TmsReceivableFeeItem tmsReceivableFeeItem = new TmsReceivableFeeItem(); tmsReceivableFeeItem.setFeeType(1); tmsReceivableFeeItem.setFeeName(item.getFreeName()); tmsReceivableFeeItem.setTypeId(item.getId()); tmsReceivableFeeItem.setRegisterAmount(item.getYfSum()); tmsReceivableFeeItem.setRegisterTime(item.getCreateTime()); tmsReceivableFeeItem.setCurrency(item.getYfCurrency()); tmsReceivableFeeItem.setRowKey(IdUtil.objectId()); tmsReceivableFeeItems.add(tmsReceivableFeeItem); }); } tmsDispatchOrder.setTmsReceivableFeeItems(tmsReceivableFeeItems); }); } return tmsDispatchOrders; } @Override public AjaxResult ysGenerateTmsDispatchOrder(List ids) { List tmsDispatchOrders = initYSGenerate(ids); List collect1 = tmsDispatchOrders.stream().filter(item -> item.getTmsReceivableFeeItems() == null || item.getTmsReceivableFeeItems().isEmpty()).collect(Collectors.toList()); if (!collect1.isEmpty()){ String disNos = collect1.stream().map(TmsDispatchOrder::getDispatchNo).collect(Collectors.joining(",")); return AjaxResult.error("调度单"+disNos+"未有应收信息"); } List collect = tmsDispatchOrders.stream().map(item -> { TmsDispatchOrder tmsDispatchOrder = new TmsDispatchOrder(); tmsDispatchOrder.setId(item.getId()); tmsDispatchOrder.setAccountsReceivableStatus(1); tmsDispatchOrder.setUpdateBy(SecurityUtils.getUsername()); return tmsDispatchOrder; }).collect(Collectors.toList()); // 1、修改调度 tmsDispatchOrderMapper.updateTmsDispatchOrderBatch(collect); // 2、生成应收单 tmsDispatchOrders.stream().forEach(item -> { TmsReceivableFee tmsReceivableFee = new TmsReceivableFee(); String noByKey = systemDataNoService.getNoByKey(SystemDataNoEnum.YSFY); tmsReceivableFee.setSystemNo(noByKey); tmsReceivableFee.setDispatchId(item.getId()); tmsReceivableFee.setDispatchNo(item.getDispatchNo()); tmsReceivableFee.setCustomerId(item.getCustomerId()); tmsReceivableFee.setCustomerName(item.getCustomerName()); tmsReceivableFee.setProjectId(item.getProjectId()); tmsReceivableFee.setProjectName(item.getProjectName()); List tmsReceivableFeeItems = item.getTmsReceivableFeeItems(); BigDecimal totalRmbAmount = tmsReceivableFeeItems.stream() .filter(cItem -> "RMB".equals(cItem.getCurrency())) .map(TmsReceivableFeeItem::getRegisterAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); tmsReceivableFee.setReceivableRMBAmount(totalRmbAmount); BigDecimal totalHkbAmount = tmsReceivableFeeItems.stream() .filter(cItem -> "HKD".equals(cItem.getCurrency())) .map(TmsReceivableFeeItem::getRegisterAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); tmsReceivableFee.setReceivableHKBAmount(totalHkbAmount); tmsReceivableFee.setDispatchConfirmTime(item.getConfirmTime()); tmsReceivableFee.setCostGenerateTime(new Date()); tmsReceivableFee.setStatus(0); tmsReceivableFee.setCreateBy(SecurityUtils.getUsername()); tmsReceivableFeeService.insertTmsReceivableFee(tmsReceivableFee); tmsReceivableFeeItems.forEach(kItem -> { kItem.setHeadId(tmsReceivableFee.getId()); }); tmsReceivableFeeItemService.insertTmsReceivableFeeItemBatch(tmsReceivableFeeItems); }); return AjaxResult.success(); } @Override public AjaxResult yfGenerateTmsDispatchOrder(List ids) { List tmsDispatchOrders = initYFGenerate(ids); List collect1 = tmsDispatchOrders.stream().filter(item -> item.getTmsReceivableFeeItems() == null || item.getTmsReceivableFeeItems().isEmpty()).collect(Collectors.toList()); if (!collect1.isEmpty()){ String disNos = collect1.stream().map(TmsDispatchOrder::getDispatchNo).collect(Collectors.joining(",")); return AjaxResult.error("调度单"+disNos+"未有应付信息"); } List collect = tmsDispatchOrders.stream().map(item -> { TmsDispatchOrder tmsDispatchOrder = new TmsDispatchOrder(); tmsDispatchOrder.setId(item.getId()); tmsDispatchOrder.setAccountsPayableStatus(1); tmsDispatchOrder.setUpdateBy(SecurityUtils.getUsername()); return tmsDispatchOrder; }).collect(Collectors.toList()); // 1、修改调度 tmsDispatchOrderMapper.updateTmsDispatchOrderBatch(collect); // 2、生成应收单 // tmsDispatchOrders.stream().forEach(item -> { // TmsReceivableFee tmsReceivableFee = new TmsReceivableFee(); // String noByKey = systemDataNoService.getNoByKey(SystemDataNoEnum.YSFY); // // tmsReceivableFee.setSystemNo(noByKey); // tmsReceivableFee.setDispatchId(item.getId()); // tmsReceivableFee.setDispatchNo(item.getDispatchNo()); // tmsReceivableFee.setCustomerId(item.getCustomerId()); // tmsReceivableFee.setCustomerName(item.getCustomerName()); // tmsReceivableFee.setProjectId(item.getProjectId()); // tmsReceivableFee.setProjectName(item.getProjectName()); // // List tmsReceivableFeeItems = item.getTmsReceivableFeeItems(); // // // BigDecimal totalRmbAmount = tmsReceivableFeeItems.stream() // .filter(cItem -> "RMB".equals(cItem.getCurrency())) // .map(TmsReceivableFeeItem::getRegisterAmount) // .reduce(BigDecimal.ZERO, BigDecimal::add); // tmsReceivableFee.setReceivableRMBAmount(totalRmbAmount); // // // BigDecimal totalHkbAmount = tmsReceivableFeeItems.stream() // .filter(cItem -> "HKB".equals(cItem.getCurrency())) // .map(TmsReceivableFeeItem::getRegisterAmount) // .reduce(BigDecimal.ZERO, BigDecimal::add); // tmsReceivableFee.setReceivableHKBAmount(totalHkbAmount); // // // tmsReceivableFee.setDispatchConfirmTime(item.getConfirmTime()); // tmsReceivableFee.setCostGenerateTime(new Date()); // tmsReceivableFee.setStatus(0); // tmsReceivableFee.setCreateBy(SecurityUtils.getUsername()); // tmsReceivableFeeService.insertTmsReceivableFee(tmsReceivableFee); // // // tmsReceivableFeeItems.forEach(kItem -> { // kItem.setHeadId(tmsReceivableFee.getId()); // }); // tmsReceivableFeeItemService.insertTmsReceivableFeeItemBatch(tmsReceivableFeeItems); // }); return AjaxResult.success(); } @Override public AjaxResult generateTmsDispatchOrder(List ids) { List tmsDispatchOrders = initGenerate(ids); List collect1 = tmsDispatchOrders.stream().filter(item -> item.getIsCustoms() == 0 && item.getCustomsServiceProviderId() == null).collect(Collectors.toList()); if (!collect1.isEmpty()){ String disNos = collect1.stream().map(TmsDispatchOrder::getDispatchNo).collect(Collectors.joining(",")); return AjaxResult.error("调度单"+disNos+"未补充委托报关信息"); } List collect2 = tmsDispatchOrders.stream().filter(item -> item.getIsLoad() == 0 && item.getLoadingServiceProviderId() == null).collect(Collectors.toList()); if (!collect2.isEmpty()){ String disNos = collect2.stream().map(TmsDispatchOrder::getDispatchNo).collect(Collectors.joining(",")); return AjaxResult.error("调度单"+disNos+"未补充装卸货信息"); } List receivableList = tmsDispatchOrders.stream().filter(item -> item.getAccountsReceivableStatus() == 0).collect(Collectors.toList()); if (!receivableList.isEmpty()){ List collect = receivableList.stream().map(item -> { TmsDispatchOrder tmsDispatchOrder = new TmsDispatchOrder(); tmsDispatchOrder.setId(item.getId()); tmsDispatchOrder.setAccountsReceivableStatus(1); tmsDispatchOrder.setCollectionPlanId(item.getCollectionPlanId()); tmsDispatchOrder.setUpdateBy(SecurityUtils.getUsername()); return tmsDispatchOrder; }).collect(Collectors.toList()); // 1、修改调度 tmsDispatchOrderMapper.updateTmsDispatchOrderBatch(collect); // 2、生成应收账单 List tmsFinances = BeanUtil.copyToList(receivableList, TmsFinance.class); tmsFinances.forEach(item ->{ item.setSystemCode(systemDataNoService.getNoByKey(SystemDataNoEnum.YSD)); item.setPlanName(item.getCollectionPlanName()); item.setDispatchId(item.getId()); item.setCreateBy(SecurityUtils.getUsername()); item.setCreateTime(new Date()); item.setUpdateBy(SecurityUtils.getUsername()); item.setUpdateTime(new Date()); item.setStatus(0); item.setType(0); item.setTotalAmount(item.getCollectionPlanAmount()); }); tmsFinanceService.insertTmsFinanceYFBatch(tmsFinances); } List playList = tmsDispatchOrders.stream().filter(item -> item.getAccountsPayableStatus() == 0).collect(Collectors.toList()); if (!playList.isEmpty()){ List collect = playList.stream().map(item -> { TmsDispatchOrder tmsDispatchOrder = new TmsDispatchOrder(); tmsDispatchOrder.setId(item.getId()); tmsDispatchOrder.setAccountsPayableStatus(1); tmsDispatchOrder.setPaymentPlanId(item.getPaymentPlanId()); tmsDispatchOrder.setUpdateBy(SecurityUtils.getUsername()); return tmsDispatchOrder; }).collect(Collectors.toList()); // 1、修改调度 tmsDispatchOrderMapper.updateTmsDispatchOrderBatch(collect); // 2、生成应付账单 List tmsFinances = BeanUtil.copyToList(receivableList, TmsFinance.class); tmsFinances.forEach(item ->{ item.setSystemCode(systemDataNoService.getNoByKey(SystemDataNoEnum.YFD)); item.setPlanName(item.getPaymentPlanName()); item.setDispatchId(item.getId()); item.setCreateBy(SecurityUtils.getUsername()); item.setCreateTime(new Date()); item.setUpdateBy(SecurityUtils.getUsername()); item.setUpdateTime(new Date()); item.setStatus(0); item.setType(1); item.setTotalAmount(item.getPaymentPlanAmount()); }); tmsFinanceService.insertTmsFinanceYFBatch(tmsFinances); } return AjaxResult.success(); } @Override public AjaxResult getServiceProvider(Integer id) { TmsDispatchOrder tmsDispatchOrder = tmsDispatchOrderMapper. selectTmsDispatchOrderById(id); List serviceProviderVos = new ArrayList<>(); if (tmsDispatchOrder != null){ if (tmsDispatchOrder.getLoadingServiceProviderId() != null){ serviceProviderVos.add(new ServiceProviderVo(tmsDispatchOrder.getLoadingServiceProviderId(), tmsDispatchOrder.getLoadingServiceProviderName(), "2")); } if (tmsDispatchOrder.getCustomsServiceProviderId() != null){ serviceProviderVos.add(new ServiceProviderVo(tmsDispatchOrder.getCustomsServiceProviderId(), tmsDispatchOrder.getCustomsServiceProviderName(), "1")); } if (tmsDispatchOrder.getVehicleProviderId() != null){ serviceProviderVos.add(new ServiceProviderVo(tmsDispatchOrder.getVehicleProviderId(), tmsDispatchOrder.getVehicleProviderName(), "0")); } // 查询 List tmsQuoteFees = tmsQuoteFeeService.selectTmsQuoteFeeList(new TmsQuoteFee() {{ setDispatchId(id); }}); if (tmsQuoteFees != null && !tmsQuoteFees.isEmpty()){ List collect = tmsQuoteFees.stream() .collect(Collectors.collectingAndThen( Collectors.toMap( item -> item.getServiceProviderId() + "_" + item.getServiceProviderType(), item -> new ServiceProviderVo( item.getServiceProviderId(), null, item.getServiceProviderType() ), (a, b) -> a ), m -> new ArrayList<>(m.values()) )); collect.forEach(item -> { if ("0".equals(item.getServiceProviderType())){ TmsServiceProvider tmsServiceProvider = tmsServiceProviderMapper.selectTmsServiceProviderById(item.getServiceProviderId()); item.setServiceProviderName(tmsServiceProvider.getServiceName()); } else if ("1".equals(item.getServiceProviderType())){ TmsCustomsServiceProvider tmsCustomsServiceProvider = tmsCustomsServiceProviderMapper.selectTmsCustomsServiceProviderById(item.getServiceProviderId()); item.setServiceProviderName(tmsCustomsServiceProvider.getServiceName()); } else if ("2".equals(item.getServiceProviderType())){ TmsLoadingServiceProvider tmsLoadingServiceProvider = tmsLoadingServiceProviderMapper.selectTmsLoadingServiceProviderById(item.getServiceProviderId()); item.setServiceProviderName(tmsLoadingServiceProvider.getServiceName()); } serviceProviderVos.add(item); }); ArrayList collect1 = serviceProviderVos.stream().collect(Collectors.collectingAndThen( Collectors.toMap( item -> item.getServiceProviderId() + "_" + item.getServiceProviderType(), item -> new ServiceProviderVo( item.getServiceProviderId(), item.getServiceProviderName(), item.getServiceProviderType() ), (a, b) -> a ), m -> new ArrayList<>(m.values()) )); return AjaxResult.success(collect1); } }else{ return AjaxResult.error("调度单不存在"); } return AjaxResult.success(); } @Override public List selectDpData() { return tmsDispatchOrderMapper.selectselectDpData(); } }