飞书审批对接-自建企业应用的主要作用
自建企业应用在第三方系统对接飞书审批流程中扮演着核心枢纽的角色让我详细解释它的作用和与审批表单的关系。1. 自建企业应用的主要作用1.1 身份认证和权限中心javascript// 自建应用负责处理所有API调用的认证 class FeishuAppAuth { constructor(appId, appSecret) { this.appId appId; this.appSecret appSecret; } // 获取访问令牌所有API调用都需要 async getTenantAccessToken() { const response await fetch(https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ app_id: this.appId, app_secret: this.appSecret }) }); const data await response.json(); return data.tenant_access_token; } }1.2 API调用代理2. 自建应用与审批表单的具体联系2.1 审批表单的操作入口自建应用提供访问审批表单的入口javascript// 在自建应用内嵌入审批页面 class ApprovalIntegration { // 生成审批页面的访问链接 generateApprovalPageUrl(approvalCode, instanceId null) { if (instanceId) { // 查看已存在的审批实例 return https://applink.feishu.cn/client/approval/detail?instanceId${instanceId}; } else { // 发起新审批 return https://applink.feishu.cn/client/approval/create?definitionCode${approvalCode}; } } // 在自建应用工作台展示审批相关功能 getApprovalWidgets() { return { 我的待办: /api/approval/pending, 我发起的: /api/approval/submitted, 审批统计: /api/approval/analytics }; } }2.2 数据桥梁作用javascript// 自建应用连接第三方系统数据和飞书审批表单 class DataBridgeService { // 将业务数据映射到飞书表单控件 mapBusinessDataToFeishuForm(businessData, formMapping) { const feishuFormData {}; for (const [businessField, feishuField] of Object.entries(formMapping)) { if (businessData[businessField] ! undefined) { feishuFormData[feishuField] this.formatValueForFeishu( businessData[businessField], feishuField.type ); } } return JSON.stringify(feishuFormData); } // 处理飞书回调更新业务系统 async handleApprovalCallback(callbackData) { const { instance_id, approve_type, user_id } callbackData; // 1. 通过自建应用查询审批详情 const approvalDetail await this.getApprovalInstance(instance_id); // 2. 找到对应的业务记录 const businessRecord await this.findBusinessRecord(instance_id); // 3. 更新业务系统状态 await this.updateBusinessStatus(businessRecord.id, approve_type, user_id); } }3. 具体功能实现3.1 审批流程管理javascriptclass ApprovalManagement { constructor(appAuth) { this.appAuth appAuth; } // 发起审批核心功能 async createApprovalInstance(approvalCode, userId, formData) { const token await this.appAuth.getTenantAccessToken(); const response await fetch(https://open.feishu.cn/open-apis/approval/v4/instances, { method: POST, headers: { Authorization: Bearer ${token}, Content-Type: application/json }, body: JSON.stringify({ approval_code: approvalCode, user_id: userId, form: formData }) }); return response.json(); } // 查询审批状态 async getApprovalStatus(instanceId) { const token await this.appAuth.getTenantAccessToken(); const response await fetch(https://open.feishu.cn/open-apis/approval/v4/instances/${instanceId}, { headers: { Authorization: Bearer ${token} } }); return response.json(); } // 获取用户待审批列表 async getPendingApprovals(userId) { const token await this.appAuth.getTenantAccessToken(); const response await fetch(https://open.feishu.cn/open-apis/approval/v4/instances/query, { method: POST, headers: { Authorization: Bearer ${token}, Content-Type: application/json }, body: JSON.stringify({ user_id: userId, approval_code: ALL, // 所有审批类型 status: PENDING // 待审批状态 }) }); return response.json(); } }3.2 用户和组织结构同步javascriptclass UserSyncService { // 获取部门用户列表用于选择审批人 async getDepartmentUsers(departmentId) { const token await this.appAuth.getTenantAccessToken(); const response await fetch( https://open.feishu.cn/open-apis/contact/v3/users?department_id${departmentId}page_size100, { headers: { Authorization: Bearer ${token} } } ); return response.json(); } // 搜索用户按姓名搜索审批人 async searchUsers(keyword) { const token await this.appAuth.getTenishuAccessToken(); const response await fetch(https://open.feishu.cn/open-apis/contact/v3/users/search, { method: POST, headers: { Authorization: Bearer ${token}, Content-Type: application/json }, body: JSON.stringify({ query: keyword }) }); return response.json(); } }4. 实际应用场景4.1 场景一在第三方系统内发起飞书审批javascript// 用户在第三方系统点击发起审批 app.post(/api/business/start-approval, async (req, res) { const { businessId, applicantId } req.body; // 1. 获取业务数据 const businessData await businessService.getData(businessId); // 2. 通过自建应用映射数据到飞书表单 const formMapping { title: widget_title, amount: widget_amount, reason: widget_reason }; const feishuFormData dataBridge.mapBusinessDataToFeishuForm(businessData, formMapping); // 3. 调用飞书API创建审批实例 const result await approvalManagement.createApprovalInstance( APPROVAL_CODE_123, // 预先配置的审批表单ID applicantId, feishuFormData ); // 4. 保存关联关系 await db.approvalRelations.create({ business_id: businessId, feishu_instance_id: result.data.instance_id, status: PENDING }); res.json({ success: true, instanceId: result.data.instance_id }); });4.2 场景二在飞书工作台处理审批待办javascript// 自建应用提供待办列表接口 app.get(/api/approval/pending, async (req, res) { const userId req.user.feishuUserId; // 1. 获取飞书待审批列表 const pendingApprovals await approvalManagement.getPendingApprovals(userId); // 2. 增强显示信息结合业务数据 const enhancedList await Promise.all( pendingApprovals.data.items.map(async (approval) { const businessInfo await businessService.getByInstanceId(approval.instance_id); return { ...approval, business_context: businessInfo // 添加业务上下文 }; }) ); res.json({ data: enhancedList }); });5. 配置关系总结总结自建企业应用的核心作用认证中心处理所有API调用的身份验证数据桥梁在第三方系统和飞书审批之间转换数据格式功能聚合在工作台统一展示审批相关功能用户体验提供无缝的审批发起和处理体验监控管理跟踪审批状态处理异常情况与审批表单的关系自建应用是操作审批表单的工具审批表单是承载审批内容的容器两者通过API和回调机制紧密协作没有自建应用第三方系统就无法以自动化、标准化的方式与飞书审批集成