service == null) { $this->service = new ApiService(); } return $this->service; } /** * Notes: * User: Steven * Date: 2018/1/17 * Time: 13:12 * @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); } public function behaviors() { //配置ContentNegotiator支持JSON和XML响应格式 $behaviors['contentNegotiator'] = [ 'class' => ContentNegotiator::className(), 'formats' => [ 'application/xml' => Response::FORMAT_JSON, ], // 'only' => ['index'],//指定只是针对于index有效 // 'except'=>[''] //只想剔除某个action /*$behaviors['access'] = [ 'class' => AccessControl::className(), 'rules' => [ [ ], ], ];*/ ]; return $behaviors; } /** * Author:Steven * Desc: * @return array */ public function actionIndex() { //需要传入区域ID、住离店日期、酒店名称(模糊) return ['name' => 'shifupeng', 'age' => 12]; } /** * Created by PhpStorm. * Desc: * Desc:对于设置了保留房的取消时间,即最晚立即确认时间的渠道房型,应该轮询清除符合条件的库存 * 1、到达失效日期后,该子房型-渠道,满足清除库存日期的库存(固定数量),需清零 * 2、对于该子房型所属的基础房型的库存,需要按照先保留,再买断的顺序进行库存的扣除 * 3、注意:这里一定要去除阿里渠道,因为阿里是没有保留房的,都是一单一询,但是要想售卖,必须设置库存,所以对于阿里来说,这里的库存只是为了正常售卖,因此没有保留房的概念,所以不需要库存的扣除 * User: Steven * Date: 2018/2/28jiu * Time: 14:05 * Class actionClearReservingRoom * @return bool * @throws \yii\db\Exception */ public function actionClearReservingRoom() { $room_distrib = new OperaRoomDistrib(); $data = $room_distrib->getNeedClearReservingRoom(); foreach ($data as $item) { if ($item['DISTRIB_ID'] == Yii::$app->params['ali']['supplier_id']) { //阿里渠道无保留房概念之说,所以不做库存的扣除 continue; } $time_now = date('H:i'); $Invalid_time = explode(',', $item['LATEST_COMFIRM_TIME']); if ($time_now < $Invalid_time[1]) { continue; } $end_date = date('Y-m-d', strtotime("+ $Invalid_time[0] day")); $run_hotel_distrib = new RunHotelDistrib(); $res = $run_hotel_distrib->clearReservingRoom($item['DISTRIB_ID'], $end_date, $item['HOTEL_ID'], $item['PARENT_ROOM_TYPE'], $item['ROOM_TYPE']); if (!$res) { return false; } } return true; } /** * Author:Steven * @param $HOTEL_ID //酒店ID * Desc:下单前的可定检查 * @param $ROOM_ID //房型ID,oprea_hotel_room的 ID * @param $ROOM_NUM //预定间数 * @param $CHECK_IN //入住日期 * @param $CHECK_OUT //离店日期 * @param $DISTRIB_ID //渠道ID * @param $ROOM_PRICES /价格日历 * @param $IF_CHECK_PRICE //是否需要校验价格 * @return array */ public function actionCheckRoomAvail() { /*$param = [ 'HotelID' => '339', 'RoomID' => '2474', 'RoomNum' => '3', 'CheckIn' => '2018-01-18', 'CheckOut' => '2018-01-20', 'DistribID' => 1536, 'CreateUserID' => 713, 'RoomPrices' => [ 0 => [ 'RunDate' => '2018-01-10', 'Price' => '100' ], 1 => [ 'RunDate' => '2018-01-10', 'Price' => '100' ], ], 'IfCheckPrice' => false, ];*/ $newOrder = new CommonOrder(['scenario' => 'CheckRoomAvail']); if (!$newOrder->load($this->request_params, '') || !$newOrder->validate()) { $error = array_values($newOrder->getFirstErrors()); return ['code' => 1, 'info' => $error[0]]; } else { return $newOrder->checkRoomAvail(); } } /** * Des:获取底价 * Name: getLowPrice * @return array * @author 倪宗锋 */ public function actionGetLowPrice() { /*$param = [ 'HotelID' => '197', 'RoomID' => '2284', 'RoomNum' => '1', 'CheckIn' => '2018-01-12', 'CheckOut' => '2018-01-14', 'DistribID' => 669, 'CreateUserID' => 1, 'RoomPrices' => [ 0 => [ 'RunDate' => '2018-01-12', 'Price' => '150' ], 1 => [ 'RunDate' => '2018-01-13', 'Price' => '150' ] ], 'IfCheckPrice' => false, ];*/ $newOrder = new CommonOrder(['scenario' => 'CheckRoomAvail']); if (!$newOrder->load($this->request_params, '') || !$newOrder->validate()) { $error = array_values($newOrder->getFirstErrors()); return ['code' => 1, 'info' => $error[0]]; } else { $check = $newOrder->checkRoomAvail(); if (isset($check['code']) && $check['code'] == 0) { $data['low_price'] = round($check['data']['total_price'] * 0.965, 2); return ['code' => 0, 'info' => 'success', 'data' => $data]; } else { return $check; } } } /** * Notes:酒店下单接口 * User: Steven * Date: 2017/12/28 * Time: 15:50 * @return array * @throws \yii\db\Exception */ public function actionBookHotelOrder() { /*$param = [ 'CreateUserID' => '259', 'OrderID' => '8959468131823000', //渠道订单号 'HotelID' => '197', //酒店ID 'RoomID' => '2284', //房型ID 'DistribID' => 669,//渠道ID 'RoomNum' => '1', //房间数量 'CheckIn' => '2018-01-12', //入住日期 'CheckOut' => '2018-01-13', //离店日期, 'TotalPrice' => '150',//订单总价 'Currency' => 'RMB', //币种 'ContactName' => '石福鹏',//联系人姓名 'ContactTel' => '17602134075', //联系人电话 'PayType' => 278, // 638:支付宝支付; 221:现金支付 ;275:授信支付;278:微信支付 'PayTradeNo' => '2018010221001001590200826788', //支付流水号 'OrderGuests' => [ 0 => [ 'Name' => '石福鹏', ], 1 => [ 'Name' => 'Steven', ], ], //入住人信息 'Comment' => '无', //客人备注 'NeedInvoice' => 1, 'InvoiceInfos' => [ //发票信息 'PostType' => '2', //发票领取方式 1:前台自取 2:邮寄 'InvoiceType' => 1, //发票类型 1:增值税普通发票;2:增值税专用发票 'Comment' => '代订房费', // 开票项目 一段文本(例如:代订房费、住宿费、会议费、旅游费等) 'InvoiceTitle' => '上海蜘蛛行网络科技有限公司',// 发票抬头 'CompanyTel' => '021-25684654', //公司电话 'CompanyTax' => '50524684554545454545', //公司税号 'RegisterAddress' => '上海闵行区虹桥万科中心1号楼', // 公司注册地址 'Bank' => '', // 开户行 'BankAccount' => '', //银行账号 'ReceiverAddress' => '', //邮寄地址 'ReceiverName' => '石福鹏', //收件人姓名 'ReceiverMobile' => '17602134075', //收件人手机号 ], 'RoomPrices' => [ 0 => [ 'RunDate' => '2018-01-12', 'Price' => '150' ] ], 'OrderTitleID' => 0 //是否是组合订单,不是传入0,是组合单传入组合单号 ];*/ //处理组合订单下单,非组合单,该字段为0 if (!isset($this->request_params['OrderTitleID'])) { $this->request_params['OrderTitleID'] = 0; } $newOrder = new CommonOrder(['scenario' => 'BookHotelOrder']); if ($newOrder->load($this->request_params, '') && $newOrder->validate()) { $res = $newOrder->bookHotelOrder(); if ($res['code'] == 0) { OrderMain::updateAll(['DOCKING_TYPE' => OrderMain::ORDER_TYPE_CHANNEL, 'CHANNEL_ORDER_STATUS' => OrderMain::ORDER_CHANNEL_STATUS_WAITING, '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 $res; } else { return $res; } } else { $error = array_values($newOrder->getFirstErrors()); return ['code' => 1, 'info' => $error[0]]; } } /** * Notes: 取消订单 * User: Steven * Date: 2018/1/26 * Time: 14:29 * @return array|int * @throws \Exception * @throws \yii\db\Exception */ public function actionCancelHotelOrder() { /*$param = [ 'CreateUserID' => '1', 'OrderID' => '11771', 'HotelID' => '12', 'DistribID' => 164, 'RoomID' => '25', 'Reason' => '测试取消', ];*/ $newOrder = new CommonOrder(['scenario' => 'CancelHotelOrder']); if ($newOrder->load($this->request_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]]; } } /** * 修改订单 * Notes:这里的修改是指修改与入住需求有关的,比如渠道、日期、间数(但同时也会更新其他辅助信息,如客人姓名等) ,如果只需要更新单个客人姓名、采购价等,单独接口支持 * 该接口在调用之前,先要请求可定检查接口,确认修改后的房态依然可定 * User: Steven * Date: 2018/1/5 * Time: 11:48 * @return array * @throws \yii\db\Exception */ public function actionUpdateHotelOrder() { /*$param = [ 'CreateUserID' => '713', 'ZZ_ORDER_ID' => '2000350', //蜘蛛订单号 'OrderID' => '11603', //渠道订单号 'HotelID' => '339', //酒店ID 'RoomID' => '2474', //房型ID 'DistribID' => 1536,//渠道ID 'RoomNum' => '3', //房间数量 'CheckIn' => '2018-01-18', //入住日期 'CheckOut' => '2018-01-19', //离店日期, 'TotalPrice' => '600.00',//订单总价 'Currency' => 'RMB', //币种 'ContactName' => '郑雯 蒋绮嵘 李峥',//联系人姓名 'ContactTel' => '13795379620', //联系人电话 'OrderGuests' => [ 0 => [ 'Name' => '郑雯', ], 1 => [ 'Name' => '蒋绮嵘', ], ], //入住人信息 'Comment' => '无', //客人备注 'NeedInvoice' => 0, 'InvoiceInfos' => [ //发票信息 'PostType' => '2', //发票领取方式 1:前台自取 2:邮寄 'InvoiceType' => 1, //发票类型 1:增值税普通发票;2:增值税专用发票 'Comment' => '代订房费', // 开票项目 一段文本(例如:代订房费、住宿费、会议费、旅游费等) 'InvoiceTitle' => '上海蜘蛛行网络科技有限公司',// 发票抬头 'CompanyTel' => '021-25684654', //公司电话 'CompanyTax' => '50524684554545454545', //公司税号 'RegisterAddress' => '上海闵行区虹桥万科中心1号楼', // 公司注册地址 'Bank' => '', // 开户行 'BankAccount' => '', //银行账号 'ReceiverAddress' => '', //邮寄地址 'ReceiverName' => '石福鹏', //收件人姓名 'ReceiverMobile' => '17602134075', //收件人手机号 ], 'RoomPrices' => [ 0 => [ 'RunDate' => '2018-01-18', 'Price' => '100', ], 1 => [ 'RunDate' => '2018-01-19', 'Price' => '100', ], ], ];*/ $newOrder = new CommonOrder(['scenario' => 'UpdateHotelOrder']); if ($newOrder->load($this->request_params, '') && $newOrder->validate()) { //if ($newOrder->load($this->request_params, '') && $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]]; } } /** * Notes:库存共享导致的部分渠道的库存大于基础房型的买断+保留 * 解决方案:将其他库存大于基础房型买断+保留的渠道库存设置为买断+保留 * User: Steven * Date: 2018/1/9 * Time: 18:11 */ public function actionUpdateStockByShare() { if (empty($this->request_params['hotel_id']) || empty($this->request_params['check_in']) || empty($this->request_params['check_out']) || empty($this->request_params['distrib_id']) || empty($this->request_params['room_id']) ) { return ['code' => 3, 'info' => 'params error']; } $order_main = new OrderMain(); $order_main->UpdateStockByShare($this->request_params); } /** * Des:获取酒店的房型列表 * Name: actionGetHotelRoomList * @author 倪宗锋 */ public function actionGetHotelRoomListByDate() { $params = [ 'hotel_id' => Yii::$app->request->post('hotel_id', ''),//酒店ID 必传 'start_date' => Yii::$app->request->post('start_date', ''),//入住日期 必传 'end_date' => Yii::$app->request->post('end_date', ''),//离店日期 必传 'org_id' => Yii::$app->request->post('org_id', ''),//分销商ID 必传 'room_id' => Yii::$app->request->post('room_id', ''),//房型ID 非必传 ]; if (empty($params['hotel_id']) || empty($params['start_date']) || empty($params['end_date']) || empty($params['org_id'])) { return ['code' => 3, 'info' => 'params error']; } $getList = $this->service()->getHotelRoomListByDate($params); return $getList; } /** * Des:获取房型基础信息 * Name: actionGetHotelInfo * @return array * @author 倪宗锋 */ public function actionGetHotelInfo() { $params = [ 'hotel_id' => Yii::$app->request->post('hotel_id', ''),//酒店ID 必传 ]; if (empty($params['hotel_id'])) { return ['code' => 3, 'info' => 'params error']; } $getList = $this->service()->getHotelInfo($params); return $getList; } /** * 获取酒店的地点 * @return array * 田玲菲 */ public function actionGetAreaName() { $data = array(); $operaHotel = new OperaHotel(); $res = $operaHotel->getHotelArea(); $arr2 = array(); foreach ($res as $k => $v) { $arr2[$k]['id'] = $v['id']; $arr2[$k]['area_name'] = str_replace("市", "", $v['area_name']); } $data['cities'] = $arr2; $newArr = array(); foreach ($res as $v) { $firstChar = Pinyin::getShortPinyin(mb_substr($v['area_name'], 0, 1, 'utf-8')); //取出第一个汉字的首字母 $newArr[strtoupper($firstChar)][] = str_replace("市", "", $v);;//以这个首字母作为key } ksort($newArr); $data['city_list'] = $newArr; $data['hot_city'] = [ [ 'area_name' => '上海', 'id' => 791, ], [ 'area_name' => '杭州', 'id' => 923, ], [ 'area_name' => '舟山', 'id' => 999, ], [ 'area_name' => '嘉兴', 'id' => 961, ], [ 'area_name' => '苏州', 'id' => 850, ], ]; return $data; } /** * Function Description:微信端获取酒店列表缓存 * Function Name: actionGetHotelListCache * * @return array * * @author 娄梦宁 */ public function actionGetHotelListCache() { $getList = $this->service()->getHotelListCache(); return $getList; } /** * @Author wanglg * @Desc 订单操作相关渠道商供应商预付款接口 * $type扣款类型,不同扣款类型执行不同操作1.下单操作,2.取消订单,3.修改订单 * @param int $order_id订单ID */ public function actionSupplierAndChannelPP($type, $order_id) { if (empty($type) || empty($order_id)) { $this->sendAliMsgToRtx('渠道预付款处理失败:', "关联订单号:" . $order_id . "\n错误信息:缺少必要参数", $this->_private); } $model = new CommonOrder(); $res = $model->previousBalance($type, $order_id); if ($res['code'] != 0) { $send_msg = "关联订单号:" . $order_id . "\n错误信息:" . $res['msg']; $this->sendAliMsgToRtx('渠道预付款处理失败:', $send_msg, $this->_private); } } /** * Function Description:获取酒店列表筛选条件 * Function Name: actionGetHotelType * @return array * @author 李健 */ public function actionGetHotelType() { $getInfo = $this->service()->getHotelType(); return ['code' => 0, 'data' => $getInfo]; } /** * @Author wanglg * @Desc 推送房态接口,统一推送房态接口 * @param $type1 . 表示携程推送,2. 阿里推送房态信息 * @param array $param房态数组信息 */ public function actionPushRoomInfo(array $param = []) { $hotel_id = isset($param['hotel_id']) ? $param['hotel_id'] : false; $base_room_id = isset($param['parent_room_type']) ? $param['parent_room_type'] : false; $room_id = isset($param['room_type']) ? $param['room_type'] : false; $param['begin_date'] = empty($param['begin_date']) ? date('Y-m-d') : $param['begin_date']; $param['end_date'] = empty($param['end_date']) ? date('Y-m-d', strtotime('+90 days')) : $param['end_date']; // 判断渠道是否满足目前的直连渠道,不满足则不推送 if (!in_array($param['channel_id'], [Yii::$app->params['ali']['supplier_id'], Yii::$app->params['ctrip']['supplier_id']])) { return false; } if (empty($hotel_id) || empty($base_room_id) || empty($room_id)) { $this->sendAliMsgToRtx('房态推送统一接口:', "错误信息:缺少必要参数,酒店信息:" . $hotel_id . ',基础房型信息:' . $base_room_id . ',子房型信息' . $room_id, $this->_private); return array('code' => 1, 'msg' => '缺少必要参数,酒店信息:' . $hotel_id . ',基础房型信息:' . $base_room_id . ',子房型信息' . $room_id); } $logger = new TopLogger(); $logger->log(array( date("Y-m-d H:i:s"), '携程推送参数记录:' . __FUNCTION__ . json_encode($param) )); $model = new CommonOrder(); $model->pushRoomStatus($param); } /** * @Author wanglg * @Desc 获取酒店下单可用库存 * @param hotel_id酒店id * @param parent_room_type酒店基础房型id * @param room_type子房型 * @param channel_id渠道id * @param start_date开始日期 * @param end_date结束日期 */ public function actionGetStock() { /*$param = [ 'RoomID' => 2474, 'DistribID' => 669, 'CheckIn' => '2018-01-18', 'CheckOut' => '2018-01-21', ];*/ $request = Yii::$app->request->post(); $orderModel = new CommonOrder(['scenario' => 'Product']); if ($orderModel->load($request, '') && $orderModel->validate()) { $getStockRes = $orderModel->getMinStock(); return json_encode(array('code' => 0, 'info' => '成功', 'data' => $getStockRes)); } else { $error = array_values($orderModel->getFirstErrors()); return json_encode(['code' => 1, 'info' => $error[0]]); } } /** * Des:返回蜘蛛官网酒店列表 * Name: actionGetWwwHotelList * @return array * @author 倪宗锋 */ public function actionGetWwwHotelList() { $DistribID = Yii::$app->request->post('DistribID', '');//分销商ID 必传 $operaHotel = new OperaHotel(); $list = $operaHotel->getWwwHotelList($DistribID); return $list; } public function actionTest() { $res = AliOrder::findOne(Yii::$app->request->get('id')); } } ?>