Compare commits

...

7 Commits

@ -1,116 +0,0 @@
package UnitTest;
import com.alibaba.druid.filter.stat.StatFilter;
import com.dsideal.FengHuang.DingTalk.Common;
import com.dsideal.FengHuang.DingTalk.Model;
import com.dsideal.FengHuang.DingTalk.OrgPerson;
import com.dsideal.FengHuang.DingTalk.RolePerson;
import com.dsideal.FengHuang.Util.CommonUtil;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.redis.RedisPlugin;
import java.util.List;
public class TestDingTalk {
public static DruidPlugin createDruidPlugin(String url, String username, String password, String driverClass) {
DruidPlugin druidPlugin = new DruidPlugin(url, username, password, driverClass);
//最大连接池数量
druidPlugin.setMaxActive(20);
//最小连接池数量
druidPlugin.setMinIdle(1);
//初始化时建立物理连接的个数默认为0
druidPlugin.setInitialSize(1);
//获取连接时最大等待时间单位毫秒。配置了maxWait之后缺省启用公平锁并发效率会有所下降如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
druidPlugin.setMaxWait(60000);
//如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。
druidPlugin.setTimeBetweenEvictionRunsMillis(60000);
//连接保持空闲而不被驱逐的最小时间
druidPlugin.setMinEvictableIdleTimeMillis(300000);
//建议配置为true不影响性能并且保证安全性。申请连接的时候检测如果空闲时间大于timeBetweenEvictionRunsMillis执行validationQuery检测连接是否有效。
druidPlugin.setTestWhileIdle(true);
//申请连接时执行validationQuery检测连接是否有效做了这个配置会降低性能。默认为true
druidPlugin.setTestOnBorrow(false);
//归还连接时执行validationQuery检测连接是否有效做了这个配置会降低性能。默认为true
druidPlugin.setTestOnReturn(false);
//数据监控
druidPlugin.addFilter(new StatFilter());
return druidPlugin;
}
public static void main(String[] args_) throws Exception {
PropKit.use("dingtalk.properties");
String corpId = PropKit.get("corpId");
long agentId = PropKit.getLong("agentId");
final String appKey = PropKit.get("appKey");
String appSecret = PropKit.get("appSecret");
DruidPlugin druid = createDruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim(), PropKit.get("driverClassName"));
druid.start();
ActiveRecordPlugin arp = new ActiveRecordPlugin(druid);
arp.setDevMode(false);
arp.setDialect(new MysqlDialect());
arp.start();
// 用于缓存模块的redis服务
RedisPlugin redis = new RedisPlugin("myRedis", PropKit.get("redis_ip"), PropKit.getInt("redis_port"), 10 * 1000);
redis.start();
//accessToken
String accessToken = Common.getAccessToken(appKey, appSecret);
//同步钉钉与云平台中部门信息
String orgName = "长春市东光学校";
Record rOrg = Model.getOrgByOrgName(orgName);
//同步组织机构
OrgPerson.syncOrg(accessToken, rOrg);
//从数据库中获取最新的部门列表(已与钉钉匹配完毕)
Model.fillDeptListByDataBase(rOrg);
//删除所有的组织机构
//OrgPerson.delAllDept(accessToken);
//同步人员
OrgPerson.syncPerson(accessToken, rOrg);
//删除单位下所有人员(开发测试时使用)
// OrgPerson.delBureauPerson(accessToken, rOrg);
//创建角色组【执行一次即可】
//RolePerson.createRoleGroup(accessToken, "义务教育阶段角色组"); ---> 3779920123
//long groupId = 3779920123L;
//获取指定角色组下有哪些角色
//List<Record> list = RolePerson.getRoleList(accessToken, groupId);
//System.out.println(list);
//删除指定角色组下的角色
//RolePerson.delGroupRole(accessToken,groupId);
//同步角色
//RolePerson.syncRole(accessToken, groupId);
//获取钉钉侧指定角色下人员信息
// RolePerson.getRolePersonList(accessToken, 3780868223L, 0);
//
// for (int i = 0; i < RolePerson.rolePersonList.size(); i++) {
// System.out.println(RolePerson.rolePersonList.get(i));
// }
// //获取云平台侧指定角色下人员信息
// List<Record> list2 = Model.getRolePersonReleation();
//尝试同步两个人员信息
CommonUtil.Print("恭喜,所有操作成功完成!");
}
}

@ -0,0 +1,26 @@
package UnitTest;
// 引入需要的类
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import com.aspose.words.*;
import java.io.File;
public class UpdateImage {
public static void main(String[] args) throws Exception {
String MyDir="C:\\Users\\Administrator\\Desktop\\";
Document doc = new Document(MyDir + "看图写话分类别.docx");
NodeCollection shapes = doc.getChildNodes(NodeType.SHAPE, true);
for (Shape shape : (Iterable<Shape>) shapes) {
if (shape.hasImage()) {
// Resize the shape to the desired dimensions
shape.setWidth(180);
shape.setHeight(120);
// Set the layout of the image to "in-line with text" (i.e. "inline")
shape.setWrapType(WrapType.INLINE);
shape.setHorizontalAlignment(HorizontalAlignment.CENTER);
}
}
doc.save("c:\\2.docx");
}
}

@ -0,0 +1,52 @@
package com.dsideal.FengHuang.DingTalk;
import com.dsideal.FengHuang.DingTalk.Util.*;
import com.dsideal.FengHuang.Util.CommonUtil;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.redis.RedisPlugin;
public class Full {
public static void main(String[] args_) throws Exception {
//启动数据库链接
DingTalkCommon.Start();
//accessToken
final String appKey = PropKit.get("appKey");
String appSecret = PropKit.get("appSecret");
String accessToken = DingTalkCommon.getAccessToken(appKey, appSecret);
//同步钉钉与云平台中部门信息
String orgName = "103中学";
Record rOrg = Model.getOrgByOrgName(orgName);
//开发测试时专用,批量删除人员与组织机构
//Model.fillDeptListByDataBase(rOrg);//从数据库中获取最新的部门列表(已与钉钉匹配完毕)
//OrgPerson.delBureauPerson(accessToken,rOrg);
//OrgPerson.delAllDept(accessToken);
//初始化组织机构【需提前手动删除此学校及下属部门】
//OrgPerson.InitOrg(accessToken, rOrg);
//同步人员
//Model.fillDeptListByDataBase(rOrg);//从数据库中获取最新的部门列表(已与钉钉匹配完毕)
//OrgPerson.initPerson(accessToken, rOrg,10);//这里限定了上限人数为10
//初始化角色组
//long groupId = RolePerson.createRoleGroup(accessToken, "义务教育阶段角色组");
//初始化角色
//RolePerson.initRole(accessToken, groupId);
//同步人员角色信息
//RolePerson.initPersonRole(accessToken, rOrg);
CommonUtil.Print("恭喜,所有操作成功完成!");
// 记录全量同步完成时间
Progress.finishInit();
}
}

@ -0,0 +1,36 @@
package com.dsideal.FengHuang.DingTalk;
import com.dsideal.FengHuang.DingTalk.Util.DingTalkCommon;
import com.dsideal.FengHuang.DingTalk.Util.Model;
import com.dsideal.FengHuang.DingTalk.Util.Progress;
import com.dsideal.FengHuang.Util.CommonUtil;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.Record;
public class Increment {
public static void main(String[] args_) throws Exception {
//启动数据库链接
DingTalkCommon.Start();
//accessToken
final String appKey = PropKit.get("appKey");
String appSecret = PropKit.get("appSecret");
String accessToken = DingTalkCommon.getAccessToken(appKey, appSecret);
//同步钉钉与云平台中部门信息
String orgName = "103中学";
Record rOrg = Model.getOrgByOrgName(orgName);
//1、组织机构
Progress.syncOrg(accessToken, rOrg);
//2、人员
Progress.syncPerson(accessToken, rOrg);
//3、人员角色关系
Progress.syncRolePerson(accessToken, rOrg);
CommonUtil.Print("恭喜,所有操作成功完成!");
}
}

@ -1,71 +0,0 @@
package com.dsideal.FengHuang.DingTalk;
import com.jfinal.kit.Kv;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import java.util.List;
public class Model {
public static List<Record> getOrgList(int orgId) {
// 学校及学校下的部门
String sql = "select org_id,org_name,parent_id,sort_id,dingtalk_dept_id from t_base_organization where bureau_id=? and org_id<>bureau_id order by org_id";
List<Record> list = Db.find(sql, orgId);
return list;
}
public static void fillDeptListByDataBase(Record rOrg) {
OrgPerson.deptList.clear();
int bureau_id = rOrg.getInt("org_id");
String sql = "select org_id,org_name,dingtalk_dept_id from t_base_organization where bureau_id=? and b_use=1 order by org_id desc";
List<Record> list = Db.find(sql, bureau_id);
for (int i = 0; i < list.size(); i++) {
Kv kv = Kv.create();
kv.set("dept_id", list.get(i).getLong("dingtalk_dept_id"));
kv.set("name", list.get(i).getStr("org_name"));
OrgPerson.deptList.add(kv);
}
}
public static List<Record> getDeptPerson(int bureau_id) {
String sql = "select t1.person_id,t1.person_name,t2.dingtalk_dept_id,t1.tel from t_base_person as t1 " +
"inner join t_base_organization as t2 on t1.org_id=t2.org_id " +
" where t1.bureau_id=? and t1.b_use=1";
return Db.find(sql, bureau_id);
}
public static void writeDtDeptId(int orgId, String value) {
String sql = "update t_base_organization set dingtalk_dept_id=? where org_id=?";
Db.update(sql, value, orgId);
}
public static long getDtDeptId(int org_id) {
String sql = "select dingtalk_dept_id from t_base_organization where org_id=?";
Record r = Db.findFirst(sql, org_id);
if (r.get("dingtalk_dept_id") == null) return 1;
return r.get("dingtalk_dept_id");
}
public static Record getOrgByOrgName(String org_name) {
String sql = "select org_id,org_name,sort_id,dingtalk_dept_id from t_base_organization where org_name = ?";
return Db.findFirst(sql, org_name);
}
public static List<Record> getRoleList() {
String sql = "select * from t_im_role";
return Db.find(sql);
}
public static void writeDingTalkRoleId(int role_id, long dt_role_id) {
String sql = "update t_im_role set dingtalk_role_id=? where role_id=?";
Db.update(sql, dt_role_id, role_id);
}
// 需要同步哪些人员角色信息
public static List<Record> getRolePersonReleation() {
String sql = "select t1.person_id,t1.role_id,t2.dingtalk_role_id from t_sys_person_role as t1 inner join t_im_role as t2 on t1.role_id=t2.role_id where t1.bureau_id=?";
List<Record> list=Db.find(sql);
return list;
}
}

@ -1,458 +0,0 @@
package com.dsideal.FengHuang.DingTalk;
import cn.binarywang.tools.generator.ChineseMobileNumberGenerator;
import cn.hutool.core.util.PhoneUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenRequest;
import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenResponse;
import com.aliyun.tea.TeaException;
import com.aspose.slides.Collections.ArrayList;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.dsideal.FengHuang.Util.CommonUtil;
import com.jfinal.kit.Kv;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Record;
import com.taobao.api.ApiException;
import java.util.*;
public class OrgPerson {
/**
*
*
* @param access_token
* @throws ApiException
*/
public static long createDept(String access_token, String deptName, long parentId, long orderId, boolean isRoot) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/create");
OapiV2DepartmentCreateRequest req = new OapiV2DepartmentCreateRequest();
req.setParentId(parentId);
req.setOrder(orderId);
req.setName(deptName);
if (isRoot) {
req.setOuterDept(true);
req.setOuterDeptOnlySelf(true);
}
OapiV2DepartmentCreateResponse rsp = client.execute(req, access_token);
JSONObject jo = JSONObject.parseObject(rsp.getBody());
if (jo.getLong("errcode") > 0) {
return -1;
}
return jo.getJSONObject("result").getLong("dept_id");
}
/**
*
*
* @param access_token
* @param deptId
* @throws ApiException
*/
public static void delDept(String access_token, long deptId) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/delete");
OapiV2DepartmentDeleteRequest req = new OapiV2DepartmentDeleteRequest();
req.setDeptId(deptId);
OapiV2DepartmentDeleteResponse rsp = client.execute(req, access_token);
//System.out.println(rsp.getBody());
}
/**
*
*
* @param access_token
* @param deptId
* @param deptName
* @param orderId
* @throws ApiException
*/
public static void updateDept(String access_token, long deptId, String deptName, long orderId) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/update");
OapiV2DepartmentUpdateRequest req = new OapiV2DepartmentUpdateRequest();
req.setDeptId(deptId);
req.setOrder(orderId);
req.setName(deptName);
req.setLanguage("zh_CN");
OapiV2DepartmentUpdateResponse rsp = client.execute(req, access_token);
//System.out.println(rsp.getBody());
}
/**
*
*
* @param access_token
* @throws ApiException
*/
public static List<Kv> deptList = new ArrayList();
public static void getDeptList(String access_token, long dept_id) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
req.setDeptId(dept_id);
req.setLanguage("zh_CN");
OapiV2DepartmentListsubResponse rsp = client.execute(req, access_token);
JSONObject jo = JSONObject.parseObject(rsp.getBody());
JSONArray ja = jo.getJSONArray("result");
if (ja == null) return;
for (int i = 0; i < ja.size(); i++) {
JSONObject j = ja.getJSONObject(i);
Kv kv = Kv.create();
long childDeptId = j.getLongValue("dept_id");
kv.set("dept_id", childDeptId);
kv.set("name", j.getString("name"));
deptList.add(kv);
getDeptList(access_token, childDeptId);//递归
}
}
public static void delAllDept(String access_token) throws ApiException {
for (int i = 0; i < deptList.size(); i++) {
delDept(access_token, deptList.get(i).getLong("dept_id"));
CommonUtil.Print("成功删除部门:"+deptList.get(i).getStr("name"));
}
}
public static JSONObject getDeptInfo(String access_token, long deptId) {
JSONObject jo;
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get");
OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
req.setDeptId(deptId);
req.setLanguage("zh_CN");
OapiV2DepartmentGetResponse rsp = client.execute(req, access_token);
jo = JSONObject.parseObject(rsp.getBody());
} catch (Exception err) {
jo = JSONObject.parseObject(err.toString());
}
return jo;
}
public static void syncOrg(String accessToken, Record rOrg) throws ApiException {
String orgName = rOrg.getStr("org_name");
int bureau_id = rOrg.getInt("org_id");
int sort_id = rOrg.getInt("sort_id");
//获取数据库中记录的钉钉端的dept_id,但不一定准确存在,需要继续判断一下
long dingtalk_dept_id = Model.getDtDeptId(bureau_id);
JSONObject jRes = getDeptInfo(accessToken, dingtalk_dept_id);
if (jRes.getLong("errcode") > 0) {
dingtalk_dept_id = createDept(accessToken, orgName, 1, sort_id, true);
Model.writeDtDeptId(bureau_id, String.valueOf(dingtalk_dept_id));//记得要回写
CommonUtil.Print("单位名称:" + orgName + "不存在!已创建!");
} else {
CommonUtil.Print("单位名称:" + orgName + "已存在,保留!");
//获取下属部门的列表
getDeptList(accessToken, dingtalk_dept_id);
}
// 云平台->集合A,钉钉->集合B
// (1) x在A中存在在B中也存在内容也一致不处理
// (2) x在A中存在在B中也存在内容不一致更新处理
// (3) x在A中存在在B中不存在新增
// (4) x在A中不存在在B中存在删除
Set<Long> keysOfA = new HashSet<>();
Map<Long, JSONObject> mapOfA = new HashMap<>();
Set<Long> keysOfB = new HashSet<>();
Map<Long, JSONObject> mapOfB = new HashMap<>();
//A:钉钉
for (int i = 0; i < deptList.size(); i++) {
long deptId = deptList.get(i).getLong("dept_id");
String org_name = deptList.get(i).getStr("name");
keysOfA.add(deptId);
JSONObject jo = new JSONObject();
jo.put("org_name", org_name);
mapOfA.put(deptId, jo);
}
//B:云平台
List<Record> list = Model.getOrgList(bureau_id);
for (int i = 0; i < list.size(); i++) {
if (list.get(i).get("dingtalk_dept_id") != null) {
long deptId = list.get(i).getLong("dingtalk_dept_id");
String org_name = list.get(i).getStr("org_name");
sort_id = list.get(i).getInt("sort_id");
int org_id = list.get(i).getInt("org_id");
int parentId = list.get(i).getInt("parent_id");
keysOfB.add(deptId);
JSONObject jo = new JSONObject();
jo.put("org_id", org_id);
jo.put("org_name", org_name);
jo.put("sort_id", sort_id);
jo.put("parent_id", parentId);
mapOfB.put(deptId, jo);
}
}
//在A不在B
for (Long key : keysOfA) {
if (!keysOfB.contains(key)) {
// key只存在于A中
// 删除
CommonUtil.Print("发现钉钉中多出的dept_id:" + key + ",将删除掉...");
delDept(accessToken, key);
} else {
// key在A和B中都存在
String aName = mapOfA.get(key).getString("org_name");
String bName = mapOfB.get(key).getString("org_name");
int sId = mapOfB.get(key).getInteger("sort_id");
if (aName.equals(bName)) {
CommonUtil.Print("发现钉钉与云平台间部门名称一致,不需要修改,aName=" + aName + ",bName=" + bName);
continue;
}
CommonUtil.Print("发现钉钉与云平台间部门名称不一致,将修改,aName=" + aName + ",bName=" + bName);
updateDept(accessToken, key, bName, sId);
}
}
//在B不在A
for (Long key : keysOfB) {
if (!keysOfA.contains(key)) {
// key只存在于B中
// 增加
String org_name = mapOfB.get(key).getString("org_name");
System.out.println(org_name);
int sId = mapOfB.get(key).getInteger("sort_id");
int parentId = mapOfB.get(key).getInteger("parent_id");
int org_id = mapOfB.get(key).getInteger("org_id");
//这个部门是在哪个部门下的
long dingTalkParentDeptId = Model.getDtDeptId(parentId);
long dt_dept_id = createDept(accessToken, org_name, dingTalkParentDeptId, sId, false);
Model.writeDtDeptId(org_id, String.valueOf(dt_dept_id));
CommonUtil.Print("成功创建部门:" + org_name);
}
}
//重新获取下属部门的列表,使得后续的代码不再获取部门列表
getDeptList(accessToken, dingtalk_dept_id);
}
/**
*
*
* @param access_token
* @param deptId
* @param userId
* @param personName
* @param tel
* @param zhiWei
* @throws ApiException
*/
public static void createPerson(String access_token, String deptId, String userId, String personName, String tel, String zhiWei) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/create");
OapiV2UserCreateRequest req = new OapiV2UserCreateRequest();
req.setUserid(userId);
req.setName(personName);
req.setMobile(tel);
req.setTitle(zhiWei);
req.setDeptIdList(deptId);
OapiV2UserCreateResponse rsp = client.execute(req, access_token);
//System.out.println(rsp.getBody());
}
/**
*
*
* @param access_token
* @param userId
* @throws ApiException
*/
public static void delPerson(String access_token, String userId) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/delete");
OapiV2UserDeleteRequest req = new OapiV2UserDeleteRequest();
req.setUserid(userId);
OapiV2UserDeleteResponse rsp = client.execute(req, access_token);
//System.out.println(rsp.getBody());
}
public static void updatePerson(String access_token, String person_id, String person_name) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/update");
OapiV2UserUpdateRequest req = new OapiV2UserUpdateRequest();
req.setUserid(person_id);
req.setName(person_name);
OapiV2UserUpdateResponse rsp = client.execute(req, access_token);
System.out.println(rsp.getBody());
}
public static List<Kv> personList = new ArrayList();
public static void getDeptPerson(String access_token, long dept_id) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listsimple");
long next_cursor = 0;
while (true) {
OapiUserListsimpleRequest req = new OapiUserListsimpleRequest();
req.setDeptId(dept_id);
req.setCursor(next_cursor);
req.setSize(10L);
req.setOrderField("modify_desc");
req.setContainAccessLimit(false);
req.setLanguage("zh_CN");
OapiUserListsimpleResponse rsp = client.execute(req, access_token);
JSONObject jo = JSONObject.parseObject(rsp.getBody());
JSONArray ja = jo.getJSONObject("result").getJSONArray("list");
if (ja == null) return;
for (int i = 0; i < ja.size(); i++) {
JSONObject j = ja.getJSONObject(i);
Kv kv = Kv.create();
String userid = j.getString("userid");
String name = j.getString("name");
kv.set("userid", userid);
kv.set("name", name);
personList.add(kv);
}
if (jo.getJSONObject("result").getBoolean("has_more"))
next_cursor = jo.getJSONObject("result").getLong("next_cursor");
else break;
}
}
public static void getBureauPerson(String access_token, long dept_id) throws ApiException {
personList.clear();
getDeptPerson(access_token, dept_id);
for (int i = 0; i < deptList.size(); i++) {
getDeptPerson(access_token, deptList.get(i).getInt("dept_id"));
}
}
public static void delBureauPerson(String accessToken, Record rOrg) throws ApiException {
int dingtalk_dept_id = rOrg.getInt("dingtalk_dept_id");
getBureauPerson(accessToken, dingtalk_dept_id);
for (int i = 0; i < personList.size(); i++) {
String userid = personList.get(i).getStr("userid");
String person_name = personList.get(i).getStr("name");
delPerson(accessToken, userid);
CommonUtil.Print("成功删除:" + person_name);
}
}
/**
*
*
* @param accessToken
* @param rOrg
* @throws ApiException
*/
public static void syncPerson(String accessToken, Record rOrg) throws ApiException {
int bureauId = rOrg.getInt("org_id");
//获取数据库中记录的钉钉端的dept_id,但不一定准确存在,需要继续判断一下
long DT_BureauId = Model.getDtDeptId(bureauId);
getBureauPerson(accessToken, DT_BureauId);
Set<String> keysOfA = new HashSet<>();
Map<String, JSONObject> mapOfA = new HashMap<>();
Set<String> keysOfB = new HashSet<>();
Map<String, JSONObject> mapOfB = new HashMap<>();
//A:钉钉
for (int i = 0; i < personList.size(); i++) {
String userid = personList.get(i).getStr("userid");
String name = personList.get(i).getStr("name");
keysOfA.add(userid);
JSONObject jo = new JSONObject();
jo.put("person_id", userid);
jo.put("person_name", name);
mapOfA.put(userid, jo);
}
//B:云平台
List<Record> list = Model.getDeptPerson(bureauId);
for (int i = 0; i < list.size(); i++) {
Record r = list.get(i);
int person_id = r.getInt("person_id");
String person_name = r.getStr("person_name");
long dingtalk_dept_id = r.getLong("dingtalk_dept_id");
String tel = r.getStr("tel");
if (StrKit.isBlank(tel) || !PhoneUtil.isMobile(tel)) {
tel = ChineseMobileNumberGenerator.getInstance().generate();//生成一个随机临时测试用的手机号
tel = "14" + tel.substring(2);//以14段开头避开已存在的号码
}
keysOfB.add(String.valueOf(person_id));
JSONObject jo = new JSONObject();
jo.put("person_id", person_id);
jo.put("person_name", person_name);
jo.put("dingtalk_dept_id", dingtalk_dept_id);
jo.put("tel", tel);
mapOfB.put(String.valueOf(person_id), jo);
}
//在A不在B
for (String key : keysOfA) {
if (!keysOfB.contains(key)) {
// key只存在于A中
// 删除
CommonUtil.Print("发现钉钉中多出的user_id:" + key + ",将删除掉...");
delPerson(accessToken, key);
} else {
// key在A和B中都存在
String aName = mapOfA.get(key).getString("person_name");
String bName = mapOfB.get(key).getString("person_name");
if (!aName.equals(bName)) {
updatePerson(accessToken, key, mapOfB.get(key).getString("person_name"));
CommonUtil.Print("发现钉钉与云平台间部门人员姓名不一致,将修改,person_name=" + mapOfB.get(key).getString("person_name"));
} else {
CommonUtil.Print("钉钉与云平台间部门人员姓名一致,无需修改,person_name=" + mapOfB.get(key).getString("person_name"));
}
}
}
//在B不在A
for (String key : keysOfB) {
if (!keysOfA.contains(key)) {
// key只存在于B中
// 增加
String person_id = mapOfB.get(key).getString("person_id");
String person_name = mapOfB.get(key).getString("person_name");
String tel = mapOfB.get(key).getString("tel");
long deptId = mapOfB.get(key).getLong("dingtalk_dept_id");
createPerson(accessToken, String.valueOf(deptId), person_id, person_name, tel, "教师");
CommonUtil.Print("成功加入人员:" + person_name);
}
}
}
/**
*
*
* @param access_token
* @param userId
* @return
*/
public static String getPerson(String access_token, String userId) {
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
OapiV2UserGetRequest req = new OapiV2UserGetRequest();
req.setUserid(userId);
req.setLanguage("zh_CN");
OapiV2UserGetResponse rsp = client.execute(req, access_token);
return rsp.getBody();
} catch (ApiException e) {
e.printStackTrace();
}
return null;
}
//TODO 未完成
public static String getPersonToken(String appKey, String appSecret) throws Exception {
com.aliyun.dingtalkoauth2_1_0.Client client = Common.createClient();
GetUserTokenRequest getUserTokenRequest = new GetUserTokenRequest()
.setClientId(appKey)
.setClientSecret(appSecret)
//.setCode("abcd")
.setRefreshToken("abcd")
.setGrantType("authorization_code");
try {
GetUserTokenResponse res = client.getUserToken(getUserTokenRequest);
System.out.println(res.getBody().getAccessToken());
System.out.println(res.getBody().getRefreshToken());
} catch (TeaException err) {
System.out.println(err);
} catch (Exception _err) {
System.out.println(_err);
}
return null;
}
}

@ -1,236 +0,0 @@
package com.dsideal.FengHuang.DingTalk;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.dsideal.FengHuang.Util.CommonUtil;
import com.jfinal.plugin.activerecord.Record;
import com.taobao.api.ApiException;
import java.util.*;
public class RolePerson {
//暂未改修改,因为我们的角色与测试架构的角色存在冲突,不能在人家的环境中实现全部测试功能,需要搭建自己的专用服务器+架构
/*
--
DROP TABLE IF EXISTS `t_im_role`;
CREATE TABLE `t_im_role` (
`role_id` int NOT NULL COMMENT 'ID',
`role_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '',
`dingtalk_role_id` bigint NULL DEFAULT NULL COMMENT 'ID',
PRIMARY KEY (`role_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of t_im_role
-- ----------------------------
INSERT INTO `t_im_role` VALUES (174, '', NULL);
INSERT INTO `t_im_role` VALUES (323, '', NULL);
insert into `t_im_role` VALUES (4,'',NULL);
TODO
//让产品经理想好加入到此表中表示需要与IM钉钉系统对接的角色
*/
//创建用户组,这个概念似乎不重要,可以手动创建即可
public static void createRoleGroup(String access_token, String group_name) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/role/add_role_group");
OapiRoleAddrolegroupRequest req = new OapiRoleAddrolegroupRequest();
req.setName(group_name);
OapiRoleAddrolegroupResponse rsp = client.execute(req, access_token);
System.out.println(rsp.getBody());
}
/**
*
*
* @param access_token
* @param group_id
* @throws ApiException
*/
public static List<Record> getRoleList(String access_token, long group_id) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/getrolegroup");
OapiRoleGetrolegroupRequest req = new OapiRoleGetrolegroupRequest();
req.setGroupId(group_id);
OapiRoleGetrolegroupResponse rsp = client.execute(req, access_token);
JSONObject jo = JSONObject.parseObject(rsp.getBody());
JSONArray ja = jo.getJSONObject("role_group").getJSONArray("roles");
List<Record> list = new ArrayList();
for (int i = 0; i < ja.size(); i++) {
Record record = new Record();
record.set("role_id", ((JSONObject) ja.get(i)).getLong("role_id"));
record.set("role_name", ((JSONObject) ja.get(i)).getString("role_name"));
list.add(record);
}
return list;
}
public static long createRole(String access_token, String role_name, long group_id) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/role/add_role");
OapiRoleAddRoleRequest req = new OapiRoleAddRoleRequest();
req.setRoleName(role_name);
req.setGroupId(group_id);
OapiRoleAddRoleResponse rsp = client.execute(req, access_token);
JSONObject jo = JSONObject.parseObject(rsp.getBody());
return jo.getLong("roleId");
}
public static void delRole(String access_token, long role_id) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/deleterole");
OapiRoleDeleteroleRequest req = new OapiRoleDeleteroleRequest();
req.setRoleId(role_id);
OapiRoleDeleteroleResponse rsp = client.execute(req, access_token);
System.out.println(rsp.getBody());
}
public static void updateRole(String access_token, long role_id, String role_name) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/role/update_role");
OapiRoleUpdateRoleRequest req = new OapiRoleUpdateRoleRequest();
req.setRoleId(role_id);
req.setRoleName(role_name);
OapiRoleUpdateRoleResponse rsp = client.execute(req, access_token);
System.out.println(rsp.getBody());
}
public static void clearGroupRole(String access_token, long group_id) throws ApiException {
List<Record> list = getRoleList(access_token, group_id);
for (int i = 0; i < list.size(); i++) {
delRole(access_token, list.get(i).getLong("role_id"));
}
}
/**
*
*
* @param access_token
* @param group_id
* @throws ApiException
*/
public static void syncRole(String access_token, long group_id) throws ApiException {
//1、钉钉侧有哪些角色
List<Record> listA = getRoleList(access_token, group_id);
//2、数据库有哪些角色
List<Record> listB = Model.getRoleList();
boolean flag;
//3、在A不在B删除之
for (int i = 0; i < listA.size(); i++) {
flag = false;
for (int j = 0; j < listB.size(); j++) {
if (listB.get(j).get("dingtalk_role_id") != null && listA.get(i).getLong("role_id") == listB.get(j).getLong("dingtalk_role_id")) {
flag = true;
break;
}
}
if (!flag) {
delRole(access_token, listA.get(i).getLong("role_id"));
CommonUtil.Print("成功删除钉钉侧角色:" + listA.get(i).getStr("role_name"));
}
}
//4、在B不在A增加之
for (int i = 0; i < listB.size(); i++) {
flag = false;
for (int j = 0; j < listA.size(); j++) {
if (listB.get(j).get("dingtalk_role_id") != null && listA.get(i).getLong("role_id") == listB.get(j).getLong("dingtalk_role_id")) {
flag = true;
break;
}
}
if (!flag) {
long dt_role_id = createRole(access_token, listB.get(i).getStr("role_name"), group_id);
//回写
Model.writeDingTalkRoleId(listB.get(i).getInt("role_id"), dt_role_id);
CommonUtil.Print("成功创建角色:" + listB.get(i).getStr("role_name"));
}
}
//5、在A也在B看看是不是角色名称需要修改
//TODO,因为角色名称不般不随意变化不写这块代码也是OK的
}
/**
*
*
* @param access_token
* @param role_id
* @throws ApiException
*/
public static List<Record> rolePersonList = new ArrayList<>();
public static long SZ = 2l;
public static void getRolePersonList(String access_token, long role_id, long start) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/simplelist");
OapiRoleSimplelistRequest req = new OapiRoleSimplelistRequest();
req.setRoleId(role_id);
req.setSize(SZ);
req.setOffset(start);
OapiRoleSimplelistResponse rsp = client.execute(req, access_token);
JSONObject jo = JSONObject.parseObject(rsp.getBody());
JSONArray ja = jo.getJSONObject("result").getJSONArray("list");
for (int i = 0; i < ja.size(); i++) {
Record record = new Record();
String name = ((JSONObject) ja.get(i)).getString("name");
String userid = ((JSONObject) ja.get(i)).getString("userid");
record.set("person_name", name);
record.set("person_id", userid);
rolePersonList.add(record);
}
if (jo.getJSONObject("result").getBoolean("hasMore")) {
getRolePersonList(access_token, role_id, start + SZ);
}
}
public static void syncRolePersonReleation() {
//getRolePersonList();
//Model.getRolePersonReleation();
}
/**
*
*
* @param accessToken
* @throws ApiException
*/
public static void getRoleList(String accessToken) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/list");
OapiRoleListRequest req = new OapiRoleListRequest();
req.setSize(20L);
req.setOffset(0L);
OapiRoleListResponse rsp = client.execute(req, accessToken);
System.out.println(rsp.getBody());
}
public static void updateRole(String accessToken) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/role/update_role");
OapiRoleUpdateRoleRequest req = new OapiRoleUpdateRoleRequest();
req.setRoleId(1560985325L);
req.setRoleName("服装制造");
OapiRoleUpdateRoleResponse rsp = client.execute(req, accessToken);
System.out.println(rsp.getBody());
}
public static void addRolePerson(String accessToken, String role_id, String ids) throws ApiException {
//一次最多20个人员
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/addrolesforemps");
OapiRoleAddrolesforempsRequest req = new OapiRoleAddrolesforempsRequest();
req.setRoleIds(role_id);
req.setUserIds(ids);
OapiRoleAddrolesforempsResponse rsp = client.execute(req, accessToken);
System.out.println(rsp.getBody());
}
public static void delRolePerson(String accessToken, String role_id, String ids) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/removerolesforemps");
OapiRoleRemoverolesforempsRequest req = new OapiRoleRemoverolesforempsRequest();
req.setRoleIds(role_id);
req.setUserIds(ids);
OapiRoleRemoverolesforempsResponse rsp = client.execute(req, accessToken);
System.out.println(rsp.getBody());
}
}

@ -0,0 +1,407 @@
/*
Navicat Premium Data Transfer
Source Server : 10.10.14.199
Source Server Type : MySQL
Source Server Version : 100123 (10.1.23-MariaDB)
Source Host : 10.10.14.199:22066
Source Schema : dsideal_db
Target Server Type : MySQL
Target Server Version : 100123 (10.1.23-MariaDB)
File Encoding : 65001
Date: 15/06/2023 08:30:25
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_dingtalk_actioncount
-- ----------------------------
DROP TABLE IF EXISTS `t_dingtalk_actioncount`;
CREATE TABLE `t_dingtalk_actioncount` (
`year` int NOT NULL COMMENT '年份',
`month` int NOT NULL COMMENT '月份',
`remain_count` int NULL DEFAULT NULL COMMENT '剩余次数',
PRIMARY KEY (`year`, `month`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of t_dingtalk_actioncount
-- ----------------------------
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2023, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2024, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2025, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2026, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2027, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2028, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2029, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2030, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2031, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2032, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2033, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2034, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2035, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2036, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2037, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2038, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2039, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2040, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2041, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2042, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2043, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2044, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2045, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2046, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2047, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2048, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2049, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2050, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2051, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2052, 12, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 1, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 2, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 3, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 4, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 5, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 6, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 7, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 8, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 9, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 10, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 11, 500000);
INSERT INTO `t_dingtalk_actioncount` VALUES (2053, 12, 500000);
SET FOREIGN_KEY_CHECKS = 1;

@ -0,0 +1,37 @@
/*
Navicat Premium Data Transfer
Source Server : 10.10.14.199
Source Server Type : MySQL
Source Server Version : 100123 (10.1.23-MariaDB)
Source Host : 10.10.14.199:22066
Source Schema : dsideal_db
Target Server Type : MySQL
Target Server Version : 100123 (10.1.23-MariaDB)
File Encoding : 65001
Date: 15/06/2023 11:38:49
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_dingtalk_progress
-- ----------------------------
DROP TABLE IF EXISTS `t_dingtalk_progress`;
CREATE TABLE `t_dingtalk_progress` (
`table_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '表名',
`sync_last_update_time` timestamp NULL DEFAULT NULL COMMENT '最后同步时间戳',
PRIMARY KEY (`table_name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of t_dingtalk_progress
-- ----------------------------
INSERT INTO `t_dingtalk_progress` VALUES ('t_base_organization', '2023-06-15 11:38:16');
INSERT INTO `t_dingtalk_progress` VALUES ('t_base_person', '2023-06-15 11:38:24');
INSERT INTO `t_dingtalk_progress` VALUES ('t_sys_person_role', '2023-06-15 11:38:34');
SET FOREIGN_KEY_CHECKS = 1;

@ -0,0 +1,38 @@
/*
Navicat Premium Data Transfer
Source Server : 10.10.14.199
Source Server Type : MySQL
Source Server Version : 100123 (10.1.23-MariaDB)
Source Host : 10.10.14.199:22066
Source Schema : dsideal_db
Target Server Type : MySQL
Target Server Version : 100123 (10.1.23-MariaDB)
File Encoding : 65001
Date: 15/06/2023 08:53:56
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_dingtalk_role
-- ----------------------------
DROP TABLE IF EXISTS `t_dingtalk_role`;
CREATE TABLE `t_dingtalk_role` (
`role_id` int NOT NULL COMMENT '角色ID',
`role_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色名称',
`dingtalk_role_id` bigint NULL DEFAULT NULL COMMENT '在钉钉系统中的角色ID',
PRIMARY KEY (`role_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of t_dingtalk_role
-- ----------------------------
INSERT INTO `t_dingtalk_role` VALUES (4, '普通教师', 3786531788);
INSERT INTO `t_dingtalk_role` VALUES (174, '班主任', 3786792098);
INSERT INTO `t_dingtalk_role` VALUES (323, '学校校长', 3780952031);
SET FOREIGN_KEY_CHECKS = 1;

@ -0,0 +1,5 @@
ALTER TABLE `dsideal_db`.`t_base_organization`
ADD COLUMN `dingtalk_dept_id` BIGINT NULL COMMENT '钉钉架构中机构的代码' AFTER `zydz`;
ALTER TABLE `dsideal_db`.`t_base_person`
ADD COLUMN `dingtalk_person_id` varchar(255) NULL COMMENT '钉钉架构中人员ID' AFTER `pay_rate`;

@ -1,13 +1,68 @@
package com.dsideal.FengHuang.DingTalk; package com.dsideal.FengHuang.DingTalk.Util;
import cn.binarywang.tools.generator.ChineseMobileNumberGenerator;
import cn.hutool.core.util.PhoneUtil;
import com.alibaba.druid.filter.stat.StatFilter;
import com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketResponse; import com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketResponse;
import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponse; import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponse;
import com.aliyun.dingtalkoauth2_1_0.models.GetSsoAccessTokenRequest; import com.aliyun.dingtalkoauth2_1_0.models.GetSsoAccessTokenRequest;
import com.aliyun.dingtalkoauth2_1_0.models.GetSsoAccessTokenResponse; import com.aliyun.dingtalkoauth2_1_0.models.GetSsoAccessTokenResponse;
import com.aliyun.tea.TeaException; import com.aliyun.tea.TeaException;
import com.dsideal.FengHuang.Util.CommonUtil;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.redis.Redis; import com.jfinal.plugin.redis.Redis;
import com.jfinal.plugin.redis.RedisPlugin;
import java.util.Calendar;
public class DingTalkCommon {
public static DruidPlugin createDruidPlugin(String url, String username, String password, String driverClass) {
DruidPlugin druidPlugin = new DruidPlugin(url, username, password, driverClass);
//最大连接池数量
druidPlugin.setMaxActive(20);
//最小连接池数量
druidPlugin.setMinIdle(1);
//初始化时建立物理连接的个数默认为0
druidPlugin.setInitialSize(1);
//获取连接时最大等待时间单位毫秒。配置了maxWait之后缺省启用公平锁并发效率会有所下降如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
druidPlugin.setMaxWait(60000);
//如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。
druidPlugin.setTimeBetweenEvictionRunsMillis(60000);
//连接保持空闲而不被驱逐的最小时间
druidPlugin.setMinEvictableIdleTimeMillis(300000);
//建议配置为true不影响性能并且保证安全性。申请连接的时候检测如果空闲时间大于timeBetweenEvictionRunsMillis执行validationQuery检测连接是否有效。
druidPlugin.setTestWhileIdle(true);
//申请连接时执行validationQuery检测连接是否有效做了这个配置会降低性能。默认为true
druidPlugin.setTestOnBorrow(false);
//归还连接时执行validationQuery检测连接是否有效做了这个配置会降低性能。默认为true
druidPlugin.setTestOnReturn(false);
//数据监控
druidPlugin.addFilter(new StatFilter());
return druidPlugin;
}
public static void Start(){
PropKit.use("dingtalk.properties");
DruidPlugin druid = DingTalkCommon.createDruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim(), PropKit.get("driverClassName"));
druid.start();
ActiveRecordPlugin arp = new ActiveRecordPlugin(druid);
arp.setDevMode(false);
arp.setDialect(new MysqlDialect());
arp.start();
// 用于缓存模块的redis服务
RedisPlugin redis = new RedisPlugin("myRedis", PropKit.get("redis_ip"), PropKit.getInt("redis_port"), 10 * 1000);
redis.start();
}
public class Common {
/** /**
* 使 Token Client * 使 Token Client
* *
@ -112,4 +167,27 @@ public class Common {
return Redis.use().get(KEY); return Redis.use().get(KEY);
} }
} }
public static void WriteActionTimes() {
//当前年、月
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; // Calendar.MONTH返回的范围是0-11需要加1
String sql = "update t_dingtalk_actioncount set remain_count=remain_count-1 where year=? and month=?";
Db.update(sql, year, month);
sql = "select remain_count from t_dingtalk_actioncount where year=? and month=?";
Record record = Db.findFirst(sql, year, month);
int remain_count = record.getInt("remain_count");
CommonUtil.Print("钉钉本月剩余API调用次数" + remain_count + "");
}
public static String getLawfulTel(String tel) {
//模拟处理一下手机号
if (StrKit.isBlank(tel) || !PhoneUtil.isMobile(tel)) {
tel = ChineseMobileNumberGenerator.getInstance().generate();//生成一个随机临时测试用的手机号
tel = "14" + tel.substring(2);//以14段开头避开已存在的号码
}
return tel;
}
} }

@ -0,0 +1,33 @@
package com.dsideal.FengHuang.DingTalk.Util;
import com.dsideal.FengHuang.Util.CommonUtil;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
public class FillRemainCount {
public static void main(String[] args) {
PropKit.use("dingtalk_dalian.properties");
DruidPlugin druid = DingTalkCommon.createDruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim(), PropKit.get("driverClassName"));
druid.start();
ActiveRecordPlugin arp = new ActiveRecordPlugin(druid);
arp.setDevMode(false);
arp.setDialect(new MysqlDialect());
arp.start();
for(int year=2023;year<=2053;year++){
for(int month=1;month<=12;month++){
Record record =new Record();
record.set("year",year);
record.set("month",month);
record.set("remain_count",500000);//初始操作次数为50W
Db.save("t_dingtalk_actioncount","year,month",record);
}
}
CommonUtil.Print("恭喜,数据填充成功!");
}
}

@ -0,0 +1,109 @@
package com.dsideal.FengHuang.DingTalk.Util;
import com.jfinal.kit.Kv;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import java.util.Date;
import java.util.List;
public class Model {
public static List<Record> getOrgList(int orgId) {
// 学校及学校下的部门
String sql = "select org_id,org_name,parent_id,sort_id,dingtalk_dept_id from t_base_organization where bureau_id=? order by org_id";
List<Record> list = Db.find(sql, orgId);
return list;
}
public static void fillDeptListByDataBase(Record rOrg) {
OrgPerson.deptList.clear();
int bureau_id = rOrg.getInt("org_id");
String sql = "select org_id,org_name,dingtalk_dept_id from t_base_organization where bureau_id=? and b_use=1 order by org_id desc";
List<Record> list = Db.find(sql, bureau_id);
for (int i = 0; i < list.size(); i++) {
Kv kv = Kv.create();
kv.set("dept_id", list.get(i).getLong("dingtalk_dept_id"));
kv.set("name", list.get(i).getStr("org_name"));
OrgPerson.deptList.add(kv);
}
}
public static List<Record> getDeptPerson(int bureau_id) {
String sql = "select t1.person_id,t1.person_name,t2.dingtalk_dept_id,t1.tel from t_base_person as t1 " +
"inner join t_base_organization as t2 on t1.org_id=t2.org_id " +
" where t1.bureau_id=? and t1.b_use=1";
return Db.find(sql, bureau_id);
}
public static void writeDtDeptId(int orgId, String value) {
String sql = "update t_base_organization set dingtalk_dept_id=? where org_id=?";
Db.update(sql, value, orgId);
}
public static void writePersonDingTalkId(int person_id) {
String sql = "update t_base_person set dingtalk_person_id=? where person_id=?";
Db.update(sql, person_id, person_id);
}
public static long getDtDeptId(int org_id) {
String sql = "select dingtalk_dept_id from t_base_organization where org_id=?";
Record r = Db.findFirst(sql, org_id);
if (r.get("dingtalk_dept_id") == null) return 1;
return r.get("dingtalk_dept_id");
}
public static Record getOrgByOrgName(String org_name) {
String sql = "select org_id,org_name,sort_id,dingtalk_dept_id from t_base_organization where org_name = ?";
return Db.findFirst(sql, org_name);
}
public static List<Record> getRoleList() {
String sql = "select * from t_dingtalk_role";
return Db.find(sql);
}
public static void writeDingTalkRoleId(int role_id, long dt_role_id) {
String sql = "update t_dingtalk_role set dingtalk_role_id=? where role_id=?";
Db.update(sql, dt_role_id, role_id);
}
// 需要同步哪些人员角色信息
public static List<Record> getRolePersonReleation(Record rOrg) {
String sql = "select t1.person_id,t2.dingtalk_role_id,t3.bureau_id from t_sys_person_role as t1 inner join t_dingtalk_role as t2 on t1.role_id=t2.role_id " +
"inner join t_base_person as t3 on t1.person_id=t3.person_id " +
" where t3.bureau_id=? and t3.b_use=1";
List<Record> list = Db.find(sql, rOrg.getInt("org_id"));
return list;
}
public static Date getLastSyncTime(String table_name) {
String sql = "select sync_last_update_time from t_dingtalk_progress where table_name=?";
return Db.findFirst(sql, table_name).getDate("getLastSyncTime");
}
public static void saveLastSyncTime(String table_name) {
String sql = "update t_dingtalk_progress set sync_last_update_time=now() where table_name=?";
Db.update(sql, table_name);
}
public static List<Record> getIncrementOrg(int org_id, Date dt) {
String sql = "select org_id,org_name,parent_id,b_use,dingtalk_dept_id,sort_id from t_base_organization where bureau_id=? and last_update_time>?";
return Db.find(sql, org_id, dt);
}
public static List<Record> getIncrementPerson(int org_id, Date dt) {
String sql = "select person_id,person_name,org_id,b_use,dingtalk_person_id from t_base_person where bureau_id=? and last_update_time>?";
return Db.find(sql, org_id, dt);
}
public static List<Record> getIncrementRolePerson(int org_id, Date dt) {
String sql = "select t1.person_id,t1.role_id,t1.b_use,t2.dingtalk_role_id from t_sys_person_role as t1 inner join t_dingtalk_role as t2 on t1.role_id=t2.role_id where t1.bureau_id=? and t1.last_update_time>?";
return Db.find(sql, org_id, dt);
}
public static long getDingTalkOrgId(int org_id) {
String sql = "select dingtalk_dept_id from t_base_organization where org_id=?";
return Db.findFirst(sql, org_id).getLong("dingtalk_dept_id");
}
}

@ -0,0 +1,283 @@
package com.dsideal.FengHuang.DingTalk.Util;
import cn.binarywang.tools.generator.ChineseMobileNumberGenerator;
import cn.hutool.core.util.PhoneUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aspose.slides.Collections.ArrayList;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.dsideal.FengHuang.Util.CommonUtil;
import com.jfinal.kit.Kv;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.taobao.api.ApiException;
import java.util.*;
public class OrgPerson {
/**
*
*
* @param access_token
* @throws ApiException
*/
public static long createDept(String access_token, String deptName, long parentId, long orderId, boolean isRoot) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/create");
OapiV2DepartmentCreateRequest req = new OapiV2DepartmentCreateRequest();
req.setParentId(parentId);
req.setOrder(orderId);
req.setName(deptName);
if (isRoot) {
req.setOuterDept(true);
req.setOuterDeptOnlySelf(true);
}
OapiV2DepartmentCreateResponse rsp = client.execute(req, access_token);
JSONObject jo = JSONObject.parseObject(rsp.getBody());
if (jo.getLong("errcode") > 0) {
return -1;
}
return jo.getJSONObject("result").getLong("dept_id");
}
/**
*
*
* @param access_token
* @param deptId
* @throws ApiException
*/
public static void delDept(String access_token, long deptId) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/delete");
OapiV2DepartmentDeleteRequest req = new OapiV2DepartmentDeleteRequest();
req.setDeptId(deptId);
OapiV2DepartmentDeleteResponse rsp = client.execute(req, access_token);
//System.out.println(rsp.getBody());
}
/**
*
*
* @param access_token
* @param deptId
* @param deptName
* @param orderId
* @throws ApiException
*/
public static void updateDept(String access_token, long deptId, String deptName, long orderId) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/update");
OapiV2DepartmentUpdateRequest req = new OapiV2DepartmentUpdateRequest();
req.setDeptId(deptId);
req.setOrder(orderId);
req.setName(deptName);
req.setLanguage("zh_CN");
OapiV2DepartmentUpdateResponse rsp = client.execute(req, access_token);
//System.out.println(rsp.getBody());
}
/**
*
*
* @param access_token
* @throws ApiException
*/
public static List<Kv> deptList = new ArrayList();
public static void getDeptList(String access_token, long dept_id) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
req.setDeptId(dept_id);
req.setLanguage("zh_CN");
OapiV2DepartmentListsubResponse rsp = client.execute(req, access_token);
JSONObject jo = JSONObject.parseObject(rsp.getBody());
JSONArray ja = jo.getJSONArray("result");
if (ja == null) return;
for (int i = 0; i < ja.size(); i++) {
JSONObject j = ja.getJSONObject(i);
Kv kv = Kv.create();
long childDeptId = j.getLongValue("dept_id");
kv.set("dept_id", childDeptId);
kv.set("name", j.getString("name"));
deptList.add(kv);
getDeptList(access_token, childDeptId);//递归
}
}
public static JSONObject getDeptInfo(String access_token, long deptId) {
JSONObject jo;
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get");
OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
req.setDeptId(deptId);
req.setLanguage("zh_CN");
OapiV2DepartmentGetResponse rsp = client.execute(req, access_token);
jo = JSONObject.parseObject(rsp.getBody());
} catch (Exception err) {
jo = JSONObject.parseObject(err.toString());
}
return jo;
}
public static void InitOrg(String accessToken, Record rOrg) throws ApiException {
int bureau_id = rOrg.getInt("org_id");
//云平台
List<Record> list = Model.getOrgList(bureau_id);
//在B不在A
for (Record record : list) {
// 增加
String org_name = record.getStr("org_name");
int sId = record.getInt("sort_id");
int parentId = record.getInt("parent_id");
int org_id = record.getInt("org_id");
//这个部门是在哪个部门下的
long dingTalkParentDeptId = 1;
if (parentId > 0) dingTalkParentDeptId = Model.getDtDeptId(parentId);
long dt_dept_id = createDept(accessToken, org_name, dingTalkParentDeptId, sId, parentId == -1);
Model.writeDtDeptId(org_id, String.valueOf(dt_dept_id));
CommonUtil.Print("成功创建部门:" + org_name);
}
}
/**
*
*
* @param access_token
* @param deptId
* @param userId
* @param personName
* @param tel
* @param zhiWei
* @throws ApiException
*/
public static void createPerson(String access_token, long deptId, int userId, String personName, String tel, String zhiWei) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/create");
OapiV2UserCreateRequest req = new OapiV2UserCreateRequest();
req.setUserid(String.valueOf(userId));
req.setName(personName);
req.setMobile(tel);
req.setTitle(zhiWei);
req.setDeptIdList(String.valueOf(deptId));
OapiV2UserCreateResponse rsp = client.execute(req, access_token);
System.out.println(rsp.getBody());
}
/**
*
*
* @param access_token
* @param userId
* @throws ApiException
*/
public static void delPerson(String access_token, int userId) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/delete");
OapiV2UserDeleteRequest req = new OapiV2UserDeleteRequest();
req.setUserid(String.valueOf(userId));
OapiV2UserDeleteResponse rsp = client.execute(req, access_token);
System.out.println(rsp.getBody());
}
public static void updatePerson(String access_token, int person_id, String person_name) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/update");
OapiV2UserUpdateRequest req = new OapiV2UserUpdateRequest();
req.setUserid(String.valueOf(person_id));
req.setName(person_name);
OapiV2UserUpdateResponse rsp = client.execute(req, access_token);
System.out.println(rsp.getBody());
}
public static List<Kv> personList = new ArrayList();
public static void getDeptPerson(String access_token, long dept_id) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listsimple");
long next_cursor = 0;
while (true) {
OapiUserListsimpleRequest req = new OapiUserListsimpleRequest();
req.setDeptId(dept_id);
req.setCursor(next_cursor);
req.setSize(10L);
req.setOrderField("modify_desc");
req.setContainAccessLimit(false);
req.setLanguage("zh_CN");
OapiUserListsimpleResponse rsp = client.execute(req, access_token);
JSONObject jo = JSONObject.parseObject(rsp.getBody());
JSONArray ja = jo.getJSONObject("result").getJSONArray("list");
if (ja == null) return;
for (int i = 0; i < ja.size(); i++) {
JSONObject j = ja.getJSONObject(i);
Kv kv = Kv.create();
String userid = j.getString("userid");
String name = j.getString("name");
kv.set("userid", userid);
kv.set("name", name);
personList.add(kv);
}
if (jo.getJSONObject("result").getBoolean("has_more"))
next_cursor = jo.getJSONObject("result").getLong("next_cursor");
else break;
}
}
public static void getBureauPerson(String access_token, long dept_id) throws ApiException {
personList.clear();
getDeptPerson(access_token, dept_id);
for (int i = 0; i < deptList.size(); i++) {
getDeptPerson(access_token, deptList.get(i).getInt("dept_id"));
}
}
/**
*
*
* @param accessToken
* @param rOrg
* @throws ApiException
*/
public static void initPerson(String accessToken, Record rOrg, int limit) throws ApiException {
int bureauId = rOrg.getInt("org_id");
//云平台
List<Record> list = Model.getDeptPerson(bureauId);
int cnt = 0;
for (Record record : list) {
//控制一下人员数量,防止钉钉的版本问题造成人员添加失败
cnt++;
if (limit > 0 && cnt > limit) break;
// 增加
int person_id = record.getInt("person_id");
String person_name = record.getStr("person_name");
String tel = record.getStr("tel");
tel = DingTalkCommon.getLawfulTel(tel);
long deptId = record.getLong("dingtalk_dept_id");
createPerson(accessToken, deptId, person_id, person_name, tel, "教师");
//回写标识
Model.writePersonDingTalkId(person_id);
CommonUtil.Print("成功加入人员:" + person_name);
DingTalkCommon.WriteActionTimes();
}
}
public static void delAllDept(String access_token) throws ApiException {
for (int i = 0; i < deptList.size(); i++) {
delDept(access_token, deptList.get(i).getLong("dept_id"));
CommonUtil.Print("成功删除部门:" + deptList.get(i).getStr("name"));
}
}
public static void delBureauPerson(String accessToken, Record rOrg) throws ApiException {
int dingtalk_dept_id = rOrg.getInt("dingtalk_dept_id");
getBureauPerson(accessToken, dingtalk_dept_id);
for (int i = 0; i < personList.size(); i++) {
String userid = personList.get(i).getStr("userid");
String person_name = personList.get(i).getStr("name");
delPerson(accessToken, Integer.parseInt(userid));
CommonUtil.Print("成功删除:" + person_name);
}
}
}

@ -0,0 +1,100 @@
package com.dsideal.FengHuang.DingTalk.Util;
import com.dsideal.FengHuang.Util.CommonUtil;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.taobao.api.ApiException;
import java.util.Date;
import java.util.List;
public class Progress {
public static void finishInit() {
List<Record> list = Db.findAll("t_dingtalk_progress");
for (Record record : list) {
Model.saveLastSyncTime(record.getStr("table_name"));
}
}
public static void syncOrg(String accessToken, Record rOrg) throws ApiException {
Date dt = Model.getLastSyncTime("t_base_organization");
//找出变更信息
List<Record> list = Model.getIncrementOrg(rOrg.getInt("org_id"), dt);
for (Record record : list) {
String org_name = record.getStr("org_name");
int sort_id = record.getInt("sort_id");
int b_use = record.getInt("b_use");
if (record.get("dingtalk_dept_id") == null) {
//新增
int parent_id = record.getInt("parent_id");
//查询一下它的父亲的dingtalk_dept_id
long parent_dingtalk_dept_id = Model.getDingTalkOrgId(parent_id);
OrgPerson.createDept(accessToken, org_name, parent_dingtalk_dept_id, sort_id, false);
CommonUtil.Print("新增部门:" + org_name);
} else {
int dingtalk_dept_id = record.getInt("dingtalk_dept_id");
if (b_use == 1) {
//修改
OrgPerson.updateDept(accessToken, dingtalk_dept_id, org_name, sort_id);
CommonUtil.Print("修改部门:" + org_name);
} else {
//删除
OrgPerson.delDept(accessToken, dingtalk_dept_id);
CommonUtil.Print("删除部门:" + org_name);
}
}
}
}
public static void syncPerson(String accessToken, Record rOrg) throws ApiException {
Date dt = Model.getLastSyncTime("t_base_person");
//找出变更信息
List<Record> list = Model.getIncrementPerson(rOrg.getInt("org_id"), dt);
for (Record record : list) {
String person_name = record.getStr("person_name");
int b_use = record.getInt("b_use");
int org_id = record.getInt("org_id");
int person_id = record.getInt("person_id");
String tel = record.getStr("tel");
if (record.get("dingtalk_person_id") == null) {
//新增
long dingtalk_dept_id = Model.getDingTalkOrgId(org_id);
tel = DingTalkCommon.getLawfulTel(tel);
OrgPerson.createPerson(accessToken, dingtalk_dept_id, person_id, person_name, tel, "教师");
CommonUtil.Print("新增人员:" + person_name);
} else {
int dingtalk_dept_id = record.getInt("dingtalk_dept_id");
if (b_use == 1) {
//修改
OrgPerson.updatePerson(accessToken, person_id, person_name);
CommonUtil.Print("修改人员:" + person_name);
} else {
//删除
OrgPerson.delPerson(accessToken, person_id);
CommonUtil.Print("删除人员:" + person_name);
}
}
}
}
public static void syncRolePerson(String accessToken, Record rOrg) throws ApiException {
Date dt = Model.getLastSyncTime("t_sys_person_role");
//找出变更信息
List<Record> list = Model.getIncrementRolePerson(rOrg.getInt("org_id"), dt);
for (Record record : list) {
long dingtalk_role_id = record.getLong("dingtalk_role_id");
int b_use = record.getInt("b_use");
int person_id = record.getInt("person_id");
if (b_use == 1) {
//新增
RolePerson.addRolePerson(accessToken, String.valueOf(dingtalk_role_id), String.valueOf(person_id));
} else {
//删除
RolePerson.delRolePerson(accessToken, String.valueOf(dingtalk_role_id), String.valueOf(person_id));
}
}
}
}

@ -0,0 +1,98 @@
package com.dsideal.FengHuang.DingTalk.Util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.dsideal.FengHuang.Util.CommonUtil;
import com.jfinal.plugin.activerecord.Record;
import com.taobao.api.ApiException;
import java.util.*;
public class RolePerson {
//创建用户组,这个概念似乎不重要,可以手动创建即可
public static long createRoleGroup(String access_token, String group_name) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/role/add_role_group");
OapiRoleAddrolegroupRequest req = new OapiRoleAddrolegroupRequest();
req.setName(group_name);
OapiRoleAddrolegroupResponse rsp = client.execute(req, access_token);
System.out.println(rsp.getBody());
JSONObject jo = JSONObject.parseObject(rsp.getBody());
long groupId = jo.getLong("groupId");
return groupId;
}
public static long createRole(String access_token, String role_name, long group_id) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/role/add_role");
OapiRoleAddRoleRequest req = new OapiRoleAddRoleRequest();
req.setRoleName(role_name);
req.setGroupId(group_id);
OapiRoleAddRoleResponse rsp = client.execute(req, access_token);
JSONObject jo = JSONObject.parseObject(rsp.getBody());
return jo.getLong("roleId");
}
public static void delRole(String access_token, long role_id) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/deleterole");
OapiRoleDeleteroleRequest req = new OapiRoleDeleteroleRequest();
req.setRoleId(role_id);
OapiRoleDeleteroleResponse rsp = client.execute(req, access_token);
System.out.println(rsp.getBody());
}
/**
*
*
* @param access_token
* @param group_id
* @throws ApiException
*/
public static void initRole(String access_token, long group_id) throws ApiException {
//数据库有哪些角色
List<Record> listB = Model.getRoleList();
//增加
for (int i = 0; i < listB.size(); i++) {
long dt_role_id = createRole(access_token, listB.get(i).getStr("role_name"), group_id);
//回写
Model.writeDingTalkRoleId(listB.get(i).getInt("role_id"), dt_role_id);
CommonUtil.Print("成功创建角色:" + listB.get(i).getStr("role_name"));
DingTalkCommon.WriteActionTimes();
}
}
public static void addRolePerson(String accessToken, String role_id, String ids) throws ApiException {
//一次最多20个人员
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/addrolesforemps");
OapiRoleAddrolesforempsRequest req = new OapiRoleAddrolesforempsRequest();
req.setRoleIds(role_id);
req.setUserIds(ids);
OapiRoleAddrolesforempsResponse rsp = client.execute(req, accessToken);
System.out.println(rsp.getBody());
}
public static void delRolePerson(String accessToken, String role_id, String ids) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/removerolesforemps");
OapiRoleRemoverolesforempsRequest req = new OapiRoleRemoverolesforempsRequest();
req.setRoleIds(role_id);
req.setUserIds(ids);
OapiRoleRemoverolesforempsResponse rsp = client.execute(req, accessToken);
System.out.println(rsp.getBody());
}
public static void initPersonRole(String accessToken, Record rOrg) throws ApiException {
//获取云平台侧指定角色下人员信息
List<Record> listPeronRole = Model.getRolePersonReleation(rOrg);
for (Record record : listPeronRole) {
long dingtalk_role_id = record.getLong("dingtalk_role_id");
int person_id = record.getInt("person_id");
RolePerson.addRolePerson(accessToken, String.valueOf(dingtalk_role_id), String.valueOf(person_id));
DingTalkCommon.WriteActionTimes();
}
}
}
Loading…
Cancel
Save