-- ==================== 车辆管理表 - 数据库脚本 ====================
-- 作者：DBA
-- 日期：2026-03-12
-- 说明：车辆管理垂直分表设计（5张表）

-- ==================== 1. 修改车型参数表（添加公告型号） ====================
ALTER TABLE `asset_vehicle_model` 
  ADD COLUMN `notice_model` varchar(100) DEFAULT NULL COMMENT '车辆公告型号' AFTER `model_name`,
  ADD UNIQUE KEY `uk_notice_model` (`notice_model`, `tenant_id`) COMMENT '公告型号唯一性约束';

-- ==================== 2. 创建车辆基础信息表 ====================
CREATE TABLE `asset_vehicle_base` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  
  -- 基础标识信息
  `vin` varchar(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '车辆识别代号（车架号，17位，区分大小写）',
  `plate_no` varchar(20) DEFAULT NULL COMMENT '车牌号（如：粤A12345）',
  `vehicle_no` varchar(50) DEFAULT NULL COMMENT '车辆编号（内部编号）',
  
  -- 车型关联
  `notice_model` varchar(100) DEFAULT NULL COMMENT '车辆公告型号（关联 asset_vehicle_model.notice_model）',
  
  -- 车辆个体属性
  `color` varchar(50) DEFAULT NULL COMMENT '车身颜色',
  `year` char(4) DEFAULT NULL COMMENT '出厂年份（YYYY格式）',
  
  -- 运营城市
  `region_province` varchar(50) DEFAULT NULL COMMENT '运营城市-省',
  `region_city` varchar(50) DEFAULT NULL COMMENT '运营城市-市',
  
  -- 停车场
  `parking_id` bigint DEFAULT NULL COMMENT '归属停车场ID（关联 asset_parking.id）',
  
  -- 采购和登记信息
  `purchase_date` date DEFAULT NULL COMMENT '采购入库时间',
  `reg_date` date DEFAULT NULL COMMENT '行驶证注册日期',
  `inspect_expire` char(7) DEFAULT NULL COMMENT '行驶证检验有效期（YYYY-MM格式）',
  
  -- 报废期
  `scrap_date` date DEFAULT NULL COMMENT '强制报废期',
  
  -- 系统字段
  `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除（0=未删除 1=已删除）',
  `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号（多租户隔离）',
  
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uk_vin_tenant` (`vin`, `tenant_id`) USING BTREE COMMENT 'VIN唯一性约束',
  KEY `idx_plate_no` (`plate_no`) USING BTREE COMMENT '车牌号查询',
  KEY `idx_vehicle_no` (`vehicle_no`) USING BTREE COMMENT '车辆编号查询',
  KEY `idx_notice_model` (`notice_model`) USING BTREE COMMENT '公告型号关联查询',
  KEY `idx_parking_id` (`parking_id`) USING BTREE COMMENT '停车场查询',
  KEY `idx_region` (`region_province`, `region_city`) USING BTREE COMMENT '运营城市组合查询',
  KEY `idx_tenant_deleted` (`tenant_id`, `deleted`) USING BTREE COMMENT '租户隔离 + 逻辑删除'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车辆基础信息表';

-- ==================== 3. 创建车辆位置和里程表 ====================
CREATE TABLE `asset_vehicle_location` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  
  -- 车辆标识
  `vin` varchar(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '车辆识别代号',
  
  -- GPS位置信息
  `location` varchar(500) DEFAULT NULL COMMENT 'GPS位置（详细地址）',
  `gps_time` datetime DEFAULT NULL COMMENT 'GPS最后上传时间',
  
  -- 里程信息
  `mileage` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '行驶公里数（KM，保留2位小数）',
  
  -- 系统字段
  `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
  
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uk_vin_tenant` (`vin`, `tenant_id`) USING BTREE COMMENT 'VIN唯一性约束',
  KEY `idx_mileage` (`mileage`) USING BTREE COMMENT '里程查询',
  KEY `idx_gps_time` (`gps_time`) USING BTREE COMMENT 'GPS时间查询',
  KEY `idx_tenant_deleted` (`tenant_id`, `deleted`) USING BTREE COMMENT '租户隔离 + 逻辑删除'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车辆位置和里程表（高频更新）';

-- ==================== 4. 创建车辆业务关联表 ====================
CREATE TABLE `asset_vehicle_business` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  
  -- 车辆标识
  `vin` varchar(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '车辆识别代号',
  
  -- 业务关联信息
  `customer_id` bigint DEFAULT NULL COMMENT '客户ID（关联 asset_customer.id）',
  `department_id` bigint DEFAULT NULL COMMENT '业务部门ID（关联 system_dept.id）',
  `manager_id` bigint DEFAULT NULL COMMENT '业务负责人ID（关联 system_user.id）',
  `contract_id` bigint DEFAULT NULL COMMENT '合同ID（关联 asset_contract.id）',
  `ownership` varchar(100) DEFAULT NULL COMMENT '登记所有权（如：某某租赁公司）',
  
  -- 系统字段
  `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
  
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uk_vin_tenant` (`vin`, `tenant_id`) USING BTREE COMMENT 'VIN唯一性约束',
  KEY `idx_customer_id` (`customer_id`) USING BTREE COMMENT '客户查询',
  KEY `idx_department_id` (`department_id`) USING BTREE COMMENT '部门查询',
  KEY `idx_manager_id` (`manager_id`) USING BTREE COMMENT '负责人查询',
  KEY `idx_contract_id` (`contract_id`) USING BTREE COMMENT '合同查询',
  KEY `idx_tenant_deleted` (`tenant_id`, `deleted`) USING BTREE COMMENT '租户隔离 + 逻辑删除'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车辆业务关联表';

-- ==================== 5. 创建车辆状态表 ====================
CREATE TABLE `asset_vehicle_status` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  
  -- 车辆标识
  `vin` varchar(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '车辆识别代号',
  
  -- 状态信息（10个状态字段）
  `operate_status` tinyint NOT NULL DEFAULT 1 COMMENT '运营状态（1=待运营 2=库存 3=租赁 4=自营 5=退出运营）',
  `storage_status` tinyint DEFAULT NULL COMMENT '库位状态（1=新车入库-待验车 2=新车入库-证照办理 3=库存车-可交付车 4=库存车-不可交付车 5=库存车-呆滞车 6=已交付车-租赁交车 7=已交付车-自营交车 8=已交付车-替换交车 9=退出运营-报废车 10=退出运营-三方退租车 11=退出运营-过户售车）',
  `out_status` tinyint DEFAULT NULL COMMENT '出库状态（1=异动出库 2=调拨出库 3=展示出库 4=租赁交车 5=自营交车 6=替换交车 7=过户售车 8=外租退车 9=报废出库 10=无）',
  `preempt_status` tinyint NOT NULL DEFAULT 1 COMMENT '预占状态（1=未预占 2=已预占）',
  `prepare_status` tinyint DEFAULT NULL COMMENT '整备状态（1=待整备 2=整备中 3=正常 4=无）',
  `transfer_status` tinyint DEFAULT NULL COMMENT '过户状态（1=过户中 2=内部过户完成 3=销售过户完成 4=无）',
  `repair_status` tinyint NOT NULL DEFAULT 3 COMMENT '维修状态（1=待服务站接单 2=维修中 3=正常）',
  `license_status` tinyint NOT NULL DEFAULT 1 COMMENT '证照状态（1=正常 2=异常）',
  `scrap_status` tinyint NOT NULL DEFAULT 3 COMMENT '报废状态（1=报废中 2=已报废 3=无）',
  `online_status` tinyint NOT NULL DEFAULT 2 COMMENT '在线状态（1=在线 2=离线）',
  
  -- 系统字段
  `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
  
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uk_vin_tenant` (`vin`, `tenant_id`) USING BTREE COMMENT 'VIN唯一性约束',
  KEY `idx_operate_status` (`operate_status`) USING BTREE COMMENT '运营状态查询',
  KEY `idx_storage_status` (`storage_status`) USING BTREE COMMENT '库位状态查询',
  KEY `idx_repair_status` (`repair_status`) USING BTREE COMMENT '维修状态查询',
  KEY `idx_status_composite` (`operate_status`, `storage_status`, `deleted`) USING BTREE COMMENT '状态组合查询',
  KEY `idx_tenant_deleted` (`tenant_id`, `deleted`) USING BTREE COMMENT '租户隔离 + 逻辑删除'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车辆状态表（高频查询）';

-- ==================== 6. 创建统一查询视图 ====================
CREATE OR REPLACE VIEW `v_asset_vehicle_full` AS
SELECT 
  -- 基础信息
  b.id,
  b.vin,
  b.plate_no,
  b.vehicle_no,
  b.notice_model,
  b.color,
  b.year,
  b.region_province,
  b.region_city,
  b.parking_id,
  b.purchase_date,
  b.reg_date,
  b.inspect_expire,
  b.scrap_date,
  
  -- 位置和里程
  l.location,
  l.gps_time,
  l.mileage,
  
  -- 业务关联
  biz.customer_id,
  biz.department_id,
  biz.manager_id,
  biz.contract_id,
  biz.ownership,
  
  -- 状态信息
  s.operate_status,
  s.storage_status,
  s.out_status,
  s.preempt_status,
  s.prepare_status,
  s.transfer_status,
  s.repair_status,
  s.license_status,
  s.scrap_status,
  s.online_status,
  
  -- 系统字段
  b.creator,
  b.create_time,
  b.updater,
  b.update_time,
  b.deleted,
  b.tenant_id
FROM asset_vehicle_base b
LEFT JOIN asset_vehicle_location l ON b.vin = l.vin AND b.tenant_id = l.tenant_id AND l.deleted = 0
LEFT JOIN asset_vehicle_business biz ON b.vin = biz.vin AND b.tenant_id = biz.tenant_id AND biz.deleted = 0
LEFT JOIN asset_vehicle_status s ON b.vin = s.vin AND b.tenant_id = s.tenant_id AND s.deleted = 0
WHERE b.deleted = 0;
