$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; } }