From 6226a626fd45ff4dc27cace0ecc6637167de5337 Mon Sep 17 00:00:00 2001 From: yvan Date: Sat, 26 Jul 2025 22:07:41 +0800 Subject: [PATCH] =?UTF-8?q?noInv=20=E5=8F=96=E6=B6=88=E8=AE=B0=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .lingma/rules/project_rule.md | 2 + .../com/galaxis/rcs/plan/PlanTaskSequence.java | 16 ++--- .../java/com/galaxis/rcs/plan/RcsTaskOption.java | 33 +++++++++ .../com/yvan/logisticsModel/LogisticsRuntime.java | 6 ++ .../yvan/workbench/controller/RcsController.java | 80 ++++++++++++---------- 5 files changed, 91 insertions(+), 46 deletions(-) create mode 100644 .lingma/rules/project_rule.md create mode 100644 servo/src/main/java/com/galaxis/rcs/plan/RcsTaskOption.java diff --git a/.lingma/rules/project_rule.md b/.lingma/rules/project_rule.md new file mode 100644 index 0000000..4ce458c --- /dev/null +++ b/.lingma/rules/project_rule.md @@ -0,0 +1,2 @@ +**添加规则文件可帮助模型精准理解你的编码偏好,如框架、代码风格等** +**规则文件只对当前工程生效,单文件限制10000字符。如果无需将该文件提交到远程 Git 仓库,请将其添加到 .gitignore** 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 c2b12fd..a26bda6 100644 --- a/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java +++ b/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java @@ -40,7 +40,7 @@ public class PlanTaskSequence { public BasLocationVo unloadBasLocationVo; public BasLocationVo executorVo; public int carryQty; - public Map option; + public RcsTaskOption option; public PlanTaskSequence(String executorId, LogisticsRuntime logisticsRuntime, RcsTaskBiz bizTask, String createBy) { this.executorId = executorId; @@ -212,17 +212,15 @@ public class PlanTaskSequence { } public double getLoadHeight() { - if (this.option == null || this.option.get("loadHeight") == null) { - return 0d; - } - return Conv.asDouble(this.option.get("loadHeight")); + return this.option.loadHeight; } public double getUnloadHeight() { - if (this.option == null || this.option.get("unloadHeight") == null) { - return 0d; - } - return Conv.asDouble(this.option.get("unloadHeight")); + return this.option.unloadHeight; + } + + public boolean noInv() { + return this.option.noInv; } public int completedCount() { diff --git a/servo/src/main/java/com/galaxis/rcs/plan/RcsTaskOption.java b/servo/src/main/java/com/galaxis/rcs/plan/RcsTaskOption.java new file mode 100644 index 0000000..81440fe --- /dev/null +++ b/servo/src/main/java/com/galaxis/rcs/plan/RcsTaskOption.java @@ -0,0 +1,33 @@ +package com.galaxis.rcs.plan; + +public class RcsTaskOption { + /** + * 任务优先级 + */ + public int priority = 1; + + /** + * 强制开始路径点 + */ + public String forceStartWayPointId; + + /** + * 强制开始方向,必须使用 LCCDirection.fromString 可以转换 + */ + public String forceStartDirection; + + /** + * 搬运高度 + */ + public double loadHeight = 0d; + + /** + * 卸货高度 + */ + public double unloadHeight = 0d; + + /** + * 禁止记录库存 + */ + public boolean noInv = false; +} diff --git a/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java b/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java index a63d173..56071ce 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java +++ b/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java @@ -230,6 +230,9 @@ public class LogisticsRuntime { * 库存转移 AGV->货架 */ private void changeInvOfUnload(PlanTaskSequence taskSequence, RcsTaskPlan taskPlan) { + if (taskSequence.option.noInv) { + return; + } String lpn = taskSequence.carryLpn; queryDSL.beginTX(status -> { InvManager.invSave(this.envId, taskSequence.bizTask.getBizTaskId(), lpn, taskSequence.executorVo.getLocCode(), -taskSequence.carryQty); @@ -242,6 +245,9 @@ public class LogisticsRuntime { * 库存转移 货架->AGV */ private void changeInvOfLoad(PlanTaskSequence taskSequence, RcsTaskPlan taskPlan) { + if (taskSequence.option.noInv) { + return; + } String lpn = taskSequence.carryLpn; queryDSL.beginTX(status -> { InvManager.invSave(this.envId, taskSequence.bizTask.getBizTaskId(), lpn, taskSequence.loadBasLocationVo.getLocCode(), -taskSequence.carryQty); diff --git a/servo/src/main/java/com/yvan/workbench/controller/RcsController.java b/servo/src/main/java/com/yvan/workbench/controller/RcsController.java index 5360dbe..623d6cd 100644 --- a/servo/src/main/java/com/yvan/workbench/controller/RcsController.java +++ b/servo/src/main/java/com/yvan/workbench/controller/RcsController.java @@ -8,6 +8,7 @@ import com.galaxis.rcs.common.enums.BizTaskStatus; import com.galaxis.rcs.common.enums.BizTaskType; import com.galaxis.rcs.common.enums.LCCDirection; import com.galaxis.rcs.plan.PlanTaskSequence; +import com.galaxis.rcs.plan.RcsTaskOption; import com.galaxis.rcs.plan.task.*; import com.google.common.base.Strings; import com.google.common.collect.Maps; @@ -18,6 +19,8 @@ import com.yvan.logisticsModel.LogisticsRuntimeService; import com.yvan.logisticsModel.StaticItem; import org.clever.core.Conv; import org.clever.core.id.SnowFlake; +import org.clever.core.json.JsonWrapper; +import org.clever.core.mapper.JacksonMapper; import org.clever.core.model.response.R; import org.clever.web.mvc.annotation.RequestBody; @@ -198,14 +201,17 @@ public class RcsController { } // ==================== 找到托盘号 ==================== - String lpn = ps.runtime.queryDSL - .select(lccInvLpn.lpn) - .from(lccInvLpn) - .where(lccInvLpn.envId.eq(ps.envId)) - .where(lccInvLpn.locCode.eq(loadBasLocation.getLocCode())) - .fetchFirst(); - if (Strings.isNullOrEmpty(lpn)) { - return R.fail("LPN not found at fromStoreLoc: " + fromStoreLoc); + String lpn = "N/A"; + if (!ps.option.noInv) { + lpn = ps.runtime.queryDSL + .select(lccInvLpn.lpn) + .from(lccInvLpn) + .where(lccInvLpn.envId.eq(ps.envId)) + .where(lccInvLpn.locCode.eq(loadBasLocation.getLocCode())) + .fetchFirst(); + if (Strings.isNullOrEmpty(lpn)) { + return R.fail("LPN not found at fromStoreLoc: " + fromStoreLoc); + } } // ==================== 布置任务 ==================== @@ -224,7 +230,6 @@ public class RcsController { ps.planSequence.unloadBasLocationVo = new BasLocationVo(unloadBasLocation); ps.planSequence.carryLpn = lpn; ps.planSequence.carryQty = 1; - ps.planSequence.option = ps.option; ps.runtime.pathPlannerMap.get(ps.agv.getT()) .planCarryTask(ps.planSequence, ps.fromItem.getId(), ps.fromDirection, carryTask); @@ -265,14 +270,17 @@ public class RcsController { // ==================== 找到托盘号 ==================== BasLocationVo executorVo = new BasLocationVo(ps.agv); - String lpn = ps.runtime.queryDSL - .select(lccInvLpn.lpn) - .from(lccInvLpn) - .where(lccInvLpn.envId.eq(ps.envId)) - .where(lccInvLpn.locCode.eq(executorVo.getLocCode())) - .fetchFirst(); - if (Strings.isNullOrEmpty(lpn)) { - return R.fail("LPN not found at StoreLoc: " + executorVo.getLocCode()); + String lpn = "N/A"; + if (!ps.option.noInv) { + lpn = ps.runtime.queryDSL + .select(lccInvLpn.lpn) + .from(lccInvLpn) + .where(lccInvLpn.envId.eq(ps.envId)) + .where(lccInvLpn.locCode.eq(executorVo.getLocCode())) + .fetchFirst(); + if (Strings.isNullOrEmpty(lpn)) { + return R.fail("LPN not found at StoreLoc: " + executorVo.getLocCode()); + } } // ==================== 布置任务 ==================== @@ -290,7 +298,6 @@ public class RcsController { ps.planSequence.unloadBasLocationVo = new BasLocationVo(unloadBasLocation); ps.planSequence.carryLpn = lpn; ps.planSequence.carryQty = 1; - ps.planSequence.option = ps.option; ps.runtime.pathPlannerMap.get(ps.agv.getT()) .planUnloadTask(ps.planSequence, ps.fromItem.getId(), ps.fromDirection, unloadTask); @@ -330,14 +337,17 @@ public class RcsController { StoreLocation targetLocation = new StoreLocation(loadBasLocation.getRack(), loadBasLocation.getBay(), loadBasLocation.getLevel(), loadBasLocation.getCell()); // ==================== 找到托盘号 ==================== - String lpn = ps.runtime.queryDSL - .select(lccInvLpn.lpn) - .from(lccInvLpn) - .where(lccInvLpn.envId.eq(ps.envId)) - .where(lccInvLpn.locCode.eq(loadBasLocation.getLocCode())) - .fetchFirst(); - if (Strings.isNullOrEmpty(lpn)) { - return R.fail("LPN not found at targetStoreLoc: " + loadBasLocation.getLocCode()); + String lpn = "N/A"; + if (!ps.option.noInv) { + lpn = ps.runtime.queryDSL + .select(lccInvLpn.lpn) + .from(lccInvLpn) + .where(lccInvLpn.envId.eq(ps.envId)) + .where(lccInvLpn.locCode.eq(loadBasLocation.getLocCode())) + .fetchFirst(); + if (Strings.isNullOrEmpty(lpn)) { + return R.fail("LPN not found at targetStoreLoc: " + loadBasLocation.getLocCode()); + } } // ==================== 布置任务 ==================== @@ -355,7 +365,6 @@ public class RcsController { ps.planSequence.unloadBasLocationVo = null; ps.planSequence.carryLpn = lpn; ps.planSequence.carryQty = 1; - ps.planSequence.option = ps.option; ps.runtime.pathPlannerMap.get(ps.agv.getT()) .planLoadTask(ps.planSequence, ps.fromItem.getId(), ps.fromDirection, loadTask); @@ -412,7 +421,7 @@ public class RcsController { String projectUUID = Conv.asString(params.get("projectUUID")); Long envId = Conv.asLong(params.get("envId")); String agvId = Conv.asString(params.get("agvId")); - Map option = (Map) params.get("option"); + RcsTaskOption option = new JsonWrapper((Map) params.get("option")).asObject(RcsTaskOption.class); if (Strings.isNullOrEmpty(projectUUID)) { return R.fail("projectUUID Must not be empty"); @@ -423,9 +432,6 @@ public class RcsController { if (Strings.isNullOrEmpty(agvId)) { return R.fail("agvId Must not be empty"); } - if (option == null) { - option = Maps.newHashMap(); - } LogisticsRuntime runtime = LogisticsRuntimeService.INSTANCE.getByProjectEnv(projectUUID, envId); if (runtime == null) { @@ -444,8 +450,8 @@ public class RcsController { // forceStartWayPointId: '6_2', forceStartDirectior: 'right' StaticItem fromItem = null; LCCDirection fromDirection = null; - if (option.get("forceStartWayPointId") != null) { - fromItem = runtime.getStaticItemById(Conv.asString(option.get("forceStartWayPointId"))); + if (option.forceStartWayPointId != null) { + fromItem = runtime.getStaticItemById(option.forceStartWayPointId); } else { fromItem = runtime.getStaticItemByLogicXY(agv.logicX, agv.logicY); if (agv.logicX == 0 && agv.logicY == 0) { @@ -453,8 +459,8 @@ public class RcsController { return R.fail("AGV position init failed"); } } - if (option.get("forceStartDirection") != null) { - fromDirection = LCCDirection.fromString(Conv.asString(option.get("forceStartDirection"))); + if (option.forceStartDirection != null) { + fromDirection = LCCDirection.fromString(option.forceStartDirection); } else { fromDirection = agv.getLCCDirection(); } @@ -471,7 +477,7 @@ public class RcsController { bizTask.setEnvId(envId); bizTask.setBizType(BizTaskType.MOVE.toString()); bizTask.setLpn("N/A"); - bizTask.setPriority(Conv.asInteger(option.get("priority"), 1)); + bizTask.setPriority(option.priority); bizTask.setTaskFrom(fromItem.getId()); bizTask.setAllocatedExecutorId(agvId); bizTask.setBizTaskPayload("N/A"); @@ -488,7 +494,7 @@ public class RcsController { String projectUUID, Long envId, String agvId, - Map option, + RcsTaskOption option, RcsTaskBiz bizTask, LogisticsRuntime runtime, AmrAgvItem agv,