<?php
namespace model\wdzy;
use \model;
use model\import\pro;
use model\rcaApi;
use model\wdzy;


class factory extends model
{
	public $table = 'factory';
    public $key = 'fac_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,'fac_')!==false)
            {
                if($field =='fac_follow_user'||$field =='fac_qualification'){
                    $val = json_encode($val?explode(',',$val):[]);
                }
                $arr[$field] = $val;
            }
        }
        if($arr['fac_country'] != 'CN'){
            $arr['fac_province_id'] = 0;
            $arr['fac_city_id'] = 0;
            $arr['fac_town_id'] = 0;
        }
        $arr['fac_opuser'] = getOpuser();
        $arr['fac_update_time'] = getNowTime();
        //查是否唯一
        $isOnly = $this->db->get('factory','fac_id',['fac_name'=>$arr['fac_name'], 'fac_id[!]'=>$data['fac_id']??0]);
        if($isOnly){
            exitJson(false,'工厂名称已存在，请修改后重新保存！');
        }
        //查编号是否存在
        $existCode = $this->db->get('factory','fac_id',['fac_code'=>$arr['fac_code'], 'fac_id[!]'=>$data['fac_id']??0]);
        if($existCode) exitJson(false,'工厂编号已存在，请修改后重新保存！');
        
        $resource_facid = '';
        if(!empty($data['fac_id'])){
            $olaFac = $this->db->get('factory',['fac_resource_facid','fac_name','fac_alias'],['fac_id'=>$data['fac_id']]); 
            $resource_facid = $olaFac['fac_resource_facid']??'';

        }
        //不存在资源库工厂id
        if(!$resource_facid){
           $resource_facid = $this->getResourceFacId($arr['fac_name'],$arr['fac_alias']); 
           $arr['fac_resource_facid'] = $resource_facid;
        }elseif ($resource_facid && ($olaFac['fac_name']!= $arr['fac_name']|| $olaFac['fac_alias']!= $arr['fac_alias'])) {
   
            $wdzy = new wdzy();
            $upfac = [
                'Name'=>$arr['fac_name'],
                'AliasName'=>$arr['fac_alias']?: $arr['fac_name']
            ];
            if(\mvc::$cfg['RCAAPI']['tenantId']){
                $upfac['TenantId'] = \mvc::$cfg['RCAAPI']['tenantId'];
            }
            $wdzy->db->update('resourcefactory',$upfac,['Id'=>$resource_facid]);
          
        }
        if(!$resource_facid){
            exitJson(false,'资源库工厂ID获取失败，请检查网络或稍后重试！');
        }

        $this->db->Begin();

        if($data['fac_id']){
            unset($arr['fac_id']);
            $this->db->update('factory',$arr,['fac_id'=>$data['fac_id']]);
            $fac_id = $data['fac_id'];
        }else{
            $arr['fac_create_time'] = getNowTime();
            $this->db->insert('factory',$arr);
            $fac_id = $this->db->id();
        }

        $oldCatArr = $this->db->select('factory_cate','fc_cat_id',['fc_fac_id'=>$fac_id]);
        $newCatArr = array_diff($cateArr,$oldCatArr);
        if($newCatArr){
            foreach ($newCatArr as $cat_id) {
                $this->db->insert('factory_cate',['fc_fac_id'=>$fac_id,'fc_cat_id'=>$cat_id]);
            }
        }
               
        //联系人存储
        $oldContactArr = $this->db->select('factory_contact','fco_id',['fco_fac_id'=>$fac_id]);
        foreach ($contactArr as $val) {
			$val['fco_opuser'] = getOpuser();
            $val['fco_update_time'] = getNowTime();
			$val['fco_fac_id'] = $fac_id;
			if(in_array($val['fco_id'],$oldContactArr)){
				$this->db->update('factory_contact',$val,['fco_id'=>$val['fco_id']]);
			}else{
                $val['fco_create_time'] = getNowTime();
				unset($val['fco_id']);
				$this->db->insert('factory_contact',$val);
			}
		}
		$newIds = array_column($contactArr,'fco_id');
		$delArr = array_diff($oldContactArr,$newIds);
		if($delArr){
			$this->db->delete('factory_contact',['fco_id'=>$delArr]);
		}
        $this->db->End();

        return ['fac_id'=>$fac_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 = 'factory(fac)';
		$join = [
            '[>]adm_user(au)'=>['fac.fac_opuser'=>'au_id']
        ];
		
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
            switch ($field) {
                
                case 'fac_country':
                    $data = $this->db->get('crm_country','cc_code',['OR'=>['en_name'=>$data,'cn_name'=>$data]]);
                    break;
                case 'fac_province_id':
                    $data = $this->db->get('province_city','pc_id',['pc_name[~]'=>$data,'pc_pid'=>0]);
                    break;
                case 'fac_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 'fac_town_id':
                    $data = $this->db->get('province_city','pc_id',['pc_name[~]'=>$data,'pc_pid[!]' => 0]);
                    break;
                case 'fco_name':
                    $field = 'RAW #2';
                    $data = raw("fac_id in (select distinct fco_fac_id from factory_contact where fco_name like '%{$data}%')");
                    break;
                case 'fco_phone':
                    $field = 'RAW #2';
                    $data = raw("fac_id in (select distinct fco_fac_id from factory_contact where fco_phone= '{$data}' or fco_tel='{$data}')");
                    break;
                case 'fco_job':
                    $field = 'RAW #2';
                    $data = raw("fac_id in (select distinct fco_fac_id from factory_contact where fco_job= '{$data}'");
                    break;

            }
        });
		
		if(!empty($params['keys'])) $where['fac_id'] = explode(',', $params['keys']);
		if(!empty($params['fac_id'])) $where['fac_id'] = $params['fac_id'];
		
		if(!empty($this->joinWhere)){
			$where = array_merge($where, $this->joinWhere);
		}
        // $where['sco.fco_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 = ['fac.*','au_name'];
        $arr = $this->db->select($table,$join,$fields,$where);
        if($arr)
        {
            //查联系人
            $contactList = [];
            //主联系人
            $mainContact = [];
            $facIdArr = array_column($arr,'fac_id');
            if($facIdArr)
            {
                $contactRes = $this->db->select('factory_contact','*',['fco_fac_id'=>$facIdArr,'ORDER'=>['fco_ismain'=>'DESC']]);
                foreach ($contactRes as $key => $val) {
                    $contactList[$val['fco_fac_id']][] = $val;
                    if($val['fco_ismain']){
                        $mainContact[$val['fco_fac_id']] = $val;
                    } 
                    
                }
            }
            //查分类
            $cateArr = [];
            $cateRes = $this->db->select('factory_cate(sca)',['[><]pro_cate(cate)'=>['sca.fc_cat_id'=>'id']],['sca.*',LG_NAME],['fc_fac_id'=>$facIdArr]);
            foreach ($cateRes as $key => $val) {
                $cateArr[$val['fc_fac_id']][] = $val;
            }
            //查国家
            $countryArr = [];
            $cou = array_unique(array_filter(array_column($arr,'fac_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['fac_province_id']) $pctIdArr[] = $val['fac_province_id'];
                if($val['fac_city_id']) $pctIdArr[] = $val['fac_city_id'];  
                if($val['fac_town_id']) $pctIdArr[] = $val['fac_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');
            }
            //查资源库数据库
            $resourcefacids = array_unique(array_filter(array_column($arr,'fac_resource_facid')));
            if($resourcefacids)
            {
                $wdzy = new wdzy();
                //统计资源库数
                $zykarr = $wdzy->db->select('resource',['num'=>raw('count(ResourceFactoryId)'),'ResourceFactoryId'],['isDeleted'=>0,'ResourceFactoryId'=>$resourcefacids,'GROUP'=>'ResourceFactoryId']);
                $zykarr = $zykarr?array_column($zykarr,'num','ResourceFactoryId'):[];
                //查零件库数partNumberCount
                $partArr = $wdzy->db->select('resourcenumber(num)',['[><]resource(r)'=>['num.ResourceId'=>'Id']],['num'=>raw('count(DISTINCT FormatNumber,ResourceId)'),'r.ResourceFactoryId'],['r.IsDeleted'=>0,'r.ResourceFactoryId'=>$resourcefacids,'GROUP'=>'ResourceFactoryId']);
                $partArr = $partArr?array_column($partArr,'num','ResourceFactoryId'):[];
        
                //查清洗数据
                $join = [
                    '[><]resourcenumber(num)'=>['ncr.ReplaceNumber'=>'FormatNumber'],
                    '[><]resource(r)'=>['num.ResourceId'=>'Id']
                ];
                $cleanArr = $wdzy->db->select('numbercleanresult(ncr)',$join,['num'=>raw('count(*)'),'r.ResourceFactoryId'],['r.isDeleted'=>0,'r.ResourceFactoryId'=>$resourcefacids,'GROUP'=>'ResourceFactoryId']);
                $cleanArr = $cleanArr?array_column($cleanArr,'num','ResourceFactoryId'):[];
                
            }
           
            foreach($arr as &$v){
                $v['resourceCount'] = $zykarr[$v['fac_resource_facid']]?$zykarr[$v['fac_resource_facid']]:0;
                $v['partNumberCount'] = $partArr[$v['fac_resource_facid']]?$partArr[$v['fac_resource_facid']]:0;
                $v['numberCleanCount'] = $cleanArr[$v['fac_resource_facid']]?$cleanArr[$v['fac_resource_facid']]:0;
                $v['numberCleanRateDesc'] = $v['partNumberCount']?round($v['numberCleanCount']/$v['partNumberCount'],4) *100 .'%':'';
                $v['cate_id'] = $cateArr[$v['fac_id']]?implode(',',array_column($cateArr[$v['fac_id']],'fc_cat_id')) :'';
                $v['cate_name'] = $cateArr[$v['fac_id']]?implode(',',array_column($cateArr[$v['fac_id']],LG_NAME)) :'';
                $v['contactList'] = $contactList[$v['fac_id']]?$contactList[$v['fac_id']]:[];
               
                $v['fac_com_clsj'] = $v['fac_com_clsj']=='0000-00-00'?'':$v['fac_com_clsj'];
                $v['fac_com_zczj'] = $v['fac_com_zczj']?:'';
                $v['fac_com_worker'] = $v['fac_com_worker']?:'';
                $v['captions'] = [
                    'fac_country'=>$countryArr[$v['fac_country']]['cn_name']??'',
                    'fac_province_id'=>'',
                    'fac_city_id'=>'',
                    'fac_town_id'=>'',
                    'fac_opuser'=>$v['au_name']
                ];
               
                if($v['fac_country'] =='CN'){
                    $v['captions']['fac_province_id'] = $allPctArr[$v['fac_province_id']];
                    $v['captions']['fac_city_id'] = $allPctArr[$v['fac_city_id']];
                    $v['captions']['fac_town_id'] = $allPctArr[$v['fac_town_id']];
                }
                //主联系人
                $v['fco_name'] ='';
                $v['fco_phone'] ='';
                $v['fco_job'] ='';
                if($mainContact[$v['fac_id']]){
                    $v['fco_name'] = $mainContact[$v['fac_id']]['fco_name']??'';
                    $v['fco_phone'] = implode("/",array_filter([$mainContact[$v['fac_id']]['fco_phone'],$mainContact[$v['fac_id']]['fco_tel']]));
                    $v['fco_job'] = $mainContact[$v['fac_id']]['fco_job']??'';
                }
            }
        }
		
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}

    public function delData($idArr)
    {
        if(!empty($idArr)){
            $arr = $this->db->select('factory','fac_resource_facid',['fac_id'=>$idArr]);
			$this->db->Begin();

			$this->db->delete('factory', ['fac_id'=>$idArr]);
			//删除关联联系人
			$this->db->delete('factory_contact',['fco_fac_id'=>$idArr]);
			//删除关联分类
			$this->db->delete('factory_cate',['fc_fac_id'=>$idArr]);
            //删除资源库里的数据
            $rcaApi =  new rcaApi();
            $data = [
                "ids"=>$arr
            ];
            $res = $rcaApi->Get('resourcefactory/deletedirect',[],$data);
           
			$this->db->End();
		}
		return [];
    }
	
    /**
     * @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;
    }

    /**
     * @param  名称 $fac_name
     * @param  简称 $fac_alias
     * @method  通过名称简称获取工厂id
     * @author zhengweihua 
     * @copyright 2025-07-10
     */
    public function getResourceFacId($fac_name,$fac_alias)
    {       
        if($fac_name==''){
            return '';
        }

        $where = ['Name'=>$fac_name];
        
        if(\mvc::$cfg['RCAAPI']['tenantId']){
            $where['TenantId'] = \mvc::$cfg['RCAAPI']['tenantId'];
        }
        $wdzy = new wdzy();
        $fac_resource_facid = $wdzy->db->get('resourcefactory','Id',$where);
        if($fac_resource_facid) return  $fac_resource_facid;

        //获取当前用户的资源库UserId
        $user = new user();
        $abpUserId = $user->getApbUserId(getOpuser());
        //获取分类ID
        $resource = new resource();
        $proCategoryIds = $resource->getFactoryCate();

        $fac_resource_facid = '';
        $rcaApi =  new rcaApi();
        $data = [
            "name"=>$fac_name,
            "aliasName"=>$fac_alias?: $fac_name,
            "ypSalesmanId"=>$abpUserId,
            "proCategoryIds"=>[
                $proCategoryIds
            ]
        ];
        $res = $rcaApi->Get('resourcefactory/add',[],$data);
        if($res['success']){
            //添加完再获取一次
            $fac_resource_facid = $wdzy->db->get('resourcefactory','Id',$where);
            return $fac_resource_facid;
        }
       
       
    }

    /**
     * @method 初始化没有资源库工厂ID的数据
     * @author zhengweihua 
     * @copyright 2025-09-29
     */
    public function initNoResourceId()
    {
        $list = $this->db->select('factory','*',['fac_resource_facid'=>'']);
        foreach ($list as $val) {
            $fac_resource_facid = $this->getResourceFacId($val['fac_name'],$val['fac_alias']);
            if($fac_resource_facid){
                $this->db->update('factory',['fac_resource_facid'=>$fac_resource_facid],['fac_id'=>$val['fac_id']]);
            }
        }
        return true;
    }

    /**
     * @param  Array $params
     * @method 查找工厂信息
     * @author zhengweihua 
     * @copyright 2025-10-15
     */
    public function getFactoryInfo($params)
    {   
        if(empty($params['keyword'])){
            return [];
        }
        $where = [];
        if($params['keyword']){
            $where['OR'] = [
                'fac_code' => $params['keyword'],
                'fac_name' => $params['keyword']
            ];
        }
        $row = $this->db->get('factory','*',$where);
        return $row;
    }
}