<?php
/**
 * @method 广州宝德-大有 配件同步类
 * @author zhengweihua 
 * @copyright 2024-06-22
 */
class B2cBDCustom extends B2cBaseCustom
{
    public function __construct($dyApiConfig = null)
    {
        parent::__construct($dyApiConfig);
        $this->dyopenApi = [
            'baseUrl'=>'http://openapi.doyor.com/',
            'appkey'=>'62b521afb902494d97ffc561fdb64177',
            'appKeySecret'=>'a3103ad9-d9ed-43d5-ae63-bbbde4e48176',
            'accid'=>20308,
            'accname'=>"广州路路通汽配",
            'productionID'=>"KDfm96XUsnmIhCYSmk+E6g=="
        ];
    } 

     /**
     * @method 通过自编码更新配件信息
     * @author zhengweihua _
     * @copyright 2023-06-07
     */
    public function updateProductByCode($shopId)
    {   
		LibLog::write('Erp同步开始');
		mvc::$cfg['LOGUSER']['uid'] = 8;
		mvc::$cfg['LOGUSER']['urname'] = 'Erp同步';
                
        $cacheData = $this->getStockChange($shopId);
        
        if($cacheData)
        {
            $B2cProduct =  new B2cProduct();
            //库存 
            $this->set('bc_product', ['pro_count'=>1000], sprintf(" and pro_shop_id = %d AND pro_count < 1000",$shopId));
            //取配件所有自编号
            $table = 'bc_number 
            join bc_product_info on pri_pro_id = num_pro_id 
            join bc_product on pro_id=num_pro_id
            left join bc_probrand on pro_prb_id =prb_id';
            $fields = ['num_id','num_factory',"num_display,num_format,pri_code,pri_des,pro_id,pro_name,pro_sale_price,pro_price_vip1,pro_price_vip2,pro_price_vip3,pro_price_vip4,pro_prb_id,prb_name,CONCAT_WS('_',prb_name,pri_code) as keyname"];
            $selfres =  $this->get($table,$fields,sprintf(" and pro_shop_id=%d and num_self=1",$shopId));
        
            if (empty($selfres['data'])) return LibFc::ReturnData(true, true);
        
            $numKeyArr = array_column($selfres['data'],null,'keyname'); 

            $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_self=0 AND 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;
            }

            $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') : [];
   
            //取配件自定义规格
            $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) 
                    {
                        
                        $info = [];
                        //品牌+自编码
                        if($val['brandclassname']){
                            $hwcode = $val['brandclassname'].'_'.$val['fittingscoding'];
                        }else{
                            $hwcode = $val['fittingscoding'];
                        }
                       
                        
                        if (!isset($numKeyArr[$hwcode]) && $val['price'] <= 0.1) continue;

                        $proInfo = $numKeyArr[$hwcode];
                        $base =[
                            'pro_count'=>1000,
                            '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['batchprice']?:($proInfo['pro_price_vip2']??0))),
                            'pro_price_vip3' => sprintf("%.2f",($val['batchprice']?:($proInfo['pro_price_vip3']??0))),
                            'pro_price_vip4' => sprintf("%.2f",($val['lowprice']?:($proInfo['pro_price_vip4']??0))),
                        ];
                        
                        

                        $this->B2CDb->Begin();
                        if ($val['brandclassname']) {
                            
                            if ($brandArr[$val['brandclassname']]) {
                                $base['pro_prb_id'] =  (int) $brandArr[$val['brandclassname']];
                            } else {
                                $brdres = $B2cBrand->addShopBrand($shopId, $val['brandclassname']);
                                $base['pro_prb_id'] = (int)$brdres['data'];
                                $brandArr[$val['brandclassname']] = $base['pro_prb_id'];
                            }
                        }

                        //销售价(price)大于0.1元的 自动上传同步到跑街目录
                        if (!isset($numKeyArr[$hwcode]) && $val['price'] > 0.1)
                        {
                            $addBase = $base;
                            $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_shop_id = %d AND pro_name='%s' order by pro_id desc limit 1", $shopId, $base['pro_name']), 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');
                            }

                            $addData = [
                                'base'=>$addBase,
                                'info'=>['pri_code'=>$val['fittingscoding']],
                                'shopSort'=>$sortArr,
                            ];
                            $addres = $B2cProduct->addProduct($addData,$shopId);
                            $numKeyArr[$hwcode]['pro_id'] = $addres['data'];
                        }
                        $proId = $numKeyArr[$hwcode]['pro_id'];  

                        if($proInfo){
                            //基础信息不一致就更新
                            $oldData = [
                                'pro_count' => 1000,
                                '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'],
                            ];
                            $diffArr = array_diff_assoc($base,$oldData);
                            if($diffArr){
                                $this->set('bc_product', $diffArr, sprintf(" and pro_id = %d", $proId));
                            }
                    
                        }

                        //存在车型数据
                        if($val['carmodel']!=strip_tags($numKeyArr[$hwcode]['pri_des']))
                        {
                            $info['pri_des'] = '<p><span style="font-size: 20px;"><strong>'.$val['carmodel'].'</strong></span></p>';   
                        }
                       
                        if($info){
                            $this->set('bc_product_info', $info, sprintf(" and pri_pro_id = %d", $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]))
                            {   
                                $num_ismain = 0;
                                if (!$oemMainCnt[$proId] || $oemMainCnt[$proId] && count($oemMainCnt[$proId])<1) {
                                    $num_ismain = 1;
                                }
                                $addNumArr = [
                                    'num_factory' => 'OE',
                                    'num_display' => strtoupper(trim($val['oemcode'])),
                                    'num_format' => $oemcode,
                                    'num_reformat' => strrev($oemcode),
                                    'num_from' => 'BDERP',
                                    'num_show'=>1,
                                    'num_pro_id'=>$proId,
                                    'num_ismain'=>$num_ismain,
                                    '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 (!$oemMainCnt[$proId] || $oemMainCnt[$proId] && count($oemMainCnt[$proId])<1)
                                {
                                    $this->set('bc_number',['num_ismain'=>1],sprintf(" AND num_id=%d",$numId));
                                }
                            }
                        }
                        $this->B2CDb->End();
                    }
                }
                
            }
        }
		LibLog::write('Erp同步结束');
 		return LibFc::ReturnData(true, true);
    }

    /**
     * @param  int $userId
     * @param  int $proId  产品id proid 
     * @method 获取erp产品信息
     * @author zhengweihua 
     * @copyright 2023-06-08
     */
    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", $_SESSION['_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_self = 1", implode(',',$proId)));
            if (!$res['data']) return LibFc::ReturnData(true, '');
            $numberArr = array_column($res['data'],'num_display','num_pro_id');
        }
        $returnData = [];
        foreach ($numberArr as $pid => $num) 
        {
            $data = [
                'phone'=>$mobile,
                'keyword'=>$num,
                'pageindex'=>1,
                'pagecounts'=>10,
                'isAccurate'=>1
            ];
            $returnArr = $this->httpCurl('api/dyApi/GetFitInfo',[],$data);
            if($returnArr['code'] == 0)
            {
                $dataList = $returnArr['data']['dataList'];
                $temp = [];
                if($dataList[0])
                {
                    if($type == 'price')
                    {
                        $temp['price'] = $dataList[0]['price'];
                    }else{
                        $temp = $dataList[0];
                    }
                    $temp['pro_id'] = $pid;
                    $returnData[] = $temp;
                }  
            }
        }
        return LibFc::ReturnData(true,$returnData);
        
    }

    /**
     * @param  int $userId
     * @param  Array $dataArr ['address'=>[],'proId'=>[]]
     * @method 订单信息推送到大有ERP接口
     * @author zhengweihua 
     * @copyright 2023-06-09
     */
    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_self=1", $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']);
          
    }
}