<?php
/**
 * Created by JetBrains PhpStorm.
 * User: user
 * Date: 15-7-8
 * Time: 下午3:24
 * To change this template use File | Settings | File Templates.
 */
class Service_EBAYApiProcess
{
    private $wsdlUrl = "https://api.apacshipping.ebay.com.hk/aspapi/v4/ApacShippingService?WSDL";

    private $header = array(
        'APIDevUserID' => '',
        'APISellerUserToken' => '',
        'APISellerUserID' => '',
        'AppID' => '',
        'AppCert' => '',
        'MessageID' => '',
        'Version' => '4.0.0',
        'Carrier' => 'CNPOST',//可用值：CNPOST FEDEX
    );

    private $soap = '';
    private $order;
    private static $con = '';

    public function __construct(){

    }

    public static function getInstance() {
        if ('' == self::$con) {
            return new Service_EBAYApiProcess();
        } else {
            return self::$con;
        }

    }

    /*
     * set PickUpType
     * @param $pickUpType    Required    取件类型 0 上门取件， 1 自己送件
     */
    public function setPickUpType($pickUpType = 0)
    {
        $this->order['EMSPickUpType'] = $pickUpType;
    }

    public function setShipFromAddress($shipFromAddress)
    {
        $this->order['ShipFromAddress'] = array(
            'Contact' => $shipFromAddress['contact'],
            'Company' => $shipFromAddress['company'],
            'Street' => $shipFromAddress['street'],
            'District' => $shipFromAddress['district'],
            'City' => $shipFromAddress['city'],
            'Province' => $shipFromAddress['province'],
            'Postcode' => $shipFromAddress['postcode'],
            'CountryCode' => $shipFromAddress['country'],
            'Email' => $shipFromAddress['email'],
            'Mobile' => $shipFromAddress['mobile'],
            'Phone'  => $shipFromAddress['mobile'],

            /* 'Contact'=>'Danny Zhou',
			'Company'=>'cargo company',
			'Street'=>'JinTian Road No.8086 AnLian A 25 Floor',
			'District'=>'Futian district',
			'City'=>'shenzhen city',
			'Province'=>'GUANGDONG',
			'Postcode'=>'518026',
			'CountryCode'=>'CN',
			'Email'=>'dannyzhou@globex.cn',
			'Mobile'=>'13594268155',
			'Phone'=>'0755-21629199',
             */
        );
    }

    public function  setPickUpAddress($pickUpAddress)
    {
        $this->order['PickUpAddress'] = array(
            'Email' => $pickUpAddress['email'],
            'Company' => $pickUpAddress['company'],
            'CountryCode' => $pickUpAddress['country'],
            'Province' => $pickUpAddress['province'],
            'City' => $pickUpAddress['city'],
            'District' => $pickUpAddress['district'],
            'Street' => $pickUpAddress['street'],
            'Postcode' => $pickUpAddress['postcode'],
            'Contact' => $pickUpAddress['contact'],
            'Mobile' => $pickUpAddress['mobile'],
            'Phone' => $pickUpAddress['phone'],

            /*'Email'=>'dannyzhou@globex.cn',
            'Company'=>'cargo company',
            'CountryCode'=>'CN',
            'Province'=>'440000',
            'City'=>'440300',
            'District'=>'440304',
            'Street'=>'JinTian Road',
            'Postcode'=>'518026',
            'Contact'=>'Danny Zhou',
            'Mobile'=>'13594268155',
            'Phone'=>'0755-5180256',*/

        );
    }

    public function  setReturnAddress($ReturnAddress)
    {
        $this->order['ReturnAddress'] = array(
            'Company' => $ReturnAddress['company'], //公司
            'CountryCode' => $ReturnAddress['country'], //国家 中国
            'Province' => $ReturnAddress['province'], //省
            'City' => $ReturnAddress['city'], //城市
            'District' => $ReturnAddress['district'], //区
            'Street' => $ReturnAddress['street'], //街道
            'Postcode' => $ReturnAddress['postcode'], //邮编
            'Contact' => $ReturnAddress['contact'], //联系人

            /*'Company'=>'Cargo',
            'CountryCode'=>'CN',
            'Province'=>'440000',
            'City'=>'shenzhen city',
            'District'=>'Futian district',
            'Street'=>'JinTian Road No.8086 AnLian A 25 Floor',
            'Postcode'=>'518026',
            'Contact'=>'Danny Murphy',*/

        );
    }

    public function  setShipToAddress($shipToAddress)
    {

        $this->order['ShipToAddress'] = array(
            'Email' => $shipToAddress['email'],
            'Company' => $shipToAddress['company'],
            'Contact' => $shipToAddress['contact'],
            'Phone' => empty($shipToAddress['phone']) ? ' ' : $shipToAddress['phone'],
            'Street' => $shipToAddress['street'],
            'City' => $shipToAddress['city'],
            //'District'=>$shipToAddress['District'],
            'Province' => $shipToAddress['District'],
            'Postcode' => $shipToAddress['postcode'],
            'CountryCode' => $shipToAddress['country_code'],
            'Mobile' => empty($shipToAddress['phone']) ? ' ' : $shipToAddress['phone'],

            /*'Email'=>'237094549@qq.com',
            'Company'=>'Alan Harris',
            'Contact'=>'Andy Liu',
            'Phone'=>'041-329-5500',
            'Street'=>'5 Dewdrop PL',
            'City'=>'Ningi',
            'District'=>'',
            'Province'=>'Queensland',
            'Postcode'=>'451100',
            'CountryCode'=>'US',
            'Mobile'=>'12321232123'*/

        );
    }

    public function setShippingPackage(){
        $this->order['ShippingPackage'] = array(
            'Description'=>'just for test',//包裹内容物描述，如果内容超过 60字符，则超出长度部分会被舍弃。
            'Length'=>10,//单位为米 对 FedEx: 最小值=0.05，必填 国际 e 邮宝不需填写
            'Height'=>10,//单位为米 对 FedEx: 最小值=0.05，必填 国际 e 邮宝不需填写
            'Width'=>10,//单位为米 对 FedEx: 最小值=0.05，必填 国际 e 邮宝不需填写
            'Incoterms'=>'DDU', //国贸条规，可用值  DDP(卖家承担关税)  DDU(买家承担关税) 为空时默认值为 DDU，并返回警告
            'CollectionInstructions'=>'轻拿轻放', //揽收注意事项
            'DeliveryInstructions'=>'轻拿轻放', //揽收注意事项
        );
    }

    public function addItem($item)
    {
        $sku = array(
            'SKUID' => $item['skuid'],//SKU ID
            'Weight' => $item['weight'],//物品重量（千克），国际 e 邮宝包裹可用值 0-2 FedEx: 0.005-200KG
            'CustomsTitle' => $item['customs_title_cn'],//英文报关名称 FedEx 不需填写 国际 e 邮宝包裹请填中文报关名
            'CustomsTitleEN' => $item['customs_title_en'], //英文报关名称
            'DeclaredValue' => $item['declared_value'],//物品申报价值 对 BP_MINIPAK，申报价值不得超 过 22 欧
            'OriginCountryName' => empty($item['origin_country_name']) ? 'China' : $item['origin_country_name'],//原产地名称，可用值请填写原产国 英文名称
            'OriginCountryCode' => empty($item['origin_country_code']) ? 'CN' : $item['origin_country_code'],//原产地国家二字码
            'HTSNumber'=>'',//关税代码，最小长度为 2
        );
        $this->order['ItemList']['Item'][] = array(
            'EBayItemID' =>$item['ebay_item_id'] , //eBay 物品号
            'EBayTransactionID' =>$item['ebay_transaction_id'], //eBay 交易号，拍卖的物品请输入 0
            'EBayBuyerID' => $item['ebay_buyer_id'], //eBay 买家 ID
            'EBayItemTitle'=> $item['ebay_item_title'] ,//eBay 商品标题
            'EBayEmail' =>$item['ebay_email'] , //买家 eBay 电邮
            'SoldQTY' =>$item['sold_qty']  ,//卖出数量
            'PostedQTY' => $item['posted_qty'] ,//PostedQTY' => $item['ebay_message'],//寄货数量，不能为 0
            'SalesRecordNumber' =>$item['sales_record_number'] , //用户从 eBay 上下载的时 eBay 销售编号
            'OrderSalesRecordNumber' => $item['order_sales_record_number'] , //订单销售编号， 如果在 eBay 上合并订单，会产生一个新的SalesRecordNumber
            'OrderID' =>$item['order_id'] ,//eBay 合并订单时生成的一个新的Order ID
            'EBaySiteID' =>$item['ebay_site_id'] ,//站点 ID
            'ReceivedAmount' =>$item['received_amount'] ,//实际收到金额
            'PaymentDate' =>$item['payment_date'] ,//买家付款日期
            'SoldPrice' => $item['sold_price'],//卖出总价
            'SoldDate' =>$item['sold_date'] ,//卖出日期
            'CurrencyCode' =>$item['currency_code'] ,//货币符号 默认为 USD，
            'EBayMessage' => $item['ebay_message'] ,//买家 eBay 留言
            'PayPalEmail' => $item['paypal_email'] ,//买家 PayPal 电邮地址
            'PayPalMessage' => $item['paypal_message'],//买家 PayPal 留言
            'Note' => $item['note'] ,//附注
            'SKU' =>$sku,
        );
    }

    /******
     * AddPackage
     * 用户通过调用该方法上传一个需要发货的包裹信息，返回申请到的包裹追踪号
     * 调用接口方法AddAPACShippingPackage
     ******/
    public function AddPackage()
    {
        try {
            $order['AddAPACShippingPackageRequest'] = $this->header;
            $order['AddAPACShippingPackageRequest']['Service'] = "EPACK";//对CNPOST可用值EPACK 对FEDEX,可用值INT_EC

            $order['AddAPACShippingPackageRequest']['OrderDetail'] = $this->order;
            
            $client = $this->getClient();
            print_r($client);
            exit;
            $respones = $client->AddAPACShippingPackage($order);

            $result = Common_Common::objectToArray($respones);

            /*$epacketLog = 'AddPackage ' . $respones->AddAPACShippingPackageResult->Ack . ' ';
            if (!empty($notificationList)) {
                $epacketLog .= print_r($notificationList,true) . ' ';
            }
            $epacketLog .= $respones->AddAPACShippingPackageResult->Timestamp . ' ';
            $epacketLog .= $respones->AddAPACShippingPackageResult->InvocationID . ' ';
            if (strtolower($respones->AddAPACShippingPackageResult->Ack) == 'success') {
                $epacketLog .= $respones->AddAPACShippingPackageResult->TrackCode;

            }

            $this->logError($epacketLog);*/
            return $result;

        } catch (Exception $e) {
            echo $e->getMessage();
            $this->logError($e);
        }

    }

    /************
     * getShippingLabel()
     * 用于打印详情单，呼叫成功后会返回标签流。
     * 调用接口方法 GetAPACShippingLabel
     ************/
    public function getShippingLabel($trackNumber)
    {
        /*标签格式，PageSize可用值：
        0 - 适用于打印 A4 格式标签
        1 – 适用于打印 4 寸 的热敏标签纸格式标签
        2 – 10*10cm 的热敏标签， 适用于BP_MINIPAK
        3 – 10*15cm 的热敏标签，适用于BP_TRAKPAK
        国际 e 邮宝支持 A4，热敏
        FedEx 只支持 A4*/
        $getLabelArray = array(
            'GetAPACShippingLabelRequest' => $this->header,
        );
        $getLabelArray['GetAPACShippingLabelRequest']['TrackCode'] = $trackNumber;
        $getLabelArray['GetAPACShippingLabelRequest']['PageSize'] = '1';

        $client = $this->getClient();
        $response = $client->GetAPACShippingLabel($getLabelArray);
        return $response;
    }

    /*************
     * confirmPackage()
     * 确认并交运包裹信息
     * 调用接口方法 ConfirmAPACShippingPackage
     *
     ****************/
    public function confirmPackage($trackNumber)
    {
        $confirmArray = array(
            'ConfirmAPACShippingPackageRequest' => $this->header,
        );
        if ($trackNumber == '') {
            return false;
        }

        $confirmArray['ConfirmAPACShippingPackageRequest']['TrackCode'] = $trackNumber;
        try {

//             $response = $this->soap->ConfirmAPACShippingPackage($confirmArray);
            $client = $this->getClient();
            $response = $client->ConfirmAPACShippingPackage($confirmArray);

            $logInfo = 'confirmPackage ' . $response->ConfirmAPACShippingPackageResult->Ack . ' ';
            $notification_array = $this->object_array($response->ConfirmAPACShippingPackageResult->NotificationList);
            if (!empty($notification_array)) {
                $logInfo .= print_r($notification_array,true);
            }
            $logInfo .= $response->ConfirmAPACShippingPackageResult->Timestamp . ' ' . $response->ConfirmAPACShippingPackageResult->InvocationID;
            $this->logError($logInfo);

            $date = date("Ymd");
            return $response;
        } catch (Exception $e) {
            $this->logError($e);
        }

    }

    /*************
     * cancelPackage()
     * 用于取消并删除在交运前的订单
     *  调用接口方法 CancelAPACShippingPackage
     *
     ****************/
    public function cancelPackage($trackNumber)
    {
        $cancelArray = array(
            'CancelAPACShippingPackageRequest' => $this->header,
        );
        if ($trackNumber == '') {
            return false;
        }
        $cancelArray['CancelAPACShippingPackageRequest']['TrackCode'] = $trackNumber;
        //$cancelArray['CancelAPACShippingPackageRequest']['Carrier'] = "CNPOST";

        try {

            $client = $this->getClient();
            $response = $client->CancelAPACShippingPackage($cancelArray);

            $logInfo = 'cancelPackage ' . $response->CancelAPACShippingPackageResult->Ack . ' ';
//             $response->CancelAPACShippingPackageResult->Message
            $message_array = $this->object_array($response->CancelAPACShippingPackageResult->NotificationList);
            if (!empty($message_array)) {
                $logInfo .= print_r($message_array,true) . ' ';
            }
            $logInfo .= $response->CancelAPACShippingPackageResult->Timestamp . ' ' . $response->CancelAPACShippingPackageResult->InvocationID;
            $this->logError($logInfo);

            $date = date("Ymd");

            return $response;

        } catch (Exception $e) {
            $this->logError($e);
        }
    }

    /***
     * @param $trackNumber Eub订单号
     * getPackage()
     * 用于获取包裹的详细信息
     * 调用接口方法 GetAPACShippingPackage
     *
     */
    public function getPackage($trackNumber)
    {
        $requestArray = array(
            'GetAPACShippingPackageRequest' => $this->header,
        );
        if ($trackNumber == '') {
            return false;
        }
        $requestArray['GetAPACShippingPackageRequest']['TrackCode'] = $trackNumber;
        //$requestArray['GetAPACShippingPackageRequest']['Carrier'] = "CNPOST";

        try {

            $client = $this->getClient();
            $response = $client->GetAPACShippingPackage($requestArray);

            $logInfo = 'getPackage ' . $response->GetAPACShippingPackageResult->Ack . ' ';
            $message_array = $this->object_array($response->GetAPACShippingPackageResult->NotificationList);
            if (!empty($message_array)) {
                $logInfo .= print_r($message_array,true) . ' ';
            }
            $logInfo .= $response->GetAPACShippingPackageResult->Timestamp . ' ' . $response->GetAPACShippingPackageResult->InvocationID;
            $this->logError($logInfo);
            return $response;

        } catch (Exception $e) {
            $this->logError($e);
        }


    }

    /****
     * @param $trackNumber Eub订单号
     * getPackageStatus();
     * 获取一个包裹的当前状态
     * 调用接口方法 GetAPACShippingPackageStatus
     * 包裹当前状态，返回 Status可用值： 0  待交运 4  揽收拒绝 5  投递成功 6    投递失败 7  卖家自送 8  上门揽收 9  订单取消 10  运输中
     *                     Note 补充信息
     */
    public function getPackageStatus($trackNumber)
    {
        $requestArray = array(
            'GetAPACShippingPackageStatusRequest' => $this->header,
        );
        $requestArray['GetAPACShippingPackageStatusRequest']['TrackCode'] = $trackNumber;
        //$requestArray['GetAPACShippingPackageStatusRequest']['Carrier'] = "CNPOST";
        try {

            $client = $this->getClient();
            $response = $client->GetAPACShippingPackageStatus($requestArray);

            $logInfo = 'getPackageStatus ' . $response->GetAPACShippingPackageStatusResult->Ack . ' ';
            $message_array = $this->object_array($response->GetAPACShippingPackageStatusResult->NotificationList);

            if (!empty($message_array)) {
                $logInfo .= print_r($message_array,true) . ' ';
            }
            $logInfo .= $response->GetAPACShippingPackageStatusResult->Timestamp . ' '
                . $response->GetAPACShippingPackageStatusResult->InvocationID.' '
                . $response->GetAPACShippingPackageStatusResult->Status.' '
                . $response->GetAPACShippingPackageStatusResult->Note;
            $this->logError($logInfo);

            $date = date("Ymd");

            return $response;

        } catch (Exception $e) {
            $this->logError($e);
        }


    }

    /**
     * recreatePackage()
     * 用于重新发货。重新发货成功之后会返回一个新的跟踪号，并且订单会移动到待交运文件夹里面。
     * 调用接口方法 RecreateAPACShippingPackage
     */
    public function recreatePackage($orderCode,$trackNumber)
    {
        $result = array(
            'state' => 0,
            'message' => '',
            'orderCode' => $orderCode,
            'TrackCode' => '',
        );

        $requestArray = array(
            'RecreateAPACShippingPackageRequest' => $this->header,
        );
        $order_item = Service_OrderProduct::getByCondition(array("order_code"=>$orderCode),"*",0,1,"");
        if (empty($trackNumber) || '' == $trackNumber) {
            $result["message"] = "重发失败，tracking number 不能为空.";
            return $result;
        }
        if(empty($order_item)){
            $result["message"] = "重发失败，获取不到系统订单明细.";
            return $result;
        }
        $requestArray['RecreateAPACShippingPackageRequest']['TrackCode'] = $trackNumber;


        try {
            $client = $this->getClient();
            $response = $client->RecreateAPACShippingPackage($requestArray);

            $message_array = $this->object_array($response->RecreateAPACShippingPackageResult->NotificationList);
            $result['message'] = isset($message_array["Notification"]["Message"]) ? $message_array["Notification"]["Message"] : '';
            if (isset($response->RecreateAPACShippingPackageResult->Ack) && strtolower($response->RecreateAPACShippingPackageResult->Ack) == 'success') {
                return $this->getShippingLabelSave($orderCode, $response->RecreateAPACShippingPackageResult->TrackCode);
            } else {

                $getTrackCodeArray = array(
                    'op_ref_item_id' => isset($order_item[0]["op_ref_item_id"]) ? $order_item[0]["op_ref_item_id"] : '',
                    'op_ref_tnx' => isset($order_item[0]["op_ref_tnx"]) ? $order_item[0]["op_ref_tnx"] : '',
                );
                $trackNumberResult = $this->getTrackCode($getTrackCodeArray);
                if (isset($trackNumberResult->GetAPACShippingTrackCodeResult->Ack)
                    && strtolower($trackNumberResult->GetAPACShippingTrackCodeResult->Ack) == 'success'
                    && isset($trackNumberResult->GetAPACShippingTrackCodeResult->TrackCode)
                    && $trackNumberResult->GetAPACShippingTrackCodeResult->TrackCode != '') {
                    return $this->getShippingLabelSave($orderCode, $trackNumberResult->GetAPACShippingTrackCodeResult->TrackCode);
                }
            }
        } catch (Exception $e) {
            $this->logError($e);
        }


    }

    /**
     * getTrackCode()
     * 用于获取跟踪号，当订单已经存在时，用于根据ItemID及TransactionID查询一个物品的包裹跟踪号。
     * 调用接口方法 GetAPACShippingTrackCode
     */
    public function getTrackCode($trackDetail)
    {
        $requestArray = array(
            'GetAPACShippingTrackCodeRequest' => $this->header,
        );
        if ('' == $trackDetail['op_ref_item_id'] || '' == $trackDetail['op_ref_tnx']) {
            return false;
        }
        $requestArray['GetAPACShippingTrackCodeRequest']['EBayItemID'] = $trackDetail['op_ref_item_id'];
        $requestArray['GetAPACShippingTrackCodeRequest']['EBayTransactionID'] = $trackDetail['op_ref_tnx'];

        try {
//             $response = $this->soap->GetAPACShippingTrackCode($requestArray);
            $client = $this->getClient();
            $response = $client->GetAPACShippingTrackCode($requestArray);
            $response_array = $this->object_array($response);

            $logInfo = 'getTrackCode ' . $response->GetAPACShippingTrackCodeResult->Ack . ' ';
            if($response->GetAPACShippingTrackCodeResult->Ack != 'Success'){
                $notificationList = $this->object_array($response->GetAPACShippingTrackCodeResult->NotificationList);
                $logInfo .= print_r($notificationList,true);
            }

            $logInfo .= $response->GetAPACShippingTrackCodeResult->Timestamp . ' ' . $response->GetAPACShippingTrackCodeResult->InvocationID;
            $this->logError($logInfo);
            return $response;
        } catch (Exception $e) {
            $this->logError($e);
        }


    }

    private function logError($error)
    {
        $logger = new Zend_Log();
        $uploadDir = APPLICATION_PATH . "/../data/log/";
        $writer = new Zend_Log_Writer_Stream($uploadDir . 'EpacketWebService_err.log');
        $logger->addWriter($writer);
        $logger->info("\n" . date('Y-m-d H:i:s') . ":\n" . trim($error));
    }

    /**
     * @desc 提交易邮宝
     * @param orderCode 订单号
     */
    public function submitToEpacket($orderCode)
    {
        //Ec::showError(print_r($this->header,1),'head');
        $result = array(
            'state' => 0,
            'message' => '',
            'orderCode' => $orderCode,
            'TrackCode' => '',
        );
        try {
            $db = Common_Common::getAdapter();
            $orderRow = Service_Orders::getByField($orderCode, 'order_code');
            $orderAddress = Service_OrderAddressBook::getByField($orderRow['order_id'], 'order_id', "*");
            $country = Service_Country::getByField($orderAddress["oab_country_id"], "country_id", "*");

            $ebDbName = Service_UserSystem::getByField("EB","us_code",array("us_db"));
            //获取发货/揽收地址、英文退货地址、中文退货地址
            $sql_address = "SELECT
            			t1.*,
						t2.*
					FROM
						".$ebDbName["us_db"].".eub_account t1,
						".$ebDbName["us_db"].".eub_address t2
					WHERE
						t1.ea_id = t2.ref_id
					AND t1.ebay_account = '".$orderRow['seller_id']."' and t2.eub_type = 3";
//             $custmoerAddress = $db->fetchRow($sql_address);

            $result_address = $db->fetchAll($sql_address);
            if(empty($result_address)){
                $result['message'] = '发货地址、英文退货地址、中文退货地址[未维护]';
                return $result;
            }

            /*
             * 判断是否绑定运输方式
             */
            $custmoerAddress = array();		//API取值用
            $common_address = array();		//通用
            $specified_address = array();	//匹配运输方式
            foreach ($result_address as $key => $value) {
                if(empty($value['sm_code_arr'])){
                    $common_address = $value;
                    continue;
                }

                $val = explode(';', $value['sm_code_arr']);
                if(in_array($orderRow['sm_code'], $val)){
                    $specified_address = $value;
                    break;
                }
            }

            if(!empty($specified_address)){
                //指定运输方式的地址
                $custmoerAddress = $specified_address;
            }else if(!empty($common_address)){
                //公共地址
                $custmoerAddress = $common_address;
            }else{
                //异常
                $result['message'] = '发货地址、英文退货地址、中文退货地址[匹配失败][运输方式：'.$orderRow['sm_code'].']';
                return $result;
            }

            $date = date("Ymd");

            $shipToAddress = array(
                'email' => $orderAddress['oab_email'],
                'company' => $orderAddress['oab_company'],
                'contact' => $orderAddress['oab_firstname'] . " " . $orderAddress['oab_lastname'],
                'phone' => $orderAddress['oab_cell_phone'],
                'street' => $orderAddress['oab_street_address1'] . ' ' . $orderAddress['oab_street_address2'],
                'city' => $orderAddress['oab_city'],
                'province' => $orderAddress['oab_state'],
                'postcode' => trim($orderAddress['oab_postcode']),
                'country' => $country['country_name_en'],
                'country_code' => $country['country_code'],
            );

            $shipFromAddress = array(
                'contact' => $custmoerAddress["rname_en"],
                'company' => $custmoerAddress["rcompany_en"],
                'street' => $custmoerAddress["rstreet_en"],
                'district' => $custmoerAddress["rdis_en"],
                'city' => $custmoerAddress["rcity_en"],
                'province' => $custmoerAddress["rprovince_en"],		//寄件人和退货地址省份对照表
                'postcode' => trim($custmoerAddress["rzip_en"]),
//              'CountryCode' => $custmoerAddress["rcountry_en"],
                'CountryCode' => "CN",
                'email' => $custmoerAddress["remail_en"],
                'mobile' => $custmoerAddress["rmobile_en"],
            );

            $returnAddress = array(
                'company' => $custmoerAddress['rcompany'],
                'CountryCode' => 'CN',//$custmoerAddress['rcountry'],				//国家二字码
                'province' => self::getProvinceEn($custmoerAddress['rprovince']),	//寄件人地址和退货地址省份对照表【英文】
                'city' => $custmoerAddress['rcity'],
                'district' => $custmoerAddress['rdis'],
                'street' => $custmoerAddress['rstreet'],
                'postcode' => trim($custmoerAddress['rzip']),
                'contact' => $custmoerAddress['rname'],
            );
            $pickUpAddress = array(
                'email' => $custmoerAddress["pemail"],
                'company' => $custmoerAddress["pcompany"],
//             	'CountryCode' => $custmoerAddress["pcountry"],
                'CountryCode' => "CN",
                'province' => $custmoerAddress["pprovince"],//揽收地址代码表
                'city' => $custmoerAddress["pcity"],		//揽收地址代码表
                'district' => $custmoerAddress["pdis"],		//揽收地址代码表
                'street' => $custmoerAddress["pstreet"],
                'postcode' => trim($custmoerAddress["pzip"]),
                'contact' => $custmoerAddress["pname"],
                'mobile' => $custmoerAddress["pmobile"],
                'phone' => $custmoerAddress["ptel"],
            );

//          $orderProduct = Service_OrderProduct::getByCondition(array("order_id" => $orderRow['order_id']), "*");

            $sql = "select * from order_product where order_id = ".$orderRow['order_id']." group by op_ref_item_id";
            $orderProduct = $db->fetchAll($sql);
            $pickUpType = 0;
            $this->setPickUpType($pickUpType);
            if ($pickUpType == 0) {
                $this->setPickUpAddress($pickUpAddress);
            }
            $this->setShipFromAddress($shipFromAddress);
            $this->setShipToAddress($shipToAddress);
            $this->setReturnAddress($returnAddress);

            $product_title_en = "";
            $product_title = "";

            //处理申报价值
            $obj = new API_Common_ServiceCommonClass();
            $invoice = $obj->getInvoice($orderCode);
            $productInvoice = $invoice["detailInvoice"];


            foreach ($orderProduct as $v) {
                $weight = 0;
                $invoiceValue = $productInvoice[$v["product_id"]];
                $declare_value = 0;
                $temp_orderP = Service_OrderProduct::getByCondition(array("order_id"=>$v["order_id"],"op_ref_item_id"=>$v["op_ref_item_id"]),array("product_id","op_quantity"),0,1,"");
                foreach($temp_orderP as $p){
                    $temp_p = Service_Product::getByField($p["product_id"],"product_id",array("product_barcode","pd_id","pc_id"));
                    $product_d = Service_ProductDevelop::getByField($temp_p["pd_id"],"pd_id","*");

                    $category_ = Service_ProductCategory::getByField($temp_p["pc_id"],"pc_id","*");

                    if(empty($product_d["pd_oversea_type"])){
                        $product_title_en .= $category_["pc_name_en"]." ";
                    }else{
                        if(!empty($product_title_en) && trim($product_title_en) == trim($product_d["pd_oversea_type"])){
                            //相同时，不做内容叠加
                        }else{
                            $product_title_en .= $product_d["pd_oversea_type"]." ";
                        }
                    }

                    if(empty($product_d["pd_oversea_type_cn"])){
                        $product_title .= $category_["pc_name"]." ".$temp_p["product_barcode"]."*".$p["op_quantity"];
                    }else{
                        $product_title .= $product_d["pd_oversea_type_cn"]." ".$temp_p["product_barcode"]."*".$p["op_quantity"];
                    }

                    $weight += $product_d['pd_weight']*$p["op_quantity"];
                    $declare_value += $product_d['pd_declare_value']*$p["op_quantity"];
                }
                //手工加的SKU没有item_id，进行不预报处理
                if(empty($v['op_ref_item_id'])){
                    continue;
                }
                $product = Service_Product::getByField($v['product_id'], "product_id", "*");

                if($invoiceValue == 0){
                    $invoiceValue = $declare_value;
                }
                if($invoiceValue == 0){
                    $result['message'] = '产品未维护申报价值.';
                    return $result;
                }
                if($weight == 0){
                    $result['message'] = '产品未维护重量.';
                    return $result;
                }

                $epacketItem = array(
                    'skuid' => $product['product_sku'],
                    'weight' => $weight,
                    'customs_title_cn' => $product_title,
                    'customs_title_en' => $product_title_en,
                    'declared_value' => $invoiceValue,
                    'currency_code' => $product['currency_code'],
                    'ebay_email' => '',
                    'ebay_buyer_id' => $v['op_ref_buyer_id'],
                    'ebay_item_id' => $v['op_ref_item_id'],
                    'ebay_item_title' => '',
                    'ebay_message' => '',
                    'ebay_site_id' => '',
                    'ebay_transaction_id' => $v['op_ref_tnx'],
                    'note' => '',
                    'order_sales_record_number' => '',
                    'payment_date' => date('Y-m-d', strtotime($v['op_ref_paydate'])),
                    'paypal_email' => '',
                    'paypal_message' => '',
                    'posted_qty' => $v['op_quantity'],
                    'received_amount' => 0,
                    'sales_record_number' => '',
                    'sold_date' => date('Y-m-d', strtotime($v['op_ref_paydate'])),
                    'sold_price' => '1',
                    'sold_qty' => 1,
                );
                $product_title_en = "";
                $product_title = "";
                $this->addItem($epacketItem);
                $date = date("Ymd");
            }

//             print_r($this->order);exit;
            $respones = $this->AddPackage();

            //处理请求结果
            $notificationList = $this->object_array($respones->AddAPACShippingPackageResult->NotificationList);
//             echo '---';
//             print_r($notificationList);
//             echo '---';
            if (isset($respones->AddAPACShippingPackageResult->Ack) && strtolower($respones->AddAPACShippingPackageResult->Ack) == 'success') {
                return $this->getShippingLabelSave($orderCode, $respones->AddAPACShippingPackageResult->TrackCode);
            } else {
                $getTrackCodeArray = array(
                    'op_ref_item_id' => isset($this->order['ItemList']['Item'][0]['EBayItemID']) ? $this->order['ItemList']['Item'][0]['EBayItemID'] : '',
                    'op_ref_tnx' => isset($this->order['ItemList']['Item'][0]['EBayTransactionID']) ? $this->order['ItemList']['Item'][0]['EBayTransactionID'] : '',
                );
                $trackNumberResult = $this->getTrackCode($getTrackCodeArray);
                if (isset($trackNumberResult->GetAPACShippingTrackCodeResult->Ack)
                    && strtolower($trackNumberResult->GetAPACShippingTrackCodeResult->Ack) == 'success'
                    && isset($trackNumberResult->GetAPACShippingTrackCodeResult->TrackCode)
                    && $trackNumberResult->GetAPACShippingTrackCodeResult->TrackCode != '') {
                    return $this->getShippingLabelSave($orderCode, $trackNumberResult->GetAPACShippingTrackCodeResult->TrackCode);
                } else {
//                     $result['state'] = 0; //获取不到跟踪号
//                  $message = $this->object_array($trackNumberResult->GetAPACShippingTrackCodeResult->NotificationList);
                    $notification_message = "";
                    if(!empty($notificationList["Notification"][0])){
                        foreach($notificationList["Notification"] as $key=>$val){
                            $notification_message .= $val["Message"].'; ';
                        }
                    }else{
                        $notification_message .= $notificationList["Notification"]["Message"];
                    }

                    $result['message'] .= $notification_message;
                }
            }
        } catch (Exception $e) {
            $result['message'] .= $e->getMessage();
        }
        return $result;
    }

    /**
     * @desc 保存PDF
     * @param $orderCode
     * @param $trackCode
     * @return mixed
     */
    public function getShippingLabelSave($orderCode, $trackCode)
    {
        $label = $this->getShippingLabel($trackCode);
        $date = date("Ymd");
        $result['state'] = 1;
        $result['TrackCode'] = $trackCode;
        $result['orderCode'] = $orderCode;
        $result['message'] = 'success';
        if (isset($label->GetAPACShippingLabelResult->Ack) && strtolower($label->GetAPACShippingLabelResult->Ack) == 'success') {
            $org_path = '/data/pdf/' . $orderCode . ".pdf";
            $file = APPLICATION_PATH . '/../data/pdf/' . $orderCode . ".pdf";

            if (file_exists($file)) {
                @unlink($file);
                $file2 = APPLICATION_PATH . '/../data/pdf/' . $orderCode . "_EO4.pdf";
                @unlink($file2);
            }
            file_put_contents($file, $label->GetAPACShippingLabelResult->Label);
            self::recompilationPdf($file,"_EO4");

            //插入前，判断是否存在，存在删除
            $result_ol = Service_OrderLabel::getByCondition(array('order_code'=>$orderCode));
            if(!empty($result_ol)){
                Service_OrderLabel::delete($orderCode,'order_code');
            }

            //加入pdf2png任务
            $labelRow = array(
                "order_code"=>$orderCode,
                "org_path"=>$org_path,
                "sm_code"=>'',
            );
            Service_OrderLabel::add($labelRow);
        } else {
            $notificationList = $this->object_array($label->GetAPACShippingLabelResult->NotificationList);
            $result['state'] = 2; //获取不到PDF
            $result['message'] = '获取标签失败('.$trackCode.'):'.isset($notificationList["Notification"]["Message"])?$notificationList["Notification"]["Message"]:'';
        }
        return $result;
    }

    /**
     * @desc 重新编译PDF，打开自动打印
     */
    public static function recompilationPdf($file, $suffix = '_A')
    {
        try {
            require_once ('tcpdf/tcpdf.php');
            require_once ('fpdi/fpdi.php');
            $pdf = new FPDI();
            $pagecount = $pdf->setSourceFile($file);
            for ($i = 1; $i <= $pagecount; $i++) {
                $tplidx = $pdf->importPage($i);
                $resolution = array(
                    99.83,
                    99.83
                );
                $pdf->AddPage('P', $resolution, true, true);
                //  $pdf->setPrintHeader(false);
                //$pdf->Image(APPLICATION_PATH . '/../public/lodop/blank.png', 0, 0, 99, 5);
                //  $pdf->setPageOrientation();
                //$pdf->SetFont('droidsansfallback',20);
                $pdf->useTemplate($tplidx, 0, 0, 0, 0, true);
            }
            $js = "";

            /*            $js = <<<EOD
            setTimeout(print,2000);
            function Print() {
                print();
            }
            EOD;*/

            $js .= 'print({bUI: false,bSilent: true,bShrinkToFit: true});//this.closeDoc();';
            //     $pdf->IncludeJS($js);
            //  $js .= 'print(true);';
            $pdf->IncludeJS($js);
            //   $pdf->IncludeJS("print();");
            $newFile = str_ireplace('.pdf', '', $file) . $suffix . '.pdf';
            $pdf->Output($newFile, 'F');
        } catch (Exception $e) {
            Ec::showError($e->getMessage(), 'autoPrintPdf');
        }
    }

    /**
     * @desc 重新编译PDF，打开自动打印
     */
    public static function recompilationPdfMult($fileArr, $suffix = '_A')
    {
        $return = array(
            'ask' => 0,
            'message' => 'Fail.'
        );
        try{
            if(empty($fileArr)){
                throw new Exception('文件不存在或文件不为PDF');
            }
            foreach($fileArr as $file){
                if(! file_exists($file) || ! preg_match('/\.pdf/', strtolower($file))){
                    throw new Exception('文件不存在或文件不为PDF');
                }
            }
            ini_set('memory_limit', '1024M');//内存限制1G
            require_once ('tcpdf/tcpdf.php');
            require_once ('fpdi/fpdi.php');
            $pdf = new FPDI();
            foreach($fileArr as $file){
                $pagecount = $pdf->setSourceFile($file);
                for($i = 1;$i <= $pagecount;$i ++){
                    $tplidx = $pdf->importPage($i);
                    $resolution = array(
                        99.83,
                        99.83
                    );
                    $pdf->AddPage('P', $resolution, true, true);
                    // $pdf->setPrintHeader(false);
                    //$pdf->Image(APPLICATION_PATH . '/../public/lodop/blank.png', 0, 0, 99, 5);
                    // $pdf->setPageOrientation();
                    // $pdf->SetFont('droidsansfallback',20);
                    $pdf->useTemplate($tplidx, 0, 0, 0, 0, true);
                }
            }

            $js = "";

            /*
             * $js = <<<EOD setTimeout(print,2000); function Print() { print(); } EOD;
             */

            $js .= 'print({bUI: false,bSilent: true,bShrinkToFit: true});//this.closeDoc();';
            // $pdf->IncludeJS($js);
            // $js .= 'print(true);';
            $pdf->IncludeJS($js);
            // $pdf->IncludeJS("print();");
            $name = time() . $suffix;
            $return['code'] = $name;
            $newFile = APPLICATION_PATH . "/../data/pdf/" . $name . '.pdf';
            // echo $newFile;exit;
            $pdf->Output($newFile, 'F');
            $return['ask'] = 1;
            $return['message'] = "Success";
        }catch(Exception $e){
            $return['message'] = $e->getMessage();
            Ec::showError($e->getMessage(), 'autoPrintPdf');
        }
        return $return;
    }

    public function excuteService($method,$data){
        $result = array("state"=>0,"message"=>"","result"=>"","responseInfo"=>"");
        try {
            $client = $this->getClient();
            $re = $client->$method($data);
            $return = $this->object_array($re);
            $result["state"] = 1;
            $result["result"] = $return;
        } catch (Exception $e) {
            $result["responseInfo"] = XML_unserialize($client->__getLastResponse());
            $result["message"] = $e->getMessage();
        }
        //     	echo $client->__getLastResponse();
        //     	echo '</p>';
        $date_te = date("Ymd");
        return $result;
    }


    private function getClient()
    {
        return new SoapClient($this->wsdlUrl);
    }

    public function setHeader($header)
    {
        $this->header = array(
            'APIDevUserID' => $header['APIDevUserID'],
            'APISellerUserToken' => $header['APISellerUserToken'],
            'APISellerUserID' => $header['APISellerUserID'],
            'AppID' => $header['AppID'],
            'AppCert' => $header['AppCert'],
            'MessageID' => $header['MessageID'],
            'Version' => $header['Version'],
            'Carrier' => $header['Carrier'],
        );
    }

    public function verifyUser()
    {
        $requestArray = array(
            'VerifyAPACShippingUserRequest' => $this->header,
        );

        try {
            $client = $this->getClient();
            echo "<pre>";
            var_dump($requestArray);
            echo "</pre>";
            $response = $client->VerifyAPACShippingUser($requestArray);
            print_r($response);
            exit;
            $logInfo = 'verifyUser ' . $response->VerifyAPACShippingUserResult->Ack . ' ';
            $message_array = $this->object_array($response->VerifyAPACShippingUserResult->NotificationList);
            if (!empty($message_array)) {
                $logInfo .= print_r($message_array,true) . ' ';
            }

            $logInfo .= $response->VerifyAPACShippingUserResult->Timestamp . ' ' . $response->VerifyAPACShippingUserResult->InvocationID;
            $this->logError($logInfo);
            return $response;

        } catch (Exception $e) {
            $this->logError($e);
            return $e->getMessage();
        }

    }

}
