Hotel.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. <?php
  2. namespace app\index\controller;
  3. use app\index\model\hotel\HotelModel;
  4. use app\index\model\hotel\OrderModel;
  5. use app\index\model\hotel\RoomModel;
  6. use app\index\service\HelperService;
  7. class Hotel extends CmsController
  8. {
  9. public function _initialize(){
  10. parent::_initialize();
  11. //结束掉,订单结束时间小于当前时间的支付完成的订单
  12. $this->_endOrder();
  13. }
  14. /**
  15. * 将已支付的,并且结束时间到期的订单结束掉
  16. */
  17. private function _endOrder(){
  18. $date = date('Y-m-d');
  19. $hours = date('H');
  20. if($hours > 13){
  21. $orderModel = new OrderModel();
  22. $orderModel->upInfo(['status'=>1,'end_date'=>['elt',$date]],['status'=>3]);
  23. }else{
  24. $orderModel = new OrderModel();
  25. $orderModel->upInfo(['status'=>1,'end_date'=>['lt',$date]],['status'=>3]);
  26. }
  27. }
  28. /**
  29. * 通过条件获取房间类型的分页
  30. */
  31. public function getRoomPageByCondition(){
  32. $param_list = [
  33. 'page'=>'number',
  34. 'pageSize'=>'number',
  35. ];
  36. HelperService::diffParam($param_list,$this->post);
  37. $where = [];
  38. //判断可选项 hotel_id
  39. if(isset($this->post['hotel_id']) && is_numeric($this->post['hotel_id'])){
  40. $where['hotel_id'] = $this->post['hotel_id'];
  41. }
  42. //判断可选项 room_name
  43. if(isset($this->post['room_name']) && is_string($this->post['room_name'])){
  44. $where['room_name'] = ['like',"%{$this->post['room_name']}%"];
  45. }
  46. //判断可选项 status
  47. if(isset($this->post['status']) && is_numeric($this->post['status'])){
  48. $where['status'] = $this->post['status'];
  49. }
  50. $page = $this->post['page']>1?$this->post['page']:1;
  51. $pageSize = $this->post['pageSize']>2?$this->post['pageSize']:2;
  52. $roomModel = new RoomModel();
  53. $roomList = $roomModel->getPage($where,'sort desc,room_id desc',$page,$pageSize);
  54. //取出list部分
  55. $list = $roomList['list'];
  56. $hotelModel = new HotelModel();
  57. //获取当前所有的正常运行的hotel
  58. $hotel_list = $hotelModel->getList(['status'=>0],'',1000);
  59. $hotel_list = $this->toArray($hotel_list);
  60. $hotel_list = array_column($hotel_list,'hotel_name','hotel_id');
  61. foreach($list as &$item){
  62. $item['hotel_name'] = $hotel_list[$item['hotel_id']];
  63. $item['room_imgs'] = $item['room_imgs']?json_decode($item['room_imgs'],true):$item['room_imgs'];
  64. $item['base_info'] = $item['base_info']?json_decode($item['base_info'],true):$item['base_info'];
  65. $item['base_attr'] = $item['base_attr']?json_decode($item['base_attr'],true):$item['base_attr'];
  66. $item['base_other'] = $item['base_other']?json_decode($item['base_other'],true):$item['base_other'];
  67. }
  68. $roomList['list'] = $list;
  69. $this->returnJson($roomList);
  70. }
  71. /**
  72. * 获取房间信息,通过room_id
  73. */
  74. public function getRoomInfoByRoomId(){
  75. $param_list = [
  76. 'room_id'=>'number',
  77. ];
  78. HelperService::diffParam($param_list,$this->post);
  79. $roomModel = new RoomModel();
  80. $roomInfo = $roomModel->getOne(['room_id'=>$this->post['room_id']]);
  81. $roomInfo['room_imgs'] = $roomInfo['room_imgs']?json_decode($roomInfo['room_imgs'],true):$roomInfo['room_imgs'];
  82. $roomInfo['base_info'] = $roomInfo['base_info']?json_decode($roomInfo['base_info'],true):$roomInfo['base_info'];
  83. $roomInfo['base_attr'] = $roomInfo['base_attr']?json_decode($roomInfo['base_attr'],true):$roomInfo['base_attr'];
  84. $roomInfo['base_other'] = $roomInfo['base_other']?json_decode($roomInfo['base_other'],true):$roomInfo['base_other'];
  85. $hotelModel = new HotelModel();
  86. //获取当前所有的正常运行的hotel
  87. $hotel_list = $hotelModel->getList(['status'=>0],'',1000);
  88. $hotel_list = $this->toArray($hotel_list);
  89. $hotel_list = array_column($hotel_list,'hotel_name','hotel_id');
  90. $roomInfo['hotel_name'] = $hotel_list[$roomInfo['hotel_id']];
  91. $this->returnJson($roomInfo);
  92. }
  93. /**
  94. * 保存房间信息
  95. */
  96. public function saveRoom(){
  97. $param_list = [
  98. 'hotel_id'=>'number',
  99. 'room_name'=>'string',
  100. 'room_price'=>'number',
  101. 'total_number'=>'number',
  102. 'room_imgs'=>'array',
  103. 'base_info'=>'array',
  104. 'base_attr'=>'array',
  105. 'base_other'=>'array',
  106. ];
  107. HelperService::diffParam($param_list,$this->post);
  108. $data = [
  109. 'hotel_id'=>$this->post['hotel_id'],
  110. 'room_name'=>$this->post['room_name'],
  111. 'room_price'=>$this->post['room_price'],
  112. 'total_number'=>$this->post['total_number'],
  113. 'room_imgs'=>json_encode($this->post['room_imgs']),
  114. 'base_info'=>json_encode($this->post['base_info']),
  115. 'base_attr'=>json_encode($this->post['base_attr']),
  116. 'base_other'=>json_encode($this->post['base_other'])
  117. ];
  118. $roomModel = new RoomModel();
  119. if(isset($this->post['room_id']) && is_numeric($this->post['room_id'])){
  120. //修改
  121. $where = [
  122. 'room_id'=>$this->post['room_id']
  123. ];
  124. $row = $roomModel->upInfo($where,$data);
  125. $this->returnJson(['row'=>$row]);
  126. }
  127. //添加
  128. $id = $roomModel->addInfo($data);
  129. $this->returnJson(['id'=>$id]);
  130. }
  131. /**
  132. * 修改房间状态或者修改房间排序字段
  133. */
  134. public function updateRoomField(){
  135. $param_list = [
  136. 'room_id'=>'number',
  137. ];
  138. HelperService::diffParam($param_list,$this->post);
  139. $data = [];
  140. if(isset($this->post['status']) && is_numeric($this->post['status'])){
  141. $data['status'] = $this->post['status'];
  142. }
  143. if(isset($this->post['sort']) && is_numeric($this->post['sort'])){
  144. $data['sort'] = $this->post['sort'];
  145. }
  146. if(empty($data)){
  147. $this->returnJson('you must give me status or sort,but you do not',4001,'error');
  148. }
  149. $roomModel = new RoomModel();
  150. $row = $roomModel->upInfo(['room_id'=>$this->post['room_id']],$data);
  151. $this->returnJson(['row'=>$row]);
  152. }
  153. /**
  154. * 通过条件获取酒店的列表
  155. */
  156. public function getHotelPageByCondition(){
  157. $param_list = [
  158. 'page'=>'number',
  159. 'pageSize'=>'number',
  160. ];
  161. HelperService::diffParam($param_list,$this->post);
  162. $page = $this->post['page']>1?$this->post['page']:1;
  163. $pageSize = $this->post['pageSize']>2?$this->post['pageSize']:2;
  164. $where = [];
  165. if(isset($this->post['name'])){
  166. $where['hotel_name'] = ['like',"%{$this->post['name']}%"];
  167. }
  168. $hotelModel = new HotelModel();
  169. $hotelPage = $hotelModel->getPage($where,'',$page,$pageSize);
  170. $this->returnJson($hotelPage);
  171. }
  172. /**
  173. * 通过条件获取订单分页信息
  174. */
  175. public function getOrderPageByCondition(){
  176. $param_list = [
  177. 'page'=>'number',
  178. 'pageSize'=>'number',
  179. ];
  180. HelperService::diffParam($param_list,$this->post);
  181. $where = [];
  182. if(isset($this->post['order_no']) && is_string($this->post['order_no'])){
  183. $where['order_no'] = ['like','%'.$this->post['order_no']."%"];
  184. }
  185. if(isset($this->post['start_date']) && is_string($this->post['start_date'])){
  186. $where['start_date'] = $this->post['start_date'];
  187. }
  188. if(isset($this->post['end_date']) && is_string($this->post['end_date'])){
  189. $where['end_date'] = $this->post['end_date'];
  190. }
  191. if(isset($this->post['add_time']) && is_string($this->post['add_time'])){
  192. $where['add_time'] = ['between',$this->post['add_time'],$this->post['add_time']+86400];
  193. }
  194. if(isset($this->post['hotel_id']) && is_string($this->post['hotel_id'])){
  195. $where['hotel_id'] = $this->post['hotel_id'];
  196. }
  197. if(isset($this->post['user_id']) && is_numeric($this->post['user_id'])){
  198. $where['user_id'] = $this->post['user_id'];
  199. }
  200. if(isset($this->post['room_id']) && is_numeric($this->post['room_id'])){
  201. $where['room_id'] = $this->post['room_id'];
  202. }
  203. $where['status'] = ['neq',6];
  204. if(isset($this->post['status']) && is_numeric($this->post['status'])){
  205. $where['status'] = $this->post['status'];
  206. }
  207. if(isset($this->post['status_show']) && is_string($this->post['status_show'])){
  208. $where['status_show'] = $this->post['status_show'];
  209. }
  210. $page = $this->post['page']>1?$this->post['page']:1;
  211. $pageSize = $this->post['pageSize']>2?$this->post['pageSize']:2;
  212. if($pageSize>=100){
  213. $this->returnJson([],400,'pageSize must lt 100');
  214. }
  215. $orderModel = new OrderModel();
  216. $orderPage = $orderModel->getPage($where,"order_id desc",$page,$pageSize);
  217. $this->returnJson($orderPage);
  218. }
  219. /**
  220. * 通过条件获取订单信息
  221. */
  222. public function getUserOrderByType(){
  223. $param_list = [
  224. 'user_id'=>'number',
  225. 'status'=>'int'
  226. ];
  227. HelperService::diffParam($param_list,$this->post);
  228. if(!in_array($this->post['status'],[0,1,2,3,5,10])){
  229. $this->returnJson([],400,'status is error');
  230. }
  231. $params = [];
  232. $params['user_id'] = $this->post['user_id'];
  233. if($this->post['status']!=10){
  234. $params['status'] = $this->post['status'];
  235. }
  236. $OrderModel = new OrderModel();
  237. $Order = $OrderModel->getList($params,'start_date desc');
  238. $roomModel = new RoomModel();
  239. foreach($Order as &$orderItem){
  240. $room_id = $orderItem['room_id'];
  241. $room = $roomModel->getOne(['room_id'=>$room_id]);
  242. !empty($room['room_imgs'])?$room['room_imgs'] = json_decode($room['room_imgs']):'';
  243. !empty($room['base_info'])?$room['base_info'] = json_decode($room['base_info']):'';
  244. !empty($room['base_attr'])?$room['base_attr'] = json_decode($room['base_attr']):'';
  245. !empty($room['base_other'])?$room['base_other'] = json_decode($room['base_other']):'';
  246. $orderItem['roomInfo'] = $room;
  247. }
  248. $this->returnJson($Order);
  249. }
  250. /**
  251. * 添加订单信息
  252. */
  253. public function addOrder(){
  254. $param_list = [
  255. 'user_id'=>'number',
  256. 'hotel_id'=>'number',
  257. 'room_id'=>'number',
  258. 'total_room_num'=>'number',
  259. 'arrive_time'=>'string',
  260. 'start_date'=>'string',
  261. 'end_date'=>'string'
  262. ];
  263. HelperService::diffParam($param_list,$this->post);
  264. $roomModel = new RoomModel();
  265. $row = $roomModel->getOne(['room_id'=>$this->post['room_id']]);
  266. $price_single = $row['room_price'];
  267. $diff_date = (strtotime($this->post['end_date']) - strtotime($this->post['start_date']))/86400;
  268. $order_no = $this->createOrderNum();
  269. $data = [
  270. 'order_no'=>$order_no,
  271. 'user_id'=>$this->post['user_id'],
  272. 'hotel_id'=>$this->post['hotel_id'],
  273. 'room_id'=>$this->post['room_id'],
  274. 'total_price'=>$price_single*($this->post['total_room_num'])*$diff_date,
  275. 'total_room_num'=>$this->post['total_room_num'],
  276. 'status'=>0,
  277. 'arrive_time'=>$this->post['arrive_time'],
  278. 'start_date'=>$this->post['start_date'],
  279. 'end_date'=>$this->post['end_date'],
  280. 'add_time'=>time(),
  281. 'note'=>isset($this->post['note'])?$this->post['note']:null,
  282. 'detail'=>isset($this->post['detail'])?$this->post['detail']:null,
  283. ];
  284. $orderModel = new OrderModel();
  285. $order_id=$orderModel->addInfo($data);
  286. $this->returnJson(['order_no'=>$order_no,'order_id'=>$order_id]);
  287. }
  288. /**
  289. * 后台修改订单状态
  290. */
  291. public function backUpdateOrderStatus(){
  292. $param_list = [
  293. 'status'=>'number',
  294. 'order_id'=>'number',
  295. ];
  296. HelperService::diffParam($param_list,$this->post);
  297. $orderModel = new OrderModel();
  298. $where = [
  299. 'order_id'=>$this->post['order_id'],
  300. ];
  301. $data = [
  302. 'status'=>$this->post['status'],
  303. ];
  304. if(isset($this->post['back_note'])){
  305. $data['back_note'] = $this->post['back_note'];
  306. }
  307. $row = $orderModel->upInfo($where,$data);
  308. $this->returnJson(['row'=>$row]);
  309. }
  310. /**
  311. * 后台修改订单状态
  312. */
  313. public function UpdateOrderStatusShow(){
  314. $param_list = [
  315. 'status_show'=>'number',
  316. 'order_id'=>'number',
  317. ];
  318. HelperService::diffParam($param_list,$this->post);
  319. $orderModel = new OrderModel();
  320. $where = [
  321. 'order_id'=>$this->post['order_id'],
  322. ];
  323. $data = [
  324. 'status_show'=>$this->post['status_show'],
  325. ];
  326. if(isset($this->post['back_note'])){
  327. $data['back_note'] = $this->post['back_note'];
  328. }
  329. $row = $orderModel->upInfo($where,$data);
  330. $this->returnJson(['row'=>$row]);
  331. }
  332. /**
  333. * 前台修改订单状态
  334. */
  335. public function frontUpdateOrderStatus(){
  336. $param_list = [
  337. 'status'=>'number',
  338. 'order_no'=>'number',
  339. ];
  340. HelperService::diffParam($param_list,$this->post);
  341. $orderModel = new OrderModel();
  342. $where = [
  343. 'order_no'=>$this->post['order_no'],
  344. ];
  345. $data = [
  346. 'status'=>$this->post['status'],
  347. ];
  348. if(isset($this->post['note'])){
  349. $data['note'] = $this->post['note'];
  350. }
  351. $row = $orderModel->upInfo($where,$data);
  352. $this->returnJson(['row'=>$row]);
  353. }
  354. /**
  355. * 获取酒店信息,根据酒店id
  356. */
  357. public function getHotelInfoById(){
  358. $param_list = [
  359. 'hotel_id'=>'number',
  360. ];
  361. HelperService::diffParam($param_list,$this->post);
  362. $hotelModel = new HotelModel();
  363. $res = $hotelModel->getOne(['hotel_id'=>$this->post['hotel_id']]);
  364. $this->returnJson($res);
  365. }
  366. /**
  367. * 根据订单id获取订单信息
  368. */
  369. public function getOrderInfoById(){
  370. $param_list = [
  371. 'order_id'=>'number'
  372. ];
  373. HelperService::diffParam($param_list,$this->post);
  374. $orderModel = new OrderModel();
  375. $order = $orderModel->getOne(['order_id'=>$this->post['order_id']]);
  376. $this->returnJson($order);
  377. }
  378. /**
  379. * 根据订单id获取订单信息
  380. */
  381. public function getOrderInfoByOrderNo(){
  382. $param_list = [
  383. 'order_no'=>'string'
  384. ];
  385. HelperService::diffParam($param_list,$this->post);
  386. if(strlen($this->post['order_no']) > 16){
  387. $this->returnJson([],400,'order_no is error');
  388. }
  389. $orderModel = new OrderModel();
  390. $order = $orderModel->getOne(['order_no'=>$this->post['order_no']]);
  391. $this->returnJson($order);
  392. }
  393. /**
  394. * 获取房间剩余数量的列表
  395. */
  396. public function getHotelRemainRoom(){
  397. $param_list = [
  398. 'hotel_id'=>'int',
  399. 'room_id'=>'int',
  400. 'start_date'=>'date'
  401. ];
  402. HelperService::diffParam($param_list,$this->post);
  403. //获取当前房间的信息
  404. $RoomModel = new RoomModel();
  405. $RoomInfo = $RoomModel->getRoomInfo($this->post['hotel_id'],$this->post['room_id']);
  406. if(empty($RoomInfo)){
  407. $this->returnJson([],400,"don't find this room info");
  408. }
  409. unset($RoomInfo['room_imgs'],$RoomInfo['base_info'],
  410. $RoomInfo['base_attr'],$RoomInfo['base_other']);
  411. $start_date = strtotime($this->post['start_date']);
  412. $remainNum = [];
  413. $orderModel = new OrderModel();
  414. for($date=$start_date;$date<$start_date+10*86400;$date+=86400){
  415. $dateYmd = date('Y-m-d',$date);
  416. $remain = $RoomInfo['total_number'] - $orderModel->getOrderNumByDate($this->post['hotel_id'],$this->post['room_id'],$dateYmd);
  417. $remainNum[] = [
  418. 'date'=>$dateYmd,
  419. 'remain'=>$remain<0?0:$remain];
  420. }
  421. $this->returnJson(['roomInfo'=>$RoomInfo,'remainInfo'=>$remainNum]);
  422. }
  423. /**
  424. * 获取该酒店可预约的房间列表
  425. */
  426. public function getReservedRoomList(){
  427. $param_list = [
  428. 'hotel_id'=>'number',
  429. 'start_date'=>'date',//格式,必须YYYY-mm-dd
  430. 'end_date'=>'date',
  431. ];
  432. HelperService::diffParam($param_list,$this->post);
  433. $start_time = strtotime($this->post['start_date']);//2017-06-25
  434. $end_time = strtotime($this->post['end_date']);//2017-06-26
  435. //判断时间间隔是否超过2个月,让sql调用过于频繁保护机制
  436. if($end_time - $start_time > 86400*30){
  437. $this->returnJson('Sorry, the time interval should not exceed one months',503,'error');
  438. }
  439. if($end_time - $start_time < 86400){
  440. $this->returnJson('Sorry, the interval is less than one day',503,'error');
  441. }
  442. $roomModel = new RoomModel();
  443. //返回的数组
  444. $return_arr = [];
  445. for($time = $start_time;$time<$end_time; $time+=86400){
  446. $date = date('Y-m-d',$time);
  447. $roomList = $roomModel->getReservedRoomList($this->post['hotel_id'],$date);
  448. //分析这段时间房间的情况
  449. $return_arr = $this->_analysis($return_arr,$roomList);
  450. }
  451. $this->returnJson($return_arr);
  452. }
  453. /**
  454. * 分析房间数据
  455. * @param $return_arr
  456. * @param $roomList
  457. */
  458. private function _analysis($return_arr,$roomList){
  459. foreach($roomList as $item){
  460. //如果房间信息存在,并且房间信息已经于之前发现超限了,那么不再重新赋值 (step1)
  461. if(isset($return_arr[$item['room_id']]) &&
  462. ($item['sum_num'] <= $return_arr[$item['room_id']]['sum_num'])){
  463. continue;
  464. }
  465. //为了简化程序,不再判断当前情况下,本次的房间信息是否超限的判断,直接赋值,丢给下次循环(step1)判断
  466. $item['room_imgs'] = json_decode($item['room_imgs']);
  467. $return_arr[$item['room_id']] = $item;
  468. }
  469. return $return_arr;
  470. }
  471. /**
  472. * 当前日期前一天的
  473. */
  474. public function getHotelOrderDayNum(){
  475. $end_date = isset($this->post['end_date'])?strtotime(intval($this->post['end_date'])):strtotime(date('Y-m-d'));
  476. $start_date = isset($this->post['end_date'])?strtotime(intval($this->post['end_date'])):$end_date-7*86400;
  477. if($start_date > $end_date){
  478. $this->returnJson([]);
  479. }
  480. if($end_date - $start_date > 20*86400){
  481. $start_date = $end_date - 20*86400;
  482. }
  483. $backData = [];
  484. $orderModel = new OrderModel();
  485. $hotelModel = new HotelModel();
  486. $hotel = $hotelModel->where(['status'=>0])->select();
  487. for($date = $start_date;$date<$end_date;$date+=86400){
  488. //确保数据完整性,每个补充0
  489. foreach($hotel as $hotel_item){
  490. $backData[$hotel_item['hotel_id']][date('Y-m-d',$date)] = 0;
  491. }
  492. $orderGroup = $orderModel->field('hotel_id,count(order_id) as num')->where(['pay_time'=>['between',[$date,$date+86399]]])
  493. ->group('hotel_id')->select();
  494. //覆盖上面对等的值
  495. foreach($orderGroup as $group){
  496. $backData[$group['hotel_id']][date('Y-m-d',$date)] = intval($group['num']);
  497. }
  498. }
  499. $this->returnJson($backData);
  500. }
  501. /**
  502. * 待处理订单数目
  503. */
  504. public function getToDoOrder(){
  505. $orderModel = new OrderModel();
  506. $order = $orderModel->field('hotel_id,count(order_id) as num')->where(['status'=>1])->group('hotel_id')->select();
  507. $this->returnJson($order);
  508. }
  509. }