|
|
|
|
@ -18,6 +18,11 @@ import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 车辆全生命周期报表Service业务层处理。
|
|
|
|
|
* <p>
|
|
|
|
|
* 本服务以车牌号(carNo)为唯一入口,通过 {@link #buildAuthorizedCar(CarLifecycleQuery)} 完成:
|
|
|
|
|
* 1)参数校验;2)车辆存在性与数据权限校验;3)将 carId 回写到查询对象中,供后续聚合查询复用。
|
|
|
|
|
* 所有对外查询方法均标注 {@link DataScope},确保与车辆列表页(system:car:view)保持一致的部门/用户权限过滤。
|
|
|
|
|
* </p>
|
|
|
|
|
*/
|
|
|
|
|
@Service
|
|
|
|
|
public class BaseCarLifecycleServiceImpl implements IBaseCarLifecycleService
|
|
|
|
|
@ -27,6 +32,18 @@ public class BaseCarLifecycleServiceImpl implements IBaseCarLifecycleService
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询车辆生命周期概要。
|
|
|
|
|
* <p>
|
|
|
|
|
* 作为弹窗“首屏”数据,一次性返回:
|
|
|
|
|
* - 车辆主档概要(车牌号、车队、线路、车型、最近录入里程)
|
|
|
|
|
* - 当前装车轮胎快照(mountedTyres)
|
|
|
|
|
* - 最近事件时间线(recentEvents)
|
|
|
|
|
* - 各维度记录总数量(installCount / maintenanceCount / checkCount / mileageCount)
|
|
|
|
|
* 各子列表具体明细需调用对应的独立分页接口获取,避免首屏数据量过大。
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @param query 查询参数,必须包含非空且长度合法的 carNo
|
|
|
|
|
* @return 车辆生命周期聚合DTO,包含概要及计数
|
|
|
|
|
* @throws ServiceException 车牌号为空、超长、或车辆不存在/无权限时抛出
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@DataScope(deptAlias = "d", userAlias = "u")
|
|
|
|
|
@ -45,7 +62,15 @@ public class BaseCarLifecycleServiceImpl implements IBaseCarLifecycleService
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询车辆装卸历史。
|
|
|
|
|
* 查询车辆轮胎装卸历史(分页/全量)。
|
|
|
|
|
* <p>
|
|
|
|
|
* 返回该车辆历史上所有轮胎安装与卸下记录,按操作时间倒序排列。
|
|
|
|
|
* 展示字段包括:轮胎RFID、轮胎自编号、品牌型号、轮位、操作类型(安装/卸下)、操作里程、花纹深度、操作时间等。
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @param query 查询参数,内部通过 buildAuthorizedCar 回填 carId
|
|
|
|
|
* @return 装卸记录列表;无记录时返回空列表而非 null
|
|
|
|
|
* @throws ServiceException 车辆不存在或无权限访问时抛出
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@DataScope(deptAlias = "d", userAlias = "u")
|
|
|
|
|
@ -56,7 +81,16 @@ public class BaseCarLifecycleServiceImpl implements IBaseCarLifecycleService
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询车辆维保工单历史。
|
|
|
|
|
* 查询车辆维保工单历史(分页/全量)。
|
|
|
|
|
* <p>
|
|
|
|
|
* 通过 {@code biz_maintenance_order.plate_number = carNo} 直接关联车辆,返回所有维保工单。
|
|
|
|
|
* 展示字段包括:工单编号、维保类型、修理厂、保养日期、工单状态、录入里程、上次里程、故障描述等。
|
|
|
|
|
* 数据按保养日期(maintain_date)倒序排列。
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @param query 查询参数,内部通过 buildAuthorizedCar 回填 carId
|
|
|
|
|
* @return 维保工单列表;无记录时返回空列表
|
|
|
|
|
* @throws ServiceException 车辆不存在或无权限访问时抛出
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@DataScope(deptAlias = "d", userAlias = "u")
|
|
|
|
|
@ -67,7 +101,16 @@ public class BaseCarLifecycleServiceImpl implements IBaseCarLifecycleService
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询车辆关联轮胎质检历史。
|
|
|
|
|
* 查询车辆关联轮胎质检历史(分页/全量)。
|
|
|
|
|
* <p>
|
|
|
|
|
* 车辆与质检记录无直接外键关联,需通过“该车辆曾装过的轮胎”间接查询:
|
|
|
|
|
* 以 record_tyre_install 中出现过且 car_no 匹配的记录为桥梁,找到对应轮胎在 record_check 中的质检记录。
|
|
|
|
|
* 展示字段包括:轮胎RFID、轮胎编号、品牌型号、质检结果、维保类型、里程、花纹深度、质检时间等。
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @param query 查询参数,内部通过 buildAuthorizedCar 回填 carId
|
|
|
|
|
* @return 质检记录列表;无记录时返回空列表
|
|
|
|
|
* @throws ServiceException 车辆不存在或无权限访问时抛出
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@DataScope(deptAlias = "d", userAlias = "u")
|
|
|
|
|
@ -78,7 +121,16 @@ public class BaseCarLifecycleServiceImpl implements IBaseCarLifecycleService
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询车辆关联轮胎里程历史。
|
|
|
|
|
* 查询车辆关联轮胎里程历史(分页/全量)。
|
|
|
|
|
* <p>
|
|
|
|
|
* 轮胎里程通过 record_tyre_mileage 记录,间接关联到车辆。
|
|
|
|
|
* 展示字段包括:轮胎RFID、轮胎编号、品牌、开始时间、结束时间、行驶里程、花纹深度等。
|
|
|
|
|
* 用于展示车辆使用过的各轮胎在其装车周期内的里程消耗情况。
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @param query 查询参数,内部通过 buildAuthorizedCar 回填 carId
|
|
|
|
|
* @return 轮胎里程记录列表;无记录时返回空列表
|
|
|
|
|
* @throws ServiceException 车辆不存在或无权限访问时抛出
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@DataScope(deptAlias = "d", userAlias = "u")
|
|
|
|
|
@ -88,6 +140,20 @@ public class BaseCarLifecycleServiceImpl implements IBaseCarLifecycleService
|
|
|
|
|
return baseCarLifecycleMapper.selectMileageList(query);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 构建受权车辆主档并回填查询条件。
|
|
|
|
|
* <p>
|
|
|
|
|
* 核心权限闸口:所有公开查询方法均先调用本方法。
|
|
|
|
|
* 1. 调用 {@link #validateQuery(CarLifecycleQuery)} 做基础参数校验;
|
|
|
|
|
* 2. 通过 Mapper 查询车辆主档,SQL 中已拼接 {@code DataScope} 部门/用户别名(d/u);
|
|
|
|
|
* 3. 若查询结果为 null,统一提示“车辆不存在或无权限访问”,防止攻击者通过接口枚举判断某车牌是否存在;
|
|
|
|
|
* 4. 将车辆主键 carId 回写到 query 对象,供后续子查询作为精确过滤条件,避免仅依赖字符串车牌号跨表查询带来的性能与歧义问题。
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @param query 生命周期查询参数对象
|
|
|
|
|
* @return 车辆主档概要DTO
|
|
|
|
|
* @throws ServiceException 参数非法、车辆不存在或无数据权限时抛出
|
|
|
|
|
*/
|
|
|
|
|
private CarLifecycleSummaryDTO buildAuthorizedCar(CarLifecycleQuery query)
|
|
|
|
|
{
|
|
|
|
|
validateQuery(query);
|
|
|
|
|
@ -101,6 +167,18 @@ public class BaseCarLifecycleServiceImpl implements IBaseCarLifecycleService
|
|
|
|
|
return car;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 校验生命周期查询参数。
|
|
|
|
|
* <p>
|
|
|
|
|
* 校验规则:
|
|
|
|
|
* 1. query 对象不能为 null,且 carNo 不能为空或空白字符;
|
|
|
|
|
* 2. 车牌号去除前后空格后,长度不得超过 50 字符(与数据库表 base_car.car_no 的 varchar(50) 定义保持一致);
|
|
|
|
|
* 3. 校验通过后将规范化后的车牌号(trim 后)重新设置回 query,避免后续 SQL 中因前后空格导致匹配失败。
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @param query 待校验的查询参数
|
|
|
|
|
* @throws ServiceException 校验不通过时抛出,携带明确错误提示
|
|
|
|
|
*/
|
|
|
|
|
private void validateQuery(CarLifecycleQuery query)
|
|
|
|
|
{
|
|
|
|
|
if (query == null || StringUtils.isBlank(query.getCarNo()))
|
|
|
|
|
|