|
- <?php
- /**
- * Created by PhpStorm.
- * User: luocj
- * Date: 2017/6/19
- * Time: 9:52
- */
-
- namespace backend\modules\api\logic;
-
- use backend\modules\api\models\BaseSupplier;
- use backend\modules\api\models\OperaHotelLog;
- use backend\modules\api\models\OrderHtStatusLog;
- use backend\modules\api\models\OrderMain;
- use backend\modules\api\models\RunHotel;
- use backend\modules\api\models\RunHotelDistrib;
- use Codeception\Module\Memcache;
- use common\models\CheckData;
- use yii\db\Query;
- use backend\modules\zzcs\models\BaseUser;
- use backend\modules\zzcs\models\DictType;
- use Yii;
- use yii\data\ActiveDataProvider;
- use yii\db\ActiveRecord;
- use backend\modules\api\util\Util;
- use common\models\Msg;
- use yii\base\Exception;
- use yii\db\Expression;
-
-
- class HotelCancelOrder extends Query
- {
- public $ctrip_url = "http://cs1.zhizhuchuxing.com/"; //需要向携程对接控制器发送请求的URL
-
- /**
- * @inheritdoc
- */
- public static function tableName()
- {
- return 'order_main';
- }
-
- /*
- * User:luocj
- *
- * 取消酒店订单,获取订单信息
- */
- public function getOrderInfo($order_id)
- {
- // select order_id,order_title_id,order_status,order_level,docking_type,
- // gathering_status,outside_sale_org_id,prod_id as room_type,parent_prod_id as hotel_id,
- //(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) as base_room_type
- // from order_main where order_id =1010737 and cancel_flag = 0
- $data = OrderMain::find()->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);
- }
-
-
- }
- }
|