|
@@ -738,6 +738,36 @@ public class DingDingServiceImpl implements DingDingService {
|
|
|
return resultStr;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg fixAttendance(Integer companyId) {
|
|
|
+ //查询负数,重新计算工时
|
|
|
+ List<UserDingdingTime> data = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>().lt("work_hours", 0).eq("company_id", companyId));
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
|
|
|
+ int count = 0;
|
|
|
+ List<UserDingdingTime> upData = new ArrayList<>();
|
|
|
+ for (UserDingdingTime time : data) {
|
|
|
+ LocalDateTime sTime = LocalDateTime.parse("2000-10-10 "+time.getStartTime(),formatter);
|
|
|
+ LocalDateTime eTime = LocalDateTime.parse("2000-10-10 "+time.getEndTime(),formatter);
|
|
|
+ if (eTime.isBefore(sTime)) {
|
|
|
+ eTime = eTime.withHour(23).withMinute(59);
|
|
|
+ }
|
|
|
+ long seconds = Duration.between(sTime, eTime).getSeconds();
|
|
|
+ double hours = seconds/3600.0;
|
|
|
+ UserDingdingTime upItem = new UserDingdingTime();
|
|
|
+ upItem.setId(time.getId());
|
|
|
+ upItem.setWorkHours((float)hours);
|
|
|
+ upData.add(upItem);
|
|
|
+ System.out.println("修改工时为:"+hours);
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ if (count > 0) {
|
|
|
+ userDingdingTimeService.updateBatchById(upData);
|
|
|
+ }
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ msg.setMsg("修复成功"+count+"条");
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
private void getAuthedDeptsAndUsers(CompanyDingding dingding, String accessToken) {
|
|
|
try {
|
|
|
//查找默认角色
|
|
@@ -1805,7 +1835,7 @@ public class DingDingServiceImpl implements DingDingService {
|
|
|
|
|
|
//获取当天的员工考勤数据,包括打卡,请假/出差申请单; 仅企业内部应用有权限
|
|
|
@Override
|
|
|
- public void syncUserWorkData(CompanyDingding dingding, String userId, String startDate, String endDate, boolean showLog) {
|
|
|
+ public void syncUserWorkData(CompanyDingding dingding, String userId, String startDate, String endDate, boolean showLog, boolean onlySyncAttendance) {
|
|
|
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
LocalDate sDate = LocalDate.parse(startDate, dateTimeFormatter);
|
|
|
LocalDate eDate = LocalDate.parse(endDate, dateTimeFormatter);
|
|
@@ -1815,7 +1845,7 @@ public class DingDingServiceImpl implements DingDingService {
|
|
|
LocalDate workDate = sDate.plusDays(i);
|
|
|
String wDate = dateTimeFormatter.format(workDate);
|
|
|
System.out.println("同步钉钉考勤假期出差第:"+i+"天, " + wDate);
|
|
|
- sycUserOneDayWorkData(dingding, userId, wDate, showLog);
|
|
|
+ sycUserOneDayWorkData(dingding, userId, wDate, showLog, onlySyncAttendance);
|
|
|
//到达结束日期,结束了
|
|
|
if (workDate.isEqual(eDate)) {
|
|
|
break;
|
|
@@ -1824,7 +1854,7 @@ public class DingDingServiceImpl implements DingDingService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void sycUserOneDayWorkData(CompanyDingding dingding, String userId, String workDate, boolean showLog) {
|
|
|
+ private void sycUserOneDayWorkData(CompanyDingding dingding, String userId, String workDate, boolean showLog, boolean onlySyncAttendance) {
|
|
|
List<User> userList = null;
|
|
|
if (StringUtils.isEmpty(userId)) {
|
|
|
userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", dingding.getCompanyId()));
|
|
@@ -1889,6 +1919,7 @@ public class DingDingServiceImpl implements DingDingService {
|
|
|
long deltaTimeSec = Duration.between(onDutyEarleast, offDutyLatest).getSeconds();
|
|
|
float hours = deltaTimeSec*1.0f/3600;
|
|
|
cardTime.setWorkHours(hours);
|
|
|
+ if (showLog) System.out.println(user.getName()+", "+cardTime.getWorkDate().toString()+" 上下班打卡时间:"+onDutyEarleast+" - "+offDutyLatest+", 时长:"+hours);
|
|
|
//对比,看看之前是否已经存了
|
|
|
List<UserDingdingTime> old = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>().eq("user_id", user.getId())
|
|
|
.eq("work_date", cardTime.getWorkDate()));
|
|
@@ -1898,74 +1929,77 @@ public class DingDingServiceImpl implements DingDingService {
|
|
|
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.setWay(4);//获取不到钉钉出差的方式,默认为其他方式
|
|
|
- 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);
|
|
|
- trip.setProcinstId(item.getString("procInst_id"));
|
|
|
- trip.setGmtFinished(item.getString("gmt_finished"));
|
|
|
- //检查是否已经存在老的同一个审批单,如果有的话,需要删除
|
|
|
- QueryWrapper<BusinessTrip> queryWrapper = new QueryWrapper<BusinessTrip>().eq("company_id", trip.getCompanyId()).eq("procinst_id", trip.getProcinstId()).ne("gmt_finished", trip.getGmtFinished());
|
|
|
- int oldProIns = businessTripMapper.selectCount(queryWrapper);
|
|
|
- if (oldProIns > 0) {
|
|
|
- businessTripMapper.delete(queryWrapper);
|
|
|
- }
|
|
|
- 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());
|
|
|
- sheet.setGmtFinished(item.getString("gmt_finished"));
|
|
|
- Long cha = sheet.getEndDate().toEpochDay() - sheet.getStartDate().toEpochDay() + 1;
|
|
|
- sheet.setTimeDays((float)cha);
|
|
|
- TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", user.getCompanyId()));
|
|
|
- sheet.setTimeHours(sheet.getTimeDays()*allDay.getAllday());
|
|
|
- sheet.setCompanyId(dingding.getCompanyId());
|
|
|
- sheet.setStatus(0);
|
|
|
- sheet.setProcinstId(item.getString("procInst_id"));
|
|
|
- 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 (!onlySyncAttendance) {
|
|
|
+ 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.setWay(4);//获取不到钉钉出差的方式,默认为其他方式
|
|
|
+ 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);
|
|
|
+ trip.setProcinstId(item.getString("procInst_id"));
|
|
|
+ trip.setGmtFinished(item.getString("gmt_finished"));
|
|
|
+ //检查是否已经存在老的同一个审批单,如果有的话,需要删除
|
|
|
+ QueryWrapper<BusinessTrip> queryWrapper = new QueryWrapper<BusinessTrip>().eq("company_id", trip.getCompanyId()).eq("procinst_id", trip.getProcinstId()).ne("gmt_finished", trip.getGmtFinished());
|
|
|
+ int oldProIns = businessTripMapper.selectCount(queryWrapper);
|
|
|
+ if (oldProIns > 0) {
|
|
|
+ businessTripMapper.delete(queryWrapper);
|
|
|
+ }
|
|
|
+ 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());
|
|
|
+ sheet.setGmtFinished(item.getString("gmt_finished"));
|
|
|
+ Long cha = sheet.getEndDate().toEpochDay() - sheet.getStartDate().toEpochDay() + 1;
|
|
|
+ sheet.setTimeDays((float)cha);
|
|
|
+ TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", user.getCompanyId()));
|
|
|
+ sheet.setTimeHours(sheet.getTimeDays()*allDay.getAllday());
|
|
|
+ sheet.setCompanyId(dingding.getCompanyId());
|
|
|
+ sheet.setStatus(0);
|
|
|
+ sheet.setProcinstId(item.getString("procInst_id"));
|
|
|
+ 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);
|
|
|
+ //检查是否已经有同一个请假申请,有的话就是更新
|
|
|
+ QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<LeaveSheet>().eq("company_id", sheet.getCompanyId()).eq("procinst_id", sheet.getProcinstId()).ne("gmt_finished", sheet.getGmtFinished());
|
|
|
+ int oldProIns = leaveSheetMapper.selectCount(queryWrapper);
|
|
|
+ if (oldProIns > 0) {
|
|
|
+ leaveSheetMapper.delete(queryWrapper);
|
|
|
+ }
|
|
|
+ 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);
|
|
|
- //检查是否已经有同一个请假申请,有的话就是更新
|
|
|
- QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<LeaveSheet>().eq("company_id", sheet.getCompanyId()).eq("procinst_id", sheet.getProcinstId()).ne("gmt_finished", sheet.getGmtFinished());
|
|
|
- int oldProIns = leaveSheetMapper.selectCount(queryWrapper);
|
|
|
- if (oldProIns > 0) {
|
|
|
- leaveSheetMapper.delete(queryWrapper);
|
|
|
- }
|
|
|
- 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);
|
|
|
}
|
|
|
}
|
|
|
}
|