|
@@ -164,7 +164,6 @@ public class FKLImplService implements FKLService {
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/// 缓存考勤自定义列
|
|
|
private List<Map> columns;
|
|
|
|
|
@@ -183,15 +182,24 @@ public class FKLImplService implements FKLService {
|
|
|
|
|
|
// 考勤列, 假期信息定义
|
|
|
List<String> columnNames = Arrays.asList("旷工天数", "出勤天数", "工作时长", "考勤结果", "出差时长", "迟到次数", "早退次数", "下班缺卡次数", "上班缺卡次数", "外出时长", "休息日加班", "工作日加班", "节假日加班", "严重迟到次数", "应出勤天数");
|
|
|
+ AtomicReference<String> fileId_attendance_days = new AtomicReference<>(""); // 出勤天数字段id
|
|
|
+ AtomicReference<String> fileId_attendance_result = new AtomicReference<>(""); // 考勤结果字段id
|
|
|
List<Map> columns = getColumns();
|
|
|
Map columnIds = new HashMap();
|
|
|
// 假期单独返回, 钉钉产品规则
|
|
|
List<String> leaveNames = columns.stream().filter(column -> {
|
|
|
+ if ("出勤天数".equals(column.get("name"))) {
|
|
|
+ fileId_attendance_days.set(String.valueOf(column.get("id")));
|
|
|
+ }
|
|
|
+ if ("考勤结果".equals(column.get("name"))) {
|
|
|
+ fileId_attendance_result.set(String.valueOf(column.get("id")));
|
|
|
+ }
|
|
|
// 列类型储存id映射名称为map, 考勤数据返回仅保留列id
|
|
|
if (columnNames.contains(column.get("name"))) {
|
|
|
columnIds.put(column.get("id").toString(), column.get("name"));
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
return column.get("alias").equals("leave_");
|
|
|
}
|
|
|
).map(column -> String.valueOf(column.get("name"))).collect(Collectors.toList());
|
|
@@ -202,7 +210,8 @@ public class FKLImplService implements FKLService {
|
|
|
userInfos.forEach(po -> {
|
|
|
Map attendanceInfo = UtilMap.map("员工ID, 员工姓名, 员工工号, 所属部门, 考勤状态", po.getUserId(), po.getName(), po.getJobNumber(), po.getDeptName(), po.getRemark());
|
|
|
// 累计月度汇总
|
|
|
- ddClient_attendance.getAttColumnVal(ddClient.getAccessToken(), po.getUserId(), queryIds, start, end).forEach(column -> {
|
|
|
+ List<Map> attendanceList = ddClient_attendance.getAttColumnVal(ddClient.getAccessToken(), po.getUserId(), queryIds, start, end);
|
|
|
+ attendanceList.forEach(column -> {
|
|
|
String id = ((Map) column.get("column_vo")).get("id").toString();
|
|
|
String name = String.valueOf(columnIds.get(id)); // 接口仅返回列id, 通过map映射
|
|
|
attendanceInfo.put(name, _reduceAttendance(column, name, "column_vals"));
|
|
@@ -320,39 +329,36 @@ public class FKLImplService implements FKLService {
|
|
|
if (day_1.equals("缺卡") && result.contains("09:00")) {
|
|
|
day_1 = "";
|
|
|
}
|
|
|
- // prd 请假3小时以内标记为zc, 按照小时请假 [调休, 哺乳假, 事假]
|
|
|
+ // prd 请假3小时以内标记为zc, 按照小时请假 [调休, 哺乳假, 事假];
|
|
|
String[] arr = status.split(" ");
|
|
|
float hour = Float.valueOf((arr[arr.length - 1].replace("小时", "")));
|
|
|
- if (hour < 3.0f) { // <3 同时9点申请标识zc, 避免不能统计外出情况
|
|
|
+ if (hour < 3.0f && !tmp.equals("外出")) { // <3 同时9点申请标识zc, 避免不能统计外出情况
|
|
|
continue;
|
|
|
} else {
|
|
|
// prd 请假3小时以内标记为zc, 区分上午与下午, 午休从12-13分割
|
|
|
String sStart = status.split(" ")[1].split("到")[0].replace(":", "");
|
|
|
type = type.length() > 0 && !tmp.equals(type) ? type + " " + tmp : tmp; // 兼容一天提交两次外出情况
|
|
|
- if (Integer.valueOf(sStart) >= 1200) {
|
|
|
+ // 兼容跨天请假场景
|
|
|
+ boolean sDate = date.equals(status.split(" ")[0].replace(tmp, ""));
|
|
|
+ boolean eDate = date.equals(status.split(" ")[1].split("到")[1]);
|
|
|
+ if (Integer.valueOf(sStart) >= 1200 && sDate) {
|
|
|
day_2 = tmp;
|
|
|
} else {
|
|
|
String sEnd = status.split(" ")[2].replace(":", "");
|
|
|
- if (Integer.valueOf(sStart) < 800) {
|
|
|
+ if (Integer.valueOf(sStart) < 800 || !sDate) {
|
|
|
sStart = "0800";
|
|
|
}
|
|
|
float hourZao = Duration.between(UtilDateTime.parseLocal(sStart, "HHmm"), UtilDateTime.parseLocal("1200", "HHmm")).toMinutes() / 60f;
|
|
|
- if (hourZao >= 3.0f) {
|
|
|
+ if (hourZao >= 3.0f || (hourZao > 0f && tmp.equals("外出"))) {
|
|
|
day_1 += day_1.length() > 0 ? " " + tmp : tmp;
|
|
|
}
|
|
|
- if (Integer.valueOf(sEnd) > 1700) {
|
|
|
+ if (Integer.valueOf(sEnd) > 1700 || !eDate) {
|
|
|
sEnd = "1700";
|
|
|
}
|
|
|
float hourWan = Duration.between(UtilDateTime.parseLocal("1300", "HHmm"), UtilDateTime.parseLocal(sEnd, "HHmm")).toMinutes() / 60f;
|
|
|
- if (hourWan > 3.0f) {
|
|
|
+ if (hourWan > 3.0f || (hourWan > 0f && tmp.equals("外出"))) {
|
|
|
day_2 += day_2.length() > 0 ? " " + tmp : tmp;
|
|
|
}
|
|
|
- // 外出兼容9点申请, 排班是8点情况
|
|
|
- if (result.contains("外出") && Integer.valueOf(sStart) <= 900 && Integer.valueOf(sEnd) >= 1700) {
|
|
|
- type = "外出";
|
|
|
- day_1 = type;
|
|
|
- day_2 = type;
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
} else if (status.contains("出差")) {
|
|
@@ -406,8 +412,8 @@ public class FKLImplService implements FKLService {
|
|
|
}
|
|
|
});
|
|
|
// 累计假期数据
|
|
|
- float leave_duration = 0f;
|
|
|
- float leave_all = 0f;
|
|
|
+ float leave_duration = 0f; // 法定假期调整时长: 分钟
|
|
|
+ float leave_all = 0f; // 请假总时长: 天 [屏蔽3小时以内] - 新, 仅事假扣除出勤, 通过字段配置解决
|
|
|
for (Map column : ddClient_attendance.getLeaveTimeByNames(ddClient.getAccessToken(), po.getUserId(), leaveNames, start, end)) {
|
|
|
String name = ((Map) column.get("columnvo")).get("name").toString(); // 接口返回列名称
|
|
|
float value = (Float) _reduceAttendance(column, name, "columnvals");
|
|
@@ -419,11 +425,27 @@ public class FKLImplService implements FKLService {
|
|
|
leave_duration += value * 60f * 8f;
|
|
|
}
|
|
|
}
|
|
|
- if (Arrays.asList("调休", "事假", "哺乳假").contains(name)) {
|
|
|
- leave_all += value / 8f;
|
|
|
- } else {
|
|
|
- leave_all += value;
|
|
|
+ // prd 病假,产假,事假扣除出勤天数. 因事假按照小时请假, 3小时内记录为出勤, 3-4小时为半天, 4小时以上记录为一天, 因此钉钉后台未设置自动扣减
|
|
|
+ if (Arrays.asList("病假", "产假", "事假").contains(name)) {
|
|
|
+ if (name.equals("事假")) {
|
|
|
+ // 系统已自动过滤, 午休时间 [跨天场景]
|
|
|
+ if (value > 8f) {
|
|
|
+ leave_all += Math.floor(value / 8f);
|
|
|
+ }
|
|
|
+ float hours = value % 8;
|
|
|
+ if (hours > 0f) {
|
|
|
+ // prd 1. 3小时以下不扣除; 2. 大于等于3,小于6为半天; 3. 大于等于6为1天
|
|
|
+ if (hours >= 6.0f) {
|
|
|
+ leave_all += 1.0f;
|
|
|
+ } else if (hours >= 3f) {
|
|
|
+ leave_all += 0.5f;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ leave_all += value;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
attendanceInfo.put(name, value);
|
|
|
}
|
|
|
// 数据处理, 请假折算天
|
|
@@ -443,7 +465,24 @@ public class FKLImplService implements FKLService {
|
|
|
attendanceInfo.put("考勤结果", "入职日期" + UtilDateTime.formatDate(po.getHiredDate()) + "; " + attendanceInfo.get("考勤结果"));
|
|
|
}
|
|
|
attendanceInfo.put("缺卡次数", UtilNumber.formatPrecisionValue(UtilMap.getFloat(attendanceInfo, "上班缺卡次数") + UtilMap.getFloat(attendanceInfo, "下班缺卡次数")));
|
|
|
+ attendanceInfo.put("出勤天数_sys", attendanceInfo.get("出勤天数")); // prd 离职1号计算, 请假扣除, 部分员工旷工算出勤, 扣除休息打卡出勤
|
|
|
if (ObjectUtils.isNotEmpty(po.getLeaveDate()) && UtilDateTime.parseDateTime(start).before(po.getLeaveDate()) && UtilDateTime.parseDateTime(end).after(po.getLeaveDate())) {
|
|
|
+ // prd 离职员工出勤天数是否可以只记录员工离职当月1号
|
|
|
+ Optional option = attendanceList.stream().filter(item -> {
|
|
|
+ /// 线程安全, 对象获取值
|
|
|
+ String id = (((Map) item.get("column_vo"))).get("id").toString();
|
|
|
+ return fileId_attendance_days.get().equals(id);
|
|
|
+ }).findAny();
|
|
|
+ if (option.isPresent()) {
|
|
|
+ List<Map> dataList = (List<Map>) ((Map) option.get()).get("column_vals");
|
|
|
+ for (Map data : dataList) {
|
|
|
+ if (UtilDateTime.parseDate(data.get("date").toString()).getMonth() != UtilDateTime.parseDate(end).getMonth()) {
|
|
|
+ log.info("离职从1号计算出勤, {}, {}, {}, {}", po.getName(), data.get("date"), UtilMap.getFloat(attendanceInfo, "出勤天数_sys"), UtilMap.getFloat(data, "value"));
|
|
|
+ attendanceInfo.put("出勤天数_sys", UtilNumber.formatPrecisionValue(UtilMap.getFloat(attendanceInfo, "出勤天数_sys") - UtilMap.getFloat(data, "value")));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 缺卡补录
|
|
|
Optional optional = Arrays.stream(attendanceInfo.get("考勤结果").toString().split("; ")).filter(item -> item.equals("下班缺卡" + UtilDateTime.formatDate(po.getLeaveDate()))).findAny();
|
|
|
if (optional.isPresent()) {
|
|
|
exception_duration = 480f;
|
|
@@ -457,15 +496,27 @@ public class FKLImplService implements FKLService {
|
|
|
float tiaoxiu_duration = UtilMap.getFloat(attendanceInfo, "调休") * 60f;
|
|
|
attendanceInfo.put("调休时长", UtilNumber.formatPrecisionValue(tiaoxiu_duration));
|
|
|
attendanceInfo.put("法定假调整时长", UtilNumber.formatPrecisionValue(leave_duration));
|
|
|
- attendanceInfo.put("总时长", UtilNumber.formatPrecisionValue(system_duration + leave_duration + tiaoxiu_duration + exception_duration - overTime));
|
|
|
- // ppExt 钉钉接口休息如出差半天系统也返回出勤天数1, 存在异常; 休息日加班也会记录为出勤, 考勤字段调整无效
|
|
|
- attendanceInfo.put("出勤天数_prd", UtilNumber.formatPrecisionValue(UtilMap.getFloat(attendanceInfo, "出勤天数") - leave_all));
|
|
|
+ // prd [新] 汇总表: 不取系统调休。总时长计算取 0,返回列表也为 0
|
|
|
+ attendanceInfo.put("总时长", UtilNumber.formatPrecisionValue(system_duration + leave_duration + exception_duration - overTime));
|
|
|
+ // prd 请假扣除出勤天数 ppExt 钉钉接口休息如出差半天系统也返回出勤天数1, 存在异常; 休息日加班也会记录为出勤, 考勤字段调整无效
|
|
|
+ attendanceInfo.put("出勤天数_sys", UtilNumber.formatPrecisionValue(UtilMap.getFloat(attendanceInfo, "出勤天数_sys") - leave_all));
|
|
|
+ // prd 公假打卡的天数无需记录到出勤天数中, 包含出差部分
|
|
|
+ Optional optional = attendanceList.stream().filter(item -> {
|
|
|
+ /// 线程安全, 对象获取值
|
|
|
+ String id = (((Map) item.get("column_vo"))).get("id").toString();
|
|
|
+ return fileId_attendance_result.get().equals(id);
|
|
|
+ }).findAny();
|
|
|
+ if (optional.isPresent()) {
|
|
|
+ List<Map> dataList = (List<Map>) ((Map) optional.get()).get("column_vals");
|
|
|
+ int days_overTime = dataList.stream().filter(item -> String.valueOf(item.get("value")).contains("休息并打卡") || String.valueOf(item.get("value")).contains("休息,出差")).collect(Collectors.toList()).size();
|
|
|
+ attendanceInfo.put("出勤天数_sys", UtilNumber.formatPrecisionValue(UtilMap.getFloat(attendanceInfo, "出勤天数_sys") - days_overTime));
|
|
|
+ }
|
|
|
attendanceInfos.add(attendanceInfo);
|
|
|
});
|
|
|
// prd 26-25周期非自然月逻辑 [获取出现最多次作为法定应出勤天数] 考勤应出勤天数和班组 + 人员挂钩, ppExt 排班天数钉钉查询没有接口
|
|
|
float workMin = (Float) UtilList.maxFrequencyObject(attendanceInfos.stream().map(item -> UtilMap.getFloat(item, "出勤天数")).collect(Collectors.toList())) * 60 * 8;
|
|
|
|
|
|
- // prd 数据处理
|
|
|
+ // prd 数据处理 [ppExt 月度汇总统计真实数据, 月度明细按照zc规则统计]
|
|
|
int order = 0;
|
|
|
for (Map attendance : attendanceInfos) {
|
|
|
if (attendance.containsKey("总时长") && workMin > 0) {
|
|
@@ -473,19 +524,22 @@ public class FKLImplService implements FKLService {
|
|
|
}
|
|
|
order++;
|
|
|
attendance.put("序号", String.valueOf(order));
|
|
|
+ // 调休按照半天\一天进行取整, 补充尾差
|
|
|
+ attendance.put("出勤天数_sys", UtilNumber.roundHalf(UtilMap.getFloat(attendance, "出勤天数_sys")));
|
|
|
// prd 月度汇总表和月度明细表是否可实现部分无需打卡的员工
|
|
|
if ("无需打卡".equals(attendance.get("考勤状态"))) {
|
|
|
- attendance.put("旷工天数", 0);
|
|
|
- attendance.put("缺卡次数", 0);
|
|
|
- attendance.put("上班缺卡次数", 0);
|
|
|
- attendance.put("下班缺卡次数", 0);
|
|
|
- attendance.put("迟到次数", 0);
|
|
|
- attendance.put("早退次数", 0);
|
|
|
if (!Objects.isNull(days)) {
|
|
|
+ attendance.put("旷工天数", 0);
|
|
|
+ attendance.put("缺卡次数", 0);
|
|
|
+ attendance.put("上班缺卡次数", 0);
|
|
|
+ attendance.put("上班缺卡次数", 0);
|
|
|
+ attendance.put("下班缺卡次数", 0);
|
|
|
+ attendance.put("迟到次数", 0);
|
|
|
+ attendance.put("早退次数", 0);
|
|
|
for (Object key : attendance.keySet()) {
|
|
|
String prop = String.valueOf(key);
|
|
|
if (prop.contains("_") || prop.contains("-")) {
|
|
|
- String val = String.valueOf(attendance.get(prop)).replace("旷工", "").replace("缺卡", "").replace("迟到", "").replace("早退", "");
|
|
|
+ String val = String.valueOf(attendance.get(prop)).replace("旷工", "").replace("缺卡", "").replace("迟到", "").replace("早退", "").trim();
|
|
|
// 忽略考勤异常 | 考勤静默用户
|
|
|
if (StringUtils.isBlank(val) || val.equals("/")) {
|
|
|
attendance.put(prop, "zc");
|
|
@@ -497,61 +551,57 @@ public class FKLImplService implements FKLService {
|
|
|
} else {
|
|
|
List<String> vals = new ArrayList<>();
|
|
|
for (String cont : String.valueOf(attendance.get("考勤结果")).split("; ")) {
|
|
|
- if (!cont.contains("旷工") && !cont.contains("缺卡") && !cont.contains("迟到") && !cont.contains("早退")) {
|
|
|
+ // 缺卡情况下, 存在请假, 需要保留
|
|
|
+ if (cont.contains("缺卡,") || (!cont.contains("旷工") && !cont.contains("缺卡") && !cont.contains("迟到") && !cont.contains("早退"))) {
|
|
|
vals.add(cont);
|
|
|
}
|
|
|
}
|
|
|
attendance.put("考勤结果", String.join("; ", vals));
|
|
|
+ // prd 部分无需打卡的员工旷工、缺卡、迟到、早退的天数需要记录到出勤天数中
|
|
|
+ attendance.put("出勤天数_sys", UtilNumber.formatPrecisionValue(UtilMap.getFloat(attendance, "出勤天数_sys") + UtilMap.getFloat(attendance, "旷工天数")));
|
|
|
}
|
|
|
}
|
|
|
- // prd 异常与假期统计对应状态数据, 出勤天数就是实际到公司工作的天数[zc状态], 兼容3小时需求逻辑
|
|
|
- AtomicReference<Float> days_rest = new AtomicReference<>(0f);
|
|
|
- AtomicReference<Float> days_tiaoxiu = new AtomicReference<>(0f);
|
|
|
- AtomicReference<Float> days_shijia = new AtomicReference<>(0f);
|
|
|
- AtomicReference<Float> days_burujia = new AtomicReference<>(0f);
|
|
|
- AtomicReference<Float> days_waichu = new AtomicReference<>(0f);
|
|
|
- AtomicReference<Float> days_chidao = new AtomicReference<>(0f);
|
|
|
- AtomicReference<Float> days_zaotui = new AtomicReference<>(0f);
|
|
|
- AtomicReference<Float> days_kuangong = new AtomicReference<>(0f);
|
|
|
- attendance.put("出勤天数_prd", attendance.keySet().stream().reduce(0f, (acc, cur) -> {
|
|
|
- if (cur.toString().contains("_")) {
|
|
|
- // 外出标注为zc?
|
|
|
- if (attendance.get(cur).equals("外出")) {
|
|
|
-// attendance.put(cur, "zc");
|
|
|
- days_waichu.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
- }
|
|
|
- // 累计汇总天数
|
|
|
- if (attendance.get(cur).equals("zc")) {
|
|
|
- return Float.valueOf(String.valueOf(acc)) + 0.5;
|
|
|
- } else if (attendance.get(cur).equals("公假")) {
|
|
|
- days_rest.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
- } else if (attendance.get(cur).equals("调休")) {
|
|
|
- days_tiaoxiu.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
- } else if (attendance.get(cur).equals("事假")) {
|
|
|
- days_shijia.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
- } else if (attendance.get(cur).equals("哺乳假")) {
|
|
|
- days_burujia.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
- } else if (attendance.get(cur).equals("迟到")) {
|
|
|
- days_chidao.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
- } else if (attendance.get(cur).equals("早退")) {
|
|
|
- days_zaotui.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
- } else if (attendance.get(cur).equals("旷工")) {
|
|
|
- days_kuangong.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
+ if (!Objects.isNull(days)) {
|
|
|
+ // prd 异常与假期统计对应状态数据, 出勤天数就是实际到公司工作的天数[zc状态], 兼容3小时需求逻辑
|
|
|
+ AtomicReference<Float> days_rest = new AtomicReference<>(0f);
|
|
|
+ AtomicReference<Float> days_tiaoxiu = new AtomicReference<>(0f);
|
|
|
+ AtomicReference<Float> days_shijia = new AtomicReference<>(0f);
|
|
|
+ AtomicReference<Float> days_burujia = new AtomicReference<>(0f);
|
|
|
+ AtomicReference<Float> days_chidao = new AtomicReference<>(0f);
|
|
|
+ AtomicReference<Float> days_zaotui = new AtomicReference<>(0f);
|
|
|
+ AtomicReference<Float> days_kuangong = new AtomicReference<>(0f);
|
|
|
+ attendance.put("出勤天数_prd", attendance.keySet().stream().reduce(0f, (acc, cur) -> {
|
|
|
+ if (cur.toString().contains("_")) {
|
|
|
+ // 累计汇总天数 [出勤天数包含 外出, 缺卡, zc]; ppExt 未加入考勤组人员, 会全月统计为zc, 钉钉返回为空, 没有判断条件. 因此需要手动调整 [极端情况]
|
|
|
+ if (Arrays.asList("zc", "缺卡", "外出").contains(attendance.get(cur))) {
|
|
|
+ return Float.valueOf(String.valueOf(acc)) + 0.5;
|
|
|
+ } else if (attendance.get(cur).equals("公假")) {
|
|
|
+ days_rest.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
+ } else if (attendance.get(cur).equals("调休")) {
|
|
|
+ days_tiaoxiu.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
+ } else if (attendance.get(cur).equals("事假")) {
|
|
|
+ days_shijia.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
+ } else if (attendance.get(cur).equals("哺乳假")) {
|
|
|
+ days_burujia.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
+ } else if (attendance.get(cur).equals("迟到")) {
|
|
|
+ days_chidao.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
+ } else if (attendance.get(cur).equals("早退")) {
|
|
|
+ days_zaotui.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
+ } else if (attendance.get(cur).equals("旷工")) {
|
|
|
+ days_kuangong.updateAndGet(v -> new Float((float) (v + 0.5)));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- return acc;
|
|
|
- }));
|
|
|
- attendance.put("公假天数_prd", days_rest.get());
|
|
|
- attendance.put("调休天数_prd", days_tiaoxiu.get());
|
|
|
- attendance.put("事假天数_prd", days_shijia.get());
|
|
|
- attendance.put("哺乳假天数_prd", days_burujia.get());
|
|
|
- attendance.put("外出天数_prd", days_waichu.get());
|
|
|
- attendance.put("迟到次数_prd", days_chidao.get());
|
|
|
- attendance.put("早退次数_prd", days_zaotui.get());
|
|
|
- attendance.put("旷工天数_prd", days_kuangong.get());
|
|
|
+ return acc;
|
|
|
+ }));
|
|
|
+ attendance.put("公假天数_prd", days_rest.get());
|
|
|
+ attendance.put("调休天数_prd", days_tiaoxiu.get());
|
|
|
+ attendance.put("事假天数_prd", days_shijia.get());
|
|
|
+ attendance.put("哺乳假天数_prd", days_burujia.get());
|
|
|
+ attendance.put("迟到次数_prd", days_chidao.get());
|
|
|
+ attendance.put("早退次数_prd", days_zaotui.get());
|
|
|
+ attendance.put("旷工天数_prd", days_kuangong.get());
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
// 记录月度明细日期, 进行排序 [接口返回已排序]
|
|
|
// if (UtilList.isNotEmpty(days)) {
|
|
|
// Collections.sort(days, Comparator.comparingLong(o -> Long.valueOf(o.replace("-", ""))));
|