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() { 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; +}