<?php
namespace model;
use \model;


class supplier extends model
{
	public $table = 'supplier';
    public $key = 'sup_id';

	public function __construct ()
    {
		parent::__construct();
	}

    function getDb(){
	    return $this->db;
	}

    public function saveDetail($data)
    {
        $cateArr = $data['cate']?explode(',',$data['cate']):[];
        $contactArr = $data['contact']?:[];
        unset($data['cate'],$data['contact']);
        foreach ($data as $field => $val) {
            if(stripos($field,'sup_')!==false)
            {
                if($field =='sup_follow_user'||$field =='sup_qualification'){
                    $val = json_encode($val?explode(',',$val):[]);
                }
                $arr[$field] = $val;
            }
        }
        if($arr['sup_country'] != 'CN'){
            $arr['sup_province_id'] = 0;
            $arr['sup_city_id'] = 0;
            $arr['sup_town_id'] = 0;
        }
        $arr['sup_opuser'] = getOpuser();
        $arr['sup_update_time'] = getNowTime();
        $this->db->Begin();

        if($data['sup_id']){
            unset($arr['sup_id']);
            $this->db->update('supplier',$arr,['sup_id'=>$data['sup_id']]);
            $sup_id = $data['sup_id'];
        }else{
            $arr['sup_create_time'] = getNowTime();
            $this->db->insert('supplier',$arr);
            $sup_id = $this->db->id();
        }
   
        $oldCatArr = $this->db->select('supplier_cate','sc_cat_id',['sc_sup_id'=>$sup_id]);
        $newCatArr = array_diff($cateArr,$oldCatArr);
        if($newCatArr){
            foreach ($newCatArr as $cat_id) {
                $this->db->insert('supplier_cate',['sc_sup_id'=>$sup_id,'sc_cat_id'=>$cat_id]);
            }
        }
   
        $this->updateSupOth($sup_id); 
        
       
        //联系人存储
        $oldContactArr = $this->db->select('supplier_contact','sco_id',['sco_sup_id'=>$sup_id]);
        foreach ($contactArr as $val) {
			$val['sco_opuser'] = getOpuser();
            $val['sco_update_time'] = getNowTime();
			$val['sco_sup_id'] = $sup_id;
			if(in_array($val['sco_id'],$oldContactArr)){
				$this->db->update('supplier_contact',$val,['sco_id'=>$val['sco_id']]);
			}else{
                $val['sco_create_time'] = getNowTime();
				unset($val['sco_id']);
				$this->db->insert('supplier_contact',$val);
			}
		}
		$newIds = array_column($contactArr,'sco_id');
		$delArr = array_diff($oldContactArr,$newIds);
		if($delArr){
			$this->db->delete('supplier_contact',['sco_id'=>$delArr]);
		}
        $this->db->End();

        return ['sup_id'=>$sup_id];
    }

    public function getList($params, $rules = [])
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];
		$this->joinWhere = [];
	
		$table = 'supplier(sup)';
		$join = [
            '[>]adm_user(au)'=>['sup.sup_opuser'=>'au_id']
        ];
		
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
            switch ($field) {
                case 'sup_qualification':
                    $field = 'RAW #1';
                    $data =  (new \model\collocation())->like($data);
                    $data =  raw("JSON_SEARCH(sup_qualification,'one','{$data}')  IS NOT NULL");
                    break;
                case 'sup_country':
                    $data = $this->db->get('crm_country','cc_code',['OR'=>['en_name'=>$data,'cn_name'=>$data]]);
                    break;
                case 'sup_province_id':
                    $data = $this->db->get('province_city','pc_id',['pc_name[~]'=>$data,'pc_pid'=>0]);
                    break;
                case 'sup_city_id':
                    $provinceId = $this->db->select('province_city', 'pc_id', ['pc_pid' => 0]);
                    $data = $this->db->select('province_city','pc_id',['pc_name[~]'=>$data,'pc_pid' => $provinceId]);
                    break;
                case 'sup_town_id':
                    $data = $this->db->get('province_city','pc_id',['pc_name[~]'=>$data,'pc_pid[!]' => 0]);
                    break;
                case 'sco_name':
                    $field = 'RAW #2';
                    $data = raw("sup_id in (select distinct sco_sup_id from supplier_contact where sco_name like '%{$data}%')");
                    break;
                case 'sco_phone':
                    $field = 'RAW #2';
                    $data = raw("sup_id in (select distinct sco_sup_id from supplier_contact where sco_phone= '{$data}' or sco_tel='{$data}')");
                    break;
                case 'sco_job':
                    $field = 'RAW #2';
                    $data = raw("sup_id in (select distinct sco_sup_id from supplier_contact where sco_job= '{$data}'");
                    break;
                case 'sup_follow_user':
                    $field = 'RAW #'.$field;
                    $data =  raw("JSON_SEARCH(sup_follow_user,'one','{$data}')  IS NOT NULL");
                    break;

            }
        });
		
		if(!empty($params['keys'])) $where['sup_id'] = explode(',', $params['keys']);
		if(!empty($params['sup_id'])) $where['sup_id'] = $params['sup_id'];
		
		if(!empty($this->joinWhere)){
			$where = array_merge($where, $this->joinWhere);
		}
        // $where['sco.sco_ismain'] = 1;
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$fields = '*';
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
        
		$fields = ['sup.*','au_name'];
        $arr = $this->db->select($table,$join,$fields,$where);
        if($arr)
        {
            //查联系人
            $contactList = [];
            //主联系人
            $mainContact = [];
            $supIdArr = array_column($arr,'sup_id');
            if($supIdArr)
            {
                $contactRes = $this->db->select('supplier_contact','*',['sco_sup_id'=>$supIdArr,'ORDER'=>['sco_ismain'=>'DESC']]);
                foreach ($contactRes as $key => $val) {
                    $contactList[$val['sco_sup_id']][] = $val;
                    if($val['sco_ismain']){
                        $mainContact[$val['sco_sup_id']] = $val;
                    } 
                    
                }
            }
            //查分类
            $cateArr = [];
            $cateRes = $this->db->select('supplier_cate(sca)',['[><]pro_cate(cate)'=>['sca.sc_cat_id'=>'id']],['sca.*',LG_NAME],['sc_sup_id'=>$supIdArr]);
            foreach ($cateRes as $key => $val) {
                $cateArr[$val['sc_sup_id']][] = $val;
            }
            //查国家
            $countryArr = [];
            $cou = array_unique(array_filter(array_column($arr,'sup_country')));
            if($cou){
                $countryArr = $this->db->select('crm_country','*',['cc_code'=>$cou]);
                $countryArr = array_column($countryArr,null,'cc_code');
            }
            
            //省市县
            $pctIdArr = [];
            foreach ($arr as $val) {
                if($val['sup_province_id']) $pctIdArr[] = $val['sup_province_id'];
                if($val['sup_city_id']) $pctIdArr[] = $val['sup_city_id'];  
                if($val['sup_town_id']) $pctIdArr[] = $val['sup_town_id'];  
            }
            if($pctIdArr){
                $allPctArr = $this->db->select('province_city',['pc_id','pc_name'],['pc_id'=>array_unique($pctIdArr)]);
                $allPctArr = array_column($allPctArr,'pc_name','pc_id');
            }
            //查资质
            $hasProStatus =[1=>'有',-1=>'无'];
            foreach($arr as &$v){
                $v['cate_id'] = $cateArr[$v['sup_id']]?implode(',',array_column($cateArr[$v['sup_id']],'sc_cat_id')) :'';
                $v['cate_name'] = $cateArr[$v['sup_id']]?implode(',',array_column($cateArr[$v['sup_id']],LG_NAME)) :'';
                $v['contactList'] = $contactList[$v['sup_id']]?$contactList[$v['sup_id']]:[];
               
                $v['sup_com_clsj'] = $v['sup_com_clsj']=='0000-00-00'?'':$v['sup_com_clsj'];
                $v['sup_com_zczj'] = $v['sup_com_zczj']?:'';
                $v['sup_com_worker'] = $v['sup_com_worker']?:'';
                $v['captions'] = [
                    'sup_country'=>$countryArr[$v['sup_country']]['cn_name']??'',
                    'sup_province_id'=>'',
                    'sup_city_id'=>'',
                    'sup_town_id'=>'',
    
                    'sup_status'=>$v['sup_status']==1?'正式':'潜在',
                    'sup_level'=>(new \model\collocation())->getRowByKey($v['sup_level'])[cateName()],
                    'sup_haspro'=>$hasProStatus[$v['sup_haspro']]??'',
                    'sup_opuser'=>$v['au_name']
                ];
                //分配跟进人
        
                $v['sup_follow_user'] = $v['sup_follow_user']?json_decode($v['sup_follow_user'],true):[];
                
                if($v['sup_follow_user']){
                    $ures = $this->db->get('adm_user',['sup_follow_user'=>raw("GROUP_CONCAT(au_name)")],['au_id'=>$v['sup_follow_user'],'ORDER'=>['au_name'=>'ASC']]);
                    $v['captions']['sup_follow_user'] = $ures['sup_follow_user']?:'';
                }else{
                    $v['captions']['sup_follow_user'] = '';
                }
                $v['sup_follow_user'] = implode(',',$v['sup_follow_user']);
                $sup_qualification = $v['sup_qualification'] ?json_decode($v['sup_qualification'],true):[];
                $v['sup_qualification'] = $sup_qualification?implode(',',$sup_qualification):'';
                if($sup_qualification){
                    $objarr = $this->db->select('object', LG_NAME,['o_id'=>$sup_qualification]);
                    $v['captions']['sup_qualification'] = implode(',',$objarr);
                }
      
                if($v['sup_country'] =='CN'){
                    $v['captions']['sup_province_id'] = $allPctArr[$v['sup_province_id']];
                    $v['captions']['sup_city_id'] = $allPctArr[$v['sup_city_id']];
                    $v['captions']['sup_town_id'] = $allPctArr[$v['sup_town_id']];
                }
                //主联系人
                $v['sco_name'] ='';
                $v['sco_phone'] ='';
                $v['sco_job'] ='';
                if($mainContact[$v['sup_id']]){
                    $v['sco_name'] = $mainContact[$v['sup_id']]['sco_name']??'';
                    $v['sco_phone'] = implode("/",array_filter([$mainContact[$v['sup_id']]['sco_phone'],$mainContact[$v['sup_id']]['sco_tel']]));
                    $v['sco_job'] = $mainContact[$v['sup_id']]['sco_job']??'';
                }
            }
        }
		
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}

	public function getCompanyInfo($keyword)
	{   
        $url = 'https://www.tianyancha.com/nsearch';
        $data = [
            'key' => $keyword
        ];
        $cookie = \mvc::$cfg['tycCookie'];
        if(!$cookie) exitJson(-1,'请先配置天眼查cookie');
        $header = [
            'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
            'Accept-Encoding:gzip, deflate, br, zstd',
            'Accept-Language:zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
            'Cache-Control:max-age=0',
            'Connection:keep-alive',
            'Cookie:'.$cookie,
            'Host:www.tianyancha.com',
            'sec-ch-ua:"Not A(Brand";v="8", "Chromium";v="132", "Microsoft Edge";v="132"',
            'sec-ch-ua-mobile:?0',
            'sec-ch-ua-platform:"Windows"',
            'sec-fetch-dest:document',
            'sec-fetch-mode:navigate',
            'sec-fetch-site:same-origin',
            'sec-fetch-user:?1',
            'upgrade-insecure-requests:1',
            'user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0'
        ];
        $content = $this->curlGet($url, $data,$header);
        
        //公司链接
        $hrefLink = '';
        //获取页面下公司列表
        preg_match("/<script id=\"__NEXT_DATA__\" type=\"application\/json\">({.*})<\/script><\/body>/is", $content, $jsonMatches);
        $data =  json_decode($jsonMatches[1], true);
        $companyList =  $data['props']['pageProps']['listRes']['data'];
        $companyArr =  $companyList['companyList']??[];
		
        if(empty($companyArr)){
            return [];
        }
	
        if (count($companyArr)>=1) 
        {
            $haspreg = 0;
            foreach ($companyArr as $companyItem) 
            {
                if (strip_tags($companyItem['name']) == $keyword) 
                {
                    $hrefLink = 'https://www.tianyancha.com/company/'.$companyItem['id'];
                    $haspreg = 1;
                    break;
                }
            }
            if (empty($haspreg)) return [];
        } 
        $contentDetail =  $this->curlGet($hrefLink,[],$header);
        //匹配详情页里的json
        preg_match("/<script id=\"__NEXT_DATA__\" type=\"application\/json\">({.*})<\/script>/is", $contentDetail, $jsonMatches);
        if (empty($jsonMatches[1])) return [];
        $data =  json_decode($jsonMatches[1], true);
        $company =  $data['props']['pageProps']['dehydratedState']['queries'][0]['state']['data']['data'];

        $retdata = [
            'com_hy' => $company['industry'],
            'com_clsj'=> date('Y-m-d',$company['fromTime']/1000),
            'com_frdb' => $company['legalPersonName'],
            'com_zczj' => $company['regCapitalAmount'],
            'com_gsdj' => $company['regNumber'],
            'com_uninum' => $company['creditCode'],
            'com_addr' => $company['regLocation'],
            'com_nsrsbh' => $company['taxNumber'],
            'com_nsrzz'  => $company['taxQualification'],
            'com_worker' => $company['socialStaffNum'],
            'com_status' => $company['regStatus'],
            'com_enname' => $company['property3'],
            'com_oldname' => $company['historyNames']??'',
        ];
        return $retdata;
	}

	protected function  curlGet($url, $data = [], $header = [])
    {
        // 处理get数据
        if (!empty($data)) {
            $url = $url . '?' . http_build_query($data);
        }
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0");
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        // curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_ACCEPT_ENCODING, "gzip, deflate, br, zstd");
        if (!empty($header)) {
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        }

        $cookie_file = './cookies.txt';
        curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); 
        curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); 

        $result = curl_exec($curl);
        if(strpos($result,'login?')!==false){
            exitJson(-1,'天眼查cookie失效，请重新配置');
        }
        if(!$result){
          $errormsgf =  curl_error($curl);
        }
        curl_close($curl);
        return $result;
    }

    public function delData($idArr)
    {
        if(!empty($idArr)){

			$this->db->Begin();

			$this->db->delete('supplier', ['sup_id'=>$idArr]);
			//删除关联联系人
			$this->db->delete('supplier_contact',['sco_sup_id'=>$idArr]);
			//删除关联分类
			$this->db->delete('supplier_cate',['sc_sup_id'=>$idArr]);
			$this->db->End();
		}
		return [];
    }
	
    public function updateSupOth($sup_id)
    {
       
        $data = $this->db->select('supplier_pro',['spr_cat_id','spr_sup_id'],['spr_sup_id'=>$sup_id,'GROUP'=>['spr_cat_id']]);
    
        if(!empty($data)){
           
            $cateArr = array_column($data,'spr_cat_id');
            //分类存储
            $oldCatArr = $this->db->select('supplier_cate','sc_cat_id',['sc_sup_id'=>$sup_id]);
            $newCatArr = array_diff($cateArr,$oldCatArr);
            if($newCatArr){
                foreach ($newCatArr as $cat_id) {
                    $this->db->insert('supplier_cate',['sc_sup_id'=>$sup_id,'sc_cat_id'=>$cat_id]);
                }
            }
        }
        $haspro = $this->db->get('supplier','sup_haspro',['sup_id'=>$sup_id]);
        if($haspro !=1 && !empty($data))
        {
            $this->db->update('supplier',['sup_haspro'=>1],['sup_id'=>$sup_id]);
        }
        
    }

    /**
     * @method 通过宜配API获取公司信息
     * @author zhengweihua 
     * @copyright 2025-06-11
     */
    public function getCompanyInfoByApi($keyword)
    {
        $ypApi = new \model\ypApi();
		$res = $ypApi->Get('index/searchCompany', ['word'=>$keyword]);
        $arr = $res['status']? $res['data']: [];
        if(count($arr)==1)
        {   
            $data = $arr[0];
            $pctIdArr = $data['com_pct_ids']?explode(',',$data['com_pct_ids']):[];
            $retdata = [
                'com_hy' => $data['com_industry'],
                'com_clsj'=> date('Y-m-d',$data['com_estiblish_time']),
                'com_frdb' => $data['com_legal_person'],
                'com_zczj' => floatval($data['com_capital']),
                'com_gsdj' => $data['com_regnum'],
                'com_uninum' => $data['com_credit_code'],
                'com_addr' => $data['com_location'],
                'com_nsrsbh' => $data['com_credit_code'],
                'com_nsrzz'  => $data['taxQualification']??'',
                'com_worker' => $data['com_staff'],
                'com_status' => $data['com_regstatus'],
                'com_enname' => $data['com_name_en'],
                'com_oldname' => $data['com_name_olds']??'',
                'com_province_id'=>$pctIdArr[0],
                'com_city_id'=> $pctIdArr[1]??0,
                'com_town_id'=> $pctIdArr[2]??0,
                'com_province'=>$data['com_province'],
                'com_city'=>$data['com_city']??'',
                'com_town'=>$data['com_distric']
            ];
        }
        
        return $retdata;
    }
}