Compare commits

...

5 Commits

Author SHA1 Message Date
修宁 7d5c91ed42 库存的添加、删除 5 months ago
修宁 dbff3a3fdb 就地取货逻辑,当前车所在的位置,就是能取货的位置,就不要再跑去别的地方取货了 5 months ago
lizw-2015 d82c7ef7ac feat(inventory): 添加库存删除功能 5 months ago
lizw-2015 af74103021 build(yvan-lcc): 开启源码映射 5 months ago
lizw-2015 c32b95b334 feat(inventory): 增加环境筛选功能 5 months ago
  1. 30
      servo/src/main/java/com/galaxis/rcs/plan/path/PtrPathPlanner.java
  2. 22
      servo/src/main/java/com/yvan/workbench/controller/DeviceManager.java
  3. 73
      servo/src/main/java/com/yvan/workbench/controller/LccController.java
  4. 16
      servo/src/main/java/com/yvan/workbench/model/request/DelInvLpnReq.java
  5. 1
      servo/src/main/java/com/yvan/workbench/model/request/QueryInvLpnReq.java

30
servo/src/main/java/com/galaxis/rcs/plan/path/PtrPathPlanner.java

@ -9,6 +9,7 @@ import com.yvan.logisticsModel.StaticItem;
import org.clever.core.Conv; import org.clever.core.Conv;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import static com.galaxis.rcs.plan.path.PathUtils.convertStoreDirection; import static com.galaxis.rcs.plan.path.PathUtils.convertStoreDirection;
@ -77,7 +78,7 @@ public class PtrPathPlanner {
// 取货点 // 取货点
String loadRackId = task.from().rackId(); String loadRackId = task.from().rackId();
int pickupBay = task.from().bay(); int pickupBay = task.from().bay();
List<NodeDirection> loadNodeDirectionList = findNodeForStore(plan, loadRackId, pickupBay); List<NodeDirection> loadNodeDirectionList = findNodeForStore(plan, loadRackId, pickupBay, startNodeId, startDirection);
if (loadNodeDirectionList.isEmpty()) { if (loadNodeDirectionList.isEmpty()) {
throw new RuntimeException("Pickup node not found for rackId=" + loadRackId + ", bay=" + pickupBay); throw new RuntimeException("Pickup node not found for rackId=" + loadRackId + ", bay=" + pickupBay);
} }
@ -85,7 +86,7 @@ public class PtrPathPlanner {
// 放货点 // 放货点
String unloadRackId = task.to().rackId(); String unloadRackId = task.to().rackId();
int unloadBay = task.to().bay(); int unloadBay = task.to().bay();
List<NodeDirection> unloadNodeDirectionList = findNodeForStore(plan, unloadRackId, unloadBay); List<NodeDirection> unloadNodeDirectionList = findNodeForStore(plan, unloadRackId, unloadBay, null, null);
if (unloadNodeDirectionList.isEmpty()) { if (unloadNodeDirectionList.isEmpty()) {
throw new RuntimeException("Drop node not found for rackId=" + unloadRackId + ", bay=" + unloadBay); throw new RuntimeException("Drop node not found for rackId=" + unloadRackId + ", bay=" + unloadBay);
} }
@ -143,7 +144,7 @@ public class PtrPathPlanner {
// 放货点 // 放货点
String unloadRackId = task.to().rackId(); String unloadRackId = task.to().rackId();
int unloadBay = task.to().bay(); int unloadBay = task.to().bay();
var unloadNodeDirectionList = findNodeForStore(plan, unloadRackId, unloadBay); var unloadNodeDirectionList = findNodeForStore(plan, unloadRackId, unloadBay, startNodeId, startDirection);
if (unloadNodeDirectionList.isEmpty()) { if (unloadNodeDirectionList.isEmpty()) {
throw new RuntimeException("Drop node not found for rackId=" + unloadRackId + ", bay=" + unloadBay); throw new RuntimeException("Drop node not found for rackId=" + unloadRackId + ", bay=" + unloadBay);
} }
@ -190,7 +191,7 @@ public class PtrPathPlanner {
// 放货点 // 放货点
String loadRackId = task.to().rackId(); String loadRackId = task.to().rackId();
int unloadBay = task.to().bay(); int unloadBay = task.to().bay();
var loadNodeDirectionList = findNodeForStore(plan, loadRackId, unloadBay); var loadNodeDirectionList = findNodeForStore(plan, loadRackId, unloadBay, startNodeId, startDirection);
if (loadNodeDirectionList.isEmpty()) { if (loadNodeDirectionList.isEmpty()) {
throw new RuntimeException("Drop node not found for rackId=" + loadRackId + ", bay=" + unloadBay); throw new RuntimeException("Drop node not found for rackId=" + loadRackId + ", bay=" + unloadBay);
} }
@ -230,9 +231,10 @@ public class PtrPathPlanner {
plan.addFinish(); plan.addFinish();
} }
private List<NodeDirection> findNodeForStore(PlanTaskSequence plan, String storeId, int bay) { private List<NodeDirection> findNodeForStore(PlanTaskSequence plan, String storeId, int bay, String startNodeId, LCCDirection startDirection) {
List<Node> nodes = this.graph.getNodesForStore(storeId); List<Node> nodes = this.graph.getNodesForStore(storeId);
List<NodeDirection> results = Lists.newArrayList(); List<NodeDirection> results = Lists.newArrayList();
for (Node node : nodes) { for (Node node : nodes) {
for (StoreLink link : node.storeLinks()) { for (StoreLink link : node.storeLinks()) {
if (link.storeId().equals(storeId) && link.bay() == bay) { if (link.storeId().equals(storeId) && link.bay() == bay) {
@ -241,6 +243,24 @@ public class PtrPathPlanner {
} }
} }
} }
// 就地取货逻辑,当前车所在的位置,就是能取货的位置,就不要再跑去别的地方取货了;
// 如果 startNodeId 和 startDirection 有值,并且 results 结果中包含 startNodeId/startDirection ,那么只保留 startNodeId/startDirection 的结果
if (startNodeId != null && startDirection != null) {
boolean matchSelfOnly = false;
for (NodeDirection nd : results) {
if (nd.node().id().equals(startNodeId) && nd.direction() == startDirection) {
matchSelfOnly = true;
break;
}
}
if (matchSelfOnly) {
return results.stream().filter(nd -> nd.node().id().equals(startNodeId) && nd.direction() == startDirection)
.collect(Collectors.toList());
}
}
return results; return results;
} }

22
servo/src/main/java/com/yvan/workbench/controller/DeviceManager.java

@ -4,13 +4,11 @@ import com.galaxis.rcs.common.entity.LccBasExecutor;
import com.galaxis.rcs.common.entity.LccBasLocation; import com.galaxis.rcs.common.entity.LccBasLocation;
import com.galaxis.rcs.common.entity.LccInvLedger; import com.galaxis.rcs.common.entity.LccInvLedger;
import com.querydsl.sql.SQLQuery; import com.querydsl.sql.SQLQuery;
import com.yvan.workbench.model.request.QueryExecutorReq; import com.yvan.workbench.model.request.*;
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.apache.commons.lang3.StringUtils;
import org.clever.core.model.request.QueryByPage; import org.clever.core.model.request.QueryByPage;
import org.clever.core.model.request.page.Page; import org.clever.core.model.request.page.Page;
import org.clever.core.model.response.R;
import org.clever.data.jdbc.DaoFactory; import org.clever.data.jdbc.DaoFactory;
import org.clever.data.jdbc.QueryDSL; import org.clever.data.jdbc.QueryDSL;
import org.clever.data.jdbc.querydsl.utils.QueryDslUtils; import org.clever.data.jdbc.querydsl.utils.QueryDslUtils;
@ -55,11 +53,11 @@ public class DeviceManager {
.from(lccInvLpn) .from(lccInvLpn)
.innerJoin(lccBasLocation).on( .innerJoin(lccBasLocation).on(
lccInvLpn.locCode.eq(lccBasLocation.locCode).and( lccInvLpn.locCode.eq(lccBasLocation.locCode).and(
lccBasLocation.envId.eq(lccBasLocation.envId) lccInvLpn.envId.eq(lccBasLocation.envId)
) )
) )
.innerJoin(lccBasContainer).on( .innerJoin(lccBasContainer).on(
lccInvLpn.lpn.eq(lccInvLpn.lpn).and( lccBasContainer.lpn.eq(lccInvLpn.lpn).and(
lccBasContainer.envId.eq(lccInvLpn.envId) lccBasContainer.envId.eq(lccInvLpn.envId)
) )
).orderBy(lccInvLpn.lpn.asc()); ).orderBy(lccInvLpn.lpn.asc());
@ -69,6 +67,9 @@ public class DeviceManager {
if (StringUtils.isNotBlank(req.getLocCode())) { if (StringUtils.isNotBlank(req.getLocCode())) {
query.where(lccInvLpn.locCode.eq(req.getLocCode().trim())); query.where(lccInvLpn.locCode.eq(req.getLocCode().trim()));
} }
if (req.getEnvId() != null) {
query.where(lccInvLpn.envId.eq(req.getEnvId()));
}
return QueryDslUtils.queryByPage(query, QueryByPage.getCurrent()); return QueryDslUtils.queryByPage(query, QueryByPage.getCurrent());
} }
@ -79,4 +80,13 @@ public class DeviceManager {
} }
return QueryDslUtils.queryByPage(query, QueryByPage.getCurrent()); return QueryDslUtils.queryByPage(query, QueryByPage.getCurrent());
} }
public static R<?> delInvLpn(DelInvLpnReq req) {
long count = QUERY_DSL.delete(lccInvLpn)
.where(lccInvLpn.envId.eq(req.getEnvId()))
.where(lccInvLpn.locCode.eq(req.getLocCode()))
.where(lccInvLpn.lpn.eq(req.getLpn()))
.execute();
return R.success(count);
}
} }

73
servo/src/main/java/com/yvan/workbench/controller/LccController.java

@ -1,22 +1,27 @@
package com.yvan.workbench.controller; package com.yvan.workbench.controller;
import com.galaxis.rcs.amr.AmrAgvItem; import com.galaxis.rcs.amr.AmrAgvItem;
import com.galaxis.rcs.amr.JacksonUtils;
import com.galaxis.rcs.common.entity.LccInvLpn;
import com.galaxis.rcs.common.enums.LCCDirection; import com.galaxis.rcs.common.enums.LCCDirection;
import com.galaxis.rcs.amr.PtrAgvItem; import com.galaxis.rcs.amr.PtrAgvItem;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.yvan.entity.AgvStatusVo; import com.yvan.entity.AgvStatusVo;
import com.yvan.logisticsModel.LogisticsRuntimeService; import com.yvan.logisticsModel.LogisticsRuntimeService;
import com.yvan.workbench.SpringContext; import com.yvan.workbench.SpringContext;
import com.yvan.workbench.service.LccMapService; import com.yvan.workbench.service.LccMapService;
import org.clever.core.Conv; import org.clever.core.Conv;
import org.clever.core.json.JsonWrapper; import org.clever.core.json.JsonWrapper;
import org.clever.core.mapper.JacksonMapper;
import org.clever.core.model.response.R; import org.clever.core.model.response.R;
import org.clever.data.jdbc.DaoFactory; import org.clever.data.jdbc.DaoFactory;
import org.clever.data.jdbc.QueryDSL; import org.clever.data.jdbc.QueryDSL;
import org.clever.data.jdbc.querydsl.utils.QueryDslUtils; import org.clever.data.jdbc.querydsl.utils.QueryDslUtils;
import org.clever.web.mvc.annotation.RequestBody; import org.clever.web.mvc.annotation.RequestBody;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -124,4 +129,72 @@ public class LccController {
return R.success(list); return R.success(list);
} }
public static R<Boolean> addInvCommit(@RequestBody Map<String, Object> params) {
LccInvLpn inv = JacksonMapper.getInstance().getMapper().convertValue(params, LccInvLpn.class);
if (inv.getQty() <= 0L) {
return R.fail("Qty must be greater than 0");
}
if (inv.getQty() > 1L) {
return R.fail("Qty must be 1");
}
if (Strings.isNullOrEmpty(inv.getLocCode())) {
return R.fail("LocCode Must not be empty");
}
if (Strings.isNullOrEmpty(inv.getLpn())) {
return R.fail("Lpn Must not be empty");
}
if (inv.getEnvId() == null || inv.getEnvId() <= 0) {
return R.fail("EnvId Must not be empty");
}
inv.setQtyIn(0);
inv.setQtyOut(0);
inv.setCreateAt(new Date());
inv.setUpdateAt(new Date());
inv.setCreateBy("system");
inv.setUpdateBy("system");
QueryDSL queryDsl = DaoFactory.getQueryDSL();
var rowEffect = queryDsl.insert(lccInvLpn)
.populate(inv)
.execute();
return R.success(true);
}
public static R<Object> getLpnLocations(@RequestBody Map<String, Object> params) {
Long envId = Conv.asLong(params.get("envId"));
if (envId == null || envId <= 0) {
return R.fail("envId Must not be empty");
}
var queryDsl = DaoFactory.getQueryDSL();
var lpnList = queryDsl.select(QueryDslUtils.linkedMap(
lccBasContainer.lpn
))
.from(lccBasContainer)
.where(lccBasContainer.envId.eq(envId))
.where(lccBasContainer.isActive.eq(true))
.fetch();
var locationList = queryDsl.select(QueryDslUtils.linkedMap(
lccBasLocation.locCode,
lccBasLocation.rack,
lccBasLocation.bay,
lccBasLocation.level,
lccBasLocation.cell
))
.from(lccBasLocation)
.where(lccBasLocation.envId.eq(envId))
.fetch();
Map<String, Object> result = Maps.newHashMap();
result.put("lpnList", lpnList);
result.put("locationList", locationList);
return R.success(result);
}
} }

16
servo/src/main/java/com/yvan/workbench/model/request/DelInvLpnReq.java

@ -0,0 +1,16 @@
package com.yvan.workbench.model.request;
import lombok.Data;
/**
* 作者lizw <br/>
* 创建时间2025/07/30 10:20 <br/>
*/
@Data
public class DelInvLpnReq {
/** 托盘条码 */
private String lpn;
/** 库存位置 */
private String locCode;
private Long envId;
}

1
servo/src/main/java/com/yvan/workbench/model/request/QueryInvLpnReq.java

@ -12,4 +12,5 @@ public class QueryInvLpnReq {
private String lpn; private String lpn;
/** 库存位置 */ /** 库存位置 */
private String locCode; private String locCode;
private Long envId;
} }

Loading…
Cancel
Save