This commit is contained in:
2026-10-20 11:30:34 +08:00
parent c13175bf77
commit 16ac817524
92 changed files with 1916 additions and 190 deletions
@@ -0,0 +1,20 @@
package com.baiyue.lastleg.workflow;
import com.baiyue.common.core.api.ApiResponse;
import com.baiyue.lastleg.security.InternalServiceTokenGuard;
import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid;
import java.util.List;
/** 服务令牌保护的来源事实接口。 */
@RestController
@RequestMapping("/internal/lastleg/v1/order-workflow-facts")
public class InternalOrderWorkflowFactController {
private final InternalServiceTokenGuard guard;
private final OrderWorkflowFactService service;
/** 注入服务身份守卫。 */
public InternalOrderWorkflowFactController(InternalServiceTokenGuard guard,OrderWorkflowFactService service) { this.guard=guard;this.service=service; }
/** 身份验证后批量查询,不暴露公网。 */
@PostMapping
public ApiResponse<List<OrderWorkflowFacts.Fact>> read(@RequestHeader(value="X-Internal-Service-Token",required=false) String token,@Valid @RequestBody OrderWorkflowFacts.Request request) {
guard.verify(token);return ApiResponse.success(service.read(request));
}
}
@@ -0,0 +1,31 @@
package com.baiyue.lastleg.workflow;
import org.apache.ibatis.annotations.*;
import java.util.List;
/** 以不可变来源明细核对出库,取消不再遮挡待排车。 */
@Mapper
public interface OrderWorkflowFactMapper {
/** 精确核对客户及来源;字符串参数沿用列排序规则,避免连接默认排序规则冲突。 */
@Select("""
<script>
SELECT o.customer_id tenant_id,o.source_inbound_id inbound_id,
EXISTS(SELECT 1 FROM ll_outbound_pallet_item i JOIN ll_outbound_order b ON b.id=i.outbound_order_id AND b.customer_id=i.customer_id
WHERE i.customer_id=o.customer_id AND i.source_order_id=o.id AND b.status NOT IN ('CANCELLED','CANCELED')) outbound_exists,
EXISTS(SELECT 1 FROM ll_outbound_pallet_item i JOIN ll_outbound_order b ON b.id=i.outbound_order_id AND b.customer_id=i.customer_id
WHERE i.customer_id=o.customer_id AND i.source_order_id=o.id AND b.status NOT IN ('CANCELLED','CANCELED','OUTBOUNDED')) pending_outbound,
EXISTS(SELECT 1 FROM ll_outbound_pallet_item i JOIN ll_outbound_order b ON b.id=i.outbound_order_id AND b.customer_id=i.customer_id
JOIN ll_delivery_order d ON d.outbound_order_id=b.id AND d.customer_id=b.customer_id
WHERE i.customer_id=o.customer_id AND i.source_order_id=o.id AND b.status='OUTBOUNDED' AND d.status='DELIVERING' AND d.dispatched_at IS NOT NULL
AND (d.destination_warehouse_code=i.destination_warehouse_code OR d.destination_warehouse_id=i.destination_warehouse_id
OR (d.destination_type='PRIVATE' AND EXISTS(SELECT 1 FROM ll_dispatch_item di
WHERE di.id=i.dispatch_item_id AND di.customer_id=i.customer_id AND di.dispatch_order_id=b.dispatch_order_id
AND di.destination_type='PRIVATE' AND TRIM(di.delivery_address)=TRIM(d.delivery_address)
AND COALESCE(TRIM(di.postal_code),'')=COALESCE(TRIM(d.postal_code),''))))) delivering,
EXISTS(SELECT 1 FROM ll_inbound_plan p WHERE p.customer_id=o.customer_id AND p.source_order_id=o.id AND p.status IN ('COMPLETED','PENDING_RECONCILIATION')) unloaded
FROM ll_order o WHERE o.source_region='FIRSTLEG' AND o.order_type NOT IN ('RELABEL_APPLICATION','WAREHOUSE_TRANSFER')
AND <foreach collection='sources' item='s' open='(' separator=' OR ' close=')'>
(o.customer_id=#{s.tenantKey} AND o.source_inbound_id=#{s.inboundKey})
</foreach>
</script>
""")
List<OrderWorkflowFacts.Fact> read(@Param("sources") List<OrderWorkflowFacts.Source> sources);
}
@@ -0,0 +1,12 @@
package com.baiyue.lastleg.workflow;
import org.springframework.stereotype.Repository;
import java.util.List;
/** 尾程作业事实持久化入口。 */
@Repository
public class OrderWorkflowFactRepository {
private final OrderWorkflowFactMapper mapper;
/** 注入事实SQL提供者。 */
public OrderWorkflowFactRepository(OrderWorkflowFactMapper mapper) { this.mapper=mapper; }
/** 空来源不能扩大查询。 */
public List<OrderWorkflowFacts.Fact> read(List<OrderWorkflowFacts.Source> sources) { return sources.isEmpty()?List.of():mapper.read(sources); }
}
@@ -0,0 +1,12 @@
package com.baiyue.lastleg.workflow;
import org.springframework.stereotype.Service;
import java.util.List;
/** 只读提供国内订单列表所需的真实作业事实。 */
@Service
public class OrderWorkflowFactService {
private final OrderWorkflowFactRepository repository;
/** 注入领域仓储。 */
public OrderWorkflowFactService(OrderWorkflowFactRepository repository) { this.repository=repository; }
/** 批量读取精确来源事实。 */
public List<OrderWorkflowFacts.Fact> read(OrderWorkflowFacts.Request request) { return repository.read(request.sources()); }
}
@@ -0,0 +1,17 @@
package com.baiyue.lastleg.workflow;
import jakarta.validation.Valid;
import jakarta.validation.constraints.*;
import java.util.List;
/** 按客户和来源入仓单查询独立作业事实。 */
public final class OrderWorkflowFacts {
/** 仅作为内部契约命名空间,不允许实例化。 */
private OrderWorkflowFacts() {}
public record Source(@Positive long tenantId,@Positive long inboundId) {
/** 字符型客户键以字符串绑定,避免隐式数字比较丢失长整型精度。 */
public String tenantKey() { return Long.toString(tenantId); }
/** 来源入库键保持原值,不通过数据库CAST引入连接排序规则。 */
public String inboundKey() { return Long.toString(inboundId); }
}
public record Request(@NotEmpty @Size(max=500) List<@NotNull @Valid Source> sources) {}
public record Fact(long tenantId,long inboundId,boolean outboundExists,boolean pendingOutbound,boolean delivering,boolean unloaded) {}
}