'确认单',
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}
订单号: |
{$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'];
}
}