package com.engine.jucailinkq.attendance.attendanceanalysis.web; import com.engine.jucailinkq.attendance.attendanceanalysis.service.UtilService; import com.engine.jucailinkq.attendance.attendanceanalysis.service.impl.UtilServiceImpl; import com.engine.jucailinkq.attendance.attendanceanalysis.wrapper.AttendanceAnalysisWrapper; import com.engine.jucailinkq.attendance.attendanceplan.service.AttendancePlanService; import com.engine.jucailinkq.attendance.attendanceplan.service.impl.AttendancePlanServiceImpl; import com.engine.jucailinkq.attendance.workflow.service.AllowanceService; import com.engine.jucailinkq.attendance.workflow.service.impl.AllowanceServiceImpl; import com.engine.common.util.*; import com.engine.jucailinkq.common.util.ApiReturnTools; import com.engine.jucailinkq.common.util.CommonUtil; import com.engine.jucailinkq.common.util.DateUtil; import com.engine.jucailinkq.common.util.DbTools; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; import weaver.general.Util; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import java.time.ZoneOffset; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Slf4j public class AttendanceanalysisAction { private AttendancePlanService basicsetService = ServiceUtil.getService(AttendancePlanServiceImpl.class); private UtilService utilService = ServiceUtil.getService(UtilServiceImpl.class); private AttendanceAnalysisWrapper attendanceAnalysisService = ServiceUtil.getService(AttendanceAnalysisWrapper.class); private AllowanceService allowanceService = ServiceUtil.getService(AllowanceServiceImpl.class); /** * 排班分析 * @return */ @GET @Path("/attendanceAnalysisByHrmAndDate") @Produces({"text/plain"}) public String getSchedulingData(@Context HttpServletRequest request, @Context HttpServletResponse response) { try { log.info("********AttendanceAnalysisJob start********"); Map paramMap = ParamUtil.request2Map(request); // Map paramMap = Maps.newHashMap(); // paramMap.put("startDate","2024-08-16"); // paramMap.put("endDate","2024-08-16"); // paramMap.put("userIds","81"); String startDate = Util.null2String(paramMap.get("startDate")); String startBeforeDate = DateUtil.beforeDay(startDate,2); String endDate = Util.null2String(paramMap.get("endDate")); String endAfterDate = DateUtil.AfterDay(endDate,2); String userIds = Util.null2String(paramMap.get("userIds")); int betweenDays = DateUtil.getBetWeenDays(startDate,endDate); String queryDepartEmployeeSql = "select resourceid id,changedate name from HRMSTATUSHISTORY where type_n = 5"; //获取离职日期 Map departEmployeeMap = DbTools.getSqlToMapList(queryDepartEmployeeSql); //初始化扩展类 CommonUtil.initExtensionClassHolder(); if ("".equals(userIds)){ String queryUserSql = "select id,companystartdate from hrmresource where status <> '5' and status <> '4' and status <> '7'"; List> userList = DbTools.getSqlToList(queryUserSql); String sql = "select id,userid,signdate,signtime from hrmschedulesign where isincom=1 and signdate >= ? and signdate <= ? order by signdate,signtime"; List> dataList = DbTools.getSqlToList(sql,startBeforeDate,endAfterDate); //补打卡记录 sql = "select id,bdkry userid,dkrq signdate,dksj signtime from uf_jcl_kq_bdkjl where dkrq >= ? and dkrq <= ? and jlzt=1 order by dkrq,dksj"; List> makeUpList = DbTools.getSqlToList(sql,startBeforeDate,endAfterDate); if (makeUpList.size() > 0){ dataList.addAll(makeUpList); } dataList = dataList.stream().sorted(Comparator.comparing(e->DateUtil.getTime(e.get("signdate")+" "+e.get("signtime")).toInstant(ZoneOffset.of("+8")).toEpochMilli())).collect(Collectors.toList()); Map>> collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("userid")))); sql = "select sjzt,sgsj,ygid,rq from uf_jcl_kq_cqjg where rq>=? and rq<=?"; List> attendaceResult = DbTools.getSqlToList(sql,startDate,endDate); Map>> attendaceGroupById = attendaceResult.stream().collect(Collectors.groupingBy(e->e.get("ygid").toString())); for (Map userMap :userList){ String userId = userMap.get("id").toString(); //入职日期 String companystartDate = Util.null2String(userMap.get("companystartdate")); //离职日期 String terminationDate = Util.null2String(departEmployeeMap.get(userId)); log.info("***********analysis userId:{} start***********", userId); //出勤结果,进出时间 Map> clockInTimeMap = Maps.newHashMap(); /**获得人员考勤项目*/ Map param = Maps.newHashMap(); param.put("startDate",startBeforeDate); param.put("endDate",endAfterDate); param.put("resourceId",userId); Map dataMap = basicsetService.getAttendanceItemsByPerson(param); List> attendanceItems = (List>)dataMap.get("data"); /** *获得人员综合工时 */ Map workHourdataMap = basicsetService.getWorkHoursItemByPerson(param); List> workHourItems = (List>)workHourdataMap.get("data"); /** 获取人员班次*/ Map classesParamMap = Maps.newHashMap(); classesParamMap.put("tableName","uf_pbjg"); classesParamMap.put("startDate",startBeforeDate); classesParamMap.put("endDate",endAfterDate); classesParamMap.put("pblx","0"); classesParamMap.put("pbdx",userId); classesParamMap.put("current","1"); classesParamMap.put("pageSize",9999); classesParamMap.put("recurrence",1); classesParamMap.put("clockInTimeMap",clockInTimeMap); classesParamMap.put("clockInData",collect.get(userId)); classesParamMap.put("attendanceItems",attendanceItems); Map schedulMap = utilService.getSchedulingInFormation(classesParamMap); Map>> attendaceResultMap = Maps.newHashMap(); if (attendaceGroupById.get(userId) != null && attendaceGroupById.get(userId).size() > 0) { attendaceResultMap = attendaceGroupById.get(userId).stream().collect(Collectors.groupingBy(e -> e.get("rq").toString())); } for (int i=0; i<=betweenDays;i++){ String date = DateUtil.AfterDay(startDate,i); if (("".equals(companystartDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(companystartDate))>=0) && ("".equals(terminationDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(terminationDate)) <=0)){ attendanceAnalysisService.attendanceAnalysisForApi(userId,date,collect.get(userId),attendanceItems,schedulMap,workHourItems,clockInTimeMap,attendaceResultMap.get(date)); } } allowanceService.addAllowanceRecords(paramMap); } }else { String sql = "select id,userid,signdate,signtime from hrmschedulesign where isincom=1 and userid in ("+userIds+") and signdate >= ? and signdate <= ? order by signdate,signtime"; List> dataList = DbTools.getSqlToList(sql,startBeforeDate,endAfterDate); String queryUserSql = "select id,companystartdate from hrmresource where id in ("+userIds+")"; List> userList = DbTools.getSqlToList(queryUserSql); Map>> userGroupMap = userList.stream().collect(Collectors.groupingBy(e->e.get("id").toString())); //补打卡记录 sql = "select id,bdkry userid,dkrq signdate,dksj signtime from uf_jcl_kq_bdkjl where bdkry in ("+userIds+") and dkrq >= ? and dkrq <= ? and jlzt=1 order by dkrq,dksj"; List> makeUpList = DbTools.getSqlToList(sql,startBeforeDate,endAfterDate); if (makeUpList.size() > 0){ dataList.addAll(makeUpList); } dataList = dataList.stream().sorted(Comparator.comparing(e->DateUtil.getTime(e.get("signdate")+" "+e.get("signtime")).toInstant(ZoneOffset.of("+8")).toEpochMilli())).collect(Collectors.toList()); Map>> collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("userid")))); sql = "select sjzt,sgsj,ygid,rq from uf_jcl_kq_cqjg where rq>=? and rq<=? and ygid in ("+userIds+")"; List> attendaceResult = DbTools.getSqlToList(sql,startDate,endDate); Map>> attendaceGroupById = attendaceResult.stream().collect(Collectors.groupingBy(e->e.get("ygid").toString())); for (String userId : userIds.split(",")){ /**获得人员考勤项目*/ Map param = Maps.newHashMap(); //入职日期 String companystartDate = Util.null2String(userGroupMap.get(userId).get(0).get("companystartdate")); //离职日期 String terminationDate = Util.null2String(departEmployeeMap.get(userId)); //出勤结果,进出时间 Map> clockInTimeMap = Maps.newHashMap(); param.put("startDate",startBeforeDate); param.put("endDate",endAfterDate); param.put("resourceId",userId); Map dataMap = basicsetService.getAttendanceItemsByPerson(param); List> attendanceItems = (List>)dataMap.get("data"); /** *获得人员综合工时 */ Map workHourdataMap = basicsetService.getWorkHoursItemByPerson(param); List> workHourItems = (List>)workHourdataMap.get("data"); /** 获取人员班次*/ Map classesParamMap = Maps.newHashMap(); classesParamMap.put("tableName","uf_pbjg"); classesParamMap.put("startDate",startBeforeDate); classesParamMap.put("endDate",endAfterDate); classesParamMap.put("pblx","0"); classesParamMap.put("pbdx",userId); classesParamMap.put("current","1"); classesParamMap.put("pageSize",9999); classesParamMap.put("recurrence",1); classesParamMap.put("clockInTimeMap",clockInTimeMap); classesParamMap.put("clockInData",collect.get(userId)); classesParamMap.put("attendanceItems",attendanceItems); Map schedulMap = utilService.getSchedulingInFormation(classesParamMap); Map>> attendaceResultMap = Maps.newHashMap(); if (attendaceGroupById.get(userId) != null && attendaceGroupById.get(userId).size() > 0) { attendaceResultMap = attendaceGroupById.get(userId).stream().collect(Collectors.groupingBy(e -> e.get("rq").toString())); } for (int i=0; i<=betweenDays;i++){ String date = DateUtil.AfterDay(startDate,i); if (("".equals(companystartDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(companystartDate))>=0) && ("".equals(terminationDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(terminationDate)) <=0)){ attendanceAnalysisService.attendanceAnalysisForApi(userId,date,collect.get(userId),attendanceItems,schedulMap,workHourItems,clockInTimeMap,attendaceResultMap.get(date)); } } } paramMap.put("empIds",paramMap.get("userIds")); allowanceService.addAllowanceRecords(paramMap); } log.info("********AttendanceAnalysisJob start********"); return null; }catch (Exception e){ log.error("execute fail,catch error: [{}]",e); return ApiReturnTools.error("500",e.getMessage()); } } /** * 获得分析数据 * @return */ @POST @Path("/getAnalysisDate") @Produces({"text/plain"}) public String getAnalysisDate(@Context HttpServletRequest request, @Context HttpServletResponse response) { try { Map paramMap = ParamUtil.request2Map(request); String startDate = Util.null2String(paramMap.get("startDate")); String endDate = Util.null2String(paramMap.get("endDate")); String userIds = Util.null2String(paramMap.get("userIds")); String sql = "select id,userid,signdate,signtime from hrmschedulesign where isincom=1 and userid in ("+userIds+") and signdate >= ? and signdate <= ? order by signdate,signtime"; List> dataList = DbTools.getSqlToList(sql,DateUtil.beforeDay(startDate,1),DateUtil.AfterDay(endDate,1)); //补打卡记录 sql = "select id,bdkry userid,dkrq signdate,dksj signtime, lcid, bdklx from uf_jcl_kq_bdkjl where bdkry in ("+userIds+") and dkrq >= ? and dkrq <= ? and jlzt=1 order by dkrq,dksj"; List> makeUpList = DbTools.getSqlToList(sql,DateUtil.beforeDay(startDate,1),DateUtil.AfterDay(endDate,1)); //考勤项目 sql = "select id,mc from uf_jcl_kq_kqxm"; List> items = DbTools.getSqlToList(sql); Map itemMap = items.stream().collect(Collectors.toMap(e->Util.null2String(e.get("id")),e->Util.null2String(e.get("mc")))); if (makeUpList.size() > 0){ for (Map makeUpItem : makeUpList) { makeUpItem.put("sjly", "2"); makeUpItem.put("bdklxName", itemMap.get(Util.null2String(makeUpItem.get("bdklx")))); } dataList.addAll(makeUpList); } Map>> collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("userid")))); //请假记录 sql = "select b.qjry,b.jqlx,b.ksrq,b.kssj,b.jsrq,b.jssj,b.qjsc,b.qtj,b.btj from uf_jcl_kq_qjjl a left join uf_jcl_kq_qjjl_dt1 b on a.id = b.mainid where b.qjry in ("+userIds+") and b.ksrq<=? and b.jsrq>=? and (b.cxqj=0 or b.cxqj is null) and a.jlzt=1"; List> askforLeaveList = DbTools.getSqlToList(sql,DateUtil.AfterDay(endDate,1), DateUtil.beforeDay(startDate,1)); for (Map map :askforLeaveList){ map.put("jqlx_name",itemMap.get(map.get("jqlx"))); } Map>> askforLeavecollect = askforLeaveList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("qjry")))); //出差记录 sql = "select b.ccr,b.cclx,b.ksrq,b.jsrq,b.kssj,b.jssj,b.ccsc,b.qtcc,b.btcc,b.cxcc from uf_jcl_kq_ccjl a left join uf_jcl_kq_ccjl_dt1 b on a.id = b.mainid where b.ccr in ("+userIds+") and b.ksrq<=? and b.jsrq>=? and (b.cxcc=0 or b.cxcc is null) and a.jlzt=1"; List> evectionList = DbTools.getSqlToList(sql,DateUtil.AfterDay(endDate,1), DateUtil.beforeDay(startDate,1)); for (Map map :evectionList){ map.put("cclx_name",itemMap.get(map.get("cclx"))); } Map>> evectioncollect = evectionList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("ccr")))); //加班计划 sql = "select b.jbry,b.ksrq,b.kssj,b.jblx,b.jsrq,b.jssj,b.jbsc,b.gsrq from uf_jcl_kq_jbjh a left join uf_jcl_kq_jbjh_dt1 b on a.id=b.mainid where b.jbry in ("+userIds+") and b.gsrq>=? and b.gsrq<=? and (b.jbcx=0 or b.jbcx is null) and a.jlzt=1 order by b.ksrq,b.kssj"; List> overPlanDataList = DbTools.getSqlToList(sql,startDate,endDate); for (Map map :overPlanDataList){ map.put("jblx_name",itemMap.get(map.get("jblx"))); } Map>> overPlancollect = overPlanDataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("jbry")))); //加班结果 sql = "select szjg,jbry,sjksrq,jbjgly,sjjsrq,sjkssj,sjjssj,sjjbsc,jblx,zt from uf_jcl_kq_jbjg where jbry in ("+userIds+") and sjksrq>=? and sjjsrq<=? and zt=1 order by sjksrq,sjkssj"; List> overPlanResultList = DbTools.getSqlToList(sql,startDate,endDate); for (Map map :overPlanResultList){ map.put("jblx_name",itemMap.get(map.get("jblx"))); } Map>> overResultcollect = overPlanResultList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("jbry")))); List> resultList = Lists.newArrayList(); for (String userId : userIds.split(",")){ Map map = Maps.newHashMap(); Map>> map1 = Maps.newHashMap(); map1.put("signDate",collect.get(userId)); map1.put("askforLeave",askforLeavecollect.get(userId)); map1.put("evection",evectioncollect.get(userId)); map1.put("overPlan",overPlancollect.get(userId)); map1.put("overResult",overResultcollect.get(userId)); map.put("userId",userId); map.put("data",map1); resultList.add(map); } return ApiReturnTools.success(resultList); }catch (Exception e){ log.error("execute fail,catch error: [{}]",e); return ApiReturnTools.error("500","saveApplicableOrganization error"); } } /** * 获得已经设置为默认日历的日历名称信息 */ @POST @Path("/getDefaultCalendar") @Produces({"text/plain"}) public String getDefaultCalendar(@Context HttpServletRequest request, @Context HttpServletResponse response){ try { Map paramMap = ParamUtil.request2Map(request); String sql = "select id, szjg, rlmc, rlsm from uf_jcl_kq_rlmc where mrrl = '1' and szjg=?"; List> calendarList = DbTools.getSqlToList(sql,paramMap.get("szjg")); return ApiReturnTools.success(calendarList); }catch (Exception e){ log.error("execute fail,catch error: [{}]",e); return ApiReturnTools.error("500","saveApplicableOrganization error"); } } /** * 将所有的企业日历取消默认值标记 */ @POST @Path("/dumpDefaultCalendar") @Produces({"text/plain"}) public String dumpDefaultCalendar(@Context HttpServletRequest request, @Context HttpServletResponse response){ try { Map paramMap = ParamUtil.request2Map(request); String sql = "update uf_jcl_kq_rlmc set mrrl = '0' where szjg=?"; List> resultList = Lists.newArrayList(); Map map = Maps.newHashMap(); if(DbTools.update(sql,paramMap.get("szjg"))) map.put("update","1"); else map.put("update","0"); resultList.add(map); return ApiReturnTools.success(resultList); }catch (Exception e){ log.error("execute fail,catch error: [{}]",e); return ApiReturnTools.error("500","saveApplicableOrganization error"); } } /** * 获得当前日历被引用的次数 */ @POST @Path("/getCalendarRef") @Produces({"text/plain"}) public String getCalendarRef(@Context HttpServletRequest request, @Context HttpServletResponse response){ try { Map paramMap = ParamUtil.request2Map(request); String calendarId = Util.null2String(paramMap.get("id")); String sql = "select count(id) refcount from uf_jcl_kq_glpb where qyrl = "+calendarId; List> calendarList = DbTools.getSqlToList(sql); return ApiReturnTools.success(calendarList); }catch (Exception e){ log.error("execute fail,catch error: [{}]",e); return ApiReturnTools.error("500","saveApplicableOrganization error"); } } }