5、钉钉平台

文章目录

应用管理

钉钉端开发小程序/微应用,实现钉钉与LCP平台的深度集成

运行环境

当前存在两套钉钉环境

环境名称适用范围描述备注
风神测试DEV/SIT包含全套组织架构,包含信息技术部员工,少量其它部门参与测试的员工可将公司员工手机号作替换,实现无工号人员正常使用本环境
风神物流UAT/PROD包含全套组织架构,包含公司所有员工,外部员工

应用类型

钉钉开放平台支持小程序和H5微应用两种类型的应用开发。

  • 小程序是指使用钉钉自有语法,使用专用工具开发移动端应用。小程序暂不支持PC端部署。
  • 微应用是指传统的H5方式开发的移动端应用。
  • 原则上选择微应用,即H5原生开发。自行展开H5开发具备最大的开发灵活性。
对比项小程序微应用
加载性能首次使用略慢,后续加载快受到很多因素影响,优化不够好,容易慢
使用体验非常顺滑,接近 Native容易卡顿
页面跳转,返回和 Native 的效果一样做不到和 Native 一样的体验
开发环境搭建提供 IDE,快速创建项目成本高
调试提供 IDE,可以在电脑上调试大部分功能在电脑上只能调 UI,涉及到钉钉的 jsapi,必须真机调试
使用开源 UI 组件目前不支持支持
使用 npm 包支持支持
模块化组织代码支持 小程序 特有的模块化使用 vue, React 等框架可以轻松获得模块化支持
灰度发布钉钉提供需要自己实现
CDN小程序包默认在CDN需要开发者自己购买相关服务
开发个人应用支持不支持
应用离线化支持不支持

编程模式

当前存在两套编程模式

名称运行环境用途调用方式
前端API钉钉客户端从客户端发出对钉钉服务器的各类请求,构建客户端界面,调用设备API小程序API,在钉钉iOS客户端、Android客户端均可正常使 \ H5微应用API,使用script标签引入JSAPI,不同的方法有不同的使用范围(Android,IOS,PC)
服务端API后台环境从服务端后台发出对钉钉服务器的各类请求,同步应用数据,实现后台管理等支持Java,PHP,.Net,Python后台运行环境。

前端API

容器弹窗摇一摇设备日期&月历
导航栏UI控件获取免登授权码扫码存储
地图业务文件图片打开新页面
电话发钉通讯录选人外部联系人自定义联系人
会话钉盘音频接口支付数据加解密
旋转屏幕统一跳转协议页面事件监听

后台API

身份验证通讯录管理消息通知智能工作流考勤
智能人事日志Ding日程签到公告
钉钉运动应用管理群机器人文件存储业务事件回调

风神工作台

在每个人的钉钉工作台,显示 风神工作台 应用图标

  • 在PC端点击后,免密进入PC端统一门户页面
  • 手机端点击后,免密进入移动端待办面板页面

在这里插入图片描述

进入钉钉工作台管理后台,创建微应用。选择企业内部自主开发,开发模式选择开发应用,开发应用类型选择微应用,录入名称与Logo,应用首页链接输入移动端待办面板页面链接,PC端首页地址输入PC端统一门户页面,最后录入服务器出口IP,之后发布至所有用户即可。
在这里插入图片描述

默认情况下,新加入的应用显示在钉钉工作台最下端。管理员可通过移动端管理工作台功能,调整显示分组与顺序。
在这里插入图片描述

基础应用信息

属性描述
应用名称应用的名字
应用类型开发应用-微应用:微应用开发类型 \ 开发应用-小程序:小程序开发类型 \ 快捷链接:仅作地址跳转
应用logo应用的图标
应用简介应用的简单描述
应用首页地址用户在手机端钉钉工作台上打开这个应用并显示该链接内容。
PC端管理地址用户在PC版钉钉工作台上打开这个应用并显示该链接内容。
可使用范围能够使用本应用的员工范围
AgentId在创建应用时,系统会自动生成一个AgentId,可用于发送企业会话消息等场景。
服务器出口IP为支撑前端应用而布署的服务器授予访问权限
AppKey在创建应用时,系统会自动分配一对AppKey和AppSecret,该AppKey是应用开发过程中的唯一性标识。
AppSecretAppSecret和上面AppKey一同生成,使用AppKey和AppSecret来换取access_token。

不同环境,出口IP与各页面地址配置如下。内网需要同步作Nginx配置,将外网域名请求转发到正确的内网服务器端口上

环境出口IP应用首页链接PC端首页地址
DEV219.135.191.*,218.107.3.*https://dingtest.fslgz.com/自定义路径https://dingtest.fslgz.com/自定义路径
SIT219.135.191.*,218.107.3.*https://dingtest.fslgz.com/portal/activiti/system_task_collect.htmlhttps://dingtest.fslgz.com/portal/
UAT58.248.166.*,14.23.175.*https://app-uat.fslgz.com/portal/activiti/system_task_collect.htmlhttps://app-uat.fslgz.com/portal/
PROD58.248.166.*,14.23.175.*https://app.fslgz.com/portal/activiti/system_task_collect.htmlhttps://app.fslgz.com/portal/

接口权限

后台服务端向钉钉服务器请求数据的接口权限

名称描述默认状态
基础权限
身份验证获取员工的基本信息,用于登录系统/应用
消息通知获取企业的消息通道给企业及员工发送消息
高级权限-企业通讯录
通讯录只读权限获取企业员工通讯录数据的权限
通讯录编辑权限获取企业员工通讯录数据、新增、删除、修改企业通讯录的权限
手机号码信息获取授权范围内的成员手机号码信息
邮箱等个人信息获取授权范围内的成员信息(如邮箱、工作地点、扩展字段等)
未登录员工列表企业使用此接口可查询指定日期内未登录钉钉的企业员工列表
手机号获取userid通过手机号获取其所对应员工的userid
高级权限-微应用
钉盘获取钉盘文件的存储、删除、更新的权限
签到获取企业员工签到数据的权限
考勤获取企业员工考勤数据的权限
审批获取企业人员审批数据、发起审批的权限
日志获取企业员工日志数据的权限
公告获取企业员工公告数据的权限
钉钉运动获取企业员工运动数据的权限
智能人事获取企业员工智能人事数据的权限
企业会话获取、管理企业会话数据的权限
DING日程管理钉钉日程数据权限

应用发布

发布后,该应用将会出现在钉钉的工作台上,企业组织内部的用户将会看到该应用。

名称描述
全部员工组织内所有员工都可使用
部份员工选定范围内的员工才能使用,可按部门或人员选择
仅限管理员仅管理员才能使用

钉钉集成

将钉钉SDK集成至本平台,简化钉钉对接难度

参数设置

# 消息通知相关,当前系统的路径
sys.webroot.url=https://dingtest.fslgz.com/portal

# 钉钉配置
dingtalk.corp.id=ding6b6ffebcd75ef63335c2f4657eb6378f
dingtalk.app.key=dinggkwxz61kgu7vvw8a
dingtalk.app.secret=VnA-wL-bqviMkIsw_Qn81TqH-Q7fqzCchOglmBjplbjeBZvdzH5MZ8e66vDNefo-
dingtalk.default.agentid=280426666

当项目不作修改时,平台内置的默认参数来源如下

环境名称应用名称
DEV风神工作台SIT
SIT风神工作台SIT
UAT风神工作台UAT
PROD风神工作台

钉钉接口

com.fsl.lcp.dingding.service.IDingDingService:提供调用钉钉服务的服务端接口

方法参数说明
身份方法
String getAccessToken()获取access_token,默认过期时间为6900秒。一般情况下,使用者不需使用此方法。LCP钉钉接口所有方法均实现了access_token的自动刷新
String getJsTicket()获取js_ticket,默认过期时间为6900秒。一般情况下,使用者不需使用此方法。LCP钉钉接口所有方法均实现了js_ticket的自动刷新
JsApiSignatureVo getJsApiSignature(JsApiSignatureVo apiSignatureVo)JsApiSignatureVo:签名参数。包含使用票据,随机字符串,时间戳,页面地址生成本页面唯一的签名,并返回本次使用的企业Id,应用Id,随机字符串,时间戳,页面地址,签名
阿里服务调用
T execute(String serviceUrl, TaobaoRequest request)serviceUrl:服务地址 \ request:请求参数调用钉钉接口获取返回值。有四个方法重载
消息推送
OapiMessageCorpconversationAsyncsendV2Response sendWorkMsg(NotifyMessageRecord messageRecord)messageRecord:钉钉消息发送钉钉工作通知,如果messageRecord对象eUrl为空,则发送markdown消息,否则为卡片消息
void sendWorkMsgAsync(NotifyMessageRecord messageRecord)messageRecord:钉钉消息异步发送钉钉工作通知
ResponseData recallTodoAndCopyNotify(Long agentId, Long notifyTaskId)agentId:应用Id \ notifyTaskId:钉钉工作通知Id撤回工作通知消息.
void sendWebHookMsg(NotifyMessageRecord messageRecord)messageRecord:钉钉消息发送钉钉webHook消息(群机器人消息)
void sendWebHookMsgAsync(NotifyMessageRecord messageRecord)messageRecord:钉钉消息用异步,多线程方式发送钉钉webHook消息(群机器人消息)
工作流调度
String createProcessTemplate(Long agentId)agentId:应用ID创建钉钉智能工作流模板
ResponseData createProcessInstance(DdProcessInst processInst, boolean saveData)processInst:钉钉流程实例 \ saveData:是否保存钉钉流程数据创建钉钉智能工作流实例
ResponseData updateProcessInstance(DdProcessInst processInst, boolean saveData)processInst:钉钉流程实例 \ saveData:是否保存钉钉流程数据更新钉钉智能工作流实例
ResponseData createProcessTask(DdProcessTask processTask, boolean saveData)processTask:钉钉任务实例 \ saveData:是否保存钉钉任务数据创建钉钉工作流待办任务.
ResponseData updateProcessTask(DdProcessTask processTask, boolean saveData)processTask:钉钉任务实例 \ saveData:是否保存钉钉任务数据更新钉钉工作流待办任务.
void updateProcessCopyTask(DdProcessTask processTask, boolean saveData)processTask:钉钉任务实例 \ saveData:是否保存钉钉任务数据更新钉钉工作流抄送类型的待办任务.
OapiProcessWorkrecordTaskQueryResponse.PageResult queryDdProcessTaskList(String employeeCode, Long offset, Long count, Long status)employeeCode:工号 \ offset:页码 \ count:每页数量 \ status:待办类型。0表示待处理,-1表示已经移除查询钉钉工作流待办任务列表
void recallTodoAndNotify(String employeeCode, String taskId)employeeCode:工号 \ taskId:钉钉任务实例Id撤回当前用户和taskId匹配的数据的待办通知消息和钉钉待办列表
void recallCopyAndNotify(String employeeCode, String processInstanceId)employeeCode:工号 \ processInstanceId:钉钉流程实例Id撤回当前用户和taskId匹配的数据的待办通知消息和钉钉待办列表.
信息查询
OapiUserGetResponse queryUserInfo(String userId)userId:钉钉 user_id基于钉钉 user_id查询钉钉用户信息
List queryAllDdDeptRelation()查询所有钉钉部门关联信息
List queryDdDeptRelationList(DdDeptRelation ddDeptRelation, int page, int pageSize)ddDeptRelation:钉钉部门关联表查询条件 \ page:当前页数 \ pageSize:每页行数分页查询钉钉部门关联信息
DdDeptRelation queryDdDeptRelation(DdDeptRelation ddDeptRelation)ddDeptRelation:钉钉部门关联表查询条件查询单个钉钉部门关联信息
List getFunctionByEmployeeCode(String empCode, String eid)empCode:员工编码 \ eid:功能模块编码基于模块编码与员工编码查询功能清单

地址常量

com.fsl.lcp.dingding.constant.UrlConstant:封装常用的钉钉服务地址信息

接口名称接口地址
获取access_tokenGET_TOKENhttps://oapi.dingtalk.com/gettoken
获取用户详情(GET)USER_GEThttps://oapi.dingtalk.com/user/get
通过免登授权码和 access_token 获取用户的 userid(GET)USER_GET_USERINFOhttps://oapi.dingtalk.com/user/getuserinfo
获取部门用户userid列表(GET)USER_GET_DEPT_MEMBERhttps://oapi.dingtalk.com/user/getDeptMember
获取部门用户(GET)USER_SIMPLE_LISThttps://oapi.dingtalk.com/user/simplelist
获取部门用户详情(GET)USER_LIST_BY_PAGEhttps://oapi.dingtalk.com/user/listbypage
获取管理员列表(GET)USER_GET_ADMINhttps://oapi.dingtalk.com/user/get_admin
获取管理员通讯录权限范围(GET)USER_GET_ADMIN_SCOPEhttps://oapi.dingtalk.com/topapi/user/get_admin_scope
根据unionid获取userid(GET)USER_GET_BY_UNIONIDhttps://oapi.dingtalk.com/user/getUseridByUnionid
创建用户(POST)USER_CREATEhttps://oapi.dingtalk.com/user/create
更新用户(POST)USER_UPDATEhttps://oapi.dingtalk.com/user/update
删除用户(GET)USER_DELETEhttps://oapi.dingtalk.com/user/delete
获取子部门ID列表(GET)DEPARTMENT_LIST_IDShttps://oapi.dingtalk.com/department/list_ids
获取部门列表(GET)DEPARTMENT_LISThttps://oapi.dingtalk.com/department/list
获取部门详情(GET)DEPARTMENT_GEThttps://oapi.dingtalk.com/department/get
查询部门的所有上级父部门路径(GET)DEPARTMENT_LIST_PARENT_BYhttps://oapi.dingtalk.com/department/list_parent_depts_by_dept
查询指定用户的所有上级父部门路径(GET)DEPARTMENT_LIST_PARENThttps://oapi.dingtalk.com/department/list_parent_depts
获取企业员工人数(GET)USER_GET_COUNThttps://oapi.dingtalk.com/user/get_org_user_count
创建部门(POST)DEPARTMENT_CREATEhttps://oapi.dingtalk.com/department/create
更新部门(POST)DEPARTMENT_UPDATEhttps://oapi.dingtalk.com/department/update
删除部门(GET)DEPARTMENT_DELETEhttps://oapi.dingtalk.com/department/delete
获取角色下的员工列表(POST)ROLE_SIMPLE_LISThttps://oapi.dingtalk.com/topapi/role/simplelist
发送工作通知消息(POST)MESSAGE_CORPCONVERSATIONhttps://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2
发起待办(POST)WORKRECORD_ADDhttps://oapi.dingtalk.com/topapi/workrecord/add
更新待办(POST)WORKRECORD_UPDATEhttps://oapi.dingtalk.com/topapi/workrecord/update
获取用户待办事项(POST)WORKRECORD_GET_BY_USERhttps://oapi.dingtalk.com/topapi/workrecord/getbyuserid
上传媒体文件(POST)MEDIA_UPLOADhttps://oapi.dingtalk.com/media/upload
单步文件上传(POST)FIEL_UPLOAD_SINGLEhttps://oapi.dingtalk.com/file/upload/single
分块上传文件-开启/提交分块上传事务(POST)FIEL_UPLOAD_TRANSACTIONhttps://oapi.dingtalk.com/file/upload/transaction
分块上传文件-上传文件块(POST)FIEL_UPLOAD_CHUNKhttps://oapi.dingtalk.com/file/upload/chunk
注册业务事件回调接口(POST)CALL_BACK_REGISTERhttps://oapi.dingtalk.com/call_back/register_call_back
查询事件回调接口(POST)CALL_BACK_GEThttps://oapi.dingtalk.com/call_back/get_call_back
更新事件回调接口(POST)CALL_BACK_UPDATEhttps://oapi.dingtalk.com/call_back/update_call_back
删除事件回调接口(GET)CALL_BACK_DELETEhttps://oapi.dingtalk.com/call_back/delete_call_back
获取回调失败的结果(GET)CALL_BACK_GET_FAILED_RESULThttps://oapi.dingtalk.com/call_back/get_call_back_failed_result
签到事件回调类型CALL_BACK_EVENT_CHECK_INcheck_in
企业考勤排班详情(POST)ATTENDANCE_LIST_SCHEDULEhttps://oapi.dingtalk.com/topapi/attendance/listschedule
企业考勤组详情(POST)ATTENDANCE_GET_SIMPLEGROUPhttps://oapi.dingtalk.com/topapi/attendance/getsimplegroups
获取打卡详情(POST)ATTENDANCE_LIST_RECORDhttps://oapi.dingtalk.com/attendance/listRecord
获取打卡结果(POST)ATTENDANCE_LISThttps://oapi.dingtalk.com/attendance/list
获取请假时长(POST)ATTENDANCE_GET_LEAVEDURATIONhttps://oapi.dingtalk.com/topapi/attendance/getleaveapproveduration
查询请假状态(POST)ATTENDANCE_GET_LEAVESTATUShttps://oapi.dingtalk.com/topapi/attendance/getleavestatus
获取用户考勤组(POST)ATTENDANCE_GET_USERGROUPhttps://oapi.dingtalk.com/topapi/attendance/getusergroup
获取部门用户签到记录(GET)CHECKIN_RECORDhttps://oapi.dingtalk.com/checkin/record
获取用户签到记录(POST)CHECKIN_RECORD_GEThttps://oapi.dingtalk.com/topapi/checkin/record/get

钉钉集成登录

对于引用了移动端头页面 mobile_header.html 的页面,如果当前是钉钉执行环境且当前用户未登录系统,平台将使用钉钉提供的免登接口通过两次ajax请求自动完成系统登录。不再有使用cas登录时的页面三次跳转,首次使用体验大幅提升。

首先,在 applicationContext-security.xml 文件中,启用钉钉集成。可以看到,非钉钉环境依然延用cas登录

<!-- 根据项目需求选择登录方式:标准,CAS,钉钉CAS联合 -->
<beans:import resource="ddAndCasSecurity.xml"/>
<!-- <beans:import resource="casSecurity.xml"/> -->
<!-- <beans:import resource="standardSecurity.xml"/> -->

然后,尽可能将页面初始化代码都放到Lcp.ready方法里。页面所有对后台接口的调用,都必须在Lcp.ready里、或之后执行。Lcp.ready函数保证了代码执行顺序,其一定会在(mui完成初始化、dd完成初始化、页面完成登录)这三者之后执行。建议使用Lcp.ready替代mui.ready或dd.ready。

var viewM = null;
Lcp.ready(function () {
	viewM = new Vue({
		el: '#mui-content',
		methods: {
			pickEmployee: function () {
				dd.biz.util.openLink({
					url: document.location.origin + '${base.contextPath}/hr/mb_employee_picker.html?multiSelect=false'
				});
			}
		}
	});
});

如果存在需要鉴权才使用的api,可以使用Lcp.ddConfig函数。建议Lcp.ddConfig在Lcp.ready之外调用。示例如下:

Lcp.ddConfig({
	jsApiList: [
		'runtime.info',
		'biz.contact.choose',
		'device.notification.confirm',
		'device.notification.alert',
		'device.notification.prompt',
		'biz.ding.post',
		'biz.util.openLink',
		'biz.util.scanCard',
		'device.geolocation.get',
	]
})
Lcp.ready(function() {
	...
)}

钉钉事件回调

当在钉钉上做指定操作时,钉钉会将相关事件主动推送至指定RESTFul接口,实现事件通知。

接口注册

向钉钉服务器指定地址发起请求,将回调URL作为参数告知钉钉(注册回调接口)。钉钉服务器会立刻向回调URL发起【测试回调URL】事件,来验证URL的合法性,回调URL服务器需要在接收到回调之后返回字符串“success”的加密json数据,才能完成注册。
在这里插入图片描述

通讯录事件回调

事件类型类别说明
user_add_org用户变更通讯录用户增加
user_modify_org用户变更通讯录用户更改
user_leave_org用户变更通讯录用户离职
user_active_org用户变更加入企业后用户激活
org_admin_add用户变更通讯录用户被设为管理员
org_admin_remove用户变更通讯录用户被取消设置管理员
org_dept_create部门变更通讯录企业部门创建
org_dept_modify部门变更通讯录企业部门修改
org_dept_remove部门变更通讯录企业部门删除
org_remove企业信息变更企业被解散
org_change企业信息变更企业信息发生变更
label_user_change角色变更员工角色信息发生变更
label_conf_add角色变更增加角色或者角色组
label_conf_del角色变更删除角色或者角色组
label_conf_modify角色变更修改角色或者角色组

群会话事件回调

事件类型说明
chat_add_member群会话添加人员
chat_remove_member群会话删除人员
chat_quit群会话用户主动退群
chat_update_owner群会话更换群主
chat_update_title群会话更换群名称
chat_disband群会话解散群

签到事件回调

事件类型说明
check_in用户签到

审批事件回调

事件类型说明
bpms_instance_change审批实例开始,结束
bpms_task_change审批任务开始,结束,转交

日志管理

通过 IDingDingService.execute 方法调用接口,系统会自动记录接口调用日志,方便问题查看和调试。

mber|群会话删除人员|
|chat_quit|群会话用户主动退群|
|chat_update_owner|群会话更换群主|
|chat_update_title|群会话更换群名称|
|chat_disband|群会话解散群|

签到事件回调

事件类型说明
check_in用户签到

审批事件回调

事件类型说明
bpms_instance_change审批实例开始,结束
bpms_task_change审批任务开始,结束,转交

日志管理

通过 IDingDingService.execute 方法调用接口,系统会自动记录接口调用日志,方便问题查看和调试。
在这里插入图片描述


版权声明:本文为jactionlaw原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。