From bb03dd010f82844ed0251bb9c2943eaefe270e2c Mon Sep 17 00:00:00 2001 From: cbs <18617195505@163.com> Date: Fri, 3 Jan 2025 15:54:13 +0800 Subject: [PATCH] =?UTF-8?q?wcs=E8=AE=BE=E5=A4=87=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 ++ .../yudao-module-grpc-biz/pom.xml | 28 +++++ .../{service => }/api/GrpcServiceImpl.java | 3 +- .../service/geometry/GeometryServiceImpl.java | 19 ++-- .../src/main/resources/application-local.yaml | 26 ++++- .../src/main/resources/application.yaml | 25 +---- .../src/main/resources/bootstrap.yaml | 2 +- .../chassis_navigation_control_service.proto | 61 ++++++++--- .../yudao-module-mqtt-biz/pom.xml | 1 - .../system/enums/ErrorCodeConstants.java | 4 + .../yudao-module-system-biz/pom.xml | 5 + .../DeviceInformationController.java | 96 +++++++++++++++++ .../vo/DeviceInformationPageReqVO.java | 50 +++++++++ .../vo/DeviceInformationRespVO.java | 59 +++++++++++ .../vo/DeviceInformationSaveReqVO.java | 45 ++++++++ .../information/DeviceInformationDO.java | 68 ++++++++++++ .../information/DeviceInformationMapper.java | 34 ++++++ .../system/enums/DeviceInformationType.java | 27 +++++ .../grpc/config/GrpcConfiguration.java | 10 ++ .../information/DeviceInformationService.java | 56 ++++++++++ .../DeviceInformationServiceImpl.java | 100 ++++++++++++++++++ .../information/DeviceInformationMapper.xml | 12 +++ 22 files changed, 688 insertions(+), 50 deletions(-) rename yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/{service => }/api/GrpcServiceImpl.java (83%) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/DeviceInformationController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/information/DeviceInformationDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/information/DeviceInformationMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/DeviceInformationType.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/grpc/config/GrpcConfiguration.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/information/DeviceInformationMapper.xml diff --git a/pom.xml b/pom.xml index 79e76254d..c7819f50f 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,7 @@ 2.7.18 1.6.2 UTF-8 + 1.2.5 @@ -69,6 +70,12 @@ grpc-client-spring-boot-starter ${grpc.version} + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + ${mqtt.version} + diff --git a/yudao-module-grpc/yudao-module-grpc-biz/pom.xml b/yudao-module-grpc/yudao-module-grpc-biz/pom.xml index b696a9726..4bc142579 100644 --- a/yudao-module-grpc/yudao-module-grpc-biz/pom.xml +++ b/yudao-module-grpc/yudao-module-grpc-biz/pom.xml @@ -24,18 +24,46 @@ + + cn.iocoder.cloud + yudao-module-system-api + ${revision} + + cn.iocoder.cloud yudao-module-grpc-api ${revision} + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + commons-collections + commons-collections + 3.2.2 + + cn.iocoder.cloud yudao-module-grpc-lib ${revision} + + com.alibaba.boot + nacos-config-spring-boot-starter + 0.2.12 + + io.swagger.core.v3 swagger-annotations diff --git a/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/api/GrpcServiceImpl.java b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/api/GrpcServiceImpl.java similarity index 83% rename from yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/api/GrpcServiceImpl.java rename to yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/api/GrpcServiceImpl.java index 3bb7da94f..2053bf1c5 100644 --- a/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/api/GrpcServiceImpl.java +++ b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/api/GrpcServiceImpl.java @@ -1,6 +1,5 @@ -package cn.iocoder.yudao.module.grpc.service.api; +package cn.iocoder.yudao.module.grpc.api; -import cn.iocoder.yudao.module.grpc.api.GrpcServiceApi; import cn.iocoder.yudao.module.grpc.service.geometry.GeometryService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; diff --git a/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/geometry/GeometryServiceImpl.java b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/geometry/GeometryServiceImpl.java index 5cc261087..885f7fe21 100644 --- a/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/geometry/GeometryServiceImpl.java +++ b/yudao-module-grpc/yudao-module-grpc-biz/src/main/java/cn/iocoder/yudao/module/grpc/service/geometry/GeometryServiceImpl.java @@ -3,14 +3,16 @@ package cn.iocoder.yudao.module.grpc.service.geometry; import com.google.protobuf.DoubleValue; import device.proto.model.common.Geometry; import device.proto.model.common.Types; +import device.proto.robotics.nav.ChassisNavigationControlService; +import device.proto.robotics.nav.ChassisNavigationServiceGrpc; import io.grpc.Channel; -import device.proto.api.al.robotics.universal.nav.ChassisNavigationServiceGrpc; +import lombok.extern.slf4j.Slf4j; import net.devh.springboot.autoconfigure.grpc.client.GrpcClient; import org.springframework.stereotype.Service; import java.util.Iterator; - +@Slf4j @Service public class GeometryServiceImpl implements GeometryService{ @@ -19,18 +21,17 @@ public class GeometryServiceImpl implements GeometryService{ @Override public String onVehiclePoseUpdated() { + log.info("测试GRPC连接"); ChassisNavigationServiceGrpc.ChassisNavigationServiceBlockingStub myServiceStub = ChassisNavigationServiceGrpc.newBlockingStub(this.serverChannel); - Iterator pose2dIterator = myServiceStub.onVehiclePoseUpdated(null); - while (pose2dIterator.hasNext()) { - Geometry.Pose2d next = pose2dIterator.next(); - System.out.println("返回的 " + next); + Iterator responseIterator = myServiceStub.onVehiclePoseUpdated(null); + while (responseIterator.hasNext()) { + log.info("机车推送的消息 :{}",responseIterator.next()); } - DoubleValue build = DoubleValue.newBuilder().build(); - Types.Nothing nothing = myServiceStub.forkControl(build); - return nothing.toString(); + ChassisNavigationControlService.Response response = myServiceStub.forkControl(build); + return response.toString(); } diff --git a/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application-local.yaml b/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application-local.yaml index e97c6ff0b..51b033f4b 100644 --- a/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application-local.yaml +++ b/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application-local.yaml @@ -1,7 +1,31 @@ +# grpc配置 +grpc: + # grpc clienT相关配置 + client: + # 是服务端配置的名字,GrpcClient注解会用到 + ChassisNavigationService: + # gRPC服务端地址 + host: 192.168.10.78 + port: 6914 + # 是否开启保持连接(长连接) + enableKeepAlive: true + # 保持连接时长(默认20s) + keepAliveTimeout: 20 + # 没有RPC调用时是否保持连接(默认false,可禁用避免额外消耗CPU) + keepAliveWithoutCalls: false + # 客户端负载均衡策略(round_robin(默认), pick_first) + defaultLoadBalancingPolicy: round_robin + # 通信类型 + # plaintext | plaintext_upgrade | tls + # 明文通信且http/2 | 明文通信且升级http/1.1为http/2 | 使用TLS(ALPN/NPN)通信 + negotiationType: plaintext + + + spring: cloud: nacos: - server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + server-addr: localhost:8848 # Nacos 服务器地址 username: # Nacos 账号 password: # Nacos 密码 discovery: # 【配置中心】配置项 diff --git a/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application.yaml b/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application.yaml index 389b2dc48..12b5b267d 100644 --- a/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application.yaml +++ b/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/application.yaml @@ -1,26 +1,3 @@ -# grpc配置 -grpc: - # grpc clienT相关配置 - client: - # 是服务端配置的名字,GrpcClient注解会用到 - ChassisNavigationService: - # gRPC服务端地址 - host: 192.168.10.211 - port: 6914 - # 是否开启保持连接(长连接) - enableKeepAlive: true - # 保持连接时长(默认20s) - keepAliveTimeout: 20 - # 没有RPC调用时是否保持连接(默认false,可禁用避免额外消耗CPU) - keepAliveWithoutCalls: false - # 客户端负载均衡策略(round_robin(默认), pick_first) - defaultLoadBalancingPolicy: round_robin - # 通信类型 - # plaintext | plaintext_upgrade | tls - # 明文通信且http/2 | 明文通信且升级http/1.1为http/2 | 使用TLS(ALPN/NPN)通信 - negotiationType: plaintext - - spring: application: @@ -45,7 +22,7 @@ spring: fail-on-empty-beans: false # 允许序列化无属性的 Bean server: - port: 48082 + port: 48084 debug: false diff --git a/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/bootstrap.yaml b/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/bootstrap.yaml index 664d586df..391f56741 100644 --- a/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/bootstrap.yaml +++ b/yudao-module-grpc/yudao-module-grpc-biz/src/main/resources/bootstrap.yaml @@ -7,7 +7,7 @@ spring: # active: prod server: - port: 48082 + port: 48084 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件 logging: diff --git a/yudao-module-grpc/yudao-module-grpc-lib/src/main/proto/svc/robotics/universal/chassis_navigation_control_service.proto b/yudao-module-grpc/yudao-module-grpc-lib/src/main/proto/svc/robotics/universal/chassis_navigation_control_service.proto index 3b1148168..9902f9faa 100644 --- a/yudao-module-grpc/yudao-module-grpc-lib/src/main/proto/svc/robotics/universal/chassis_navigation_control_service.proto +++ b/yudao-module-grpc/yudao-module-grpc-lib/src/main/proto/svc/robotics/universal/chassis_navigation_control_service.proto @@ -1,32 +1,69 @@ syntax = "proto3"; -package device.proto.api.al.robotics.universal.nav; +package device.proto.robotics.nav; option csharp_namespace = "Al.Proto.Api.Robotics.Nav"; import "google/protobuf/empty.proto"; import "google/protobuf/wrappers.proto"; -import "model/common/geometry.proto"; -import "model/common/types.proto"; import "google/protobuf/struct.proto"; -//位姿数组运动请求 +//平面2d位姿 +message Pose2d { + double x = 1; //平移x + double y = 2; //平移y + double yaw = 3; //角度 +} + message NavigateThroughPosesRequest { - //位姿数组 - repeated device.proto.model.common.Pose2d pose2ds = 1; + repeated Pose2d pose2ds = 1; +} + +//摇杆控制请求 +message JoyAgvRequest { + //x方向的速度 + double vx = 1; + //y方向的速度 + double vy = 2; + //角速度 + double angle = 3; +} + +message Response { + //响应的状态码 + string status_code = 1; + //失败时的错误原因 + string message = 2; + //附带的响应内容 + google.protobuf.Struct data = 3; } service ChassisNavigationService { //订阅车体位姿更新 - rpc OnVehiclePoseUpdated(google.protobuf.Empty) returns (stream device.proto.model.common.Pose2d) {} + rpc OnVehiclePoseUpdated(google.protobuf.Empty) returns (stream Response) {} //订阅跟踪的物体的位姿更新 - rpc OnTrackingPoseUpdated(google.protobuf.Empty) returns (stream device.proto.model.common.Pose2d) {} + rpc OnTrackingPoseUpdated(google.protobuf.Empty) returns (stream Response) {} //导航到指定位姿 - rpc NavigateToPose(device.proto.model.common.Pose2d) returns (device.proto.model.common.Nothing) {} + rpc NavigateToPose(Pose2d) returns (Response) {} //路径导航 - rpc NavigateThroughPoses(NavigateThroughPosesRequest) returns (device.proto.model.common.Nothing) {} + rpc NavigateThroughPoses(NavigateThroughPosesRequest) returns (Response) {} //货叉纵向控制 - rpc ForkControl(google.protobuf.DoubleValue) returns (device.proto.model.common.Nothing) {} - + rpc ForkControl(google.protobuf.DoubleValue) returns (Response) {} + //订阅机器人状态更新 + rpc OnRobotStateUpdated(google.protobuf.Empty) returns (stream Response) {} + //监听订阅底盘主IMU数据的更新 + rpc OnChassesMainImuDataUpdated(google.protobuf.Empty) returns (stream Response) {} + //监听车体用于定位的里程计更新 + rpc OnChassesOdometryUpdated(google.protobuf.Empty) returns (stream Response) {} + //监听雷达里程计更新 + rpc OnPerceptionLaserOdometryUpdated(google.protobuf.Empty) returns (stream Response) {} + //监听轮式里程计更新 + rpc OnWheelOdometryUpdated(google.protobuf.Empty) returns (stream Response) {} + //机器人故障状态 + rpc OnRobotFaultStatusUpdated(google.protobuf.Empty) returns (stream Response) {} + //摇杆车体运动控制 + rpc JoyAgvControl(JoyAgvRequest) returns (Response) {} + //摇杆货叉运动控制 + rpc JoyForkControl(google.protobuf.Struct) returns (Response) {} } diff --git a/yudao-module-mqtt/yudao-module-mqtt-biz/pom.xml b/yudao-module-mqtt/yudao-module-mqtt-biz/pom.xml index 604f70488..cd542ce49 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-biz/pom.xml +++ b/yudao-module-mqtt/yudao-module-mqtt-biz/pom.xml @@ -45,7 +45,6 @@ org.eclipse.paho org.eclipse.paho.client.mqttv3 - 1.2.5 diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 96052dc72..9dc4e9681 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -163,4 +163,8 @@ public interface ErrorCodeConstants { // ========== 站内信发送 1-002-028-000 ========== ErrorCode NOTIFY_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_028_000, "模板参数({})缺失"); + // ========== 设备信息 1-002-029-000 ========== + ErrorCode INFORMATION_NOT_EXISTS = new ErrorCode(1_002_029_001, "设备信息不存在"); + ErrorCode INFORMATION_MAC_EXIST = new ErrorCode(1_002_029_002, "此Mac地址已经存在"); + ErrorCode INFORMATION_MAC_INPUT = new ErrorCode(1_002_029_003, "请输入Mac地址"); } diff --git a/yudao-module-system/yudao-module-system-biz/pom.xml b/yudao-module-system/yudao-module-system-biz/pom.xml index b279c9b65..c669df152 100644 --- a/yudao-module-system/yudao-module-system-biz/pom.xml +++ b/yudao-module-system/yudao-module-system-biz/pom.xml @@ -35,6 +35,11 @@ yudao-module-infra-api ${revision} + + cn.iocoder.cloud + yudao-module-grpc-api + ${revision} + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/DeviceInformationController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/DeviceInformationController.java new file mode 100644 index 000000000..48cfd6d66 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/DeviceInformationController.java @@ -0,0 +1,96 @@ +package cn.iocoder.yudao.module.system.controller.admin.information; + +import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationRespVO; +import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO; +import cn.iocoder.yudao.module.system.service.information.DeviceInformationService; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + + +@Tag(name = "管理后台 - 设备信息") +@RestController +@RequestMapping("/system/device/information") +@Validated +public class DeviceInformationController { + + @Resource + private DeviceInformationService informationService; + + @PostMapping("/create") + @Operation(summary = "创建设备信息") + @PreAuthorize("@ss.hasPermission('device:information:create')") + public CommonResult createInformation(@Valid @RequestBody DeviceInformationSaveReqVO createReqVO) { + return success(informationService.createInformation(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新设备信息") + @PreAuthorize("@ss.hasPermission('device:information:update')") + public CommonResult updateInformation(@Valid @RequestBody DeviceInformationSaveReqVO updateReqVO) { + informationService.updateInformation(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除设备信息") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('device:information:delete')") + public CommonResult deleteInformation(@RequestParam("id") Long id) { + informationService.deleteInformation(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得设备信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('device:information:query')") + public CommonResult getInformation(@RequestParam("id") Long id) { + DeviceInformationDO information = informationService.getInformation(id); + return success(BeanUtils.toBean(information, DeviceInformationRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得设备信息分页") + @PreAuthorize("@ss.hasPermission('device:information:query')") + public CommonResult> getInformationPage(@Valid DeviceInformationPageReqVO pageReqVO) { + PageResult pageResult = informationService.getInformationPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, DeviceInformationRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出设备信息 Excel") + @PreAuthorize("@ss.hasPermission('device:information:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportInformationExcel(@Valid DeviceInformationPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = informationService.getInformationPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "设备信息.xls", "数据", DeviceInformationRespVO.class, + BeanUtils.toBean(list, DeviceInformationRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationPageReqVO.java new file mode 100644 index 000000000..656f9376a --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationPageReqVO.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.module.system.controller.admin.information.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +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; + +@Schema(description = "管理后台 - 设备信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceInformationPageReqVO extends PageParam { + + @Schema(description = "设备类型(1:充电桩、2:输送线、 3:码垛机、4:拆垛机、5:自动门、6:提升机、7:信号灯、8:按钮盒)", example = "2") + private Integer deviceType; + + @Schema(description = "设备编号") + private String deviceNo; + + @Schema(description = "mac地址") + private String macAddress; + + @Schema(description = "上传图片附件", example = "https://www.iocoder.cn") + private String url; + + @Schema(description = "图片设置(1:默认图片、2:上传图片、 3:不显示图片)") + private Integer pictureConfig; + + @Schema(description = "设备状态(1:在线、2:离线、 3:异常)", example = "1") + private Integer deviceStatus; + + @Schema(description = "设备启用禁用(0:禁用、1:启用)") + private Integer deviceEnable; + + @Schema(description = "设备协议") + private String deviceAgreement; + + @Schema(description = "设备最后通讯时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] deviceLastTime; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationRespVO.java new file mode 100644 index 000000000..61aa77568 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationRespVO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.system.controller.admin.information.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 设备信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class DeviceInformationRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14335") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "设备类型(1:充电桩、2:输送线、 3:码垛机、4:拆垛机、5:自动门、6:提升机、7:信号灯、8:按钮盒)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty("设备类型(1:充电桩、2:输送线、 3:码垛机、4:拆垛机、5:自动门、6:提升机、7:信号灯、8:按钮盒)") + private Integer deviceType; + + @Schema(description = "设备编号") + @ExcelProperty("设备编号") + private String deviceNo; + + @Schema(description = "mac地址") + @ExcelProperty("mac地址") + private String macAddress; + + @Schema(description = "上传图片附件", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn") + @ExcelProperty("上传图片附件") + private String url; + + @Schema(description = "图片设置(1:默认图片、2:上传图片、 3:不显示图片)") + @ExcelProperty("图片设置(1:默认图片、2:上传图片、 3:不显示图片)") + private Integer pictureConfig; + + @Schema(description = "设备状态(1:在线、2:离线、 3:异常)", example = "1") + @ExcelProperty("设备状态(1:在线、2:离线、 3:异常)") + private Integer deviceStatus; + + @Schema(description = "设备启用禁用(0:禁用、1:启用)") + @ExcelProperty("设备启用禁用(0:禁用、1:启用)") + private Integer deviceEnable; + + @Schema(description = "设备协议") + @ExcelProperty("设备协议") + private String deviceAgreement; + + @Schema(description = "设备最后通讯时间") + @ExcelProperty("设备最后通讯时间") + private LocalDateTime deviceLastTime; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationSaveReqVO.java new file mode 100644 index 000000000..1741d39a8 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/vo/DeviceInformationSaveReqVO.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.system.controller.admin.information.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 设备信息新增/修改 Request VO") +@Data +public class DeviceInformationSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14335") + private Long id; + + @Schema(description = "设备类型(1:充电桩、2:输送线、 3:码垛机、4:拆垛机、5:自动门、6:提升机、7:信号灯、8:按钮盒)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "设备类型不能为空") + private Integer deviceType; + + @Schema(description = "设备编号") + private String deviceNo; + + @Schema(description = "mac地址") + private String macAddress; + + @Schema(description = "上传图片附件", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn") + private String url; + + @Schema(description = "图片设置(1:默认图片、2:上传图片、 3:不显示图片)") + private Integer pictureConfig; + + @Schema(description = "设备状态(1:在线、2:离线、 3:异常)", example = "1") + private Integer deviceStatus; + + @Schema(description = "设备启用禁用(0:禁用、1:启用)") + private Integer deviceEnable; + + @Schema(description = "设备协议") + private String deviceAgreement; + + @Schema(description = "设备最后通讯时间") + private LocalDateTime deviceLastTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/information/DeviceInformationDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/information/DeviceInformationDO.java new file mode 100644 index 000000000..0a781de74 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/information/DeviceInformationDO.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.information; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 设备信息 DO + * + * @author 陈宾顺 + */ +@TableName("device_information") +@KeySequence("device_information_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceInformationDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 设备类型(1:充电桩、2:输送线、 3:码垛机、4:拆垛机、5:自动门、6:提升机、7:信号灯、8:按钮盒) + */ + private Integer deviceType; + /** + * 设备编号 + */ + private String deviceNo; + /** + * mac地址 + */ + private String macAddress; + /** + * 上传图片附件 + */ + private String url; + /** + * 图片设置(1:默认图片、2:上传图片、 3:不显示图片) + */ + private Integer pictureConfig; + /** + * 设备状态(1:在线、2:离线、 3:异常) + */ + private Integer deviceStatus; + /** + * 设备启用禁用(0:禁用、1:启用) + */ + private Integer deviceEnable; + /** + * 设备协议 + */ + private String deviceAgreement; + /** + * 设备最后通讯时间 + */ + private LocalDateTime deviceLastTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/information/DeviceInformationMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/information/DeviceInformationMapper.java new file mode 100644 index 000000000..b5a66536b --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/information/DeviceInformationMapper.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.system.dal.mysql.information; + + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 设备信息 Mapper + * + * @author 陈宾顺 + */ +@Mapper +public interface DeviceInformationMapper extends BaseMapperX { + + default PageResult selectPage(DeviceInformationPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeviceInformationDO::getDeviceType, reqVO.getDeviceType()) + .eqIfPresent(DeviceInformationDO::getDeviceNo, reqVO.getDeviceNo()) + .eqIfPresent(DeviceInformationDO::getMacAddress, reqVO.getMacAddress()) + .eqIfPresent(DeviceInformationDO::getUrl, reqVO.getUrl()) + .eqIfPresent(DeviceInformationDO::getPictureConfig, reqVO.getPictureConfig()) + .eqIfPresent(DeviceInformationDO::getDeviceStatus, reqVO.getDeviceStatus()) + .eqIfPresent(DeviceInformationDO::getDeviceEnable, reqVO.getDeviceEnable()) + .eqIfPresent(DeviceInformationDO::getDeviceAgreement, reqVO.getDeviceAgreement()) + .betweenIfPresent(DeviceInformationDO::getDeviceLastTime, reqVO.getDeviceLastTime()) + .betweenIfPresent(DeviceInformationDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DeviceInformationDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/DeviceInformationType.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/DeviceInformationType.java new file mode 100644 index 000000000..27c4f0c44 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/DeviceInformationType.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.system.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum DeviceInformationType { + + CHARGING_STATION(1, "充电桩"), + Conveyor_line(2, "输送线"), + PALLETIZER(3, "码垛机"), + DISMANTLING_MACHINE(4, "拆垛机"), + AUTOMATIC_DOOR(5, "自动门"), + HOIST(6, "提升机"), + SIGNAL_LIGHT(7, "信号灯"), + BUTTON_BOX(8, "按钮盒"); + + /** + * 类型 + */ + private final Integer type; + /** + * 说明 + */ + private final String source; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/grpc/config/GrpcConfiguration.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/grpc/config/GrpcConfiguration.java new file mode 100644 index 000000000..883de0c63 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/grpc/config/GrpcConfiguration.java @@ -0,0 +1,10 @@ +package cn.iocoder.yudao.module.system.framework.grpc.config; + +import cn.iocoder.yudao.module.grpc.api.GrpcServiceApi; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +@EnableFeignClients(clients = {GrpcServiceApi.class}) +public class GrpcConfiguration { +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationService.java new file mode 100644 index 000000000..0c1955bf7 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationService.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.system.service.information; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO; + +/** + * 设备信息 Service 接口 + * + * @author 陈宾顺 + */ +public interface DeviceInformationService { + + /** + * 创建设备信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createInformation(@Valid DeviceInformationSaveReqVO createReqVO); + + /** + * 更新设备信息 + * + * @param updateReqVO 更新信息 + */ + void updateInformation(@Valid DeviceInformationSaveReqVO updateReqVO); + + /** + * 删除设备信息 + * + * @param id 编号 + */ + void deleteInformation(Long id); + + /** + * 获得设备信息 + * + * @param id 编号 + * @return 设备信息 + */ + DeviceInformationDO getInformation(Long id); + + /** + * 获得设备信息分页 + * + * @param pageReqVO 分页查询 + * @return 设备信息分页 + */ + PageResult getInformationPage(DeviceInformationPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java new file mode 100644 index 000000000..13a889b7b --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java @@ -0,0 +1,100 @@ +package cn.iocoder.yudao.module.system.service.information; + +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.module.grpc.api.GrpcServiceApi; +import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO; +import cn.iocoder.yudao.module.system.dal.mysql.information.DeviceInformationMapper; +import cn.iocoder.yudao.module.system.enums.DeviceInformationType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; + +/** + * 设备信息 Service 实现类 + * + * @author 陈宾顺 + */ +@Service +@Validated +@Slf4j +public class DeviceInformationServiceImpl implements DeviceInformationService { + + @Resource + private DeviceInformationMapper informationMapper; + + @Resource + private GrpcServiceApi grpcServiceApi; + + @Override + public Long createInformation(DeviceInformationSaveReqVO createReqVO) { + DeviceInformationPageReqVO pageReqVO = new DeviceInformationPageReqVO(); + pageReqVO.setMacAddress(createReqVO.getMacAddress()); + PageResult pageResult = informationMapper.selectPage(pageReqVO); + if(ObjectUtil.isNotEmpty(pageResult.getList())){ + throw exception(INFORMATION_MAC_EXIST); + } + //AGV需要判断机车是否接收到此Mac地址 + if(DeviceInformationType.PALLETIZER.getType().equals(createReqVO.getDeviceType()) + && ObjectUtil.isEmpty(createReqVO.getMacAddress())){ + throw exception(INFORMATION_MAC_INPUT); + } + if(DeviceInformationType.PALLETIZER.getType().equals(createReqVO.getDeviceType())){ + String jiCheResponse = grpcServiceApi.onVehiclePoseUpdated(); + log.info("调用GRPC查询机车信息返回 :{}",jiCheResponse); + } + + // 插入 + DeviceInformationDO information = BeanUtils.toBean(createReqVO, DeviceInformationDO.class); + information.setDeviceStatus(1); + information.setDeviceLastTime(LocalDateTime.now()); + informationMapper.insert(information); + // 返回 + return information.getId(); + } + + @Override + public void updateInformation(DeviceInformationSaveReqVO updateReqVO) { + // 校验存在 + validateInformationExists(updateReqVO.getId()); + // 更新 + DeviceInformationDO updateObj = BeanUtils.toBean(updateReqVO, DeviceInformationDO.class); + informationMapper.updateById(updateObj); + } + + @Override + public void deleteInformation(Long id) { + // 校验存在 + validateInformationExists(id); + // 删除 + informationMapper.deleteById(id); + } + + private void validateInformationExists(Long id) { + if (informationMapper.selectById(id) == null) { + throw exception(INFORMATION_NOT_EXISTS); + } + } + + @Override + public DeviceInformationDO getInformation(Long id) { + return informationMapper.selectById(id); + } + + @Override + public PageResult getInformationPage(DeviceInformationPageReqVO pageReqVO) { + return informationMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/information/DeviceInformationMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/information/DeviceInformationMapper.xml new file mode 100644 index 000000000..71983bc2a --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/information/DeviceInformationMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file