package com.ruoyi.tms.service.impl; import java.io.File; import java.math.BigDecimal; 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.baomidou.mybatisplus.extension.plugins.pagination.Page; 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) ); } @Override public Map tmsTripListPage(Integer dispatchId, Integer pageNum, Integer pageSize) { Integer deviceId = userService.getDeviceId(SecurityUtils.getUserId()); if (deviceId == null) { Map empty = new HashMap<>(); empty.put("rows", Collections.emptyList()); empty.put("total", 0); return empty; } LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .eq(TmsTrip::getDriverId, deviceId); // dispatchId 可选,不传时查该司机全部行程 if (dispatchId != null) { wrapper.eq(TmsTrip::getDispatchOrderId, dispatchId); } // 按行程时间倒序 wrapper.orderByDesc(TmsTrip::getTripTime); Page page = new Page<>(pageNum, pageSize); Page result = tmsTripMapper.selectPage(page, wrapper); Map map = new HashMap<>(); map.put("rows", result.getRecords()); map.put("total", result.getTotal()); return map; } /** * 查询行程列表 异步 导出 * * @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("调度单数据状态异常"); } TmsTrip tmsTrip1 = tmsTripMapper.selectOne(new LambdaQueryWrapper() .eq(TmsTrip::getDispatchOrderId, dispatchOrderId) .orderByDesc(TmsTrip::getId) .last("limit 1") ); if (tmsTrip1 != null){ BigDecimal currentOdometer = tmsTrip.getOdometer(); BigDecimal lastOdometer = tmsTrip1.getOdometer(); if (currentOdometer!=null && lastOdometer != null && currentOdometer.compareTo(lastOdometer) < 0) { throw new IllegalArgumentException("车辆里程数异常,当前里程必须大于上一行程"); } } TmsDriver tmsDriver = tmsDriverMapper.selectTmsDriverById(tmsDispatchOrder.getMainDriverId()); if (tmsDriver == null){ throw new RuntimeException("未找到司机数据"); } Integer status = tmsDispatchOrder.getStatus(); if (status == 1){ tmsDispatchOrder.setStatus(2); } if (tmsTrip.getTripType() == 8 || tmsTrip.getTripType() == 100){ if (status == 2){ tmsDispatchOrder.setStatus(3); tmsDispatchOrder.setOkTime(DateUtils.getNowDate()); tmsDispatchOrder.setUpdateBy(SecurityUtils.getUsername()); } } if (tmsTrip.getTripType() == 5){ tmsDispatchOrder.setIscc(tmsTrip.getIscc()); } if (tmsTrip.getTripType() == 100){ tmsDispatchOrder.setIsfk(0); } 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 && tmsDispatchOrder.getOperationMode() == 0){ // 添加 领钥匙 指令记录 TmsVehicle tmsVehicle = tmsVehicleServiceImpl.selectTmsVehicleById(tmsDispatchOrder.getVehicleId()); logger.info("添加 领钥匙 指令记录,{},{}",tmsDispatchOrder.getVehicleId(),tmsVehicle.getCarKeyNo()); 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); } }