<?php

class B2cCustom extends B2cBaseCustom
{   
    public $configsArr = [];

    public $dyPriceApi = [];
    public function __construct()
    {
        parent::__construct();
        $this->dyopenApi = [
            'baseUrl'=>'http://openapi.doyor.com/',
            'appkey'=>'a492e73142a74652a462233d88a01ae9',
            'appKeySecret'=>'c46b49ea-2906-4282-acb7-43428a2a60c9',
            'accid'=>19024,
            'accname'=>'明达库房',
        ];
        $this->dyApi = mvc::$cfg['MD_CONFIG']['headquarters']; //大有的配置参数
        //往下面添加配置
        $this->configsArr = mvc::$cfg['MD_CONFIG']['others'] ?: [];

        //详情API
        $this->dyPriceApi = [
            'appkey'=>'d086c3ee463c4958b2cb35bc8e226340',
        ];
    } 

    /**
     * @method 通过货物编码更新配件信息
     * @author zhengweihua 
     * @copyright 2023-06-07
     */
    public function updateProductByCode($shopId)
    {   
		LibLog::write('Erp同步开始');
		mvc::$cfg['LOGUSER']['uid'] = 8;
		mvc::$cfg['LOGUSER']['urname'] = 'Erp同步';
        $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 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));
        if (empty($res['data'])) return LibFc::ReturnData(true, true);
        $numKeyArr = [];
        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)
        {

            //其它部门的库存
            $kunCunArr = $this->getStock02Change($shopId);

            $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') : [];
           
            $depArr = array_keys($this->configsArr);
            // 通过货物编码匹配更新相应信息
            foreach ($cacheData as $cacheArr) 
            {
                if(is_array($cacheArr) && $cacheArr['plFit'])
                {
                    $addNumArr = [];
                    foreach ($cacheArr['plFit'] as $key => $val) 
                    {
                        $hwcode = $val['fittingscoding'];

                       
                        //库存
                        $kc01 = (int)$val['wareamount'];

                        $pro_count = $kc01;

                        $wareamountArr['wareamount01'] = $kc01;
                        $wareamountArr['warehouse01'] = $val['warehouse'];

                        foreach ($depArr as $depno) {
                            $kc = (int) ($kunCunArr[$depno][$hwcode]['wareamount'] ?? 0);
                            //总库存
                            $pro_count += $kc;
                            //库存
                            $amountkey = 'wareamount' . $depno;
                            $wareamountArr[$amountkey] = $kc;
                            //仓位
                            $housekey = 'warehouse' . $depno;
                            $wareamountArr[$housekey] = $kunCunArr[$depno][$hwcode]['warehouse'] ?? '';
                        }
                       
                        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($wareamountArr)
                                ];
                                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_shop_id = %d AND pro_name='%s' order by pro_id desc limit 1",$shopId, $addBase['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');
                                }
                                //货物编码
                                $numsArr = [
                                    ['num_factory'=>'货物编码','num_display'=>$val['fittingscoding'],'num_format'=>$hwcode,'num_reformat'=>strrev($hwcode)]
                                ];
                                $addData = [
                                    'base'=>$addBase,
                                    'info'=>['pri_code'=>$val['expand1']?:$val['fittingscoding'],'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($wareamountArr)
                                ];
                                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' => 'JNERP',
                                        '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 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", $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 2024-09-25
     */
    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 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['remark']) $data['remark'] = $dataArr['remark'];
        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']?:'',
                    '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));
        $jsonArr = $this->httpCurl('api/dyApi/CreateOrder',[],$data);
		LibLog::write('Erp订单'.$dataArr['orderId'].'推送结束=>'.json_encode($jsonArr));
        return LibFc::ReturnData(true,$jsonArr['data']);
          
    }


    /**
     * @method 更新库存
     * @author zhengweihua 
     * @copyright 2024-10-14
     */
    public function updateProductCount($shopId)
    {
        
        //总部的库存数据
        $cacheData = $this->getStockChange($shopId);
        $kunCunArr01 = [];
        foreach ($cacheData as $cacheArr) 
        {
            if(is_array($cacheArr) && $cacheArr['plFit'])
            {
                foreach ($cacheArr['plFit'] as $val) 
                {
                    $hwcode = $val['fittingscoding'];
                    $kunCunArr01[$hwcode] = ['wareamount'=>$val['wareamount'],'warehouse'=>$val['warehouse']];
                }
            }
        }
        
        //其它部门
        $depArr = array_keys($this->configsArr);
        $kunCunArr = $this->getStock02Change($shopId);
        //店铺产品
        $B2cProduct = new B2cProduct();
        $table = 'bc_number 
        join bc_product on pro_id = num_pro_id';
        $fields = ['num_display,num_format,pro_id,pro_name,pro_count,pro_self'];
        $res =  $B2cProduct->get($table,$fields,sprintf(" AND num_factory = '货物编码' AND pro_shop_id = %d order by num_id desc",$shopId));
        if (empty($res['data'])) return LibFc::ReturnData(true, true);
        $numKeyArr = [];
        foreach ($res['data'] as $key => $val) {
            
            $numKeyArr[$val['num_display']][] = $val;
        }
       
        //更新商品库存
        foreach ($this->generateStockData($numKeyArr, $depArr, $kunCunArr01, $kunCunArr) as $numkey => $stockData) 
        {   
            $curCount = $stockData['curCount'];
            $wareamountArr = $stockData['wareamountArr'];
    
            $this->B2CDb->Begin();
            foreach ($numKeyArr[$numkey] as $proInfo) 
            {   
                $pro_self = $proInfo['pro_self']?json_decode($proInfo['pro_self'],true):[];
                //库存不一致才更新
                if($proInfo['pro_count']==$curCount && $pro_self && empty(array_diff_assoc($wareamountArr, $pro_self)) )
                {
                    continue;
                }
                //01是库房 //02是门店
                $updata = [
                    'pro_count'=>$curCount,
                    'pro_self'=> json_encode($wareamountArr)
                ];
                $this->set('bc_product',$updata,sprintf(" AND pro_id=%d",$proInfo['pro_id']));
            }
            $this->B2CDb->End();
        }
        
        return LibFc::ReturnData(true, true);
    }

    /**
     * @param  int $shopId
     * @method 获取其它部门的库存
     * @author zhengweihua 
     * @copyright 2024-10-17
     */
    protected  function getStock02Change($shopId)
    {   
        $kunCunArr = [];
        foreach ($this->configsArr as $depno => $depconfig) {
            $this->dyApi=$depconfig;

            //部门的库存数据
            $cacheData = $this->getStockChange($shopId);
            if (!$cacheData) continue;
            foreach ($cacheData as $cacheArr) {
                if(is_array($cacheArr) && $cacheArr['plFit'])
                {
                    foreach ($cacheArr['plFit'] as $val) 
                    {
                        $hwcode = $val['fittingscoding'];
                        $kunCunArr[$depno][$hwcode] = ['wareamount'=>$val['wareamount'],'warehouse'=>$val['warehouse']];
                    }
                }
            }
        }
		file_put_contents(mvc::$cfg['ROOT'].'admins/cache/erpdata'.$shopId.'_bmkc_'.date('N').'.php',"<?php ".var_export($kunCunArr,true).";?>"); 
        return $kunCunArr;
    }


    private function generateStockData($numKeyArr, $depArr, $kunCunArr01, $kunCunArr)
    {
        foreach ($numKeyArr as $numkey => $proInfoArr) {
            if (isset($kunCunArr01[$numkey])) {
                // 如果部门01有库存数据，直接处理
            } else {
                $allDepartmentsUndefined = true; // 假设所有部门都没有定义
            
                foreach ($depArr as $depno) {
                    if (isset($kunCunArr[$depno][$numkey]) && is_array($kunCunArr[$depno][$numkey])) {
                        $allDepartmentsUndefined = false; // 如果找到任意一个部门有定义，则标记为 false
                        break; // 不需要继续检查，直接退出循环
                    }
                }
            
                if ($allDepartmentsUndefined) {
                    continue; // 如果所有部门都没有定义，则跳过
                }
            }
           
            // 计算总库存
            $curCount = 0;
            // 部门01的库存
            $kc01 = (int) ($kunCunArr01[$numkey]['wareamount'] ?? 0);
            $cw01 = isset($kunCunArr01[$numkey]['warehouse']) ? $kunCunArr01[$numkey]['warehouse'] : '';
            $wareamountArr = ['wareamount01' => $kc01,'warehouse01'=>$cw01];

            $curCount += $kc01;
            // 其它部门的库存
            foreach ($depArr as $depno) {
                $amountkey = 'wareamount' . $depno;

                $kc = (int) ($kunCunArr[$depno][$numkey]['wareamount'] ?? 0);
                $wareamountArr[$amountkey] = $kc;
               
                $housekey = 'warehouse' . $depno;
                $wareamountArr[$housekey] = isset($kunCunArr[$depno][$numkey]['warehouse'])? $kunCunArr[$depno][$numkey]['warehouse']: '';
                
                $curCount += $kc;
            }
            // 使用 yield 返回数据
            yield $numkey => [
                'curCount' => $curCount,
                'wareamountArr' => $wareamountArr,
            ];
        }
    }

    /**
     * @param  [type] $userId
     * @param  [type] $proId
     * @method 获取指定用户的产品的最后销售记录
     * @author zhengweihua 
     * @copyright 2026-01-21
     */
    public function getLastSaleFitInfo($userId,$proId)
    {   
        // $proId = '728177';  
        if($userId<=0||$proId<=0) return LibFc::ReturnData(true, []);

        $b2cDb = mvc::$cfg['DB']['B2C']['db_name'];

        $table= sprintf(" {$b2cDb}.sh_shop_user 
        left join  {$b2cDb}.sh_member_link  on sus_uid=meml_uid and meml_shop_id = 732634
        join yp_user on sus_uid = u_id
        join yp_user_ext on sus_uid = ui_uid");

        $field = ['u_id','meml_realname','meml_comname','u_name','u_mobile','u_real_name','ui_company'];
        $where = sprintf(" and sus_shop_id= %d AND sus_uid=%d ",732634,$userId);
        $YpwBase = new YpwBase();
        $userres = $YpwBase->get($table, $field, $where, true);
        if(!$userres['data'] || (!$userres['data']['meml_comname'] && !$userres['data']['ui_company'])) return  LibFc::ReturnData(true, []);

        //获取配件的货物编码
        $B2cProduct = new B2cProduct();
        $table = 'bc_product join bc_number on pro_id = num_pro_id';
        $numres  = $B2cProduct->get($table,['num_factory','num_display'],sprintf(" AND pro_shop_id=732634 AND pro_id=%d AND num_factory='货物编码'",$proId),true);
        if(!$numres['data']) return LibFc::ReturnData(true, []);
        $LibCurl = new LibCurl();
        $url = 'http://api.doyor.com/api/md/GetAccNameFitInfoList';
        $postArr = [
            'appkey'=>$this->dyPriceApi['appkey'],
            'pageindex'=>1,
            'pagecount'=>1,
            'accname'=>$userres['data']['meml_comname']?:$userres['data']['ui_company'],
            'startime'=>'2020-01-01',
            'endtime'=>date('Y-m-d',strtotime('+1 day')),
            'fittings'=>$numres['data']['num_display']
        ];
        $parsestr = http_build_query($postArr);
        LibLog::write('最后购买记录推送开始=>'.$parsestr,mvc::$cfg['LOGS'].'zd_'.date('Y-m-d').'.log');
        $jsonres =  $LibCurl->fetch($url.'?'.$parsestr,['post'=>1]);
        LibLog::write('最后购买记录推送结束=>'.$jsonres,mvc::$cfg['LOGS'].'zd_'.date('Y-m-d').'.log');
        $jsonArr = json_decode($jsonres,true);
        if($jsonArr['success']){
            return LibFc::ReturnData(true,$jsonArr['result']['datalist']?$jsonArr['result']['datalist'][0]:[]);
        }else{
            return ['status'=>false,'data'=>$jsonArr['error']];
        } 
    }
}