|
- <?php
- /**
- *
- * ============================================================================
- * * 版权所有 蜘蛛出行 * *
- * 网站地址: http://www.zhizhuchuxing.com
- * ----------------------------------------------------------------------------
- * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
- * 使用;不允许对程序代码以任何形式任何目的的再发布。
- * ============================================================================
- * Author By: 张帅
- * PhpStorm GetHotelOrderData.php
- * Create By 2017/4/18 9:44 $
- */
-
- namespace backend\modules\api\logic;
-
- use backend\modules\api\models\BaseArea;
- use backend\modules\api\models\BaseSupplier;
- use backend\modules\api\models\OperaHotel;
- use backend\modules\api\models\OperaHotelRoom;
- use backend\modules\api\models\RunHotelDistrib;
- use backend\modules\api\models\RunHotel;
- use backend\modules\api\models\RunHotelSubRoom;
- use yii\db\Expression;
- use yii\db\Query;
-
- class GetHotelOrderData extends Query
- {
- public $hotel_product;//酒店产品
-
- public $room_stock;//基础库存
-
- public $channel_id;//渠道id
-
- public $order_main_base = [];//订单基础配置
-
- public $pay_main_base = [];//主支付记录基础配置
-
- public $pay_detail_base = [];//支付明细
-
- public $user_id;//用户id
-
- public $create_time;//创建时间
-
- /**
- * Function Description:获取酒店产品的基础房型
- * Function Name: getBaseRoomInfo
- *
- * @param array $hotel_product 酒店选购产品
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getBaseRoomInfo($hotel_product)
- {
- #region 获取房型数据
- $and_where = ['or'];
- foreach ($hotel_product as $key => $vel) {
- $and_where[] = [
- 'and',
- ['=', 'ohr.hotel_id', $vel['hotel_id']],
- ['=', 'ohr.room_type', $vel['room_type']],
- ];
- }
-
- $base_room_list = OperaHotel::find()
- ->select([
- 'oh.hotel_id',//酒店id
- 'oh.hotel_name',//酒店名称
- 'oh.supplier_id',//供应商id
- 'supplier_name' => BaseSupplier::find()->select('supplier_name')->where('id = oh.supplier_id')->limit(1),
- 'ohr.room_type',//房间类型
- 'base_room_type' => 'ohr.parent_room_type',//基础房型
- 'ohr.room_name',//房间名称
- 'oh.area_id',//酒店地点id
- 'area_name' => BaseArea::find()->select('area_name')->where('id = oh.area_id')->limit(1),
- ])
- ->from(OperaHotel::tableName() . ' as oh')
- ->leftJoin(OperaHotelRoom::tableName() . ' as ohr', 'oh.hotel_id = ohr.hotel_id')
- ->where([
- 'and',
- ['=', 'oh.cancel_flag', 0],
- ['=', 'oh.hotel_status', 1],//表示上线
- ['=', 'ohr.cancel_flag', 0],
- ['=', 'ohr.is_onsale', 1],//表示上线
- ])
- ->andWhere($and_where)
- ->groupBy(['hotel_id', 'room_type'])
- ->asArray()->all();
- #endregion
-
- #region 整理数据
- $base_room_arr = [];
- foreach ($base_room_list as $key => $vel) {
- $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']] = $vel;
- }
-
- foreach ($hotel_product as $key => $vel) {
- #region 判断产品是否存在
- if (!isset($base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']])) {
- $json['code'] = '1';
- $json['info'] = '酒店产品有误';
- return $json;
- }
- #endregion
-
- $hotel_product[$key]['hotel_name'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['hotel_name'];//酒店名称
- $hotel_product[$key]['supplier_id'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['supplier_id'];//供应商
- $hotel_product[$key]['supplier_name'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['supplier_name'];//供应商
- $hotel_product[$key]['room_name'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['room_name'];//子房型名称
- $hotel_product[$key]['base_room_type'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['base_room_type'];//基础房型
- $hotel_product[$key]['area_id'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['area_id'];//酒店地点id
- $hotel_product[$key]['area_name'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['area_name'];//酒店地点
- }
- #endregion
-
- $this->hotel_product = $hotel_product;
-
- $json['code'] = '0';
- $json['info'] = '成功';
- return $json;
- }
-
- /**
- * Function Description:获取酒店基础库存
- * Function Name: getHotelBaseStock
- *
- * @param int $channel_id 渠道id
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getRoomBaseStock($channel_id)
- {
- #region 设置渠道号
- $this->channel_id = $channel_id;
- #endregion
-
- #region 获取酒店选购产品数据
- $hotel_product_info = $this->hotel_product;
- #endregion
-
- #region 获取基础库存
- $and_where = ['or'];
- foreach ($hotel_product_info as $hotel_key => $hotel_vel) {
- foreach ($hotel_vel['run_room'] as $room_key => $room_vel) {
- $and_where[] = [
- 'and',
- ['=', 'run_date', $room_vel['run_date']],
- ['=', 'hotel_id', $hotel_vel['hotel_id']],
- ['=', 'base_room_type', $hotel_vel['base_room_type']],
- ['=', 'room_type', $hotel_vel['room_type']],
- ];
- }
- }
-
- $room_stock_list = RunHotelDistrib::find()
- ->select([
- 'run_date',
- 'hotel_id',
- 'base_room_type',
- 'room_type',
- 'remaining_count',//数量
- 'oversell_flag',//超卖标志
- 'consume_stock_type',//售卖顺序
- ])
- ->where([
- 'and',
- ['=', 'distrib_id', $channel_id],
- ['=', 'authority_status', 1],//授权
- ['=', 'run_status', 326],//房态 :326 固定数量,329 关房
- ])
- ->andWhere($and_where)
- ->asArray()->all();
- #endregion
-
- #region 判断库存
- if (count($room_stock_list) == 0) {
- $json['code'] = '1';
- $json['info'] = '酒店库存不足';
- return $json;
- }
- #endregion
-
- #region 处理数据
- $room_stock_arr = [];
- foreach ($room_stock_list as $key => $vel) {
- $stock_type_arr = explode(',', $vel['consume_stock_type']);//下单时消耗的库存类型顺序
- $stock_type_arr = array_unique($stock_type_arr);
- $vel['stock_type_arr'] = $stock_type_arr;
- $room_stock_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']] = $vel;
- }
- #endregion
-
- $this->room_stock = $room_stock_arr;
-
- $json['code'] = '0';
- $json['info'] = '成功';
- return $json;
- }
-
- /**
- * Function Description:获取详情库存
- * Function Name: getRoomInfoStock
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getRoomInfoStock()
- {
- #region 获取酒店选购产品数据
- $room_base_stock = $this->room_stock;
- #endregion
-
- #region 获取库存详情
- $and_where = ['or'];
- foreach ($room_base_stock as $key => $vel) {
- $and_where[] = [
- 'and',
- ['=', 'rh.run_date', $vel['run_date']],
- ['=', 'rh.hotel_id', $vel['hotel_id']],
- ['=', 'rh.base_room_type', $vel['base_room_type']],
- ['in', 'rh.stock_type', $vel['stock_type_arr']],
- ['=', 'rhs.room_type', $vel['room_type']],
- ];
- }
-
- $stock_list = RunHotel::find()
- ->select([
- 'rh.hotel_id',
- 'rh.base_room_type',
- 'rhs.room_type',
- 'rh.run_date',//入住日期
- 'rh.stock_type',//库存类型
- 'rh.remaining_count',//库存剩余数量
- 'cost_price' => new Expression("case rh.stock_type when 228 then rhs.base_price_buyout when 230 then rhs.base_price_reserve when 229 then rhs.base_price_inquiry else 0 end"),//价格
- ])
- ->from(RunHotel::tableName() . ' as rh')
- ->leftJoin(RunHotelSubRoom::tableName() . ' as rhs', 'rh.hotel_id = rhs.hotel_id and rh.base_room_type = rhs.base_room_type and rh.run_date = rhs.run_date')
- ->where([
- 'and',
- ['=', 'rhs.run_status', 1],
- ['=', 'rhs.is_onsale', 1],
- ['=', 'rh.is_onsale', 1],
- ])
- ->andWhere($and_where)
- ->asArray()->all();
- #endregion
-
- #region 整理库存详情
- $stock_list_arr = [];
- foreach ($stock_list as $key => $vel) {
- $stock_list_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date'] . '-' . $vel['stock_type']] = $vel;
- }
-
- foreach ($room_base_stock as $room_key => $room_vel) {
- $room_base_stock[$room_key]['consume_stock_count1'] = 0;
- $room_base_stock[$room_key]['consume_stock_count2'] = 0;
- foreach ($room_vel['stock_type_arr'] as $key => $vel) {
- if (isset($stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel])) {
- if ($vel == 228 || $vel == 230) {
- $room_base_stock[$room_key]['consume_stock_count1'] += $stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel]['remaining_count'];
- $room_base_stock[$room_key]['stock_type_arr1'][] = $stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel];
- } elseif ($vel == 229) {
- $room_base_stock[$room_key]['consume_stock_count2'] = $stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel]['remaining_count'];
- $room_base_stock[$room_key]['stock_type_arr2'][] = $stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel];
- }
- $room_base_stock[$room_key]['stock_type_arr'][$key] = $stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel];//不同库存类型的库存和价格
- }
- }
- }
- #endregion
-
- $this->room_stock = $room_base_stock;
-
- $json['code'] = '0';
- $json['info'] = '成功';
- return $json;
- }
-
- /**
- * Function Description:获取酒店产品的库存情况
- * Function Name: checkHotelProductStock
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function checkHotelProductStock()
- {
- #endregion
- $is_reserve_ok = $this->FxCheckHotelStock(1);
- if ($is_reserve_ok['code'] == 1) {//总库存不足
- return $is_reserve_ok;
- } elseif ($is_reserve_ok['code'] == 2) {//买断和保留库存不足
- $is_inquiry_ok = $this->FxCheckHotelStock(2);//尝试所有都用现询房
- if ($is_inquiry_ok['code'] != 0) {
- return [
- 'code' => 1,
- 'info' => '酒店库存不足'
- ];
- } else {
- $hotel_product_info = $is_inquiry_ok['result'];
- }
- } else {
- $hotel_product_info = $is_reserve_ok['result'];
- }
- #endregion
- $this->hotel_product = $hotel_product_info;
-
- return $hotel_product_info;
- }
-
- /**
- * Function Description:判断酒店库存是否足够函数
- * Function Name: FxCheckHotelStock
- *
- * @param $is_reserve 1 :买断和保留库存 2:现询库存
- *
- * @return array
- *
- * @author 娄梦宁
- */
- public function FxCheckHotelStock($is_reserve)
- {
- #region 获取酒店选购产品数据
- $hotel_product_info = $this->hotel_product;
- #endregion
-
- #region 获取酒店选购产品库存数据
- $room_stock = $this->room_stock;
- #endregion
-
- #region 整理数据并判断库存
- foreach ($hotel_product_info as $hotel_key => $hotel_vel) {
-
- #region 主订单必需数据
- $hotel_vel['refuse_flag'] = 0;//是否可拒单状态
- $hotel_vel['total_price'] = 0;//订单总价
- $hotel_vel['total_commision'] = 0;//订单总返佣
- $hotel_vel['total_cost_price'] = 0;//订单总成本
- $hotel_vel['total_num'] = 0;//订单总人数
- #endregion
-
- foreach ($hotel_vel['run_room'] as $room_key => $room_vel) {
- #region 判断库存是否存在
- if (!isset($room_stock[$hotel_vel['hotel_id'] . '-' . $hotel_vel['base_room_type'] . '-' . $hotel_vel['room_type'] . '-' . $room_vel['run_date']])) {
- $json['code'] = '1';
- $json['info'] = '酒店库存不足';
- return $json;
- }
- #endregion
-
- #region 单房间库存
- $room_stock_one = $room_stock[$hotel_vel['hotel_id'] . '-' . $hotel_vel['base_room_type'] . '-' . $hotel_vel['room_type'] . '-' . $room_vel['run_date']];
- #endregion
-
- $room_vel['oversell_flag'] = $room_stock_one['oversell_flag'];//超卖标志
- $room_vel['remaining_count'] = $room_stock_one['remaining_count'];//房间基础库存
- $room_vel['consume_stock_count' . $is_reserve] = $room_stock_one['consume_stock_count' . $is_reserve];//房间总库存
-
- #region 判断库存
- if ($room_vel['prod_num'] > $room_vel['consume_stock_count' . $is_reserve] || ($room_vel['oversell_flag'] == 0 && $room_vel['prod_num'] > $room_vel['remaining_count'])) {
- $json['code'] = '2';
- return $json;
- }
-
- if ($room_vel['prod_num'] > $room_vel['remaining_count']) {
- $hotel_vel['refuse_flag'] = 1;
- }
- #endregion
-
- #region 按人数拆单
- $room_vel['total_price'] = $room_vel['prod_num'] * $room_vel['prod_price'];//总价格
- if ($room_vel['back_commision_method'] == 308) {//按百分比算佣金
- $room_vel['total_commision'] = (int)$room_vel['back_percent'] * 0.01 * $room_vel['prod_price'] * $room_vel['prod_num'];
- } else {
- $room_vel['total_commision'] = $room_vel['prod_num'] * $room_vel['back_value'];//总返佣
- }
- $room_vel['total_cost_price'] = 0;//总成本
-
- $son_order = [];
-
- for ($i = 0; $i < $room_vel['prod_num']; $i++) {
-
- $son_order[$i]['price'] = $room_vel['prod_price'];//价格
- //佣金规则--娄梦宁
- if ($room_vel['back_commision_method'] == 308) {//按百分比算
- $son_order[$i]['commision'] = (int)$room_vel['back_percent'] * 0.01 * $room_vel['prod_price'];
- } else {
- $son_order[$i]['commision'] = $room_vel['back_value'];
- }
-
-
- #region 获取成本
- foreach ($room_stock_one['stock_type_arr' . $is_reserve] as $key => $vel) {
- if ($vel['remaining_count'] > 0) {
- $son_order[$i]['cost_price'] = $vel['cost_price'];//成本
- $son_order[$i]['stock_type'] = $vel['stock_type'];//库存类型
- $room_stock_one['stock_type_arr' . $is_reserve][$key]['remaining_count']--;//库存类型库存减少
- $room_vel['total_cost_price'] += $vel['cost_price'];
- break;
- }
- }
- #endregion
- }
- $room_vel['son_order'] = $son_order;
-
- $hotel_vel['total_price'] += $room_vel['total_price'];
- $hotel_vel['total_commision'] += $room_vel['total_commision'];
- $hotel_vel['total_cost_price'] += $room_vel['total_cost_price'];
- $hotel_vel['total_num'] += $room_vel['prod_num'];//订单总人数
- #endregion
-
- #region 库存减少
- if ($room_vel['prod_num'] > $room_stock_one['remaining_count']) {
- $room_vel['is_disperse'] = $room_vel['prod_num'] - $room_stock_one['remaining_count'];//需要分发到其他渠道的订单数
- $room_vel['no_disperse'] = $room_stock_one['remaining_count'];//本渠道的订单数
-
- $room_stock_one['remaining_count'] = 0;//渠道预售
- } else {
-
- $room_vel['is_disperse'] = 0;//需要分发到其他渠道的订单数
- $room_vel['no_disperse'] = $room_vel['prod_num'];//本渠道的订单数
-
- $room_stock_one['remaining_count'] -= $room_vel['prod_num'];//渠道预售
- }
-
- $room_stock_one['consume_stock_count' . $is_reserve] -= $room_vel['prod_num'];//总库存
- $room_stock[$hotel_vel['hotel_id'] . '-' . $hotel_vel['base_room_type'] . '-' . $hotel_vel['room_type'] . '-' . $room_vel['run_date']] = $room_stock_one;
- #endregion
-
- $hotel_vel['run_room'][$room_key] = $room_vel;
- }
-
- $hotel_product_info[$hotel_key] = $hotel_vel;
- }
- return [
- 'code' => 0,
- 'result' => $hotel_product_info
- ];
- }
-
-
- /**
- * Function Description:获取提交酒店订单数据
- * Function Name: getSubmitHotelData
- *
- * @param int $unique_id 唯一主键
- * @param array $order_main_base 订单基础配置
- * @param array $pay_main_base 主支付记录基础配置
- * @param array $pay_detail_base 支付明细
- * @param int $user_id 用户id
- * @param string $create_time 创建时间
- *
- * @return array
- *
- * @author 张帅
- */
- public function getSubmitHotelData($unique_id, $order_main_base, $pay_main_base, $pay_detail_base, $user_id, $create_time)
- {
- #region 设置常量
- $this->order_main_base = $order_main_base;
- $this->pay_main_base = $pay_main_base;
- $this->pay_detail_base = $pay_detail_base;
- $this->user_id = $user_id;
- $this->create_time = $create_time;
- #endregion
-
- #region 获取酒店选购产品数据
- $hotel_product_info = $this->hotel_product;
- #endregion
-
- #region 提交订单素材
- $order_main_arr = [];//订单表提交数据
- $main_order_id_arr = [];//巴士订单组
- $run_hotel_arr = [];//run_hotel需要修改数据
- $run_hotel_distrib_arr = [];//run_hotel_distrib需要修改数据
- $run_hotel_disperse_arr = [];//run_hotel_distrib需要分摊数据
- $pay_main_arr = [];//主支付记录
- $pay_detail_arr = [];//支付明细
- $run_hotel_disperse_result = [];
- $order_comment_arr = [];
- #endregion
-
- #region 遍历主订单
- foreach ($hotel_product_info as $main_key => $main_vel) {
-
- $pay_main_id = $unique_id;
- $order_id = $pay_main_id + 1;//订单递增id
- $main_order_id = $order_id;//主订单id
-
- #region 主订单单一数据
- $order_main_one = $this->getMainOrderInfoArray($order_id, $pay_main_id, $main_vel);
- #endregion
-
- #region 插入主订单
- $order_main_arr[] = $order_main_one;
- $main_order_id_arr[$order_id] = $order_id;//收集主订单号
- #endregion
-
- #region 遍历子订单
- foreach ($main_vel['run_room'] as $room_key => $room_vel) {
- foreach ($room_vel['son_order'] as $son_key => $son_vel) {
- $order_id++;//获取订单号
-
- #region 子订单单一数据
- $order_main_one = $this->getSonOrderInfoArray($order_id, $main_order_id, $pay_main_id, $main_vel, $room_vel, $son_vel);
- #endregion
-
- #region 插入子订单
- $order_main_arr[] = $order_main_one;
- #endregion
-
- #region 获取run_hotel需要修改的库存
- $run_hotel_arr = $this->getRunHotelInfo($run_hotel_arr, $main_vel['hotel_id'], $main_vel['base_room_type'], $room_vel['run_date'], $son_vel['stock_type']);
- #endregion
- }
-
- #region 获取run_hotel_distrib需要修改的库存
- $run_hotel_distrib_arr = $this->getRunHotelDistriblInfo($run_hotel_distrib_arr, $main_vel['hotel_id'], $main_vel['base_room_type'], $main_vel['room_type'], $room_vel['run_date'], $room_vel['no_disperse'], $room_vel['is_disperse']);
- #endregion
-
- #region 获取run_hotel_distrib需要分摊数据
- if ($room_vel['is_disperse'] > 0) {
- $run_hotel_disperse_arr = $this->getRunHotelDisperselInfo($run_hotel_disperse_arr, $main_vel['hotel_id'], $main_vel['base_room_type'], $main_vel['room_type'], $room_vel['run_date'], $room_vel['is_disperse'], $main_order_id);
- }
- #endregion
- }
- #endregion
-
- #region 获取酒店订单备注
- if ($main_vel['hotel_memo'] != '') {
- $order_comment_one = $this->getOrderCommentInfo($main_order_id, $main_vel['hotel_memo']);
- $order_comment_arr[] = $order_comment_one;
- }
- #endregion
-
- #region 获取主支付记录数据
- $pay_main_one = $this->getPayMainInfo($pay_main_id, $main_order_id, $main_vel['total_price']);
- $pay_main_arr[] = $pay_main_one;
- #endregion
-
- #region 获取支付明细数据
- $pay_detail_one = $this->getPayDetailInfo($pay_main_id, $main_vel['total_price']);
- $pay_detail_arr[] = $pay_detail_one;
- #endregion
-
- $unique_id = $order_id + 1;
- }
- #endregion
-
- #region 获取分摊库存需要更新数据
- if (count($run_hotel_disperse_arr) > 0) {
- $run_hotel_disperse_result = $this->getDisperseData($run_hotel_disperse_arr);
- }
- #endregion
-
- $result = [
- 'main_order_id_arr' => $main_order_id_arr,//巴士订单号数组
- 'order_main_arr' => $order_main_arr,//订单表数据
- 'run_hotel_arr' => $run_hotel_arr,//run_hotel需要修改的库存
- 'run_hotel_distrib_arr' => $run_hotel_distrib_arr,//run_hotel_distrib需要修改的库存
- 'run_hotel_disperse_result' => $run_hotel_disperse_result,//run_hotel_distrib需要分摊数据
- 'order_comment_arr' => $order_comment_arr,
- 'pay_main_arr' => $pay_main_arr,//主支付记录
- 'pay_detail_arr' => $pay_detail_arr,//支付明细
- 'unique_id' => $unique_id,//唯一键值
- ];
-
- return $result;
- }
-
- /**
- * Function Description:获取酒店主订单数据
- * Function Name: getMainOrderInfoArray
- *
- * @param int $order_id 订单号
- * @param int $pay_main_id 支付号
- * @param array $main_order 订单信息
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getMainOrderInfoArray($order_id, $pay_main_id, $main_order)
- {
- #region 获取订单配置
- $result = $this->order_main_base;
- #endregion
-
- $result['ID'] = $order_id;//订单号
- $result['ORDER_ID'] = $order_id;//订单号
- $result['PROD_TOP_ORG_ID'] = $main_order['supplier_id'];//供应商id
- $result['PROD_SUPPLY_ORG_NAME'] = $main_order['supplier_name'];//供应商名称
- $order_description = [];
- foreach ($main_order['run_room'] as $key => $vel) {
- $order_description[] = $main_order['room_name'] . ',' . $vel['run_date'] . ',' . $vel['prod_num'];
- }
- $order_description[] = $main_order['total_num'];
- $order_description = implode('|', $order_description);
- $result['ORDER_DESCRIPTION'] = $order_description;//订单描述
- $result['ORDER_PAY_MAIN_ID'] = $pay_main_id;//主支付记录id
- $result['PROD_ID'] = $main_order['room_type'];//房间类型
- $result['PROD_NAME'] = $main_order['room_name'];//房间名称
- $result['PARENT_PROD_ID'] = $main_order['hotel_id'];//酒店id
- $result['PARENT_PROD_NAME'] = $main_order['hotel_name'];//酒店名称
- $result['ORDER_PRICE'] = $main_order['total_price'];//订单价格
- $result['ORDER_PROD_TYPE'] = 25;//订单类型
- $result['BASE_PRICE'] = $main_order['total_cost_price'];//成本价
-
- $result['PROD_START_STATION_DATE'] = $main_order['start_date'];//入住时间
- $result['PROD_START_STATION_DATE_NUM'] = (strtotime($main_order['start_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);
- $result['PROD_START_STATION_AREA_ID'] = $main_order['area_id'];//酒店地址id
- $result['PROD_START_STATION_AREA_NAME'] = $main_order['area_name'];//酒店地址名称
- $end_date = date('Y-m-d', strtotime(" {$main_order['end_date']} +1 day"));
- $result['PROD_END_STATION_DATE'] = $end_date;//离店时间
- $result['PROD_END_STATION_DATE_NUM'] = (strtotime($end_date) - strtotime('2016-01-01')) / (60 * 60 * 24);
-
- $result['REFUSE_FLAG'] = $main_order['refuse_flag'];//是否可拒单
- $total_profit = $main_order['total_price'] - $main_order['total_commision'] - $main_order['total_cost_price'];//总利润
- $result['PROFIT_VALUE'] = $total_profit;//总利润
- $result['TOTAL_COMMISSION'] = $main_order['total_commision'];//总分佣
-
- $result['ORDER_STATUS'] = 198;
-
- return $result;
- }
-
- /**
- * Function Description:获取酒店子订单数据
- * Function Name: getSonOrderInfoArray
- *
- * @param int $order_id 订单号
- * @param int $main_order_id 父订单号
- * @param int $pay_main_id 支付号
- * @param array $main_order 订单信息
- * @param array $room_arr 房间信息
- * @param array $son_order 子订单信息
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getSonOrderInfoArray($order_id, $main_order_id, $pay_main_id, $main_order, $room_arr, $son_order)
- {
- #region 获取订单配置
- $result = $this->order_main_base;
- #endregion
-
- $result['ID'] = $order_id;//订单号
- $result['ORDER_ID'] = $order_id;//订单号
- $result['PROD_TOP_ORG_ID'] = $main_order['supplier_id'];//供应商id
- $result['PROD_SUPPLY_ORG_NAME'] = $main_order['supplier_name'];//供应商名称
- $result['ORDER_PAY_MAIN_ID'] = $pay_main_id;//主支付记录id
- $result['PARENT_ORDER_ID'] = $main_order_id;//父订单号
- $result['PROD_ID'] = $main_order['room_type'];//房间类型
- $result['PROD_NAME'] = $main_order['room_name'];//房间名称
- $result['PARENT_PROD_ID'] = $main_order['hotel_id'];//酒店id
- $result['PARENT_PROD_NAME'] = $main_order['hotel_name'];//酒店名称
- $result['ORDER_PRICE'] = $son_order['price'];//订单价格
- $result['ORDER_PROD_TYPE'] = 26;//订单类型
- $result['BASE_PRICE'] = $son_order['cost_price'];//成本价
-
- $result['RUN_DATE'] = $room_arr['run_date'];//入住日期
- $result['RUN_DATE_NUM'] = (strtotime($room_arr['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);
- $result['RUN_TIME'] = $room_arr['run_time'];//入住时间
- $result['RUN_TIME_MINUTES'] = (strtotime($room_arr['run_time'])) / (60 * 60);
-
- $result['PROD_START_STATION_DATE'] = $room_arr['run_date'];//入住时间
- $result['PROD_START_STATION_DATE_NUM'] = (strtotime($room_arr['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);
- $result['PROD_START_STATION_AREA_ID'] = $main_order['area_id'];//酒店地址id
- $result['PROD_START_STATION_AREA_NAME'] = $main_order['area_name'];//酒店地址名称
- $end_date = date('Y-m-d', strtotime(" {$room_arr['run_date']} +1 day"));
- $result['PROD_END_STATION_DATE'] = $end_date;//离店时间
- $result['PROD_END_STATION_DATE_NUM'] = (strtotime($end_date) - strtotime('2016-01-01')) / (60 * 60 * 24);
-
- $result['REFUSE_FLAG'] = $main_order['refuse_flag'];//是否可拒单
- $profit = $son_order['price'] - $son_order['commision'] - $son_order['cost_price'];//利润
- $result['PROFIT_VALUE'] = $profit;//利润
- $result['TOTAL_COMMISSION'] = $son_order['commision'];//分佣
- $result['STOCK_TYPE'] = $son_order['stock_type'];
- $result['ORDER_STATUS'] = 198;
-
- return $result;
- }
-
- /**
- * Function Description:获取主支付记录数据
- * Function Name: getPayMainInfo
- *
- * @param int $pay_main_id 支付id
- * @param int $order_id 订单id
- * @param double $total_price 总价
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getPayMainInfo($pay_main_id, $order_id, $total_price)
- {
- #region 获取主支付记录配置
- $result = $this->pay_main_base;
- #endregion
-
- $result['ID'] = $pay_main_id;//支付id
- $result['PAY_TOTAL'] = $total_price;//订单id
- $result['ORDER_ID'] = $order_id;//总价
-
- return $result;
- }
-
- /**
- * Function Description:获取支付明细数据
- * Function Name: getPayDetailInfo
- *
- * @param int $pay_main_id 支付id
- * @param double $total_price 总价
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getPayDetailInfo($pay_main_id, $total_price)
- {
- #region 获取支付明细配置
- $result = $this->pay_detail_base;
- #endregion
-
- $result['ID'] = $pay_main_id;//支付id
- $result['PAY_MAIN_ID'] = $pay_main_id;//订单id
- $result['PAY_MONEY'] = $total_price;//总价
-
- return $result;
- }
-
- /**
- * Function Description:获取run_hotel需要修改数据
- * Function Name: getRunHotelInfo
- *
- * @param array $run_hotel_arr run_hotel需要修改数据
- * @param int $hotel_id 酒店id
- * @param int $base_room_type 基础房型
- * @param string $run_date 入住日期
- * @param int $stock_type 库存类型
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getRunHotelInfo($run_hotel_arr, $hotel_id, $base_room_type, $run_date, $stock_type)
- {
- if (!isset($run_hotel_arr[$hotel_id . '-' . $base_room_type . '-' . $run_date . '-' . $stock_type])) {
- $result = [];
- $result['hotel_id'] = $hotel_id;//酒店id
- $result['base_room_type'] = $base_room_type;//基础房型
- $result['run_date'] = $run_date;//入住日期
- $result['stock_type'] = $stock_type;//库存类型
- $result['update_user_id'] = $this->user_id;//更新用户id
- $result['update_time'] = $this->create_time;//更新时间
- $result['num'] = 1;//人数
-
- $run_hotel_arr[$hotel_id . '-' . $base_room_type . '-' . $run_date . '-' . $stock_type] = $result;
- } else {
- $run_hotel_arr[$hotel_id . '-' . $base_room_type . '-' . $run_date . '-' . $stock_type]['num']++;//增加人数
- }
-
- return $run_hotel_arr;
- }
-
- /**
- * Function Description:获取酒店订单备注
- * Function Name: getOrderCommentInfo
- *
- * @param int $main_order_id 订单id
- * @param string $hotel_memo 酒店备注
- *
- * @return array
- *
- * @author 张帅
- */
- public function getOrderCommentInfo($main_order_id, $hotel_memo)
- {
- $result = [
- 'ORDER_ID' => $main_order_id,
- 'COMMENT_TYPE' => 1,
- 'COMMENT_TXT' => $hotel_memo,
- 'CREATE_USER_ID' => $this->user_id,//更新用户id
- 'CREATE_TIME' => $this->create_time,//更新时间
- 'UPDATE_USER_ID' => $this->user_id,//更新用户id
- 'UPDATE_TIME' => $this->create_time,//更新时间
- ];
-
- return $result;
- }
-
- /**
- * Function Description:获取run_hotel_distrib需要修改数据
- * Function Name: getRunHoteDistriblInfo
- *
- * @param array $run_hotel_distrib_arr run_hotel_distrib需要修改数据
- * @param int $hotel_id 酒店id
- * @param int $base_room_type 基础房型
- * @param int $room_type 房型类型
- * @param string $run_date 入住日期
- * @param int $prod_num 人数
- * @param int $disperse 需要向其他渠道分配的人数
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getRunHotelDistriblInfo($run_hotel_distrib_arr, $hotel_id, $base_room_type, $room_type, $run_date, $prod_num, $disperse)
- {
- if (!isset($run_hotel_distrib_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date])) {
- $result = [];
- $result['channel_id'] = $this->channel_id;//渠道id
- $result['hotel_id'] = $hotel_id;//酒店id
- $result['base_room_type'] = $base_room_type;//基础房型
- $result['room_type'] = $room_type;//房型类型
- $result['run_date'] = $run_date;//入住日期
- $result['update_user_id'] = $this->user_id;//更新用户id
- $result['update_time'] = $this->create_time;//更新时间
- $result['num'] = $prod_num;//人数
- $result['saled_count'] = $prod_num + $disperse;//人数
-
- $run_hotel_distrib_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date] = $result;
- } else {
- $run_hotel_distrib_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date]['num'] += $prod_num;//增加人数
- $run_hotel_distrib_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date]['saled_count'] += $prod_num + $disperse;//增加人数
- }
-
- return $run_hotel_distrib_arr;
- }
-
- /**
- * Function Description:获取run_hotel_distrib需要分摊数据
- * Function Name: getRunHoteDisperselInfo
- *
- * @param array $run_hotel_disperse_arr run_hotel_distrib需要分摊数据
- * @param int $hotel_id 酒店id
- * @param int $base_room_type 基础房型
- * @param int $room_type 房型类型
- * @param string $run_date 入住日期
- * @param int $prod_num 人数
- * @param int $main_order_id 主订单号
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getRunHotelDisperselInfo($run_hotel_disperse_arr, $hotel_id, $base_room_type, $room_type, $run_date, $prod_num, $main_order_id)
- {
- if (!isset($run_hotel_disperse_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date])) {
- $result = [];
- $result['hotel_id'] = $hotel_id;//酒店id
- $result['base_room_type'] = $base_room_type;//基础房型
- $result['room_type'] = $room_type;//房型类型
- $result['run_date'] = $run_date;//入住日期
- $result['update_user_id'] = $this->user_id;//更新用户id
- $result['update_time'] = $this->create_time;//更新时间
- $result['num'] = $prod_num;//人数
- $result['order_disperse'][$main_order_id] = $prod_num;
-
- $run_hotel_disperse_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date] = $result;
- } else {
- $run_hotel_disperse_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date]['num'] += $prod_num;//增加人数
- $result['order_disperse'][$main_order_id] = $prod_num;
- }
-
- return $run_hotel_disperse_arr;
- }
-
- /**
- * Function Description:获取借房
- * Function Name: getDisperseData
- *
- * @param array $run_hotel_disperse_arr 需要借房的数据
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getDisperseData($run_hotel_disperse_arr)
- {
- $run_hotel_distrib_disperse_arr = [];
- $order_ht_consume_stock = [];
-
- #region 获取可以借房的渠道
- $and_where = ['or'];
- foreach ($run_hotel_disperse_arr as $key => $vel) {
- $and_where[] = [
- 'and',
- ['=', 'hotel_id', $vel['hotel_id']],
- ['=', 'base_room_type', $vel['base_room_type']],
- ['=', 'room_type', $vel['room_type']],
- ['=', 'run_date', $vel['run_date']],
- ];
- }
- $channel_list = RunHotelDistrib::find()
- ->select([
- 'id',
- 'hotel_id',//酒店id
- 'base_room_type',//基础房型
- 'room_type',//房型类型
- 'run_date',//入住日期
- 'distrib_id',//渠道id
- 'remaining_count',
- ])
- ->where([
- 'and',
- ['>', 'remaining_count', 0],
- ['!=', 'distrib_id', $this->channel_id],
- ])
- ->andWhere($and_where)
- ->orderBy(['remaining_count' => SORT_DESC])
- ->asArray()->all();
- #endregion
-
- foreach ($channel_list as $key => $vel) {//$vel['distrib_id'] . '-' . $vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']
- $num = $run_hotel_disperse_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']]['num'];
- if ($num > 0) {
- $order_disperse = $run_hotel_disperse_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']]['order_disperse'];
-
- #region 获取借房的渠道的数据
- $run_hotel_distrib_disperse_arr_one['distrib_id'] = $vel['distrib_id'];//渠道id
- $run_hotel_distrib_disperse_arr_one['hotel_id'] = $vel['hotel_id'];//酒店id
- $run_hotel_distrib_disperse_arr_one['base_room_type'] = $vel['base_room_type'];//基础房型
- $run_hotel_distrib_disperse_arr_one['room_type'] = $vel['room_type'];//房型类型
- $run_hotel_distrib_disperse_arr_one['run_date'] = $vel['run_date'];//入住日期
- $run_hotel_distrib_disperse_arr_one['update_time'] = $this->create_time;//
- $run_hotel_distrib_disperse_arr_one['update_user_id'] = $this->user_id;//
- if ($vel['remaining_count'] >= $num) {
- $run_hotel_distrib_disperse_arr_one['num'] = $num;//房间数
- $num = 0;
- } else {
- $run_hotel_distrib_disperse_arr_one['num'] = $vel['remaining_count'];//房间数
- $num = $num - $vel['remaining_count'];
- // $num = $num - $vel['num'];
- }
- $run_hotel_distrib_disperse_arr[] = $run_hotel_distrib_disperse_arr_one;
-
- #endregion
-
- $o_num = $vel['remaining_count'];
- foreach ($order_disperse as $o_key => $o_vel) {
- #region 获取借房记录数据
- $order_ht_consume_stock_one['distrib_id'] = $vel['distrib_id'];//渠道id
- $order_ht_consume_stock_one['run_date'] = $vel['run_date'];//渠道id
- $order_ht_consume_stock_one['order_id'] = $o_key;//订单号
- $order_ht_consume_stock_one['update_time'] = $this->create_time;//
- $order_ht_consume_stock_one['update_user_id'] = $this->user_id;//
-
- if ($vel['remaining_count'] >= $num + $vel['remaining_count']) {
- $order_ht_consume_stock_one['num'] = $o_vel;
- $order_disperse[$o_key] = 0;
- } else {
- if ($o_num >= $o_vel) {
- $order_ht_consume_stock_one['num'] = $o_vel;
- $order_disperse[$o_key] = 0;
- $o_num -= $o_vel;
- } else {
- $order_ht_consume_stock_one['num'] = $o_num;
- $order_disperse[$o_key] = $o_vel - $o_num;
- $o_num = 0;
- }
- }
-
- $order_ht_consume_stock[] = $order_ht_consume_stock_one;
-
- #endregion
- }
- $run_hotel_disperse_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']]['num'] = $num;
- $run_hotel_disperse_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']]['order_disperse'] = $order_disperse;
- }
- }
-
- $result['run_hotel_distrib_disperse_arr'] = $run_hotel_distrib_disperse_arr;
- $result['order_ht_consume_stock'] = $order_ht_consume_stock;
-
- return $result;
- }
- }
|