|
- <?php
- /**
- * Function Description:取消自由行订单
- * Function Name: CancelTourist
- * ${PARAM_DOC}
- *
- * @return ${TYPE_HINT}
- * 2017-07-07
- *
- * @author 娄梦宁
- */
-
- namespace backend\modules\api\logic;
-
-
- use backend\modules\api\models\ErrorOrderLog;
- use backend\modules\api\models\LvmamaOrderConnect;
- use backend\modules\api\models\OperaTouristCommon;
- use backend\modules\api\models\OrderGroupConnect;
- use backend\modules\api\models\OrderInsuranceConnect;
- use backend\modules\api\models\OrderMain;
- use backend\modules\api\models\OrderTitle;
- use backend\modules\api\util\Util;
- use Yii;
-
-
- class CancelTourist{
- /**
- * Function Description:取消自由行订单
- * Function Name: CancelTouristById
- * @param $title_id
- * @param $user_id
- * @param $cancel_reason
- * @param $is_cancel_hotel: 是否取消酒店资源 1:取消 0:不取消
- *
- * @return array
- *
- * @author 娄梦宁
- */
- public function CancelTouristById($title_id,$user_id,$cancel_reason,$is_cancel_hotel=1){
- $order_group_connect=new OrderGroupConnect();
- $order_main=new OrderMain();
- $model = new HotelCancelOrder();
- $order_title=new OrderTitle();
- $order_common=new OperaTouristCommon();
- //订单是否可取消校验
- $check_cancel=$order_title->getCheckCancelInfo($title_id);
- if($check_cancel['order_title_type']!=2 || $check_cancel['tourist_id']==0 || (int)$check_cancel['order_title_status']>2){
- //目前只有跟团游产品,有自由行产品编号的产品,以及订单状态为待确认或已确认的才可取消
- return [
- 'code'=>7,
- 'info'=>'订单不可取消!',
- ];
- }
- //判断取消限制时间
- $refund_limit=$order_common->checkRefundTime($check_cancel['tourist_id'],$check_cancel['start_date']);
- if(!$refund_limit){
- return [
- 'code'=>8,
- 'info'=>'订单已过取消限制时间!',
- ];
- }
- //开启大事务
- $big_transaction=Yii::$app->db->beginTransaction();
- //1.查出自由行下的子资源订单
- $son_order_arr=$order_group_connect->getSonOrderId($title_id);
- //2.循环取消子资源,失败则回滚
- foreach($son_order_arr as $son_val){
- if($son_val['order_type']==1){
- #region巴士子资源取消
- #region 获取订单线路信息(只判断是否订单有效)
- $line_info = $order_main->getOrderLineIdCount($son_val['order_main_id']);
- //订单失效性检验
- if($line_info[$son_val['order_main_id']]['order_valid_status']==0){
- $big_transaction->rollBack();
- return[
- 'code'=>1,
- 'info'=>'巴士订单已失效',
- ];
- }
-
- //获取订单所属的班次信息
- $order_run_info = $order_main->getOrderRunInfo($son_val['order_main_id']);
- #endregion
-
- $cancel_bus = $order_main->cancelSingleBusOrder([0=>$son_val['order_main_id']], $order_run_info, $user_id, $cancel_reason);
- if($cancel_bus['code']!=0){
- $big_transaction->rollBack();
- return[
- 'code'=>2,
- 'info'=>'巴士订单取消失败',
- ];
- }
- #endregion
- }else if($son_val['order_type']==2 && $is_cancel_hotel==1){
- #region 酒店子资源取消
- //获取订单基本信息;
- //订单三种预订方法,组合单,录单,直连
- $data = $model->getOrderInfo($son_val['order_main_id']);
- //可取消检查
- $checkFlag = $model->checkIfCancel($data);
- if (!$checkFlag) {
- $big_transaction->rollBack();
- return[
- 'code'=>3,
- 'info'=>'酒店子资源不可取消',
- ];
- }
- $cancel_hotel= $model->cancelOrder($data,$user_id);
- if($cancel_hotel['code']!=0){
- $big_transaction->rollBack();
- return[
- 'code'=>4,
- 'info'=>'酒店子资源取消失败',
- ];
- }
- #endregion
- }else if ($son_val['order_type']==3){
- #region 门票子资源订单取消
- #region 1.获取订单详情
- $order_info = $order_main->getTicketOrderInfo($son_val['order_main_id']);
- if (count($order_info) == 0) {
- $big_transaction->rollBack();
- return[
- 'code'=>5,
- 'info'=>'门票子资源已取消或不存在',
- ];
- }
- #endregion
-
- #region 2.取消订单
- $cancel_ticket = $order_main->cancelTicketOrder($son_val['order_main_id'], $order_info, $user_id, $cancel_reason,0);
- if($cancel_ticket['code']!=0){
- $big_transaction->rollBack();
- return[
- 'code'=>6,
- 'info'=>'门票子资源取消失败',
- ];
- }
- //门票订单号收集,最后驴妈妈统一退票
- $ticket_order_arr[]=$son_val['order_main_id'];
- #endregion
- #endregion
- }
- }
- //3.判断是否需要取消对应保险单
- if($check_cancel['is_buy_insurance']==1){
- $order_insurance_connect=new OrderInsuranceConnect();
- $sub = new SubmitOrder();
- $insurance_arr=$order_insurance_connect->GetInsuranceOrderId($title_id);
- foreach($insurance_arr as $ticket_id){
- $sub->CancelTicketOrder([
- "order_id" => $ticket_id['insurance_order_id'],
- "user_id" => $user_id,
- "cancel_reason" => '巴士自由行取消,同步取消保险!'
- ]);
- }
- }
- //4.大事务提交
- $big_transaction->commit();
- //5.全部取消成功门票订单判断是否去驴妈妈退单
- if(!empty($ticket_order_arr)){
- $lvmama_order_connect = new LvmamaOrderConnect();
- foreach($ticket_order_arr as $val) {
- $org_id = $order_main::find()->select('(select org_id from opera_product where id=o.parent_prod_id) as ORG_ID')->from('order_main o')->where(['order_id'=>$val])->asArray()->one();
- if ($org_id['ORG_ID'] == 1369) {//org_id=1369时就是驴妈妈的产品
- //查出主订单所有关联订单
- $lvmama_ids = $lvmama_order_connect::find()->select('partner_id,lvmama_id')->from('lvmama_order_connect')->where(['main_order_id' => $val])->asArray()->all();
- if (!empty($lvmama_ids)) {
- foreach ($lvmama_ids as $v) {
- $lvmama_result=Util::OrderCancelForLvmama($v['partner_id'], $v['lvmama_id']);
- //异常错误数据库记录
- if ($lvmama_result['state']['code'] != '1000') {
- $error_order_info=new ErrorOrderLog();
- if(isset($lvmama_result['state']['message'])){
- $error_msg=$lvmama_result['state']['message'];
- }else{
- $error_msg='';
- }
- $error_order_info->istOrderLog($val,' '.$error_msg);
- }
- }
- }
- }
- }
- }
- return[
- 'code'=>0,
- 'info'=>'取消成功',
- ];
- }
- }
|