<?php
//单据提醒设置
class flow_remindClassModel extends flowModel
{
	
	public function flowrsreplace($rs, $lx=0)
	{
		if($rs['status']==0)$rs['ishui']=1;
		if($lx==1){
			$barrs = $this->getstatusarr();
			$zts   = $barrs[$rs['status']];
			$rs['status'] = '<font color="'.$zts[1].'">'.$zts[0].'</font>';
		}
		return $rs;
	}
	
	public function getstatusarr()
	{
		$barr[1] = array('启用','green');
		$barr[0] = array('停用','#888888');
		return $barr;
	}


	//多个连表查询
	public function flowbillwhere($uid, $lx)
	{
		return array(
			'table' 		=> '`[Q]'.$this->mtable.'` a left join `[Q]flow_set` b on a.modenum=b.`num`',
			'fields'		=> 'a.id,a.ratecont,a.startdt,a.enddt,a.status,a.explain,a.recename,a.optname,a.optdt,b.name as modename',
			'orlikefields'	=> 'b.name,a.ratecont',
			'asqom'			=> 'a.'
		);
	}
	

	//获取进入需要提醒内容
	public function getreminddt($dt='',$modenum='')
	{
		if($dt=='')$dt = $this->rock->date;
		$dt		= substr($dt, 0, 10);
		$now 	= $this->rock->now;
		$rows 	= $this->getall("`status`=1 and `startdt`<='$now' and (`enddt` is null or `enddt`>='$now')");
		$dtobj	= c('date');
		$w 		= date('w', strtotime($dt));
		if($w==0)$w = 7;
		$nw 	= 'w'.$w.'';
		$nrows  = array();
		$timestr= '';
		foreach($rows as $k=>$rs){
			$ratea = explode(',', $rs['rate']);
			$rateb = explode(',', $rs['rateval']);
			$len   = count($ratea);
			for($i=0; $i<$len; $i++){
				$timea = $this->getssdt($dt, $nw, $ratea[$i], arrvalue($rateb, $i), $rs['uid'], $rs['startdt']);
				if($timea)foreach($timea as $time){
					if(!contain($timestr, '['.$time.']')){
						$rs['runtime']  = $time;
						$rs['runtimes'] = date('Y-m-d H:i:s',$time);
						$rs['rates'] 	= $ratea[$i]; //频率类型
						$nrows[] = $rs;
						$timestr.='['.$time.']';
					}
				}
			}
		}
		return $nrows;
	}
	
	//判断时间是否可使用
	private function getssdt($dt, $nw, $rate, $valstr, $uid, $startdts)
	{
		$timea  = array();
		$vala	= explode('|', $valstr);
		$val 	= $vala[0];
		$val2 	= arrvalue($vala, 1);
		
		//仅一次
		if($rate=='o' && contain($val, $dt)){
			$timea[] = strtotime($val);
		}
		
		//星期和天
		if($nw==$rate || $rate=='d'){
			$time = ''.$dt.' '.$val.'';
			$timea[] = strtotime($time);
		}
		//每小时
		if($rate=='h'){
			$ksis	= substr($startdts, 11);
			if(isempt($val2))$val2 = '23:59:59';
			$stime  = strtotime(''.$dt.' '.$ksis.'');
			$etime  = strtotime(''.$dt.' '.$val2.'');
			for($i=0;$i<=23;$i++){
				$time = strtotime(''.$dt.' '.$i.':'.$val.'');
				if($stime<=$time && $etime>=$time)$timea[] = $time;
			}
		}
		//每月
		if($rate=='m'){
			$time = ''.substr($dt,0, 8).''.$val.'';
			if(contain($time, $dt))$timea[] = strtotime($time);
		}
		//每年
		if($rate=='y'){
			$time = ''.substr($dt,0, 5).''.$val.'';
			if(contain($time, $dt))$timea[] = strtotime($time);
		}
		
		//工作日,休息日
		if($rate=='g' || $rate=='x'){
			$time = ''.$dt.' '.$val.'';
			$timea[] = strtotime($time);
		}
		
		return $timea;
	}
	
	//时间段读取
	public function getremindtodo($startdt='', $enddt='')
	{
		if($startdt=='')$startdt = $this->rock->now;
		$stime= strtotime($startdt)-10;
		if($enddt=='')$enddt	= date('Y-m-d H:i:s', $stime + 310); //默认是5分钟内提醒
		$dt	  = substr($startdt, 0, 10);
		$rows = $this->getreminddt($startdt);
		
		$etime= strtotime($enddt);
		$sarr = $modearr = array();
		$modenums	= '';
		$kqd		= m('kaoqin');
		foreach($rows as $k=>$rs){
			$rate 	= $rs['rates']; //频率类型
			$bo 	= true;
			if($rs['runtime']>=$stime && $rs['runtime']<=$etime){
				//工作日休息日判断
				if($rate=='g' || $rate=='x'){
					$isw = $kqd->isworkdt($rs['uid'], $dt);
					if($isw==1 && $rate=='x')$bo = false;
					if($isw==0 && $rate=='g')$bo = false;
				}
				if($bo){
					$modenums.=",'".$rs['modenum']."'";
					$sarr[] = $rs;
				}
			}
		}
		//$this->flowtodosettx(8);
		if($modenums=='')return false;
		$modenums	= substr($modenums, 1);
		$modrs 		= m('flow_set')->getall("`num` in ($modenums) and `status`=1");
		foreach($modrs as $k=>$rs)$modearr[$rs['num']] = $rs;
		
		
		$flowtodoid = ''; //单据通知设置ID
		$subscribid = array(); //订阅的
		
		foreach($sarr as $k=>$rs){
			$mid 	= $rs['mid'];
			
			if($rs['modenum']=='flowtodo'){
				$flowtodoid.=','.$mid.'';
				continue;
			}
			$mrs	= arrvalue($modearr, $rs['modenum']);
			if(!$mrs)continue;
			$cont 	= $rs['explain'];
			$GLOBALS['adminid'] = $rs['uid'];
			$receid 	= $rs['uid'];
			$recename 	= $rs['optname'];
			if(!isempt($rs['receid'])){
				$receid  	= 'u'.$receid.','.$rs['receid'].'';
				$recename  .= ','.$rs['recename'].'';
			}
			
			//订阅的
			if($rs['modenum']=='subscribe'){
				$subscribid[] = array(
					'id'	=> $mid,
					'uid'	=> $rs['uid'],
					'receid'=> $receid,
					'recename'=> $recename,
				);
				continue;
			}
			
			$this->pushs($receid, $cont, $mrs['name'], array(
				'id' 		=> $mid,
				'modenum' 	=> $rs['modenum'],
				'modename' 	=> $mrs['name'],
				'moders'	=> $mrs
			));
		}
		
		//单据通知提醒需要另外提醒
		if($flowtodoid !='')$this->flowtodosettx(substr($flowtodoid, 1));
		
		//订阅的处理(建议用异步的)
		if($subscribid){
			if(getconfig('asynsend')){
				
				$reim	= m('reim');
				foreach($subscribid as $subo){
					$GLOBALS['adminid'] = $subo['uid'];
					$reim->asynurl('asynrun','subscribe', array(
						'recename' 	=> $this->rock->jm->base64encode($subo['recename']),
						'receid' 	=> $subo['receid'],
						'id' 		=> $subo['id'],
						'uid'		=> $subo['uid']
					));
				}
			}else{
				//没有异步直接调用
				$subflow = m('flow')->initflow('subscribeinfo');
				foreach($subscribid as $subo){
					$GLOBALS['adminid'] = $subo['uid'];
					$subflow->subscribe($subo['id'],$subo['uid'],$subo['receid'],$subo['recename']);
				}
			}
		}

		return $sarr;
	}
	
	//单据通知设置的，必须有触发条件和选择计划任务
	private function flowtodosettx($tids)
	{
		$rows = $this->db->getall('select a.*,b.num as modenum from `[Q]flow_todo` a left join `[Q]flow_set` b on a.`setid`=b.`id` where a.`id` in('.$tids.') and b.`status`=1 and a.`status`=1 and a.`botask`=1 and a.whereid>0');
		//print_r($rows);
		//有设置了提醒
		foreach($rows as $rk=>$rs){
			
			$modenum 	= $rs['modenum'];
			$flow		= m('flow')->initflow($modenum);
			$flowrows 	= $flow->gettodorows($rs['whereid']);
		
			$tostr 		= '';//提醒的内容
			$todofields	= array();
			if(!isempt($rs['todofields']))$todofields = explode(',', $rs['todofields']);
			$title 		= $rs['name'];
			$sanda		= array();
			
			foreach($flowrows as $k1=>$rs1){
				if($k1>0)$tostr	.= "\n";
				$tostrs  = $this->rock->reparr($rs['summary'], $rs1);
				$tostr	.= $tostrs;
				
				$receid  = $rs['receid']; //接收人
				//提交人
				if($rs['toturn']=='1' && isset($rs1['optid']))$receid = $this->strappend($receid,$rs1['optid']);
				//参与人
				if($rs['tocourse']=='1'){
					$cyrenId	= $this->billmodel->getmou('allcheckid', "`table`='".$flow->mtable."' and `mid`='".$rs1['id']."'");
					$receid = $this->strappend($receid, $cyrenId);
				}
				foreach($todofields as $tfid){
					$tfss = arrvalue($rs1, $tfid);
					if(!isempt($tfss))$receid = $this->strappend($receid, $tfss);
				}
				
				if(!isempt($receid)){
					$receid = $this->adminmodel->gjoins($receid);
					$receida= explode(',', $receid);
					foreach($receida as $ruid)$sanda[$ruid][] = $tostrs;
				}
			}
			
			//相同内容转化
			if($sanda){
				$sendarr	= array();
				foreach($sanda as $uid=>$narr){
					$enstr = '';
					foreach($narr as $k=>$v){
						if($k>0)$enstr.='<br>';
						$enstr.=''.$v.'';
					}
					if($enstr!=''){
						$sendarr[md5($enstr)][] = array(
							'uid' => $uid,
							'cont'=> $enstr
						);
					}
				}
				
				//发送
				foreach($sendarr as $key=>$rowss){
					$uids = '';
					$cont = $rowss[0]['cont'];
					foreach($rowss as $k=>$rsc){
						$uids.=','.$rsc['uid'].'';
					}
					//发送
					if($uids!=''){
						$uids = substr($uids, 1);
						$flow->push($uids, '', $cont, $title);
					}
				}
			}

			
		}
	}
}