<?php
class Service_LogisticsOrderProcess
{
    private $_parcel = array();
    private $_order = array();
    private $_ordersCode = '';
    private $_order_product = array();
    private $_opType = '';
    private $_order_weight = 0;
    private $_feeErr = false;
    private $_inventoryErr = false;
    private $_productErr = false;
    
	/*订单前台显示的状态*/
    public static function getOrderStatus(){
    
    	$status['-1'] = Ec_Lang::getInstance()->getTranslate('delete');//'删除';
    	$status['0'] = Ec_Lang::getInstance()->getTranslate('Draft');//'草稿';
    	$status['1'] = Ec_Lang::getInstance()->getTranslate('Confirm');//'确认';    	
    	$status['2'] = Ec_Lang::getInstance()->getTranslate('Submitted');//'已签收';
         $status['9'] = '已录单';
    	$status['3,4'] = "已收货";
    	$status['5,6'] = '已装袋';
       
    	return $status;
    }
    
    /**
     * @author william-fan
     * @todo 订单所有状态
     */
    public static function getOrderStatusAll(){
    	$status['-1'] = Ec_Lang::getInstance()->getTranslate('delete');//'删除';
    	$status['0'] = Ec_Lang::getInstance()->getTranslate('Draft');//'草稿';
    	$status['1'] = Ec_Lang::getInstance()->getTranslate('Confirm');//'确认';
    	$status['2'] = Ec_Lang::getInstance()->getTranslate('Submitted');//'已签收';
    	$status['3'] = "收货加挂";
    	$status['4'] = "收货完成";
    	$status['5'] = "已装袋";
    	$status['6'] = "装袋完成";
    	$status['7'] = "出货加挂";
    	$status['8'] = "出货完成";
    	return $status;
    }
    
	//@author 订单状态翻译成文字
	//@todo 订单状态翻译成文字 
	public static function getOrderStatusText($orderStatus = 0){
		
		switch($orderStatus){
			case '-1':
				return  '删除';
			break;
			case '0':
				return '草稿';
			break;	
			case '1':
				return '确认';
			break;								
			case '2':
				return '已提交';
			break;
			case '3':
				return '收货加挂';
				break;
			case '4':
				return '收货完成';
				break;
			case '5':
				return '装袋加挂';
				break;
			case '6':
				return '装袋完成';
				break;
			case '7':
				
			case "8":
				break;
										
		}//switch		
		return '未知状态';	
	}
	
	public static function hqswghOrder($logistics_code) {
		$result = array('ask'=>0, 'message'=>'');
		$db = Common_Common::getAdapter();
		$db->beginTransaction();
		try{
			$order = Service_LogisticsOrder::getByField($logistics_code, 'logistics_code');
			$order_address = Service_LogisticsOrderAddress::getByField($logistics_code, 'logistics_code');
			$order_warehouse = Service_Warehouse::getByField($order['warehouse_id'], 'warehouse_id');
				
			if(!$order_warehouse){ throw new Exception("不存在的的仓库");}
				
        /* // 当出现这种情况时，并不会提交或回滚事务，致使在循环中（多次调用此方法）报
           // There is already an active transaction错误，因此需改为抛出异常模式
           // @author Daniel Chen
      if(empty($order)||empty($order_address)) $result['message'] = '订单不存在';
			//else if($order['sm_code']!='HQSWGH') $result['message'] = '订单的运输方式不是HQSWGH';
			else if($order['ref_tracking_number']=='') $result['message'] = '跟踪号为空，请先确认再提交';
			else if($order['lo_status'] != 0) $result['message'] = '订单不是草稿状态';			
      */
      if (empty($order) || empty($order_address)) {
        throw new Exception('订单不存在');
      }
      elseif (empty($order['ref_tracking_number'])) {
        throw new Exception('跟踪号为空，请先确认再提交');
      }
      elseif (0 != $order['lo_status']) {
        throw new Exception('订单不是草稿状态');
      }
			else {
				//验证运输方式和国家是否可到达
				$sm_error = Service_LogisticsProcess::checksmcode($order_address['loa_country'],$order['sm_code'],$order_warehouse['warehouse_code'],$order['lo_weight']);
				if($sm_error){
					throw new Exception($sm_error);
				}
				
				//冻结金额
				$balanceProcess = new Service_CustomerBalanceProcess();
				$feeResult =  $balanceProcess->logisticsFreezeFee($logistics_code, $order['customer_id']);
				if($feeResult !== true) {
					throw new Exception($feeResult);
				}
				
				//修改状态
				$uOrder['lo_status'] = 2;	//直接到已提交状态
				$uOrder['lo_update_time'] = date('Y-m-d H:i:s');
				Service_LogisticsOrder::update($uOrder, $logistics_code, 'logistics_code');
				//日志
				$log['logistics_code'] = $logistics_code;
				$log['lol_comment'] = '确认订单';
				$log['lol_create_time'] = date('Y-m-d H:i:s');
				$log['lol_operator'] = 0;
				$log['order_status_from'] = 0;
				$log['order_status_to'] = 2;
				$log['lol_ip'] = Common_Common::getIP();
				Service_LogisticsOrderLog::add($log);
				$db->commit();
				$result['ask'] = 1;
			}
		} catch(Exception $e) {
			$db->rollback();
			$result['message'] = $e->getMessage();
		}
		return $result;
	}
	
	public static function confirmOrder($logistics_code) {
		$result = array('ask'=>0, 'message'=>'','is_remote_city'=>0);
		$db = Common_Common::getAdapter();
		$db->beginTransaction();
		try{
		 	$order = Service_LogisticsOrder::getByField($logistics_code, 'logistics_code');
			$order_address = Service_LogisticsOrderAddress::getByField($logistics_code, 'logistics_code');
			$order_warehouse = Service_Warehouse::getByField($order['warehouse_id'], 'warehouse_id');
			
			if(!$order_warehouse){ throw new Exception("不存在的的仓库");}
			
			$balanceProcess = new Service_CustomerBalanceProcess();
    		$feeResult =  $balanceProcess->logisticsFreezeFee($logistics_code, $order['customer_id']);
			if($feeResult !== true) {
				throw new Exception($feeResult);
			}
				
        /* // 当出现这种情况时，并不会提交或回滚事务，致使在循环中（多次调用此方法）报
           // There is already an active transaction错误，因此需改为抛出异常模式
           // @author Daniel Chen
			if(empty($order)||empty($order_address)) $result['message'] = '订单不存在';
			//else if($order['sm_code']=='HQSWGH') $result['message'] = '订单的运输方式是HQSWGH，不用确认';
			else if($order['ref_tracking_number']!='') $result['message'] = '跟踪号不为空，请直接提交订单';
			else if($order['lo_status'] != 0) $result['message'] = '订单不是草稿状态';
      */
      if (empty($order) || empty($order_address)) {
        throw new Exception('订单不存在');
      }
      elseif (!empty($order['ref_tracking_number'])) {
        throw new Exception('跟踪号不为空，请直接提交订单');
      }
      elseif (0 != $order['lo_status']) {
        throw new Exception('订单不是草稿状态');
      }
			else {	
				$sm_error = Service_LogisticsProcess::checksmcode($order_address['loa_country'],$order['sm_code'],$order_warehouse['warehouse_code'],$order['lo_weight']);			
				if($sm_error){
					throw new Exception($sm_error);
				}
                /* $smInfo = Service_ShippingMethod::getByField($order['sm_code'],"sm_code","*");
                if($smInfo['sm_class_code']=="CRP"){
                    //获取物流单号
                    $condition = array(
                        'sm_code'=>$order['sm_code'],
                        'stn_status'=>'0',
                    	'warehouse_id'=>3
                    );
                    $STNList = Service_ServiceTrackingNumber::getByCondition($condition,"*",1,1);
                    if(empty($STNList)) throw new Exception("没有可以分配的预存单号!");
                    $ServiceTrackingNumber = array(
                        'order_code'=>$logistics_code,
                        'stn_status'=>'1',
                        'stn_update_time'=>date("Y-m-d H:i:s")
                    );
                    Service_ServiceTrackingNumber::update($ServiceTrackingNumber,$STNList[0]['stn_id'],'stn_id');
                    $uOrder['ref_tracking_number'] = $STNList[0]['stn_code'];
                } */
				//修改状态
				$uOrder['lo_status'] = 1;
				$uOrder['lo_update_time'] = date('Y-m-d H:i:s');
				Service_LogisticsOrder::update($uOrder, $logistics_code, 'logistics_code');
				//日志
				$log['logistics_code'] = $logistics_code;
				$log['lol_comment'] = '确认订单';
				$log['lol_create_time'] = date('Y-m-d H:i:s');
				$log['lol_operator'] = 0;
                $log['order_status_from'] = "0";
                $log['order_status_to'] = "1";
				$log['lol_ip'] = Common_Common::getIP();
				Service_LogisticsOrderLog::add($log);
				$db->commit();
				$result['ask'] = 1;
                                $result['is_remote_city']=$order['is_remote_city'];
			}
		} catch(Exception $e) {
			$db->rollback();
			$result['message'] = $e->getMessage();
		}
		return $result;
	}
	
	public static function checkOrderState($order)
	{
		$smArray = array("BH-HKECM","BH-JE-POST","BH-US");
		if(in_array($order['sm_code'],$smArray)){
			if("" == $order['ref_tracking_number']){
				return "未获取到跟踪号";
			}
			$DHLInfo = Service_ApiDhl::getByField($order['logistics_code'], 'order_code');
			if(empty($DHLInfo) || '' == $DHLInfo['label_pdf_path']){
				return "未获取到面单";
			}
		}
		return true;
	}
	
	/*从确定到提交*/
	public static function submitOrder($logistics_code,$customerId) {
		$result = array('ask'=>0, 'message'=>'');
		$db = Common_Common::getAdapter();		
		$db->beginTransaction();
		try{
			$order = Service_LogisticsOrder::getByField($logistics_code, 'logistics_code');
			$order_address = Service_LogisticsOrderAddress::getByField($logistics_code, 'logistics_code');
			$checkState = self::checkOrderState($order);
			if(true !== $checkState){
				$result['message'] = $checkState;
				return $result;
			}
			if(empty($order) || empty($order_address)) {$result['message'] = '订单不存在';}
			else if($order['lo_status'] != 1){ $result['message'] = '订单不是确认状态';}
			else{				
				//冻结金额
				$uOrder = array();
    			$feeResult = true;
    			if($feeResult !== true) {
    				$result['message'] = $feeResult;
    			} else {				
    				$smInfo = Service_ShippingMethod::getByField($order['sm_code'],"sm_code","*");
					$smArray = array("BH-HKECM","BH-JE-POST","BH-US");
					if(!in_array($order['sm_code'],$smArray)){
						if($smInfo['sm_class_code']=="CRP" && $order['sm_code']!='HQSWGH'&&$order['sm_code']!='HKDHL-BQC'&&$order['sm_code']!='HKDHL-JLY'&&$order['sm_code']!='SF-RUPR') {//不是环球易购
							//获取物流单号
							$condition = array(
									'sm_code'=>$order['sm_code'],
									'stn_status'=>'0',
									'warehouse_id'=>3
							);
							$STNList = Service_ServiceTrackingNumber::getByCondition($condition,"*",1,1);
							if(empty($STNList)) throw new Exception("没有可以分配的预存单号!");
							$ServiceTrackingNumber = array(
									'order_code'=>$logistics_code,
									'stn_status'=>'1',
									'stn_update_time'=>date("Y-m-d H:i:s")
							);
							Service_ServiceTrackingNumber::update($ServiceTrackingNumber,$STNList[0]['stn_id'],'stn_id');
							//$uOrder['ref_tracking_number'] = Service_ServiceTrackingNumber::getTrackingNumber($order['sm_code'], $STNList[0]['stn_code']);
							$uOrder['ref_tracking_number'] = $STNList[0]['stn_code'];
						} else {
							$uOrder['ref_tracking_number'] = $logistics_code;
						}
						if ($order['sm_code']=='SF-RUPR'||$order['sm_code']=='SF-RUPT') {
							$uOrder['ref_tracking_number'] = '';
						}
					}else{
						$uOrder['fee_weight'] = $uOrder['lo_weight'];
						if($smInfo['sm_vol_rate'] >0 && 1==$smInfo['sm_is_volume']){
							$uOrder['volume_weight'] = sprintf("%.3f",$order['size_width']*$order['size_length']*$order['size_height']/$smInfo['sm_vol_rate']);
							$uOrder['fee_weight'] = $uOrder['volume_weight']>$uOrder['lo_weight']?$uOrder['volume_weight']:$uOrder['lo_weight'];
						}
					}
    				//修改状态
					$uOrder['lo_status'] = 2;
					$uOrder['lo_update_time'] = date('Y-m-d H:i:s');
					Service_LogisticsOrder::update($uOrder, $logistics_code, 'logistics_code');
					//日志
					$log['logistics_code'] = $logistics_code;
					$log['lol_comment'] = '打印标签';
					$log['lol_create_time'] = date('Y-m-d H:i:s');
					$log['lol_operator'] = 0;
                    $log['order_status_from'] = "1";
                    $log['order_status_to'] = "2";
					$log['lol_ip'] = Common_Common::getIP();
					Service_LogisticsOrderLog::add($log);
					$db->commit();
					$result['ask'] = 1;
				}				
			}
		 if(!$result['ask']){$db->rollback();}	
		} catch(Exception $e) {
			$db->rollback();
			$result['message'] = $e->getMessage();
		}
		return $result;
	}

    /**
     * @author william-fan
     * @todo 用于删除订单
     */
    public static function deleteTranslate($orderCode = '',$customerId){
        $result = array('ask' => 0, 'message' => Ec_Lang::getInstance()->getTranslate('FailedToDeleteOrders'), 'error' => array());
        $ordersInfo = Service_LogisticsOrder::getByField($orderCode,'logistics_code');
        $error = array();
        //print_r($receiving);exit;
        if(empty($ordersInfo)){
            $error[]=Ec_Lang::getInstance()->getTranslate('OrdersInvalid');//'订单无效';
        }else{
            if($ordersInfo['lo_status']!='0'){
                $error[]=Ec_Lang::getInstance()->getTranslate('OrderStatusNotInDraft');//'订单状态不为草稿状态';
                $result['message'] = Ec_Lang::getInstance()->getTranslate('FailedToDeleteOrders').Ec_Lang::getInstance()->getTranslate('OrderStatusNotInDraft');//'删除订单失败订单状态不为草稿状态';
            }
        }
        if(empty($customerId)){
            $result['message'] = Ec_Lang::getInstance()->getTranslate('CustomerError');//'客户错误';
            return $result;
        }
        if(!empty($error)){
            $result['error'] = $error;
            return $result;
        }

        if($ordersInfo['customer_id']!=$customerId){
            $result['message'] =  Ec_Lang::getInstance()->getTranslate('TheInconsistentOrdersAndCustomers');//'该订单和客户不一致';
            return $result;
        }
        try {
            $DB = Common_Common::getAdapter();
            $DB->beginTransaction();
            $orderRow = array(
                'lo_status'=>'-1',
                'lo_update_time'=>date('Y-m-d H:i:s',time()),
            );
            if(!Service_LogisticsOrder::update($orderRow, $orderCode,'logistics_code')){
                throw new Exception(Ec_Lang::getInstance()->getTranslate('OrderStatusChangeFailed'));//"订单状态更改失败"
            }

            $orderLog = array(
                //'lol_id'=>$ordersInfo['lo_id'],
                'logistics_code' => $orderCode,
                'lol_comment'=>'删除',
                'order_status_from'=>'0',
                'order_status_to' => '-1',
                'lol_create_time' => date('Y-m-d H:i:s',time()),
                'lol_operator'=> '0',
                'lol_ip'=>Common_Common::getIP()
            );
            Service_LogisticsOrderLog::add($orderLog);


            $result['ask']='1';
            $result['message'] = Ec_Lang::getInstance()->getTranslate('OrdersDeletedSuccessfully');//'订单删除成功';
            //$DB->rollBack();
            $DB->commit();
        } catch (Exception $e) {
            $DB->rollBack();
            $result['error'][] = $e->getMessage();
            $result['message'] = $e->getMessage();
            return $result;
        }
        //print_r($result);exit;
        return $result;
    }

    public static function recoveryTranslate($orderCode = '',$customerId){
        $result = array('ask' => 0, 'message' =>"恢复订单失败", 'error' => array());
        $ordersInfo = Service_LogisticsOrder::getByField($orderCode,'logistics_code',"*");
        $error = array();
        //print_r($receiving);exit;
        if(empty($ordersInfo)){
            $error[]=Ec_Lang::getInstance()->getTranslate('OrdersInvalid');//'订单无效';
        }else{
            if($ordersInfo['lo_status']!='-1'){
                $error[]="订单不为删除状态";//'订单状态不为删除状态';
                $result['message'] = "恢复订单失败,订单不为删除状态";//'恢复订单失败,订单不为删除状态';
            }
        }
        if(empty($customerId)){
            $result['message'] = Ec_Lang::getInstance()->getTranslate('CustomerError');//'客户错误';
            return $result;
        }
        if(!empty($error)){
            $result['error'] = $error;
            return $result;
        }

        if($ordersInfo['customer_id']!=$customerId){
            $result['message'] =  Ec_Lang::getInstance()->getTranslate('TheInconsistentOrdersAndCustomers');//'该订单和客户不一致';
            return $result;
        }
        $existLogisticsOrder = Service_LogisticsOrder::getByCondition(array('reference_no'=>$ordersInfo['reference_no'],'lo_status_arr'=>array('0','1','2','3','4','5','6','7','8')),"*");
        if(!empty($existLogisticsOrder)){
            $result['message'] = "客户参考号已存在";//'客户错误';
            return $result;
        }
        $DB = Common_Common::getAdapter();
        $DB->beginTransaction();
        try{
            $orderRow = array(
                'lo_status'=>'0',
                'lo_update_time'=>date('Y-m-d H:i:s',time()),
            );
            if(!Service_LogisticsOrder::update($orderRow,$orderCode,"logistics_code")){
                throw new Exception(Ec_Lang::getInstance()->getTranslate('OrderStatusChangeFailed'));//"订单状态更改失败"
            }
            //日志
            $log['logistics_code'] = $orderCode;
            $log['lol_comment'] = '恢复订单';
            $log['lol_create_time'] = date('Y-m-d H:i:s');
            $log['lol_operator'] = 0;
            $log['order_status_from'] = "-1";
            $log['order_status_to'] = "0";
            $log['lol_ip'] = Common_Common::getIP();
            Service_LogisticsOrderLog::add($log);
            $result['ask']='1';
            $result['message'] = "订单恢复成功";//'订单删除成功';
            //$DB->rollBack();
            $DB->commit();
        }catch (Exception $e){
            $DB->rollBack();
            $result['error'][] = $e->getMessage();
            $result['message'] = $e->getMessage();
            return $result;
        }
        return $result;
    }

	
}