package com.ruoyi.tms.service.impl; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.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.ISysUserService; import com.ruoyi.system.service.ISystemDataNoService; import com.ruoyi.tms.domain.*; import com.ruoyi.tms.domain.vo.DriverDispatchVo; import com.ruoyi.tms.mapper.TmsFinanceMapper; import com.ruoyi.tms.mapper.TmsQuoteDetailMapper; import com.ruoyi.tms.mapper.TmsQuotePlanMapper; import com.ruoyi.tms.service.ITmsDriverDispatchService; import com.ruoyi.tms.service.ITmsFinanceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.stereotype.Service; import org.springframework.scheduling.annotation.Async; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.core.service.BaseService; import com.ruoyi.tms.mapper.TmsDispatchOrderMapper; import com.ruoyi.tms.service.ITmsDispatchOrderService; 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; /** * 查询调度单管理 * * @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.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.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) ); 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 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 -> { // 客户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 AjaxResult generateTmsDispatchOrder(List ids) { List tmsDispatchOrders = initGenerate(ids); 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(); } }