From 735faee1151a2784088261c3316a95d3386a1c43 Mon Sep 17 00:00:00 2001 From: yuliang <398780299@qq.com> Date: Fri, 27 Jun 2025 16:10:59 +0800 Subject: [PATCH 01/10] =?UTF-8?q?cl2=20=E5=9F=BA=E4=BA=8E=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=8A=B6=E6=80=81=E5=92=8C=E4=BB=BB=E5=8A=A1=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=88=86=E6=AD=A5=E7=94=9F=E6=88=90=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java | 1 + servo/src/main/java/com/galaxis/rcs/ptr/AmrTaskMode.java | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) 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 ac9f9e2..7d1611a 100644 --- a/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java +++ b/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java @@ -478,6 +478,7 @@ public class AmrMessageHandler { AmrMessage> taskModeChange = JacksonUtils.parse(json, typeRef20011_1Message); AmrTaskStatusMessage modeMessage = taskModeChange.content; agvItem.updateDeviceTaskStatus((int) modeMessage.SeqNo, 0, 0, modeMessage.EventId); + agvItem.updateTaskMode(modeMessage.Info.TaskMode); break; case 4: AmrMessage> taskCompleted = JacksonUtils.parse(json, typeRef20011_4Message); 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 a740f5c..8ade272 100644 --- a/servo/src/main/java/com/galaxis/rcs/ptr/AmrTaskMode.java +++ b/servo/src/main/java/com/galaxis/rcs/ptr/AmrTaskMode.java @@ -44,7 +44,11 @@ public enum AmrTaskMode { /** * 自定义模式 */ - AMR_CUSTOMIZE_MODE(8, "自定义模式"); + AMR_CUSTOMIZE_MODE(8, "自定义模式"), + /** + * 主程序退出(关机或关服务)时会进入这个模式 + */ + AMR_SHUTDOWN_MODE(8, "主程序退出"); // 枚举值映射 private static final Map VALUE_MAP; From 03f30916338cbf98c146621367e11aa5a57f9fd5 Mon Sep 17 00:00:00 2001 From: yvan Date: Fri, 27 Jun 2025 16:22:50 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/galaxis/rcs/plan/PlanTaskSequence.java | 14 +++++++++----- .../src/main/java/com/yvan/logisticsModel/PtrAgvItem.java | 1 - 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java b/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java index c637c70..9888c7c 100644 --- a/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java +++ b/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java @@ -5,11 +5,9 @@ import com.galaxis.rcs.common.entity.RcsTaskBiz; import com.galaxis.rcs.common.entity.RcsTaskPlan; import com.galaxis.rcs.common.enums.PlanTaskStatus; import com.galaxis.rcs.common.enums.PlanTaskType; -import com.galaxis.rcs.ptr.ArmMessageType; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.yvan.logisticsModel.LogisticsRuntime; -import com.yvan.logisticsModel.PtrAgvDeviceTask; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.clever.core.BannerUtils; @@ -157,9 +155,11 @@ public class PlanTaskSequence { public boolean isAllCompleted() { boolean isAllComplete = true; for (RcsTaskPlan task : taskList) { - if (!PlanTaskStatus.FINISHED.toString().equals(task.getPlanTaskStatus())) { - isAllComplete = false; - break; + if (PlanTaskType.valueOf(task.getPlanType()) != PlanTaskType.FINISH) { + if (!PlanTaskStatus.FINISHED.toString().equals(task.getPlanTaskStatus())) { + isAllComplete = false; + break; + } } } return isAllComplete; @@ -178,9 +178,13 @@ public class PlanTaskSequence { public void savePlanTask(RcsTaskPlan planTask) { //TODO: 保存数据库 var jw = new JsonWrapper(planTask); + jw.set("isAllCompleted", this.isAllCompleted()); + var list = Splitter.on("\n").splitToList(jw.toString()); String[] ar = new String[list.size()]; list.toArray(ar); + + // log.info("3-Received message: " + json); BannerUtils.printConfig(log, "保存业务任务 planTask", ar); } diff --git a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java index dcd4f28..2326091 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java +++ b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java @@ -15,7 +15,6 @@ import com.galaxis.rcs.ptr.sendEntity.RcsConfigMessage; import com.galaxis.rcs.ptr.sendEntity.RcsSRMessage; import com.galaxis.rcs.ptr.sendEntity.RcsSetLocationMessage; import com.google.common.collect.Queues; -import com.yvan.logisticsMonitor.task.PlanTask; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.clever.core.json.JsonWrapper; From 76618d9607c2ef1d411ff035176db9f8f83db481 Mon Sep 17 00:00:00 2001 From: yuliang <398780299@qq.com> Date: Fri, 27 Jun 2025 16:31:45 +0800 Subject: [PATCH 03/10] =?UTF-8?q?cl2=20=E5=9F=BA=E4=BA=8E=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=8A=B6=E6=80=81=E5=92=8C=E4=BB=BB=E5=8A=A1=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=88=86=E6=AD=A5=E7=94=9F=E6=88=90=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java index 2326091..310fc3c 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java +++ b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java @@ -274,10 +274,10 @@ public abstract class PtrAgvItem extends ExecutorItem { boolean needCompute = false; - if (finishTargetIndex > 0) { + if (finishTargetIndex >= 0) { needCompute = true; // 标记前面的任务都完成了 - for (int i = 0; i < finishTargetIndex; i++) { + for (int i = 0; i <= finishTargetIndex; i++) { PtrAgvDeviceTask task = runningDeviceTaskList.get(i); task.taskStatus = 4; // 标记为完成 From a6b4ba0730abc46e7079bdca780ee8f748c96eea Mon Sep 17 00:00:00 2001 From: yvan Date: Fri, 27 Jun 2025 16:34:42 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/galaxis/rcs/plan/PlanTaskSequence.java | 4 ++ .../java/com/yvan/logisticsModel/PtrAgvItem.java | 58 +++++++++++----------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java b/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java index 9888c7c..9a80d9c 100644 --- a/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java +++ b/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java @@ -188,4 +188,8 @@ public class PlanTaskSequence { // log.info("3-Received message: " + json); BannerUtils.printConfig(log, "保存业务任务 planTask", ar); } + + public boolean isEmpty() { + return this.taskList.isEmpty(); + } } diff --git a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java index 2326091..7049a31 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java +++ b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java @@ -261,40 +261,42 @@ public abstract class PtrAgvItem extends ExecutorItem { oldDirection, direction); } + boolean needCompute = false; // 从 runningDeviceTaskList 里面,找到完成到什么阶段 // 比如 (1,2) -> (2,2) -> (3,2) , 如果 updatePosition=3,2 ,那么前2个任务都要完成 - int finishTargetIndex = -1; - for (int i = 0; i < runningDeviceTaskList.size(); i++) { - PtrAgvDeviceTask task = runningDeviceTaskList.get(i); - if (task.checkLogicX == logicX && task.checkLogicY == logicY) { - finishTargetIndex = i; - break; - } - } - - boolean needCompute = false; - - if (finishTargetIndex > 0) { - needCompute = true; - // 标记前面的任务都完成了 - for (int i = 0; i < finishTargetIndex; i++) { + if (this.runningDeviceTaskList != null && !this.runningDeviceTaskList.isEmpty() && + this.planTaskSequence != null && !this.planTaskSequence.isEmpty()) { + int finishTargetIndex = -1; + for (int i = 0; i < runningDeviceTaskList.size(); i++) { PtrAgvDeviceTask task = runningDeviceTaskList.get(i); - - task.taskStatus = 4; // 标记为完成 - task.taskGroupStatus = 4; // 标记为任务组完成 - fireEvent(AgvEventType.DEVICE_TASK_COMPLETE, this, task); - - // 更新计划任务 - RcsTaskPlan planTask = planTaskSequence.getByPlanTaskId(task.planTaskId); - if (planTask != null) { - planTask.setPlanTaskStatus(PlanTaskStatus.FINISHED.toString()); - planTaskSequence.savePlanTask(planTask); + if (task.checkLogicX == logicX && task.checkLogicY == logicY) { + finishTargetIndex = i; + break; } } - if (planTaskSequence.isAllCompleted()) { - fireEvent(AgvEventType.PLAN_COMPLETE, this); - planTaskSequence = null; + if (finishTargetIndex > 0) { + needCompute = true; + // 标记前面的任务都完成了 + for (int i = 0; i < finishTargetIndex; i++) { + PtrAgvDeviceTask task = runningDeviceTaskList.get(i); + + task.taskStatus = 4; // 标记为完成 + task.taskGroupStatus = 4; // 标记为任务组完成 + fireEvent(AgvEventType.DEVICE_TASK_COMPLETE, this, task); + + // 更新计划任务 + RcsTaskPlan planTask = planTaskSequence.getByPlanTaskId(task.planTaskId); + if (planTask != null) { + planTask.setPlanTaskStatus(PlanTaskStatus.FINISHED.toString()); + planTaskSequence.savePlanTask(planTask); + } + } + + if (planTaskSequence.isAllCompleted()) { + fireEvent(AgvEventType.PLAN_COMPLETE, this); + planTaskSequence = null; + } } } From 8ae5a82a1aa8fd9f92d2dfe0e32261e5ce67ebe7 Mon Sep 17 00:00:00 2001 From: yvan Date: Fri, 27 Jun 2025 16:36:44 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java index 48c193d..5a291cb 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java +++ b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java @@ -262,10 +262,12 @@ public abstract class PtrAgvItem extends ExecutorItem { } boolean needCompute = false; + // 从 runningDeviceTaskList 里面,找到完成到什么阶段 // 比如 (1,2) -> (2,2) -> (3,2) , 如果 updatePosition=3,2 ,那么前2个任务都要完成 if (this.runningDeviceTaskList != null && !this.runningDeviceTaskList.isEmpty() && this.planTaskSequence != null && !this.planTaskSequence.isEmpty()) { + int finishTargetIndex = -1; for (int i = 0; i < runningDeviceTaskList.size(); i++) { PtrAgvDeviceTask task = runningDeviceTaskList.get(i); @@ -275,8 +277,6 @@ public abstract class PtrAgvItem extends ExecutorItem { } } - boolean needCompute = false; - if (finishTargetIndex >= 0) { needCompute = true; // 标记前面的任务都完成了 From 227eb9e6e4f0a96da1c977a8a357ee8813259957 Mon Sep 17 00:00:00 2001 From: yvan Date: Fri, 27 Jun 2025 16:48:30 +0800 Subject: [PATCH 06/10] =?UTF-8?q?updatePosition=20=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yvan/logisticsModel/PtrAgvItem.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java index 5a291cb..927871b 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java +++ b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java @@ -17,6 +17,7 @@ import com.galaxis.rcs.ptr.sendEntity.RcsSetLocationMessage; import com.google.common.collect.Queues; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.clever.core.BannerUtils; import org.clever.core.json.JsonWrapper; import org.clever.data.redis.Redis; import org.clever.data.redis.RedisAdmin; @@ -261,6 +262,12 @@ public abstract class PtrAgvItem extends ExecutorItem { oldDirection, direction); } + BannerUtils.printConfig(log, "updatePosition", new String[]{ + "logicX: " + logicX, + "logicY: " + logicY, + "direction: " + direction + }); + boolean needCompute = false; // 从 runningDeviceTaskList 里面,找到完成到什么阶段 @@ -277,11 +284,11 @@ public abstract class PtrAgvItem extends ExecutorItem { } } - if (finishTargetIndex >= 0) { - needCompute = true; - // 标记前面的任务都完成了 - for (int i = 0; i <= finishTargetIndex; i++) { - PtrAgvDeviceTask task = runningDeviceTaskList.get(i); + if (finishTargetIndex >= 0) { + needCompute = true; + // 标记前面的任务都完成了 + for (int i = 0; i <= finishTargetIndex; i++) { + PtrAgvDeviceTask task = runningDeviceTaskList.get(i); task.taskStatus = 4; // 标记为完成 task.taskGroupStatus = 4; // 标记为任务组完成 From 8e65cf48bea4bf1b64438770ed5c93a105b2e91b Mon Sep 17 00:00:00 2001 From: yvan Date: Fri, 27 Jun 2025 16:53:23 +0800 Subject: [PATCH 07/10] =?UTF-8?q?updatePosition=20=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java | 4 ++++ servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java b/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java index 9a80d9c..f1b720c 100644 --- a/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java +++ b/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java @@ -192,4 +192,8 @@ public class PlanTaskSequence { public boolean isEmpty() { return this.taskList.isEmpty(); } + + public int size() { + return this.taskList.size(); + } } diff --git a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java index 927871b..1853ee4 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java +++ b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java @@ -265,7 +265,9 @@ public abstract class PtrAgvItem extends ExecutorItem { BannerUtils.printConfig(log, "updatePosition", new String[]{ "logicX: " + logicX, "logicY: " + logicY, - "direction: " + direction + "direction: " + direction, + "runningDeviceSize" + (this.runningDeviceTaskList == null ? "null" : this.runningDeviceTaskList.size()), + "planTaskSize" + (this.planTaskSequence == null ? "null" : this.planTaskSequence.size()) }); boolean needCompute = false; From eeb44903f9d3e734057c74c7d04db2ecf8cc80f7 Mon Sep 17 00:00:00 2001 From: yvan Date: Fri, 27 Jun 2025 16:53:51 +0800 Subject: [PATCH 08/10] =?UTF-8?q?updatePosition=20=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java index 1853ee4..ba66134 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java +++ b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java @@ -266,8 +266,8 @@ public abstract class PtrAgvItem extends ExecutorItem { "logicX: " + logicX, "logicY: " + logicY, "direction: " + direction, - "runningDeviceSize" + (this.runningDeviceTaskList == null ? "null" : this.runningDeviceTaskList.size()), - "planTaskSize" + (this.planTaskSequence == null ? "null" : this.planTaskSequence.size()) + "runningDeviceSize:" + (this.runningDeviceTaskList == null ? "null" : this.runningDeviceTaskList.size()), + "planTaskSize:" + (this.planTaskSequence == null ? "null" : this.planTaskSequence.size()) }); boolean needCompute = false; From d024f793acbccea4cb6d951a222a2703d871f848 Mon Sep 17 00:00:00 2001 From: yvan Date: Fri, 27 Jun 2025 17:00:45 +0800 Subject: [PATCH 09/10] =?UTF-8?q?updatePosition=20=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/galaxis/rcs/plan/PlanTaskSequence.java | 1 + .../java/com/yvan/logisticsModel/PtrAgvItem.java | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java b/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java index f1b720c..e17c822 100644 --- a/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java +++ b/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java @@ -142,6 +142,7 @@ public class PlanTaskSequence { taskStr = "FINISH"; break; } + taskStr = taskStr + " STATE:" + task.getPlanTaskStatus(); list.add(taskStr); } diff --git a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java index ba66134..98354aa 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java +++ b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java @@ -14,6 +14,7 @@ import com.galaxis.rcs.ptr.receiveEntity.base.CurBatteryData; import com.galaxis.rcs.ptr.sendEntity.RcsConfigMessage; import com.galaxis.rcs.ptr.sendEntity.RcsSRMessage; import com.galaxis.rcs.ptr.sendEntity.RcsSetLocationMessage; +import com.google.common.base.Joiner; import com.google.common.collect.Queues; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -262,22 +263,14 @@ public abstract class PtrAgvItem extends ExecutorItem { oldDirection, direction); } - BannerUtils.printConfig(log, "updatePosition", new String[]{ - "logicX: " + logicX, - "logicY: " + logicY, - "direction: " + direction, - "runningDeviceSize:" + (this.runningDeviceTaskList == null ? "null" : this.runningDeviceTaskList.size()), - "planTaskSize:" + (this.planTaskSequence == null ? "null" : this.planTaskSequence.size()) - }); - boolean needCompute = false; // 从 runningDeviceTaskList 里面,找到完成到什么阶段 // 比如 (1,2) -> (2,2) -> (3,2) , 如果 updatePosition=3,2 ,那么前2个任务都要完成 + int finishTargetIndex = -1; if (this.runningDeviceTaskList != null && !this.runningDeviceTaskList.isEmpty() && this.planTaskSequence != null && !this.planTaskSequence.isEmpty()) { - int finishTargetIndex = -1; for (int i = 0; i < runningDeviceTaskList.size(); i++) { PtrAgvDeviceTask task = runningDeviceTaskList.get(i); if (task.checkLogicX == logicX && task.checkLogicY == logicY) { @@ -311,6 +304,17 @@ public abstract class PtrAgvItem extends ExecutorItem { } } + BannerUtils.printConfig(log, "updatePosition", new String[]{ + "logicX: " + logicX, + "logicY: " + logicY, + "direction: " + direction, + "finishTargetIndex: " + finishTargetIndex, + "runningDeviceSize:" + (this.runningDeviceTaskList == null ? "null" : this.runningDeviceTaskList.size()), + "planTask:" + (this.planTaskSequence == null ? "null" : + ("\n" + Joiner.on("\n").join((List) this.planTaskSequence.toPrettyMap().get("items"))) + ) + }); + if (needCompute) { LockSupport.unpark(connectorThread); } From ece1bd11bcf4de2d6593ed86affbfc3a55c2de34 Mon Sep 17 00:00:00 2001 From: lizw-2015 <1183409807@qq.com> Date: Fri, 27 Jun 2025 17:22:54 +0800 Subject: [PATCH 10/10] =?UTF-8?q?feat(user):=20=E6=96=B0=E5=A2=9E=E7=94=A8?= =?UTF-8?q?=E6=88=B7=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 - 添加用户新增、编辑和删除功能 - 实现用户权限控制 - 优化用户列表展示和查询 - 新增登录页面和相关功能 --- .../autoconfigure/AppAutoConfiguration.java | 2 + .../yvan/workbench/controller/UserPermissions.java | 57 +++++++++++++++++++++- .../yvan/workbench/model/request/AddUserReq.java | 33 +++++++++++++ .../workbench/model/request/UpdateUserReq.java | 33 +++++++++++++ servo/src/main/resources/application.yml | 5 +- servo/src/test/java/com/yvan/workbench/JsTest.java | 10 ++++ 6 files changed, 136 insertions(+), 4 deletions(-) create mode 100644 servo/src/main/java/com/yvan/workbench/model/request/AddUserReq.java create mode 100644 servo/src/main/java/com/yvan/workbench/model/request/UpdateUserReq.java diff --git a/servo/src/main/java/com/yvan/workbench/autoconfigure/AppAutoConfiguration.java b/servo/src/main/java/com/yvan/workbench/autoconfigure/AppAutoConfiguration.java index c43d3ef..4d5cb8e 100644 --- a/servo/src/main/java/com/yvan/workbench/autoconfigure/AppAutoConfiguration.java +++ b/servo/src/main/java/com/yvan/workbench/autoconfigure/AppAutoConfiguration.java @@ -18,6 +18,7 @@ import org.clever.core.AppContextHolder; import org.clever.core.Assert; import org.clever.core.ResourcePathUtils; import org.clever.core.json.jackson.JacksonConfig; +import org.clever.core.mapper.JacksonMapper; import org.clever.core.reflection.ReflectionsUtils; import org.clever.core.task.StartupTaskBootstrap; import org.clever.data.jdbc.JdbcBootstrap; @@ -300,6 +301,7 @@ public class AppAutoConfiguration { JavalinConfig javalinConfig = new JavalinConfig(); ApplyWebConfig.applyConfig(appBasicsConfig.getRootPath(), webConfig, javalinConfig); // 修正 ObjectMapper、JsonMapper 属性 + JacksonMapper.configure(webServerMapper); JsonMapper jsonMapper = new JavalinJackson(webServerMapper, webConfig.isUseVirtualThreads()); jackson.apply(webServerMapper); javalinConfig.jsonMapper(jsonMapper); diff --git a/servo/src/main/java/com/yvan/workbench/controller/UserPermissions.java b/servo/src/main/java/com/yvan/workbench/controller/UserPermissions.java index 2b1a4b8..c805350 100644 --- a/servo/src/main/java/com/yvan/workbench/controller/UserPermissions.java +++ b/servo/src/main/java/com/yvan/workbench/controller/UserPermissions.java @@ -1,13 +1,31 @@ package com.yvan.workbench.controller; import com.querydsl.sql.SQLQuery; +import com.yvan.workbench.model.request.AddUserReq; import com.yvan.workbench.model.request.QueryUserReq; +import com.yvan.workbench.model.request.UpdateUserReq; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.clever.core.Assert; +import org.clever.core.Conv; +import org.clever.core.id.SnowFlake; +import org.clever.core.mapper.BeanCopyUtils; +import org.clever.core.mapper.JacksonMapper; import org.clever.core.model.request.QueryByPage; +import org.clever.core.model.response.R; import org.clever.data.jdbc.DaoFactory; import org.clever.data.jdbc.QueryDSL; import org.clever.data.jdbc.querydsl.utils.QueryDslUtils; +import org.clever.security.SecurityContextHolder; import org.clever.security.impl.model.entity.SysUser; +import org.clever.security.model.SecurityContext; +import org.clever.web.mvc.annotation.RequestBody; +import org.clever.web.mvc.annotation.RequestParam; +import org.clever.web.mvc.annotation.Transactional; +import org.clever.web.mvc.annotation.Validated; + +import java.util.Map; +import java.util.Objects; import static org.clever.security.impl.model.query.QSysUser.sysUser; @@ -15,6 +33,7 @@ import static org.clever.security.impl.model.query.QSysUser.sysUser; * 作者:lizw
* 创建时间:2025/06/26 16:50
*/ +@Slf4j public class UserPermissions { private static final QueryDSL QUERY_DSL = DaoFactory.getQueryDSL(); @@ -27,6 +46,42 @@ public class UserPermissions { if (req.getIsEnable() != null) { query.where(sysUser.isEnable.eq(req.getIsEnable())); } - return QueryDslUtils.queryByPage(query, queryByPage); + Object res = QueryDslUtils.queryByPage(query, queryByPage); + log.info("--> {}", JacksonMapper.getInstance().toJson(res)); + return res; + } + + @Transactional + public static R addUser(@RequestBody @Validated AddUserReq req) { + SecurityContext securityContext = SecurityContextHolder.getContext(); + long count = QUERY_DSL.selectFrom(sysUser).where(sysUser.loginName.eq(req.getLoginName())).fetchCount(); + Assert.isTrue(count <= 0, "用户登录名已经存在:" + req.getLoginName()); + SysUser user = BeanCopyUtils.mapper(SysUser.class, req); + user.setId(SnowFlake.SNOW_FLAKE.nextId()); + user.setCreateBy(securityContext.getUserInfo().getUserId()); + QUERY_DSL.insert(sysUser).populate(user).execute(); + return R.success(); + } + + @Transactional + public static R updateUser(@RequestBody @Validated UpdateUserReq req) { + SecurityContext securityContext = SecurityContextHolder.getContext(); + SysUser oldUser = QUERY_DSL.selectFrom(sysUser).where(sysUser.loginName.eq(req.getLoginName())).fetchOne(); + Assert.notNull(oldUser, "用户不存在:" + req.getLoginName()); + SysUser user = BeanCopyUtils.mapper(SysUser.class, req); + user.setUpdateBy(securityContext.getUserInfo().getUserId()); + QUERY_DSL.update(sysUser).populate(user).where(sysUser.id.eq(oldUser.getId())).execute(); + return R.success(); + } + + @Transactional + public static R delUser(@RequestParam Map req) { + long id = Conv.asLong(req.get("id")); + Assert.isTrue( + !Objects.equals(id, SecurityContextHolder.getUserInfo().getUserId()), + "不能删除当前登录的用户" + ); + QUERY_DSL.delete(sysUser).where(sysUser.id.eq(id)).execute(); + return R.success(); } } diff --git a/servo/src/main/java/com/yvan/workbench/model/request/AddUserReq.java b/servo/src/main/java/com/yvan/workbench/model/request/AddUserReq.java new file mode 100644 index 0000000..92aaf56 --- /dev/null +++ b/servo/src/main/java/com/yvan/workbench/model/request/AddUserReq.java @@ -0,0 +1,33 @@ +package com.yvan.workbench.model.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * 作者:lizw
+ * 创建时间:2025/06/27 14:10
+ */ +@Data +public class AddUserReq { + /** + * 用户登录名(允许修改) + */ + @NotBlank + private String loginName; + /** + * 登录密码 + */ + @NotBlank + private String password; + /** + * 登录名 + */ + @NotBlank + private String userName; + /** + * 是否启用: 0:禁用,1:启用 + */ + @NotNull + private Integer isEnable; +} diff --git a/servo/src/main/java/com/yvan/workbench/model/request/UpdateUserReq.java b/servo/src/main/java/com/yvan/workbench/model/request/UpdateUserReq.java new file mode 100644 index 0000000..6f17246 --- /dev/null +++ b/servo/src/main/java/com/yvan/workbench/model/request/UpdateUserReq.java @@ -0,0 +1,33 @@ +package com.yvan.workbench.model.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * 作者:lizw
+ * 创建时间:2025/06/27 15:37
+ */ +@Data +public class UpdateUserReq { + /** + * 用户登录名(允许修改) + */ + @NotBlank + private String loginName; + /** + * 登录密码 + */ + @NotBlank + private String password; + /** + * 登录名 + */ + @NotBlank + private String userName; + /** + * 是否启用: 0:禁用,1:启用 + */ + @NotNull + private Integer isEnable; +} diff --git a/servo/src/main/resources/application.yml b/servo/src/main/resources/application.yml index 90fd01e..dbcb12f 100644 --- a/servo/src/main/resources/application.yml +++ b/servo/src/main/resources/application.yml @@ -141,8 +141,6 @@ web: read-only: false security: ignore-paths: - - '/api/**' - - '/ok' - '/favicon.ico' - '/dist/**' - '/static/**' @@ -163,7 +161,8 @@ web: - '/**/.git' - '/ok' ignore-auth-paths: ['/ok'] - ignore-auth-failed-paths: [ ] + ignore-auth-failed-paths: + - '/api/**' current-user-path: '/api/current_user' login: paths: [ '/api/login' ] diff --git a/servo/src/test/java/com/yvan/workbench/JsTest.java b/servo/src/test/java/com/yvan/workbench/JsTest.java index 87b7804..9014ed0 100644 --- a/servo/src/test/java/com/yvan/workbench/JsTest.java +++ b/servo/src/test/java/com/yvan/workbench/JsTest.java @@ -2,6 +2,7 @@ package com.yvan.workbench; import lombok.extern.slf4j.Slf4j; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import org.clever.core.mapper.JacksonMapper; import org.clever.js.api.ScriptEngineInstance; import org.clever.js.api.ScriptObject; import org.clever.js.api.folder.FileSystemFolder; @@ -16,6 +17,8 @@ import org.junit.jupiter.api.Test; import java.io.File; import java.time.Duration; +import java.util.HashMap; +import java.util.Map; @Slf4j public class JsTest { @@ -58,4 +61,11 @@ public class JsTest { pool.close(); factory.close(); } + + @Test + public void test03() { + Map map = new HashMap<>(); + map.put("a", 1L); + log.info("--> {}", JacksonMapper.getInstance().toJson(map)); + } }