✨ 异常处置支持归属过程节点并新增打卡门禁

异常上报强制选择过程节点,节点归属写入 node_code / node_name;节点存在未了结
异常时,该节点及其后节点不可打卡(异常门禁),被拦节点仍可展开查看回填内容。

另新增顺序门禁:前置打卡节点未完成时后续节点不可打卡且不可展开;在途节点不受
顺序门禁约束,但仍受异常门禁约束。

配套:
- 过程配置「上传货量为是、货量类型为空」的脏配置订正为不采集货量
- 网关补充 /blade-resource/** 路由(图片上传,小程序打卡与异常上报照片均经此)
This commit is contained in:
2026-10-05 15:10:24 +08:00
parent 7296a5af21
commit 7c30ead839
10 changed files with 517 additions and 8 deletions
@@ -51,6 +51,12 @@ public class ExceptionDisposal extends TenantEntity {
@Schema(description = "运单号")
private String waybillNo;
@Schema(description = "过程节点 key(为空表示未指明节点)")
private String nodeCode;
@Schema(description = "过程节点名称(上报时复制,此后不随过程配置变化)")
private String nodeName;
@Schema(description = "配载单号/总单号")
private String loadingOrMasterNo;
@@ -4,6 +4,8 @@
*/
package org.springblade.transport.pojo.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -34,9 +36,31 @@ public class DriverPunchNodeVO implements Serializable {
@Schema(description = "是否已打卡(在途=今日已打)")
private Boolean done;
@Schema(description = "当前是否可打卡(顺序门禁 + 在途频次时段)")
@Schema(description = "当前是否可打卡(已打卡、被异常阻断、在途频次时段都会置否)")
private Boolean actionable;
@Schema(description = "是否被未了结的异常阻断:该节点及其后的节点不可打卡")
private Boolean blocked;
@Schema(description = "是否因前置节点未打卡而被顺序门禁拦住(在途豁免,恒为否)")
private Boolean blockedByOrder;
@Schema(description = "顺序门禁拦住的原因,如「请先完成装货打卡」")
private String orderLockReason;
@Schema(description = "是否允许展开:顺序门禁不允许,异常门禁允许(可查看回填内容)")
private Boolean expandable;
@Schema(description = "该节点自身是否被上报了未了结异常(仅异常所在节点为是,其后被牵连阻断的节点为否)")
private Boolean hasException;
@Schema(description = "阻断该节点的异常处置ID(司机端「异常详情」跳转用);未被阻断或异常已不存在时为空")
@JsonSerialize(using = ToStringSerializer.class)
private Long blockedExceptionId;
@Schema(description = "不可打卡的原因,供司机端展示")
private String lockReason;
@Schema(description = "是否展示该卡(在途可能因频次/时段隐藏)")
private Boolean visible;