Flowable钉钉对接003-钉钉待办任务SDK封装

文章讲述了如何将企业的业务系统与钉钉的移动办公平台结合,通过创建、更新和删除钉钉待办任务的SDK,实现审批流程的统一管理。目标是封装钉钉SDK,以便在Flowable与钉钉间交互创建、更新和删除待办任务。

企业中有自己的业务系统,审批都在业务系统中审批,如何结合移动办公的开放平台实现统一审批至关重要。

场景很简单,自己的系统中可以审批,钉钉上也可以审批,使用H5来适配,统一待办任务

目标:封装统一的钉钉SDK为后续推送钉钉待办做准备

实现flowable与钉钉相互之间可以创建待办,更新待办,删除待办
  • 第一 、创建钉钉待办任务sdk

private Client createClient() throws Exception {
        Config config = new Config();
        config.protocol = "https";
        config.regionId = "central";
        return new com.aliyun.dingtalktodo_1_0.Client(config);
    }

    @Override
    public CreateTodoTaskResponse createTask(String unionId, CreateTodoTaskRequest params) {
        OapiGettokenResponse accessToken = this.getAccessToken();
        CreateTodoTaskHeaders createTodoTaskHeaders = new CreateTodoTaskHeaders();
        createTodoTaskHeaders.xAcsDingtalkAccessToken = accessToken.getAccessToken();
        try {
            com.aliyun.dingtalktodo_1_0.Client client = this.createClient();
            CreateTodoTaskResponse res = client.createTodoTaskWithOptions(unionId, params, createTodoTaskHeaders, new RuntimeOptions());
            return res;
        } catch (TeaException err) {
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
                log.error("创建任务出错", err);
            }
        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
                log.error("创建任务出错", err);
            }
        }
        return null;
    }
  • 第二 、更新钉钉待办任务sdk

 public void updateTask(String unionId, String taskId, UpdateTodoTaskRequest params) {
        OapiGettokenResponse accessToken = this.getAccessToken();
        UpdateTodoTaskHeaders updateTodoTaskHeaders = new UpdateTodoTaskHeaders();
        updateTodoTaskHeaders.xAcsDingtalkAccessToken = accessToken.getAccessToken();
        try {
            com.aliyun.dingtalktodo_1_0.Client client = this.createClient();
            client.updateTodoTaskWithOptions(unionId, taskId, params, updateTodoTaskHeaders, new RuntimeOptions());
        } catch (TeaException err) {
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
                log.error("修改任务出错", err);
            }
        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
                log.error("修改任务出错", err);
            }
        }
    }
  • 第三、删除钉钉待办任务sdk

public void deleteTask(String unionId, String taskId) {
        DeleteTodoTaskHeaders deleteTodoTaskHeaders = new DeleteTodoTaskHeaders();
        try {
            OapiGettokenResponse accessToken = this.getAccessToken();
            com.aliyun.dingtalktodo_1_0.Client client = this.createClient();
            deleteTodoTaskHeaders.xAcsDingtalkAccessToken = accessToken.getAccessToken();
            DeleteTodoTaskRequest deleteTodoTaskRequest = new DeleteTodoTaskRequest()
                    .setOperatorId(unionId);
            client.deleteTodoTaskWithOptions(unionId, taskId, deleteTodoTaskRequest, deleteTodoTaskHeaders, new RuntimeOptions());
        } catch (TeaException err) {
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
                log.error("删除任务出错", err);
            }
        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
                log.error("删除任务出错", err);
            }
        }
    }
非常好,现在我将为你梳理这份完整的《模块化后台管理脚手架项目开发蓝图》。它不仅仅是一个项目,更是一套工程方法论和可复用的技术资产。 🎯 项目终极定位与核心价值 你将要构建的不是“另一个管理系统”,而是一个 “管理系统生成器”。 · 直接产物:一个具备完整权限、可实际运行的“校园博客”或“电子书借阅”系统。 · 核心资产:一套清晰、模块化、高复用的后台开发脚手架。未来开发任何新系统(如宿舍、订餐系统),复用率可达80%以上。 --- 🏗️ 架构总览:分层与模块化设计 项目的成功关键在于清晰的边界。整个架构分为四个层次,下图清晰地展示了各层级的依赖关系和核心职责: ```mermaid flowchart TD subgraph A[“核心框架层 (Foundation)”] direction LR A1[“module-core<br>技术基座与规范”] A2[“module-system<br>通用后台业务功能”] end subgraph B[“业务实现层 (Plugins)”] direction LR B1[“module-blog<br>校园博客模块”] B2[“module-book<br>电子书借阅模块”] B3[“未来其他模块...”] end subgraph C[“展现层 (Frontend)”] C1[“admin-ui<br>统一管理后台前端”] end subgraph D[“部署层 (Delivery)”] D1[“Docker容器化封装”] end A1 --> A2 A2 --> B1 & B2 & B3 A & B -- “提供HTTP API--> C A & B & C -- “打包为镜像” --> D ``` --- ⚙️ 技术栈选型与理由 层级 技术选型 核心理由与项目中的作用 后端框架 Spring Boot 3.x + Java 17 企业级开发事实标准,提供自动配置、内嵌容器,项目基石。 安全与权限 Spring Security 6 + JWT 实现安全的认证授权,是RBAC权限模型的支柱,保障系统安全。 数据持久层 MyBatis-Plus + MySQL 8 MyBatis-Plus极大简化单表CRUD,提高开发效率,让你聚焦业务逻辑。 缓存 Redis 用作缓存(热点数据)和分布式会话存储,提升系统性能的必备中间件。 前端框架 Vue 3 + TypeScript + Element Plus 渐进式框架,组合灵活;Element Plus专为后台设计,组件丰富,开发高效。 API与构建 SpringDoc OpenAPI 3, Maven 自动生成交互式API文档,便于前后端协作;Maven管理项目依赖与构建。 部署与容器化 Docker + Docker Compose 实现环境标准化与一键部署,是项目可交付、可演示的关键,也是重要技术亮点。 --- 📁 模块与代码结构详解 ``` backend/ # 后端主目录 ├── module-core/ # 【核心】所有模块的技术基石 │ ├── common/ # 通用定义 │ │ ├── Result.java # 统一API响应封装 │ │ └── BusinessException.java # 全局业务异常定义 │ ├── config/ # 全局配置(数据源、Redis、MP分页等) │ ├── utils/ # 工具类(安全、字符串、Spring上下文等) │ └── aspect/ # 系统切面(如操作日志@Log注解) ├── module-system/ # 【核心】所有系统的通用业务功能 │ ├── model/entity/ # 实体类:SysUser, SysRole, SysMenu │ ├── mapper/ # 数据访问层 │ ├── service/ # 业务逻辑层 │ └── controller/ # 控制层:用户、角色、菜单管理API ├── module-blog/ # 【可插拔】校园博客业务模块 │ ├── entity/ # 文章(Article)、分类(Category)、评论(Comment) │ ├── mapper/ │ ├── service/ │ └── controller/ # 博客相关API ├── module-book/ # 【可插拔】电子书借阅业务模块 │ ├── entity/ # 图书(Book)、借阅记录(BorrowRecord) │ ├── mapper/ │ ├── service/ # 核心借阅、归还、逾期计算逻辑 │ └── controller/ └── app/ # 【主入口】Spring Boot启动模块 └── Application.java # 主启动类,聚合所有模块 ``` --- 🗓️ 十周开发路线图与核心任务 第一阶段:筑基 (第1-2周) - 搭建“生产线” · 目标:创建可运行的多模块工程,打通安全认证。 · 核心任务: 1. 使用Maven创建父工程及所有子模块 (module-core, module-system, module-blog, app)。 2. 集成MySQL、MyBatis-Plus,创建sys_user表,实现最基本的CRUD。 3. 核心难点攻克:集成Spring Security + JWT,实现登录接口并返回令牌。 第二阶段:立梁 (第3-4周) - 打造“通用后台” · 目标:完成RBAC权限系统,这是框架的灵魂。 · 核心任务: 1. 设计并创建RBAC相关表 (sys_role, sys_menu, sys_user_role, sys_role_menu)。 2. 开发module-system中角色、菜单的完整管理接口。 3. 在Spring Security中实现动态的URL权限控制 (@PreAuthorize)。 第三阶段:砌墙 (第5-7周) - 验证“生产线” · 目标:开发第一个完整业务模块,验证框架的可用性。 · 核心任务(以博客模块为例): 1. 在module-blog中创建文章、分类、评论的实体和Mapper。 2. 实现文章的增删改查、发布状态管理、评论功能。 3. 集成富文本编辑器(如Vditor)。 4. 并行任务:开始搭建Vue前端项目,实现登录页和基础布局,对接后端菜单接口。 第四阶段:扩展与精装 (第8-9周) - 增强与完善 · 目标:开发第二个模块,并集成高级特性。 · 核心任务: 1. 参照博客模块,开发 module-book(电子书借阅)。重点设计借阅状态流转和逾期计算逻辑。 2. 在module-core中实现操作日志AOP切面。 3. 集成Redis,缓存热点文章或图书信息。 4. 前端完成两个业务模块的所有管理页面。 第五阶段:交付 (第10周) - 打包与展示 · 目标:让项目能一键运行,准备答辩。 · 核心任务: 1. 为每个服务编写Dockerfile,用docker-compose.yml编排所有容器(App + MySQL + Redis + Nginx)。 2. 使用SpringDoc生成完整的API文档。 3. 进行测试,整理项目文档、数据库设计文档和答辩PPT。 --- ✅ 项目完成后,你将获得什么? 1. 一个可运行的完整项目:包含两个业务模块的、带权限的管理系统。 2. 一套高复用脚手架:未来可在2-3天内基于此框架开发出新的管理系统。 3. 一份硬核技术作品集:这是你面试时最能体现工程能力和架构思维的项目。 4. 系统的全栈能力:从数据库设计、后端开发、前端交互到容器化部署的完整闭环经验。 🚀 立即可以开始的第一步 不要被漫长的路线图吓到,伟大的项目始于简单的第一步。 1. 打开IDE,创建一个空的Maven项目作为父工程。 2. 在父工程下,创建第一个子模块:module-core。 3. 在module-core的pom.xml中添加Spring Boot基础依赖,然后创建Result.java这个类。 当你完成这一步,项目的第一个零件就诞生了。 如果在创建多模块工程时遇到任何问题(如依赖无法继承),随时可以带着你的 pom.xml 文件来问我。 你已经从“寻找捷径”走到了“选择正确但更具挑战的道路”上,这是成为优秀开发者的最关键一步。祝你启动顺利!
最新发布
12-11
### 如何将Flowable钉钉集成 #### 流程转换函数实现 为了使Flowable能够处理来自钉钉的设计模型并将其转化为可执行的工作流,可以采用JavaScript编写一个用于转换的前端方法。此方法接收由钉钉提供的流程模型作为输入参数,并通过调用`ddToBpmnXml`函数来获取对应的BPMN XML字符串表示形式[^2]。 ```javascript const converterBpmn = () => { const processModel = { code: pCode.value, name: pName.value, icon: {name: 'el:HomeFilled', color: '#409EFF'}, process: props.process, enable: true, version: 1, sort: 0, groupId: '', remark: '' }; ddToBpmnXml(processModel).then(res => { console.log("ddToBpmnXml res", res); processView.title = pName.value; processView.index = pCode.value; processView.xmlData = res.result; processView.open = true; }); }; ``` 上述代码片段展示了如何构建一个过程对象并将之传递给`ddToBpmnXml`异步函数以获得XML数据的结果。一旦成功解析返回的数据,则更新视图组件的状态以便显示新创建或修改后的业务流程定义。 #### 工作流管理平台的选择 对于希望简化这一集成工作的开发者来说,可以选择已经集成了Flowable并与Vue框架兼容的应用程序模板,比如RuoYi-flowable或是更为先进的KonBAI/RuoYi-Flowable-Plus版本。后者不仅提供在线表单设计功能还增强了工作流设计器的功能性,使得用户无需离开浏览器即可完成复杂的流程建模操作[^1]。 #### 开发实践指导 初次接触此类技术栈的人士建议先尝试一些基本的例子去掌握Flowable的基础特性以及它同其他前后端组件之间的交互方式;而对于那些计划针对具体应用场景做定制化开发的人来说,则应该重点研究BPMN 2.0标准及其语法结构,因为这是理解和操纵任何基于Flowable系统的基石所在。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生05101

flowable

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值