feat: 任务一键推送企微(总群+KOC个人直达+群发,含推送记录)

This commit is contained in:
ABAPPLO
2026-09-01 17:30:47 +08:00
parent b243562e60
commit d01281fba9
10 changed files with 1103 additions and 12 deletions

View File

@@ -69,6 +69,13 @@ import {
setProjectGroupChats,
} from "../../../lib/project-service";
import { pushProjectTask } from "../../../lib/project-push-service";
import {
findTodayTaskPushLog,
listBoundWecomPartners,
listTaskPushLogs,
OneClickPushError,
oneClickPushTask,
} from "../../../lib/task-one-click-push-service";
type ActionBody = {
action?: string;
@@ -753,6 +760,35 @@ export async function POST(request: Request) {
appFailedCount: appFailed.length,
hint: "任务群走企业群发,群主需在企微客户端「群发助手」点击发送后,消息才会送达客户群",
});
} else if (body.action === "wecom_bound_partners") {
const partners = await listBoundWecomPartners(db);
const taskId = String(body.taskId ?? "").trim();
const pushedToday = taskId
? await findTodayTaskPushLog(db, taskId, "task_open")
: null;
return Response.json({ partners, pushedToday });
} else if (body.action === "task_one_click_push") {
const wecomConfig = resolveWecomConfig(env as unknown as WecomBindings);
const outcome = await oneClickPushTask(
db,
{
taskId: body.taskId,
sendMainGroup: body.sendMainGroup,
sendKoc: body.sendKoc,
createGroupTemplate: body.createGroupTemplate,
selectedKocPartnerIds: body.selectedKocPartnerIds,
force: body.force,
text: body.text,
},
wecomConfig,
);
return Response.json({
...outcome,
hint: "KOC 直达消息已即时送达;任务群走企业群发,群主需在企微客户端「群发助手」点击发送后才会送达客户群",
});
} else if (body.action === "task_push_logs") {
const logs = await listTaskPushLogs(db, String(body.taskId ?? "").trim());
return Response.json({ logs });
} else if (body.action === "refresh_account_fields") {
const status = startAccountFieldRefresh(
db,
@@ -778,7 +814,8 @@ export async function POST(request: Request) {
error instanceof FeishuSourceError ||
error instanceof DistributionReleaseError ||
error instanceof WecomClientError ||
error instanceof ProjectError
error instanceof ProjectError ||
error instanceof OneClickPushError
? error.status
: 500,
},