前言:koa的接口一定要有响应,否则前端请求会报404的错
async function sendFeiShuMsg(ctx) {
try {
// 1. 验证请求数据
if (!ctx || !ctx.request || !ctx.request.body) {
ctx.status = 400;
ctx.body = {
code: 400,
success: false,
message: '请求参数错误',
data: null
};
return;
}
const taskData = ctx.request.body;
// 2. 验证必要字段
if (!taskData.name || !taskData.content) {
ctx.status = 400;
ctx.body = {
code: 400,
success: false,
message: '缺少任务名称或内容',
data: null
};
return;
}
// 3. 获取飞书 token
const tenant_access_token = await getTenantToken();
if (!tenant_access_token) {
ctx.status = 500;
ctx.body = {
code: 500,
success: false,
message: '获取飞书Token失败',
data: null
};
return;
}
// 4. 获取 open_id
const openData = await getOpenId(taskData.selectedStaff.phone);
let open_id = openData.data.user_list[0].user_id;
// 5. 构建消息内容
let content = JSON.stringify({
type: `template`,
data: {
template_id: "AAqXJFCUdYjOM", // 卡片模板id
template_variable: { // 卡片绑定的变量
"title": `${taskData.name}`,
"content": `您有一个待点检任务,${taskData.content}`,
"tourl": {
"url": `http://oa.jt-ele.com:9527/task-inspection-front/`
},
"open_id": taskData.selectedStaff.open_id || open_id
},
},
});
// 6. 发送飞书消息
const result = await client.im.v1.message.create({
params: {
receive_id_type: 'open_id',
},
data: {
receive_id: open_id,
msg_type: 'interactive',
content,
},
}, lark.withTenantToken(tenant_access_token));
// 7. 成功响应
ctx.status = 200;
ctx.body = {
code: 200,
success: true,
message: '飞书消息发送成功',
data: {
message_id: result.data.message_id,
open_id: open_id,
send_time: new Date().toISOString()
}
};
} catch (error) {
// 8. 错误响应
ctx.status = 500;
ctx.body = {
code: 500,
success: false,
message: `发送飞书消息失败: ${error.message || '未知错误'}`,
data: null,
error: process.env.NODE_ENV === 'development' ? error.stack : undefined
};
}
}