个人页面接口,加班时间计算bug,清理离职数据功能,打卡匹配bug修复,规律排班bug修复,假期发放起算日期数据异常bug修复。请假、加班、出差补打卡流程归档自动分析出勤功能,

main
liuliang 3 months ago
parent f931a4c2ce
commit 350fed1406

@ -3,7 +3,9 @@ package com.engine.jucailinkq.attendance.attendanceanalysis.cmd.getclockInpoint;
import com.engine.jucailinkq.attendance.attendanceanalysis.cmd.getclockInpoint.biz.AbstractAdjustClockPointAction;
import com.engine.jucailinkq.attendance.attendanceanalysis.dto.clockpoint.ClockPointDTO;
import com.engine.jucailinkq.attendance.attendanceanalysis.dto.clockpoint.ClockPointInfo;
import com.engine.jucailinkq.attendance.enums.CheckBoxEnum;
import com.engine.jucailinkq.attendance.enums.ClassSegmentTypeEnum;
import com.engine.jucailinkq.common.util.DateUtil;
import com.engine.jucailinkq.common.util.Utils;
import com.google.common.collect.Lists;
import weaver.general.Util;
@ -34,12 +36,23 @@ public class AdjustByEvectionCmd extends AbstractAdjustClockPointAction {
String ksdk = evectionSchedule.get("ksdk").toString();
String jsdk = evectionSchedule.get("jsdk").toString();
for (int i=0;i<clcokInPointList.size();i++){
if (DateUtil.getTime(clcokInPointList.get(i).getClassTime()).compareTo(DateUtil.getTime(kssj)) >0 &&
DateUtil.getTime(clcokInPointList.get(i).getClassTime()).compareTo(DateUtil.getTime(jssj)) <0){
clcokInPointList.remove(i);
i--;
}else if (DateUtil.getTime(clcokInPointList.get(i).getClassTime()).compareTo(DateUtil.getTime(kssj)) == 0 && CheckBoxEnum.UNCHECKED.getKey().equals(ksdk)){
clcokInPointList.remove(i);
i--;
}else if (DateUtil.getTime(clcokInPointList.get(i).getClassTime()).compareTo(DateUtil.getTime(jssj)) == 0 && CheckBoxEnum.UNCHECKED.getKey().equals(jsdk)){
clcokInPointList.remove(i);
i--;
}
}
}
return null;
return clcokInPointList;
}
}

@ -203,8 +203,9 @@ public class GetOvertimeDurationCmd extends AbstractCommonCommand<Map<String, Ob
beLateTime = DateUtil.getBetWeenMinutes(kssjTime, realityStartTime);
List<Map<String, Object>> collect1 = anomalyList.stream().filter(e -> e.get("pointTime").equals(kssj) && e.get("bdlx").equals(scheduleMap.get("bdlx"))).collect(Collectors.toList());
if (!"".equals(jbwdhlfzs) && beLateTime < Integer.valueOf(jbwdhlfzs)) {
if (!"".equals(jbwdhlfzs) && beLateTime <= Integer.valueOf(jbwdhlfzs)) {
beLateTime = 0;
realityStartTime = kssjTime;
}
//当存在迟到异常被抵消的情况
if (collect1.size() > 0) {
@ -247,8 +248,9 @@ public class GetOvertimeDurationCmd extends AbstractCommonCommand<Map<String, Ob
if (DateUtil.getTime(realityEndime).compareTo(DateUtil.getTime(jssjTime)) < 0) {
leaveElaryTime = DateUtil.getBetWeenMinutes(realityEndime, jssjTime);
List<Map<String, Object>> collect2 = anomalyList.stream().filter(e -> e.get("pointTime").equals(jssj) && e.get("bdlx").equals(scheduleMap.get("bdlx")) ).collect(Collectors.toList());
if (!"".equals(jbzzhlfzs) && leaveElaryTime < Integer.valueOf(jbzzhlfzs)) {
if (!"".equals(jbzzhlfzs) && leaveElaryTime <= Integer.valueOf(jbzzhlfzs)) {
leaveElaryTime = 0;
realityEndime=jssjTime;
}
//当存在早退异常被抵消的情况
if (collect2.size() > 0) {

@ -452,7 +452,7 @@ public class SaveWorkOverTimeCmd extends AbstractCommonCommand<Map<String,Object
List<String> ids = Lists.newArrayList();
for (Map<String,Object> askforleave:askforleaveList){
BigDecimal sysc = new BigDecimal(askforleave.get("sysc").toString());
overdraftHoliday = overdraftHoliday.subtract(sysc,new MathContext(2, RoundingMode.HALF_UP));
overdraftHoliday = overdraftHoliday.subtract(sysc,new MathContext(4, RoundingMode.HALF_UP));
if (overdraftHoliday.doubleValue() >= 0){
ids.add(askforleave.get("id").toString());
}

@ -23,10 +23,7 @@ import weaver.general.Util;
import weaver.interfaces.schedule.BaseCronJob;
import java.time.ZoneOffset;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@ -260,6 +257,19 @@ public class AttendanceAnalysisJob extends BaseCronJob {
log.info("********AttendanceAnalysisJob analysis end********");
log.info("********AttendanceAnalysisJob allowance start********");
allowanceService.addAllowanceRecords(param);
log.info("********AttendanceAnalysisJob allowance end********");
/**
* 退
*/
int diffdays = DateUtil.getDays(useDate, Calendar.DAY_OF_MONTH);
String startDate = useDate.split("-")[0]+"-"+useDate.split("-")[1] + "-01";
String endDate = useDate.split("-")[0]+"-"+useDate.split("-")[1] + "-" + diffdays;
Map<String,Object> needCleanParam = Maps.newHashMap();
needCleanParam.put("startDate",startDate);
needCleanParam.put("endDate",endDate);
commonService.CleanHaveLeaveUserDataCmd(needCleanParam);
log.info("********AttendanceAnalysisJob end********");
}

@ -1,5 +1,7 @@
package com.engine.jucailinkq.attendance.attendanceanalysis.service.impl;
import com.engine.core.interceptor.CommandContext;
import com.engine.jucailinkq.attendance.attendanceanalysis.cmd.item.WorkOvertimeItemCmd;
import com.engine.jucailinkq.attendance.attendanceanalysis.dto.clockpoint.ClockPointDTO;
import com.engine.jucailinkq.attendance.attendanceanalysis.service.ShiftService;
import com.engine.jucailinkq.attendance.attendanceanalysis.service.UtilService;
@ -187,7 +189,23 @@ public class ShiftServiceImpl extends Service implements ShiftService {
compareTime = Util.null2String(elasticTime).equals("") ? classTime : elasticTime;
//判断这个需要打卡的时间点,有没有正常打卡
if (ClockPointEnum.EMPTY.equals(timeType) || clockTimeMap == null || clockTime.length() < 16) {
continue;
//漏打卡
List<Map<String,Object>> bcData = (List<Map<String,Object>>)compareMap.get("bcData");
String bcrq = compareMap.get("bcrq").toString();
Map<String,Object> scheduleMap = null;
if (ClockPointEnum.START.equals(pointType)){
//开始打卡
scheduleMap = bcData.stream().filter(e->DateUtil.getTime(Utils.getkssjTime(e,bcrq)).compareTo(DateUtil.getTime(dto.getClassTime()))==0 && dto.getClassSegmentType().equals(e.get("bdlx"))).collect(Collectors.toList()).get(0);
}else if (ClockPointEnum.END.equals(pointType)){
scheduleMap = bcData.stream().filter(e->DateUtil.getTime(Utils.getjssjTime(e,bcrq)).compareTo(DateUtil.getTime(dto.getClassTime()))==0 && dto.getClassSegmentType().equals(e.get("bdlx"))).collect(Collectors.toList()).get(0);
}
if (Utils.ifAskforOrEvctionClassSegment(dto.getClassSegmentType())){
abnormalMinutes = abnormalMinutes + DateUtil.getBetWeenMinutes(Utils.getkssjTime(scheduleMap,bcrq),Utils.getjssjTime(scheduleMap,bcrq));
}else {
abnormalMinutes = abnormalMinutes + Integer.valueOf(scheduleMap.get("edfzs").toString());
}
} else if (ClockPointEnum.START.equals(pointType) && ClockPointEnum.AFTER.equals(timeType)) {
//迟到,异常打卡-记录异常分钟数
int betweenTime = DateUtil.getBetWeenMinutes(compareTime,clockTime.substring(0, 16));
@ -358,6 +376,7 @@ public class ShiftServiceImpl extends Service implements ShiftService {
if (!newMap.get("sfxx").equals(CheckBoxEnum.CHECKED.getKey())){
newMap.put("sfxx",restSign);
}
adjustWorkOverTimeClass(newMap, haveattendanceItems,null);
classs.add(newMap);
}
resultMap.put(punchDate,classs);
@ -476,6 +495,65 @@ public class ShiftServiceImpl extends Service implements ShiftService {
return resultMap;
}
/**
* 1
* 2
* @param scheduleMap
*/
public void adjustWorkOverTimeClass(Map<String,Object> scheduleMap, List<Map<String,Object>> attendanceItems, CommandContext commandContext){
String bdlx = Util.null2String(scheduleMap.get("bdlx"));
//是否休息
String sfxx = Util.null2String(scheduleMap.get("sfxx"));
//休息班打卡自动加班
String xxbdkzdjb = Util.null2String(scheduleMap.get("xxbdkzdjb"));
if (CheckBoxEnum.CHECKED.getKey().equals(sfxx) && CheckBoxEnum.CHECKED.getKey().equals(xxbdkzdjb) &&
bdlx.equals(ClassSegmentTypeEnum.WORK_TIME.getKey())){
scheduleMap.put("beforeClassSegment",bdlx);
scheduleMap.put("bdlx",ClassSegmentTypeEnum.OVERTIME_PLAN.getKey());
bdlx = ClassSegmentTypeEnum.OVERTIME_PLAN.getKey();
}
if (Utils.ifOverTimeClassSegment(scheduleMap.get("bdlx").toString())){
Map<String,Object> getWorkOverTimeParam = Maps.newHashMap();
getWorkOverTimeParam.put("attendanceItems",attendanceItems);
getWorkOverTimeParam.put("rqlx",scheduleMap.get("rqlx"));
getWorkOverTimeParam.put("workfor", Utils.getWorkFor(bdlx));
List<Map<String,Object>> workTimeBeItems = Lists.newArrayList();
if (ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey().equals(bdlx)){
Map<String,Object> result = new WorkOvertimeItemCmd(getWorkOverTimeParam).execute(commandContext);
//加班项目
workTimeBeItems = (List<Map<String,Object>>)result.get("attendanceItems");
}else if (ClassSegmentTypeEnum.EARLY_OVERTIME.getKey().equals(bdlx)){
Map<String,Object> result = new WorkOvertimeItemCmd(getWorkOverTimeParam).execute(commandContext);
workTimeBeItems = (List<Map<String,Object>>)result.get("attendanceItems");
}else if (ClassSegmentTypeEnum.OVERTIME_PLAN.getKey().equals(bdlx) &&
ClassSegmentTypeEnum.WORK_TIME.getKey().equals(scheduleMap.get("beforeClassSegment"))){
Map<String,Object> result = new WorkOvertimeItemCmd(getWorkOverTimeParam).execute(commandContext);
workTimeBeItems = (List<Map<String,Object>>)result.get("attendanceItems");
scheduleMap.put("jblx",workTimeBeItems);
}else if (ClassSegmentTypeEnum.OVERTIME_IN_CLASS.getKey().equals(bdlx)){
Map<String,Object> result = new WorkOvertimeItemCmd(getWorkOverTimeParam).execute(commandContext);
workTimeBeItems = (List<Map<String,Object>>)result.get("attendanceItems");
}
if (workTimeBeItems.size() > 0){
int tqdkfzs = Integer.valueOf(Util.null2String(scheduleMap.get("tqdkfzs")).equals("")?"0":Util.null2String(scheduleMap.get("tqdkfzs")));
int thdkfzs = Integer.valueOf(Util.null2String(scheduleMap.get("thdkfzs")).equals("")?"0":Util.null2String(scheduleMap.get("thdkfzs")));
int tqdkyxfzs = Util.null2String(workTimeBeItems.get(0).get("tqdkyxfzs")).equals("")?0:Integer.valueOf(Util.null2String(workTimeBeItems.get(0).get("tqdkyxfzs")));
int thdkyxfzs = Util.null2String(workTimeBeItems.get(0).get("thdkyxfzs")).equals("")?0:Integer.valueOf(Util.null2String(workTimeBeItems.get(0).get("thdkyxfzs")));
if (tqdkyxfzs > tqdkfzs){
//提前打卡分钟数
scheduleMap.put("tqdkfzs",tqdkyxfzs);
}
if (thdkyxfzs > thdkfzs){
//推后打卡分钟数
scheduleMap.put("thdkfzs",thdkyxfzs);
}
}
}
}
/**
*
*

@ -2,6 +2,7 @@ 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.AttendaceActionWrapper;
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;
@ -32,11 +33,7 @@ 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);
private CommonService commonService = ServiceUtil.getService(CommonServiceImpl.class);
private AttendaceActionWrapper actionWrapper = ServiceUtil.getService(AttendaceActionWrapper.class);
/**
*
* @return
@ -45,298 +42,8 @@ public class AttendanceanalysisAction {
@Path("/attendanceAnalysisByHrmAndDate")
@Produces({"text/plain"})
public String getSchedulingData(@Context HttpServletRequest request, @Context HttpServletResponse response) {
try {
log.info("********AttendanceanalysisAction start********");
Map<String,Object> paramMap = ParamUtil.request2Map(request);
// Map<String,Object> paramMap = Maps.newHashMap();
// paramMap.put("startDate","2025-01-15");
// paramMap.put("endDate","2025-01-15");
// paramMap.put("userIds","23");
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);
//初始化扩展类
CommonUtil.initExtensionClassHolder();
//入职离职当天是否需要进行考勤分析。0入职离职当天均分析、1入职离职当天不分析
String leaveAndEntry = Util.null2String(ExtensionClassHolder.getGlobalSetMap().get("leaveAndEntry"));
/**考勤项目*/
Map<String,Object> params = Maps.newHashMap();
String modeId = Utils.getFormmodeIdMap().get("uf_jcl_kq_kqfa");
params.put("modeId",modeId);
Map<String,Object> attendancePlanMap = commonService.GetAllPersonBySuitOrganzationCmd(params);
Map<String,Object> attendacnePlanItems = basicsetService.getAttendanceItemsGroupByAttendancePlanDataCmd();
//人员所拥有的所有考勤方案
//通用考勤项目
List<Map<String,Object>> generalAttendanceItems = (List<Map<String,Object>>)attendacnePlanItems.get("generalAttendanceItems");
//考勤方案对应所属的考勤项目
Map<String,List<Map<String,Object>>> attendanceItemGroupByPlan = (Map<String,List<Map<String,Object>>>)attendacnePlanItems.get("attendanceItemGroupByPlan");
/**综合工时*/
modeId = Utils.getFormmodeIdMap().get("uf_jcl_kq_zhgs");
params.put("modeId",modeId);
Map<String,Object> workingHourResultMap = commonService.getPersonBySuitOrganzation(params);
//人员所拥有的所有综合工时
Map<String,List<Map<String,String>>> personComprehensiveWorkingHours = (Map<String,List<Map<String,String>>>)workingHourResultMap.get("personAllData");
String queysql = "select * from uf_jcl_kq_zhgs";
List<Map<String,Object>> resultList = DbTools.getSqlToList(queysql);
//所有综合工时
Map<String,List<Map<String,Object>>> workingHourGroupBy = resultList.stream().collect(Collectors.groupingBy(e->e.get("id").toString()));
CommonUtil.checkHavePermission();
if ("".equals(userIds)){
log.info("********AttendanceanalysisAction prepare start******");
String queryDepartEmployeeSql = "select resourceid ,changedate,type_n from HRMSTATUSHISTORY where changedate is not null";
//获取离职日期
List<Map<String,Object>> departEmployeeList = DbTools.getSqlToList(queryDepartEmployeeSql);
Map<String,Object> departEmployeeMap = CommonUtil.getDepartEmployeeMap(departEmployeeList);
/**排班结果*/
String querySchedulesql = "select a.id as keyid,a.* from uf_pbjg a where bcrq >=? and bcrq<=? order by bcrq";
List<Map<String,Object>> allScheduleList = DbTools.getSqlToList(querySchedulesql,startDate,endDate);
/**加班计划*/
String queryOverplansql = "select a.id,b.jbry,b.ksrq,b.kssj,b.jblx,b.jsrq,b.jssj,b.jbsc,b.gsrq,b.d_jxgz,b.jxsc from uf_jcl_kq_jbjh a left join uf_jcl_kq_jbjh_dt1 b on a.id=b.mainid where b.gsrq >=? and b.gsrq<=? and (b.jbcx=0 or b.jbcx is null) and a.jlzt=1";
List<Map<String,Object>> allOverPlanList = DbTools.getSqlToList(queryOverplansql,startDate,endDate);
Map<String,List<Map<String,Object>>> allOverPlanGroup = allOverPlanList.stream().collect(Collectors.groupingBy(e->e.get("jbry").toString()));
/**班次信息*/
String querClasssql = "select a.xxbdkzdjb,a.sfxx,a.id bcxx,a.edsc,a.zgzsc,a.bcsdxx,a.sfdx,a.sfkt,b.bdlx,a.btgz,a.fgsjd,a.zddxfz,a.dxhs,b.kssj dtkssj,b.jssj dtjssj,b.ksdk,b.jsdk,b.tqdkfzs,b.thdkfzs,b.edxss,b.edfzs,b.edts,b.sfdx dtsfdx,b.zddxfz dtzddxfz,b.dxhs dtdxhs,b.gsrq from uf_jcl_kq_bcxx a left join uf_jcl_kq_bcxx_dt1 b on a.id=b.mainid";
List<Map<String,Object>> allClassInfoList = DbTools.getSqlToList(querClasssql);
/**出差信息*/
String querEvectionsql = "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.ksrq<=? and b.jsrq>=? and (b.cxcc=0 or b.cxcc is null) and a.jlzt=1";
Map<String,List<Map<String,Object>>> evectionGroup = DbTools.getSqlToList(querEvectionsql,endDate,startDate).stream().collect(Collectors.groupingBy(e->e.get("ccr").toString()));
/**请假信息*/
String queryAskForsql = "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.ksrq<=? and b.jsrq>=? and (b.cxqj=0 or b.cxqj is null) and a.jlzt=1";
Map<String,List<Map<String,Object>>> askforGroup = DbTools.getSqlToList(queryAskForsql,endDate,startDate).stream().collect(Collectors.groupingBy(e->e.get("qjry").toString()));
/**候选班组*/
String queryHxbz = "select * from uf_jcl_kq_hxbz_dt1";
List<Map<String,Object>> hxbzList = DbTools.getSqlToList(queryHxbz);
String queryUserSql = "select id,companystartdate,seclevel,departmentid,subcompanyid1 from hrmresource where status <> '5' and status <> '4' and status <> '7'";
List<Map<String,Object>> 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<Map<String,Object>> 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<Map<String,Object>> 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<String, List<Map<String,Object>>> collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("userid"))));
sql = "select sjzt,sgsj,ygid,bc,fbid,bm,rq,j1,c1,j2,c2,j3,c3,j4,c4,j5,c5,j6,c6,j7,c7,j8,c8 from uf_jcl_kq_cqjg where rq>=? and rq<=?";
List<Map<String,Object>> attendaceResult = DbTools.getSqlToList(sql,startBeforeDate,endAfterDate);
Map<String,List<Map<String,Object>>> attendaceGroupById = attendaceResult.stream().collect(Collectors.groupingBy(e->e.get("ygid").toString()));
log.info("********AttendanceanalysisAction prepare end******");
int anyslsSize = 0;
for (Map<String,Object> userMap :userList){
anyslsSize++;
String userId = userMap.get("id").toString();
//入职日期
String companystartDate = Util.null2String(userMap.get("companystartdate"));
//离职日期
String terminationDate = Util.null2String(departEmployeeMap.get(userId));
if (!"".equals(terminationDate) && DateUtil.getTime(terminationDate).compareTo(DateUtil.getTime(companystartDate)) <=0){
terminationDate="";
}
log.info("***********analysis userId:{},anyslsSize:{},allsize:{} start***********", userId,anyslsSize,userList.size());
//出勤结果,进出时间
Map<String,Map<String,Object>> clockInTimeMap = Maps.newHashMap();
Map<String, List<Map<String, Object>>> 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 (Map<String, Object> map: attendaceGroupById.get(userId)){
clockInTimeMap.put(map.get("rq").toString(),map);
}
}
Map<String,Object> analysisParam = Maps.newHashMap();
analysisParam.put("generalAttendanceItems",generalAttendanceItems);
analysisParam.put("attendancePlanMap",attendancePlanMap);
analysisParam.put("attendanceItemGroupByPlan",attendanceItemGroupByPlan);
analysisParam.put("comprehensiveWorkingHourList",personComprehensiveWorkingHours.get(userId)==null?Lists.newArrayList():personComprehensiveWorkingHours.get(userId));
analysisParam.put("workingHourGroupBy",workingHourGroupBy);
analysisParam.put("allScheduleList",allScheduleList);
analysisParam.put("allClassInfoList",allClassInfoList);
analysisParam.put("allOverPlanList",allOverPlanGroup.get(userId)==null?Lists.newArrayList():allOverPlanGroup.get(userId));
analysisParam.put("evectionList",evectionGroup.get(userId)==null?Lists.newArrayList():evectionGroup.get(userId));
analysisParam.put("askforList",askforGroup.get(userId)==null?Lists.newArrayList():askforGroup.get(userId));
analysisParam.put("hxbzList",hxbzList);
analysisParam.put("seclevel",Util.null2String(userMap.get("seclevel")));
analysisParam.put("departmentId",Util.null2String(userMap.get("departmentid")));
analysisParam.put("subCompanyId",Util.null2String(userMap.get("subcompanyid1")));
for (int i=0; i<=betweenDays;i++){
String date = DateUtil.AfterDay(startDate,i);
if (leaveAndEntry.equals("1")){
if (("".equals(companystartDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(companystartDate))>0)
&& ("".equals(terminationDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(terminationDate)) <0)){
try {
attendanceAnalysisService.attendanceAnalysisForApi(userId,date,collect.get(userId),analysisParam,clockInTimeMap,attendaceResultMap);
}catch (Exception e){
log.info("***********analysis userId:{} date: {} error ***********", userId,date);
log.error("execute fail,catch error: [{}]",e);
}
}
}else {
if (("".equals(companystartDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(companystartDate))>=0)
&& ("".equals(terminationDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(terminationDate)) <=0)){
try {
attendanceAnalysisService.attendanceAnalysisForApi(userId,date,collect.get(userId),analysisParam,clockInTimeMap,attendaceResultMap);
}catch (Exception e){
log.info("***********analysis userId:{} date: {} error ***********", userId,date);
log.error("execute fail,catch error: [{}]",e);
}
}
}
}
allowanceService.addAllowanceRecords(paramMap);
}
}else {
log.info("********AttendanceanalysisAction prepare start******");
String queryDepartEmployeeSql = "select resourceid ,changedate,type_n from HRMSTATUSHISTORY where changedate is not null and resourceid in ("+userIds+")";
//获取离职日期
List<Map<String,Object>> departEmployeeList = DbTools.getSqlToList(queryDepartEmployeeSql);
Map<String,Object> departEmployeeMap = CommonUtil.getDepartEmployeeMap(departEmployeeList);
/**排班结果*/
String querySchedulesql = "select a.id as keyid,a.* from uf_pbjg a where bcrq >=? and bcrq<=? order by bcrq";
List<Map<String,Object>> allScheduleList = DbTools.getSqlToList(querySchedulesql,startBeforeDate,endAfterDate);
/**加班计划*/
String queryOverplansql = "select a.id,b.jbry,b.ksrq,b.kssj,b.jblx,b.jsrq,b.jssj,b.jbsc,b.gsrq,b.d_jxgz,b.jxsc 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";
List<Map<String,Object>> allOverPlanList = DbTools.getSqlToList(queryOverplansql,startDate,endDate);
Map<String,List<Map<String,Object>>> allOverPlanGroup = allOverPlanList.stream().collect(Collectors.groupingBy(e->e.get("jbry").toString()));
/**班次信息*/
String querClasssql = "select a.xxbdkzdjb,a.sfxx,a.id bcxx,a.edsc,a.zgzsc,a.bcsdxx,a.sfdx,a.sfkt,b.bdlx,a.btgz,a.fgsjd,a.zddxfz,a.dxhs,b.kssj dtkssj,b.jssj dtjssj,b.ksdk,b.jsdk,b.tqdkfzs,b.thdkfzs,b.edxss,b.edfzs,b.edts,b.sfdx dtsfdx,b.zddxfz dtzddxfz,b.dxhs dtdxhs,b.gsrq from uf_jcl_kq_bcxx a left join uf_jcl_kq_bcxx_dt1 b on a.id=b.mainid";
List<Map<String,Object>> allClassInfoList = DbTools.getSqlToList(querClasssql);
/**出差信息*/
String querEvectionsql = "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";
Map<String,List<Map<String,Object>>> evectionGroup = DbTools.getSqlToList(querEvectionsql,endDate,startDate).stream().collect(Collectors.groupingBy(e->e.get("ccr").toString()));
/**请假信息*/
String queryAskForsql = "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";
Map<String,List<Map<String,Object>>> askforGroup = DbTools.getSqlToList(queryAskForsql,endDate,startDate).stream().collect(Collectors.groupingBy(e->e.get("qjry").toString()));
/**候选班组*/
String queryHxbz = "select * from uf_jcl_kq_hxbz_dt1";
List<Map<String,Object>> hxbzList = DbTools.getSqlToList(queryHxbz);
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<Map<String,Object>> dataList = DbTools.getSqlToList(sql,startBeforeDate,endAfterDate);
String queryUserSql = "select id,companystartdate,seclevel,departmentid,subcompanyid1 from hrmresource where id in ("+userIds+")";
List<Map<String,Object>> userList = DbTools.getSqlToList(queryUserSql);
Map<String,List<Map<String,Object>>> 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<Map<String,Object>> 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<String, List<Map<String,Object>>> collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("userid"))));
sql = "select sjzt,sgsj,ygid,bc,fbid,bm,rq,j1,c1,j2,c2,j3,c3,j4,c4,j5,c5,j6,c6,j7,c7,j8,c8 from uf_jcl_kq_cqjg where rq>=? and rq<=? and ygid in ("+userIds+")";
List<Map<String,Object>> attendaceResult = DbTools.getSqlToList(sql,startBeforeDate,endAfterDate);
Map<String,List<Map<String,Object>>> attendaceGroupById = attendaceResult.stream().collect(Collectors.groupingBy(e->e.get("ygid").toString()));
log.info("********AttendanceanalysisAction prepare end******");
for (String userId : userIds.split(",")){
//入职日期
String companystartDate = Util.null2String(userGroupMap.get(userId).get(0).get("companystartdate"));
//离职日期
String terminationDate = Util.null2String(departEmployeeMap.get(userId));
if (!"".equals(terminationDate) && DateUtil.getTime(terminationDate).compareTo(DateUtil.getTime(companystartDate)) <=0){
terminationDate="";
}
//出勤结果,进出时间
Map<String,Map<String,Object>> clockInTimeMap = Maps.newHashMap();
Map<String,Object> analysisParam = Maps.newHashMap();
analysisParam.put("generalAttendanceItems",generalAttendanceItems);
analysisParam.put("attendancePlanMap",attendancePlanMap);
analysisParam.put("attendanceItemGroupByPlan",attendanceItemGroupByPlan);
analysisParam.put("comprehensiveWorkingHourList",personComprehensiveWorkingHours.get(userId)==null?Lists.newArrayList():personComprehensiveWorkingHours.get(userId));
analysisParam.put("workingHourGroupBy",workingHourGroupBy);
analysisParam.put("allScheduleList",allScheduleList);
analysisParam.put("allClassInfoList",allClassInfoList);
analysisParam.put("allOverPlanList",allOverPlanGroup.get(userId)==null?Lists.newArrayList():allOverPlanGroup.get(userId));
analysisParam.put("evectionList",evectionGroup.get(userId)==null?Lists.newArrayList():evectionGroup.get(userId));
analysisParam.put("askforList",askforGroup.get(userId)==null?Lists.newArrayList():askforGroup.get(userId));
analysisParam.put("hxbzList",hxbzList);
analysisParam.put("seclevel",userGroupMap.get(userId).get(0).get("seclevel"));
analysisParam.put("departmentId",userGroupMap.get(userId).get(0).get("departmentid"));
analysisParam.put("subCompanyId",userGroupMap.get(userId).get(0).get("subcompanyid1"));
Map<String, List<Map<String, Object>>> 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 (Map<String, Object> map: attendaceGroupById.get(userId)){
clockInTimeMap.put(map.get("rq").toString(),map);
}
}
for (int i=0; i<=betweenDays;i++){
String date = DateUtil.AfterDay(startDate,i);
if (leaveAndEntry.equals("1")){
if (("".equals(companystartDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(companystartDate))>0)
&& ("".equals(terminationDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(terminationDate)) <0)){
log.info("***********analysis userId:{},analysisDate:{} start***********", userId, date);
try {
attendanceAnalysisService.attendanceAnalysisForApi(userId,date,collect.get(userId),analysisParam,clockInTimeMap,attendaceResultMap);
}catch (Exception e){
log.info("***********analysis userId:{} date: {} error ***********", userId,date);
log.error("execute fail,catch error: [{}]",e);
if (userIds.split(",").length ==1 && startDate.equals(endDate)){
throw new AttendanceRunTimeException(e);
}
}
}
}else {
if (("".equals(companystartDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(companystartDate))>=0)
&& ("".equals(terminationDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(terminationDate)) <=0)){
log.info("***********analysis userId:{},analysisDate:{} start***********", userId, date);
try {
attendanceAnalysisService.attendanceAnalysisForApi(userId,date,collect.get(userId),analysisParam,clockInTimeMap,attendaceResultMap);
}catch (Exception e){
log.info("***********analysis userId:{} date: {} error ***********", userId,date);
log.error("execute fail,catch error: [{}]",e);
if (userIds.split(",").length ==1 && startDate.equals(endDate)){
throw new AttendanceRunTimeException(e);
}
}
}
}
}
}
paramMap.put("empIds",paramMap.get("userIds"));
allowanceService.addAllowanceRecords(paramMap);
}
log.info("********AttendanceanalysisAction end********");
return ApiReturnTools.success(Maps.newHashMap());
}catch (Exception e){
log.error("execute fail,catch error: [{}]",e);
return ApiReturnTools.errorjson("500",e.getCause().getMessage());
}
Map<String,Object> paramMap = ParamUtil.request2Map(request);
return ApiReturnTools.DirectReturn(actionWrapper.alysisActionWrapper(paramMap));
}
/**

@ -0,0 +1,327 @@
package com.engine.jucailinkq.attendance.attendanceanalysis.wrapper;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
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.jucailinkq.common.exception.AttendanceRunTimeException;
import com.engine.jucailinkq.common.service.CommonService;
import com.engine.jucailinkq.common.service.impl.CommonServiceImpl;
import com.engine.jucailinkq.common.util.*;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import java.time.ZoneOffset;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
public class AttendaceActionWrapper extends Service {
private CommonService commonService = ServiceUtil.getService(CommonServiceImpl.class);
private AttendancePlanService basicsetService = ServiceUtil.getService(AttendancePlanServiceImpl.class);
private AttendanceAnalysisWrapper attendanceAnalysisService = ServiceUtil.getService(AttendanceAnalysisWrapper.class);
private AllowanceService allowanceService = ServiceUtil.getService(AllowanceServiceImpl.class);
public Map<String,Object> alysisActionWrapper(Map<String,Object> paramMap){
Map<String,Object> resultMap = Maps.newHashMap();
try {
log.info("********AttendanceanalysisAction start********");
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);
log.info("userIds : [{}],startDate:[{}],endDate:[{}]",userIds,startDate,endDate);
//初始化扩展类
CommonUtil.initExtensionClassHolder();
//入职离职当天是否需要进行考勤分析。0入职离职当天均分析、1入职离职当天不分析
String leaveAndEntry = Util.null2String(ExtensionClassHolder.getGlobalSetMap().get("leaveAndEntry"));
/**考勤项目*/
Map<String,Object> params = Maps.newHashMap();
String modeId = Utils.getFormmodeIdMap().get("uf_jcl_kq_kqfa");
params.put("modeId",modeId);
Map<String,Object> attendancePlanMap = commonService.GetAllPersonBySuitOrganzationCmd(params);
Map<String,Object> attendacnePlanItems = basicsetService.getAttendanceItemsGroupByAttendancePlanDataCmd();
//人员所拥有的所有考勤方案
//通用考勤项目
List<Map<String,Object>> generalAttendanceItems = (List<Map<String,Object>>)attendacnePlanItems.get("generalAttendanceItems");
//考勤方案对应所属的考勤项目
Map<String,List<Map<String,Object>>> attendanceItemGroupByPlan = (Map<String,List<Map<String,Object>>>)attendacnePlanItems.get("attendanceItemGroupByPlan");
/**综合工时*/
modeId = Utils.getFormmodeIdMap().get("uf_jcl_kq_zhgs");
params.put("modeId",modeId);
Map<String,Object> workingHourResultMap = commonService.getPersonBySuitOrganzation(params);
//人员所拥有的所有综合工时
Map<String,List<Map<String,String>>> personComprehensiveWorkingHours = (Map<String,List<Map<String,String>>>)workingHourResultMap.get("personAllData");
String queysql = "select * from uf_jcl_kq_zhgs";
List<Map<String,Object>> resultList = DbTools.getSqlToList(queysql);
//所有综合工时
Map<String,List<Map<String,Object>>> workingHourGroupBy = resultList.stream().collect(Collectors.groupingBy(e->e.get("id").toString()));
CommonUtil.checkHavePermission();
if ("".equals(userIds)){
log.info("********AttendanceanalysisAction prepare start******");
String queryDepartEmployeeSql = "select resourceid ,changedate,type_n from HRMSTATUSHISTORY where changedate is not null";
//获取离职日期
List<Map<String,Object>> departEmployeeList = DbTools.getSqlToList(queryDepartEmployeeSql);
Map<String,Object> departEmployeeMap = CommonUtil.getDepartEmployeeMap(departEmployeeList);
/**排班结果*/
String querySchedulesql = "select a.id as keyid,a.* from uf_pbjg a where bcrq >=? and bcrq<=? order by bcrq";
List<Map<String,Object>> allScheduleList = DbTools.getSqlToList(querySchedulesql,startDate,endDate);
/**加班计划*/
String queryOverplansql = "select a.id,b.jbry,b.ksrq,b.kssj,b.jblx,b.jsrq,b.jssj,b.jbsc,b.gsrq,b.d_jxgz,b.jxsc from uf_jcl_kq_jbjh a left join uf_jcl_kq_jbjh_dt1 b on a.id=b.mainid where b.gsrq >=? and b.gsrq<=? and (b.jbcx=0 or b.jbcx is null) and a.jlzt=1";
List<Map<String,Object>> allOverPlanList = DbTools.getSqlToList(queryOverplansql,startDate,endDate);
Map<String,List<Map<String,Object>>> allOverPlanGroup = allOverPlanList.stream().collect(Collectors.groupingBy(e->e.get("jbry").toString()));
/**班次信息*/
String querClasssql = "select a.xxbdkzdjb,a.sfxx,a.id bcxx,a.edsc,a.zgzsc,a.bcsdxx,a.sfdx,a.sfkt,b.bdlx,a.btgz,a.fgsjd,a.zddxfz,a.dxhs,b.kssj dtkssj,b.jssj dtjssj,b.ksdk,b.jsdk,b.tqdkfzs,b.thdkfzs,b.edxss,b.edfzs,b.edts,b.sfdx dtsfdx,b.zddxfz dtzddxfz,b.dxhs dtdxhs,b.gsrq from uf_jcl_kq_bcxx a left join uf_jcl_kq_bcxx_dt1 b on a.id=b.mainid";
List<Map<String,Object>> allClassInfoList = DbTools.getSqlToList(querClasssql);
/**出差信息*/
String querEvectionsql = "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.ksrq<=? and b.jsrq>=? and (b.cxcc=0 or b.cxcc is null) and a.jlzt=1";
Map<String,List<Map<String,Object>>> evectionGroup = DbTools.getSqlToList(querEvectionsql,endAfterDate,startBeforeDate).stream().collect(Collectors.groupingBy(e->e.get("ccr").toString()));
/**请假信息*/
String queryAskForsql = "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.ksrq<=? and b.jsrq>=? and (b.cxqj=0 or b.cxqj is null) and a.jlzt=1";
Map<String,List<Map<String,Object>>> askforGroup = DbTools.getSqlToList(queryAskForsql,endAfterDate,startBeforeDate).stream().collect(Collectors.groupingBy(e->e.get("qjry").toString()));
/**候选班组*/
String queryHxbz = "select * from uf_jcl_kq_hxbz_dt1";
List<Map<String,Object>> hxbzList = DbTools.getSqlToList(queryHxbz);
String queryUserSql = "select id,companystartdate,seclevel,departmentid,subcompanyid1 from hrmresource where status <> '5' and status <> '4' and status <> '7'";
List<Map<String,Object>> 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<Map<String,Object>> 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<Map<String,Object>> 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<String, List<Map<String,Object>>> collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("userid"))));
sql = "select sjzt,sgsj,ygid,bc,fbid,bm,rq,j1,c1,j2,c2,j3,c3,j4,c4,j5,c5,j6,c6,j7,c7,j8,c8 from uf_jcl_kq_cqjg where rq>=? and rq<=?";
List<Map<String,Object>> attendaceResult = DbTools.getSqlToList(sql,startBeforeDate,endAfterDate);
Map<String,List<Map<String,Object>>> attendaceGroupById = attendaceResult.stream().collect(Collectors.groupingBy(e->e.get("ygid").toString()));
log.info("********AttendanceanalysisAction prepare end******");
int anyslsSize = 0;
for (Map<String,Object> userMap :userList){
anyslsSize++;
String userId = userMap.get("id").toString();
//入职日期
String companystartDate = Util.null2String(userMap.get("companystartdate"));
//离职日期
String terminationDate = Util.null2String(departEmployeeMap.get(userId));
if (!"".equals(terminationDate) && DateUtil.getTime(terminationDate).compareTo(DateUtil.getTime(companystartDate)) <=0){
terminationDate="";
}
log.info("***********analysis userId:{},anyslsSize:{},allsize:{} start***********", userId,anyslsSize,userList.size());
//出勤结果,进出时间
Map<String,Map<String,Object>> clockInTimeMap = Maps.newHashMap();
Map<String, List<Map<String, Object>>> 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 (Map<String, Object> map: attendaceGroupById.get(userId)){
clockInTimeMap.put(map.get("rq").toString(),map);
}
}
Map<String,Object> analysisParam = Maps.newHashMap();
analysisParam.put("generalAttendanceItems",generalAttendanceItems);
analysisParam.put("attendancePlanMap",attendancePlanMap);
analysisParam.put("attendanceItemGroupByPlan",attendanceItemGroupByPlan);
analysisParam.put("comprehensiveWorkingHourList",personComprehensiveWorkingHours.get(userId)==null? Lists.newArrayList():personComprehensiveWorkingHours.get(userId));
analysisParam.put("workingHourGroupBy",workingHourGroupBy);
analysisParam.put("allScheduleList",allScheduleList);
analysisParam.put("allClassInfoList",allClassInfoList);
analysisParam.put("allOverPlanList",allOverPlanGroup.get(userId)==null?Lists.newArrayList():allOverPlanGroup.get(userId));
analysisParam.put("evectionList",evectionGroup.get(userId)==null?Lists.newArrayList():evectionGroup.get(userId));
analysisParam.put("askforList",askforGroup.get(userId)==null?Lists.newArrayList():askforGroup.get(userId));
analysisParam.put("hxbzList",hxbzList);
analysisParam.put("seclevel",Util.null2String(userMap.get("seclevel")));
analysisParam.put("departmentId",Util.null2String(userMap.get("departmentid")));
analysisParam.put("subCompanyId",Util.null2String(userMap.get("subcompanyid1")));
for (int i=0; i<=betweenDays;i++){
String date = DateUtil.AfterDay(startDate,i);
if (leaveAndEntry.equals("1")){
if (("".equals(companystartDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(companystartDate))>0)
&& ("".equals(terminationDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(terminationDate)) <0)){
try {
attendanceAnalysisService.attendanceAnalysisForApi(userId,date,collect.get(userId),analysisParam,clockInTimeMap,attendaceResultMap);
}catch (Exception e){
log.info("***********analysis userId:{} date: {} error ***********", userId,date);
log.error("execute fail,catch error: [{}]",e);
}
}
}else {
if (("".equals(companystartDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(companystartDate))>=0)
&& ("".equals(terminationDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(terminationDate)) <=0)){
try {
attendanceAnalysisService.attendanceAnalysisForApi(userId,date,collect.get(userId),analysisParam,clockInTimeMap,attendaceResultMap);
}catch (Exception e){
log.info("***********analysis userId:{} date: {} error ***********", userId,date);
log.error("execute fail,catch error: [{}]",e);
}
}
}
}
allowanceService.addAllowanceRecords(paramMap);
}
}else {
log.info("********AttendanceanalysisAction prepare start******");
String queryDepartEmployeeSql = "select resourceid ,changedate,type_n from HRMSTATUSHISTORY where changedate is not null and resourceid in ("+userIds+")";
//获取离职日期
List<Map<String,Object>> departEmployeeList = DbTools.getSqlToList(queryDepartEmployeeSql);
Map<String,Object> departEmployeeMap = CommonUtil.getDepartEmployeeMap(departEmployeeList);
/**排班结果*/
String querySchedulesql = "select a.id as keyid,a.* from uf_pbjg a where bcrq >=? and bcrq<=? order by bcrq";
List<Map<String,Object>> allScheduleList = DbTools.getSqlToList(querySchedulesql,startBeforeDate,endAfterDate);
/**加班计划*/
String queryOverplansql = "select a.id,b.jbry,b.ksrq,b.kssj,b.jblx,b.jsrq,b.jssj,b.jbsc,b.gsrq,b.d_jxgz,b.jxsc 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";
List<Map<String,Object>> allOverPlanList = DbTools.getSqlToList(queryOverplansql,startDate,endDate);
Map<String,List<Map<String,Object>>> allOverPlanGroup = allOverPlanList.stream().collect(Collectors.groupingBy(e->e.get("jbry").toString()));
/**班次信息*/
String querClasssql = "select a.xxbdkzdjb,a.sfxx,a.id bcxx,a.edsc,a.zgzsc,a.bcsdxx,a.sfdx,a.sfkt,b.bdlx,a.btgz,a.fgsjd,a.zddxfz,a.dxhs,b.kssj dtkssj,b.jssj dtjssj,b.ksdk,b.jsdk,b.tqdkfzs,b.thdkfzs,b.edxss,b.edfzs,b.edts,b.sfdx dtsfdx,b.zddxfz dtzddxfz,b.dxhs dtdxhs,b.gsrq from uf_jcl_kq_bcxx a left join uf_jcl_kq_bcxx_dt1 b on a.id=b.mainid";
List<Map<String,Object>> allClassInfoList = DbTools.getSqlToList(querClasssql);
/**出差信息*/
String querEvectionsql = "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";
Map<String,List<Map<String,Object>>> evectionGroup = DbTools.getSqlToList(querEvectionsql,endAfterDate,startBeforeDate).stream().collect(Collectors.groupingBy(e->e.get("ccr").toString()));
/**请假信息*/
String queryAskForsql = "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";
Map<String,List<Map<String,Object>>> askforGroup = DbTools.getSqlToList(queryAskForsql,endAfterDate,startBeforeDate).stream().collect(Collectors.groupingBy(e->e.get("qjry").toString()));
/**候选班组*/
String queryHxbz = "select * from uf_jcl_kq_hxbz_dt1";
List<Map<String,Object>> hxbzList = DbTools.getSqlToList(queryHxbz);
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<Map<String,Object>> dataList = DbTools.getSqlToList(sql,startBeforeDate,endAfterDate);
String queryUserSql = "select id,companystartdate,seclevel,departmentid,subcompanyid1 from hrmresource where id in ("+userIds+")";
List<Map<String,Object>> userList = DbTools.getSqlToList(queryUserSql);
Map<String,List<Map<String,Object>>> 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<Map<String,Object>> 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<String, List<Map<String,Object>>> collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("userid"))));
sql = "select sjzt,sgsj,ygid,bc,fbid,bm,rq,j1,c1,j2,c2,j3,c3,j4,c4,j5,c5,j6,c6,j7,c7,j8,c8 from uf_jcl_kq_cqjg where rq>=? and rq<=? and ygid in ("+userIds+")";
List<Map<String,Object>> attendaceResult = DbTools.getSqlToList(sql,startBeforeDate,endAfterDate);
Map<String,List<Map<String,Object>>> attendaceGroupById = attendaceResult.stream().collect(Collectors.groupingBy(e->e.get("ygid").toString()));
log.info("********AttendanceanalysisAction prepare end******");
for (String userId : userIds.split(",")){
//入职日期
String companystartDate = Util.null2String(userGroupMap.get(userId).get(0).get("companystartdate"));
//离职日期
String terminationDate = Util.null2String(departEmployeeMap.get(userId));
if (!"".equals(terminationDate) && DateUtil.getTime(terminationDate).compareTo(DateUtil.getTime(companystartDate)) <=0){
terminationDate="";
}
//出勤结果,进出时间
Map<String,Map<String,Object>> clockInTimeMap = Maps.newHashMap();
Map<String,Object> analysisParam = Maps.newHashMap();
analysisParam.put("generalAttendanceItems",generalAttendanceItems);
analysisParam.put("attendancePlanMap",attendancePlanMap);
analysisParam.put("attendanceItemGroupByPlan",attendanceItemGroupByPlan);
analysisParam.put("comprehensiveWorkingHourList",personComprehensiveWorkingHours.get(userId)==null?Lists.newArrayList():personComprehensiveWorkingHours.get(userId));
analysisParam.put("workingHourGroupBy",workingHourGroupBy);
analysisParam.put("allScheduleList",allScheduleList);
analysisParam.put("allClassInfoList",allClassInfoList);
analysisParam.put("allOverPlanList",allOverPlanGroup.get(userId)==null?Lists.newArrayList():allOverPlanGroup.get(userId));
analysisParam.put("evectionList",evectionGroup.get(userId)==null?Lists.newArrayList():evectionGroup.get(userId));
analysisParam.put("askforList",askforGroup.get(userId)==null?Lists.newArrayList():askforGroup.get(userId));
analysisParam.put("hxbzList",hxbzList);
analysisParam.put("seclevel",userGroupMap.get(userId).get(0).get("seclevel"));
analysisParam.put("departmentId",userGroupMap.get(userId).get(0).get("departmentid"));
analysisParam.put("subCompanyId",userGroupMap.get(userId).get(0).get("subcompanyid1"));
Map<String, List<Map<String, Object>>> 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 (Map<String, Object> map: attendaceGroupById.get(userId)){
clockInTimeMap.put(map.get("rq").toString(),map);
}
}
for (int i=0; i<=betweenDays;i++){
String date = DateUtil.AfterDay(startDate,i);
if (leaveAndEntry.equals("1")){
if (("".equals(companystartDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(companystartDate))>0)
&& ("".equals(terminationDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(terminationDate)) <0)){
log.info("***********analysis userId:{},analysisDate:{} start***********", userId, date);
try {
attendanceAnalysisService.attendanceAnalysisForApi(userId,date,collect.get(userId),analysisParam,clockInTimeMap,attendaceResultMap);
}catch (Exception e){
log.info("***********analysis userId:{} date: {} error ***********", userId,date);
log.error("execute fail,catch error: [{}]",e);
if (userIds.split(",").length ==1 && startDate.equals(endDate)){
throw new AttendanceRunTimeException(e);
}
}
}
}else {
if (("".equals(companystartDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(companystartDate))>=0)
&& ("".equals(terminationDate) || DateUtil.getTime(date).compareTo(DateUtil.getTime(terminationDate)) <=0)){
log.info("***********analysis userId:{},analysisDate:{} start***********", userId, date);
try {
attendanceAnalysisService.attendanceAnalysisForApi(userId,date,collect.get(userId),analysisParam,clockInTimeMap,attendaceResultMap);
}catch (Exception e){
log.info("***********analysis userId:{} date: {} error ***********", userId,date);
log.error("execute fail,catch error: [{}]",e);
if (userIds.split(",").length ==1 && startDate.equals(endDate)){
throw new AttendanceRunTimeException(e);
}
}
}
}
}
}
paramMap.put("empIds",paramMap.get("userIds"));
allowanceService.addAllowanceRecords(paramMap);
}
log.info("********AttendanceanalysisAction end********");
resultMap.put("code","200");
}catch (Exception e){
log.error("execute fail,catch error: [{}]",e);
resultMap.put("code","500");
resultMap.put("message",e.getCause().getMessage());
}
return resultMap;
}
}

@ -544,7 +544,8 @@ public class AttendanceAnalysisWrapper extends Service {
needRecordAbnormalList = abnormalClockInListByEvction.stream().filter(e->ClassSegmentTypeEnum.WORK_TIME.getKey().equals(e.get("bdlx"))).collect(Collectors.toList());
}
recordData.addAll(needRecordAbnormalList);
//recordData.addAll(needRecordAbnormalList);
recordData.addAll(abnormalClockInListByEvction);
List<Map<String, Object>> workOverTimeItemList = (List<Map<String, Object>>)recordWorkOverTime.get("workOverTimeItemList");
if (workOverTimeItemList.size() > 0){
recordData.addAll(workOverTimeItemList);

@ -285,9 +285,9 @@ public class UpdateAttendanceResultWrapper extends Service {
}else if (!"".equals(qjsc) || (CheckBoxEnum.CHECKED.getKey().equals(btj) && (btgz.equals(HalfDayRuleREnum.HALF_TOTAL_DURATION.getKey()) || btgz.equals(HalfDayRuleREnum.HALF_RATED_DURATION.getKey())))){
if (CheckBoxEnum.CHECKED.getKey().equals(btj)){
if (btgz.equals(HalfDayRuleREnum.HALF_TOTAL_DURATION.getKey())){
qjsc = new BigDecimal(scheduleResult.get(0).get("zgzsc").toString()).divide(new BigDecimal(2),new MathContext(2, RoundingMode.HALF_UP)).toString();
qjsc = new BigDecimal(scheduleResult.get(0).get("zgzsc").toString()).divide(new BigDecimal(2),new MathContext(4, RoundingMode.HALF_UP)).toString();
}else{
qjsc = new BigDecimal(scheduleResult.get(0).get("edsc").toString()).divide(new BigDecimal(2),new MathContext(2, RoundingMode.HALF_UP)).toString();
qjsc = new BigDecimal(scheduleResult.get(0).get("edsc").toString()).divide(new BigDecimal(2),new MathContext(4, RoundingMode.HALF_UP)).toString();
}
}
qjscMinute = "".equals(qjsc)?0:Double.valueOf(Math.ceil(Double.valueOf(qjsc)*60)).intValue();

@ -73,6 +73,7 @@ public class WorkRulesServiceImpl extends Service implements WorkRulesService {
table.setSqlwhere(sqlWhere);
table.setSqlprimarykey("id");
table.getColumns().add(new WeaTableColumn("id").setDisplay(WeaBoolAttr.FALSE));
table.getColumns().add(new WeaTableColumn("20%", "班次名称", "mc"));
@ -254,7 +255,7 @@ public class WorkRulesServiceImpl extends Service implements WorkRulesService {
if (endindex > total){
endindex = total;
}
if (startindex < 0){
if (startindex < 0 || startindex >= endindex){
startindex = 0;
}
dataTable = dataTable.subList(startindex,endindex);

@ -3,8 +3,10 @@ package com.engine.jucailinkq.attendance.component.page.cmd;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.core.interceptor.CommandContext;
import com.engine.jucailinkq.attendance.enums.AccountingUnitEnum;
import com.engine.jucailinkq.common.util.DateUtil;
import com.engine.jucailinkq.common.util.DbTools;
import com.engine.jucailinkq.common.util.Utils;
import com.google.common.collect.Maps;
import weaver.general.Util;
import weaver.hrm.User;
@ -46,8 +48,9 @@ public class GetPersonPageServiceCmd extends AbstractCommonCommand<Map<String,Ob
List<Map<String, Object>> holidayDataList = DbTools.getSqlToList(sql,userId,nowDate,nowDate);
Map<String,List<Map<String, Object>>> holidayDataGroup = holidayDataList.stream().collect(Collectors.groupingBy(e->e.get("jqid").toString()));
Map<String,Map<String,Object>> holidayMap = Maps.newHashMap();
sql = "select id,mc name from uf_jcl_kq_kqxm";
Map<String,Object> itemMap = DbTools.getSqlToMapList(sql);
sql = "select id,mc,hsdw from uf_jcl_kq_kqxm";
Map<String,List<Map<String,Object>>> itemGroupId = DbTools.getSqlToList(sql).stream().collect(Collectors.groupingBy(e->e.get("id").toString()));
//Map<String,Object> itemMap = DbTools.getSqlToMapList(sql);
for (Map.Entry<String,List<Map<String, Object>>> entry:holidayDataGroup.entrySet()){
String jqid = entry.getKey();
List<Map<String, Object>> dataList = entry.getValue();
@ -66,14 +69,82 @@ public class GetPersonPageServiceCmd extends AbstractCommonCommand<Map<String,Ob
map.put("allHoliday",allHoliday);
map.put("oldHoliday",oldHoliday);
map.put("nowHoliday",nowHoliday);
map.put("holidayName",Util.null2String(itemMap.get(jqid)));
map.put("holidayName",Util.null2String(itemGroupId.get(jqid).get(0).get("mc")));
map.put("hsdw",Util.null2String(itemGroupId.get(jqid).get(0).get("hsdw")));
holidayMap.put(jqid,map);
}
resultMap.put("holiday",holidayMap);
sql = "select jqxm,zsdw,tzhwxs,zjq from uf_jcl_kq_holidayshowset where zt=1";
List<Map<String,Object>> holidayShowSet = DbTools.getSqlToList(sql);
Map<String,Map<String,Object>> newholidayMap = Maps.newHashMap();
for (Map<String,Object> holidayShow:holidayShowSet){
String jqxm = Util.null2String(holidayShow.get("jqxm"));
Map<String,Object> fatherHoliday = holidayMap.get(jqxm);
if (fatherHoliday == null){
continue;
}
String sonjqxm = Util.null2String(holidayShow.get("zjq"));
String zsdw = Util.null2String(holidayShow.get("zsdw"));
String tzhwxs = Util.null2String(holidayShow.get("tzhwxs"));
if (!"".equals(sonjqxm)){
for (String item:sonjqxm.split(",")){
Map<String,Object> sonHoliday = holidayMap.get(item);
if (sonHoliday != null){
fatherHoliday.put("allHoliday",Double.valueOf(fatherHoliday.get("allHoliday").toString())+Double.valueOf(sonHoliday.get("allHoliday").toString()));
fatherHoliday.put("oldHoliday",Double.valueOf(fatherHoliday.get("oldHoliday").toString())+Double.valueOf(sonHoliday.get("oldHoliday").toString()));
fatherHoliday.put("nowHoliday",Double.valueOf(fatherHoliday.get("nowHoliday").toString())+Double.valueOf(sonHoliday.get("nowHoliday").toString()));
}
}
}
String hsdw = Util.null2String(fatherHoliday.get("hsdw"));
double tzhwxsValue = Double.valueOf(tzhwxs);
if (zsdw.equals("0")){
//天
if (AccountingUnitEnum.HOUR.getKey().equals(hsdw) && !"".equals(tzhwxs)){
fatherHoliday.put("allHoliday", Utils.divide(Double.valueOf(fatherHoliday.get("allHoliday").toString()),tzhwxsValue));
fatherHoliday.put("oldHoliday", Utils.divide(Double.valueOf(fatherHoliday.get("oldHoliday").toString()),tzhwxsValue));
fatherHoliday.put("nowHoliday", Utils.divide(Double.valueOf(fatherHoliday.get("nowHoliday").toString()),tzhwxsValue));
}else if (AccountingUnitEnum.MINUTES.getKey().equals(hsdw)){
fatherHoliday.put("allHoliday", Utils.divide(Double.valueOf(fatherHoliday.get("allHoliday").toString()),tzhwxsValue*60));
fatherHoliday.put("oldHoliday", Utils.divide(Double.valueOf(fatherHoliday.get("oldHoliday").toString()),tzhwxsValue*60));
fatherHoliday.put("nowHoliday", Utils.divide(Double.valueOf(fatherHoliday.get("nowHoliday").toString()),tzhwxsValue*60));
}
}else if (zsdw.equals("1")){
//小时
if (AccountingUnitEnum.DAY.getKey().equals(hsdw) && !"".equals(tzhwxs)){
fatherHoliday.put("allHoliday", Double.valueOf(fatherHoliday.get("allHoliday").toString())*tzhwxsValue);
fatherHoliday.put("oldHoliday", Double.valueOf(fatherHoliday.get("oldHoliday").toString())*tzhwxsValue);
fatherHoliday.put("nowHoliday", Double.valueOf(fatherHoliday.get("nowHoliday").toString())*tzhwxsValue);
}else if (AccountingUnitEnum.MINUTES.getKey().equals(hsdw)){
fatherHoliday.put("allHoliday", Double.valueOf(fatherHoliday.get("allHoliday").toString())*60);
fatherHoliday.put("oldHoliday", Double.valueOf(fatherHoliday.get("oldHoliday").toString())*60);
fatherHoliday.put("nowHoliday", Double.valueOf(fatherHoliday.get("nowHoliday").toString())*60);
}
}
newholidayMap.put(jqxm,fatherHoliday);
}
resultMap.put("holiday",newholidayMap);
int diffdays = DateUtil.getDays(generateDate, Calendar.DAY_OF_MONTH);
String startDate = generateDate + "-01";
String endDate = generateDate + "-" + diffdays;
sql = "select id,jc,ys from uf_jcl_kq_bcxx";
List<Map<String,Object>> classList = DbTools.getSqlToList(sql);
Map<String,List<Map<String,Object>>> classGroup = classList.stream().collect(Collectors.groupingBy(e->e.get("id").toString()));
sql = "select * from uf_jcl_kq_cqjg where ygid=? and rq>=? and rq<=?";
List<Map<String,Object>> attendaceResultList = DbTools.getSqlToList(sql,userId,startDate,endDate);
for (Map<String,Object> attendaceResult:attendaceResultList){
@ -91,9 +162,14 @@ public class GetPersonPageServiceCmd extends AbstractCommonCommand<Map<String,Ob
}
Map<String,Object> attendaceResultItemName = Maps.newHashMap();
for (Map.Entry<String,Object> entry:attendaceResultItem.entrySet()){
attendaceResultItemName.put(Util.null2String(itemMap.get(entry.getKey())),entry.getValue());
attendaceResultItemName.put(Util.null2String(itemGroupId.get(entry.getKey()).get(0).get("mc")),entry.getValue());
}
attendaceResult.put("attendaceResultItemName",attendaceResultItemName);
List<Map<String,Object>> classes = classGroup.get(attendaceResult.get("bc"));
if (classes != null && classes.size() >0){
attendaceResult.put("bcname",classes.get(0).get("jc"));
attendaceResult.put("ys",classes.get(0).get("ys"));
}
}
resultMap.put("attendaceResult",attendaceResultList);

@ -0,0 +1,75 @@
package com.engine.jucailinkq.attendance.component.page.cmd;
import com.cloudstore.eccom.constant.WeaBoolAttr;
import com.cloudstore.eccom.pc.table.WeaTable;
import com.cloudstore.eccom.pc.table.WeaTableColumn;
import com.cloudstore.eccom.pc.table.WeaTableType;
import com.cloudstore.eccom.result.WeaResultMsg;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.core.interceptor.CommandContext;
import com.engine.jucailinkq.common.util.DateUtil;
import weaver.general.PageIdConst;
import weaver.general.Util;
import weaver.hrm.User;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
public class GetWorkInfoListCmd extends AbstractCommonCommand<Map<String,Object>> {
public GetWorkInfoListCmd(Map<String,Object> params, User user){
this.params=params;
this.user=user;
}
@Override
public BizLogContext getLogContext() {
return null;
}
@Override
public Map<String, Object> execute(CommandContext commandContext) {
String generateDate = Util.null2String(params.get("generateDate"));
String userId = Util.null2String(params.get("userId"));
if ("".equals(userId)){
userId = String.valueOf(user.getUID());
}
int diffdays = DateUtil.getDays(generateDate, Calendar.DAY_OF_MONTH);
String startDate = generateDate + "-01";
String endDate = generateDate + "-" + diffdays;
WeaTable table = new WeaTable();
String pageId = "4073cfcdc177469aa5cc25e7f90f36ef";
table.setPageID(pageId);
table.setPageUID(String.format("%s_%s",pageId,user.getUID()));
String pageSize = PageIdConst.getPageSize(pageId, user.getUID());
table.setPagesize(pageSize);
String fields = "t.id,t.rq,t.cqzt,t.cqsc,t.rqlx,t.sfxx ";
table.setBackfields(fields);
String fromSql = " from uf_jcl_kq_cqjg t ";
table.setSqlform(fromSql);
String sqlWhere = " where ygid="+userId +" and rq>='"+startDate +"' and rq<='"+endDate+"'";
table.setSqlwhere(sqlWhere);
table.setSqlprimarykey("id");
table.getColumns().add(new WeaTableColumn("id").setDisplay(WeaBoolAttr.FALSE));
table.getColumns().add(new WeaTableColumn("20%", "日期", "rq"));
table.getColumns().add(new WeaTableColumn("20%", "出勤状态", "cqzt","cqzt","com.engine.jucailinkq.attendance.component.page.transtmethod.Methods.attendaceState"));
table.getColumns().add(new WeaTableColumn("20%", "出勤时长", "cqsc"));
table.getColumns().add(new WeaTableColumn("20%", "日期类型", "rqlx","rqlx","com.engine.jucailinkq.attendance.component.page.transtmethod.Methods.getRqlx"));
table.getColumns().add(new WeaTableColumn("20%", "是否休息", "sfxx","sfxx","com.engine.jucailinkq.attendance.component.page.transtmethod.Methods.checkBox"));
Map<String, Object> resultMap = new HashMap<>(4);
WeaResultMsg result = new WeaResultMsg(false);
result.putAll(table.makeDataResult());
result.success();
resultMap.putAll(result.getResultMap());
return resultMap;
}
}

@ -5,4 +5,6 @@ import java.util.Map;
public interface PersonPageService {
Map<String,Object> getPersonPageService(Map<String,Object> params);
Map<String, Object> getWorkInfoList(Map<String,Object> params);
}

@ -2,7 +2,9 @@ package com.engine.jucailinkq.attendance.component.page.service.impl;
import com.engine.core.impl.Service;
import com.engine.jucailinkq.attendance.component.page.cmd.GetPersonPageServiceCmd;
import com.engine.jucailinkq.attendance.component.page.cmd.GetWorkInfoListCmd;
import com.engine.jucailinkq.attendance.component.page.service.PersonPageService;
import com.google.common.collect.Maps;
import java.util.Map;
@ -13,4 +15,9 @@ public class PersonPageServiceImpl extends Service implements PersonPageService
return commandExecutor.execute(new GetPersonPageServiceCmd(params,user));
}
@Override
public Map<String, Object> getWorkInfoList(Map<String,Object> params) {
return commandExecutor.execute(new GetWorkInfoListCmd(params,user));
}
}

@ -0,0 +1,32 @@
package com.engine.jucailinkq.attendance.component.page.transtmethod;
import com.engine.jucailinkq.attendance.enums.DateTypeEnum;
public class Methods {
public static String attendaceState(String cqzt){
String result="";
if (cqzt.equals("0")){
result="正常";
}else if (cqzt.equals("1")){
result="异常";
}
return result;
}
public static String checkBox(String check){
String result="";
if (check.equals("0")){
result="否";
}else if (check.equals("1")){
result="是";
}
return result;
}
public static String getRqlx(String rqlx){
String result= "";
if (DateTypeEnum.getEnum(rqlx) != null){
result = DateTypeEnum.getEnum(rqlx).getValue();
}
return result;
}
}

@ -7,16 +7,16 @@ import com.engine.jucailinkq.attendance.component.calendarscheduling.service.imp
import com.engine.jucailinkq.attendance.component.page.service.PersonPageService;
import com.engine.jucailinkq.attendance.component.page.service.impl.PersonPageServiceImpl;
import com.engine.jucailinkq.common.util.ApiReturnTools;
import com.engine.jucailinkq.common.util.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.util.Map;
@Slf4j
@ -44,4 +44,14 @@ public class PersonPageAction {
return ApiReturnTools.error("500","saveApplicableOrganization error");
}
}
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public String getWorkRulesList(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
Map<String,Object> paramMap = ParamUtil.request2Map(request);
return new ResponseResult<Map<String,Object>, Map<String, Object>>(user).run(getPersonPageService(user) :: getWorkInfoList,paramMap);
}
}

@ -117,9 +117,18 @@ public class PersongroupCommonUtil {
}
/**
*
* @param jjrcl
* @param gxrcl
* @param rlmc
* @param dateCondition
* @return
*/
public static int getNeedSkipDay(String jjrcl,String gxrcl,String rlmc,String dateCondition){
String sql = "select count(0) num from uf_jcl_kq_rlxx where rlmc=? and "+dateCondition;
String conditionSql = "";
int needSkipDay = 0;
if ("1".equals(jjrcl)){
//节假日为跳过
conditionSql = conditionSql + " rqlx=1";
@ -134,10 +143,11 @@ public class PersongroupCommonUtil {
}
if (!"".equals(conditionSql)){
sql = sql + " and ( "+conditionSql+")";
log.debug("getNeedSkipDay sql : {},rlmc : {}",sql,rlmc);
Map<String,Object> objectMap = DbTools.getSqlToMap(sql,rlmc);
needSkipDay = Integer.valueOf(objectMap.get("num").toString());
}
log.debug("getNeedSkipDay sql : {},rlmc : {}",sql,rlmc);
Map<String,Object> objectMap = DbTools.getSqlToMap(sql,rlmc);
int needSkipDay = Integer.valueOf(objectMap.get("num").toString());
return needSkipDay;
}

@ -27,4 +27,13 @@ public enum DateTypeEnum implements BaseEnum {
public String getValue() {
return this.value;
}
public static DateTypeEnum getEnum(String key){
for (DateTypeEnum unitEnum :DateTypeEnum.values()){
if (unitEnum.getKey().equals(key)){
return unitEnum;
}
}
return null;
}
}

@ -83,6 +83,11 @@ public class VocationCmd extends AbstractCommonCommand<Map<String,Object>> {
}
vocation.put("jzrqzdValue",jzrqzdValue);
if (qsrqValue.length() == 4){
qsrqValue = qsrqValue+"-01-01";
}else if (qsrqValue.length() == 7){
qsrqValue = qsrqValue+"-01";
}
vocation.put("qsrqValue",qsrqValue);
vocation.put("yjzdValue",yjzdValue);
vocation.put("ljcrglyfslwzValue",ljcrglyfslwzValue);

@ -273,14 +273,14 @@ public class VocationCommonUtil {
public static double handleRestDays(double value,String wscl){
double result = 0;
if (RemainderHandleEnum.ROUND_UP_FOUR.getKey().equals(wscl)){
result = new BigDecimal(value,new MathContext(4, RoundingMode.HALF_UP)).doubleValue();
result = new BigDecimal(value,new MathContext(6, RoundingMode.HALF_UP)).doubleValue();
}else if (RemainderHandleEnum.ROUND_UP_TWO.getKey().equals(wscl)){
result = new BigDecimal(value,new MathContext(2, RoundingMode.HALF_UP)).doubleValue();
result = new BigDecimal(value,new MathContext(4, RoundingMode.HALF_UP)).doubleValue();
}else if (RemainderHandleEnum.DOWN_ZERO_POINT_FIVE.getKey().equals(wscl)){
result = new BigDecimal(value,new MathContext(2, RoundingMode.HALF_UP)).doubleValue();
result = new BigDecimal(value,new MathContext(4, RoundingMode.HALF_UP)).doubleValue();
result = Math.floor(result * 2) / 2;
}else if (RemainderHandleEnum.UP_ZERO_POINT_FIVE.getKey().equals(wscl)){
result = new BigDecimal(value,new MathContext(2, RoundingMode.HALF_UP)).doubleValue();
result = new BigDecimal(value,new MathContext(4, RoundingMode.HALF_UP)).doubleValue();
result = Math.ceil(result * 2) / 2;
}else if (RemainderHandleEnum.ROUND_DOWN.getKey().equals(wscl)){
result = new BigDecimal(value).setScale(0,BigDecimal.ROUND_DOWN).doubleValue();
@ -584,7 +584,7 @@ public class VocationCommonUtil {
double oldztsc = Double.valueOf(Util.null2String(beforeHolidayBalance.get("ztsc")).equals("")?"0":Util.null2String(beforeHolidayBalance.get("ztsc")));
double oldzfsc = Double.valueOf(Util.null2String(beforeHolidayBalance.get("zfsc")).equals("")?"0":Util.null2String(beforeHolidayBalance.get("zfsc")));
//上一笔假透支归0
double oldyxsc = new BigDecimal(oldktsc).subtract(new BigDecimal(oldztsc)).subtract(new BigDecimal(oldzfsc),new MathContext(2, RoundingMode.HALF_UP)).doubleValue();
double oldyxsc = new BigDecimal(oldktsc).subtract(new BigDecimal(oldztsc)).subtract(new BigDecimal(oldzfsc),new MathContext(4, RoundingMode.HALF_UP)).doubleValue();
DbTools.update(updatesql,oldyxsc,beforeHolidayBalance.get("id"));
@ -599,7 +599,7 @@ public class VocationCommonUtil {
List<String> ids = Lists.newArrayList();
for (Map<String,Object> askforleave:askforleaveList){
BigDecimal sysc = new BigDecimal(askforleave.get("sysc").toString());
overdraftHoliday = overdraftHoliday.subtract(sysc,new MathContext(2, RoundingMode.HALF_UP));
overdraftHoliday = overdraftHoliday.subtract(sysc,new MathContext(4, RoundingMode.HALF_UP));
if (overdraftHoliday.doubleValue() >= 0){
ids.add(askforleave.get("id").toString());
}else {

@ -1,15 +1,21 @@
package com.engine.jucailinkq.attendance.workflow.action;
import com.engine.common.util.ServiceUtil;
import com.engine.jucailinkq.attendance.attendanceanalysis.wrapper.AttendaceActionWrapper;
import com.engine.jucailinkq.common.util.CommonUtil;
import com.engine.jucailinkq.common.util.DateUtil;
import com.engine.jucailinkq.common.util.Utils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import weaver.conn.RecordSet;
import weaver.general.Util;
import weaver.interfaces.workflow.action.Action;
import weaver.soa.workflow.request.RequestInfo;
import java.time.ZoneOffset;
import java.util.*;
import java.util.stream.Collectors;
/**
* action
@ -17,6 +23,8 @@ import java.util.*;
@Slf4j
public class MakeUpClockArchivingAction implements Action {
private AttendaceActionWrapper action = ServiceUtil.getService(AttendaceActionWrapper.class);
@Override
public String execute(RequestInfo requestInfo) {
log.debug("**********MakeUpClockArchivingAction import data start**********");
@ -26,7 +34,7 @@ public class MakeUpClockArchivingAction implements Action {
List<Map<String, String>> detailTableData = CommonUtil.getDetailTableInfo(requestInfo,0);
log.info("detailTableData : [{}]", detailTableData);
//补打卡人员
String userId = mainTableData.get("bdkry");
List<List> lists = Lists.newArrayList();
//记录需要更改出勤结果数据状态的人员、日期信息
@ -48,6 +56,16 @@ public class MakeUpClockArchivingAction implements Action {
requestInfo.getRequestManager().setMessagecontent("更新出勤结果中的数据状态失败:" + sjztUpdateResult);
return Action.FAILURE_AND_CONTINUE;
}
List<String> detailGroupUser = detailTableData.stream().map(e->e.get("bdkr")).collect(Collectors.toList());
List<String> detailGroupDate = detailTableData.stream().sorted(Comparator.comparing(e->DateUtil.getTime(e.get("bdkrq")).toInstant(ZoneOffset.of("+8")).toEpochMilli())).map(e->e.get("bdkrq")).collect(Collectors.toList());
Map<String,Object> paramMap = Maps.newHashMap();
paramMap.put("startDate",detailGroupDate.get(0));
paramMap.put("endDate",detailGroupDate.get(detailGroupDate.size()-1));
paramMap.put("userIds",String.join(",",detailGroupUser));
action.alysisActionWrapper(paramMap);
log.debug("**********MakeUpClockArchivingAction import data end**********");
return Action.SUCCESS;

@ -0,0 +1,69 @@
package com.engine.jucailinkq.attendance.workflow.action.common;
import com.engine.common.util.ServiceUtil;
import com.engine.jucailinkq.attendance.attendanceanalysis.wrapper.AttendaceActionWrapper;
import com.engine.jucailinkq.attendance.workflow.enums.WorkFlowTypeEnum;
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.Maps;
import lombok.extern.slf4j.Slf4j;
import weaver.interfaces.workflow.action.Action;
import weaver.soa.workflow.request.RequestInfo;
import java.time.ZoneOffset;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
*/
@Slf4j
public class ExcuteAttendanceAnysisAction implements Action {
private String userKey;
private AttendaceActionWrapper action = ServiceUtil.getService(AttendaceActionWrapper.class);
@Override
public String execute(RequestInfo requestInfo) {
log.info("userKey : [{}]",userKey);
String workflowId = requestInfo.getWorkflowid();
String sql = "select lclx from uf_jcl_kq_kqlcsz where ljid = ?";
List<Map<String,Object>> workflowSet = DbTools.getSqlToList(sql,workflowId);
List<Map<String, String>> detailTableData = null;
if (workflowSet.size() >0){
WorkFlowTypeEnum worflowType = WorkFlowTypeEnum.getEnum(workflowSet.get(0).get("lclx").toString());
detailTableData = CommonUtil.getDetailTableInfo(requestInfo,0, worflowType,requestInfo.getWorkflowid());
if (worflowType == WorkFlowTypeEnum.ASKFORLEAVE || worflowType == WorkFlowTypeEnum.BATCH_ASKFORLEAVE){
userKey = "qjr";
}else if (worflowType == WorkFlowTypeEnum.OVERTIME_PLAN){
userKey = "jbry";
}else if (worflowType == WorkFlowTypeEnum.EVECTION){
userKey = "ccr";
}
}else {
detailTableData = CommonUtil.getDetailTableInfo(requestInfo,0);
}
Map<String,List<Map<String,String>>> detailGroupUser = detailTableData.stream().collect(Collectors.groupingBy(e->e.get(userKey)));
for (Map.Entry<String,List<Map<String,String>>> entry :detailGroupUser.entrySet()){
String userId = entry.getKey();
List<Map<String,String>> dataList = entry.getValue().stream().sorted(Comparator.comparing(e-> DateUtil.getTime(e.get("ksrq")).toInstant(ZoneOffset.of("+8")).toEpochMilli())).collect(Collectors.toList());
if (dataList.size() > 0){
String startDate = dataList.get(0).get("ksrq");
String endDate = dataList.get(dataList.size()-1).get("jsrq");
Map<String,Object> paramMap = Maps.newHashMap();
paramMap.put("startDate",startDate);
paramMap.put("endDate",endDate);
paramMap.put("userIds",userId);
action.alysisActionWrapper(paramMap);
}
}
return null;
}
}

@ -37,4 +37,13 @@ public enum WorkFlowTypeEnum implements BaseEnum {
public String getValue() {
return this.value;
}
public static WorkFlowTypeEnum getEnum(String type){
for (WorkFlowTypeEnum unitEnum :WorkFlowTypeEnum.values()){
if (unitEnum.getKey().equals(type)){
return unitEnum;
}
}
return null;
}
}

@ -0,0 +1,120 @@
package com.engine.jucailinkq.common.cmd;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.core.interceptor.CommandContext;
import com.engine.jucailinkq.common.util.CommonUtil;
import com.engine.jucailinkq.common.util.DateUtil;
import com.engine.jucailinkq.common.util.DbTools;
import com.engine.jucailinkq.common.util.ExtensionClassHolder;
import com.google.common.collect.Maps;
import weaver.general.Util;
import java.util.List;
import java.util.Map;
public class CleanHaveLeaveUserDataCmd extends AbstractCommonCommand<Map<String, Object>> {
public CleanHaveLeaveUserDataCmd(Map<String, Object> params) {
this.params = params;
}
@Override
public BizLogContext getLogContext() {
return null;
}
@Override
public Map<String, Object> execute(CommandContext commandContext) {
String startDate = Util.null2String(params.get("startDate"));
String endDate = Util.null2String(params.get("endDate"));
String userIds = Util.null2String(params.get("userIds"));
Map<String, Object> resultMap = Maps.newHashMap();
CommonUtil.initExtensionClassHolder();
//入职离职当天是否需要进行考勤分析。0入职离职当天均分析、1入职离职当天不分析
String leaveAndEntry = Util.null2String(ExtensionClassHolder.getGlobalSetMap().get("leaveAndEntry"));
if (userIds.equals("")) {
String queryDepartEmployeeSql = "select resourceid ,changedate,type_n from HRMSTATUSHISTORY ";
//获取离职日期
List<Map<String, Object>> departEmployeeList = DbTools.getSqlToList(queryDepartEmployeeSql);
Map<String, Object> departEmployeeMap = CommonUtil.getDepartEmployeeMap(departEmployeeList);
String queryUserSql = "select id,companystartdate,seclevel,departmentid,subcompanyid1 from hrmresource";
List<Map<String, Object>> userList = DbTools.getSqlToList(queryUserSql);
String updateSql = "delete from uf_jcl_kq_cqjg where ygid = ? and rq >= ? and rq <= ?";
for (Map<String, Object> userMap : userList) {
String companystartdate = Util.null2String(userMap.get("companystartdate"));
String terminationDate = Util.null2String(departEmployeeMap.get(userMap.get("id")));
String user = Util.null2String(userMap.get("id"));
if (!"".equals(companystartdate) && DateUtil.getTime(companystartdate).compareTo(DateUtil.getTime(endDate)) <= 0 &&
DateUtil.getTime(companystartdate).compareTo(DateUtil.getTime(startDate)) >= 0) {
if ("1".equals(leaveAndEntry)) {
DbTools.update(updateSql, user, startDate, companystartdate);
} else {
String beforeCompanystartdateDay = DateUtil.beforeDay(companystartdate, 1);
if (DateUtil.getTime(beforeCompanystartdateDay).compareTo(DateUtil.getTime(startDate)) >= 0) {
DbTools.update(updateSql, user, startDate, beforeCompanystartdateDay);
}
}
}
if (!"".equals(terminationDate) && DateUtil.getTime(terminationDate).compareTo(DateUtil.getTime(endDate)) <= 0 &&
DateUtil.getTime(terminationDate).compareTo(DateUtil.getTime(startDate)) >= 0) {
if ("1".equals(leaveAndEntry)) {
DbTools.update(updateSql, user, terminationDate, endDate);
} else {
String AfterDay = DateUtil.AfterDay(terminationDate, 1);
if (DateUtil.getTime(AfterDay).compareTo(DateUtil.getTime(endDate)) <= 0) {
DbTools.update(updateSql, user, AfterDay, endDate);
}
}
}
}
} else {
String queryDepartEmployeeSql = "select resourceid ,changedate,type_n from HRMSTATUSHISTORY where resourceid in (" + userIds + ")";
//获取离职日期
List<Map<String, Object>> departEmployeeList = DbTools.getSqlToList(queryDepartEmployeeSql);
Map<String, Object> departEmployeeMap = CommonUtil.getDepartEmployeeMap(departEmployeeList);
String queryUserSql = "select id,companystartdate,seclevel,departmentid,subcompanyid1 from hrmresource where id in (" + userIds + ")";
List<Map<String, Object>> userList = DbTools.getSqlToList(queryUserSql);
String updateSql = "delete from uf_jcl_kq_cqjg where ygid = ? and rq >= ? and rq <= ?";
for (Map<String, Object> userMap : userList) {
String companystartdate = Util.null2String(userMap.get("companystartdate"));
String terminationDate = Util.null2String(departEmployeeMap.get(userMap.get("id")));
String user = Util.null2String(userMap.get("id"));
if (!"".equals(companystartdate) && DateUtil.getTime(companystartdate).compareTo(DateUtil.getTime(endDate)) <= 0 &&
DateUtil.getTime(companystartdate).compareTo(DateUtil.getTime(startDate)) >= 0) {
if ("1".equals(leaveAndEntry)) {
DbTools.update(updateSql, user, startDate, companystartdate);
} else {
String beforeCompanystartdateDay = DateUtil.beforeDay(companystartdate, 1);
if (DateUtil.getTime(beforeCompanystartdateDay).compareTo(DateUtil.getTime(startDate)) >= 0) {
DbTools.update(updateSql, user, startDate, beforeCompanystartdateDay);
}
}
}
if (!"".equals(terminationDate) && DateUtil.getTime(terminationDate).compareTo(DateUtil.getTime(endDate)) <= 0 &&
DateUtil.getTime(terminationDate).compareTo(DateUtil.getTime(startDate)) >= 0) {
if ("1".equals(leaveAndEntry)) {
DbTools.update(updateSql, user, terminationDate, endDate);
} else {
String AfterDay = DateUtil.AfterDay(terminationDate, 1);
if (DateUtil.getTime(AfterDay).compareTo(DateUtil.getTime(endDate)) <= 0) {
DbTools.update(updateSql, user, AfterDay, endDate);
}
}
}
}
}
resultMap.put("code", "200");
return resultMap;
}
}

@ -14,4 +14,6 @@ public interface CommonService {
Map<String,Object> getPersonBySuitOrganzation(Map<String,Object> param);
Map<String,Object> GetAllPersonBySuitOrganzationCmd(Map<String,Object> param);
Map<String,Object> CleanHaveLeaveUserDataCmd(Map<String,Object> param);
}

@ -1,5 +1,6 @@
package com.engine.jucailinkq.common.service.impl;
import com.engine.jucailinkq.common.cmd.CleanHaveLeaveUserDataCmd;
import com.engine.jucailinkq.common.cmd.GetAllPersonBySuitOrganzationCmd;
import com.engine.jucailinkq.common.cmd.GetPersonBySuitOrganzationCmd;
import com.engine.jucailinkq.common.cmd.QueryCommonCmd;
@ -51,4 +52,9 @@ public class CommonServiceImpl extends Service implements CommonService {
public Map<String, Object> GetAllPersonBySuitOrganzationCmd(Map<String, Object> param) {
return commandExecutor.execute(new GetAllPersonBySuitOrganzationCmd(param));
}
@Override
public Map<String, Object> CleanHaveLeaveUserDataCmd(Map<String, Object> param) {
return commandExecutor.execute(new CleanHaveLeaveUserDataCmd(param));
}
}

@ -35,4 +35,9 @@ public class ApiReturnTools {
returnMap.put("message",errorMessage);
return JSON.toJSONString(returnMap);
}
public static String DirectReturn(Map<String,Object> dataMap){
return gson.toJson(dataMap);
}
}

@ -124,6 +124,10 @@ public class DateUtil {
public static LocalDateTime getTime(String time){
int length = time.length();
switch (length){
case 4:
return LocalDate.parse(time+"-01-01", yyyyMMdd).atStartOfDay();
case 7:
return LocalDate.parse(time+"-01", yyyyMMdd).atStartOfDay();
case 9:
String[] times = time.split("-");

@ -238,7 +238,7 @@ public class ExcelUtil {
if(dataValidation != null) {
sheet.addValidationData(dataValidation);
}
sheet.addValidationData(dataValidation);
//sheet.addValidationData(dataValidation);
startIndex++;
}

Loading…
Cancel
Save