提交
This commit is contained in:
+20
@@ -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));
|
||||
}
|
||||
}
|
||||
+31
@@ -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);
|
||||
}
|
||||
+12
@@ -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); }
|
||||
}
|
||||
+12
@@ -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) {}
|
||||
}
|
||||
Reference in New Issue
Block a user