diff --git a/src/main/java/com/dsideal/FengHuang/DingTalk/Init.java b/src/main/java/com/dsideal/FengHuang/DingTalk/Full.java similarity index 88% rename from src/main/java/com/dsideal/FengHuang/DingTalk/Init.java rename to src/main/java/com/dsideal/FengHuang/DingTalk/Full.java index 3ca0fc6..a99c49c 100644 --- a/src/main/java/com/dsideal/FengHuang/DingTalk/Init.java +++ b/src/main/java/com/dsideal/FengHuang/DingTalk/Full.java @@ -1,9 +1,6 @@ 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.OrgPerson; -import com.dsideal.FengHuang.DingTalk.Util.RolePerson; +import com.dsideal.FengHuang.DingTalk.Util.*; import com.dsideal.FengHuang.Util.CommonUtil; import com.jfinal.kit.PropKit; import com.jfinal.plugin.activerecord.ActiveRecordPlugin; @@ -12,7 +9,7 @@ import com.jfinal.plugin.activerecord.dialect.MysqlDialect; import com.jfinal.plugin.druid.DruidPlugin; import com.jfinal.plugin.redis.RedisPlugin; -public class Init { +public class Full { public static void main(String[] args_) throws Exception { PropKit.use("dingtalk.properties"); @@ -59,5 +56,8 @@ public class Init { //RolePerson.initPersonRole(accessToken, rOrg); CommonUtil.Print("恭喜,所有操作成功完成!"); + + // 记录全量同步完成时间 + Progress.finishInit(); } } diff --git a/src/main/java/com/dsideal/FengHuang/DingTalk/Increment.java b/src/main/java/com/dsideal/FengHuang/DingTalk/Increment.java new file mode 100644 index 0000000..3f945f1 --- /dev/null +++ b/src/main/java/com/dsideal/FengHuang/DingTalk/Increment.java @@ -0,0 +1,56 @@ +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.OrgPerson; +import com.dsideal.FengHuang.DingTalk.Util.Progress; +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; +import com.jfinal.plugin.redis.RedisPlugin; + +import java.util.Date; +import java.util.List; + +public class Increment { + + public static void main(String[] args_) throws Exception { + PropKit.use("dingtalk.properties"); + final String appKey = PropKit.get("appKey"); + String appSecret = PropKit.get("appSecret"); + + 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(); + + //accessToken + String accessToken = DingTalkCommon.getAccessToken(appKey, appSecret); + + //同步钉钉与云平台中部门信息 + String orgName = "103中学"; + Record rOrg = Model.getOrgByOrgName(orgName); + + //1、组织机构 + Progress.syncOrg(accessToken, rOrg); + + //2、人员 +// dt = Progress.getLastSyncTime("t_base_person"); +// +// //3、人员角色关系 +// dt = Progress.getLastSyncTime("t_sys_person_role"); + + CommonUtil.Print("恭喜,所有操作成功完成!"); + } +} diff --git a/src/main/java/com/dsideal/FengHuang/DingTalk/Sql/对现有表结构的修改.sql b/src/main/java/com/dsideal/FengHuang/DingTalk/Sql/对现有表结构的修改.sql new file mode 100644 index 0000000..827ffae --- /dev/null +++ b/src/main/java/com/dsideal/FengHuang/DingTalk/Sql/对现有表结构的修改.sql @@ -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`; diff --git a/src/main/java/com/dsideal/FengHuang/DingTalk/Util/Model.java b/src/main/java/com/dsideal/FengHuang/DingTalk/Util/Model.java index 14effbf..0384fc8 100644 --- a/src/main/java/com/dsideal/FengHuang/DingTalk/Util/Model.java +++ b/src/main/java/com/dsideal/FengHuang/DingTalk/Util/Model.java @@ -4,6 +4,7 @@ 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 { @@ -40,6 +41,11 @@ public class Model { 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); @@ -67,7 +73,27 @@ public class Model { 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 list=Db.find(sql,rOrg.getInt("org_id")); + List 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 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 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"); + } } diff --git a/src/main/java/com/dsideal/FengHuang/DingTalk/Util/OrgPerson.java b/src/main/java/com/dsideal/FengHuang/DingTalk/Util/OrgPerson.java index 0da7cf8..bf07562 100644 --- a/src/main/java/com/dsideal/FengHuang/DingTalk/Util/OrgPerson.java +++ b/src/main/java/com/dsideal/FengHuang/DingTalk/Util/OrgPerson.java @@ -12,6 +12,7 @@ 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; @@ -154,16 +155,16 @@ public class OrgPerson { * @param zhiWei * @throws ApiException */ - public static void createPerson(String access_token, String deptId, String userId, String personName, String tel, String zhiWei) throws ApiException { + public static void createPerson(String access_token, String 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(userId); + req.setUserid(String.valueOf(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()); + System.out.println(rsp.getBody()); } /** @@ -249,7 +250,7 @@ public class OrgPerson { cnt++; if (limit > 0 && cnt > limit) break; // 增加 - String person_id = record.getStr("person_id"); + int person_id = record.getInt("person_id"); String person_name = record.getStr("person_name"); String tel = record.getStr("tel"); //模拟处理一下手机号 @@ -259,6 +260,9 @@ public class OrgPerson { } long deptId = record.getLong("dingtalk_dept_id"); createPerson(accessToken, String.valueOf(deptId), person_id, person_name, tel, "教师"); + //回写标识 + Model.writePersonDingTalkId(person_id); + CommonUtil.Print("成功加入人员:" + person_name); DingTalkCommon.WriteActionTimes(); } diff --git a/src/main/java/com/dsideal/FengHuang/DingTalk/Util/Progress.java b/src/main/java/com/dsideal/FengHuang/DingTalk/Util/Progress.java new file mode 100644 index 0000000..1196935 --- /dev/null +++ b/src/main/java/com/dsideal/FengHuang/DingTalk/Util/Progress.java @@ -0,0 +1,51 @@ +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 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 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); + } + } + } + } +}