<?php
require_once dirname(__FILE__).'/attendance_define.php';
/**
* 寻找适用的考勤时间段[多个]
* @param {timestamp} $signDateTime 指定时间戳
* @param {boolean} $output 是否输出结果到页面
* @param {string} $userId 用户编号
* @param {array} $groupCodes 群组的编号列表
* @param {string} $entCode 企业编号
* @return {boolean|array} false=执行失败,array=考勤时间段列表
*/
function findActionRuleTimes($signDateTime, $output, $userId, $groupCodes, $entCode) {
//声明引用外部变量
global $WEEK_VALUES;
$instance = AttendSettingService::get_instance();
//查找相适应的考勤设置
$settings = $instance->getAttendSettings($userId, $groupCodes, $entCode);
if ($settings===false) {
$errMsg = "getAttendSettings error";
ResultHandle::errorToJsonAndOutput($errMsg, $errMsg, $output);
return false;
}
if (count($settings)>0) {
$entity = $settings[0];
log_info('found att_set_id='.$entity['att_set_id'].', setting_name='.$entity['name'].', target_type='.$entity['target_type'].', target_id='.$entity['target_id']);
//查找相应的考勤规则
$weekDayValue = $WEEK_VALUES[date('w', $signDateTime)];
$times = $instance->getAttendRuleTimes($entity['att_set_id'], $weekDayValue);
if (is_bool($times)) {
$errMsg = "getAttendRuleTimes error";
ResultHandle::errorToJsonAndOutput($errMsg, $errMsg, $output);
return false;
}
return $times;
} else { //没有考勤设置,视为假期
log_info("no attend setting, it's holiday for userId=$userId");
return array();
//return generateHolidayAttendRuleTimeRec();
}
}
/**
* 在指定时刻下,尝试分析出一个适用考勤时间段
* @param {timestamp} $signDateTime 指定时间戳
* @param {boolean} $output 是否输出结果到页面
* @param {array} $times 时间段列表
* @param {int} $actionType 考勤操作:1=签到,2=签退
* @param {boolean} $signCheckMiddleTime 是否使用时间段中间作为参考
* @param {boolean} $controlAction 是否控制"签到"、"签退"
* @return {boolean|array} false=执行失败,array(关联数组,元素实际表示一个对象的各字段)=一个可执行的考勤时间段记录
*/
function analyzeAttendTimesWithActionType($signDateTime, $output, $times, $actionType, $signCheckMiddleTime, $controlAction) {
$errMsg = ($actionType==1?"sign in":"sign out")." error";
$toSignDate = date('Y-m-d', $signDateTime);
$toSignTime = date('H:i:s', $signDateTime);
$matchedTimeRec; //保存已匹配的时间段记录
$lastTimeRec; //暂存上一条时间段记录
$lastMiddleTime; //暂存上一条记录时间段的中间
$lastSignoutTime; //暂存上一条记录的签退时间
//遍历查找最迟的适用时间段
foreach ($times as $timeRec) {
//log_debug($timeRec);
$signinTimeStr = $timeRec['signin_time'];
$signoutTimeStr = $timeRec['signout_time'];
$signinTime = strtotime($toSignDate.' '.$signinTimeStr);
$signoutTime = strtotime($toSignDate.' '.$signoutTimeStr);
$diff = $signoutTime - $signinTime;
//两个时间的一半
$middleTime = $signinTime + $diff/2;
$middleTimeStr = date('Y-m-d H:i:s', $middleTime);
log_debug("actionType=$actionType, toSignTime=$toSignTime, signinTimeStr=$signinTimeStr, middleTimeStr=$middleTimeStr, signoutTimeStr=$signoutTimeStr");
//允许签到:当前时间小于[签到时间与签退时间的一半]
//允许签退:当前时间大于等于[签到时间与签退时间的一半],并且小于下一个考勤时间段(或第二天)
//======== 签退 =======
if (ACTION_TYPE_SIGN_OUT==$actionType) {
if (!empty($matchedTimeRec)) {
if ($signDateTime<$signinTime) { //签退操作不得晚于下一个时间段
log_debug("match signout time before next signinTime $signinTimeStr");
break;
} else if ($signCheckMiddleTime && $signDateTime<$middleTime) { //签退时间未到[签到时间与签退时间的一半],并且已进入下一个时间段,不允许签退
log_debug("not arrive signout time $middleTimeStr");
unset($matchedTimeRec);
break;
}
}
if (($signCheckMiddleTime && $signDateTime>=$middleTime) || (!$signCheckMiddleTime && $signDateTime>$signinTime)) {
$matchedTimeRec = $timeRec;
}
}
//======== 签到 =======
if (ACTION_TYPE_SIGN_IN==$actionType) {
if (($signCheckMiddleTime && $signDateTime<$middleTime) || (!$signCheckMiddleTime && $signDateTime<$signoutTime)) {
$matchedTimeRec = $timeRec;
}
//签到时间小于上一个时间段的签退时间,不允许签到
if (!empty($lastTimeRec) && !empty($matchedTimeRec)) {
//$lastSignoutTimeStr = $nowDate.' '.$lastTimeRec['signout_time'];
if ($signDateTime <= $lastSignoutTime) {
$lastSignoutTimeStr = date('Y-m-d H:i:s', $lastSignoutTime);
log_debug("not pass last signout time $lastSignoutTimeStr, use last record");
$matchedTimeRec = $lastTimeRec;
//继续判断$lastTimeRec是否受$signCheckMiddleTime限制,是否在合法的签到时间
if (($signCheckMiddleTime && $signDateTime>=$lastMiddleTime) || (!$signCheckMiddleTime && $signDateTime>=$lastSignoutTime)) {
unset($matchedTimeRec);
log_debug("last record is not matched for sign in, signCheckMiddleTime=$signCheckMiddleTime");
}
}
break;
}
}
$lastTimeRec = $timeRec;
$lastMiddleTime = $middleTime;
$lastSignoutTime = $signoutTime;
}
if (!empty($matchedTimeRec)) {
return $matchedTimeRec;
} else { //没有可用时间段
if ($controlAction) { //禁止"签到"、"签退"
ResultHandle::errorToJsonAndOutput($errMsg, "no matched attend time", $output
, ACTION_TYPE_SIGN_IN==$actionType?EBStateCode::$EB_STATE_DISABLE_SIGN_IN:EBStateCode::$EB_STATE_DISABLE_SIGN_OUT);
return false;
} else { //不禁止,由调用方决定下一步
return null;
}
}
}
/**
* 产生假期考勤规则记录
*/
function generateHolidayAttendRuleTimeRec() {
return array('holiday'=>true, 'att_rul_id'=>'0', 'att_tim_id'=>'0');
/*
if ($holiday) {
$matchedTimeRec = array('holiday'=>true, 'att_rul_id'=>'0', 'att_tim_id'=>'0');
} else {
$weekNum = intval(date('w', $date));
//周一至周五是工作日
$holiday = true;
if ($weekNum>0 && $weekNum<6)
$holiday = false;
$matchedTimeRec = array('holiday'=>false, 'att_rul_id'=>'0', 'att_tim_id'=>'0'
, 'name'=>'默认考勤规则', 'signin_time'=>'09:00:00', 'signin_ignore'=>'0', 'signout_time'=>'18:00:00', 'signout_ignore'=>'0'
, 'work_day'=>'31', 'att_tim_id1'=>'0', 'att_tim_id2'=>'0', 'att_tim_id3'=>'0', 'att_tim_id4'=>'0', 'flexible_work'=>'0', 'flag'=>'0'
);
}
return $matchedTimeRec;*/
}
/**
* 执行签到/签退操作
* @param {timestamp} $signDateTime 指定时间戳
* @param {boolean} $output 是否输出结果到页面
* @param {int} $actionType 考勤操作:1=签到,2=签退
* @param {array} $matchedTimeRec 一个可执行的考勤时间段记录(关联数组,元素实际表示一个对象的各字段)
* @param {string} $userId 用户编号
* @param {string} $userName 用户名称
* @param {string} $groupCode 群组编号(暂保留,填NULL)
* @param {string} $entCode 企业编号
* @param boolean 执行结果
*/
function executeSignInOutAction($signDateTime, $output, $actionType, $matchedTimeRec, $userId, $userName, $groupCode, $entCode) {
$errMsg = ($actionType==ACTION_TYPE_SIGN_IN?"sign in":"sign out")." error";
$signDate = date('Y-m-d', $signDateTime);
$instance = AttendRecordService::get_instance();
//!!!==注意使用假期类型的$matchedTimeRec,缺少某些字段==!!!
//假期判断 if(!empty($matchedTimeRec['holiday']))
//假期按加班进行签到(签退)
$attRuleId = $matchedTimeRec['att_rul_id'];
$attTimId = $matchedTimeRec['att_tim_id'];
//获取假期签到、签退的记录列表
$records = $instance->getAttendRecord($entCode, null, $userId, $signDate, 0, 0);
if (is_bool($records)) {
ResultHandl
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
企业协同办公平台EntboostTW (442个子文件)
bootstrap.css 145KB
bootstrap.min.css 121KB
jquery.mCustomScrollbar.css 52KB
ebtw.css 42KB
font-awesome.css 32KB
font-awesome.min.css 27KB
bootstrap-theme.css 25KB
jquery-ui-1.10.4.min.css 25KB
bootstrap-theme.min.css 24KB
select2.css 17KB
ebtw2.css 16KB
select2.min.css 15KB
bootstrap-datetimepicker.css 12KB
layer.css 11KB
bootstrap-datetimepicker.min.css 11KB
ebtw3.css 9KB
jquery-ui-slider-pips-1.11.3.css 9KB
datepicker.css 5KB
datepicker.css 5KB
datepicker.css 4KB
datepicker.css 3KB
jquery.dtGrid.css 3KB
layer.ext.css 3KB
jquery.dtGrid.min.css 3KB
zoom.css 2KB
WdatePicker.css 149B
WdatePicker.css 27B
fontawesome-webfont.eot 69KB
glyphicons-halflings-regular.eot 20KB
loading.gif 7KB
loading-0.gif 6KB
loading-2.gif 2KB
loading-1.gif 2KB
loading2.gif 2KB
animated-overlay.gif 2KB
img.gif 2KB
img.gif 2KB
img.gif 2KB
img.gif 2KB
datePicker.gif 1KB
datePicker.gif 1KB
bg.jpg 307B
bg.jpg 307B
jquery-ui-1.10.4.min.js 223KB
select2.full.js 154KB
jquery.dtGrid.js 143KB
select2.js 135KB
ptr.js 130KB
jquery-1.9.1.min.js 90KB
ebtw.js 76KB
select2.full.min.js 72KB
bootstrap.js 68KB
select2.min.js 63KB
bootstrap-datetimepicker.js 58KB
jquery.form.js 43KB
bootstrap-datetimepicker.min.js 42KB
ptr2.js 42KB
jquery.mCustomScrollbar.min.js 38KB
bootstrap.min.js 36KB
load_grid.js 26KB
processor.js 26KB
attendance.js 25KB
jquery-ui-slider-pips-1.11.3.js 24KB
date_algorithm.js 22KB
calendar.js 21KB
json2.js 18KB
json2.js 17KB
layer.js 15KB
eb_restapi.js 12KB
calendar_algorithm.js 10KB
json_parse.js 10KB
respond.js 10KB
prepare_plan_grid_data.js 9KB
common.js 9KB
WdatePicker.js 9KB
zh-cn.js 8KB
zh-tw.js 8KB
configure.js 8KB
en.js 8KB
base64.js 6KB
ajaxfileupload.js 6KB
jquery.browser.js 6KB
bootstrap-hover-dropdown.js 5KB
prepare_task_grid_data.js 5KB
domainCtrl.js 5KB
prepare_attendance_approval_grid_data8.js 5KB
layer.ext.js 5KB
prepare_attendance_approval_grid_data7.js 4KB
zoom.min.js 4KB
prepare_attendance_approval_grid_data6.js 4KB
ifrMessenger.js 4KB
prepare_attendance_approval_grid_data.js 3KB
EventHandle.js 3KB
prepare_attendance_approval_grid_data4.js 3KB
imGlobal.js 3KB
jquery.mousewheel-3.1.13.min.js 3KB
jquery.browser.min.js 3KB
html5shiv.js 2KB
ptr_dictionary.js 2KB
laytpl.js 2KB
共 442 条
- 1
- 2
- 3
- 4
- 5
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6804
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功