修复消息订阅
This commit is contained in:
+61
-26
@@ -42,23 +42,74 @@ router.post('/event', async (req, res) => {
|
||||
});
|
||||
|
||||
/**
|
||||
* 处理飞书事件
|
||||
* 处理飞书事件(支持 approval_instance 和 approval_task 两种)
|
||||
*/
|
||||
async function processEvent(body) {
|
||||
// 飞书事件订阅 v2 格式
|
||||
const header = body.header || {};
|
||||
const event = body.event || {};
|
||||
const eventType = header.event_type;
|
||||
|
||||
// 只处理审批实例状态变更事件
|
||||
if (eventType !== 'approval_instance') return;
|
||||
logger.info(`[飞书事件] 收到事件类型: ${eventType}, 数据: ${JSON.stringify(event).substring(0, 300)}`);
|
||||
|
||||
const instanceCode = event.instance_code;
|
||||
const approvalCode = event.approval_code;
|
||||
const status = event.status; // APPROVED / REJECTED / PENDING
|
||||
let instanceCode, approvalCode;
|
||||
|
||||
// 只处理进行中的审批(办理任务到达时 instance 仍为 PENDING)
|
||||
if (status !== 'PENDING' && status !== 'APPROVED') return;
|
||||
if (eventType === 'approval_task') {
|
||||
// 审批任务事件:上级审批通过后,办理任务被创建时触发
|
||||
// 数据结构可能是 event.object 或 event 本身
|
||||
const taskObj = event.object || event;
|
||||
instanceCode = taskObj.instance_code || taskObj.instance_id;
|
||||
approvalCode = taskObj.approval_code;
|
||||
const taskStatus = taskObj.status;
|
||||
const taskUserId = taskObj.user_id;
|
||||
|
||||
logger.info(`[飞书事件][task] instance=${instanceCode}, approval=${approvalCode}, status=${taskStatus}, user=${taskUserId}`);
|
||||
|
||||
// 只处理 PENDING 状态的任务(新到达的待办)
|
||||
if (taskStatus !== 'PENDING') {
|
||||
logger.info(`[飞书事件][task] 非PENDING状态,跳过: ${taskStatus}`);
|
||||
return;
|
||||
}
|
||||
|
||||
// 检查是否分配给配置的办理人
|
||||
const handlerId = config.feishu.handlerUserId;
|
||||
if (handlerId && taskUserId && taskUserId !== handlerId) {
|
||||
logger.info(`[飞书事件][task] 任务非本办理人,跳过: task_user=${taskUserId}, handler=${handlerId}`);
|
||||
return;
|
||||
}
|
||||
|
||||
} else if (eventType === 'approval_instance') {
|
||||
// 审批实例事件:整个审批单状态变化
|
||||
instanceCode = event.instance_code;
|
||||
approvalCode = event.approval_code;
|
||||
const status = event.status;
|
||||
|
||||
if (status !== 'PENDING' && status !== 'APPROVED') return;
|
||||
|
||||
// 检查当前 PENDING 任务是否分配给办理人
|
||||
const handlerId = config.feishu.handlerUserId;
|
||||
if (handlerId) {
|
||||
try {
|
||||
const instance = await feishu.getApprovalInstance(approvalCode, instanceCode);
|
||||
const taskList = instance.task_list || [];
|
||||
const pendingTask = taskList.find(t => t.status === 'PENDING');
|
||||
if (!pendingTask || pendingTask.user_id !== handlerId) {
|
||||
logger.info(`[飞书事件][instance] 当前待办非本程序办理任务,跳过`);
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
logger.warn(`[飞书事件][instance] 获取实例详情失败: ${e.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
// 非目标事件
|
||||
return;
|
||||
}
|
||||
|
||||
if (!instanceCode || !approvalCode) {
|
||||
logger.warn(`[飞书事件] 缺少 instanceCode 或 approvalCode,跳过`);
|
||||
return;
|
||||
}
|
||||
|
||||
// 防重复处理
|
||||
if (isApprovalProcessed(instanceCode)) {
|
||||
@@ -66,23 +117,7 @@ async function processEvent(body) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 检查当前 PENDING 任务是否分配给办理人(过滤掉上级审批阶段)
|
||||
const handlerId = config.feishu.handlerUserId;
|
||||
if (handlerId) {
|
||||
try {
|
||||
const instance = await feishu.getApprovalInstance(approvalCode, instanceCode);
|
||||
const taskList = instance.task_list || [];
|
||||
const pendingTask = taskList.find(t => t.status === 'PENDING');
|
||||
if (!pendingTask || pendingTask.user_id !== handlerId) {
|
||||
logger.info(`[飞书事件] 当前待办非本程序办理任务,跳过: instance=${instanceCode}`);
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
logger.warn(`[飞书事件] 获取实例详情失败,继续处理: ${e.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
logger.info(`[飞书事件] 办理任务到达: code=${approvalCode}, instance=${instanceCode}`);
|
||||
logger.info(`[飞书事件] 办理任务确认: code=${approvalCode}, instance=${instanceCode}`);
|
||||
|
||||
// 根据审批定义 code 路由到不同工作流
|
||||
if (approvalCode === config.feishu.approvalCodes.fileIn) {
|
||||
|
||||
Reference in New Issue
Block a user