请假拆分

zm_dev
liuliang 10 months ago
parent 215e22fa6c
commit 138fc5c71b

@ -1 +1 @@
аyГ~цЭ|дй~Й~хд|И}фЛ~ш}Т~М|юй~с}С}юЯ}У}Ь~к~Х}Н~г}ЭЖ|б}О}ЪрqчhаjЖkЛjВhТjгiлjфkзiУhЭlЩkуoжpжxЯuЭtЧvВvтwЛvа{иxяyТxЙvЮxЦvБyиxрzпwЧvзxаЫЧшСжМЧСъмЖСЪзнНШзЭдДоЩЪДвкдЩРыщчАяПЬэяЮчцПГЗУЪлощбЭхдЪтзЖТНБУщПсЩлэррЦькмИпЙПРжпАлиШФмюмШдшжиИЖъВнлОЙНиwбsСsЪvцsЕwаtПsщyАlГtДoфsшqлlЬqЦpЗrКlыsЖsвuрsХmхoьqЛrщlйjНZК\т^Й\ФZоVфZХXШ\РVИhбwчxкzБyп{Шzб|ш{оxОxЙ|фzд|яwи{ЗvБyК|ЦVеZюUаYфSТYхXе\цXэaцcвeщ_ЮWхWц^бTмRюTЫTПZсWж[ъTЕ]ы[ЪWТRДWгVоZГZЧUЮYСQсXЮWБYЦ[кZшgО~В~ыzю~л{РzвyК{Бxи~ц|М{ъ~тж|Ф}к~н}ычaчdВ]вhп]вaь^ГaК`гaй^ж_Ш]С]И]в^Т^в^и]Т]Х`ЯkКgшgюgЩgюhШcТ]жWЬkшiцqжhЧoяLбLшLюMБMГMКMКMНMсNХMКMНMГMХMЙMНMФMХMЯKДKЕKЙKюKаJцJЪJЕKЦKБKоLшKФKГKГKЕKИKЕKЕKИJюJФJсKЕKИKФKЕKФKДKГKГKпLДKЕKшKжJаJХJДKЕKХKЦKоLЦKДKЦKИKГKФKЕKюKдJЧIсKБKЦKХKГKЕKДKГKЕKГKрLФKГKКJЪIсJтKЕKФKГKДKоLФKФKФKДKЙKДKвKшJюJФJЧKДKДKДKДK
аyГ~цЭ|дй~Й~хд|И}фЛ~ш}Т~М|юй~с}С}юЯ}У}Ь~к~Х}Н~г}ЭЖ|б}О}ЪрqчhаjЖkЛjВhТjгiлjфkзiУhЭlЩkуoжpжxЯuЭtЧvВvтwЛvа{иxяyТxЙvЮxЦvБyиxрzпwЧvзxаЫЧшСжМЧСъмЖСЪзнНШзЭдДоЩЪДвкдЩРыщчАяПЬэяЮчцПГЗУЪлощбЭхдЪтзЖТНБУщПсЩлэррЦькмИпЙПРжпАлиШФмюмШдшжиИЖъВнлОЙНиwбsСsЪvцsЕwаtПsщyАlГtДoфsшqлlЬqЦpЗrКlыsЖsвuрsХmхoьqЛrщlйjНZК\т^Й\ФZоVфZХXШ\РVИhбwчxкzБyп{Шzб|ш{оxОxЙ|фzд|яwи{ЗvБyК|ЦVеZюUаYфSТYхXе\цXэaцcвeщ_ЮWхWц^бTмRюTЫTПZсWж[ъTЕ]ы[ЪWТRДWгVоZГZЧUЮYСQсXЮWБYЦ[кZшgО~В~ыzю~л{РzвyК{Бxи~ц|М{ъ~тж|Ф}к~н}ычaчdВ]вhп]вaь^ГaК`гaй^ж_Ш]С]И]в^Т^в^и]Т]Х`ЯkКgшgюgЩgюhШcТ]жWЬkшiцqжh

@ -10,11 +10,20 @@
</component>
<component name="ChangeListManager">
<list default="true" id="baeb3dfb-5097-46c5-933e-6d1dab18b815" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat.values" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat.values" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat.values.s" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat.values.s" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/log/sdk.log" beforeDir="false" afterPath="$PROJECT_DIR$/log/sdk.log" afterDir="false" />
<change beforePath="$PROJECT_DIR$/out/artifacts/hrm_attendance/hrm-attendance.jar" beforeDir="false" afterPath="$PROJECT_DIR$/out/artifacts/hrm_attendance/hrm-attendance.jar" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/web/AttendanceanalysisAction.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/web/AttendanceanalysisAction.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/web/AttendanceanalysisAction.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/web/AttendanceanalysisAction.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/common/util/CommonUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/common/util/CommonUtil.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/common/util/Utils.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/common/util/Utils.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper$1.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper$1.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/workflow/action/askforleave/AskForLeaveWorkFlowSubmitAction.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/workflow/action/askforleave/AskForLeaveWorkFlowSubmitAction.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/common/util/CommonUtil.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/common/util/CommonUtil.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/test-classes/TestObj.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/test-classes/TestObj.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/test/TestObj.java" beforeDir="false" afterPath="$PROJECT_DIR$/test/TestObj.java" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -91,7 +100,7 @@
<command value="organzationList" />
</option>
</component>
<component name="RunManager" selected="JUnit.Test.testAnalysis">
<component name="RunManager" selected="Application.TestObj">
<configuration name="TestMethod" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="TestMethod" />
<module name="hrm-attendance" />
@ -682,6 +691,10 @@
<workItem from="1719239131303" duration="1452000" />
<workItem from="1719278990512" duration="4844000" />
<workItem from="1719293856593" duration="17577000" />
<workItem from="1719365300280" duration="7628000" />
<workItem from="1719380573621" duration="14583000" />
<workItem from="1719405220886" duration="597000" />
<workItem from="1719452066813" duration="1908000" />
</task>
<servers />
</component>

@ -42,11 +42,11 @@ public class AttendanceanalysisAction {
@Produces({"text/plain"})
public String getSchedulingData(@Context HttpServletRequest request, @Context HttpServletResponse response) {
try {
//Map<String,Object> paramMap = ParamUtil.request2Map(request);
Map<String,Object> paramMap = Maps.newHashMap();
paramMap.put("startDate","2024-06-13");
paramMap.put("endDate","2024-06-13");
paramMap.put("userIds","81");
Map<String,Object> paramMap = ParamUtil.request2Map(request);
// Map<String,Object> paramMap = Maps.newHashMap();
// paramMap.put("startDate","2024-06-13");
// paramMap.put("endDate","2024-06-13");
// paramMap.put("userIds","81");
String startDate = Util.null2String(paramMap.get("startDate"));
String startBeforeDate = DateUtil.beforeDay(startDate,2);

@ -15,6 +15,7 @@ import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -198,8 +199,6 @@ public class UpdateAttendanceResultWrapper extends Service {
for (int i=0;i<askForLeaveList.size();i++){
Map<String, Object> resultMap = Maps.newHashMap();
resultList.add(resultMap);
resultMap.put("item",askForLeaveList.get(i).get("jqlx"));
String kssj = askForLeaveList.get(i).get("ksrq") + " "+askForLeaveList.get(i).get("kssj");
String jssj = askForLeaveList.get(i).get("jsrq")+ " "+askForLeaveList.get(i).get("jssj");
//半天请假
@ -221,6 +220,11 @@ public class UpdateAttendanceResultWrapper extends Service {
//是否分组呈现
String sffzcx = Util.null2String(askForLeaveItem.get("sffzcx"));
if (!sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
resultMap.put("item",askForLeaveList.get(i).get("jqlx"));
resultList.add(resultMap);
}
Map<String,Object> param = Maps.newHashMap();
param.put("abnormalClockInList",abnormalClockInList);
param.put("zysd",zysd);
@ -237,13 +241,57 @@ public class UpdateAttendanceResultWrapper extends Service {
//时长请假
itemduration = Utils.getItemduration(hsl,hsdw,Double.valueOf(Double.valueOf(qjsc)*60).intValue(),AccountingUnitEnum.MINUTES);
resultMap.put("itemduration",itemduration);
if (!sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
resultMap.put("itemduration",itemduration);
}
param.put("qjsc",qjsc);
param.put("tybcndbjlhbjs",tybcndbjlhbjs);
if (abnormalClockInList.size()>0){
Map<String,Object> map1 = askForLeaveService.askForLeaveByDurationTime(param);
abnormalClockInList =(List<Map<String,Object>>)map1.get("abnormalClockInList");
offsetAskForLeaveAnomaly.addAll((List<Map<String,Object>>)map1.get("offsetAskForLeaveAnomaly"));
List<Map<String,Object>> offsetAskForLeaveAnomalyList = (List<Map<String,Object>>)map1.get("offsetAskForLeaveAnomaly");
offsetAskForLeaveAnomaly.addAll(offsetAskForLeaveAnomalyList);
//按时长请假,将标记请假作用的时段上的异常 按标准逻辑进行冲销如果冲销后还有多余时长如请假时长为1.5小时但员工当天有两个时段上各有不到30分钟的异常此时每个时段0.5小时需要冲销多出来的0.5小时放哪里,放到异常多的那个时段上
//有几个抵消异常计入几个请假考勤项目
if (sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
int total = offsetAskForLeaveAnomalyList.stream().mapToInt(e->Integer.valueOf(e.get("betweenMinutes").toString())).sum();
int more = 0;
if (total < Integer.valueOf(qjsc)*60){
more = Integer.valueOf(qjsc)*60-total;
}
List<Map<String,Object>> sortOffsetAskForLeaveAnomalyList = offsetAskForLeaveAnomalyList.stream().sorted(Comparator.comparing(e->Integer.valueOf(e.get("betweenMinutes").toString()))).collect(Collectors.toList());
for (int j=0;j<sortOffsetAskForLeaveAnomalyList.size();j++){
//异常班段类型
String bdlx = sortOffsetAskForLeaveAnomalyList.get(i).get("bdlx").toString();
//异常时间
int time = Integer.valueOf(abnormalClockInList.get(i).get("betweenMinutes").toString());
if (j == 0){
time = time+more;
}
Map<String,Object> item = CommonUtil.assembleAskForOrEvectionItem(askForLeaveItem,bdlx);
if (item != null){
itemduration = Utils.getItemduration(Double.valueOf(Util.null2String(item.get("hsl"))),Util.null2String(item.get("hsdw")),time,AccountingUnitEnum.MINUTES);
Map<String, Object> itemMap = Maps.newHashMap();
itemMap.put("itemduration",itemduration);
itemMap.put("item",itemMap.get("keyid"));
resultList.add(itemMap);
}
}
}
}else {
if (sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
Map<String,Object> item = CommonUtil.assembleAskForOrEvectionItem(askForLeaveItem,ClassSegmentTypeEnum.WORK_TIME.getKey());
if (item != null){
Map<String, Object> itemMap = Maps.newHashMap();
itemduration = Utils.getItemduration(Double.valueOf(Util.null2String(item.get("hsl"))),Util.null2String(item.get("hsdw")),Double.valueOf(Double.valueOf(qjsc)*60).intValue(),AccountingUnitEnum.MINUTES);
itemMap.put("itemduration",itemduration);
itemMap.put("item",itemMap.get("keyid"));
resultList.add(itemMap);
}
}
}
}
}else {
@ -252,9 +300,11 @@ public class UpdateAttendanceResultWrapper extends Service {
if (CheckBoxEnum.CHECKED.getKey().equals(zdycbcndfgzsd)){
timeMinutes = Utils.removeRestTime(kssj,jssj,scheduleResult,analysisDate);
}
if (timeMinutes > Integer.valueOf(qjsc)*60){
timeMinutes = Integer.valueOf(qjsc)*60;
}
log.debug("recordAskForLeave timeMinutes [{}] ,hsl:{},hsdw",timeMinutes,hsl,hsdw);
itemduration = Utils.getItemduration(hsl,hsdw,timeMinutes,AccountingUnitEnum.MINUTES);
resultMap.put("itemduration",itemduration);
param.put("kssj",kssj);
param.put("jssj",jssj);
if (abnormalClockInList.size()>0){
@ -262,6 +312,23 @@ public class UpdateAttendanceResultWrapper extends Service {
abnormalClockInList = (List<Map<String,Object>>)map1.get("abnormalClockInList");
offsetAskForLeaveAnomaly.addAll((List<Map<String,Object>>)map1.get("offsetAskForLeaveAnomaly"));
}
if (sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
//按时间区间请假时 将连接的同一类型时段设置一种假别 计算出分钟时长后按核算量算出核算时长及单位即可
Map<String,Object> proportionMap = Utils.getAskLeaveAndEvctionProportion(kssj,jssj,scheduleResult,analysisDate);
for (Map.Entry<String,Object> entry: proportionMap.entrySet()){
String bdlx = entry.getKey();
int betweenTimes = Integer.valueOf(entry.getValue().toString());
Map<String,Object> item = CommonUtil.assembleAskForOrEvectionItem(askForLeaveItem,bdlx);
if (item != null){
Map<String, Object> itemMap = Maps.newHashMap();
itemMap.put("itemduration",Utils.getItemduration(Double.valueOf(Util.null2String(item.get("hsl"))),Util.null2String(item.get("hsdw")),betweenTimes,AccountingUnitEnum.MINUTES));
itemMap.put("item",itemMap.get("keyid"));
resultList.add(itemMap);
}
}
}else {
resultMap.put("itemduration",itemduration);
}
}
}
map.put("resultList",resultList);
@ -524,4 +591,5 @@ public class UpdateAttendanceResultWrapper extends Service {
utilService.recordItem(recordParam);
}
}

@ -775,4 +775,23 @@ public class CommonUtil {
}
/**
*
* @param itemMap
* @param bdlx
* @return
*/
public static Map<String,Object> assembleAskForOrEvectionItem(Map<String,Object> itemMap,String bdlx){
List<Map<String,Object>> sonItems = (List<Map<String,Object>>)itemMap.get("sonItems");
String workfor = Utils.getWorkFor(bdlx);
for (Map<String,Object> sonItem:sonItems){
String zysd = Util.null2String(sonItem.get("zysd"));
if (zysd.equals(workfor)){
return sonItem;
}
}
return null;
}
}

@ -421,6 +421,52 @@ public class Utils<T> {
return betweenMinutes;
}
/**
*
* @param kssj
* @param jssj
* @param scheduleResult
* @param analysisDate
* @return
*/
public static Map<String,Object> getAskLeaveAndEvctionProportion(String kssj,String jssj,List<Map<String, Object>> scheduleResult,String analysisDate){
Map<String,Object> resultMap = Maps.newHashMap();
for (Map<String, Object> restSchedule :scheduleResult){
String dtkssj = Utils.getkssjTime(restSchedule,analysisDate);
String dtjssj = Utils.getjssjTime(restSchedule,analysisDate);
int betweenMinutes = 0;
if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtkssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtjssj)) >=0){
//休息时间在请假时间中间
betweenMinutes = DateUtil.getBetWeenMinutes(dtkssj,dtjssj);
log.debug("休息时间在请假时间中间");
}else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtkssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtjssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtkssj)) >=0){
//休息时间在请假时间 右边
betweenMinutes = DateUtil.getBetWeenMinutes(dtkssj,jssj);
log.debug("休息时间在请假时间 右边");
}else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtkssj)) >=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtjssj)) >=0 && DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtjssj)) <=0){
//休息时间在请假时间 左边
betweenMinutes = DateUtil.getBetWeenMinutes(kssj,dtjssj);
log.debug("休息时间在请假时间 左边");
}else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtkssj)) >=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtjssj)) <=0){
//请假时间在休息时间中间
betweenMinutes = 0;
log.debug("请假时间在休息时间中间");
}
if (betweenMinutes > 0){
if (resultMap.get(restSchedule.get("bdlx")) == null){
resultMap.put(restSchedule.get("bdlx").toString(),betweenMinutes);
}else {
betweenMinutes = betweenMinutes + Integer.valueOf(resultMap.get(restSchedule.get("bdlx")).toString());
resultMap.put(restSchedule.get("bdlx").toString(),betweenMinutes);
}
}
}
return resultMap;
}
/**
*
* @param kssj
@ -835,4 +881,6 @@ public class Utils<T> {
public static double convertDouble(Object num){
return Util.null2String(num).equals("")?0:Double.valueOf(Util.null2String(num));
}
}

Binary file not shown.

@ -28,12 +28,21 @@ import java.util.stream.Collectors;
public class TestObj {
public static void main(String[] args) throws Exception{
List<String> list = Lists.newArrayList();
list.add("1");
list.add("2");
list.add("3");
list= list.subList(0,2);
System.out.println(list);
List<Map<String,Object>> list = Lists.newArrayList();
Map<String,Object> map1 = Maps.newHashMap();
Map<String,Object> map2 = Maps.newHashMap();
Map<String,Object> map3 = Maps.newHashMap();
map1.put("betweenMinutes","1");
map2.put("betweenMinutes","10");
map3.put("betweenMinutes","5");
list.add(map1);
list.add(map2);
list.add(map3);
List<Map<String,Object>> sortOffsetAskForLeaveAnomalyList = list.stream().sorted(Comparator.comparing(e->Integer.valueOf(e.get("betweenMinutes").toString()))).collect(Collectors.toList());
System.out.println(sortOffsetAskForLeaveAnomalyList);
int total = sortOffsetAskForLeaveAnomalyList.stream().mapToInt(e->Integer.valueOf(e.get("betweenMinutes").toString())).sum();
System.out.println(total);
}

Loading…
Cancel
Save