feat: 任务模型物理合并,发布+回收并为单任务双阶段
- tasks 新增 recovery_enabled/recovery_due_at/recovery_instructions/recovery_example_images,回收挂自己名下(先发布后交截图),不再置 complete - 存量 screenshot_collect 迁移并入父任务后删除(mysql/0020 含 DELETE,生产执行前务必备份) - 新 action task_enable_recovery:ghost 面板一键开通回收,截止默认=发布截止 - 企微催办双阶段(待发布/截图待提交);超期自动释放仅发布阶段 - admin 删 groupTaskMasters 聚合改单卡双面板;portal 详情页回收截图区块+批次回收进度 - 测试 309 全绿 + Playwright E2E 20/20
This commit is contained in:
@@ -31,7 +31,7 @@ import {
|
||||
} from "../../../lib/feishu-client";
|
||||
import {
|
||||
createDistributionTask,
|
||||
createScreenshotTask,
|
||||
enableTaskRecovery,
|
||||
updateTask,
|
||||
} from "../../../lib/task-service";
|
||||
import {
|
||||
@@ -204,23 +204,34 @@ export async function POST(request: Request) {
|
||||
contentFormat,
|
||||
projectId: String(body.projectId ?? "").trim(),
|
||||
ownerUserid: String(body.ownerUserid ?? "").trim(),
|
||||
recoveryEnabled: body.recoveryEnabled !== false,
|
||||
recoveryDueAt: String(body.recoveryDueAt ?? "").trim(),
|
||||
recoveryInstructions: String(body.recoveryInstructions ?? "").trim(),
|
||||
recoveryExampleImageKey: String(body.recoveryExampleImageKey ?? "").trim(),
|
||||
},
|
||||
env as unknown as FeishuBindings,
|
||||
);
|
||||
ownerWarning = await assignOwnerQuietly(creation.taskId, body.ownerUserid);
|
||||
} else if (body.action === "create_screenshot_task") {
|
||||
const forbidden = await projectOwnerGate(body.projectId);
|
||||
} else if (body.action === "task_enable_recovery") {
|
||||
const taskId = String(body.taskId ?? "").trim();
|
||||
if (!taskId) {
|
||||
return Response.json({ error: "缺少 taskId" }, { status: 400 });
|
||||
}
|
||||
const taskRow = await db
|
||||
.prepare("SELECT project_id FROM tasks WHERE id = ?")
|
||||
.bind(taskId)
|
||||
.first<{ project_id: string }>();
|
||||
if (!taskRow) {
|
||||
return Response.json({ error: "任务不存在" }, { status: 404 });
|
||||
}
|
||||
const forbidden = await projectOwnerGate(taskRow.project_id);
|
||||
if (forbidden) return forbidden;
|
||||
const creation = await createScreenshotTask({
|
||||
name: String(body.name ?? "").trim(),
|
||||
relatedTaskId: String(body.relatedTaskId ?? "").trim(),
|
||||
dueAt: String(body.dueAt ?? "").trim(),
|
||||
instructions: String(body.instructions ?? "").trim(),
|
||||
exampleImageKey: String(body.exampleImageKey ?? "").trim(),
|
||||
projectId: String(body.projectId ?? "").trim(),
|
||||
ownerUserid: String(body.ownerUserid ?? "").trim(),
|
||||
await enableTaskRecovery({
|
||||
taskId,
|
||||
recoveryDueAt: String(body.recoveryDueAt ?? "").trim(),
|
||||
recoveryInstructions: String(body.recoveryInstructions ?? "").trim(),
|
||||
recoveryExampleImageKey: String(body.recoveryExampleImageKey ?? "").trim(),
|
||||
});
|
||||
ownerWarning = await assignOwnerQuietly(creation.taskId, body.ownerUserid);
|
||||
} else if (body.action === "claim") {
|
||||
const forbidden = managerGate();
|
||||
if (forbidden) return forbidden;
|
||||
@@ -939,7 +950,6 @@ export async function POST(request: Request) {
|
||||
mainGroupMemberIds: body.mainGroupMemberIds,
|
||||
ownerUserid: nextOwnerUserid,
|
||||
note: body.note,
|
||||
parentProjectId: body.parentProjectId,
|
||||
},
|
||||
resolveWecomConfig(env as unknown as WecomBindings),
|
||||
);
|
||||
@@ -1011,10 +1021,13 @@ export async function POST(request: Request) {
|
||||
projectId: String(body.projectId ?? ""),
|
||||
platform,
|
||||
contentFormat,
|
||||
quantity: numberValue(body.quantity),
|
||||
keyword: String(body.keyword ?? ""),
|
||||
instructions: String(body.instructions ?? ""),
|
||||
exampleImageKey: String(body.exampleImageKey ?? ""),
|
||||
recoveryEnabled:
|
||||
body.recoveryEnabled === undefined
|
||||
? undefined
|
||||
: Boolean(body.recoveryEnabled),
|
||||
recoveryDueAt: String(body.recoveryDueAt ?? ""),
|
||||
recoveryInstructions: String(body.recoveryInstructions ?? ""),
|
||||
recoveryExampleImageKey: String(body.recoveryExampleImageKey ?? ""),
|
||||
});
|
||||
ownerWarning = await assignOwnerQuietly(update.taskId, body.ownerUserid);
|
||||
} else if (body.action === "partner_save") {
|
||||
|
||||
Reference in New Issue
Block a user