diff --git a/application/third_party/trainsystem/controllers/innerTrainSearch.php b/application/third_party/trainsystem/controllers/innerTrainSearch.php index 9e8d417a..d5284af7 100644 --- a/application/third_party/trainsystem/controllers/innerTrainSearch.php +++ b/application/third_party/trainsystem/controllers/innerTrainSearch.php @@ -174,7 +174,7 @@ class innerTrainSearch extends CI_Controller{ return json_encode($return_data); } - public function ctripApi($date=null,$from=null,$to=null){ + public function ctripApi($date=null,$from=null,$to=null,$return=false){ //接收参数 if(!$date && !$from && !$to){ $date = $this->input->get_post('date'); @@ -362,7 +362,12 @@ class innerTrainSearch extends CI_Controller{ } //print_r($ResponseData);die(); $ReturnData->data->map = (object)$obj; - print_r(json_encode($ReturnData)); + if($return){ + return json_encode($ReturnData); + }else{ + echo json_encode($ReturnData); + } + } } @@ -474,5 +479,140 @@ class innerTrainSearch extends CI_Controller{ } } - + public function get_train(){ + $train_date = $this->input->get('date'); + $fromStation = $this->input->get('from'); + $toStation = $this->input->get('to'); + if(!$train_date || !$fromStation || !$toStation){ + exit('传参错误!'); + } + + $back_json = $this->ctripApi($train_date,$fromStation,$toStation,true); + + $train_info = new stdClass(); + $train_info = json_decode($back_json); + + $return_data = new stdClass(); + $return_data->status = 200; + $return_data->search = new stdClass(); + $return_data->search->FromStationCode = $fromStation; + $return_data->search->ToStationCode = $toStation; + $return_data->search->StartDate = $train_date; + + $return_data->CardFee = 3; + //MainlandChina:大陆内地寄送费用 + //HMT:港澳台寄送费用 + //寄送费按订单收,无论多少张票,没有取票费 + //$return_data->MainlandChina = 6; + //$return_data->HMT = 15; + $this->load->library('Currency'); + define("CONST_SITE_CURRENCY","USD"); + $return_data->ExRate = $this->currency->get_site_currencyrate(); + $return_data->result = array(); + $i = 0; + + foreach ($train_info->data->result as $value){ + $return_data->result[$i] = new StdClass(); + $data = explode('|', $value); + $return_data->result[$i]->TrainNo = $data[2]; + $return_data->result[$i]->TrainCode = $data[3]; + $return_data->result[$i]->TrainType = substr(ucwords($data[3]), 0, 1); + $return_data->result[$i]->StartStationCode = $data[4]; + $return_data->result[$i]->EndStationCode = $data[5]; + $return_data->result[$i]->DepartStation = ''; + $return_data->result[$i]->DepartStationCode = $data[6]; + $return_data->result[$i]->DepartStationNo = ''; + $return_data->result[$i]->ArriveStation = ''; + $return_data->result[$i]->ArriveStationCode = $data[7]; + $return_data->result[$i]->ArriveStationNo = ''; + $return_data->result[$i]->DepartTime = $data[8]; + $return_data->result[$i]->ArriveTime = $data[9]; + $return_data->result[$i]->RunTime = $data[10]; + $return_data->result[$i]->IsBookable = true; + //$return_data->result[$i]->SeatType = '123456789OMPA'; + $return_data->result[$i]->cached = 1; + //$return_data->result[$i]->CheapSeat = new stdClass(); + $price = json_decode($train_info->data->price[$i]); + + $return_data->result[$i]->CheapSeat = null; + $return_data->result[$i]->SeatList = array(); + //做一个数据存储所有的座位类型的余票 + $seat_yp_map = array( + 'A' => $data[21], //高级软卧 + 'A6' => $data[21], //高级软卧 + 'H' => $data[22], //其他 + 'A4' => $data[23], //软卧 + 'A2' => $data[24], //软座 + 'P' => $data[25], //特等座 + 'WZ' => $data[26],//无座 + 'X' => $data[26], //无座 + 'A3' => $data[28], //硬卧 + 'A1' => $data[29], //硬座 + 'O' => $data[30], //二等座 + 'A8' => $data[30], //二等座 + 'A7' => $data[31], //一等座 + 'M' => $data[31], //一等座 + 'A9' => $data[32], //商务座 + 'F' => $data[33], //动卧 + 'YDW' => $data[36], //一等卧 + 'EDW' => $data[37], //二等卧 + ); + $j=0; + $soldoutnums = 0; + foreach($price->data as $key=>$value){ + if($key != 'train_no'){ + if(!is_numeric($key)){ + $return_data->result[$i]->SeatList[$j] = new StdClass(); + $return_data->result[$i]->SeatList[$j]->SeatCode = $key; + $return_data->result[$i]->SeatList[$j]->SeatName = get_name($key); + $value = str_replace('¥','',$value); + + if(in_array($key, array('A3', 'A4', 'A5', 'A6', '3', '4', '5', '6', 'A', 'F', 'S','YDW','EDW'))){ + if (stripos($return_data->result[$i]->TrainNo, "D") !== false || stripos($return_data->result[$i]->TrainNo, "G") !== false) { + $value = $value * 1.2; + $return_data->result[$i]->SeatList[$j]->ChildDiscut = 1; + }else{ + $value = $value * 1.15; + $return_data->result[$i]->SeatList[$j]->ChildDiscut = 0.75; + } + }else{ + $return_data->result[$i]->SeatList[$j]->ChildDiscut = 0.5; + } + /* + if (stripos($value, ".")) {//判断是否是整数,避免类似ecil(9.9*10)=100 + $value = ceil($value); + }*/ + $return_data->result[$i]->SeatList[$j]->SeatPrice = $this->currency->GetSiteMoney($value); + $return_data->result[$i]->SeatList[$j]->SeatPriceRMB = $value; + if($fromStation == 'LSO' || $toStation == 'LSO'){ + $return_data->result[$i]->SeatList[$j]->ServiceCharge = 33; + }else{ + $return_data->result[$i]->SeatList[$j]->ServiceCharge = 6; + } + if($fromStation == 'XJA' && stripos($return_data->result[$i]->TrainNo, "G") && $value > 500){ + $return_data->result[$i]->SeatList[$j]->ServiceCharge = 10; + } + $return_data->result[$i]->SeatList[$j]->ServiceChargeRMB = $return_data->result[$i]->SeatList[$j]->ServiceCharge * $return_data->ExRate; + + $return_data->result[$i]->SeatList[$j]->SeatInventory = $seat_yp_map[$key]; + if($return_data->result[$i]->SeatList[$j]->SeatInventory == '有'){ + $return_data->result[$i]->SeatList[$j]->SeatInventory = 99; + }elseif($return_data->result[$i]->SeatList[$j]->SeatInventory == '无'){ + $return_data->result[$i]->SeatList[$j]->SeatInventory = 0; + $soldoutnums++; + } + + $j++; + } + } + } + if($soldoutnums >= $j){ + $return_data->result[$i]->soldout = true; + }else{ + $return_data->result[$i]->soldout = false; + } + $i++; + } + print_r(json_encode($return_data)); + } } diff --git a/application/third_party/trainsystem/controllers/intelTrainSearch.php b/application/third_party/trainsystem/controllers/intelTrainSearch.php index cfe4d2d8..6acfb58e 100644 --- a/application/third_party/trainsystem/controllers/intelTrainSearch.php +++ b/application/third_party/trainsystem/controllers/intelTrainSearch.php @@ -16,6 +16,105 @@ class intelTrainSearch extends CI_Controller{ $this->load->model("BIZ_intel_train_model");//国际火车模型 } + //国际火车获取 + public function search_international_train(){ + $trainFrom = $this->input->get_post('trainFrom'); + $trainTo = $this->input->get_post('trainTo'); + $trainDate = $this->input->get_post('trainDate'); + + if(empty($trainFrom) || empty($trainTo)){ + header("HTTP/1.1 404 Not Found"); + exit('{"status":"201","reason":"车站查询失败","data":""}'); + } + + //根据传过来的城市名称获取城市代码 + $trainFromCode = $this->BIZ_intel_train_model->get_code_by_name($trainFrom); + $trainToCode = $this->BIZ_intel_train_model->get_code_by_name($trainTo); + + if(empty($trainFromCode) || empty($trainToCode)){ + header("HTTP/1.1 404 Not Found"); + exit('{"status":"202","reason":"站点名转换失败","data":""}'); + } + + //获取车次信息 + $obj = $this->BIZ_intel_train_model->get_train_info($trainFromCode->s_code,$trainToCode->s_code); + + //如果结果为空则直接返回为空的结果 + if(empty($obj)){ + header("HTTP/1.1 404 Not Found"); + exit('{"status":"203","reason":"无车次信息!","data":""}'); + } + + //处理返回的字符串 + $return_json = new StdClass(); + $return_json->status = '200'; + $return_json->reason = '成功的返回'; + $return_json->rate = $this->GetCurrencyRate(); + $return_json->mainland_deliver = 9; + $return_json->others_deliver = 12; + $return_json->data = array(); + $return_json->endata = array(); + + //如果有结果则进行字符串处理 + foreach($obj as $key=>$item){ + //发车规则处理 + $item->trainrule = array(); + $item->trainrule['include'] = array(); + $item->trainrule['exclusive'] = array(); + foreach(json_decode($item->DateRule)->DateRule as $key_rule=>$rules){ + if(!empty($rules)){ + if($key_rule == 'include'){ + $item->trainrule['include'] = $rules; + }else if($key_rule == 'exclusive'){ + $item->trainrule['exclusive'] = $rules; + } + } + } + + //价格处理 + $item->adult_seat = array(); + $item->child_seat = array(); + + $price_arr = json_decode($item->seatPriceInfo2); + $audlt = $price_arr->price; + $child = $price_arr->cprice; + + if(!empty($audlt)){ + $i=0; + foreach($audlt as $key_adult=>$value){ + $seat_name = $this->BIZ_intel_train_model->get_seatname($key_adult)->Seat_EName1; + $item->adult_seat[$i]['name'] = $seat_name; + $item->adult_seat[$i]['code'] = $key_adult; + $item->adult_seat[$i]['price'] = $value; + $item->adult_seat[$i]['pic'] = $this->BIZ_intel_train_model->get_seatname($key_adult)->Seat_Pic; + $i++; + } + } + + if(!empty($child)){ + $j=0; + foreach($child as $key_child=>$value){ + $seat_name = $this->BIZ_intel_train_model->get_seatname($key_child)->Seat_EName1; + $item->child_seat[$j]['name'] = $seat_name; + $item->child_seat[$j]['code'] = $key_child; + $item->child_seat[$j]['price'] = $value; + $j++; + } + } + + + //最后进行当前日期判断,对数据进行分组 + $flag = $this->checkDateRule($trainDate,$item->DateRule); + if(!$flag){ + //将不符合发车日期的列车放入到另外一个数组中存储起来 + array_push($return_json->endata,$obj[$key]); + }else{ + array_push($return_json->data,$obj[$key]); + } + } + print_r(json_encode($return_json)); + } + //获取所有的列车信息 public function get_all_inteltrain(){ $obj = $this->BIZ_intel_train_model->get_allinteltrain(); diff --git a/application/third_party/trainsystem/helpers/train_helper.php b/application/third_party/trainsystem/helpers/train_helper.php index fc9d25a8..026a8741 100644 --- a/application/third_party/trainsystem/helpers/train_helper.php +++ b/application/third_party/trainsystem/helpers/train_helper.php @@ -265,5 +265,54 @@ function checkDateRule($strDate, $jsonDate){ return $result; } +function get_name($seat_code){ + if($seat_code){ + switch($seat_code){ + case 'O' : + return 'Second Class Seat'; + case 'A8' : + return 'Second Class Seat'; + case 'A9' : + return 'Business Class Seat'; + case 'P' : + return 'Superior'; + case 'M' : + return 'First Class Seat'; + case 'A7' : + return 'First Class Seat'; + case 'A6' : + return 'Superior Soft Sleeper'; + case 'A' : + return 'Superior Soft Sleeper'; + case '5' : + return 'Hard Sleeper'; + case 'S' : + return 'Soft Sleeper'; + case 'A4' : + return 'Soft Sleeper'; + case 'F' : + return 'New Soft Sleeper'; + case 'A3' : + return 'Hard Sleeper'; + case 'A2' : + return 'Soft Seat'; + case 'A1' : + return 'Hard Seat'; + case 'Q' : + return 'Tour Seat'; + case 'H' : + return 'Other'; + case 'WZ' : + return 'Standing-room Only'; + case '13' : + return 'Standing-room Only'; + case 'YDW' : + return 'Soft Sleeper'; + case 'EDW' : + return 'Hard Sleeper'; + } + } +} + ?> \ No newline at end of file diff --git a/application/third_party/trainsystem/libraries/Currency.php b/application/third_party/trainsystem/libraries/Currency.php new file mode 100644 index 00000000..3442d30b --- /dev/null +++ b/application/third_party/trainsystem/libraries/Currency.php @@ -0,0 +1,187 @@ +CI = & get_instance(); + log_message('debug', "Language Tags Class Initialized"); + $this->GetCurrencyRate(); + } + + function GetCurrencyRate() { + $this->HT = $this->CI->load->database('HT', TRUE); + $sql = "SELECT CRI_BuyIn / 100.00 AS tmpExRate, \n" + . " CRI_Code \n" + . "FROM tourmanager.dbo.CurrencyRateInfo \n" + . "WHERE CRI_Code IN ('USD', 'EUR', 'RUB') \n" + . " AND GETDATE() BETWEEN CRI_Start AND CRI_Stop"; + $query = $this->HT->query($sql); + foreach ($query->result() as $item) { + switch ($item->CRI_Code) { + case 'USD': + $this->USD_Rate = $item->tmpExRate; + break; + case 'EUR': + $this->EUR_Rate = $item->tmpExRate; + break; + case 'RUB': + $this->RUB_Rate = $item->tmpExRate; + break; + } + } +// echo $this->USD_Rate . '
'; +// echo $this->EUR_Rate . '
'; +// echo $this->RUB_Rate . '
'; + return $query->result(); + } + + //根据人民币转换成站点对应的货币 + public function GetSiteMoney($RMB) { + if (!is_numeric($RMB)) + { + return $RMB; + } + + $result = $RMB; + if (is_numeric($RMB)) { + switch (CONST_SITE_CURRENCY) { + case 'USD': + $result = $RMB / $this->USD_Rate; + break; + case 'EUR': + $result = $RMB / $this->EUR_Rate; + break; + case 'RUB': + $result = $RMB / $this->RUB_Rate; + break; + } + } + return ceil($result); + } + + //把美金转换为人民币 + public function get_USD_RMB_SUM($USD) { + + if (!is_numeric($USD))return $USD; + $result = $USD; + $result = $USD * $this->USD_Rate; + return ceil($result); + } + + /** + * 返回站点的汇率。 + * + * @author lmr + */ + public function get_site_currencyrate() { + switch (CONST_SITE_CURRENCY) { + case 'USD': + return $this->USD_Rate; + case 'EUR': + return $this->EUR_Rate; + case 'RUB': + return $this->RUB_Rate; + default: + return 1; + } + } + + /** + * 返回带money_char的价格。 + * + * @param $money Int 价格. + * @return String 带货币符号的价格。 + */ + public function get_money_char($money='') { + + switch (CONST_SITE_CODE) { + case 'JP': + return $money.'元'; + case 'GM': + return '€'.$money; + case 'VC': + return $money.'€'; + case 'VAC': + return '$'.$money; + case 'RU': + return '$'.$money; + case 'IT': + return '€'.$money; + case 'SHT': + return '$'.$money; + default: + return '$'.$money; + } + } + + /** + * 返回带money_char的价格。 + * + * @param $money Int 价格. + * @return String 带货币符号的价格。 + */ + public function get_site_money_with_char($money='') { + return $this->get_money_char($this->GetSiteMoney($money)); + } + + + /** + * RMB换算成指定货币。 + * @param int money RMB + * @param string char 货币代号:usd,eur + * @return int 换算价格 + */ + public function convert_moneny_by_char($money,$char='') + { + switch (strtolower($char)) + { + case 'usd': + return ceil($money/$this->USD_Rate); + case 'eur': + return ceil($money/$this->EUR_Rate); + } + return $money; + } + + /** + * 尾数取"9"的定价规则 + * 在正负误差值小于或等于16的前提下, + * 保证展示价格的个位数和十位数统一取"99" + * 当展示价格的个位数和十位数取"99"的正负误差大于16时, + * 通过四舍五入加价实现个位数取"9" + * 详细规则见GitLab issue #12 统一网前展示价格的标准 + */ + public function calc_show_price($value=0) { + if (empty($value)) return 0; + if (!is_numeric($value)) return $value; + + $val_len = strlen($value); + + if ($val_len == 1) return 9; + + $discount = 16; + $val_pow = pow(10, $val_len - 1); + + $min_val = $val_pow - 1; + $max_val = $min_val + $val_pow; + $max_diff = abs($value - $max_val); + $min_diff = abs($value - $min_val); + + if (min($max_diff, $min_diff) > $discount) { + $calc_val = floor($value / 10) * 10 + 9; + } else { + $calc_val = $max_diff > $min_diff ? $min_val : $max_val; + } + return $calc_val; + } +}