公司最近企业系统要与钉钉考勤打卡数据对接,所以需要拿到钉钉上月员工的考勤打卡数据。配置了spring定时任务,任务类步骤如下:
引入钉钉相关JAR包

一:获得tooken
1、需要公司钉钉管理员给开发人员开放考勤权限。
2、开发人员登录钉钉开放平台(创建小程序–拿到corpId、corpSecret)

 private static String accessTokenUrl = "https://oapi.dingtalk.com/gettoken";private static String corpId = "生成的corpId";private static String corpSecret = "生成的corpSecret";//获得tokenpublic static String getAccessToken() {DefaultDingTalkClient client = new DefaultDingTalkClient(accessTokenUrl);OapiGettokenRequest request = new OapiGettokenRequest();request.setAppkey(corpId);request.setAppsecret(corpSecret);request.setHttpMethod("GET");OapiGettokenResponse response=null;try {response = client.execute(request);   } catch (ApiException e) {// TODO Auto-generated catch blocke.printStackTrace();}String access_token=response.getAccessToken();return access_token;//获取access_token}

二:获取所有部门

 //获得部门list  idpublic static List<Department> getDeptId() {DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/list");OapiDepartmentListRequest request = new OapiDepartmentListRequest();request.setId("");request.setHttpMethod("GET");OapiDepartmentListResponse response_deptId=null;try {response_deptId = client.execute(request, getAccessToken());} catch (ApiException e) {// TODO Auto-generated catch blocke.printStackTrace();}List<Department> deptId_list=response_deptId.getDepartment();return deptId_list;}

三:根据部门编号,获得所有员工信息。

因为钉钉暂未放开获得所有员工userID的接口,所以目前只能迂回查出所有员工的userID

1、先查到所有部门编号;
2、根据部门编号查出人员。)

 //获得人员信息
public static List<Userlist> getUser(){DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/simplelist");OapiUserSimplelistRequest request = new OapiUserSimplelistRequest();OapiUserSimplelistResponse execute=null;request.setHttpMethod("GET");//循环部门编号List<Userlist> allUserlist=new ArrayList<>();for (Department dept_id : getDeptId()) {request.setDepartmentId(dept_id.getId());try {execute = client.execute(request,getAccessToken());//循环每一个部门下的userallUserlist.addAll(execute.getUserlist());} catch (ApiException e) {System.out.println(execute.getMsg());System.out.println(execute.getErrmsg());// TODO Auto-generated catch blocke.printStackTrace();} }Map <String , Userlist> map =new HashMap<>();for (Userlist userlist : allUserlist) {if (map.containsKey(userlist.getUserid())) {continue;}else {map.put(userlist.getUserid(), userlist);}}List<Userlist> person_list=new ArrayList<>();person_list.addAll(map.values());return person_list;
}

四:持久化数据。钉钉userID与企业系统的userID,建立企业人员与考勤打卡数据关联关系

 //插入员工对应idpublic void insertUserId() {DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get");OapiUserGetRequest request = new OapiUserGetRequest();List<Userlist> list =getUser();for (Userlist userlist : list) {request.setUserid(userlist.getUserid());request.setHttpMethod("GET");try {OapiUserGetResponse response = client.execute(request, getAccessToken());AttendanceQvo dto=new AttendanceQvo();dto.setUserId(response.getUserid());dto.setJobnumber(response.getJobnumber());dto.setCreate_tm(getmonthLastDay().substring(0,7));t9z_workAttendanceDAO.insertT9z_dd_power(dto);} catch (ApiException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

五:根据钉钉userID持久化数据,上月每个员工的考勤打卡数据

因为钉钉考勤数据跨度最大为7天,最多只能查7天数据。因此,需要对上月进行拆分
1、获取上月每个7天的开始日期、结束日期。
2、如果最后一个时间跨入不够7天,就拿月末日期。
3、持久化数据

  //插入考勤public void insertCheck() {DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/attendance/list");OapiAttendanceListRequest request = new OapiAttendanceListRequest();List<Userlist> allUserlist=getUser();//拿到上个月初的时间SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Calendar cal = Calendar.getInstance();cal.setTime(new Date());cal.add(Calendar.MONTH, -1);cal.set(Calendar.DAY_OF_MONTH,cal.getActualMinimum(Calendar.DAY_OF_MONTH));String time_from=sdf.format(cal.getTime());//上个月天数int day=Integer.parseInt(getmonthLastDay().substring(8));//求得一个月有几个7天int j=0;if(day%7==0) {j=day/7;}else {j=day/7+1;}String time_to="";for(int i=1;i<=j;i++) {if(i>1) {time_from=getDateAfterNDays(time_to,1);}time_to=getDateAfterNDays(time_from,6);//最后一次循环,则time_to=本月最后一天if(i==j) {time_to=getmonthLastDay();}//循环给日期周期for (Userlist userlist : allUserlist) {request.setWorkDateFrom(time_from+" 00:00:00");request.setWorkDateTo(time_to+" 23:59:59");request.setOffset(0L);request.setLimit((long) 50);request.setUserIdList(Arrays.asList(userlist.getUserid()));try {OapiAttendanceListResponse response = client.execute(request,getAccessToken());List<Recordresult> list= response.getRecordresult();for (Recordresult recordresult : list) {t9z_workAttendanceDAO.insertWorkAttendance(new AttendanceQvo(recordresult));}} catch (ApiException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//如果截至日期为月末日期,则插入完毕,跳出循环if(time_to.compareTo(getmonthLastDay())==0) {break;}}}

补充:插入考勤数据,第五步用到以下两个方法,直接调用

 //获取N天之后日期public String getDateAfterNDays(String dateTime, int days) {Calendar calendar = Calendar.getInstance();String[] dateTimeArray = dateTime.split("-");int year = Integer.parseInt(dateTimeArray[0]);int month = Integer.parseInt(dateTimeArray[1]);int day = Integer.parseInt(dateTimeArray[2]);calendar.set(year, month - 1, day);long time = calendar.getTimeInMillis();// 给定时间与1970 年 1 月 1 日的00:00:00.000的差,以毫秒显示calendar.setTimeInMillis(time + days * 1000 * 60 * 60 * 24);// 用给定的 long值设置此Calendar的当前时间值//String result_year=calendar.get(Calendar.YEAR)+ "-" + (calendar.get(Calendar.MONTH) + 1)+ "-" + calendar.get(Calendar.DAY_OF_MONTH);String end_month="";int result_month=calendar.get(Calendar.MONTH) + 1;if(result_month<10) {end_month="0"+result_month+"";}else {end_month=result_month+"";}String end_day="";int result_day=calendar.get(Calendar.DAY_OF_MONTH);if(result_day<10) {end_day="0"+result_day+"";}else {end_day=result_day+"";}String end=calendar.get(Calendar.YEAR)+ "-"+end_month+"-"+end_day;return end;}
 //获取上个月最后一天public String getmonthLastDay(){SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");Calendar calendar=Calendar.getInstance();int month=calendar.get(Calendar.MONTH);calendar.set(Calendar.MONTH, month-1);calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));return sf.format(calendar.getTime());}

钉钉考勤与企业系统对接相关推荐

  1. 对接钉钉审批_钉钉审批对接是什么-和钉钉审批对接相关的问题-阿里云开发者社区...

    关于 钉钉审批对接的搜索结果 问题 企业系统对接钉钉生成审批单,企业系统处理审批后,如何撤销钉钉审批单 公司erp系统与钉钉对接,erp发起审批后同步到钉钉生成审批实例,在erp中用户处理了审批,如何 ...

  2. DingTalk「开发者说」如何开发钉钉高价值应用三部曲

    一.钉钉是什么? 钉钉是企业应用数字化的操作系统 简单来说,钉钉是企业应用数字化的操作系统,就如同PC上的windows操作系统一样,我们可以在上面安装各种应用比如office.WPS,用于企业的各种 ...

  3. 钉钉考勤接口调用与OA系统数据对接(多线程版)

    钉钉考勤接口调用与OA系统数据对接(多线程版) 公司由原来的指纹打卡更换为钉钉打卡,需要钉钉和现有的OA考勤数据对接(合并钉钉打卡数据和OA上的请假,外出,出差数据),因为人数增减单线程定时任务数据抓 ...

  4. 钉钉考勤接口调用与OA系统数据对接

    钉钉考勤接口调用与OA系统数据对接 公司由原来的指纹打卡更换为钉钉打卡,需要钉钉和现有的OA考勤数据对接(合并钉钉打卡数据和OA上的请假,外出,出差数据) 1.查看钉钉接口文档 https://din ...

  5. 对接钉钉消息通知_接入钉钉API发送企业消息

    工作中有个需求,是要把录入的销售机会由系统自动分配给销售,然后对接钉钉给销售人员发送企业消息,通知他进行跟单. 参考资料 1. 获取Access_Token Access_Token是企业访问钉钉开放 ...

  6. 【钉钉-场景化能力包】企业系统与钉钉通讯录同步

    客户痛点 企业HR系统常有的业务痛点: [企业管理难度大] 制造业基本为劳动密集型企业,大量员工使企业考勤.薪酬管理等方面难度增大,人工核算需大量的时间和人员,且容易出现错漏,因此涉及薪酬方面,工厂也 ...

  7. 系统对接方案_钉钉报销单对接财务系统解决方案

    方案简介: 钉钉报销单对接财务系统解决方案,在客户利用钉钉提供的审批流程引擎和表单工具实现电子报销流程的同时,帮助客户将产生的电子单据数据同步到财务系统,智能自动生成财务凭证. 用户痛点: 易对接解决 ...

  8. 企业对接钉钉流程(企业内部应用-H5)

    企业对接钉钉流程(企业内部应用-H5微应用) 开发前准备: 企业自主研发H5微应用 官方文档写的很全了,非常值得细读. 本片,我们企业要接入钉钉(企业内部应用-H5微应用),取钉钉后台数据用. 开发前 ...

  9. 钉钉企业内部应用 - 获取考勤打卡结果

    本文是根据钉钉官方文档归纳所出,最后有 PHP 测试成功的 demo. 概述 钉钉登录是基于 OAuth2.0 协议标准构建的钉钉 OAuth2.0 授权登录系统. 在进行钉钉 OAuth2.0 授权 ...

最新文章

  1. python3 判断ip有效性 是否是内网ip
  2. paddleocr win10 编译
  3. JDK8安装及设置环境变量
  4. 云服务器怎么查看文件目录结构,查看云服务器目录结构图
  5. xp2003服务器怎么安装系统,UEFI里启动Windows XP/Server 2003 x86教程
  6. hbase 查询固定条数_HBase原理深入
  7. hp-ux修改时区方法_UX研究人员可以倡导人类的6种方法
  8. 全站HTTPS底层实现原理
  9. LRU算法java实现
  10. postgresql linux rpm,postgresql 9.6 rpm包安装 CentOS 7.2 X64
  11. 2021年中国船用蓄电池市场趋势报告、技术动态创新及2027年市场预测
  12. WDM驱动程序的基本结构和实例
  13. ERP100人物.第25期【风里来云里去兮,风行天下志更坚】 风云子
  14. 白盒测试——循环测试
  15. 2022.11.27 第10次周报
  16. 洋洋背古诗(2021)
  17. 关于印发《深圳市工业和信息化局绿色制造试点示范管理暂行办法》的通知
  18. 浅谈Android和IOS系统的差异
  19. 『津津乐道播客』#134. 不是纹个皮皮虾你就能叫黑涩会了(嘉宾:索大)
  20. 蚁剑从入门到魔改【二】· 编解码器原理及改造

热门文章

  1. 这些程序员常用快捷键你了解吗?让你的双手在键盘上起舞
  2. C语言结构体字节对齐规则
  3. unity简单计时器_简单且悦目的Pomodoro计时器
  4. kvm 4.磁盘格式简介及使用磁盘格式转换的方式拍摄快照
  5. 菜鸟用编辑器做传送门——kura酱长期更新
  6. oracle remap schema,oracle 10g DATA PUMP 的REMAP_SCHEMA和REMAP_TABLESPA
  7. 语c语言描写,【自由の翼】语c介绍
  8. 设计模式——访问者模式
  9. android 系统 安卓8,安卓系统竟可以这么流畅!最快Android 8.0来了
  10. 推荐系统 | 基础推荐模型 | GBDT+LR模型 | Python实现