<?php
class Api_ServiceForCmbl {

	private  $_authKey = 'DXE9BVCM7JVDQ8KK';
	
	private  $_authToken = 'd5ccxsazlLexasbYRjjtqRyahapgnWdNT91PdUY2bTvKUrEsShu9xyLEJST1JSpi72Tg0mltdxrMRV0FJzByNmwae9hBSTfZ5fR7JfjJPY1a';
	
	protected $_key = null;
	
	protected $_token = null;

    protected $_auth = false;

    protected $_error = null;    

    protected $_date = null;

    protected $_paramterArr = array();//将传递过来的对象转为数组存储
    

    private function _init ($headerRequest) {
    	$this->_key = (string) $headerRequest['appKey'];
    	$this->_token = (string) $headerRequest['appToken'];
    }
    /**
     * @author solar
     * @todo Authenticate
     */
	private function authenticate(){
        if ($this->_key == $this->_authKey && $this->_token == $this->_authToken) {
            $this->_auth = true;
            return true;
        }
        $this->_error = 'App Key/App Token Not match.';
        return false;
    }
	/**
	 * @todo 写日志
	 */
    private function logError ($error) {
        $logger = new Zend_Log();
        $uploadDir = APPLICATION_PATH . "/../data/log/";
        $writer = new Zend_Log_Writer_Stream($uploadDir . 'api-cmbl.log');
        $logger->addWriter($writer);
        $logger->info(date('Y-m-d H:i:s') . ': ' . $error . " \n");
    }
        
    /**
     * @author william-fam
     * @todo 公共方法
     */ 
    private function common ($paramter) {
		// 对象转数组
        $this->_paramterArr = Common_Common::objectToArray($paramter);//对象转数组 
        $headRequest = $this->_paramterArr['HeaderRequest'];
        $this->_init($headRequest);
        $this->_date = date('Y-m-d H:i:s');
        $this->authenticate();
    }
    /**
     * 发送商品备案信息
     * @param array $paramter
     * @return array
     */
    public function sendGoodsResult($paramter){
    	$result = array(
    			'ask' => '0',
    			'message' => ''
    	);
    	$this->common($paramter);
        if ($this->_error) {
            $result['message'] = $this->_error;
            return $result;
        }
        $goodsInfo = $this->transParam($this->_paramterArr['GoodsInfo']);
        if(!isset($goodsInfo['CODE_TS']) || empty($goodsInfo['CODE_TS'])) {
        	$result['message'] = '必须提供CODE_TS';
        	return $result;
        }
        if(!isset($goodsInfo['G_NAME_CN']) || empty($goodsInfo['G_NAME_CN'])) {
        	$result['message'] = '必须提供G_NAME_CN';
        	return $result;
        }
        if(!isset($goodsInfo['G_MODEL']) || empty($goodsInfo['G_MODEL'])) {
        	$result['message'] = '必须提供G_MODEL';
        	return $result;
        }
        if(!isset($goodsInfo['STATUS']) || empty($goodsInfo['STATUS'])) {
        	$result['message'] = '必须提供STATUS';
        	return $result;
        }
        $agr_hs_key = Service_Product::generateHsKey($goodsInfo['CODE_TS'], $goodsInfo['G_NAME_CN'], $goodsInfo['G_MODEL']);
        $aGoodsResult = Service_ApiGoodsResult::getByField($agr_hs_key, 'agr_hs_key');
        if($aGoodsResult) {
        	$result['message'] = '已存在相同数据，请不要重复发送';
        	return $result;
        }
        $goodsInfo['agr_hs_key'] = $agr_hs_key;
        $goodsInfo['agr_create_time'] = date('Y-m-d H:i:s');
        $goodsInfo['agr_status'] = 1;
        $agr_id = Service_ApiGoodsResult::add($goodsInfo);
        if($agr_id>0) $result['ask'] = '1';
        return $result;
    }
    
    private function transParam($goodsInfo){
    	$transOrder = array();
    	 
    	if(isset($goodsInfo['CODE_TS'])){
    		$transOrder['CODE_TS'] = trim($goodsInfo['CODE_TS']);
    	}
    	if(isset($goodsInfo['G_NAME_CN'])){
    		$transOrder['G_NAME_CN'] = trim($goodsInfo['G_NAME_CN']);
    	}
    	if(isset($goodsInfo['G_MODEL'])){
    		$transOrder['G_MODEL'] = trim($goodsInfo['G_MODEL']);
    	}
    	if(isset($goodsInfo['STATUS'])){
    		$transOrder['STATUS'] = trim($goodsInfo['STATUS']);
    	}
    	return $transOrder;   	
    }
    
    /**
     * @author solar
     * @todo 发送出入库状态
     */
    public function sendFormStatus($paramter){
    	$result = array(
    			'ask' => '0',
    			'message' => ''
    	);
    	$this->common($paramter);
    	if ($this->_error) {
    		$result['message'] = $this->_error;
    		return $result;
    	}
    	$formInfo = $this->_paramterArr['FormInfo'];
    	if(!isset($formInfo['FORM_ID_XML']) || empty($formInfo['FORM_ID_XML'])) {
    		$result['message'] = '必须提供FORM_ID_XML';
    		return $result;
    	}
    	if(!isset($formInfo['FORM_ID']) || empty($formInfo['FORM_ID'])) {
    		$result['message'] = '必须提供FORM_ID';
    		return $result;
    	}
    	if(!isset($formInfo['STATUS']) || empty($formInfo['STATUS'])) {
    		$result['message'] = '必须提供STATUS';
    		return $result;
    	}
    	$where = array('FORM_ID'=>$formInfo['FORM_ID'], 'STATUS'=>$formInfo['STATUS']);
    	$aFormStatus = Service_ApiFormStatus::getByWhere($where, 'afs_id');
    	if($aFormStatus) {
    		$result['message'] = '已存在相同数据，请不要重复发送';
    		return $result;
    	}
    	$formInfo['afs_create_time'] = date('Y-m-d H:i:s');
    	$formInfo['afs_status'] = 1;
    	$afs_id = Service_ApiFormStatus::add($formInfo);
    	if($afs_id>0) $result['ask'] = '1';
    	return $result;
    }
    
    /**
     * @todo 修改集报数据
     * @author solar
     */
    public function updateJibaoData($paramter) {
    	$result = array(
    			'ask' => '0',
    			'message' => ''
    	);
    	$this->common($paramter);
    	if ($this->_error) {
    		$result['message'] = $this->_error;
    		return $result;
    	}
    	$jibaoHead = $this->_paramterArr['JibaoInfo'];
    	if(!isset($jibaoHead['FORM_ID_XML']) || empty($jibaoHead['FORM_ID_XML'])) {
    		$result['message'] = '必须提供FORM_ID_XML';
    		return $result;
    	}
    	if(!isset($jibaoHead['RELATIVE_FORM_ID']) || empty($jibaoHead['RELATIVE_FORM_ID'])) {
    		$result['message'] = '必须提供RELATIVE_FORM_ID';
    		return $result;
    	}
    	$aJibaoHead = Service_ApiJibaoHead::getByField($jibaoHead['FORM_ID_XML'], 'FORM_ID_XML');
    	if(empty($aJibaoHead)) {
    		$result['message'] = '更新失败，系统中不存在单号['.$jibaoHead['FORM_ID_XML'].']';
    		return $result;
    	}
    	$uJibaoHead['RELATIVE_FORM_ID'] = $jibaoHead['RELATIVE_FORM_ID'];
    	$u = Service_ApiJibaoHead::update($uJibaoHead, $aJibaoHead['ajh_id']);
    	if($u) {
    		$result['ask'] = '1';
    	} else {
    		$result['message'] = '更新失败，内部错误';
    	}
    	return $result;
    }
    
    /**
     * @author solar
     * @todo 集报数据
     */
    public function sendJibaoData($paramter) {
    	$result = array(
    			'ask' => '0',
    			'message' => ''
    	);
    	$this->common($paramter);
    	if ($this->_error) {
    		$result['message'] = $this->_error;
    		return $result;
    	}
    	$jibaoHead = $this->_paramterArr['JibaoInfo'];
    	if(!isset($jibaoHead['JibaoBodyList'])) {
    		$result['message'] = '请提供表体数据[JibaoBodyList]';
    		return $result;
    	}
    	$jibaoBodyList = $jibaoHead['JibaoBodyList'];
    	if(!is_array($jibaoBodyList)) {
    		$result['message'] = '表体字段[JibaoBodyList]类型不正确';
    		return $result;
    	}
    	if(empty($jibaoBodyList)) {
    		$result['message'] = '请提供表体数据[JibaoBodyList]';
    		return $result;
    	}
    	unset($jibaoHead['JibaoBodyList']);
    	
    	$jibaoHead = $this->checkJibaoHead($jibaoHead);
    	$aJibaoHead = Service_ApiJibaoHead::getByField($jibaoHead['FORM_ID_XML'], 'FORM_ID_XML');
    	if($aJibaoHead) {
    		$result['message'] = '单号['.$jibaoHead['FORM_ID_XML'].']已存在，请不要重复发送';
    		return $result;
    	}
    	    	
    	$jibaoHead['ajh_create_time'] = date('Y-m-d H:i:s');
    	if(!is_array($jibaoBodyList[0])) {
    		$jibaoBodyList = array($jibaoBodyList);
    	}
    	$jibaoBody = array();
    	foreach($jibaoBodyList as $jibaoBodyRow) {
    		if(!is_array($jibaoBodyRow)) {
    			$result['message'] = '表体字段[JibaoBodyList]类型不正确';
    			return $result;
    		}
    		$jibaoBody[] = $this->checkJibaoBody($jibaoBodyRow);
    	}
    	$db = Common_Common::getAdapter();
    	$db->beginTransaction();
    	try {
    		$ajh_id = Service_ApiJibaoHead::add($jibaoHead);
    		foreach($jibaoBody as $bodyRow) {
    			$bodyRow['ajh_id'] = $ajh_id;
    			$ajb_id = Service_ApiJibaoBody::add($bodyRow);
    		}
    		$db->commit();
    		$result['ask'] = '1';
    	} catch(Exception $e) {
    		$db->rollback();
    		$this->logError($e->getTraceAsString());
    		$result['message'] = '内部错误';
    	}
    	return $result;
    }
    
    private function checkJibaoHead($jibaoHead) {
    	$headRow = array();
    	
    	if(!isset($jibaoHead['FORM_ID'])) $headRow['FORM_ID'] = '';
    	else $headRow['FORM_ID'] = trim($jibaoHead['FORM_ID']);
    		
    	if(!isset($jibaoHead['FORM_ID_XML'])) $headRow['FORM_ID_XML'] = '';
    	else $headRow['FORM_ID_XML'] = trim($jibaoHead['FORM_ID_XML']);
    	
    	if(!isset($jibaoHead['DECL_PORT'])) $headRow['DECL_PORT'] = '';
    	else $headRow['DECL_PORT'] = trim($jibaoHead['DECL_PORT']);
    	
    	if(!isset($jibaoHead['I_E_PORT'])) $headRow['I_E_PORT'] = '';
    	else $headRow['I_E_PORT'] = trim($jibaoHead['I_E_PORT']);
    	
    	if(!isset($jibaoHead['I_E_MODE'])) $headRow['I_E_MODE'] = '';
    	else $headRow['I_E_MODE'] = trim($jibaoHead['I_E_MODE']);
    	
    	if(!isset($jibaoHead['PS_TYPE'])) $headRow['PS_TYPE'] = '';
    	else $headRow['PS_TYPE'] = trim($jibaoHead['PS_TYPE']);
    	
    	if(!isset($jibaoHead['RELATIVE_FORM_TYPE'])) $headRow['RELATIVE_FORM_TYPE'] = '';
    	else $headRow['RELATIVE_FORM_TYPE'] = trim($jibaoHead['RELATIVE_FORM_TYPE']);
    	
    	if(!isset($jibaoHead['FORM_TYPE'])) $headRow['FORM_TYPE'] = '';
    	else $headRow['FORM_TYPE'] = trim($jibaoHead['FORM_TYPE']);
    	
    	if(!isset($jibaoHead['EMS_NO'])) $headRow['EMS_NO'] = '';
    	else $headRow['EMS_NO'] = trim($jibaoHead['EMS_NO']);
    	
    	if(!isset($jibaoHead['TRAF_NAME'])) $headRow['TRAF_NAME'] = '';
    	else $headRow['TRAF_NAME'] = trim($jibaoHead['TRAF_NAME']);
    	
    	if(!isset($jibaoHead['VOYAGE_NO'])) $headRow['VOYAGE_NO'] = '';
    	else $headRow['VOYAGE_NO'] = trim($jibaoHead['VOYAGE_NO']);
    	
    	if(!isset($jibaoHead['BILL_NO'])) $headRow['BILL_NO'] = '';
    	else $headRow['BILL_NO'] = trim($jibaoHead['BILL_NO']);
    	
    	if(!isset($jibaoHead['GROSS_WT'])) $headRow['GROSS_WT'] = '0.00';
    	else $headRow['GROSS_WT'] = trim($jibaoHead['GROSS_WT']);
    	
    	if(!isset($jibaoHead['NET_WT'])) $headRow['NET_WT'] = '0.00';
    	else $headRow['NET_WT'] = trim($jibaoHead['NET_WT']);
    	
    	if(!isset($jibaoHead['PACK_NO'])) $headRow['PACK_NO'] = '';
    	else $headRow['PACK_NO'] = trim($jibaoHead['PACK_NO']);
    	
    	if(!isset($jibaoHead['WRAP_TYPE'])) $headRow['WRAP_TYPE'] = '';
    	else $headRow['WRAP_TYPE'] = trim($jibaoHead['WRAP_TYPE']);
    	
    	if(!isset($jibaoHead['TRAF_MODE'])) $headRow['TRAF_MODE'] = '';
    	else $headRow['TRAF_MODE'] = trim($jibaoHead['TRAF_MODE']);
    	
    	if(!isset($jibaoHead['TRADE_CO'])) $headRow['TRADE_CO'] = '';
    	else $headRow['TRADE_CO'] = trim($jibaoHead['TRADE_CO']);
    	
    	if(!isset($jibaoHead['TRADE_NAME'])) $headRow['TRADE_NAME'] = '';
    	else $headRow['TRADE_NAME'] = trim($jibaoHead['TRADE_NAME']);
    	
    	if(!isset($jibaoHead['TRADE_MODE'])) $headRow['TRADE_MODE'] = '';
    	else $headRow['TRADE_MODE'] = trim($jibaoHead['TRADE_MODE']);
    	
    	if(!isset($jibaoHead['TRANS_MODE'])) $headRow['TRANS_MODE'] = '';
    	else $headRow['TRANS_MODE'] = trim($jibaoHead['TRANS_MODE']);
    	
    	if(!isset($jibaoHead['AGENT_CODE'])) $headRow['AGENT_CODE'] = '';
    	else $headRow['AGENT_CODE'] = trim($jibaoHead['AGENT_CODE']);
    	
    	if(!isset($jibaoHead['AGENT_NAME'])) $headRow['AGENT_NAME'] = '';
    	else $headRow['AGENT_NAME'] = trim($jibaoHead['AGENT_NAME']);
    	
    	if(!isset($jibaoHead['TRADE_COUNTRY'])) $headRow['TRADE_COUNTRY'] = '';
    	else $headRow['TRADE_COUNTRY'] = trim($jibaoHead['TRADE_COUNTRY']);
    	
    	if(!isset($jibaoHead['OWNER_CODE'])) $headRow['OWNER_CODE'] = '';
    	else $headRow['OWNER_CODE'] = trim($jibaoHead['OWNER_CODE']);
    	
    	if(!isset($jibaoHead['OWNER_NAME'])) $headRow['OWNER_NAME'] = '';
    	else $headRow['OWNER_NAME'] = trim($jibaoHead['OWNER_NAME']);
    	
    	if(!isset($jibaoHead['NOTE_S'])) $headRow['NOTE_S'] = '';
    	else $headRow['NOTE_S'] = trim($jibaoHead['NOTE_S']);
    	
    	if(!isset($jibaoHead['D_DATE'])) $headRow['D_DATE'] = '';
    	else $headRow['D_DATE'] = trim($jibaoHead['D_DATE']);
    	
    	if(!isset($jibaoHead['COP_GB_CODE'])) $headRow['COP_GB_CODE'] = '';
    	else $headRow['COP_GB_CODE'] = trim($jibaoHead['COP_GB_CODE']);
    	
    	if(!isset($jibaoHead['DESTINATION_PORT'])) $headRow['DESTINATION_PORT'] = '';
    	else $headRow['DESTINATION_PORT'] = trim($jibaoHead['DESTINATION_PORT']);
    	
    	if(!isset($jibaoHead['CUS_CODE'])) $headRow['CUS_CODE'] = '';
    	else $headRow['CUS_CODE'] = trim($jibaoHead['CUS_CODE']);
    	
    	if(!isset($jibaoHead['CUS_NAME'])) $headRow['CUS_NAME'] = '';
    	else $headRow['CUS_NAME'] = trim($jibaoHead['CUS_NAME']);
    	
    	return $headRow;
    }
    
    private function checkJibaoBody($jibaoBody) {
    	$bodyRow = array();
    	 
    	if(!isset($jibaoBody['Form_ID'])) $bodyRow['Form_ID'] = '';
    	else $bodyRow['Form_ID'] = trim($jibaoBody['Form_ID']);
    	
    	if(!isset($jibaoBody['Form_ID_XML'])) $bodyRow['Form_ID_XML'] = '';
    	else $bodyRow['Form_ID_XML'] = trim($jibaoBody['Form_ID_XML']);
    	
    	if(!isset($jibaoBody['G_NO'])) $bodyRow['G_NO'] = '';
    	else $bodyRow['G_NO'] = trim($jibaoBody['G_NO']);
    	
    	if(!isset($jibaoBody['CODE_TS'])) $bodyRow['CODE_TS'] = '';
    	else $bodyRow['CODE_TS'] = trim($jibaoBody['CODE_TS']);
    	
    	if(!isset($jibaoBody['G_NAME_CN'])) $bodyRow['G_NAME_CN'] = '';
    	else $bodyRow['G_NAME_CN'] = trim($jibaoBody['G_NAME_CN']);
    	
    	if(!isset($jibaoBody['G_MODEL'])) $bodyRow['G_MODEL'] = '';
    	else $bodyRow['G_MODEL'] = trim($jibaoBody['G_MODEL']);
    	
    	if(!isset($jibaoBody['G_NAME_EN'])) $bodyRow['G_NAME_EN'] = '';
    	else $bodyRow['G_NAME_EN'] = trim($jibaoBody['G_NAME_EN']);
    	
    	if(!isset($jibaoBody['G_QTY'])) $bodyRow['G_QTY'] = '';
    	else $bodyRow['G_QTY'] = trim($jibaoBody['G_QTY']);
    	
    	if(!isset($jibaoBody['G_UNIT'])) $bodyRow['G_UNIT'] = '';
    	else $bodyRow['G_UNIT'] = trim($jibaoBody['G_UNIT']);
    	
    	if(!isset($jibaoBody['DECL_PRICE'])) $bodyRow['DECL_PRICE'] = '';
    	else $bodyRow['DECL_PRICE'] = trim($jibaoBody['DECL_PRICE']);
    	
    	if(!isset($jibaoBody['CURR'])) $bodyRow['CURR'] = '';
    	else $bodyRow['CURR'] = trim($jibaoBody['CURR']);
    	
    	if(!isset($jibaoBody['QTY_1'])) $bodyRow['QTY_1'] = '';
    	else $bodyRow['QTY_1'] = trim($jibaoBody['QTY_1']);
    	
    	if(!isset($jibaoBody['UNIT_1'])) $bodyRow['UNIT_1'] = '';
    	else $bodyRow['UNIT_1'] = trim($jibaoBody['UNIT_1']);
    	
    	if(!isset($jibaoBody['QTY_2'])) $bodyRow['QTY_2'] = '';
    	else $bodyRow['QTY_2'] = trim($jibaoBody['QTY_2']);
    	
    	if(!isset($jibaoBody['UNIT_2'])) $bodyRow['UNIT_2'] = '';
    	else $bodyRow['UNIT_2'] = trim($jibaoBody['UNIT_2']);
    	
    	if(!isset($jibaoBody['ORIGIN_COUNTRY'])) $bodyRow['ORIGIN_COUNTRY'] = '';
    	else $bodyRow['ORIGIN_COUNTRY'] = trim($jibaoBody['ORIGIN_COUNTRY']);
    	
    	if(!isset($jibaoBody['DUTY_MODE'])) $bodyRow['DUTY_MODE'] = '';
    	else $bodyRow['DUTY_MODE'] = trim($jibaoBody['DUTY_MODE']);
    	
    	if(!isset($jibaoBody['DECL_TOTAL'])) $bodyRow['DECL_TOTAL'] = '';
    	else $bodyRow['DECL_TOTAL'] = trim($jibaoBody['DECL_TOTAL']);
    	
    	return $bodyRow;
    }
    
}