package com.engine.kq.cmd.attendanceButton ;
import com.alibaba.fastjson.JSON ;
import com.alibaba.fastjson.JSONObject ;
import com.cloudstore.dev.api.util.EMManager ;
import com.engine.common.biz.AbstractCommonCommand ;
import com.engine.common.entity.BizLogContext ;
import com.engine.core.interceptor.CommandContext ;
import com.engine.hostar.util.HostarUtil ;
import com.engine.kq.biz.* ;
import com.engine.kq.biz.chain.shiftinfo.ShiftInfoBean ;
import com.engine.kq.entity.KQGroupEntity ;
import com.engine.kq.entity.WorkTimeEntity ;
import com.engine.kq.log.KQLog ;
import com.engine.kq.timer.KQQueue ;
import com.engine.kq.timer.KQTaskBean ;
import com.engine.kq.util.KQDurationCalculatorUtil ;
import com.engine.kq.wfset.util.SplitActionUtil ;
import com.google.common.collect.Maps ;
import java.time.Duration ;
import java.time.LocalDate ;
import java.time.LocalDateTime ;
import java.time.LocalTime ;
import java.time.format.DateTimeFormatter ;
import java.util.* ;
import java.util.Map.Entry ;
import javax.servlet.http.HttpServletRequest ;
import org.apache.commons.lang3.StringUtils ;
import weaver.common.DateUtil ;
import weaver.conn.RecordSet ;
import weaver.dateformat.DateTransformer ;
import weaver.dateformat.TimeZoneVar ;
import weaver.general.Util ;
import weaver.hrm.User ;
import weaver.systeminfo.SystemEnv ;
/ * *
* 考 勤 的 签 到 签 退
* /
public class PunchButtonCmd extends AbstractCommonCommand < Map < String , Object > > {
public KQLog kqLog = new KQLog ( ) ;
private HttpServletRequest request ;
private Map < String , Object > logMap = Maps . newHashMap ( ) ;
private Map < String , Object > workTimeEntityLogMap = Maps . newHashMap ( ) ;
private final List < String > LIST = new ArrayList < > ( ) ;
public PunchButtonCmd ( HttpServletRequest request , Map < String , Object > params , User user ) {
this . request = request ;
this . user = user ;
this . params = params ;
}
@Override
public Map < String , Object > execute ( CommandContext commandContext ) {
Map < String , Object > retmap = new HashMap < String , Object > ( ) ;
try {
insertSign ( retmap ) ;
} catch ( Exception e ) {
retmap . put ( "status" , "-1" ) ;
retmap . put ( "message" , SystemEnv . getHtmlLabelName ( 382661 , user . getLanguage ( ) ) ) ;
writeLog ( e ) ;
}
kqLog . info ( user . getLastname ( ) + ":PunchButtonCmd:retmap:" + retmap ) ;
KQCardLogBiz . logCardInfo ( user . getUID ( ) + "" , logMap , workTimeEntityLogMap , "punchButton" ) ;
return retmap ;
}
/ * *
* 检 验 ip 是 否 在 考 勤 组 设 置 的 范 围 要 求 内
* @param ismobile
* /
private boolean checkIsInIp ( String ismobile ) {
// if("1".equalsIgnoreCase(ismobile)){
// return true;
// }
KQGroupBiz kqGroupBiz = new KQGroupBiz ( ) ;
String clientAddress = Util . getIpAddr ( request ) ;
kqLog . info ( "PunchButtonCmd:clientAddress:" + clientAddress ) ;
return kqGroupBiz . getIsInScopeV4V6 ( user . getUID ( ) + "" , clientAddress , ismobile ) ;
}
public void insertSign ( Map < String , Object > retmap ) throws Exception {
logMap . put ( "lastname" , user . getLastname ( ) ) ;
logMap . put ( "params" , params ) ;
kqLog . info ( user . getLastname ( ) + ":PunchButtonCmd:params:" + params ) ;
RecordSet rs = new RecordSet ( ) ;
String deviceInfo = Util . null2String ( params . get ( "deviceInfo" ) ) ;
JSONObject jsonObject = null ;
if ( deviceInfo . length ( ) > 0 ) {
jsonObject = JSON . parseObject ( deviceInfo ) ;
JSONObject jsonObject1 = new JSONObject ( ) ;
Set < Entry < String , Object > > jsonSet = jsonObject . entrySet ( ) ;
for ( Entry < String , Object > js : jsonSet ) {
String key = js . getKey ( ) ;
String value = Util . null2String ( js . getValue ( ) ) ;
jsonObject1 . put ( key , value ) ;
}
if ( ! jsonObject1 . isEmpty ( ) ) {
deviceInfo = jsonObject1 . toJSONString ( ) ;
}
}
//应上班 工作时间点
String time = Util . null2String ( params . get ( "time" ) ) ;
//应上班 工作时间 带日期
String datetime = Util . null2String ( params . get ( "datetime" ) ) ;
//允许打卡时段 带日期
String signSectionTime = Util . null2String ( params . get ( "signSectionTime" ) ) ;
//上传照片
String attachment = Util . null2String ( params . get ( "fileids" ) ) ;
//打卡所属worksection的对应的点
String type = Util . null2String ( params . get ( "type" ) ) ;
//所属打卡日期
String belongdate = Util . null2String ( params . get ( "belongdate" ) ) ;
belongdate = belongdate . length ( ) = = 0 ? DateUtil . getCurrentDate ( ) : belongdate ;
String islastsign = Util . null2String ( params . get ( "islastsign" ) ) ;
String isfirstsign = Util . null2String ( params . get ( "isfirstsign" ) ) ;
String workmins = Util . null2String ( params . get ( "workmins" ) ) ;
//针对非工作时段 签退的时候记录的签到数据 用于计算加班
String signInTime4Out = Util . null2String ( params . get ( "signInTime4Out" ) ) ;
//允许打卡的范围
String signsection = Util . null2String ( params . get ( "signSection" ) ) ;
//手机打卡部分
String longitude = Util . null2String ( params . get ( "longitude" ) ) ;
String latitude = Util . null2String ( params . get ( "latitude" ) ) ;
double d_longitude = Util . getDoubleValue ( longitude ) ;
double d_latitude = Util . getDoubleValue ( latitude ) ;
if ( d_latitude < = 0 ) {
latitude = "" ;
}
if ( d_longitude < = 0 ) {
longitude = "" ;
}
//wifi用的
String mac = Util . null2String ( params . get ( "mac" ) ) ;
String sid = Util . null2String ( params . get ( "sid" ) ) ;
String addr = Util . null2String ( params . get ( "position" ) ) ;
String ismobile = Util . null2String ( params . get ( "ismobile" ) ) ;
//区分是来自于钉钉还是EM7
String browser = Util . null2String ( params . get ( "browser" ) ) ;
//自由班制处理
String isfree = Util . null2String ( Util . null2String ( params . get ( "isfree" ) ) , "0" ) ;
//上班打卡 允许最晚打卡时间
String signSectionEndTime = Util . null2String ( params . get ( "signSectionEndTime" ) ) ;
//下班打卡 允许最早打卡时间
String signSectionBeginTime = Util . null2String ( params . get ( "signSectionBeginTime" ) ) ;
String locationshowaddress = Util . null2String ( params . get ( "locationshowaddress" ) ) ;
if ( locationshowaddress . equals ( "1" ) ) { //记录统一地址
String locationid = Util . null2String ( params . get ( "locationid" ) ) ; //办公地点id
if ( locationid . length ( ) > 0 ) { //如果开启统一显示,就用配置的地址
KQLoactionComInfo kqLoactionComInfo = new KQLoactionComInfo ( ) ;
addr = kqLoactionComInfo . getLocationname ( locationid ) ;
}
}
DateTimeFormatter fullFormatter = DateTimeFormatter . ofPattern ( "yyyy-MM-dd HH:mm:ss" ) ;
DateTimeFormatter dateFormatter = DateTimeFormatter . ofPattern ( "yyyy-MM-dd" ) ;
DateTimeFormatter dateTimeFormatter = DateTimeFormatter . ofPattern ( "HH:mm:ss" ) ;
LocalTime localTime = LocalTime . now ( ) ;
String signTime = localTime . format ( dateTimeFormatter ) ;
String signDate = LocalDate . now ( ) . format ( dateFormatter ) ;
String timeZone = Util . null2String ( TimeZoneVar . getTimeZone ( ) , "" ) ;
//处理多时区
String timeZoneConversion = Util . null2String ( new weaver . general . BaseBean ( ) . getPropValue ( "weaver_timezone_conversion" , "timeZoneConversion" ) ) . trim ( ) ;
logMap . put ( "timeZoneConversion" , timeZoneConversion ) ;
if ( "1" . equals ( timeZoneConversion ) ) {
DateTransformer dateTransformer = new DateTransformer ( ) ;
String [ ] zone_localTime = dateTransformer . getLocaleDateAndTime ( signDate , signTime ) ;
kqLog . info ( user . getLastname ( ) + ":TimeZoneVar.getTimeZone():" + TimeZoneVar . getTimeZone ( ) + ":zone_localTime:" + JSON . toJSONString ( zone_localTime ) ) ;
if ( zone_localTime ! = null & & zone_localTime . length = = 2 ) {
signDate = zone_localTime [ 0 ] ;
signTime = zone_localTime [ 1 ] ;
}
}
int userId = user . getUID ( ) ;
String userType = user . getLogintype ( ) ;
String signType = "on" . equalsIgnoreCase ( type ) ? "1" : "2" ;
String clientAddress = Util . getIpAddr ( request ) ;
boolean isInIp = checkIsInIp ( ismobile ) ;
logMap . put ( "clientAddress" , clientAddress ) ;
if ( ! isInIp ) {
retmap . put ( "message" , SystemEnv . getHtmlLabelName ( 20157 , user . getLanguage ( ) ) ) ;
retmap . put ( "isInIp" , "0" ) ;
}
String isInCom = isInIp ? "1" : "0" ;
//是否是考勤例外人员
boolean isExclude = false ;
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo ( ) ;
KQWorkTime kqWorkTime = new KQWorkTime ( ) ;
WorkTimeEntity workTimeEntity = kqWorkTime . getWorkTime ( user . getUID ( ) + "" , signDate ) ;
String userinfo = "#userid#" + user . getUID ( ) + "#getUserSubCompany1#" + user . getUserSubCompany1 ( ) + "#getUserSubCompany1#" + user . getUserDepartment ( )
+ "#getJobtitle#" + user . getJobtitle ( ) ;
workTimeEntityLogMap . put ( "resourceid" , userinfo ) ;
workTimeEntityLogMap . put ( "splitDate" , signDate ) ;
workTimeEntityLogMap . put ( "workTimeEntity" , workTimeEntity ) ;
String groupid = workTimeEntity . getGroupId ( ) ;
logMap . put ( "groupid" , groupid ) ;
KQGroupEntity kqGroupEntity = kqGroupMemberComInfo . getUserKQGroupInfo ( user . getUID ( ) + "" ) ;
String kqGroupEntityInfo = kqGroupEntity ! = null ? JSON . toJSONString ( kqGroupEntity ) : "" ;
logMap . put ( "kqGroupEntityInfo" , kqGroupEntityInfo ) ;
if ( kqGroupEntity ! = null & & ( "," + kqGroupEntity . getExcludeid ( ) + "," ) . indexOf ( "," + user . getUID ( ) + "," ) > - 1 ) { //排除人员无需计算考勤时间
isExclude = true ;
}
String [ ] signsections = signsection . split ( "#" ) ;
if ( ! "1" . equalsIgnoreCase ( isfree ) ) {
if ( signsections ! = null & & signsections . length = = 2 ) {
//判断是未签到直接签退
String signedMsg = signedMsg ( userId + "" , signType , user , signsections , signSectionBeginTime , signSectionEndTime ) ;
if ( signedMsg . length ( ) > 0 ) {
retmap . put ( "status" , "1" ) ;
retmap . put ( "message" , signedMsg ) ;
isInCom = "0" ;
}
}
}
String datetime_timezone = signDate + " " + signTime ;
LocalDateTime nowDateTime = LocalDateTime . parse ( datetime_timezone , fullFormatter ) ;
kqLog . info ( "timeZone:" + timeZone + ":signDate:" + signDate + ":signTime:" + signTime + ":nowDateTime:" + nowDateTime ) ;
if ( "1" . equalsIgnoreCase ( signType ) & & signSectionTime . length ( ) > 0 ) {
LocalDateTime startWorkDateTime = LocalDateTime . parse ( signSectionTime , fullFormatter ) ;
if ( nowDateTime . isBefore ( startWorkDateTime ) ) {
Duration duration = Duration . between ( nowDateTime , startWorkDateTime ) ;
retmap . put ( "status" , "1" ) ;
retmap . put ( "message" , "" + weaver . systeminfo . SystemEnv . getHtmlLabelName ( 10005326 , weaver . general . ThreadVarLanguage . getLang ( ) ) + "" + duration . toMinutes ( ) + "" + weaver . systeminfo . SystemEnv . getHtmlLabelName ( 15049 , weaver . general . ThreadVarLanguage . getLang ( ) ) + "" ) ;
isInCom = "0" ;
}
} else if ( "2" . equalsIgnoreCase ( signType ) & & signSectionTime . length ( ) > 0 ) {
LocalDateTime endWorkDateTime = LocalDateTime . parse ( signSectionTime , fullFormatter ) ;
if ( nowDateTime . isAfter ( endWorkDateTime ) ) {
Duration duration = Duration . between ( endWorkDateTime , nowDateTime ) ;
retmap . put ( "status" , "1" ) ;
retmap . put ( "message" , "" + weaver . systeminfo . SystemEnv . getHtmlLabelName ( 10005327 , weaver . general . ThreadVarLanguage . getLang ( ) ) + "" + duration . toMinutes ( ) + "" + weaver . systeminfo . SystemEnv . getHtmlLabelName ( 15049 , weaver . general . ThreadVarLanguage . getLang ( ) ) + "" ) ;
isInCom = "0" ;
}
}
//记录下是来自于E9的pc端签到
String signfrom = "e9pc" ;
if ( "1" . equalsIgnoreCase ( ismobile ) ) {
signfrom = "e9mobile" ;
boolean needLocationRange = false ;
boolean needWifiRange = false ;
boolean isLocationRange = false ;
boolean isWifiRange = false ;
KQGroupBiz kqGroupBiz = new KQGroupBiz ( ) ;
Map < String , Object > locationMap = kqGroupBiz . checkLocationScope ( userId + "" , longitude , latitude ) ;
logMap . put ( "locationMap" , locationMap ) ;
String locationNeedCheck = Util . null2String ( locationMap . get ( "needCheck" ) ) ;
boolean locationInScope = Boolean . parseBoolean ( Util . null2String ( locationMap . get ( "inScope" ) ) ) ;
if ( "1" . equalsIgnoreCase ( locationNeedCheck ) ) {
needLocationRange = true ;
if ( locationInScope ) {
isLocationRange = true ;
}
}
String wifiNeedCheck = "" ;
Map < String , Object > wifiMap = kqGroupBiz . checkWifiScope ( userId + "" , sid , mac ) ;
logMap . put ( "wifiMap" , wifiMap ) ;
wifiNeedCheck = Util . null2String ( wifiMap . get ( "needCheck" ) ) ;
boolean wifiInScope = Boolean . parseBoolean ( Util . null2String ( wifiMap . get ( "inScope" ) ) ) ;
if ( "1" . equalsIgnoreCase ( wifiNeedCheck ) ) {
needWifiRange = true ;
if ( wifiInScope ) {
isWifiRange = true ;
}
}
if ( needLocationRange ) {
if ( isLocationRange ) {
} else {
if ( needWifiRange ) {
if ( isWifiRange ) {
} else {
//地理位置开启, 而且不在范围内, 且开启wifi验证,不在范围内
retmap . put ( "message" , SystemEnv . getHtmlLabelName ( 507524 , user . getLanguage ( ) ) ) ;
isInCom = "0" ;
}
} else {
//地理位置开启, 而且不在范围内, 且未开启wifi验证
retmap . put ( "message" , SystemEnv . getHtmlLabelName ( 500510 , user . getLanguage ( ) ) ) ;
isInCom = "0" ;
}
}
} else {
if ( needWifiRange ) {
if ( isWifiRange ) {
} else {
//地理位置未开启, 且开启wifi验证,不在范围内
retmap . put ( "message" , SystemEnv . getHtmlLabelName ( 507524 , user . getLanguage ( ) ) ) ;
isInCom = "0" ;
}
}
}
if ( "DingTalk" . equalsIgnoreCase ( browser ) ) {
signfrom = "DingTalk" ;
} else if ( "Wechat" . equalsIgnoreCase ( browser ) ) {
signfrom = "Wechat" ;
String weChat_deviceid = Util . null2String ( request . getSession ( ) . getAttribute ( EMManager . DeviceId ) ) ;
logMap . put ( "weChat_deviceid" , weChat_deviceid ) ;
kqLog . info ( "EMManager.DeviceId:" + EMManager . DeviceId + ":weChat_deviceid:" + weChat_deviceid ) ;
if ( weChat_deviceid . length ( ) > 0 ) {
//微信打卡的设备号需要单独处理
if ( jsonObject ! = null ) {
jsonObject . put ( "deviceId" , weChat_deviceid ) ;
} else {
jsonObject = new JSONObject ( ) ;
jsonObject . put ( "deviceId" , weChat_deviceid ) ;
}
if ( ! jsonObject . isEmpty ( ) ) {
deviceInfo = jsonObject . toJSONString ( ) ;
}
}
}
}
String signStatus = "" ;
if ( ! "1" . equalsIgnoreCase ( isfree ) & & datetime . length ( ) > 0 ) {
signStatus = getSignStatus ( signType , datetime , user . getUID ( ) + "" , belongdate , nowDateTime ) ;
logMap . put ( "signStatus" , signStatus ) ;
}
if ( isExclude ) {
signStatus = ButtonStatusEnum . NORMAL . getStatusCode ( ) ;
}
String punchSql = "insert into HrmScheduleSign(userId,userType,signType,signDate,signTime,clientAddress,isInCom,timeZone,belongdate,signfrom,longitude,latitude,addr,deviceInfo) " +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)" ;
boolean isOk = rs . executeUpdate ( punchSql , userId , userType , signType , signDate , signTime , clientAddress , isInCom ,
timeZone , belongdate , signfrom , longitude , latitude , addr , deviceInfo ) ;
if ( ! isOk ) {
retmap . put ( "status" , "1" ) ;
retmap . put ( "message" , SystemEnv . getHtmlLabelName ( 382661 , user . getLanguage ( ) ) ) ;
return ;
}
logMap . put ( "punchSql" , punchSql ) ;
logMap . put ( "punchSql_isOk" , isOk ) ;
kqLog . info ( user . getLastname ( ) + ":PunchButtonCmd:punchSql:" + punchSql + ":isOk:" + isOk ) ;
//打卡提醒处理
String remindSql = "insert into hrmschedulesign_remind(userId,signType,signDate,signTime,belongdate) values(?,?,?,?,?)" ;
isOk = rs . executeUpdate ( remindSql , userId , signType , signDate , signTime , belongdate ) ;
kqLog . info ( user . getLastname ( ) + ":PunchButtonCmd:remindSql:" + remindSql + ":isOk:" + isOk ) ;
//增加自动排班
kqLog . info ( "PunchButtonCmd.format in >>>>>userId" + userId + "kqDate==" + signDate + "format.groupId:" + groupid + "format.serialId:" + workTimeEntity . getSerialId ( ) ) ;
//责任制考勤组id收集
rs . executeQuery ( "select kqzid from uf_zrzkqz" ) ;
while ( rs . next ( ) ) {
LIST . add ( Util . null2String ( rs . getString ( "kqzid" ) ) ) ;
}
kqLog . info ( "PunchButtonCmd.LIST" + LIST ) ;
if ( LIST . contains ( groupid ) & & StringUtils . isBlank ( workTimeEntity . getSerialId ( ) ) ) {
RecordSet rt = new RecordSet ( ) ;
//休息日或节假日给休息班次
//int changeType = KQOvertimeRulesBiz.getChangeType(Util.null2String(userId), signDate);
boolean holiday = KQHolidaySetBiz . isHoliday ( Util . null2String ( userId ) , signDate , true ) ;
kqLog . info ( "format.holiday:" + holiday ) ;
String sql = "insert into kq_shiftschedule(kqdate,serialid,resourceid,groupid,isdelete)values(?,?,?,?,?)" ;
//考勤当天是节假日或者休息日
if ( holiday ) {
//休息班
boolean b = rt . executeUpdate ( sql , signDate , "-1" , Util . null2String ( userId ) , groupid , "0" ) ;
kqLog . info ( "PunchButtonCmd.b1:" + b ) ;
} else {
String dybc = "" ;
//正常打卡,排对应打卡地点对应班次
//2.查询指定打卡地点的经纬度及范围的list
List < Map < String , String > > list2 = new ArrayList < > ( ) ;
//2.1查询出打卡地点经纬度建模list
String sql2 = "select jd,wd,bj,dybc from uf_jwdbj" ;
rt . execute ( sql2 ) ;
while ( rt . next ( ) ) {
Map < String , String > map = new HashMap < > ( ) ;
map . put ( "jd" , Util . null2String ( rt . getString ( "jd" ) ) ) ;
map . put ( "wd" , Util . null2String ( rt . getString ( "wd" ) ) ) ;
map . put ( "bj" , Util . null2String ( rt . getString ( "bj" ) ) ) ;
map . put ( "dybc" , Util . null2String ( rt . getString ( "dybc" ) ) ) ;
list2 . add ( map ) ;
}
kqLog . info ( "PunchButtonCmd.list2:" + list2 ) ;
for ( Map < String , String > map : list2 ) {
Double distance = new HostarUtil ( ) . calculateDistance ( d_latitude , d_longitude , Util . getDoubleValue ( map . get ( "wd" ) ) , Util . getDoubleValue ( map . get ( "jd" ) ) ) ;
if ( distance < = Util . getDoubleValue ( map . get ( "bj" ) ) ) {
dybc = map . get ( "dybc" ) ;
}
}
kqLog . info ( "PunchButtonCmd.dybc:" + dybc ) ;
//设置考勤班次为对应班次
if ( StringUtils . isNotBlank ( dybc ) ) {
boolean b = rt . executeUpdate ( sql , signDate , dybc , Util . null2String ( userId ) , groupid , "0" ) ;
kqLog . info ( "PunchButtonCmd.b2:" + b ) ;
}
}
}
//同步更新考勤数据到考勤报表
new KQFormatBiz ( ) . formatDate ( "" + userId , ( belongdate . length ( ) = = 0 ? DateUtil . getCurrentDate ( ) : belongdate ) ) ;
//点击签退的时候,可能存在加班数据生成的情况
if ( "2" . equalsIgnoreCase ( signType ) ) {
if ( "1" . equalsIgnoreCase ( islastsign ) ) {
List < KQTaskBean > tasks = new ArrayList < > ( ) ;
List < KQTaskBean > after_tasks = new ArrayList < > ( ) ;
SplitActionUtil . pushOverTimeTasks ( belongdate , belongdate , "" + userId , tasks ) ;
if ( ! tasks . isEmpty ( ) ) {
for ( KQTaskBean kqTaskBean : tasks ) {
after_tasks . add ( kqTaskBean ) ;
}
}
logMap . put ( "after_tasks" , after_tasks ) ;
if ( ! after_tasks . isEmpty ( ) ) {
KQQueue . writeTasks ( after_tasks ) ;
}
}
}
if ( "1" . equalsIgnoreCase ( signType ) ) {
if ( "1" . equalsIgnoreCase ( isfirstsign ) ) {
List < KQTaskBean > tasks = new ArrayList < > ( ) ;
List < KQTaskBean > before_tasks = new ArrayList < > ( ) ;
SplitActionUtil . pushOverTimeTasks ( belongdate , belongdate , "" + userId , tasks ) ;
if ( ! tasks . isEmpty ( ) ) {
for ( KQTaskBean kqTaskBean : tasks ) {
kqTaskBean . setTasktype ( "punchcard" ) ;
before_tasks . add ( kqTaskBean ) ;
}
}
logMap . put ( "before_tasks" , before_tasks ) ;
if ( ! before_tasks . isEmpty ( ) ) {
KQQueue . writeTasks ( before_tasks ) ;
}
}
}
String reSignStatus = reSignStatus ( user . getUID ( ) + "" , signType , nowDateTime , belongdate ) ;
if ( Util . null2String ( reSignStatus , "" ) . length ( ) > 0 ) {
signStatus = reSignStatus ;
}
retmap . put ( "status" , "1" ) ;
retmap . put ( "signdate" , signDate ) ;
retmap . put ( "signtime" , signTime ) ;
retmap . put ( "kqstatus" , signStatus ) ;
if ( ! "1" . equalsIgnoreCase ( signStatus ) & & ! "2" . equalsIgnoreCase ( signStatus ) ) {
if ( "" . equalsIgnoreCase ( Util . null2String ( retmap . get ( "message" ) ) ) ) {
retmap . put ( "success" , "1" ) ;
retmap . put ( "message" , SystemEnv . getHtmlLabelName ( 512596 , weaver . general . Util . getIntValue ( user . getLanguage ( ) ) ) ) ;
}
}
logMap . put ( "retmap" , retmap ) ;
}
public String reSignStatus ( String userid , String signType , LocalDateTime nowDateTime ,
String workdate ) {
String signStatus = "" ;
String shift_begindateworktime = "" ;
String shift_enddateworktime = "" ;
ShiftInfoBean shiftInfoBean = KQDurationCalculatorUtil . getWorkTime ( userid , workdate , false ) ;
if ( shiftInfoBean = = null ) {
return signStatus ;
}
Map < String , String > shifRuleMap = Maps . newHashMap ( ) ;
KQShiftRuleInfoBiz . getShiftRuleInfo ( shiftInfoBean , userid , shifRuleMap ) ;
KQTimesArrayComInfo arrayComInfo = new KQTimesArrayComInfo ( ) ;
if ( ! shifRuleMap . isEmpty ( ) ) {
DateTimeFormatter fullFormatter = DateTimeFormatter . ofPattern ( "yyyy-MM-dd HH:mm:ss" ) ;
String datetime = "" ;
if ( shifRuleMap . containsKey ( "shift_beginworktime" ) ) {
String shift_beginworktime = Util . null2String ( shifRuleMap . get ( "shift_beginworktime" ) ) ;
if ( shift_beginworktime . length ( ) > 0 ) {
int shift_beginworktime_index = - 1 ;
shift_beginworktime_index = arrayComInfo . getArrayindexByTimes ( shift_beginworktime ) ;
datetime = workdate + " " + shift_beginworktime + ":00" ;
if ( shift_beginworktime_index > = 1440 ) {
//跨天了
datetime = DateUtil . addDate ( workdate , 1 ) + " " + arrayComInfo . turn48to24Time ( shift_beginworktime ) + ":00" ;
}
}
}
if ( shifRuleMap . containsKey ( "shift_endworktime" ) ) {
String shift_endworktime = Util . null2String ( shifRuleMap . get ( "shift_endworktime" ) ) ;
if ( shift_endworktime . length ( ) > 0 ) {
int shift_endworktime_index = - 1 ;
shift_endworktime_index = arrayComInfo . getArrayindexByTimes ( shift_endworktime ) ;
datetime = workdate + " " + shift_endworktime + ":00" ;
if ( shift_endworktime_index > = 1440 ) {
//跨天了
datetime = DateUtil . addDate ( workdate , 1 ) + " " + arrayComInfo . turn48to24Time ( shift_endworktime ) + ":00" ;
}
}
}
if ( datetime . length ( ) > 0 ) {
if ( "1" . equalsIgnoreCase ( signType ) ) {
LocalDateTime startWorkDateTime = LocalDateTime . parse ( datetime , fullFormatter ) ;
//打卡时间比上班时间晚,迟到了
if ( nowDateTime . isAfter ( startWorkDateTime ) ) {
signStatus = ButtonStatusEnum . BELATE . getStatusCode ( ) ;
} else {
signStatus = ButtonStatusEnum . NORMAL . getStatusCode ( ) ;
}
} else if ( "2" . equalsIgnoreCase ( signType ) ) {
LocalDateTime endWorkDateTime = LocalDateTime . parse ( datetime , fullFormatter ) ;
//签退的话
if ( nowDateTime . isBefore ( endWorkDateTime ) ) {
signStatus = ButtonStatusEnum . LEAVEERALY . getStatusCode ( ) ;
} else {
signStatus = ButtonStatusEnum . NORMAL . getStatusCode ( ) ;
}
} else {
writeLog ( user . getLastname ( ) + nowDateTime + ":竟然没有传:" + signType ) ;
return "" ;
}
}
}
return signStatus ;
}
/ * *
* 上 班 前 打 卡 目 前 是 视 作 前 一 天 的 跨 天 加 班
* @param resourceid
* @param pre_splitDate
* @param signtime
* @param pre_bengintime
* @param signdate
* /
public void doBeforeAcrossOvertime ( String resourceid , String pre_splitDate , String signtime , String pre_bengintime , String signdate ) {
KQTaskBean kqTaskBean = new KQTaskBean ( ) ;
kqTaskBean . setResourceId ( resourceid ) ;
kqTaskBean . setTaskDate ( pre_splitDate ) ;
kqTaskBean . setLastWorkTime ( signtime ) ;
if ( pre_bengintime . length ( ) = = 5 ) {
kqTaskBean . setTaskSignTime ( pre_bengintime + ":00" ) ;
} else {
kqTaskBean . setTaskSignTime ( pre_bengintime ) ;
}
kqTaskBean . setSignDate ( signdate ) ;
kqTaskBean . setSignEndDate ( signdate ) ;
kqTaskBean . setTimesource ( "before" ) ;
KQQueue . writeTask ( kqTaskBean ) ;
}
/ * *
* 校 验 是 否 已 经 签 到 过
* @param userid
* @param signtype
* @param curUser
* @param signsections
* @param signSectionBeginTime 下 班 打 卡 允 许 最 早 打 卡 时 间
* @param signSectionEndTime 上 班 打 卡 允 许 最 晚 打 卡 时 间
* @return
* /
public String signedMsg ( String userid , String signtype , User curUser , String [ ] signsections ,
String signSectionBeginTime , String signSectionEndTime ) throws Exception {
String signedMsg = "" ;
RecordSet rs = new RecordSet ( ) ;
boolean hasSigned = false ;
String onSignSectionTime = signsections [ 0 ] ;
String offSignSectionTime = signsections [ 1 ] ;
if ( onSignSectionTime . length ( ) > 0 & & offSignSectionTime . length ( ) > 0 ) {
String hasSign = "select 1 from hrmschedulesign where 1 = 1 and isInCom = '1' and userid = ? " ;
StringBuffer sql = new StringBuffer ( ) ;
if ( rs . getDBType ( ) . equals ( "oracle" ) | | rs . getDBType ( ) . equals ( "postgresql" ) ) {
sql . append ( " AND signDate||' '||signTime>=? " ) ;
sql . append ( " AND signDate||' '||signTime<=? " ) ;
} else if ( rs . getDBType ( ) . equals ( "mysql" ) ) {
sql . append ( " AND concat(signDate,' ',signTime)>=? " ) ;
sql . append ( " AND concat(signDate,' ',signTime)<=? " ) ;
} else {
sql . append ( " AND signDate+' '+signTime>=? " ) ;
sql . append ( " AND signDate+' '+signTime<=? " ) ;
}
hasSign + = sql . toString ( ) ;
rs . executeQuery ( hasSign , userid , onSignSectionTime , offSignSectionTime ) ;
if ( rs . next ( ) ) {
hasSigned = true ;
}
if ( "1" . equalsIgnoreCase ( signtype ) ) {
if ( signSectionBeginTime . length ( ) > 0 | | signSectionEndTime . length ( ) > 0 ) {
} else {
if ( hasSigned ) {
signedMsg = SystemEnv . getHtmlLabelName ( 129706 , curUser . getLanguage ( ) ) ;
}
}
} else if ( "2" . equalsIgnoreCase ( signtype ) ) {
if ( signSectionBeginTime . length ( ) > 0 | | signSectionEndTime . length ( ) > 0 ) {
} else {
if ( ! hasSigned ) {
signedMsg = SystemEnv . getHtmlLabelName ( 501301 , curUser . getLanguage ( ) ) ;
}
}
}
}
return signedMsg ;
}
/ * *
* 在 签 到 签 退 的 时 候 先 根 据 打 卡 数 据
* 粗 步 得 到 打 卡 状 态 正 常 , 迟 到 , 早 退
* @return
* /
public String getSignStatus ( String signType , String datetime , String userid , String workdate ,
LocalDateTime nowDateTime ) {
DateTimeFormatter fullFormatter = DateTimeFormatter . ofPattern ( "yyyy-MM-dd HH:mm:ss" ) ;
String signStatus = "" ;
//签到的话
if ( "1" . equalsIgnoreCase ( signType ) ) {
LocalDateTime startWorkDateTime = LocalDateTime . parse ( datetime , fullFormatter ) ;
//打卡时间比上班时间晚,迟到了
if ( nowDateTime . isAfter ( startWorkDateTime ) ) {
signStatus = ButtonStatusEnum . BELATE . getStatusCode ( ) ;
} else {
signStatus = ButtonStatusEnum . NORMAL . getStatusCode ( ) ;
}
} else if ( "2" . equalsIgnoreCase ( signType ) ) {
LocalDateTime endWorkDateTime = LocalDateTime . parse ( datetime , fullFormatter ) ;
//签退的话
if ( nowDateTime . isBefore ( endWorkDateTime ) ) {
signStatus = ButtonStatusEnum . LEAVEERALY . getStatusCode ( ) ;
} else {
signStatus = ButtonStatusEnum . NORMAL . getStatusCode ( ) ;
}
} else {
writeLog ( user . getLastname ( ) + nowDateTime + ":竟然没有传:" + signType ) ;
return "" ;
}
return signStatus ;
}
@Override
public BizLogContext getLogContext ( ) {
return null ;
}
}