基于微信的考勤系统

2015-05-08 11:22

功能设计

分两块,一块是固定场所,不同人员,不同部门弹性工作时间考勤,一块是外勤管理系统

固定场所考勤

可以设置不同部门,不同人员,不同的考勤时间,弹性时间,不同考勤地点等

设置考勤时间

image

设置考勤规则,对不同的人部门,设不同的考勤地点与时间

image

设置考勤时间

image

设置企业号菜单

image

外勤人员管理系统

利用企业号点击上传地理位置与5秒上传一次地理位置的功能,实现对外勤人员的严格管理。

设置外勤规则

image
外勤管理跟据需求不同,需要不同的设置,比如像我现在的需求,要统计外勤人员每天签到过的地点统计报表。没出外勤计划与时间限制,只需要员工在需要签到的地点上报位置。

实现办法

前后端使用框架

  • 前端使用angularjs+bootstrap制作微信菜单对应的界面与后台配置管理统计界面
  • 后端使用nodejs的企业号接口程序对接微信平台,提供通信录,取地理位置,取照片等能力。使用mongodb存储数据。
  • 整个前后端都布署在BAE,或者SAE云应用上,也可以布署到国外比较快的云应用上,好处是域名不用备案。 ###使用微信企业号接口 基于微信考勤前提需要将用户的微信号跟员工的工号绑定。

企业只要拥有员工的手机号(绑定了微信)、邮箱(绑定了微信)或者微信号先加入通信录,然后在企业号的管理端将关注邀请发送到员工的微信上,员工只要同意即可完成关注。

考勤功能基于微信公共平台的高级接口,有两种方式实现考勤。

A、基于生成带参数二维码接口:

思路:创建临时二维码,设置有效期一分钟。员工用微信扫描后,通过公共平台将扫描的时间写入考勤系统;

1、创建临时ticket

/**
 * 临时Ticket
 */
static public function getTmpTicket($expire_seconds,$scene_id){
    $access_token = WXUtil::getAccessToken();
    $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" . $access_token;
    $arr = array (
            'action_name' => 'QR_SCENE',
            'expire_seconds'=>$expire_seconds,//有效期
            'action_info' => array (
                    'scene' => array (
                            'scene_id' => $scene_id,
                    )
            )
    );
    $json = WXUtil::cPost($arr, $url);
    $arr = json_decode($json,true);
    if($arr['errcode']){
        file_put_contents('log', $arr['errcode'].$arr['errmsg']);
        return false;
    }
    return $arr['ticket'];
}

2、得到临时二维码

/**
 * 临时Code
 */
static public function getTmpCode($expire_seconds,$scene_id){
    if($ticket = self::getTmpTicket($expire_seconds,$scene_id)){
        $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".$ticket;
        header("location:".$url);
    }else{
        echo 'fail';
    }
}

3、用户通过网络得到二维码,用手机扫描,从而考勤。

4、注意:要限制用户在特定地点才能得到二维码。

B、基于获取用户地理位置接口和百度地度接口

思路:用户打开公共号,微信会自动上传用户地理位置的经纬度,后台再用户的位置跟公司的位置对比,差距在有效范围内,则打卡成功。

1、开启获取用户地理位置接口

2、后台接收用户的位置信息

$postObj = simplexml_load_string ( $postStr, 'SimpleXMLElement', LIBXML_NOCDATA );
$Event = $postObj->Event;
if ($Event == 'LOCATION'){
            /**/
  $Location_X = $postObj->Latitude;
  $Location_Y = $postObj->Longitude;
  $Label = $postObj->Precision;
  $p1 = array($Location_Y,$Location_X);                                                   

}

//取得公司的经纬度:$p2 = array();

3、计算员工位置与公司位置的距离

    static public function getDistance($p1, $p2,$iphone = false) {//$p1:array:员工的经纬度,$p2:array:公司的经纬度

    $code_type = $iphone?'wgs84':'bd09ll';

    $p1 = implode ( $p1, ',' );
    $p2 = implode ( $p2, ',' );
    $p1 = trim ( $p1, ',' );
    $p2 = trim ( $p2, ',' );
    $url = "http://api.map.baidu.com/telematics/v3/distance?ak=E79adeedb7d81865f0671b92b0f0602b";//百度计算距离
    $url .= "&waypoints=" . $p1 . ";" . $p2;
    $url .= "&output=json";
    $url .= "&coord_type=".$code_type;
    $res = file_get_contents ( $url );
    $arr = json_decode ( $res,true );
    return $arr ['results'][0];
}

4、如果两点距离小于1公里,则打卡成功