<?php

/**
 * ASN集货SZY-EUB运输方式订单向EUB创建订单并取回LABEL
 */
require_once 'config.php';
$flag = APPLICATION_PATH . '/../data/log/autoAsn-BH-USPS.lock';

function mkdirs($dir) {
    $dirArray = explode('/', $dir);
    $path = array_shift($dirArray);
    while (file_exists($path)) {
        $path.='/' . array_shift($dirArray);
    }
    foreach ($dirArray as $mk) {
        $path.='/' . $mk;
        mkdir($path, 0777, true);
    }
}

if (@file_exists($flag)) {
    echo "Another process is running.\r\n";
    echo "{$flag}\r\n";
    exit();
}

$handler = fopen($flag, 'wb');
fclose($handler);

echo '[', date('Y-m-d H:i:s'), '] Starting.', "\r\n";
function getOrderTrackingAndLable($condition) {

    $errorArr = array(
        //61**		缺少必要参数
        '6101'=>'请求数据缺少必选项	缺少必要参数',
        '6102'=>'寄件方公司名称为空	关键字段校验不合法',
        '6103'=>'寄方联系人为空',
        '6106'=>'寄件方详细地址为空',
        '6107'=>'到件方公司名称为空',
        '6108'=>'到件方联系人为空',
        '6111'=>'到件方地址为空',
        '6112'=>'到件方国家不能为空',
        '6114'=>'必须提供客户订单号',
        '6115'=>'到件方所属城市名称不能为空',
        '6116'=>'到件方所在县/区不能为空',
        '6117'=>'到件方详细地址不能为空',
        '6118'=>'订单号不能为空',
        '6119'=>'到件方联系电话不能为空',
        '6120'=>'快递类型不能为空',
        '6121'=>'寄件方联系电话不能为空',
        '6122'=>'筛单类别不合法',
        '6123'=>'运单号不能为空',
        '6124'=>'付款方式不能为空',
        '6125'=>'需生成电子运单,货物名称等不能为空',
        '6126'=>'月结卡号不合法',
        '6127'=>'增值服务名不能为空',
        '6128'=>'增值服务名不合法',
        '6129'=>'付款方式不正确',
        '6130'=>'体积参数不合法',
        '6131'=>'订单操作标识不合法',
        '6132'=>'路由查询方式不合法',
        '6133'=>'路由查询类别不合法',
        '6134'=>'未传入筛单数据',
        '6135'=>'未传入订单信息',
        '6136'=>'未传入订单确认信息',
        '6137'=>'未传入请求路由信息',
        '6138'=>'代收货款金额传入错误',
        '6139'=>'代收货款金额小于 0 错误',
        '6140'=>'代收月结卡号不能为空',
        '6141'=>'无效月结卡号,未配置代收货款上限',
        '6142'=>'超过代收货款费用限制',
        '6143'=>'是否自取件只能为 1 或 2',
        '6144'=>'是否转寄件只能为 1 或 2',
        '6145'=>'是否上门收款只能为 1 或 2',
        '6146'=>'回单类型错误',
        '6150'=>'订单不存在',
//8***		功能校验
        '8000'=>'报文 参数不合法	参数无效',
        '8001'=>'IP 未授权	参数无效',
        '8002'=>'服务（功能）未授权',
        '8003'=>'查询单号超过最大限制',
        '8004'=>'路由查询条数超限制',
        '8005'=>'查询次数超限制',
        '8006'=>'已下单，无法接收订单确认请求',
        '8007'=>'此订单已经确认，无法接收订单确认请求',
        '8008'=>'此订单人工筛单还未确认，无法接收订单确认请求',
        '8009'=>'此订单不可收派, 无法接收订单确认请求。',
        '8010'=>'此订单未筛单, 无法接收订单确认请求。',
        '8011'=>'不存在该接入编码与运单号绑定关系',
        '8012'=>'不存在该接入编码与订单号绑定关系',
        '8013'=>'未传入查询单号',
        '8014'=>'校验码错误',
        '8015'=>'未传入运单号信息',
        '8016'=>'重复下单',
        '8017'=>'订单号与运单号不匹配',
        '8018'=>'未获取到订单信息',
        '8019'=>'订单已确认',
        '8020'=>'不存在该订单跟运单绑定关系',
        '8021'=>'接入编码为空',
        '8022'=>'校验码为空',
        '8023'=>'服务名为空',
        '8024'=>'未下单',
        '8025'=>'未传入服务或不提供该服务',
        '8026'=>'不存在的客户',
        '8027'=>'不存在的业务模板',
        '8028'=>'客户未配置此业务',
        '8029'=>'客户未配置默认模板',
        '8030'=>'未找到这个时间的合法模板',
        '8031'=>'数据错误，未找到模板',
        '8032'=>'数据错误，未找到业务配置',
        '8033'=>'数据错误，未找到业务属性',
        '8034'=>'重复注册人工筛单结果推送',
        '8035'=>'生成电子运单，必须存在运单号',
        '8036'=>'注册路由推送必须存在运单号',
        '8037'=>'已消单',
        '8038'=>'业务类型错误',
        '8039'=>'寄方地址错误',
        '8040'=>'到方地址错误',
        '8041'=>'寄件时间格式错误',
        '8042'=>'客户账号异常，请联系客服人员！',
        '8043'=>'该账号已被锁定，请联系客服人员！',
        '8044'=>'此订单已经处理中，无法接收订单修改请求',
//4***		系统校验',
        '4001'=>'系统发生数据错误或运行时异常',
        '4002'=>'报文解析错误',
//9***
        '9000'=>'身份验证失败',
        '9001'=>'客户订单号超过长度限制',
        '9002'=>'客户订单号存在重复',
        '9003'=>'客户订单号格式错误，只能包含数字和字母',
        '9004'=>'运输方式不能为空',
        '9005'=>'运输方式错误',
        '9006'=>'目的国家不能为空',
        '9007'=>'目的国家错误，请填写国家二字码',
        '9008'=>'收件人公司名超过长度限制',
        '9009'=>'收件人姓名不能为空',
        '9010'=>'收件人姓名超过长度限制',
        '9011'=>'收件人州或省超过长度限制',
        '9012'=>'收件人城市超过长度限制',
        '9013'=>'联系地址不能为空',
        '9014'=>'联系地址超过长度限制',
        '9015'=>'收件人手机号码超过长度限制',
        '9016'=>'收件人邮编超过长度限制',
        '9017'=>'收件人邮编只能是英文和数字',
        '9018'=>'重量数字格式不准确',
        '9019'=>'重量必须大于 0',
        '9020'=>'重量超过长度限制',
        '9021'=>'是否退件填写错误，只能填写 Y 或 N',
        '9022'=>'海关申报信息不能为空',
        '9023'=>'英文申报品名不能为空',
        '9024'=>'英文申报品名超过长度限制',
        '9025'=>'英文申报品名只能为英文字母、数字、空格、（）、()、，、,、%、-、_',
        '9026'=>'申报价值必须大于 0',
        '9027'=>'申报价值必须为正数',
        '9028'=>'申报价值超过长度限制',
        '9029'=>'申报品数量必须为正整数',
        '9030'=>'申报品数量超过长度限制',
        '9031'=>'中文申报品名超过长度限制',
        '9032'=>'中文申报品名必须为中文',
        '9033'=>'海关货物编号超过长度限制',
        '9034'=>'海关货物编号只能为数字',
        '9035'=>'收件人手机号码格式不正确',
        '9036'=>'服务商单号或顺丰单号已用完，请联系客服人员',
        '9037'=>'寄件人姓名超过长度限制',
        '9038'=>'寄件人公司名超过长度限制',
        '9039'=>'寄件人省超过长度限制',
        '9040'=>'寄件人城市超过长度限制',
        '9041'=>'寄件人地址超过长度限制',
        '9042'=>'寄件人手机号码超过长度限制',
        '9043'=>'寄件人手机号码格式不准确',
        '9044'=>'寄件人邮编超过长度限制',
        '9045'=>'寄件人邮编只能是英文和数字',
        '9046'=>'不支持批量操作',
        '9047'=>'批量交易记录数超过限制',
        '9048'=>'此订单已确认，不能再操作',
        '9049'=>'此订单已收货，不能再操作',
        '9050'=>'此订单已出货，不能再操作',
        '9051'=>'此订单已取消，不能再操作',
        '9052'=>'收件人电话超过长度限制',
        '9053'=>'收件人电话格式不正确',
        '9054'=>'寄件人电话超过长度限制',
        '9055'=>'寄件人电话格式不正确',
        '9056'=>'货物件数必须为正整数',
        '9057'=>'货物件数超过长度限制',
        '9058'=>'寄件人国家错误，请填写国家二字码，默认为 CN',
        '9059'=>'货物单位超过长度限制，默认为 PCE',
        '9060'=>'货物单位重量格式不正确',
        '9061'=>'货物单位重量超过长度限制',
        '9062'=>'该运输方式暂时不支持此国家的派送，请选择其他派送方式',
        '9063'=>'当前运输方式暂时不支持该国家此邮编的派送，请选择其他派送方式！',
        '9064'=>'该运输方式必须输入邮编',
        '9065'=>'寄件人国家国家不能为空',
        '9066'=>'寄件人公司名不能为空',
        '9067'=>'寄件人公司名不能包含中文',
        '9068'=>'寄件人姓名不能为空',
        '9069'=>'寄件人姓名不能包含中文',
        '9070'=>'寄件人城市不能为空',
        '9071'=>'寄件人城市不能包含中文',
        '9072'=>'寄件人地址不能为空',
        '9073'=>'寄件人地址不能包含中文',
        '9074'=>'寄件人邮编不能为空',
        '9075'=>'寄件人邮编不能包含中文',
        '9076'=>'收件人公司名不能为空',
        '9077'=>'收件人公司名不能包含中文',
        '9078'=>'收件人城市不能为空',
        '9079'=>'收件人城市不能包含中文',
        '9080'=>'查询类别不正确，合法值为：1（运单号），2（订单号）',
        '9081'=>'查询号不能不能为空。',
        '9082'=>'查询方法错误，合法值为：1（标准查询）',
        '9083'=>'查询号不能超过 10 个。注：多个单号，以逗号分隔。',
        '9084'=>'收件人手机不能为空',
        '9085'=>'收件人姓名不能包含中文',
        '9086'=>'英文申报品名必须为英文',
        '9087'=>'收件人手机不能包含中文',
        '9088'=>'收件人电话不能包含中文',
        '9089'=>'寄件人电话不能包含中文',
        '9090'=>'寄件人手机不能包含中文',
        '9091'=>'海关货物编号不能为空',
        '9092'=>'联系地址不能包含中文',
        '9093'=>'当总申报价值超过 50 欧元时【收件人邮箱】不能为空',
        '9094'=>'收件人邮箱超过长度限制',
        '9095'=>'收件人邮箱格式不正确',
        '9096'=>'寄件人省不能包含中文',
        '9097'=>'收件人州或省超不能包含中文',
        '9098'=>'收件人邮编不能包含中文',
        '9099'=>'英文申报品名根据服务商要求，申报品名包含disc、speaker、power bank、battery、magne禁止运输，请选择其他运输方式！',
        '9100'=>'寄件人省不能为空',
        '9101'=>'收件人州或省不能为空',
        '9102'=>'收件人邮编只能为数字',
        '9103'=>'收件人邮编只能为 4 个字节',
        '9104'=>'【收件人邮编】,【收件人城市】,【州╲省】不匹配',
        '9105'=>'申报价值大于 200 美元时，【海关货物编号】不能为空！',
        '9106'=>'收件人州或省不正确',
        '9107'=>'寄件人邮编只能包含数字',
        '9108'=>'收件人邮编格式不正确',
        '9109'=>'【州╲省】美国境外岛屿、区域不支持派送！',
        '9110'=>'【州╲省】APO/FPO 军事区域不支持派送！',
        '9111'=>'客户 EPR 不存在！',
        '9112'=>'【配货备注】长度超过限制！',
        '9113'=>'【配货名称】不能包含中文！',
        '9114'=>'【配货名称】长度超过限制！',
        '9115'=>'【包裹长（CM）】数字格式不正确！',
        '9116'=>'【包裹长（CM）】不能超过 4 位！',
        '9117'=>'【包裹长（CM）】必须大于 0！',
        '9118'=>'【包裹宽（CM）】数字格式不正确！',
        '9119'=>'【包裹宽（CM）】不能超过 4 位！',
        '9120'=>'【包裹宽（CM）】必须大于 0！',
        '9121'=>'【包裹高（CM）】数字格式不正确！',
        '9122'=>'【包裹高（CM）】不能超过 4 位！',
        '9123'=>'【包裹高（CM）】必须大于 0！',
        '9124'=>'【收件人身份证号/护照号】只能为数字和字母！',
        '9125'=>'【收件人身份证号/护照号】长度不能超过 18 个字符！',
        '9126'=>'【VAT 税号】只能为数字和字母！',
        '9127'=>'【VAT 税号】长度不能超过 20 个字符！',
        '9128'=>'【是否电池】填写错误，只能填写 Y 或 N！',
        '9129'=>'【报价服务】填写错误，只能填写 Y 或 N！',
        '9130'=>'目的地属于 APO/FPO 地区，不提供派送服务！',
        '9131'=>'【报价服务】该产品不支持保价服务！',
        '9132'=>'该服务渠道不支持到付！',
        '9133'=>'寄件人电话或手机不能同时为空',
        '9135'=>'寄件人公司名不能为纯数字/纯符号',
        '9136'=>'寄件人姓名不能为纯数字/纯符号',
        '9137'=>'寄件人省不能为纯数字/纯符号',
        '9138'=>'寄件人城市不能为纯数字/纯符号',
        '9139'=>'寄件人地址不能为纯数字/纯符号',
        '9140'=>'收件人姓名只能为字母,不能有其他符号',
        '9141'=>'收件人州或省只能为州代码，只能为字母	废弃',
        '9142'=>'收件人城市能为字母，不能有其他符号	废弃',
        '9143'=>'英文申报品名必须是英文或英文+数字组合，不能为纯数字/符号',
        '9144'=>'收件人州或省只能是英文字符',
        '9145'=>'寄件人电话或手机不能同时为空',
        '9146'=>'重量不能为空',
        '9147'=>'收件人电话不能为空',
        '9150'=>'【商品网址链接】长度超过限制！',
        '9151'=>'【平台网址】长度超过限制！',
        '9152'=>'【店铺名称】长度超过限制！',
        '9153'=>'【商品网址链接】不能为空！',
        '9154'=>'【平台网址】不能为空！',
        '9155'=>'【店铺名称】不能为空！',
        '9156'=>'【收件人城市】,【国家】不匹配！',
        '9157'=>'【目的地区域】不提供派送服务！',
        '9158'=>'【寄件人公司名】不能为纯数字/纯符号！',
        '9159'=>'【寄件人姓名】只能为字母, 不能有其他符号！',
        '9160'=>'【寄件人省】只能为字母,不能有其他符号！',
        '9161'=>'【寄件人城市】只能为字母,不能有其他符号！',
        '9162'=>'【寄件人地址】不能为纯数字/纯符号！',
        '9163'=>'【收件人州或省】只能为州代码，只能为字母！',
        '9164'=>'【英文申报品名】必须是英文或英文+数字组合，不能为纯数字/符号！',
        '9165'=>'很抱歉,您的账号缺少【月结卡号】,不能执行下单操作,请联系客服人员！',
        '9166'=>'请使用【老产品代码】下单！',
        '9167'=>'请使用【新产品代码】下单！',
        '9168'=>'很抱歉,您的账号缺少【接入编码】,不能执行下单操作,请联系客服人员！',
        '9169'=>'温馨提示：根据服务商要求，【寄件人姓名】不能使用数字、代号作为寄件人姓名，请规范填报的寄 件人姓名',
        '9170'=>'请先登陆顺丰国际网站进行电子签约，谢谢！',
        '9171'=>'【收件人邮编】不能为空！',
        '9172'=>'【收件人邮编】只能是英文字母和数字',
        '9173'=>'【寄件人手机】格式不正确，只能包含阿拉伯数字、-',
        '9174'=>'【寄件人电话】格式不正确，只能包含阿拉伯数字、-',
        '9175'=>'【英文申报品名】只能包含阿拉伯数字、英文字母、（、）、(、)、，、,、-、_、%',
        '9176'=>'【收件人手机】长度不能小于 6 位',
        '9177'=>'【收件人手机】格式不正确，只能包含阿拉伯数字、英文字母、+、-、 （）、()',
        '9178'=>'【收件人电话】长度不能小于 6 位',
        '9179'=>'【收件人电话】格式不正确，只能包含阿拉伯数字、英文字母、+、-、 （）、()',
    );

    $savePdfPath = array(
    'PNLG' => APPLICATION_PATH . '/../data/pdf/PNLG/',
    'PNLN' => APPLICATION_PATH . '/../data/pdf/PNLN/',
);
    foreach ($savePdfPath as $path) {
    if (!file_exists($path)) {
        mkdirs($path);
    }
}
    $total = Service_Orders::getByCondition($condition, 'count(*)');
    $size = 200;
    $maxPage = ceil($total / $size);

    $UspsClass = new Service_UspsInterface();
    for ($page = 1; $page <= $maxPage; $page++) {
        $orderList = Service_Orders::getByCondition($condition, '*', $size, $page, 'order_id DESC');

        foreach ($orderList as $order) {
            // 数据过滤
            if (4 !== (int) $order['order_status'] || '' !== trim($order['ref_tracking_number'])) {
                continue;
            }
            if(!in_array($order['sm_code'],array('PNLN','PNLG','BH-SFEP'))){
                if (1 === (int) $order['order_mode_type']) {//集货模式
                    $receivingDetail = Service_ReceivingOrderDetail::getByCondition(array(
                                'order_code' => $order['order_code'],
                    ));
                    // 没有提取到数据或不是在途、收货中状态，继续下一轮
                    if (empty($receivingDetail) || !in_array((int) $receivingDetail[0]['rd_status'], array(0, 1), TRUE)) {
                        continue;
                    }
                    $receiving = Service_Receiving::getByField((int) $receivingDetail[0]['receiving_id'], 'receiving_id');
    //
    //                // 提取不到数据或不是集货ASN或状态不在待审核、已审核、在途、收货中状态之中，继续下一轮
                    if (empty($receiving) || 1 !== (int) $receiving['receive_model_type'] || !in_array((int) $receiving['receiving_status'], array(3, 4, 5, 6), TRUE)) {
                        continue;
                    }
                }
            }
            try {
                $UspsClass->orderValidate($order['order_code']);
                $response = $UspsClass->sendOrder();
                if (isset($response['mailno']) && $response['mailno'] != '') {
                    $orderLog = array(
                        'order_id' => $order['order_id'],
                        'order_code' => $order['order_code'],
                        'ol_type' => 1,
                        'order_status_from' => $order['order_status'],
                        'order_status_to' => $order['order_status'],
                        'ol_add_time' => date("Y-m-d H:i:s"),
                        'user_id' => 0,
                        'ol_comments' => 'USPS自动取单号以及标签->autoAsn-BH-USPS.php',
                    );
                    Service_OrderLog::add($orderLog);
                    $updateOrder=array(
                        'ref_tracking_number' => $response['mailno'],
                            );
                    if(in_array($order['sm_code'],array('PNLG','PNLN'))){
                        $updateOrder['ref_tracking_number']=$response['agent_mailno'];
                        $updateOrder['agent_mailno']=$response['mailno'];
                    }
                  
                    Service_Orders::update($updateOrder, $order['order_id'], 'order_id');
                    /*if (in_array($order['sm_code'], array('PNLG', 'PNLN','BH-SFEP'))) {
                        $pdfPath = $UspsClass->getLabel($order['order_code'], $response['mailno']);
                        if ($pdfPath['pdfUrl']) {
                            $b = fopen($pdfPath['pdfUrl'], 'r');
                            $content = '';
                            while (!feof($b)) {
                                $content.=fread($b, 1024);
                            }
                            file_put_contents($savePdfPath[$order['sm_code']] . $order['order_code'] . '.pdf', $content);
                            $fileContent = file_get_contents($pdfPath['pdfUrl']);
                              Service_OrdersLabel::add(array(
                                'order_code'=>$order['order_code'],
                                'ol_content'=>  base64_encode($fileContent),
                                'ol_time'=>date('Y-m-d H:i:s')));
                        }
                    }*/
                }else{
                    echo '订单'.$order['order_code'].'获取跟踪号失败'.  var_export($response,true);
                }
            } catch (Exception $exc) {
                $eMessage = $exc->getMessage();
                $length1 = strlen($eMessage);
                $eMessage = preg_replace("/([\x80-\xff]+)/","@",$eMessage);
                $length2 = strlen($eMessage);
                if($length1==$length2){
                    $errorText = '订单' . $order['order_code'] . '提交出错:' . $exc->getMessage() . "\r\n";
                }else{
                    $errorText = '订单' . $order['order_code'] . '提交出错:' . $exc->getMessage() . "\r\n";
                    //$errorText = '订单' . $order['order_code'] . '提交出错:';
                    $CodeArr = explode("@",$eMessage);
                    $ecArr2 = explode(",",$CodeArr[1]);
                    for($i=0;$i<=count($ecArr2)-1;$i++){
                        if($ecArr2[$i]!=""){
                            $errorText.=$ecArr2[$i]."=>".$errorArr[$ecArr2[$i]].";";
                        }
                    }
                }
                $errorLog = array(
                    'order_code' => $order['order_code'],
                    'sm_code' => $order['sm_code'],
                    'content' => $errorText,
                );
                Service_TrackingErrorLog::add($errorLog);
                echo $errorText;
            }
        }
    }
}
//从订单反推ASN，更具目的性，提高性能
$condition = array(    
    'sm_code_Arr' => ['BH-USPS', 'BH-DPD', 'PNLG', 'PNLN','BH-SFEP'], // 运输方式
    'order_status' => 4, // 订单状态：已提交
    // 'order_mode_type'         => 0, // 集货模式
    'EUB_ref_tracking_number' => '', // 服务商单号
);
getOrderTrackingAndLable($condition);
echo '[', date('Y-m-d H:i:s'), '] End run', "\r\n";
@unlink($flag);
