liujie
2026-03-12 6ad9e267f13007c8c1a1c5db53fa3c611c824944
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi
11个文件已添加
10个文件已修改
1581 ■■■■■ 已修改文件
sql/增量sql/xprt_order.sql 744 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/config/MultipartFilterConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/ElectronicPageListQuery.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/MultipartFilterConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/config/MultipartFilterConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/config/MultipartFilterConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskAccidentDetailVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskRoutineDetailVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MultipartFilterConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/resources/mapper/XpElectronicFenceMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/config/MultipartFilterConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/OssController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/config/MultipartFilterConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-payment-boot/src/main/java/com/xiaopeng/payment/config/MultipartFilterConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/config/MultipartFilterConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-remote-driving-boot/src/main/java/com/xiaopeng/remoteDriving/config/MultipartFilterConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MultipartFilterConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/importExcel/XpVehicleImportExcel.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/增量sql/xprt_order.sql
@@ -1,843 +1,139 @@
ALTER TABLE `xp_cruise_order` MODIFY COLUMN `start_point_id` bigint NULL DEFAULT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order` MODIFY COLUMN `start_point_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '起点站点名称' AFTER `end_point_id`;
ALTER TABLE `xp_cruise_order_0` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_0` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_0` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_0` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_0` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_0` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_0` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_0` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_1` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_1` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_1` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_1` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_1` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_1` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_1` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_1` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_2` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_2` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_2` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_2` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_2` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_2` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_2` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_2` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_3` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_3` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_3` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_3` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_3` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_3` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_3` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_3` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_4` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_4` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_4` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_4` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_4` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_4` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_4` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_4` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_5` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_5` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_5` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_5` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_5` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_5` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_5` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_5` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_6` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_6` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_6` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_6` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_6` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_6` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_6` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_6` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_7` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_7` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_7` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_7` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_7` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_7` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_7` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_7` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_8` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_8` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_8` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_8` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_8` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_8` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_8` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_8` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_9` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_9` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_9` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_9` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_9` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_9` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_9` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_9` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_10` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_10` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_10` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_10` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_10` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_10` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_10` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_10` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_11` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_11` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_11` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_11` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_11` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_11` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_11` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_11` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_12` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_12` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_12` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_12` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_12` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_12` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_12` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_12` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_13` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_13` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_13` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_13` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_13` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_13` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_13` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_13` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_14` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_14` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_14` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_14` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_14` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_14` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_14` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_14` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_15` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_15` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_15` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_15` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_15` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_15` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_15` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_15` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_16` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_16` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_16` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_16` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_16` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_16` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_16` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_16` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_17` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_17` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_17` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_17` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_17` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_17` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_17` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_17` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_18` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_18` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_18` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_18` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_18` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_18` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_18` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_18` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_19` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_19` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_19` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_19` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_19` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_19` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_19` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_19` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_20` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_20` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_20` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_20` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_20` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_20` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_20` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_20` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_21` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_21` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_21` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_21` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_21` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_21` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_21` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_21` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_22` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_22` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_22` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_22` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_22` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_22` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_22` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_22` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_23` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_23` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_23` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_23` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_23` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_23` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_23` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_23` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_24` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_24` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_24` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_24` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_24` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_24` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_24` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_24` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_25` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_25` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_25` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_25` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_25` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_25` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_25` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_25` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_26` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_26` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_26` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_26` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_26` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_26` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_26` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_26` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_27` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_27` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_27` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_27` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_27` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_27` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_27` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_27` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_28` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_28` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_28` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_28` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_28` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_28` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_28` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_28` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_29` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_29` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_29` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_29` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_29` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_29` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_29` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_29` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_30` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_30` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_30` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_30` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_30` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_30` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_30` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_30` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_31` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_31` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_31` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_31` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_31` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_31` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_31` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_31` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_32` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_32` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_32` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_32` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_32` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_32` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_32` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_32` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_33` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_33` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_33` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_33` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_33` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_33` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_33` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_33` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_34` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_34` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_34` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_34` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_34` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_34` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_34` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_34` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_35` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_35` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_35` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_35` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_35` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_35` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_35` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_35` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_36` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_36` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_36` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_36` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_36` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_36` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_36` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_36` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_37` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_37` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_37` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_37` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_37` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_37` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_37` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_37` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_38` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_38` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_38` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_38` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_38` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_38` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_38` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_38` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_39` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_39` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_39` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_39` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_39` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_39` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_39` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_39` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_40` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_40` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_40` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_40` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_40` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_40` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_40` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_40` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_41` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_41` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_41` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_41` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_41` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_41` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_41` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_41` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_42` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_42` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_42` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_42` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_42` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_42` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_42` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_42` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_43` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_43` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_43` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_43` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_43` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_43` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_43` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_43` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_44` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_44` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_44` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_44` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_44` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_44` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_44` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_44` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_45` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_45` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_45` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_45` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_45` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_45` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_45` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_45` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_46` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_46` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_46` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_46` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_46` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_46` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_46` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_46` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_47` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_47` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_47` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_47` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_47` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_47` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_47` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_47` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_48` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_48` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_48` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_48` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_48` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_48` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_48` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_cruise_order_48` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_cruise_order_49` MODIFY COLUMN `id` bigint NOT NULL FIRST;
ALTER TABLE `xp_cruise_order_49` MODIFY COLUMN `vehicle_id` bigint NOT NULL COMMENT '车辆id' AFTER `id`;
ALTER TABLE `xp_cruise_order_49` MODIFY COLUMN `fleet_id` bigint NOT NULL COMMENT '车队ID' AFTER `vehicle_id`;
ALTER TABLE `xp_cruise_order_49` MODIFY COLUMN `vehicle_vin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '车辆vin' AFTER `fleet_id`;
ALTER TABLE `xp_cruise_order_49` MODIFY COLUMN `order_type` int NOT NULL DEFAULT 1 COMMENT '订单类型 1=正常巡游单 2返程单' AFTER `vehicle_vin`;
ALTER TABLE `xp_cruise_order_49` MODIFY COLUMN `start_point_id` bigint NOT NULL COMMENT '起点站点id' AFTER `end_lat`;
ALTER TABLE `xp_cruise_order_49` MODIFY COLUMN `status` int NOT NULL COMMENT '1进行中 2已停止 3已完成' AFTER `mission_id`;
ALTER TABLE `xp_order_0` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_cruise_order_49` MODIFY COLUMN `last_order_id` bigint NULL DEFAULT NULL COMMENT '返程上次的订单id' AFTER `status`;
ALTER TABLE `xp_order_1` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_0` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_2` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_1` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_3` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_2` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_4` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_3` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_5` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_4` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_6` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_5` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_7` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_6` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_8` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_7` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_9` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_8` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_10` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_9` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_11` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_10` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_12` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_11` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_13` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_12` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_14` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_13` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_15` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_14` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_16` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_15` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_17` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_16` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_18` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
ALTER TABLE `xp_order_17` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_18` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_19` MODIFY COLUMN `mileage_kilometers` double(11, 4) NULL DEFAULT NULL COMMENT '里程公里' AFTER `start_money`;
ALTER TABLE `xp_order_19` ADD COLUMN `open_trunk` int NULL DEFAULT 0 COMMENT '0未开  1开过  2关闭' AFTER `pay_type`;
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/config/MultipartFilterConfig.java
New file
@@ -0,0 +1,64 @@
package com.xiaopeng.account.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 修复 multipart 文件上传被 ReplaceRequestFilter 破坏的问题。
 * <p>
 * ReplaceRequestFilter(来自 request-wrapper jar,logan-starter-core 传递依赖)
 * 会读取 request 的 InputStream 来包装请求体,导致后续 Spring 解析 multipart 时
 * 抛出 "Stream closed" 异常。
 * <p>
 * 解决方案:注册一个高优先级 Filter,对 multipart 请求提前触发 Servlet 容器的
 * multipart 解析(通过调用 request.getParts()),使文件数据被缓存到临时文件中。
 * 这样即使后续 ReplaceRequestFilter 消费了 InputStream,multipart 数据仍然可用。
 */
@Slf4j
@Configuration
public class MultipartFilterConfig {
    private static final String MULTIPART = "multipart/";
    @Bean
    public FilterRegistrationBean<Filter> earlyMultipartParsingFilter() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new EarlyMultipartParsingFilter());
        registration.addUrlPatterns("/*");
        // 确保在 ReplaceRequestFilter 之前执行
        registration.setOrder(Integer.MIN_VALUE + 10);
        registration.setName("earlyMultipartParsingFilter");
        return registration;
    }
    /**
     * 在 filter 链最前面对 multipart 请求提前解析,
     * 让 Tomcat 将文件数据缓存到磁盘,避免后续 filter 消费 InputStream 导致 Stream closed。
     */
    static class EarlyMultipartParsingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String contentType = httpRequest.getContentType();
                if (contentType != null && contentType.toLowerCase().startsWith(MULTIPART)) {
                    // 提前触发 multipart 解析,Tomcat 会将 parts 缓存
                    try {
                        httpRequest.getParts();
                    } catch (Exception e) {
                        log.warn("Early multipart parsing failed, will retry later: {}", e.getMessage());
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/ElectronicPageListQuery.java
@@ -12,8 +12,12 @@
public class ElectronicPageListQuery extends BasePage {
    @ApiModelProperty(value = "围栏id/名称")
    private String electronicNumberOrName;
    @ApiModelProperty(value = "围栏构成 区域id")
    @ApiModelProperty(value = "禁行区数量筛选:范围(如 0,5)或阈值(如 20 表示>20)")
    private String electronicAreaId;
    @ApiModelProperty(value = "禁行区数量范围-最小值(由后端从 electronicAreaId 解析或前端直传)")
    private Integer prohibitedAreaCountMin;
    @ApiModelProperty(value = "禁行区数量范围-最大值(由后端从 electronicAreaId 解析或前端直传)")
    private Integer prohibitedAreaCountMax;
    @ApiModelProperty(value = "围栏状态 0=草稿 1=待启用 2=启用中 3=已停用")
    private List<Integer> statusList;
    @ApiModelProperty(value = "创建人")
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/MultipartFilterConfig.java
New file
@@ -0,0 +1,64 @@
package com.xiaopeng.automaticPilot.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 修复 multipart 文件上传被 ReplaceRequestFilter 破坏的问题。
 * <p>
 * ReplaceRequestFilter(来自 request-wrapper jar,logan-starter-core 传递依赖)
 * 会读取 request 的 InputStream 来包装请求体,导致后续 Spring 解析 multipart 时
 * 抛出 "Stream closed" 异常。
 * <p>
 * 解决方案:注册一个高优先级 Filter,对 multipart 请求提前触发 Servlet 容器的
 * multipart 解析(通过调用 request.getParts()),使文件数据被缓存到临时文件中。
 * 这样即使后续 ReplaceRequestFilter 消费了 InputStream,multipart 数据仍然可用。
 */
@Slf4j
@Configuration
public class MultipartFilterConfig {
    private static final String MULTIPART = "multipart/";
    @Bean
    public FilterRegistrationBean<Filter> earlyMultipartParsingFilter() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new EarlyMultipartParsingFilter());
        registration.addUrlPatterns("/*");
        // 确保在 ReplaceRequestFilter 之前执行
        registration.setOrder(Integer.MIN_VALUE + 10);
        registration.setName("earlyMultipartParsingFilter");
        return registration;
    }
    /**
     * 在 filter 链最前面对 multipart 请求提前解析,
     * 让 Tomcat 将文件数据缓存到磁盘,避免后续 filter 消费 InputStream 导致 Stream closed。
     */
    static class EarlyMultipartParsingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String contentType = httpRequest.getContentType();
                if (contentType != null && contentType.toLowerCase().startsWith(MULTIPART)) {
                    // 提前触发 multipart 解析,Tomcat 会将 parts 缓存
                    try {
                        httpRequest.getParts();
                    } catch (Exception e) {
                        log.warn("Early multipart parsing failed, will retry later: {}", e.getMessage());
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }
}
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/config/MultipartFilterConfig.java
New file
@@ -0,0 +1,64 @@
package com.xiaopeng.itinerary.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 修复 multipart 文件上传被 ReplaceRequestFilter 破坏的问题。
 * <p>
 * ReplaceRequestFilter(来自 request-wrapper jar,logan-starter-core 传递依赖)
 * 会读取 request 的 InputStream 来包装请求体,导致后续 Spring 解析 multipart 时
 * 抛出 "Stream closed" 异常。
 * <p>
 * 解决方案:注册一个高优先级 Filter,对 multipart 请求提前触发 Servlet 容器的
 * multipart 解析(通过调用 request.getParts()),使文件数据被缓存到临时文件中。
 * 这样即使后续 ReplaceRequestFilter 消费了 InputStream,multipart 数据仍然可用。
 */
@Slf4j
@Configuration
public class MultipartFilterConfig {
    private static final String MULTIPART = "multipart/";
    @Bean
    public FilterRegistrationBean<Filter> earlyMultipartParsingFilter() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new EarlyMultipartParsingFilter());
        registration.addUrlPatterns("/*");
        // 确保在 ReplaceRequestFilter 之前执行
        registration.setOrder(Integer.MIN_VALUE + 10);
        registration.setName("earlyMultipartParsingFilter");
        return registration;
    }
    /**
     * 在 filter 链最前面对 multipart 请求提前解析,
     * 让 Tomcat 将文件数据缓存到磁盘,避免后续 filter 消费 InputStream 导致 Stream closed。
     */
    static class EarlyMultipartParsingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String contentType = httpRequest.getContentType();
                if (contentType != null && contentType.toLowerCase().startsWith(MULTIPART)) {
                    // 提前触发 multipart 解析,Tomcat 会将 parts 缓存
                    try {
                        httpRequest.getParts();
                    } catch (Exception e) {
                        log.warn("Early multipart parsing failed, will retry later: {}", e.getMessage());
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/config/MultipartFilterConfig.java
New file
@@ -0,0 +1,64 @@
package com.xiaopeng.maintenance.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 修复 multipart 文件上传被 ReplaceRequestFilter 破坏的问题。
 * <p>
 * ReplaceRequestFilter(来自 request-wrapper jar,logan-starter-core 传递依赖)
 * 会读取 request 的 InputStream 来包装请求体,导致后续 Spring 解析 multipart 时
 * 抛出 "Stream closed" 异常。
 * <p>
 * 解决方案:注册一个高优先级 Filter,对 multipart 请求提前触发 Servlet 容器的
 * multipart 解析(通过调用 request.getParts()),使文件数据被缓存到临时文件中。
 * 这样即使后续 ReplaceRequestFilter 消费了 InputStream,multipart 数据仍然可用。
 */
@Slf4j
@Configuration
public class MultipartFilterConfig {
    private static final String MULTIPART = "multipart/";
    @Bean
    public FilterRegistrationBean<Filter> earlyMultipartParsingFilter() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new EarlyMultipartParsingFilter());
        registration.addUrlPatterns("/*");
        // 确保在 ReplaceRequestFilter 之前执行
        registration.setOrder(Integer.MIN_VALUE + 10);
        registration.setName("earlyMultipartParsingFilter");
        return registration;
    }
    /**
     * 在 filter 链最前面对 multipart 请求提前解析,
     * 让 Tomcat 将文件数据缓存到磁盘,避免后续 filter 消费 InputStream 导致 Stream closed。
     */
    static class EarlyMultipartParsingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String contentType = httpRequest.getContentType();
                if (contentType != null && contentType.toLowerCase().startsWith(MULTIPART)) {
                    // 提前触发 multipart 解析,Tomcat 会将 parts 缓存
                    try {
                        httpRequest.getParts();
                    } catch (Exception e) {
                        log.warn("Early multipart parsing failed, will retry later: {}", e.getMessage());
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskAccidentDetailVO.java
@@ -38,6 +38,8 @@
    private String vehicleColor;
    @ApiModelProperty(value = "车辆编码")
    private String vehicleCode;
    @ApiModelProperty(value = "车辆vin")
    private String vehicleVin;
    @ApiModelProperty(value = "车辆地址")
    private String vehicleLocation;
    @ApiModelProperty(value = "任务创建人")
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskRoutineDetailVO.java
@@ -46,6 +46,8 @@
    private String vehicleColor;
    @ApiModelProperty(value = "车辆编码")
    private String vehicleCode;
    @ApiModelProperty(value = "车辆vin")
    private String vehicleVin;
    @ApiModelProperty(value = "车辆地址")
    private String vehicleLocation;
    @ApiModelProperty(value = "任务创建人")
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -370,6 +370,7 @@
        res.setPlateNumber(vehicle.getPlateNumber());
        res.setVehicleColor(vehicle.getVehicleColor());
        res.setVehicleCode(vehicle.getVehicleCode());
        res.setVehicleVin(vehicle.getVehicleVin());
        res.setVehicleLocation(task.getVehicleLocation());
        res.setCreateBy(task.getCreateBy());
        res.setCreateTime(task.getCreateTime());
@@ -452,6 +453,7 @@
        res.setPlateNumber(vehicle.getPlateNumber());
        res.setVehicleColor(vehicle.getVehicleColor());
        res.setVehicleCode(vehicle.getVehicleCode());
        res.setVehicleVin(vehicle.getVehicleVin());
        res.setVehicleLocation(task.getVehicleLocation());
        res.setCreateBy(task.getCreateBy());
        res.setCreateTime(task.getCreateTime());
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MultipartFilterConfig.java
New file
@@ -0,0 +1,64 @@
package com.xiaopeng.map.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 修复 multipart 文件上传被 ReplaceRequestFilter 破坏的问题。
 * <p>
 * ReplaceRequestFilter(来自 request-wrapper jar,logan-starter-core 传递依赖)
 * 会读取 request 的 InputStream 来包装请求体,导致后续 Spring 解析 multipart 时
 * 抛出 "Stream closed" 异常。
 * <p>
 * 解决方案:注册一个高优先级 Filter,对 multipart 请求提前触发 Servlet 容器的
 * multipart 解析(通过调用 request.getParts()),使文件数据被缓存到临时文件中。
 * 这样即使后续 ReplaceRequestFilter 消费了 InputStream,multipart 数据仍然可用。
 */
@Slf4j
@Configuration
public class MultipartFilterConfig {
    private static final String MULTIPART = "multipart/";
    @Bean
    public FilterRegistrationBean<Filter> earlyMultipartParsingFilter() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new EarlyMultipartParsingFilter());
        registration.addUrlPatterns("/*");
        // 确保在 ReplaceRequestFilter 之前执行
        registration.setOrder(Integer.MIN_VALUE + 10);
        registration.setName("earlyMultipartParsingFilter");
        return registration;
    }
    /**
     * 在 filter 链最前面对 multipart 请求提前解析,
     * 让 Tomcat 将文件数据缓存到磁盘,避免后续 filter 消费 InputStream 导致 Stream closed。
     */
    static class EarlyMultipartParsingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String contentType = httpRequest.getContentType();
                if (contentType != null && contentType.toLowerCase().startsWith(MULTIPART)) {
                    // 提前触发 multipart 解析,Tomcat 会将 parts 缓存
                    try {
                        httpRequest.getParts();
                    } catch (Exception e) {
                        log.warn("Early multipart parsing failed, will retry later: {}", e.getMessage());
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }
}
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java
@@ -78,6 +78,10 @@
    @Override
    public PageInfo<XpElectronicFence> pageList(ElectronicPageListQuery query) {
        if (query == null) {
            return new PageInfo<>();
        }
        normalizeProhibitedAreaCountFilter(query);
        PageInfo<XpElectronicFence> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        if (StringUtils.isEmpty(query.getCreateSort())&& StringUtils.isEmpty(query.getUpdateSort())){
            query.setCreateSort("2");
@@ -103,6 +107,81 @@
        pageInfo.setRecords(list);
        return pageInfo;
    }
    private void normalizeProhibitedAreaCountFilter(ElectronicPageListQuery query) {
        Integer prohibitedAreaCountMin = query.getProhibitedAreaCountMin();
        Integer prohibitedAreaCountMax = query.getProhibitedAreaCountMax();
        if (prohibitedAreaCountMin != null || prohibitedAreaCountMax != null) {
            if (prohibitedAreaCountMin != null && prohibitedAreaCountMax != null) {
                int min = Math.min(prohibitedAreaCountMin, prohibitedAreaCountMax);
                int max = Math.max(prohibitedAreaCountMin, prohibitedAreaCountMax);
                if (min < 0) {
                    clearAreaFilter(query);
                    return;
                }
                query.setProhibitedAreaCountMin(min);
                query.setProhibitedAreaCountMax(max);
                query.setElectronicAreaId(null);
                return;
            }
            if (prohibitedAreaCountMin != null) {
                if (prohibitedAreaCountMin < 0) {
                    clearAreaFilter(query);
                    return;
                }
                query.setElectronicAreaId(null);
                return;
            }
            if (prohibitedAreaCountMax < 0) {
                clearAreaFilter(query);
                return;
            }
            query.setElectronicAreaId(null);
            return;
        }
        String electronicAreaId = query.getElectronicAreaId();
        if (StringUtils.isEmpty(electronicAreaId)) {
            return;
        }
        try {
            if (electronicAreaId.contains(",")) {
                String[] parts = electronicAreaId.split(",");
                if (parts.length != 2) {
                    clearAreaFilter(query);
                    return;
                }
                int left = Integer.parseInt(parts[0].trim());
                int right = Integer.parseInt(parts[1].trim());
                int min = Math.min(left, right);
                int max = Math.max(left, right);
                if (min < 0) {
                    clearAreaFilter(query);
                    return;
                }
                query.setProhibitedAreaCountMin(min);
                query.setProhibitedAreaCountMax(max);
                query.setElectronicAreaId(null);
                return;
            }
            int threshold = Integer.parseInt(electronicAreaId.trim());
            if (threshold < 0 || threshold == Integer.MAX_VALUE) {
                clearAreaFilter(query);
                return;
            }
            query.setProhibitedAreaCountMin(threshold + 1);
            query.setProhibitedAreaCountMax(null);
            query.setElectronicAreaId(null);
        } catch (Exception e) {
            clearAreaFilter(query);
        }
    }
    private void clearAreaFilter(ElectronicPageListQuery query) {
        query.setElectronicAreaId(null);
        query.setProhibitedAreaCountMin(null);
        query.setProhibitedAreaCountMax(null);
    }
    public static String getPinyinInitials(String chinese) {
        StringBuilder pinyinInitials = new StringBuilder();
        for (char c : chinese.toCharArray()) {
xp-robotaxi-map-boot/src/main/resources/mapper/XpElectronicFenceMapper.xml
@@ -28,15 +28,12 @@
        select ef.id, ef.electronic_name as electronicName, ef.electronic_number as electronicNumber, ef.status, ef.effect_type as effectType, ef.effect_time as effectTime, ef.failure_type as failureType, ef.failure_time as failureTime, ef.operation_strategy as operationStrategy
        , ef.create_time as createTime, ef.update_time as updateTime, ef.create_by as createBy, ef.update_by as updateBy
        from xp_electronic_fence ef
        left join xp_electronic_fence_area efa on efa.electronic_id = ef.id
        left join xp_electronic_fence_area efa on efa.electronic_id = ef.id and efa.is_deleted = 0
        where ef.is_deleted = 0
        <if test="query.electronicNumberOrName != null">
            and( ef.electronic_name like concat('%',#{query.electronicNumberOrName},'%')
            or ef.electronic_number like concat('%',#{query.electronicNumberOrName},'%')
            )
        </if>
        <if test="query.electronicAreaId != null">
            and efa.id = #{query.electronicAreaId}
        </if>
        <if test="query.statusList != null">
            <foreach collection="query.statusList" item="status" open="and ef.status in (" separator="," close=")">
@@ -63,6 +60,17 @@
            and #{query.updateEndTime} >= ef.update_time
        </if>
        group by ef.id
        <choose>
            <when test="query.prohibitedAreaCountMin != null and query.prohibitedAreaCountMax != null">
                having sum(case when efa.area_type = 2 then 1 else 0 end) between #{query.prohibitedAreaCountMin} and #{query.prohibitedAreaCountMax}
            </when>
            <when test="query.prohibitedAreaCountMin != null">
                having sum(case when efa.area_type = 2 then 1 else 0 end) &gt;= #{query.prohibitedAreaCountMin}
            </when>
            <when test="query.prohibitedAreaCountMax != null">
                having sum(case when efa.area_type = 2 then 1 else 0 end) &lt;= #{query.prohibitedAreaCountMax}
            </when>
        </choose>
        <if test="query.createSort != null and query.updateSort != null">
            order by
            <if test="query.createSort == 1">
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/config/MultipartFilterConfig.java
New file
@@ -0,0 +1,64 @@
package com.xiaopeng.operation.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 修复 multipart 文件上传被 ReplaceRequestFilter 破坏的问题。
 * <p>
 * ReplaceRequestFilter(来自 request-wrapper jar,logan-starter-core 传递依赖)
 * 会读取 request 的 InputStream 来包装请求体,导致后续 Spring 解析 multipart 时
 * 抛出 "Stream closed" 异常。
 * <p>
 * 解决方案:注册一个高优先级 Filter,对 multipart 请求提前触发 Servlet 容器的
 * multipart 解析(通过调用 request.getParts()),使文件数据被缓存到临时文件中。
 * 这样即使后续 ReplaceRequestFilter 消费了 InputStream,multipart 数据仍然可用。
 */
@Slf4j
@Configuration
public class MultipartFilterConfig {
    private static final String MULTIPART = "multipart/";
    @Bean
    public FilterRegistrationBean<Filter> earlyMultipartParsingFilter() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new EarlyMultipartParsingFilter());
        registration.addUrlPatterns("/*");
        // 确保在 ReplaceRequestFilter 之前执行
        registration.setOrder(Integer.MIN_VALUE + 10);
        registration.setName("earlyMultipartParsingFilter");
        return registration;
    }
    /**
     * 在 filter 链最前面对 multipart 请求提前解析,
     * 让 Tomcat 将文件数据缓存到磁盘,避免后续 filter 消费 InputStream 导致 Stream closed。
     */
    static class EarlyMultipartParsingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String contentType = httpRequest.getContentType();
                if (contentType != null && contentType.toLowerCase().startsWith(MULTIPART)) {
                    // 提前触发 multipart 解析,Tomcat 会将 parts 缓存
                    try {
                        httpRequest.getParts();
                    } catch (Exception e) {
                        log.warn("Early multipart parsing failed, will retry later: {}", e.getMessage());
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/OssController.java
@@ -58,5 +58,20 @@
        }
    }
    @PostMapping(value = "/getUploadOSSUrl")
    @ApiOperation(value = "获取文件上传地址",tags = "文件上传")
    public R<String> getUploadOSSUrl(@RequestParam("fileId") String fileId) {
        try {
            // 上传并返回访问地址
            String uploadUrl = aliOssService.getUploadUrl(fileId, true);
            return R.ok(uploadUrl);
        } catch (Exception e) {
            System.err.println("上传文件失败"+e);
            return R.fail(e.getMessage());
        }
    }
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/config/MultipartFilterConfig.java
New file
@@ -0,0 +1,64 @@
package com.xiaopeng.order.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 修复 multipart 文件上传被 ReplaceRequestFilter 破坏的问题。
 * <p>
 * ReplaceRequestFilter(来自 request-wrapper jar,logan-starter-core 传递依赖)
 * 会读取 request 的 InputStream 来包装请求体,导致后续 Spring 解析 multipart 时
 * 抛出 "Stream closed" 异常。
 * <p>
 * 解决方案:注册一个高优先级 Filter,对 multipart 请求提前触发 Servlet 容器的
 * multipart 解析(通过调用 request.getParts()),使文件数据被缓存到临时文件中。
 * 这样即使后续 ReplaceRequestFilter 消费了 InputStream,multipart 数据仍然可用。
 */
@Slf4j
@Configuration
public class MultipartFilterConfig {
    private static final String MULTIPART = "multipart/";
    @Bean
    public FilterRegistrationBean<Filter> earlyMultipartParsingFilter() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new EarlyMultipartParsingFilter());
        registration.addUrlPatterns("/*");
        // 确保在 ReplaceRequestFilter 之前执行
        registration.setOrder(Integer.MIN_VALUE + 10);
        registration.setName("earlyMultipartParsingFilter");
        return registration;
    }
    /**
     * 在 filter 链最前面对 multipart 请求提前解析,
     * 让 Tomcat 将文件数据缓存到磁盘,避免后续 filter 消费 InputStream 导致 Stream closed。
     */
    static class EarlyMultipartParsingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String contentType = httpRequest.getContentType();
                if (contentType != null && contentType.toLowerCase().startsWith(MULTIPART)) {
                    // 提前触发 multipart 解析,Tomcat 会将 parts 缓存
                    try {
                        httpRequest.getParts();
                    } catch (Exception e) {
                        log.warn("Early multipart parsing failed, will retry later: {}", e.getMessage());
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }
}
xp-robotaxi-payment-boot/src/main/java/com/xiaopeng/payment/config/MultipartFilterConfig.java
New file
@@ -0,0 +1,64 @@
package com.xiaopeng.payment.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 修复 multipart 文件上传被 ReplaceRequestFilter 破坏的问题。
 * <p>
 * ReplaceRequestFilter(来自 request-wrapper jar,logan-starter-core 传递依赖)
 * 会读取 request 的 InputStream 来包装请求体,导致后续 Spring 解析 multipart 时
 * 抛出 "Stream closed" 异常。
 * <p>
 * 解决方案:注册一个高优先级 Filter,对 multipart 请求提前触发 Servlet 容器的
 * multipart 解析(通过调用 request.getParts()),使文件数据被缓存到临时文件中。
 * 这样即使后续 ReplaceRequestFilter 消费了 InputStream,multipart 数据仍然可用。
 */
@Slf4j
@Configuration
public class MultipartFilterConfig {
    private static final String MULTIPART = "multipart/";
    @Bean
    public FilterRegistrationBean<Filter> earlyMultipartParsingFilter() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new EarlyMultipartParsingFilter());
        registration.addUrlPatterns("/*");
        // 确保在 ReplaceRequestFilter 之前执行
        registration.setOrder(Integer.MIN_VALUE + 10);
        registration.setName("earlyMultipartParsingFilter");
        return registration;
    }
    /**
     * 在 filter 链最前面对 multipart 请求提前解析,
     * 让 Tomcat 将文件数据缓存到磁盘,避免后续 filter 消费 InputStream 导致 Stream closed。
     */
    static class EarlyMultipartParsingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String contentType = httpRequest.getContentType();
                if (contentType != null && contentType.toLowerCase().startsWith(MULTIPART)) {
                    // 提前触发 multipart 解析,Tomcat 会将 parts 缓存
                    try {
                        httpRequest.getParts();
                    } catch (Exception e) {
                        log.warn("Early multipart parsing failed, will retry later: {}", e.getMessage());
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }
}
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/config/MultipartFilterConfig.java
New file
@@ -0,0 +1,64 @@
package com.xiaopeng.pushMessage.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 修复 multipart 文件上传被 ReplaceRequestFilter 破坏的问题。
 * <p>
 * ReplaceRequestFilter(来自 request-wrapper jar,logan-starter-core 传递依赖)
 * 会读取 request 的 InputStream 来包装请求体,导致后续 Spring 解析 multipart 时
 * 抛出 "Stream closed" 异常。
 * <p>
 * 解决方案:注册一个高优先级 Filter,对 multipart 请求提前触发 Servlet 容器的
 * multipart 解析(通过调用 request.getParts()),使文件数据被缓存到临时文件中。
 * 这样即使后续 ReplaceRequestFilter 消费了 InputStream,multipart 数据仍然可用。
 */
@Slf4j
@Configuration
public class MultipartFilterConfig {
    private static final String MULTIPART = "multipart/";
    @Bean
    public FilterRegistrationBean<Filter> earlyMultipartParsingFilter() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new EarlyMultipartParsingFilter());
        registration.addUrlPatterns("/*");
        // 确保在 ReplaceRequestFilter 之前执行
        registration.setOrder(Integer.MIN_VALUE + 10);
        registration.setName("earlyMultipartParsingFilter");
        return registration;
    }
    /**
     * 在 filter 链最前面对 multipart 请求提前解析,
     * 让 Tomcat 将文件数据缓存到磁盘,避免后续 filter 消费 InputStream 导致 Stream closed。
     */
    static class EarlyMultipartParsingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String contentType = httpRequest.getContentType();
                if (contentType != null && contentType.toLowerCase().startsWith(MULTIPART)) {
                    // 提前触发 multipart 解析,Tomcat 会将 parts 缓存
                    try {
                        httpRequest.getParts();
                    } catch (Exception e) {
                        log.warn("Early multipart parsing failed, will retry later: {}", e.getMessage());
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }
}
xp-robotaxi-remote-driving-boot/src/main/java/com/xiaopeng/remoteDriving/config/MultipartFilterConfig.java
New file
@@ -0,0 +1,64 @@
package com.xiaopeng.remoteDriving.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 修复 multipart 文件上传被 ReplaceRequestFilter 破坏的问题。
 * <p>
 * ReplaceRequestFilter(来自 request-wrapper jar,logan-starter-core 传递依赖)
 * 会读取 request 的 InputStream 来包装请求体,导致后续 Spring 解析 multipart 时
 * 抛出 "Stream closed" 异常。
 * <p>
 * 解决方案:注册一个高优先级 Filter,对 multipart 请求提前触发 Servlet 容器的
 * multipart 解析(通过调用 request.getParts()),使文件数据被缓存到临时文件中。
 * 这样即使后续 ReplaceRequestFilter 消费了 InputStream,multipart 数据仍然可用。
 */
@Slf4j
@Configuration
public class MultipartFilterConfig {
    private static final String MULTIPART = "multipart/";
    @Bean
    public FilterRegistrationBean<Filter> earlyMultipartParsingFilter() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new EarlyMultipartParsingFilter());
        registration.addUrlPatterns("/*");
        // 确保在 ReplaceRequestFilter 之前执行
        registration.setOrder(Integer.MIN_VALUE + 10);
        registration.setName("earlyMultipartParsingFilter");
        return registration;
    }
    /**
     * 在 filter 链最前面对 multipart 请求提前解析,
     * 让 Tomcat 将文件数据缓存到磁盘,避免后续 filter 消费 InputStream 导致 Stream closed。
     */
    static class EarlyMultipartParsingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String contentType = httpRequest.getContentType();
                if (contentType != null && contentType.toLowerCase().startsWith(MULTIPART)) {
                    // 提前触发 multipart 解析,Tomcat 会将 parts 缓存
                    try {
                        httpRequest.getParts();
                    } catch (Exception e) {
                        log.warn("Early multipart parsing failed, will retry later: {}", e.getMessage());
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MultipartFilterConfig.java
New file
@@ -0,0 +1,64 @@
package com.xiaopeng.vehicleConvoy.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 修复 multipart 文件上传被 ReplaceRequestFilter 破坏的问题。
 * <p>
 * ReplaceRequestFilter(来自 request-wrapper jar,logan-starter-core 传递依赖)
 * 会读取 request 的 InputStream 来包装请求体,导致后续 Spring 解析 multipart 时
 * 抛出 "Stream closed" 异常。
 * <p>
 * 解决方案:注册一个高优先级 Filter,对 multipart 请求提前触发 Servlet 容器的
 * multipart 解析(通过调用 request.getParts()),使文件数据被缓存到临时文件中。
 * 这样即使后续 ReplaceRequestFilter 消费了 InputStream,multipart 数据仍然可用。
 */
@Slf4j
@Configuration
public class MultipartFilterConfig {
    private static final String MULTIPART = "multipart/";
    @Bean
    public FilterRegistrationBean<Filter> earlyMultipartParsingFilter() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new EarlyMultipartParsingFilter());
        registration.addUrlPatterns("/*");
        // 确保在 ReplaceRequestFilter 之前执行
        registration.setOrder(Integer.MIN_VALUE + 10);
        registration.setName("earlyMultipartParsingFilter");
        return registration;
    }
    /**
     * 在 filter 链最前面对 multipart 请求提前解析,
     * 让 Tomcat 将文件数据缓存到磁盘,避免后续 filter 消费 InputStream 导致 Stream closed。
     */
    static class EarlyMultipartParsingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String contentType = httpRequest.getContentType();
                if (contentType != null && contentType.toLowerCase().startsWith(MULTIPART)) {
                    // 提前触发 multipart 解析,Tomcat 会将 parts 缓存
                    try {
                        httpRequest.getParts();
                    } catch (Exception e) {
                        log.warn("Early multipart parsing failed, will retry later: {}", e.getMessage());
                    }
                }
            }
            chain.doFilter(request, response);
        }
    }
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/importExcel/XpVehicleImportExcel.java
@@ -1,10 +1,13 @@
package com.xiaopeng.vehicleConvoy.model.importExcel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * 在库车辆导入Excel
@@ -36,6 +39,12 @@
    @Excel(name = "采购来源", width = 15)
    private String procurementSource;
    @Excel(name = "年检到期时间 1970-01-01 00:00:00", width = 20, format = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime annualInspectionDate;
    @Excel(name = "保险到期时间 1970-01-01 00:00:00", width = 20, format = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime insuranceEndTime;
    @Excel(name = "备注", width = 25)
    private String remarks;
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -196,7 +196,7 @@
        for (XpVehicleVO xpVehicleVO : list) {
            List<Point> positionList = redisTemplate.opsForGeo().position("vehiclePosition:" + xpVehicleVO.getVehicleVin(), xpVehicleVO.getVehicleVin());
            if (CollUtil.isNotEmpty(positionList)) {
            if (!CollectionUtils.isEmpty(positionList)) {
                Point geoJsonPoint = positionList.get(0);
                // 获取经纬度
                xpVehicleVO.setLongitude(geoJsonPoint.getX());