'确认单', self::ORDER_LEVEL_CHANGE => '修改单', self::ORDER_LEVEL_CANCEL => '取消单', ]; public $purchaser_id; public $purchase_id; public $date_type = 1; //查询时的时间类型,1:创建时间,2:入住时间,3:离店时间 public $start_date; public $end_date; public $hotel_name; public $hotel_id; public $room_count; //订单间夜数 public $principal_id; //运营负责人; public $compensate_out; // 赔出 public $compensate_in; // 赔入 public $jianye_count; //间夜数 public $order_count; //订单数 public $order_price; //销售额 public $base_price; //成本价 public $total_commission; //佣金 public $profit_value; //利润 public $principal; //运营负责人 public $order_status_name; // 订单状态名称 public $channel_name; // 渠道名称 public $docking_type_desc; // 对接类型名称 public $sendUser = 'shifp|wanglg'; // 酒店相关信息通知用户 /** * @inheritdoc */ public static function tableName() { return 'order_main'; } /** * @inheritdoc */ public function rules() { return [ [['ID', 'ORDER_BOOK_STATUS', 'PROD_START_STATION_TIME_MINUTES', 'OUTSIDE_ORDER_NO', 'BASE_PRICE', 'ORDER_PRICE'], 'required'], [['ID', 'CANCEL_FLAG', 'MAIN_CREATE_USER_ID', 'CREATE_USER_ID', 'UPDATE_USER_ID', 'SALE_ORG_ID', 'SALE_TOP_ORG_ID', 'PROD_TOP_ORG_ID', 'ORDER_ID', 'ORDER_VALID_STATUS', 'ORDER_BOOK_STATUS', 'ORDER_PAY_STATUS', 'ORDER_PAY_MAIN_ID', 'ORDER_PAY_USER_ID', 'ORDER_PRINT_TIMES', 'PARENT_ORDER_ID', 'PROD_ID', 'PARENT_PROD_ID', 'ORDER_PROD_TYPE', 'RUN_ID', 'RUN_DATE_NUM', 'RUN_TIME_MINUTES', 'RUN_BUS_ORDER_ID', 'RUN_BUS_SEAT_TYPE', 'RUN_BUS_SEAT_SEQ_ID', 'RUN_BUS_SEAT_ID', 'PROD_START_STATION_RES_ID', 'PROD_START_STATION_CHECKPORT_RES_ID', 'PROD_START_STATION_SEQ_ID', 'PROD_START_STATION_DATE_NUM', 'PROD_START_STATION_TIME_MINUTES', 'PROD_START_STATION_AREA_ID', 'PROD_END_STATION_RES_ID', 'PROD_END_STATION_SEQ_ID', 'PROD_END_STATION_DATE_NUM', 'PROD_END_STATION_TIME_MINUTES', 'PROD_END_STATION_AREA_ID', 'CUSTOMER_SEX', 'CUSTOMER_ID_TYPE', 'CUSTOMER_ADDRESS_AREA_ID', 'MEMBER_ID', 'MEMBER_SCORE_PAY', 'MEMBER_SCORE_GET', 'CHANNEL_ORDER_STATUS', 'ORDER_STATUS', 'ORDER_DISABLE_TYPE', 'ORDER_DISABLE_USER_ID', 'ORDER_DISABLE_APPLY_USER_ID', 'KEEP_END_MINUTES', 'if_gift', 'reorder_times', 'IF_LAST_PROD', 'ORDER_LEVEL', 'OUTSIDE_SALE_ORG_ID', 'IS_UP', 'APPLY_ID', 'REAL_PASSENGER_NUM', 'STOCK_TYPE', 'REFUSE_FLAG', 'hotel_id'], 'integer'], [['ORDER_DESCRIPTION'], 'string'], [['room_count'], 'match', 'pattern' => '/^[1-9]\d*$/', 'message' => '库存信息不能为空', 'on' => 'csBook'], [['OUTSIDE_ORDER_NO', 'OUTSIDE_SALE_ORG_ID', 'CUSTOMER_NAME', 'PROD_START_STATION_DATE', 'PROD_END_STATION_DATE'], 'required', 'on' => 'csBook'], [['ORDER_PRICE', 'BASE_PRICE', 'MID_PRICE', 'ORDER_DISABLE_PERCENT', 'ORDER_DISABLE_FEE', 'RECEIVE_VALUE', 'PROFIT_VALUE', 'TOTAL_COMMISSION'], 'number'], [['CREATE_TIME', 'UPDATE_TIME', 'RUN_DATE', 'PROD_START_STATION_DATE', 'PROD_END_STATION_DATE', 'ORDER_DISABLE_TIME', 'ORDER_DISABLE_APPLY_TIME', 'KEEP_END_TIME'], 'string', 'max' => 20], [['OUTSIDE_ORDER_NO', 'PROD_NAME', 'PARENT_PROD_NAME', 'CUSTOMER_ADDRESS'], 'string', 'max' => 200], [['ORDER_PAY_TIME'], 'string', 'max' => 255], [['PROD_SUPPLY_ORG_NAME', 'RUN_BUS_SEAT_NAME', 'PROD_START_STATION_RES_NAME', 'PROD_START_STATION_CHECKPORT_RES_NAME', 'PROD_START_STATION_AREA_NAME', 'PROD_END_STATION_RES_NAME', 'PROD_END_STATION_AREA_NAME', 'CUSTOMER_NAME', 'CUSTOMER_MOBILE', 'CUSTOMER_ID_NO', 'CUSTOMER_POSTCODE'], 'string', 'max' => 100], [['RUN_TIME', 'PROD_START_STATION_TIME', 'PROD_END_STATION_TIME'], 'string', 'max' => 10], [['CUSTOMER_MEMO'], 'string', 'max' => 500], [['ORDER_CONFIRM_CODE', 'SALES_MAN'], 'string', 'max' => 80], [['DOCKING_TYPE', 'room_count', 'ORDER_TITLE_ID', 'PRINCIPAL_ID'], 'safe'], // [['ORDER_CONFIRM_CODE'], 'number', 'skipOnEmpty' => true], [['ORDER_CONFIRM_CODE'], 'match', 'pattern' => '/[^\x{4e00}-\x{9fa5}]+$/u', 'message' => '确认号中不能出现中文字符', 'skipOnEmpty' => true], [['ORDER_CONFIRM_CODE'], 'required', 'on' => 'upConfirm'], ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'ID' => 'ID', 'CANCEL_FLAG' => 'Cancel Flag', 'MAIN_CREATE_USER_ID' => 'Main Create User ID', 'CREATE_USER_ID' => '跟单客服', 'CREATE_TIME' => '预订时间', 'UPDATE_USER_ID' => 'Update User ID', 'UPDATE_TIME' => 'Update Time', 'SALE_ORG_ID' => 'Sale Org ID', 'SALE_TOP_ORG_ID' => 'Sale Top Org ID', 'PROD_TOP_ORG_ID' => 'Prod Top Org ID', //供应商ID 'ORDER_ID' => '订单号', 'ORDER_DESCRIPTION' => 'Order Description', 'OUTSIDE_ORDER_NO' => '渠道商订单号', 'ORDER_VALID_STATUS' => 'Order Valid Status', 'ORDER_BOOK_STATUS' => 'Order Book Status', 'ORDER_PAY_STATUS' => 'Order Pay Status', 'ORDER_PAY_MAIN_ID' => 'Order Pay Main ID', 'ORDER_PAY_USER_ID' => 'Order Pay User ID', 'ORDER_PAY_TIME' => 'Order Pay Time', 'ORDER_PRINT_TIMES' => 'Order Print Times', 'PARENT_ORDER_ID' => 'Parent Order ID', 'PROD_ID' => 'Prod ID', 'PARENT_PROD_ID' => 'Parent Prod ID', 'PROD_NAME' => '房型名称', 'PARENT_PROD_NAME' => '酒店名称', 'ORDER_PRICE' => '订单金额', 'ORDER_PROD_TYPE' => 'Order Prod Type', 'PROD_SUPPLY_ORG_NAME' => 'Prod Supply Org Name', 'BASE_PRICE' => '订单金额', 'MID_PRICE' => 'Mid Price', 'RUN_ID' => 'Run ID', 'RUN_DATE' => 'Run Date', 'RUN_DATE_NUM' => 'Run Date Num', 'RUN_TIME' => 'Run Time', 'RUN_TIME_MINUTES' => 'Run Time Minutes', 'RUN_BUS_ORDER_ID' => 'Run Bus Order ID', 'RUN_BUS_SEAT_TYPE' => 'Run Bus Seat Type', 'RUN_BUS_SEAT_SEQ_ID' => 'Run Bus Seat Seq ID', 'RUN_BUS_SEAT_ID' => 'Run Bus Seat ID', 'RUN_BUS_SEAT_NAME' => 'Run Bus Seat Name', 'PROD_START_STATION_RES_ID' => 'Prod Start Station Res ID', 'PROD_START_STATION_RES_NAME' => 'Prod Start Station Res Name', 'PROD_START_STATION_CHECKPORT_RES_ID' => 'Prod Start Station Checkport Res ID', 'PROD_START_STATION_CHECKPORT_RES_NAME' => 'Prod Start Station Checkport Res Name', 'PROD_START_STATION_SEQ_ID' => 'Prod Start Station Seq ID', 'PROD_START_STATION_DATE' => '入住日期', //入住日期 'PROD_START_STATION_DATE_NUM' => 'Prod Start Station Date Num', 'PROD_START_STATION_TIME' => 'Prod Start Station Time', 'PROD_START_STATION_TIME_MINUTES' => 'Prod Start Station Time Minutes', 'PROD_START_STATION_AREA_ID' => 'Prod Start Station Area ID', 'PROD_START_STATION_AREA_NAME' => 'Prod Start Station Area Name', 'PROD_END_STATION_RES_ID' => 'Prod End Station Res ID', 'PROD_END_STATION_RES_NAME' => 'Prod End Station Res Name', 'PROD_END_STATION_SEQ_ID' => 'Prod End Station Seq ID', 'PROD_END_STATION_DATE' => '入离店时间', //离店时间 'PROD_END_STATION_DATE_NUM' => 'Prod End Station Date Num', 'PROD_END_STATION_TIME' => 'Prod End Station Time', 'PROD_END_STATION_TIME_MINUTES' => 'Prod End Station Time Minutes', 'PROD_END_STATION_AREA_ID' => 'Prod End Station Area ID', 'PROD_END_STATION_AREA_NAME' => 'Prod End Station Area Name', 'CUSTOMER_NAME' => '客人姓名', 'CUSTOMER_SEX' => 'Customer Sex', 'CUSTOMER_MOBILE' => '联系电话', 'CUSTOMER_ID_TYPE' => 'Customer Id Type', 'CUSTOMER_ID_NO' => 'Customer Id No', 'CUSTOMER_ADDRESS' => 'Customer Address', 'CUSTOMER_ADDRESS_AREA_ID' => 'Customer Address Area ID', 'CUSTOMER_POSTCODE' => 'Customer Postcode', 'CUSTOMER_MEMO' => '备注', //备注已经移到order_comment表 'MEMBER_ID' => 'Member ID', 'MEMBER_SCORE_PAY' => 'Member Score Pay', 'MEMBER_SCORE_GET' => 'Member Score Get', 'ORDER_STATUS' => '订单状态', 'ORDER_DISABLE_TYPE' => 'Order Disable Type', 'ORDER_DISABLE_USER_ID' => 'Order Disable User ID', 'ORDER_DISABLE_TIME' => 'Order Disable Time', 'ORDER_DISABLE_PERCENT' => 'Order Disable Percent', 'ORDER_DISABLE_FEE' => 'Order Disable Fee', 'ORDER_DISABLE_APPLY_USER_ID' => 'Order Disable Apply User ID', 'ORDER_DISABLE_APPLY_TIME' => 'Order Disable Apply Time', 'KEEP_END_TIME' => 'Keep End Time', 'KEEP_END_MINUTES' => 'Keep End Minutes', 'if_gift' => 'If Gift', 'reorder_times' => 'Reorder Times', 'IF_LAST_PROD' => 'If Last Prod', 'ORDER_LEVEL' => 'Order Level', 'ORDER_CONFIRM_CODE' => '确认号', 'OUTSIDE_SALE_ORG_ID' => '销售渠道', //渠道商ID 'IS_UP' => 'Is Up', 'APPLY_ID' => 'Apply ID', 'SALES_MAN' => 'Sales Man', 'RECEIVE_VALUE' => 'Receive Value', 'REAL_PASSENGER_NUM' => 'Real Passenger Num', 'STOCK_TYPE' => 'Stock Type', 'REFUSE_FLAG' => 'Refuse Flag', 'PROFIT_VALUE' => 'Profit Value', 'TOTAL_COMMISSION' => 'Total Commission', 'room_count' => '间夜数', ]; } /** * @return \yii\db\ActiveQuery 酒店 */ public function getOperaHotel() { return $this->hasOne(OperaHotel::className(), ['HOTEL_ID' => 'PARENT_PROD_ID']); } /** * @return \yii\db\ActiveQuery 直连发单 */ public function getOrderHtStatusLog() { return $this->hasOne(OrderHtStatusLog::className(), ['ORDER_ID' => 'ORDER_ID']); } /** * @return \yii\db\ActiveQuery 供应商 */ public function getBaseSupplier() { return $this->hasOne(BaseSupplier::className(), ['ID' => 'PROD_TOP_ORG_ID']); } /** * @return \yii\db\ActiveQuery 渠道商 */ public function getBaseChannel() { return $this->hasOne(BaseSupplier::className(), ['ID' => 'OUTSIDE_SALE_ORG_ID']); } /** * @return \yii\db\ActiveQuery 订单状态 */ public function getStatusLabel() { return $this->hasOne(DictType::className(), ['ID' => 'ORDER_STATUS']); } /** * @return \yii\db\ActiveQuery 渠道接单状态 */ public function getChannelStatusLabel() { return $this->hasOne(DictType::className(), ['ID' => 'CHANNEL_ORDER_STATUS']); } public function getDockingType() { return $this->hasOne(DictType::className(), ['ID' => 'DOCKING_TYPE']); } public function getChannelOrderStatus() { return $this->hasOne(DictType::className(), ['ID' => 'CHANNEL_ORDER_STATUS']); } public function getOperaHotelRoom() { return $this->hasOne(OperaHotelRoom::className(), ['HOTEL_ID' => 'PARENT_PROD_ID', 'ROOM_TYPE' => 'PROD_ID']) ->andOnCondition([OperaHotelRoom::tableName() . '.CANCEL_FLAG' => 0]); } public function getOrderInvoiceInfo() { return $this->hasOne(OrderInvoiceInfo::className(), ['OrderID' => 'ORDER_ID']); } public function getOrderFinanceReparations() { return $this->hasOne(OrderFinanceReparations::className(), ['order_id' => 'ORDER_ID']) ->andOnCondition([OrderFinanceReparations::tableName() . '.CANCEL_FLAG' => 0]); } public function getChannelRoom() { return $this->hasOne(RunHotelDistrib::className(), [ 'HOTEL_ID' => 'PARENT_PROD_ID', 'ROOM_TYPE' => 'PROD_ID', 'RUN_DATE' => 'RUN_DATE', 'DISTRIB_ID' => 'OUTSIDE_SALE_ORG_ID']); } public function getSubRoom() { return $this->hasOne(RunHotelSubRoom::className(), [ 'HOTEL_ID' => 'PARENT_PROD_ID', 'ROOM_TYPE' => 'PROD_ID', 'RUN_DATE' => 'RUN_DATE']); } /** * @return \yii\db\ActiveQuery 客服 */ public function getUser() { return $this->hasOne(BaseUser::className(), ['ID' => 'CREATE_USER_ID']); } /** * @Author wanglg * @Desc 运营负责人 * @return \yii\db\ActiveQuery */ public function getPrincipalMan() { return $this->hasOne(BaseUser::className(), ['ID' => 'PRINCIPAL_ID']); } /** * @Author wanglg * @Desc 采购负责人 * @return \yii\db\ActiveQuery */ public function getSalesMan() { return $this->hasOne(BaseUser::className(), ['ID' => 'SALES_MAN']); } //订单备注 public function getPublicMemo() { return $this->hasMany(OrderComment::className(), ['ORDER_ID' => 'ORDER_ID']) ->andOnCondition(['order_comment.COMMENT_TYPE' => OrderComment::TYPE_PUBLIC, 'order_comment.CANCEL_FLAG' => 0]); } //获取所有订单备注 public function getAllMemo() { return $this->hasMany(OrderComment::className(), ['ORDER_ID' => 'ORDER_ID']) ->andOnCondition(['order_comment.CANCEL_FLAG' => 0, 'order_comment.COMMENT_TYPE' => [0, 1]]); } public function getOrderFinanceStatus() { return $this->hasOne(OrderFinanceStatus::className(), ['order_id' => 'ORDER_ID']); } public function getSendOrderUser() { return $this->hasOne(OrderHtStatusLog::className(), ['ORDER_ID' => 'ORDER_ID']) ->andOnCondition(['order_ht_status_log.CANCEL_FLAG' => 0, 'order_ht_status_log.ORDER_STATUS' => OrderMain::ORDER_STATUS_WAITING_CONFIRM]); } /** * @Author wanglg * @Desc 统计报表查询订单信息 * @param $params * @return SqlDataProvider */ public function search($params) { $op = isset($_REQUEST['op']) ? $_REQUEST['op'] : ''; if ($op == 'cusServiceSend') { $query = OrderMain::find() ->joinWith('baseChannel c') ->joinWith('statusLabel') ->joinWith('user') ->joinWith('salesMan m') ->joinWith('orderHtStatusLog.user as lu') ->from($this->tableName() . ' t'); } else { $query = OrderMain::find() ->joinWith('baseChannel c') ->joinWith('salesMan m') ->joinWith('statusLabel') ->joinWith('user') ->from($this->tableName() . ' t'); } //间夜数,添加select时,需要注意,如果数据库中其他表有主键,$dataProvider->getModels()会自动以主键去除重复。所以返回的结果有可能比sql查出来的少 $query->select(['t.CREATE_TIME', 't.CREATE_USER_ID', 't.SALES_MAN as SALES_MAN', 't.PRINCIPAL_ID', 't.ORDER_ID', 't.PARENT_PROD_ID', 't.PROD_ID', 't.CUSTOMER_NAME', 't.CUSTOMER_MOBILE', 't.PARENT_PROD_NAME', 't.PROD_NAME', 't.OUTSIDE_SALE_ORG_ID', 't.PROD_START_STATION_DATE', 't.PROD_END_STATION_DATE', 't.ORDER_PRICE', 't.BASE_PRICE', 't.TOTAL_COMMISSION', 't.PROFIT_VALUE', 'c.SUPPLIER_NAME as CHANNEL_NAME', 'base_user.TRUE_NAME AS INPUT_CREATE_USER', 'm.TRUE_NAME AS PURCHASE_TRUE_NAME', 'dict_type.TYPE_NAME AS ORDER_STATUS_NAME', 'IF(0=0, 0, 0) as order_count', 'IF(0=0, 0, 0) AS compensate_out', 'IF(0=0, 0, 0) AS compensate_in']); $this->PARENT_PROD_ID = isset($params['hotel_id']) ? $params['hotel_id'] : ''; //酒店 $this->OUTSIDE_SALE_ORG_ID = (isset($params['org_sale_id']) && $params['org_sale_id'] != 0) ? $params['org_sale_id'] : ''; //渠道 $this->CREATE_USER_ID = isset($params['user_id']) ? $params['user_id'] : ''; $this->principal_id = empty($params['principal_id']) ? '' : $params['principal_id']; $this->date_type = isset($params['date_type']) ? $params['date_type'] : ''; $this->purchaser_id = empty($params['purchaser_id']) ? '' : $params['purchaser_id']; $this->start_date = isset($params['start_date']) ? $params['start_date'] : ''; $this->end_date = isset($params['end_date']) ? $params['end_date'] : ''; $this->PROD_ID = isset($params['room_type']) ? $params['room_type'] : ''; $this->PARENT_PROD_NAME = isset($params['hotel_name']) ? $params['hotel_name'] : ''; if ($op == 'cusServiceSend') { $query->addSelect(['order_ht_status_log.CREATE_USER_ID AS SEND_USER_ID', 'lu.TRUE_NAME AS SEND_CREATE_USER']); $query->andFilterWhere([ 'OUTSIDE_SALE_ORG_ID' => $this->OUTSIDE_SALE_ORG_ID, 'order_prod_type' => 25, 't.cancel_flag' => 0, 'ORDER_VALID_STATUS' => 1, 't.DOCKING_TYPE' => 556, 'PROD_ID' => $this->PROD_ID, 't.SALES_MAN' => $this->purchaser_id, 't.PRINCIPAL_ID' => $this->principal_id, ]); } else { $query->andFilterWhere([ 'OUTSIDE_SALE_ORG_ID' => $this->OUTSIDE_SALE_ORG_ID, 'order_prod_type' => 25, 't.cancel_flag' => 0, 'ORDER_VALID_STATUS' => 1, 'prod_id' => $this->PROD_ID, 't.create_user_id' => $this->CREATE_USER_ID, 't.SALES_MAN' => $this->purchaser_id, 't.PRINCIPAL_ID' => $this->principal_id, ]); } if ($op == 'cusServiceSend') { $send_where = empty($params['send_user_id']) ? ['order_ht_status_log.ORDER_STATUS' => OrderMain::ORDER_STATUS_WAITING_CONFIRM, 'order_ht_status_log.BEFORE_STATUS' => OrderMain::ORDER_STATUS_WAITING_SEND] : ['order_ht_status_log.ORDER_STATUS' => OrderMain::ORDER_STATUS_WAITING_CONFIRM, 'order_ht_status_log.BEFORE_STATUS' => OrderMain::ORDER_STATUS_WAITING_SEND, 'order_ht_status_log.CREATE_USER_ID' => $params['send_user_id']]; $query->andFilterWhere($send_where); } else { $query->andFilterWhere(['in', 'ORDER_STATUS', [198, 314, 147, 313, 382]]); } $hotel_id = $this->PARENT_PROD_ID; if ($hotel_id != 0) { $query->andFilterWhere([ '=', 'PARENT_PROD_ID', $hotel_id, ]); } $date_type = $this->date_type; $query->addSelect(['(select count(*) from order_main where cancel_flag = 0 and order_prod_type = 26 and PARENT_ORDER_ID = t.order_id) as room_count']); /*if ($date_type == 2) { $query->addSelect(["(select count(*) from order_main where cancel_flag = 0 and order_prod_type = 26 and PROD_START_STATION_DATE between '{$this->start_date}' and '{$this->end_date}' and PARENT_ORDER_ID = t.order_id) as room_count"]); } else { $query->addSelect(['(select count(*) from order_main where cancel_flag = 0 and order_prod_type = 26 and PARENT_ORDER_ID = t.order_id) as room_count']); }*/ if ($date_type == 1) { if ($this->start_date == $this->end_date) $query->andFilterWhere([ 'like', 't.CREATE_TIME', $this->start_date, ]); else $query->andFilterWhere([ 'between', 't.CREATE_TIME', $this->start_date . ' 00:00:00', $this->end_date . ' 23:59:59', ]); } elseif ($date_type == 2) { $query->andFilterWhere(['or', ['and', ['<=', 'prod_start_station_date', $this->start_date], ['>', 'prod_end_station_date', $this->start_date]], ['and', ['<=', 'prod_start_station_date', $this->end_date], ['>', 'prod_end_station_date', $this->end_date]], ['and', ['>=', 'prod_start_station_date', $this->start_date], ['<=', 'prod_end_station_date', $this->end_date]]]); } elseif ($date_type == 3) { if ($this->start_date == $this->end_date) $query->andFilterWhere([ 'like', 'PROD_END_STATION_DATE', $this->start_date, ]); else $query->andFilterWhere([ 'between', 'PROD_END_STATION_DATE', $this->start_date, $this->end_date, ]); } $query->groupBy('t.ORDER_ID'); // 处理查询订单权限信息 $order_where = $this->userRoleWhere('t'); $query->andFilterWhere($order_where); //订单总数 $totalCount = $query->count(); $sql = $query->createCommand()->getRawSql(); if (!in_array($op, ['cusServiceSend', 'cusService'])) { $report = new Report(); $params['date_from'] = $params['start_date']; $params['date_to'] = $params['end_date']; $params['channel_id'] = $params['org_sale_id']; // 赔入赔出权限处理 $compensate_where = $this->userRoleWhere('b'); $sql_finance = $report->getCompensateInOrOut($params, $op) ->andFilterWhere($compensate_where)->createCommand()->getRawSql(); $sql = "SELECT a.CREATE_TIME, a.CREATE_USER_ID, a.SALES_MAN, a.PRINCIPAL_ID, a.ORDER_ID, a.PARENT_PROD_ID, a.PROD_ID, a.CUSTOMER_NAME, a.CUSTOMER_MOBILE, a.PARENT_PROD_NAME, a.PROD_NAME, a.OUTSIDE_SALE_ORG_ID, a.PROD_START_STATION_DATE, a.PROD_END_STATION_DATE, a.ORDER_PRICE, a.BASE_PRICE, a.TOTAL_COMMISSION, a.PROFIT_VALUE, a.CHANNEL_NAME, a.INPUT_CREATE_USER, a.PURCHASE_TRUE_NAME, SUM(a.compensate_out) as compensate_out, SUM(a.compensate_in) as compensate_in, a.ORDER_STATUS_NAME, a.order_count, a.room_count FROM ({$sql} UNION {$sql_finance}, a.order_id) a GROUP BY ORDER_ID"; } $dataProvider = new SqlDataProvider([ 'sql' => 'SELECT b.* FROM(' . $sql . ') b', 'totalCount' => $totalCount, 'pagination' => [ 'pageSize' => 15, ], ]); return $dataProvider; } /** * @Author wanglg * @Desc 报表统计查询权限条件 * @param $alias查询条件关联别名设置 */ public function userRoleWhere($alias = '') { $alias = empty($alias) ? '' : $alias . '.'; if (Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_OPERATOR) { $where = [$alias . 'PRINCIPAL_ID' => Yii::$app->user->id]; } elseif (Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_PURCHASE) { $where = [$alias . 'SALES_MAN' => Yii::$app->user->id]; } elseif (Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_ADMIN || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_CUS_ADMIN || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::SYS_ADMIN || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::SYS_CS || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::FINANCIAL_OFFICER) { // 酒店管理员、客服管理人员、后台管理人员和系统管理员、财务人员可以查看所有数据 $where = []; } else { $where = [$alias . 'ID' => -1]; } return $where; } /** * @Author wanglg * @Desc 获取订单详情 * @param $order_id * @return array */ public function orderDetail($order_id) { $data = array(); $data['data'] = OrderMain::find() ->select(['a.CREATE_USER_ID', 'a.ORDER_ID', 'a.ORDER_PRICE', 'a.ORDER_TITLE_ID', 'a.BASE_PRICE', 'a.TOTAL_COMMISSION', 'a.PROFIT_VALUE', 'a.RUN_DATE', 'a.OUTSIDE_SALE_ORG_ID', 'a.IF_LAST_PROD', 'a.ORDER_LEVEL', 'c.SUPPLIER_NAME as channel_name', 'b.type_name as order_status_name', 'a.ORDER_PAY_STATUS', 'a.DOCKING_TYPE', 'a.ORDER_STATUS', 'a.CHANNEL_ORDER_STATUS', 'd.type_name as docking_type_desc', 'IFNULL(e.type_name, "") channel_order_status_desc', 'h.base_room_type', 'a.ORDER_DESCRIPTION', 'a.PARENT_PROD_NAME', 'a.OUTSIDE_ORDER_NO', 'a.ORDER_CONFIRM_CODE', 'a.PARENT_ORDER_ID', 'a.PARENT_PROD_ID', 'PROD_ID', 'a.PROD_NAME', 'a.RUN_TIME', 'a.CUSTOMER_MEMO', 'a.CUSTOMER_NAME', 'a.CUSTOMER_MOBILE', 'a.CREATE_TIME', 'a.PROD_START_STATION_DATE', 'a.PROD_END_STATION_DATE', 'g.gathering_status', 'g.payment_status', 'ss.COMMISION_FLAG', 'ss.COMMISION_TYPE', 'ss.BACK_COMMISION_METHOD', 'ss.BACK_PERCENT', 'ss.BACK_VALUE', 'opera_hotel_room.ID as RoomId', 'pm.TRUE_NAME as PRINCIPAL_NAME']) ->joinWith('statusLabel b') ->joinWith('baseChannel c') ->joinWith('dockingType d') ->joinWith('channelOrderStatus e') ->joinWith('operaHotelRoom') ->joinWith('subRoom as h') ->joinWith('orderFinanceStatus g') ->joinWith('principalMan as pm') ->leftJoin('base_supplier_sale as ss', 'a.OUTSIDE_SALE_ORG_ID=ss.SUPPLIER_ID and ss.CANCEL_FLAG=0 and ss.PARENT_TYPE=25') ->where(['and', 'a.CANCEL_FLAG=0', 'a.ORDER_PROD_TYPE in (25, 26)', ['or', 'a.ORDER_ID=' . $order_id, 'a.PARENT_ORDER_ID=' . $order_id]]) ->from('order_main a') ->asArray()->all(); $data['order_comment'] = OrderComment::find() ->joinWith('user') ->where(['ORDER_ID' => $order_id, 'COMMENT_TYPE' => [0, 1], 'order_comment.CANCEL_FLAG' => 0])->asArray()->all(); $data['hotel_child_order_detail'] = OrderMain::find() ->select(['PARENT_PROD_ID', 'COUNT(*) AS TOTAL', 'STOCK_TYPE', 'ORDER_ID', 'ORDER_DESCRIPTION', 'RUN_DATE', 'PARENT_ORDER_ID', 'PROD_ID', 'COUNT(*) * ORDER_PRICE AS ALL_PRICE', 'COUNT(*) * MID_PRICE as TOTAL_MID_PRICE', 'PROD_NAME', 'ORDER_PRICE', 'CONVERT(SUM(BASE_PRICE)/COUNT(*), DECIMAL(10, 2)) AS BASE_PRICE', 'CONVERT((ORDER_PRICE - SUM(BASE_PRICE)/COUNT(*) - MID_PRICE-TOTAL_COMMISSION) * COUNT(*), DECIMAL(10, 2)) AS BENEFIT', 'TOTAL_COMMISSION * COUNT(*) AS TOTAL_COMMISSION', 'RUN_TIME AS CHECKIN_TIME', 'ORDER_CONFIRM_CODE', 'OUTSIDE_SALE_ORG_ID', 'b.COMMISION_FLAG', 'b.BACK_COMMISION_TYPE', 'b.BACK_COMMISION_METHOD', 'b.BACK_PERCENT', 'b.BACK_VALUE']) ->leftJoin('base_supplier_sale as b', 'a.OUTSIDE_SALE_ORG_ID=b.SUPPLIER_ID and b.CANCEL_FLAG=0 and b.PARENT_TYPE=25') ->from('order_main a') ->where(['PARENT_ORDER_ID' => $order_id, 'a.CANCEL_FLAG' => 0, 'ORDER_PROD_TYPE' => [25, 26]]) ->groupBy('RUN_DATE') // ->createCommand() ->getRawSql(); ->asArray()->all(); $data['hotel_order_detail'] = OrderMain::find() ->select(['order_status', 'order_description', 'outside_order_no', 'parent_prod_name as hotel_name', 'order_confirm_code', 'refuse_flag', 'prod_name as product_name', 'prod_start_station_date as start_date', 'prod_end_station_date as end_date', 'run_date', 'run_time as checkin_time', 'customer_memo', 'customer_name', 'customer_mobile', 'order_price', 'create_time', 'order_pay_time']) ->where(['and', 'cancel_flag=0', 'parent_order_id=0', 'order_prod_type IN (25, 26)', 'order_id=' . $order_id]) // -> createCommand() -> getSql(); ->asArray()->one(); $data['hotel_child_order_detail'] = array_change_key_case($data['hotel_child_order_detail'], CASE_UPPER); $data['hotel_order_detail'] = array_change_key_case($data['hotel_child_order_detail'], CASE_UPPER); return $data; } // 查询主订单相关信息 public function ordersInfo($order_id) { $query = OrderMain::find() ->where(['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $order_id, 'PARENT_ORDER_ID=' . $order_id]]) ->all(); return $query; } /** * User: wangxj * 酒店状态发生变化时,设置memcache,供酒店供应商提示获取缓存 * * @param $order_id * @param $type */ public static function setMemcache($order_id, $type, $prod_top_org_id, $prod_name, $expire = 0) { $cache = Yii::$app->cacheCS; $cache->encrypt = false; $newOrder = $cache->get('hotel_newOrder'); $tmp = array(); if ($order_id) { if ($newOrder && count($newOrder) > 0) { //按天为单位读取缓存 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)); } $cache->set('hotel_newOrder', $tmp, 0, $expire); } } /** * User: wangxj * 取消单时,清除缓存中的订单 * * @param $order_id */ public function resetMem() { OrderMain::resetMemcache($this->ORDER_ID); } public static function resetMemcache($order_id) { $cache = Yii::$app->cacheCS; $cache->encrypt = false; $newOrder = $cache->get('hotel_newOrder'); if ($newOrder && count($newOrder) > 0) { foreach ($newOrder as &$hotels) { if (count($hotels) > 0) { foreach ($hotels as $key => &$order) { if ($order['order_id'] == $order_id) { unset($hotels[$key]); $cache->set('hotel_newOrder', $newOrder); } } } } } } /** * User:Steven * Desc:有损取消没有地方记录,需要按照发单人统计订单,服务于客服的绩效分析 */ public function getTemOrder() { $sql = "SELECT count(c.order_id) AS count,d.USER_NAME,d.TRUE_NAME FROM (SELECT a.order_id,b.CREATE_USER_ID,b.ORDER_STATUS FROM order_main a LEFT JOIN order_ht_status_log b ON a.ORDER_ID=b.ORDER_ID AND b.ORDER_STATUS=198 WHERE a.PARENT_ORDER_ID=0 AND a.CANCEL_FLAG=0 AND a.ORDER_VALID_STATUS=1 AND a.DOCKING_TYPE=556 AND a.CREATE_TIME BETWEEN '2017-06-01 00:00:00' AND '2017-06-30 00:00:00') AS c LEFT JOIN base_user d ON c.CREATE_USER_ID=d.ID AND d.CANCEL_FLAG=0 WHERE c.ORDER_STATUS IS NOT NULL GROUP BY c.CREATE_USER_ID ORDER BY count;"; $connection = Yii::$app->db; $res = $connection->createCommand($sql)->queryAll(); return $res; } /** * Notes:接受渠道订单 * User: Steven * Date: 2018/1/18 * Time: 11:14 * @return bool * @throws Exception */ public function receiveChannel() { $tran = Yii::$app->db->beginTransaction(); try { $count = OrderMain::updateAll([ 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS, 'UPDATE_USER_ID' => $this->UPDATE_USER_ID, 'UPDATE_TIME' => date('Y-m-d H:i:s', time()), ], [ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, ]); //保存日志 $this->saveLog('receive_channel', $this->getOldAttribute('ORDER_STATUS')); if (!$this->save() || $count <= 0) { throw new Exception(''); } $tran->commit(); return true; } catch (Exception $exception) { $tran->rollBack(); return false; } } /** * Notes:拒绝渠道订单 * User: Steven * Date: 2018/1/18 * Time: 11:16 * @param $flag * @return bool * @throws Exception */ public function refuseChannel($flag) { $tran = Yii::$app->db->beginTransaction(); try { $count = OrderMain::updateAll([ 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS, 'ORDER_STATUS' => $this->ORDER_STATUS, 'UPDATE_USER_ID' => $this->UPDATE_USER_ID, 'ORDER_VALID_STATUS' => $this->ORDER_VALID_STATUS, 'UPDATE_TIME' => date('Y-m-d H:i:s', time()), ], [ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, ]); //保存日志 $this->saveLog('refuse_channel', $this->getOldAttribute('ORDER_STATUS')); if ($flag) { $rs = $this->rollbackStocks(); if (!$rs) { throw new Exception(''); } } if (!$this->save() || $count <= 0) { throw new Exception(''); } $tran->commit(); return true; } catch (Exception $exception) { $tran->rollBack(); return false; } } /** * Notes:酒店确认,输入确认号 * User: Steven * Date: 2018/1/18 * Time: 11:19 * @return bool * @throws Exception */ public function confirm() { $tran = Yii::$app->db->beginTransaction(); try { $count = OrderMain::updateAll([ 'ORDER_STATUS' => $this->ORDER_STATUS, 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS, 'ORDER_CONFIRM_CODE' => $this->ORDER_CONFIRM_CODE, 'UPDATE_USER_ID' => $this->UPDATE_USER_ID, 'ORDER_LEVEL' => $this->ORDER_LEVEL, 'UPDATE_TIME' => date('Y-m-d H:i:s', time()), ], [ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, ]); //保存日志 $this->saveLog('confirm', $this->getOldAttribute('ORDER_STATUS')); if (!$this->save() || $count <= 0) { throw new Exception(''); } $tran->commit(); return true; } catch (Exception $exception) { $tran->rollBack(); return false; } } /** * Notes:发单 * User: Steven * Date: 2018/1/18 * Time: 11:22 * @return bool * @throws Exception */ public function sendOrder() { $tran = Yii::$app->db->beginTransaction(); try { //更新子订单 $count = OrderMain::updateAll([ 'ORDER_STATUS' => $this->ORDER_STATUS, 'UPDATE_USER_ID' => $this->UPDATE_USER_ID, 'ORDER_LEVEL' => $this->ORDER_LEVEL, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())], [ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, ]); //保存日志 order_ht_status_log该表中订单的状态信息也在这这个方法里面处理 $this->saveLog('send_order', $this->getOldAttribute('ORDER_STATUS')); if (!$this->save() || $count <= 0) { throw new Exception(''); } $tran->commit(); return true; } catch (Exception $exception) { $tran->rollBack(); return false; } } /** * Notes:退改 * User: Steven * Date: 2018/1/18 * Time: 11:25 * @param $msg * @return bool * @throws Exception */ public function backChange($msg) { $tran = Yii::$app->db->beginTransaction(); try { //更新子订单 $count = OrderMain::updateAll([ 'ORDER_STATUS' => $this->ORDER_STATUS, 'UPDATE_USER_ID' => $this->UPDATE_USER_ID, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())], [ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, ]); //保存日志 $this->saveLog('back-change', $this->getOldAttribute('ORDER_STATUS'), $msg); $order_apply_bounce = new OrderHtApplyBounce(); $order_apply_bounce->ORDER_ID = $this->ORDER_ID; $order_apply_bounce->CREATE_USER_ID = Yii::$app->user->id; $order_apply_bounce->UPDATE_USER_ID = Yii::$app->user->id; $order_apply_bounce->REASON = $msg; $order_apply_bounce->CREATE_TIME = date('Y-m-d H:i:s', time()); $order_apply_bounce->UPDATE_TIME = date('Y-m-d H:i:s', time()); if (!$this->save() || $count <= 0 || !$order_apply_bounce->save()) { throw new Exception(''); } $tran->commit(); return true; } catch (Exception $exception) { $tran->rollBack(); return false; } } /** * Notes:向酒店供应商申请退单 * User: Steven * Date: 2018/1/3 * Time: 16:31 * @return bool * @throws Exception */ public function cancelConfirming() { $tran = Yii::$app->db->beginTransaction(); try { //更新子订单 $count = OrderMain::updateAll([ 'ORDER_STATUS' => $this->ORDER_STATUS, 'UPDATE_USER_ID' => $this->UPDATE_USER_ID, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())], [ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, ]); //保存日志 $this->saveLog('cancel-confirming', $this->getOldAttribute('ORDER_STATUS')); if (!$this->save() || $count <= 0) { throw new Exception(''); } $tran->commit(); return true; } catch (Exception $exception) { $tran->rollBack(); return false; } } /** * Notes:同意退单 * User: Steven * Date: 2018/1/18 * Time: 11:33 * @param bool $type * @param $action * @return bool * @throws Exception */ public function agreeCancel($type = true, $action) { $tran = Yii::$app->db->beginTransaction(); try { //更新子订单 $count = OrderMain::updateAll([ 'ORDER_STATUS' => $this->ORDER_STATUS, 'UPDATE_USER_ID' => $this->UPDATE_USER_ID, 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS, 'ORDER_VALID_STATUS' => $this->ORDER_VALID_STATUS, 'ORDER_LEVEL' => $this->ORDER_LEVEL, 'UPDATE_TIME' => date('Y-m-d H:i:s', time()), ], [ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, ]); //回退库存 $rs = $this->rollbackStocks(); //保存日志 $this->saveLog($action, $this->getOldAttribute('ORDER_STATUS')); if (!$this->save() || $count <= 0 || !$rs) { throw new Exception(''); } $tran->commit(); return true; } catch (Exception $exception) { $tran->rollBack(); return false; } } /** * Notes:拒绝退单 * User: Steven * Date: 2018/1/18 * Time: 11:41 * @return bool * @throws Exception */ public function refuseCancel() { /*if (Yii::$app->db->transaction) $commitFlag = false; else { $commitFlag = true; $tran = Yii::$app->db->beginTransaction(); }*/ $tran = Yii::$app->db->beginTransaction(); try { //更新子订单 $count = OrderMain::updateAll([ 'ORDER_STATUS' => $this->ORDER_STATUS, 'UPDATE_USER_ID' => $this->UPDATE_USER_ID, 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS, 'ORDER_VALID_STATUS' => $this->ORDER_VALID_STATUS, 'ORDER_LEVEL' => $this->ORDER_LEVEL, 'UPDATE_TIME' => date('Y-m-d H:i:s', time()), ], [ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, ]); //保存日志 $this->saveLog('refuse-cancel', $this->getOldAttribute('ORDER_STATUS')); if (!$this->save() || $count <= 0) { throw new Exception(''); } $tran->commit(); return true; } catch (Exception $exception) { $tran->rollBack(); return false; } } /** * Notes:取消退改 * User: Steven * Date: 2018/1/3 * Time: 16:13 * @return bool * @throws Exception */ public function cancelBackChange() { $tran = Yii::$app->db->beginTransaction(); try { //更新子订单 $count = OrderMain::updateAll([ 'ORDER_STATUS' => $this->ORDER_STATUS, 'UPDATE_USER_ID' => $this->UPDATE_USER_ID, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())], [ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, ]); //保存日志 $this->saveLog('cancel_back_change', $this->getOldAttribute('ORDER_STATUS')); if (!$this->save() || $count <= 0) { throw new Exception(''); } $tran->commit(); return true; } catch (Exception $exception) { $tran->rollBack(); return false; } } /** * Notes:取消订单 * User: Steven * Date: 2018/1/4 * Time: 19:04 * @param $reason * @return bool * @throws Exception */ public function cancelOrder($reason = '') { $tran = Yii::$app->db->beginTransaction(); try { #region 1、更新子订单 $count = OrderMain::updateAll([ 'ORDER_STATUS' => $this->ORDER_STATUS, 'UPDATE_USER_ID' => $this->UPDATE_USER_ID, 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS, 'ORDER_VALID_STATUS' => $this->ORDER_VALID_STATUS, 'ORDER_LEVEL' => $this->ORDER_LEVEL, 'UPDATE_TIME' => date('Y-m-d H:i:s', time()), ], [ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, ]); #endregion //回退库存 $resRollback = $this->rollbackStocks(); if (!$this->save() || !$resRollback || $count < 0) { throw new Exception('取消失败'); } $this->saveLog('cancel_order', $this->getOldAttribute('ORDER_STATUS')); $tran->commit(); // 下单渠道供应商预付款处理及房态推送处理 $room_info = OperaHotelRoom::findOne(['HOTEL_ID' => $this->PARENT_PROD_ID, 'CANCEL_FLAG' => 0, 'ROOM_TYPE' => $this->PROD_ID]); $soap_param = array('hotel_id' => $this->PARENT_PROD_ID, 'parent_room_type' => $room_info->PARENT_ROOM_TYPE, 'room_type' => $this->PROD_ID, 'begin_date' => $this->PROD_START_STATION_DATE, 'end_date' => $this->PROD_END_STATION_DATE, 'channel_id' => $this->OUTSIDE_SALE_ORG_ID); zHttp::syncRequest(CommonOrder::SEND_REQUEST_GET, Yii::$app->params['prepay_interface'], array('type' => CommonOrder::CANCEL_ORDER_DEDUCTION_TYPE, 'order_id' => $this->ORDER_ID)); zHttp::syncRequest(CommonOrder::SEND_REQUEST_GET, Yii::$app->params['push_info_interface'], array('param' => $soap_param)); } catch (\Exception $e) { $error = $e->getMessage(); $arr = array( "agentid" => 1000002, "title" => '订单取消失败:', "msg" => "订单取消失败\n订单号:" . $this->ORDER_ID . "\n失败原因:" . $error, "touser" => $this->sendUser); zOfficeWechat::sendMsg($arr); $tran->rollBack(); return false; } return true; } /** * Notes: 供应商拒单,输入拒单原因 * User: Steven * Date: 2018/1/18 * Time: 11:49 * @param $msg * @param string $type * @return bool * @throws Exception */ public function refuse($msg, $type = 'refuse') { $tran = Yii::$app->db->beginTransaction(); try { $count = OrderMain::updateAll([ 'ORDER_STATUS' => $this->ORDER_STATUS, 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS, 'UPDATE_USER_ID' => $this->UPDATE_USER_ID, 'ORDER_LEVEL' => $this->ORDER_LEVEL, 'ORDER_VALID_STATUS' => $this->ORDER_VALID_STATUS, 'UPDATE_TIME' => date('Y-m-d H:i:s', time()), ], [ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, ]); //回退库存 $rollback = $this->rollbackStocks(); //保存日志 $this->saveLog($type, $this->getOldAttribute('ORDER_STATUS'), $msg); if (!$this->save() || $count <= 0 || !$rollback) { throw new Exception(''); } $tran->commit(); return true; } catch (Exception $exception) { $tran->rollBack(); return false; } } /** * 添加备注 */ public function addNote() { } /** * 保存日志 * * @param $type string 类型 * @param $status_flag mixed 为false时,不需要保存订单状态日志,否则将 $status_flag作为订单原状态 */ public function saveLog($type, $status_flag = false, $msg = '') { //写订单日志、状态日志 //订单表没有基础房型id,需要查一下 $baseRoom = OperaHotelRoom::findOne(['CANCEL_FLAG' => 0, 'HOTEL_ID' => $this->PARENT_PROD_ID, 'ROOM_TYPE' => $this->PROD_ID]); $orderLog = new OperaHotelLog(); $orderLog->CREATE_USER_ID = Yii::$app->user->id; $orderLog->HOTEL_ID = $this->PARENT_PROD_ID; $orderLog->LOG_TYPE = OperaHotelLog::LOG_TYPE_ORDER; $orderLog->ROOM_TYPE = $this->PROD_ID; $orderLog->PARENT_ROOM_TYPE = $baseRoom->PARENT_ROOM_TYPE; switch ($type) { case 'receive_channel': $orderLog->LOG_DESC = "接受渠道订单:" . $this->ORDER_ID; break; case 'refuse_channel': $orderLog->LOG_DESC = "拒绝渠道订单:" . $this->ORDER_ID; break; case 'refuse': $orderLog->LOG_DESC = "拒绝了订单:" . $this->ORDER_ID . "(原因:" . $msg . ")"; break; case 'confirm': $orderLog->LOG_DESC = "确认订单:" . $this->ORDER_ID . "(确认号:" . $this->ORDER_CONFIRM_CODE . ")"; break; case 'note': $orderLog->LOG_DESC = $msg; break; case 'cancel_confirm': $orderLog->LOG_DESC = "供应商确认退单,订单号为:" . $this->ORDER_ID; break; case 'cancel_reject': $orderLog->LOG_DESC = "供应商拒绝退单,订单号为:" . $this->ORDER_ID; break; case 'send_order': //发单 $orderLog->LOG_DESC = "订单号为:" . $this->ORDER_ID . '的状态由待发单变为待确认'; break; case 'cancel_order': //取消单 $orderLog->LOG_DESC = "取消订单,订单号为:" . $this->ORDER_ID; break; case 'back-change': //退改 $orderLog->LOG_DESC = "发起退改,退改原因:" . $msg; break; case 'cancel-confirming': //申请退单 $orderLog->LOG_DESC = "向供应商申请退单"; break; case 'cancel_back_change': //申请退单 $orderLog->LOG_DESC = "取消退改"; break; case 'agree-cancel': //申请退单 $orderLog->LOG_DESC = "同意退单,订单已取消"; break; case 'refuse-cancel': //申请退单 $orderLog->LOG_DESC = "拒绝退单"; break; case 'exception-order': //申请退单 $orderLog->LOG_DESC = "直连失败订单,直连状态由录单变为直连,订单号:" . $this->ORDER_ID . ",渠道单号:" . $this->OUTSIDE_ORDER_NO; break; case 'update_confirm': //申请退单 $orderLog->LOG_DESC = "将确认号(" . $this->ORDER_CONFIRM_CODE . ")修改为:" . $msg; break; case 'add_white_list': //添加白名单 $orderLog->LOG_DESC = "添加白名单订单号:" . $this->ORDER_ID . ',白名单类型:' . $msg; break; case 'send_email_success': $orderLog->LOG_DESC = "通过邮件形式发送订单信息到酒店,邮件发送成功,收件人:" . $msg; break; case 'send_email_error': $orderLog->LOG_DESC = "通过邮件形式发送订单信息到酒店,邮件发送失败,收件人:" . $msg; break; default: $orderLog->LOG_DESC = ''; } $orderLog->ORDER_ID = $this->ORDER_ID; $orderLog->save(); if ($status_flag) { $statusLog = new OrderHtStatusLog(); $statusLog->CREATE_USER_ID = Yii::$app->user->id; $statusLog->UPDATE_USER_ID = Yii::$app->user->id; $statusLog->BEFORE_STATUS = $status_flag; $statusLog->ORDER_STATUS = $this->ORDER_STATUS; $statusLog->ORDER_ID = $this->ORDER_ID; $statusLog->save(); } } /** * 下载确认修改单的word */ public function wordHtml($down_type) { $user_id = Yii::$app->user->id; $order_id = $this->ORDER_ID; $type = OrderMain::order_level_array[$this->ORDER_LEVEL]; $confirm_org = OperaHotel::find()->joinWith('confirmOrganization')->where(['HOTEL_ID' => $this->PARENT_PROD_ID])->one(); $confirm_org_full_name = $confirm_org->confirmOrganization->ORG_NAME; $hotel_name = $confirm_org->HOTEL_NAME; $product_name = $this->PROD_NAME; $customer_name = $this->CUSTOMER_NAME; $base_price = $this->BASE_PRICE; $customer_mobile = $this->CUSTOMER_MOBILE; $date_check_in = $this->PROD_START_STATION_DATE; $date_check_out = $this->PROD_END_STATION_DATE; $confirm_code = $this->ORDER_CONFIRM_CODE; //从日志查询最后一次确认人 cs系统导出不需要确认人信息,确认人信息通过邮件确认 $confirm_user = ''; if ($down_type) { $log = OrderHtStatusLog::find()->joinWith('user')->where([OrderHtStatusLog::tableName() . '.CANCEL_FLAG' => 0, 'ORDER_ID' => $order_id, 'ORDER_STATUS' => OrderMain::ORDER_STATUS_CONFIRMED]) ->orderBy([OrderHtStatusLog::tableName() . '.CREATE_TIME' => SORT_DESC])->one(); $confirm_user = $log->user->TRUE_NAME; } //备注 $notes = OrderComment::findAll(['ORDER_ID' => $order_id, 'CANCEL_FLAG' => 0, 'COMMENT_TYPE' => OrderComment::TYPE_PUBLIC]); $customer_memo = ''; if (!empty($notes)) { foreach ($notes as $note) { $customer_memo .= $note->COMMENT_TXT . '
'; } $customer_memo = substr($customer_memo, 0, -6); } $confirm_org_id = $confirm_org->CONFIRM_FROM; if ($confirm_org_id == 1) { $head_org_name = "上海南顺"; } elseif ($confirm_org_id == 2) { $head_org_name = '上海蜘蛛行'; } elseif ($confirm_org_id == 3) { $head_org_name = '上海自在'; } elseif ($confirm_org_id == 4) { $head_org_name = '杭州启程'; } elseif ($confirm_org_id == 5) { $head_org_name = '杭州倒计时'; } elseif ($confirm_org_id == 6) { $head_org_name = '千旅集散'; }elseif ($confirm_org_id == 7) { $head_org_name = '昆山文商旅'; } else { $head_org_name = '上海蜘蛛行'; } //供应商 $supplier = BaseSupplier::find()->joinWith('settleType')->joinWith('settleCycle')->where(['base_supplier.ID' => $confirm_org->SUPPLIER_ID])->one(); $payType = $supplier->settleType->TYPE_NAME; $paySeq = $supplier->settleCycle->TYPE_NAME; $phpWord = new zPhpWord(); //入住详情 $mes = ''; $total_price = 0; $messageHeight = 70; $sub_orders = OrderMain::find() ->addSelect([ '*', 'count(*) as order_count', 'sum(base_price) as order_price', ])->asArray()->where(['PARENT_ORDER_ID' => $order_id, 'CANCEL_FLAG' => 0])->groupBy(['PROD_START_STATION_DATE', 'STOCK_TYPE'])->all(); if (!empty($sub_orders)) { foreach ($sub_orders as $v) { $mes .= "
" . $v['PROD_START_STATION_DATE'] . ' ' . ' ' . '结算价:' . $v['BASE_PRICE'] . '元/间' . ' 数量:' . $v['order_count'] . '间 ' . (in_array($v['PARENT_PROD_ID'], [81, 23]) ? ($v['STOCK_TYPE'] == 228 ? '买断房价格' : '其他价格') : '') . "
"; $total_price += $v['BASE_PRICE'] * $v['order_count']; $messageHeight += 30; } } $messageHeight .= 'px'; $message = $mes . '订单总计:' . $total_price . '元'; //当前操作人及时间 /* @var $login_user User */ $login_user = Yii::$app->user->identity; $action_user_name = $login_user->TRUE_NAME; // $action_date = date('Y-m-d H:i'); $action_date = date('Y-m-d'); return <<< WORD {$type}
{$head_org_name}{$type}
订单号: {$order_id} 付款方式: {$payType} {$paySeq}
发 自: {$confirm_org_full_name}
传 真: 0571-86697329 电 话: 0571-86699832
 
预订房型: {$hotel_name} {$product_name}
客人姓名: {$customer_name}
结算总价:  {$base_price}元
入住日期:  {$date_check_in} 离店日期:  {$date_check_out}
备 注: {$customer_memo}
酒店确认号:  {$confirm_code} 确认人: $confirm_user
{$message}

操作人:{$action_user_name}
操作日期:{$action_date}
* {$confirm_org_full_name} 电话:021-33280578 传真:021-33280184
WORD; } /* * 酒店供应商导出订单列表所需的列表头 */ public static function supplierExportAttributes() { return [ 'ORDER_ID', 'CREATE_TIME', 'PARENT_PROD_NAME', 'PROD_NAME', 'PROD_START_STATION_DATE', 'PROD_END_STATION_DATE', 'room_count', 'CUSTOMER_NAME', 'CUSTOMER_MOBILE', 'BASE_PRICE', 'ORDER_STATUS', 'CUSTOMER_MEMO', ]; } /** * Notes:新的退单逻辑 * 该接口没有关于订单的更新,需要在该接口外做处理 * User: Steven * Date: 2018/1/4 * Time: 18:38 * @return bool */ public function rollbackStocks() { //查询子订单 $orders = OrderMain::findAll([ 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID, 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM, 'OUTSIDE_SALE_ORG_ID' => $this->OUTSIDE_SALE_ORG_ID, ]); $room_distrib = OperaRoomDistrib::findOne([ 'ROOM_ID' => $this->RUN_ID, 'DISTRIB_ID' => $this->OUTSIDE_SALE_ORG_ID, 'CANCEL_FLAG' => 0, ]); foreach ($orders as $order) { //渠道已售数量要减去 $distrib = RunHotelDistrib::findOne([ 'HOTEL_ID' => $order->PARENT_PROD_ID, 'ROOM_TYPE' => $order->PROD_ID, 'RUN_DATE' => $order->RUN_DATE, 'DISTRIB_ID' => $order->OUTSIDE_SALE_ORG_ID, ]); $distrib->SALED_COUNT == 0 ? true : $distrib->SALED_COUNT -= 1; $runHotel = RunHotel::findOne([ 'HOTEL_ID' => $order->PARENT_PROD_ID, 'BASE_ROOM_TYPE' => $distrib->BASE_ROOM_TYPE, //订单表没有这字段,但是run_hotel_distrib有 'RUN_DATE' => $order->RUN_DATE, 'STOCK_TYPE' => $order->STOCK_TYPE, ]); if ($order->RUN_BUS_SEAT_TYPE == self::DISTRIB_STOCK_TYPE_RESERVE) { //消耗渠道的库存类型:1:固定数量 //这里需要处理:当当前房型、当前渠道设置了保留房的失效时间,如果当前时间属于失效时间范围内,则渠道库存不退回,基础房型中的保留房库存不回退,但买断房库存需要回退 if (!empty($room_distrib['LATEST_COMFIRM_TIME']) && $room_distrib['LATEST_COMFIRM_TIME'] != -1) { //说明有保留房的最晚立即确认时间 $time_arr = explode(',', $room_distrib['LATEST_COMFIRM_TIME']); $date = date('Y-m-d', strtotime($order->RUN_DATE . "-{$time_arr[0]} day")); $latest_confirm_time = $date . ' ' . $time_arr[1];//该子房型在$order->RUN_DATE这一天看来,保留房失效的时间起点 if (time() >= strtotime($latest_confirm_time)) { //如果这个日期消耗的库存是保留房,那么这个日期改保留房已经过期 渠道固定数量不退回,基础房型如果消耗的是保留房,也不退回 if ($order->STOCK_TYPE != self::STOCK_TYPE_RESERVE) { //消耗的基础房型的库存不是保留 要回退 但是,如果是保留的话,不回退 $runHotel->REMAINING_COUNT += 1; $runHotel->SALED_COUNT == 0 ? true : $runHotel->SALED_COUNT -= 1; // $distrib->REMAINING_COUNT += 1; } else { //消耗的是保留 不回退 $runHotel->SALED_COUNT == 0 ? true : $runHotel->SALED_COUNT -= 1; } } else { //保留房库存没有过期 所有库存照常回退 $runHotel->REMAINING_COUNT += 1; $runHotel->SALED_COUNT == 0 ? true : $runHotel->SALED_COUNT -= 1; $distrib->REMAINING_COUNT += 1; } } else { //没有设置保留房失效时间 所有库存照常回退 $runHotel->REMAINING_COUNT += 1; $runHotel->SALED_COUNT == 0 ? true : $runHotel->SALED_COUNT -= 1; $distrib->REMAINING_COUNT += 1; } } else { //消耗的是渠道的超卖 即没有保留房,也即没有保留房失效时间之说 $runHotel->REMAINING_COUNT += 1; $runHotel->SALED_COUNT == 0 ? true : $runHotel->SALED_COUNT -= 1; } $resRunHotel = $runHotel->save(); $resDistrib = $distrib->save(); if (!$resRunHotel || !$resDistrib) { return false; } } return true; } /** * @Author wanglg * @Desc 获取库存记录,用于修改入住需求的库存合并 * @param $params */ public function getStockArr($params) { $orders = OrderMain::findAll(['PRRENT_ORDER_ID' => $params['order_id'], 'CANCEL_FLAG' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_SUM, 'OUTSIDE_SALE_ORG_ID' => $params['DistribID']]); $room_distrib = OperaRoomDistrib::findOne([ 'ROOM_ID' => $params['RoomId'], 'DISTRIB_ID' => $params['DistribID'], 'CANCEL_FLAG' => 0, ]); OperaHotelRoom::find() ->joinWith('runHotel b') ->where(['a.ID' => $params['RoomID'], 'a.CANCEL_FLAG' => 0,]) ->from('opera_hotel_room a'); foreach ($orders as $order) { $old_stock = OperaHotelRoom::find() ->joinWith('runHotel b') ->where(['a.ID' => $params['RoomID'], 'a.CANCEL_FLAG' => 0, 'b.RUN_DATE' => $order->RUN_DATE, 'b.STOCK_TYPE' => $order->STOCK_TYPE]) ->from('opera_hotel_room a') ->asArray()->one(); } } /** * 回退库存 * 正常取消(包括拒单),库存和已售数均回退 * 异常取消,已售数均回退,基础房型各项数据均回退,渠道固定数量不回退 * * @param bool $type 是否为正常取消 * @return bool */ public function rollbackStock($type = true) { $logger = new TopLogger(); $orders = OrderMain::findAll(['CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID]); foreach ($orders as $order) { $distrib = RunHotelDistrib::findOne([ 'HOTEL_ID' => $order->PARENT_PROD_ID, 'ROOM_TYPE' => $order->PROD_ID, 'RUN_DATE' => $order->RUN_DATE, 'DISTRIB_ID' => $order->OUTSIDE_SALE_ORG_ID, ]); $distrib->SALED_COUNT -= 1; $runHotel = RunHotel::findOne([ 'HOTEL_ID' => $order->PARENT_PROD_ID, 'BASE_ROOM_TYPE' => $distrib->BASE_ROOM_TYPE, //订单表没有这字段,但是run_hotel_distrib有 'RUN_DATE' => $order->RUN_DATE, 'STOCK_TYPE' => $order->STOCK_TYPE, ]); $logger->log([date("Y-m-d H:i:s"), '回退库存:' . $distrib->SALED_COUNT . ', 订单信息:' . $this->ORDER_ID . ',剩余库存数量:' . $runHotel->REMAINING_COUNT . PHP_EOL], 'ali/error'); // if ($order->STOCK_TYPE != OrderMain::STOCK_TYPE_INQUIRY) { if ($type) { $distrib->REMAINING_COUNT += 1; $runHotel->REMAINING_COUNT += 1; } else { $runHotel->REMAINING_COUNT += 1; } $runHotel->SALED_COUNT -= 1; $rs_run_hotel = $runHotel->save(); $rs_distribe = $distrib->save(); $logger->log([date("Y-m-d H:i:s"), '回退库存,订单信息:' . $this->ORDER_ID . ',run_hotel_distrib执行结果' . $rs_distribe . ',run_hotel执行结果:' . $rs_run_hotel . PHP_EOL], 'ali/error'); if (!$rs_run_hotel || !$rs_distribe) { return false; } } if ($this->DOCKING_TYPE != OrderMain::ORDER_TYPE_CHANNEL) { //如果是携程渠道,并且是直连的房型,线下操作后,要及时推送最新的房态到携程 $diret_info = OrderMain::find() ->leftJoin('opera_hotel_room b', 'a.PARENT_PROD_ID=b.HOTEL_ID and a.PROD_ID=b.ROOM_TYPE and b.CANCEL_FLAG=0') ->leftJoin('channel_hotel_relation c', 'a.PARENT_PROD_ID=c.HotelId and c.ChannelId=' . Yii::$app->params['ctrip']['relation_supplier_id']) ->leftJoin('channel_room_relation d', 'b.ID=d.RoomId and d.ChannelId=' . Yii::$app->params['ctrip']['relation_supplier_id']) ->from('order_main a') ->select(['a.ORDER_ID', 'a.PROD_START_STATION_DATE', 'a.PROD_END_STATION_DATE', 'b.ID', 'b.HOTEL_ID', 'b.PARENT_ROOM_TYPE', 'b.ROOM_TYPE', 'c.ChannelHotelId', 'd.ChannelRoomId']) ->where(['a.ORDER_ID' => $this->ORDER_ID, 'a.PARENT_ORDER_ID' => 0, 'a.ORDER_PROD_TYPE' => 25, 'a.CANCEL_FLAG' => 0]) // -> createCommand() -> getRawSql(); ->asArray()->one(); if (!empty($diret_info['ChannelHotelId']) && isset($diret_info['ChannelRoomId'])) { //向携程推送房态 $status_data = ['hotel_id' => $diret_info['HOTEL_ID'], 'parent_room_type' => $diret_info['PARENT_ROOM_TYPE'], 'room_type' => $diret_info['ROOM_TYPE'], 'StartDate' => $diret_info['PROD_START_STATION_DATE'], 'EndDate' => $diret_info['PROD_END_STATION_DATE']]; $price_data = ['hotel_id' => $diret_info['HOTEL_ID'], 'parent_room_type' => $diret_info['PARENT_ROOM_TYPE'], 'room_type' => $diret_info['ROOM_TYPE'], 'StartDate' => $diret_info['PROD_START_STATION_DATE'], 'EndDate' => $diret_info['PROD_END_STATION_DATE']]; $quantity_data = ['hotel_id' => $diret_info['HOTEL_ID'], 'parent_room_type' => $diret_info['PARENT_ROOM_TYPE'], 'room_type' => $diret_info['ROOM_TYPE'], 'StartDate' => $diret_info['PROD_START_STATION_DATE'], 'EndDate' => $diret_info['PROD_END_STATION_DATE']]; $log = new TopLogger(); $room_info_res = Yii::$app->runAction('hotel/ctrip/set-room-info', ['param' => $status_data]); $log->log([date("Y-m-d H:i:s"), '推送房态结果:' . $room_info_res . PHP_EOL], 'ali/error'); $room_price_res = Yii::$app->runAction('hotel/ctrip/set-room-price', ['param' => $price_data]); $log->log([date("Y-m-d H:i:s"), '推送房价结果:' . $room_price_res . PHP_EOL], 'ali/error'); $room_quantity_res = Yii::$app->runAction('hotel/ctrip/update-room-quantity', ['param' => $quantity_data]); $log->log([date("Y-m-d H:i:s"), '推送保留房结果:' . $room_quantity_res . PHP_EOL], 'ali/error'); } } $log = new TopLogger(); $model = new BaseBalance($this->ORDER_ID, 2, '订单取消,金额回退'); $supplier_data = $model->cancelBalanceMain(); //供应商取消 $log->log([date("Y-m-d H:i:s"), '供应商:' . json_encode($supplier_data) . PHP_EOL], 'yufukuan'); $channel_data = $model->cancelChannelBalanceMain(); // 渠道商取消 $log->log([date("Y-m-d H:i:s"), '渠道商:' . json_encode($channel_data) . PHP_EOL], 'yufukuan'); return true; } /** * 订单是否可下,区别于直接 * * @author wangxj */ public function orderAvailable() { $room = $this->operaHotelRoom; if ($room == null || $room->IS_ONSALE == 0) { $this->addError('PROD_ID', '房型已下线'); } $roomDistrib = OperaRoomDistrib::findOne(['ROOM_ID' => $room->ID, 'DISTRIB_ID' => $this->OUTSIDE_SALE_ORG_ID, 'CANCEL_FLAG' => 0]); if ($roomDistrib == null || $roomDistrib->AUTHORITY_STATUS == 0) { $this->addError('OUTSIDE_SALE_ORG_ID', '该房型渠道授权已关闭'); } else { $channelRoom = $this->channelRoom; if ($channelRoom->RUN_STATUS == 329) { $this->addError('PROD_ID', $this->RUN_DATE . ' 已关房'); } $subRoom = $channelRoom->runHotelSubRoom; if ($subRoom == null || $subRoom->RUN_STATUS == 0) { $this->addError('PROD_ID', $this->RUN_DATE . ' 已满房'); } $roomStock = $channelRoom->roomStock; if ($roomStock == null) { $this->addError('PROD_ID', $this->RUN_DATE . ' 基础库存数据错误,请联系后台查看原因'); } else { $count = 0; foreach ($roomStock as $item) { $count += $item->REMAINING_COUNT; } if ($count < $this->room_count) { $this->addError('PROD_ID', $this->RUN_DATE . ' 基础房型库存不足'); } } if ($channelRoom->REMAINING_COUNT < $this->room_count && $channelRoom->OVERSELL_FLAG == 0) { $this->addError('PROD_ID', $this->RUN_DATE . ' 房型渠道库存不足'); } } } /** * Notes:将其他库存大于基础房型买断+保留的渠道库存设置为买断+保留 * User: Steven * Date: 2018/1/9 * Time: 18:20 * @param $hotel_id * @param $room_id * @param $check_in * @param $check_out * @param $distrib_id */ public function UpdateStockByShare($params) { $query = RunHotelDistrib::find() ->select(['a.ID', 'a.DISTRIB_ID', 'a.HOTEL_ID', 'a.BASE_ROOM_TYPE', 'b.ROOM_TYPE', 'a.RUN_DATE', 'a.REMAINING_COUNT', 'a.PROD_PRICE', 'a.CUS_PRICE', 'a.RUN_STATUS as DISTRIB_RUN_STATUS', 'a.OVERSELL_FLAG', 'c.STOCK_TYPE', 'c.IS_ONSALE as ROOM_DAY_IS_ONSALE', 'b.IS_ONSALE as ROOM_IS_ONSALE', 'a.GIFT_ID', 'SUM(case c.stock_type when 228 then c.remaining_count else 0 end) as BUYOUT', //买断 'SUM(case c.stock_type when 229 then c.remaining_count else 0 end) as INQUIRY', //现询 'SUM(case c.stock_type when 230 then c.remaining_count else 0 end) as RETAIN'//保留 ]) ->joinWith('operaHotelRoom b', false) ->joinWith(['runHotel c'], false) ->from('run_hotel_distrib a') ->where([ 'a.HOTEL_ID' => $params['hotel_id'], 'b.ID' => $params['room_id'], ]); $query->andFilterWhere(['between', 'a.RUN_DATE', $params['check_in'], $params['check_out']])->groupBy('a.ID'); $sql = $query->createCommand()->getRawSql(); $data = $query->asArray()->all(); if (!empty($data)) { foreach ($data as $item) { if ($item['REMAINING_COUNT'] > $item['RETAIN'] + $item['BUYOUT']) { RunHotelDistrib::updateAll([ 'REMAINING_COUNT' => $item['RETAIN'] + $item['BUYOUT']], ['ID' => $item['ID']]); $soap_param = array('hotel_id' => $params['hotel_id'], 'parent_room_type' => $item['BASE_ROOM_TYPE'], 'room_type' => $item['ROOM_TYPE'], 'begin_date' => $item['RUN_DATE'], 'end_date' => $item['RUN_DATE'], 'channel_id' => $item['DISTRIB_ID']); zHttp::syncRequest(CommonOrder::SEND_REQUEST_GET, Yii::$app->params['push_info_interface'], array('param' => $soap_param)); } } } } /** * Notes:返回对象中的错误数据 * User: Steven * Date: 2017/12/29 * Time: 18:00 * @param null $obj * @return string */ public function getErrorMsg($obj = null) { $obj = empty($obj) ? $this : $obj; $errors = $obj->getErrors(); $str = []; foreach ($errors as $error) { $str[] = implode(';', $error); } return implode(';', $str); } /** * @Author wanglg * @Desc 验证同一渠道下订单号不能重复 * @param $attribute */ public function noRepeat($attribute) { $res = OrderMain::findOne(['OUTSIDE_SALE_ORG_ID' => $this->OUTSIDE_SALE_ORG_ID, 'OUTSIDE_ORDER_NO' => $this->$attribute]); if ($res) { $this->addError($attribute, '渠道订单号已存在'); } } /** * @Author wanglg * @Desc 保存备注信息 * @return bool|\yii\web\Response */ public function comment($param) { if (empty($param['comment_txt']) || empty($param['order_id'])) { return false; } // 查询主订单 $main_order = OrderMain::find() ->select(['ORDER_STATUS', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE']) ->joinWith('operaHotelRoom') ->from('order_main') ->where(['ORDER_ID' => $param['order_id'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN]) ->asArray()->one(); foreach ($param['comment_txt'] as $key => $val) { $comment = new OrderComment(); if (trim($val) != '') { $comment_arr = array('ORDER_ID' => $param['order_id'], 'COMMENT_TYPE' => $key, 'COMMENT_TXT' => $val, 'CANCEL_FLAG' => 0, 'CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'UPDATE_USER_ID' => 0, 'UPDATE_TIME' => '0'); if ($comment->load($comment_arr, '') && $comment->validate()) { if (!$comment->save()) { return false; } } // 如果是已确认或退改中的订单修改生成修改单 if ($key == 1 && in_array($main_order['ORDER_STATUS'], array(198, 382))) { OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1], ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $param['order_id'], 'PARENT_ORDER_ID=' . $param['order_id']]]); } $log_type = $key == 0 ? '内部备注' : '公共备注'; $log_desc = "添加备注:【{$log_type}】 【{$val}】"; $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $main_order['HOTEL_ID'], 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $param['order_id']); $order_log = new OperaHotelLog(); if ($order_log->load($log_arr, '') && $order_log->validate()) { if (!$order_log->save()) { throw new \Exception('记录日志失败!'); } } } } return true; } /** * @Author wanglg * @Desc 删除备注 * @return int|\yii\web\Response */ public function delComment($param) { $order = OrderComment::findOne($param['comment_id']); $order->CANCEL_FLAG = 1; $order->UPDATE_USER_ID = Yii::$app->user->id; $order->UPDATE_TIME = date('Y-m-d H:i:s'); if (!$order->save()) { return false; } $main_order = OrderMain::find() ->select(['order_main.ORDER_STATUS', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE']) ->joinWith('operaHotelRoom') ->from('order_main') ->where(['ORDER_ID' => $param['order_id'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN]) ->asArray()->one(); $log_type = $order['COMMENT_TYPE'] == 0 ? '内部备注' : '公共备注'; // 如果是公共备注生成修改单 if ($order->COMMENT_TYPE == 1 && in_array($main_order['ORDER_STATUS'], array(198, 382))) { OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1], ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $order->ORDER_ID, 'PARENT_ORDER_ID=' . $order->ORDER_ID]]); } $log_desc = "删除备注:【{$log_type}】 【{$order['COMMENT_TXT']}】"; $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $main_order['HOTEL_ID'], 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $param['order_id']); $order_log = new OperaHotelLog(); if ($order_log->load($log_arr, '') && $order_log->validate()) { if (!$order_log->save()) { throw new \Exception('记录日志失败!'); } } return true; } /** * @Author wanglg * @Desc 修改客人姓名 * @return int|\yii\web\Response */ public function updateCustomer($param) { $main_order = OrderMain::find() ->select(['ORDER_STATUS', 'CUSTOMER_NAME', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE']) ->joinWith('operaHotelRoom') ->from('order_main') ->where(['ORDER_ID' => $param['order_id'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN]) ->asArray()->one(); if (in_array($main_order['ORDER_STATUS'], array(198, 382))) { $update_res = OrderMain::updateAll(['CUSTOMER_NAME' => $param['customer_name'], 'CUSTOMER_MOBILE' => $param['customer_mobile'], 'UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1], ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $param['order_id'], 'PARENT_ORDER_ID=' . $param['order_id']]]); } else { $update_res = OrderMain::updateAll(['CUSTOMER_NAME' => $param['customer_name'], 'CUSTOMER_MOBILE' => $param['customer_mobile'], 'UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s')], ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $param['order_id'], 'PARENT_ORDER_ID=' . $param['order_id']]]); } // 修改成功则添加日志记录 if ($update_res) { $log_desc = "修改客人信息:修改客人信息【{$main_order['CUSTOMER_NAME']}】为【{$param['customer_name']}】"; $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $main_order['HOTEL_ID'], 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $param['order_id']); $order_log = new OperaHotelLog(); if ($order_log->load($log_arr, '') && $order_log->validate()) { if (!$order_log->save()) { throw new \Exception('记录日志失败!'); } } } return empty($update_res) ? false : true; } /** * @Author wanglg * @Desc 获取库存数组 * @param $params * @return mixed */ public function getOrderRoomNum($id, $params) { $common_order = new CommonOrder(['scenario' => 'Product']); $common_order->load($params, ''); $stock_info = $common_order->getChannelStock($id); $arr = []; foreach ($stock_info as $item) { $arr[] = $item['OVERSELL_FLAG'] == 1 ? $item['BUYOUT'] + $item['INQUIRY'] + $item['RETAIN'] : $item['REMAINING_COUNT']; } if (!empty($stock_info)) { $minStock = min($arr) > 20 ? 20 : min($arr); for ($i = 0; $i <= $minStock; $i++) { $stock_arr[$i] = [ 'stock_id' => $i, 'stock_count' => $i, ]; } } return $stock_arr; } /** * @Author wanglg * @Desc 获取库存价格列表 * @param $request * @return array */ public function getStockPriceList($request) { if (!isset($request['RoomNum'])) { return array('code' => 1, 'info' => '缺少必要参数'); } $orderModel = new CommonOrder(['scenario' => 'Product']); if ($orderModel->load($request, '') && $orderModel->validate()) { $price_res = $orderModel->getChannelStock($request['id']); foreach ($price_res as $key => $val) { $price_res[$key]['ORDER_PRICE'] = $val['PROD_PRICE']; $price_res[$key]['ALL_PRICE'] = $val['PROD_PRICE'] * $request['RoomNum']; $price_res[$key]['MID_PRICE'] = 0; // 渠道佣金计算 $single_commission = 0; if ($val['COMMISION_FLAG'] == 1) { if ($val['BACK_COMMISION_METHOD'] == BaseSupplier::BACK_COMMISION_METHOD_SALE) { //按照销售额 按返佣比例计算 取百分比 $single_commission = $val['PROD_PRICE'] * ($val['BACK_PERCENT'] / 100) * $request['RoomNum']; } elseif ($val['BACK_COMMISION_METHOD'] == BaseSupplier::BACK_COMMISION_METHOD_SETTLE) { //按结算金额 按返佣固定金额 取固定金额 $single_commission = $val['BACK_VALUE'] * $request['RoomNum']; } else { $commission[BaseSupplier::BACK_COMMISION_METHOD_SETTLE] = 0; } } else { $single_commission = 0; } $price_res[$key]['TOTAL_COMMISSION'] = $single_commission; // 计算订单平均单价 if ($val['BUYOUT'] >= $request['RoomNum']) { $price_res[$key]['BASE_PRICE'] = round($val['BASE_PRICE_BUYOUT'], 2); $price_res[$key]['BENEFIT'] = (($val['PROD_PRICE'] - $val['BASE_PRICE_BUYOUT']) * $request['RoomNum']) - $single_commission; } elseif ($val['BUYOUT'] + $val['RETAIN'] >= $request['RoomNum']) { $price_res[$key]['BASE_PRICE'] = round(($val['BUYOUT'] * $val['BASE_PRICE_BUYOUT'] + $val['BASE_PRICE_RESERVE'] * ($request['RoomNum'] - $val['BUYOUT'])) / $request['RoomNum'], 2); //订单利润 $price_res[$key]['BENEFIT'] = ($val['BUYOUT'] * ($val['PROD_PRICE'] - $val['BASE_PRICE_BUYOUT']) + ($val['PROD_PRICE'] - $val['BASE_PRICE_RESERVE']) * ($request['RoomNum'] - $val['BUYOUT'])) - $single_commission; } elseif ($val['BUYOUT'] + $val['RETAIN'] + $val['INQUIRY']) { $price_res[$key]['BASE_PRICE'] = round(($val['BUYOUT'] * $val['BASE_PRICE_BUYOUT'] + $val['BASE_PRICE_RESERVE'] * $val['RETAIN'] + $val['BASE_PRICE_INQUIRY'] * ($request['RoomNum'] - $val['BUYOUT'] - $val['RETAIN'])) / $request['RoomNum'], 2); $price_res[$key]['BENEFIT'] = $val['BUYOUT'] * ($val['PROD_PRICE'] - $val['BASE_PRICE_BUYOUT']) + $val['RETAIN'] * ($val['PROD_PRICE'] - $val['BASE_PRICE_RESERVE']) + ($request['RoomNum'] - $val['BUYOUT'] - $val['RETAIN']) * ($val['PROD_PRICE'] - $val['BASE_PRICE_INQUIRY']) - $single_commission; } } return $price_res; } else { $error = array_values($orderModel->getFirstErrors()); return array('code' => 1, 'info' => implode('|', $error)); } } /** * @Author wanglg * @Desc 修改入住需求 * @param $params * @return string */ public function updateCheckin($param) { $avail_data = array( 'HotelID' => $param['hotel_id'], 'RoomID' => $param['room_id'], 'RoomNum' => $param['room_count'], 'CheckIn' => $param['start_date'], 'CheckOut' => $param['end_date'], 'DistribID' => $param['org_id'], 'CreateUserID' => $param['user_id'], 'RoomPrices' => 0, 'IfCheckPrice' => false, ); $newOrder = new CommonOrder(['scenario' => 'CheckRoomAvail']); if (!$newOrder->load($avail_data, '') || !$newOrder->validate()) { $error = array_values($newOrder->getFirstErrors()); return json_encode(['code' => 1, 'info' => $error[0]]); } $is_avail = $newOrder->checkRoomAvail($param['order_id']); if ($is_avail['code'] != 0) { return json_encode(['code' => 2, 'info' => $is_avail['info']]); } $room_price = array(); foreach ($is_avail['data']['room_price'] as $k => $room) { $room_price[] = array('RunDate' => $room['run_date'], 'Price' => $room['price']); } // 客人信息 $uncus_names = explode(' ', $param['customer_name']); $all_cus_name = array_values(array_filter($uncus_names)); $split_customer = array_map("self::customer", $all_cus_name); $make_order_arr = array( 'CreateUserID' => Yii::$app->user->id, 'ZZ_ORDER_ID' => $param['order_id'], //蜘蛛订单号 'OrderID' => $param['org_num'], //渠道订单号 'HotelID' => $param['hotel_id'], //酒店ID 'RoomID' => $param['room_id'], //房型ID 'DistribID' => $param['org_id'],//渠道ID 'RoomNum' => $param['room_count'], //房间数量 'CheckIn' => $param['start_date'], //入住日期 'CheckOut' => $param['end_date'], //离店日期, 'TotalPrice' => $is_avail['data']['total_price'],//订单总价 'Currency' => 'RMB', //币种 'ContactName' => $param['customer_name'],//联系人姓名 'ContactTel' => $param['customer_mobile'], //联系人电话 'OrderGuests' => $split_customer, //入住人信息 'Comment' => $param['customer_memo'], //客人备注 'NeedInvoice' => 0, 'InvoiceInfos' => array(), 'RoomPrices' => $room_price, ); $newUpdateOrder = new CommonOrder(['scenario' => 'UpdateHotelOrder']); if ($newUpdateOrder->load($make_order_arr, '')) { $res = $newUpdateOrder->updateHotelOrder(); return json_encode($res); } else { $error = array_values($newOrder->getFirstErrors()); return json_encode(['code' => 3, 'info' => $error[0]]); } } /** * @Author wanglg * @Desc 客人信息处理 * @param $item * @return array */ public static function customer($item) { return array('Name' => $item); } /** * @Author wanglg * @Desc根据订单获取当前订单的房间数 * @param $order_id * @return mixed */ public function getRoomNum($order_id) { $order_info = OrderMain::find() ->select(['COUNT(ORDER_ID) as room_num']) // ->where(['AND', ['=', 'CANCEL_FLAG', 0], ['OR', ['=', 'ORDER_ID', $order_id], ['=', 'PARENT_ORDER_ID', $order_id]]]) ->where(['CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $order_id, 'ORDER_VALID_STATUS' => 1, 'ORDER_LEVEL' => [0, 1]]) ->groupBy('RUN_DATE') ->limit(1) ->asArray()->one(); return $order_info['room_num']; } /** * Function Description:根据外部订单号查询订单是否存在 * Function Name: checkOutsideId * @param $outside_id * @param $supplier_id * @return array|ActiveRecord[] * * @author 娄梦宁 */ public static function getInfoByOutsideId($outside_id, $supplier_id) { $result = self::find()->from(self::tableName()) ->where(['and', ['=', 'cancel_flag', 0], ['=', 'outside_sale_org_id', $supplier_id], ['=', 'outside_order_no', $outside_id]]) ->asArray()->all(); return $result; } /** * Function Description:查询订单外部订单号 * Function Name: getOutSideId * @param $order_id * * @return mixed * * @author 娄梦宁 */ public function getOutSideId($order_id) { $result = self::find()->select('outside_order_no')->from(self::tableName()) ->where(['and', ['=', 'cancel_flag', 0], ['=', 'order_id', $order_id]]) ->asArray() ->one(); return $result['outside_order_no']; } }