fix(firstleg): preserve coload groups in filtered candidates

This commit is contained in:
2026-09-04 00:33:07 +08:00
parent 65b29adb01
commit ce3cd7e80f
4 changed files with 132 additions and 64 deletions
@@ -113,22 +113,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ba
o.process_status IN ('WAIT_MEASURE','MEASURING','MEASURE_PENDING','MEASURE_REJECTED',
'WAIT_PRICING','FEE_CONFIRMING','INBOUNDING','WAIT_SPLIT','LOADING')
)
<if test="query.orderStatuses != null and !query.orderStatuses.isEmpty()">
AND (
<foreach collection="query.orderStatuses" item="status" separator=" OR ">
<choose>
<when test="status.name() == 'WAIT_MEASURE'">o.process_status IN ('WAIT_MEASURE','MEASURING','MEASURE_PENDING','MEASURE_REJECTED','WAIT_PRICING','FEE_CONFIRMING','INBOUNDING')</when>
<when test="status.name() == 'WAIT_SPLIT'">o.process_status='WAIT_SPLIT'</when>
<when test="status.name() == 'LOADING'">o.process_status='LOADING'</when>
<otherwise>1=0</otherwise>
</choose>
</foreach>
)
</if>
<if test="query.customerId != null">AND o.tenant_id=#{query.customerId}</if>
<if test="query.inboundCode != null and query.inboundCode.trim() != ''">AND LOWER(o.inbound_code) LIKE CONCAT('%',LOWER(#{query.inboundCode}),'%')</if>
<if test="query.createdStart != null">AND o.created_at&gt;=#{query.createdStart}</if>
<if test="query.createdEnd != null">AND o.created_at&lt;DATE_ADD(#{query.createdEnd},INTERVAL 1 DAY)</if>
) eligible
LEFT JOIN fl_coload_group_member current_member
ON current_member.tenant_id=eligible.accountId AND current_member.inbound_id=eligible.inboundId
@@ -143,6 +127,26 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ba
COUNT(*)=(SELECT COUNT(*) FROM fl_coload_group_member group_member_count
WHERE group_member_count.group_id=current_group.id AND group_member_count.active_flag=1)
))
<if test="query.orderStatuses != null and !query.orderStatuses.isEmpty()">
AND MAX(CASE WHEN
<foreach collection="query.orderStatuses" item="status" separator=" OR ">
<choose>
<when test="status.name() == 'WAIT_MEASURE'">eligible.candidateStatus='WAIT_MEASURE'</when>
<when test="status.name() == 'WAIT_SPLIT'">eligible.candidateStatus='WAIT_SPLIT'</when>
<when test="status.name() == 'LOADING'">eligible.candidateStatus='LOADING'</when>
<otherwise>1=0</otherwise>
</choose>
</foreach>
THEN 1 ELSE 0 END)=1
</if>
<if test="query.customerId != null">
AND MAX(CASE WHEN eligible.accountId=#{query.customerId} THEN 1 ELSE 0 END)=1
</if>
<if test="query.inboundCode != null and query.inboundCode.trim() != ''">
AND MAX(CASE WHEN LOWER(eligible.inboundCode) LIKE CONCAT('%',LOWER(#{query.inboundCode}),'%') THEN 1 ELSE 0 END)=1
</if>
<if test="query.createdStart != null">AND MIN(eligible.createdAt)&gt;=#{query.createdStart}</if>
<if test="query.createdEnd != null">AND MIN(eligible.createdAt)&lt;DATE_ADD(#{query.createdEnd},INTERVAL 1 DAY)</if>
ORDER BY sortArrivalAt IS NULL,sortArrivalAt,sortInboundId
</script>
""")
@@ -97,8 +97,8 @@ class SmartLoadingCandidateMapperContractTest {
assertThat(sql)
.contains("o.created_at createdAt")
.contains("o.created_at&gt;=#{query.createdStart}")
.contains("o.created_at&lt;DATE_ADD(#{query.createdEnd},INTERVAL 1 DAY)")
.contains("MIN(eligible.createdAt)&gt;=#{query.createdStart}")
.contains("MIN(eligible.createdAt)&lt;DATE_ADD(#{query.createdEnd},INTERVAL 1 DAY)")
.doesNotContain("query.expectedArrivalStart", "query.expectedArrivalEnd");
}
@@ -136,9 +136,11 @@ class SmartLoadingCandidateMapperContractTest {
.getBoundSql(Map.of("query", query, "actualChannels", Set.of("MATSON_CLX_TRUCK"))).getSql();
assertThat(renderedUnits)
.contains("o.channel_code IN")
.contains("o.created_at>=", "o.created_at<DATE_ADD")
.contains("o.process_status IN ('WAIT_MEASURE'")
.contains("o.process_status='WAIT_SPLIT'");
.contains("MIN(eligible.createdAt)>=", "MIN(eligible.createdAt)<DATE_ADD")
.contains("eligible.candidateStatus='WAIT_MEASURE'")
.contains("eligible.candidateStatus='WAIT_SPLIT'")
.contains("MAX(CASE WHEN LOWER(eligible.inboundCode)")
.contains("MAX(CASE WHEN eligible.accountId=");
Method details = SmartLoadingCandidateMapper.class.getDeclaredMethod(
"globalCandidatesByUnits", List.class);