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,
},

View File

@@ -9,6 +9,7 @@ import {
handleWecomCallbackEvent,
parseWecomCallbackXml,
} from "../../../lib/wecom-callback-events";
import { ensureSchema, getRawDb } from "../../../lib/mvp-db";
import { isEnabled, getRuntimeEnv } from "../../../lib/runtime-env";
type CallbackConfig = {
@@ -112,7 +113,12 @@ export async function POST(request: Request) {
return new Response("receiveid 校验失败", { status: 403 });
}
const fields = parseWecomCallbackXml(message);
handleWecomCallbackEvent(fields);
try {
await ensureSchema();
await handleWecomCallbackEvent(getRawDb(), fields);
} catch (eventError) {
console.error("[KOC LOOP] wecom callback event handling failed", eventError);
}
return new Response("", { status: 200 });
} catch (error) {
if (error instanceof WecomCallbackCryptoError) {