Browse Source

20230315 17:42

wangzhuo 2 years ago
parent
commit
fe3bc63a05
30 changed files with 3391 additions and 7 deletions
  1. 13 1
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/AnnualBudgetItem.java
  2. 6 6
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/excel/AnnualBudgetExcel.java
  3. 35 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/dto/VehicleBrandDTO.java
  4. 34 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/dto/VehicleModelDTO.java
  5. 34 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/dto/VehicleSeriesDTO.java
  6. 114 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/VehicleBrand.java
  7. 673 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/VehicleModel.java
  8. 140 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/VehicleSeries.java
  9. 53 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/excel/VehicleBrandExcel.java
  10. 605 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/excel/VehicleModelExcel.java
  11. 82 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/excel/VehicleSeriesExcel.java
  12. 36 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/vo/VehicleBrandVO.java
  13. 36 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/vo/VehicleModelVO.java
  14. 36 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/vo/VehicleSeriesVO.java
  15. 16 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/service/impl/AnnualBudgetItemServiceImpl.java
  16. 306 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/controller/VehicleBrandController.java
  17. 196 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/controller/VehicleModelController.java
  18. 164 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/controller/VehicleSeriesController.java
  19. 43 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleBrandMapper.java
  20. 27 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleBrandMapper.xml
  21. 43 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleModelMapper.java
  22. 140 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleModelMapper.xml
  23. 43 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleSeriesMapper.java
  24. 33 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleSeriesMapper.xml
  25. 51 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/IVehicleBrandService.java
  26. 52 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/IVehicleModelService.java
  27. 51 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/IVehicleSeriesService.java
  28. 95 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/impl/VehicleBrandServiceImpl.java
  29. 136 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/impl/VehicleModelServiceImpl.java
  30. 98 0
      blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/impl/VehicleSeriesServiceImpl.java

+ 13 - 1
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/AnnualBudgetItem.java

@@ -124,7 +124,7 @@ public class AnnualBudgetItem implements Serializable {
 	private BigDecimal keterDeliverQuantity;
 
 	/**
-	 * 特路计划量
+	 * 特路计划量
 	 */
 	@ApiModelProperty(value = "艾特路计划量")
 	private BigDecimal xcentway;
@@ -255,4 +255,16 @@ public class AnnualBudgetItem implements Serializable {
 	@TableField(exist = false)
 	private BigDecimal deliverySummary;
 
+	/**
+	 * 订单完成率
+	 */
+	@TableField(exist = false)
+	private BigDecimal orderCompletionRate;
+
+	/**
+	 * 发货完成率
+	 */
+	@TableField(exist = false)
+	private BigDecimal deliveryCompletionRate;
+
 }

+ 6 - 6
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/excel/AnnualBudgetExcel.java

@@ -75,21 +75,21 @@ public class AnnualBudgetExcel implements Serializable {
 	private BigDecimal luxxanDeliverQuantity;
 
 	/**
-	 * 特路计划量
+	 * 特路计划量
 	 */
-	@ExcelProperty(value = "特路计划量")
+	@ExcelProperty(value = "特路计划量")
 	private BigDecimal xcentway;
 
 	/**
-	 * 特路订单数量
+	 * 特路订单数量
 	 */
-	@ExcelProperty(value = "特路订单数量")
+	@ExcelProperty(value = "特路订单数量")
 	private BigDecimal xcentwayOrdQuantity;
 
 	/**
-	 * 特路发货数量
+	 * 特路发货数量
 	 */
-	@ExcelProperty(value = "特路发货数量")
+	@ExcelProperty(value = "特路发货数量")
 	private BigDecimal xcentwayDeliverQuantity;
 
 	/**

+ 35 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/dto/VehicleBrandDTO.java

@@ -0,0 +1,35 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.dto;
+
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.client.entity.VehicleBrand;
+
+/**
+ * 车辆品牌数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class VehicleBrandDTO extends VehicleBrand {
+	private static final long serialVersionUID = 1L;
+
+}

+ 34 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/dto/VehicleModelDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.client.entity.VehicleModel;
+
+/**
+ * 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class VehicleModelDTO extends VehicleModel {
+	private static final long serialVersionUID = 1L;
+
+}

+ 34 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/dto/VehicleSeriesDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.client.entity.VehicleSeries;
+
+/**
+ * 车辆车系数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class VehicleSeriesDTO extends VehicleSeries {
+	private static final long serialVersionUID = 1L;
+
+}

+ 114 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/VehicleBrand.java

@@ -0,0 +1,114 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 车辆品牌实体类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Data
+@TableName("basic_vehicle_brand")
+@ApiModel(value = "VehicleBrand对象", description = "车辆品牌")
+public class VehicleBrand implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	* 主键
+	*/
+		@ApiModelProperty(value = "主键")
+		private Long id;
+	/**
+	* 创建人
+	*/
+		@ApiModelProperty(value = "创建人")
+		private Long createUser;
+	/**
+	* 创建部门
+	*/
+		@ApiModelProperty(value = "创建部门")
+		private Long createDept;
+	/**
+	* 创建时间
+	*/
+		@ApiModelProperty(value = "创建时间")
+		@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+		@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+		private Date createTime;
+	/**
+	* 修改人
+	*/
+		@ApiModelProperty(value = "修改人")
+		private Long updateUser;
+	/**
+	* 修改时间
+	*/
+		@ApiModelProperty(value = "修改时间")
+		@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+		@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+		private Date updateTime;
+	/**
+	* 状态
+	*/
+		@ApiModelProperty(value = "状态")
+		private Integer status;
+	/**
+	* 是否已删除(0 否 1是)
+	*/
+		@ApiModelProperty(value = "是否已删除(0 否 1是)")
+		private Integer isDeleted;
+	/**
+	* 首字母
+	*/
+		@ApiModelProperty(value = "首字母")
+		private String initial;
+	/**
+	* 品牌
+	*/
+		@ApiModelProperty(value = "品牌")
+		private String brand;
+	/**
+	* 品牌logo
+	*/
+		@ApiModelProperty(value = "品牌logo")
+		private String brandLogo;
+	/**
+	* 更新时间
+	*/
+		@ApiModelProperty(value = "更新时间")
+		private Date renewTime;
+	/**
+	* 品牌id
+	*/
+		@ApiModelProperty(value = "品牌id")
+		private String brandId;
+
+
+}

+ 673 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/VehicleModel.java

@@ -0,0 +1,673 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 实体类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Data
+@TableName("basic_vehicle_model")
+@ApiModel(value = "VehicleModel对象", description = "VehicleModel对象")
+public class VehicleModel implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	* 主键
+	*/
+		@ApiModelProperty(value = "主键")
+		private Long id;
+	/**
+	* 创建人
+	*/
+		@ApiModelProperty(value = "创建人")
+		private Long createUser;
+	/**
+	* 创建部门
+	*/
+		@ApiModelProperty(value = "创建部门")
+		private Long createDept;
+	/**
+	* 创建时间
+	*/
+		@ApiModelProperty(value = "创建时间")
+		private Date createTime;
+	/**
+	* 修改人
+	*/
+		@ApiModelProperty(value = "修改人")
+		private Long updateUser;
+	/**
+	* 修改时间
+	*/
+		@ApiModelProperty(value = "修改时间")
+		private Date updateTime;
+	/**
+	* 状态
+	*/
+		@ApiModelProperty(value = "状态")
+		private Integer status;
+	/**
+	* 是否已删除(0 否 1是)
+	*/
+		@ApiModelProperty(value = "是否已删除(0 否 1是)")
+		private Integer isDeleted;
+	/**
+	* 首字母
+	*/
+		@ApiModelProperty(value = "首字母")
+		private String initial;
+	/**
+	* 品牌名称
+	*/
+		@ApiModelProperty(value = "品牌名称")
+		private String brandName;
+	/**
+	* 品牌id
+	*/
+		@ApiModelProperty(value = "品牌id")
+		private String brandId;
+	/**
+	* 品牌logo
+	*/
+		@ApiModelProperty(value = "品牌logo")
+		private String brandLogo;
+	/**
+	* 车系名称
+	*/
+		@ApiModelProperty(value = "车系名称")
+		private String seriesName;
+	/**
+	* 车系id
+	*/
+		@ApiModelProperty(value = "车系id")
+		private String seriesId;
+	/**
+	* 车系展示图
+	*/
+		@ApiModelProperty(value = "车系展示图")
+		private String seriesExhibit;
+	/**
+	* 车型名称
+	*/
+		@ApiModelProperty(value = "车型名称")
+		private String modelName;
+	/**
+	* 车型id
+	*/
+		@ApiModelProperty(value = "车型id")
+		private String modelId;
+	/**
+	* 销售状态
+	*/
+		@ApiModelProperty(value = "销售状态")
+		private String sellStatus;
+	/**
+	* 厂商名称
+	*/
+		@ApiModelProperty(value = "厂商名称")
+		private String manufacturerName;
+	/**
+	* 厂商id
+	*/
+		@ApiModelProperty(value = "厂商id")
+		private String manufacturerId;
+	/**
+	* 年款
+	*/
+		@ApiModelProperty(value = "年款")
+		private String modelYear;
+	/**
+	* 更新时间
+	*/
+		@ApiModelProperty(value = "更新时间")
+		private Date renewTime;
+	/**
+	* 上市时间
+	*/
+		@ApiModelProperty(value = "上市时间")
+		private Date marketTime;
+	/**
+	* 厂商指导价(万)
+	*/
+		@ApiModelProperty(value = "厂商指导价(万)")
+		private String manufacturerPriceWan;
+	/**
+	* 厂商指导价(元)
+	*/
+		@ApiModelProperty(value = "厂商指导价(元)")
+		private String manufacturerPriceYuan;
+	/**
+	* 经销商参考价
+	*/
+		@ApiModelProperty(value = "经销商参考价")
+		private String dealerReferencePrice;
+	/**
+	* 车商城一口价
+	*/
+		@ApiModelProperty(value = "车商城一口价")
+		private String carMallBuyItNow;
+	/**
+	* 级别
+	*/
+		@ApiModelProperty(value = "级别")
+		private String rank;
+	/**
+	* 能源类型
+	*/
+		@ApiModelProperty(value = "能源类型")
+		private String energyType;
+	/**
+	* 最大功率(kw)
+	*/
+		@ApiModelProperty(value = "最大功率(kw)")
+		private String maximumPower;
+	/**
+	* 最大扭矩(N·m)
+	*/
+		@ApiModelProperty(value = "最大扭矩(N·m)")
+		private String maximumTorque;
+	/**
+	* 电动机
+	*/
+		@ApiModelProperty(value = "电动机")
+		private String electricMotor;
+	/**
+	* 发动机
+	*/
+		@ApiModelProperty(value = "发动机")
+		private String engine;
+	/**
+	* 电动机(ps)
+	*/
+		@ApiModelProperty(value = "电动机(ps)")
+		private String electricMotorPs;
+	/**
+	* 变速箱
+	*/
+		@ApiModelProperty(value = "变速箱")
+		private String transmissionCase;
+	/**
+	* 长*宽*高(mm)
+	*/
+		@ApiModelProperty(value = "长*宽*高(mm)")
+		private String lengthWidthHeight;
+	/**
+	* 车身结构
+	*/
+		@ApiModelProperty(value = "车身结构")
+		private String bodyStructure;
+	/**
+	* 最高车速(km/h)
+	*/
+		@ApiModelProperty(value = "最高车速(km/h)")
+		private String maximumSpeed;
+	/**
+	* 官方0-100km/h加速(s)
+	*/
+		@ApiModelProperty(value = "官方0-100km/h加速(s)")
+		private String officialAcceleration;
+	/**
+	* 实测0-100km/h加速(s)
+	*/
+		@ApiModelProperty(value = "实测0-100km/h加速(s)")
+		private String measuredAcceleration;
+	/**
+	* 实测100-0km/h制动(m)
+	*/
+		@ApiModelProperty(value = "实测100-0km/h制动(m)")
+		private String measuredBraking;
+	/**
+	* 工信部综合油耗(L/100km)
+	*/
+		@ApiModelProperty(value = "工信部综合油耗(L/100km)")
+		private String miitOilConsumption;
+	/**
+	* 工信部续航里程(km)
+	*/
+		@ApiModelProperty(value = "工信部续航里程(km)")
+		private String miitRange;
+	/**
+	* 实测油耗(L/100km)
+	*/
+		@ApiModelProperty(value = "实测油耗(L/100km)")
+		private String measuredFuelConsumption;
+	/**
+	* 整车质保
+	*/
+		@ApiModelProperty(value = "整车质保")
+		private String vehicleWarranty;
+	/**
+	* 长度(mm)
+	*/
+		@ApiModelProperty(value = "长度(mm)")
+		private String length;
+	/**
+	* 宽度(mm)
+	*/
+		@ApiModelProperty(value = "宽度(mm)")
+		private String width;
+	/**
+	* 高度(mm)
+	*/
+		@ApiModelProperty(value = "高度(mm)")
+		private String height;
+	/**
+	* 轴距(mm)
+	*/
+		@ApiModelProperty(value = "轴距(mm)")
+		private String wheelbase;
+	/**
+	* 前轮距(mm)
+	*/
+		@ApiModelProperty(value = "前轮距(mm)")
+		private String frontTrack;
+	/**
+	* 后轮距(mm)
+	*/
+		@ApiModelProperty(value = "后轮距(mm)")
+		private String rearTrackWidth;
+	/**
+	* 最小离地间隙(mm)
+	*/
+		@ApiModelProperty(value = "最小离地间隙(mm)")
+		private String minimumGroundClearance;
+	/**
+	* 车门数(个)
+	*/
+		@ApiModelProperty(value = "车门数(个)")
+		private Integer numberOfDoors;
+	/**
+	* 座位数(个)
+	*/
+		@ApiModelProperty(value = "座位数(个)")
+		private Integer seats;
+	/**
+	* 后排车门开启方式
+	*/
+		@ApiModelProperty(value = "后排车门开启方式")
+		private String rearDoorOpeningMode;
+	/**
+	* 油箱容积(L)
+	*/
+		@ApiModelProperty(value = "油箱容积(L)")
+		private Integer tankVolume;
+	/**
+	* 行李厢容积(L)
+	*/
+		@ApiModelProperty(value = "行李厢容积(L)")
+		private Integer luggageCompartmentVolume;
+	/**
+	* 货箱尺寸(mm)
+	*/
+		@ApiModelProperty(value = "货箱尺寸(mm)")
+		private String containerSize;
+	/**
+	* 最大载重质量(kg)
+	*/
+		@ApiModelProperty(value = "最大载重质量(kg)")
+		private String maximumLoadMass;
+	/**
+	* 整备质量(kg)
+	*/
+		@ApiModelProperty(value = "整备质量(kg)")
+		private String curbWeight;
+	/**
+	* 发动机型号
+	*/
+		@ApiModelProperty(value = "发动机型号")
+		private String engineModel;
+	/**
+	* 排量(mL)
+	*/
+		@ApiModelProperty(value = "排量(mL)")
+		private String displacementMl;
+	/**
+	* 排量(L)
+	*/
+		@ApiModelProperty(value = "排量(L)")
+		private String displacementL;
+	/**
+	* 进气形式
+	*/
+		@ApiModelProperty(value = "进气形式")
+		private String airIntakeForm;
+	/**
+	* 气缸排列形式
+	*/
+		@ApiModelProperty(value = "气缸排列形式")
+		private String cylinderArrangement;
+	/**
+	* 气缸数(个)
+	*/
+		@ApiModelProperty(value = "气缸数(个)")
+		private Integer numberCylinders;
+	/**
+	* 每缸气门数(个)
+	*/
+		@ApiModelProperty(value = "每缸气门数(个)")
+		private Integer valveTrain;
+	/**
+	* 压缩比
+	*/
+		@ApiModelProperty(value = "压缩比")
+		private String compressionRatio;
+	/**
+	* 配气机构
+	*/
+		@ApiModelProperty(value = "配气机构")
+		private String distributionMechanism;
+	/**
+	* 缸径(mm)
+	*/
+		@ApiModelProperty(value = "缸径(mm)")
+		private String cylinderDiameter;
+	/**
+	* 行程(mm)
+	*/
+		@ApiModelProperty(value = "行程(mm)")
+		private String routeDistanceTravel;
+	/**
+	* 最大马力(Ps)
+	*/
+		@ApiModelProperty(value = "最大马力(Ps)")
+		private String maximumHorsepower;
+	/**
+	* 最大功率转速(rpm)
+	*/
+		@ApiModelProperty(value = "最大功率转速(rpm)")
+		private String maximumPowerSpeed;
+	/**
+	* 最大扭矩转速(rpm)
+	*/
+		@ApiModelProperty(value = "最大扭矩转速(rpm)")
+		private String maximumTorqueSpeed;
+	/**
+	* 发动机特有技术
+	*/
+		@ApiModelProperty(value = "发动机特有技术")
+		private String engineSpecificTechnology;
+	/**
+	* 燃料形式
+	*/
+		@ApiModelProperty(value = "燃料形式")
+		private String fuelForm;
+	/**
+	* 燃油标号
+	*/
+		@ApiModelProperty(value = "燃油标号")
+		private String fuelGrade;
+	/**
+	* 供油方式
+	*/
+		@ApiModelProperty(value = "供油方式")
+		private String oilSupplyMode;
+	/**
+	* 缸盖材料
+	*/
+		@ApiModelProperty(value = "缸盖材料")
+		private String cylinderHeadMaterial;
+	/**
+	* 缸体材料
+	*/
+		@ApiModelProperty(value = "缸体材料")
+		private String cylinderBlockMaterial;
+	/**
+	* 环保标准
+	*/
+		@ApiModelProperty(value = "环保标准")
+		private String environmentalStandards;
+	/**
+	* 电动机总功率(kW)
+	*/
+		@ApiModelProperty(value = "电动机总功率(kW)")
+		private String totalMotorPower;
+	/**
+	* 电动机总扭矩(N·m)
+	*/
+		@ApiModelProperty(value = "电动机总扭矩(N·m)")
+		private String totalTorqueMotor;
+	/**
+	* 前电动机最大功率(kW)
+	*/
+		@ApiModelProperty(value = "前电动机最大功率(kW)")
+		private String maximumPowerFrontMotor;
+	/**
+	* 前电动机最大扭矩(N·m)
+	*/
+		@ApiModelProperty(value = "前电动机最大扭矩(N·m)")
+		private String maximumTorqueFrontMotor;
+	/**
+	* 后电动机最大功率(kW)
+	*/
+		@ApiModelProperty(value = "后电动机最大功率(kW)")
+		private String maximumPowerRearMotor;
+	/**
+	* 后电动机最大扭矩(N·m)
+	*/
+		@ApiModelProperty(value = "后电动机最大扭矩(N·m)")
+		private String maximumTorqueRearMotor;
+	/**
+	* 系统综合功率(kW)
+	*/
+		@ApiModelProperty(value = "系统综合功率(kW)")
+		private String systemComprehensivePower;
+	/**
+	* 系统综合扭矩(N·m)
+	*/
+		@ApiModelProperty(value = "系统综合扭矩(N·m)")
+		private String comprehensiveTorqueSystem;
+	/**
+	* 工信部纯电续航里程(km)
+	*/
+		@ApiModelProperty(value = "工信部纯电续航里程(km)")
+		private String miitPureElectricRange;
+	/**
+	* 电池容量(kWh)
+	*/
+		@ApiModelProperty(value = "电池容量(kWh)")
+		private String batteryCapacity;
+	/**
+	* 百公里耗电量(kWh/100km)
+	*/
+		@ApiModelProperty(value = "百公里耗电量(kWh/100km)")
+		private String powerConsumptionPerHundredKilometers;
+	/**
+	* 快充时间(小时)
+	*/
+		@ApiModelProperty(value = "快充时间(小时)")
+		private String fastChargingTime;
+	/**
+	* 慢充时间(小时)
+	*/
+		@ApiModelProperty(value = "慢充时间(小时)")
+		private String slowChargingTime;
+	/**
+	* 快充电量百分比
+	*/
+		@ApiModelProperty(value = "快充电量百分比")
+		private String fastChargePercentage;
+	/**
+	* 快充电量(%)
+	*/
+		@ApiModelProperty(value = "快充电量(%)")
+		private String fastCharge;
+	/**
+	* 电池充电时间
+	*/
+		@ApiModelProperty(value = "电池充电时间")
+		private String batteryChargingTime;
+	/**
+	* 实测快充时间(小时)
+	*/
+		@ApiModelProperty(value = "实测快充时间(小时)")
+		private String measuredFastChargingTime;
+	/**
+	* 实测慢充时间(小时)
+	*/
+		@ApiModelProperty(value = "实测慢充时间(小时)")
+		private String measuredSlowChargingTime;
+	/**
+	* 实测续航里程(km)
+	*/
+		@ApiModelProperty(value = "实测续航里程(km)")
+		private String measuredmmileage;
+	/**
+	* 电机类型
+	*/
+		@ApiModelProperty(value = "电机类型")
+		private String motorType;
+	/**
+	* 驱动电机数
+	*/
+		@ApiModelProperty(value = "驱动电机数")
+		private String numberDriveMotors;
+	/**
+	* 电机布局
+	*/
+		@ApiModelProperty(value = "电机布局")
+		private String motorLayout;
+	/**
+	* 电池类型
+	*/
+		@ApiModelProperty(value = "电池类型")
+		private String batteryType;
+	/**
+	* 电池组质保
+	*/
+		@ApiModelProperty(value = "电池组质保")
+		private String batteryPackWarranty;
+	/**
+	* 电池能量(kWh)
+	*/
+		@ApiModelProperty(value = "电池能量(kWh)")
+		private String batteryEnergy;
+	/**
+	* 电池预加热
+	*/
+		@ApiModelProperty(value = "电池预加热")
+		private String batteryPreHeating;
+	/**
+	* OTA升级
+	*/
+		@ApiModelProperty(value = "OTA升级")
+		private String otaUpgrade;
+	/**
+	* 挡位个数
+	*/
+		@ApiModelProperty(value = "挡位个数")
+		private String numberGears;
+	/**
+	* 变速箱类型
+	*/
+		@ApiModelProperty(value = "变速箱类型")
+		private String transmissionType;
+	/**
+	* 简称
+	*/
+		@ApiModelProperty(value = "简称")
+		private String abbreviation;
+	/**
+	* 驱动方式
+	*/
+		@ApiModelProperty(value = "驱动方式")
+		private String driveMode;
+	/**
+	* 中央差速器结构
+	*/
+		@ApiModelProperty(value = "中央差速器结构")
+		private String centerDifferentialStructure;
+	/**
+	* 前悬架类型
+	*/
+		@ApiModelProperty(value = "前悬架类型")
+		private String frontSuspensionType;
+	/**
+	* 后悬架类型
+	*/
+		@ApiModelProperty(value = "后悬架类型")
+		private String rearSuspensionType;
+	/**
+	* 助力类型
+	*/
+		@ApiModelProperty(value = "助力类型")
+		private String assistanceType;
+	/**
+	* 车体结构
+	*/
+		@ApiModelProperty(value = "车体结构")
+		private String carbodyStructure;
+	/**
+	* 前制动器类型
+	*/
+		@ApiModelProperty(value = "前制动器类型")
+		private String frontBrakeType;
+	/**
+	* 后制动器类型
+	*/
+		@ApiModelProperty(value = "后制动器类型")
+		private String rearBrakeType;
+	/**
+	* 驻车制动类型
+	*/
+		@ApiModelProperty(value = "驻车制动类型")
+		private String parkingBrakeType;
+	/**
+	* 四驱形式
+	*/
+		@ApiModelProperty(value = "四驱形式")
+		private String fourwheelType;
+	/**
+	* 前轮胎规格
+	*/
+		@ApiModelProperty(value = "前轮胎规格")
+		private String frontTireSpecification;
+	/**
+	* 前轮胎规格检索
+	*/
+		@ApiModelProperty(value = "前轮胎规格检索")
+		private String frontTireSpecificationLike;
+	/**
+	* 后轮胎规格
+	*/
+		@ApiModelProperty(value = "后轮胎规格")
+		private String rearTireSpecification;
+	/**
+	* 后轮胎规格检索
+	*/
+		@ApiModelProperty(value = "后轮胎规格检索")
+		private String rearTireSpecificationLike;
+	/**
+	* 备胎规格
+	*/
+		@ApiModelProperty(value = "备胎规格")
+		private String spareTireSpecification;
+
+
+}

+ 140 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/VehicleSeries.java

@@ -0,0 +1,140 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 车辆车系实体类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Data
+@TableName("basic_vehicle_series")
+@ApiModel(value = "VehicleSeries对象", description = "车辆车系")
+public class VehicleSeries implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	* 主键
+	*/
+		@ApiModelProperty(value = "主键")
+		private Long id;
+	/**
+	* 创建人
+	*/
+		@ApiModelProperty(value = "创建人")
+		private Long createUser;
+	/**
+	* 创建部门
+	*/
+		@ApiModelProperty(value = "创建部门")
+		private Long createDept;
+	/**
+	* 创建时间
+	*/
+		@ApiModelProperty(value = "创建时间")
+		private Date createTime;
+	/**
+	* 修改人
+	*/
+		@ApiModelProperty(value = "修改人")
+		private Long updateUser;
+	/**
+	* 修改时间
+	*/
+		@ApiModelProperty(value = "修改时间")
+		private Date updateTime;
+	/**
+	* 状态
+	*/
+		@ApiModelProperty(value = "状态")
+		private Integer status;
+	/**
+	* 是否已删除(0 否 1是)
+	*/
+		@ApiModelProperty(value = "是否已删除(0 否 1是)")
+		private Integer isDeleted;
+	/**
+	* 车系id
+	*/
+		@ApiModelProperty(value = "车系id")
+		private String seriesId;
+	/**
+	* 首字母
+	*/
+		@ApiModelProperty(value = "首字母")
+		private String initial;
+	/**
+	* 品牌id
+	*/
+		@ApiModelProperty(value = "品牌id")
+		private String brandId;
+	/**
+	* 车系名称
+	*/
+		@ApiModelProperty(value = "车系名称")
+		private String seriesName;
+	/**
+	* 厂商名称
+	*/
+		@ApiModelProperty(value = "厂商名称")
+		private String manufacturerName;
+	/**
+	* 厂商id
+	*/
+		@ApiModelProperty(value = "厂商id")
+		private String manufacturerId;
+	/**
+	* 车型级别
+	*/
+		@ApiModelProperty(value = "车型级别")
+		private String modelLevel;
+	/**
+	* 最高价
+	*/
+		@ApiModelProperty(value = "最高价")
+		private BigDecimal maximumPrice;
+	/**
+	* 车系展示图
+	*/
+		@ApiModelProperty(value = "车系展示图")
+		private String seriesExhibit;
+	/**
+	* 更新时间
+	*/
+		@ApiModelProperty(value = "更新时间")
+		private Date renewTime;
+	/**
+	* 最低价
+	*/
+		@ApiModelProperty(value = "最低价")
+		private BigDecimal bottomPrice;
+
+
+}

+ 53 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/excel/VehicleBrandExcel.java

@@ -0,0 +1,53 @@
+package org.springblade.client.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 车辆品牌导入模板
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class VehicleBrandExcel implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 首字母
+	 */
+	@ExcelProperty(value = "首字母")
+	private String initial;
+
+	/**
+	 * 品牌
+	 */
+	@ExcelProperty(value = "品牌")
+	private String brand;
+
+	/**
+	 * 品牌id
+	 */
+	@ExcelProperty(value = "品牌_id")
+	private String brandId;
+
+	/**
+	 * 品牌logo
+	 */
+	@ExcelProperty(value = "品牌logo")
+	private String brandLogo;
+
+	/**
+	 * 更新时间
+	 */
+	@ExcelProperty(value = "更新时间")
+	private Date renewTime;
+
+}

+ 605 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/excel/VehicleModelExcel.java

@@ -0,0 +1,605 @@
+package org.springblade.client.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 车辆车型导入模板
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class VehicleModelExcel implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 首字母
+	 */
+	@ExcelProperty(value = "首字母")
+	private String initial;
+	/**
+	 * 品牌
+	 */
+	@ExcelProperty(value = "品牌")
+	private String brandName;
+	/**
+	 * 品牌id
+	 */
+	@ExcelProperty(value = "品牌_id")
+	private String brandId;
+	/**
+	 * 品牌logo
+	 */
+	@ExcelProperty(value = "品牌logo")
+	private String brandLogo;
+	/**
+	 * 车系名称
+	 */
+	@ExcelProperty(value = "车系")
+	private String seriesName;
+	/**
+	 * 车系id
+	 */
+	@ExcelProperty(value = "车系_id")
+	private String seriesId;
+	/**
+	 * 车系展示图
+	 */
+	@ExcelProperty(value = "车系展示图")
+	private String seriesExhibit;
+	/**
+	 * 车型名称
+	 */
+	@ExcelProperty(value = "车型名称")
+	private String modelName;
+	/**
+	 * 车型id
+	 */
+	@ExcelProperty(value = "车型_id")
+	private String modelId;
+	/**
+	 * 销售状态
+	 */
+	@ExcelProperty(value = "销售状态")
+	private String sellStatus;
+	/**
+	 * 厂商名称
+	 */
+	@ExcelProperty(value = "厂商")
+	private String manufacturerName;
+	/**
+	 * 厂商id
+	 */
+	@ExcelProperty(value = "厂商_id")
+	private String manufacturerId;
+	/**
+	 * 年款
+	 */
+	@ExcelProperty(value = "年款")
+	private String modelYear;
+	/**
+	 * 更新时间
+	 */
+	@ExcelProperty(value = "更新时间")
+	private Date renewTime;
+	/**
+	 * 上市时间
+	 */
+	@ExcelProperty(value = "上市时间")
+	private Date marketTime;
+	/**
+	 * 厂商指导价(万)
+	 */
+	@ExcelProperty(value = "厂商指导价(万)")
+	private String manufacturerPriceWan;
+	/**
+	 * 厂商指导价(元)
+	 */
+	@ExcelProperty(value = "厂商指导价(元)")
+	private String manufacturerPriceYuan;
+	/**
+	 * 经销商参考价
+	 */
+	@ExcelProperty(value = "经销商参考价")
+	private String dealerReferencePrice;
+	/**
+	 * 车商城一口价
+	 */
+	@ExcelProperty(value = "车商城一口价")
+	private String carMallBuyItNow;
+	/**
+	 * 级别
+	 */
+	@ExcelProperty(value = "级别")
+	private String rank;
+	/**
+	 * 能源类型
+	 */
+	@ExcelProperty(value = "能源类型")
+	private String energyType;
+	/**
+	 * 最大功率(kw)
+	 */
+	@ExcelProperty(value = "最大功率(kw)")
+	private String maximumPower;
+	/**
+	 * 最大扭矩(N·m)
+	 */
+	@ExcelProperty(value = "最大扭矩(N·m)")
+	private String maximumTorque;
+	/**
+	 * 电动机
+	 */
+	@ExcelProperty(value = "电动机")
+	private String electricMotor;
+	/**
+	 * 发动机
+	 */
+	@ExcelProperty(value = "发动机")
+	private String engine;
+	/**
+	 * 电动机(ps)
+	 */
+	@ExcelProperty(value = "电动机(ps)")
+	private String electricMotorPs;
+	/**
+	 * 变速箱
+	 */
+	@ExcelProperty(value = "变速箱")
+	private String transmissionCase;
+	/**
+	 * 长*宽*高(mm)
+	 */
+	@ExcelProperty(value = "长*宽*高(mm)")
+	private String lengthWidthHeight;
+	/**
+	 * 车身结构
+	 */
+	@ExcelProperty(value = "车身结构")
+	private String bodyStructure;
+	/**
+	 * 最高车速(km/h)
+	 */
+	@ExcelProperty(value = "最高车速(km/h)")
+	private String maximumSpeed;
+	/**
+	 * 官方0-100km/h加速(s)
+	 */
+	@ExcelProperty(value = "官方0-100km/h加速(s)")
+	private String officialAcceleration;
+	/**
+	 * 实测0-100km/h加速(s)
+	 */
+	@ExcelProperty(value = "实测0-100km/h加速(s)")
+	private String measuredAcceleration;
+	/**
+	 * 实测100-0km/h制动(m)
+	 */
+	@ExcelProperty(value = "实测100-0km/h制动(m)")
+	private String measuredBraking;
+	/**
+	 * 工信部综合油耗(L/100km)
+	 */
+	@ExcelProperty(value = "工信部综合油耗(L/100km)")
+	private String miitOilConsumption;
+	/**
+	 * 工信部续航里程(km)
+	 */
+	@ExcelProperty(value = "工信部续航里程(km)")
+	private String miitRange;
+	/**
+	 * 实测油耗(L/100km)
+	 */
+	@ExcelProperty(value = "实测油耗(L/100km)")
+	private String measuredFuelConsumption;
+	/**
+	 * 整车质保
+	 */
+	@ExcelProperty(value = "整车质保")
+	private String vehicleWarranty;
+	/**
+	 * 长度(mm)
+	 */
+	@ExcelProperty(value = "长度(mm)")
+	private String length;
+	/**
+	 * 宽度(mm)
+	 */
+	@ExcelProperty(value = "宽度(mm)")
+	private String width;
+	/**
+	 * 高度(mm)
+	 */
+	@ExcelProperty(value = "高度(mm)")
+	private String height;
+	/**
+	 * 轴距(mm)
+	 */
+	@ExcelProperty(value = "轴距(mm)")
+	private String wheelbase;
+	/**
+	 * 前轮距(mm)
+	 */
+	@ExcelProperty(value = "前轮距(mm)")
+	private String frontTrack;
+	/**
+	 * 后轮距(mm)
+	 */
+	@ExcelProperty(value = "后轮距(mm)")
+	private String rearTrackWidth;
+	/**
+	 * 最小离地间隙(mm)
+	 */
+	@ExcelProperty(value = "最小离地间隙(mm)")
+	private String minimumGroundClearance;
+	/**
+	 * 车门数(个)
+	 */
+	@ExcelProperty(value = "车门数(个)")
+	private Integer numberOfDoors;
+	/**
+	 * 座位数(个)
+	 */
+	@ExcelProperty(value = "座位数(个)")
+	private Integer seats;
+	/**
+	 * 后排车门开启方式
+	 */
+	@ExcelProperty(value = "后排车门开启方式")
+	private String rearDoorOpeningMode;
+	/**
+	 * 油箱容积(L)
+	 */
+	@ExcelProperty(value = "油箱容积(L)")
+	private Integer tankVolume;
+	/**
+	 * 行李厢容积(L)
+	 */
+	@ExcelProperty(value = "行李厢容积(L)")
+	private Integer luggageCompartmentVolume;
+	/**
+	 * 货箱尺寸(mm)
+	 */
+	@ExcelProperty(value = "货箱尺寸(mm)")
+	private String containerSize;
+	/**
+	 * 最大载重质量(kg)
+	 */
+	@ExcelProperty(value = "最大载重质量(kg)")
+	private String maximumLoadMass;
+	/**
+	 * 整备质量(kg)
+	 */
+	@ExcelProperty(value = "整备质量(kg)")
+	private String curbWeight;
+	/**
+	 * 发动机型号
+	 */
+	@ExcelProperty(value = "发动机型号")
+	private String engineModel;
+	/**
+	 * 排量(mL)
+	 */
+	@ExcelProperty(value = "排量(mL)")
+	private String displacementMl;
+	/**
+	 * 排量(L)
+	 */
+	@ExcelProperty(value = "排量(L)")
+	private String displacementL;
+	/**
+	 * 进气形式
+	 */
+	@ExcelProperty(value = "进气形式")
+	private String airIntakeForm;
+	/**
+	 * 气缸排列形式
+	 */
+	@ExcelProperty(value = "气缸排列形式")
+	private String cylinderArrangement;
+	/**
+	 * 气缸数(个)
+	 */
+	@ExcelProperty(value = "气缸数(个)")
+	private Integer numberCylinders;
+	/**
+	 * 每缸气门数(个)
+	 */
+	@ExcelProperty(value = "每缸气门数(个)")
+	private Integer valveTrain;
+	/**
+	 * 压缩比
+	 */
+	@ExcelProperty(value = "压缩比")
+	private String compressionRatio;
+	/**
+	 * 配气机构
+	 */
+	@ExcelProperty(value = "配气机构")
+	private String distributionMechanism;
+	/**
+	 * 缸径(mm)
+	 */
+	@ExcelProperty(value = "缸径(mm)")
+	private String cylinderDiameter;
+	/**
+	 * 行程(mm)
+	 */
+	@ExcelProperty(value = "行程(mm)")
+	private String routeDistanceTravel;
+	/**
+	 * 最大马力(Ps)
+	 */
+	@ExcelProperty(value = "最大马力(Ps)")
+	private String maximumHorsepower;
+	/**
+	 * 最大功率转速(rpm)
+	 */
+	@ExcelProperty(value = "最大功率转速(rpm)")
+	private String maximumPowerSpeed;
+	/**
+	 * 最大扭矩转速(rpm)
+	 */
+	@ExcelProperty(value = "最大扭矩转速(rpm)")
+	private String maximumTorqueSpeed;
+	/**
+	 * 发动机特有技术
+	 */
+	@ExcelProperty(value = "发动机特有技术")
+	private String engineSpecificTechnology;
+	/**
+	 * 燃料形式
+	 */
+	@ExcelProperty(value = "燃料形式")
+	private String fuelForm;
+	/**
+	 * 燃油标号
+	 */
+	@ExcelProperty(value = "燃油标号")
+	private String fuelGrade;
+	/**
+	 * 供油方式
+	 */
+	@ExcelProperty(value = "供油方式")
+	private String oilSupplyMode;
+	/**
+	 * 缸盖材料
+	 */
+	@ExcelProperty(value = "缸盖材料")
+	private String cylinderHeadMaterial;
+	/**
+	 * 缸体材料
+	 */
+	@ExcelProperty(value = "缸体材料")
+	private String cylinderBlockMaterial;
+	/**
+	 * 环保标准
+	 */
+	@ExcelProperty(value = "环保标准")
+	private String environmentalStandards;
+	/**
+	 * 电动机总功率(kW)
+	 */
+	@ExcelProperty(value = "电动机总功率(kW)")
+	private String totalMotorPower;
+	/**
+	 * 电动机总扭矩(N·m)
+	 */
+	@ExcelProperty(value = "电动机总扭矩(N·m)")
+	private String totalTorqueMotor;
+	/**
+	 * 前电动机最大功率(kW)
+	 */
+	@ExcelProperty(value = "前电动机最大功率(kW)")
+	private String maximumPowerFrontMotor;
+	/**
+	 * 前电动机最大扭矩(N·m)
+	 */
+	@ExcelProperty(value = "前电动机最大扭矩(N·m)")
+	private String maximumTorqueFrontMotor;
+	/**
+	 * 后电动机最大功率(kW)
+	 */
+	@ExcelProperty(value = "后电动机最大功率(kW)")
+	private String maximumPowerRearMotor;
+	/**
+	 * 后电动机最大扭矩(N·m)
+	 */
+	@ExcelProperty(value = "后电动机最大扭矩(N·m)")
+	private String maximumTorqueRearMotor;
+	/**
+	 * 系统综合功率(kW)
+	 */
+	@ExcelProperty(value = "系统综合功率(kW)")
+	private String systemComprehensivePower;
+	/**
+	 * 系统综合扭矩(N·m)
+	 */
+	@ExcelProperty(value = "系统综合扭矩(N·m)")
+	private String comprehensiveTorqueSystem;
+	/**
+	 * 工信部纯电续航里程(km)
+	 */
+	@ExcelProperty(value = "工信部纯电续航里程(km)")
+	private String miitPureElectricRange;
+	/**
+	 * 电池容量(kWh)
+	 */
+	@ExcelProperty(value = "电池容量(kWh)")
+	private String batteryCapacity;
+	/**
+	 * 百公里耗电量(kWh/100km)
+	 */
+	@ExcelProperty(value = "百公里耗电量(kWh/100km)")
+	private String powerConsumptionPerHundredKilometers;
+	/**
+	 * 快充时间(小时)
+	 */
+	@ExcelProperty(value = "快充时间(小时)")
+	private String fastChargingTime;
+	/**
+	 * 慢充时间(小时)
+	 */
+	@ExcelProperty(value = "慢充时间(小时)")
+	private String slowChargingTime;
+	/**
+	 * 快充电量百分比
+	 */
+	@ExcelProperty(value = "快充电量百分比")
+	private String fastChargePercentage;
+	/**
+	 * 快充电量(%)
+	 */
+	@ExcelProperty(value = "快充电量(%)")
+	private String fastCharge;
+	/**
+	 * 电池充电时间
+	 */
+	@ExcelProperty(value = "电池充电时间")
+	private String batteryChargingTime;
+	/**
+	 * 实测快充时间(小时)
+	 */
+	@ExcelProperty(value = "实测快充时间(小时)")
+	private String measuredFastChargingTime;
+	/**
+	 * 实测慢充时间(小时)
+	 */
+	@ExcelProperty(value = "实测慢充时间(小时)")
+	private String measuredSlowChargingTime;
+	/**
+	 * 实测续航里程(km)
+	 */
+	@ExcelProperty(value = "实测续航里程(km)")
+	private String measuredmmileage;
+	/**
+	 * 电机类型
+	 */
+	@ExcelProperty(value = "电机类型")
+	private String motorType;
+	/**
+	 * 驱动电机数
+	 */
+	@ExcelProperty(value = "驱动电机数")
+	private String numberDriveMotors;
+	/**
+	 * 电机布局
+	 */
+	@ExcelProperty(value = "电机布局")
+	private String motorLayout;
+	/**
+	 * 电池类型
+	 */
+	@ExcelProperty(value = "电池类型")
+	private String batteryType;
+	/**
+	 * 电池组质保
+	 */
+	@ExcelProperty(value = "电池组质保")
+	private String batteryPackWarranty;
+	/**
+	 * 电池能量(kWh)
+	 */
+	@ExcelProperty(value = "电池能量(kWh)")
+	private String batteryEnergy;
+	/**
+	 * 电池预加热
+	 */
+	@ExcelProperty(value = "电池预加热")
+	private String batteryPreHeating;
+	/**
+	 * OTA升级
+	 */
+	@ExcelProperty(value = "OTA升级")
+	private String otaUpgrade;
+	/**
+	 * 挡位个数
+	 */
+	@ExcelProperty(value = "挡位个数")
+	private String numberGears;
+	/**
+	 * 变速箱类型
+	 */
+	@ExcelProperty(value = "变速箱类型")
+	private String transmissionType;
+	/**
+	 * 简称
+	 */
+	@ExcelProperty(value = "简称")
+	private String abbreviation;
+	/**
+	 * 驱动方式
+	 */
+	@ExcelProperty(value = "驱动方式")
+	private String driveMode;
+	/**
+	 * 中央差速器结构
+	 */
+	@ExcelProperty(value = "中央差速器结构")
+	private String centerDifferentialStructure;
+	/**
+	 * 前悬架类型
+	 */
+	@ExcelProperty(value = "前悬架类型")
+	private String frontSuspensionType;
+	/**
+	 * 后悬架类型
+	 */
+	@ExcelProperty(value = "后悬架类型")
+	private String rearSuspensionType;
+	/**
+	 * 助力类型
+	 */
+	@ExcelProperty(value = "助力类型")
+	private String assistanceType;
+	/**
+	 * 车体结构
+	 */
+	@ExcelProperty(value = "车体结构")
+	private String carbodyStructure;
+	/**
+	 * 前制动器类型
+	 */
+	@ExcelProperty(value = "前制动器类型")
+	private String frontBrakeType;
+	/**
+	 * 后制动器类型
+	 */
+	@ExcelProperty(value = "后制动器类型")
+	private String rearBrakeType;
+	/**
+	 * 驻车制动类型
+	 */
+	@ExcelProperty(value = "驻车制动类型")
+	private String parkingBrakeType;
+	/**
+	 * 四驱形式
+	 */
+	@ExcelProperty(value = "四驱形式")
+	private String fourwheelType;
+	/**
+	 * 前轮胎规格
+	 */
+	@ExcelProperty(value = "前轮胎规格")
+	private String frontTireSpecification;
+
+	/**
+	 * 后轮胎规格
+	 */
+	@ExcelProperty(value = "后轮胎规格")
+	private String rearTireSpecification;
+
+	/**
+	 * 备胎规格
+	 */
+	@ExcelProperty(value = "备胎规格")
+	private String spareTireSpecification;
+}

+ 82 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/excel/VehicleSeriesExcel.java

@@ -0,0 +1,82 @@
+package org.springblade.client.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 车辆车系导入模板
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class VehicleSeriesExcel implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 车系id
+	 */
+	@ExcelProperty(value = "车系_id")
+	private String seriesId;
+	/**
+	 * 首字母
+	 */
+	@ExcelProperty(value = "首字母")
+	private String initial;
+	/**
+	 * 品牌id
+	 */
+	@ExcelProperty(value = "品牌_id")
+	private String brandId;
+	/**
+	 * 车系名称
+	 */
+	@ExcelProperty(value = "车系")
+	private String seriesName;
+	/**
+	 * 厂商名称
+	 */
+	@ExcelProperty(value = "厂商")
+	private String manufacturerName;
+	/**
+	 * 厂商_id
+	 */
+	@ExcelProperty(value = "厂商_id")
+	private String manufacturerId;
+	/**
+	 * 车型级别
+	 */
+	@ExcelProperty(value = "车型级别")
+	private String modelLevel;
+
+	/**
+	 * 最低指导价万
+	 */
+	@ExcelProperty(value = "最低指导价万")
+	private BigDecimal bottomPrice;
+
+	/**
+	 * 最高指导价万
+	 */
+	@ExcelProperty(value = "最高指导价万")
+	private BigDecimal maximumPrice;
+	/**
+	 * 车系展示图
+	 */
+	@ExcelProperty(value = "车系展示图")
+	private String seriesExhibit;
+	/**
+	 * 更新时间
+	 */
+	@ExcelProperty(value = "更新时间")
+	private Date renewTime;
+
+}

+ 36 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/vo/VehicleBrandVO.java

@@ -0,0 +1,36 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+import org.springblade.client.entity.VehicleBrand;
+
+/**
+ * 车辆品牌视图实体类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "VehicleBrandVO对象", description = "车辆品牌")
+public class VehicleBrandVO extends VehicleBrand {
+	private static final long serialVersionUID = 1L;
+
+}

+ 36 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/vo/VehicleModelVO.java

@@ -0,0 +1,36 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+import org.springblade.client.entity.VehicleModel;
+
+/**
+ * 视图实体类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "VehicleModelVO对象", description = "VehicleModelVO对象")
+public class VehicleModelVO extends VehicleModel {
+	private static final long serialVersionUID = 1L;
+
+}

+ 36 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/vo/VehicleSeriesVO.java

@@ -0,0 +1,36 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+import org.springblade.client.entity.VehicleSeries;
+
+/**
+ * 车辆车系视图实体类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "VehicleSeriesVO对象", description = "车辆车系")
+public class VehicleSeriesVO extends VehicleSeries {
+	private static final long serialVersionUID = 1L;
+
+}

+ 16 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/service/impl/AnnualBudgetItemServiceImpl.java

@@ -103,6 +103,7 @@ public class AnnualBudgetItemServiceImpl extends ServiceImpl<AnnualBudgetItemMap
 					e.setOrderSummary(e.getKeterOrdQuantity().add(e.getXcentwayOrdQuantity()).add(e.getLuxxanOrdQuantity()).add(e.getDrivemasterOrdQuantity()));
 					//发货汇总
 					e.setDeliverySummary(e.getKeterDeliverQuantity().add(e.getXcentwayDeliverQuantity()).add(e.getLuxxanDeliverQuantity()).add(e.getDrivemasterDeliverQuantity()));
+
 				}else {
 					e.setKeterOrdQuantity(BigDecimal.ZERO);
 					e.setKeterDeliverQuantity(BigDecimal.ZERO);
@@ -115,6 +116,21 @@ public class AnnualBudgetItemServiceImpl extends ServiceImpl<AnnualBudgetItemMap
 					e.setOrderSummary(BigDecimal.ZERO);
 					e.setDeliverySummary(BigDecimal.ZERO);
 				}
+				if (ObjectUtil.isEmpty(e.getQuantitySummary())){
+					e.setQuantitySummary(BigDecimal.ZERO);
+				}
+				//订单完成率
+				if (e.getQuantitySummary().compareTo(BigDecimal.ZERO) > 0) {
+					e.setOrderCompletionRate(e.getOrderSummary().divide(e.getQuantitySummary(), 2, BigDecimal.ROUND_HALF_UP));
+				} else {
+					e.setOrderCompletionRate(BigDecimal.ZERO);
+				}
+				//发货完成率
+				if (e.getQuantitySummary().compareTo(BigDecimal.ZERO) > 0) {
+					e.setDeliveryCompletionRate(e.getOrderSummary().divide(e.getQuantitySummary(), 2, BigDecimal.ROUND_HALF_UP));
+				} else {
+					e.setDeliveryCompletionRate(BigDecimal.ZERO);
+				}
 			});
 		}
 		return iPage;

+ 306 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/controller/VehicleBrandController.java

@@ -0,0 +1,306 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.client.entity.CorpsDesc;
+import org.springblade.client.entity.VehicleBrand;
+import org.springblade.client.excel.VehicleBrandExcel;
+import org.springblade.client.vo.CorpsDescVO;
+import org.springblade.client.vo.VehicleBrandVO;
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springframework.web.bind.annotation.*;
+import org.springblade.client.vehicle.service.IVehicleBrandService;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 车辆品牌 控制器
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/vehicleBrand")
+@Api(value = "车辆品牌", tags = "车辆品牌接口")
+public class VehicleBrandController extends BladeController {
+
+	private final IVehicleBrandService vehicleBrandService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入vehicleBrand")
+	public R<VehicleBrand> detail(VehicleBrand vehicleBrand) {
+		VehicleBrand detail = vehicleBrandService.getOne(Condition.getQueryWrapper(vehicleBrand));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 车辆品牌
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入vehicleBrand")
+	public R<IPage<VehicleBrand>> list(VehicleBrand vehicleBrand, Query query) {
+		IPage<VehicleBrand> pages = vehicleBrandService.page(Condition.getPage(query), Condition.getQueryWrapper(vehicleBrand));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页 车辆品牌
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入vehicleBrand")
+	public R<IPage<VehicleBrandVO>> page(VehicleBrandVO vehicleBrand, Query query) {
+		IPage<VehicleBrandVO> pages = vehicleBrandService.selectVehicleBrandPage(Condition.getPage(query), vehicleBrand);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 车辆品牌
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入vehicleBrand")
+	public R save(@Valid @RequestBody VehicleBrand vehicleBrand) {
+		return R.status(vehicleBrandService.save(vehicleBrand));
+	}
+
+	/**
+	 * 修改 车辆品牌
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入vehicleBrand")
+	public R update(@Valid @RequestBody VehicleBrand vehicleBrand) {
+		return R.status(vehicleBrandService.updateById(vehicleBrand));
+	}
+
+	/**
+	 * 新增或修改 车辆品牌
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入vehicleBrand")
+	public R submit(@Valid @RequestBody VehicleBrand vehicleBrand) {
+		return R.status(vehicleBrandService.saveOrUpdate(vehicleBrand));
+	}
+
+
+	/**
+	 * 删除 车辆品牌
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(vehicleBrandService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 车辆品牌导入
+	 */
+	@PostMapping("/importBrand")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "车辆品牌导入", notes = "传入excel")
+	public R importBrand(@RequestParam("file") MultipartFile file) {
+		//导入数据
+		List<VehicleBrandExcel> excelList = ExcelUtil.read(file, VehicleBrandExcel.class);
+		if(CollectionUtils.isEmpty(excelList))
+		{
+			throw new SecurityException("数据不能为空");
+		}
+
+		return vehicleBrandService.importBrand(excelList,false,file);
+	}
+
+	/**
+	 * 按照首字母获得车辆品牌并分组
+	 */
+	@GetMapping("/initialAllList")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "按照首字母获得车辆品牌并分组", notes = "传入vehicleBrand")
+	public R<List<List<VehicleBrand>>> initialsAllList(VehicleBrand vehicleBrand) {
+		// 默认查有效的
+		LambdaQueryWrapper<VehicleBrand> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(VehicleBrand::getIsDeleted, 0);
+
+		//获得车辆信息
+		List<VehicleBrand> brandList = vehicleBrandService.list(lambdaQueryWrapper);
+
+		List<List<VehicleBrand>> listAll = new ArrayList<>();
+		List<VehicleBrand> listA = new ArrayList<>();
+		List<VehicleBrand> listB = new ArrayList<>();
+		List<VehicleBrand> listC = new ArrayList<>();
+		List<VehicleBrand> listD = new ArrayList<>();
+		List<VehicleBrand> listE = new ArrayList<>();
+		List<VehicleBrand> listF = new ArrayList<>();
+		List<VehicleBrand> listG = new ArrayList<>();
+		List<VehicleBrand> listH = new ArrayList<>();
+		List<VehicleBrand> listI = new ArrayList<>();
+		List<VehicleBrand> listJ = new ArrayList<>();
+		List<VehicleBrand> listK = new ArrayList<>();
+		List<VehicleBrand> listL = new ArrayList<>();
+		List<VehicleBrand> listM = new ArrayList<>();
+		List<VehicleBrand> listN = new ArrayList<>();
+		List<VehicleBrand> listO = new ArrayList<>();
+		List<VehicleBrand> listP = new ArrayList<>();
+		List<VehicleBrand> listQ = new ArrayList<>();
+		List<VehicleBrand> listR = new ArrayList<>();
+		List<VehicleBrand> listS = new ArrayList<>();
+		List<VehicleBrand> listT = new ArrayList<>();
+		List<VehicleBrand> listU = new ArrayList<>();
+		List<VehicleBrand> listV = new ArrayList<>();
+		List<VehicleBrand> listW = new ArrayList<>();
+		List<VehicleBrand> listX = new ArrayList<>();
+		List<VehicleBrand> listY = new ArrayList<>();
+		List<VehicleBrand> listZ = new ArrayList<>();
+		List<VehicleBrand> listRest = new ArrayList<>();
+
+		brandList.forEach(desc -> {
+			if (StringUtils.isNotBlank(desc.getInitial())) {
+				if (desc.getInitial().equals("A") || desc.getInitial().equals("a")) {
+					listA.add(desc);
+				} else if (desc.getInitial().equals("B") || desc.getInitial().equals("b")) {
+					listB.add(desc);
+				} else if (desc.getInitial().equals("C") || desc.getInitial().equals("c")) {
+					listC.add(desc);
+				} else if (desc.getInitial().equals("D") || desc.getInitial().equals("d")) {
+					listD.add(desc);
+				} else if (desc.getInitial().equals("E") || desc.getInitial().equals("e")) {
+					listE.add(desc);
+				} else if (desc.getInitial().equals("F") || desc.getInitial().equals("f")) {
+					listF.add(desc);
+				} else if (desc.getInitial().equals("G") || desc.getInitial().equals("g")) {
+					listG.add(desc);
+				} else if (desc.getInitial().equals("H") || desc.getInitial().equals("h")) {
+					listH.add(desc);
+				} else if (desc.getInitial().equals("I") || desc.getInitial().equals("i")) {
+					listI.add(desc);
+				} else if (desc.getInitial().equals("J") || desc.getInitial().equals("j")) {
+					listJ.add(desc);
+				} else if (desc.getInitial().equals("K") || desc.getInitial().equals("k")) {
+					listK.add(desc);
+				} else if (desc.getInitial().equals("L") || desc.getInitial().equals("l")) {
+					listL.add(desc);
+				} else if (desc.getInitial().equals("M") || desc.getInitial().equals("m")) {
+					listM.add(desc);
+				} else if (desc.getInitial().equals("N") || desc.getInitial().equals("n")) {
+					listN.add(desc);
+				} else if (desc.getInitial().equals("O") || desc.getInitial().equals("o")) {
+					listO.add(desc);
+				} else if (desc.getInitial().equals("P") || desc.getInitial().equals("p")) {
+					listP.add(desc);
+				} else if (desc.getInitial().equals("Q") || desc.getInitial().equals("q")) {
+					listQ.add(desc);
+				} else if (desc.getInitial().equals("R") || desc.getInitial().equals("r")) {
+					listR.add(desc);
+				} else if (desc.getInitial().equals("S") || desc.getInitial().equals("s")) {
+					listS.add(desc);
+				} else if (desc.getInitial().equals("T") || desc.getInitial().equals("t")) {
+					listT.add(desc);
+				} else if (desc.getInitial().equals("U") || desc.getInitial().equals("u")) {
+					listU.add(desc);
+				} else if (desc.getInitial().equals("V") || desc.getInitial().equals("v")) {
+					listV.add(desc);
+				} else if (desc.getInitial().equals("W") || desc.getInitial().equals("w")) {
+					listW.add(desc);
+				} else if (desc.getInitial().equals("X") || desc.getInitial().equals("x")) {
+					listX.add(desc);
+				} else if (desc.getInitial().equals("Y") || desc.getInitial().equals("y")) {
+					listY.add(desc);
+				} else if (desc.getInitial().equals("Z") || desc.getInitial().equals("z")) {
+					listZ.add(desc);
+				} else {
+					listRest.add(desc);
+				}
+			} else {
+				listRest.add(desc);
+			}
+		});
+		listAll.add(listA);
+		listAll.add(listB);
+		listAll.add(listC);
+		listAll.add(listD);
+		listAll.add(listE);
+		listAll.add(listF);
+		listAll.add(listG);
+		listAll.add(listH);
+		listAll.add(listI);
+		listAll.add(listJ);
+		listAll.add(listK);
+		listAll.add(listL);
+		listAll.add(listM);
+		listAll.add(listN);
+		listAll.add(listO);
+		listAll.add(listP);
+		listAll.add(listQ);
+		listAll.add(listR);
+		listAll.add(listS);
+		listAll.add(listT);
+		listAll.add(listU);
+		listAll.add(listV);
+		listAll.add(listW);
+		listAll.add(listX);
+		listAll.add(listY);
+		listAll.add(listZ);
+		listAll.add(listRest);
+		return R.data(listAll);
+	}
+
+	/**
+	 * 根据前端传值通过首字母获得车辆品牌
+	 */
+	@GetMapping("/initialList")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "根据前端传值过滤获得车辆品牌", notes = "传入vehicleBrand")
+	public R<List<VehicleBrand>> initialsList(VehicleBrand vehicleBrand) {
+		LambdaQueryWrapper<VehicleBrand> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(VehicleBrand::getIsDeleted, 0);
+		lambdaQueryWrapper.in(VehicleBrand::getInitial, vehicleBrand.getInitial());
+
+		//获得车辆品牌信息
+		List<VehicleBrand> vehicleBrandList = vehicleBrandService.list(lambdaQueryWrapper);
+		return R.data(vehicleBrandList);
+	}
+
+}

+ 196 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/controller/VehicleModelController.java

@@ -0,0 +1,196 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.client.entity.VehicleModel;
+import org.springblade.client.entity.VehicleSeries;
+import org.springblade.client.excel.VehicleModelExcel;
+import org.springblade.client.excel.VehicleSeriesExcel;
+import org.springblade.client.vo.VehicleModelVO;
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.client.vehicle.service.IVehicleModelService;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+
+/**
+ *  控制器
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/vehicleModel")
+@Api(value = "", tags = "接口")
+public class VehicleModelController extends BladeController {
+
+	private final IVehicleModelService vehicleModelService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入vehicleModel")
+	public R<VehicleModel> detail(VehicleModel vehicleModel) {
+		VehicleModel detail = vehicleModelService.getOne(Condition.getQueryWrapper(vehicleModel));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入vehicleModel")
+	public R<IPage<VehicleModel>> list(VehicleModel vehicleModel, Query query) {
+		IPage<VehicleModel> pages = vehicleModelService.page(Condition.getPage(query), Condition.getQueryWrapper(vehicleModel));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入vehicleModel")
+	public R<IPage<VehicleModelVO>> page(VehicleModelVO vehicleModel, Query query) {
+		IPage<VehicleModelVO> pages = vehicleModelService.selectVehicleModelPage(Condition.getPage(query), vehicleModel);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入vehicleModel")
+	public R save(@Valid @RequestBody VehicleModel vehicleModel) {
+		return R.status(vehicleModelService.save(vehicleModel));
+	}
+
+	/**
+	 * 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入vehicleModel")
+	public R update(@Valid @RequestBody VehicleModel vehicleModel) {
+		return R.status(vehicleModelService.updateById(vehicleModel));
+	}
+
+	/**
+	 * 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入vehicleModel")
+	public R submit(@Valid @RequestBody VehicleModel vehicleModel) {
+		return R.status(vehicleModelService.saveOrUpdate(vehicleModel));
+	}
+
+
+	/**
+	 * 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(vehicleModelService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 车辆车型导入
+	 */
+	@PostMapping("/importModel")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "车辆车型导入", notes = "传入excel")
+	public R importModel(@RequestParam("file") MultipartFile file) {
+		//导入数据
+		List<VehicleModelExcel> excelList = ExcelUtil.read(file, VehicleModelExcel.class);
+		if(CollectionUtils.isEmpty(excelList))
+		{
+			throw new SecurityException("数据不能为空");
+		}
+
+		return vehicleModelService.importModel(excelList,false,file);
+	}
+
+	/**
+	 * 根据品牌id,车系id查询车型
+	 */
+	@GetMapping("/seriesList")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "根据品牌id,车系id查询车型", notes = "传入vehicleSeries")
+	public R<List<VehicleModel>> seriesList(VehicleModel vehicleModel) {
+		LambdaQueryWrapper<VehicleModel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(VehicleModel::getIsDeleted, 0)
+			.eq(VehicleModel::getBrandId, vehicleModel.getBrandId())
+			.eq(VehicleModel::getSeriesId, vehicleModel.getSeriesId())
+			.eq(ObjectUtil.isNotEmpty(vehicleModel.getEngine()), VehicleModel::getEngine, vehicleModel)
+			.eq(ObjectUtil.isNotEmpty(vehicleModel.getModelYear()), VehicleModel::getModelYear, vehicleModel.getModelYear());
+		List<VehicleModel> list = vehicleModelService.list(lambdaQueryWrapper);
+
+		List<VehicleModel> modelList = new ArrayList<>();
+		//发动机排量为空
+		if (ObjectUtil.isEmpty(vehicleModel.getEngine())){
+			//根据发动机排量去重
+			if (ObjectUtil.isNotEmpty(list)){
+				modelList = list.stream().collect(Collectors.collectingAndThen(
+					Collectors.toCollection(() -> new TreeSet<>(
+						Comparator.comparing(VehicleModel::getEngine))), ArrayList::new));
+			}
+			return R.data(modelList);
+		}
+		//发动机排量不为空,年款为空
+		if (ObjectUtil.isNotEmpty(vehicleModel.getEngine()) && ObjectUtil.isEmpty(vehicleModel.getModelYear())){
+			//根据年款去重
+			if (ObjectUtil.isNotEmpty(list)){
+				modelList = list.stream().collect(Collectors.collectingAndThen(
+					Collectors.toCollection(() -> new TreeSet<>(
+						Comparator.comparing(VehicleModel::getEngine))), ArrayList::new));
+			}
+			return R.data(modelList);
+		}
+
+		return R.data(list);
+	}
+
+}

+ 164 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/controller/VehicleSeriesController.java

@@ -0,0 +1,164 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.client.entity.VehicleSeries;
+import org.springblade.client.excel.VehicleBrandExcel;
+import org.springblade.client.excel.VehicleSeriesExcel;
+import org.springblade.client.vo.VehicleSeriesVO;
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.client.vehicle.service.IVehicleSeriesService;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 车辆车系 控制器
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/vehicleSeries")
+@Api(value = "车辆车系", tags = "车辆车系接口")
+public class VehicleSeriesController extends BladeController {
+
+	private final IVehicleSeriesService vehicleSeriesService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入vehicleSeries")
+	public R<VehicleSeries> detail(VehicleSeries vehicleSeries) {
+		VehicleSeries detail = vehicleSeriesService.getOne(Condition.getQueryWrapper(vehicleSeries));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 车辆车系
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入vehicleSeries")
+	public R<IPage<VehicleSeries>> list(VehicleSeries vehicleSeries, Query query) {
+		IPage<VehicleSeries> pages = vehicleSeriesService.page(Condition.getPage(query), Condition.getQueryWrapper(vehicleSeries));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页 车辆车系
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入vehicleSeries")
+	public R<IPage<VehicleSeriesVO>> page(VehicleSeriesVO vehicleSeries, Query query) {
+		IPage<VehicleSeriesVO> pages = vehicleSeriesService.selectVehicleSeriesPage(Condition.getPage(query), vehicleSeries);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 车辆车系
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入vehicleSeries")
+	public R save(@Valid @RequestBody VehicleSeries vehicleSeries) {
+		return R.status(vehicleSeriesService.save(vehicleSeries));
+	}
+
+	/**
+	 * 修改 车辆车系
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入vehicleSeries")
+	public R update(@Valid @RequestBody VehicleSeries vehicleSeries) {
+		return R.status(vehicleSeriesService.updateById(vehicleSeries));
+	}
+
+	/**
+	 * 新增或修改 车辆车系
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入vehicleSeries")
+	public R submit(@Valid @RequestBody VehicleSeries vehicleSeries) {
+		return R.status(vehicleSeriesService.saveOrUpdate(vehicleSeries));
+	}
+
+
+	/**
+	 * 删除 车辆车系
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(vehicleSeriesService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 车辆车系导入
+	 */
+	@PostMapping("/importSeries")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "车辆车系导入", notes = "传入excel")
+	public R importSeries(@RequestParam("file") MultipartFile file) {
+		//导入数据
+		List<VehicleSeriesExcel> excelList = ExcelUtil.read(file, VehicleSeriesExcel.class);
+		if(CollectionUtils.isEmpty(excelList))
+		{
+			throw new SecurityException("数据不能为空");
+		}
+
+		return vehicleSeriesService.importSeries(excelList,false,file);
+	}
+
+	/**
+	 * 根据品牌id查询车系
+	 */
+	@GetMapping("/brandList")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "根据品牌id查询车系", notes = "传入vehicleSeries")
+	public R<List<VehicleSeries>> brandList(VehicleSeries vehicleSeries) {
+		LambdaQueryWrapper<VehicleSeries> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(VehicleSeries::getIsDeleted, 0)
+			.eq(VehicleSeries::getBrandId, vehicleSeries.getBrandId());
+		List<VehicleSeries> list = vehicleSeriesService.list(lambdaQueryWrapper);
+		return R.data(list);
+	}
+
+}

+ 43 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleBrandMapper.java

@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.client.entity.VehicleBrand;
+import org.springblade.client.vo.VehicleBrandVO;
+
+import java.util.List;
+
+/**
+ * 车辆品牌 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+public interface VehicleBrandMapper extends BaseMapper<VehicleBrand> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param vehicleBrand
+	 * @return
+	 */
+	List<VehicleBrandVO> selectVehicleBrandPage(IPage page, VehicleBrandVO vehicleBrand);
+
+}

+ 27 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleBrandMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.client.vehicle.mapper.VehicleBrandMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="vehicleBrandResultMap" type="org.springblade.client.entity.VehicleBrand">
+        <id column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="initial" property="initial"/>
+        <result column="brand" property="brand"/>
+        <result column="brand_logo" property="brandLogo"/>
+        <result column="renew_time" property="renewTime"/>
+        <result column="brand_id" property="brandId"/>
+    </resultMap>
+
+
+    <select id="selectVehicleBrandPage" resultMap="vehicleBrandResultMap">
+        select * from basic_vehicle_brand where is_deleted = 0
+    </select>
+
+</mapper>

+ 43 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleModelMapper.java

@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.client.entity.VehicleModel;
+import org.springblade.client.vo.VehicleModelVO;
+
+import java.util.List;
+
+/**
+ *  Mapper 接口
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+public interface VehicleModelMapper extends BaseMapper<VehicleModel> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param vehicleModel
+	 * @return
+	 */
+	List<VehicleModelVO> selectVehicleModelPage(IPage page, VehicleModelVO vehicleModel);
+
+}

+ 140 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleModelMapper.xml

@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.client.vehicle.mapper.VehicleModelMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="vehicleModelResultMap" type="org.springblade.client.entity.VehicleModel">
+        <id column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="initial" property="initial"/>
+        <result column="brand_name" property="brandName"/>
+        <result column="brand_id" property="brandId"/>
+        <result column="brand_logo" property="brandLogo"/>
+        <result column="series_name" property="seriesName"/>
+        <result column="series_id" property="seriesId"/>
+        <result column="series_exhibit" property="seriesExhibit"/>
+        <result column="model_name" property="modelName"/>
+        <result column="model_id" property="modelId"/>
+        <result column="sell_status" property="sellStatus"/>
+        <result column="manufacturer_name" property="manufacturerName"/>
+        <result column="manufacturer_id" property="manufacturerId"/>
+        <result column="model_year" property="modelYear"/>
+        <result column="renew_time" property="renewTime"/>
+        <result column="market_time" property="marketTime"/>
+        <result column="manufacturer_price_wan" property="manufacturerPriceWan"/>
+        <result column="manufacturer_price_yuan" property="manufacturerPriceYuan"/>
+        <result column="dealer_reference_price" property="dealerReferencePrice"/>
+        <result column="car_mall_buy_it_now" property="carMallBuyItNow"/>
+        <result column="rank" property="rank"/>
+        <result column="energy_type" property="energyType"/>
+        <result column="maximum_power" property="maximumPower"/>
+        <result column="maximum_torque" property="maximumTorque"/>
+        <result column="electric_motor" property="electricMotor"/>
+        <result column="engine" property="engine"/>
+        <result column="electric_motor_ps" property="electricMotorPs"/>
+        <result column="transmission_case" property="transmissionCase"/>
+        <result column="length_width_height" property="lengthWidthHeight"/>
+        <result column="body_structure" property="bodyStructure"/>
+        <result column="maximum_speed" property="maximumSpeed"/>
+        <result column="official_acceleration" property="officialAcceleration"/>
+        <result column="measured_acceleration" property="measuredAcceleration"/>
+        <result column="measured_braking" property="measuredBraking"/>
+        <result column="miit_oil_consumption" property="miitOilConsumption"/>
+        <result column="miit_range" property="miitRange"/>
+        <result column="measured_fuel_consumption" property="measuredFuelConsumption"/>
+        <result column="vehicle_warranty" property="vehicleWarranty"/>
+        <result column="length" property="length"/>
+        <result column="width" property="width"/>
+        <result column="height" property="height"/>
+        <result column="wheelbase" property="wheelbase"/>
+        <result column="front_track" property="frontTrack"/>
+        <result column="rear_track_width" property="rearTrackWidth"/>
+        <result column="minimum_ground_clearance" property="minimumGroundClearance"/>
+        <result column="number_of_doors" property="numberOfDoors"/>
+        <result column="seats" property="seats"/>
+        <result column="rear_door_opening_mode" property="rearDoorOpeningMode"/>
+        <result column="tank_volume" property="tankVolume"/>
+        <result column="luggage_compartment_volume" property="luggageCompartmentVolume"/>
+        <result column="container_size" property="containerSize"/>
+        <result column="maximum_load_mass" property="maximumLoadMass"/>
+        <result column="curb_weight" property="curbWeight"/>
+        <result column="engine_model" property="engineModel"/>
+        <result column="displacement_ml" property="displacementMl"/>
+        <result column="displacement_l" property="displacementL"/>
+        <result column="air_intake_form" property="airIntakeForm"/>
+        <result column="cylinder_arrangement" property="cylinderArrangement"/>
+        <result column="number_cylinders" property="numberCylinders"/>
+        <result column="valve_train" property="valveTrain"/>
+        <result column="compression_ratio" property="compressionRatio"/>
+        <result column="distribution_mechanism" property="distributionMechanism"/>
+        <result column="cylinder_diameter" property="cylinderDiameter"/>
+        <result column="route_distance_travel" property="routeDistanceTravel"/>
+        <result column="maximum_horsepower" property="maximumHorsepower"/>
+        <result column="maximum_power_speed" property="maximumPowerSpeed"/>
+        <result column="maximum_torque_speed" property="maximumTorqueSpeed"/>
+        <result column="engine_specific_technology" property="engineSpecificTechnology"/>
+        <result column="fuel_form" property="fuelForm"/>
+        <result column="fuel_grade" property="fuelGrade"/>
+        <result column="oil_supply_mode" property="oilSupplyMode"/>
+        <result column="cylinder_head_material" property="cylinderHeadMaterial"/>
+        <result column="cylinder_block_material" property="cylinderBlockMaterial"/>
+        <result column="environmental_standards" property="environmentalStandards"/>
+        <result column="total_motor_power" property="totalMotorPower"/>
+        <result column="total_torque_motor" property="totalTorqueMotor"/>
+        <result column="maximum_power_front_motor" property="maximumPowerFrontMotor"/>
+        <result column="maximum_torque_front_motor" property="maximumTorqueFrontMotor"/>
+        <result column="maximum_power_rear_motor" property="maximumPowerRearMotor"/>
+        <result column="maximum_torque_rear_motor" property="maximumTorqueRearMotor"/>
+        <result column="system_comprehensive_power" property="systemComprehensivePower"/>
+        <result column="comprehensive_torque_system" property="comprehensiveTorqueSystem"/>
+        <result column="miit_pure_electric_range" property="miitPureElectricRange"/>
+        <result column="battery_capacity" property="batteryCapacity"/>
+        <result column="power_consumption_per_hundred_kilometers" property="powerConsumptionPerHundredKilometers"/>
+        <result column="fast_charging_time" property="fastChargingTime"/>
+        <result column="slow_charging_time" property="slowChargingTime"/>
+        <result column="fast_charge_percentage" property="fastChargePercentage"/>
+        <result column="fast_charge" property="fastCharge"/>
+        <result column="battery_charging_time" property="batteryChargingTime"/>
+        <result column="measured_fast_charging_time" property="measuredFastChargingTime"/>
+        <result column="measured_slow_charging_time" property="measuredSlowChargingTime"/>
+        <result column="measuredmmileage" property="measuredmmileage"/>
+        <result column="motor_type" property="motorType"/>
+        <result column="number_drive_motors" property="numberDriveMotors"/>
+        <result column="motor_layout" property="motorLayout"/>
+        <result column="battery_type" property="batteryType"/>
+        <result column="battery_pack_warranty" property="batteryPackWarranty"/>
+        <result column="battery_energy" property="batteryEnergy"/>
+        <result column="battery_pre_heating" property="batteryPreHeating"/>
+        <result column="ota_upgrade" property="otaUpgrade"/>
+        <result column="number_gears" property="numberGears"/>
+        <result column="transmission_type" property="transmissionType"/>
+        <result column="abbreviation" property="abbreviation"/>
+        <result column="drive_mode" property="driveMode"/>
+        <result column="center_differential_structure" property="centerDifferentialStructure"/>
+        <result column="front_suspension_type" property="frontSuspensionType"/>
+        <result column="rear_suspension_type" property="rearSuspensionType"/>
+        <result column="assistance_type" property="assistanceType"/>
+        <result column="carbody_structure" property="carbodyStructure"/>
+        <result column="front_brake_type" property="frontBrakeType"/>
+        <result column="rear_brake_type" property="rearBrakeType"/>
+        <result column="parking_brake_type" property="parkingBrakeType"/>
+        <result column="fourwheel_type" property="fourwheelType"/>
+        <result column="front_tire_specification" property="frontTireSpecification"/>
+        <result column="front_tire_specification_like" property="frontTireSpecificationLike"/>
+        <result column="rear_tire_specification" property="rearTireSpecification"/>
+        <result column="rear_tire_specification_like" property="rearTireSpecificationLike"/>
+        <result column="spare_tire_specification" property="spareTireSpecification"/>
+    </resultMap>
+
+
+    <select id="selectVehicleModelPage" resultMap="vehicleModelResultMap">
+        select * from basic_vehicle_model where is_deleted = 0
+    </select>
+
+</mapper>

+ 43 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleSeriesMapper.java

@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.client.entity.VehicleSeries;
+import org.springblade.client.vo.VehicleSeriesVO;
+
+import java.util.List;
+
+/**
+ * 车辆车系 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+public interface VehicleSeriesMapper extends BaseMapper<VehicleSeries> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param vehicleSeries
+	 * @return
+	 */
+	List<VehicleSeriesVO> selectVehicleSeriesPage(IPage page, VehicleSeriesVO vehicleSeries);
+
+}

+ 33 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/mapper/VehicleSeriesMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.client.vehicle.mapper.VehicleSeriesMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="vehicleSeriesResultMap" type="org.springblade.client.entity.VehicleSeries">
+        <id column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="series_id" property="seriesId"/>
+        <result column="initial" property="initial"/>
+        <result column="brand_id" property="brandId"/>
+        <result column="series_name" property="seriesName"/>
+        <result column="manufacturer_name" property="manufacturerName"/>
+        <result column="manufacturer_id" property="manufacturerId"/>
+        <result column="model_level" property="modelLevel"/>
+        <result column="maximum_price" property="maximumPrice"/>
+        <result column="series_exhibit" property="seriesExhibit"/>
+        <result column="renew_time" property="renewTime"/>
+        <result column="bottom_price" property="bottomPrice"/>
+    </resultMap>
+
+
+    <select id="selectVehicleSeriesPage" resultMap="vehicleSeriesResultMap">
+        select * from basic_vehicle_series where is_deleted = 0
+    </select>
+
+</mapper>

+ 51 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/IVehicleBrandService.java

@@ -0,0 +1,51 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.client.entity.VehicleBrand;
+import org.springblade.client.excel.VehicleBrandExcel;
+import org.springblade.client.vo.VehicleBrandVO;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 车辆品牌 服务类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+public interface IVehicleBrandService extends IService<VehicleBrand> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param vehicleBrand
+	 * @return
+	 */
+	IPage<VehicleBrandVO> selectVehicleBrandPage(IPage<VehicleBrandVO> page, VehicleBrandVO vehicleBrand);
+
+	/**
+	 * 车辆品牌导入
+	 */
+	R importBrand(List<VehicleBrandExcel> excelList, Boolean isCovered, MultipartFile file);
+
+}

+ 52 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/IVehicleModelService.java

@@ -0,0 +1,52 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.client.entity.VehicleModel;
+import org.springblade.client.excel.VehicleModelExcel;
+import org.springblade.client.excel.VehicleSeriesExcel;
+import org.springblade.client.vo.VehicleModelVO;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ *  服务类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+public interface IVehicleModelService extends IService<VehicleModel> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param vehicleModel
+	 * @return
+	 */
+	IPage<VehicleModelVO> selectVehicleModelPage(IPage<VehicleModelVO> page, VehicleModelVO vehicleModel);
+
+	/**
+	 * 车辆车型导入
+	 */
+	R importModel(List<VehicleModelExcel> excelList, Boolean isCovered, MultipartFile file);
+
+}

+ 51 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/IVehicleSeriesService.java

@@ -0,0 +1,51 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.client.entity.VehicleSeries;
+import org.springblade.client.excel.VehicleSeriesExcel;
+import org.springblade.client.vo.VehicleSeriesVO;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 车辆车系 服务类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+public interface IVehicleSeriesService extends IService<VehicleSeries> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param vehicleSeries
+	 * @return
+	 */
+	IPage<VehicleSeriesVO> selectVehicleSeriesPage(IPage<VehicleSeriesVO> page, VehicleSeriesVO vehicleSeries);
+
+	/**
+	 * 车辆品牌导入
+	 */
+	R importSeries(List<VehicleSeriesExcel> excelList, Boolean isCovered, MultipartFile file);
+
+}

+ 95 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/impl/VehicleBrandServiceImpl.java

@@ -0,0 +1,95 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import org.springblade.client.entity.CorpsDesc;
+import org.springblade.client.entity.VehicleBrand;
+import org.springblade.client.excel.VehicleBrandExcel;
+import org.springblade.client.vehicle.mapper.VehicleBrandMapper;
+import org.springblade.client.vehicle.service.IVehicleBrandService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.client.vo.VehicleBrandVO;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 车辆品牌 服务实现类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Service
+public class VehicleBrandServiceImpl extends ServiceImpl<VehicleBrandMapper, VehicleBrand> implements IVehicleBrandService {
+
+	@Override
+	public IPage<VehicleBrandVO> selectVehicleBrandPage(IPage<VehicleBrandVO> page, VehicleBrandVO vehicleBrand) {
+		return page.setRecords(baseMapper.selectVehicleBrandPage(page, vehicleBrand));
+	}
+
+	/**
+	 * 车辆品牌导入
+	 */
+	@Override
+	public R importBrand(List<VehicleBrandExcel> excelList, Boolean isCovered, MultipartFile file) {
+		if(org.springframework.util.CollectionUtils.isEmpty(excelList))
+		{
+			throw new SecurityException("导入数据不能为空");
+		}
+		for(int i = 0; i < excelList.size(); i++)
+		{
+			//判断必填项是否为空
+			VehicleBrandExcel brandExcel = excelList.get(i);
+			if (ObjectUtil.isEmpty(brandExcel.getBrandId())){
+				throw new SecurityException("第"+(i+2)+"行,品牌_id为空,");
+			}
+
+			VehicleBrand vehicleBrand = new VehicleBrand();
+			BeanUtil.copy(brandExcel,vehicleBrand);
+
+			//判断明细是否存在,存在更新否则新增
+			LambdaQueryWrapper<VehicleBrand> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper.eq(VehicleBrand::getIsDeleted, 0)
+				.eq(VehicleBrand::getBrandId, vehicleBrand.getBrandId());
+
+			VehicleBrand selectItem = baseMapper.selectOne(lambdaQueryWrapper);
+			if (ObjectUtil.isEmpty(selectItem)){//不存在新增
+				vehicleBrand.setCreateUser(AuthUtil.getUserId());
+				vehicleBrand.setCreateTime(new Date());
+				vehicleBrand.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+				baseMapper.insert(vehicleBrand);
+			}else {//存在更新
+				vehicleBrand.setUpdateUser(AuthUtil.getUserId());
+				vehicleBrand.setUpdateTime(new Date());
+				vehicleBrand.setId(selectItem.getId());
+				baseMapper.updateById(vehicleBrand);
+			}
+		}
+		return R.data("操作成功");
+	}
+
+}

+ 136 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/impl/VehicleModelServiceImpl.java

@@ -0,0 +1,136 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springblade.client.entity.VehicleModel;
+import org.springblade.client.entity.VehicleSeries;
+import org.springblade.client.excel.VehicleModelExcel;
+import org.springblade.client.excel.VehicleSeriesExcel;
+import org.springblade.client.vehicle.mapper.VehicleModelMapper;
+import org.springblade.client.vehicle.service.IVehicleModelService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.client.vo.VehicleModelVO;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *  服务实现类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Service
+public class VehicleModelServiceImpl extends ServiceImpl<VehicleModelMapper, VehicleModel> implements IVehicleModelService {
+
+	@Override
+	public IPage<VehicleModelVO> selectVehicleModelPage(IPage<VehicleModelVO> page, VehicleModelVO vehicleModel) {
+		return page.setRecords(baseMapper.selectVehicleModelPage(page, vehicleModel));
+	}
+
+	/**
+	 * 车辆车型导入
+	 */
+	@Override
+	public R importModel(List<VehicleModelExcel> excelList, Boolean isCovered, MultipartFile file) {
+		if(org.springframework.util.CollectionUtils.isEmpty(excelList))
+		{
+			throw new SecurityException("导入数据不能为空");
+		}
+		for(int i = 0; i < excelList.size(); i++)
+		{
+			//判断必填项是否为空
+			VehicleModelExcel modelExcel = excelList.get(i);
+			if (ObjectUtil.isEmpty(modelExcel.getBrandId())){
+				throw new SecurityException("第"+(i+2)+"行,品牌_id为空");
+			}
+			if (ObjectUtil.isEmpty(modelExcel.getSeriesId())){
+				throw new SecurityException("第"+(i+2)+"行,车系_id为空");
+			}
+			if (ObjectUtil.isEmpty(modelExcel.getModelId())){
+				throw new SecurityException("第"+(i+2)+"行,车型_id为空");
+			}
+			if (ObjectUtil.isEmpty(modelExcel.getModelYear())){
+				throw new SecurityException("第"+(i+2)+"行,年款为空");
+			}
+			if (ObjectUtil.isEmpty(modelExcel.getEngine())){
+				throw new SecurityException("第"+(i+2)+"行,发动机为空");
+			}
+			if (ObjectUtil.isEmpty(modelExcel.getFrontTireSpecification())){
+				throw new SecurityException("第"+(i+2)+"行,前轮胎规格为空");
+			}
+			if (ObjectUtil.isEmpty(modelExcel.getRearTireSpecification())){
+				throw new SecurityException("第"+(i+2)+"行,后轮胎规格为空");
+			}
+
+			VehicleModel vehicleModel = new VehicleModel();
+			BeanUtil.copy(modelExcel,vehicleModel);
+
+			//前轮胎规格快捷查询
+			if (ObjectUtil.isNotEmpty(vehicleModel.getFrontTireSpecification())){
+				vehicleModel.setFrontTireSpecificationLike(getCnameInt(vehicleModel.getFrontTireSpecification()));
+			}
+			//后轮胎规格快捷查询
+			if (ObjectUtil.isNotEmpty(vehicleModel.getRearTireSpecification())){
+				vehicleModel.setRearTireSpecificationLike(getCnameInt(vehicleModel.getRearTireSpecification()));
+			}
+
+			//判断明细是否存在,存在更新否则新增
+			LambdaQueryWrapper<VehicleModel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper.eq(VehicleModel::getIsDeleted, 0)
+				.eq(VehicleModel::getBrandId, vehicleModel.getBrandId())
+				.eq(VehicleModel::getSeriesId, vehicleModel.getSeriesId())
+				.eq(VehicleModel::getModelId, vehicleModel.getModelId());
+
+			VehicleModel selectItem = baseMapper.selectOne(lambdaQueryWrapper);
+			if (ObjectUtil.isEmpty(selectItem)){//不存在新增
+				vehicleModel.setCreateUser(AuthUtil.getUserId());
+				vehicleModel.setCreateTime(new Date());
+				vehicleModel.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+				baseMapper.insert(vehicleModel);
+			}else {//存在更新
+				vehicleModel.setUpdateUser(AuthUtil.getUserId());
+				vehicleModel.setUpdateTime(new Date());
+				vehicleModel.setId(selectItem.getId());
+				baseMapper.updateById(vehicleModel);
+			}
+		}
+		return R.data("操作成功");
+	}
+
+	/**
+	 * 提取Cname 的 数字
+	 * 取出数字作为查询条件
+	 */
+	private String getCnameInt(String cname) {
+		String regex = "[^0-9]";
+		Pattern p = Pattern.compile(regex);
+		Matcher m = p.matcher(cname);
+		return m.replaceAll("").trim();
+	}
+
+}

+ 98 - 0
blade-service/blade-client/src/main/java/org/springblade/client/vehicle/service/impl/VehicleSeriesServiceImpl.java

@@ -0,0 +1,98 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.vehicle.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springblade.client.entity.VehicleBrand;
+import org.springblade.client.entity.VehicleSeries;
+import org.springblade.client.excel.VehicleBrandExcel;
+import org.springblade.client.excel.VehicleSeriesExcel;
+import org.springblade.client.vehicle.mapper.VehicleSeriesMapper;
+import org.springblade.client.vehicle.service.IVehicleSeriesService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.client.vo.VehicleSeriesVO;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 车辆车系 服务实现类
+ *
+ * @author BladeX
+ * @since 2023-03-14
+ */
+@Service
+public class VehicleSeriesServiceImpl extends ServiceImpl<VehicleSeriesMapper, VehicleSeries> implements IVehicleSeriesService {
+
+	@Override
+	public IPage<VehicleSeriesVO> selectVehicleSeriesPage(IPage<VehicleSeriesVO> page, VehicleSeriesVO vehicleSeries) {
+		return page.setRecords(baseMapper.selectVehicleSeriesPage(page, vehicleSeries));
+	}
+
+	/**
+	 * 车辆品牌导入
+	 */
+	@Override
+	public R importSeries(List<VehicleSeriesExcel> excelList, Boolean isCovered, MultipartFile file) {
+		if(org.springframework.util.CollectionUtils.isEmpty(excelList))
+		{
+			throw new SecurityException("导入数据不能为空");
+		}
+		for(int i = 0; i < excelList.size(); i++)
+		{
+			//判断必填项是否为空
+			VehicleSeriesExcel seriesExcel = excelList.get(i);
+			if (ObjectUtil.isEmpty(seriesExcel.getBrandId())){
+				throw new SecurityException("第"+(i+2)+"行,品牌_id为空,");
+			}
+			if (ObjectUtil.isEmpty(seriesExcel.getSeriesId())){
+				throw new SecurityException("第"+(i+2)+"行,车系_id为空,");
+			}
+
+			VehicleSeries vehicleSeries = new VehicleSeries();
+			BeanUtil.copy(seriesExcel,vehicleSeries);
+
+			//判断明细是否存在,存在更新否则新增
+			LambdaQueryWrapper<VehicleSeries> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper.eq(VehicleSeries::getIsDeleted, 0)
+				.eq(VehicleSeries::getBrandId, vehicleSeries.getBrandId())
+				.eq(VehicleSeries::getSeriesId, vehicleSeries.getSeriesId());
+
+			VehicleSeries selectItem = baseMapper.selectOne(lambdaQueryWrapper);
+			if (ObjectUtil.isEmpty(selectItem)){//不存在新增
+				vehicleSeries.setCreateUser(AuthUtil.getUserId());
+				vehicleSeries.setCreateTime(new Date());
+				vehicleSeries.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+				baseMapper.insert(vehicleSeries);
+			}else {//存在更新
+				vehicleSeries.setUpdateUser(AuthUtil.getUserId());
+				vehicleSeries.setUpdateTime(new Date());
+				vehicleSeries.setId(selectItem.getId());
+				baseMapper.updateById(vehicleSeries);
+			}
+		}
+		return R.data("操作成功");
+	}
+
+}