<?php
/**
 * Created by JetBrains PhpStorm.
 * User: Administrator
 * Date: 18-1-26
 * Time: 下午3:08
 * To change this template use File | Settings | File Templates.
 */
set_time_limit(0);

require_once 'config.php';

$flag = APPLICATION_PATH . '/../data/log/PullEportLogisticsXmlCron.lock';

if (@file_exists($flag)) {
    echo sprintf('[%s]', date('Y-m-d H:i:s')), ' Anather process is running.', "\r\n";
    echo $flag, "\r\n\r\n";
    exit();
}

$handler = fopen($flag, 'wb');
fclose($handler);

/**
 * CURL
 */
function curlExecute($url, $postData = '') {
    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_FAILONERROR, FALSE);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_TIMEOUT, 300);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 300);
    curl_setopt($curl, CURLOPT_POST, TRUE);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);

    $response = curl_exec($curl);
    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    $ack      = array(
        'status'   => 0,
        'response' => $response,
    );

    if (curl_errno($curl)) {
        $ack['response'] = curl_error($curl);
    }
    elseif (200 === (int) $httpCode) {
        $ack['status'] = 1;
    }

    curl_close($curl);

    return $ack;
}

// 密钥、令牌
$appSecret = '76EC82BCE17F93667477774A4CBF0BB5';
$appToken  = 'F00FD5D2-1CD7-42AB-0274-F58907795BA2';

$receivePath = '/home/webcode/export/wms/data/DZKA_R';
$apiUrl      = 'http://119.145.38.246:11111/gateway.php';
$action      = 'receive';
$loopCount   = 0;

echo '[', date('Y-m-d H:i:s'), '] Start', "\r\n";

while (TRUE) {
    $operationTime = date('Y-m-d H:i:s');

    $request  = '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>';
    $request .= '<request>';
    $request .= '<token>' . $appToken . '</token>';
    $request .= '<timestamp>' . $operationTime . '</timestamp>';
    $request .= '<action>' . $action . '</action>';
    $request .= '<sign>' . strtoupper(md5($operationTime . $appSecret . $action . $operationTime)) . '</sign>';
    $request .= '</request>';

    $ack = curlExecute($apiUrl, base64_encode($request));

    if (1 === $ack['status']) {
        $response = base64_decode($ack['response']);
        $success  = array();
        $xmlObj   = @simplexml_load_string($response);

        if (FALSE !== $xmlObj) {
            $responseCode    = isset($xmlObj->code) ? (int) $xmlObj->code : '';
            $responseMessage = isset($xmlObj->message) ? $xmlObj->message : '';

            if (isset($xmlObj->code) && 100 === (int) $xmlObj->code) { // 数据推送成功删除报文
                if (isset($xmlObj->fileSet)) {
                    foreach ($xmlObj->fileSet->file as $file) {
                        $fileName    = isset($file->name) ? trim($file->name) : '';
                        $fileContent = isset($file->content) ? trim($file->content) : '';

                        if ('' === $fileName || '' === $fileContent) {
                            continue ;
                        }

                        if (FALSE !== file_put_contents($receivePath . '/' . $fileName, base64_decode($fileContent), LOCK_EX)) {
                            umask(0);
                            chmod($receivePath . '/' . $fileName, 0777);

                            $success[$fileName] = 1;
                        }
                    }
                }

                if (!empty($success)) { // 回执接收成功，通知删除回执报文
                    $requestBody = '';

                    foreach ($success as $name => $tag) {
                        $requestBody .= '<file><name>' . $name . '</name></file>';
                    }

                    $request  = '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>';
                    $request .= '<request>';
                    $request .= '<token>' . $appToken . '</token>';
                    $request .= '<timestamp>' . $operationTime . '</timestamp>';
                    $request .= '<action>clear</action>';
                    $request .= '<sign>' . strtoupper(md5($operationTime . $appSecret . 'clear' . $operationTime)) . '</sign>';
                    $request .= '<fileSet>' . $requestBody . '</fileSet>';
                    $request .= '</request>';

                    $clearAck = curlExecute($apiUrl, base64_encode($request)); // 对执行返回结果可不做分析
                }
            }

            echo sprintf('[%s] %s', $responseCode, $responseMessage), "\r\n";

            if (111 === $responseCode) { // 没有回执需要回传则跳出循环
                break ;
            }
        }
        else {
            echo '发送客户端响应XML内容无法解析：', $ack['response'], "\r\n";
            break ;
        }
    }
    else {
        break ;
    }

    ++$loopCount;

    if ($loopCount > 10001) { // 循环次数太多，不科学，暂时中断
        break ;
    }
}

echo '[', date('Y-m-d H:i:s'), '] End', "\r\n";
@unlink($flag);
