From e29da354b10422a52b821397352b460039ca8bc0 Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 22 Jul 2024 13:17:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E5=8B=A4-=E5=8A=A0=E7=8F=AD=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E6=B5=81=E7=A8=8B=EF=BC=8C=E5=8A=A0=E7=8F=AD=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E6=98=8E=E7=BB=86=E6=95=B0=E6=8D=AE=E7=94=9F=E6=88=90?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/OvertimePlanActionApi.java | 16 +++ .../service/UtilService.java | 2 + .../service/impl/UtilServiceImpl.java | 26 ++++ .../workflow/service/OvertimePlanService.java | 8 ++ .../service/impl/OvertimePlanServiceImpl.java | 133 ++++++++++++++++++ .../workflow/web/OvertimePlanApi.java | 58 ++++++++ .../jucailinkq/common/util/CommonUtil.java | 5 +- 7 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 src/com/api/jucailinkq/attendance/workflow/OvertimePlanActionApi.java create mode 100644 src/com/engine/jucailinkq/attendance/workflow/service/OvertimePlanService.java create mode 100644 src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java create mode 100644 src/com/engine/jucailinkq/attendance/workflow/web/OvertimePlanApi.java diff --git a/src/com/api/jucailinkq/attendance/workflow/OvertimePlanActionApi.java b/src/com/api/jucailinkq/attendance/workflow/OvertimePlanActionApi.java new file mode 100644 index 0000000..d299139 --- /dev/null +++ b/src/com/api/jucailinkq/attendance/workflow/OvertimePlanActionApi.java @@ -0,0 +1,16 @@ +package com.api.jucailinkq.attendance.workflow; + +import com.engine.jucailinkq.attendance.workflow.web.OvertimePlanApi; +import lombok.extern.slf4j.Slf4j; + +import javax.ws.rs.Path; + +/** + * @Author: sy + * @Description: 加班计划流程 + * @Date: 2024/7/19 + **/ +@Path("/attendance/overtimeplan") +@Slf4j +public class OvertimePlanActionApi extends OvertimePlanApi { +} diff --git a/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/UtilService.java b/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/UtilService.java index 8fa5e4a..1675f2f 100644 --- a/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/UtilService.java +++ b/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/UtilService.java @@ -16,6 +16,8 @@ public interface UtilService { */ Map getSchedulingInFormation(Map params); + Map>> getScheduleInfoWithEmpId(List empIdList, String startDate, String endDate); + /** * 获得指定天数的打卡时间集合 * 只支持一次工作时间段跨天,不支持多端工作时间段跨天。 diff --git a/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java b/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java index e61fe14..ff685d2 100644 --- a/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java +++ b/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java @@ -21,6 +21,7 @@ import weaver.general.Util; import java.time.ZoneOffset; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -42,6 +43,31 @@ public class UtilServiceImpl extends Service implements UtilService { return commandExecutor.execute(new GetScheduleResultListCmd(params)); } + /** + * 获取人员在的日期区间内的排班结果 + * @param empIdList 人员id集合 + * @param startDate 开始日期 + * @param endDate 结束日期 + */ + @Override + public Map>> getScheduleInfoWithEmpId(List empIdList, String startDate, String endDate) { + Map>> scheduleInfo = new HashMap<>(); + Map params = new HashMap<>(); + params.put("tableName", "uf_pbjg"); + params.put("startDate", startDate); + params.put("endDate", endDate); + params.put("pblx", "0"); + params.put("current", "1"); + params.put("pageSize", "9999"); + params.put("recurrence", "1"); + for (String empId : empIdList) { + params.put("pbdx", empId); + Map schedulingResultsMap = schedulingResultsService.queryDataTableActualUse(params); + scheduleInfo.put(empId, (List>) schedulingResultsMap.get("data")); + } + return scheduleInfo; + } + /** * 获得打卡数据 diff --git a/src/com/engine/jucailinkq/attendance/workflow/service/OvertimePlanService.java b/src/com/engine/jucailinkq/attendance/workflow/service/OvertimePlanService.java new file mode 100644 index 0000000..6d48af6 --- /dev/null +++ b/src/com/engine/jucailinkq/attendance/workflow/service/OvertimePlanService.java @@ -0,0 +1,8 @@ +package com.engine.jucailinkq.attendance.workflow.service; + +import java.util.Map; + +public interface OvertimePlanService { + + Map generateOvertimePlanDetails(Map params); +} diff --git a/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java b/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java new file mode 100644 index 0000000..0b1f852 --- /dev/null +++ b/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java @@ -0,0 +1,133 @@ +package com.engine.jucailinkq.attendance.workflow.service.impl; + +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.jucailinkq.attendance.attendanceanalysis.service.UtilService; +import com.engine.jucailinkq.attendance.attendanceanalysis.service.impl.UtilServiceImpl; +import com.engine.jucailinkq.attendance.enums.ClassSegmentTypeEnum; +import com.engine.jucailinkq.attendance.workflow.service.OvertimePlanService; +import com.engine.jucailinkq.common.util.CommonUtil; +import com.engine.jucailinkq.common.util.DateUtil; +import com.engine.jucailinkq.common.util.DbTools; +import lombok.extern.slf4j.Slf4j; +import weaver.general.Util; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author: sy + * @Description: 加班计划流程相关方法实现类 + * @Date: 2024/7/18 + **/ +@Slf4j +public class OvertimePlanServiceImpl extends Service implements OvertimePlanService { + + private UtilService utilService = ServiceUtil.getService(UtilServiceImpl.class); + + @Override + public Map generateOvertimePlanDetails(Map params) { + Map resultMap = new HashMap<>(); + try { + // 流程表单主表数据 + Map mainTableData = (Map)params.get("mainTableData"); + log.info("mainTableData : {}", mainTableData); + //加班人员、开始日期、结束日期、开始时间、结束时间 + String jbry = Util.null2String(mainTableData.get("jbry")); + String jblx = Util.null2String(mainTableData.get("jblx")); + String startDate = Util.null2String(mainTableData.get("ksrq")); + String endDate = Util.null2String(mainTableData.get("jsrq")); + String startTime = Util.null2String(mainTableData.get("kssj")); + String endTime = Util.null2String(mainTableData.get("jssj")); + //获取加班人员列表 + List empIdList = "".equals(jbry) ? new ArrayList<>() : Arrays.asList(jbry.split(",")); + //获取加班日期集合 + List dateList = DateUtil.getDatesBetween(startDate, endDate); + //获取人员列表在日期区间的班次数据 + Map>> scheduleInfoMap = utilService.getScheduleInfoWithEmpId(empIdList, startDate, DateUtil.AfterDay(endDate,1)); + List> overtimePlanDetailList = new ArrayList<>(); + List workBdlxList = new ArrayList<>(); + workBdlxList.add(ClassSegmentTypeEnum.WORK_TIME.getKey());workBdlxList.add(ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey()); + workBdlxList.add(ClassSegmentTypeEnum.EARLY_OVERTIME.getKey());workBdlxList.add(ClassSegmentTypeEnum.OVERTIME_IN_CLASS.getKey()); + Map detailItem; + String sql = ""; + //获取加班类型信息 + sql = "select id,mc from uf_jcl_kq_kqxm where id = " + jblx; + Map jblxData = DbTools.getSqlToMap(sql); + String jblxName = Util.null2String(jblxData.get("mc")); + Map empIdToNameInfo = CommonUtil.empIdToNameInfo(empIdList); + List> bcDetailData; + for (String empId : empIdList) { + List> scheduleInfoList = scheduleInfoMap.get(empId); + Map dateToBcxxMap = scheduleInfoList == null ? new HashMap<>() : scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")), e->Util.null2String(e.get("bcxx")))); + for (String date : dateList) { + String realEndDate = date; + detailItem = new HashMap<>(); + detailItem.put("jbry", empId); + detailItem.put("jbryName", Util.null2String(empIdToNameInfo.get(empId))); + detailItem.put("jblx", jblx); + detailItem.put("jblxName", jblxName); + detailItem.put("ksrq", date); + detailItem.put("kssj", startTime); + detailItem.put("jssj", endTime); + //开始时时和结束时间存在跨天情况时,即开始时间大于等于结束时间 + if (startTime.compareTo(endTime) >= 0) { + realEndDate = DateUtil.AfterDay(date,1); + } + detailItem.put("jsrq", realEndDate); + //加班时长 + int overtimeMinutes = DateUtil.getBetWeenMinutes(date + " " + startTime, realEndDate + " " + endTime); + detailItem.put("jbsc", String.format("%.2f", overtimeMinutes / 60.0)); + //根据班次数据,设置归属日期 + //获取当天班次id + String currentDayBcId = Util.null2String(dateToBcxxMap.get(date)).split("-")[0]; + //当天比较最晚工作时段/加班时段的结束时间点和加班计划明细的开始时间点的差值 + Integer currentDayDiffMinutes = 9999; + if (!"".equals(currentDayBcId)) { + //查询当天班次明细 + sql = "select id, bdlx, gsrq, kssj, jssj from uf_jcl_kq_bcxx_dt1 where mainid = " + currentDayBcId + " order by gsrq desc, kssj desc"; + bcDetailData = DbTools.getSqlToList(sql); + bcDetailData = bcDetailData.stream().filter(e -> workBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); + if (bcDetailData.size() > 0) { + String gsrqValue = Util.null2String(bcDetailData.get(0).get("gsrq")); + String jssj = Util.null2String(bcDetailData.get(0).get("jssj")); + String matchDate = "2".equals(gsrqValue) ? DateUtil.AfterDay(date,1) : ("0".equals(gsrqValue) ? DateUtil.beforeDay(date,1) : date); + currentDayDiffMinutes = (matchDate + jssj).compareTo(date + startTime) > 0 ? DateUtil.getBetWeenMinutes(date + " " + startTime, matchDate + " " + jssj) : DateUtil.getBetWeenMinutes(matchDate + " " + jssj, date + " " + startTime); + } + } + //获取次日班次id + String nextDay = DateUtil.AfterDay(date,1); + String nextDayBcId = Util.null2String(dateToBcxxMap.get(nextDay)).split("-")[0]; + //次日比较最早工作时段/加班时段的开始时间点和加班计划明细的结束时间点的差值 + Integer nextDayDiffMinutes = 9999; + if (!"".equals(nextDayBcId)) { + //查次日班次明细 + sql = "select id, bdlx, gsrq, kssj, jssj from uf_jcl_kq_bcxx_dt1 where mainid = " + nextDayBcId + " order by gsrq, kssj"; + bcDetailData = DbTools.getSqlToList(sql); + bcDetailData = bcDetailData.stream().filter(e -> workBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); + if (bcDetailData.size() > 0) { + String gsrqValue = Util.null2String(bcDetailData.get(0).get("gsrq")); + String kssj = Util.null2String(bcDetailData.get(0).get("kssj")); + String matchDate = "2".equals(gsrqValue) ? DateUtil.AfterDay(nextDay,1) : ("0".equals(gsrqValue) ? DateUtil.beforeDay(nextDay,1) : nextDay); + nextDayDiffMinutes = (matchDate + kssj).compareTo(realEndDate + endTime) > 0 ? DateUtil.getBetWeenMinutes(realEndDate + " " + endTime, matchDate + " " + kssj) : DateUtil.getBetWeenMinutes(matchDate + " " + kssj, realEndDate + " " + endTime); + } + } + if (currentDayDiffMinutes <= nextDayDiffMinutes) { + detailItem.put("gsrq", date); + } else { + detailItem.put("gsrq", nextDay); + } + overtimePlanDetailList.add(detailItem); + } + } + resultMap.put("status", true); + resultMap.put("data", overtimePlanDetailList); + } catch (Exception e) { + log.info(e.getMessage()); + resultMap.put("status", false); + resultMap.put("errorInfo", e.getMessage()); + resultMap.put("data", null); + } + return resultMap; + } +} diff --git a/src/com/engine/jucailinkq/attendance/workflow/web/OvertimePlanApi.java b/src/com/engine/jucailinkq/attendance/workflow/web/OvertimePlanApi.java new file mode 100644 index 0000000..f4461e9 --- /dev/null +++ b/src/com/engine/jucailinkq/attendance/workflow/web/OvertimePlanApi.java @@ -0,0 +1,58 @@ +package com.engine.jucailinkq.attendance.workflow.web; + +import com.engine.common.util.ParamUtil; +import com.engine.common.util.ServiceUtil; +import com.engine.jucailinkq.attendance.workflow.service.OvertimePlanService; +import com.engine.jucailinkq.attendance.workflow.service.impl.OvertimePlanServiceImpl; +import com.engine.jucailinkq.common.util.ApiReturnTools; +import com.engine.jucailinkq.common.util.ResponseResult; +import com.google.gson.Gson; +import lombok.extern.slf4j.Slf4j; +import weaver.general.Util; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import java.lang.reflect.Type; +import java.util.Map; + +/** + * @Author: sy + * @Description: 加班计划流程相关接口 + * @Date: 2024/7/18 + **/ +@Slf4j +public class OvertimePlanApi { + + private OvertimePlanService getOvertimePlanService(User user) { + return ServiceUtil.getService(OvertimePlanServiceImpl.class,user); + } + + /** + * 加班计划-生成加班计划明细表数据 + * @return + */ + @GET + @Path("/generateOvertimePlanDetails") + @Produces({"text/plain"}) + public String generateOvertimePlanDetails(@Context HttpServletRequest request, @Context HttpServletResponse response) { + try { + Map param = ParamUtil.request2Map(request); + User user = HrmUserVarify.getUser(request, response); + String mainTableDataStr = Util.null2String(param.get("mainTableData")); + Gson gson = new Gson(); + Map mainTableData = gson.fromJson(mainTableDataStr, (Type) Map.class); + + param.put("mainTableData",mainTableData); + return new ResponseResult, Map>(user).run(getOvertimePlanService(user) :: generateOvertimePlanDetails,param); + }catch (Exception e){ + log.error("generateOvertimePlanDetails status fail,catch error: [{}]",e); + return ApiReturnTools.error("200","查询失败"); + } + } +} diff --git a/src/com/engine/jucailinkq/common/util/CommonUtil.java b/src/com/engine/jucailinkq/common/util/CommonUtil.java index 786d5b8..86af980 100644 --- a/src/com/engine/jucailinkq/common/util/CommonUtil.java +++ b/src/com/engine/jucailinkq/common/util/CommonUtil.java @@ -689,9 +689,12 @@ public class CommonUtil { * 获取人员id和姓名的映射 * @return */ - public static Map empIdToNameInfo() { + public static Map empIdToNameInfo(List empIds) { Map resultMap = new HashMap<>(); String sql = "select id,lastname from hrmresource"; + if (empIds != null && empIds.size() > 0) { + sql = sql + " where id in (" + String.join(",", empIds) + ")"; + } List> list = DbTools.getSqlToList(sql); for (Map map : list) { resultMap.put(map.get("id").toString(), Util.null2String(map.get("lastname")));