<?php
/**
 * 区外仓，运单数据导入，完成装袋同时进行收货等动作
 */
class Outside_LogisticsPrController extends Ec_Controller_Action {
  public function preDispatch() {
    $this->tplDir = 'outside/views/pack/';
  }

  public function indexAction() {
    echo Ec::renderTpl($this->tplDir . 'logistics-pr-import.tpl', 'layout');
  }

  /**
   * 下载数据模板
   */
  public function downloadAction() {
    $template = APPLICATION_PATH . '/../data/file/LogisticsPrTemplate.xls';
    header('pragma: public');
    header('expires: 0');
    header('accept-ranges: bytes');
    header('cache-control: must-revalidate');
    header('content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8');
    header('content-disposition: attachment; filename=LogisticsPrTemplate.xls');
    readfile($template);
    exit();
  }

  public function importAction() {
    set_time_limit(0); // 不限执行时间

    if (!$this->getRequest()->isPost()) {
      header('content-type: text/html; charset=utf-8');
      exit('非法请求：请求方式不是POST');
    }

    $fileInfo = $_FILES['order_file'];
    $error    = '';
    $cache    = '';
    $table    = '';

    if (0 !== $fileInfo['error']) {
      $error = '上传订单数据文件失败';

      switch ($fileInfo['error']) {
        case UPLOAD_ERR_INI_SIZE:
          $error .= '：文件大小超过系统配置指定值' . ini_get('upload_max_filesize');
          break;
        case UPLOAD_ERR_FORM_SIZE:
          $error .= '：文件大小超过表单指定值（MAX_FILE_SIZE）';
          break;
        case UPLOAD_ERR_PARTIAL:
          $error .= '：文件上传不完整';
          break;
        case UPLOAD_ERR_NO_FILE:
          $error .= '：没有文件上传';
          break;
        case UPLOAD_ERR_NO_TMP_DIR:
          $error .= '：找不到临时目录';
          break;
        case UPLOAD_ERR_CANT_WRITE:
          $error .= '：文件写入失败';
          break;
        default:
          break;
      }
    }
    else {
      $ext = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION));
      $tmp = Service_LogisticsPr::getCacheDir() . md5('LOGISTICS-IMPORT-FILE-' . microtime(TRUE)) . '.' . $ext;

      if (!move_uploaded_file($fileInfo['tmp_name'], $tmp)) {
        $error = '移动上传订单数据文件时发生异常';
      }
      else {
        $response = Service_LogisticsPr::buildCache($tmp);

        if (0 === $response['status']) {
          $error = $response['message'];
        }
        else {
          $cache = $response['message'];
        }
      }
    }

    if ('' !== $error) { // 有错误发生
      echo <<<SCRIPT
<script type="text/javascript">
var _pw_             = window.parent;
var _pw_form_        = _pw_.document.getElementById('search-module');
var _pw_table_       = _pw_.document.getElementById('table-module-init');
_pw_form_.innerHTML  = '<form id="importOrderForm" method="post" action="/outside/logistics-pr/import" enctype="multipart/form-data" target="iframHidden">' +
                       '<input type="file" id="orderFile" name="order_file" value="" />' +
                       '<input type="button" id="importOrderButton" class="baseBtn" value="订单数据导入" onclick="javascript:importOrderAction();" />' +
                       '</form>';
_pw_table_.innerHTML = '<span style="color:#b22222;">{$error}</span>&nbsp;&nbsp;【确认错误原因，整理后请重新上传】';
</script>
SCRIPT;
      exit();
    }

    // 没有其他异常发生，说明缓存文件是存在的
    $data  = include Service_LogisticsPr::getCacheDir() . $cache; // 加载缓存文件数据

    foreach ($data['upload'] as $i => $item) {
      $table .= '<tr class="' . ((0 == $i % 2) ? 'table-module-b1' : 'table-module-b2') . '">';
      $table .= '<td class="ec-center">' . ($i + 1) . '</td>';
      $table .= '<td class="ec-center">' . $item['data']['date'] . '</td>';
      $table .= '<td class="ec-center">' . $item['data']['type'] . '</td>';
      $table .= '<td class="ec-center">' . $item['data']['tracking_number'] . '</td>';
      $table .= '<td class="ec-center">' . $item['data']['reference_no'] . '</td>';
      $table .= '<td class="ec-center">' . $item['data']['country'] . '</td>';
      $table .= '<td class="ec-center">' . $item['data']['piece'] . '</td>';
      $table .= '<td class="ec-center">' . $item['data']['weight'] . '</td>';
      $table .= '<td class="' . ($item['valid'] ? 'valid' : 'invalid') . '">' . $item['message'] . '</td>';
      $table .= '</tr>';
    }

    if (!$data['valid']) { // 数据验证不通过
      Service_LogisticsPr::removeCache($cache); // 有不合法的数据存在，删除缓存文件

      echo <<<SCRIPT
<script type="text/javascript">
var _pw_             = window.parent;
var _pw_form_        = _pw_.document.getElementById('search-module');
var _pw_table_       = _pw_.document.getElementById('table-module-list-data');
_pw_form_.innerHTML  = '<form id="importOrderForm" method="post" action="/outside/logistics-pr/import" enctype="multipart/form-data" target="iframHidden">' +
                       '<input type="file" id="orderFile" name="order_file" value="" />' +
                       '<input type="button" id="importOrderButton" class="baseBtn" value="订单数据导入" onclick="javascript:importOrderAction();" />' +
                       '&nbsp;&nbsp;【确认错误原因，整理后请重新上传】' +
                       '</form>';
_pw_table_.innerHTML = '{$table}';
</script>
SCRIPT;
    }
    else { // 全部数据验证通过
      echo <<<SCRIPT
<script type="text/javascript">
var _pw_             = window.parent;
var _pw_form_        = _pw_.document.getElementById('search-module');
var _pw_table_       = _pw_.document.getElementById('table-module-list-data');
_pw_form_.innerHTML  = '<form id="doPrForm" method="post" action="/outside/logistics-pr/do" target="iframHidden">' +
                       '<input type="hidden" name="cache_filename" value="{$cache}" />' +
                       '</form>' +
                       '<img src="/images/base/loading.gif" style="height:16px;" />&nbsp;&nbsp;&nbsp;&nbsp;数据验证通过，正在收货、装袋，请勿进行其他操作';
_pw_table_.innerHTML = '{$table}';
_pw_.doPrAction();
</script>
SCRIPT;
    }

    exit();
  }

  public function doAction() {
    set_time_limit(0); // 不限执行时间

    $error = '';
    $cache = trim($this->getRequest()->getPost('cache_filename', '')); // 缓存文件名

    if (!$this->getRequest()->isPost()) { // 非POST请求
      $error = '非法请求：请求方式不是POST';
    }
    elseif (!Service_LogisticsPr::isCache($cache)) { // 非法请求，不存在缓存文件
      $error = '非法请求：缓存文件不存在';
    }

   if ('' === $error) {
     $error = Service_LogisticsPr::prProcess($cache);
   }

    if (is_array($error)) { // 是数组，说明执行成功，否有有异常产生
      $bagDetail = array();

      foreach ($error as $bagNumber) {
        $bagDetail[] = "<a href=\"javascript:gotoBagDetail('" . $bagNumber . "');\">" . $bagNumber . "</a>";
      }

      $bagDetail = empty($bagDetail) ? '' : implode('、', $bagDetail);
      $bagDetail=  addslashes($bagDetail);
      echo <<<SCRIPT
<script type="text/javascript">
var _pw_             = window.parent;
var _pw_form_        = _pw_.document.getElementById('search-module');
var _pw_table_       = _pw_.document.getElementById('table-module-list-data');
_pw_form_.innerHTML  = '<p>操作执行完毕，已完成收货、装袋操作，包袋号如下：</p>' +
                       '<p>{$bagDetail}</p>' +
                       '<p><input type="button" value="继续上传" style="cursor:pointer;" onclick="javascript:resetUploadEnv();" /></p>';
</script>
SCRIPT;
    }
    else {
        $error=  addslashes($error);
      echo <<<SCRIPT
<script type="text/javascript">
var _pw_             = window.parent;
var _pw_form_        = _pw_.document.getElementById('search-module');
var _pw_table_       = _pw_.document.getElementById('table-module-list-data');
_pw_form_.innerHTML  = '<p>执行操作时发生异常，信息如下：</p>' +
                       '<p class="invalid">{$error}</p>' +
                       '<p><input type="button" value="重新上传" style="cursor:pointer;" onclick="javascript:resetUploadEnv();" /></p>';
</script>
SCRIPT;
    }

    exit();
  }
}
