This commit is contained in:
qwq
2026-07-27 11:20:04 +08:00
parent 98077d7ce1
commit 92f7df6a75
4 changed files with 46 additions and 23 deletions
+2
View File
@@ -10,6 +10,8 @@ const config = {
appSecret: process.env.FEISHU_APP_SECRET,
verificationToken: process.env.FEISHU_VERIFICATION_TOKEN,
encryptKey: process.env.FEISHU_ENCRYPT_KEY || '',
// 办理人的 open_id(程序以此身份完成办理任务)
handlerUserId: process.env.FEISHU_HANDLER_USER_ID || '',
approvalCodes: {
fileIn: process.env.FEISHU_APPROVAL_FILE_IN,
fileOut: process.env.FEISHU_APPROVAL_FILE_OUT,
+20 -5
View File
@@ -57,9 +57,8 @@ async function processEvent(body) {
const approvalCode = event.approval_code;
const status = event.status; // APPROVED / REJECTED / PENDING
// 只处理"已通过"的审批(即审批人同意后触发自动化
// 根据你的流程设计,也可能是 PENDING 时触发(机器人自动审批)
if (status !== 'APPROVED' && status !== 'PENDING') return;
// 只处理进行中的审批(办理任务到达时 instance 仍为 PENDING
if (status !== 'PENDING' && status !== 'APPROVED') return;
// 防重复处理
if (isApprovalProcessed(instanceCode)) {
@@ -67,7 +66,23 @@ async function processEvent(body) {
return;
}
logger.info(`[飞书事件] 收到审批事件: code=${approvalCode}, instance=${instanceCode}, status=${status}`);
// 检查当前 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}`);
// 根据审批定义 code 路由到不同工作流
if (approvalCode === config.feishu.approvalCodes.fileIn) {
@@ -113,7 +128,7 @@ async function processFileIn(approvalCode, instanceId) {
const result = await handleFileIn(approvalData, logId);
updateLog(logId, 'success');
// 提交审批意见
// 以办理人身份完成办理任务
await feishu.approveInstance(approvalCode, instanceId, result.message);
logger.info(`[文件传入] 完成: ${result.detail}`);
} catch (err) {
+6 -3
View File
@@ -95,19 +95,22 @@ function parseApprovalForm(formJson) {
* @param {string} comment - 审批意见
*/
async function approveInstance(approvalCode, instanceId, comment) {
// 获取审批实例中的当前审批节点 task_id
// 获取审批实例中的当前审批节点 task_id
const instance = await getApprovalInstance(approvalCode, instanceId);
const taskList = instance.task_list || [];
// 找到 PENDING 状态的 task
// 找到 PENDING 状态的 task(即当前待办理任务)
const pendingTask = taskList.find(t => t.status === 'PENDING');
if (!pendingTask) {
throw new Error(`审批实例 ${instanceId} 无待处理任务`);
}
// 使用配置的办理人身份,或任务本身的 user_id
const userId = config.feishu.handlerUserId || pendingTask.user_id;
return feishuRequest('POST', '/approval/v4/instances/approve', {
approval_code: approvalCode,
instance_code: instanceId,
user_id: pendingTask.user_id,
user_id: userId,
task_id: pendingTask.task_id,
comment: comment,
});