relation_supplier_id = Yii::$app->params['ctrip']['relation_supplier_id']; $this->defaultItem['Stays'] = '1'; $this->defaultItem['ChangeDefault'] = 'F'; $this->defaultItem['Recommend'] = '2'; $this->defaultItem['Recommend_Intl'] = '2'; $this->defaultItem['HoldDeadline'] = '9999'; //现付产品使用 $this->defaultItem['UserLimited'] = '9999'; $this->defaultItem['Note'] = ''; $this->defaultItem['Restorable'] = 'T'; $this->defaultItem['Guarantee'] = ''; $this->defaultItem['CheckType'] = 'S'; $this->defaultItem['GuaranteeLCT'] = '23988'; $this->defaultItem['AllNeedGuarantee'] = 'F'; // $this->defaultItem['RoomGiftID'] = ''; $this->defaultItem['DeductType'] = 'C'; //Roomstatus N满房 G良好 //RoomsInv 房间数量 //Note 备注 //ReserveTime 保留房最晚预订时间 //PrepayLCT 预付订单 最晚取消时间 //LateReserveTime 订单最晚预订时间 parent::__construct($config); } public function rules() { return [ [[ 'RoomID', 'StartDate', 'EndDate', 'defaultItem', 'RoomInfoItems', ], 'required'], [['RoomInfoItems'], 'validateItems'], [['RoomID'], 'validatePrimary', 'params' => ['message' => '获取mapping失败']], ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'RoomID' => '渠道房型ID', 'RoomInfoItems' => '房态数组', 'StartDate' => '起始时间', 'EndDate' => '结束时间', 'defaultItem' => '房态默认值', ]; } /** * User: wangxj * * 加载数据 * * @param array $post * @param null $formName * @return bool */ public function load($data, $formName = null) { $scope = $formName === null ? $this->formName() : $formName; if ($scope === '' && !empty($data)) { $this->setAttributes($data, false); $this->RoomID = RoomRelation::getChannelId($this->Spider_room, Yii::$app->params['ctrip']['relation_supplier_id']); $startDate = $data['StartDate']; $endDate = $data['EndDate']; //mapping酒店 id和房型id $room = OperaHotelRoom::findOne($data['Spider_room']); if (empty($room)) { return false; } /*$hotel = OperaHotel::findOne(['HOTEL_ID' => $room['HOTEL_ID']]); if (empty($hotel)) { return false; }*/ $stocks = RunHotelDistrib::find() ->select(['DISTINCT(RUN_DATE)', 'a.CREATE_USER_ID', 'a.CREATE_TIME', 'a.UPDATE_USER_ID', 'a.UPDATE_TIME', 'a.DISTRIB_ID', 'a.HOTEL_ID', 'a.BASE_ROOM_TYPE', 'a.ROOM_TYPE', 'a.REMAINING_COUNT', 'a.SALED_COUNT', 'a.PROD_PRICE', 'a.CUS_PRICE', 'a.RUN_STATUS', 'a.OVERSELL_FLAG', 'a.CONSUME_STOCK_TYPE', 'b.AUTHORITY_STATUS', 'b.LATEST_COMFIRM_TIME']) ->leftJoin('opera_room_distrib b', 'b.DISTRIB_ID = a.DISTRIB_ID AND b.ROOM_ID=' . $room['ID']) ->where(['a.DISTRIB_ID' => Yii::$app->params['ctrip']['supplier_id'], 'a.HOTEL_ID' => $room['HOTEL_ID'], 'a.BASE_ROOM_TYPE' => $room['PARENT_ROOM_TYPE'], 'a.ROOM_TYPE' => $room['ROOM_TYPE']]) ->andFilterWhere(['between', 'a.RUN_DATE', $startDate, $endDate]) ->from('run_hotel_distrib a') ->orderBy('a.RUN_DATE') // -> createCommand() -> getRawSql(); ->asArray()->all(); foreach ($stocks as $stock) { $subRoom = RunHotelSubRoom::findOne(['HOTEL_ID' => $room['HOTEL_ID'], 'BASE_ROOM_TYPE' => $room['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $room['ROOM_TYPE'], 'RUN_DATE' => $stock['RUN_DATE']]); $item = $this->defaultItem; $item['Roomstatus'] = ( $room->IS_ONSALE == OperaHotelRoom::IS_ONSALE && $stock['RUN_STATUS'] == RunHotelDistrib::ROOM_STATUS_SALE && $subRoom->RUN_STATUS == RunHotelSubRoom::RUN_STATUS_OPEN && $stock['AUTHORITY_STATUS'] == RunHotelDistrib::AUTHORITY_STATUS_ON ) ? 'G' : 'N'; //如果超卖关了,设置为只销售保留房 if ($item['Roomstatus'] == 'G' && $stock['OVERSELL_FLAG'] == RunHotelDistrib::OVERSELL_OFF) { if ($stock['REMAINING_COUNT'] <= 0) { $item['Roomstatus'] = 'N'; } else $item['Roomstatus'] = 'L'; } $item['RoomsInv'] = ($room->IS_ONSALE == OperaHotelRoom::IS_OFFSALE || $stock['RUN_STATUS'] == RunHotelDistrib::ROOM_STATUS_CLOSE) ? 0 : $stock['REMAINING_COUNT']; //保留房最晚预订时间 $item['ReserveTime'] = Utils::timeHour($stock['LATEST_COMFIRM_TIME']); $item['PrepayLCT'] = Utils::timeHour($room->LASTEST_CANCEL_DAY, 'rule'); $item['LateReserveTime'] = Utils::timeHour($room->LASTEST_BOOK_TIME); $this->RoomInfoItems[] = ['RoomInfoItem' => $item]; } return true; } elseif (isset($data[$scope])) { $this->setAttributes($data[$scope]); return true; } else { return false; } } /** * User: wangxj * * 检查mapping的酒店房型是否正常 * * @param $attribute * @param $params */ public function validatePrimary($attribute, $params) { if ($this->Spider_room == 0 || $this->RoomID == 0) { $this->addError($attribute, $params['message']); } } /** * User: wangxj * * 检查房态数据是否正常 * * @param $attribute // * @param $params */ public function validateItems($attribute) { if (count($this->$attribute) <= 0) { $this->addError($attribute, '无法获取日期'); } else { //判断一下时间是否对应,startDate to endDate中的日期,是否都一一对应 $start = strtotime($this->StartDate); $end = strtotime($this->EndDate); $day_count = ($end - $start) / (3600 * 24); if ($day_count >= 120) { $this->addError($attribute, '一次最多推送120天数据'); } elseif ($day_count + 1 != count($this->$attribute)) { $this->addError($attribute, '房态数据没有一一对应'); } else { foreach ($this->$attribute as $key => $item) { } } } } }