Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

Hotel.php 19 KiB

há 3 anos
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. <?php
  2. /**
  3. *
  4. * ============================================================================
  5. * * 版权所有 蜘蛛出行 * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * Author By: 倪宗锋
  12. * PhpStorm Hotel.php
  13. * Create By 2018/1/5 9:20 $
  14. */
  15. namespace zzcx\service\home;
  16. use common\models\MHotel;
  17. use common\util\OrderUtil;
  18. use Yii;
  19. use common\util\Util;
  20. use common\util\CurlInterface;
  21. class Hotel
  22. {
  23. /**
  24. * Des:获取酒店展示页面信息
  25. * Name: getInfo
  26. * @param $params
  27. * @return array
  28. * @author 倪宗锋
  29. */
  30. public function getInfo($params)
  31. {
  32. //1.获取酒店 详细
  33. $data = ['hotel_id' => $params['hotel_id']];
  34. $getInfo = Util::sendCs($data, '/hotel/api/get-hotel-info', 2);
  35. if ($getInfo['flag'] == false) {
  36. return $getInfo;
  37. }
  38. $return = $getInfo['data']['data'];
  39. if (empty($return['hotel_name'])) {
  40. return Util::returnArrEr('酒店已下架!');
  41. }
  42. //2.获取房型列表
  43. $return['list'] = $this->getRoomList($params);
  44. return Util::returnArrSu('', $return);
  45. }
  46. /**
  47. * Des:获取酒店房型列表
  48. * Name: getRoomList
  49. * @param $params
  50. * @return array
  51. * @author 倪宗锋
  52. */
  53. public function getRoomList($params)
  54. {
  55. $data_1 = [
  56. 'hotel_id' => $params['hotel_id'],//酒店ID
  57. 'start_date' => $params['start_date'],//入住日期
  58. 'end_date' => $params['end_date'],//离店日期
  59. 'org_id' => 164,
  60. ];
  61. if (empty($params['room_id']) == false) {
  62. $data_1['room_id'] = $params['room_id'];
  63. }
  64. $getInfo1 = Util::sendCs($data_1, '/hotel/api/get-hotel-room-list-by-date', 2);
  65. if ($getInfo1['flag'] == false || empty($getInfo1['data']['list'])) {
  66. $return = [];
  67. } else {
  68. $return = $getInfo1['data']['list'];
  69. }
  70. return $return;
  71. }
  72. /**
  73. * Des:获取下单参数
  74. * Name: getParamsForOrder
  75. * @return array
  76. * @author 倪宗锋
  77. */
  78. public function getParamsForOrder()
  79. {
  80. $cookies = $_COOKIE;
  81. $params = [
  82. 'hotel_id' => Yii::$app->request->post('hotel_id', ''),//酒店ID
  83. 'hotel_name' => Yii::$app->request->post('hotel_name', ''),//酒店名称
  84. 'room_id' => Yii::$app->request->post('room_id', ''),//房型ID
  85. 'start_date' => Yii::$app->request->post('start_date', ''),//入住日期
  86. 'in_time' => Yii::$app->request->post('in_time', '00:00'),//离店
  87. 'end_date' => Yii::$app->request->post('end_date', ''),//离店
  88. 'prod_cnt' => Yii::$app->request->post('prod_cnt', ''),//预定间数
  89. 'contacts_name' => Yii::$app->request->post('contacts_name', ''),//联系人名称
  90. 'contacts_phone' => Yii::$app->request->post('contacts_phone', ''),//联系人手机
  91. 'contacts_ID' => Yii::$app->request->post('contacts_ID', ''),//联系人身份证
  92. 'fx_uid' => empty($cookies['fx_uid']) ? Yii::$app->request->post('fx_uid', 0) : $cookies['fx_uid'],//分销用户ID
  93. 'passanger_arr' => json_decode(Yii::$app->request->post('passanger_arr', '[]'), true),//出行人数组
  94. 'remarks' => Yii::$app->request->post('remarks', ''),//需求备注
  95. 'remark' => Yii::$app->request->post('remarks', ''),//需求备注
  96. 'system' => Yii::$app->request->post('system', '2'),//需求备注
  97. ];
  98. return $params;
  99. }
  100. /**
  101. * Des:酒店下单
  102. * Name: makeOrder
  103. * @return array
  104. * @author 倪宗锋
  105. */
  106. public function makeOrder()
  107. {
  108. $params = $this->getParamsForOrder();
  109. $getRoomList = $this->getRoomList($params);
  110. if (empty($getRoomList[0]['room_list'][0]['room_id']) || $getRoomList[0]['room_list'][0]['room_id'] != $params['room_id']) {
  111. return Util::returnArrEr('该房型已售完,请选择其他房型。[1001]');
  112. }
  113. $params['base_room'] = $getRoomList[0];//基础房型数据
  114. unset($params['base_room']['room_list']);
  115. $params['room_info'] = $getRoomList[0]['room_list'][0];//子房型详细
  116. if ($params['room_info']['can_reserve'] == 0) {
  117. return Util::returnArrEr('该房型已售完,请选择其他房型。[1002]');
  118. }
  119. if ($params['room_info']['stock'] < $params['prod_cnt']) {
  120. return Util::returnArrEr('该房型库存不足,请选择其他房型。[1003]');
  121. }
  122. /**设置下单参数*/
  123. $param_arr = [
  124. 'total_money' => $params['room_info']['total_money'] * $params['prod_cnt'],//总金额
  125. 'prod_cnt' => $params['prod_cnt'],//产品数量
  126. 'order_name' => $params['hotel_name'] . ' ' . $params['room_info']['room_name'],//订单名称
  127. 'sh_uid' => 0,//用户ID
  128. 'fx_uid' => $params['fx_uid'],//分销商ID
  129. 'start_date' => $params['start_date'],//开始日期
  130. 'start_time' => $params['in_time'] . ':00',//开始时间
  131. 'end_date' => $params['end_date'],//结束日期
  132. 'end_time' => '12:00:00',//结束时间
  133. 'category_id' => 3,//订单类型
  134. 'system' => $params['system'],//系统
  135. 'contacts_name' => $params['contacts_name'],//联系人
  136. 'contacts_ID' => $params['contacts_ID'],//联系人证件ID
  137. 'contacts_phone' => $params['contacts_phone'],//联系人手机号
  138. 'prod_source' => 2,//产品来源
  139. 'start_area' => '',//起始地点
  140. 'end_area' => '',//结束地点
  141. 'passanger_arr' => $params['passanger_arr'],//出行人数组
  142. "remark"=>$params['remarks'],
  143. 'hotel_extra' => [//酒店详细
  144. 'breakfast' => $params['room_info']['breakfast'],
  145. 'hotel_name' => $params['hotel_name'],
  146. 'hotel_id' => $params['hotel_id'],
  147. 'room_id' => $params['room_id'],
  148. 'room_name' => $params['room_info']['room_name'],
  149. 'total_details' => json_encode($params['room_info']['date_price']),
  150. 'remarks' => $params['remarks'],
  151. 'is_gift' => count($params['room_info']['gift_list']) == 0 ? 0 : 1,
  152. 'gift_describe' => json_encode($params['room_info']['gift_list']),
  153. ]
  154. ];
  155. $makeOrder = OrderUtil::makeUnProdOrder($param_arr);
  156. if ($makeOrder['flag'] == true) {
  157. $return = OrderUtil::setMakeOrderReturn($makeOrder['data']['order_id'], $param_arr['total_money'], $param_arr['system'], $param_arr['contacts_phone'], $param_arr['fx_uid']);
  158. return Util::returnArrSu('', $return);
  159. }
  160. return $makeOrder;
  161. }
  162. /**
  163. * Function Description:获取并筛选酒店列表
  164. * Function Name: getHotelList
  165. * @param $params
  166. *
  167. * @return array
  168. *
  169. * @author 娄梦宁
  170. */
  171. public function getHotelList($params)
  172. {
  173. #参数校验
  174. $checkParams = $this->checkParamsForHotelList($params);
  175. if (!$checkParams) {
  176. return Util::returnArrEr('参数错误!');
  177. }
  178. #入住总晚数
  179. $max_day_num = (strtotime($params['end_date']) - strtotime($params['start_date'])) / 86400;
  180. #region 1:获取列表数据
  181. $mHotel = new MHotel();
  182. $hotelSelectList = $this->getHotelType();
  183. if (!$hotelSelectList['flag']) {
  184. return Util::returnArrEr('酒店类型选择获取失败!');
  185. }
  186. $result = $mHotel->getHotelList($params, $hotelSelectList['data']['select_list']);
  187. #endregion
  188. #region 2:刷选处理结果数组
  189. $new_hotel_list_by_date = [];
  190. $tmp_day_num = 1;
  191. #region 2.1 该循环去掉日期属性,按酒店整合数组。并排除床型早餐不符合的子房型。
  192. foreach ($result as $key => $val) {
  193. if (isset($new_hotel_list_by_date[$val['hotel_id']])) {//天数计算器
  194. $tmp_day_num += 1;
  195. } else {
  196. $new_hotel_list_by_date[$val['hotel_id']] = $val;
  197. $tmp_day_num = 1;
  198. }
  199. #子房型归类
  200. foreach ($val['room_info'] as $v) {
  201. #筛选床型和早餐
  202. if ($params['breakfast_include'] != '0') {
  203. #早餐
  204. if ($params['breakfast_include'] == '1') {//含早
  205. if ($v['breakfast_include'] == '0') {
  206. continue;
  207. }
  208. }
  209. if ($params['breakfast_include'] == '2') {//单早
  210. if ($v['breakfast_include'] != '1') {
  211. continue;
  212. }
  213. }
  214. if ($params['breakfast_include'] == '3') {//双早
  215. if ($v['breakfast_include'] != '2') {
  216. continue;
  217. }
  218. }
  219. }
  220. if ($params['bed_type'] != '0') {
  221. #床型
  222. if ($v['bed_type'] != $params['bed_type'] && !in_array($params['bed_type'],explode(',',$v['bed_type']))) {
  223. continue;
  224. }
  225. }
  226. $new_hotel_list_by_date[$val['hotel_id']]['son_room'][$v['room_type']][] = $v;
  227. }
  228. $new_hotel_list_by_date[$val['hotel_id']]['max_day_num'] = $tmp_day_num;//所选日期内酒店开房天数
  229. }
  230. #endregion
  231. #region 2.2 按库存量再次筛选数组,并算出有效子房型最低价
  232. foreach ($new_hotel_list_by_date as $key => $val) {
  233. $tmp_stock = 0;//是否售罄中间变量
  234. if ($val['max_day_num'] != $max_day_num || !isset($val['son_room'])) {
  235. //开房天数不够排除 && 一个符合的子房型也没有的排除
  236. unset($new_hotel_list_by_date[$key]);
  237. continue;
  238. }
  239. $tmp_son_date_stock=0;//子房型售卖天数是否足够标识。
  240. $tmp_lower_price = 100000;
  241. $no_stock_price = 100000;//全部没有库存时的展示价
  242. foreach ($val['son_room'] as $k => $v) {
  243. $tmp_son_stock = 0;
  244. if (count($val['son_room'][$k]) != $max_day_num) {#子房型售卖天数不够的排除
  245. continue;
  246. }
  247. $tmp_son_date_stock=1;//子房型有一个天数符合条件。
  248. foreach ($v as $value) {
  249. if ($value['remaining_count'] != '0') {#子房型有库存充足的天数
  250. $tmp_son_stock++;
  251. }
  252. }
  253. if ($tmp_son_stock == $max_day_num) {
  254. $tmp_stock = 1;
  255. foreach ($v as $value) {
  256. if (intval($value['price']) < $tmp_lower_price) {#有库存的子房型的最低价
  257. $tmp_lower_price = intval($value['price']);
  258. }
  259. }
  260. } else {
  261. foreach ($v as $value) {
  262. if (intval($value['price']) < $no_stock_price) {#无库存的子房型的最低价
  263. $no_stock_price = intval($value['price']);
  264. }
  265. }
  266. }
  267. }
  268. if($tmp_son_date_stock!=1){//符合筛选条件的子房型的可售天数都不足
  269. unset($new_hotel_list_by_date[$key]);
  270. continue;
  271. }
  272. $new_hotel_list_by_date[$key]['stock'] = $tmp_stock;
  273. if ($tmp_lower_price != 100000) {
  274. //有有库存的子房型取该子房型最低价
  275. $new_hotel_list_by_date[$key]['price'] = $tmp_lower_price;
  276. } else {
  277. //全部无库存取整体最低价
  278. $new_hotel_list_by_date[$key]['price'] = $no_stock_price;
  279. }
  280. #价格刷选
  281. if ($params['price_type'] != '0') {
  282. switch ($params['price_type']) {
  283. case '1':
  284. if ($new_hotel_list_by_date[$key]['price'] > 200) {
  285. unset($new_hotel_list_by_date[$key]);
  286. };
  287. break;
  288. case '2':
  289. if ($new_hotel_list_by_date[$key]['price'] < 200 || $new_hotel_list_by_date[$key]['price']>500) {
  290. unset($new_hotel_list_by_date[$key]);
  291. };
  292. break;
  293. case '3':
  294. if ($new_hotel_list_by_date[$key]['price'] < 500 || $new_hotel_list_by_date[$key]['price']>800) {
  295. unset($new_hotel_list_by_date[$key]);
  296. };
  297. break;
  298. case '4':
  299. if ($new_hotel_list_by_date[$key]['price'] < 800) {
  300. unset($new_hotel_list_by_date[$key]);
  301. };
  302. break;
  303. default:break;
  304. }
  305. }
  306. }
  307. #endregion
  308. #endregion
  309. #region 3 :结果排序
  310. $sort_result = [];
  311. #region 3.1 结果数组整理
  312. $promotion = [];//推荐酒店数组
  313. $un_promotion = [];//不推荐酒店数组
  314. $price_sort_list = [];//价格排序数组
  315. foreach ($new_hotel_list_by_date as $value) {
  316. #星级字段处理
  317. switch ($value['star_level']) {
  318. case '39':
  319. $star_level = '五星级';
  320. break;
  321. case '38':
  322. $star_level = '四星级';
  323. break;
  324. case '37':
  325. case '36':
  326. $star_level = '三星级';
  327. break;
  328. case '35':
  329. case '34':
  330. $star_level = '二星级';
  331. break;
  332. case '33':
  333. case '32':
  334. $star_level = '一星级';
  335. break;
  336. default;
  337. $star_level = '无星级';
  338. };
  339. $tmp_hotel_value = [
  340. 'hotel_id' => $value['hotel_id'],
  341. 'hotel_name' => $value['hotel_name'],
  342. 'star_level' => $star_level,
  343. 'sale_label' => $value['sale_label'] == '' ? '' : explode(',', $value['sale_label']),
  344. 'area_name' => $value['area_name'],
  345. 'price' => $value['price'],
  346. 'stock' => $value['stock'],
  347. 'hotel_image' => $value['hotel_image']
  348. ];
  349. #默认排序
  350. if ($params['sort'] == '-1') {
  351. if ($value['is_promotion'] == '1') {
  352. #推荐酒店数组
  353. $promotion[$value['recommend_level'] . '0.' . $value['hotel_id']] = $tmp_hotel_value;
  354. } else {
  355. #不推荐酒店数组
  356. $un_promotion[$value['recommend_level'] . '0.' . $value['hotel_id']] = $tmp_hotel_value;
  357. }
  358. }
  359. #价格排序
  360. if ($params['sort'] == '0' || $params['sort'] == '1') {
  361. $price_sort_list[$value['price'] . '0.' . $value['hotel_id']] = $tmp_hotel_value;
  362. }
  363. }
  364. #endregion
  365. # region 3.2 排序操作 && 分页截取
  366. $start = $params['page_size'] * ($params['current_page'] - 1);
  367. if ($params['sort'] == '-1') {
  368. krsort($promotion);
  369. krsort($un_promotion);
  370. $sort_result = array_values(array_slice(array_merge($promotion, $un_promotion), $start, $params['page_size']));
  371. } elseif ($params['sort'] == '0') {
  372. krsort($price_sort_list);
  373. $sort_result = array_values(array_slice($price_sort_list, $start, $params['page_size']));
  374. } elseif ($params['sort'] == '1') {
  375. ksort($price_sort_list);
  376. $sort_result = array_values(array_slice($price_sort_list, $start, $params['page_size']));
  377. }
  378. #endregion
  379. return Util::returnArrSu('酒店列表数据获取成功!', ['hotel_list' => $sort_result,'current_page'=>$params['current_page']]);
  380. #endregion
  381. }
  382. /**
  383. * Function Description:获取酒店列表参数校验函数
  384. * Function Name: checkParamsForHotelList
  385. * @param $params
  386. *
  387. * @return bool
  388. *
  389. * @author 娄梦宁
  390. */
  391. public function checkParamsForHotelList($params)
  392. {
  393. if (!is_numeric($params['area_id']) || !is_numeric($params['star_type'])) {
  394. return false;
  395. }
  396. if (Util::checkPattern('date', $params['start_date']) == false || Util::checkPattern('date', $params['end_date']) == false) {
  397. return false;
  398. }
  399. if (!in_array($params['breakfast_include'], ['0', '1', '2', '3'], true) || !in_array($params['sort'], ['-1', '0', '1'], true) || !in_array($params['bed_type'], ['0', '1', '2', '3', '4'], true)) {
  400. return false;
  401. }
  402. return true;
  403. }
  404. /**
  405. * Function Description:酒店筛选条件请求接口
  406. * Function Name: getHotelType
  407. *
  408. * @return array
  409. *
  410. * @author 李健
  411. */
  412. public function getHotelType()
  413. {
  414. $curlInterface = new CurlInterface();
  415. $siteConfig = Util::getSiteConfig();
  416. $url = $siteConfig['adm_host1'] . '/hotel/api/get-hotel-type';
  417. // $url = 'http://cs1.zzcs.dev/hotel/api/get-hotel-type';
  418. $getInfo = $curlInterface->execute($url);
  419. if ($getInfo['code'] != 0) {
  420. return Util::returnArrEr('酒店筛选条件接口获取失败!');
  421. }
  422. return Util::returnArrSu('数据获取成功!', ['select_list'=>$getInfo['data']]);
  423. }
  424. /**
  425. * Function Description:获取酒店地址列表
  426. * Function Name: getHotelArea
  427. *
  428. * @return array
  429. *
  430. * @author 田玲菲
  431. */
  432. public function getHotelArea(){
  433. $curlInterface = new CurlInterface();
  434. $siteConfig = Util::getSiteConfig();
  435. $url = $siteConfig['adm_host1'] . '/hotel/api/get-area-name';
  436. // $url = 'cs1.myzzcs.com'.'/hotel/api/get-area-name';
  437. $getInfo = $curlInterface->execute($url);
  438. if(empty($getInfo)){
  439. return Util::returnArrEr('获取地址失败!');
  440. }
  441. return Util::returnArrSu('获取地址成功!', $getInfo);
  442. }
  443. }