@ -1,17 +1,25 @@
package com.engine.kq.cmd.shiftschedule ;
import com.alibaba.fastjson.JSON ;
import com.alibaba.fastjson.JSONArray ;
import com.alibaba.fastjson.JSONObject ;
import com.engine.common.biz.AbstractCommonCommand ;
import com.engine.common.biz.SimpleBizLogger ;
import com.engine.common.constant.BizLogSmallType4Hrm ;
import com.engine.common.constant.BizLogType ;
import com.engine.common.entity.BizLogContext ;
import com.engine.core.interceptor.CommandContext ;
import com.engine.kq.bean.KqShiftscheduleOperateLog ;
import com.engine.kq.biz.* ;
import com.engine.kq.cmd.shiftmanagement.toolkit.ShiftManagementToolKit ;
import com.engine.kq.util.UtilKQ ;
import com.ibm.db2.jcc.uw.bb ;
import org.apache.commons.lang3.StringUtils ;
import weaver.common.DateUtil ;
import weaver.conn.BatchRecordSet ;
import weaver.conn.DBUtil ;
import weaver.conn.RecordSet ;
import weaver.general.BaseBean ;
import weaver.general.TimeUtil ;
import weaver.general.Util ;
import weaver.hrm.HrmUserVarify ;
import weaver.hrm.User ;
@ -23,15 +31,30 @@ import java.util.*;
public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand < Map < String , Object > > {
private SimpleBizLogger logger ;
// 添加日志功能
private List < List < Object > > operateLogParams = new ArrayList < > ( ) ;
// 操作类型 操作人 考勤组名称+id 被修改人 被修改班次日期 被修改班次+id 排班设置行id
private List < Object > operateLogParam = null ;
public SaveBatchShiftScheduleCmd ( Map < String , Object > params , User user ) {
this . user = user ;
this . params = params ;
this . logger = new SimpleBizLogger ( ) ;
String data = Util . null2String ( params . get ( "data" ) ) ;
JSONObject jsonObj = JSON . parseObject ( data ) ;
String groupId = Util . null2String ( jsonObj . get ( "groupId" ) ) ; //考勤组id
BizLogContext bizLogContext = new BizLogContext ( ) ;
bizLogContext . setLogType ( BizLogType . HRM_ENGINE ) ; //模块类型
bizLogContext . setBelongType ( BizLogSmallType4Hrm . HRM_ENGINE_Schedule_Set ) ; //所属大类型
bizLogContext . setLogSmallType ( BizLogSmallType4Hrm . HRM_ENGINE_Schedule_Set ) ; //当前小类型
bizLogContext . setParams ( params ) ; //当前request请求参数
logger . setUser ( user ) ; //当前操作人
String mainSql = "select * from kq_group where id = " + groupId + " and (isdelete is null or isdelete <> '1') " ;
logger . setMainSql ( mainSql , "id" ) ; //主表sql
logger . setMainPrimarykey ( "id" ) ; //主日志表唯一key
logger . setMainTargetNameColumn ( "groupname" ) ;
SimpleBizLogger . SubLogInfo subLogInfo1 = logger . getNewSubLogInfo ( ) ;
String subSql1 = "select * from kq_shiftschedule where groupid = " + groupId + " and (isdelete is null or isdelete <> '1') " ;
subLogInfo1 . setSubSql ( subSql1 , "id" ) ;
logger . addSubLogInfo ( subLogInfo1 ) ;
logger . before ( bizLogContext ) ;
}
@Override
@ -67,6 +90,12 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
String serialId = Util . null2String ( jsonObj . get ( "serialId" ) ) ; //班次
String shiftcycleId = Util . null2String ( jsonObj . get ( "shiftcycleId" ) ) ; //排班周期Id
String meetworkDays = Util . null2String ( jsonObj . get ( "meetworkDays" ) ) ; //遇调配工作日
String serialIdSx = Util . null2String ( jsonObj . get ( "serialIdSx" ) ) ; //双休班次
String serialIdJjr = Util . null2String ( jsonObj . get ( "serialIdJjr" ) ) ; //节假日班次
String serialIdXxr = Util . null2String ( jsonObj . get ( "serialIdXxr" ) ) ; //调配休息日班次
String serialIdGzr = Util . null2String ( jsonObj . get ( "serialIdGzr" ) ) ; //调配工作日班次
// 某个管理员所拥有的维护人员的权限
List < String > managerRoleUserIdList = new KqShiftScheduleRoleBiz ( ) . getUfKqShiftScheduleRoleValue ( "" + user . getUID ( ) , groupId ) ;
KqMembersValidateBiz kqMembersValidateBiz = new KqMembersValidateBiz ( ) ;
@ -108,26 +137,24 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
excludeidList = Util . splitString2List ( excludeid , "," ) ;
}
}
String oriDate = "" ;
Map < String , Object > mapShiftSchedule = new HashMap < > ( ) ;
sql = " select id, resourceid, kqdate, serialid from kq_shiftschedule where (isdelete is null or isdelete <> '1') and groupid=? " ;
Map < String , Object > mapShiftScheduleOri = new HashMap < > ( ) ;
sql = " select id, resourceid, kqdate from kq_shiftschedule where (isdelete is null or isdelete <> '1') and groupid=? " ;
//有客户提下面的sql有性能问题, 在表数据较多, 并且该表数据改动较为频率不适合建索引, 所以对mapShiftSchedule先缓存的数据范围过滤下, 没必要全表缓存
if ( "1" . equals ( shiftScheduleType ) ) { //按天排班
sql + = " and kqdate='" + shiftScheduleDate + "' " ;
oriDate = shiftScheduleDate ;
} else if ( "2" . equals ( shiftScheduleType ) ) {
sql + = " and kqdate>='" + shiftScheduleBeginDate + "' and kqdate<='" + shiftScheduleEndDate + "' " ;
oriDate = shiftScheduleBeginDate ;
}
rs . executeQuery ( sql , groupId ) ;
while ( rs . next ( ) ) {
mapShiftSchedule . put ( rs . getString ( "kqdate" ) + "|" + Util. null2String ( rs. getString ( "resourceid" ) ) , Util . null2String ( rs . getString ( "id" ) ) + "#" + Util . null2String ( rs . getString ( "serialid" ) ) ) ;
mapShiftSchedule . put ( rs . getString ( "kqdate" ) + "|" + rs. getString ( "resourceid" ) ,rs . getString ( "id" ) ) ;
}
String id = "" ;
String oldSerialid = "" ;
boolean needChange = false ;
KQShiftManagementComInfo kqShiftScheduleComInfo = new KQShiftManagementComInfo ( ) ;
ResourceComInfo rci = new ResourceComInfo ( ) ;
KqShiftscheduleOperateLog bean = null ;
if ( shiftScheduleType . equals ( "1" ) ) { //按天排班
if ( SaveShiftScheduleCmd . isDate ( shiftScheduleDate ) ) {
for ( String resourceid : lsGroupMembers ) {
// 排除无需考勤人员
if ( excludeidList ! = null & & excludeidList . contains ( resourceid ) ) {
@ -138,62 +165,38 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
continue ;
}
}
String shiftScheduleValue = Util . null2String ( mapShiftSchedule . get ( shiftScheduleDate + "|" + resourceid ) ) ;
if ( ! "" . equals ( shiftScheduleValue ) ) {
id = shiftScheduleValue . split ( "#" ) [ 0 ] ;
oldSerialid = shiftScheduleValue . split ( "#" ) [ 1 ] ;
}
id = Util . null2String ( mapShiftSchedule . get ( shiftScheduleDate + "|" + resourceid ) ) ;
// 如果超过了有效期,就不存储数据
List < String > validateList = validateResult . get ( resourceid ) ;
boolean isInRange = kqMembersValidateBiz . isInRange ( shiftScheduleDate , validateList ) ;
if ( ! isInRange & & oldSerialid . length ( ) > 0 ) {
if ( delIds . length ( ) > 0 ) {
delIds + = "," ;
}
if ( ! isInRange ) {
if ( delIds . length ( ) > 0 ) delIds + = "," ;
delIds + = id ;
bean = new KqShiftscheduleOperateLog ( 2 , user . getLastname ( ) , kqGroupComInfo . getGroupname ( groupId ) + "(id:" + groupId + ")" , rci . getLastname ( resourceid ) ,
shiftScheduleDate , ( "-1" . equals ( oldSerialid ) ? SystemEnv . getHtmlLabelName ( 26593 , user . getLanguage ( ) ) : kqShiftScheduleComInfo . getSerial ( oldSerialid ) + "(id:" + oldSerialid + ")" ) , id , "" , user . getLanguage ( ) ) ;
addLog ( bean ) ;
continue ;
}
//if(weaver.common.DateUtil.timeInterval(shiftScheduleDate,today)>0)continue;//今天之前的无需处理
if ( id . length ( ) > 0 ) {
if ( serialId . length ( ) = = 0 & & oldSerialid . length ( ) > 0 ) {
if ( delIds . length ( ) > 0 ) {
delIds + = "," ;
}
if ( serialId . length ( ) = = 0 ) {
if ( delIds . length ( ) > 0 ) delIds + = "," ;
delIds + = id ;
bean = new KqShiftscheduleOperateLog ( 2 , user . getLastname ( ) , kqGroupComInfo . getGroupname ( groupId ) + "(id:" + groupId + ")" , rci . getLastname ( resourceid ) ,
shiftScheduleDate , ( "-1" . equals ( oldSerialid ) ? SystemEnv . getHtmlLabelName ( 26593 , user . getLanguage ( ) ) : kqShiftScheduleComInfo . getSerial ( oldSerialid ) + "(id:" + oldSerialid + ")" ) , id , "" , user . getLanguage ( ) ) ;
addLog ( bean ) ;
} else {
if ( ! oldSerialid . equals ( serialId ) & & oldSerialid . length ( ) > 0 ) {
needChange = true ;
params = new ArrayList < Object > ( ) ;
params . add ( serialId ) ;
params . add ( id ) ;
params . add ( shiftScheduleDate ) ;
params . add ( resourceid ) ;
paramUpdate . add ( params ) ;
bean = new KqShiftscheduleOperateLog ( 1 , user . getLastname ( ) , kqGroupComInfo . getGroupname ( groupId ) + "(id:" + groupId + ")" , rci . getLastname ( resourceid ) ,
shiftScheduleDate , ( "-1" . equals ( oldSerialid ) ? SystemEnv . getHtmlLabelName ( 26593 , user . getLanguage ( ) ) : kqShiftScheduleComInfo . getSerial ( oldSerialid ) + "(id:" + oldSerialid + ")" ) , id , ( "-1" . equals ( serialId ) ? SystemEnv . getHtmlLabelName ( 26593 , user . getLanguage ( ) ) : kqShiftScheduleComInfo . getSerial ( serialId ) + "(id:" + serialId + ")" ) , user . getLanguage ( ) ) ;
addLog ( bean ) ;
}
}
} else {
if ( serialId . length ( ) = = 0 ) continue ;
if ( ! oldSerialid . equals ( serialId ) ) {
needChange = true ;
if ( serialId . length ( ) = = 0 ) continue ; ;
params = new ArrayList < Object > ( ) ;
params . add ( shiftScheduleDate ) ;
params . add ( serialId ) ;
params . add ( resourceid ) ;
params . add ( groupId ) ;
paramInsert . add ( params ) ;
bean = new KqShiftscheduleOperateLog ( 0 , user . getLastname ( ) , kqGroupComInfo . getGroupname ( groupId ) + "(id:" + groupId + ")" , rci . getLastname ( resourceid ) ,
shiftScheduleDate , "" , id , ( "-1" . equals ( serialId ) ? SystemEnv . getHtmlLabelName ( 26593 , user . getLanguage ( ) ) : kqShiftScheduleComInfo . getSerial ( serialId ) + "(id:" + serialId + ")" ) , user . getLanguage ( ) ) ;
addLog ( bean ) ;
}
}
if ( needChange ) {
if ( DateUtil . timeInterval ( shiftScheduleDate , today ) > = 0 ) {
formatParams = new ArrayList < > ( ) ;
formatParams . add ( resourceid ) ;
@ -211,8 +214,7 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
checkSerialParams . add ( shiftScheduleDate ) ;
checkSerialParams . add ( serialId ) ;
lscheckSerialParams . add ( checkSerialParams ) ;
}
}
mapShiftScheduleOri . put ( shiftScheduleDate + "|" + resourceid , serialId ) ;
}
} else if ( shiftScheduleType . equals ( "2" ) ) { //按周期排班
List < String > lsDate = new ArrayList < > ( ) ;
@ -255,55 +257,44 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
boolean needShiftSchedule = false ;
int dayCount = 0 ;
for ( int i = 0 ; i < lsDate . size ( ) ; i + + ) {
needChange = false ;
id = "" ;
oldSerialid = "" ;
//if(weaver.common.DateUtil.timeInterval(date,today)>0)continue;//今天之前的无需处理
String date = lsDate . get ( i ) ;
if ( ! SaveShiftScheduleCmd . isDate ( date ) ) {
continue ;
}
String shiftScheduleValue = Util . null2String ( mapShiftSchedule . get ( date + "|" + resourceid ) ) ;
if ( ! "" . equals ( shiftScheduleValue ) ) {
id = shiftScheduleValue . split ( "#" ) [ 0 ] ;
oldSerialid = shiftScheduleValue . split ( "#" ) [ 1 ] ;
}
id = Util . null2String ( mapShiftSchedule . get ( date + "|" + resourceid ) ) ;
// 如果超过了有效期,就不存储数据
List < String > validateList = validateResult . get ( resourceid ) ;
boolean isInRange = kqMembersValidateBiz . isInRange ( date , validateList ) ;
if ( ! isInRange ) {
if ( oldSerialid . length ( ) > 0 ) {
if ( delIds . length ( ) > 0 ) {
delIds + = "," ;
}
if ( delIds . length ( ) > 0 ) delIds + = "," ;
delIds + = id ;
bean = new KqShiftscheduleOperateLog ( 2 , user . getLastname ( ) , kqGroupComInfo . getGroupname ( groupId ) + "(id:" + groupId + ")" , rci . getLastname ( resourceid ) ,
date , ( "-1" . equals ( oldSerialid ) ? SystemEnv . getHtmlLabelName ( 26593 , user . getLanguage ( ) ) : kqShiftScheduleComInfo . getSerial ( oldSerialid ) + "(id:" + oldSerialid + ")" ) , id , "" , user . getLanguage ( ) ) ;
addLog ( bean ) ;
}
continue ;
}
needShiftSchedule = true ;
int changeType = KQHolidaySetBiz . getChangeType ( groupId , date ) ;
if ( changeType ! = 1 & & changeType ! = 3 & & ! holidayType . equals ( " 1 ") ) { //遇双休日继续排班
if ( changeType ! = 1 & & changeType ! = 3 & & holidayType . equals ( " 2 ") ) { //遇双休日继续排班
int weekDay = DateUtil . getWeek ( date ) ;
if ( weekDay > 5 ) {
needShiftSchedule = false ;
}
}
if ( ! meetHolidays . equals ( " 1 ") ) { //遇节假日继续排班
if ( meetHolidays . equals ( " 2 ") ) { //遇节假日继续排班
if ( changeType = = 1 ) {
needShiftSchedule = false ;
}
}
if ( ! meetRestDays . equals ( " 1 ") ) { //遇调配休息日继续排班
if ( meetRestDays . equals ( " 2 ") ) { //遇调配休息日继续排班
if ( changeType = = 3 ) {
needShiftSchedule = false ;
}
}
if ( meetworkDays . equals ( "2" ) ) { //遇调配工作日日继续排班
if ( changeType = = 2 ) {
needShiftSchedule = false ;
}
}
if ( needShiftSchedule ) {
dayCount + + ;
int idx = dayCount % shiftcycleday ;
@ -312,55 +303,58 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
} else {
serialId = Util . null2String ( shiftcycleserialids [ idx - 1 ] ) ;
}
if ( id . length ( ) > 0 ) {
if ( serialId . length ( ) = = 0 & & oldSerialid . length ( ) > 0 ) {
if ( delIds . length ( ) > 0 ) {
delIds + = "," ;
new BaseBean ( ) . writeLog ( "serialId中" + serialId ) ;
if ( changeType ! = 1 & & changeType ! = 3 & & holidayType . equals ( "3" ) ) { //遇双休日指定排班
int weekDay = DateUtil . getWeek ( date ) ;
if ( weekDay > 5 ) {
serialId = serialIdSx ;
}
}
if ( meetHolidays . equals ( "3" ) ) { //遇节假日指定排班
if ( changeType = = 1 ) {
serialId = serialIdJjr ;
}
}
if ( meetRestDays . equals ( "3" ) ) { //遇调配休息日指定排班
if ( changeType = = 3 ) {
serialId = serialIdXxr ;
}
}
if ( meetworkDays . equals ( "3" ) ) { //遇调配工作日指定排班
if ( changeType = = 2 ) {
serialId = serialIdGzr ;
}
}
new BaseBean ( ) . writeLog ( "serialId后" + serialId ) ;
if ( id . length ( ) > 0 ) {
if ( serialId . length ( ) = = 0 ) {
if ( delIds . length ( ) > 0 ) delIds + = "," ;
delIds + = id ;
bean = new KqShiftscheduleOperateLog ( 2 , user . getLastname ( ) , kqGroupComInfo . getGroupname ( groupId ) + "(id:" + groupId + ")" , rci . getLastname ( resourceid ) ,
date , ( "-1" . equals ( oldSerialid ) ? SystemEnv . getHtmlLabelName ( 26593 , user . getLanguage ( ) ) : kqShiftScheduleComInfo . getSerial ( oldSerialid ) + "(id:" + oldSerialid + ")" ) , id , "" , user . getLanguage ( ) ) ;
addLog ( bean ) ;
} else {
if ( ! oldSerialid . equals ( serialId ) & & oldSerialid . length ( ) > 0 ) {
needChange = true ;
params = new ArrayList < Object > ( ) ;
params . add ( serialId ) ;
params . add ( id ) ;
params . add ( date ) ;
params . add ( resourceid ) ;
paramUpdate . add ( params ) ;
bean = new KqShiftscheduleOperateLog ( 1 , user . getLastname ( ) , kqGroupComInfo . getGroupname ( groupId ) + "(id:" + groupId + ")" , rci . getLastname ( resourceid ) ,
date , ( "-1" . equals ( oldSerialid ) ? SystemEnv . getHtmlLabelName ( 26593 , user . getLanguage ( ) ) : kqShiftScheduleComInfo . getSerial ( oldSerialid ) + "(id:" + oldSerialid + ")" ) , id , ( "-1" . equals ( serialId ) ? SystemEnv . getHtmlLabelName ( 26593 , user . getLanguage ( ) ) : kqShiftScheduleComInfo . getSerial ( serialId ) + "(id:" + serialId + ")" ) , user . getLanguage ( ) ) ;
addLog ( bean ) ;
}
}
} else {
if ( serialId . length ( ) > 0 ) {
if ( ! oldSerialid . equals ( serialId ) ) {
needChange = true ;
params = new ArrayList < Object > ( ) ;
params . add ( date ) ;
params . add ( serialId ) ;
params . add ( resourceid ) ;
params . add ( groupId ) ;
paramInsert . add ( params ) ;
bean = new KqShiftscheduleOperateLog ( 0 , user . getLastname ( ) , kqGroupComInfo . getGroupname ( groupId ) + "(id:" + groupId + ")" , rci . getLastname ( resourceid ) ,
date , "" , id , ( "-1" . equals ( serialId ) ? SystemEnv . getHtmlLabelName ( 26593 , user . getLanguage ( ) ) : kqShiftScheduleComInfo . getSerial ( serialId ) + "(id:" + serialId + ")" ) , user . getLanguage ( ) ) ;
addLog ( bean ) ;
}
}
}
mapShiftScheduleOri . put ( date + "|" + resourceid , serialId ) ;
} else {
if ( oldSerialid . length ( ) > 0 ) {
deleteCancelParams = new ArrayList < > ( ) ;
deleteCancelParams . add ( resourceid ) ;
deleteCancelParams . add ( date ) ;
lsDeleteCancelParams . add ( deleteCancelParams ) ;
bean = new KqShiftscheduleOperateLog ( 2 , user . getLastname ( ) , kqGroupComInfo . getGroupname ( groupId ) + "(id:" + groupId + ")" , rci . getLastname ( resourceid ) ,
date , ( "-1" . equals ( oldSerialid ) ? SystemEnv . getHtmlLabelName ( 26593 , user . getLanguage ( ) ) : kqShiftScheduleComInfo . getSerial ( oldSerialid ) + "(id:" + oldSerialid + ")" ) , id , "" , user . getLanguage ( ) ) ;
addLog ( bean ) ;
}
}
if ( needChange ) {
if ( DateUtil . timeInterval ( date , today ) > = 0 ) {
formatParams = new ArrayList < > ( ) ;
formatParams . add ( resourceid ) ;
@ -378,18 +372,255 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
checkSerialParams . add ( shiftScheduleDate ) ;
checkSerialParams . add ( serialId ) ;
lscheckSerialParams . add ( checkSerialParams ) ;
}
}
}
//二开获取排班校验规则
String getPbCheckValue = getpbCheckValue ( groupId ) ;
BaseBean bb = new BaseBean ( ) ;
String fromDate = TimeUtil . getMonthBeginDay ( oriDate ) ;
String toDate = TimeUtil . getMonthEndDay ( oriDate ) ;
List < String > lsDateNew = new ArrayList < > ( ) ;
Calendar calNew = DateUtil . getCalendar ( ) ;
boolean isEndNew = false ;
for ( String date = fromDate ; ! isEndNew ; ) {
if ( date . equals ( toDate ) ) isEndNew = true ;
lsDateNew . add ( date ) ;
calNew . setTime ( DateUtil . parseToDate ( date ) ) ;
date = DateUtil . getDate ( calNew . getTime ( ) , 1 ) ;
}
Map < String , Object > mapShiftScheduleAll = new HashMap < > ( ) ;
Set < String > unSavePerson = new HashSet < > ( ) ;
if ( "3" . equals ( getPbCheckValue ) | | "2" . equals ( getPbCheckValue ) ) {
//上四休二校验,生成预排班数据结构
for ( String resourceid : lsGroupMembers ) {
Map < String , Object > mapShiftScheduleChild = new HashMap < > ( ) ;
String sqlChild = " select id, resourceid, kqdate,serialid from kq_shiftschedule where (isdelete is null or isdelete <> '1') and groupid=? " ;
//有客户提下面的sql有性能问题, 在表数据较多, 并且该表数据改动较为频率不适合建索引, 所以对mapShiftSchedule先缓存的数据范围过滤下, 没必要全表缓存
sqlChild + = " and kqdate>='" + fromDate + "' and kqdate<='" + toDate + "' " ;
rs . executeQuery ( sqlChild , groupId ) ;
while ( rs . next ( ) ) {
mapShiftScheduleChild . put ( rs . getString ( "kqdate" ) + "|" + rs . getString ( "resourceid" ) , rs . getString ( "serialid" ) ) ;
}
//生成这个人员这个月的预生成排班
for ( int i = 0 ; i < lsDateNew . size ( ) ; i + + ) {
String date = lsDateNew . get ( i ) ;
String bcidNew = Util . null2String ( mapShiftScheduleOri . get ( date + "|" + resourceid ) ) ;
if ( StringUtils . isNotBlank ( bcidNew ) ) {
//本次排班预生成班次id
mapShiftScheduleAll . put ( date + "|" + resourceid , bcidNew ) ;
} else {
//本次排班未预生成id, 检查历史生成的班次id, 若历史也没有生效班次, 且当天不是节假日, 则不让保存
String bcidOld = Util . null2String ( mapShiftScheduleChild . get ( date + "|" + resourceid ) ) ;
if ( StringUtils . isNotBlank ( bcidOld ) ) {
mapShiftScheduleAll . put ( date + "|" + resourceid , bcidOld ) ;
} else {
int changeType = getChangeType ( groupId , date ) ;
if ( changeType ! = 1 ) {
//该人员不让保存
unSavePerson . add ( resourceid ) ;
}
}
}
}
}
bb . writeLog ( "unSavePerson" + JSONObject . toJSONString ( unSavePerson ) ) ;
bb . writeLog ( "mapShiftScheduleAll" + JSONObject . toJSONString ( mapShiftScheduleAll ) ) ;
if ( "2" . equals ( getPbCheckValue ) ) {
//获取当月正常工作天数
Integer xcqtsAll = 0 ;
for ( String date : lsDateNew ) {
Integer zcgzts = 0 ;
KQHolidaySetComInfo holidaySetComInfo = new KQHolidaySetComInfo ( ) ;
String changeTypeNew = holidaySetComInfo . getChangeType ( groupId , date ) ;
if ( "2" . equals ( changeTypeNew ) ) {
//调配工作日计正常工作天数
zcgzts = 1 ;
}
if ( DateUtil . getWeek ( date ) ! = 6 & & DateUtil . getWeek ( date ) ! = 7 ) {
//不为周六周日
if ( ! "1" . equals ( changeTypeNew ) & & ! "3" . equals ( changeTypeNew ) ) {
//不为节假日和休息日
zcgzts = 1 ;
}
}
xcqtsAll = xcqtsAll + zcgzts ;
}
bb . writeLog ( "xcqtsAll" + xcqtsAll ) ;
for ( String resourceid : lsGroupMembers ) {
bb . writeLog ( "resourceid" + resourceid ) ;
Integer bcNum = 0 ;
//遍历这个人员这个月的预生成排班
for ( int i = 0 ; i < lsDateNew . size ( ) ; i + + ) {
String date = lsDateNew . get ( i ) ;
String bcid = Util . null2String ( mapShiftScheduleAll . get ( date + "|" + resourceid ) ) ;
bb . writeLog ( "dateTwo" + date + "bcid" + bcid ) ;
if ( StringUtils . isNotBlank ( bcid ) ) {
//班次是否是休息班,是的话往后判断是否是两个连续休息班
boolean checkXxb = checkXxr ( bcid ) ;
if ( checkXxb ) {
//是休息班,不统计
bb . writeLog ( "是休息班,不统计" ) ;
} else {
//是工作班,统计
bb . writeLog ( "是工作班,统计" ) ;
bcNum + + ;
}
}
}
bb . writeLog ( "bcNum" + bcNum ) ;
if ( bcNum ! = xcqtsAll ) {
//当月日历工作日天数+调配工作日天数必须等于当月工作班天数,不等于则不让保存
unSavePerson . add ( resourceid ) ;
}
}
}
if ( "3" . equals ( getPbCheckValue ) ) {
// 校验是否满足上四休二规则: 从当月第一个连续两天的休息班作为锚点, 判断此休息班前后排班是否满足固定4天工作+2天休息的模式,
// 如果当月存在法定节假日则默认跳过后继续排班。例如:周三为节假日,且当周一为第一天工作日,那么当周的排班结果为:周一~周二:
// 2天工作日、周三: 跳过、周四~周五: 2天工作日、周六周日: 2天休息班
for ( String resourceid : lsGroupMembers ) {
bb . writeLog ( "resourceid" + resourceid ) ;
//遍历这个人员这个月的预生成排班
for ( int i = 0 ; i < lsDateNew . size ( ) ; i + + ) {
String date = lsDateNew . get ( i ) ;
String bcid = Util . null2String ( mapShiftScheduleAll . get ( date + "|" + resourceid ) ) ;
bb . writeLog ( "date" + date + "bcid" + bcid ) ;
if ( StringUtils . isNotBlank ( bcid ) ) {
//班次是否是休息班,是的话往后判断是否是两个连续休息班
boolean checkXxb = checkXxr ( bcid ) ;
if ( checkXxb ) {
//是休息班,往后找
bb . writeLog ( "是休息班,往后找" ) ;
boolean findNextXxb = true ;
Integer day = 1 ;
while ( findNextXxb ) {
calNew . setTime ( DateUtil . parseToDate ( date ) ) ;
String dateNext = DateUtil . getDate ( calNew . getTime ( ) , day ) ;
day + + ;
String bcidNext = Util . null2String ( mapShiftScheduleAll . get ( dateNext + "|" + resourceid ) ) ;
bb . writeLog ( "dateNext" + dateNext + "day" + day + "bcidNext" + bcidNext ) ;
if ( StringUtils . isNotBlank ( bcidNext ) ) {
//找到了第一个有班次的
bb . writeLog ( "找到了第一个有班次的" ) ;
findNextXxb = false ;
boolean checkXxbNext = checkXxr ( bcidNext ) ;
if ( checkXxbNext ) {
//再往后找一个班次,该班次需要为工作日
//是休息班,往后找
bb . writeLog ( "也是休息班,再往后找" ) ;
boolean findNextXxb1 = true ;
Integer day1 = 1 ;
while ( findNextXxb1 ) {
calNew . setTime ( DateUtil . parseToDate ( dateNext ) ) ;
String dateNext1 = DateUtil . getDate ( calNew . getTime ( ) , day1 ) ;
day1 + + ;
String bcidNext1 = Util . null2String ( mapShiftScheduleAll . get ( dateNext1 + "|" + resourceid ) ) ;
bb . writeLog ( "bcidNext1" + bcidNext1 + "dateNext1" + dateNext1 + "day1" + day1 ) ;
if ( StringUtils . isNotBlank ( bcidNext1 ) ) {
//不往后找了
boolean checkXxbNext1 = checkXxr ( bcidNext1 ) ;
findNextXxb1 = false ;
bb . writeLog ( "checkXxbNext1" + checkXxbNext1 ) ;
if ( checkXxbNext1 ) {
//存在三个连续的休息班,不符合上四休二
bb . writeLog ( "存在三个连续的休息班,不符合上四休二" ) ;
unSavePerson . add ( resourceid ) ;
} else {
i + + ;
}
} else {
i + + ;
}
//到最后一天也没找到,暂不处理
if ( DateUtil . timeInterval ( toDate , dateNext1 ) > = 0 ) {
findNextXxb1 = false ;
}
}
//将date作为一个锚点, 往前找并判断是否满足上四休二
boolean findBefore = true ;
Integer dayB = - 1 ;
//工作班数量
Integer gzbnum = 0 ;
//判断前面是否还有休息班标识
Integer xxbNo = 0 ;
while ( findBefore ) {
calNew . setTime ( DateUtil . parseToDate ( date ) ) ;
String dateBefore = DateUtil . getDate ( calNew . getTime ( ) , dayB ) ;
dayB - - ;
String bcidBefore = Util . null2String ( mapShiftScheduleAll . get ( dateBefore + "|" + resourceid ) ) ;
bb . writeLog ( "bcidBefore" + bcidBefore + "dateBefore" + dateBefore + "dayB" + dayB ) ;
if ( StringUtils . isNotBlank ( bcidBefore ) ) {
boolean checkXxbBefore = checkXxr ( bcidBefore ) ;
if ( checkXxbBefore ) {
//找到了第一个休息班,判断间隔了多少个非休息班,不再找了
bb . writeLog ( "找到了第一个休息班,判断间隔了多少个非休息班,不再找了" ) ;
findBefore = false ;
xxbNo = 1 ;
} else {
gzbnum + + ;
}
}
//找到月初一号了,不找了
if ( DateUtil . timeInterval ( dateBefore , fromDate ) > = 0 ) {
findBefore = false ;
}
}
bb . writeLog ( "gzbnum" + gzbnum ) ;
if ( xxbNo = = 1 ) {
//当前锚点前面有休息班, 若间隔工作班数量不为4, 则不符合
if ( gzbnum ! = 4 ) {
bb . writeLog ( "当前锚点前面有休息班, 若间隔工作班数量不为4, 则不符合" ) ;
unSavePerson . add ( resourceid ) ;
}
} else {
//当前锚点是第一个休息班
if ( gzbnum > 4 ) {
//锚点往前有超过四个工作班,不符合
bb . writeLog ( "当前锚点是第一个休息班,锚点往前有超过四个工作班,不符合" ) ;
unSavePerson . add ( resourceid ) ;
}
}
} else {
//找到的不是休息班,也认为不符合上四休二
bb . writeLog ( "找到的不是休息班,也认为不符合上四休二" ) ;
unSavePerson . add ( resourceid ) ;
}
} else {
i + + ;
}
//到最后一天也没找到,暂不处理
if ( DateUtil . timeInterval ( toDate , dateNext ) > = 0 ) {
findNextXxb = false ;
}
}
}
}
}
}
bb . writeLog ( "unSavePerson" + JSONObject . toJSONString ( unSavePerson ) ) ;
}
}
bb . writeLog ( "paramUpdate" + JSONObject . toJSONString ( paramUpdate ) ) ;
sql = " update kq_shiftschedule set serialid=?,isDelete=0 where id = ? " ;
for ( int i = 0 ; paramUpdate ! = null & & i < paramUpdate . size ( ) ; i + + ) {
List < Object > update_params = paramUpdate . get ( i ) ;
String serialid = Util . null2String ( update_params . get ( 0 ) ) ;
String tmp_id = Util . null2String ( update_params . get ( 1 ) ) ;
String resourceid = Util . null2String ( update_params . get ( 3 ) ) ;
if ( unSavePerson . contains ( resourceid ) & & ! "1" . equals ( getPbCheckValue ) ) {
//该人员不符合规则,不生效
} else {
rs . executeUpdate ( sql , serialid , tmp_id ) ;
}
}
sql = "insert into kq_shiftschedule (kqdate,serialid,resourceid,groupid,isDelete) values(?,?,?,?,0)" ;
for ( int i = 0 ; paramInsert ! = null & & i < paramInsert . size ( ) ; i + + ) {
@ -398,9 +629,14 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
String serialid = Util . null2String ( insert_params . get ( 1 ) ) ;
String resourceid = Util . null2String ( insert_params . get ( 2 ) ) ;
String groupid = Util . null2String ( insert_params . get ( 3 ) ) ;
if ( unSavePerson . contains ( resourceid ) & & ! "1" . equals ( getPbCheckValue ) ) {
//该人员不符合规则,不生效
} else {
rs . executeUpdate ( sql , kqdate , serialid , resourceid , groupid ) ;
}
}
if ( delIds . length ( ) > 0 ) {
List sqlParams = new ArrayList ( ) ;
Object [ ] objects = DBUtil . transListIn ( delIds , sqlParams ) ;
@ -413,8 +649,12 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
List < Object > delete_params = lsDeleteCancelParams . get ( i ) ;
String resourceid = Util . null2String ( delete_params . get ( 0 ) ) ;
String kqdate = Util . null2String ( delete_params . get ( 1 ) ) ;
if ( unSavePerson . contains ( resourceid ) & & ! "1" . equals ( getPbCheckValue ) ) {
//该人员不符合规则,不生效
} else {
rs . executeUpdate ( sql , resourceid , kqdate ) ;
}
}
//删除之前的排的班次,一天只能有一个班次
sql = " update kq_shiftschedule set isdelete =1 where (isdelete is null or isdelete <> '1') and resourceid = ? and kqdate = ? and groupid != " + groupId ;
@ -422,8 +662,12 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
List < Object > delete_params = lsDeleteParams . get ( i ) ;
String resourceid = Util . null2String ( delete_params . get ( 0 ) ) ;
String kqdate = Util . null2String ( delete_params . get ( 1 ) ) ;
if ( unSavePerson . contains ( resourceid ) & & ! "1" . equals ( getPbCheckValue ) ) {
//该人员不符合规则,不生效
} else {
rs . executeUpdate ( sql , resourceid , kqdate ) ;
}
}
sql = " update kq_shiftschedule set isdelete =1 where (isdelete is null or isdelete <> '1') and resourceid = ? and kqdate = ? and serialid != ? " ;
for ( int i = 0 ; lscheckSerialParams ! = null & & i < lscheckSerialParams . size ( ) ; i + + ) {
@ -431,16 +675,33 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
String resourceid = Util . null2String ( check_params . get ( 0 ) ) ;
String kqdate = Util . null2String ( check_params . get ( 1 ) ) ;
String serialid = Util . null2String ( check_params . get ( 2 ) ) ;
if ( unSavePerson . contains ( resourceid ) & & ! "1" . equals ( getPbCheckValue ) ) {
//该人员不符合规则,不生效
} else {
rs . executeUpdate ( sql , resourceid , kqdate , serialid ) ;
}
sql = "insert into kq_shiftscheduleoperate_log(operatetype,operator,kqgroupname,changeduser,changedshiftdate,changedshiftname,kqshiftid) values(?,?,?,?,?,?,?)" ;
bRs . executeBatchSqlNew ( sql , operateLogParams ) ;
}
new KQShiftScheduleComInfo ( ) . removeCache ( ) ;
//刷新报表数据
new KQFormatBiz ( ) . format ( lsFormatParams , 16 ) ;
new KQFormatBiz ( ) . format ( lsFormatParams ) ;
if ( unSavePerson . size ( ) > 0 & & ! "1" . equals ( getPbCheckValue ) ) {
List < String > personNameList = new ArrayList < > ( ) ;
for ( String personid : unSavePerson ) {
personNameList . add ( resourceComInfo . getLastname ( personid ) ) ;
}
String msg = "" ;
if ( "2" . equals ( getPbCheckValue ) ) {
msg = "做五休二" ;
} else if ( "3" . equals ( getPbCheckValue ) ) {
msg = "做四休二" ;
}
retmap . put ( "status" , "-1" ) ;
retmap . put ( "message" , "【" + StringUtils . join ( personNameList , "," ) + "】上述员工当前月份排班不符合" + msg + "规则或存在未排班日期" ) ;
return retmap ;
}
retmap . put ( "status" , "1" ) ;
retmap . put ( "message" , SystemEnv . getHtmlLabelName ( 18758 , user . getLanguage ( ) ) ) ;
@ -452,16 +713,69 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
return retmap ;
}
private void addLog ( KqShiftscheduleOperateLog bean ) {
operateLogParam = new ArrayList < > ( ) ;
operateLogParam . add ( bean . getOperatetype ( ) ) ;
operateLogParam . add ( bean . getOperator ( ) ) ;
operateLogParam . add ( bean . getKqgroupname ( ) ) ;
operateLogParam . add ( bean . getChangeduser ( ) ) ;
operateLogParam . add ( bean . getChangedshiftdate ( ) ) ;
operateLogParam . add ( bean . getChangedshiftname ( ) ) ;
operateLogParam . add ( bean . getKqshiftid ( ) ) ;
operateLogParams . add ( operateLogParam ) ;
/ * *
* 判 断 是 否 是 休 息 班
* @param serialid
* @return
* /
private static Boolean checkXxr ( String serialid ) {
RecordSet rs = new RecordSet ( ) ;
String sql = "select * from kq_ShiftManagement where id = " + serialid + " and is_rest = 1" ;
rs . execute ( sql ) ;
Boolean check = false ;
if ( rs . getCounts ( ) > 0 ) {
check = true ;
}
return check ;
}
/ * *
* 获 取 当 前 日 期 是 何 种 类 型 ( 这 里 只 考 虑 节 假 日 设 置 )
*
* @param groupId 考 勤 组 ID
* @param date 指 定 日 期
* @return 1 - 节 假 日 、 2 - 工 作 日 、 3 - 休 息 日 、 - 1 - 没 有 设 置 过 数 据
* /
public static int getChangeType ( String groupId , String date ) {
int changeType = - 1 ; //默认没有设置过节假日(节假日设置的类型: 1-公众假日、2-调配工作日、3-调配休息日)
KQHolidaySetComInfo kqHolidaySetComInfo = new KQHolidaySetComInfo ( ) ;
String tmpChangetype = kqHolidaySetComInfo . getChangeType ( groupId , date ) ;
if ( null ! = tmpChangetype ) {
changeType = Util . getIntValue ( tmpChangetype , - 1 ) ;
}
return changeType ;
}
/ * *
* 获 取 排 班 校 验 规 则
* @param groupid
* @return
* /
private static String getpbCheckValue ( String groupid ) {
RecordSet rs = new RecordSet ( ) ;
String sql = "select pbcheck from kq_group where id = " + groupid ;
rs . execute ( sql ) ;
String pbcheck = "" ;
if ( rs . next ( ) ) {
pbcheck = Util . null2String ( rs . getString ( "pbcheck" ) ) ;
}
return pbcheck ;
}
public static void main ( String [ ] args ) {
String fromDate = TimeUtil . getMonthBeginDay ( "2025-04-07" ) ;
String toDate = TimeUtil . getMonthEndDay ( "2025-04-07" ) ;
List < String > lsDate = new ArrayList < > ( ) ;
Calendar cal = DateUtil . getCalendar ( ) ;
boolean isEnd = false ;
for ( String date = toDate ; ! isEnd ; ) {
if ( date . equals ( fromDate ) ) isEnd = true ;
lsDate . add ( date ) ;
cal . setTime ( DateUtil . parseToDate ( date ) ) ;
date = DateUtil . getDate ( cal . getTime ( ) , - 1 ) ;
}
System . out . println ( lsDate ) ;
}
@Override