feat: 新增 yudao-module-asset 车辆管理模块(独立微服务)

- 10张数据表 DDL(vehicle/licence/insurance/equipment/ext/driver/device/type/model)
- 75个Java文件:DO/VO/Mapper/Service/Controller 完整实现
- AssetServerApplication 独立微服务启动类(端口48084)
- 车辆状态机、VIN/车牌唯一性校验、合同占用校验
- 导入/导出 Excel 功能
- 编译通过
This commit is contained in:
时生亮
2026-02-26 13:09:45 +08:00
parent b8a213849c
commit 0a0a8a0b90
83 changed files with 5045 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>cn.iocoder.cloud</groupId>
<artifactId>yudao-module-asset</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yudao-module-asset-api</artifactId>
<packaging>jar</packaging>
<name>${project.artifactId}</name>
<description>
asset 模块 API暴露给其它模块调用
</description>
<dependencies>
<dependency>
<groupId>cn.iocoder.cloud</groupId>
<artifactId>yudao-common</artifactId>
</dependency>
<!-- 参数校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,50 @@
package cn.iocoder.yudao.module.asset.enums;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
/**
* Asset 错误码枚举类
* asset 系统,使用 1-030-000-000 段
*/
public interface ErrorCodeConstants {
// ========== 车辆管理 1-030-001-000 ==========
ErrorCode VEHICLE_NOT_EXISTS = new ErrorCode(1_030_001_000, "车辆不存在");
ErrorCode VEHICLE_VIN_DUPLICATE = new ErrorCode(1_030_001_001, "车架号VIN已存在");
ErrorCode VEHICLE_PLATE_NUMBER_DUPLICATE = new ErrorCode(1_030_001_002, "车牌号已存在");
ErrorCode VEHICLE_STATUS_TRANSITION_INVALID = new ErrorCode(1_030_001_003, "车辆状态流转不合法");
ErrorCode VEHICLE_NOT_AVAILABLE = new ErrorCode(1_030_001_004, "车辆不是空闲状态,无法锁定");
ErrorCode VEHICLE_CONTRACT_BINDIED = new ErrorCode(1_030_001_005, "车辆正在合同中使用,无法删除");
ErrorCode VEHICLE_DEVICE_BINDIED = new ErrorCode(1_030_001_006, "车辆有绑定设备,请先解绑");
// ========== 司机管理 1-030-002-000 ==========
ErrorCode DRIVER_NOT_EXISTS = new ErrorCode(1_030_002_000, "司机不存在");
// ========== 设备管理 1-030-003-000 ==========
ErrorCode DEVICE_NOT_EXISTS = new ErrorCode(1_030_003_000, "设备不存在");
ErrorCode DEVICE_IMEI_DUPLICATE = new ErrorCode(1_030_003_001, "设备IMEI已存在");
ErrorCode DEVICE_BINDIED = new ErrorCode(1_030_003_002, "设备已绑定");
ErrorCode DEVICE_NOT_BINDIED = new ErrorCode(1_030_003_003, "设备未绑定");
// ========== 车辆证照 1-030-025-000 ==========
ErrorCode VEHICLE_LICENCE_NOT_EXISTS = new ErrorCode(1_030_025_000, "车辆证照不存在");
// ========== 车辆保险 1-030-026-000 ==========
ErrorCode VEHICLE_INSURANCE_NOT_EXISTS = new ErrorCode(1_030_026_000, "车辆保险不存在");
// ========== 车辆后装设备 1-030-027-000 ==========
ErrorCode VEHICLE_EQUIPMENT_NOT_EXISTS = new ErrorCode(1_030_027_000, "车辆后装设备不存在");
// ========== 车辆扩展 1-030-028-000 ==========
ErrorCode VEHICLE_EXT_NOT_EXISTS = new ErrorCode(1_030_028_000, "车辆扩展信息不存在");
// ========== 司机车辆绑定 1-030-029-000 ==========
ErrorCode DRIVER_VEHICLE_NOT_EXISTS = new ErrorCode(1_030_029_000, "司机车辆绑定不存在");
// ========== 车辆型号 1-030-030-000 ==========
ErrorCode VEHICLE_MODEL_NOT_EXISTS = new ErrorCode(1_030_030_000, "车辆型号不存在");
// ========== 车辆类型 1-030-031-000 ==========
ErrorCode VEHICLE_TYPE_NOT_EXISTS = new ErrorCode(1_030_031_000, "车辆类型不存在");
}

View File

@@ -0,0 +1,51 @@
package cn.iocoder.yudao.module.asset.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.*;
/**
* 车辆租赁状态枚举
*/
@Getter
@AllArgsConstructor
public enum VehicleRentStatusEnum {
IDLE(0, "空闲"),
RENTED(1, "在租"),
RETURNING(2, "还车中"),
REPAIRING(3, "维修中"),
STANDBY(4, "备车"),
SCRAPPED(5, "已报废");
private final Integer status;
private final String name;
/**
* 合法流转矩阵
* key: 当前状态, value: 允许流转到的目标状态集合
*/
private static final Map<Integer, Set<Integer>> TRANSITIONS = new HashMap<>();
static {
TRANSITIONS.put(0, Set.of(1, 3, 4, 5)); // 空闲 → 在租/维修/备车/报废
TRANSITIONS.put(1, Set.of(2, 3)); // 在租 → 还车中/维修中
TRANSITIONS.put(2, Set.of(0)); // 还车中 → 空闲
TRANSITIONS.put(3, Set.of(0, 1)); // 维修中 → 空闲/在租
TRANSITIONS.put(4, Set.of(0, 1)); // 备车 → 空闲/在租
TRANSITIONS.put(5, Collections.emptySet()); // 报废=终态
}
/**
* 判断状态流转是否合法
*
* @param from 当前状态
* @param to 目标状态
* @return 是否合法
*/
public static boolean isValidTransition(Integer from, Integer to) {
Set<Integer> allowed = TRANSITIONS.get(from);
return allowed != null && allowed.contains(to);
}
}