<?php
namespace model\doctor;
/**
 * Class blood
 * @package model
 */
class person extends \model
{
	public function __construct()
    {
		parent::__construct();
	}
	
	public function getUserRow($uesrid)
	{
	   $row = $this->db->get('gsp_adm_user','*',['au_id'=>$uesrid]);
	   unset($row['au_pass']);
	   return $row;
	}
	
	public function getReportRows($uesrid)
	{
	   $rows = $this->db->select('dt_report','*',['r_au_id'=>$uesrid,'ORDER'=>['r_date_start'=>'DESC','r_time_start'=>'DESC','r_id'=>'DESC']]);
	   return $rows;
	}
	
    public function getBloodMaxDayByUser($userid,$endDate='')
    {
       $where = ['bd_uid'=>$userid,'ORDER'=>['bd_date'=>'DESC']];
       if($endDate!=''){
           $where['bd_date[<]'] = $endDate;
       }
	   $maxDay = $this->db->get('dt_blood','bd_date',$where);
	   $maxDay = date('Y-m-d',strtotime($maxDay));
	   return $maxDay;
    }
    
    public function getBloodRecord($userid,$beginTime,$endTime)
    {
       $beginDate = date('Y-m-d',strtotime($beginTime));
       $endDate = date('Y-m-d',strtotime($endTime));
       $where =  [
           'bd_uid'=>$userid,
           'bd_date[>=]'=>$beginDate,
           'bd_date[<=]'=>$endDate,
           'HAVING'=>[
               'tdate[>=]'=>$beginTime,
               'tdate[<=]'=>$endTime,
            ],
           'ORDER'=>['tdate'=>'DESC'],
       ];
       $fields = [
           'dt_blood.*',
           "@STR_TO_DATE(CONCAT(bd_date,' ',bd_time,':00'), '%Y-%m-%d %H:%i:%s') AS tdate"
       ];
	   $rows = $this->db->select('dt_blood',$fields,$where);
	   return $rows;
    }    
	
	public function getSumReport($userid,$req)
	{
	    $req['short_tag'] = "'' short_tag";
	    if($req['dimen']=='week'){
	        $req['short_tag'] = "WEEK(bd_date)+1 short_tag";
	    }else if($req['dimen']=='month'){
	        $req['short_tag'] = "MONTH(bd_date) short_tag";
	    }
	    $req['beginDate'] .= '-01';
	    $req['endDate'] = date('Y-m-d',strtotime('last day of this month', strtotime($req['endDate'].'-01')));
	    //全天
        $sql = "
        SELECT 
          bd_id,bd_uid,bd_date,
          COUNT(bd_id) subtotal,
          ROUND(AVG(bd_sbp)) bd_sbp,
          ROUND(AVG(bd_dbp)) bd_dbp,
          ROUND(AVG(bd_heart_rate)) bd_heart_rate,
          ROUND(AVG(bd_pulse)) bd_pulse,
          ROUND(AVG(bd_map)) bd_map,
          STR_TO_DATE(
            CONCAT(bd_date, ' ', bd_time, ':00'),
            '%Y-%m-%d %H:%i:%s'
          ) AS tdate,
          CONCAT(MID(bd_date,1,4),LPAD({:dimen}(bd_date),2,'0')) AS tag,
          MID(bd_date,1,4) year,
          MID(bd_date,6,2) month,
          {:short_tag}
        FROM
          `dt_blood` 
        WHERE bd_uid = '{:u}' AND bd_date>='{:beginDate}' AND bd_date<='{:endDate}'
        GROUP BY tag  
        ORDER BY tag DESC
        ";
        $sql = qgprintf($sql,$req);
        $st = $this->db->query($sql);
        $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
        $blood24Arr = [];
        foreach($rows as $row){
            $blood24Arr[$row['tag']] = $row;
        }
        //白天
        $sql = "
        SELECT 
          bd_id,bd_uid,bd_date,
          COUNT(bd_id) subtotal,
          ROUND(AVG(bd_sbp)) bd_sbp,
          ROUND(AVG(bd_dbp)) bd_dbp,
          ROUND(AVG(bd_heart_rate)) bd_heart_rate,
          ROUND(AVG(bd_pulse)) bd_pulse,
          ROUND(AVG(bd_map)) bd_map,
          STR_TO_DATE(
            CONCAT(bd_date, ' ', bd_time, ':00'),
            '%Y-%m-%d %H:%i:%s'
          ) AS tdate,
          STR_TO_DATE(
            CONCAT('2000-01-01 ', bd_time, ':00'),
            '%Y-%m-%d %H:%i:%s'
          ) AS ttime,          
          CONCAT(MID(bd_date,1,4),LPAD({:dimen}(bd_date),2,'0')) AS tag,
          MID(bd_date,1,4) year,
          MID(bd_date,6,2) month,
          {:short_tag}
        FROM
          `dt_blood` 
        WHERE bd_uid = '{:u}' AND bd_date>='{:beginDate}' AND bd_date<='{:endDate}'
        AND ( 
        		STR_TO_DATE(CONCAT('2000-01-01 ', bd_time, ':00'),'%Y-%m-%d %H:%i:%s') 
        		    >= STR_TO_DATE(CONCAT('2000-01-01 ', '{:sunBeginTime}', ':00'),'%Y-%m-%d %H:%i:%s')
    		AND 
    		    STR_TO_DATE(CONCAT('2000-01-01 ', bd_time, ':00'),'%Y-%m-%d %H:%i:%s') 
    		        <= STR_TO_DATE(CONCAT('2000-01-01 ', '{:sunEndTime}', ':00'),'%Y-%m-%d %H:%i:%s')
    	)
        GROUP BY tag
        ORDER BY tag DESC
        ";
        $sql = qgprintf($sql,$req);
        $st = $this->db->query($sql);
        $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
        $bloodSunArr = [];
        foreach($rows as $row){
            $bloodSunArr[$row['tag']] = $row;
        }
        
        //夜间
        $sql = "
        SELECT 
          bd_id,bd_uid,bd_date,
          COUNT(bd_id) subtotal,
          ROUND(AVG(bd_sbp)) bd_sbp,
          ROUND(AVG(bd_dbp)) bd_dbp,
          ROUND(AVG(bd_heart_rate)) bd_heart_rate,
          ROUND(AVG(bd_pulse)) bd_pulse,
          ROUND(AVG(bd_map)) bd_map,
          STR_TO_DATE(
            CONCAT(bd_date, ' ', bd_time, ':00'),
            '%Y-%m-%d %H:%i:%s'
          ) AS tdate,
          STR_TO_DATE(
            CONCAT('2000-01-01 ', bd_time, ':00'),
            '%Y-%m-%d %H:%i:%s'
          ) AS ttime,          
          CONCAT(MID(bd_date,1,4),LPAD({:dimen}(bd_date),2,'0')) AS tag,
          MID(bd_date,1,4) year,
          MID(bd_date,6,2) month,
          {:short_tag}
        FROM
          `dt_blood` 
        WHERE bd_uid = '{:u}' AND bd_date>='{:beginDate}' AND bd_date<='{:endDate}'
        AND ( 
        		STR_TO_DATE(CONCAT('2000-01-01 ', bd_time, ':00'),'%Y-%m-%d %H:%i:%s') 
        		    < STR_TO_DATE(CONCAT('2000-01-01 ', '{:sunBeginTime}', ':00'),'%Y-%m-%d %H:%i:%s')
    		OR 
    		    STR_TO_DATE(CONCAT('2000-01-01 ', bd_time, ':00'),'%Y-%m-%d %H:%i:%s') 
    		        > STR_TO_DATE(CONCAT('2000-01-01 ', '{:sunEndTime}', ':00'),'%Y-%m-%d %H:%i:%s')
    	)
        GROUP BY tag
        ORDER BY tag DESC
        ";
        $sql = qgprintf($sql,$req);
        $st = $this->db->query($sql);
        $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
        $bloodNightArr = [];
        foreach($rows as $row){
            $bloodNightArr[$row['tag']] = $row;
        }
        $data = [];
        foreach($blood24Arr as $k=> $row){
            $data[] =[
                'all'=>$row,
                'sun'=>$bloodSunArr[$k],
                'night'=>$bloodNightArr[$k],
            ];
        }
        
        
	    //24小时
        $sql = "
        SELECT 
          bd_id,bd_uid,bd_date,
          COUNT(bd_id) subtotal,
          ROUND(AVG(bd_sbp)) bd_sbp,
          ROUND(AVG(bd_dbp)) bd_dbp,
          ROUND(AVG(bd_heart_rate)) bd_heart_rate,
          ROUND(AVG(bd_pulse)) bd_pulse,
          ROUND(AVG(bd_map)) bd_map,
          STR_TO_DATE(
            CONCAT(bd_date, ' ', bd_time, ':00'),
            '%Y-%m-%d %H:%i:%s'
          ) AS tdate,
          DATE_FORMAT(STR_TO_DATE(CONCAT('2000-01-01 ', bd_time, ':00'),'%Y-%m-%d %H:%i:%s'),'%H') AS tag,
          MID(bd_date,1,4) year,
          MID(bd_date,6,2) month,
          '' short_tag
        FROM
          `dt_blood` 
        WHERE bd_uid = '{:u}' AND bd_date>='{:beginDate}' AND bd_date<='{:endDate}'
        GROUP BY tag  
        ORDER BY tag ASC
        ";
        $sql = qgprintf($sql,$req);
        $st = $this->db->query($sql);
        $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
        $hourArr = [];
        foreach($rows as $row){
            $tag = ltrim($row['tag'],0);
            if(empty($tag)) $tag = 0;
            $hourArr[$tag] = $row;
        }        
        return ['bloodArr'=>$data,'hourArr'=>$hourArr];
	}

    public function getDataRecordDate($userid)
    {
       //分组
       $sql = "SELECT cbig,ddate,MIN(dhour) dhour,dremark,MD5(CONCAT(ddate,dremark)) k FROM dt_data
                JOIN dt_cate ON cid=dcid
                WHERE duid = '{:u}'
                GROUP BY ddate,dremark,cbig
                LIMIT 3000";
       $sql = qgprintf($sql,['u'=>$userid]);
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
       $bigRows = [];
       foreach($rows as $k=>$row){
           $bigRows[$row['k']][] = $row;
       }
       
       //记录
       $sql = "SELECT cbig,MD5(CONCAT(ddate,dremark)) k,dt_data.* FROM dt_data
                JOIN dt_cate ON cid=dcid
                WHERE duid = '{:u}'
                GROUP BY ddate,dremark
                ORDER BY ddate DESC,dhour DESC,dremark DESC
                LIMIT 3000";
       $sql = qgprintf($sql,['u'=>$userid]);
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
       foreach($rows as $k=>$row){
           if($bigRows[$row['k']]){
               foreach($bigRows[$row['k']] as $item){
                   $row['bigArr'][] = $item['cbig'];
               }
           }
           $rows[$k] = $row;
       }
	   return $rows;
    }  
    public function getCateById($userid,$id)
    {
       $sql = "SELECT * FROM dt_cate
                WHERE cid = {:id}
                LIMIT 1";
       $sql = qgprintf($sql,['id'=>$id]);
       $st = $this->db->query($sql);
       $row = $st->fetch(\PDO::FETCH_ASSOC);
   	   $target = $this->db->get('dt_user_target','uttarget',['utuid'=>$userid,'utcid'=>$id]);
	   if($target){
	       $row['crefetxt2'] = $target;
	   }
	   return $row;
    }    
    public function getDataRecordById($did)
    {
       $sql = "SELECT * FROM dt_data
                WHERE did = {:did}
                LIMIT 1";
       $sql = qgprintf($sql,['did'=>$did]);
       $st = $this->db->query($sql);
       $row = $st->fetch(\PDO::FETCH_ASSOC);
	   return $row;
    }    
    
    public function getDataRecordByTime($userid,$date,$hour,$remark)
    {
       $sql = "SELECT * FROM dt_data
                JOIN dt_cate ON dcid = cid
                LEFT OUTER JOIN dt_user_target ON utcid = cid AND utuid = '{:u}'
                WHERE duid = '{:u}' AND ddate='{:date}' AND dremark='{:remark}'
                {:where}
                ORDER BY csort";
       $where = '';
       if($hour!=''){
           $where .= " AND dhour='".$hour."'"; 
       }
       $sql = qgprintf($sql,[
           'u'=>$userid,
           'date'=>$date,
           'remark'=>$remark,
           'where'=>$where,
       ]);
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
	   return $rows;
    }    
    
    public function getDataRecordByCid($userid,$cid)
    {
       $sql = "SELECT * FROM dt_data
                JOIN dt_cate ON dcid = cid
                LEFT OUTER JOIN dt_user_target ON utcid = cid AND utuid = '{:u}'
                WHERE duid = '{:u}' AND dcid='{:cid}'
                ORDER BY ddate DESC,dhour DESC
                LIMIT 200";
       $sql = qgprintf($sql,[
           'u'=>$userid,
           'cid'=>$cid,
       ]);
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
	   return $rows;
    }   
    
    public function getDataRecordSum($userid)
    {
       $sql = "SELECT cid,csmall,crefetxt,uttarget FROM dt_cate
                JOIN dt_user_target ON cid=utcid
                WHERE utfocus=1 AND utuid= '{:u}'
                ORDER BY csort
                LIMIT 1000";
       $sql = qgprintf($sql,[
           'u'=>$userid,
       ]);
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
       $targets = [];
       foreach($rows as $row){
           $targets[$row['cid']] = [
               'csmall'=>$row['csmall'],
               'crefe'=>$row['uttarget'] ? $row['uttarget'] : $row['crefetxt'],
               'crefetxt'=>$row['crefetxt'],
           ];
       }
       $sql = "SELECT * FROM dt_data
                JOIN dt_user_target ON utuid = duid AND dcid=utcid
                WHERE utfocus=1 AND utuid= '{:u}'
                ORDER BY ddate DESC,dhour DESC
                LIMIT 1000";
       $sql = qgprintf($sql,[
           'u'=>$userid,
       ]);
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
       $keys = [];
       $data = [];
       foreach($rows as $row){
           $key = $row['ddate'].'.'.$row['dhour'];
           $keys[$key] = $key;
       }
       foreach($targets as $cid => $cname){
           foreach($keys as $key){
               $t = explode('.',$key);
               $data[$cid][$key] = [
                   'dcid'=>'',
                   'ddate'=>$t['0'],
                   'dhour'=>$t['1'],
                   'dvalue'=>'',
                   'dremark'=>'',
               ];
           }
           foreach($rows as $row){
               if($row['dcid']==$cid){
                   $key = $row['ddate'].'.'.$row['dhour'];
                   $data[$cid][$key] = [
                       'dcid'=>$row['dcid'],
                       'ddate'=>$row['ddate'],
                       'dhour'=>$row['dhour'],
                       'dvalue'=>$row['dvalue'],
                       'dremark'=>$row['dremark'],
                   ];
               }
           }
       }
	   return ['targets'=>$targets,'data'=>$data];
    }   
    
    public function medicine($userid)
    {
       //取所有药品
       $sql = "SELECT drug_id,drug_name,drug_efficacy FROM dt_drug ORDER BY LENGTH(drug_name) DESC";
       $st = $this->db->query($sql);
       $drugs = $st->fetchAll(\PDO::FETCH_ASSOC);
       //
       $sql = "SELECT * FROM dt_medicine
                WHERE muid = '{:u}'
                ORDER BY IF(mdateend='0000-00-00',0,1),mdateend DESC,mdatebegin DESC
                LIMIT 1000";
       $sql = qgprintf($sql,[
           'u'=>$userid,
       ]);
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
       foreach($rows as $k=>$row){
           $name = $row['mname'];
           $efficacys = [];
           foreach($drugs as $drug){
               if(strpos($name,$drug['drug_name'])!==false){
                    $efficacys[] = $drug['drug_efficacy'];
                    //$replace = '<a href="weixin://applets/medsearch?keyword='.urlencode($drug['drug_name']).'">'.$drug['drug_name'].'</a>';
                    $replace = '<span class="h4"><a href="https://h5.baike.qq.com/mobile/search.html?search='.urlencode($drug['drug_name']).'">'.$drug['drug_name'].'</a></span>';
                    $name = str_replace($drug['drug_name'],$replace,$name);
               }
               $row['name'] = $name;
           }
           $rows[$k] = $row;
       }
	   return $rows;
    }    
    
    public function examine($userid,$beginDate='',$endDate='',$keyword='')
    {
       $sql = "SELECT * FROM dt_examine
                WHERE exa_uid = '{:u}'
                {:where}
                ORDER BY exa_date DESC,exa_time DESC,exa_id DESC
                LIMIT 1000";
       $where = '';
       if($beginDate!=''){
           $where .= " AND exa_date>='".$beginDate."'";
       }
       if($endDate!=''){
           $where .= " AND exa_date<='".$endDate."'";
       }
       if($keyword!=''){
           $sub = [];
           $sub[] = "exa_title LIKE '%".$keyword."%'";
           $sub[] = "exa_conclusion LIKE '%".$keyword."%'";
           $sub[] = "exa_agency LIKE '%".$keyword."%'";
           $where .= " AND (".implode(' OR ',$sub).")";
       }
       $sql = qgprintf($sql,['u'=>$userid,'where'=>$where]);
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
	   return $rows;
    }    
    
    public function getEdicaldocCates()
    {
       $sql = "SELECT DISTINCT mdoc_cate FROM dt_medicaldoc ORDER BY mdoc_cate";
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
       $data = [];
       foreach($rows as $row){
           $data[] = $row['mdoc_cate'];
       }
	   return $data;
    }    
    
    public function getEdicaldoc()
    {
       $sql = "SELECT * FROM dt_medicaldoc ORDER BY mdoc_date DESC,mdoc_title";
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
	   return $rows;
    }    
    
    public function getMeasure($userid,$bigCate,$beginDate='',$endDate='')
    {
       $sql = "SELECT * FROM dt_measure
                JOIN dt_measure_type ON meat_id = mea_cid
                LEFT OUTER JOIN dt_measure_device ON mead_id = mea_mead_id
                WHERE mea_uid = '{:u}'
                AND meat_name='{:bigCate}'
                {:where}
                ORDER BY mea_date DESC,mea_time DESC,mea_id DESC
                LIMIT 1000";
       $where = '';
       if($beginDate!=''){
           $where .= " AND mea_date>='".$beginDate."'";
       }
       if($endDate!=''){
           $where .= " AND mea_date<='".$endDate."'";
       }
       $sql = qgprintf($sql,['u'=>$userid,'bigCate'=>$bigCate,'where'=>$where]);
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
       $tool = new \model\doctor\tool();
       $correlations = $tool->getMeasureCorrelations();
       $userRow = $this->getUserRow($userid);
       foreach($rows as $k=>$row){
           $key = md5($row['mea_mead_id'].'.'.$row['meat_name']);
           if(empty($row['mea_value']) && isset($correlations[$key])){
               $rule = $correlations[$key];
               $rule['mea_value_home'] *= 1;
               $rule['intercept'] *= -1;
               $rule['slope'] *= 1;
               if($rule['intercept']>=0){
                    $row['hospital_value'] = round($rule['slope'] * $row['mea_value_home'] + $rule['intercept'],2);
                    $row['correlation_text'] = round($rule['slope'],2) . ' x 设备值 + ' . $rule['intercept'];
               }else{
                    $row['hospital_value'] = round($rule['slope'] * $row['mea_value_home'] - abs($rule['intercept']),2);
                    $row['correlation_text'] = round($rule['slope'],2) . ' x 设备值 - ' .abs($rule['intercept']);
               }
               $row['correlation_coefficient'] = $rule['correlation_coefficient'];
           }
           if($row['meat_refe']){
               if($row['mea_value']){
                   $value = $row['mea_value'];
               }else if($row['hospital_value']){
                   $value = $row['hospital_value'];
               }else{
                   $value = $row['mea_value_home'];
               }
               $row['checkRule'] = $this->commonRefeRule($value,$row['meat_refe'],$row['mea_date'],$userRow);
           }
           $row['fullname'] = $row['meat_name'];
           if(!empty($row['meat_small'])) $row['fullname'] .= '-' . $row['meat_small'];
           $rows[$k] = $row;
       }
	   return $rows;
    }    
    
    public function getMeasureRefetxt($bigCate)
    {
       $sql = "SELECT * FROM dt_measure_type WHERE meat_name='{:bigCate}' ORDER BY meat_sort,meat_id";
       $sql = qgprintf($sql,['bigCate'=>$bigCate]);
       $st = $this->db->query($sql);
       $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
       $result = '';
       if(count($rows)==1){
           $result = $rows[0]['meat_refetxt'];
       }else{
           foreach($rows as $row){
               if($result!='') $result .= '<br>';
               $result .= $row['meat_small'] . ': ' . $row['meat_refetxt'];
           }
       }
	   return $result;
    }    
    
    
    //通用规则处理
    public function commonRefeRule($value,$refe,$date,$userRow)
    {
       if(substr($refe,0,8)=='function'){
           list($err,$msgInfo,$range) = call_user_func_array( array ( $this , 'checkCateFunction'.substr($refe,8) ), [$value,$date,$userRow] );
           $result = $range;
           $result['err'] = $err;
       }else{
           $refeTemp = $refe;
           $firstOp = $this->getFisrtNotNumberChars($refeTemp);
           if($firstOp!='') $refeTemp = substr($refeTemp,strlen($firstOp));
           $refeValues = explode('-',$refeTemp);
           $a = $refeValues[0] * 1;
           $b = null;
           if(isset($refeValues[1])) $b = $refeValues[1] * 1;
           $err = 0;
           if(!is_null($b)){//有两个值
               if($value<$a) $err = -1; 
                 else if($value>$b) $err = 1; 
           }else{ //只有一个值
	           switch ($firstOp) {
	               case '<':
	                   if($value>=$a) $err = 1; 
	                   break;
	               case '<=':
	                   if($value>$a) $err = 1;
	                   break;
	               case '>':
	                   if($value<=$a) $err = -1;
	                   break;
	               case '>=':
	                   if($value<$a) $err = -1;
	                   break;
	           }
           }
           $result = ['op'=>$firstOp,'a'=>$a,'b'=>$b,'err'=>$err];
       }
       return $result;
    }  


    //取前面不是数字的字符
    public function getFisrtNotNumberChars($str)
    {
        $result = '';
        for($i=0;$i<strlen($str);$i++){
            $c = substr($str,$i,1);
            if(!is_numeric($c)) 
                $result.=$c;
            else
                break;
        }
        return $result;
    }  
    public function getRefeRule($refe,$cid,$userRow)
    {
       if($refe!='function'){
           $refeTemp = $refe;
           $firstOp = $this->getFisrtNotNumberChars($refeTemp);
           if($firstOp!='') $refeTemp = substr($refeTemp,strlen($firstOp));
           $refeValues = explode('-',$refeTemp);
           $a = $refeValues[0] * 1;
           $b = null;
           if(isset($refeValues[1])) $b = $refeValues[1] * 1;
           $result = ['op'=>$firstOp,'a'=>$a,'b'=>$b];
       }else{
           list($err,$msgInfo,$range) = call_user_func_array( array ( $this , 'checkCateFunction'.$cid ), [$value,$date,$userRow] );
           $result = $range;
       }
       return $result;
    }
    
    public function checkDataRecord($userid,$rows,$userRow)
    {
       $birthYear = date('Y',strtotime($userRow['au_birth']));
       $birthYear *= 1;
	   $cates = $this->db->select('dt_cate',['cid'=>['crefe','crefestr','crefetxt']]);
	   $targets = $this->db->select('dt_user_target',['utcid'=>['uttarget']],['utuid'=>$userid]);
	   foreach($targets as $k=>$v){
	       if(!empty($v['uttarget'])){
    	       $cates[$k]['crefe'] = $v['uttarget'];
    	       $cates[$k]['crefetxt'] = $v['uttarget'];
	       }
	   }
	   foreach($rows as $k=>$row){
	       if(empty($row['dcid']) || $row['dvalue']==''){
	           continue;
	       }
	       $cid = $row['dcid'];
	       $refe = trim($cates[$cid]['crefe']);
	       $refetxt = trim($cates[$cid]['crefetxt']);
	       $refeStr = trim($cates[$cid]['crefestr']);
	       $value = $row['dvalue']*1;
	       if(empty($refe)) {
	           continue;
	       }
           $err = 0;
           $msgInfo = '';
	       if(is_numeric($value)){
    	       if($refe=='function'){
    	           list($err,$msgInfo,$range) = call_user_func_array( array ( $this , 'checkCateFunction'.$cid ), [$value,$row['ddate'],$userRow] );
    	       }else{
    	           $refeTemp = $refe;
    	           $firstOp = $this->getFisrtNotNumberChars($refeTemp);
    	           if($firstOp!='') $refeTemp = substr($refeTemp,strlen($firstOp));
    	           $refeValues = explode('-',$refeTemp);
    	           $a = $refeValues[0] * 1;
    	           $b = null;
    	           if(isset($refeValues[1])) $b = $refeValues[1] * 1;
    	           if(!is_null($b)){//有两个值
    	               if($value<$a) $err = -1; 
    	                 else if($value>$b) $err = 1; 
    	           }else{ //只有一个值
        	           switch ($firstOp) {
        	               case '<':
        	                   if($value>=$a) $err = 1; 
        	                   break;
        	               case '<=':
        	                   if($value>$a) $err = 1;
        	                   break;
        	               case '>':
        	                   if($value<=$a) $err = -1;
        	                   break;
        	               case '>=':
        	                   if($value<$a) $err = -1;
        	                   break;
        	           }
    	           }
        	       if(empty($refeStr)) $refeStr = '正常;低;高';
        	       $refeStrArr = explode(';',$refeStr);
        	       $refeStrArrCount = count($refeStrArr);
        	       if($refeStrArrCount==1){
        	           $refeStrArr[1] = '异常';
        	           $refeStrArr[2] = '异常';
        	       }else if($refeStrArrCount==2){
        	           $refeStrArr[2] = $refeStrArr[1];
        	       }
        	       if($err==0){
        	           $msgInfo = $refeStrArr[0];
        	           if($msgInfo) $msgInfo .= ', ';
        	           $msgInfo .= '参考: '.$refetxt;
        	       }else if($err<0){
        	           $msgInfo = $refeStrArr[1];
        	           if($msgInfo) $msgInfo .= ', ';
        	           $msgInfo .= '参考: '.$refetxt;
        	       }else if($err>0){
        	           $msgInfo = $refeStrArr[2];
        	           if($msgInfo) $msgInfo .= ', ';
        	           $msgInfo .= '参考: '.$refetxt;
        	       }
    	       }
    	       $row['err'] = $err;
    	       $row['msgInfo'] = $msgInfo;
	       }
	       $rows[$k] = $row;
	   }
	   return $rows;
    }    
    
    //尿酸
    function checkCateFunction13($value,$date,$userRow){
        /*
        男:57-97,女:41-81       
        */
        $err = 0;
        $range = ['op'=>'','a'=>'','b'=>''];
        $msgInfo = '男:150-416,女:89-357';
        $sex = $userRow['au_sex'];
        if($sex=='男'){
            if($value<150){
                $err = -1;
            }elseif($value>416){
                $err = 1;
            }
            $range = ['op'=>'-','a'=>150,'b'=>416];
        }else{
            if($value<89){
                $err = -1;
            }elseif($value>357){
                $err = 1;
            }
            $range = ['op'=>'-','a'=>89,'b'=>357];
        }
        return [$err,$msgInfo,$range];
    }
    //肌酐
    function checkCateFunction15($value,$date,$userRow){
        /*
        男:57-97,女:41-81       
        */
        $err = 0;
        $range = ['op'=>'','a'=>'','b'=>''];
        $msgInfo = '男:57-97,女:41-81';
        $sex = $userRow['au_sex'];
        if($sex=='男'){
            if($value<57){
                $err = -1;
            }elseif($value>97){
                $err = 1;
            }
            $range = ['op'=>'-','a'=>57,'b'=>97];
        }else{
            if($value<41){
                $err = -1;
            }elseif($value>81){
                $err = 1;
            }
            $range = ['op'=>'-','a'=>41,'b'=>81];
        }
        return [$err,$msgInfo,$range];
    }
    //血B型钠尿肽前体
    function checkCateFunction16($value,$date,$userRow){
        /*
        不支持慢性心衰: <125.00pg/ml;
        心衰可能性较低:
            <50岁 <450.00pg/ml;
            50-75岁 <900.00pg/ml;
            >75岁 <1800.00pg/ml;
        排除急性心衰可能: <300.00pg/ml        
        */
        $err = 0;
        $range = ['op'=>'','a'=>'','b'=>''];
        $msgInfo = '';
        $birthYear = date('Y',strtotime($userRow['au_birth'])) * 1;
        $age = date('Y',strtotime($date)) - $birthYear;
        if($value<125){
            $msgInfo = '不支持慢性心衰, 参考: <125.00pg/ml';
        }else if($value<300){
            $msgInfo = '排除急性心衰可能, 参考: <300.00pg/ml';
        }else{
            if($age<50){
                if($value<450){
                    $msgInfo = ''.$age.'岁, 心衰可能性较低, 参考: <50岁 <450.00pg/ml';
                }else{
                    $err = 1;
                    $msgInfo = ''.$age.'岁, 高于标准, 参考: <50岁 <450.00pg/ml';
                }
                $range = ['op'=>'<','a'=>450,'b'=>''];
            }else if($age>=50 && $age<=75){
                if($value<900){
                    $msgInfo = ''.$age.'岁, 心衰可能性较低, 参考: 50-75岁 <900.00pg/ml';
                }else{
                    $err = 1;
                    $msgInfo = ''.$age.'岁, 高于标准, 参考: 50-75岁 <900.00pg/ml';
                }
                $range = ['op'=>'<','a'=>900,'b'=>''];
            }else if($age>75){
                if($value<1800){
                    $msgInfo = ''.$age.'岁, 心衰可能性较低, 参考: >75岁 <1800.00pg/ml';
                }else{
                    $err = 1;
                    $msgInfo = ''.$age.'岁, 高于标准, 参考:>75岁 <1800.00pg/ml';
                }
                $range = ['op'=>'<','a'=>1800,'b'=>''];
            }
        }
        return [$err,$msgInfo,$range];
    }
}