考勤-加班计划流程,加班计划明细数据生成接口

zm_dev
sy 11 months ago
parent fa7122f724
commit e29da354b1

@ -0,0 +1,16 @@
package com.api.jucailinkq.attendance.workflow;
import com.engine.jucailinkq.attendance.workflow.web.OvertimePlanApi;
import lombok.extern.slf4j.Slf4j;
import javax.ws.rs.Path;
/**
* @Author: sy
* @Description:
* @Date: 2024/7/19
**/
@Path("/attendance/overtimeplan")
@Slf4j
public class OvertimePlanActionApi extends OvertimePlanApi {
}

@ -16,6 +16,8 @@ public interface UtilService {
*/
Map<String, Object> getSchedulingInFormation(Map<String,Object> params);
Map<String, List<Map<String, Object>>> getScheduleInfoWithEmpId(List<String> empIdList, String startDate, String endDate);
/**
*
*

@ -21,6 +21,7 @@ import weaver.general.Util;
import java.time.ZoneOffset;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -42,6 +43,31 @@ public class UtilServiceImpl extends Service implements UtilService {
return commandExecutor.execute(new GetScheduleResultListCmd(params));
}
/**
*
* @param empIdList id
* @param startDate
* @param endDate
*/
@Override
public Map<String, List<Map<String, Object>>> getScheduleInfoWithEmpId(List<String> empIdList, String startDate, String endDate) {
Map<String, List<Map<String, Object>>> scheduleInfo = new HashMap<>();
Map<String,Object> params = new HashMap<>();
params.put("tableName", "uf_pbjg");
params.put("startDate", startDate);
params.put("endDate", endDate);
params.put("pblx", "0");
params.put("current", "1");
params.put("pageSize", "9999");
params.put("recurrence", "1");
for (String empId : empIdList) {
params.put("pbdx", empId);
Map<String,Object> schedulingResultsMap = schedulingResultsService.queryDataTableActualUse(params);
scheduleInfo.put(empId, (List<Map<String, Object>>) schedulingResultsMap.get("data"));
}
return scheduleInfo;
}
/**
*

@ -0,0 +1,8 @@
package com.engine.jucailinkq.attendance.workflow.service;
import java.util.Map;
public interface OvertimePlanService {
Map<String, Object> generateOvertimePlanDetails(Map<String, Object> params);
}

@ -0,0 +1,133 @@
package com.engine.jucailinkq.attendance.workflow.service.impl;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.jucailinkq.attendance.attendanceanalysis.service.UtilService;
import com.engine.jucailinkq.attendance.attendanceanalysis.service.impl.UtilServiceImpl;
import com.engine.jucailinkq.attendance.enums.ClassSegmentTypeEnum;
import com.engine.jucailinkq.attendance.workflow.service.OvertimePlanService;
import com.engine.jucailinkq.common.util.CommonUtil;
import com.engine.jucailinkq.common.util.DateUtil;
import com.engine.jucailinkq.common.util.DbTools;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Author: sy
* @Description:
* @Date: 2024/7/18
**/
@Slf4j
public class OvertimePlanServiceImpl extends Service implements OvertimePlanService {
private UtilService utilService = ServiceUtil.getService(UtilServiceImpl.class);
@Override
public Map<String, Object> generateOvertimePlanDetails(Map<String, Object> params) {
Map<String,Object> resultMap = new HashMap<>();
try {
// 流程表单主表数据
Map<String,String> mainTableData = (Map<String,String>)params.get("mainTableData");
log.info("mainTableData : {}", mainTableData);
//加班人员、开始日期、结束日期、开始时间、结束时间
String jbry = Util.null2String(mainTableData.get("jbry"));
String jblx = Util.null2String(mainTableData.get("jblx"));
String startDate = Util.null2String(mainTableData.get("ksrq"));
String endDate = Util.null2String(mainTableData.get("jsrq"));
String startTime = Util.null2String(mainTableData.get("kssj"));
String endTime = Util.null2String(mainTableData.get("jssj"));
//获取加班人员列表
List<String> empIdList = "".equals(jbry) ? new ArrayList<>() : Arrays.asList(jbry.split(","));
//获取加班日期集合
List<String> dateList = DateUtil.getDatesBetween(startDate, endDate);
//获取人员列表在日期区间的班次数据
Map<String, List<Map<String, Object>>> scheduleInfoMap = utilService.getScheduleInfoWithEmpId(empIdList, startDate, DateUtil.AfterDay(endDate,1));
List<Map<String, String>> overtimePlanDetailList = new ArrayList<>();
List<String> workBdlxList = new ArrayList<>();
workBdlxList.add(ClassSegmentTypeEnum.WORK_TIME.getKey());workBdlxList.add(ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey());
workBdlxList.add(ClassSegmentTypeEnum.EARLY_OVERTIME.getKey());workBdlxList.add(ClassSegmentTypeEnum.OVERTIME_IN_CLASS.getKey());
Map<String, String> detailItem;
String sql = "";
//获取加班类型信息
sql = "select id,mc from uf_jcl_kq_kqxm where id = " + jblx;
Map<String, Object> jblxData = DbTools.getSqlToMap(sql);
String jblxName = Util.null2String(jblxData.get("mc"));
Map<String, String> empIdToNameInfo = CommonUtil.empIdToNameInfo(empIdList);
List<Map<String, Object>> bcDetailData;
for (String empId : empIdList) {
List<Map<String, Object>> scheduleInfoList = scheduleInfoMap.get(empId);
Map<String, String> dateToBcxxMap = scheduleInfoList == null ? new HashMap<>() : scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")), e->Util.null2String(e.get("bcxx"))));
for (String date : dateList) {
String realEndDate = date;
detailItem = new HashMap<>();
detailItem.put("jbry", empId);
detailItem.put("jbryName", Util.null2String(empIdToNameInfo.get(empId)));
detailItem.put("jblx", jblx);
detailItem.put("jblxName", jblxName);
detailItem.put("ksrq", date);
detailItem.put("kssj", startTime);
detailItem.put("jssj", endTime);
//开始时时和结束时间存在跨天情况时,即开始时间大于等于结束时间
if (startTime.compareTo(endTime) >= 0) {
realEndDate = DateUtil.AfterDay(date,1);
}
detailItem.put("jsrq", realEndDate);
//加班时长
int overtimeMinutes = DateUtil.getBetWeenMinutes(date + " " + startTime, realEndDate + " " + endTime);
detailItem.put("jbsc", String.format("%.2f", overtimeMinutes / 60.0));
//根据班次数据,设置归属日期
//获取当天班次id
String currentDayBcId = Util.null2String(dateToBcxxMap.get(date)).split("-")[0];
//当天比较最晚工作时段/加班时段的结束时间点和加班计划明细的开始时间点的差值
Integer currentDayDiffMinutes = 9999;
if (!"".equals(currentDayBcId)) {
//查询当天班次明细
sql = "select id, bdlx, gsrq, kssj, jssj from uf_jcl_kq_bcxx_dt1 where mainid = " + currentDayBcId + " order by gsrq desc, kssj desc";
bcDetailData = DbTools.getSqlToList(sql);
bcDetailData = bcDetailData.stream().filter(e -> workBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList());
if (bcDetailData.size() > 0) {
String gsrqValue = Util.null2String(bcDetailData.get(0).get("gsrq"));
String jssj = Util.null2String(bcDetailData.get(0).get("jssj"));
String matchDate = "2".equals(gsrqValue) ? DateUtil.AfterDay(date,1) : ("0".equals(gsrqValue) ? DateUtil.beforeDay(date,1) : date);
currentDayDiffMinutes = (matchDate + jssj).compareTo(date + startTime) > 0 ? DateUtil.getBetWeenMinutes(date + " " + startTime, matchDate + " " + jssj) : DateUtil.getBetWeenMinutes(matchDate + " " + jssj, date + " " + startTime);
}
}
//获取次日班次id
String nextDay = DateUtil.AfterDay(date,1);
String nextDayBcId = Util.null2String(dateToBcxxMap.get(nextDay)).split("-")[0];
//次日比较最早工作时段/加班时段的开始时间点和加班计划明细的结束时间点的差值
Integer nextDayDiffMinutes = 9999;
if (!"".equals(nextDayBcId)) {
//查次日班次明细
sql = "select id, bdlx, gsrq, kssj, jssj from uf_jcl_kq_bcxx_dt1 where mainid = " + nextDayBcId + " order by gsrq, kssj";
bcDetailData = DbTools.getSqlToList(sql);
bcDetailData = bcDetailData.stream().filter(e -> workBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList());
if (bcDetailData.size() > 0) {
String gsrqValue = Util.null2String(bcDetailData.get(0).get("gsrq"));
String kssj = Util.null2String(bcDetailData.get(0).get("kssj"));
String matchDate = "2".equals(gsrqValue) ? DateUtil.AfterDay(nextDay,1) : ("0".equals(gsrqValue) ? DateUtil.beforeDay(nextDay,1) : nextDay);
nextDayDiffMinutes = (matchDate + kssj).compareTo(realEndDate + endTime) > 0 ? DateUtil.getBetWeenMinutes(realEndDate + " " + endTime, matchDate + " " + kssj) : DateUtil.getBetWeenMinutes(matchDate + " " + kssj, realEndDate + " " + endTime);
}
}
if (currentDayDiffMinutes <= nextDayDiffMinutes) {
detailItem.put("gsrq", date);
} else {
detailItem.put("gsrq", nextDay);
}
overtimePlanDetailList.add(detailItem);
}
}
resultMap.put("status", true);
resultMap.put("data", overtimePlanDetailList);
} catch (Exception e) {
log.info(e.getMessage());
resultMap.put("status", false);
resultMap.put("errorInfo", e.getMessage());
resultMap.put("data", null);
}
return resultMap;
}
}

@ -0,0 +1,58 @@
package com.engine.jucailinkq.attendance.workflow.web;
import com.engine.common.util.ParamUtil;
import com.engine.common.util.ServiceUtil;
import com.engine.jucailinkq.attendance.workflow.service.OvertimePlanService;
import com.engine.jucailinkq.attendance.workflow.service.impl.OvertimePlanServiceImpl;
import com.engine.jucailinkq.common.util.ApiReturnTools;
import com.engine.jucailinkq.common.util.ResponseResult;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import java.lang.reflect.Type;
import java.util.Map;
/**
* @Author: sy
* @Description:
* @Date: 2024/7/18
**/
@Slf4j
public class OvertimePlanApi {
private OvertimePlanService getOvertimePlanService(User user) {
return ServiceUtil.getService(OvertimePlanServiceImpl.class,user);
}
/**
* -
* @return
*/
@GET
@Path("/generateOvertimePlanDetails")
@Produces({"text/plain"})
public String generateOvertimePlanDetails(@Context HttpServletRequest request, @Context HttpServletResponse response) {
try {
Map<String,Object> param = ParamUtil.request2Map(request);
User user = HrmUserVarify.getUser(request, response);
String mainTableDataStr = Util.null2String(param.get("mainTableData"));
Gson gson = new Gson();
Map<String,Object> mainTableData = gson.fromJson(mainTableDataStr, (Type) Map.class);
param.put("mainTableData",mainTableData);
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getOvertimePlanService(user) :: generateOvertimePlanDetails,param);
}catch (Exception e){
log.error("generateOvertimePlanDetails status fail,catch error: [{}]",e);
return ApiReturnTools.error("200","查询失败");
}
}
}

@ -689,9 +689,12 @@ public class CommonUtil {
* id
* @return
*/
public static Map<String, String> empIdToNameInfo() {
public static Map<String, String> empIdToNameInfo(List<String> empIds) {
Map<String, String> resultMap = new HashMap<>();
String sql = "select id,lastname from hrmresource";
if (empIds != null && empIds.size() > 0) {
sql = sql + " where id in (" + String.join(",", empIds) + ")";
}
List<Map<String,Object>> list = DbTools.getSqlToList(sql);
for (Map<String, Object> map : list) {
resultMap.put(map.get("id").toString(), Util.null2String(map.get("lastname")));

Loading…
Cancel
Save