|
@@ -369,15 +369,19 @@ public class DingDingServiceImpl implements DingDingService {
|
|
/**
|
|
/**
|
|
* 获取钉钉内部企业的token
|
|
* 获取钉钉内部企业的token
|
|
*/
|
|
*/
|
|
- private OapiGettokenResponse getInnerCorpToken() throws ApiException {
|
|
|
|
- DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
|
|
|
|
- OapiGettokenRequest request = new OapiGettokenRequest();
|
|
|
|
- request.setAppkey(appkey);
|
|
|
|
- request.setAppsecret(appsecret);
|
|
|
|
- request.setHttpMethod("GET");
|
|
|
|
- OapiGettokenResponse response = client.execute(request);
|
|
|
|
- System.out.println(response.getBody());
|
|
|
|
- return response;
|
|
|
|
|
|
+ private String getInnerCorpToken(CompanyDingding dingding) throws ApiException {
|
|
|
|
+ if (dingding.getInnerToken() == null || LocalDateTime.now().isAfter(dingding.getInnerExpireTime())) {
|
|
|
|
+ DefaultDingTalkClient client= new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_corp_token");
|
|
|
|
+ OapiServiceGetCorpTokenRequest req= new OapiServiceGetCorpTokenRequest();
|
|
|
|
+ req.setAuthCorpid(dingding.getCorpid());
|
|
|
|
+ OapiServiceGetCorpTokenResponse response= client.execute(req,dingding.getCustomAppkey(),dingding.getCustomAppsecret(),"anything");
|
|
|
|
+ if (!response.isSuccess()) {
|
|
|
|
+ System.err.println("获取企业内部token:"+response.getErrorCode()+":"+response.getErrmsg());
|
|
|
|
+ }
|
|
|
|
+ dingding.setInnerToken(response.getAccessToken());
|
|
|
|
+ dingding.setInnerExpireTime(LocalDateTime.now().plusSeconds(response.getExpiresIn()));
|
|
|
|
+ }
|
|
|
|
+ return dingding.getInnerToken();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1085,14 +1089,6 @@ public class DingDingServiceImpl implements DingDingService {
|
|
//指定的某个公司
|
|
//指定的某个公司
|
|
CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
|
|
CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
|
|
syncOneCompWorkData(dingding, workDate);
|
|
syncOneCompWorkData(dingding, workDate);
|
|
- } else {
|
|
|
|
- //全部的
|
|
|
|
- List<TimeType> timeTypes = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_dingding", 1));
|
|
|
|
- List<Integer> companyIds = timeTypes.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
|
|
|
|
- List<CompanyDingding> dingdingList = companyDingdingMapper.selectList(new QueryWrapper<CompanyDingding>().in("company_id", companyIds));
|
|
|
|
- for (CompanyDingding dingding : dingdingList) {
|
|
|
|
- syncOneCompWorkData(dingding, workDate);
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1231,124 +1227,123 @@ public class DingDingServiceImpl implements DingDingService {
|
|
List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", dingding.getCompanyId()));
|
|
List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", dingding.getCompanyId()));
|
|
String accessToken = null;
|
|
String accessToken = null;
|
|
try {
|
|
try {
|
|
- accessToken = getInnerCorpToken().getAccessToken();
|
|
|
|
- } catch (ApiException e) {
|
|
|
|
- e.printStackTrace();
|
|
|
|
- }
|
|
|
|
- for (User user : userList) {
|
|
|
|
- DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getupdatedata");
|
|
|
|
- OapiAttendanceGetupdatedataRequest req = new OapiAttendanceGetupdatedataRequest();
|
|
|
|
- req.setUserid(user.getDingdingUserid());
|
|
|
|
- req.setWorkDate(StringUtils.parseDateTime(workDate + " 00:00:00"));
|
|
|
|
- OapiAttendanceGetupdatedataResponse rsp = null;
|
|
|
|
- try {
|
|
|
|
- rsp = client.execute(req, accessToken);
|
|
|
|
- System.out.println(user.getName());
|
|
|
|
- System.out.println(rsp.getBody());
|
|
|
|
- JSONObject json = JSONObject.parseObject(rsp.getBody());
|
|
|
|
- JSONObject result = json.getJSONObject("result");
|
|
|
|
- //考勤数据
|
|
|
|
- JSONArray attendanceList = result.getJSONArray("attendance_result_list");
|
|
|
|
- UserDingdingTime cardTime = new UserDingdingTime();
|
|
|
|
- cardTime.setCompanyId(dingding.getCompanyId());
|
|
|
|
- cardTime.setUserId(user.getId());
|
|
|
|
- cardTime.setDingdingCorpid(dingding.getCorpid());
|
|
|
|
- cardTime.setDingdingUserid(user.getDingdingUserid());
|
|
|
|
- LocalDateTime onDutyEarleast = null;
|
|
|
|
- LocalDateTime offDutyLatest = null;
|
|
|
|
-
|
|
|
|
- for (int i=0;i<attendanceList.size(); i++) {
|
|
|
|
- JSONObject attItem = attendanceList.getJSONObject(i);
|
|
|
|
- String checkType = attItem.getString("check_type");
|
|
|
|
- String checkTime = attItem.getString("user_check_time");
|
|
|
|
- LocalDateTime dateTime = LocalDateTime.parse(checkTime, timeDtf);
|
|
|
|
- cardTime.setWorkDate(dateTime.toLocalDate());
|
|
|
|
- //计算周几
|
|
|
|
- cardTime.setWeekDay(cardTime.getWorkDate().getDayOfWeek().getValue());
|
|
|
|
- cardTime.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(cardTime.getWeekDay()));
|
|
|
|
- if ("OnDuty".equals(checkType)) {
|
|
|
|
- //上班时间
|
|
|
|
- cardTime.setStartTime(mmDtf.format(dateTime));
|
|
|
|
- onDutyEarleast = dateTime;
|
|
|
|
- } else {
|
|
|
|
- //下班
|
|
|
|
- cardTime.setEndTime(mmDtf.format(dateTime));
|
|
|
|
- offDutyLatest = dateTime;
|
|
|
|
|
|
+ accessToken = getInnerCorpToken(dingding);
|
|
|
|
+ for (User user : userList) {
|
|
|
|
+ DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getupdatedata");
|
|
|
|
+ OapiAttendanceGetupdatedataRequest req = new OapiAttendanceGetupdatedataRequest();
|
|
|
|
+ req.setUserid(user.getDingdingUserid());
|
|
|
|
+ req.setWorkDate(StringUtils.parseDateTime(workDate + " 00:00:00"));
|
|
|
|
+ OapiAttendanceGetupdatedataResponse rsp = null;
|
|
|
|
+ try {
|
|
|
|
+ rsp = client.execute(req, accessToken);
|
|
|
|
+ System.out.println(user.getName());
|
|
|
|
+ System.out.println(rsp.getBody());
|
|
|
|
+ JSONObject json = JSONObject.parseObject(rsp.getBody());
|
|
|
|
+ JSONObject result = json.getJSONObject("result");
|
|
|
|
+ //考勤数据
|
|
|
|
+ JSONArray attendanceList = result.getJSONArray("attendance_result_list");
|
|
|
|
+ UserDingdingTime cardTime = new UserDingdingTime();
|
|
|
|
+ cardTime.setCompanyId(dingding.getCompanyId());
|
|
|
|
+ cardTime.setUserId(user.getId());
|
|
|
|
+ cardTime.setDingdingCorpid(dingding.getCorpid());
|
|
|
|
+ cardTime.setDingdingUserid(user.getDingdingUserid());
|
|
|
|
+ LocalDateTime onDutyEarleast = null;
|
|
|
|
+ LocalDateTime offDutyLatest = null;
|
|
|
|
+
|
|
|
|
+ for (int i=0;i<attendanceList.size(); i++) {
|
|
|
|
+ JSONObject attItem = attendanceList.getJSONObject(i);
|
|
|
|
+ String checkType = attItem.getString("check_type");
|
|
|
|
+ String checkTime = attItem.getString("user_check_time");
|
|
|
|
+ LocalDateTime dateTime = LocalDateTime.parse(checkTime, timeDtf);
|
|
|
|
+ cardTime.setWorkDate(dateTime.toLocalDate());
|
|
|
|
+ //计算周几
|
|
|
|
+ cardTime.setWeekDay(cardTime.getWorkDate().getDayOfWeek().getValue());
|
|
|
|
+ cardTime.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(cardTime.getWeekDay()));
|
|
|
|
+ if ("OnDuty".equals(checkType)) {
|
|
|
|
+ //上班时间
|
|
|
|
+ cardTime.setStartTime(mmDtf.format(dateTime));
|
|
|
|
+ onDutyEarleast = dateTime;
|
|
|
|
+ } else {
|
|
|
|
+ //下班
|
|
|
|
+ cardTime.setEndTime(mmDtf.format(dateTime));
|
|
|
|
+ offDutyLatest = dateTime;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
- if (onDutyEarleast != null && offDutyLatest != null) {
|
|
|
|
- long seconds = (offDutyLatest.getSecond()- onDutyEarleast.getSecond());
|
|
|
|
- float hours = (offDutyLatest.getHour() - onDutyEarleast.getHour()) + seconds*1.0f/3600;
|
|
|
|
- cardTime.setWorkHours(hours);
|
|
|
|
- //对比,看看之前是否已经存了
|
|
|
|
- List<UserDingdingTime> old = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>().eq("user_id", user.getId())
|
|
|
|
- .eq("work_date", cardTime.getWorkDate()));
|
|
|
|
- if (old.size() > 0) {
|
|
|
|
- cardTime.setId(old.get(0).getId());
|
|
|
|
|
|
+ if (onDutyEarleast != null && offDutyLatest != null) {
|
|
|
|
+ long seconds = (offDutyLatest.getSecond()- onDutyEarleast.getSecond());
|
|
|
|
+ float hours = (offDutyLatest.getHour() - onDutyEarleast.getHour()) + seconds*1.0f/3600;
|
|
|
|
+ cardTime.setWorkHours(hours);
|
|
|
|
+ //对比,看看之前是否已经存了
|
|
|
|
+ List<UserDingdingTime> old = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>().eq("user_id", user.getId())
|
|
|
|
+ .eq("work_date", cardTime.getWorkDate()));
|
|
|
|
+ if (old.size() > 0) {
|
|
|
|
+ cardTime.setId(old.get(0).getId());
|
|
|
|
+ }
|
|
|
|
+ userDingdingTimeService.saveOrUpdate(cardTime);
|
|
}
|
|
}
|
|
- userDingdingTimeService.saveOrUpdate(cardTime);
|
|
|
|
- }
|
|
|
|
|
|
|
|
- //请假和出差的审批单列表
|
|
|
|
- JSONArray approveList = result.getJSONArray("approve_list");
|
|
|
|
- for (int i=0;i<approveList.size(); i++) {
|
|
|
|
- JSONObject item = approveList.getJSONObject(i);
|
|
|
|
- String tagName = item.getString("tag_name");
|
|
|
|
- if ("出差".equals(tagName)) {
|
|
|
|
- BusinessTrip trip = new BusinessTrip();
|
|
|
|
- trip.setOwnerId(user.getId());
|
|
|
|
- trip.setOwnerName(user.getName());
|
|
|
|
- trip.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
|
|
|
|
- trip.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
|
|
|
|
- trip.setCompanyId(dingding.getCompanyId());
|
|
|
|
- Long cha = trip.getEndDate().toEpochDay() - trip.getStartDate().toEpochDay() + 1;
|
|
|
|
- trip.setDayCount(Integer.parseInt(cha.toString()));
|
|
|
|
- trip.setStatus(0);
|
|
|
|
- int cnt = businessTripMapper.selectCount(new QueryWrapper<BusinessTrip>().eq("owner_id", user.getId())
|
|
|
|
- .eq("start_date", trip.getStartDate())
|
|
|
|
- .eq("end_date", trip.getEndDate()));
|
|
|
|
- if (cnt == 0) {
|
|
|
|
- businessTripMapper.insert(trip);
|
|
|
|
- }
|
|
|
|
- } else if ("请假".equals(tagName)) {
|
|
|
|
- LeaveSheet sheet = new LeaveSheet();
|
|
|
|
- sheet.setOwnerId(user.getId());
|
|
|
|
- sheet.setOwnerName(user.getName());
|
|
|
|
- sheet.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
|
|
|
|
- sheet.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
|
|
|
|
- Long cha = sheet.getEndDate().toEpochDay() - sheet.getStartDate().toEpochDay() + 1;
|
|
|
|
- sheet.setTimeDays((float)cha);
|
|
|
|
- sheet.setCompanyId(dingding.getCompanyId());
|
|
|
|
- sheet.setStatus(0);
|
|
|
|
- String dLeaveType = item.getString("sub_type");
|
|
|
|
- if (!dLeaveType.endsWith("假")) dLeaveType = dLeaveType + "假";
|
|
|
|
- int leaveTypeIndex = -1;
|
|
|
|
- for (int t=0;t<Constant.LEAVE_TYPES.length; t++) {
|
|
|
|
- if (Constant.LEAVE_TYPES[t].equals(dLeaveType)) {
|
|
|
|
- leaveTypeIndex = t;
|
|
|
|
- break;
|
|
|
|
|
|
+ //请假和出差的审批单列表
|
|
|
|
+ JSONArray approveList = result.getJSONArray("approve_list");
|
|
|
|
+ for (int i=0;i<approveList.size(); i++) {
|
|
|
|
+ JSONObject item = approveList.getJSONObject(i);
|
|
|
|
+ String tagName = item.getString("tag_name");
|
|
|
|
+ if ("出差".equals(tagName)) {
|
|
|
|
+ BusinessTrip trip = new BusinessTrip();
|
|
|
|
+ trip.setOwnerId(user.getId());
|
|
|
|
+ trip.setOwnerName(user.getName());
|
|
|
|
+ trip.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
|
|
|
|
+ trip.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
|
|
|
|
+ trip.setCompanyId(dingding.getCompanyId());
|
|
|
|
+ Long cha = trip.getEndDate().toEpochDay() - trip.getStartDate().toEpochDay() + 1;
|
|
|
|
+ trip.setDayCount(Integer.parseInt(cha.toString()));
|
|
|
|
+ trip.setStatus(0);
|
|
|
|
+ int cnt = businessTripMapper.selectCount(new QueryWrapper<BusinessTrip>().eq("owner_id", user.getId())
|
|
|
|
+ .eq("start_date", trip.getStartDate())
|
|
|
|
+ .eq("end_date", trip.getEndDate()));
|
|
|
|
+ if (cnt == 0) {
|
|
|
|
+ businessTripMapper.insert(trip);
|
|
|
|
+ }
|
|
|
|
+ } else if ("请假".equals(tagName)) {
|
|
|
|
+ LeaveSheet sheet = new LeaveSheet();
|
|
|
|
+ sheet.setOwnerId(user.getId());
|
|
|
|
+ sheet.setOwnerName(user.getName());
|
|
|
|
+ sheet.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
|
|
|
|
+ sheet.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
|
|
|
|
+ Long cha = sheet.getEndDate().toEpochDay() - sheet.getStartDate().toEpochDay() + 1;
|
|
|
|
+ sheet.setTimeDays((float)cha);
|
|
|
|
+ sheet.setCompanyId(dingding.getCompanyId());
|
|
|
|
+ sheet.setStatus(0);
|
|
|
|
+ String dLeaveType = item.getString("sub_type");
|
|
|
|
+ if (!dLeaveType.endsWith("假")) dLeaveType = dLeaveType + "假";
|
|
|
|
+ int leaveTypeIndex = -1;
|
|
|
|
+ for (int t=0;t<Constant.LEAVE_TYPES.length; t++) {
|
|
|
|
+ if (Constant.LEAVE_TYPES[t].equals(dLeaveType)) {
|
|
|
|
+ leaveTypeIndex = t;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (leaveTypeIndex == -1) {
|
|
|
|
+ leaveTypeIndex = Constant.LEAVE_TYPES.length-1;
|
|
|
|
+ }
|
|
|
|
+ sheet.setLeaveType(leaveTypeIndex);
|
|
|
|
+ int cnt = leaveSheetMapper.selectCount(new QueryWrapper<LeaveSheet>().eq("owner_id", user.getId())
|
|
|
|
+ .eq("start_date", sheet.getStartDate())
|
|
|
|
+ .eq("end_date", sheet.getEndDate()));
|
|
|
|
+ if (cnt == 0) {
|
|
|
|
+ leaveSheetMapper.insert(sheet);
|
|
}
|
|
}
|
|
- }
|
|
|
|
- if (leaveTypeIndex == -1) {
|
|
|
|
- leaveTypeIndex = Constant.LEAVE_TYPES.length-1;
|
|
|
|
- }
|
|
|
|
- sheet.setLeaveType(leaveTypeIndex);
|
|
|
|
- int cnt = leaveSheetMapper.selectCount(new QueryWrapper<LeaveSheet>().eq("owner_id", user.getId())
|
|
|
|
- .eq("start_date", sheet.getStartDate())
|
|
|
|
- .eq("end_date", sheet.getEndDate()));
|
|
|
|
- if (cnt == 0) {
|
|
|
|
- leaveSheetMapper.insert(sheet);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ } catch (ApiException e) {
|
|
|
|
+ e.printStackTrace();
|
|
}
|
|
}
|
|
- } catch (ApiException e) {
|
|
|
|
- e.printStackTrace();
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
+ }
|
|
|
|
+ } catch (ApiException e) {
|
|
|
|
+ e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
private void syncOneComp(CompanyDingding dingding, String targetUserId, String startDate, String endDate) {
|
|
private void syncOneComp(CompanyDingding dingding, String targetUserId, String startDate, String endDate) {
|
|
List<User> userList = new ArrayList<>();
|
|
List<User> userList = new ArrayList<>();
|
|
if (!StringUtils.isEmpty(targetUserId)) {
|
|
if (!StringUtils.isEmpty(targetUserId)) {
|
|
@@ -1382,8 +1377,8 @@ public class DingDingServiceImpl implements DingDingService {
|
|
OapiAttendanceListRecordResponse rsp = null;
|
|
OapiAttendanceListRecordResponse rsp = null;
|
|
try {
|
|
try {
|
|
rsp = client.execute(req, accessToken);
|
|
rsp = client.execute(req, accessToken);
|
|
- System.out.println(rsp);
|
|
|
|
if (rsp.getErrcode() == 0) {
|
|
if (rsp.getErrcode() == 0) {
|
|
|
|
+ System.out.println(rsp.getBody());
|
|
//正常
|
|
//正常
|
|
JSONArray array = JSONObject.parseObject(rsp.getBody()).getJSONArray("recordresult");
|
|
JSONArray array = JSONObject.parseObject(rsp.getBody()).getJSONArray("recordresult");
|
|
List<DdingCardTimeItem> list = new ArrayList<DdingCardTimeItem>();
|
|
List<DdingCardTimeItem> list = new ArrayList<DdingCardTimeItem>();
|
|
@@ -1464,12 +1459,10 @@ public class DingDingServiceImpl implements DingDingService {
|
|
} else {
|
|
} else {
|
|
//报错了
|
|
//报错了
|
|
System.err.println("同步钉钉考勤报错 "+rsp.getErrcode()+":"+rsp.getErrmsg());
|
|
System.err.println("同步钉钉考勤报错 "+rsp.getErrcode()+":"+rsp.getErrmsg());
|
|
- System.err.println("同步钉钉考勤报错 "+rsp.getErrcode()+":"+rsp.getErrmsg());
|
|
|
|
}
|
|
}
|
|
} catch (ApiException e) {
|
|
} catch (ApiException e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
- System.out.println(rsp.getBody());
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|