'', 'cancel_flag' => '', 'channel_id' => '', 'channel' => '']; // $request = Yii::$app->request; if (Yii::$app->request->isAjax) { $filter = Yii::$app->request->get('filter'); } $dataProvider = $ctripHotel->index($filter); return $this->render('base', ['view' => 'index', 'data' => ['model' => $ctripHotel, 'comparePrice' => $comparePrice], 'dataProvider' => $dataProvider]); } /** * User:Steven * Desc:酒店比价 * @return string */ public function actionComparePrice() { $ctripHotelPrice = new CtripHotelPrice(); $hotel_list = $ctripHotelPrice->getDirectHotel(); if (Yii::$app->request->isPost || Yii::$app->request->isGet) { $HOTEL_ID = is_null(Yii::$app->request->post('HOTEL_ID')) ? Yii::$app->request->get('HOTEL_ID') : Yii::$app->request->post('HOTEL_ID'); } is_null($HOTEL_ID) ? $HOTEL_ID = $hotel_list[0]['HOTEL_ID'] : $HOTEL_ID; $ctrip_data = $ctripHotelPrice->getCtripData($HOTEL_ID); $data = array( 'ctrip_data' => [], 'update_time' => '' ); if (!empty($ctrip_data)) { $data['hotel_info'] = array( 'ctrip_hotel_id' => $ctrip_data[0]['ctrip_hotel_id'], 'hotel_name' => $ctrip_data[0]['hotel_name'], 'spider_hotel_id' => $HOTEL_ID, ); $last_up_time = $ctripHotelPrice->getHotelLastUpTime($HOTEL_ID); // $price_conversion = $ctripHotelPrice->getHotelConversion($HOTEL_ID); $res = $this->ctripDataService($ctrip_data, $HOTEL_ID); foreach ($res[$HOTEL_ID] as $key => $item) { if (empty($item)) { unset($res[$HOTEL_ID][$key]); } } } $data['hotel_list'] = $hotel_list; $data['ctrip_data'] = $res; $data['update_time'] = $last_up_time['max_create_time']; // $data['update_time'] = '2017-08-31 00:00:00'; return $this->render('base', ['view' => 'priceCompared', 'data' => $data]); } /** * User:Steven * Desc:酒店-房型比价列表 * @return string */ public function actionRoomCompared() { $hotel_id = Yii::$app->request->get('hotel_id'); $channel_id = Yii::$app->request->get('channel_id'); if (!isset($hotel_id) || !isset($channel_id)) { return false; } $filter = ['hotel_id' => $hotel_id, 'cancel_flag' => '', 'channel_id' => '', 'channel' => $channel_id]; if (Yii::$app->request->isAjax) { $filter = Yii::$app->request->get('filter'); $filter['hotel_id'] = $hotel_id; } $ctripHotel = new PriceComparedRoom(); $dataProvider = $ctripHotel->getComparedRoom($filter); // $data['update_time'] = '2017-08-31 00:00:00'; return $this->render('base', ['view' => 'room_compared_list', 'data' => ['model' => $ctripHotel, 'channel_id' => $channel_id, 'hotel_id' => $hotel_id,], 'dataProvider' => $dataProvider]); } /** * User:Steven * Desc:比价酒店数据总览页面 */ public function actionOverview() { $ctripHotel = new PriceComparedHotel(); $param = Yii::$app->request->get(); $channel_id = isset($param['channel_id']) ? $param['channel_id'] : Yii::$app->params['ctrip']['relation_supplier_id']; $hotel_name = isset($param['hotel_name']) ? $param['hotel_name'] : ''; $hotel_pricipal = isset($param['hotel_pricipal']) ? $param['hotel_pricipal'] : -1; $dataProvider = $ctripHotel->getHotelOverview($channel_id, $hotel_name, $hotel_pricipal); $ctrip_hotel_price = new CtripHotelPrice(); $last_up_time = $ctrip_hotel_price->getHotelLastUpTime(); return $this->render('base', ['view' => 'overview', 'data' => ['dataProvider' => $dataProvider, 'last_up_time' => $last_up_time]]); } /** * User:Steven * Desc:设置比价酒店的价差 * @return \yii\web\Response */ public function actionSetPriceConversion() { if (Yii::$app->request->isPost) { $post = Yii::$app->request->post(); $comparePrice = empty(HotelPriceConversion::findOne($post['HotelPriceConversion']['hotel_id'])) ? new HotelPriceConversion() : HotelPriceConversion::findOne($post['HotelPriceConversion']['hotel_id']); if ($comparePrice->load($post) && $comparePrice->validate()) { if ($comparePrice->save()) { Yii::$app->session->setFlash('success', "添加成功"); return $this->redirect(array('compare-price/index')); } else { Yii::$app->session->setFlash('success', "添加失败"); } } } } /** * @author wanglg * 修改酒店比价状态 */ public function actionModifyStatus() { $post = Yii::$app->request->post(); if (!(isset($post['id']) && isset($post['op']))) { $data['code'] = 2; } if ($post['field'] == 'cancel_flag') { $transform = Yii::$app->db->beginTransaction(); try { $pch = PriceComparedHotel::findOne($post['id']); $update['cancel_flag'] = $post['op'] == 'set' ? 0 : 1; if ($pch->load($update, '') && $pch->validate()) { if (!$pch->save()) { throw new \Exception(); } } // $hotel_id = $pch -> HotelId; $ChannelHotelId = $pch->ChannelHotelId; $sync_hotel = SyncPriceComparedHotel::findOne(['ChannelHotelId' => $ChannelHotelId]); $new_update = $post['op'] == 'set' ? 0 : 1; $sync_hotel->CancelFlag = $new_update; if (!$sync_hotel->update()) { throw new \Exception(); } $transform->commit(); $data = 0; } catch (\Exception $e) { $transform->rollBack(); $data['code'] = 1; } echo json_encode($data); } if ($post['field'] == 'send_msg') { $pch = PriceComparedHotel::findOne($post['id']); $update['SendMsg'] = $post['op'] == 'set' ? 1 : 0; $pch->SendMsg = $update['SendMsg']; if ($pch->update()) { $data = 0; } else { $data = 1; } echo json_encode($data); } } /** * @Author wanglg * @Desc 修改房型比价状态 */ public function actionRoomStatus() { $post = Yii::$app->request->post(); if (!(isset($post['id']) && isset($post['op']))) { $data['code'] = 2; } $pcr = PriceComparedRoom::findOne(['ID' => $post['id']]); $update['cancel_flag'] = $post['op'] == 'set' ? 0 : 1; if ($pcr->load($update, '') && $pcr->validate()) { if (!$pcr->save()) { $data['code'] = 1; } else { $data = 0; } } echo json_encode($data); } /** * 添加比价酒店 */ public function actionAddComparedHotel() { $model = new PriceComparedHotel(); $sync_model = new SyncPriceComparedHotel(); $transaction = Yii::$app->db->beginTransaction(); $request = Yii::$app->request->post(); try { if ($model->load($request) && $model->validate()) { if (!$model->save()) { throw new \Exception(); } } else { throw new \Exception(); } $new_request = array('ChannelHotelId' => $request['PriceComparedHotel']['ChannelHotelId'], 'HotelId' => $request['PriceComparedHotel']['HotelId'], 'ChannelId' => $request['PriceComparedHotel']['ChannelId'],); if ($sync_model->load($new_request, '') && $sync_model->validate()) { if (!$sync_model->save()) { throw new \Exception(); } } else { throw new \Exception(); } $transaction->commit(); Yii::$app->session->setFlash('success', "添加比价酒店成功!"); // return ''; // echo ''; } catch (\Exception $e) { $transaction->rollBack(); Yii::$app->session->setFlash('error', "添加比价酒店失败!"); $hotel_list = $model->getHotelList(); return $this->renderPartial('base', ['view' => '_addHotel', 'data' => ['hotel_list' => $hotel_list, 'model' => $model]]); } return $this->redirect('/hotel/compare-price/index'); } /** * @author wanglg * 添加比价房型 */ public function actionAddComparedRoom() { $model = new PriceComparedRoom(); $request = Yii::$app->request->post(); if ($model->load($request) && $model->validate()) { if (!$model->save()) { Yii::$app->session->setFlash('error', "添加比价房型失败!"); } else { // return ''; Yii::$app->session->setFlash('success', "添加比价房型成功!"); } } else { $room = new OperaHotelRoom(); $base_room = new OperaHotelBaseRoom(); $base_list = $base_room->getHotelBaseRoom($request['PriceComparedRoom']['hotel_id']); $base_room_id = isset($base_room_id) ? $base_room_id : $base_list[0]->MAIN_ID; $room_list = $room->getAllRoom($request['PriceComparedRoom']['hotel_id'], $base_room_id); return $this->renderPartial('_form', ['data' => ['model' => $model, 'room_list' => $room_list, 'base_room' => $base_room, 'hotel_id' => $request['PriceComparedRoom']['hotel_id'], 'base_list' => $base_list]]); } return $this->redirect('/hotel/compare-price/room-compared?hotel_id=' . $request['PriceComparedRoom']['hotel_id'] . '&channel_id=' . $request['PriceComparedRoom']['channel_id']); } /** * @author wanglg * 修改比价房型信息 * @return \yii\web\Response */ public function actionUpdateComparedRoom() { $request = Yii::$app->request->post(); $model = PriceComparedRoom::findOne($request['PriceComparedRoom']['ID']); if ($model->load($request) && $model->validate()) { if (!$model->save()) { Yii::$app->session->setFlash('error', "修改比价房型失败!"); } else { Yii::$app->session->setFlash('success', "修改比价房型成功!"); } } return $this->redirect('/hotel/compare-price/room-compared?hotel_id=' . $request['PriceComparedRoom']['hotel_id'] . '&channel_id=' . $request['PriceComparedRoom']['channel_id']); } /** * @author wanglg * @return string */ public function actionAddComparedHotelView() { // 不需要参数,直接查询所有未添加的酒店 $model = new PriceComparedHotel(); $hotel_list = $model->getHotelList(); return $this->renderPartial('base', ['view' => '_addHotel', 'data' => ['hotel_list' => $hotel_list, 'model' => $model]]); } /** * @author wanglg * 添加比价房型弹框显示 */ public function actionAddComparedRoomView() { $model = new PriceComparedRoom(); $hotel_id = Yii::$app->request->get('hotel_id'); $base_room = new OperaHotelBaseRoom(); $base_list = $base_room->getHotelBaseRoom($hotel_id); $room = new OperaHotelRoom(); if (!isset($hotel_id)) { if (Yii::$app->request->isPjax && Yii::$app->request->post('base_room_id')) { $base_room_id = Yii::$app->request->post('base_room_id'); $hotel_id = Yii::$app->request->post('hotel_id'); } } $base_room_id = isset($base_room_id) ? $base_room_id : $base_list[0]->MAIN_ID; $room_list = $room->getAllRoom($hotel_id, $base_room_id); return $this->renderPartial('_form', ['data' => ['action' => 'add', 'model' => $model, 'room_list' => $room_list, 'base_room' => $base_room, 'hotel_id' => $hotel_id, 'base_list' => $base_list]]); } /** * @author wanglg * @return bool|string */ public function actionUpdateComparedRoomView() { $id = Yii::$app->request->get('id'); $hotel_id = Yii::$app->request->get('hotel_id'); if (empty($hotel_id) || empty($id)) { return false; } $model = PriceComparedRoom::findOne($id); // 根据子房型查询基础房型id $parent_room = OperaHotelRoom::findOne($model->room_id); //根据基础房型id查询该基础房型id $parent_room_id = OperaHotelBaseRoom::findOne($parent_room->PARENT_ROOM_TYPE); $base_room = new OperaHotelBaseRoom(); $base_list = $base_room->getHotelBaseRoom($hotel_id); if (!isset($hotel_id)) { if (Yii::$app->request->isPjax && Yii::$app->request->post('base_room_id')) { $base_room_id = Yii::$app->request->post('base_room_id'); $hotel_id = Yii::$app->request->post('hotel_id'); } } $room = new OperaHotelRoom(); $base_room_id = isset($base_room_id) ? $base_room_id : $parent_room->PARENT_ROOM_TYPE; $room_list = $room->getAllRoom($hotel_id, $base_room_id); return $this->renderPartial('_form', ['data' => ['action' => 'update', 'model' => $model, 'room_list' => $room_list, 'base_room' => $parent_room_id, 'hotel_id' => $hotel_id, 'base_list' => $base_list]]); } /** * User:Steven * Desc:获取代理IP 快代理 * @return bool */ public function actionGetProxys() { //获取目前可用的IP个数 $max_count = 300; //限制数据库 $model = new CtripHotelPrice(); $count = $model->getAbleProxyCount(); if ($count[0]['count'] >= $max_count) { return false; } $i = 0; $url = "http://ent.kuaidaili.com/api/getproxy/?orderid=990424805960893&num=300&b_pcchrome=1&b_pcie=1&b_pcff=1&protocol=1&method=1&an_an=1&an_ha=1&sp1=1&quality=2&format=json&sep=1"; $res = Utils::http_get($url); $res = json_decode($res['content'], true); if ($res['code'] == 0) { foreach ($res['data']['proxy_list'] as $item) { if ($i >= ($max_count - $count[0]['count'])) { return false; } //这里验证代理IP的有效性 $code = $this->GetHttpStatusCode($item); if ($code == 200) { $i++; $model->addProxyIp($item); } } } } /** * User:Steven * Desc:定时统计房型未展示、价格有劣势的酒店房型统计数据,并通知到酒店运营 */ public function actionCronPriceWarning() { $ctripHotelPrice = new CtripHotelPrice(); $res = $ctripHotelPrice->getDirectHotel(); foreach ($res as $item) { $ctrip_data = $ctripHotelPrice->getCtripData($item['HOTEL_ID']); if (empty($ctrip_data)) { continue; } // $price_conversion = $ctripHotelPrice->getHotelConversion($item['HOTEL_ID']); $rs = $this->ctripDataService($ctrip_data, $item['HOTEL_ID']); //这里返回的数据是:1、价格有劣势的 2:价格未显示的 foreach ($rs as $key => $value) { $room_analysis = ''; $flag = false; foreach ($value as $k => $v) { // $k if (empty($v)) { continue; } $inferiority = 0;//劣势房型 $no_show = 0;//未展示房型 foreach ($v as $k1 => $v1) { if (!is_null($v1['a_price']) && !is_null($v1['b_price'])) { //劣势 $flag = true; $inferiority++; } elseif (!is_null($v1['a_price']) && is_null($v1['b_price'])) { $flag = true; $no_show++; } } if ($inferiority != 0 || $no_show != 0) { $str = str_replace(array("\r\n", "\r", " ", "\n"), "", $k); $room_analysis .= '● ' . preg_replace('/^([^\d]+).*/', '$1', $str) . ': 价格劣势天数:' . $inferiority . '; 未露出天数:' . $no_show . "\n"; } } } if ($flag) { $url = "http://cs1.zhizhuchuxing.com/hotel/compare-price/compare-price?HOTEL_ID=" . $item['HOTEL_ID']; $msg = '【' . $item['HOTEL_NAME'] . '】' . '\n' . $room_analysis . '复制在浏览器中打开:' . Msg::sinaShortenUrl($url); //TODO:给运营发送消息通知 if ($item['SendMsg'] == 1) { $arr = array("agentid" => 1000002, "title" => 'Ctrip渠道比价结果预警:', "msg" => $msg, "touser" => $item['user_name']); // "touser" => 'shifp'); zOfficeWechat::sendMsg($arr); } } } } /** * User:Steven * Desc:提取字符串中的数字 * @param $string * @return bool|string */ function findNumber($string) { if (!is_string($string) || empty($string)) { return ''; } for ($i = 0; $i < strlen($string); $i++) { $char = substr($string, $i, 1); if (ctype_digit($char)) { return substr($string, 0, $i); } } return ''; } /** * Author:Steven * Desc:比价数据处理 * @param $ctrip_data * @param $price_conversion * @param $flag 是否折算价差 * @return array */ public function ctripDataService($ctrip_data, $HOTEL_ID, $flag = true) { //查询当前有直连关系的房型ID $ctripHotelPrice = new CtripHotelPrice(); $room_arr = $ctripHotelPrice->getRelationRoom($ctrip_data[0]['spider_hotel_id']); $room_list = []; foreach ($room_arr as $room) { $room_list[] = $room['channel_room_id']; } //a_表示携程 b_表示蜘蛛 $arr = array(); if ($flag) { $ctripHotelPrice = new CtripHotelPrice(); $price_conversion = $ctripHotelPrice->getHotelConversion($HOTEL_ID); $price_conversion = $price_conversion[0]; } foreach ($ctrip_data as $item) { $spider_price = $item['b_price']; $ctrip_price = $item['a_price']; $origin_spider_price = $item['b_price']; //用于记录没有折算价差的时候的价格 $origin_ctrip_price = $item['a_price']; if ($flag) {//携程价格折算 $remain_room_conversion = isset($price_conversion['remain_room_conversion']) ? $price_conversion['remain_room_conversion'] : 0; $breakfast_conversion = isset($price_conversion['breakfast_conversion']) ? $price_conversion['breakfast_conversion'] : 0; $cancel_rules_conversion = isset($price_conversion['cancel_rules_conversion']) ? $price_conversion['cancel_rules_conversion'] : 0; $pay_type_conversion = isset($price_conversion['pay_type_conversion']) ? $price_conversion['pay_type_conversion'] : 0; //早餐(非早餐类型的早餐折算) 以我们的价格为基数,加上或者减去早餐数之差*价差 $ctrip_breakfast = $this->calBreakfastLevel($item['a_breakfast']); $spider_breakfast = $this->calBreakfastLevel($item['b_breakfast']); $spider_price = $spider_price - ($spider_breakfast - $ctrip_breakfast) * $breakfast_conversion; //别墅类型的早餐折算 $ctrip_breakfast1 = $this->calbreakfast1($item['a_breakfast']); $spider_breakfast2 = $this->calbreakfast1($item['b_breakfast']); $ctrip_person = $this->number($item['a_room_person']); $spider_person = $this->number($item['b_room_person']); $spider_price = $spider_price + ($spider_breakfast2 * $spider_person - $ctrip_breakfast1 * $ctrip_person) * $breakfast_conversion; //现预付 蜘蛛是预付 if ($item['a_payment_txt'] == '到店付' || $item['a_payment_txt'] == '担保') {//现付 $ctrip_price = $ctrip_price - $pay_type_conversion; } //保留房 $item['a_confirm_info'] == '立即确认' ? '' : $ctrip_price = $ctrip_price + $remain_room_conversion; $item['b_confirm_info'] == '立即确认' ? '' : $spider_price = $spider_price + $remain_room_conversion; //取消规则 $item['a_room_policy'] == '免费取消' ? '' : $ctrip_price = $ctrip_price + $cancel_rules_conversion; $item['b_room_policy'] == '免费取消' ? '' : $spider_price = $spider_price + $cancel_rules_conversion; } if ($spider_price > $ctrip_price || is_null($item['b_price'])) { //蜘蛛价格为null时,即价格未在携程前台显示 $room_type = preg_replace('/^([^\d]+).*/', '$1', str_replace(array("\r\n", "\r", " ", "\n"), "", $item['room_type'])); $arr[$item['spider_hotel_id']][$room_type][$item['start_date']] = array( 'a_bed_type' => $item['a_bed_type'], 'b_bed_type' => $item['b_bed_type'], 'a_breakfast' => $item['a_breakfast'], 'b_breakfast' => $item['b_breakfast'], 'a_room_policy' => $item['a_room_policy'], 'b_room_policy' => $item['b_room_policy'], 'a_confirm_info' => $item['a_confirm_info'], 'b_confirm_info' => $item['b_confirm_info'], 'a_supply_id' => $item['a_supply_id'], 'a_showdow_id' => $item['a_showdow_id'], 'a_payment_txt' => $item['a_payment_txt'], 'b_payment_txt' => $item['b_payment_txt'], 'a_room_person' => $item['a_room_person'], 'b_room_person' => $item['b_room_person'], 'a_price' => $item['a_price'], 'b_price' => $item['b_price'], 'b_son_room_id' => $item['son_room_id'], 'inferiority' => 2, ); if (($origin_spider_price < $origin_ctrip_price) && !is_null($item['b_price'])) { //这种属于竞争力不足 $arr[$item['spider_hotel_id']][$room_type][$item['start_date']]['inferiority'] = 3; } //判断当前房型是不是直连的房型 if (!in_array($item['son_room_id'], $room_list)) { unset($arr[$item['spider_hotel_id']][$room_type][$item['start_date']]); } } } //当某个房型下所有的日期,蜘蛛的数据都是空的,表明我们没有合作此房型 foreach ($arr as $itmem_k => $item) { foreach ($item as $key => $value) { $i = 0; foreach ($value as $k => $v) { if (is_null($v['b_price'])) { $i++; if ($i == count($value)) { unset($arr[$itmem_k][$key]); } } } } } return $arr; } /** * User:Steven * Desc:计算早餐级别 * @param $breakfast * @return int */ public function calBreakfastLevel($breakfast) { switch ($breakfast) { case '无早': $breakfast_level = 0; break; case '每天单早': $breakfast_level = 1; break; case '每天双早': $breakfast_level = 2; break; case '每天三早': $breakfast_level = 3; break; case '每天四早': $breakfast_level = 4; break; case '每天五早': $breakfast_level = 5; break; case '每天六早': $breakfast_level = 6; break; case '每天七早': $breakfast_level = 7; break; case '每天八早': $breakfast_level = 8; break; case '每天九早': $breakfast_level = 9; break; case '每天十早': $breakfast_level = 10; break; default: $breakfast_level = 0; break; } return $breakfast_level; } /** * User:Steven * Desc:对于别墅类型的房,计算早餐个数的时候需要考虑到入住人数 * @param $breakfast * @return int|string */ public function calbreakfast1($breakfast) { $arr = array(1 => '一', 2 => '二', 3 => '三', 4 => '四', 5 => '五', 6 => '六', 7 => '七', 8 => '八', 9 => '九', 10 => '十', 11 => '十一', 12 => '十二'); foreach ($arr as $k => $v) { if ($breakfast == '每天每人' . $v . '份早') { return $k; } else { return 0; } } } /** * User:Steven * Desc:获取字符串中的数字部分 * @param $str * @return mixed */ public function number($str) { return preg_replace('/\D/s', '', $str); } public function GetHttpStatusCode($proxy) { $curl = curl_init(); curl_setopt($curl, CURLOPT_PROXY, $proxy);//使用代理访问 curl_setopt($curl, CURLOPT_URL, "http://www.baidu.com");//获取内容url curl_setopt($curl, CURLOPT_HEADER, 1);//获取http头信息 curl_setopt($curl, CURLOPT_NOBODY, 1);//不返回html的body信息 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//返回数据流,不直接输出 curl_setopt($curl, CURLOPT_TIMEOUT, 5); //超时时长,单位秒 curl_exec($curl); $rtn = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); return $rtn; } } ?>