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.annotation.Excel; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.SysUserImport; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.enums.SystemDataNoEnum; import com.ruoyi.common.exception.ServiceException; 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.common.utils.file.DownloadExportUtil; import com.ruoyi.common.utils.poi.ExcelUtil; 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.*; 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; @Autowired private ITmsDispatchOrderLogService tmsDispatchOrderLogService; @Resource private TmsQuoteDetailMapper tmsQuoteDetailMapper; @Resource private TmsQuotePlanMapper tmsQuotePlanMapper; @Autowired private RedisCache redisCache; @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; @Resource private TmsTripMapper tmsTripMapper; @Resource private TmsPayableFeeMapper tmsPayableFeeMapper; @Resource private TmsPayableFeeItemMapper tmsPayableFeeItemMapper; @Resource private TmsProjectMapper tmsProjectMapper; @Resource TransportRouteViMapper transportRouteViMapper; @Resource private TmsDriverMapper tmsDriverMapper; @Resource private TmsVehicleMapper tmsVehicleMapper; @Resource private TmsConsignorMapper tmsConsignorMapper; @Resource private TmsContainerMapper tmsContainerMapper; @Resource private TmsShelfMapper tmsShelfMapper; @Autowired private ITmsDispatchOrderImportLogService tmsDispatchOrderImportLogService; /** * 查询调度单管理 * * @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); tmsDispatchOrderNew.setAccountsReceivableStatus(0); tmsDispatchOrderNew.setAccountsPayableStatus(0); 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 close(Integer id) { TmsDispatchOrder tmsDispatchOrder = selectTmsDispatchOrderById(id); if (tmsDispatchOrder == null){ return AjaxResult.error("未找到该数据"); } if (tmsDispatchOrder.getIsfk() == 0){ return AjaxResult.success(); } TmsTrip tmsTrip = tmsTripMapper.selectOne(new LambdaQueryWrapper().eq(TmsTrip::getDispatchOrderId, id) .eq(TmsTrip::getTripType, 0) .orderByDesc(TmsTrip::getId) .last("limit 1") ); if (tmsTrip != null){ return AjaxResult.error("该调度单状态为【在途】,且司机于【"+DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", tmsTrip.getTripTime())+"】已发车,不允许作废,如需取消行程," + "请通知司机操作返空即可。"); } 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 AjaxResult closeOrder(TmsDispatchOrder order) { TmsDispatchOrder tmsDispatchOrder = selectTmsDispatchOrderById(order.getId()); if (tmsDispatchOrder == null){ return AjaxResult.error("未找到该数据"); } AjaxResult close = close(tmsDispatchOrder.getId()); if (close.isSuccess()){ tmsDispatchOrder.setStatus(5); tmsDispatchOrder.setCloseBy(SecurityUtils.getUsername()); tmsDispatchOrder.setCloseTime(DateUtils.getNowDate()); tmsDispatchOrder.setCloseRemark(tmsDispatchOrder.getCloseRemark()); tmsDispatchOrder.setCloseWhy(tmsDispatchOrder.getCloseWhy()); int result = tmsDispatchOrderMapper.updateTmsDispatchOrder(tmsDispatchOrder); if (result > 0) { TmsDispatchOrderLog log = new TmsDispatchOrderLog(); log.setHeadId(tmsDispatchOrder.getId()); log.setCreateBy(SecurityUtils.getUsername()); log.setCreateTime(DateUtils.getNowDate()); log.setNode("作废调度单"); tmsDispatchOrderLogService.insertTmsDispatchOrderLog(log); } return AjaxResult.success("操作成功"); }else{ return close; } } //填写委托报关信息 @Override public int customsOrder(List tmsDispatchOrders) { int totalResult = 0; for (TmsDispatchOrder tmsDispatchOrder : tmsDispatchOrders) { int result = tmsDispatchOrderMapper.update(new LambdaUpdateWrapper() .eq(TmsDispatchOrder::getId, tmsDispatchOrder.getId()) .set(TmsDispatchOrder::getCustomsServiceProviderId, tmsDispatchOrder.getCustomsServiceProviderId()) .set(TmsDispatchOrder::getCustomsServiceProviderName, tmsDispatchOrder.getCustomsServiceProviderName()) ); totalResult += result; if (result > 0) { TmsDispatchOrderLog log = new TmsDispatchOrderLog(); log.setHeadId(tmsDispatchOrder.getId()); log.setCreateBy(SecurityUtils.getUsername()); log.setCreateTime(DateUtils.getNowDate()); log.setNode("填写委托报关信息"); tmsDispatchOrderLogService.insertTmsDispatchOrderLog(log); } } return totalResult; } //填写委托装卸信息 @Override public int loadingOrder(List tmsDispatchOrders) { int totalResult = 0; for (TmsDispatchOrder tmsDispatchOrder : tmsDispatchOrders) { int result = tmsDispatchOrderMapper.update(new LambdaUpdateWrapper() .eq(TmsDispatchOrder::getId, tmsDispatchOrder.getId()) .set(TmsDispatchOrder::getLoadingServiceProviderId, tmsDispatchOrder.getLoadingServiceProviderId()) .set(TmsDispatchOrder::getLoadingServiceProviderName, tmsDispatchOrder.getLoadingServiceProviderName()) ); totalResult += result; if (result > 0) { TmsDispatchOrderLog log = new TmsDispatchOrderLog(); log.setHeadId(tmsDispatchOrder.getId()); log.setCreateBy(SecurityUtils.getUsername()); log.setCreateTime(DateUtils.getNowDate()); log.setNode("填写委托装卸信息"); tmsDispatchOrderLogService.insertTmsDispatchOrderLog(log); } } return totalResult; } @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,6,7)); 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(2,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 Map assignedItineraryLogListPage(Integer pageNum, Integer pageSize) { Integer deviceId = userService.getDeviceId(SecurityUtils.getUserId()); Map result = new HashMap<>(); if (deviceId == null) { result.put("rows", Collections.emptyList()); result.put("total", 0); return result; } DriverDispatchVo vo = new DriverDispatchVo(); vo.setDriverId(deviceId); // vo.setInStatusList(Arrays.asList(3, 5)); // 先查总数 List allList = tmsDispatchOrderMapper.selectAssignedItineraryList(vo); int total = allList != null ? allList.size() : 0; // 手动分页(SQL 已加 ORDER BY) int fromIndex = (pageNum - 1) * pageSize; List pageList; if (allList == null || fromIndex >= total) { pageList = Collections.emptyList(); } else { int toIndex = Math.min(fromIndex + pageSize, total); pageList = allList.subList(fromIndex, toIndex); } if (!pageList.isEmpty()) { pageList.forEach(item -> item.setStatusStr("完成行程")); } result.put("rows", pageList); result.put("total", total); return result; } @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); }); } @Override public void importTemplate(String exportKey) { String fileName = ExcelUtil.encodeFileName("tmsDispatchOrderDataTemplate"); DownloadExportUtil.deleteDownloadFile(redisCache, exportKey, "0"); try { ExcelUtil excelUtil = new ExcelUtil<>(TmsDispatchOrderImport.class); excelUtil.initialize("tmsDispatchOrderDataTemplate", null, Excel.Type.EXPORT); TmsDispatchOrderImport tmsDispatchOrderImport = new TmsDispatchOrderImport(); tmsDispatchOrderImport.setProjectName("XXX项目"); tmsDispatchOrderImport.setTransportLine("广东省/珠海市/香洲区->香港特别行政区"); tmsDispatchOrderImport.setRequiredVehicleTypes("10T"); tmsDispatchOrderImport.setOrderType("基础订单"); tmsDispatchOrderImport.setIsCustoms("是"); tmsDispatchOrderImport.setIsLoad("是"); tmsDispatchOrderImport.setIsUrgent("是"); tmsDispatchOrderImport.setOrderTime(DateUtils.getNowDate()); tmsDispatchOrderImport.setLatestDeparture(DateUtils.getNowDate()); tmsDispatchOrderImport.setLatestArrival(DateUtils.getNowDate()); tmsDispatchOrderImport.setOperationMode("是"); tmsDispatchOrderImport.setCommissionModel("一日游"); tmsDispatchOrderImport.setMainDriverName("张三"); tmsDispatchOrderImport.setLicensePlate("粤C12345"); tmsDispatchOrderImport.setShipperRegionLabel("ZXH202512110002"); tmsDispatchOrderImport.setReceiverRegionLabel("ZXH202512110001"); excelUtil.exportExcel(Collections.singletonList(tmsDispatchOrderImport)); excelUtil.finishExport(fileName); // 设置下载完成状态 DownloadExportUtil.setDownloadFile(redisCache, exportKey, fileName); logger.info("Export completed for key: {}, file: {}", exportKey, fileName); } catch (Exception e) { logger.error("Export failed for key: {}, error: {}", exportKey, e.getMessage(), e); DownloadExportUtil.deleteDownloadFile(redisCache, exportKey, "1"); // 设置失败状态 throw e; } } private String verRequired(int line,TmsDispatchOrderImport tmsDispatchOrderImport){ if (StringUtils.isEmpty(tmsDispatchOrderImport.getProjectName())){ return "第 "+line+" 行 项目名称 不能为空!"; } if (StringUtils.isEmpty(tmsDispatchOrderImport.getTransportLine())){ return "第 "+line+" 行 运输线路 不能为空!"; } if (StringUtils.isEmpty(tmsDispatchOrderImport.getRequiredVehicleTypes())){ return "第 "+line+" 行 下单车型 不能为空!"; } if (StringUtils.isEmpty(tmsDispatchOrderImport.getOrderType())){ return "第 "+line+" 行 订单类型 不能为空!"; } if (StringUtils.isEmpty(tmsDispatchOrderImport.getIsCustoms())){ return "第 "+line+" 行 委托报关 不能为空!"; } if (StringUtils.isEmpty(tmsDispatchOrderImport.getIsLoad())){ return "第 "+line+" 行 委托装卸 不能为空!"; } if (StringUtils.isEmpty(tmsDispatchOrderImport.getIsUrgent())){ return "第 "+line+" 行 是否紧急 不能为空!"; } if (tmsDispatchOrderImport.getOrderTime() == null){ return "第 "+line+" 行 下单时间 不能为空!"; } if (tmsDispatchOrderImport.getLatestArrival() == null){ return "第 "+line+" 行 要求最晚到达时间 不能为空!"; } if (StringUtils.isEmpty(tmsDispatchOrderImport.getOperationMode())){ return "第 "+line+" 行 是否是自营车队 不能为空!"; } if ("0".equals(tmsDispatchOrderImport.getOperationMode())){ if (StringUtils.isEmpty(tmsDispatchOrderImport.getCommissionModel())){ throw new ServiceException("第"+line+"行自营车队必填提成模式!"); } } if ("1".equals(tmsDispatchOrderImport.getOperationMode())){ if (StringUtils.isEmpty(tmsDispatchOrderImport.getVehicleProviderName())){ throw new ServiceException("第"+line+"行 非自营车队 必填车辆服务商名称!"); } } if ( StringUtils.isEmpty(tmsDispatchOrderImport.getProjectName())){ return "第 "+line+" 行 下单时间 不能为空!"; } if (StringUtils.isEmpty(tmsDispatchOrderImport.getMainDriverName())){ return "第 "+line+" 行 主驾驶员 不能为空!"; } if (StringUtils.isEmpty(tmsDispatchOrderImport.getLicensePlate())){ return "第 "+line+" 行 车牌号 不能为空!"; } if (StringUtils.isEmpty(tmsDispatchOrderImport.getShipperRegionLabel())){ return "第 "+line+" 行 装货点编码 不能为空!"; } if (StringUtils.isEmpty(tmsDispatchOrderImport.getReceiverRegionLabel())){ return "第 "+line+" 行 卸货地编码 不能为空!"; } return null; } @Override public String importData(List list) { if (StringUtils.isNull(list) || list.isEmpty()) { throw new ServiceException("导入调度单数据不能为空!"); } int failureNum = 0; StringBuilder successMsg = new StringBuilder(); StringBuilder failureMsg = new StringBuilder(); StringBuilder failureDescription = new StringBuilder(); int line = 1; // 创建导入日志对象 TmsDispatchOrderImportLog importLog = new TmsDispatchOrderImportLog(); importLog.setImportTime(DateUtils.getNowDate()); importLog.setFileName("调度单导入文件"); // 这里需要根据实际情况获取文件名 importLog.setOperator(SecurityUtils.getUsername()); importLog.setCreateBy(SecurityUtils.getUsername()); importLog.setCreateTime(DateUtils.getNowDate()); for (TmsDispatchOrderImport tmsDispatchOrderImport : list){ try { String s = verRequired(line, tmsDispatchOrderImport); if (s != null){ throw new ServiceException(s); } TmsDispatchOrder tmsDispatchOrder = new TmsDispatchOrder(); String projectName = tmsDispatchOrderImport.getProjectName(); TmsProject tmsProject = tmsProjectMapper.selectOne(new LambdaQueryWrapper(). eq(TmsProject::getProjectName, projectName) .last("limit 1")); if (tmsProject == null){ throw new ServiceException("第"+line+"行项目不存在!"); } TransportRouteVi transportRouteVi = transportRouteViMapper.selectOne(new LambdaQueryWrapper() .eq(TransportRouteVi::getTransportRoute, tmsDispatchOrderImport.getTransportLine()) .eq(TransportRouteVi::getProjectId, tmsProject.getId()) .eq(TransportRouteVi::getCustomerId, tmsProject.getRelatedCustomerId()) .eq(TransportRouteVi::getVehicleType, tmsDispatchOrderImport.getRequiredVehicleTypes()) .last("limit 1") ); if (transportRouteVi == null){ throw new ServiceException("第"+line+"行线路信息不存在!"); } tmsDispatchOrder.setQuoteDetailId(transportRouteVi.getQuoteDetailId()); tmsDispatchOrder.setTransportLine(transportRouteVi.getTransportRoute()); tmsDispatchOrder.setStartRegionCode(transportRouteVi.getStartRegionCode()); tmsDispatchOrder.setEndRegionCode(transportRouteVi.getEndRegionCode()); tmsDispatchOrder.setProjectName(transportRouteVi.getProjectName()); tmsDispatchOrder.setProjectId(transportRouteVi.getProjectId()); // 关联客户 tmsDispatchOrder.setCustomerId(transportRouteVi.getCustomerId()); tmsDispatchOrder.setCustomerName(transportRouteVi.getCustomerFullName()); tmsDispatchOrder.setCustomerCode(transportRouteVi.getCustomerCode()); tmsDispatchOrder.setContractId(transportRouteVi.getContractId()); tmsDispatchOrder.setContractName(transportRouteVi.getContractName()); tmsDispatchOrder.setRequiredVehicleTypes(tmsDispatchOrderImport.getRequiredVehicleTypes()); tmsDispatchOrder.setQuotePlanId(transportRouteVi.getQuotePlanId()); tmsDispatchOrder.setOrderType(Integer.valueOf(tmsDispatchOrderImport.getOrderType())); tmsDispatchOrder.setIsCustoms(Integer.valueOf(tmsDispatchOrderImport.getIsCustoms())); tmsDispatchOrder.setIsLoad(Integer.valueOf(tmsDispatchOrderImport.getIsLoad())); tmsDispatchOrder.setIsUrgent(Integer.valueOf(tmsDispatchOrderImport.getIsUrgent())); tmsDispatchOrder.setOrderTime(tmsDispatchOrderImport.getOrderTime()); tmsDispatchOrder.setLatestDeparture(tmsDispatchOrderImport.getLatestDeparture()); tmsDispatchOrder.setLatestArrival(tmsDispatchOrderImport.getLatestArrival()); tmsDispatchOrder.setOperationMode(Integer.valueOf(tmsDispatchOrderImport.getOperationMode())); if (tmsDispatchOrder.getOperationMode() == 0){ tmsDispatchOrder.setCommissionModel(Integer.valueOf(tmsDispatchOrderImport.getCommissionModel())); } else { TmsServiceProvider tmsServiceProvider = tmsServiceProviderMapper.selectOne(new LambdaQueryWrapper(). eq(TmsServiceProvider::getServiceName, tmsDispatchOrderImport.getVehicleProviderName()) .last("limit 1") ); if (tmsServiceProvider == null){ throw new ServiceException("第"+line+"行车辆服务商不存在!"); } tmsDispatchOrder.setVehicleProviderId(tmsServiceProvider.getId()); tmsDispatchOrder.setVehicleProviderName(tmsServiceProvider.getServiceName()); } TmsDriver tmsDriver = tmsDriverMapper.selectOne(new LambdaQueryWrapper(). eq(TmsDriver::getDriverName, tmsDispatchOrderImport.getMainDriverName()) .last("limit 1") ); if (tmsDriver == null){ throw new ServiceException("第"+line+"行主驾驶员不存在!"); } tmsDispatchOrder.setMainDriverId(tmsDriver.getId()); tmsDispatchOrder.setMainDriverName(tmsDriver.getDriverName()); if (!StringUtils.isEmpty(tmsDispatchOrderImport.getAssistantDriverName())){ TmsDriver tmsDriver1 = tmsDriverMapper.selectOne(new LambdaQueryWrapper(). eq(TmsDriver::getDriverName, tmsDispatchOrderImport.getAssistantDriverName()) .last("limit 1") ); if (tmsDriver1 != null){ tmsDispatchOrder.setAssistantDriverId(tmsDriver1.getId()); tmsDispatchOrder.setAssistantDriverName(tmsDriver1.getDriverName()); } } TmsVehicle tmsVehicle = tmsVehicleMapper.selectOne(new LambdaQueryWrapper() .eq(TmsVehicle::getLicensePlate, tmsDispatchOrderImport.getLicensePlate()) .last("limit 1") ); if (tmsVehicle == null){ throw new ServiceException("第"+line+"行车牌号不存在!"); } tmsDispatchOrder.setVehicleId(tmsVehicle.getId()); tmsDispatchOrder.setLicensePlate(tmsVehicle.getLicensePlate()); tmsDispatchOrder.setActualVehicleType(tmsVehicle.getVehicleType()); TmsConsignor shipper = tmsConsignorMapper.selectOne(new LambdaQueryWrapper() .eq(TmsConsignor::getConsignorCode, tmsDispatchOrderImport.getShipperRegionLabel()) .eq(TmsConsignor::getCustomerId, tmsDispatchOrder.getCustomerId()) .last("limit 1") ); if (shipper == null){ throw new ServiceException("第"+line+"行装货点不存在!"); } tmsDispatchOrder.setShipperId(shipper.getId()); tmsDispatchOrder.setShipperName(shipper.getConsignorName()); tmsDispatchOrder.setShipperRegionLabel(shipper.getRegionLabel()); tmsDispatchOrder.setShipperAddress(shipper.getAddressDetail()); tmsDispatchOrder.setShipperMobile(shipper.getContactPhone()); tmsDispatchOrder.setShipperRegionCode(shipper.getRegion()); TmsConsignor receiver = tmsConsignorMapper.selectOne(new LambdaQueryWrapper() .eq(TmsConsignor::getConsignorCode, tmsDispatchOrderImport.getReceiverRegionLabel()) .eq(TmsConsignor::getCustomerId, tmsDispatchOrder.getCustomerId()) .last("limit 1") ); if (receiver == null){ throw new ServiceException("第"+line+"行卸货地不存在!"); } tmsDispatchOrder.setReceiverId(receiver.getId()); tmsDispatchOrder.setReceiverName(receiver.getConsignorName()); tmsDispatchOrder.setReceiverRegionLabel(receiver.getRegionLabel()); tmsDispatchOrder.setReceiverAddress(receiver.getAddressDetail()); tmsDispatchOrder.setReceiverMobile(receiver.getContactPhone()); tmsDispatchOrder.setReceiverRegionCode(receiver.getRegion()); if (!StringUtils.isEmpty(tmsDispatchOrderImport.getContainerNo())){ TmsContainer tmsContainer = tmsContainerMapper.selectOne(new LambdaQueryWrapper() .eq(TmsContainer::getContainerCode, tmsDispatchOrderImport.getContainerNo()) .last("limit 1") ); if (tmsContainer == null){ throw new ServiceException("第"+line+"行集装箱不存在!"); } tmsDispatchOrder.setContainerId(tmsContainer.getId()); tmsDispatchOrder.setContainerNo(tmsContainer.getContainerCode()); } if (!StringUtils.isEmpty(tmsDispatchOrderImport.getShelfCode())){ TmsShelf tmsShelf = tmsShelfMapper.selectOne(new LambdaQueryWrapper() .eq(TmsShelf::getShelfCode, tmsDispatchOrderImport.getShelfCode()) .last("limit 1") ); if (tmsShelf == null){ throw new ServiceException("第"+line+"行托架不存在!"); } tmsDispatchOrder.setShelfId(tmsShelf.getId()); tmsDispatchOrder.setShelfCode(tmsShelf.getShelfCode()); } String noByKey = systemDataNoService.getNoByKey(SystemDataNoEnum.DL); tmsDispatchOrder.setDispatchNo(noByKey); tmsDispatchOrder.setCreateBy(SecurityUtils.getUsername()); tmsDispatchOrder.setCreateTime(DateUtils.getNowDate()); tmsDispatchOrderMapper.insertTmsDispatchOrder(tmsDispatchOrder); }catch (Exception e) { failureNum++; String msg = "
" + "调度单第"+line+"行导入失败:"; failureMsg.append(msg + e.getMessage()); // 记录失败说明,包含行号和失败原因 failureDescription.append("第" + line + "行:" + e.getMessage()).append("\n"); log.error(msg, e); }finally { line++; } } // 设置导入日志的统计信息 importLog.setSuccessCount(list.size() - failureNum); importLog.setFailureCount(failureNum); importLog.setFailureDescription(failureDescription.toString()); // 保存导入日志 try { tmsDispatchOrderImportLogService.insertTmsDispatchOrderImportLog(importLog); } catch (Exception e) { log.error("保存导入日志失败:", e); } if (failureNum > 0) { failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); throw new ServiceException(failureMsg.toString()); } else { successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + list.size() + " 条"); } return successMsg.toString() ; } /** * 新增调度单管理 * * @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()); int result = tmsDispatchOrderMapper.insertTmsDispatchOrder(tmsDispatchOrder); if (result > 0) { TmsDispatchOrderLog log = new TmsDispatchOrderLog(); log.setHeadId(tmsDispatchOrder.getId()); log.setCreateBy(SecurityUtils.getUsername()); log.setCreateTime(DateUtils.getNowDate()); log.setNode("新增调度单"); tmsDispatchOrderLogService.insertTmsDispatchOrderLog(log); } return result; } @Override public int insertTmsDispatchOrder2(TmsDispatchOrder tmsDispatchOrder) { String noByKey = systemDataNoService.getNoByKey(SystemDataNoEnum.DL); tmsDispatchOrder.setDispatchNo(noByKey); tmsDispatchOrder.setCreateBy("AGENTS"); 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()); int result = tmsDispatchOrderMapper.updateTmsDispatchOrder(tmsDispatchOrder); if (result > 0) { TmsDispatchOrderLog log = new TmsDispatchOrderLog(); log.setHeadId(tmsDispatchOrder.getId()); log.setCreateBy(SecurityUtils.getUsername()); log.setCreateTime(DateUtils.getNowDate()); log.setNode("编辑调度单"); tmsDispatchOrderLogService.insertTmsDispatchOrderLog(log); } return result; } @Override public int updateTmsDispatchOrder2(TmsDispatchOrder tmsDispatchOrder) { tmsDispatchOrder.setUpdateBy(SecurityUtils.getUsername()); tmsDispatchOrder.setUpdateTime(DateUtils.getNowDate()); int result = tmsDispatchOrderMapper.updateTmsDispatchOrder(tmsDispatchOrder); if (result > 0) { TmsDispatchOrderLog log = new TmsDispatchOrderLog(); log.setHeadId(tmsDispatchOrder.getId()); log.setCreateBy(SecurityUtils.getUsername()); log.setCreateTime(DateUtils.getNowDate()); log.setNode("填写实际运输记录"); tmsDispatchOrderLogService.insertTmsDispatchOrderLog(log); } return result; } @Override public int updateTmsDispatchOrder(YpdddjDispatchOrderVo dispatchOrderVo) { return tmsDispatchOrderMapper.update(new LambdaUpdateWrapper() .in(TmsDispatchOrder::getDispatchNo,dispatchOrderVo.getDispatchNos()) .set(dispatchOrderVo.getShipperId()!=null,TmsDispatchOrder::getShipperId,dispatchOrderVo.getShipperId()) .set(StringUtils.isNotEmpty(dispatchOrderVo.getShipperName()),TmsDispatchOrder::getShipperName,dispatchOrderVo.getShipperName()) .set(StringUtils.isNotEmpty(dispatchOrderVo.getShipperRegionLabel()),TmsDispatchOrder::getShipperRegionLabel,dispatchOrderVo.getShipperRegionLabel()) .set(StringUtils.isNotEmpty(dispatchOrderVo.getShipperAddress()),TmsDispatchOrder::getShipperAddress,dispatchOrderVo.getShipperAddress()) .set(StringUtils.isNotEmpty(dispatchOrderVo.getShipperMobile()),TmsDispatchOrder::getShipperMobile,dispatchOrderVo.getShipperMobile()) .set(StringUtils.isNotEmpty(dispatchOrderVo.getShipperRegionCode()),TmsDispatchOrder::getShipperRegionCode,dispatchOrderVo.getShipperRegionCode()) .set(dispatchOrderVo.getReceiverId()!=null,TmsDispatchOrder::getReceiverId,dispatchOrderVo.getReceiverId()) .set(StringUtils.isNotEmpty(dispatchOrderVo.getReceiverName()),TmsDispatchOrder::getReceiverName,dispatchOrderVo.getReceiverName()) .set(StringUtils.isNotEmpty(dispatchOrderVo.getReceiverRegionLabel()),TmsDispatchOrder::getReceiverRegionLabel,dispatchOrderVo.getReceiverRegionLabel()) .set(StringUtils.isNotEmpty(dispatchOrderVo.getReceiverAddress()),TmsDispatchOrder::getReceiverAddress,dispatchOrderVo.getReceiverAddress()) .set(StringUtils.isNotEmpty(dispatchOrderVo.getReceiverMobile()),TmsDispatchOrder::getReceiverMobile,dispatchOrderVo.getReceiverMobile()) .set(StringUtils.isNotEmpty(dispatchOrderVo.getReceiverRegionCode()),TmsDispatchOrder::getReceiverRegionCode,dispatchOrderVo.getReceiverRegionCode()) .set(TmsDispatchOrder::getUpdateBy,SecurityUtils.getUsername()) .set(TmsDispatchOrder::getUpdateTime,DateUtils.getNowDate()) ); } //承运单打印 @Override public int printDispatchOrder(TmsDispatchOrder tmsDispatchOrder) { int result = tmsDispatchOrderMapper.update(null,new LambdaUpdateWrapper() .eq(TmsDispatchOrder::getId,tmsDispatchOrder.getId()) .set(TmsDispatchOrder::getIsPrint,0) .setSql("print_count = IFNULL(print_count, 0) + 1") .set(TmsDispatchOrder::getPrintTime,new Date()) .set(TmsDispatchOrder::getPrintBy,SecurityUtils.getUsername()) .set(TmsDispatchOrder::getSixLinkNo,tmsDispatchOrder.getSixLinkNo()) .set(TmsDispatchOrder::getPortName,tmsDispatchOrder.getPortName()) .set(TmsDispatchOrder::getBillNo,tmsDispatchOrder.getBillNo()) .set(TmsDispatchOrder::getTerminalName,tmsDispatchOrder.getTerminalName()) .set(TmsDispatchOrder::getCargoName,tmsDispatchOrder.getCargoName()) .set(TmsDispatchOrder::getPieceCount,tmsDispatchOrder.getPieceCount()) .set(TmsDispatchOrder::getWeight,tmsDispatchOrder.getWeight()) .set(TmsDispatchOrder::getContactName,tmsDispatchOrder.getContactName()) .set(TmsDispatchOrder::getContactPhone,tmsDispatchOrder.getContactPhone()) ); if (result > 0) { TmsDispatchOrderLog log = new TmsDispatchOrderLog(); log.setHeadId(tmsDispatchOrder.getId()); log.setCreateBy(SecurityUtils.getUsername()); log.setCreateTime(DateUtils.getNowDate()); log.setNode("承运单打印"); tmsDispatchOrderLogService.insertTmsDispatchOrderLog(log); } return result; } /** * 修改调度单管理[批量] * * @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.getRequiredVehicleTypes(); // 出发路线 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) .likeRight(TmsQuoteDetail::getStartRegionCode, shipperRegionCode) .likeRight(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 tmsPayableFeeItems = 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) .likeRight(TmsQuoteDetail::getStartRegionCode, shipperRegionCode) .likeRight(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()+"未维护应付运费报价,请维护数据后再重新生成"); } TmsPayableFeeItem tmsPayableFeeItem = new TmsPayableFeeItem(); tmsPayableFeeItem.setFeeType(0); tmsPayableFeeItem.setFeeName("运费"); tmsPayableFeeItem.setTypeId(tmsQuoteDetail.getId()); tmsPayableFeeItem.setRegisterAmount(tmsQuoteDetail.getFreightPrice()); tmsPayableFeeItem.setRegisterTime(tmsDispatchOrder.getConfirmTime()); tmsPayableFeeItem.setCurrency(tmsQuoteDetail.getCurrency()); tmsPayableFeeItem.setRowKey(IdUtil.objectId()); tmsPayableFeeItem.setServiceProviderId(vehicleProviderId); tmsPayableFeeItem.setServiceProviderName(tmsDispatchOrder.getVehicleProviderName()); tmsPayableFeeItem.setServiceProviderType("0"); tmsPayableFeeItems.add(tmsPayableFeeItem); } // 2、 获取实报实销费用 List tmsFinanceDetails = tmsFinanceDetailService.selectTmsFinanceDetailList(new TmsFinanceDetail() {{ setDispatchOrderId(tmsDispatchOrder.getId()); setIsYF(1); }}); if (tmsFinanceDetails != null && !tmsFinanceDetails.isEmpty()){ tmsFinanceDetails.forEach(tmsFinanceDetail -> { TmsPayableFeeItem tmsPayableFeeItem = new TmsPayableFeeItem(); tmsPayableFeeItem.setFeeType(2); String feeName = sysDictDataService.selectDictLabel("fee_type", tmsFinanceDetail.getFeeType()); tmsPayableFeeItem.setFeeName(feeName); tmsPayableFeeItem.setTypeId(tmsFinanceDetail.getId()); tmsPayableFeeItem.setRegisterAmount(tmsFinanceDetail.getYfPrice()); tmsPayableFeeItem.setRegisterTime(tmsFinanceDetail.getUpdateTime()); tmsPayableFeeItem.setCurrency(tmsFinanceDetail.getYfCurrency()); tmsPayableFeeItem.setRowKey(IdUtil.objectId()); tmsPayableFeeItem.setServiceProviderId(tmsFinanceDetail.getYfServiceProviderId()); tmsPayableFeeItem.setServiceProviderName(tmsFinanceDetail.getYfServiceProviderName()); tmsPayableFeeItem.setServiceProviderType(tmsFinanceDetail.getYfServiceProviderType()); tmsPayableFeeItems.add(tmsPayableFeeItem); }); } // 3、 获取报价费用 // tmsDispatchOrder.is List tmsQuoteFees = tmsQuoteFeeService.selectTmsQuoteFeeList(new TmsQuoteFee() {{ setDispatchId(tmsDispatchOrder.getId()); setIsYF(1); }}); if (tmsQuoteFees != null && !tmsQuoteFees.isEmpty()){ tmsQuoteFees.forEach(item -> { TmsPayableFeeItem tmsPayableFeeItem = new TmsPayableFeeItem(); tmsPayableFeeItem.setFeeType(1); tmsPayableFeeItem.setFeeName(item.getFreeName()); tmsPayableFeeItem.setTypeId(item.getId()); tmsPayableFeeItem.setRegisterAmount(item.getYfSum()); tmsPayableFeeItem.setRegisterTime(item.getCreateTime()); tmsPayableFeeItem.setCurrency(item.getYfCurrency()); tmsPayableFeeItem.setRowKey(IdUtil.objectId()); tmsPayableFeeItem.setServiceProviderId(item.getServiceProviderId()); tmsPayableFeeItem.setServiceProviderName(getServiceProviderName(item.getServiceProviderType(),item.getServiceProviderId())); tmsPayableFeeItem.setServiceProviderType(item.getServiceProviderType()); tmsPayableFeeItems.add(tmsPayableFeeItem); }); } tmsDispatchOrder.setTmsPayableFeeItems(tmsPayableFeeItems); }); } List tmsPayableFeeList = new ArrayList<>(); if (tmsDispatchOrders != null && !tmsDispatchOrders.isEmpty()){ tmsDispatchOrders.forEach(item -> { List tmsPayableFeeItems = item.getTmsPayableFeeItems(); Map> map = tmsPayableFeeItems.stream() .collect(Collectors.groupingBy(cItem -> cItem.getServiceProviderId() + "_" + cItem.getServiceProviderType() )); map.forEach((customerId, customerItems) -> { TmsPayableFeeItem tmsPayableFeeItem = customerItems.get(0); TmsPayableFee tmsPayableFee = new TmsPayableFee(); tmsPayableFee.setDispatchId(item.getId()); tmsPayableFee.setDispatchNo(item.getDispatchNo()); tmsPayableFee.setServiceProviderId(tmsPayableFeeItem.getServiceProviderId()); tmsPayableFee.setServiceProviderName(tmsPayableFeeItem.getServiceProviderName()); tmsPayableFee.setServiceProviderType(tmsPayableFeeItem.getServiceProviderType()); tmsPayableFee.setProjectId(item.getProjectId()); tmsPayableFee.setProjectName(item.getProjectName()); BigDecimal totalRmbAmount = customerItems.stream() .filter(cItem -> "RMB".equals(cItem.getCurrency())) .map(TmsPayableFeeItem::getRegisterAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); tmsPayableFee.setPayableRmbAmount(totalRmbAmount); BigDecimal totalHkbAmount = customerItems.stream() .filter(cItem -> "HKD".equals(cItem.getCurrency())) .map(TmsPayableFeeItem::getRegisterAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); tmsPayableFee.setPayableHkbAmount(totalHkbAmount); tmsPayableFee.setDispatchConfirmTime(item.getConfirmTime()); tmsPayableFee.setStatus(0); tmsPayableFee.setPayableFeeItems(customerItems); tmsPayableFeeList.add(tmsPayableFee); }); }); } return tmsPayableFeeList; } @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 tmsPayableFeeList = initYFGenerate(ids); Set dispatchIds = tmsPayableFeeList.stream().map(TmsPayableFee::getDispatchId).collect(Collectors.toSet()); // 1、修改调度 tmsDispatchOrderMapper.update(new LambdaUpdateWrapper() .in(TmsDispatchOrder::getId, dispatchIds) .set(TmsDispatchOrder::getAccountsPayableStatus, 1) .set(TmsDispatchOrder::getUpdateBy, SecurityUtils.getUsername()) .set(TmsDispatchOrder::getUpdateTime, DateUtils.getNowDate()) ); // 2、生成应收单 tmsPayableFeeList.forEach(tmsPayableFee ->{ String noByKey = systemDataNoService.getNoByKey(SystemDataNoEnum.YFFY); tmsPayableFee.setSystemNo(noByKey); tmsPayableFee.setCostGenerateTime(new Date()); tmsPayableFee.setCreateBy(SecurityUtils.getUsername()); tmsPayableFeeMapper.insertTmsPayableFee(tmsPayableFee); List customerItems = tmsPayableFee.getPayableFeeItems(); customerItems.forEach(kItem -> { kItem.setHeadId(tmsPayableFee.getId()); }); tmsPayableFeeItemMapper.insertTmsPayableFeeItemBatch(customerItems); }); 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(); } public String getServiceProviderName(String serviceProviderType,Integer serviceProviderId){ if ("0".equals(serviceProviderType)){ TmsServiceProvider tmsServiceProvider = tmsServiceProviderMapper.selectTmsServiceProviderById(serviceProviderId); return tmsServiceProvider.getServiceName(); } else if ("1".equals(serviceProviderType)){ TmsCustomsServiceProvider tmsCustomsServiceProvider = tmsCustomsServiceProviderMapper.selectTmsCustomsServiceProviderById(serviceProviderId); return tmsCustomsServiceProvider.getServiceName(); } else if ("2".equals(serviceProviderType)){ TmsLoadingServiceProvider tmsLoadingServiceProvider = tmsLoadingServiceProviderMapper.selectTmsLoadingServiceProviderById(serviceProviderId); return tmsLoadingServiceProvider.getServiceName(); } return null; } @Override public List selectDpData() { return tmsDispatchOrderMapper.selectselectDpData(); } @Override public DpDriverDispatchItemVo selectDataByNo(String no) { return tmsDispatchOrderMapper.selectDataByNo(no); } @Override public List selectItineraryLog() { return tmsDispatchOrderMapper.selectItineraryLog(); } @Override public TmsDispatchOrder getLastLicensePlateByDriverName(String driverName) { return tmsDispatchOrderMapper.selectOne(new LambdaQueryWrapper() .eq(TmsDispatchOrder::getMainDriverName, driverName) .orderByDesc(TmsDispatchOrder::getCreateTime) .last("limit 1") ); } }