通达OA定时任务-未打卡提醒

  • 背景说明:
    • 思路说明

背景说明:

通达OA自带的考勤功能没有上下班打卡提醒,经常有同事因为忘记打卡而发牢骚,所以编写了一个进行上下班未打卡提醒的功能,通过通达OA的定时任务执行

1.首先在数据库表office_task中配置定时任务

2.数据库表字段说明如下:

序号 列名 数据类型 长度 小数位 标识 主键 外键 允许空 默认值 说明
1 TASK_ID int 11 自增唯一ID
2 TASK_TYPE char 1 0 任务类型(0-间隔执行PHP程序,1-定时执行PHP程序,2-定时执行EXE程序,3-间隔执行EXE程序)
3 INTERVAL int 11 10 执行间隔,单位分钟
4 EXEC_TIME time 执行时间
5 LAST_EXEC datetime 上次执行时间
6 EXEC_FLAG tinyint 3 1 执行标记(0-未执行,1-执行成功,2-执行失败)
7 EXEC_MSG varchar 200 任务执行结果描述
8 TASK_URL varchar 200 任务文件
9 TASK_NAME varchar 200 任务名称
10 TASK_DESC varchar 250 任务详细描述
11 TASK_CODE varchar 20 任务唯一代码
12 USE_FLAG char 1 1 是否启用(1-是,0-否)
13 SYS_TASK char 1 0 是否系统内置任务(1-是,0-否)
14 EXT_DATA text 扩展数据
15 EXCEPTION_LOG tinyint 3 0 执行失败是否记录异常日志(0 不记录,1 记录)

3.然后编写PHP文件,代码如下

include_once 'task/auth.php';
include_once 'inc/utility_all.php';
include_once 'inc/utility_sms1.php';
include_once 'inc/utility_msg.php';
include_once 'inc/workflow/inc/common.inc.php';$SYS_PARA_ARRAY = get_sys_para('NO_DUTY_USER');
$no_duty_user=implode(",",$SYS_PARA_ARRAY);
$no_duty_user=explode(",",$no_duty_user);
foreach($no_duty_user as $value){$str.="'".$value."',";
}
$no_duty_user= substr($str,0,strlen($str)-4);
//1.查询排班表user_duty中当日有班次人员作为循环的依据,查询内容包括姓名、用户ID、考勤班次、班次日期、规定第一次(上班)打卡时间,规定第二次(下班)打卡时间
$sql="select b.user_name,a.id,a.uid,a.duty_type,a.duty_date,c.duty_time1,c.duty_time2 from user_duty a inner join user b on a.uid=b.user_id inner join attend_config c on a.duty_type=c.duty_type where duty_date=date(now()) and user_id not in(select leave_person from hr_staff_leave) and user_id not in(".$no_duty_user.")";
$sql_result=exequery(TD::conn(),$sql);
$cur_time=date('Y-m-d H:i:s', time());if(date("H:i:s")>"08:20:00"){//2.根据查询结果中的人员信息进行循环,检查该人员在attend_duty考勤表中是否有对应班次打卡记录,定时任务以2分钟的间隔运行,程序检测运行时的时间与班次规定打卡时间比对,如果上班时规定时间-当前时间介于360秒与240秒之间并且没有打卡记录则进行提醒
while($ROW=MySQL_fetch_array($sql_result)){//定义当前时间、上班时间、下班时间$duty_time1=$ROW['duty_time1'];$duty_time2=$ROW['duty_time2'];$duty_daytime1=$ROW['duty_date']." ".$duty_time1;$duty_daytime2=$ROW['duty_date']." ".$duty_time2;$user_id=$ROW['uid'];//echo "<br/>";//上班判断:如果当前时间与上班时间间隔在240秒与300秒之间$interval1=strtotime($duty_time1)-strtotime($cur_time);$interval2=strtotime($cur_time)-strtotime($duty_time2);if($interval1 >= 240 && $interval1 <= 300 || $interval1 >= 0 && $interval1 <= 60){//查询该员工打卡记录,查询依据1.duty_time1  2.uid  3.当天  $query="select * from attend_duty where user_id=".$user_id." and duty_time='".$duty_time1."' and date(register_time)=date(now())";$query_result=exequery(TD::conn(),$query);//查询打卡记录if(!$rst=mysql_fetch_array($query_result)){$query_leave="select * from attend_leave where user_id=".$user_id." and '".$duty_daytime1."' between leave_date1 and leave_date2";$leave_result=exequery(TD::conn(),$query_leave);//查询请假记录if(!$rst_leave=mysql_fetch_array($leave_result)){$query_out="select user_id,submit_time from attend_out where user_id=".$user_id." and '".$duty_daytime1."' between submit_time and concat(left(submit_time,11),out_time2,':00')";$out_result=exequery(TD::conn(),$query_out);//查询外出记录if(!$rst_out=mysql_fetch_array($out_result)){$query_evection="select * from attend_evection where user_id=".$user_id." and '".$duty_daytime1."' between evection_date1 and evection_date2";$evection_result=exequery(TD::conn(),$query_evection);//查询出差记录if(!$rst_evection=mysql_fetch_array($evection_result)){$contents='Hi,'.$ROW['user_name'].',您今天'.date('Y-m-d').'上班还未打卡,规定时间'.$duty_time1;send_msg(1, $user_id, 0, $contents, 0, 1);//send_sms('', 'admin', $user_id, '2', $contents, 'sms/remind_center/receive/',1116);}}}}}elseif($interval2>=540 && $interval2<=600 || $interval2>=1800 && $interval2<=1860){//下班判断:如果当前时间与下班时间间隔在420与480秒之间 $query="select * from attend_duty where user_id=".$user_id." and duty_time='".$duty_time2."' and date(register_time)=date(now())";$query_result=exequery(TD::conn(),$query);//查询打卡记录if(!$rst=mysql_fetch_array($query_result)){$query_leave="select * from attend_leave where user_id=".$user_id." and '".$duty_daytime2."' between leave_date1 and leave_date2";$leave_result=exequery(TD::conn(),$query_leave);//查询请假记录if(!$rst_leave=mysql_fetch_array($leave_result)){$query_out="select user_id,submit_time from attend_out where user_id=".$user_id." and '".$duty_daytime2."' between submit_time and concat(left(submit_time,11),out_time2,':00')";$out_result=exequery(TD::conn(),$query_out);//查询外出记录if(!$rst_out=mysql_fetch_array($out_result)){$query_evection="select * from attend_evection where user_id=".$user_id." and '".$duty_daytime2."' between evection_date1 and evection_date2";$evection_result=exequery(TD::conn(),$query_evection);//查询出差记录if(!$rst_evection=mysql_fetch_array($evection_result)){$contents='Hi,'.$ROW['user_name'].',您今天'.date('Y-m-d').'下班还未打卡,规定时间'.$duty_time2;send_msg(1, $user_id, 0, $contents, 0, 1);//send_sms('', 'admin', $user_id, '2', $contents, 'sms/remind_center/receive/',1116);}}}}}
}
}
//send_msg($FROM_UID, $TO_UID_STR, $MSG_TYPE, $CONTENT, $SEND_TIME = 0, $MESSAGE_TYPE = 0)
update_office_task($TASK_ID, '1', date('Y-m-d H:i:s', time()));
echo '+OK';
思路说明
  • 通达OA定时任务有两种,一种是间隔多久执行一次,另外一种是固定时间执行。当前公司内有三个班次,上班时间分别是8:30、8:45、9:00,如果配置定时执行任务的话需要配置三个任务,显然不合适,所以解决使用间隔执行,为保证时间精度,间隔时间一分钟(最低了)。
  • 使用间隔任务时,我希望尽量减少无意义的执行,所以设置了一个从8:20才开始执行的条件。
  • 使用间隔执行,第一个需要解决的问题是如何在任务运行时动态判断与三个上班时间的时间间隔,因为上班时间在查询结果集中的字段名为duty_time1,直接用当前时间与此时间比对得出间隔时间,间隔时间为设定值范围时才进行真正的未打卡人员筛选;而因为任务运行间隔为60秒,所以条件为当前时间与此上班时间差在240秒(4分钟)到300秒(5分钟)之间,这里我多设置了一个一分钟时的提醒时间。
  • 为了方便上下班提醒次数的不同设置及管理,这里我将上班判断与下班判断分开了(其实是因为技术不精)
  • 筛选人员时进行了已经过滤掉了系统里面的免签人员、离职人员
  • $sql="select b.user_name,a.id,a.uid,a.duty_type,a.duty_date,c.duty_time1,c.duty_time2 from user_duty a inner join user b on a.uid=b.user_id inner join attend_config c on a.duty_type=c.duty_type where duty_date=date(now()) and user_id not in(select leave_person from hr_staff_leave) and user_id not in(".$no_duty_user.")";
  • 在设置时间符合后,分别进行了打卡记录查询、请假查询、出差查询、外出查询,这些记录都没有的情况下才进行未打卡提示

通达OA定时任务-未打卡提醒相关推荐

  1. 通达OA 通过程序直接处理手机提醒短信息及事务提醒(图文)

    这几天研究的一个工作流问题,需要通过C#来直接操作数据库来写一个事务提醒,本来OA里使用PHP直接通过一个函数即可完成的问题,这里需要自己来做了. 通过查看数据表的结构,发现OA里将短信息分成2个表来 ...

  2. 通达OA未授权任意文件上传及文件包含导致远程代码执行漏洞

    0x00 前言 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台. 0x01 漏洞简 ...

  3. 通达OA未授权任意文件上传及文件包含漏洞分析学习

    今年3月份通达OA爆出了文件上传和文件包含漏洞,网络上很多复现和分析的博客,今天我也来试着分析分析,据360灵腾安全实验室判断该漏洞等级为高,利用难度低,威胁程度高,所以可能比较适合代码审计的新手来练 ...

  4. 通达+oa+php+文件+乱,通达OA任意文件删除/OA未授权访问+任意文件上传RCE漏洞复现...

    0x00 简介 通达OA采用基于WEB的企业计算,主HTTP服务器采用了世界上最先进的Apache服务器,性能稳定可靠.数据存取集中控制,避免了数据泄漏的可能.提供数据备份工具,保护系统数据安全.多级 ...

  5. 通达OA审批流程添加水印功能,支持预览、办理和打印

    <script type="application/javascript">function watermark(settings) {debugger;//默认设置v ...

  6. 通达OA系统管理员手册(一)

    第三章管理员手册 3.1 安装及卸载 3.1.1 安装步骤 双击执行安装程序,待安装界面出现后,点击"下一步". 用户可以选择安装路径,选择路径后,执行下一步. 图 3.1-1 选 ...

  7. 通达OA使用手册(一)

    第一章引言 1.1 编写目的 本用户使用手册目的是将通达 OA 系统的各类操作和功能加以描述,以指导用户更快速正确的使用本系统.该手册分为以下几个部分:引言.功能介绍.管理员手册.用户手册.OA 精灵 ...

  8. 通达OA二次开发手册

    前 言 Office Anywhere网络智能办公系统(以下简称通达OA),不仅是一套成熟的网络办公系统,同时也是一个完整.精巧的软件开发平台,不仅集成了Web开发的全套环境,并提供了管理架构.系统资 ...

  9. 通达OA用户操作手册(二)

    4.3 业务流程平台 业务流程平台的详细使用介绍,详见<Office Anywhere2017 业务流程平台使用详解>,此处不再赘言. 4.4 工作流 工作流的详细使用介绍见<Off ...

  10. 心通达OA智慧办公系统拥有n个核心功能

    心通达OA智慧办公系统拥有11个核心功能,分别是: 1.门户:系统内置16个门户并可扩展,形成一站式的协同门户,自动将相关信息从各个模块以及异构系统中抽取展现,同时自动与手机门户同步信息. 2.组织: ...

最新文章

  1. 【沟通之道】头脑风暴-女人的心思你别猜
  2. linux使用pyodbc和freetds连接sqlserver
  3. #每日一题:小数第n位(数论/模拟)
  4. python3.8.5依赖的urllib版本_Python(pip)-请求依赖警告:urllib3(1.9.1)或chardet(2.3.0)与受支持的版本不匹配...
  5. Angular ActivatedRouteSnapshot
  6. js文件 import java类_实现JS脚本导入JAVA类包
  7. js 数字,金额 用逗号 隔开。数字格式化
  8. 马云:将为每个非洲国家捐赠2万个检测试剂盒
  9. Java String trim()方法示例
  10. Cmakelists 与gcc 调用so库文件,几个名词解释
  11. bzoj3550: [ONTAK2010]Vacation(单纯形法+线性规划)
  12. 小米盒子 计算机共享,小米盒子如何通过局域网共享安装软件
  13. 807. 区间求和(acwing水题记)
  14. POI导出设置列为文本类型
  15. 猿创征文|Python学习工具千千万,我心中的TOP10
  16. pg比mysql优势_postgresql比mysql有多少优势
  17. mindspore| lenet模型 推理过程记录
  18. 【翻译】LearnYouSomeErlangForGreatGood(一):导言
  19. 大数据可视化分析以及预测性分析方法
  20. 如何在家里制作服务器,在家如何架设服务器?

热门文章

  1. Windows最强ssh客户端 Bitvise SSH Client 与阿里堡垒服务
  2. 永磁同步电机的矢量控制策略(十二)一一一MTPA最大转矩电流比控制
  3. 软件License管理与代码保护技术概述
  4. python攻击校园网_Python--校园网爬虫记
  5. Informatic学习总结_day01
  6. matlab串级控制系统设计,SVPWM在串级调速系统中的MATLAB仿真研究
  7. c语言写马达驱动程序,如何用单片机驱动马达
  8. 静态资源服务器(部署前端项目)
  9. QTreeView三态复选
  10. 竞赛保研(自动化专业)