package com.ruoyi.tms.service.impl; import java.io.File; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.*; import javax.annotation.Resource; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.uuid.Seq; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.tms.domain.*; import com.ruoyi.tms.mapper.*; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; 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.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.service.ITmsTripService; import com.ruoyi.common.core.text.Convert; /** * 行程Service业务层处理 * * @author ruoyi * @date 2025-11-13 */ @Service @Transactional(rollbackFor = Exception.class) public class TmsTripServiceImpl extends BaseService implements ITmsTripService { protected final Logger logger = LoggerFactory.getLogger(getClass()); @Resource private TmsTripMapper tmsTripMapper; @Resource private TmsDispatchOrderMapper tmsDispatchOrderMapper; @Autowired private ISysUserService userService; @Resource private TmsDriverDispatchMapper tmsDriverDispatchMapper; @Resource private TmsDriverMapper tmsDriverMapper; @Autowired private TmsVehicleServiceImpl tmsVehicleServiceImpl; @Resource private TmsCarKeyDispatchMapper tmsCarKeyDispatchMapper; @Autowired private RabbitTemplate rabbitTemplate; @Autowired private AsyncPdfService asyncPdfService; /** * 查询行程 * * @param id 行程ID * @return 行程 */ @DataSource(DataSourceType.SLAVE) @Override public TmsTrip selectTmsTripById(Integer id) { return tmsTripMapper.selectTmsTripById(id); } /** * 查询行程 记录数 * * @param tmsTrip 行程 * @return 行程集合 */ @DataSource(DataSourceType.SLAVE) @Override public int selectTmsTripCount(TmsTrip tmsTrip) { return tmsTripMapper.selectTmsTripCount(tmsTrip); } /** * 查询行程列表 * * @param tmsTrip 行程 * @return 行程 */ @DataSource(DataSourceType.SLAVE) @Override public List selectTmsTripList(TmsTrip tmsTrip) { return tmsTripMapper.selectTmsTripList(tmsTrip); } @Override public List tmsTripList(Integer dispatchId) { Integer deviceId = userService.getDeviceId(SecurityUtils.getUserId()); if (deviceId == null){ return null; } return tmsTripMapper.selectList(new LambdaQueryWrapper() .eq(TmsTrip::getDispatchOrderId,dispatchId) .eq(TmsTrip::getDriverId,deviceId) .orderByDesc(TmsTrip::getId) ); } /** * 查询行程列表 异步 导出 * * @param tmsTrip 行程 * @param exportKey 导出功能的唯一标识 * @return 行程集合 */ @DataSource(DataSourceType.SLAVE) @Async @Override public void export(TmsTrip tmsTrip,String exportKey) { super.export(TmsTrip.class,exportKey,"tmsTripData",(pageNum)->{ PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE); return selectTmsTripList(tmsTrip); }); } /** * 新增行程 * * @param tmsTrip 行程 * @return 结果 */ @Override public int insertTmsTrip(TmsTrip tmsTrip) throws Exception { Integer dispatchOrderId = tmsTrip.getDispatchOrderId(); TmsDispatchOrder tmsDispatchOrder = tmsDispatchOrderMapper.selectTmsDispatchOrderById(dispatchOrderId); if (tmsDispatchOrder == null){ throw new RuntimeException("未找到调度单数据"); } if (tmsDispatchOrder.getStatus() != 1 && tmsDispatchOrder.getStatus() != 2){ throw new RuntimeException("调度单数据状态异常"); } TmsDriver tmsDriver = tmsDriverMapper.selectTmsDriverById(tmsDispatchOrder.getMainDriverId()); if (tmsDriver == null){ throw new RuntimeException("未找到司机数据"); } tmsDispatchOrder.setStatus(2); tmsDispatchOrderMapper.updateTmsDispatchOrder(tmsDispatchOrder); tmsTrip.setDriverName(tmsDispatchOrder.getMainDriverName()); tmsTrip.setVehicleId(tmsDispatchOrder.getVehicleId()); tmsTrip.setVehicleNumber(tmsDispatchOrder.getLicensePlate()); tmsTrip.setCreateBy(SecurityUtils.getUsername()); tmsTrip.setCreateTime(DateUtils.getNowDate()); tmsTripMapper.insertTmsTrip(tmsTrip); if (StringUtils.isNotEmpty(tmsTrip.getSignImg())){ asyncPdfService.generateTripPdfAsync(tmsTrip,tmsDispatchOrder,tmsDriver); } // 完成身体检查 if (tmsTrip.getTripType() == 1){ // 添加 领钥匙 指令记录 TmsVehicle tmsVehicle = tmsVehicleServiceImpl.selectTmsVehicleById(tmsDispatchOrder.getVehicleId()); TmsCarKeyDispatch tmsCarKeyDispatch = new TmsCarKeyDispatch(); tmsCarKeyDispatch.setDispatchOrderId(dispatchOrderId); tmsCarKeyDispatch.setDispatchOrderNo(tmsDispatchOrder.getDispatchNo()); tmsCarKeyDispatch.setDriverId(tmsDriver.getId()); tmsCarKeyDispatch.setDriverMobile(tmsDriver.getMobile()); tmsCarKeyDispatch.setDriverName(tmsDriver.getDriverName()); tmsCarKeyDispatch.setVehicleId(tmsDispatchOrder.getVehicleId()); tmsCarKeyDispatch.setVehicleLicensePlate(tmsDispatchOrder.getLicensePlate()); tmsCarKeyDispatch.setVehicleCarKeyNo(tmsVehicle.getCarKeyNo()); LocalDateTime plus2Hours = LocalDateTime.now().plusHours(2); Date date = Date.from(plus2Hours.atZone(ZoneId.systemDefault()).toInstant()); tmsCarKeyDispatch.setCarKeyExpirationTime(date); tmsCarKeyDispatch.setStatus(0); tmsCarKeyDispatchMapper.insertTmsCarKeyDispatch(tmsCarKeyDispatch); sendCarKeyDelayMessage(tmsCarKeyDispatch.getId(), 2 * 60 * 60 * 1000L); } return 1; } /** * 发送延迟消息 * @param carKeyId car_key id * @param delayMillis 延迟毫秒数 */ public void sendCarKeyDelayMessage(Integer carKeyId, long delayMillis) { rabbitTemplate.convertAndSend( "car_key_delay_exchange", "car_key_delay", carKeyId, message -> { message.getMessageProperties().setExpiration(String.valueOf(delayMillis)); return message; } ); } @Override public AjaxResult submitDropHook(TmsTrip tmsTrip){ Integer dispatchOrderId = tmsTrip.getDispatchOrderId(); TmsDispatchOrder tmsDispatchOrder = tmsDispatchOrderMapper.selectTmsDispatchOrderById(dispatchOrderId); if (tmsDispatchOrder == null){ throw new RuntimeException("未找到调度单数据"); } if (tmsDispatchOrder.getStatus() != 6){ throw new RuntimeException("调度单数据状态异常"); } tmsDispatchOrderMapper.update( new LambdaUpdateWrapper() .eq(TmsDispatchOrder::getId, dispatchOrderId) .set(TmsDispatchOrder::getStatus, 7) .set(TmsDispatchOrder::getMainDriverId, null) .set(TmsDispatchOrder::getMainDriverName, null) .set(TmsDispatchOrder::getVehicleId, null) .set(TmsDispatchOrder::getLicensePlate, null) ); tmsDriverDispatchMapper.update( new LambdaUpdateWrapper() .eq(TmsDriverDispatch::getDispatchId, dispatchOrderId) .eq(TmsDriverDispatch::getDriverId, tmsDispatchOrder.getMainDriverId()) .set(TmsDriverDispatch::getStatus, 3) ); tmsTrip.setDriverName(tmsDispatchOrder.getMainDriverName()); tmsTrip.setVehicleId(tmsDispatchOrder.getVehicleId()); tmsTrip.setVehicleNumber(tmsDispatchOrder.getLicensePlate()); tmsTrip.setCreateBy(SecurityUtils.getUsername()); tmsTrip.setCreateTime(DateUtils.getNowDate()); tmsTripMapper.insertTmsTrip(tmsTrip); return AjaxResult.success(); } @Override public AjaxResult submitPickHook(TmsTrip tmsTrip){ Integer dispatchOrderId = tmsTrip.getDispatchOrderId(); TmsDispatchOrder tmsDispatchOrder = tmsDispatchOrderMapper.selectTmsDispatchOrderById(dispatchOrderId); if (tmsDispatchOrder == null){ throw new RuntimeException("未找到调度单数据"); } if (tmsDispatchOrder.getStatus() != 7){ throw new RuntimeException("调度单数据状态异常"); } Integer driverId = tmsTrip.getDriverId(); TmsDriver tmsDriver = tmsDriverMapper.selectTmsDriverById(driverId); TmsDriverDispatch driverDispatch = tmsDriverDispatchMapper.selectOne(new LambdaUpdateWrapper() .eq(TmsDriverDispatch::getDispatchId, dispatchOrderId) .eq(TmsDriverDispatch::getDriverId, driverId) .eq(TmsDriverDispatch::getStatus, 2) ); if (driverDispatch == null){ throw new RuntimeException("未找到关联数据"); } TmsVehicle tmsVehicle = tmsVehicleServiceImpl.selectTmsVehicleById(driverDispatch.getVehicleId()); tmsDispatchOrderMapper.update( new LambdaUpdateWrapper() .eq(TmsDispatchOrder::getId, dispatchOrderId) .set(TmsDispatchOrder::getStatus, 2) .set(TmsDispatchOrder::getMainDriverId, tmsDriver.getId()) .set(TmsDispatchOrder::getMainDriverName, tmsDriver.getDriverName()) .set(TmsDispatchOrder::getVehicleId, tmsVehicle.getId()) .set(TmsDispatchOrder::getLicensePlate, tmsVehicle.getLicensePlate()) ); tmsDriverDispatchMapper.update( new LambdaUpdateWrapper() .eq(TmsDriverDispatch::getDispatchId, dispatchOrderId) .eq(TmsDriverDispatch::getDriverId, tmsTrip.getDriverId()) .set(TmsDriverDispatch::getStatus, 4) ); tmsTrip.setVehicleId(tmsDispatchOrder.getVehicleId()); tmsTrip.setVehicleNumber(tmsDispatchOrder.getLicensePlate()); tmsTrip.setDriverName(tmsDriver.getDriverName()); tmsTrip.setCreateBy(SecurityUtils.getUsername()); tmsTrip.setCreateTime(DateUtils.getNowDate()); tmsTripMapper.insertTmsTrip(tmsTrip); return AjaxResult.success(); } /** * 新增行程[批量] * * @param tmsTrips 行程 * @return 结果 */ @Override public int insertTmsTripBatch(List tmsTrips) { int rows = tmsTripMapper.insertTmsTripBatch(tmsTrips); return rows; } /** * 修改行程 * * @param tmsTrip 行程 * @return 结果 */ @Override public int updateTmsTrip(TmsTrip tmsTrip) { tmsTrip.setUpdateTime(DateUtils.getNowDate()); return tmsTripMapper.updateTmsTrip(tmsTrip); } /** * 修改行程[批量] * * @param tmsTrips 行程 * @return 结果 */ @Override public int updateTmsTripBatch(List tmsTrips){ return tmsTripMapper.updateTmsTripBatch(tmsTrips); } /** * 删除行程对象 * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteTmsTripByIds(String ids) { return deleteTmsTripByIds(Convert.toIntArray(ids)); } /** * 删除行程对象 * * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteTmsTripByIds(Integer[] ids) { return tmsTripMapper.deleteTmsTripByIds(ids); } /** * 删除行程信息 * * @param id 行程ID * @return 结果 */ @Override public int deleteTmsTripById(Integer id) { return tmsTripMapper.deleteTmsTripById(id); } }