<?php
/**
 * Created by JetBrains PhpStorm.
 * User: user
 * Date: 15-1-16
 * Time: 上午10:19
 * To change this template use File | Settings | File Templates.
 */
class Order_ShipOrderController extends Ec_Controller_Action
{
    public function preDispatch()
    {
        $this->tplDirectory = "order/views/default/";
        $this->serviceClass = new Service_ShipOrder();
        $userAuth = new Zend_Session_Namespace('userAuthorization');
        $this->user_id = $userAuth->userId;
    }

    public function listAction(){
        if ($this->_request->isPost()){
            $page = $this->_request->getParam('page', 1);
            $pageSize = $this->_request->getParam('pageSize', 20);

            $page = $page ? $page : 1;
            $pageSize = $pageSize ? $pageSize : 20;

            $return = array(
                "state" => 0,
                "message" => "No Data"
            );
            //$params = $this->_request->getParams();
            $condition = array(
                'order_code'=>$this->_request->getParam("order_code","*"),
                'tracking_number'=>$this->_request->getParam("tracking_number",""),
                'sm_code'=>$this->_request->getParam("sm_code",""),
                'so_status'=>$this->_request->getParam("so_status",""),
            );
            $count = Service_ShipOrder::getByCondition($condition,"count(*)");
            $return['total'] = $count;
            if($count){
                $shipOrderList = Service_ShipOrder::getByCondition($condition,"*",$pageSize,$page,"so_id desc");
                $return['data'] = $shipOrderList;
                $return['state'] = 1;
            }
            die(Zend_Json::encode($return));
        }
        echo Ec::renderTpl($this->tplDirectory . "ship_order_index.tpl", 'layout');
    }

    public function  bhhkdhlListAction(){
        if ($this->_request->isPost()){
            $page = $this->_request->getParam('page', 1);
            $pageSize = $this->_request->getParam('pageSize', 20);

            $page = $page ? $page : 1;
            $pageSize = $pageSize ? $pageSize : 20;

            $return = array(
                "state" => 0,
                "message" => "No Data"
            );
            $params = $this->_request->getParams();
            $condition = array(
                'order_code'=>$params['order_code_s'],
                'tracking_number'=>$params['tracking_number'],
                'sm_code'=>'BH-HKDHL',
                'so_status'=>'0',
                'order_status'=>14  //补录单，补录成功的不显示在补录列表中
            );
            $count = Service_ShipOrder::getByCondition($condition,"count(*)");
            $return['total'] = $count;
            if($count){
                $shipOrderList = Service_ShipOrder::getByCondition($condition,"*",$pageSize,$page,"so_id desc");
                $return['data'] = $shipOrderList; 
                $return['state'] = 1;
            }
            die(Zend_Json::encode($return));
        }
        echo Ec::renderTpl($this->tplDirectory . "bhhkdhl_ship_order_list.tpl", 'layout');
    }

    public function  getBqcInfoAction(){
        if ($this->_request->isPost()){
            $orderCode = $this->_request->getParam('order_code');
            $condition = array(
                'order_code'=>$orderCode
               );
            $field = array(
                'sod_id',
                'sod_length',
                'sod_width',
                'sod_height'
            );
            $data = Service_ShipOrderDetail::getByCondition(array('order_code'=>$orderCode),$field);
            $return['data'] = $data;
            die(Zend_Json::encode($return));
        }
    }
    
    public function viewAction(){
        $so_id = $this->_request->getParam("so_id");
        $shipOrderRow = Service_ShipOrder::getByField($so_id,"so_id","*");
        $this->view->shipOrderRow = $shipOrderRow;
        $orderProduct = Service_OrderProduct::getByCondition(array('order_code'=>$shipOrderRow['order_code']),"*");
        $op = array();
        $totalWeight = 0;
        foreach($orderProduct as $key=>$value){
            $opv = array();
            $product = Service_Product::getByField($value['product_id'],"product_id","*");
            $opv['op_declared_value'] = $value['op_declared_value'];
            $opv['op_purpose_declared_value'] = $value['op_purpose_declared_value'];
            $opv['op_quantity'] = $value['op_quantity'];
            $opv['goods_id'] = $product['goods_id'];
            $opv['product_sku'] = $product['product_sku'];
            $opv['product_barcode'] = $product['product_barcode'];
            $opv['customer_code'] = $product['customer_code'];
            $opv['hs_code'] = $product['hs_code'];
            $opv['product_weight'] = $product['product_weight'];
            $totalWeight+=$value['op_quantity']*$product['product_weight'];
            $op[] = $opv;
        }
        $this->view->op = $op;
        $this->view->totalWeight = $totalWeight;
        $statusArr = array(
            '0'=>'草稿',
            '1'=>'已装袋',
            '2'=>'装袋完成',
            '3'=>'已加挂',
            '4'=>'物流完成',
            '5'=>'已出货'
        );
        $this->view->statusArr = $statusArr;
        $log = Service_ShipOrderLog::getByCondition(array('so_code'=>$shipOrderRow['so_code']),"*");
        foreach($log as $key=>$value){
            $user = Service_User::getByField($value['user_id'],"user_id","*");
            $log[$key]['user_name'] = $user['user_name'];
        }
        $this->view->log = $log;
        echo Ec::renderTpl($this->tplDirectory . "ship_order_detail.tpl", 'layout');
    }

    public function changeAction(){
        $so_id = $this->_request->getParam("so_id","");
        $soWeight = $this->_request->getParam("so_weight","");
        $soRow = Service_ShipOrder::getByField($so_id,"so_id","*");
        $result = array(
            'state'=>'1',
            'errorMessage'=>array(),
        );
        if($soWeight==""){
            $result['state'] = "0";
            $result['errorMessage'][] = "包裹重量不能为空!";
            exit(Zend_Json::encode($result));
        }
        if (!preg_match("/^[1-9]\d*(.\d+)*$|^0.\d*[1-9]+\d*$/", $soWeight)){
            $result['state'] = "0";
            $result['errorMessage'][] = "包裹重量只能是大于0的数值";
            exit(Zend_Json::encode($result));
        }
        $db = Common_Common::getAdapter();
        $db->beginTransaction();
        try{
            $updateShipOrder = array(
                'so_weight'=>$soWeight,
                'so_update_time'=>date("Y-m-d H:i:s"),
            );
            Service_ShipOrder::update($updateShipOrder,$so_id,'so_id');
            $shipOrderDetail = Service_ShipOrderDetail::getByCondition(array('so_id'=>$so_id),"*");
            if(!empty($shipOrderDetail)){
                if(count($shipOrderDetail)>1){
                    //输入的重量比原重量大
                    if($soWeight>$soRow['so_weight']){
                        $difWeight = ($soWeight-$soRow['so_weight'])/count($shipOrderDetail);
                        if($difWeight>=0.0001){
                            foreach($shipOrderDetail as $sKey=>$sValue){
                                $updateSod = array(
                                    'sod_weight'=>$sValue['sod_weight']+$difWeight,
                                );
                                Service_ShipOrderDetail::update($updateSod,$sValue['sod_id'],"sod_id");
                            }
                        }else{
                            $updateSod = array(
                                'sod_weight'=>$shipOrderDetail[0]['sod_weight']+($soWeight-$soRow['so_weight']),
                            );
                            Service_ShipOrderDetail::update($updateSod,$shipOrderDetail[0]['sod_id'],"sod_id");
                        }
                    }
                    //输入的重量比原重量小
                    if($soWeight<$soRow['so_weight']){
                        $avgWeight = $soWeight/count($shipOrderDetail);
                        foreach($shipOrderDetail as $sKey=>$sValue){
                            $updateSod = array(
                                'sod_weight'=>$avgWeight,
                            );
                            Service_ShipOrderDetail::update($updateSod,$sValue['sod_id'],"sod_id");
                        }
                    }
                }else{
                    $updateSod = array(
                        'sod_weight'=>$soWeight,
                    );
                    Service_ShipOrderDetail::update($updateSod,$shipOrderDetail[0]['sod_id'],"sod_id");
                }
            }
            $logRow = array(
                'so_id' => $so_id,
                'so_code'=>$soRow['so_code'],
                'so_status_start'=>$soRow['so_status'],
                'so_status_end'=>$soRow['so_status'],
                'user_id'=>$this->user_id,
                'add_time'=>date("Y-m-d H:i:s"),
                'note'=>'改包裹重量:'.$soRow['so_weight']."=>".$soWeight,
                'visit_ip'=>Common_Common::getIP(),
            );
            Service_ShipOrderLog::add($logRow);
            $db->commit();
            $result['state'] = 1;
            $result['errorMessage'][] = '操作成功';
        }catch (Exception $e){
            $result['state'] = '0';
            $result['errorMessage'][] = '操作失败:'.$e->getMessage();
        }
        exit(Zend_Json::encode($result));
    }
     public function trackingUploadIndexAction() {

        echo Ec::renderTpl($this->tplDirectory . "tracking-upload-index.tpl", 'layout');
    }

    public function downLoadeTempleteAction() {
        $path = APPLICATION_PATH . "/../data/xls" . '/coverServiceTracking.xlsx';
        Common_Common::downloadFile($path);
    }

    public function importAction() {
        $xlsData = Service_ShipOrderProcess::getXLSData($_FILES, 'filename');
        $message = "全部上传成功";
        try {
            if ($xlsData['ask'] == '0') {
                throw new Exception("上传文件失败");
            } elseif (count($xlsData[0]) != 2 || ($xlsData[0][0] != "订单号" || $xlsData[0][1] != "服务商单号")) {

                throw new Exception("标题必须按订单号,服务商单号，顺序排列!");
            } elseif (count($xlsData) <= 1) {
                throw new Exception("没有数据!");
            }
        } catch (Exception $e) {
            $this->view->message = $e->getMessage();
            echo Ec::renderTpl($this->tplDirectory . "tracking-upload-index.tpl", 'layout');
            die();
        }
        array_shift($xlsData);
        $now = date("Y-m-d H:i:s");
        $allowStatus = array('11', '13');
        $ip = Common_Common::getIP();
        $errorData = array();
        $exitCode=array();
        $db = Common_Common::getAdapter();
        $db->beginTransaction();
        try {
            foreach ($xlsData as $key => $value) {
                $orderCode = trim($value[0]);
                $serviceCode = trim($value['1']);
                if(empty($orderCode)||empty($serviceCode)){
                    $value['error_line'] = $key + 2;
                  
                       $value['msg'] = '订单号,服务商单号不能为空';
                     $errorData[] = $value;
                     continue;
                }
               if($exitCode[$orderCode]){
                     $value['error_line'] = $key + 2;
                     $value['msg'] = '订单号与'.$exitCode[$orderCode].'行重复';
                     $errorData[] = $value;
                     continue;
                }
                $exitCode[$orderCode]=$key + 2;
                if(!preg_match('/^.{1,32}$/',$serviceCode)){
                     $value['error_line'] = $key + 2;
                     $value['msg'] = '服务商单号为1-32位';
                     $errorData[] = $value;
                     continue;
                }
                $orderInfo = Service_Orders::getByField($orderCode, 'order_code', '*');
                if (!empty($orderInfo)) {
                    if (!in_array($orderInfo['order_status'], $allowStatus)) {
                        $value['error_line'] = $key + 2;
                         $value['msg'] = '订单不是物流完成或已签收状态';
                         $errorData[] = $value;
                         continue;
                    }
                } else {
                    $value['error_line'] = $key + 2;
                    $value['msg'] = '订单不存在';
                     $errorData[] = $value;
                    continue;
                }
                $isExitTracking = Service_ShipOrder::getByField($serviceCode, 'tracking_number', 'so_code');
                if ($isExitTracking) {
                    $value['error_line'] = $key + 2;
                    $value['msg'] = '服务商单号已存在';
                    $errorData[] = $value;
                    continue;
                }

                $shipOrder= Service_ShipOrder::getByField($orderInfo['order_code'], 'order_code','*');
                if (Service_ShipOrder::update(array('tracking_number' => $serviceCode), $orderInfo['order_code'], 'order_code')) {
                    $logRow = array(
                        'so_id' => $shipOrder['so_id'],
                        'so_code' => $orderInfo['order_code'],
                        'so_status_start' => $shipOrder['so_status'],
                        'so_status_end' => $shipOrder['so_status'],
                        'user_id' => $this->user_id,
                        'add_time' => $now,
                        'note' => '改包裹服务商单号:' . $shipOrder['tracking_number'] . "=>" . $serviceCode,
                        'visit_ip' => $ip,
                    );
                    $orderLog=array(
                        'order_id'=>$orderInfo['order_id'],
                        'order_code'=>$orderInfo['order_code'],
                        'ol_type'=>'1',
                        'order_status_from'=>$orderInfo['order_status'],
                        'order_status_to'=>$orderInfo['order_status'],
                        'ol_add_time'=>$now,
                        'user_id'=>$this->user_id,
                        'ol_ip'=>$ip,
                        'ol_comments'=>'包裹服务商单号由'.$shipOrder['tracking_number'].'改为'.$serviceCode,
                    );
                    Service_ShipOrderLog::add($logRow);
                    Service_OrderLog::add($orderLog);
                }
                Service_LogisticsCost::update(array('tracking_number' => $serviceCode), $orderInfo['order_code'], 'order_code');
                Service_CostRecording::update(array('tracking_number' => $serviceCode), $orderInfo['order_code'], 'order_code');
                Service_FeeCostDetail::update(array('tracking_number' => $serviceCode), $orderInfo['order_code'], 'code_number');
                Service_Orders::update(array('ref_tracking_number' => $serviceCode), $orderInfo['order_code'], 'order_code');
            }
            if ($errorData) {
                $message = '您提交了' . count($xlsData) . '行数据,其中' . count($errorData) . '行数据上传失败';
            } else {
                $message = '您提交了' . count($xlsData) . '行数据';
            }
            $db->commit();
        } catch (Exception $e) {
            $message = $e->getMessage();
            $db->rollBack();
            unset($errorData);
        }
        $this->view->message = $message;
        $this->view->errorData = $errorData;
        echo Ec::renderTpl($this->tplDirectory . "tracking-upload-index.tpl", 'layout');
    }

    public function bqcRecordAction(){
        $param = $this->_request->getParams();
        $orderCode = $param['order_code'];
        $lengthValidate = Service_ShipOrder::inputValidate($param['so_length']);
        $widthValidate = Service_ShipOrder::inputValidate($param['so_width']);
        $heightValidate = Service_ShipOrder::inputValidate($param['so_height']);
        $weightValidate = Service_ShipOrder::inputValidate($param['so_weight']);
        if(!($lengthValidate && $widthValidate && $heightValidate && $weightValidate)){
            exit(Zend_Json::encode(array('state'=>0, 'message'=>'长、宽、高、重量必填并且是大于0的正数!!!')));
        }
        $db = Common_Common::getAdapter();
        $db->beginTransaction();
        try{
            $exitshipOrderDetail = Service_ShipOrderDetail::getByCondition(array('order_code'=>$orderCode),"*");
            //获取订单，体积转换率
            $orderArr = Service_Orders::getByField($orderCode,'order_code',array('order_id','sm_code','order_status')); 
            $smVolRate = Service_ShippingMethod::getByField($orderArr['sm_code'],'sm_code','sm_vol_rate');
            if(!empty($exitshipOrderDetail)){
                $exitshipOrderDetailNumber = count($exitshipOrderDetail);
                $i = 1;
                foreach ($param['sod_ids'] as $key=>$value){
                    $volWeight = ($param['so_length'][$key] * $param['so_width'][$key] * $param['so_height'][$key]) / $smVolRate['sm_vol_rate'];
                    $shipOrderDetail = array(
                        'sub_tracking_number'=>$param['tracking_number'],
                        'sod_weight'=>$param['so_weight'][$key],
                        'sod_length'=>$param['so_length'][$key],
                        'sod_width'=>$param['so_width'][$key],
                        'sod_height'=>$param['so_height'][$key],
                        'sod_vol_weight'=>$volWeight,
                    );
                    if($i > $exitshipOrderDetailNumber)break;
                    //销毁数组中需要更新的数据
                    unset($param['sod_ids'][$key]);
                    unset($param['so_weight'][$key]);
                    unset($param['so_length'][$key]);
                    unset($param['so_width'][$key]);
                    unset($param['so_height'][$key]);
                    $i++; 
                    //var_dump($shipOrderDetail);
                    Service_ShipOrderDetail::update($shipOrderDetail,$value,'sod_id'); 
                }
            }
            if(!empty($param['sod_ids'])){
                $shipOrderRow = Service_ShipOrder::getByField($orderCode,'order_code');
                $completionArr = Service_ShipOrderDetail::getByField($orderCode,'order_code','*');
                foreach ($param['sod_ids'] as $key=>$value){
                    $volWeight = ($param['so_length'][$key] * $param['so_width'][$key] * $param['so_height'][$key]) / $smVolRate['sm_vol_rate'];
                    $addShipOrderDetail = array(
                        'so_code'=>$shipOrderRow['so_code'],
                        'so_id'=>$shipOrderRow['so_id'],
                        'order_id'=>$shipOrderRow['order_id'],
                        'order_code'=>$orderCode,
                        'sub_tracking_number'=>$param['tracking_number'],
                        'sod_weight'=>$param['so_weight'][$key],
                        'sod_length'=>$param['so_length'][$key],
                        'sod_width'=>$param['so_width'][$key],
                        'sod_height'=>$param['so_height'][$key],
                        'sod_vol_weight'=>$volWeight,
                        'op_id'=>$completionArr['op_id'] ? $completionArr['op_id'] : '0',
                        'op_title'=>$completionArr['op_title'] ? $completionArr['op_title'] : '',
                        'sod_quantity'=>$completionArr['sod_quantity'] ? $completionArr['sod_quantity'] : '0',
                        'op_description'=>$completionArr['op_description'] ? $completionArr['op_description'] : '',
                        'cn_description'=>$completionArr['cn_description'] ? $completionArr['cn_description'] : '',
                        'op_declared_value'=>$completionArr['op_declared_value'] ? $completionArr['op_declared_value'] : '',
                    ); 
                   // var_dump($addShipOrderDetail);
                    Service_ShipOrderDetail::add($addShipOrderDetail);
                }
            }
            $order = array(
                'order_status'=>14,
            );
			$orderLog = array(
                'order_id' => $orderArr['order_id'],
                'order_code' => $orderCode,
                'ol_type' => '1',
                'order_status_from' => $orderArr['order_status'],
                'order_status_to' => 14,
                'ol_add_time' => date("Y-m-d H:i:s"),
                'user_id' => Service_User::getUserId(),
				'ol_ip' => Common_Common::getIP(),
                'ol_comments' => '百千诚DHL补录单操作成功'
            );
            Service_Orders::update($order,$orderCode,'order_code');
			//写入日志信息
            Service_OrderLog::add($orderLog);
            $db->commit();
            $shipOrderDetailInfo = Service_ShipOrderDetail::getByCondition(array('order_code'=>$orderCode),array('sod_weight','sod_vol_weight'));
            $soWeight = $soVolWeight =  $soFeeWeight= 0;
            foreach ($shipOrderDetailInfo as $key=>$value){
            @$soWeight += $value['sod_weight'];
            @$soVolWeight += $value['sod_vol_weight'];
            }
            if($soVolWeight > $soWeight){
                $soFeeWeight = $soVolWeight;
            }else if($soVolWeight < $soWeight){
                $soFeeWeight = $soWeight;
            }else {
                $soFeeWeight = $soWeight;
            }
            $shipOrder = array(
                'tracking_number'=>$param['tracking_number'],
                'so_weight'=>$soWeight,
                'so_vol_weight'=>$soVolWeight,
                'so_fee_weight'=>$soFeeWeight,
                'so_piece'=>$param['so_piece']
                );
            //var_dump($shipOrder);exit();
            Service_ShipOrder::update($shipOrder,$orderCode,'order_code');
            $result['state'] = 1;
            $result['message'] = '操作成功';
        }catch (Exception $e){
            $db->rollBack();
            $result['state'] = '0';
            $result['message'] = '操作失败:'.$e->getMessage();
        }
        exit(Zend_Json::encode($result));
    }
}
