Files
xinhu/webmain/model/kqjcmdModel.php
2025-03-31 20:54:32 +08:00

852 lines
22 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
//考勤机管理命令
class kqjcmdClassModel extends Model
{
private $snrs;
private $pinpai = 0;
public function initModel()
{
$this->snobj = m('kqjsn');
$this->kquobj = m('kqjuser');
}
/**
* 命令类型
*/
public function cmdtype($type)
{
$atrr = array(
'config' => '设置配置',
'reboot' => '重启',
'dept' => '上传部门',
'user' => '上传人员',
'deluser' => '删除人员',
'delsuser' => '删除不存在人员',
'getfingerprint' => '获取指纹',
'getheadpic' => '获取头像',
'headpic' => '上传头像',
'advert1' => '设置广告图1',
'advert2' => '设置广告图2',
'advert3' => '设置广告图3',
'deladvert' => '删除广告图',
'getuser' => '获取人员',
'getinfo' => '获取设备信息',
'getclockin' => '获取打卡记录',
'delclockin' => '删除打卡记录',
'getpic' => '获取现场照片',
'delpic' => '删除现场照片',
'fingerprint' => '上传指纹',
);
return arrvalue($atrr, $type, $type);
}
/**
* 发送命令
*/
public function send($snid, $type, $ohter='')
{
$snrs = $this->getsninfo($snid);
if(!$snrs)return returnerror('设备不存在,请添加');
$pinpai = (int)arrvalue($snrs,'pinpai', 0);
$this->pinpai = $pinpai;
if(isempt($snrs['name']))return returnerror('请设置设备名称');
if(isempt($snrs['company']))return returnerror('请设置设备显示公司名称');
$id = 0;
//中控支持命令类型
$zkarr = array('reboot','config','user','dept','getuser','getinfo','deluser','delsuser','getclockin','delclockin');
if($pinpai==1 && !in_array($type, $zkarr))return returnerror('中控考勤机不支持['.$type.'.'.$this->cmdtype($type).']命令发送');
//判断是不是有重复
$arrpda = array('reboot','config','getuser','getinfo','advert');
if(in_array($type, $arrpda)){
$tod = $this->rows("`snid`='$snid' and `atype`='$type' and `status`=0");
if($tod>0)return returnerror('还有['.$this->cmdtype($type).']命令待运行,不能重复发送');
}
//重启
if($type=='reboot'){
$id = $this->savedata($snid, $type, array(
'do' => 'cmd',
'cmd' => 'reboot',
));
}
//获取设备信息
if($type=='getinfo'){
$id = $this->savedata($snid, $type, array(
'do' => 'upload',
'data' => 'info',
));
}
//发送配置信息
if($type=='config'){
$id = $this->savedata($snid, $type, $this->getconfigs($snrs));
}
//部门推送更新
if($type=='dept'){
$id = $this->savedata($snid, $type, $this->depttosn($ohter));
}
//人员推送
if($type=='user'){
$id = $this->savedata($snid, $type, $this->usertosn($ohter));
}
//获取指纹和头像
if($type=='getfingerprint' || $type=='getheadpic'){
$id = $this->savedata($snid, $type, $this->sntofingerhead($ohter, $type));
}
//获取所有人员
if($type=='getuser'){
$data = array('user');
if($pinpai==1)$data = 'user';
$id = $this->savedata($snid, $type, array(
'do' => 'upload',
'data' => $data,
));
}
//设置广告图
if(substr($type,0,6)=='advert'){
$index = substr($type,6);
$path = 'images/kqbanner'.$index.'.jpg';
if(!file_exists($path)){
$id = '广告图片'.$index.'不存在,请在系统目录下添加图片:'.$path.'';
}else{
$id = $this->savedata($snid, $type, array(
'do' => 'update',
'data' => 'advert',
'index' => $index,
'advert'=> base64_encode(file_get_contents($path))
));
}
}
//上传头像
if($type=='headpic'){
$id = $this->uoloadface($snid,$ohter);
}
//删除选中人员
if($type=='deluser'){
$id = $this->savedata($snid, $type, $this->userdeltosn($snid, $ohter));
}
//删除不存在人员
if($type=='delsuser'){
$id = $this->savedata($snid, 'deluser', $this->userdeltosns($snid));
}
//获取打卡记录
if($type=='getclockin' || $type=='getpic' || $type=='delclockin' || $type=='delpic'){
$id = $this->savedata($snid, $type, $this->getsntosyspic($snid, $type,$ohter));
}
//上次指纹,采集就不上传了
if($type=='fingerprint'){
$id = $this->fingerprinttosn($snid, $ohter);
}
if($id==0 || is_string($id))return returnerror('发送失败:'.$id.'');
return returnsuccess(array(
'id' => $id
));
}
//保存命令到数据库
private function savedata($snid, $type, $data)
{
if(is_string($data))return $data;
if(!$data)return 0;
if(!isset($data[0]))$data = array($data);
$id = $this->getrandid();
$others = '';
foreach($data as $k=>$rs){
$data[$k]['id'] = $id+$k;
if($k==0)$others = arrvalue($rs,'others');
unset($data[$k]['others']);
}
$cmd = json_encode($data,256);
$this->insert(array(
'id' => $id,
'snid' => $snid,
'others' => $others, //其他主键ID
'status'=> '0',
'atype' => $type,
'cmd' => $cmd,
'optdt' => $this->rock->now,
));
return $id;
}
private function getrandid()
{
$id = rand(10000,99999999);
if($this->rows($id)>0)$id = $this->getrandid();
return $id;
}
/**
* 获取命令,一次可获取条数
*/
public function getcmd($snid)
{
//10分钟内的
$optdt= date('Y-m-d H:i:s', time()-10*60);
$rows = $this->getall("`snid`='$snid' and `status`=0 and `optdt`>'$optdt'",'*','optdt asc');
$snrs = $this->getsninfo($snid);
if($rows){
$data = $rows[0];
$this->update(array(
'status' => 2,
'qjtime' => $this->rock->now,
), $data['id']);
$cmd = $data['cmd'];
$cmd = str_replace("\n",'', $cmd);
$barr = json_decode($cmd, true);
}else{
//$barr[] = $this->getconfigs($snrs);
$barr = '';
}
$this->snobj->update(array(
'lastdt' => $this->rock->now
), $snid);
return $barr;
}
//配置信息
private function getconfigs($snrs)
{
$name = arrvalue($snrs,'name','信呼云考勤');
$company = arrvalue($snrs,'company','信呼云考勤');
$snid = arrvalue($snrs,'id','0');
if($this->pinpai==1){
$dtarr = explode('.', date('Y.m.d.H.i.s'));
return array(
'id' => 0,
'do' => 'update',
'data' => 'config',
'name' => $name,
'y0' => (int)$dtarr[0],
'm0' => (int)$dtarr[1],
'd0' => (int)$dtarr[2],
'h0' => (int)$dtarr[3],
'i0' => (int)$dtarr[4],
's0' => (int)$dtarr[5],
'systime' => $this->rock->now
);
}
return array(
'id' => 0,
'do' => 'update',
'data' => 'config',
'name' => $name,
'company' => $company,
'companyid' => $snid, //公司ID/设备ID
'max' => 3000, //目前设计最大值
'function' => 65535, //全部功能
'delay' => 20,
'errdelay' => 50,
'interval' => 5,
'timezone' => 'GMT+08:00',
'encrypt' => 0,
'expired' => 0
);
}
/**
* 推送过来的数据
*/
public function postdata($snid, $dstr)
{
$this->rock->debugs($dstr,'postkqj_'.$snid.'_');
$barr = json_decode($dstr, true);
$carr = array();
$uids = $dids = '';
$snrs = $this->getsninfo($snid);
if($barr)foreach($barr as $k=>$rs){
$dtype = arrvalue($rs, 'data'); //数据类型
$carr[]= $rs['id']; //设备上来的ID
//发送的命令返回
if($dtype == 'return'){
$mids = '';
foreach($rs['return'] as $k1=>$rs1){
$mid = arrvalue($rs1,'id'); //我发送时ID
if(isempt($mid))continue;
$result = $rs1['result']; //处理结果
$status = ($result=='0') ? 1 : 3;//
$this->update(array(
'status' => $status,
'cjtime' => $this->rock->now,
),'`id`='.$mid.'');
$mids.=','.$mid.'';
}
if($mids!=''){
$mids = substr($mids, 1);
$this->returnchuli($mids, $snid); //返回处理
}
}
//推送过来的人员信息
if($dtype=='user' && isset($rs['deptid'])){
$uids .= ','.$rs['ccid'].'';
$dids .= ','.$rs['deptid'].'';
}
//推送来的指纹
if($dtype=='fingerprint'){
$this->savefingerprint($snid, $rs['ccid'], $rs['fingerprint']);
}
//推送来的头像
if($dtype=='headpic'){
$this->saveheadpic($snid, $rs['ccid'], $rs['headpic']);
}
//解除绑定(解除绑定会清空设备上所有数据,包括设备上待发送的命令)
if($dtype=='unbound'){
$this->cleardatasn($snid);
}
//打卡记录
if($dtype=='clockin'){
$this->adddkjl($snid, $rs);
}
//推送来的设备信息
if($dtype=='info'){
$this->setsnconfig($snid, $rs);
}
}
//保存用户
if($uids!='')$this->saveuseriddids(substr($uids, 1), substr($dids, 1), $snid);
return $carr;
}
//上传完成回调处理
public function returnchuli($mids, $snid)
{
$clarr = $this->getall("`id` in($mids) and `status`=1");//处理成功的
$detpids= $userids= $useridsdel = '';
foreach($clarr as $k=>$rs){
$others = $rs['others'];
if(isempt($others))continue;//不需要处理
$atype = $rs['atype'];
//部门说明设备已
if($atype=='dept'){
$detpids.=','.$others.'';
}
//人员
if($atype=='user'){
$userids.=','.$others.'';
}
//上传头像成功
if($atype=='headpic'){
$uid = (int)$others;
$face= $this->db->getmou('[Q]admin','face','`id`='.$uid.'');
$this->saveheadpic($snid, $uid, '', $face); //设置设备头像
}
//删除人员成功
if($atype=='deluser'){
$useridsdel.=','.$others.'';
}
//指纹上传成功
if($atype=='fingerprint'){
$cmdarr = json_decode($rs['cmd'], true);
$cnsrs = $cmdarr[0];
$this->savefingerprint($snid, $cnsrs['ccid'], $cnsrs['fingerprint']); //保存指纹
}
}
//部门
if(!isempt($detpids)){
$this->addupstr($snid, substr($detpids, 1), 'deptids');
}
//人员的,说明设备上有哪些人员
if(!isempt($userids)){
$this->addupstr($snid, substr($userids, 1), 'userids');
}
//删除人员
if(!isempt($useridsdel)){
$this->delupstr($snid, substr($useridsdel, 1), 'userids');
}
}
//清除设备上所有信息
private function cleardatasn($snid)
{
m('kqjuser')->delete('`snid`='.$snid.'');//删除数据
m('kqjcmd')->delete('`snid`='.$snid.''); //删除命令
$this->snobj->update(array(
'userids' => '',
'deptids' => '',
), $snid);
}
//添加打卡记录$rs = {time,ccid,pic,verify}
private $uinfoarr = array();
public function adddkjl($snid, $rs, $type=1, $ddbs=null, $iszk=0)
{
$dkdt = $rs['time'];
$uid = $rs['ccid']; //用户ID
//是中控考勤机来的
if($iszk==1){
if(isset($this->uinfoarr[$uid])){
$uid = $this->uinfoarr[$uid];
}else{
$unfo = $this->db->getone('[Q]userinfo',"`finger`='$uid'");
if($unfo){
$this->uinfoarr[$uid] = $unfo['id'];
$uid = $unfo['id'];
}else{
$this->uinfoarr[$uid] = $uid;
}
}
}
$pic = arrvalue($rs,'pic'); //现成照片
$sntype = $rs['verify'];//打卡方式
$where = "`uid`='$uid' and `dkdt`='$dkdt' and `type`='$type'";
if($ddbs==null)$ddbs = m('kqdkjl');
$to = $ddbs->rows($where);
$datype = array('密码','指纹','刷卡');
$uarr['sntype'] = $sntype;
$uarr['snid'] = $snid;
$uarr['optdt'] = $this->rock->now;
$uarr['explain'] = '在['.$this->snrs['name'].']使用('.arrvalue($datype, $sntype).')打卡';
if($to==0){
$uarr['type'] = $type;
$uarr['uid'] = $uid;
$uarr['dkdt'] = $dkdt;
$where = '';
}
if(!isempt($pic)){
$imgpath = ''.UPDIR.'/'.date('Y-m').'/'.$uid.'_'.strtotime($dkdt).'.jpg';
$this->rock->createtxt($imgpath, base64_decode($pic));
$uarr['imgpath'] = $imgpath;
}
$ddbs->record($uarr, $where);
$dkdta = explode(' ', $dkdt);
$fenxiarr[''.$dkdta[0].'|'.$uid] = $uid;
return $fenxiarr;
}
//保存设备用户
private function saveuseriddids($userids, $dids, $snid)
{
$darrs = $this->depttosn($dids);
$deptids = $darrs['others'];
$this->snobj->update(array(
'userids' => $userids,
'deptids' => $deptids,
), $snid);
}
//保存指纹
public function savefingerprint($snid, $uid, $finge)
{
$snid = (int)$snid;
$uid = (int)$uid;
$where = "`snid`='$snid' and `uid`='$uid'";
$arr['fingerprint1'] = str_replace("\n",'', arrvalue($finge, 0));
$arr['fingerprint2'] = str_replace("\n",'', arrvalue($finge, 1));
//if(isempt($arr['fingerprint1']) && isempt($arr['fingerprint2']))return;
if($this->kquobj->rows($where)==0){
$where = '';
$arr['snid'] = $snid;
$arr['uid'] = $uid;
}
$this->kquobj->record($arr, $where);
}
//保存设备头像
private function saveheadpic($snid, $uid, $headpic, $face='')
{
$snid = (int)$snid;
$uid = (int)$uid;
$where = "`snid`='$snid' and `uid`='$uid'";
if(isempt($face)){
if(isempt($headpic))return;
$face = ''.UPDIR.'/face/kqj'.$snid.'_u'.$uid.'.jpg'; //头像保存为图片
$this->rock->createtxt($face, base64_decode($headpic));
}
$arr['headpic'] = $face;
if($this->kquobj->rows($where)==0){
$where = '';
$arr['snid'] = $snid;
$arr['uid'] = $uid;
}
$this->kquobj->record($arr, $where);
}
//获取设备信息
public function getsninfo($id)
{
$snrs = $this->db->getone('`[Q]kqjsn`','`id`='.$id.'');
$this->snrs = $snrs;//当前设备信息
return $snrs;
}
//设置设备信息
private function setsnconfig($snid, $rs)
{
$uarr['model'] = arrvalue($rs,'model');
$uarr['appver'] = $rs['app'];
$uarr['romver'] = $rs['rom'];
$uarr['space'] = $rs['space'];
$uarr['memory'] = $rs['memory'];
$uarr['usershu'] = $rs['user'];
$uarr['fingerprintshu'] = $rs['fingerprint'];
$uarr['headpicshu'] = $rs['headpic'];
$uarr['clockinshu'] = $rs['clockin'];
$uarr['picshu'] = $rs['pic'];
$this->snobj->update($uarr, $snid);
}
private function delupstr($snid, $dstr, $fields)
{
$this->kquobj->delete('`snid`='.$snid.' and `uid` in('.$dstr.')');
$snrs = $this->getsninfo($snid);
$odeptid = $snrs[$fields];
if(isempt($odeptid))return;
$dstr = ','.$dstr.','; //要删除的
$depta = explode(',', $odeptid);
$dids = array(); //最后Id
foreach($depta as $dis1){
if(!contain($dstr,','.$dis1.','))$dids[] = $dis1;
}
$ids = join(',', $dids);
$this->snobj->update("`$fields`='$ids'", $snid);
}
//更新添加记录
private function addupstr($snid, $strss, $fields)
{
$snrs = $this->getsninfo($snid);
$odeptid = $snrs[$fields];
if(isempt($odeptid))$odeptid = '';
if(!isempt($odeptid))$odeptid.=',';
$odeptid.=''.$strss.''; //最新的
$depta = explode(',', $odeptid);
$dids = array(); //最后Id
foreach($depta as $dis1){
if(!in_array($dis1, $dids))$dids[] = $dis1;
}
$ids = join(',', $dids);
$this->snobj->update("`$fields`='$ids'", $snid);
}
/**
* 部门推送更新
*/
private function depttosn($deptids)
{
if(isempt($deptids))return 0;
$dids = '';
$deptida = explode(',', $deptids);
foreach($deptida as $did){
$didsss = $this->db->getpval('[Q]dept', 'pid', 'id', $did,','); //获取路径
if(!isempt($didsss))$dids.=','.$didsss.'';
}
if($dids=='')return 0;
$dids = substr($dids, 1);
$drows= $this->db->getall('select * from `[Q]dept` where `id` in('.$dids.')');
$deptarr = array();
$ids = '';
foreach($drows as $k=>$rs){
$deptarr[] = array(
'id' => $rs['id'],
'name' => $rs['name'],
'pid' => $rs['pid'],
);
$ids.=','.$rs['id'].'';
}
$data['do'] = 'update';
$data['data'] = 'dept';
$data['dept'] = $deptarr;
$data['others'] = substr($ids, 1); //部门id
return $data;
}
//人员上传
private function usertosn($uids)
{
//$uarr = m('admin')->getall('id in('.$uids.') and `status`=1');
$uarr = $this->db->getall('select a.*,b.`finger` from `[Q]admin` a left join `[Q]userinfo` b on a.`id`=b.`id` where a.`id` in('.$uids.') and a.`status`=1');
if(!$uarr)return 0;
$data = array();
$ids = '';
$dids = '';
$deptids= ','.arrvalue($this->snrs,'deptids').',';
foreach($uarr as $k=>$rs){
$data[] = array(
'do' => 'update',
'data' => 'user',
'ccid' => $rs['id'],
'finger' => $this->rock->repempt($rs['finger']),
'name' => $rs['name'],
'passwd'=> $rs['pass'], // 密码
'card' => $rs['user'],
'deptid' => $rs['deptid'],
'auth' => 0, //刷卡卡号
'faceexist' => 0, //是否有人脸0 没有1 有(暂无用,预留字段)
);
$ids.=','.$rs['id'].'';
if(!contain($deptids,','.$rs['deptid'].',')){
$dids.=','.$rs['deptid'].'';
}
}
$data[0]['others'] = substr($ids, 1); //人员ID
//同时也要上传部门ID
if($dids!=''){
$dids = substr($dids, 1);
$this->savedata($this->snrs['id'], 'dept', $this->depttosn($dids));
}
return $data;
}
//设备上获取指纹和头像
private function sntofingerhead($uids, $type)
{
$uarr = $this->userinsn($uids);
if(is_string($uarr))return $uarr;
$ccid = array();
foreach($uarr as $k=>$rs){
$ccid[] = $rs['id'];
}
$data = array(
'do' => 'upload',
'data' => array(substr($type,3)),
'ccid' => $ccid,
'others' => join(',', $ccid)
);
if($this->pinpai==1){
$data['data'] = $data['data'][0];
$data['ccid'] = $data['others'];
}
return $data;
}
//判断人员是否在设备上
private function userinsn($uids)
{
$userids = arrvalue($this->snrs,'userids');
if(isempt($userids))return '设备上没有人员';
$uarr = m('admin')->getall('id in('.$uids.') and `id` in('.$userids.')');
if(!$uarr)return '没有选中人员没在此设备上';
return $uarr;
}
//上传头像
private function uoloadface($snid, $uids)
{
$uarr = $this->userinsn($uids);
if(is_string($uarr))return $uarr;
foreach($uarr as $k=>$rs){
$face = $rs['face'];
if(!isempt($face) && file_exists($face)){
$data['do'] = 'update';
$data['data'] = 'headpic';
$data['ccid'] = $rs['id'];
$data['others'] = $rs['id'];
$data['headpic']= base64_encode(file_get_contents($face));
$this->savedata($snid, 'headpic', $data);
}
}
return 1;
}
//删除选中的人员
private function userdeltosn($snid, $uids)
{
$uarr = $this->userinsn($uids);
if(is_string($uarr))return $uarr;
$ccid = array();
foreach($uarr as $k=>$rs){
$ccid[] = $rs['id'];
}
$data = array(
'do' => 'delete',
'data' => array("user","fingerprint","face","headpic","clockin","pic"), //删除全部
'ccid' => $ccid,
'others' => join(',', $ccid)
);
//中控
if($this->pinpai==1){
$data['data'] = 'deluser';
$data['ccid'] = join(',', $ccid);
}
return $data;
}
//删除不存在的
private function userdeltosns($snid)
{
$ccid = $this->getnosys($snid);
if(!$ccid)return '没有可删除的人员';
$data = array(
'do' => 'delete',
'data' => array("user","fingerprint","face","headpic","clockin","pic"), //删除全部
'ccid' => $ccid,
'others' => join(',', $ccid)
);
//中控
if($this->pinpai==1){
$data['data'] = 'deluser';
$data['ccid'] = join(',', $ccid);
}
return $data;
}
//对应设备显示显示离职人员等信息
public function getnosys($snid)
{
$snrs = $this->getsninfo($snid);
$userids = $snrs['userids'];
if(isempt($userids))return array();
$uarr = m('admin')->getall('`status`=1');
$ccid = array();
foreach($uarr as $k=>$rs){
$ccid[] = $rs['id'];
}
$useridsa = explode(',', $userids);
$nuco = array();//不存在
foreach($useridsa as $adis){
if(!in_array($adis, $ccid))$nuco[] = $adis;
}
return $nuco;
}
//获取打卡记录
private function getsntosyspic($snid, $type, $uids)
{
$startdt = $this->rock->post('startdt', $this->rock->date);
$endddt = $this->rock->post('endddt', $this->rock->date);
if($endddt<$startdt)return '获取开始日期不能大于截止日期';
$userids = arrvalue($this->snrs,'userids');
if(isempt($userids))return '设备上没有人员';
$ccid = array();
if($uids!='0'){
$uarr = m('admin')->getall('`id` in('.$userids.') and `id` in('.$uids.')');
if(!$uarr)return '没有选中人员没在此设备上';
$ccid = array();
foreach($uarr as $k=>$rs){
$ccid[] = $rs['id'];
}
}
//删除
if($type=='delclockin' || $type=='delpic'){
$data['do'] = 'delete';
$data['data'] = array(substr($type, 3));
}else{
$data['do'] = 'upload';
$data['data'] = array('clockin');
if($type=='getpic')$data['data'][]= 'pic';//要照片
}
if($ccid){
$data['ccid'] = $ccid;
$data['others'] = join(',', $ccid);
}
$data['from'] = ''.$startdt.' 00:00:00';
$data['to'] = ''.$endddt.' 23:59:59';
if($this->pinpai==1){
$data['data'] = $data['data'][0];
$data['ccid'] = join(',', $ccid);
}
return $data;
}
//上传指纹
public function fingerprinttosn($snid, $uids)
{
$uarr = $this->userinsn($uids);
if(is_string($uarr))return $uarr;
$ccid = array();
$ubo = 0;
foreach($uarr as $k=>$rs){
$uid = $rs['id'];
$zwra = $this->kquobj->getone('snid='.$snid.' and `uid`='.$uid.'');
$fingerprint1 = arrvalue($zwra,'fingerprint1');
$fingerprint2 = arrvalue($zwra,'fingerprint2');
$uobo = false;
//找找别的设备有没有指纹
if(isempt($fingerprint1)){
$fingerprint1s = $this->kquobj->getmou('fingerprint1',"`uid`='$uid' and ifnull(`fingerprint1`,'')<>''");
if(!isempt($fingerprint1s)){
$fingerprint1 = $fingerprint1s;
$uobo = true;
}
}
if(isempt($fingerprint2)){
$fingerprint2s = $this->kquobj->getmou('fingerprint2',"`uid`='$uid' and ifnull(`fingerprint2`,'')<>''");
if(!isempt($fingerprint2s)){
$fingerprint2 = $fingerprint2s;
$uobo = true;
}
}
if($uobo){
$ubo++;
$data['do'] = 'update';
$data['data'] = 'fingerprint';
$data['ccid'] = $uid;
$data['others'] = $uid;
$data['fingerprint'] = array($fingerprint1, $fingerprint2);
$this->savedata($snid, 'fingerprint', $data);
}
}
if($ubo==0)$ubo = '没有可上传的指纹';
return $ubo;
}
}