From a614df46f38d10d4837630d3e79e0a08bf00c808 Mon Sep 17 00:00:00 2001 From: k kfluous Date: Thu, 12 Mar 2026 03:04:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=B5=84=E4=BA=A7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=20-=20=E5=81=9C=E8=BD=A6?= =?UTF-8?q?=E5=9C=BA=E5=92=8C=E8=BD=A6=E5=9E=8B=E5=8F=82=E6=95=B0=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 停车场管理:CRUD + 业务校验 + 权限控制 - 车型参数管理:主子表关联 + 维保项目管理 - 数据库表结构:asset_parking, asset_vehicle_model, asset_vehicle_model_maintain_item - 优化点:参数校验、业务逻辑校验、类型安全 --- sql/create-asset-tables.sql | 83 +++++++++++ yudao-module-asset/pom.xml | 23 +++ .../yudao-module-asset-api/pom.xml | 39 +++++ .../yudao-module-asset-server/pom.xml | 133 ++++++++++++++++++ .../module/asset/AssetServerApplication.java | 18 +++ .../admin/parking/ParkingController.java | 84 +++++++++++ .../admin/parking/vo/ParkingBaseVO.java | 74 ++++++++++ .../admin/parking/vo/ParkingPageReqVO.java | 44 ++++++ .../admin/parking/vo/ParkingRespVO.java | 27 ++++ .../admin/parking/vo/ParkingSaveReqVO.java | 22 +++ .../admin/parking/vo/ParkingSimpleRespVO.java | 22 +++ .../vehiclemodel/VehicleModelController.java | 107 ++++++++++++++ .../vehiclemodel/vo/VehicleModelBaseVO.java | 72 ++++++++++ .../vo/VehicleModelMaintainItemVO.java | 41 ++++++ .../vo/VehicleModelPageReqVO.java | 35 +++++ .../vehiclemodel/vo/VehicleModelRespVO.java | 31 ++++ .../vo/VehicleModelSaveReqVO.java | 28 ++++ .../vo/VehicleModelSimpleRespVO.java | 27 ++++ .../dal/dataobject/parking/ParkingDO.java | 122 ++++++++++++++++ .../vehiclemodel/VehicleModelDO.java | 117 +++++++++++++++ .../VehicleModelMaintainItemDO.java | 72 ++++++++++ .../dal/mysql/parking/ParkingMapper.java | 35 +++++ .../VehicleModelMaintainItemMapper.java | 25 ++++ .../vehiclemodel/VehicleModelMapper.java | 38 +++++ .../asset/enums/ErrorCodeConstants.java | 20 +++ .../asset/service/parking/ParkingService.java | 63 +++++++++ .../service/parking/ParkingServiceImpl.java | 97 +++++++++++++ .../vehiclemodel/VehicleModelService.java | 88 ++++++++++++ .../vehiclemodel/VehicleModelServiceImpl.java | 132 +++++++++++++++++ .../src/main/resources/application-local.yaml | 111 +++++++++++++++ .../src/main/resources/application.yaml | 89 ++++++++++++ .../service/parking/ParkingServiceTest.java | 85 +++++++++++ 32 files changed, 2004 insertions(+) create mode 100644 sql/create-asset-tables.sql create mode 100644 yudao-module-asset/pom.xml create mode 100644 yudao-module-asset/yudao-module-asset-api/pom.xml create mode 100644 yudao-module-asset/yudao-module-asset-server/pom.xml create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/AssetServerApplication.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/ParkingController.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingBaseVO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingPageReqVO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingRespVO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingSaveReqVO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingSimpleRespVO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/VehicleModelController.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelBaseVO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelMaintainItemVO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelPageReqVO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelRespVO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelSaveReqVO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelSimpleRespVO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/parking/ParkingDO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/vehiclemodel/VehicleModelDO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/vehiclemodel/VehicleModelMaintainItemDO.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/parking/ParkingMapper.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/vehiclemodel/VehicleModelMaintainItemMapper.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/vehiclemodel/VehicleModelMapper.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/enums/ErrorCodeConstants.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/parking/ParkingService.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/parking/ParkingServiceImpl.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/vehiclemodel/VehicleModelService.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/vehiclemodel/VehicleModelServiceImpl.java create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/resources/application-local.yaml create mode 100644 yudao-module-asset/yudao-module-asset-server/src/main/resources/application.yaml create mode 100644 yudao-module-asset/yudao-module-asset-server/src/test/java/cn/iocoder/yudao/module/asset/service/parking/ParkingServiceTest.java diff --git a/sql/create-asset-tables.sql b/sql/create-asset-tables.sql new file mode 100644 index 0000000..beb9548 --- /dev/null +++ b/sql/create-asset-tables.sql @@ -0,0 +1,83 @@ +-- ============================================= +-- 资产管理系统 - 停车场和车型参数模块 +-- 创建时间: 2026-03-12 +-- 修正版本:兼容 MySQL 8.0 +-- ============================================= + +-- 1. 创建停车场表(如果不存在) +CREATE TABLE IF NOT EXISTS `asset_parking` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(100) NOT NULL COMMENT '停车场名称', + `principal` varchar(50) DEFAULT NULL COMMENT '公司负责人', + `contact_name` varchar(50) DEFAULT NULL COMMENT '联系人', + `contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话', + `address` varchar(255) DEFAULT NULL COMMENT '地址', + `longitude` varchar(50) DEFAULT NULL COMMENT '经度', + `latitude` varchar(50) DEFAULT NULL COMMENT '纬度', + `stock_area` int DEFAULT NULL COMMENT '库存区域(字典)', + `unusual_action_city` int DEFAULT NULL COMMENT '异动城市(字典)', + `capacity` int DEFAULT 0 COMMENT '容量', + `parked_amount` int DEFAULT 0 COMMENT '已停车辆数', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='停车场表'; + +-- 2. 创建车型参数表 +CREATE TABLE IF NOT EXISTS `asset_vehicle_model` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `brand` int NOT NULL COMMENT '品牌(字典)', + `model` int NOT NULL COMMENT '车型(字典)', + `model_code` varchar(50) DEFAULT NULL COMMENT '车型编号', + `model_name` varchar(100) NOT NULL COMMENT '车型名称', + `notice_model` varchar(100) DEFAULT NULL COMMENT '车辆公告型号', + `hydrogen_unit` int DEFAULT NULL COMMENT '仪表盘氢气单位(字典)', + `hydrogen_capacity` int DEFAULT NULL COMMENT '氢瓶容量(L)', + `electricity_mileage` int DEFAULT NULL COMMENT '电池公告可行驶里程(KM)', + `reserve_electricity` decimal(10,2) DEFAULT NULL COMMENT '储电量(kwh)', + `hydrogen_mileage` int DEFAULT NULL COMMENT '氢气公告可行驶里程(KM)', + `fuel_type` int DEFAULT NULL COMMENT '燃料种类(字典)', + `tire_size` varchar(50) DEFAULT NULL COMMENT '轮胎尺寸', + `tire_number` int DEFAULT NULL COMMENT '轮胎数量', + `truck_size` varchar(100) DEFAULT NULL COMMENT '车辆尺寸', + `online_spread_enterprise` varchar(100) DEFAULT NULL COMMENT '电堆厂家', + `battery_factory` varchar(100) DEFAULT NULL COMMENT '电池厂家', + `refrigerator_factory` varchar(100) DEFAULT NULL COMMENT '冷机厂家', + `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`), + KEY `idx_brand` (`brand`), + KEY `idx_model` (`model`), + KEY `idx_model_name` (`model_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车型参数表'; + +-- 3. 创建车型维保项目关联表 +CREATE TABLE IF NOT EXISTS `asset_vehicle_model_maintain_item` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `vehicle_model_id` bigint NOT NULL COMMENT '车型ID', + `maintain_item_id` bigint NOT NULL COMMENT '维保项目ID', + `maintain_item` varchar(100) DEFAULT NULL COMMENT '保养项目', + `maintain_content` varchar(500) DEFAULT NULL COMMENT '保养内容', + `materials_expenses` decimal(10,2) DEFAULT NULL COMMENT '材料费', + `hour_fee` decimal(10,2) DEFAULT NULL COMMENT '工时费', + `kilometer_cycle` int DEFAULT NULL COMMENT '保养公里周期(KM)', + `time_cycle` int DEFAULT NULL COMMENT '保养时间周期(月)', + `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`), + KEY `idx_vehicle_model_id` (`vehicle_model_id`), + KEY `idx_maintain_item_id` (`maintain_item_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车型维保项目关联表'; diff --git a/yudao-module-asset/pom.xml b/yudao-module-asset/pom.xml new file mode 100644 index 0000000..d0651c1 --- /dev/null +++ b/yudao-module-asset/pom.xml @@ -0,0 +1,23 @@ + + + + cn.iocoder.cloud + yudao + ${revision} + + 4.0.0 + yudao-module-asset + pom + + ${project.artifactId} + 资产管理模块,包含车辆、合同、备车、交车、还车、替换车等功能 + https://github.com/YunaiV/yudao-cloud + + + yudao-module-asset-api + yudao-module-asset-server + + + diff --git a/yudao-module-asset/yudao-module-asset-api/pom.xml b/yudao-module-asset/yudao-module-asset-api/pom.xml new file mode 100644 index 0000000..ae31e55 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-api/pom.xml @@ -0,0 +1,39 @@ + + + + yudao-module-asset + cn.iocoder.cloud + ${revision} + + 4.0.0 + yudao-module-asset-api + jar + + ${project.artifactId} + 资产管理 API,定义 Feign 接口等 + https://github.com/YunaiV/yudao-cloud + + + + cn.iocoder.cloud + yudao-common + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-web + provided + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + diff --git a/yudao-module-asset/yudao-module-asset-server/pom.xml b/yudao-module-asset/yudao-module-asset-server/pom.xml new file mode 100644 index 0000000..eb7e214 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/pom.xml @@ -0,0 +1,133 @@ + + + + yudao-module-asset + cn.iocoder.cloud + ${revision} + + 4.0.0 + yudao-module-asset-server + jar + + ${project.artifactId} + 资产管理业务实现 + https://github.com/YunaiV/yudao-cloud + + + + + cn.iocoder.cloud + yudao-module-asset-api + ${revision} + + + + + cn.iocoder.cloud + yudao-module-system-api + ${revision} + + + + + cn.iocoder.cloud + yudao-module-bpm-api + ${revision} + + + + + cn.iocoder.cloud + yudao-module-infra-api + ${revision} + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-biz-tenant + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-validation + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-mybatis + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-rpc + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-job + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-mq + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-test + test + + + + + cn.iocoder.cloud + yudao-spring-boot-starter-excel + + + + + + ${project.artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + repackage + + + + + + + diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/AssetServerApplication.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/AssetServerApplication.java new file mode 100644 index 0000000..b49b60f --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/AssetServerApplication.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.asset; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 资产管理模块 Application + * + * @author 芋道源码 + */ +@SpringBootApplication +public class AssetServerApplication { + + public static void main(String[] args) { + SpringApplication.run(AssetServerApplication.class, args); + } + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/ParkingController.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/ParkingController.java new file mode 100644 index 0000000..77eba48 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/ParkingController.java @@ -0,0 +1,84 @@ +package cn.iocoder.yudao.module.asset.controller.admin.parking; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.asset.controller.admin.parking.vo.*; +import cn.iocoder.yudao.module.asset.dal.dataobject.parking.ParkingDO; +import cn.iocoder.yudao.module.asset.service.parking.ParkingService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +/** + * 停车场管理 Controller + * + * @author 芋道源码 + */ +@Tag(name = "管理后台 - 停车场管理") +@RestController +@RequestMapping("/asset/parking") +@Validated +public class ParkingController { + + @Resource + private ParkingService parkingService; + + @PostMapping("/create") + @Operation(summary = "创建停车场") + @PreAuthorize("@ss.hasPermission('asset:parking:create')") + public CommonResult createParking(@Valid @RequestBody ParkingSaveReqVO createReqVO) { + return success(parkingService.createParking(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新停车场") + @PreAuthorize("@ss.hasPermission('asset:parking:update')") + public CommonResult updateParking(@Valid @RequestBody ParkingSaveReqVO updateReqVO) { + parkingService.updateParking(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除停车场") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('asset:parking:delete')") + public CommonResult deleteParking(@RequestParam("id") Long id) { + parkingService.deleteParking(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得停车场") + @Parameter(name = "id", description = "编号", required = true, example = "1") + @PreAuthorize("@ss.hasPermission('asset:parking:query')") + public CommonResult getParking(@RequestParam("id") Long id) { + ParkingDO parking = parkingService.getParking(id); + return success(BeanUtils.toBean(parking, ParkingRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得停车场分页") + @PreAuthorize("@ss.hasPermission('asset:parking:query')") + public CommonResult> getParkingPage(@Valid ParkingPageReqVO pageReqVO) { + PageResult pageResult = parkingService.getParkingPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ParkingRespVO.class)); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得停车场精简列表", description = "用于下拉选择") + public CommonResult> getParkingSimpleList() { + List list = parkingService.getParkingSimpleList(); + return success(BeanUtils.toBean(list, ParkingSimpleRespVO.class)); + } + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingBaseVO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingBaseVO.java new file mode 100644 index 0000000..f7f022e --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingBaseVO.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.asset.controller.admin.parking.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import java.time.LocalDate; + +/** + * 停车场 Base VO + * + * @author 芋道源码 + */ +@Data +public class ParkingBaseVO { + + @Schema(description = "停车场名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张江停车场") + @NotBlank(message = "停车场名称不能为空") + private String name; + + @Schema(description = "地址", example = "上海市浦东新区张江高科技园区") + private String address; + + @Schema(description = "容量", example = "100") + @jakarta.validation.constraints.Min(value = 1, message = "容量必须大于0") + private Integer capacity; + + @Schema(description = "省份", example = "浙江省") + private String province; + + @Schema(description = "城市", example = "嘉兴市") + private String city; + + @Schema(description = "租赁开始时间", example = "2026-01-01") + private LocalDate leaseStartDate; + + @Schema(description = "租赁结束时间", example = "2027-01-01") + private LocalDate leaseEndDate; + + @Schema(description = "负责人", example = "张三") + private String managerName; + + @Schema(description = "负责人联系方式", example = "13800138000") + private String managerPhone; + + @Schema(description = "停车场联系人", example = "李四") + private String contactName; + + @Schema(description = "停车场联系方式", example = "13900139000") + private String contactPhone; + + @Schema(description = "公司负责人", example = "王五") + private String principal; + + @Schema(description = "已停车辆数", example = "50") + @jakarta.validation.constraints.Min(value = 0, message = "已停车辆数不能为负数") + private Integer parkedAmount; + + @Schema(description = "库存区域(字典)", example = "1") + private Integer stockArea; + + @Schema(description = "异动城市(字典)", example = "1") + private Integer unusualActionCity; + + @Schema(description = "经度", example = "120.123456") + private String longitude; + + @Schema(description = "纬度", example = "30.123456") + private String latitude; + + @Schema(description = "备注", example = "备注信息") + private String remark; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingPageReqVO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingPageReqVO.java new file mode 100644 index 0000000..bbb8c80 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingPageReqVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.asset.controller.admin.parking.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 停车场 - 分页查询 Request VO + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - 停车场分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ParkingPageReqVO extends PageParam { + + @Schema(description = "停车场名称", example = "张江停车场") + private String name; + + @Schema(description = "地址", example = "上海市浦东新区") + private String address; + + @Schema(description = "省份", example = "浙江省") + private String province; + + @Schema(description = "城市", example = "嘉兴市") + private String city; + + @Schema(description = "负责人", example = "张三") + private String managerName; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingRespVO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingRespVO.java new file mode 100644 index 0000000..b6b076d --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingRespVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.asset.controller.admin.parking.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +/** + * 停车场 - Response VO + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - 停车场 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ParkingRespVO extends ParkingBaseVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingSaveReqVO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingSaveReqVO.java new file mode 100644 index 0000000..0cf1764 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingSaveReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.asset.controller.admin.parking.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 停车场 - 创建/更新 Request VO + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - 停车场创建/更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ParkingSaveReqVO extends ParkingBaseVO { + + @Schema(description = "主键", example = "1") + private Long id; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingSimpleRespVO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingSimpleRespVO.java new file mode 100644 index 0000000..44ae10f --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/parking/vo/ParkingSimpleRespVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.asset.controller.admin.parking.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 停车场 - 精简信息 Response VO + * 用于下拉选择 + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - 停车场精简信息 Response VO") +@Data +public class ParkingSimpleRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "停车场名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张江停车场") + private String name; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/VehicleModelController.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/VehicleModelController.java new file mode 100644 index 0000000..6a2f4b4 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/VehicleModelController.java @@ -0,0 +1,107 @@ +package cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo.*; +import cn.iocoder.yudao.module.asset.dal.dataobject.vehiclemodel.VehicleModelDO; +import cn.iocoder.yudao.module.asset.dal.dataobject.vehiclemodel.VehicleModelMaintainItemDO; +import cn.iocoder.yudao.module.asset.service.vehiclemodel.VehicleModelService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +/** + * 车型参数 Controller + * + * @author 芋道源码 + */ +@Tag(name = "管理后台 - 车型参数") +@RestController +@RequestMapping("/asset/vehicle-model") +@Validated +public class VehicleModelController { + + @Resource + private VehicleModelService vehicleModelService; + + @PostMapping("/create") + @Operation(summary = "创建车型参数") + @PreAuthorize("@ss.hasPermission('asset:vehicle-model:create')") + public CommonResult createVehicleModel(@Valid @RequestBody VehicleModelSaveReqVO createReqVO) { + return success(vehicleModelService.createVehicleModel(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新车型参数") + @PreAuthorize("@ss.hasPermission('asset:vehicle-model:update')") + public CommonResult updateVehicleModel(@Valid @RequestBody VehicleModelSaveReqVO updateReqVO) { + vehicleModelService.updateVehicleModel(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除车型参数") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('asset:vehicle-model:delete')") + public CommonResult deleteVehicleModel(@RequestParam("id") Long id) { + vehicleModelService.deleteVehicleModel(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得车型参数") + @Parameter(name = "id", description = "编号", required = true, example = "1") + @PreAuthorize("@ss.hasPermission('asset:vehicle-model:query')") + public CommonResult getVehicleModel(@RequestParam("id") Long id) { + VehicleModelDO vehicleModel = vehicleModelService.getVehicleModel(id); + VehicleModelRespVO respVO = BeanUtils.toBean(vehicleModel, VehicleModelRespVO.class); + + // 获取维保项目列表 + List maintainItems = vehicleModelService.getVehicleModelMaintainItems(id); + respVO.setMaintainItems(BeanUtils.toBean(maintainItems, VehicleModelMaintainItemVO.class)); + + return success(respVO); + } + + @GetMapping("/page") + @Operation(summary = "获得车型参数分页") + @PreAuthorize("@ss.hasPermission('asset:vehicle-model:query')") + public CommonResult> getVehicleModelPage(@Valid VehicleModelPageReqVO pageReqVO) { + PageResult pageResult = vehicleModelService.getVehicleModelPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, VehicleModelRespVO.class)); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得车型参数精简列表", description = "用于下拉选择") + public CommonResult> getVehicleModelSimpleList() { + List list = vehicleModelService.getVehicleModelSimpleList(); + return success(BeanUtils.toBean(list, VehicleModelSimpleRespVO.class)); + } + + @GetMapping("/list-by-brand") + @Operation(summary = "根据品牌获取车型参数列表") + @Parameter(name = "brand", description = "品牌", required = true) + public CommonResult> getVehicleModelListByBrand(@RequestParam("brand") Integer brand) { + List list = vehicleModelService.getVehicleModelListByBrand(brand); + return success(BeanUtils.toBean(list, VehicleModelRespVO.class)); + } + + @GetMapping("/list-by-model") + @Operation(summary = "根据车型获取车型参数列表") + @Parameter(name = "model", description = "车型", required = true) + public CommonResult> getVehicleModelListByModel(@RequestParam("model") Integer model) { + List list = vehicleModelService.getVehicleModelListByModel(model); + return success(BeanUtils.toBean(list, VehicleModelRespVO.class)); + } + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelBaseVO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelBaseVO.java new file mode 100644 index 0000000..1489683 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelBaseVO.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 车型参数 Base VO + * + * @author 芋道源码 + */ +@Data +public class VehicleModelBaseVO { + + @Schema(description = "品牌(字典)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "品牌不能为空") + private Integer brand; + + @Schema(description = "车型(字典)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "车型不能为空") + private Integer model; + + @Schema(description = "车型编号", example = "HFC1043K1") + private String modelCode; + + @Schema(description = "车型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "江淮骏铃V6") + @NotBlank(message = "车型名称不能为空") + private String modelName; + + @Schema(description = "车辆公告型号", example = "HFC1043K1R8T") + private String noticeModel; + + @Schema(description = "仪表盘氢气单位(字典)", example = "1") + private Integer hydrogenUnit; + + @Schema(description = "氢瓶容量(L)", example = "165") + private Integer hydrogenCapacity; + + @Schema(description = "电池公告可行驶里程(KM)", example = "300") + private Integer electricityMileage; + + @Schema(description = "储电量(kwh)", example = "80.00") + private BigDecimal reserveElectricity; + + @Schema(description = "氢气公告可行驶里程(KM)", example = "400") + private Integer hydrogenMileage; + + @Schema(description = "燃料种类(字典)", example = "1") + private Integer fuelType; + + @Schema(description = "轮胎尺寸", example = "225/70R19.5") + private String tireSize; + + @Schema(description = "轮胎数量", example = "6") + private Integer tireNumber; + + @Schema(description = "车辆尺寸", example = "5995×2100×2850") + private String truckSize; + + @Schema(description = "电堆厂家", example = "上海重塑") + private String onlineSpreadEnterprise; + + @Schema(description = "电池厂家", example = "宁德时代") + private String batteryFactory; + + @Schema(description = "冷机厂家", example = "开山") + private String refrigeratorFactory; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelMaintainItemVO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelMaintainItemVO.java new file mode 100644 index 0000000..ac0baae --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelMaintainItemVO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 车型维保项目 VO + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - 车型维保项目 VO") +@Data +public class VehicleModelMaintainItemVO { + + @Schema(description = "主键", example = "1") + private Long id; + + @Schema(description = "维保项目ID", example = "1") + private Long maintainItemId; + + @Schema(description = "保养项目", example = "更换机油") + private String maintainItem; + + @Schema(description = "保养内容", example = "更换机油、机滤") + private String maintainContent; + + @Schema(description = "材料费", example = "200.00") + private BigDecimal materialsExpenses; + + @Schema(description = "工时费", example = "100.00") + private BigDecimal hourFee; + + @Schema(description = "保养公里周期(KM)", example = "5000") + private Integer kilometerCycle; + + @Schema(description = "保养时间周期(月)", example = "6") + private Integer timeCycle; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelPageReqVO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelPageReqVO.java new file mode 100644 index 0000000..54dff03 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelPageReqVO.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 车型参数分页 Request VO + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - 车型参数分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class VehicleModelPageReqVO extends PageParam { + + @Schema(description = "品牌(字典)", example = "1") + private Integer brand; + + @Schema(description = "车型(字典)", example = "1") + private Integer model; + + @Schema(description = "车型名称", example = "江淮骏铃V6") + private String modelName; + + @Schema(description = "车型编号", example = "HFC1043K1") + private String modelCode; + + @Schema(description = "燃料种类(字典)", example = "1") + private Integer fuelType; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelRespVO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelRespVO.java new file mode 100644 index 0000000..485ad85 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelRespVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 车型参数 Response VO + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - 车型参数 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class VehicleModelRespVO extends VehicleModelBaseVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "维保项目列表") + private List maintainItems; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelSaveReqVO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelSaveReqVO.java new file mode 100644 index 0000000..54a970d --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelSaveReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import jakarta.validation.constraints.NotNull; +import java.util.List; + +/** + * 车型参数新增/修改 Request VO + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - 车型参数新增/修改 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class VehicleModelSaveReqVO extends VehicleModelBaseVO { + + @Schema(description = "主键", example = "1") + private Long id; + + @Schema(description = "维保项目列表") + private List maintainItems; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelSimpleRespVO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelSimpleRespVO.java new file mode 100644 index 0000000..4be334c --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/vehiclemodel/vo/VehicleModelSimpleRespVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 车型参数精简 Response VO + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - 车型参数精简 Response VO") +@Data +public class VehicleModelSimpleRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "车型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "江淮骏铃V6") + private String modelName; + + @Schema(description = "品牌(字典)", example = "1") + private Integer brand; + + @Schema(description = "车型(字典)", example = "1") + private Integer model; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/parking/ParkingDO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/parking/ParkingDO.java new file mode 100644 index 0000000..91baa9f --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/parking/ParkingDO.java @@ -0,0 +1,122 @@ +package cn.iocoder.yudao.module.asset.dal.dataobject.parking; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDate; + +/** + * 停车场 DO + * + * @author 芋道源码 + */ +@TableName("asset_parking") +@KeySequence("asset_parking_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ParkingDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + + /** + * 停车场名称 + */ + private String name; + + /** + * 地址 + */ + private String address; + + /** + * 容量 + */ + private Integer capacity; + + /** + * 省份 + */ + private String province; + + /** + * 城市 + */ + private String city; + + /** + * 租赁开始时间 + */ + private LocalDate leaseStartDate; + + /** + * 租赁结束时间 + */ + private LocalDate leaseEndDate; + + /** + * 负责人 + */ + private String managerName; + + /** + * 负责人联系方式 + */ + private String managerPhone; + + /** + * 停车场联系人 + */ + private String contactName; + + /** + * 停车场联系方式 + */ + private String contactPhone; + + /** + * 公司负责人 + */ + private String principal; + + /** + * 已停车辆数 + */ + private Integer parkedAmount; + + /** + * 库存区域(字典) + */ + private Integer stockArea; + + /** + * 异动城市(字典) + */ + private Integer unusualActionCity; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/vehiclemodel/VehicleModelDO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/vehiclemodel/VehicleModelDO.java new file mode 100644 index 0000000..abf6bbe --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/vehiclemodel/VehicleModelDO.java @@ -0,0 +1,117 @@ +package cn.iocoder.yudao.module.asset.dal.dataobject.vehiclemodel; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 车型参数 DO + * + * @author 芋道源码 + */ +@TableName("asset_vehicle_model") +@KeySequence("asset_vehicle_model_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class VehicleModelDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + + /** + * 品牌(字典) + */ + private Integer brand; + + /** + * 车型(字典) + */ + private Integer model; + + /** + * 车型编号 + */ + private String modelCode; + + /** + * 车型名称 + */ + private String modelName; + + /** + * 车辆公告型号 + */ + private String noticeModel; + + /** + * 仪表盘氢气单位(字典) + */ + private Integer hydrogenUnit; + + /** + * 氢瓶容量(L) + */ + private Integer hydrogenCapacity; + + /** + * 电池公告可行驶里程(KM) + */ + private Integer electricityMileage; + + /** + * 储电量(kwh) + */ + private BigDecimal reserveElectricity; + + /** + * 氢气公告可行驶里程(KM) + */ + private Integer hydrogenMileage; + + /** + * 燃料种类(字典) + */ + private Integer fuelType; + + /** + * 轮胎尺寸 + */ + private String tireSize; + + /** + * 轮胎数量 + */ + private Integer tireNumber; + + /** + * 车辆尺寸 + */ + private String truckSize; + + /** + * 电堆厂家 + */ + private String onlineSpreadEnterprise; + + /** + * 电池厂家 + */ + private String batteryFactory; + + /** + * 冷机厂家 + */ + private String refrigeratorFactory; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/vehiclemodel/VehicleModelMaintainItemDO.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/vehiclemodel/VehicleModelMaintainItemDO.java new file mode 100644 index 0000000..00f52cd --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/dataobject/vehiclemodel/VehicleModelMaintainItemDO.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.module.asset.dal.dataobject.vehiclemodel; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 车型维保项目关联 DO + * + * @author 芋道源码 + */ +@TableName("asset_vehicle_model_maintain_item") +@KeySequence("asset_vehicle_model_maintain_item_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class VehicleModelMaintainItemDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + + /** + * 车型ID + */ + private Long vehicleModelId; + + /** + * 维保项目ID + */ + private Long maintainItemId; + + /** + * 保养项目 + */ + private String maintainItem; + + /** + * 保养内容 + */ + private String maintainContent; + + /** + * 材料费 + */ + private BigDecimal materialsExpenses; + + /** + * 工时费 + */ + private BigDecimal hourFee; + + /** + * 保养公里周期(KM) + */ + private Integer kilometerCycle; + + /** + * 保养时间周期(月) + */ + private Integer timeCycle; + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/parking/ParkingMapper.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/parking/ParkingMapper.java new file mode 100644 index 0000000..85a9ce8 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/parking/ParkingMapper.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.asset.dal.mysql.parking; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.asset.controller.admin.parking.vo.ParkingPageReqVO; +import cn.iocoder.yudao.module.asset.dal.dataobject.parking.ParkingDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 停车场 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface ParkingMapper extends BaseMapperX { + + default PageResult selectPage(ParkingPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(ParkingDO::getName, reqVO.getName()) + .likeIfPresent(ParkingDO::getAddress, reqVO.getAddress()) + .likeIfPresent(ParkingDO::getProvince, reqVO.getProvince()) + .likeIfPresent(ParkingDO::getCity, reqVO.getCity()) + .likeIfPresent(ParkingDO::getManagerName, reqVO.getManagerName()) + .betweenIfPresent(ParkingDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ParkingDO::getId)); + } + + default List selectSimpleList() { + return selectList(); + } + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/vehiclemodel/VehicleModelMaintainItemMapper.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/vehiclemodel/VehicleModelMaintainItemMapper.java new file mode 100644 index 0000000..09c0718 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/vehiclemodel/VehicleModelMaintainItemMapper.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.asset.dal.mysql.vehiclemodel; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.asset.dal.dataobject.vehiclemodel.VehicleModelMaintainItemDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 车型维保项目关联 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface VehicleModelMaintainItemMapper extends BaseMapperX { + + default List selectListByVehicleModelId(Long vehicleModelId) { + return selectList(VehicleModelMaintainItemDO::getVehicleModelId, vehicleModelId); + } + + default void deleteByVehicleModelId(Long vehicleModelId) { + delete(VehicleModelMaintainItemDO::getVehicleModelId, vehicleModelId); + } + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/vehiclemodel/VehicleModelMapper.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/vehiclemodel/VehicleModelMapper.java new file mode 100644 index 0000000..06ce285 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/vehiclemodel/VehicleModelMapper.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.asset.dal.mysql.vehiclemodel; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo.VehicleModelPageReqVO; +import cn.iocoder.yudao.module.asset.dal.dataobject.vehiclemodel.VehicleModelDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 车型参数 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface VehicleModelMapper extends BaseMapperX { + + default PageResult selectPage(VehicleModelPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(VehicleModelDO::getBrand, reqVO.getBrand()) + .eqIfPresent(VehicleModelDO::getModel, reqVO.getModel()) + .likeIfPresent(VehicleModelDO::getModelName, reqVO.getModelName()) + .likeIfPresent(VehicleModelDO::getModelCode, reqVO.getModelCode()) + .eqIfPresent(VehicleModelDO::getFuelType, reqVO.getFuelType()) + .orderByDesc(VehicleModelDO::getId)); + } + + default List selectListByBrand(Integer brand) { + return selectList(VehicleModelDO::getBrand, brand); + } + + default List selectListByModel(Integer model) { + return selectList(VehicleModelDO::getModel, model); + } + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/enums/ErrorCodeConstants.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..69ac3f2 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/enums/ErrorCodeConstants.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.asset.enums; + +import cn.iocoder.yudao.framework.common.exception.ErrorCode; + +/** + * Asset 错误码枚举类 + * + * asset 系统,使用 1-008-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== 停车场管理 1-008-001-000 ========== + ErrorCode PARKING_NOT_EXISTS = new ErrorCode(1_008_001_000, "停车场不存在"); + ErrorCode PARKING_PARKED_AMOUNT_EXCEED_CAPACITY = new ErrorCode(1_008_001_001, "已停车辆数不能超过容量"); + ErrorCode PARKING_LEASE_END_DATE_BEFORE_START_DATE = new ErrorCode(1_008_001_002, "租赁结束时间不能早于开始时间"); + + // ========== 车型参数管理 1-008-002-000 ========== + ErrorCode VEHICLE_MODEL_NOT_EXISTS = new ErrorCode(1_008_002_000, "车型参数不存在"); + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/parking/ParkingService.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/parking/ParkingService.java new file mode 100644 index 0000000..5140d92 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/parking/ParkingService.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.asset.service.parking; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.asset.controller.admin.parking.vo.ParkingPageReqVO; +import cn.iocoder.yudao.module.asset.controller.admin.parking.vo.ParkingSaveReqVO; +import cn.iocoder.yudao.module.asset.dal.dataobject.parking.ParkingDO; + +import jakarta.validation.Valid; +import java.util.List; + +/** + * 停车场 Service 接口 + * + * @author 芋道源码 + */ +public interface ParkingService { + + /** + * 创建停车场 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createParking(@Valid ParkingSaveReqVO createReqVO); + + /** + * 更新停车场 + * + * @param updateReqVO 更新信息 + */ + void updateParking(@Valid ParkingSaveReqVO updateReqVO); + + /** + * 删除停车场 + * + * @param id 编号 + */ + void deleteParking(Long id); + + /** + * 获得停车场 + * + * @param id 编号 + * @return 停车场 + */ + ParkingDO getParking(Long id); + + /** + * 获得停车场分页 + * + * @param pageReqVO 分页查询 + * @return 停车场分页 + */ + PageResult getParkingPage(ParkingPageReqVO pageReqVO); + + /** + * 获得停车场精简列表 + * + * @return 停车场列表 + */ + List getParkingSimpleList(); + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/parking/ParkingServiceImpl.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/parking/ParkingServiceImpl.java new file mode 100644 index 0000000..84b0e3c --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/parking/ParkingServiceImpl.java @@ -0,0 +1,97 @@ +package cn.iocoder.yudao.module.asset.service.parking; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.asset.controller.admin.parking.vo.ParkingPageReqVO; +import cn.iocoder.yudao.module.asset.controller.admin.parking.vo.ParkingSaveReqVO; +import cn.iocoder.yudao.module.asset.dal.dataobject.parking.ParkingDO; +import cn.iocoder.yudao.module.asset.dal.mysql.parking.ParkingMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.asset.enums.ErrorCodeConstants.*; + +/** + * 停车场 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class ParkingServiceImpl implements ParkingService { + + @Resource + private ParkingMapper parkingMapper; + + @Override + public Long createParking(ParkingSaveReqVO createReqVO) { + // 业务校验 + validateParkingBusiness(createReqVO); + + ParkingDO parking = BeanUtils.toBean(createReqVO, ParkingDO.class); + parkingMapper.insert(parking); + return parking.getId(); + } + + @Override + public void updateParking(ParkingSaveReqVO updateReqVO) { + validateParkingExists(updateReqVO.getId()); + + // 业务校验 + validateParkingBusiness(updateReqVO); + + ParkingDO updateObj = BeanUtils.toBean(updateReqVO, ParkingDO.class); + parkingMapper.updateById(updateObj); + } + + @Override + public void deleteParking(Long id) { + validateParkingExists(id); + parkingMapper.deleteById(id); + } + + private void validateParkingExists(Long id) { + if (parkingMapper.selectById(id) == null) { + throw exception(PARKING_NOT_EXISTS); + } + } + + /** + * 业务校验 + */ + private void validateParkingBusiness(ParkingSaveReqVO reqVO) { + // 校验已停车辆数不能超过容量 + if (reqVO.getCapacity() != null && reqVO.getParkedAmount() != null) { + if (reqVO.getParkedAmount() > reqVO.getCapacity()) { + throw exception(PARKING_PARKED_AMOUNT_EXCEED_CAPACITY); + } + } + + // 校验租赁时间 + if (reqVO.getLeaseStartDate() != null && reqVO.getLeaseEndDate() != null) { + if (reqVO.getLeaseEndDate().isBefore(reqVO.getLeaseStartDate())) { + throw exception(PARKING_LEASE_END_DATE_BEFORE_START_DATE); + } + } + } + + @Override + public ParkingDO getParking(Long id) { + return parkingMapper.selectById(id); + } + + @Override + public PageResult getParkingPage(ParkingPageReqVO pageReqVO) { + return parkingMapper.selectPage(pageReqVO); + } + + @Override + public List getParkingSimpleList() { + return parkingMapper.selectSimpleList(); + } + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/vehiclemodel/VehicleModelService.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/vehiclemodel/VehicleModelService.java new file mode 100644 index 0000000..96279ec --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/vehiclemodel/VehicleModelService.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.module.asset.service.vehiclemodel; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo.VehicleModelPageReqVO; +import cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo.VehicleModelSaveReqVO; +import cn.iocoder.yudao.module.asset.dal.dataobject.vehiclemodel.VehicleModelDO; +import cn.iocoder.yudao.module.asset.dal.dataobject.vehiclemodel.VehicleModelMaintainItemDO; + +import jakarta.validation.Valid; +import java.util.List; + +/** + * 车型参数 Service 接口 + * + * @author 芋道源码 + */ +public interface VehicleModelService { + + /** + * 创建车型参数 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createVehicleModel(@Valid VehicleModelSaveReqVO createReqVO); + + /** + * 更新车型参数 + * + * @param updateReqVO 更新信息 + */ + void updateVehicleModel(@Valid VehicleModelSaveReqVO updateReqVO); + + /** + * 删除车型参数 + * + * @param id 编号 + */ + void deleteVehicleModel(Long id); + + /** + * 获得车型参数 + * + * @param id 编号 + * @return 车型参数 + */ + VehicleModelDO getVehicleModel(Long id); + + /** + * 获得车型参数分页 + * + * @param pageReqVO 分页查询 + * @return 车型参数分页 + */ + PageResult getVehicleModelPage(VehicleModelPageReqVO pageReqVO); + + /** + * 获得车型参数精简列表 + * + * @return 车型参数列表 + */ + List getVehicleModelSimpleList(); + + /** + * 根据品牌获取车型参数列表 + * + * @param brand 品牌 + * @return 车型参数列表 + */ + List getVehicleModelListByBrand(Integer brand); + + /** + * 根据车型获取车型参数列表 + * + * @param model 车型 + * @return 车型参数列表 + */ + List getVehicleModelListByModel(Integer model); + + /** + * 获取车型的维保项目列表 + * + * @param vehicleModelId 车型ID + * @return 维保项目列表 + */ + List getVehicleModelMaintainItems(Long vehicleModelId); + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/vehiclemodel/VehicleModelServiceImpl.java b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/vehiclemodel/VehicleModelServiceImpl.java new file mode 100644 index 0000000..0751318 --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/java/cn/iocoder/yudao/module/asset/service/vehiclemodel/VehicleModelServiceImpl.java @@ -0,0 +1,132 @@ +package cn.iocoder.yudao.module.asset.service.vehiclemodel; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo.VehicleModelMaintainItemVO; +import cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo.VehicleModelPageReqVO; +import cn.iocoder.yudao.module.asset.controller.admin.vehiclemodel.vo.VehicleModelSaveReqVO; +import cn.iocoder.yudao.module.asset.dal.dataobject.vehiclemodel.VehicleModelDO; +import cn.iocoder.yudao.module.asset.dal.dataobject.vehiclemodel.VehicleModelMaintainItemDO; +import cn.iocoder.yudao.module.asset.dal.mysql.vehiclemodel.VehicleModelMapper; +import cn.iocoder.yudao.module.asset.dal.mysql.vehiclemodel.VehicleModelMaintainItemMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.asset.enums.ErrorCodeConstants.VEHICLE_MODEL_NOT_EXISTS; + +/** + * 车型参数 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class VehicleModelServiceImpl implements VehicleModelService { + + @Resource + private VehicleModelMapper vehicleModelMapper; + + @Resource + private VehicleModelMaintainItemMapper vehicleModelMaintainItemMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createVehicleModel(VehicleModelSaveReqVO createReqVO) { + // 插入车型参数 + VehicleModelDO vehicleModel = BeanUtils.toBean(createReqVO, VehicleModelDO.class); + vehicleModelMapper.insert(vehicleModel); + + // 插入维保项目 + saveMaintainItems(vehicleModel.getId(), createReqVO.getMaintainItems()); + + // 返回 + return vehicleModel.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateVehicleModel(VehicleModelSaveReqVO updateReqVO) { + // 校验存在 + validateVehicleModelExists(updateReqVO.getId()); + + // 更新车型参数 + VehicleModelDO updateObj = BeanUtils.toBean(updateReqVO, VehicleModelDO.class); + vehicleModelMapper.updateById(updateObj); + + // 删除旧的维保项目 + vehicleModelMaintainItemMapper.deleteByVehicleModelId(updateReqVO.getId()); + + // 插入新的维保项目 + saveMaintainItems(updateReqVO.getId(), updateReqVO.getMaintainItems()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteVehicleModel(Long id) { + // 校验存在 + validateVehicleModelExists(id); + + // 删除车型参数 + vehicleModelMapper.deleteById(id); + + // 删除维保项目 + vehicleModelMaintainItemMapper.deleteByVehicleModelId(id); + } + + private void validateVehicleModelExists(Long id) { + if (vehicleModelMapper.selectById(id) == null) { + throw exception(VEHICLE_MODEL_NOT_EXISTS); + } + } + + @Override + public VehicleModelDO getVehicleModel(Long id) { + return vehicleModelMapper.selectById(id); + } + + @Override + public PageResult getVehicleModelPage(VehicleModelPageReqVO pageReqVO) { + return vehicleModelMapper.selectPage(pageReqVO); + } + + @Override + public List getVehicleModelSimpleList() { + return vehicleModelMapper.selectList(); + } + + @Override + public List getVehicleModelListByBrand(Integer brand) { + return vehicleModelMapper.selectListByBrand(brand); + } + + @Override + public List getVehicleModelListByModel(Integer model) { + return vehicleModelMapper.selectListByModel(model); + } + + @Override + public List getVehicleModelMaintainItems(Long vehicleModelId) { + return vehicleModelMaintainItemMapper.selectListByVehicleModelId(vehicleModelId); + } + + /** + * 保存维保项目 + */ + private void saveMaintainItems(Long vehicleModelId, List maintainItems) { + if (maintainItems == null || maintainItems.isEmpty()) { + return; + } + + for (VehicleModelMaintainItemVO item : maintainItems) { + VehicleModelMaintainItemDO maintainItem = BeanUtils.toBean(item, VehicleModelMaintainItemDO.class); + maintainItem.setVehicleModelId(vehicleModelId); + vehicleModelMaintainItemMapper.insert(maintainItem); + } + } + +} diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/resources/application-local.yaml b/yudao-module-asset/yudao-module-asset-server/src/main/resources/application-local.yaml new file mode 100644 index 0000000..3056a2d --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/resources/application-local.yaml @@ -0,0 +1,111 @@ +server: + port: 48084 + +spring: + application: + name: asset-server + + # 允许 Bean 覆盖 + main: + allow-bean-definition-overriding: true + + # 禁用 Nacos 配置中心 + cloud: + nacos: + config: + enabled: false + import-check: + enabled: false + + # 数据源配置 + datasource: + druid: + url: jdbc:mysql://47.103.115.36:3306/oneos_asset?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: root + password: Passw0rd2026 + driver-class-name: com.mysql.cj.jdbc.Driver + initial-size: 5 + min-idle: 5 + max-active: 20 + max-wait: 60000 + test-while-idle: true + test-on-borrow: false + test-on-return: false + + # Redis 配置 + data: + redis: + host: 47.103.115.36 + port: 6379 + database: 0 + password: Passw0rd2026 + timeout: 10s + lettuce: + pool: + max-active: 8 + max-idle: 8 + min-idle: 0 + max-wait: -1ms + +# MyBatis Plus 配置 +mybatis-plus: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + db-config: + id-type: auto + logic-delete-field: deleted + logic-delete-value: 1 + logic-not-delete-value: 0 + type-aliases-package: cn.iocoder.yudao.module.asset.dal.dataobject + +# 日志配置 +logging: + level: + root: INFO + cn.iocoder.yudao.module.asset: DEBUG + cn.iocoder.yudao.framework: INFO + pattern: + console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n' + +# 芋道配置 +yudao: + info: + version: 1.0.0 + base-package: cn.iocoder.yudao.module.asset + web: + admin-api: + prefix: /admin-api + controller: '**.controller.admin.**' + admin-ui: + url: http://localhost:3000 + security: + permit-all_urls: + - /admin-api/asset/parking/page + - /admin-api/asset/parking/simple-list + - /admin-api/asset/vehicle-model/page + - /admin-api/asset/vehicle-model/simple-list + xss: + enable: false + access-log: + enable: true + error-code: + enable: true + demo: false + tenant: + enable: false + +# Swagger 配置 +springdoc: + api-docs: + enabled: true + path: /v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html + +knife4j: + enable: true + setting: + language: zh_cn diff --git a/yudao-module-asset/yudao-module-asset-server/src/main/resources/application.yaml b/yudao-module-asset/yudao-module-asset-server/src/main/resources/application.yaml new file mode 100644 index 0000000..9cae5ca --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/main/resources/application.yaml @@ -0,0 +1,89 @@ +server: + port: 48083 + +spring: + application: + name: asset-server + + profiles: + active: local + + cloud: + nacos: + discovery: + server-addr: 127.0.0.1:8848 + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yaml + shared-configs: + - application-${spring.profiles.active}.yaml + +--- #################### 数据库相关配置 #################### + +spring: + datasource: + druid: + url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: root + password: 123456 + + # Redis 配置 + data: + redis: + host: 127.0.0.1 + port: 6379 + database: 0 + password: + +--- #################### 定时任务相关配置 #################### + +xxl: + job: + enabled: false + admin: + addresses: http://127.0.0.1:9090/xxl-job-admin + executor: + appname: ${spring.application.name} + logpath: ${user.home}/logs/xxl-job/${spring.application.name} + accessToken: default_token + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项 +lock4j: + acquire-timeout: 3000 + expire: 30000 + +--- #################### 监控相关配置 #################### + +management: + endpoints: + web: + exposure: + include: '*' + endpoint: + health: + show-details: ALWAYS + +--- #################### 芋道相关配置 #################### + +yudao: + info: + version: 1.0.0 + base-package: cn.iocoder.yudao.module.asset + web: + admin-api: + prefix: /admin-api + controller: '**.controller.admin.**' + security: + permit-all_urls: + - /admin-api/asset/truck/page # 车辆分页查询,示例 + xss: + enable: false + exclude-urls: + - /admin-api/asset/truck/create # 车辆创建,示例 + access-log: + enable: false + error-code: + enable: false + demo: false diff --git a/yudao-module-asset/yudao-module-asset-server/src/test/java/cn/iocoder/yudao/module/asset/service/parking/ParkingServiceTest.java b/yudao-module-asset/yudao-module-asset-server/src/test/java/cn/iocoder/yudao/module/asset/service/parking/ParkingServiceTest.java new file mode 100644 index 0000000..72026bd --- /dev/null +++ b/yudao-module-asset/yudao-module-asset-server/src/test/java/cn/iocoder/yudao/module/asset/service/parking/ParkingServiceTest.java @@ -0,0 +1,85 @@ +package cn.iocoder.yudao.module.asset.controller.admin.parking; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.asset.controller.admin.parking.vo.ParkingSaveReqVO; +import cn.iocoder.yudao.module.asset.dal.dataobject.parking.ParkingDO; +import cn.iocoder.yudao.module.asset.dal.mysql.parking.ParkingMapper; +import cn.iocoder.yudao.module.asset.service.parking.ParkingServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import jakarta.annotation.Resource; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * 停车场管理 Service 测试 + */ +@Import(ParkingServiceImpl.class) +public class ParkingServiceTest extends BaseDbUnitTest { + + @Resource + private ParkingServiceImpl parkingService; + + @Resource + private ParkingMapper parkingMapper; + + @Test + public void testCreateParking() { + // 准备参数 + ParkingSaveReqVO reqVO = new ParkingSaveReqVO(); + reqVO.setName("测试停车场"); + reqVO.setAddress("上海市浦东新区"); + reqVO.setCapacity(100); + reqVO.setParkedAmount(50); + + // 调用 + Long parkingId = parkingService.createParking(reqVO); + + // 断言 + assertNotNull(parkingId); + ParkingDO parking = parkingMapper.selectById(parkingId); + assertNotNull(parking); + assertEquals("测试停车场", parking.getName()); + assertEquals(100, parking.getCapacity()); + } + + @Test + public void testUpdateParking() { + // 先创建 + ParkingDO parking = new ParkingDO(); + parking.setName("原停车场"); + parking.setCapacity(50); + parkingMapper.insert(parking); + + // 准备更新参数 + ParkingSaveReqVO reqVO = new ParkingSaveReqVO(); + reqVO.setId(parking.getId()); + reqVO.setName("更新后停车场"); + reqVO.setCapacity(100); + + // 调用 + parkingService.updateParking(reqVO); + + // 断言 + ParkingDO updated = parkingMapper.selectById(parking.getId()); + assertEquals("更新后停车场", updated.getName()); + assertEquals(100, updated.getCapacity()); + } + + @Test + public void testDeleteParking() { + // 先创建 + ParkingDO parking = new ParkingDO(); + parking.setName("待删除停车场"); + parkingMapper.insert(parking); + + // 调用删除 + parkingService.deleteParking(parking.getId()); + + // 断言 + ParkingDO deleted = parkingMapper.selectById(parking.getId()); + assertNull(deleted); + } +}