123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612 |
- <?php
- namespace app\index\controller;
- use app\index\model\hotel\HotelModel;
- use app\index\model\hotel\OrderModel;
- use app\index\model\hotel\RoomModel;
- use app\index\service\HelperService;
- class Hotel extends CmsController
- {
- public function _initialize(){
- parent::_initialize();
- //结束掉,订单结束时间小于当前时间的支付完成的订单
- $this->_endOrder();
- }
- /**
- * 将已支付的,并且结束时间到期的订单结束掉
- */
- private function _endOrder(){
- $date = date('Y-m-d');
- $hours = date('H');
- if($hours > 13){
- $orderModel = new OrderModel();
- $orderModel->upInfo(['status'=>1,'end_date'=>['elt',$date]],['status'=>3]);
- }else{
- $orderModel = new OrderModel();
- $orderModel->upInfo(['status'=>1,'end_date'=>['lt',$date]],['status'=>3]);
- }
- }
- /**
- * 通过条件获取房间类型的分页
- */
- public function getRoomPageByCondition(){
- $param_list = [
- 'page'=>'number',
- 'pageSize'=>'number',
- ];
- HelperService::diffParam($param_list,$this->post);
- $where = [];
- //判断可选项 hotel_id
- if(isset($this->post['hotel_id']) && is_numeric($this->post['hotel_id'])){
- $where['hotel_id'] = $this->post['hotel_id'];
- }
- //判断可选项 room_name
- if(isset($this->post['room_name']) && is_string($this->post['room_name'])){
- $where['room_name'] = ['like',"%{$this->post['room_name']}%"];
- }
- //判断可选项 status
- if(isset($this->post['status']) && is_numeric($this->post['status'])){
- $where['status'] = $this->post['status'];
- }
- $page = $this->post['page']>1?$this->post['page']:1;
- $pageSize = $this->post['pageSize']>2?$this->post['pageSize']:2;
- $roomModel = new RoomModel();
- $roomList = $roomModel->getPage($where,'sort desc,room_id desc',$page,$pageSize);
- //取出list部分
- $list = $roomList['list'];
- $hotelModel = new HotelModel();
- //获取当前所有的正常运行的hotel
- $hotel_list = $hotelModel->getList(['status'=>0],'',1000);
- $hotel_list = $this->toArray($hotel_list);
- $hotel_list = array_column($hotel_list,'hotel_name','hotel_id');
- foreach($list as &$item){
- $item['hotel_name'] = $hotel_list[$item['hotel_id']];
- $item['room_imgs'] = $item['room_imgs']?json_decode($item['room_imgs'],true):$item['room_imgs'];
- $item['base_info'] = $item['base_info']?json_decode($item['base_info'],true):$item['base_info'];
- $item['base_attr'] = $item['base_attr']?json_decode($item['base_attr'],true):$item['base_attr'];
- $item['base_other'] = $item['base_other']?json_decode($item['base_other'],true):$item['base_other'];
- }
- $roomList['list'] = $list;
- $this->returnJson($roomList);
- }
- /**
- * 获取房间信息,通过room_id
- */
- public function getRoomInfoByRoomId(){
- $param_list = [
- 'room_id'=>'number',
- ];
- HelperService::diffParam($param_list,$this->post);
- $roomModel = new RoomModel();
- $roomInfo = $roomModel->getOne(['room_id'=>$this->post['room_id']]);
- $roomInfo['room_imgs'] = $roomInfo['room_imgs']?json_decode($roomInfo['room_imgs'],true):$roomInfo['room_imgs'];
- $roomInfo['base_info'] = $roomInfo['base_info']?json_decode($roomInfo['base_info'],true):$roomInfo['base_info'];
- $roomInfo['base_attr'] = $roomInfo['base_attr']?json_decode($roomInfo['base_attr'],true):$roomInfo['base_attr'];
- $roomInfo['base_other'] = $roomInfo['base_other']?json_decode($roomInfo['base_other'],true):$roomInfo['base_other'];
- $hotelModel = new HotelModel();
- //获取当前所有的正常运行的hotel
- $hotel_list = $hotelModel->getList(['status'=>0],'',1000);
- $hotel_list = $this->toArray($hotel_list);
- $hotel_list = array_column($hotel_list,'hotel_name','hotel_id');
- $roomInfo['hotel_name'] = $hotel_list[$roomInfo['hotel_id']];
- $this->returnJson($roomInfo);
- }
- /**
- * 保存房间信息
- */
- public function saveRoom(){
- $param_list = [
- 'hotel_id'=>'number',
- 'room_name'=>'string',
- 'room_price'=>'number',
- 'total_number'=>'number',
- 'room_imgs'=>'array',
- 'base_info'=>'array',
- 'base_attr'=>'array',
- 'base_other'=>'array',
- ];
- HelperService::diffParam($param_list,$this->post);
- $data = [
- 'hotel_id'=>$this->post['hotel_id'],
- 'room_name'=>$this->post['room_name'],
- 'room_price'=>$this->post['room_price'],
- 'total_number'=>$this->post['total_number'],
- 'room_imgs'=>json_encode($this->post['room_imgs']),
- 'base_info'=>json_encode($this->post['base_info']),
- 'base_attr'=>json_encode($this->post['base_attr']),
- 'base_other'=>json_encode($this->post['base_other'])
- ];
- $roomModel = new RoomModel();
- if(isset($this->post['room_id']) && is_numeric($this->post['room_id'])){
- //修改
- $where = [
- 'room_id'=>$this->post['room_id']
- ];
- $row = $roomModel->upInfo($where,$data);
- $this->returnJson(['row'=>$row]);
- }
- //添加
- $id = $roomModel->addInfo($data);
- $this->returnJson(['id'=>$id]);
- }
- /**
- * 修改房间状态或者修改房间排序字段
- */
- public function updateRoomField(){
- $param_list = [
- 'room_id'=>'number',
- ];
- HelperService::diffParam($param_list,$this->post);
- $data = [];
- if(isset($this->post['status']) && is_numeric($this->post['status'])){
- $data['status'] = $this->post['status'];
- }
- if(isset($this->post['sort']) && is_numeric($this->post['sort'])){
- $data['sort'] = $this->post['sort'];
- }
- if(empty($data)){
- $this->returnJson('you must give me status or sort,but you do not',4001,'error');
- }
- $roomModel = new RoomModel();
- $row = $roomModel->upInfo(['room_id'=>$this->post['room_id']],$data);
- $this->returnJson(['row'=>$row]);
- }
- /**
- * 通过条件获取酒店的列表
- */
- public function getHotelPageByCondition(){
- $param_list = [
- 'page'=>'number',
- 'pageSize'=>'number',
- ];
- HelperService::diffParam($param_list,$this->post);
- $page = $this->post['page']>1?$this->post['page']:1;
- $pageSize = $this->post['pageSize']>2?$this->post['pageSize']:2;
- $where = [];
- if(isset($this->post['name'])){
- $where['hotel_name'] = ['like',"%{$this->post['name']}%"];
- }
- $hotelModel = new HotelModel();
- $hotelPage = $hotelModel->getPage($where,'',$page,$pageSize);
- $this->returnJson($hotelPage);
- }
- /**
- * 通过条件获取订单分页信息
- */
- public function getOrderPageByCondition(){
- $param_list = [
- 'page'=>'number',
- 'pageSize'=>'number',
- ];
- HelperService::diffParam($param_list,$this->post);
- $where = [];
- if(isset($this->post['order_no']) && is_string($this->post['order_no'])){
- $where['order_no'] = ['like','%'.$this->post['order_no']."%"];
- }
- if(isset($this->post['start_date']) && is_string($this->post['start_date'])){
- $where['start_date'] = $this->post['start_date'];
- }
- if(isset($this->post['end_date']) && is_string($this->post['end_date'])){
- $where['end_date'] = $this->post['end_date'];
- }
- if(isset($this->post['add_time']) && is_string($this->post['add_time'])){
- $where['add_time'] = ['between',$this->post['add_time'],$this->post['add_time']+86400];
- }
- if(isset($this->post['hotel_id']) && is_string($this->post['hotel_id'])){
- $where['hotel_id'] = $this->post['hotel_id'];
- }
- if(isset($this->post['user_id']) && is_numeric($this->post['user_id'])){
- $where['user_id'] = $this->post['user_id'];
- }
- if(isset($this->post['room_id']) && is_numeric($this->post['room_id'])){
- $where['room_id'] = $this->post['room_id'];
- }
- $where['status'] = ['neq',6];
- if(isset($this->post['status']) && is_numeric($this->post['status'])){
- $where['status'] = $this->post['status'];
- }
- if(isset($this->post['status_show']) && is_string($this->post['status_show'])){
- $where['status_show'] = $this->post['status_show'];
- }
- $page = $this->post['page']>1?$this->post['page']:1;
- $pageSize = $this->post['pageSize']>2?$this->post['pageSize']:2;
- if($pageSize>=100){
- $this->returnJson([],400,'pageSize must lt 100');
- }
- $orderModel = new OrderModel();
- $orderPage = $orderModel->getPage($where,"order_id desc",$page,$pageSize);
- $this->returnJson($orderPage);
- }
- /**
- * 通过条件获取订单信息
- */
- public function getUserOrderByType(){
- $param_list = [
- 'user_id'=>'number',
- 'status'=>'int'
- ];
- HelperService::diffParam($param_list,$this->post);
- if(!in_array($this->post['status'],[0,1,2,3,5,10])){
- $this->returnJson([],400,'status is error');
- }
- $params = [];
- $params['user_id'] = $this->post['user_id'];
- if($this->post['status']!=10){
- $params['status'] = $this->post['status'];
- }
- $OrderModel = new OrderModel();
- $Order = $OrderModel->getList($params,'start_date desc');
- $roomModel = new RoomModel();
- foreach($Order as &$orderItem){
- $room_id = $orderItem['room_id'];
- $room = $roomModel->getOne(['room_id'=>$room_id]);
- !empty($room['room_imgs'])?$room['room_imgs'] = json_decode($room['room_imgs']):'';
- !empty($room['base_info'])?$room['base_info'] = json_decode($room['base_info']):'';
- !empty($room['base_attr'])?$room['base_attr'] = json_decode($room['base_attr']):'';
- !empty($room['base_other'])?$room['base_other'] = json_decode($room['base_other']):'';
- $orderItem['roomInfo'] = $room;
- }
- $this->returnJson($Order);
- }
- /**
- * 添加订单信息
- */
- public function addOrder(){
- $param_list = [
- 'user_id'=>'number',
- 'hotel_id'=>'number',
- 'room_id'=>'number',
- 'total_room_num'=>'number',
- 'arrive_time'=>'string',
- 'start_date'=>'string',
- 'end_date'=>'string'
- ];
- HelperService::diffParam($param_list,$this->post);
- $roomModel = new RoomModel();
- $row = $roomModel->getOne(['room_id'=>$this->post['room_id']]);
- $price_single = $row['room_price'];
- $diff_date = (strtotime($this->post['end_date']) - strtotime($this->post['start_date']))/86400;
- $order_no = $this->createOrderNum();
- $data = [
- 'order_no'=>$order_no,
- 'user_id'=>$this->post['user_id'],
- 'hotel_id'=>$this->post['hotel_id'],
- 'room_id'=>$this->post['room_id'],
- 'total_price'=>$price_single*($this->post['total_room_num'])*$diff_date,
- 'total_room_num'=>$this->post['total_room_num'],
- 'status'=>0,
- 'arrive_time'=>$this->post['arrive_time'],
- 'start_date'=>$this->post['start_date'],
- 'end_date'=>$this->post['end_date'],
- 'add_time'=>time(),
- 'note'=>isset($this->post['note'])?$this->post['note']:null,
- 'detail'=>isset($this->post['detail'])?$this->post['detail']:null,
- ];
- $orderModel = new OrderModel();
- $order_id=$orderModel->addInfo($data);
- $this->returnJson(['order_no'=>$order_no,'order_id'=>$order_id]);
- }
- /**
- * 后台修改订单状态
- */
- public function backUpdateOrderStatus(){
- $param_list = [
- 'status'=>'number',
- 'order_id'=>'number',
- ];
- HelperService::diffParam($param_list,$this->post);
- $orderModel = new OrderModel();
- $where = [
- 'order_id'=>$this->post['order_id'],
- ];
- $data = [
- 'status'=>$this->post['status'],
- ];
- if(isset($this->post['back_note'])){
- $data['back_note'] = $this->post['back_note'];
- }
- $row = $orderModel->upInfo($where,$data);
- $this->returnJson(['row'=>$row]);
- }
- /**
- * 后台修改订单状态
- */
- public function UpdateOrderStatusShow(){
- $param_list = [
- 'status_show'=>'number',
- 'order_id'=>'number',
- ];
- HelperService::diffParam($param_list,$this->post);
- $orderModel = new OrderModel();
- $where = [
- 'order_id'=>$this->post['order_id'],
- ];
- $data = [
- 'status_show'=>$this->post['status_show'],
- ];
- if(isset($this->post['back_note'])){
- $data['back_note'] = $this->post['back_note'];
- }
- $row = $orderModel->upInfo($where,$data);
- $this->returnJson(['row'=>$row]);
- }
- /**
- * 前台修改订单状态
- */
- public function frontUpdateOrderStatus(){
- $param_list = [
- 'status'=>'number',
- 'order_no'=>'number',
- ];
- HelperService::diffParam($param_list,$this->post);
- $orderModel = new OrderModel();
- $where = [
- 'order_no'=>$this->post['order_no'],
- ];
- $data = [
- 'status'=>$this->post['status'],
- ];
- if(isset($this->post['note'])){
- $data['note'] = $this->post['note'];
- }
- $row = $orderModel->upInfo($where,$data);
- $this->returnJson(['row'=>$row]);
- }
- /**
- * 获取酒店信息,根据酒店id
- */
- public function getHotelInfoById(){
- $param_list = [
- 'hotel_id'=>'number',
- ];
- HelperService::diffParam($param_list,$this->post);
- $hotelModel = new HotelModel();
- $res = $hotelModel->getOne(['hotel_id'=>$this->post['hotel_id']]);
- $this->returnJson($res);
- }
- /**
- * 根据订单id获取订单信息
- */
- public function getOrderInfoById(){
- $param_list = [
- 'order_id'=>'number'
- ];
- HelperService::diffParam($param_list,$this->post);
- $orderModel = new OrderModel();
- $order = $orderModel->getOne(['order_id'=>$this->post['order_id']]);
- $this->returnJson($order);
- }
- /**
- * 根据订单id获取订单信息
- */
- public function getOrderInfoByOrderNo(){
- $param_list = [
- 'order_no'=>'string'
- ];
- HelperService::diffParam($param_list,$this->post);
- if(strlen($this->post['order_no']) > 16){
- $this->returnJson([],400,'order_no is error');
- }
- $orderModel = new OrderModel();
- $order = $orderModel->getOne(['order_no'=>$this->post['order_no']]);
- $this->returnJson($order);
- }
- /**
- * 获取房间剩余数量的列表
- */
- public function getHotelRemainRoom(){
- $param_list = [
- 'hotel_id'=>'int',
- 'room_id'=>'int',
- 'start_date'=>'date'
- ];
- HelperService::diffParam($param_list,$this->post);
- //获取当前房间的信息
- $RoomModel = new RoomModel();
- $RoomInfo = $RoomModel->getRoomInfo($this->post['hotel_id'],$this->post['room_id']);
- if(empty($RoomInfo)){
- $this->returnJson([],400,"don't find this room info");
- }
- unset($RoomInfo['room_imgs'],$RoomInfo['base_info'],
- $RoomInfo['base_attr'],$RoomInfo['base_other']);
- $start_date = strtotime($this->post['start_date']);
- $remainNum = [];
- $orderModel = new OrderModel();
- for($date=$start_date;$date<$start_date+10*86400;$date+=86400){
- $dateYmd = date('Y-m-d',$date);
- $remain = $RoomInfo['total_number'] - $orderModel->getOrderNumByDate($this->post['hotel_id'],$this->post['room_id'],$dateYmd);
- $remainNum[] = [
- 'date'=>$dateYmd,
- 'remain'=>$remain<0?0:$remain];
- }
- $this->returnJson(['roomInfo'=>$RoomInfo,'remainInfo'=>$remainNum]);
- }
- /**
- * 获取该酒店可预约的房间列表
- */
- public function getReservedRoomList(){
- $param_list = [
- 'hotel_id'=>'number',
- 'start_date'=>'date',//格式,必须YYYY-mm-dd
- 'end_date'=>'date',
- ];
- HelperService::diffParam($param_list,$this->post);
- $start_time = strtotime($this->post['start_date']);//2017-06-25
- $end_time = strtotime($this->post['end_date']);//2017-06-26
- //判断时间间隔是否超过2个月,让sql调用过于频繁保护机制
- if($end_time - $start_time > 86400*30){
- $this->returnJson('Sorry, the time interval should not exceed one months',503,'error');
- }
- if($end_time - $start_time < 86400){
- $this->returnJson('Sorry, the interval is less than one day',503,'error');
- }
- $roomModel = new RoomModel();
- //返回的数组
- $return_arr = [];
- for($time = $start_time;$time<$end_time; $time+=86400){
- $date = date('Y-m-d',$time);
- $roomList = $roomModel->getReservedRoomList($this->post['hotel_id'],$date);
- //分析这段时间房间的情况
- $return_arr = $this->_analysis($return_arr,$roomList);
- }
- $this->returnJson($return_arr);
- }
- /**
- * 分析房间数据
- * @param $return_arr
- * @param $roomList
- */
- private function _analysis($return_arr,$roomList){
- foreach($roomList as $item){
- //如果房间信息存在,并且房间信息已经于之前发现超限了,那么不再重新赋值 (step1)
- if(isset($return_arr[$item['room_id']]) &&
- ($item['sum_num'] <= $return_arr[$item['room_id']]['sum_num'])){
- continue;
- }
- //为了简化程序,不再判断当前情况下,本次的房间信息是否超限的判断,直接赋值,丢给下次循环(step1)判断
- $item['room_imgs'] = json_decode($item['room_imgs']);
- $return_arr[$item['room_id']] = $item;
- }
- return $return_arr;
- }
- /**
- * 当前日期前一天的
- */
- public function getHotelOrderDayNum(){
- $end_date = isset($this->post['end_date'])?strtotime(intval($this->post['end_date'])):strtotime(date('Y-m-d'));
- $start_date = isset($this->post['end_date'])?strtotime(intval($this->post['end_date'])):$end_date-7*86400;
- if($start_date > $end_date){
- $this->returnJson([]);
- }
- if($end_date - $start_date > 20*86400){
- $start_date = $end_date - 20*86400;
- }
- $backData = [];
- $orderModel = new OrderModel();
- $hotelModel = new HotelModel();
- $hotel = $hotelModel->where(['status'=>0])->select();
- for($date = $start_date;$date<$end_date;$date+=86400){
- //确保数据完整性,每个补充0
- foreach($hotel as $hotel_item){
- $backData[$hotel_item['hotel_id']][date('Y-m-d',$date)] = 0;
- }
- $orderGroup = $orderModel->field('hotel_id,count(order_id) as num')->where(['pay_time'=>['between',[$date,$date+86399]]])
- ->group('hotel_id')->select();
- //覆盖上面对等的值
- foreach($orderGroup as $group){
- $backData[$group['hotel_id']][date('Y-m-d',$date)] = intval($group['num']);
- }
- }
- $this->returnJson($backData);
- }
- /**
- * 待处理订单数目
- */
- public function getToDoOrder(){
- $orderModel = new OrderModel();
- $order = $orderModel->field('hotel_id,count(order_id) as num')->where(['status'=>1])->group('hotel_id')->select();
- $this->returnJson($order);
- }
- }
|