|
@@ -1232,6 +1232,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
for (int m = 0; m < data.size(); m++) {
|
|
|
String leaveText = data.getJSONObject(m).getString("text");
|
|
|
if (leaveText.contains("假") || leaveText.contains("休")) {
|
|
|
+ //只要有请假,就重新计算
|
|
|
+ needRecaculate = true;
|
|
|
//获取对应位置的请假时间段
|
|
|
String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
|
|
|
String[] s = string.split(" |\\~");
|
|
@@ -1324,15 +1326,25 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
//获取请假最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
|
|
|
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;
|
|
|
}
|
|
|
//计算请假时长, 企业微信的请假时长不准
|
|
|
if (needRecaculate) {
|
|
|
-
|
|
|
+ //完全包含请假时间段的,需要减去请假时间、
|
|
|
+ double minusRest = 0;
|
|
|
+ if (leaveStart.compareTo(baseMorningEnd) <= 0 && leaveEnd.compareTo(baseAfternoonStart) >= 0) {
|
|
|
+ minusRest = restTime;
|
|
|
+ } else {
|
|
|
+ if (leaveStart.compareTo(baseAfternoonStart) <= 0 && leaveStart.compareTo(baseMorningEnd) >= 0) {
|
|
|
+ leaveStart = baseAfternoonStart;
|
|
|
+ }
|
|
|
+ if (leaveEnd.compareTo(baseAfternoonStart) <= 0 && leaveEnd.compareTo(baseMorningEnd) >= 0) {
|
|
|
+ leaveEnd = baseMorningEnd;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //请假的时段如果包含了休息时间段,需要减去休息时间
|
|
|
String[] endSplit = leaveEnd.split(":");
|
|
|
String[] startSplit = leaveStart.split(":");
|
|
|
int endHour = Integer.parseInt(endSplit[0]);
|
|
@@ -1340,16 +1352,14 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
int startHour = Integer.parseInt(startSplit[0]);
|
|
|
int startMin = Integer.parseInt(startSplit[1]);
|
|
|
double leaveHour = endHour - startHour;
|
|
|
- //请假这天是全天请假,则需要减去中间的午休时间
|
|
|
- if (leaveStart.compareTo(baseMorningEnd) < 0 && leaveEnd.compareTo(baseAfternoonStart) > 0) {
|
|
|
- leaveHour = leaveHour - restTime;
|
|
|
- }
|
|
|
+ //请假时段包含了休息时间,则需要减去中间的午休时间
|
|
|
+
|
|
|
int leaveMin = endMin - startMin;
|
|
|
double leaveTotalMin = leaveHour * 60 + leaveMin;
|
|
|
if (leaveTotalMin < 0) {
|
|
|
leaveTotalMin = 0;
|
|
|
}
|
|
|
- double leaveTotalHour = leaveTotalMin / 60;
|
|
|
+ double leaveTotalHour = leaveTotalMin / 60 - minusRest;
|
|
|
if (showLog) System.out.println("重新计算请假时长:"+leaveStart+"--"+leaveEnd+", 时间间隔="+leaveTotalHour);
|
|
|
if (ct.getAskLeaveTime() != null && ct.getAskLeaveTime() > 0) {
|
|
|
//可能一天有多个请假单
|
|
@@ -1357,10 +1367,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
} else {
|
|
|
ct.setAskLeaveTime(leaveTotalHour);
|
|
|
}
|
|
|
-
|
|
|
if (showLog) System.out.println("请假时长为:"+ct.getAskLeaveTime()+"小时");
|
|
|
}
|
|
|
-
|
|
|
} else if (leaveText.startsWith("外出") || leaveText.startsWith("出差") || leaveText.startsWith("外勤")) {
|
|
|
//格式 "10/17 09:00 / 10/19 18:00", "10/17 上午 / 10/17 下午"
|
|
|
String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
|
|
@@ -1473,6 +1481,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
JSONObject spItem = sp_items.getJSONObject(j);
|
|
|
switch (spItem.getInteger("type")) {
|
|
|
case 1://请假
|
|
|
+ //单独计算请假时间
|
|
|
// Double leaveTime = ct.getAskLeaveTime();
|
|
|
// if (leaveTime == null) {
|
|
|
// leaveTime = 0.0;
|
|
@@ -1637,52 +1646,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
ct.setEndTime(baseMorningEnd);
|
|
|
if (showLog) System.out.println("再次校正,下午请假");
|
|
|
}
|
|
|
-
|
|
|
- //校正出差时间
|
|
|
- //获取请假的最早和最晚时间
|
|
|
-// boolean morningBusTrip = false;
|
|
|
-// boolean afternoonBusTrip = 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.contains("出差")) {
|
|
|
-// //获取对应位置的出差时间段
|
|
|
-// String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
|
|
|
-// String[] s = string.split(" |\\~");
|
|
|
-// boolean isOldFormat = false;
|
|
|
-// if (s.length < 5) {
|
|
|
-// isOldFormat = true;
|
|
|
-// }
|
|
|
-// //获取到出差的开始时间和结束时间
|
|
|
-// String leaveStart = s[1];
|
|
|
-// String leaveEnd = isOldFormat ? s[3] : s[4];
|
|
|
-//
|
|
|
-// //检查出差时间段是否在打卡的时间范围内
|
|
|
-// if ("上午".equals(leaveEnd) || "下午".equals(leaveEnd)) {
|
|
|
-// //半天或者全天请假, 上面已经处理过结束时间为请假之前的时间了,此处不需要再处理了
|
|
|
-// if (ct.getAskLeaveTime() >= 12) {
|
|
|
-// if (showLog)
|
|
|
-// System.out.println("====半天或者全天出差 =转化为8小时制下的时间=" + (ct.getAskLeaveTime() / 24 * 8.0));
|
|
|
-// //12小时以上的,是请假半天或者全天的。 防止1天有2次上下午分开的请假,导致计算两次的错误
|
|
|
-// ct.setOutdoorTime(ct.getAskLeaveTime() / 24 * 8.0);//转换成一天8小时工作制
|
|
|
-// }
|
|
|
-// if ("上午".equals(leaveStart)) {
|
|
|
-// morningBusTrip = true;
|
|
|
-// }
|
|
|
-// if ("下午".equals(leaveEnd)) {
|
|
|
-// afternoonBusTrip = true;
|
|
|
-// }
|
|
|
-// } else if (ct.getStartTime().compareTo(leaveStart) <= 0 && ct.getEndTime().compareTo(leaveEnd) >= 0) {
|
|
|
-// String hourLeaveTime = leaveText.replaceAll("出差", "").replaceAll("小时", "");
|
|
|
-// if (showLog) System.out.println("出差时长=" + hourLeaveTime);
|
|
|
-//// ct.setCardTime(ct.getCardTime() - Double.parseDouble(hourLeaveTime));
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }
|
|
|
}
|
|
|
}
|
|
|
|