From 66d75222079034e988be09192923d83399efde9b Mon Sep 17 00:00:00 2001 From: yuliang <398780299@qq.com> Date: Thu, 3 Jul 2025 17:19:12 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=BB=93=E6=9E=84=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/galaxis/rcs/plan/path/PathUtils.java | 28 ++++++++++++++++++++++ .../com/galaxis/rcs/ptr/AmrMessageHandler.java | 19 +++------------ .../main/java/com/galaxis/rcs/ptr/AmrTaskMode.java | 6 +---- .../main/java/com/galaxis/rcs/ptr/PtrAgvItem.java | 7 ++++-- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/servo/src/main/java/com/galaxis/rcs/plan/path/PathUtils.java b/servo/src/main/java/com/galaxis/rcs/plan/path/PathUtils.java index 439cd4a..4acf777 100644 --- a/servo/src/main/java/com/galaxis/rcs/plan/path/PathUtils.java +++ b/servo/src/main/java/com/galaxis/rcs/plan/path/PathUtils.java @@ -180,4 +180,32 @@ public class PathUtils { float diff = Math.abs(angle1 - angle2) % 360; return diff > 180 ? 360 - diff : diff; } + + public static short amrAngleToDirection(double angle) { + + // 误差范围 +-1度 + double angleRange = 1.0f; + + while (angle < 0) { + angle += 360; + } + while (angle >= 360) { + angle -= 360; + } + + if (angle <= angleRange || angle >= 360 - angleRange) { + return 0; + } + if (angle <= 90 + angleRange && angle >= 90 - angleRange) { + return 1; + } + if (angle <= 180 + angleRange && angle >= 180 - angleRange) { + return 2; + } + if (angle <= 270 + angleRange && angle >= 270 - angleRange) { + return 3; + } + + return 15; + } } diff --git a/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java b/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java index 2d2e240..c9bd749 100644 --- a/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java +++ b/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java @@ -3,6 +3,7 @@ package com.galaxis.rcs.ptr; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; +import com.galaxis.rcs.plan.path.PathUtils; import com.galaxis.rcs.ptr.receiveEntity.*; import com.galaxis.rcs.ptr.receiveEntity.base.*; import com.galaxis.rcs.ptr.sendEntity.*; @@ -432,7 +433,7 @@ public class AmrMessageHandler { agvItem.x = message.X; agvItem.y = message.Y; agvItem.orientation = message.CurOrientation; - + agvItem.direction = PathUtils.amrAngleToDirection(message.CurOrientation); agvItem.updatePosition(message.CurLogicX, message.CurLogicY, message.CurDirection); } @@ -448,26 +449,12 @@ public class AmrMessageHandler { agvItem.orientation = message.CurOrientation; agvItem.logicX = message.CurLogicX; agvItem.logicY = message.CurLogicY; - + agvItem.direction = PathUtils.amrAngleToDirection(message.CurOrientation); // 更新Redis agvItem.updateRedisStatus(); } private void handleTaskStatusMessage(PtrAgvItem agvItem, JsonWrapper jw, String json) throws MqttException, JsonProcessingException { - // int eventId = jw.asInt("content", "EventId"); - // int seqNo = jw.asInt("content", "SeqNo"); - // - // switch (eventId) { - // case 4: // 任务完成 - // int curLogicX = jw.asInt("content", "Info", "CurLogicX"); - // int curLogicY = jw.asInt("content", "Info", "CurLogicY"); - // agvItem.updateDeviceTaskStatus(seqNo, curLogicX, curLogicY, eventId); - // break; - // default: - // agvItem.updateDeviceTaskStatus(seqNo, 0, 0, eventId); - // break; - // } - int EventId = jw.asInt("content", "EventId"); // log.info("1-Received message: " + json); diff --git a/servo/src/main/java/com/galaxis/rcs/ptr/AmrTaskMode.java b/servo/src/main/java/com/galaxis/rcs/ptr/AmrTaskMode.java index 8ade272..a740f5c 100644 --- a/servo/src/main/java/com/galaxis/rcs/ptr/AmrTaskMode.java +++ b/servo/src/main/java/com/galaxis/rcs/ptr/AmrTaskMode.java @@ -44,11 +44,7 @@ public enum AmrTaskMode { /** * 自定义模式 */ - AMR_CUSTOMIZE_MODE(8, "自定义模式"), - /** - * 主程序退出(关机或关服务)时会进入这个模式 - */ - AMR_SHUTDOWN_MODE(8, "主程序退出"); + AMR_CUSTOMIZE_MODE(8, "自定义模式"); // 枚举值映射 private static final Map VALUE_MAP; diff --git a/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java b/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java index cd16edb..9f17828 100644 --- a/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java +++ b/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java @@ -261,7 +261,10 @@ public abstract class PtrAgvItem extends ExecutorItem { if (this.isPaused) { return false; } - return true; + if (this.taskMode != AmrTaskMode.AMR_FREE_MODE) { + return false; + } + return this.isOnline; } public void taskCompleted(int logicX, int logicY, short direction, int taskStatus) { @@ -390,7 +393,7 @@ public abstract class PtrAgvItem extends ExecutorItem { } public void updateTaskMode(int taskMode) { - + this.taskMode = AmrTaskMode.fromValue(taskMode); } public void updateRedisStatus() { From 62c82cacbeaf1326ea95a623456b065752b000a4 Mon Sep 17 00:00:00 2001 From: lizw-2015 <1183409807@qq.com> Date: Thu, 3 Jul 2025 17:36:16 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(device):=20=E6=B7=BB=E5=8A=A0=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 DeviceManager 类,实现设备相关数据查询方法 - 添加 QueryExecutorReq、QueryInvLedgerReq、QueryInvLpnReq、QueryLocationReq 等请求模型类 - 实现 locations 和 vehicles 页面的查询功能,包括表单输入和表格展示 - 优化页面样式,添加查询按钮和数据加载状态显示 --- .../yvan/workbench/controller/DeviceManager.java | 82 ++++++++++++++++++++++ .../workbench/model/request/QueryExecutorReq.java | 15 ++++ .../workbench/model/request/QueryInvLedgerReq.java | 13 ++++ .../workbench/model/request/QueryInvLpnReq.java | 15 ++++ .../workbench/model/request/QueryLocationReq.java | 13 ++++ 5 files changed, 138 insertions(+) create mode 100644 servo/src/main/java/com/yvan/workbench/controller/DeviceManager.java create mode 100644 servo/src/main/java/com/yvan/workbench/model/request/QueryExecutorReq.java create mode 100644 servo/src/main/java/com/yvan/workbench/model/request/QueryInvLedgerReq.java create mode 100644 servo/src/main/java/com/yvan/workbench/model/request/QueryInvLpnReq.java create mode 100644 servo/src/main/java/com/yvan/workbench/model/request/QueryLocationReq.java diff --git a/servo/src/main/java/com/yvan/workbench/controller/DeviceManager.java b/servo/src/main/java/com/yvan/workbench/controller/DeviceManager.java new file mode 100644 index 0000000..34b57a2 --- /dev/null +++ b/servo/src/main/java/com/yvan/workbench/controller/DeviceManager.java @@ -0,0 +1,82 @@ +package com.yvan.workbench.controller; + +import com.galaxis.rcs.common.entity.LccBasExecutor; +import com.galaxis.rcs.common.entity.LccBasLocation; +import com.galaxis.rcs.common.entity.LccInvLedger; +import com.querydsl.sql.SQLQuery; +import com.yvan.workbench.model.request.QueryExecutorReq; +import com.yvan.workbench.model.request.QueryInvLedgerReq; +import com.yvan.workbench.model.request.QueryInvLpnReq; +import com.yvan.workbench.model.request.QueryLocationReq; +import org.apache.commons.lang3.StringUtils; +import org.clever.core.model.request.QueryByPage; +import org.clever.core.model.request.page.Page; +import org.clever.data.jdbc.DaoFactory; +import org.clever.data.jdbc.QueryDSL; +import org.clever.data.jdbc.querydsl.utils.QueryDslUtils; + +import java.util.LinkedHashMap; +import java.util.List; + +import static com.galaxis.rcs.common.query.QLccBasContainer.lccBasContainer; +import static com.galaxis.rcs.common.query.QLccBasExecutor.lccBasExecutor; +import static com.galaxis.rcs.common.query.QLccBasLocation.lccBasLocation; +import static com.galaxis.rcs.common.query.QLccInvLedger.lccInvLedger; +import static com.galaxis.rcs.common.query.QLccInvLpn.lccInvLpn; + +/** + * 作者:lizw
+ * 创建时间:2025/07/03 14:33
+ */ +public class DeviceManager { + private static final QueryDSL QUERY_DSL = DaoFactory.getQueryDSL(); + + public static List queryLocation(QueryLocationReq req) { + SQLQuery query = QUERY_DSL.selectFrom(lccBasLocation).orderBy(lccBasLocation.locCode.asc()); + if (StringUtils.isNotBlank(req.getLocCode())) { + query.where(lccBasLocation.locCode.eq(req.getLocCode().trim())); + } + return query.fetch(); + } + + public static List queryExecutor(QueryExecutorReq req) { + SQLQuery query = QUERY_DSL.selectFrom(lccBasExecutor).orderBy(lccBasExecutor.executorId.asc()); + if (StringUtils.isNotBlank(req.getVirtualFloorCode())) { + query.where(lccBasExecutor.executorId.eq(req.getVirtualFloorCode().trim())); + } + if (req.getIsActive() != null) { + query.where(lccBasExecutor.isActive.eq(req.getIsActive())); + } + return query.fetch(); + } + + public static Page> queryInvLpn(QueryInvLpnReq req) { + SQLQuery> query = QUERY_DSL.select(QueryDslUtils.linkedMap(lccInvLpn, lccBasLocation, lccBasContainer)) + .from(lccInvLpn) + .innerJoin(lccBasLocation).on( + lccInvLpn.locCode.eq(lccBasLocation.locCode).and( + lccBasLocation.envId.eq(lccBasLocation.envId) + ) + ) + .innerJoin(lccBasContainer).on( + lccInvLpn.lpn.eq(lccInvLpn.lpn).and( + lccBasContainer.envId.eq(lccInvLpn.envId) + ) + ).orderBy(lccInvLpn.lpn.asc()); + if (StringUtils.isNotBlank(req.getLpn())) { + query.where(lccInvLpn.lpn.eq(req.getLpn().trim())); + } + if (StringUtils.isNotBlank(req.getLocCode())) { + query.where(lccInvLpn.locCode.eq(req.getLocCode().trim())); + } + return QueryDslUtils.queryByPage(query, QueryByPage.getCurrent()); + } + + public static Page queryInvLedger(QueryInvLedgerReq req) { + SQLQuery query = QUERY_DSL.selectFrom(lccInvLedger).orderBy(lccInvLedger.ledgerId.asc()); + if (StringUtils.isNotBlank(req.getLpn())) { + query.where(lccInvLedger.lpn.eq(req.getLpn().trim())); + } + return QueryDslUtils.queryByPage(query, QueryByPage.getCurrent()); + } +} diff --git a/servo/src/main/java/com/yvan/workbench/model/request/QueryExecutorReq.java b/servo/src/main/java/com/yvan/workbench/model/request/QueryExecutorReq.java new file mode 100644 index 0000000..1851a15 --- /dev/null +++ b/servo/src/main/java/com/yvan/workbench/model/request/QueryExecutorReq.java @@ -0,0 +1,15 @@ +package com.yvan.workbench.model.request; + +import lombok.Data; + +/** + * 作者:lizw
+ * 创建时间:2025/07/03 14:43
+ */ +@Data +public class QueryExecutorReq { + /** 仿真车所在楼层 */ + private String virtualFloorCode; + /** 是否激活 */ + private Boolean isActive; +} diff --git a/servo/src/main/java/com/yvan/workbench/model/request/QueryInvLedgerReq.java b/servo/src/main/java/com/yvan/workbench/model/request/QueryInvLedgerReq.java new file mode 100644 index 0000000..0375489 --- /dev/null +++ b/servo/src/main/java/com/yvan/workbench/model/request/QueryInvLedgerReq.java @@ -0,0 +1,13 @@ +package com.yvan.workbench.model.request; + +import lombok.Data; + +/** + * 作者:lizw
+ * 创建时间:2025/07/03 14:58
+ */ +@Data +public class QueryInvLedgerReq { + /** 托盘条码 */ + private String lpn; +} diff --git a/servo/src/main/java/com/yvan/workbench/model/request/QueryInvLpnReq.java b/servo/src/main/java/com/yvan/workbench/model/request/QueryInvLpnReq.java new file mode 100644 index 0000000..74f623e --- /dev/null +++ b/servo/src/main/java/com/yvan/workbench/model/request/QueryInvLpnReq.java @@ -0,0 +1,15 @@ +package com.yvan.workbench.model.request; + +import lombok.Data; + +/** + * 作者:lizw
+ * 创建时间:2025/07/03 14:48
+ */ +@Data +public class QueryInvLpnReq { + /** 托盘条码 */ + private String lpn; + /** 库存位置 */ + private String locCode; +} diff --git a/servo/src/main/java/com/yvan/workbench/model/request/QueryLocationReq.java b/servo/src/main/java/com/yvan/workbench/model/request/QueryLocationReq.java new file mode 100644 index 0000000..53c86f5 --- /dev/null +++ b/servo/src/main/java/com/yvan/workbench/model/request/QueryLocationReq.java @@ -0,0 +1,13 @@ +package com.yvan.workbench.model.request; + +import lombok.Data; + +/** + * 作者:lizw
+ * 创建时间:2025/07/03 14:38
+ */ +@Data +public class QueryLocationReq { + /** 位置编码 */ + private String locCode; +}