load->_model('Model_systemtransfer','systemtransfer'); $this->load->_model("Model_systemtransfer_cr",'systemtransfer_cr'); $this->load->_model("Model_transfer",'transfer'); $this->load->_model("Model_fullorder","fullorder"); $this->load->_model("Model_fullordersmt","fullordersmt"); $this->load->_model("Model_fullordertt","fullordertt"); } //定义方法的调用规则 获取URI第二段值 public function _remap($arg,$arg_array) { if($arg == 'cjgx' ){ //执行车间效率检测 $this->_cjgx(); }else{ $this->_index(); } } public function _index(){ echo "程序异常"; } public function dd($val){ echo "
";
        var_dump($val);
        die;
    }

    public function _cjgx(){
        $limit_time = time() - 3600*24*30;
        $list = $this->systemtransfer->find_all("status < 10 and time >= ".$limit_time);
        if(empty($list)){
            die(json_encode(array('code'=>0,'msg'=>'没有需要检测的工单'),JSON_UNESCAPED_UNICODE));
        }
        echo date('Y-m-d H:i:s')."开始执行车间效率检测".PHP_EOL;
        foreach ($list as $val){
            $this->doSingleData($val);
        }
        echo date('Y-m-d H:i:s')."执行车间效率检测结束".PHP_EOL;
        
    }
    //单独处理每个工单的状态判断
    public function doSingleData($info){
        $lbrk = array_reverse(explode('|',trim($info['rk'],'|')));
       
		$lbck = array_reverse(explode('|',trim($info['ck'],'|')));
        //如果是11 说明是成品库 说明已经入库完毕了 表示已经完毕 
        if($lbrk[0] == 11){
            $this->checkOver($info['id']);
            return;
        }
        //检测出入库都存在时 是否做过标记  在出库的时候已经同步过了
        if($lbrk[0] == $lbck[0]){
            // if(!in_array($lbrk[0],[11,12,15,16])){
            //     $this->checkIsOver($info,$lbrk[0]);
            //     return;
            // }
            return ;
        }
        //如果是 成品库 布标打印 发块 滞销款 不做处理  再次判定状态是否是 超时一次 超时两次 
        if(!in_array($lbrk[0],[11,12,15,16])){
            $this->jdgeTimeOut($info,$lbrk[0]);
        }
       
    }
    //如果检测到最后的入库是
    /**
     * $id  工单主键id
     */
    public function checkOver($id){
        $this->systemtransfer->save(array('status'=>10),$id);
        $this->load->database();
        //同步表示 此单已经到成品库 完结了
        $this->db->where('fid',$id);
        $this->db->update('systemtransfer_cr',array('is_over'=>3));
        $this->db->affected_rows();
    }
    //检测是否已经完结 如果完结 且已经标记 那么不做处理 如果为做标记 那么就坐下处理
    /**
     * $fid  工单主键id
     * $lx  车间id
     */
    public function checkIsOver($info,$lx){
        $fid = $info['id'];
        $list = $this->systemtransfer_cr->find_all("fid = ".$fid,"*",'id desc',0,2);
        //如果查到的数据小于2 那么就说明此单异常
        if(count($list) < 2){
            //echo json_encode(array('code'=>0,'msg'=>'程序异常','data'=>['info'=>$info,'list'=>$list]),JSON_UNESCAPED_UNICODE);
            return ;
        }
      
        //如果查到的数据不等于指定的车间id 说明程序异常了 先不执行
        if(($list[0]['lx'] != $lx) || ($list[1]['lx'] != $lx)){
            return ;
        }
       
        if(($list[0]['is_over'] == 0) || ($list[1]['is_over'] == 0)){
            
            if($list[1]['orver_flag'] == 2){
                $this->systemtransfer_cr->save(['is_over'=>1,'orver_flag'=>2],$list[0]['id']);
            }else{
                $this->systemtransfer_cr->save(['is_over'=>1],$list[0]['id']);
            }
            $this->systemtransfer_cr->save(['is_over'=>1],$list[1]['id']);
            
        }
       
        return ;

    }
    //判定是否超时
    public function jdgeTimeOut($info,$lx){
        $list = $this->systemtransfer_cr->find_all("fid = ".$info['id'],"*",'id desc',0,1);
        if(empty($list)){
            return ;
        }
        if($list[0]['lx'] != $lx){
            return ;
        }
        //查询流转部分要求
        $depart_info  = $this->transfer->find("id = ".$lx);
        if(empty($depart_info)){
            return ;
        }
        $now_time = time();
        $ru_time =  $list[0]['time'];//扫描时间
        // $overtime_one = $depart_info['overtime_one'] * 3600;
        // $overtime_two = $depart_info['overtime_two'] * 3600;
        //如果时间节点一样 就不再执行了
        if($depart_info['overtime_one'] == $depart_info['overtime_two']){
            return ;
        }
        $overtime_one = $depart_info['overtime_one'] * 3600 ;
        $overtime_two = $depart_info['overtime_two']  * 3600;

        //不选超时
        if(($now_time - $ru_time) < $overtime_one){
            return ;
        }
        $limit_time = [
            'overtime_one'=> $depart_info['overtime_one'],
            'overtime_two'=>$depart_info['overtime_two'],
        ];
        
        $remain_time = $now_time - $ru_time;
        
        $num = $this->weektimes($ru_time , $now_time);
        if($num > 0 ){
            $remain_time = $remain_time - 24 * 3600 * $num;
        }
        //前处理有时间1 就是超时提醒
        // if($lx == 5){
        //     //超时一次的
        //     if(($now_time - $ru_time) >= $overtime_one ){
        //         if($list['0']['orver_flag'] == 0){
        //             $this->systemtransfer_cr->save(['orver_flag'=>1,'limit_time_str'=> json_encode($limit_time)],$list['0']['id']);
        //         }
        //     }
        // }else{
            //超时一次的
            if(( $remain_time) >= $overtime_one && ( $remain_time) < $overtime_two){
                if($list['0']['orver_flag'] == 0){
                    
                    $type = $this->checkOrderInfo($info['number']);
                    if($type == 1){//订单取消了或者其他原因 在没出库的情况下就完成了
                        $this->systemtransfer_cr->save(['orver_flag'=>3],$list[0]['id']);
                    }elseif($type == 10){
                        $this->systemtransfer_cr->save(['orver_flag'=>1,'limit_time_str'=> json_encode($limit_time)],$list[0]['id']);
                    }
                   
                }
            }
            //超时2次的
            if(( $remain_time) >= $overtime_two){
                if($list[0]['orver_flag'] <= 1){
                    //$this->systemtransfer_cr->save(['orver_flag'=>2,'limit_time_str'=> json_encode($limit_time)],$list['0']['id']);
                    
                    $type = $this->checkOrderInfo($info['number']);
                    if($type == 1){//订单取消了或者其他原因 在没出库的情况下就完成了
                        $this->systemtransfer_cr->save(['orver_flag'=>3],$list[0]['id']);
                    }elseif($type == 10){
                        $this->systemtransfer_cr->save(['orver_flag'=>2,'limit_time_str'=> json_encode($limit_time)],$list[0]['id']);
                    }else{

                    }
                }
            }
        //}
       
    }
    //检测是否含有周日
    protected function weektimes($start_time,$endstime)
    {
        //是否有周六周日
         $week_array = [7, 1, 2, 3, 4, 5, 6];
         $i = 0;
         while ($start_time <= $endstime) {
             $now_time = date('Y-m-d', $start_time);
             // 可根据自己想要的返回格式进行调整
             $alltime[$i]['week'] = $week_array[date("w", strtotime($now_time))];
             $start_time = strtotime('+1 day', $start_time);
             $i++;
         }
         $list = [];
         foreach ($alltime as $key => $value) {
         		//周日数组
             if ($value['week'] > 6) {
                 $list[] = $value['week'];
             }
         }
         
         
        return count($list);
    }
    
     //检验订单的状态 
    protected function checkOrderInfo($number){
        $nu = $this->fullorder->get_number($number);
        if(!$nu)
        {
            $nu = $this->fullordersmt->get_number($number);
            if(!$nu)
            {
                $nu = $this->fullordertt->get_number($number);
            }
        }
        //此单已取消!请联系店员核实
        if($nu['state'] == '214' || $nu['state'] == '217')
        {
            return 1;
        }
        //因为某些原因订单虽然现实是完成 但是实际上是终止了 所以就按照取消计算吧  
        // if($nu['state'] == '216' || $nu['state'] == '215')
        // {
        //     return 1;
        // }
        return 10;

    }

}