[ 'class' => AccessControl::className(), 'rules' => [ [ 'ips' => ['127.0.0.1', '106.14.56.77', '180.168.4.58', '139.224.30.29', '103.214.68.209' //蜘蛛IP访问白名单 ], 'allow' => true, ], ], ],*/ 'contentNegotiator' => [ 'class' => ContentNegotiator::className(), 'formats' => [ 'application/xml' => Response::FORMAT_JSON, ], // 'only' => ['index'],//指定只是针对于index有效 'except' => ['city-hotel-list', 'get-city-byid', 'basicroomview'] //除去部分需要渲染页面的action ], ]; } /** * Notes: * User: Steven * Date: 2018/4/16 * Time: 18:38 * @param $action * @return bool * @throws yii\web\BadRequestHttpException */ /* public function beforeAction($action) { //如果传入的是json串,由于在main中配置了JsonParser,所以接收到的json串都会转成数组 因此,这个控制器中的方法,接受json和数组都行 if (Yii::$app->request->isPost) { $this->request_params = empty(Yii::$app->request->post()) ? [] : Yii::$app->request->post(); } return parent::beforeAction($action); }*/ /** * Notes:获取国家列表 * User: Steven * Date: 2018/4/19 * Time: 15:22 * @return mixed * @throws yii\db\Exception */ public function actionGetdltcountrylist() { $model = new CtripSwitch(); $data = [ 'supplierID' => (int)$model->ctripConf['switch_supplier_id'], ]; $res = $model->request(Yii::$app->controller->action->id, $data); if ($res->resultStatus->resultCode == 0) { $table_key = ['create_user_id', 'create_time', 'update_user_id', 'update_time', 'cancel_flag', 'country_id', 'country_name']; foreach ($res->countryInfoList->countryInfo as $value) { $table_value[] = [Yii::$app->params['systemUser'], date('Y-m-d H:i:s'), Yii::$app->params['systemUser'], date('Y-m-d H:i:s'), 0, $value->countryID, $value->countryName]; } $count = $model->batchInsert(CtripCountryList::tableName(), $table_key, $table_value); return $count; } else { return $res->resultStatus; } } /** * Notes:获取城市列表 * User: Steven * Date: 2018/4/19 * Time: 17:09 * @param int $countryID * @return array|int * @throws yii\db\Exception */ public function actionGetdltcitylist($countryID = 1) { $model = new CtripSwitch(); $current_page = 1; $cityInfoList = []; $exist_city_list = CtripCityList::findOne(['country_id' => $countryID]); if (!empty($exist_city_list)) { return true; } do { $data = [ 'searchCandidate' => [ 'countryID' => $countryID, ], 'pagingSettings' => [ 'pageSize' => 100, 'currentPageIndex' => $current_page, ], 'supplierID' => (int)$model->ctripConf['switch_supplier_id'], ]; $res = $model->request(Yii::$app->controller->action->id, $data); if ($res->resultStatus->resultCode == 0) { $cityInfoList = array_merge($cityInfoList, $res->cityInfoList->cityInfo); } else { return $res->resultStatus; } $current_page++; } while ($res->resultStatus->resultCode == 0 && !empty($res->cityInfoList->cityInfo)); $table_key = ['create_user_id', 'create_time', 'update_user_id', 'update_time', 'cancel_flag', 'city_id', 'city_name', 'city_code', 'province_id', 'province_name', 'country_id']; foreach ($cityInfoList as $value) { $table_value[] = [ Yii::$app->params['systemUser'], date('Y-m-d H:i:s'), Yii::$app->params['systemUser'], date('Y-m-d H:i:s'), 0, $value->cityID, $value->cityName, $value->cityCode, $value->provinceID, $value->provinceName, $value->countryID, ]; } $count = $model->batchInsert(CtripCityList::tableName(), $table_key, $table_value); return $count; } /** * Created by PhpStorm. * NOTES:获取某个城市的酒店列表 * User: Steven * Date: 2018/4/20 * Time: 14:03 * Class actionGetdltmasterhotellist * @param city_id :城市id * @return mixed * @throws yii\db\Exception */ public function actionGetdltmasterhotellist() { $model = new CtripSwitch(); $request = Yii::$app->request->get(); if (!preg_match('/^[0-9]+$/', $request['city_id']) || empty($request['city_id'])) { return ['code' => CtripSwitch::PARAM_ERR0R, 'msg' => CtripSwitch::RETURN_MSG[CtripSwitch::PARAM_ERR0R]]; } $current_page = 1; $table_key = ['create_user_id', 'create_time', 'update_user_id', 'update_time', 'cancel_flag', 'city_id', 'city_name', 'hotel_name', 'master_hotel_id', 'can_add_hotel', 'hotel_phone', 'hotel_star', 'star_licence', 'hotel_address', 'hotel_address_en', 'glat', 'glng', 'gDlat', 'gDlng', 'bDlat', 'bDlng']; $tran = Yii::$app->db->beginTransaction(); try { do { $data = [ 'supplierID' => $model->ctripConf['switch_supplier_id'], 'cityID' => (int)$request['city_id'], 'pager' => [ 'pageSize' => 200, 'pageIndex' => $current_page, 'isReturnTotalCount' => true, ], ]; $res = $model->request('getdltmasterhotellist', $data); $total_page = $res->pager->totalPages; // 总页数 if ($res->resultStatus->resultCode == 0) { /*if(empty($res->dltMasterHotelEntityList)){ return json_encode(['code' => -1, 'msg' => '该城市下没有酒店信息']); }*/ $table_value = []; foreach ($res->dltMasterHotelEntityList as $value) { $table_value[] = [ Yii::$app->params['systemUser'], date('Y-m-d H:i:s'), Yii::$app->params['systemUser'], date('Y-m-d H:i:s'), 0, $value->cityID, $value->cityName, $value->hotelName, $value->masterHotelID, $value->canAddHotel == 'T' ? 1 : 0, $value->hotelPhone, $value->hotelStar, $value->starLicence == 'T' ? 1 : 0, $value->hotelAddress, $value->hotelAddressEn, $value->dltCoordinateEntity->glat, $value->dltCoordinateEntity->glng, $value->dltCoordinateEntity->gDlat, $value->dltCoordinateEntity->gDlng, $value->dltCoordinateEntity->bDlat, $value->dltCoordinateEntity->bDlng, ]; } // 分批插入数据 $insert_res = $model->batchInsert(CtripHotelList::tableName(), $table_key, $table_value); if ($insert_res <= 0) { throw new \Exception($model::ADD_HOTEL_ERR); } } else { throw new \Exception($model::GET_MASTER_HOTEL_ERR); } $current_page++; } while ($res->resultStatus->resultCode == 0 && $current_page <= $total_page); $tran->commit(); } catch (\Exception $e) { $tran->rollBack(); return ['code' => $e->getMessage(), 'msg' => $model::RETURN_MSG[$e->getMessage()]]; } return $res; } /** * Created by PhpStorm. * NOTES:层级联动,通过国家获取国家下面的城市 * User: Steven * Date: 2018/4/20 * Time: 16:58 * Class actionGetCityByid * @param $country_id */ public function actionGetCityByid($country_id) { $model = new CtripCityList(); $model = $model::getCity($country_id); echo Html::tag('option', '--请选择区--', ['value' => 'empty', 'class' => 'select_screen']); foreach ($model as $value => $name) { echo Html::tag('option', Html::encode($name), array('value' => $value)); } } /** * Created by PhpStorm. * NOTES:创建子酒店 多次调用该接口并给传入同一母酒店,也会返回创建成功,但是hotelIDs返回空值 * User: Steven * Date: 2018/4/23 * Time: 13:35 * Class actionCreateSubHotel * @param array $params * @return array * @throws Exception */ public function actionCreatesubhotel(array $params = []) { $model = new CtripSwitch(); $request = empty($params) ? Yii::$app->request->post() : $params; if (empty($request['hotels'])) { return ['code' => $model::MASTER_HOTEL_EMPTY, 'msg' => $model::RETURN_MSG[$model::MASTER_HOTEL_EMPTY]]; } $master_hotel_id = $request['hotels']; $data = [ 'supplierID' => (int)$model->ctripConf['switch_supplier_id'], 'masterHotelIDs' => [(int)$master_hotel_id], //母酒店的ID, ]; $res = $model->request(Yii::$app->controller->action->id, $data); if ($res->resultStatus->resultCode === 0) { // 如果创建成功但未返回子酒店id说明已经添加过子酒店 if (empty($res->hotelIDs[0])) { return ['code' => CtripSwitch::REPEAT_CREATE, 'msg' => CtripSwitch::RETURN_MSG[CtripSwitch::REPEAT_CREATE]]; } $sub_hotels = $res->hotelIDs[0]; $channel_arr = [Yii::$app->params['ctrip']['supplier_id'], Yii::$app->params['qunar']['supplier_id'], Yii::$app->params['elong']['supplier_id'], Yii::$app->params['channela']['supplier_id'], Yii::$app->params['b2b']['supplier_id']]; // 关联酒店酒店操作需要同时在本地生成5个相关渠道的关联记录,因为同一个母酒店只有第一次新增子酒店返回子酒店id,如果不同时新增,其他渠道需要关联时无法获取子酒店id $tran = Yii::$app->db->beginTransaction(); try { $model = new ChannelHotelMapping(); foreach ($channel_arr as $item) { $cmodel = clone $model; $save_hotel_info = [ 'master_hotel_id' => $master_hotel_id, 'sub_hotel_id' => $sub_hotels, 'hotel_id' => $request['cs_hotel_id'], 'channel_id' => $item, ]; if (!($cmodel->load($save_hotel_info, '') && $cmodel->validate())) { throw new \Exception(); } if (!$cmodel->save()) { throw new \Exception(); } } // 将已创建过子酒店的母酒店可添加子酒店属性修改为不可添加 $update_res = CtripHotelList::updateAll(['can_add_hotel' => 0], ['master_hotel_id' => $master_hotel_id]); if (!$update_res) { throw new \Exception(); } $tran->commit(); } catch (\Exception $e) { $tran->rollBack(); return ['code' => CtripSwitch::SYS_ERR0R, 'msg' => CtripSwitch::RETURN_MSG[CtripSwitch::SYS_ERR0R]]; } } else { return ['code' => CtripSwitch::CTRIP_HOTEL_CODE, 'msg' => CtripSwitch::RETURN_MSG[CtripSwitch::CTRIP_HOTEL_CODE]]; } return ['code' => CtripSwitch::SUCCESS_CODE, 'msg' => CtripSwitch::RETURN_MSG[CtripSwitch::SUCCESS_CODE]]; } /** * Created by PhpStorm. * NOTES:获取子酒店接口 * User: Steven * Date: 2018/4/23 * Time: 13:41 * @param $child_hotel_id :子酒店id 可以不传,不传查询所有子酒店信息 * Class actionGetSubHotel * @return mixed */ public function actionGetdlthotellist() { $model = new CtripSwitch(); $request = Yii::$app->request->post(); $current_page = 1; $data = [ 'supplierID' => (int)$model->ctripConf['switch_supplier_id'], 'pager' => [ 'pageSize' => 200, 'pageIndex' => $current_page, 'isReturnTotalCount' => true, ], ]; if (!empty($request['child_hotel_id'])) { $data['hotelID'] = (int)$request['child_hotel_id']; } $res = $model->request(Yii::$app->controller->action->id, $data); if ($res->resultStatus->resultCode === 0) { return $res->dltHotelEntityList; } else { return $res->resultStatus; } } /** * Created by PhpStorm. * NOTES:获取母物理房型列表 * User: Steven * Date: 2018/4/23 * Time: 15:53 * Class actionGetdltbasicroomlist * @return bool */ public function actionGetdltbasicroomlist() { $model = new CtripSwitch(); $request = Yii::$app->request->get(); $data = [ 'supplierID' => (int)$model->ctripConf['switch_supplier_id'], 'hotelID' => (int)$request['child_hotel_id'], // 子酒店id ]; $res = $model->request(Yii::$app->controller->action->id, $data); if ($res->resultStatus->resultCode === 0) { //todo:保存,相当于mapping // $model = new ChannelBaseRoomMapping(); // $model_param = [ // 'create_time' => date('Y-m-d H:i:s'), // 'create_user_id'=>Yii::$app->user->id, // 'channel_id'=>Yii::$app->params['ctrip']['supplier_id'], // 'master_hotel_id'=>$res->dltBasicRoomTypeEntityList->hotelId, // 'sub_hotel_id', // 'hotel_id', // 'master_base_room_id'=>$res->dltBasicRoomTypeEntityList->masterBasicRoomId, // 'master_base_room_name'=>$res->dltBasicRoomTypeEntityList->basicRoomName, // 'master_base_room_name_en'=>$res->dltBasicRoomTypeEntityList->basicRoomNameEn, // 'base_room_is_add'=>$res->dltBasicRoomTypeEntityList->isAdd=='T'?'1':'0' // ]; // if ($model->load($model_param, '') && $model->validate()) { // $model->save(); // } return $res->dltBasicRoomTypeEntityList; /*[ //返回示例 { "hotelID": 4963549, "masterBasicRoomId": 17607148, "basicRoomTypeID": 17607148, "basicRoomName": "欧式阳光房", "basicRoomNameEn": "", "isAdd": "F" }, { "hotelID": 4963549, "masterBasicRoomId": 17607157, "basicRoomTypeID": 17607157, "basicRoomName": "特价标准房(无窗)", "basicRoomNameEn": "特价标准房(无窗)", "isAdd": "F" }, { "hotelID": 4963549, "masterBasicRoomId": 17607143, "basicRoomTypeID": 17607143, "basicRoomName": "豪华套房", "basicRoomNameEn": "", "isAdd": "F" }, { "hotelID": 4963549, "masterBasicRoomId": 17607152, "basicRoomTypeID": 17607152, "basicRoomName": "阳光大床房", "basicRoomNameEn": "", "isAdd": "F" }, { "hotelID": 4963549, "masterBasicRoomId": 17607154, "basicRoomTypeID": 17607154, "basicRoomName": "普通标准房", "basicRoomNameEn": "", "isAdd": "F" } ]*/ } else { return $res->resultStatus; } } /** * @Author wanglg * @Desc 创建子物理房型 * @return bool */ public function actionCreatebasicroom() { $model = new CtripSwitch(); $request = Yii::$app->request->get(); $data = [ 'supplierId' => (int)$model->ctripConf['switch_supplier_id'], 'updator' => Yii::$app->user->identity->TRUE_NAME, 'masterHotelId' => (int)$request['master_hotel_id'], 'childHotelId' => (int)$request['child_hotel_id'], 'masterBasicRoomIds' => array_map('intval', $request['master_basic_room_ids']), 'opClientIP' => '127.0.0.1', 'currency' => 'CNY', ]; $res = $model->request(Yii::$app->controller->action->id, $data); if ($res->reultStatus->resultCode === 0) { return $res->resultStatus; } else { return $res->resultStatus; } } /** * @Author wanglg * @Desc 获取房型静态信息 * @return bool */ public function actionGethotelroomstaticinfo() { $model = new CtripSwitch(); $request = Yii::$app->request->get(); $data = [ 'supplierId' => (int)$model->ctripConf['switch_supplier_id'], 'hotelId' => (int)$request['hotel_id'], 'returnDataTypeList' => [ 'BasicRoomTypeSimpleEntity', 'BasicRoomTypeSmokeInfoEntity', 'BasicRoomTypeFacilityEntityList', 'RoomTypeSimpleEntity', 'RoomTypeBedTypeEntity', 'RoomTypeBroadnNetEntity', 'SupplierInfoEntity', ], ]; $res = $model->request(Yii::$app->controller->action->id, $data); if ($res->reultStatus->resultCode === 0) { return $res->roomStaticInfos->roomStaticInfo; } else { return $res->roomStaticInfos->roomStaticInfo; } } /** * Created by PhpStorm. * NOTES:设置售卖房型的上下线, * 使用:该接口在CS系统中: * 1、房型渠道授权开关的开关的时候调用; * 2、子房型(非渠道维度)下线房型也应该调用该接口(待确认) 授权开:表示上线 授权关:表示下线 * User: Steven * Date: 2018/4/27 * Time: 15:42 * Class actionSetroomonlineoffline * @return mixed */ public function actionSetroomonlineoffline() { $model = new CtripSwitch(['scenario' => 'setRoomOnlineOffline']); if (!$model->load(Yii::$app->request->get(), '') || !$model->validate()) { return ['Message' => $model->getFirstErrors(), 'ResultCode' => '-116']; } //验证是否直连 $ismapping = $model->isMapping($model->zz_hotel_id, $model->zz_room_id, $model->zz_channel_id); if ($ismapping['code'] != CtripSwitch::SUCCESS_CODE) { return true; //不需要推送数据 } //需要子房型ID和渠道ID $OperaRoomDistrib = new OperaRoomDistrib(); $model_data = $OperaRoomDistrib->getRoomDistrib($model->zz_room_id, $model->zz_channel_id); $request = Yii::$app->request->get(); $data = [ 'supplierId' => (int)$model->supplierID, 'hotelId' => (int)$ismapping['data']['sub_hotel_id'], 'roomTypeId' => (int)$model_data->CHANNEL_MAPPING_ID, //售卖房型 'channel' => $model->getChannelID($model->zz_channel_id), //分销渠道 Ctrip,Qunar,Elong,ChannelA(分销A),B2B 'roomStatus' => (int)$model->roomStatus //状态:0 下线,1 上线,2 无效 ]; $res = $model->request(Yii::$app->controller->action->id, $data); if ($res->resultStatus->resultCode === 0) { return $res->resultStatus; } else { return $res->resultStatus; } } /** * Created by PhpStorm. * NOTES:更改售卖房型渠道名称 * User: Steven * Params: * Date: 2018/4/27 * Time: 16:30 * Class actionUpdateroomsalename * @return mixed */ public function actionUpdateroomsalename() { $model = new CtripSwitch(['scenario' => 'updateRoomSaleName']); if (!$model->load(Yii::$app->request->get(), '') || !$model->validate()) { return ['Message' => $model->getFirstErrors(), 'ResultCode' => '-116']; } //验证是否直连 $ismapping = $model->isMapping($model->zz_hotel_id, $model->zz_room_id, $model->zz_channel_id); if ($ismapping['code'] != CtripSwitch::SUCCESS_CODE) { return true; //不需要推送数据 } //需要子房型ID和渠道ID $OperaRoomDistrib = new OperaRoomDistrib(); $model_data = $OperaRoomDistrib->getRoomDistrib($model->zz_room_id, $model->zz_channel_id); $channel_name = $model->zz_channel_id == CtripSwitch::CTRIP_ID ? 'ctripName' : ( $model->zz_channel_id == CtripSwitch::QUNAR_ID ? 'qunarRatePlanName' : ( $model->zz_channel_id == CtripSwitch::ELONG_ID ? 'eLongRatePlanName' : ( $model->zz_channel_id == CtripSwitch::CHANNELA_ID ? 'channelARatePlanName' : 'b2bRatePlanName'))); $data = [ 'supplierId' => (int)$model->supplierID, 'hotelId' => (int)$model->$ismapping['data']['sub_hotel_id'], 'roomTypeId' => (int)$model_data->CHANNEL_MAPPING_ID, ]; $data[$channel_name] = $model_data->DISTRIB_ROOM_NAME; $res = $model->request(Yii::$app->controller->action->id, $data); if ($res->resultStatus->resultCode === 0) { return $res->resultStatus; } else { return $res->resultStatus; } } /** * Created by PhpStorm. * NOTES:设置渠道库存房态共享 * 跟业务(杨晓婷)沟通后,得出结论先不做共享,默认是非共享的 * User: Steven * Date: 2018/4/28 * Time: 15:07 * Class actionSetroomshare * @return mixed */ public function actionSetroomshare() { $model = new CtripSwitch(); $request = Yii::$app->request->get(); $data = [ 'supplierId' => (int)$model->ctripConf['switch_supplier_id'], 'hotelId' => (int)$request['hotel_id'], 'roomId' => (int)$request['room_type_id'], // 售卖房型id 'shareType' => 'RoomInventory', // RoomInventory:库存,RoomStatus:房态 'isShare' => true, // 是否共享 'baseChannel' => 'ctrip' // 共享渠道 Ctrip,Qunar,Elong,ChannelA,B2B ]; $res = $model->request(Yii::$app->controller->action->id, $data); if ($res->resultStatus->resultCode === 0) { return $res; } else { return $res->resultStatus; } } /** * @Author: wanglg * @DESC:创建售卖房型 * @return mixed */ public function actionCreateroom() { $model = new CtripSwitch(); $data = [ 'supplierId' => (int)$model->ctripConf['switch_supplier_id'], 'hotelId' => 11337705, 'basicRoomTypeId' => 55334003, // 子物理房型 'purchaseSourceID' => 0, 'rateCodePropertyValueIDList' => [8, 4], 'priceType' => 2, 'mealType' => 7, 'mealCount' => 1, ]; $res = $model->request(Yii::$app->controller->action->id, $data); if ($res->resultStatus->resultCode === 0) { return $res; } else { return $res->resultStatus; } } /** * Notes:订单预定 * User: Steven * Date: 2018/5/11 * Time: 13:06 * @param $order_info * @return array * @throws Exception */ private function bookOrder($order_info) { $supplier_id = CtripSwitch::SupplierDict($order_info['dltOrderInfo']['channel']); $mapping_info = CtripSwitch::getZzIDByCtripID($supplier_id, $order_info['dltOrderInfo']['roomId']); if (empty($mapping_info)) { return ['code' => CommonOrder::RETURN_CODE_MAPPING_FAIL, 'msg' => CommonOrder::RETURN_MSG[CommonOrder::RETURN_CODE_MAPPING_FAIL]]; } $room_price_list = []; foreach ($order_info['dltOrderInfo']['roomPriceList'] as $tmp_room_price) { $room_price_list[] = [ 'RunDate' => self::FormatDate($tmp_room_price['effectDate']), 'Price' => $tmp_room_price['price'], ]; } $params = [ 'CreateUserID' => Yii::$app->params['ctrip']['base_user_id'], 'OrderID' => $order_info['dltOrderInfo']['orderId'], //销售方订单号 'HotelID' => $mapping_info['HOTEL_ID'], 'RoomID' => $mapping_info['ROOM_ID'], 'DistribID' => $supplier_id, 'RoomNum' => $order_info['dltOrderInfo']['roomnum'], 'CheckIn' => self::FormatDate($order_info['dltOrderInfo']['checkinDate']), 'CheckOut' => self::FormatDate($order_info['dltOrderInfo']['checkoutDate']), 'TotalPrice' => $order_info['dltOrderInfo']['orderPrice'], 'Currency' => 'RMB', 'ContactName' => $order_info['dltOrderInfo']['customerName'], 'ContactTel' => '', 'PayType' => CommonOrder::PAY_TYPE_CREDIT, 'PayTradeNo' => '', 'OrderGuests' => [ 0 => [ 'Name' => $order_info['dltOrderInfo']['customerName'], ] ], 'Comment' => [ ], 'NeedInvoice' => 0, 'InvoiceInfos' => [], 'RoomPrices' => $room_price_list, 'OrderTitleID' => 0, ]; empty($order_info['dltOrderInfo']['orderMemo']) ? false : $params['Comment']['orderMemo'] = ['comment' => $order_info['dltOrderInfo']['orderMemo'], 'comment_type' => OrderComment::TYPE_INTERNAL]; empty($order_info['dltOrderInfo']['specialMemo']) ? false : $params['Comment']['specialMemo'] = ['comment' => $order_info['dltOrderInfo']['specialMemo'], 'comment_type' => OrderComment::TYPE_INTERNAL]; empty($order_info['dltOrderInfo']['additionalList']) ? false : $params['Comment']['additionalList'] = ['comment' => json_encode($order_info['dltOrderInfo']['additionalList']), 'comment_type' => OrderComment::TYPE_INTERNAL]; //检查订单是否预定成功 $check_order_exits = OrderMain::getInfoByOutsideId($order_info['dltOrderInfo']['orderId'], $supplier_id); if (!empty($check_order_exits)) { //todo:这里还需要看是否有其他情况, return ['code' => CommonOrder::RETURN_CODE_REPEAT, 'msg' => CommonOrder::RETURN_MSG[CommonOrder::RETURN_CODE_REPEAT]]; } if ($order_info['dltOrderInfo']['isHoldRoom'] == 'R') { $channel_status = CtripOrder::ORDER_STATUS_ACCEPT; } else { $channel_status = CtripOrder::ORDER_STATUS_WAITING; } //创建订单 $new_order = new CommonOrder(['scenario' => 'BookHotelOrder']); if ($new_order->load($params, '') && $new_order->validate()) { $res = $new_order->bookHotelOrder(); if ($res['code'] == CommonOrder::RETURN_CODE_SUCCESS) {//下单成功 //TODO:更新订单相关信息 OrderMain::updateAll(['DOCKING_TYPE' => CtripOrder::ORDER_DOCKING_TYPE, 'CHANNEL_ORDER_STATUS' => $channel_status, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())], ['and', ['CANCEL_FLAG' => 0], ['or', ['ORDER_ID' => $res['data']['order_id']], ['PARENT_ORDER_ID' => $res['data']['order_id']]]]); return ['code' => CommonOrder::RETURN_CODE_SUCCESS, 'msg' => CommonOrder::RETURN_MSG[CommonOrder::RETURN_CODE_SUCCESS]]; } else //下单失败 { return ['code' => CommonOrder::RETURN_CODE_PROGRAM_FAIL, 'msg' => CommonOrder::RETURN_MSG[CommonOrder::RETURN_CODE_PROGRAM_FAIL]]; } } } /** * Notes:修改订单 * User: Steven * Date: 2018/5/11 * Time: 13:56 * @param $order_info * @return array|int * @throws Exception */ private function modifyOrder($order_info) { //检查订单是否已经存在,如果已经存在,说明只修改了非入住需求的信息;如果订单不存在,说明代理通是取消+新订 $supplier_id = CtripSwitch::SupplierDict($order_info['dltOrderInfo']['channel']); $order_model = OrderMain::findOne([ 'OUTSIDE_ORDER_NO' => $order_info['dltOrderInfo']['releationOrder']['lastOrderId'], 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN, 'PARENT_ORDER_ID' => 0, 'OUTSIDE_SALE_ORG_ID' => $supplier_id, 'CANCEL_FLAG' => 0, ]); //订单在渠道未接单的情况下 且订单的状态是待发单、待确认的订单可直接修改 if ($order_model->CHANNEL_ORDER_STATUS == OrderMain::ORDER_CHANNEL_STATUS_WAITING && ($order_model->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_SEND || $order_model->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_CONFIRM)) { $mapping_info = CtripSwitch::getZzIDByCtripID($supplier_id, $order_info['dltOrderInfo']['roomId']); if (empty($mapping_info)) { return ['code' => CommonOrder::RETURN_CODE_MAPPING_FAIL, 'msg' => CommonOrder::RETURN_MSG[CommonOrder::RETURN_CODE_MAPPING_FAIL]]; } $room_price_list = []; foreach ($order_info['dltOrderInfo']['roomPriceList'] as $tmp_room_price) { $room_price_list[] = [ 'RunDate' => self::FormatDate($tmp_room_price['effectDate']), 'Price' => $tmp_room_price['price'], ]; } $param = [ 'CreateUserID' => Yii::$app->params['ctrip']['base_user_id'], 'ZZ_ORDER_ID' => $order_model->ORDER_ID, //蜘蛛订单号 'OrderID' => $order_info['dltOrderInfo']['orderId'], //渠道订单号 'HotelID' => $mapping_info['HOTEL_ID'], 'RoomID' => $mapping_info['ROOM_ID'], 'DistribID' => $supplier_id,//渠道ID 'RoomNum' => $order_info['dltOrderInfo']['roomnum'], //房间数量 'CheckIn' => self::FormatDate($order_info['dltOrderInfo']['checkinDate']), //入住日期 'CheckOut' => self::FormatDate($order_info['dltOrderInfo']['checkoutDate']), //离店日期, 'TotalPrice' => $order_info['dltOrderInfo']['orderPrice'],//订单总价 'Currency' => 'RMB', //币种 'ContactName' => $order_info['dltOrderInfo']['customerName'],//联系人姓名 'ContactTel' => '', //联系人电话 'OrderGuests' => [ 0 => [ 'Name' => $order_info['dltOrderInfo']['customerName'], ] ], //入住人信息 'Comment' => $order_info['dltOrderInfo']['orderMemo'], //客人备注 'NeedInvoice' => 0, 'InvoiceInfos' => 0, 'RoomPrices' => $room_price_list, ]; $newOrder = new CommonOrder(['scenario' => 'UpdateHotelOrder']); if ($newOrder->load($param, '') && $newOrder->validate()) { $res = $newOrder->updateHotelOrder(); if ($res['code'] == 0) { return $res; } else { return $res; } } else { $error = array_values($newOrder->getFirstErrors()); return ['code' => 1, 'info' => $error[0]]; } } $orderStatusArr = [ OrderMain::ORDER_CHANNEL_STATUS_ACCEPT, //已接单 OrderMain::ORDER_CHANNEL_STATUS_REJECT,//已拒绝 OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_REJECT //取消被拒 ]; //并且订单的状态不能是已取消 if (in_array($order_model->CHANNEL_ORDER_STATUS, $orderStatusArr) && $order_model->ORDER_STATUS != OrderMain::ORDER_STATUS_CANCEL) { //更新订单的渠道接单状态为申请修改(同意修改,拒绝修改) $effectCount = OrderMain::updateAll(['CHANNEL_ORDER_STATUS' => OrderMain::ORDER_CHANNEL_STATUS_APPLY_MODIFY, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())], ['and', ['CANCEL_FLAG' => 0], ['or', ['ORDER_ID' => $order_model->ORDER_ID], ['PARENT_ORDER_ID' => $order_model->ORDER_ID]]]); return $effectCount; } //其他修改情况但是未做处理 $this->sendAliMsgToRtx('代理通直连通知', '修改订单,其他修改情况但是未做处理,请关注', 'shifp'); } /** * Notes:取消订单 * User: Steven * Date: 2018/5/11 * Time: 14:05 * @param $order_info * @return array|int * @throws Exception */ private function cancelOrder($order_info) { $supplier_id = CtripSwitch::SupplierDict($order_info['dltOrderInfo']['channel']); $order_model = OrderMain::findOne([ 'OUTSIDE_ORDER_NO' => $order_info['dltOrderInfo']['releationOrder']['lastOrderId'], 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN, 'PARENT_ORDER_ID' => 0, 'OUTSIDE_SALE_ORG_ID' => $supplier_id, 'CANCEL_FLAG' => 0, ]); //订单在渠道未接单的情况下 且订单的状态是待发单、待确认的订单可直接取消 if ($order_model->CHANNEL_ORDER_STATUS == OrderMain::ORDER_CHANNEL_STATUS_WAITING && ($order_model->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_SEND || $order_model->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_CONFIRM)) { $params = [ 'CreateUserId' => Yii::$app->params['ctrip']['base_user_id'], 'OrderID' => $order_info['dltOrderInfo']['orderId'], //渠道订单号 'HotelID' => $order_model->PARENT_PROD_ID, 'DistribID' => $supplier_id, 'RoomID' => $order_model->PROD_ID, 'Reason' => '携程代理通直连取消!' ]; $newOrder = new CommonOrder(['scenario' => 'CancelHotelOrder']); if ($newOrder->load($params, '') && $newOrder->validate()) { $res_code = $newOrder->cancelHotelOrder(); return ['code' => $res_code, 'info' => CommonOrder::RETURN_MSG[$res_code]]; } else { $error = array_values($newOrder->getFirstErrors()); return ['code' => CommonOrder::RETURN_CODE_CANCEL_FAIL, 'info' => $error[0]]; } } //以下情况都是申请取消 变更渠道的订单状态为申请取消(同意取消、拒绝取消) $orderStatusArr = [ OrderMain::ORDER_CHANNEL_STATUS_ACCEPT, //已接单 OrderMain::ORDER_CHANNEL_STATUS_REJECT,//已拒绝 OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_REJECT //取消被拒 ]; if (in_array($order_model->CHANNEL_ORDER_STATUS, $orderStatusArr)) { $effectCount = OrderMain::updateAll(['CHANNEL_ORDER_STATUS' => OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())], ['and', ['CANCEL_FLAG' => 0], ['or', ['ORDER_ID' => $order_model->ORDER_ID], ['PARENT_ORDER_ID' => $order_model->ORDER_ID]]]); return $effectCount; } //其他取消情况但是未做处理 $this->sendAliMsgToRtx('代理通直连通知', '取消订单,其他修改情况但是未做处理,请关注', 'shifp'); } /** * Notes:订单变化通知接口 * User: Steven * Date: 2018/5/11 * Time: 10:12 * @return array * @throws Exception */ public function actionGetdltordernotify() { $model = new CtripSwitch(); $data = [ 'supplierID' => (int)$model->ctripConf['switch_supplier_id'], 'startTime' => '/Date(' . strval($model->getTimestamp() - 30000) . '+0800)/', 'endTime' => '/Date(' . strval($model->getTimestamp()) . '+0800)/', 'pagingType' => [ 'pageSize' => 100, 'pageIndex' => 1 ], ]; $res = $model->request(Yii::$app->controller->action->id, $data); #处理返回的数据 if ($res->ResponseStatus->Ack != 'Success') { return [ 'code' => 1, 'info' => '携程订单变化接口返回值错误!', $res->ResponseStatus->Errors->Message ]; } if ($res->resultStatus->resultCode != 0) { return [ 'code' => 2, 'info' => '携程订单变化接口返回值错误!', $res->resultStatus->resultMsg ]; } if (isset($res->dltOrderIds) || !empty($res->dltOrderIds)) { $outside_order_list = $res->dltOrderIds; $detail_error_info = ''; foreach ($outside_order_list as $outside_order_id) { //调用携程订单详情接口 $tmp_order_detail = $this->GetOrderInfo($outside_order_id); $sale_order_id = $tmp_order_detail['dltOrderInfo']['orderId']; if ($tmp_order_detail['resultStatus']['resultCode'] != 0) { $detail_error_info .= '代理通订单号: ' . $sale_order_id . ' 携程订单详情接口获取失败!' . $tmp_order_detail['resultStatus']['resultMsg']; continue; } //N:新订 D:延住 if ($tmp_order_detail['dltOrderInfo']['formType'] == 'N' || $tmp_order_detail['dltOrderInfo']['formType'] == 'D') { $book_res = $this->bookOrder($tmp_order_detail); } //M:修改 如果是修改单,那么直接在原单上进行修改 if ($tmp_order_detail['dltOrderInfo']['formType'] == 'M') { $modify_res = $this->modifyOrder($tmp_order_detail); } //取消 if ($tmp_order_detail['dltOrderInfo']['formType'] == 'C') { $cancel_res = $this->cancelOrder($tmp_order_detail); } } } return []; } /** * Function Description:7.2 获取携程订单详情方法 * Function Name: GetOrderInfo * @param $dltOrderId * * @return mixed * * @author 娄梦宁 */ public function GetOrderInfo($dltOrderId) { $model = new CtripSwitch(); $data = [ 'supplierID' => (int)$model->ctripConf['switch_supplier_id'], 'dltOrderId' => (string)$dltOrderId, ]; $res = $model->request('getdltorderinfo', $data); return json_decode(json_encode($res), true); } /** * Notes:订单操作接口 确认 拒绝等 * User: Steven * Date: 2018/5/22 * Time: 10:12 * @return array * @throws Exception */ public function actionOperaterDltOrder() { $model = new CtripSwitch(); $orderId = Yii::$app->request->post('orderId', '');//订单id $operaterType = Yii::$app->request->post('operaterType', '');//操作类型 0:接受,1:拒绝,2:更改确认号 11:接受取消 12:拒绝取消 $confirmType = Yii::$app->request->post('confirmType', '');//1:按入住人姓名;2:按确认号 $refuseType = Yii::$app->request->post('refuseType', '');//拒绝类型 1:满房;2:房价不对;3:其他原因 $refuseRemark = Yii::$app->request->post('refuseRemark', '');//拒绝原因 $bookingNo = Yii::$app->request->post('bookingNo', '');//预定号 $params = [ 'supplierID' => (int)$model->ctripConf['switch_supplier_id'], 'confirmType' => 1 ]; if ($orderId == '' || $operaterType == '') { return [ 'code' => 1, 'info' => '参数错误!' ]; } $order_main = new OrderMain(); $params['dltOrderId'] = (string)$order_main->getOutSideId($orderId); if ($operaterType != '') { $params['operaterType'] = (int)$operaterType; } if ($confirmType != '') { $params['confirmType'] = (int)$confirmType; } if ($refuseType != '') { $params['refuseType'] = (int)$refuseType; } if ($refuseRemark != '') { $params['refuseRemark'] = $refuseRemark; } if ($bookingNo != '') { $params['bookingNo'] = $bookingNo; } $res = $model->request('operaterdltorder', $params); if ($res->ResponseStatus->Ack != 'Success') { return [ 'code' => 1, 'info' => '携程服务器错误!' ]; } return [ 'code' => $res->resultStatus->resultCode, 'info' => $res->resultStatus->resultMsg, ]; } /** * Function Description:格式化携程接口中的时间为 年-月-日 * Function Name: FormatDate * @param $dateTime * * @return false|string * * @author 娄梦宁 */ private function FormatDate($dateTime) { $time = substr($dateTime, 6, 10); $date = date('Y-m-d', $time); return $date; } /** * @Author: wanglg * @DESC:推送房态接口 * @param hotel_id :cs后台酒店id * @param base_room_type :cs后台酒店id * @param room_type :cs后台子房型room_type * @return mixed */ public function actionBatchpushroomdata() { $request = Yii::$app->request->post(); $model = new CtripSwitch(['scenario' => 'PushRoomData']); if (!$request['zz_hotel_id'] || !$request['zz_base_room_id'] || !$request['zz_room_id']) { return ['code' => CtripSwitch::PARAM_ERR0R, 'msg' => CtripSwitch::RETURN_MSG[CtripSwitch::PARAM_ERR0R]]; } // 如果没有日期段,默认时间段为当前开始+90天 $request['start_date'] = empty($request['start_date']) ? date('Y-m-d') : $request['start_date']; $request['end_date'] = empty($request['end_date']) ? date('Y-m-d', strtotime('+90 days')) : $request['end_date']; $model->load($request, ''); // 首先判断酒店房型是否直连,确认直连再查询数据 $mp_res = $model->isMapping($model->zz_hotel_id, $model->zz_room_id, $model->zz_channel_id); // 判断房型是否直连 if ($mp_res['code'] != 0) { return $mp_res; } // 查询房型在一个日期段内的数据 if (!$model->loadPushData($request, '') || !$model->validate()) { return false; } $data = [ 'supplierId' => (int)$model->ctripConf['switch_supplier_id'], 'hotelId' => (int)$mp_res['data']['sub_hotel_id'], 'roomDataEntitys' => $model->roomDataEntitys, ]; $res = $model->request('BatchPushRoomData', $data); if ($res->resultStatus->resultCode === 0) { return $res->resultStatus; } else { return $res->resultStatus; } } /** * @Author: wanglg * @DESC: 验证酒店房型是否直连接口 */ public function actionCheckMapping() { // scenario scenario scenario $model = new CtripSwitch(['scenario' => 'CheckMapping']); $request = Yii::$app->request->post(); $request['zz_channel_id'] = empty($request['zz_channel_id']) ? Yii::$app->params['ctrip']['supplier_id'] : $request['zz_channel_id']; $request['zz_room_id'] = empty($request['zz_room_id']) ? 0 : $request['zz_room_id']; if (!$model->load($request, '') || !$model->validate()) { return ['code' => CtripSwitch::PARAM_ERR0R, 'msg' => CtripSwitch::RETURN_MSG[CtripSwitch::PARAM_ERR0R]]; } return $model->isMapping($model->zz_hotel_id, $model->zz_room_id, $model->zz_channel_id); } /** * Notes:更新房型售卖规则 * User: Aaron * Date: 2018/5/11 * @return mixed * @throws yii\db\Exception */ public function actionSetRoomSaleRule() { $model = new CtripSwitch(); $request = Yii::$app->request->post(); if ($request['hotel_id'] == null || $request['room_type'] == null) { return ['code' => CtripSwitch::PARAM_ERR0R, 'msg' => CtripSwitch::RETURN_MSG[CtripSwitch::PARAM_ERR0R]]; } // 首先判断酒店房型是否直连,确认直连再查询数据 $mp_res = $model->isMapping($request['hotel_id'], $request['room_type'], $model->ctripConf['switch_supplier_id']); // 判断房型是否直连 if ($mp_res['code'] != 0) { return $mp_res; } //需要子房型ID和渠道ID $OperaRoomDistrib = new OperaRoomDistrib(); $model_data = $OperaRoomDistrib->getRoomDistrib($request['hotel_id'], $model->ctripConf['switch_supplier_id']); $data = [ 'supplierId' => (int)$model->ctripConf['switch_supplier_id'], 'hotelId' => $request['hotel_id'], 'roomTypeList' => $request['roomTypeList'], 'setCtripDailyRule' => $request['setCtripDailyRule'], 'saleRuleList' => $request['saleRuleList'] ]; return $data; } } ?>