fix(patrol-delete): 删除条件为空的任务四层拦截——①前端启动前拦截(不再先创建后失败,避免任务残留执行中)并创建时上传delete_conditions ②Java服务端校验删除条件非空(旧版本/直调兜底) ③Python端空条件直接按失败上报,不再逐店空转

This commit is contained in:
2026-09-09 18:59:45 +08:00
parent 0cf20527a4
commit 96e93944d9
4 changed files with 25 additions and 3 deletions
@@ -23,4 +23,10 @@ public class PatrolDeleteCreateTaskRequest {
@NotEmpty
@Schema(description = "待创建的店铺任务列表,通常由已匹配成功的店铺组成", requiredMode = Schema.RequiredMode.REQUIRED)
private List<PatrolDeleteTaskItemDto> items = new ArrayList<>();
@NotNull
@NotEmpty
@JsonProperty("delete_conditions")
@Schema(description = "删除条件(如:定价问题/需要批准/缺少报价…),为空时任务无可执行内容", requiredMode = Schema.RequiredMode.REQUIRED)
private List<Object> deleteConditions = new ArrayList<>();
}
@@ -280,6 +280,11 @@ public class PatrolDeleteTaskService {
if (request.getItems() == null || request.getItems().isEmpty()) {
throw new BusinessException("items 不能为空");
}
// 删除条件为空时任务没有可执行的判定规则(Python 端会无事可做、一直停在执行中),
// 必须在此拦截;前端亦在创建前拦截,此处为服务端兜底(直调 API/旧客户端场景)
if (request.getDeleteConditions() == null || request.getDeleteConditions().isEmpty()) {
throw new BusinessException("删除条件不能为空,请先选择删除条件");
}
List<PatrolDeleteTaskItemDto> uniqueItems = dedupeItems(request.getItems());
if (uniqueItems.isEmpty()) {
@@ -1062,8 +1062,14 @@ async function processQueue() {
ElMessage.warning("请先匹配可用店铺");
return;
}
if (!selectedDeleteConditions().length) {
// 删除条件为空时任务没有可执行的判定规则,必须在创建任务前拦截,
// 否则 Java 已创建(RUNNING)而 Python 端无事可做,任务会一直停在执行中
ElMessage.warning("请先选择删除条件");
return;
}
const created = await withTransientRetry(
() => createPatrolDeleteTask(runnable.map(buildTaskItem)),
() => createPatrolDeleteTask(runnable.map(buildTaskItem), selectedDeleteConditions()),
(attempt, maxAttempts) => {
queuePushResult.value = `服务暂时不可用,正在重试创建任务(${attempt}/${maxAttempts}...`;
},
@@ -449,14 +449,19 @@ export function getPatrolDeleteTaskProgressBatch(taskIds: number[]) {
);
}
export function createPatrolDeleteTask(items: PatrolDeleteTaskItem[]) {
export function createPatrolDeleteTask(
items: PatrolDeleteTaskItem[],
deleteConditions: unknown[] = [],
) {
return unwrapJavaResponse(
post<
JavaApiResponse<PatrolDeleteCreateTaskVo>,
{ user_id: number; items: PatrolDeleteTaskItem[] }
{ user_id: number; items: PatrolDeleteTaskItem[]; delete_conditions: unknown[] }
>(`${JAVA_API_PREFIX}/patrol-delete/tasks`, {
user_id: getCurrentUserId(),
items,
// 服务端校验删除条件非空(创建即 RUNNING,空条件的任务 Python 端无内容可执行)
delete_conditions: deleteConditions,
}),
);
}