load->_model('Model_settingtest','settingtest'); $this->load->_model("Model_apiyyv1",'apiyyv1'); $this->load->_model('Model_classid','classid'); $this->load->_model('Model_typeclass','typeclass'); $this->load->_model('Model_shop','shop'); $this->load->_model('Model_zzquque_u9','zzquque_u9'); $this->load->_model('Model_zzququeu9_logs','zzququeu9_logs'); $this->load->_model('Model_logic_tools','logic_tools'); $this->load->_model('Model_logic_u9tools','logic_u9tools'); } public function getToken($type){ $name = "get_yytoken_".$type; $token = $this->settingtest->$name(); return $token; } //转码准备数据 public function transPrepare(){ $classid = $this->classid->sku(); $tcall = $this->typeclass->find_all(); foreach ($tcall as $v) { $tcjm[$v['id']] = array($v['jm'],$v['classid']); $typeclass[$v['id']] = array('zh'=>$v['zh'],'classid'=>$v['classid'],'bm'=>$v['bm'],'title'=>$v['title'],'jm'=>$v['jm']); } return [ 'classid'=>$classid, 'typeclass'=>$typeclass, ]; } //必须先建立许昌成品仓的销售单和调出单 香港仓的采购单 一次执行5单 //循环执行许昌成品仓的销售单 调出单和香港仓的采购单 public function xdlsOneStep($list){ $pre_data = $this->transPrepare(); foreach($list as $k=>$v){ $this->xdlsBeforeCreate($v,$pre_data['typeclass'],$pre_data['classid']); } } //循环执行许昌仓的销售单 调出单和香港仓的采购单 提交 顺带的也执行审核 public function xdlsTwoStep($list){ foreach($list as $k=>$v){ $r1 = $this->dcSubAndCheck($v); if(!$r1){ continue; } $r2 = $this->cgSubAndCheck($v); if(!$r2){ continue; } $this->xsSubAndCheck($v); } } //查询调出单生成的调入单是否生成 如果生成了就审核 如果没生成 说明异常了 这种都是按步骤走的 public function xdlsThreeStep($list){ $token_140 = $this->getToken(130); foreach($list as $k=>$v){ $r = $this->apiyyv1->drdcxBydcd($v['order_no'],$token_140); //如果获取对应调入单没有成功 if(empty($r[0]['Data'][0]['docno'])){ $this->editData($v['id'],['dr_status'=>-1,'update_time'=>time()],$v['order_no'],6,1,'dr',$r[1],$r[0]); continue; } if(count($r[0]['Data'])>1){ foreach($r[0]['Data'] as $item){ if($item['descflexfield_pubdescseg4'] == $v['order_no']){ $dr_no = $item['docno']; } } }else{ $dr_no = $r[0]['Data'][0]['docno']; } $this->editData($v['id'],['dr_no'=>$r[0]['Data'][0]['docno'],'dr_status'=>1,'update_time'=>time()],$v['order_no'],6,1,'dr',$r[1],$r[0]); //提交调入单 $rr = $this->apiyyv1->drdSubmit(['number'=>$dr_no],$token_140); if(!$rr[0]['Data'][0]['IsSucess']){ $this->editData($v['id'],['dr_status'=>-2,'update_time'=>time()],$v['order_no'],6,2,'dr',$rr[1],$rr[0]); continue; } $this->editData($v['id'],['dr_status'=>2,'update_time'=>time()],$v['order_no'],6,2,'dr',$rr[1],$rr[0]); //审核调入单 $rrr = $this->apiyyv1->drdApprove(['number'=>$dr_no],$token_140); if(!$rrr[0]['Data'][0]['IsSucess']){ $this->editData($v['id'],['dr_status'=>-3,'update_time'=>time()],$v['order_no'],6,3,'dr',$rrr[1],$rrr[0]); continue; } $this->editData($v['id'],['dr_status'=>3,'update_time'=>time()],$v['order_no'],6,3,'dr',$rrr[1],$rrr[0]); } } //建立香港的销售单 标准出库单有源的需要先审核 public function xdlsFourStep($list){ $pre_data = $this->transPrepare(); foreach($list as $k=>$v){ $this->xdlsAfterDetail($v,$pre_data['typeclass'],$pre_data['classid']); } } //审核香港销售单 同时生成标准出库单 public function xdlsFiveStep($list){ $token_140 = $this->getToken(130); // $xs_no_list = array_column($list,'xs_two_no'); echo "
";
        // $r = $this->apiyyv1->xscsByordernos($xs_no_list,$token_140);
        // var_dump($r);

        
       
            
            //创建标准出库单
            $v = [
                'xs_no'=>'SO2502280046',
                'drckbm'=>$this->xdxgls_code,
                'list'=>[
                    [
                        'dcsl'=>1,
                    ]
                   
                ]
            ];
            $bzch_res = $this->apiyyv1->bzchCreate($v,$token_140);
            var_dump($bzch_res);
            die;
    
            if(empty($bzch_res[0]['Data'][0]['m_code'])){
                $this->editData($info['zq_u9_id'],['bzch_status'=>-1,'update_time'=>time()],$info['number'],4,1,'bzch',$bzch_res[1],$bzch_res[0]);
                return ;
           }
           //更新销售单数据
           $bzch_no = $bzch_res[0]['Data'][0]["m_code"];
           $this->editData($info['zq_u9_id'],['bzch_no'=>$bzch_no,'bzch_status'=>1,'update_time'=>time()],$info['number'],4,1,'bzch',$bzch_res[1],$bzch_res[0]);
        
    }
    //审核香港标准出库单
    public function xdlsSixStep($list){
        $token_140 = $this->getToken(130);
        foreach($list as $k =>$v){
            $bzch_res = $this->apiyyv1->bzchSubmitAndApprove(['number'=>$v['bzch_no']],$token_140);
            var_dump($bzch_res);
            if(empty($bzch_res[0]['Data'][0]['m_code'])){
                $this->editData($v['id'],['bzch_status'=>-1,'update_time'=>time()],$v['order_no'],4,3,'bzch',$bzch_res[1],$bzch_res[0]);
                return ;
           }
           //更新销售单数据
           $bzch_no = $bzch_res[0]['Data'][0]["m_code"];
           $this->editData($v['id'],['bzch_no'=>$bzch_no,'bzch_status'=>1,'update_time'=>time()],$v['order_no'],4,3,'bzch',$bzch_res[1],$bzch_res[0]);
        }

    }

    //由于调出单生成可能不会申请后实时出现 需要差几分钟再去申请,避免这种错误
    //从许昌成品库调出库存到香港临时仓
    //创建 调出单 销售单 采购单
    //必须先建立许昌成品仓的销售单和调出单  香港仓的采购单  因为u9生成需要时间  然后在进行 审核 
    public function xdlsBeforeCreate($info,$typeclass,$classid){
       $time = time();
       $token_130 =  $this->getToken(120);
       $list = [];
       $fpdata = $info['fpdata'];
       $fpdata_list = explode(';',trim( $fpdata,';'));
       $whlabel_list = explode("|",trim($info['whlabel'],"|"));
    
       $total_goods_num = 0;//订单产品总数量
       foreach($whlabel_list as $k=>$v){
            $tmp_data = explode("-",trim($v,'-'));
            if(isset($tmp_data[1])){
                $total_goods_num += $tmp_data[1];
            }
       }
       $avg_price = floor(($info['skje']*1000)/$total_goods_num)/1000;
       foreach($fpdata_list as $k=>$v){
            $tmp_str = str_replace(array('-163-','-164-','-165-','-166-'),'-',$v);
            $tmp_arr = explode('|',trim($tmp_str,'|'));
            if(stripos($tmp_arr[0],',') !== false){
                $ft = explode(',',$tmp_arr[0]);
                $features = explode('-',trim($ft[1],'-'));
                $features[] = $ft[0];
            }else{
                $features = explode('-',trim($tmp_arr[0],'-'));
            }
            $sku = implode("-",$features);
            $tmp_ret = $this->logic_u9tools->getOneU9bm($sku,$classid,$typeclass);
            $list[] = [
                'jm'=>$tmp_ret['jm'],
                'bm'=>$tmp_ret['bm'],
                'zh'=>$tmp_ret['zh'],
                'final_price'=>$avg_price,//目前先不设置 等后期财务说了再说
                'title'=>isset($tmp_arr[1])?$tmp_arr[1]:'无',
                'dcsl'=>$tmp_arr[2],
                'is_register'=>0,//商品是否被注册  先都当没注册  后面会先确认下
            ];
       }
       $shop = $this->shop->read($info['shop']);
       if(empty($shop['yyid'])){
            //如果没有在u9上设置店铺的组织 那么需要设置
            $this->editData($info['zq_u9_id'],['dc_status'=>-1,'update_time'=>time()],$info['number'],1,1,'',[],$this->logic_tools->ret_arr(-1,'店铺没有在u9平台设置参数'));
            return ;
       }

       $dc_params = [
            'gys'=>$this->gys,//供应商
            'number'=>$info['number'],//erp订单编码
            "TransOutDocType_Code"=>"TransOut001",//组织间调拨
            "time"=>$time,
            'TransferDirection'=>0,//普通
            'yyid'=>$shop['yyid'],//来源店铺  这种需要在店铺表中有
            'shipremarks'=>$info['shipremarks'],//订单的备注
            'dcckbm'=>$this->xdcp_code,//调出仓库编码
            'drckbm'=>$this->xdxgls_code,//调入仓库编码
            'drzz_code'=>$this->xdxgzzcode,//调入组织Code
            'owner_code'=>$this->xdzzcode,//货主组织Code
            'ztcode'=>$this->ztcode,//账套
            'tb_org_arr'=>$this->tb_org_arr,//要同步的组织列表
            'list'=>$list
       ];
       //调出单检测是否存在
       $cxdcd_r = $this->apiyyv1->xcDcdByOtherId($dc_params['number'],$token_130);
       $ret_data = $cxdcd_r[0]['Data'];
       if(isset($ret_data[0])){
            $descflexfield_pubdescseg4 = $ret_data[0]['descflexfield_pubdescseg4'];
            if($dc_params['number'] == $descflexfield_pubdescseg4){
                return ;
            }
       }



       //检测料品是否在u9被添加
       $r = $this->checkLp($dc_params,$token_130);
       
       if($r['code'] !=1){
            $this->editData($info['zq_u9_id'],['dc_status'=>-1,'update_time'=>time()],$info['number'],1,1,'lpck',$r[1],$r[0]);
            return ;
       }
      
       //创建调出单
       $dcd_res = $this->apiyyv1->dcdCrate($dc_params,$token_130);
    
       if(empty($dcd_res[0]['Data'][0]["Code"])){
            $this->editData($info['zq_u9_id'],['dc_status'=>-1,'update_time'=>time()],$info['number'],1,1,'dc',$dcd_res[1],$dcd_res[0]);
            return ;
       }
        //更新
       $dcd_no =  $dcd_res[0]['Data'][0]["Code"];
       $this->editData($info['zq_u9_id'],['dc_no'=>$dcd_no,'dc_status'=>1,'update_time'=>time()],$info['number'],1,1,'dc',$dcd_res[1],$dcd_res[0]);

        //创建许昌成品库的销售单
        $xsd_res = $this->apiyyv1->xsdCreate($dc_params,$token_130);
        if(empty($xsd_res[0]['Data']['m_code'])){
            $this->editData($info['zq_u9_id'],['xc_status'=>-1,'update_time'=>time()],$info['number'],2,1,'xs',$xsd_res[1],$xsd_res[0]);
            return ;
        }
        //更新销售单数据
       $xs_no = $xsd_res[0]['Data'][0]["m_code"];
       $this->editData($info['zq_u9_id'],['xs_no'=>$xs_no,'xc_status'=>1,'update_time'=>time()],$info['number'],2,1,'xs',$xsd_res[1],$xsd_res[0]);

        //创建香港公司的采购单
        $token_140 = $this->getToken(120);
        $cgd_res = $this->apiyyv1->cgdCreate($dc_params,$token_140);
        if(empty($cgd_res[0]['Data'][0]["Code"])){
            $this->editData($info['zq_u9_id'],['cg_status'=>-1,'update_time'=>time()],$info['number'],3,1,'cg',$cgd_res[1],$cgd_res[0]);
            return ;
        }

        $this->editData($info['zq_u9_id'],['cg_no'=>$xs_no,'cg_status'=>1,'update_time'=>time()],$info['number'],3,1,'cg',$cgd_res[1],$cgd_res[0]);
        return ;
    }
    
    // 提交审核调出单调出单 
    public function dcSubAndCheck($info){
        $token_130 = $this->getToken(120);
        $r = $this->apiyyv1->dcdSubmit([
            'number'=>$info['dc_no']
        ],$token_130);
        if(!$r[0]['Data'][0]['IsSucess']){
            $this->editData($info['id'],['dc_status'=>-2,'update_time'=>time()],$info['order_no'],1,2,'dc',$r[1],$r[0]);
            return false;
        }
        //更新调出单
        $this->editData($info['id'],['dc_status'=>2,'update_time'=>time()],$info['order_no'],1,2,'dc',$r[1],$r[0]);
        $rr = $this->apiyyv1->dcdApprove([
            'number'=>$info['dc_no']
        ],$token_130);
        if(!$rr[0]['Data'][0]['IsSucess']){
            $this->editData($info['id'],['dc_status'=>-3,'update_time'=>time()],$info['order_no'],1,3,'dc',$rr[1],$rr[0]);
            return false;
        }
        $this->editData($info['id'],['dc_status'=>3,'update_time'=>time()],$info['order_no'],1,3,'dc',$rr[1],$rr[0]);
        return true;
    }
    //提交审核采购单
    public function cgSubAndCheck($info){
        $token_140 = $this->getToken(120);
        $r = $this->apiyyv1->cgdSubmit([
            'number'=>$info['cg_no']
        ],$token_140);
       
        if(!$r[0]['Data'][0]['IsSucess']){
            $this->editData($info['id'],['cg_status'=>-2,'update_time'=>time()],$info['order_no'],3,2,'cg',$r[1],$r[0]);
            return false;
        }
        //更新采购单
        $this->editData($info['id'],['cg_status'=>2,'update_time'=>time()],$info['order_no'],3,2,'cg',$r[1],$r[0]);
        $rr = $this->apiyyv1->cgdApprove([
            'number'=>$info['cg_no']
        ],$token_140);    
        if(!$rr[0]['Data'][0]['IsSucess']){
            $this->editData($info['id'],['cg_status'=>-3,'update_time'=>time()],$info['order_no'],3,3,'cg',$rr[1],$rr[0]);
            return false;
        }   
        $this->editData($info['id'],['cg_status'=>3,'update_time'=>time()],$info['order_no'],3,3,'cg',$rr[1],$rr[0]);
        return true;

    }
    //提交审核销售单
    public function xsSubAndCheck($info){
        $token_130 = $this->getToken(120);
        $r = $this->apiyyv1->xsdSubmit([
            'number'=>$info['xs_no']
        ],$token_130);
    
        if(!$r[0]['Data'][0]['m_isSucess']){
            $this->editData($info['id'],['xs_status'=>-2,'update_time'=>time()],$info['order_no'],2,2,'xs',$r[1],$r[0]);
            return false;
        }
        $this->editData($info['id'],['xs_status'=>2,'update_time'=>time()],$info['order_no'],2,2,'xs',$r[1],$r[0]);
        $rr = $this->apiyyv1->xsdApprove([
            'number'=>$info['xs_no']
        ],$token_130);
        if(!$rr[0]['Data'][0]['m_isSucess']){
            $this->editData($info['id'],['xs_status'=>-3,'update_time'=>time()],$info['order_no'],2,3,'xs',$rr[1],$rr[0]);
            return false;
        }   
        $this->editData($info['id'],['xs_status'=>3,'update_time'=>time()],$info['order_no'],2,3,'xs',$rr[1],$rr[0]);
        return true;
    }

    //建立销售单 和出货单
    public function xdlsAfterDetail($info,$typeclass,$classid){
       
       $time = time();
       $token_140 = $this->getToken(130);
       $list = [];
       $fpdata = $info['fpdata'];
       $fpdata_list = explode(';',trim( $fpdata,';'));
       $whlabel_list = explode("|",trim($info['whlabel'],"|"));
    
       $total_goods_num = 0;//订单产品总数量
       foreach($whlabel_list as $k=>$v){
            $tmp_data = explode("-",trim($v,'-'));
            if(isset($tmp_data[1])){
                $total_goods_num += $tmp_data[1];
            }
       }
       $avg_price = floor(($info['skje']*1000)/$total_goods_num)/1000;
       foreach($fpdata_list as $k=>$v){
            $tmp_str = str_replace(array('-163-','-164-','-165-','-166-'),'-',$v);
            $tmp_arr = explode('|',trim($tmp_str,'|'));
            if(stripos($tmp_arr[0],',') !== false){
                $ft = explode(',',$tmp_arr[0]);
                $features = explode('-',trim($ft[1],'-'));
                $features[] = $ft[0];
            }else{
                $features = explode('-',trim($tmp_arr[0],'-'));
            }
            $sku = implode("-",$features);
            $tmp_ret = $this->logic_u9tools->getOneU9bm($sku,$classid,$typeclass);
            $list[] = [
                'jm'=>$tmp_ret['jm'],
                'bm'=>$tmp_ret['bm'],
                'zh'=>$tmp_ret['zh'],
                'final_price'=>$avg_price,//目前先不设置 等后期财务说了再说
                'title'=>isset($tmp_arr[1])?$tmp_arr[1]:'无',
                'dcsl'=>$tmp_arr[2],
                'is_register'=>0,//商品是否被注册  先都当没注册  后面会先确认下
            ];
       }
       $shop = $this->shop->read($info['shop']);
       if(empty($shop['yyid'])){
            //如果没有在u9上设置店铺的组织 那么需要设置
            $this->editData($info['zq_u9_id'],['dc_status'=>-1,'update_time'=>time()],$info['number'],1,1,'',[],$this->logic_tools->ret_arr(-1,'店铺没有在u9平台设置参数'));
            return ;
       }

       $dc_params = [
            'gys'=>$this->gys,//供应商
            'number'=>$info['number'],//erp订单编码
            "TransOutDocType_Code"=>"TransOut001",//组织间调拨
            "time"=>$time,
            'TransferDirection'=>0,//普通
            'yyid'=>$shop['yyid'],//来源店铺  这种需要在店铺表中有
            'shipremarks'=>$info['shipremarks'],//订单的备注
            'dcckbm'=>$this->xdcp_code,//调出仓库编码
            'drckbm'=>$this->xdxgls_code,//调入仓库编码
            'drzz_code'=>$this->xdxgzzcode,//调入组织Code
            'owner_code'=>$this->xdzzcode,//货主组织Code
            'ztcode'=>$this->ztcode,//账套
            'tb_org_arr'=>$this->tb_org_arr,//要同步的组织列表
            'list'=>$list
       ];
      

       //创建许昌成品库的销售单
       $xsd_res = $this->apiyyv1->xsdCreate($dc_params,$token_140);

       if(empty($xsd_res[0]['Data'][0]['m_code'])){
             $this->editData($info['zq_u9_id'],['xs_two_status'=>-1,'update_time'=>time()],$info['number'],7,1,'xs_two',$xsd_res[1],$xsd_res[0]);
             return ;
        }
        //更新销售单数据
        $xs_no = $xsd_res[0]['Data'][0]["m_code"];
        $this->editData($info['zq_u9_id'],['xs_two_no'=>$xs_no,'xs_two_status'=>1,'update_time'=>time()],$info['number'],7,1,'xs_two',$xsd_res[1],$xsd_res[0]);
       
    }
   
    //检查u9编码是否存在  如果不存在 请先添加并
    protected function checkLp($info,$token){
        
        //未注册的货品的列表
        $unregister_goods = [];
        // $info['list'][1]['jm'] ="9A-#NB-STW-20-FP-5*5C-C-180%-ww2";
        // $info['list'][1]['zh'] ="测试数据请删除2--".$info['list'][1]['zh'];
        // $info['list'][0]['jm'] ="9A-#NB-STW-22-ww2";
        // $info['list'][0]['zh'] ="测试数据请删除2--".$info['list'][0]['zh'];
        $r = $this->apiyyv1->cxLp($info['list'],$token);
       
        if(!$r[0]['Success']){
            return $this->logic_tools->ret_arr(-1,'查询商品信息异常'.json_encode($r,JSON_UNESCAPED_UNICODE));
        }
        foreach($r[0]['Data'] as $k=>$v)
        {
            foreach($info['list'] as $kk => $vv){
                if($v['m_code'] == $vv['jm']){
                    $info['list'][$kk]['is_register'] = 1;
                }
            }
        }
        foreach($info['list'] as $k => $v){
            if($v['is_register'] == 0){
                $unregister_goods[] = $v;
            }
        }
        if(empty($unregister_goods)){
            return $this->logic_tools->ret_arr(1,"料品无异常");
        }
        $tb_info =  $info;
        $tb_info['list'] = $unregister_goods;
        return $this->tjLpAndTb($tb_info,$token);
    }
    //添加料品并且下发
    public function tjLpAndTb($tb_info,$token){
        $r = $this->apiyyv1->cjLp($tb_info['list'],$token);
        if($r[0]["Success"]){
            $rr = $this->apiyyv1->tbLp($tb_info,$token);
            if($rr[0]['Success']){
                return $this->logic_tools->ret_arr(1,$rr);
            }else{
                return $this->logic_tools->ret_arr(-1,$rr);
            }
        }else{
            return $this->logic_tools->ret_arr(-1,$r);
        }
    }

    //根据返回的状态修改对应的值
    protected function editData($zq_u9_id,$z_qu_arr,$number,$one_type,$two_type,$apply_api,$apply_data,$ret_data){
        $this->zzquque_u9->save($z_qu_arr,$zq_u9_id);
        $this->zzququeu9_logs->insert([
            'oid'=>$zq_u9_id,
            'number'=>$number,
            'one_type'=>$one_type,
            'two_type'=>$two_type,
            'apply_api'=>$apply_api,
            'apply_data'=>json_encode($apply_data,JSON_UNESCAPED_UNICODE),
            'ret_data'=>json_encode($ret_data,JSON_UNESCAPED_UNICODE),
            'create_time'=>time(),
            'read_time'=>date("Y-m-d H:i:s")
        ]);
    }
}