<?php
/**
 * @method 天裕隆-大有 配件同步类
 * @author zhengweihua 
 * @copyright 2025-03-06
 */
class B2cTylCustom extends B2cBaseCustom
{
    public function __construct($dyApiConfig = null)
    {
        parent::__construct($dyApiConfig);
        $this->dyopenApi = [
            'baseUrl'=>'http://openapi.doyor.com/',
            'appkey'=>'eebb9b6f376b4a68ae7ef94652c02edd',
            'appKeySecret'=>'6139a254-133c-4ee2-a72e-e883583e79c7',
            'accid'=>20308,
            'accname'=>"天津天裕隆科技有限公司",
            'productionID'=>"KDfm96XUsnmIhCYSmk+E6g=="
        ];
    } 

     /**
     * @method 通过厂家编码更新配件信息
     * @author zhengweihua _
     * @copyright 2025-03-07
     */
    public function updateProductByCode($shopId)
    {   
		LibLog::write('Erp同步开始');
		mvc::$cfg['LOGUSER']['uid'] = 8;
		mvc::$cfg['LOGUSER']['urname'] = 'Erp同步';
        $B2cProduct =  new B2cProduct();
		
        $table = 'bc_number 
        join bc_product on pro_id = num_pro_id 
        join bc_product_info on pri_pro_id = num_pro_id';
        $fields = ['num_display,pri_code,pri_des,num_format,pro_id,pro_name,pro_count,pro_sale_price,pro_price_vip1,pro_price_vip2,pro_price_vip3,pro_price_vip4,pro_prb_id,pro_self'];
        $res =  $B2cProduct->get($table,$fields,sprintf(" AND num_factory = '厂家编码' AND pro_shop_id = %d order by num_id desc",$shopId));
       
        $numKeyArr = [];
        if($res['data'])
        {
            foreach ($res['data'] as $key => $val) {
            
                $numKeyArr[$val['num_display']][] = $val;
            }
        }
        

        $table = 'bc_number join bc_product on pro_id = num_pro_id';
        $res = $this->get($table,["CONCAT_WS('_',num_factory,num_format,num_pro_id) as keyname,num_id,num_pro_id,num_ismain"],sprintf(" AND pro_shop_id=%d AND (num_ismain=1 or num_factory='OE')",$shopId));
        $oemNumArr = array_column($res['data'],null,'keyname');    
        //统计ismain的个数
        $oemMainCnt = [];
        foreach ($res['data'] as $key => $val) {
            if($val['num_ismain']) $oemMainCnt[$val['num_pro_id']][] = $val;
        }        
        $cacheData = $this->getStockChange($shopId);

        if($cacheData)
        {
            $B2cBrand = new B2cBrand();
            //查未归类的分类id
            $partArr = [];
            $partres = $this->get('bc_part join bc_part_tree on part_id=pt_part_id', ['pt_part_id', 'pt_path'], sprintf(" and part_name='%s' and pt_ismain=1", '未归类'), true);
            if($partres['data']){
                $partArr['pro_part_id'] = $partres['data']['pt_part_id'];
                $partArr['pro_part_path'] = $partres['data']['pt_path'] . ',' . $partres['data']['pt_part_id'];
            }
            //取店铺品牌
            $brdres = $this->get('sh_probrand_link join bc_probrand on prb_id=sprl_prb_id', ['prb_id', 'prb_name'], sprintf(" and sprl_shop_id = %d", $shopId));
            $brandArr = $brdres['data'] ? array_column($brdres['data'], 'prb_name', 'prb_id') : [];
            //取配件所有自编号
            $selfres =  $this->get('bc_number join bc_product_info on pri_pro_id = num_pro_id join bc_product on pro_id=num_pro_id',['pro_id','num_id','num_factory','num_display','pri_code'],sprintf(" and pro_shop_id=%d and num_self=1",$shopId));
            $selfNumArr = $selfres['data']? array_column($selfres['data'], null, 'pro_id') : [];
            //取配件自定义规格
            $table = 'bc_product 
            JOIN bc_product_para_val on prpv_pro_id=pro_id
            join bc_product_label on prpv_prl_id=prl_id';
            $selfParmres =  $this->get($table,['pro_id','prpv_value'],sprintf(" and prl_name='%s' and pro_shop_id=%d",'规格',$shopId));
            $selfParmArr = $selfParmres['data']? array_column($selfParmres['data'], null, 'pro_id') : [];
            // 通过厂家编码匹配更新相应信息
            foreach ($cacheData as $cacheArr) 
            {
                if(is_array($cacheArr) && $cacheArr['plFit'])
                {
                    $addNumArr = [];
                    foreach ($cacheArr['plFit'] as $key => $val) 
                    {   

                        $hwcode = LibFc::Escape($val['expand1']);
                        if($hwcode =='-'||!$hwcode) continue;
                        //库存
                        $kc01 = (int)$val['wareamount'];
                        $kc02 = 0;
                        $pro_count = $kc01+$kc02;
                        if ($val['brandclassname']) {
                            
                            if ($brandArr[$val['brandclassname']]) {
                                $pro_prb_id =  (int) $brandArr[$val['brandclassname']];
                            } else {
                                $brdres = $B2cBrand->addShopBrand($shopId, $val['brandclassname']);
                                $pro_prb_id = (int)$brdres['data'];
                                $brandArr[$val['brandclassname']] = $pro_prb_id;
                            }
                        }
                        $proIdArr = [];
                        $this->B2CDb->Begin();
                        if(!isset($numKeyArr[$hwcode]))
                        {   
                            //新增
                            if($val['price']>0.1)
                            {
                                $addBase = [
                                    'pro_count'=>$pro_count,
                                    'pro_name' => $val['fittingsname']?:'',
                                    'pro_sale_price' => sprintf("%.2f",($val['price']?:0)),
                                    'pro_price_vip1' => sprintf("%.2f",($val['price']?:0)),
                                    'pro_price_vip2' => sprintf("%.2f",($val['price2']?:0)),
                                    'pro_price_vip3' => sprintf("%.2f",($val['price2']?:0)),
                                    'pro_price_vip4' => sprintf("%.2f",($val['lowprice']?:0)),
                                    'pro_self'=>json_encode(['wareamount01'=>$kc01,'wareamount02'=>$kc02])
                                ];
                                if($pro_prb_id){
                                    $addBase['pro_prb_id'] = $pro_prb_id;  
                                }
                                $addBase['pro_shop_id'] = $shopId;
                                //默认未归类
                                $addBase['pro_part_id'] = $partArr['pro_part_id']??0;
                                $addBase['pro_part_path'] = $partArr['pro_part_path']??0;
                                //通过名称找配件分类
                                $sortArr = [];
                                $prores =  $this->get('bc_product', ['pro_id,pro_part_id,pro_part_path,pro_pas_id'], sprintf(" AND pro_name='%s' AND pro_shop_id", $addBase['pro_name'],$shopId), true);
                                if ($prores['data']) {
                                    $addBase['pro_part_id'] = $prores['data']['pro_part_id'];
                                    $addBase['pro_part_path'] = $prores['data']['pro_part_path'];
                                    $addBase['pro_pas_id'] = $prores['data']['pro_pas_id'];
                                    //店铺分类
                                    $sortres = $this->get('bc_product_sort', ['prs_sort_id'], sprintf(" AND prs_pro_id=%d", $prores['data']['pro_id']));
                                    $sortArr = array_column($sortres['data'], 'prs_sort_id');
                                }
                                //厂家编码
                                $numsArr = [
                                    ['num_factory'=>'厂家编码','num_display'=>$val['expand1'],'num_format'=>$hwcode,'num_reformat'=>strrev($hwcode)]
                                ];
                                $addData = [
                                    'base'=>$addBase,
                                    'info'=>['pri_code'=>$val['expand1'],'pri_des'=>'<p><span style="font-size: 20px;"><strong>'.$val['carmodel'].'</strong></span></p>'],
                                    'shopSort'=>$sortArr,
                                    'nums'=>$numsArr
                                ];
                                $addres = $B2cProduct->addProduct($addData,$shopId);
                              
                                $proIdArr[] = $addres['data'];
                            }
                        }
                        else
                        {
                            $proInfoArr = $numKeyArr[$hwcode];
                            foreach ($proInfoArr as $key => $proInfo) 
                            {   
                                $info =  [];
                                $proId = $proInfo['pro_id'];
                                
                                $base =[
                                    'pro_count'=>$pro_count,
                                    'pro_name' => $val['fittingsname']?:($proInfo['pro_name']??''),
                                    'pro_sale_price' => sprintf("%.2f",($val['price']?:($proInfo['pro_sale_price']??0))),
                                    'pro_price_vip1' => sprintf("%.2f",($val['price']?:($proInfo['pro_price_vip1']??0))),
                                    'pro_price_vip2' => sprintf("%.2f",($val['price2']?:($proInfo['pro_price_vip2']??0))),
                                    'pro_price_vip3' => sprintf("%.2f",($val['price2']?:($proInfo['pro_price_vip3']??0))),
                                    'pro_price_vip4' => sprintf("%.2f",($val['lowprice']?:($proInfo['pro_price_vip4']??0))),
                                    'pro_self'=>json_encode(['wareamount01'=>$kc01,'wareamount02'=>$kc02])
                                ];
                                if($pro_prb_id) $base['pro_prb_id'] = $pro_prb_id;

                                //基础信息不一致就更新
                                $oldData = [
                                    'pro_count'=> $proInfo['pro_count'],
                                    'pro_name' => $proInfo['pro_name'],
                                    'pro_sale_price' =>  sprintf("%.2f",$proInfo['pro_sale_price']),
                                    'pro_price_vip1' =>  sprintf("%.2f",$proInfo['pro_price_vip1']),
                                    'pro_price_vip2' =>  sprintf("%.2f",$proInfo['pro_price_vip2']),
                                    'pro_price_vip3' =>  sprintf("%.2f",$proInfo['pro_price_vip3']),
                                    'pro_price_vip4' =>  sprintf("%.2f",$proInfo['pro_price_vip4']),
                                    'pro_prb_id' => $proInfo['pro_prb_id'],
                                    'pro_self'=>json_encode($proInfo['pro_self']?json_decode($proInfo['pro_self'],true):[]),
                                ];
                                $diffArr = array_diff_assoc($base,$oldData);
                                if($diffArr){
                                    $this->set('bc_product', $diffArr, sprintf(" and pro_id = %d", $proId));
                                }
                                
                                //存在车型数据
                                if($val['carmodel']!=strip_tags($proInfo['pri_des']))
                                {
                                    $info['pri_des'] = '<p><span style="font-size: 20px;"><strong>'.$val['carmodel'].'</strong></span></p>';   
                                }
                                //更新自编码
                                if($val['expand1'] && $val['expand1']!='-')
                                {       
                                    if($key>0){
                                        $tempexpand1 = $val['expand1'].'-'.$key;
                                    }else{
                                        $tempexpand1 = $val['expand1'];
                                    }
                                    
                                    if($selfNumArr[$proId])
                                    {   
                                        if(($tempexpand1!=$selfNumArr[$proId]['num_display'] || $val['brandclassname']!=$selfNumArr[$proId]['num_factory']))
                                        {
                                            $numId = $selfNumArr[$proId]['num_id'];
                                            $setArr = [
                                                'num_pro_id' => $proId,
                                                'num_factory' => $val['brandclassname'],
                                                'num_display' => $tempexpand1,
                                                'num_format' => LibFc::FormatNum($tempexpand1),
                                                'num_self' => 1
                                            ];
                                            $setArr['num_reformat'] = strrev($setArr['num_format']);
                                            $this->set('bc_number', $setArr, sprintf(" and num_id=%d", $numId));
                                            $info['pri_code'] = $tempexpand1;
                                        }
                                        if($selfNumArr[$proId]['pri_code']!=$tempexpand1){
                                            $info['pri_code'] = $tempexpand1;
                                        }
                                    }
                                }
                                if($info){
                                    $this->set('bc_product_info', $info, sprintf(" and pri_pro_id = %d", $proId)); 
                                }
                                $proIdArr[] = $proId;
                            }
                        }
                        
                        foreach ($proIdArr as $proId) 
                        {
                           // 规格
                            if($val['Specification']  && $proId && $val['Specification']!='-' && $val['Specification']!=$selfParmArr[$proId]['prpv_value'])
                            {
                                $pro_param = [];
                                $pro_param[] = ['规格',$val['Specification']];
                                $B2cProduct->setBatchParam($proId, $shopId, $pro_param);
                            }
                            //存在OE码
                            $oemcode = LibFc::FormatNum($val['oemcode']);
                            if($oemcode)
                            {
                                if(!isset($oemNumArr['OE_'.$oemcode.'_'.$proId]))
                                {   
                                    $this->set('bc_number',['num_ismain'=>0],sprintf(" AND num_ismain=1 AND num_pro_id=%d",$proId));
                                    $addNumArr = [
                                        'num_factory' => 'OE',
                                        'num_display' => strtoupper(trim($val['oemcode'])),
                                        'num_format' => $oemcode,
                                        'num_reformat' => strrev($oemcode),
                                        'num_from' => 'TYL',
                                        'num_show'=>1,
                                        'num_pro_id'=>$proId,
                                        'num_ismain'=>1,
                                        'num_self'=>0
                                    ];
                                    $res =  $this->add('bc_number',$addNumArr);
                                    $oemNumArr['OE_'.$oemcode.'_'.$proId] = $res['data'];
                                }
                                elseif(isset($oemNumArr['OE_'.$oemcode.'_'.$proId])) 
                                {
                                    $numId = $oemNumArr['OE_'.$oemcode.'_'.$proId]['num_id'];
                                    if(!$oemNumArr['OE_'.$oemcode.'_'.$proId]['num_ismain'])
                                    {
                                        $this->set('bc_number',['num_ismain'=>1],sprintf(" AND num_id=%d",$numId));
                                        $this->set('bc_number',['num_ismain'=>0],sprintf(" AND num_ismain=1 AND num_id!=%d AND num_pro_id=%d",$numId,$proId));
                                    }elseif (count($oemMainCnt[$proId])>1) {
                                        $this->set('bc_number',['num_ismain'=>0],sprintf(" AND num_ismain=1 AND num_id!=%d AND num_pro_id=%d",$numId,$proId));
                                    }
                                }
                            }
                        }
                        $this->B2CDb->End();
                    }
                }
            }
        }
		LibLog::write('Erp同步结束');
 		return LibFc::ReturnData(true, true);
    }

    /**
     * @param  int $userId
     * @param  int $proId  产品id proid 
     * @method 获取erp产品信息
     * @author zhengweihua 
     * @copyright 2025-03-07
     */
    public function getProInfoByDy($userId,$proId = [],$type = 'price')
    {
        if(!$userId||!$proId) return LibFc::ReturnData(true, '');
       
        $YpwBase = new YpwBase();
        $userres = $YpwBase->get('yp_user', ['u_id','u_mobile'], sprintf(" and u_id = %d", $userId), true);
        $mobile = $userres['data']['u_mobile']?:'';
        //获取手机号
        if(!$mobile) return LibFc::ReturnData(true,[]);
        
        if($proId)
        {   
            $res =  $this->get('bc_number', ['num_display,num_pro_id'], sprintf(" AND num_pro_id in (%s) AND num_factory = '厂家编码'", implode(',',$proId)));
            if (!$res['data']) return LibFc::ReturnData(true, '');
            $numberArr = array_column($res['data'],'num_display','num_pro_id');
        }
        $returnData = [];
        $dataList = [];
        if(count($numberArr)==1)
        {
            $data = [
                'phone'=>$mobile,
                'keyword'=>current($numberArr),
                'pageindex'=>1,
                'pagecounts'=>1,
                'isAccurate'=>1,
            ];  
            $dataList = $this->httpGetDyInfo($data);
        }else{

            $counts = ceil(count($numberArr)/20);

            for ($i=0; $i < $counts; $i++) 
            { 
                $temp =  array_slice($numberArr,$i*20,20);
                $data = [
                    'phone'=>$mobile,
                    'pageindex'=>1,
                    'pagecounts'=>20,
                    'isAccurate'=>1,
                    'fittingscodings'=> implode(',',$temp)
                ];
                $proData = $this->httpGetDyInfo($data);
                $dataList = array_merge($dataList,$proData);
            } 
        }
      
        if($dataList)
        {
            $tempData = array_column($dataList,null,'fittingscoding');
            foreach ($numberArr as $pid => $num) {
                $temp = [];
                if($tempData[$num])
                {
                    if($type == 'price')
                    {
                        $temp['price'] = $tempData[$num]['price'];
                    }else{
                        $temp = $tempData[$num];
                    }
                    $temp['pro_id'] = $pid;
                    $returnData[] = $temp;
                }
            }
        }
        return LibFc::ReturnData(true,$returnData);
        
    }

    /**
     * @param  Array $data
     * @method 通过接口获取大有的商品信息
     * @author zhengweihua 
     * @copyright 2025-03-07
     */
    protected function httpGetDyInfo($data)
    {
        $returnArr = $this->httpCurl('api/dyApi/GetFitInfo',[],$data);
        if($returnArr['code'] == 0)
        {
            $dataList = $returnArr['data']['dataList'];
            
            if($returnArr['data']['total']>0 && $dataList)
            {
                return  $dataList;
            }  
        }

        return [];
    }

    /**
     * @param  int $userId
     * @param  Array $dataArr ['address'=>[],'proId'=>[]]
     * @method 订单信息推送到大有ERP接口
     * @author zhengweihua 
     * @copyright 2025-03-07
     */
    public function createOrderByDy($userId,$dataArr)
    {   
        if(!$userId||!$dataArr) return LibFc::ReturnData(true,true);
        $YpwBase = new YpwBase();
        $userres = $YpwBase->get('yp_user', ['u_id','u_mobile'], sprintf(" and u_id = %d", $userId), true);
        $mobile = $userres['data']['u_mobile']?:'';
        if(!$mobile) return LibFc::ReturnData(true, '');

        $res = $this->checkPhoneByDy($mobile);
        if(!$res['data']) return LibFc::ReturnData(false, 'ERP检测不到此手机号'.$mobile.'，请联系ERP提供方！');
        $data = [
            'appkey'=>$this->dyopenApi['appkey'],
            'timeStamp'=>time(),
            'isbxf'=>0,
            'phone'=>$mobile
        ];
        if($dataArr['proId'])
        {
            $proIdArr = array_column($dataArr['proId'],'pro_id');
        
            $temp = [];
            $proInfoRes =  $this->getProInfoByDy($userId,$proIdArr,'');
            $proInfoArr =  array_column($proInfoRes['data'],null,'pro_id');
            foreach ($dataArr['proId'] as $val) 
            {
                if(!isset($proInfoArr[$val['pro_id']]))
                {
                    $res =  $this->get('bc_product left join bc_number on pro_id = num_pro_id', ['pro_id,pro_name,num_display,num_pro_id'], sprintf(" AND pro_id =%d AND num_factory = '厂家编码'", $val['pro_id']), true);
                    if ($res['data'] && !$res['data']['num_display']) return LibFc::ReturnData(false,$res['data']['pro_name'].'erp配件信息不存在');
                    $hwcode = $res['data']['num_display'];
                } 
                
                $proInfo = $proInfoArr[$val['pro_id']];
                $temp[] = [
                    'phone'=> $mobile,
                    'supplyaccid'=>$proInfo['accid']?:$this->dyopenApi['accid'],
                    'supplyaccname'=>$proInfo['accname']?:$this->dyopenApi['accname'],
                    'supplyProductionID'=>$proInfo['productionID']?:$this->dyopenApi['productionID'],
                    'premium'=>$proInfo['premium']?:(float)0,
                    'fittingscoding'=> $proInfo['fittingscoding']?:$hwcode,
                    'wareamount'=>$val['wareamount'],
                    'price'=> $proInfo['price']?:(float)$val['price'],
                    'invoice'=>true,
                ];
            }
            //没有对应erp数据则不更新
            if(empty($temp)) return LibFc::ReturnData(false,'erp配件信息不存在');

            $data['productListDto'] = $temp;
        }
        
        if($dataArr['address'])
        {
            $data['receivingDto']  = [
                'telephone' => $dataArr['address']['telephone'],
                'linkman' => $dataArr['address']['linkman'],
                'receiveaddress' => $dataArr['address']['receiveaddress'],
                'supplyaccid' => 0,
                'transportserial' => 0
            ];
        }
		LibLog::write('Erp订单'.$dataArr['orderId'].'推送开始=>'.json_encode($data, JSON_UNESCAPED_UNICODE));
        $jsonArr = $this->httpCurl('api/dyApi/CreateOrder',[],$data);
		LibLog::write('Erp订单'.$dataArr['orderId'].'推送结束=>'.json_encode($jsonArr, JSON_UNESCAPED_UNICODE));
        return LibFc::ReturnData(true,$jsonArr['data']);
          
    }
}