select([ 'order_id', 'order_title_id', //组合订单id 'order_status', //订单状态 'order_level', //显示取消单,确认单,修改单 'docking_type', //直连标识 'gathering_status', //关帐标识 'outside_sale_org_id', //渠道订单号 'prod_id as room_type', //订单子房型, 'parent_prod_id as hotel_id', //酒店id 'base_room_type' => new Expression('(select parent_room_type from opera_hotel_room where opera_hotel_room.hotel_id = order_main.parent_prod_id and opera_hotel_room.room_type=order_main.prod_id and opera_hotel_room.cancel_flag=0 limit 1)'), 'channel_order_status', ])->where(['and', ['=', 'ORDER_ID', $order_id], ['=', 'CANCEL_FLAG', 0]])->asArray()->one(); //子订单库存 // select run_date,stock_type,count(1) as saled_count from order_main where parent_order_id = 1010737 and cancel_flag=0 group by run_date,stock_type $son_data = OrderMain::find()->select(['run_date', 'stock_type', 'count(1) as saled_count']) ->where(['and', ['=', 'parent_order_id', $order_id], ['=', 'cancel_flag', 0]]) ->groupBy('run_date,stock_type') ->asArray() ->all(); //渠道超卖数据 // " select * from order_ht_consume_stock where order_id = 1010737 and cancel_flag= 0" $channel_data = OrderMain::find()->select(['order_id', 'distrib_id', 'run_date', 'consume_stock_count']) ->from('order_ht_consume_stock') ->where(['and', ['=', 'order_id', $order_id], ['=', 'cancel_flag', 0]]) ->asArray() ->all(); //处理数据 foreach ($son_data as $k => $v) { $data['run_date'][$v['run_date'] . '|' . $v['stock_type']]['run_date'] = $v['run_date']; $data['run_date'][$v['run_date'] . '|' . $v['stock_type']]['stock_type'] = $v['stock_type']; $data['run_date'][$v['run_date'] . '|' . $v['stock_type']]['saled_count'] = $v['saled_count']; $data['run_date'][$v['run_date'] . '|' . $v['stock_type']]['distrib_id'] = 0; $data['run_date'][$v['run_date'] . '|' . $v['stock_type']]['consume_stock_count'] = 0; } if (count($channel_data) > 0) { foreach ($channel_data as $k => $v) { $tp = isset($data['run_date'][$v['run_date'] . '|' . 228]) ? $v['run_date'] . '|' . 228 : (isset($data['run_date'][$v['run_date'] . '|' . 229]) ? $v['run_date'] . '|' . 229 : (isset($data['run_date'][$v['run_date'] . '|' . 230]) ? $v['run_date'] . '|' . 230 : '')); $data['run_date'][$tp]['distrib_id'] = $v['distrib_id']; $data['run_date'][$tp]['consume_stock_count'] = $v['consume_stock_count']; } } return $data; } /* * User:luocj * * 可取消检查 */ public function checkIfCancel($data) { //订单需在 198待确认,313待发单,564带退单确认 情况下可以取消 且未关账可以取消 if (!in_array($data['order_status'], [198, 313, 564]) || !in_array($data['gathering_status'], [0, 1])) { return false; } else { return true; } } /** * @param $data * * @return mixed * @throws Exception */ public function cancelOrder($data,$user_id) { $transaction = Yii::$app->db->beginTransaction(); try { foreach ($data['run_date'] as $k => $v) { #region 1.更新run_hotel 库存 //订单状态为 564 &库存为230 则 不返还库存 其余则返回库存 if ($data['order_status'] == 564 && $v['stock_type'] == 230) { $update_info = [ 'saled_count' => new Expression("saled_count-{$v['saled_count']}"), 'update_user_id' => $user_id, ]; $update_where = [ 'hotel_id' => $data['hotel_id'], 'base_room_type' => $data['base_room_type'], 'run_date' => $v['run_date'], 'stock_type' => $v['stock_type'], ]; RunHotel::updateAll($update_info, $update_where); } else { $update_info = [ 'saled_count' => new Expression("saled_count-{$v['saled_count']}"), 'update_user_id' => $user_id, 'remaining_count' => new Expression("remaining_count + {$v['saled_count']}"), ]; RunHotel::updateAll($update_info, [ 'hotel_id' => $data['hotel_id'], 'base_room_type' => $data['base_room_type'], 'run_date' => $v['run_date'], 'stock_type' => $v['stock_type'], ] ); } #endregion #region 2.更新run_hotel_distrib 库存 //正常取消 状态为198和313 还渠道库存,还已售 异常取消 只还已售 if (in_array($data['order_status'], [198, 313])) { //归还本渠道库存 和已售 $update_info = [ 'remaining_count' => new Expression("remaining_count + {$v['saled_count']}-{$v['consume_stock_count']}"), 'saled_count' => new Expression("saled_count - {$v['saled_count']}"), 'update_user_id' => $user_id, ]; $update_where = [ 'hotel_id' => $data['hotel_id'], 'distrib_id' => $data['outside_sale_org_id'], 'base_room_type' => $data['base_room_type'], 'room_type' => $data['room_type'], 'run_date' => $v['run_date'] ]; //归还借用渠道的库存 $update_other_info = [ 'remaining_count' => new Expression("remaining_count + {$v['consume_stock_count']}"), 'update_user_id' => $user_id, ]; $update_other_where = [ 'hotel_id' => $data['hotel_id'], 'distrib_id' => $v['distrib_id'], 'base_room_type' => $data['base_room_type'], 'room_type' => $data['room_type'], 'run_date' => $v['run_date'] ]; RunHotelDistrib::updateAll($update_info, $update_where); RunHotelDistrib::updateAll($update_other_info, $update_other_where); //借条 cancel_flag 置1 Yii::$app->db ->createCommand("update order_ht_consume_stock set cancel_flag=1 where order_id = :order_id") ->bindValues(array(':order_id' => $data['order_id'])) ->execute(); } else { //异常取消 只还已售 $update_info = [ 'saled_count' => new Expression("saled_count - {$v['saled_count']}"), 'update_user_id' => $user_id, ]; $update_where = [ 'hotel_id' => $data['hotel_id'], 'distrib_id' => $data['outside_sale_org_id'], 'base_room_type' => $data['base_room_type'], 'room_type' => $data['room_type'], 'run_date' => $v['run_date'] ]; RunHotelDistrib::updateAll($update_info, $update_where); } #endregion } #region 更新order_main 状态 #更新父订单 1:正常取消 2:正常修改 3:异常修改 4:异常取消 $update_info = [ 'order_status' => 148, 'order_valid_status' => 0, 'order_disable_user_id' => $user_id, 'update_user_id' => $user_id, 'order_disable_time' => date('Y-m-d H:i:s'), 'update_time' => date('Y-m-d H:i:s'), 'order_level' => 2 ]; //如果为直连订单需要修改 channel_order_status =563 if ($data['docking_type'] == 556 && (($data['channel_order_status']==553 && $data['order_status'] == 198) || ($data['channel_order_status']==553 && $data['order_status'] == 198)) ) { $update_info = array_merge($update_info, ['channel_order_status' => 563]); } $update_where = [ 'and', ['or', ['=', 'order_id', $data['order_id']], ['=', 'parent_order_id', $data['order_id']]], ['=', 'cancel_flag', 0] ]; OrderMain::updateAll($update_info, $update_where); #endregion #region 推送携程 // if (!empty($data)) { // $this->pushRoomInfo($data['hotel_id'], $data['base_room_type'], $data['room_type'], $data['run_date']); // } #endregion #region 更新LOG if ($this->hotelLog($data['order_id'], 3, '取消订单', $user_id) == false || $this->hotelStatusLog($data['order_id'], 148, $data['order_status'], $user_id) == false) throw new Exception('备注LOG数据错误'); #endregion $transaction->commit(); $json['code'] = '0'; $json['info'] = '取消成功'; $json['order_id'] = $data['order_id']; //TODO:: 非异常取消直接去掉该order_id memcache 异常则修改memcache订单的状态 //memcache 去掉该取消订单memcache self::resetMemcache($data['order_id']); //供应商余额 $model = new BaseBalance($data['order_id'], 2, '组合订单部分:取消还款'); $sup_data = $model->cancelBalanceMain(); $model->addLog($sup_data); return $json; } catch (\yii\db\Exception $exception) { $transaction->rollBack(); $json['code'] = '1'; $json['info'] = '取消失败'; return $json; } } /** * User: wangxj * * 清除memcache * * @order_id integer 订单号 * */ function resetMemcache($order_id) { $newOrder = Yii::$app->cacheCS->get('hotel_newOrder'); if ($newOrder && $this->count($newOrder) > 0) { foreach ($newOrder as &$vs) { if (count($vs) > 0) { foreach ($vs as $k => &$v) { if ($v['order_id'] == $order_id) { unset($vs[$k]); Yii::$app->cacheCS->set('hotel_newOrder', $newOrder); } } } } } } /** * User: wangxj * * 添加订单到memcache * * @supplier_id string 供应商ID * @order_id string 订单号 * @status integer 订单状态, 313待发单、382异常处理待发单,383异常处理已取消,148正常已取消,147已完成,198待确认,314已安排。 * @room_name string 房型 * @expire string 默认为0,memcache时效 * */ function setMemcache($order_id, $type, $prod_top_org_id, $prod_name, $expire = 0) { $this->resetMemcache($order_id); $newOrder = Yii::$app->cacheCS->get('hotel_newOrder'); $tmp = array(); if ($order_id) { if ($newOrder && count($newOrder) > 0) { //按天为单位读取缓存 // if(isset($newOrder[date('Y-m-d')])){ // $tmp = $newOrder[date('Y-m-d')]; // } if (isset($newOrder[$prod_top_org_id])) { array_push($newOrder[$prod_top_org_id], array('order_id' => $order_id, 'type' => $type, 'room_name' => $prod_name, 'status' => 0)); } else { $newOrder[$prod_top_org_id] = array(array('order_id' => $order_id, 'type' => $type, 'room_name' => $prod_name, 'status' => 0)); } $tmp = $newOrder; } else { $tmp[$prod_top_org_id] = array(array('order_id' => $order_id, 'type' => $type, 'room_name' => $prod_name, 'status' => 0)); } Yii::$app->cacheCS->set('hotel_newOrder', $tmp, 0, $expire); } } /** * User:luocj * 酒店订单各状态实时变化表log * * @param $order_id //订单号 * @param $order_status //订单修改成的状态 * @param $before_status // 订单修改前的状态 * * @return bool */ public function hotelStatusLog($order_id, $order_status, $before_status, $user_id) { $update_info = ['cancel_flag' => 1]; $update_where = ['order_id' => $order_id]; OrderHtStatusLog::updateAll($update_info, $update_where); $obj = new OrderHtStatusLog(); $obj->ORDER_ID = $order_id; $obj->ORDER_STATUS = $order_status; $obj->BEFORE_STATUS = $before_status; $obj->CANCEL_FLAG = 0; $obj->CREATE_USER_ID = $user_id; $obj->UPDATE_USER_ID = $user_id; $obj->UPDATE_TIME = date('Y-m-d H:i:s'); $obj->CREATE_TIME = date('Y-m-d H:i:s'); if ($obj->save() > 0) return true; else return false; } /** * @param $order_id //酒店订单id * @param $log_type //日志类型 1:酒店 2:房态 3:订单 * @param $log_desc //日志描述 * * @return bool */ public function hotelLog($order_id, $log_type, $log_desc, $user_id) { $tmp_data = $this->getOrderInfo($order_id); $obj = new OperaHotelLog(); $obj->CREATE_USER_ID = $user_id; $obj->CREATE_TIME = date('Y-m-d H:i:s'); $obj->LOG_TYPE = $log_type; $obj->HOTEL_ID = $tmp_data['hotel_id']; $obj->ORDER_ID = $order_id; $obj->PARENT_ROOM_TYPE = $tmp_data['base_room_type']; $obj->ROOM_TYPE = $tmp_data['room_type']; $obj->LOG_DESC = $log_desc; if ($obj->save() > 0) return true; else return false; } /** * User: wangxj * * 推送对接的渠道商房态 * * @param $hotel_id * @param $parent_room_type * @param $room_type * @param string $startDate * @param string $endDate * @param string $loop 循环次数 */ function pushRoomInfo($hotel_id, $parent_room_type, $room_type, $startDate = '', $endDate = '', $loop = 1) { // 26: 上海浦东星河湾 104:杭州千岛湖龙庭开元大酒店 取消MAPPING // 36:上海东郊宾馆 108:朱家尖慈航大酒店 125 上海浦西万怡 128 昆山皇冠假日酒店 106:义乌三鼎开元名都大酒店 //99:上海茂业华美达广场酒店 37 外滩茂悦 19 嘉兴景澜月河客栈 23:上海花园饭店 $sql = "select hotel_str from hotel_mapping where channel_id=669"; $hotel = Yii::$app->db->createCommand($sql)->queryAll(); $hotel_str = isset($hotel[0]['hotel_str']) ? $hotel[0]['hotel_str'] : ''; $hotel_arr = explode(',', $hotel_str); if (in_array($hotel_id, $hotel_arr)) { //推送对接房态 if ($startDate !== '' && $endDate === '') { $endDate = $startDate; } $startDate = $startDate != '' ? $startDate : date('Y-m-d'); $endDate = $endDate != '' ? $endDate : date('Y-m-d', strtotime('+90 days')); $data['StartDate'] = $startDate; $data['EndDate'] = $endDate; $data['hotel_id'] = $hotel_id; $data['parent_room_type'] = $parent_room_type; $data['room_type'] = $room_type; $data['loop'] = $loop; $data['user_id'] = Yii::$app->user->id; // $res = Msg::httpRequest($this->ctrip_url . 'hotel/ctrip/set-room-info', $data); // // //SetRoomPrice(设置房型价格)向渠道商推送房型价格 // $res = Msg::httpRequest($this->ctrip_url . 'hotel/ctrip/set-room-price', $data); // // //更新保留房数量 // $res = Msg::httpRequest($this->ctrip_url . 'hotel/ctrip/update-room-quantity', $data); } } }