<?php
class Shipment_OrderInOutController extends Ec_Controller_Action {
  public function preDispatch() {
    $this->tplDir = 'shipment/views/order/';
  }

  public function indexAction() {
    $warehouse = Common_DataCache::getWarehouse(); // 仓库
    $iePort    = Service_IePort::getByCondition(array('ie_port' => '5349')); // 进出口口岸
    $formType  = Service_FormType::getByCondition(array('is_display' => 1)); // 业务类型
    $wrapType  = Service_WrapType::getAll(); // 包装类型
    $trafMode  = Service_TrafMode::getByCondition(array('is_display' => 1)); // 出入港区运输方式
    $tradeMode = Service_TradeMode::getByCondition(array('is_display' => 1)); // 监管方式
    $transMode = Service_TransMode::getByCondition(array('is_display' => 1)); // 成交方式

    $this->view->warehouse = $warehouse;
    $this->view->iePort    = $iePort;
    $this->view->formType  = $formType;
    $this->view->wrapType  = $wrapType;
    $this->view->trafMode  = $trafMode;
    $this->view->tradeMode = $tradeMode;
    $this->view->transMode = $transMode;

    echo Ec::renderTpl($this->tplDir . 'order-in-out.tpl', 'layout');
  }

  /**
   * 下载上传订单数据模板
   */
  public function downloadAction() {
    $template = APPLICATION_PATH . '/../data/file/OrderInOutTemplate.xlsx';
    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=OrderInOutTemplate.xlsx');
    readfile($template);
    exit();
  }

  /**
   * 订单数据导入
   * 
   * 使用IFRAME实现方式，生成的SCRIPT代码用于响应父窗口（假相AJAX）
   */
  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    = '';
    $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_OrderInOut::getCacheDir() . md5('ORDER-IMPORT-FILE-' . microtime(TRUE)) . '.' . $ext;

      if (!move_uploaded_file($fileInfo['tmp_name'], $tmp)) {
        $error = '移动上传订单数据文件时发生异常';
      }
      else {
        $response = Service_OrderInOut::buildCache($tmp);

        if (0 === $response['status']) {
          $error = $response['message'];
        }
        else {
            if( isset( $response['platformError'] ) ) {
                $error = $response['platformError'];
            } else {
                $cache = $response['message'];
            }
        }
      }
    }

    if ('' === $error) { // 没有其他异常发生，说明缓存文件是存在的
      $data  = include Service_OrderInOut::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['car_number'] . '</td>';
        $table .= '<td class="ec-center">' . $item['bag_number'] . '</td>';
        $table .= '<td class="ec-center">' . $item['order_code'] . '</td>';
        $table .= '<td class="ec-center">' . $item['tracking_number'] . '</td>';
        $table .= '<td class="ec-center">' . $item['sub_tracking_number'] . '</td>';
        $table .= '<td class="ec-center">' . $item['weight'] . '</td>';
        $table .= '<td class="ec-center">' . $item['length'] . '</td>';
        $table .= '<td class="ec-center">' . $item['width'] . '</td>';
        $table .= '<td class="ec-center">' . $item['height'] . '</td>';
        $table .= '<td class="ec-center">' . $item['so_fee_weight'] . '</td>';
        $table .= '<td class="' . ($item['valid'] ? 'valid' : 'invalid') . '">' . $item['message'] . '</td>';
        $table .= '</tr>';
      }
    }

    if (isset($data['valid']) && !$data['valid']) { // 有不合法的数据存在，删除缓存文件
      unlink(Service_OrderInOut::getCacheDir() . $cache);
    }

    if (isset($data['valid']) && $data['valid']) {
      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="uploadOrderForm" method="post" action="/shipment/order-in-out/create-asn" enctype="multipart/form-data" target="iframHidden">' +
                      '<p>订单数据已完成验证，点击【完善信息】按钮执行下一步动作</p>' +
                      '<input type="hidden" id="orderCacheFile" name="cache" value="{$cache}" />' +
                      '<p style="margin-top:10px;"><input type="button" class="baseBtn" id="createAsnOrder" value="完善信息" onclick="javascript:createAsnOrderDialog();" /></p>' +
                      '</form>';
_pw_table_.innerHTML = '{$table}';
</script>
SCRIPT;
    }
    elseif ('' === $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  = '<form id="uploadOrderForm" method="post" action="/shipment/order-in-out/import" enctype="multipart/form-data" target="iframHidden">' +
                       '<input type="file" id="orderFile" name="order_file" value="" />' +
                       '<input type="button" id="importOrder" class="baseBtn" value="订单数据导入" onclick="javascript:importOrderData();" />' +
                       '&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-init');
_pw_form_.innerHTML  = '<form id="uploadOrderForm" method="post" action="/shipment/order-in-out/import" enctype="multipart/form-data" target="iframHidden">' +
                       '<input type="file" id="orderFile" name="order_file" value="" />' +
                       '<input type="button" id="importOrder" class="baseBtn" value="订单数据导入" onclick="javascript:importOrderData();" />' +
                       '</form>';
_pw_table_.innerHTML = '<span style="color:#b22222;">{$error}</span>&nbsp;&nbsp;【确认错误原因，整理后请重新上传导入订单数据】';
</script>
SCRIPT;
    }

    unset($data); // 释放数组
  }

  /**
   * 根据上传的订单数据，按客户批量创建ASN单
   */
  public function createAsnAction() {
    set_time_limit(0); // 不限执行时间

    $error = '';
    $cache = trim($this->getRequest()->getPost('cache_filename', '')); // 缓存文件名

    if (!$this->getRequest()->isPost()) { // 非POST请求
      $error = '非法请求：请求方式不是POST';
    }
    elseif (!Service_OrderInOut::isCache($cache)) { // 非法请求，不存在缓存文件
      $error = '非法请求：缓存文件不存在';
    }

    if ('' !== $error) { // 非法请求
      echo <<<SCRIPT
<script type="text/javascript">
var _pw_                 = window.parent;
var _pw_form_            = _pw_.document.getElementById('search-module');
var _pw_asn_table_       = _pw_.document.getElementById('customer-asn-init');
_pw_form_.innerHTML      = '<p><input type="button" class="baseBtn" value="重新上传导入订单数据" onclick="javascript:window.location.href=\'/shipment/order-in-out/index\';" /></p>';
_pw_asn_table_.innerHTML = '{$error}';
</script>
SCRIPT;

      exit();
    }

    $warehouseId = (int) trim($this->getRequest()->getPost('warehouse_id', 0)); // 仓库ID
    $isDelivery  = (int) trim($this->getRequest()->getPost('is_delivery', 0)); // 是否提货
    $iePort      = trim($this->getRequest()->getPost('ie_port', '')); // 进出口口岸
    $formType    = trim($this->getRequest()->getPost('form_type', '')); // 业务类型
    $wrapType    = (int) trim($this->getRequest()->getPost('wrap_type', 0)); // 包装类型
    $trafMode    = trim($this->getRequest()->getPost('traf_mode', '')); // 出入港区运输方式
    $tradeMode   = trim($this->getRequest()->getPost('trade_mode', '')); // 监管方式
    $transMode   = trim($this->getRequest()->getPost('trans_mode', '')); // 成交方式
    $param       = array(
      'warehouse_id' => $warehouseId,
      'is_delivery'  => $isDelivery,
      'ie_port'      => $iePort,
      'form_type'    => $formType,
      'wrap_type'    => $wrapType,
      'traf_mode'    => $trafMode,
      'trade_mode'   => $tradeMode,
      'trans_mode'   => $transMode,
    );

    $response = Service_OrderInOut::createAsn($cache, $param); // 创建ASN单
    $table    = '';

    foreach ($response 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['customer'] . '</td>';
      $table .= '<td class="ec-center">' . $item['asn'] . '</td>';
      $table .= '<td class="ec-center">' . $item['ref'] . '</td>';
      $table .= '<td class="ec-center">' . $item['piece'] . '</td>';
      $table .= '<td class="ec-center">' . $item['weight'] . '</td>';
      $table .= '<td class="' . ($item['valid'] ? 'valid' : 'invalid') . '">' . $item['message'] . '</td>';
      $table .= '</tr>';
    }

    echo <<<SCRIPT
<script type="text/javascript">
var _pw_                 = window.parent;
var _pw_form_            = _pw_.document.getElementById('search-module');
var _pw_asn_table_       = _pw_.document.getElementById('customer-asn-list-data');
_pw_form_.innerHTML      = '<p>ASN单创建动作已执行，具体信息如下：</p><p style="margin-top:10px;"><input type="button" class="baseBtn" value="继续上传导入订单数据" onclick="javascript:window.location.href=\'/shipment/order-in-out/index\';" /></p>';
_pw_asn_table_.innerHTML = '{$table}';
</script>
SCRIPT;
  }
}
