内部系统接入飞书审批api

232 阅读2分钟

审核状态流转:

注意事项点:

1:依赖第三方审批的话,审批通过拒绝是,回调需要一定的时间,可能页面状态数据不同步,比如说提审后进入待审核状态,回调已经修改了数据,但是用户还在原界面还是待审核状态,点击相关比如说撤销操作按钮之后,前端多等个1-2秒的时间再去调用查询的接口,及时的同步好对应的状态or返回指定的异常码,收到指定异常码之后再刷新。

2:撤销审核的数据回源处理

数据回源设计:

如果是单表设计,比如说data表,数据修改后,新增快照字段,记录编辑前的源数据,进行数据回源

如果需要隔离审核通过的数据以及草稿数据的话,

data表分为对应的data_local和data_pass表,回源则将原先已通过的数据回源到local表之中。

3:数据提审,在撤审,在提审,如果数据没有变化的话,是否限制对应的提审操作。

飞书审批流程相关的配置:

1:飞书管理员创建审批,获取相关的审批Code

2:创建飞书应用:

3:相关权限申请:

  • approval:approval 查看、创建、更新、删除审批应用相关信息
  • contact:user.employee_id:readonly 获取用户 user ID
  • contact:user.id:readonly 通过手机号或邮箱获取用户 ID

4:针对上述新创建的应用需要订阅对应approvalCode审批流字段

open.feishu.cn/document/se…

5:请求一下,获取审批定义:open.feishu.cn/api-explore…

6:刚创建的的应用没有ecccrypy key ,可以重置,配配置到后台,用于处理接受事件回调:

7:定义相关的回调路由:

8:飞书应用事件回调中,配置事件到回调路由,以及添加审批实例状态变更的事件

多次点击审核撤销时,相关审批信息状态限制

相关的回调路由测试代码:

/**
 * 飞书事件配置
 */
@AllArgsConstructor
@Configuration
public class ServletAdapterConfiguration {

    @Bean
    public ServletAdapter getServletAdapter() {
        return new ServletAdapter();
    }
}


/**
 * 飞书事件回调路由配置
 */
@RequestMapping("/test")
@RestController
@Slf4j
public class Test {

    @Resource
    private LarkApprovalProperties larkApprovalProperties;
    @Resource
    private ServletAdapter servletAdapter;

    private EventDispatcher eventDispatcher;

@PostConstruct
    public void init() {
        eventDispatcher = EventDispatcher.newBuilder(larkApprovalProperties.getVerificationToken(), larkApprovalProperties.getEncryptKey())
                .onCustomizedEvent("approval_instance", new CustomEventHandler() {
                    @Override
                    public void handle(EventReq event) {
                        String json = event.getPlain();
                        log.info("接收到审批实例变更事件, plain:{}", json);
                        Map<String, Object> resultMap = JsonUtil.toMap(json);
                        Map<String, Object> eventMap = (Map<String, Object>) resultMap.get("event");
                        String approvalCode = (String) eventMap.get("approval_code");
                        String instanceCode = (String) eventMap.get("instance_code");
                        String status = (String) eventMap.get("status");

                    }
                })
                .build();
    }

    @PostMapping("/webhook/event")
    public void event(HttpServletRequest request, HttpServletResponse response)
            throws Throwable {
        log.info("飞书回调事件开始");
        servletAdapter.handleEvent(request, response, eventDispatcher);
        log.info("飞书回调事件结束");
    }
}

ps: 相关坑点: 比如说提示飞书表单格式不正确 飞书表单的话,有些特殊字符是不支持的,还有如果传入换行符/n 也会提示飞书表单格式不正确,需要再增加一个斜杠号才可以/,即//n