|
@@ -28,7 +28,9 @@ import java.io.File;
|
|
|
import java.io.FileOutputStream;
|
|
|
import java.time.*;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
import static org.mockito.ArgumentMatchers.startsWith;
|
|
|
|
|
@@ -187,6 +189,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
HttpMethod.POST, requestEntity, String.class);
|
|
|
if (responseEntity.getStatusCode() == HttpStatus.OK) {
|
|
|
String resp = responseEntity.getBody();
|
|
|
+ System.out.println(resp);
|
|
|
JSONObject obj = JSONObject.parseObject(resp);
|
|
|
if (obj.getIntValue("errcode") == 0) {
|
|
|
WeiXinCorpController.SUITE_ACCESS_TOKEN = obj.getString("suite_access_token");
|
|
@@ -237,10 +240,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
}
|
|
|
String url = null;
|
|
|
try {
|
|
|
- url = GET_CHECKIN_DAYDATA.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
|
|
|
- HttpHeaders headers = new HttpHeaders();
|
|
|
- headers.setContentType(MediaType.APPLICATION_JSON);
|
|
|
- JSONObject reqParam = new JSONObject();
|
|
|
|
|
|
startDateTime = startDateTime.withHour(0).withMinute(0).withSecond(0).withNano(0);
|
|
|
System.out.println(startDateTime.toString());
|
|
@@ -249,276 +248,293 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
System.out.println(endDateTime.toString());
|
|
|
long endTime = endDateTime.toEpochSecond(ZoneOffset.of("+8"));
|
|
|
System.out.println("startTime="+startTime+",endTime="+endTime);
|
|
|
- reqParam.put("starttime", startTime);
|
|
|
- reqParam.put("endtime", endTime);
|
|
|
|
|
|
- DateTimeFormatter mdFormat = DateTimeFormatter.ofPattern("yyyy/M/d");
|
|
|
+ int batchCount = 1;
|
|
|
+ int batchSize = 100;
|
|
|
+ int totalLength = 1;
|
|
|
+ List<String> corpwxUserIds = new ArrayList<>();
|
|
|
if (userId == null) {
|
|
|
//获取企业下的全部员工
|
|
|
List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).isNotNull("corpwx_userid").eq("is_active", 1));
|
|
|
System.out.println("获取考勤记录users size=="+users.size());
|
|
|
- Object[] objects = users.stream().map(User::getCorpwxUserid).toArray();
|
|
|
- for (Object obj : objects) {
|
|
|
- System.out.println((String)obj);
|
|
|
- }
|
|
|
- reqParam.put("useridlist", objects);
|
|
|
+ corpwxUserIds = users.stream().map(User::getCorpwxUserid).collect(Collectors.toList());
|
|
|
+ totalLength = corpwxUserIds.size();
|
|
|
+ batchCount = totalLength/batchSize+(totalLength%batchSize==0?0:1);
|
|
|
} else {
|
|
|
//指定获取员工
|
|
|
User user = userMapper.selectById(userId);
|
|
|
- Object[] objects = new Object[1];
|
|
|
- objects[0] = user.getCorpwxUserid();
|
|
|
- reqParam.put("useridlist", objects);
|
|
|
+ corpwxUserIds.add(user.getCorpwxUserid());
|
|
|
System.out.println("获取corpwxuserid=="+user.getCorpwxUserid()+"的考勤记录");
|
|
|
}
|
|
|
+ //按批调用
|
|
|
+ for (int i=0;i<batchCount; i++) {
|
|
|
+ int fromIndex = i*batchSize;
|
|
|
+ int toIndex = (i+1) * batchSize;
|
|
|
+ if (toIndex > totalLength) toIndex = totalLength;
|
|
|
+ Object[] objects = corpwxUserIds.subList(fromIndex, toIndex).toArray(new String[0]);
|
|
|
+ reqOnceCardTime(corpInfo, startTime, endTime, objects);
|
|
|
+ }
|
|
|
|
|
|
- HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
|
|
|
- ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
|
|
|
- HttpMethod.POST, requestEntity, String.class);
|
|
|
- if (responseEntity.getStatusCode() == HttpStatus.OK) {
|
|
|
- String resp = responseEntity.getBody();
|
|
|
- System.out.println(resp);
|
|
|
- JSONObject json = JSONObject.parseObject(resp);
|
|
|
- if (json.getIntValue("errcode") == 0) {
|
|
|
- JSONArray datas = json.getJSONArray("datas");
|
|
|
- for (int i=0;i<datas.size(); i++) {
|
|
|
- JSONObject jsonObject = datas.getJSONObject(i);
|
|
|
- JSONObject base_info = jsonObject.getJSONObject("base_info");
|
|
|
- String curUserid = base_info.getString("acctid");
|
|
|
- String name = base_info.getString("name");
|
|
|
- Long time = base_info.getLong("date");
|
|
|
- LocalDate localDate = LocalDateTime.ofInstant(Instant.ofEpochSecond(time), ZoneId.systemDefault()).toLocalDate();
|
|
|
- UserCorpwxTime ct = new UserCorpwxTime();
|
|
|
- ct.setCompanyId(companyId);
|
|
|
- ct.setCorpwxUserid(curUserid);
|
|
|
- ct.setWxCorpid(corpInfo.getCorpid());
|
|
|
- ct.setCreateDate(localDate);
|
|
|
- //计算周几
|
|
|
- ct.setWeekDay(localDate.getDayOfWeek().getValue());
|
|
|
- ct.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(ct.getWeekDay()));
|
|
|
- JSONObject summary_info = jsonObject.getJSONObject("summary_info");
|
|
|
- int sTime = summary_info.getIntValue("earliest_time");//秒
|
|
|
- int eTime = summary_info.getIntValue("lastest_time");//秒
|
|
|
- int regular_work_sec = summary_info.getIntValue("regular_work_sec");//秒
|
|
|
- Integer standard_work_sec = summary_info.getInteger("standard_work_sec");
|
|
|
-
|
|
|
-
|
|
|
- ct.setStartTime(DateTimeUtil.getTimeFromSeconds(sTime));
|
|
|
- ct.setEndTime(DateTimeUtil.getTimeFromSeconds(eTime));
|
|
|
- //直接设置打卡时长,以企业微信的为准,不考虑漏打卡的情况
|
|
|
- ct.setCardTime(DateTimeUtil.getHoursFromSeconds(regular_work_sec));
|
|
|
-
|
|
|
- JSONArray holidayItems = jsonObject.getJSONArray("holiday_infos");
|
|
|
+ } catch (Exception exception) {
|
|
|
+ exception.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void reqOnceCardTime(WxCorpInfo corpInfo, long startTime, long endTime, Object[] objects) throws Exception {
|
|
|
+ DateTimeFormatter mdFormat = DateTimeFormatter.ofPattern("yyyy/M/d");
|
|
|
+ String url = GET_CHECKIN_DAYDATA.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
|
|
|
+ HttpHeaders headers = new HttpHeaders();
|
|
|
+ headers.setContentType(MediaType.APPLICATION_JSON);
|
|
|
+
|
|
|
+ JSONObject reqParam = new JSONObject();
|
|
|
+ reqParam.put("starttime", startTime);
|
|
|
+ reqParam.put("endtime", endTime);
|
|
|
+ reqParam.put("useridlist", objects);
|
|
|
+ HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
|
|
|
+ ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
|
|
|
+ HttpMethod.POST, requestEntity, String.class);
|
|
|
+
|
|
|
+ if (responseEntity.getStatusCode() == HttpStatus.OK) {
|
|
|
+ String resp = responseEntity.getBody();
|
|
|
+ System.out.println(resp);
|
|
|
+ JSONObject json = JSONObject.parseObject(resp);
|
|
|
+ if (json.getIntValue("errcode") == 0) {
|
|
|
+ JSONArray datas = json.getJSONArray("datas");
|
|
|
+ for (int i=0;i<datas.size(); i++) {
|
|
|
+ JSONObject jsonObject = datas.getJSONObject(i);
|
|
|
+ JSONObject base_info = jsonObject.getJSONObject("base_info");
|
|
|
+ String curUserid = base_info.getString("acctid");
|
|
|
+ String name = base_info.getString("name");
|
|
|
+ Long time = base_info.getLong("date");
|
|
|
+ LocalDate localDate = LocalDateTime.ofInstant(Instant.ofEpochSecond(time), ZoneId.systemDefault()).toLocalDate();
|
|
|
+ UserCorpwxTime ct = new UserCorpwxTime();
|
|
|
+ ct.setCompanyId(corpInfo.getCompanyId());
|
|
|
+ ct.setCorpwxUserid(curUserid);
|
|
|
+ ct.setWxCorpid(corpInfo.getCorpid());
|
|
|
+ ct.setCreateDate(localDate);
|
|
|
+ //计算周几
|
|
|
+ ct.setWeekDay(localDate.getDayOfWeek().getValue());
|
|
|
+ ct.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(ct.getWeekDay()));
|
|
|
+ JSONObject summary_info = jsonObject.getJSONObject("summary_info");
|
|
|
+ int sTime = summary_info.getIntValue("earliest_time");//秒
|
|
|
+ int eTime = summary_info.getIntValue("lastest_time");//秒
|
|
|
+ int regular_work_sec = summary_info.getIntValue("regular_work_sec");//秒
|
|
|
+ Integer standard_work_sec = summary_info.getInteger("standard_work_sec");
|
|
|
+
|
|
|
+
|
|
|
+ ct.setStartTime(DateTimeUtil.getTimeFromSeconds(sTime));
|
|
|
+ ct.setEndTime(DateTimeUtil.getTimeFromSeconds(eTime));
|
|
|
+ //直接设置打卡时长,以企业微信的为准,不考虑漏打卡的情况
|
|
|
+ ct.setCardTime(DateTimeUtil.getHoursFromSeconds(regular_work_sec));
|
|
|
+
|
|
|
+ JSONArray holidayItems = jsonObject.getJSONArray("holiday_infos");
|
|
|
// if (eTime == sTime) {
|
|
|
- //开始时间和结束时间一样,说明下班没有打卡,需要提取请假的最晚时间作为下班打卡时间
|
|
|
- String lastestOffworkTime = null;
|
|
|
- boolean needRecaculate = false;
|
|
|
- for (int t=0;t<holidayItems.size(); t++) {
|
|
|
- JSONObject holiday = holidayItems.getJSONObject(t);
|
|
|
- JSONObject spTitle = holiday.getJSONObject("sp_title");
|
|
|
- JSONArray data = spTitle.getJSONArray("data");
|
|
|
- for (int m=0;m<data.size(); m++) {
|
|
|
- String leaveText = data.getJSONObject(m).getString("text");
|
|
|
- if (leaveText.startsWith("请假")) {
|
|
|
- //获取对应位置的请假时间段
|
|
|
- String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
|
|
|
- String[] s = string.split(" ");
|
|
|
- //获取到请假的开始时间和结束时间
|
|
|
- String leaveEnd = s[4];
|
|
|
- String leaveStart = s[1];
|
|
|
- //请假开始的日期和结束的日期
|
|
|
- String dateStart = localDate.getYear() + "/" + s[0];
|
|
|
- String dateEnd = localDate.getYear() + "/" +s[3];
|
|
|
- LocalDate sDate = LocalDate.parse(dateStart, mdFormat);
|
|
|
- LocalDate eDate = LocalDate.parse(dateEnd, mdFormat);
|
|
|
- if (sDate.isEqual(eDate)) {
|
|
|
- //请假在一天内
|
|
|
+ //开始时间和结束时间一样,说明下班没有打卡,需要提取请假的最晚时间作为下班打卡时间
|
|
|
+ String lastestOffworkTime = null;
|
|
|
+ boolean needRecaculate = false;
|
|
|
+ for (int t=0;t<holidayItems.size(); t++) {
|
|
|
+ JSONObject holiday = holidayItems.getJSONObject(t);
|
|
|
+ JSONObject spTitle = holiday.getJSONObject("sp_title");
|
|
|
+ JSONArray data = spTitle.getJSONArray("data");
|
|
|
+ for (int m=0;m<data.size(); m++) {
|
|
|
+ String leaveText = data.getJSONObject(m).getString("text");
|
|
|
+ if (leaveText.startsWith("请假")) {
|
|
|
+ //获取对应位置的请假时间段
|
|
|
+ String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
|
|
|
+ String[] s = string.split(" ");
|
|
|
+ //获取到请假的开始时间和结束时间
|
|
|
+ String leaveEnd = s[4];
|
|
|
+ String leaveStart = s[1];
|
|
|
+ //请假开始的日期和结束的日期
|
|
|
+ String dateStart = localDate.getYear() + "/" + s[0];
|
|
|
+ String dateEnd = localDate.getYear() + "/" +s[3];
|
|
|
+ LocalDate sDate = LocalDate.parse(dateStart, mdFormat);
|
|
|
+ LocalDate eDate = LocalDate.parse(dateEnd, mdFormat);
|
|
|
+ if (sDate.isEqual(eDate)) {
|
|
|
+ //请假在一天内
|
|
|
+ if (leaveEnd.equals("下午")) {
|
|
|
+ if (leaveStart.equals("上午")) {
|
|
|
+ leaveEnd = "18:00";//上午和下午都请假,算全天
|
|
|
+ leaveStart = "09:00";
|
|
|
+ } else {
|
|
|
+ leaveStart = "14:00";
|
|
|
+ leaveEnd = "18:00";//请假的下班打卡时间,算上午结束的时间
|
|
|
+ }
|
|
|
+ } else if (leaveEnd.equals("上午")){
|
|
|
+ //上午请假
|
|
|
+ leaveEnd = "14:00";
|
|
|
+ leaveStart = "09:00";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ System.out.println("跨天请假@@@@");
|
|
|
+ System.out.println("当天=="+localDate+", sDate=" + sDate+", 比较="+(localDate.isEqual(sDate)));
|
|
|
+ //跨天请假
|
|
|
+ if (localDate.isEqual(sDate)) {
|
|
|
+ //当前日期就是最后一天,需判断上下午半天请假的情况
|
|
|
+ if (leaveStart.equals("上午")) {
|
|
|
+ leaveEnd = "18:00";//上午开始请假的算全天
|
|
|
+ leaveStart = "09:00";
|
|
|
+ } else {
|
|
|
+ leaveStart = "14:00";
|
|
|
+ leaveEnd = "18:00";//下午开始请假的,算半天
|
|
|
+ }
|
|
|
+ } else if (localDate.isEqual(eDate)) {
|
|
|
+ //当前日期就是最后一天,需判断上下午半天请假的情况
|
|
|
if (leaveEnd.equals("下午")) {
|
|
|
- if (leaveStart.equals("上午")) {
|
|
|
- leaveEnd = "18:00";//上午和下午都请假,算全天
|
|
|
- leaveStart = "09:00";
|
|
|
- } else {
|
|
|
- leaveStart = "14:00";
|
|
|
- leaveEnd = "18:00";//请假的下班打卡时间,算上午结束的时间
|
|
|
- }
|
|
|
+ leaveEnd = "18:00";//请假到最后一天的下午,就算是全天
|
|
|
+ leaveStart = "09:00";
|
|
|
} else if (leaveEnd.equals("上午")){
|
|
|
//上午请假
|
|
|
leaveEnd = "14:00";
|
|
|
leaveStart = "09:00";
|
|
|
}
|
|
|
} else {
|
|
|
- System.out.println("跨天请假@@@@");
|
|
|
- System.out.println("当天=="+localDate+", sDate=" + sDate+", 比较="+(localDate.isEqual(sDate)));
|
|
|
- //跨天请假
|
|
|
- if (localDate.isEqual(sDate)) {
|
|
|
- //当前日期就是最后一天,需判断上下午半天请假的情况
|
|
|
- if (leaveStart.equals("上午")) {
|
|
|
- leaveEnd = "18:00";//上午开始请假的算全天
|
|
|
- leaveStart = "09:00";
|
|
|
- } else {
|
|
|
- leaveStart = "14:00";
|
|
|
- leaveEnd = "18:00";//下午开始请假的,算半天
|
|
|
- }
|
|
|
- } else if (localDate.isEqual(eDate)) {
|
|
|
- //当前日期就是最后一天,需判断上下午半天请假的情况
|
|
|
- if (leaveEnd.equals("下午")) {
|
|
|
- leaveEnd = "18:00";//请假到最后一天的下午,就算是全天
|
|
|
- leaveStart = "09:00";
|
|
|
- } else if (leaveEnd.equals("上午")){
|
|
|
- //上午请假
|
|
|
- leaveEnd = "14:00";
|
|
|
- leaveStart = "09:00";
|
|
|
- }
|
|
|
- } else {
|
|
|
- //中间日期就是全天
|
|
|
- leaveEnd = "00:00";
|
|
|
- leaveStart = "00:00";
|
|
|
- System.out.println("===中间天请假===");
|
|
|
- }
|
|
|
+ //中间日期就是全天
|
|
|
+ leaveEnd = "00:00";
|
|
|
+ leaveStart = "00:00";
|
|
|
+ System.out.println("===中间天请假===");
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
|
|
|
- if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(leaveStart) > 0) {
|
|
|
- ct.setStartTime(leaveStart);
|
|
|
- needRecaculate = true;
|
|
|
- }
|
|
|
- if (ct.getEndTime().compareTo(leaveEnd) < 0) {
|
|
|
- ct.setEndTime(leaveEnd);
|
|
|
- needRecaculate = true;
|
|
|
- }
|
|
|
- } else if (leaveText.startsWith("外出")) {
|
|
|
- String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
|
|
|
- String[] s = string.split(" ");
|
|
|
- //获取到外出的开始时间和结束时间
|
|
|
- String outEnd = s[4];
|
|
|
- String outStart = s[1];
|
|
|
-
|
|
|
- //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
|
|
|
- if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(outStart) > 0) {
|
|
|
- ct.setStartTime(outStart);
|
|
|
- needRecaculate = true;
|
|
|
- }
|
|
|
- if (ct.getEndTime().compareTo(outEnd) < 0) {
|
|
|
- ct.setEndTime(outEnd);
|
|
|
- needRecaculate = true;
|
|
|
- }
|
|
|
+ //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
|
|
|
+ if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(leaveStart) > 0) {
|
|
|
+ ct.setStartTime(leaveStart);
|
|
|
+ needRecaculate = true;
|
|
|
+ }
|
|
|
+ if (ct.getEndTime().compareTo(leaveEnd) < 0) {
|
|
|
+ ct.setEndTime(leaveEnd);
|
|
|
+ needRecaculate = true;
|
|
|
+ }
|
|
|
+ } else if (leaveText.startsWith("外出")) {
|
|
|
+ String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
|
|
|
+ String[] s = string.split(" ");
|
|
|
+ //获取到外出的开始时间和结束时间
|
|
|
+ String outEnd = s[4];
|
|
|
+ String outStart = s[1];
|
|
|
+
|
|
|
+ //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
|
|
|
+ if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(outStart) > 0) {
|
|
|
+ ct.setStartTime(outStart);
|
|
|
+ needRecaculate = true;
|
|
|
+ }
|
|
|
+ if (ct.getEndTime().compareTo(outEnd) < 0) {
|
|
|
+ ct.setEndTime(outEnd);
|
|
|
+ needRecaculate = true;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- double timeDelta = 0;
|
|
|
- //时间有变化,需要重新计算
|
|
|
- if (needRecaculate) {
|
|
|
- timeDelta = DateTimeUtil.getHoursFromSeconds(DateTimeUtil.getSecondsFromTime(ct.getEndTime()) - DateTimeUtil.getSecondsFromTime(ct.getStartTime()));
|
|
|
- if (ct.getEndTime().compareTo("13:30") >= 0) {
|
|
|
- //重新计算打卡工时时,需要减去中间午休时间
|
|
|
- timeDelta -= 1.0;
|
|
|
- }
|
|
|
- } else {
|
|
|
- timeDelta = ct.getCardTime();
|
|
|
+ }
|
|
|
+ double timeDelta = 0;
|
|
|
+ //时间有变化,需要重新计算
|
|
|
+ if (needRecaculate) {
|
|
|
+ timeDelta = DateTimeUtil.getHoursFromSeconds(DateTimeUtil.getSecondsFromTime(ct.getEndTime()) - DateTimeUtil.getSecondsFromTime(ct.getStartTime()));
|
|
|
+ if (ct.getEndTime().compareTo("13:30") >= 0) {
|
|
|
+ //重新计算打卡工时时,需要减去中间午休时间
|
|
|
+ timeDelta -= 1.0;
|
|
|
}
|
|
|
+ } else {
|
|
|
+ timeDelta = ct.getCardTime();
|
|
|
+ }
|
|
|
|
|
|
- System.out.println("上下班间隔时长为=="+timeDelta);
|
|
|
+ System.out.println("上下班间隔时长为=="+timeDelta);
|
|
|
// double hoursFromDouble = DateTimeUtil.getHoursFromDouble(hoursFromSeconds);
|
|
|
// System.out.println("四舍五入后cardTime时间=="+hoursFromDouble);
|
|
|
// ct.setCardTime(hoursFromSeconds);
|
|
|
|
|
|
- ct.setName(name);
|
|
|
- //解析请假和外出的情况
|
|
|
- JSONArray sp_items = jsonObject.getJSONArray("sp_items");
|
|
|
- for (int j=0;j<sp_items.size(); j++) {
|
|
|
- JSONObject spItem = sp_items.getJSONObject(j);
|
|
|
- switch (spItem.getInteger("type")) {
|
|
|
- case 1://请假
|
|
|
- Double leaveTime = ct.getAskLeaveTime();
|
|
|
- if (leaveTime == null) {
|
|
|
- leaveTime = 0.0;
|
|
|
- }
|
|
|
- ct.setAskLeaveTime(leaveTime + DateTimeUtil.getHoursFromSeconds(spItem.getInteger("duration")));
|
|
|
- break;
|
|
|
- case 2://补卡
|
|
|
- case 3://出差
|
|
|
- case 4://外出
|
|
|
- case 100://外勤
|
|
|
- Double outdoorTime = ct.getOutdoorTime();
|
|
|
- if (outdoorTime == null) {
|
|
|
- outdoorTime = 0.0;
|
|
|
- }
|
|
|
- double otTime = DateTimeUtil.getHoursFromSeconds(spItem.getInteger("duration"));
|
|
|
- if (otTime > 8.0) {
|
|
|
- otTime = 8.0;
|
|
|
- }
|
|
|
- ct.setOutdoorTime(outdoorTime + otTime);
|
|
|
- break;
|
|
|
- }
|
|
|
+ ct.setName(name);
|
|
|
+ //解析请假和外出的情况
|
|
|
+ JSONArray sp_items = jsonObject.getJSONArray("sp_items");
|
|
|
+ for (int j=0;j<sp_items.size(); j++) {
|
|
|
+ JSONObject spItem = sp_items.getJSONObject(j);
|
|
|
+ switch (spItem.getInteger("type")) {
|
|
|
+ case 1://请假
|
|
|
+ Double leaveTime = ct.getAskLeaveTime();
|
|
|
+ if (leaveTime == null) {
|
|
|
+ leaveTime = 0.0;
|
|
|
+ }
|
|
|
+ ct.setAskLeaveTime(leaveTime + DateTimeUtil.getHoursFromSeconds(spItem.getInteger("duration")));
|
|
|
+ break;
|
|
|
+ case 2://补卡
|
|
|
+ case 3://出差
|
|
|
+ case 4://外出
|
|
|
+ case 100://外勤
|
|
|
+ Double outdoorTime = ct.getOutdoorTime();
|
|
|
+ if (outdoorTime == null) {
|
|
|
+ outdoorTime = 0.0;
|
|
|
+ }
|
|
|
+ double otTime = DateTimeUtil.getHoursFromSeconds(spItem.getInteger("duration"));
|
|
|
+ if (otTime > 8.0) {
|
|
|
+ otTime = 8.0;
|
|
|
+ }
|
|
|
+ ct.setOutdoorTime(outdoorTime + otTime);
|
|
|
+ break;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- //获取请假的最早和最晚时间
|
|
|
- for (int t=0;t<holidayItems.size(); t++) {
|
|
|
- JSONObject holiday = holidayItems.getJSONObject(t);
|
|
|
- JSONObject spTitle = holiday.getJSONObject("sp_title");
|
|
|
- JSONArray data = spTitle.getJSONArray("data");
|
|
|
- for (int m=0;m<data.size(); m++) {
|
|
|
- String leaveText = data.getJSONObject(m).getString("text");
|
|
|
- if (leaveText.startsWith("请假")) {
|
|
|
- //获取对应位置的请假时间段
|
|
|
- String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
|
|
|
- String[] s = string.split(" ");
|
|
|
- //获取到请假的开始时间和结束时间
|
|
|
- String leaveStart = s[1];
|
|
|
- String leaveEnd = s[4];
|
|
|
-
|
|
|
- //检查请假时间段是否在打卡的时间范围内
|
|
|
- if ("上午".equals(leaveEnd) || "下午".equals(leaveEnd)) {
|
|
|
- //半天或者全天请假, 上面已经处理过结束时间为请假之前的时间了,此处不需要再处理了
|
|
|
- System.out.println("====半天或者全天请假 =转化为8小时制下的时间="+(ct.getAskLeaveTime()/24*8.0));
|
|
|
- ct.setAskLeaveTime(ct.getAskLeaveTime()/24*8.0);//转换成一天8小时工作制
|
|
|
- } else if (ct.getStartTime().compareTo(leaveStart) <= 0 && ct.getEndTime().compareTo(leaveEnd) >= 0) {
|
|
|
- String hourLeaveTime = leaveText.replaceAll("请假", "").replaceAll("小时", "");
|
|
|
- System.out.println("请假时长=" + hourLeaveTime);
|
|
|
+ //获取请假的最早和最晚时间
|
|
|
+ for (int t=0;t<holidayItems.size(); t++) {
|
|
|
+ JSONObject holiday = holidayItems.getJSONObject(t);
|
|
|
+ JSONObject spTitle = holiday.getJSONObject("sp_title");
|
|
|
+ JSONArray data = spTitle.getJSONArray("data");
|
|
|
+ for (int m=0;m<data.size(); m++) {
|
|
|
+ String leaveText = data.getJSONObject(m).getString("text");
|
|
|
+ if (leaveText.startsWith("请假")) {
|
|
|
+ //获取对应位置的请假时间段
|
|
|
+ String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
|
|
|
+ String[] s = string.split(" ");
|
|
|
+ //获取到请假的开始时间和结束时间
|
|
|
+ String leaveStart = s[1];
|
|
|
+ String leaveEnd = s[4];
|
|
|
+
|
|
|
+ //检查请假时间段是否在打卡的时间范围内
|
|
|
+ if ("上午".equals(leaveEnd) || "下午".equals(leaveEnd)) {
|
|
|
+ //半天或者全天请假, 上面已经处理过结束时间为请假之前的时间了,此处不需要再处理了
|
|
|
+ System.out.println("====半天或者全天请假 =转化为8小时制下的时间="+(ct.getAskLeaveTime()/24*8.0));
|
|
|
+ ct.setAskLeaveTime(ct.getAskLeaveTime()/24*8.0);//转换成一天8小时工作制
|
|
|
+ } else if (ct.getStartTime().compareTo(leaveStart) <= 0 && ct.getEndTime().compareTo(leaveEnd) >= 0) {
|
|
|
+ String hourLeaveTime = leaveText.replaceAll("请假", "").replaceAll("小时", "");
|
|
|
+ System.out.println("请假时长=" + hourLeaveTime);
|
|
|
// ct.setCardTime(ct.getCardTime() - Double.parseDouble(hourLeaveTime));
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- //校正请假时长
|
|
|
- if (ct.getAskLeaveTime() != null && ct.getAskLeaveTime() == 24.0) {
|
|
|
- ct.setAskLeaveTime(8.0);//24小时为一天,修正为8小时
|
|
|
- }
|
|
|
- //如果有出差的,但是没有打卡,则用出差的时间作为timeDelta
|
|
|
- if (timeDelta < 8.0 && ct.getOutdoorTime() > 0) {
|
|
|
- timeDelta += ct.getOutdoorTime();
|
|
|
- }
|
|
|
- double workHours = timeDelta - ct.getAskLeaveTime();
|
|
|
- if (workHours < 0) {
|
|
|
- workHours = 0;
|
|
|
- }
|
|
|
- System.out.println("工作时长=="+workHours);
|
|
|
- ct.setWorkHours(DateTimeUtil.getHoursFromDouble(workHours));
|
|
|
+ }
|
|
|
+ //校正请假时长
|
|
|
+ if (ct.getAskLeaveTime() != null && ct.getAskLeaveTime() == 24.0) {
|
|
|
+ ct.setAskLeaveTime(8.0);//24小时为一天,修正为8小时
|
|
|
+ }
|
|
|
+ //如果有出差的,但是没有打卡,则用出差的时间作为timeDelta
|
|
|
+ if (timeDelta < 8.0 && ct.getOutdoorTime() > 0) {
|
|
|
+ timeDelta += ct.getOutdoorTime();
|
|
|
+ }
|
|
|
+ double workHours = timeDelta - ct.getAskLeaveTime();
|
|
|
+ if (workHours < 0) {
|
|
|
+ workHours = 0;
|
|
|
+ }
|
|
|
+ System.out.println("工作时长=="+workHours);
|
|
|
+ ct.setWorkHours(DateTimeUtil.getHoursFromDouble(workHours));
|
|
|
// if (regular_work_sec < standard_work_sec) {
|
|
|
// ct.setWorkHours(DateTimeUtil.getHoursFromDouble(ct.getCardTime() + ct.getOutdoorTime()));
|
|
|
// } else {
|
|
|
// ct.setWorkHours(DateTimeUtil.getHoursFromDouble(ct.getCardTime()));
|
|
|
// }
|
|
|
|
|
|
- UserCorpwxTime item = userCorpwxTimeMapper.selectOne(new QueryWrapper<UserCorpwxTime>().eq("corpwx_userid", curUserid)
|
|
|
- .eq("create_date", localDate));
|
|
|
- if (item != null) {
|
|
|
- ct.setId(item.getId());
|
|
|
- //已存在记录,进行更新
|
|
|
- userCorpwxTimeMapper.updateById(ct);
|
|
|
- } else {
|
|
|
- userCorpwxTimeMapper.insert(ct);
|
|
|
- }
|
|
|
+ UserCorpwxTime item = userCorpwxTimeMapper.selectOne(new QueryWrapper<UserCorpwxTime>().eq("corpwx_userid", curUserid)
|
|
|
+ .eq("create_date", localDate));
|
|
|
+ if (item != null) {
|
|
|
+ ct.setId(item.getId());
|
|
|
+ //已存在记录,进行更新
|
|
|
+ userCorpwxTimeMapper.updateById(ct);
|
|
|
+ } else {
|
|
|
+ userCorpwxTimeMapper.insert(ct);
|
|
|
}
|
|
|
- } else {
|
|
|
- throw new Exception(json.toJSONString());
|
|
|
}
|
|
|
+ } else {
|
|
|
+ throw new Exception(json.toJSONString());
|
|
|
}
|
|
|
- } catch (Exception exception) {
|
|
|
- exception.printStackTrace();
|
|
|
}
|
|
|
-
|
|
|
- return msg;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
}
|