🐛 拒单票不再被排除在可配载之外,随配载提交清除接单事实

This commit is contained in:
2026-10-18 14:48:17 +08:00
parent ca92288cf4
commit f9453e4fac
6 changed files with 23 additions and 26 deletions
@@ -784,9 +784,6 @@ public class LoadingManageServiceImpl extends BaseServiceImpl<LoadingManageMappe
if (!LoadableAdmissionSupport.LOADABLE_BUSINESS_STATUS.equals(waybill.getBusinessStatus())) {
return prefix + "当前状态不是待执行,不可配载";
}
if (WaybillProcessSupport.isRejected(waybill.getDriverAcceptStatus())) {
return prefix + "已被司机拒绝接单,不可配载";
}
return prefix + "不可配载";
}
@@ -29,7 +29,10 @@ import java.util.List;
import java.util.Locale;
/**
* 可配载准入判据:公路 + 待执行 + 未关联其它配载单 + 未拒单。
* 可配载准入判据:公路 + 待执行 + 未关联其它配载单。
* <p>
* 接单状态不进判据:拒单票照样可配载。配载提交会把它的接单事实清成待接单,
* 否则新司机看不到这张票——司机端入口一律排除已拒绝的运单。
* <p>
* 候选列表取数与配载提交/编辑/重新派单的校验共用这一份定义。
*/
@@ -99,8 +102,7 @@ public final class LoadableAdmissionSupport {
return false;
}
if (!isRoadTransport(waybill.getTransportType())
|| !LOADABLE_BUSINESS_STATUS.equals(text(waybill.getBusinessStatus()))
|| WaybillProcessSupport.isRejected(waybill.getDriverAcceptStatus())) {
|| !LOADABLE_BUSINESS_STATUS.equals(text(waybill.getBusinessStatus()))) {
return false;
}
String loadingNo = text(waybill.getLoadingNo());
@@ -126,7 +128,7 @@ public final class LoadableAdmissionSupport {
}
/**
* 把整条可配载判据加到运单查询上:公路 + 待执行 + 未配载 + 非拒单。
* 把整条可配载判据加到运单查询上:公路 + 待执行 + 未配载。
*
* @param wrapper 运单列表查询条件
*/
@@ -134,9 +136,6 @@ public final class LoadableAdmissionSupport {
applyRoadTransportCondition(wrapper);
wrapper.eq(Waybill::getBusinessStatus, LOADABLE_BUSINESS_STATUS);
wrapper.and(nested -> nested.isNull(Waybill::getLoadingNo).or().eq(Waybill::getLoadingNo, ""));
// 接单状态绝大多数为 NULL,而 NULL <> 'rejected' 不成立,只写不等于会把它们一起滤掉
wrapper.and(nested -> nested.isNull(Waybill::getDriverAcceptStatus)
.or().ne(Waybill::getDriverAcceptStatus, WaybillProcessSupport.ACCEPT_REJECTED));
}
private static void applyRoadTransportCondition(LambdaQueryWrapper<Waybill> wrapper) {
@@ -127,16 +127,14 @@ class LoadingManageAdmissionTest {
}
@Test
@DisplayName("已拒单的运单被拒:接单事实由配载写入路径清除,不靠放行拒单票")
void rejectedWaybillRejected() {
@DisplayName("已拒单但未配载的公路待执行运单可通过提交:接单事实由配载写入路径清除,新司机由此看到它")
void rejectedWaybillIsAdmitted() {
Waybill rejected = waybill(1L, WAYBILL_NO_A, "road", "pending", null, PROJECT_A);
rejected.setDriverAcceptStatus("rejected");
stubWaybills(rejected);
stubContract(CONTRACT_ID, PROJECT_A);
ServiceException exception = assertThrows(ServiceException.class,
() -> service.submit(submitPayload(List.of(1L))));
assertEquals("运单" + WAYBILL_NO_A + "已被司机拒绝接单,不可配载", exception.getMessage());
assertDoesNotThrow(() -> service.submit(submitPayload(List.of(1L))));
}
// ------------------------------------------------------------ 本单既有子运单
@@ -368,7 +368,7 @@ class LoadingManageChildStatusWriteTest {
waybill.setProjectId(projectId);
waybill.setProcessJson(processJson);
waybill.setDeptId(DEPT_ID_LONG);
// 可配载只放行公路 + 待执行 + 未配载 + 未拒单,夹具的票都是这种票
// 可配载只放行公路 + 待执行 + 未配载,夹具的票都是这种票
waybill.setTransportType("公路运输");
waybill.setBusinessStatus("pending");
return waybill;
@@ -68,7 +68,7 @@ class WaybillLoadableQueryTest {
}
@Test
@DisplayName("开关开启:公路词表、待执行、未配载、非拒单一次全部进 wrapper")
@DisplayName("开关开启:公路词表、待执行、未配载一次全部进 wrapper,接单状态不参与")
void loadableSwitchAppliesWholePredicate() {
LambdaQueryWrapper<Waybill> wrapper = capturedQuery(loadableQuery());
String sql = String.valueOf(wrapper.getTargetSql());
@@ -85,10 +85,8 @@ class WaybillLoadableQueryTest {
"进行中一律不可配载,不能沿用「待执行与进行中都可配载」的旧口径:" + params);
assertTrue(sql.contains("loading_no IS NULL") && sql.contains("loading_no ="),
"未配载要同时覆盖 NULL 与空串:" + sql);
assertTrue(sql.contains("driver_accept_status <>") && params.contains("rejected"),
"接单状态为已拒绝的要排除:" + sql);
assertTrue(sql.contains("driver_accept_status IS NULL"),
"接单状态大多是 NULL,只写不等于 rejected 会把它们一起滤掉:" + sql);
assertFalse(sql.contains("driver_accept_status"),
"接单状态不进可配载判据:拒单票照样可被重新配载:" + sql);
}
@Test
@@ -48,14 +48,21 @@ class LoadableAdmissionSupportTest {
// ------------------------------------------------------------ 单张运单准入
@Test
@DisplayName("公路 + 待执行 + 未配载 + 未拒单才可配载")
@DisplayName("公路 + 待执行 + 未配载才可配载")
void loadableOnlyWhenAllConditionsHold() {
assertTrue(LoadableAdmissionSupport.isLoadable(waybill("road", "pending", null, "pending")));
assertTrue(LoadableAdmissionSupport.isLoadable(waybill("公路运输", "pending", "", null)));
}
@Test
@DisplayName("非公路、非待执行、已关联配载单、已拒单各自单独即可拒绝")
@DisplayName("已拒单的票照样可配载:接单事实由配载提交清除,不靠把拒单票挡在候选之外")
void rejectedWaybillIsLoadable() {
assertTrue(LoadableAdmissionSupport.isLoadable(waybill("road", "pending", null, "rejected")));
assertTrue(LoadableAdmissionSupport.isLoadable(waybill("road", "pending", null, "rejected"), "PZ20260101-001"));
}
@Test
@DisplayName("非公路、非待执行、已关联配载单各自单独即可拒绝")
void eachConditionRejectsOnItsOwn() {
assertFalse(LoadableAdmissionSupport.isLoadable(waybill("railway", "pending", null, "pending")),
"非公路不可配载");
@@ -66,8 +73,6 @@ class LoadableAdmissionSupportTest {
assertFalse(LoadableAdmissionSupport.isLoadable(waybill("road", "cancelled", null, null)));
assertFalse(LoadableAdmissionSupport.isLoadable(waybill("road", "pending", "PZ20260101-001", null)),
"已挂在其它配载单上的票不可再配载");
assertFalse(LoadableAdmissionSupport.isLoadable(waybill("road", "pending", null, "rejected")),
"已拒单的票不可配载");
assertFalse(LoadableAdmissionSupport.isLoadable(null));
}