✨ 运单过程判定补充到货卸货签收、末位打卡与回单无需确认完成三项

This commit is contained in:
2026-10-08 09:09:17 +08:00
parent f3ae784f20
commit 9f8ea5412d
2 changed files with 186 additions and 0 deletions
@@ -53,6 +53,7 @@ public final class WaybillProcessSupport {
public static final String ACCEPT_REJECTED = "rejected";
private static final String CONFIRM_YES = "yes";
private static final String CONFIRM_NO_ACCEPT = "no_confirm_accept";
private static final String CONFIRM_NO_COMPLETE = "no_confirm_complete";
private static final String NODE_TRANSIT = "transit";
private static final String NODE_TRANSIT_NAME = "在途";
/** 异常处置终态:completed=已完成,revoked=已撤销。只有终态解除打卡门禁 */
@@ -244,6 +245,21 @@ public final class WaybillProcessSupport {
return result;
}
/**
* 本次打卡的节点是否是司机可打卡节点的末位。
* <p>
* 末位取「司机可打卡节点」序列:接单与回单不打卡,不参与排位——
* 回单只要启用就必然排在配置最末,按全部启用节点取末位会永远取到回单。
*/
public static boolean isLastDriverPunchNode(String processJson, String nodeCode) {
List<Map<String, Object>> nodes = listDriverPunchNodes(processJson);
if (nodes.isEmpty()) {
return false;
}
String code = stringVal(nodeCode);
return !code.isEmpty() && code.equals(nodeKey(nodes.get(nodes.size() - 1)));
}
/**
* 启用中的过程节点(按配置顺序,含接单/回单)。
*/
@@ -591,6 +607,36 @@ public final class WaybillProcessSupport {
return isAcceptNode(stringVal(node.get("key")), stringVal(node.get("name")));
}
/**
* 是否到货 / 卸货 / 签收节点:key 或中文名任一命中即算。
*/
public static boolean isDeliveryNode(String nodeCode, String nodeName) {
String key = stringVal(nodeCode);
String name = stringVal(nodeName);
return "arrival".equals(key) || "到货".equals(name)
|| "unload".equals(key) || "卸货".equals(name)
|| "sign".equals(key) || "签收".equals(name);
}
/**
* 回单是否无需确认完成:配置里没有回单节点、回单未启用,或启用且配置为「无需确认完成」。
* <p>
* 未启用的回单节点不看 confirmMode——没有回单环节就不会有人来确认;
* 启用但 confirmMode 缺失按「需确认完成」算。
*/
public static boolean returnNeedsNoConfirmation(String processJson) {
for (Map<String, Object> node : parseProcessNodes(processJson)) {
if (!isReturnNode(node)) {
continue;
}
if (!isEnabled(node)) {
return true;
}
return CONFIRM_NO_COMPLETE.equals(stringVal(node.get("confirmMode")));
}
return true;
}
private static boolean isTransitNode(Map<String, Object> node) {
String key = stringVal(node.get("key"));
String name = stringVal(node.get("name"));