查看: 6449|回复: 9

O2OA政务钉钉集成,人员同步,组织同步,单点登录(免登),待办待阅消息推送.

升级   100%

138

主题

1万

回帖

3万

积分

超级版主

Rank: 8Rank: 8

积分
37249
发表于 2018-7-31 15:20:13 | 显示全部楼层 |阅读模式
实现与政务钉钉的人员集成,待办推送以及单点登录.
将次配置文件由模版路径拷贝到config目录下.
配置文件名: zhengwuDingding.json
模版路径:o2server/config/sample/zhengwuDingding.json
工作路径:o2server/config/zhengwuDingding.json
{
  "appId": "",
  "appSecret": "",
  "agentId":"",
  "syncOrganizationDirection": "disabe",
  "syncOrganizationCallbackAddress": "http://127.0.0.1:20030/x_program_center/jaxrs/zhengwudingding/sync/organization/callback",
  "pullCron": "10 0/5 * * * ?",
  "forcePullCron": "10 45 12,18 * * ?",
  "oapiAddress": "https://oapi.dingtalk.com",
  "corpId": "",
  "corpSecret": "",
  "titleSplit": [
    ",",
    "、",
    ",",
    " ",
    " "
  ],
  "personAttributeTitleName": "职务",
  "nonce": "o2oa",
  "taskToMessage": true,
  "taskCompletedToMessage": true,
  "readToMessage": true,
  "readCompletedToMessage": true
}appId:String 政务钉钉id
appSecret:String 政务钉钉密钥
agentId:应用id
syncOrganizationDirection:String人员同步方向,pull,push,disable
syncOrganizationCallbackAddress:String 政务钉钉人员修改回调地址 http://127.0.0.1:20030/x_program_center/jaxrs/zhengwudingding/sync/organization/callback"
pullCron:String 拉入同步定时cron表达式
forcePullCron:String 强制拉入同步cron表达式
oapiAddress:String 政务钉钉api服务器地址
corpId:String 钉钉企业id  
corpSecret:String 钉钉企业密钥
titleSplit:[String] 职务分隔符
personAttrubteTitleName:String 政务钉钉职务同步到个人属性名
nonce:String 单点登录(免登)使用的噪音字串
taskToMessage:Boolean 待办推送到政务钉钉消息
taskCompletedToMessage:Boolean 已办推送到政务钉钉消息
readToMessage:Boolean 待阅推送到政务钉钉消息
readCompletedToMessage:Boolean 已阅推送到政务钉钉消息
钉钉消息推送脚本:
/********************
resources.getEntityManagerContainer(); //实体管理器
resources.getContext(); //上下文根
resources.getOrganization(); //组织访问
resources.getWebservicesClient();//webSerivces客户端
********************/
var type = 'zhengwuDingdingMessage';
var resp = resources.getContext().applications().getQuery(com.x.base.core.project.x_message_assemble_communicate.class,
        'consume/list/' + type + '/count/100');
var messages = resp.getDataAsList(com.x.message.core.entity.Message.class);
for (var i in messages) {
    var message = messages[i];
    switch (message.getType()) {
    case 'task_create':
        if (com.x.base.core.project.config.Config.zhengwuDingding().getTaskToMessage()) {
            var person = resources.getOrganization().person().getObject(message.getPerson());
            var body = JSON.parse(message.getBody());
            if (body) {
                if (person) {
                    if (person.getZhengwuDingdingId()) {
                        var txt = '您有新的待办需要处理:' + body['title'] + '.';
                        send('184707353', person.getZhengwuDingdingId(), txt);
                        print('发送政务钉钉待办消息,通知对象: ' + message.getPerson() + '(' + person.getZhengwuDingdingId() + '), 消息:' + txt + '.');
                    } else {
                        print('发送政务钉钉待办消息失败,通知对象' + message.getPerson() + ' 无法获取政务钉钉id.');
                    }
                } else {
                    print('发送政务钉钉待办消息失败,通知对象' + message.getPerson() + ' 不存在.');
                }
            } else {
                print('发送政务钉钉待办消息失败,通知对象' + message.getPerson() + ' 无法获取消息对象.');
            }
        }
        break;
    case 'taskCompleted_create':
        if (com.x.base.core.project.config.Config.zhengwuDingding().getTaskCompletedToMessage()) {
            var person = resources.getOrganization().person().getObject(message.getPerson());
            var body = JSON.parse(message.getBody());
            if (body) {
                if (person) {
                    if (person.getZhengwuDingdingId()) {
                        var txt = '您的待办已经处理完成:' + body['title'] + '.';
                        send('184707353', person.getZhengwuDingdingId(), txt);
                        print('发送政务钉钉已办消息,通知对象: ' + message.getPerson() + '(' + person.getZhengwuDingdingId() + '), 消息:' + txt + '.');
                    } else {
                        print('发送政务钉钉已办消息失败,通知对象' + message.getPerson() + ' 无法获取政务钉钉id.');
                    }
                } else {
                    print('发送政务钉钉已办消息失败,通知对象' + message.getPerson() + ' 不存在.');
                }
            } else {
                print('发送政务钉钉待办消息失败,通知对象' + message.getPerson() + ' 无法获取消息对象.');
            }
        }
        break;
    case 'read_create':
        if (com.x.base.core.project.config.Config.zhengwuDingding().getReadToMessage()) {
            var person = resources.getOrganization().person().getObject(message.getPerson());
            var body = JSON.parse(message.getBody());
            if (body) {
                if (person) {
                    if (person.getZhengwuDingdingId()) {
                        var txt = '您有新的待阅需要处理:' + body['title'] + '.';
                        send('184707353', person.getZhengwuDingdingId(), txt);
                        print('发送政务钉钉待阅消息,通知对象: ' + message.getPerson() + '(' + person.getZhengwuDingdingId() + '), 消息:' + txt + '.');
                    } else {
                        print('发送政务钉钉待阅消息失败,通知对象' + message.getPerson() + ' 无法获取政务钉钉id.');
                    }
                } else {
                    print('发送政务钉钉待阅消息失败,通知对象' + message.getPerson() + ' 不存在.');
                }
            } else {
                print('发送政务钉钉待办消息失败,通知对象' + message.getPerson() + ' 无法获取消息对象.');
            }
        }
        break;
    case 'readCompleted_create':
        if (com.x.base.core.project.config.Config.zhengwuDingding().getReadCompletedToMessage()) {
            var person = resources.getOrganization().person().getObject(message.getPerson());
            var body = JSON.parse(message.getBody());
            if (body) {
                if (person) {
                    if (person.getZhengwuDingdingId()) {
                        var txt = '您的待阅已经处理完成:' + body['title'] + '.';
                        send('184707353', person.getZhengwuDingdingId(), txt);
                        print('发送政务钉钉已阅消息,通知对象: ' + message.getPerson() + '(' + person.getZhengwuDingdingId() + '), 消息:' + txt + '.');
                    } else {
                        print('发送政务钉钉已阅消息失败,通知对象' + message.getPerson() + ' 无法获取政务钉钉id.');
                    }
                } else {
                    print('发送政务钉钉已阅消息失败,通知对象' + message.getPerson() + ' 不存在.');
                }
            } else {
                print('发送政务钉钉待办消息失败,通知对象' + message.getPerson() + ' 无法获取消息对象.');
            }
        }
        break;
    default:
        system.print('未知的消息类型: ' + message.getType() + ' , title: ' + message.getTitle() + '.');
        break;
    }
    consume(message.getId(), type);
}
function send(agentId, user, message) {
    var body = '{"agentId":"184707353","touser":"' + '10001461928' + '","toparty": "","msgtype":"text","context":"' + message + '"}';
    var address = com.x.base.core.project.config.Config.zhengwuDingding().getOapiAddress() + "/ent_message/send?access_token=" + com.x.base.core.project.config.Config.zhengwuDingding().appAccessToken();
    com.x.base.core.project.connection.HttpConnection.postAsString(address, null, body);
}
function consume(id, type) {
    resources.getContext().applications().getQuery(com.x.base.core.project.x_message_assemble_communicate.class,
        'consume/' + id + '/type/' + type);
}
回复

使用道具 举报

升级   42%

30

主题

80

回帖

326

积分

中级会员

Rank: 3Rank: 3

积分
326
发表于 2019-7-8 10:56:31 | 显示全部楼层
发送钉钉消息失败,错误代码:400002,错误消息:当toAllUser=false时 userIdList和deptIdList不能同时为空.ExceptionClass:         com.x.message.assemble.communicate.ExceptionDingdingMessageLoggerName:         com.x.message.assemble.communicate.DingdingConsumeQueueStackTrace:         com.x.message.assemble.communicate.ExceptionDingdingMessage: 发送钉钉消息失败,错误代码:400002,错误消息:当toAllUser=false时 userIdList和deptIdList不能同时为空.        at com.x.message.assemble.communicate.DingdingConsumeQueue.execute(DingdingConsumeQueue.java:33)        at com.x.message.assemble.communicate.DingdingConsumeQueue.execute(DingdingConsumeQueue.java:1)        at com.x.base.core.project.queue.QueueProcessThread.run(QueueProcessThread.java:17)        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)        at java.lang.Thread.run(Thread.java:748)
回复

使用道具 举报

升级   100%

138

主题

1万

回帖

3万

积分

超级版主

Rank: 8Rank: 8

积分
37249
发表于 2019-2-28 20:57:23 | 显示全部楼层
企业钉钉也支持的。只是脚本会有一些不一样,钉钉接口不一样。
回复

使用道具 举报

升级   82%

5

主题

12

回帖

41

积分

新手上路

Rank: 1

积分
41
发表于 2020-6-20 11:27:29 | 显示全部楼层
你好  能发一下企业钉钉脚本吗?还是说只有买了服务才能用发脚本,我没有再oa的开发文档里面看到脚本信息
回复

使用道具 举报

升级   100%

138

主题

1万

回帖

3万

积分

超级版主

Rank: 8Rank: 8

积分
37249
发表于 2020-6-22 10:26:34 | 显示全部楼层
您好:您说的企业钉钉脚本是什么概念?
回复

使用道具 举报

升级   28%

2

主题

3

回帖

14

积分

新手上路

Rank: 1

积分
14
发表于 2019-7-17 18:21:03 | 显示全部楼层
企业微信能单点登录吗,能收到消息推送吗。
回复

使用道具 举报

升级   37.67%

46

主题

70

回帖

313

积分

中级会员

Rank: 3Rank: 3

积分
313
发表于 2019-10-27 00:47:47 | 显示全部楼层
给android端推送脚本也发下吧,谢谢。
回复

使用道具 举报

升级   3.33%

5

主题

9

回帖

55

积分

注册会员

Rank: 2

积分
55
发表于 2019-2-25 21:28:04 | 显示全部楼层
企业钉钉是否也支持啊?
回复

使用道具 举报

升级   100%

138

主题

1万

回帖

3万

积分

超级版主

Rank: 8Rank: 8

积分
37249
发表于 2019-7-11 16:09:35 | 显示全部楼层
您发送钉钉消息的时候,发送对象是否为空!
回复

使用道具 举报

升级   100%

138

主题

1万

回帖

3万

积分

超级版主

Rank: 8Rank: 8

积分
37249
发表于 2019-10-28 10:43:59 | 显示全部楼层
这个可能需要技术部支援,小小管理员在其他帖子上看到您说你购买了服务,请您有什么需要直接联系您对接的技术人员!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系客服 关注微信 下载APP 返回顶部 返回列表
viewthread