<?php
namespace process;

use FilesystemIterator;
use Workerman\Timer;
use support\Db;
use support\Log;
use support\ApiTask;
use support\LibDb;

class TaskCba
{
    private $task;
    public function onWorkerStart()
    {
        set_time_limit(3600 * 100);
        ini_set('memory_limit', '20480M');
        
        // 每隔60秒检查一次
        // 执行一次大概15秒
        Timer::add(15, function(){
            $this->task = new ApiTask('TaskCba');
    		$data = $this->task->get();
    		if($data->enable 
    		   && time()>strtotime($data->begin_start_time) //开始时间
    		   && (empty($data->access_time) || time()-strtotime($data->access_time) > $data->interval)
    		){
                $nowTime = getNowTime();
                if($data->interval >= 86400){ //达到或超过1天时
                    $t = explode(' ',$data->begin_start_time); 
                    $jgTime = $t[1];
                    $t = explode(' ',getNowTime()); 
                    $date = $t[0];
                    $nowTime  = $date .' '. $jgTime;
                }
    			$this->task->begin($nowTime);
                $this->smt_cba_1();
                $this->smt_cba_2();
                $this->task->complete(getNowTime());
    		}
        });
    }

    public function smt_cba_1()
    {
        set_time_limit(3600 * 10);
        $zcd = 0.01;
		$data = [];
        Db::table('smt_cba_1')->truncate();
        $orderCount = Db::table('smt_cba_base')->count();
        Db::table('smt_cba_base')->select('scb_p_id')->orderBy('scb_p_id')->distinct()
        ->chunkById(1000, function ($rows)use($orderCount,$zcd) {
            $insertData = [];
            foreach ($rows as $row) {
                $itemCount = Db::table('smt_cba_base')->where(['scb_p_id'=>$row->scb_p_id])->count();
                $zcdValue = round($itemCount/$orderCount*100,4);
                if($zcdValue>=$zcd){
                    $insertData[] = ['scba1_p_id' => $row->scb_p_id, 'scba1_zcd' => $zcdValue ];
                }
            }
            if(!empty($insertData)) Db::table('smt_cba_1')->insert($insertData);
        },'scb_p_id');
        $data['orderCount'] = $orderCount;
    }

    public function smt_cba_2()
    {
        set_time_limit(3600 * 10);
        ini_set('memory_limit', '4096M');
        $pidArr = [];
        $rows = Db::table('smt_cba_1')
                ->get();
        foreach($rows as $row){
            $pidArr[] = $row->scba1_p_id;
        }
        $pidCount = count($pidArr);
        $rows = Db::table('smt_cba_base')
                ->join('smt_cba_1', 'smt_cba_base.scb_p_id', '=', 'smt_cba_1.scba1_p_id')
                ->select('scb_custnumber','scb_p_id')->orderBy('scb_custnumber')
                ->get();
        $keyValues = [];
        foreach($rows as $row){
            $keyValues[$row->scb_custnumber][] = $row->scb_p_id;
        }
        unset($rows);
        $dataset = [];
        for($i=0;$i<$pidCount;$i++){
            $item1 = $pidArr[$i];
            for($j=0;$j<$pidCount;$j++){
                if($i!=$j){
                    $item2 = $pidArr[$j];
                    foreach($keyValues as $custnumber=>$values){
                        if(in_array($item1,$values) && in_array($item2,$values)){
                            $itemBoth = $item1.','.$item2;
                            if(!isset($dataset[$itemBoth])) $dataset[$itemBoth] = 0;
                            $dataset[$itemBoth]++;
                        }
                    }
                }
            }
        }
        unset($keyValues);
        Db::table('smt_cba_2')->truncate();
        //Db::query("ALTER TABLE smt_cba_2 DROP INDEX scba2_pid1");
        $insertData = [];
        foreach($dataset as $itemBoth=>$count){
            if($count<5){
                unset($dataset[$itemBoth]);
            }else{
                $sup = $count;
                $tmpArr = explode(',',$itemBoth);
                foreach($tmpArr as $k=>$v){ $tmpArr[$k] = $v*1; }
                $pids = json_encode($tmpArr);
                $insertData[] = ['scba2_pid1'=>$tmpArr[0],'scba2_pid2'=>$tmpArr[1],'scba2_pids'=>$pids,'scba2_sup'=>$sup];
                if(count($insertData)>=1000){
                    Db::table('smt_cba_2')->insert($insertData);
                    $insertData=[];
                }
            }
        }
        if(!empty($insertData)) Db::table('smt_cba_2')->insert($insertData);
        //Db::query("ALTER TABLE smt_cba_2 ADD INDEX (scba2_pid1)");
    }
       
}