From 25ae2acdca2cc94fd74676142dfb4b3cb94b7e57 Mon Sep 17 00:00:00 2001 From: Chengliang <1546584672@qq.com> Date: Fri, 3 Jan 2025 15:21:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E5=8B=A4=E7=A1=AE=E8=AE=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aisin/cron/KqConfirmWfCrob.java | 114 +++++++++++++++--- .../cron/entity/FlowDetailTableInfo.java | 12 +- 2 files changed, 111 insertions(+), 15 deletions(-) diff --git a/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java b/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java index 71b21ef..824446d 100644 --- a/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java +++ b/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java @@ -17,11 +17,10 @@ import weaver.workflow.webservices.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; +import java.time.LocalTime; import java.time.YearMonth; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -42,9 +41,9 @@ public class KqConfirmWfCrob extends BaseCronJob { String workflowId = bb.getPropValue("aisinsecond", "workflowId"); String tableName = bb.getPropValue("aisinsecond", "tableName"); String currentDate = DateUtil.getCurrentDate(); - String kqMonth = getKqMonth(); + //String kqMonth = getKqMonth(); //测试使用 - //String kqMonth = "2024-11"; + String kqMonth = "2024-11"; List resourceList = new ArrayList<>(); //1.获取指定分部下 类型为排班制的 考勤组 @@ -147,21 +146,84 @@ public class KqConfirmWfCrob extends BaseCronJob { //2.2 明细表2(加班) List flowDetails = new ArrayList<>(); - rs.executeQuery("select belongdate,duration_min from KQ_FLOW_OVERTIME where belongdate >= '" + firstDayOfMonth + "' and belongdate <= '" + lastDayOfMonth + "' \n" + - " and resourceid = ? order by belongdate asc", e.getResourceId()); + rs.executeQuery("select duration_min,resourceid,ori_belongdate,belongdate,flow_dataid,fromtime,totime from KQ_FLOW_OVERTIME where ori_belongdate >= '" + firstDayOfMonth + "' and ori_belongdate <= '" + lastDayOfMonth + "' \n" + + " and resourceid = ? and (flow_dataid <> '' and flow_dataid is not null) order by ori_belongdate asc", e.getResourceId()); while (rs.next()) { String belongdate = Util.null2String(rs.getString("belongdate")); + String oriBelongDate = Util.null2String(rs.getString("ori_belongdate")); String duration_min = Util.null2String(rs.getString("duration_min")); - WorkTimeEntity workTime = kqWorkTime.getWorkTime(e.getResourceId(), belongdate); - String serialId = workTime.getSerialId(); +// WorkTimeEntity workTime = kqWorkTime.getWorkTime(e.getResourceId(), belongdate); +// String serialId = workTime.getSerialId(); + //(二次需求直接默认值 0) + String serialId = "0"; + String flowDataId = Util.null2String(rs.getString("flow_dataid")); + String fromTime = Util.null2String(rs.getString("fromtime")); + String toTime = Util.null2String(rs.getString("totime")); flowDetails.add(FlowDetailTableInfo.builder() - .date(belongdate) - .serialId(serialId) - .hours(minutesToHours(duration_min)) - .build()); + .belongDate(belongdate) + .oriBelongDate(oriBelongDate) + .serialId(serialId) + .flowDataId(flowDataId) + .fromTime(fromTime) + .toTime(toTime) + .minutes(duration_min) + //.hours(minutesToHours(duration_min)) + .build()); } - flowDetails.forEach(flow -> rs.executeUpdate("insert into " + tableName + "_dt2 (mainid,jbrq,jbbc,jbxs) values(?,?,?,?)", mainId, flow.getDate(), + // 使用Map对flowDataId进行分组 + Map> groupedByFlowDataId = flowDetails.stream() + .collect(Collectors.groupingBy(FlowDetailTableInfo::getFlowDataId)); + + // 对分组后的数据进行处理 + List mergedList = new ArrayList<>(); + for (Map.Entry> entry : groupedByFlowDataId.entrySet()) { + List group = entry.getValue(); + + if (group.size() == 1 ) { + // 判断开始时间 结束时间 时长是否符合条件 当天的加班数据不需要 只需要跨天加班 +// FlowDetailTableInfo flowDetail = group.get(1); +// String fromTime = flowDetail.getFromTime(); +// String toTime = flowDetail.getToTime(); +// String minutes = flowDetail.getMinutes(); +// String toHours = minutesToHours(minutes); +// +// if (isBeforeTime(fromTime) && isAfterTime(toTime) && isHoursGreaterThanPrecise(toHours,7.5)) { +// flowDetail.setHours(toHours); +// mergedList.add(flowDetail); +// } + + } else { + // 处理多条加班数据的情况 + // 找到 belongDate 最小和最大的记录 + FlowDetailTableInfo minBelongDateRecord = Collections.min(group, Comparator.comparing(FlowDetailTableInfo::getBelongDate)); + FlowDetailTableInfo maxBelongDateRecord = Collections.max(group, Comparator.comparing(FlowDetailTableInfo::getBelongDate)); + + int totalMinutes = group.stream() + .mapToInt(detail -> Integer.parseInt(detail.getMinutes())) + .sum(); + + String fromTime = minBelongDateRecord.getFromTime(); + String toTime = maxBelongDateRecord.getToTime(); + String toHours = minutesToHours(String.valueOf(totalMinutes)); + + // 判断开始时间 结束时间 时长是否符合条件 + if (isBeforeTime(fromTime) && isAfterTime(toTime) && isHoursGreaterThanPrecise(toHours,7.5)) { + FlowDetailTableInfo mergedDetail = new FlowDetailTableInfo(); + + mergedDetail.setOriBelongDate(minBelongDateRecord.getOriBelongDate()); + //班次id是前一天还是后一天 (需求直接默认值) + mergedDetail.setSerialId("0"); + mergedDetail.setHours(toHours); + // 添加到合并列表中 + mergedList.add(mergedDetail); + } + + } + } + + + mergedList.forEach(flow -> rs.executeUpdate("insert into " + tableName + "_dt2 (mainid,jbrq,jbbc,jbxs) values(?,?,?,?)", mainId, flow.getOriBelongDate(), flow.getSerialId(), flow.getHours())); //2.3 明细表3(请假) @@ -301,5 +363,29 @@ public class KqConfirmWfCrob extends BaseCronJob { return reduceMins; } + private boolean isBeforeTime(String fromTime) { + String timeToMinute = fromTime.substring(0, 5); + LocalTime time = LocalTime.parse(timeToMinute + ":00"); + LocalTime targetTime = LocalTime.of(21, 30); + return time.isBefore(targetTime); + } + + private boolean isAfterTime(String toTime) { + String timeToMinute = toTime.substring(0, 5); + LocalTime time = LocalTime.parse(timeToMinute + ":00"); + LocalTime targetTime = LocalTime.of(6, 0); + return time.isAfter(targetTime); + } + + private boolean isHoursGreaterThanPrecise(String hoursStr, double target) { + try { + BigDecimal hours = new BigDecimal(hoursStr); + BigDecimal targetBigDecimal = BigDecimal.valueOf(target); + return hours.compareTo(targetBigDecimal) > 0; + } catch (NumberFormatException e) { + return false; + } + } + } diff --git a/src/weaver/interfaces/aisin/cron/entity/FlowDetailTableInfo.java b/src/weaver/interfaces/aisin/cron/entity/FlowDetailTableInfo.java index 2fbe7e0..2895c8b 100644 --- a/src/weaver/interfaces/aisin/cron/entity/FlowDetailTableInfo.java +++ b/src/weaver/interfaces/aisin/cron/entity/FlowDetailTableInfo.java @@ -18,9 +18,19 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class FlowDetailTableInfo { - private String date; + private String belongDate; + + private String oriBelongDate; private String serialId; + private String flowDataId; + + private String fromTime; + + private String toTime; + + private String minutes; + private String hours; }