Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

193 lignes
8.0 KiB

  1. <?php
  2. /**
  3. * Function Description:取消自由行订单
  4. * Function Name: CancelTourist
  5. * ${PARAM_DOC}
  6. *
  7. * @return ${TYPE_HINT}
  8. * 2017-07-07
  9. *
  10. * @author 娄梦宁
  11. */
  12. namespace backend\modules\api\logic;
  13. use backend\modules\api\models\ErrorOrderLog;
  14. use backend\modules\api\models\LvmamaOrderConnect;
  15. use backend\modules\api\models\OperaTouristCommon;
  16. use backend\modules\api\models\OrderGroupConnect;
  17. use backend\modules\api\models\OrderInsuranceConnect;
  18. use backend\modules\api\models\OrderMain;
  19. use backend\modules\api\models\OrderTitle;
  20. use backend\modules\api\util\Util;
  21. use Yii;
  22. class CancelTourist{
  23. /**
  24. * Function Description:取消自由行订单
  25. * Function Name: CancelTouristById
  26. * @param $title_id
  27. * @param $user_id
  28. * @param $cancel_reason
  29. * @param $is_cancel_hotel: 是否取消酒店资源 1:取消 0:不取消
  30. *
  31. * @return array
  32. *
  33. * @author 娄梦宁
  34. */
  35. public function CancelTouristById($title_id,$user_id,$cancel_reason,$is_cancel_hotel=1){
  36. $order_group_connect=new OrderGroupConnect();
  37. $order_main=new OrderMain();
  38. $model = new HotelCancelOrder();
  39. $order_title=new OrderTitle();
  40. $order_common=new OperaTouristCommon();
  41. //订单是否可取消校验
  42. $check_cancel=$order_title->getCheckCancelInfo($title_id);
  43. if($check_cancel['order_title_type']!=2 || $check_cancel['tourist_id']==0 || (int)$check_cancel['order_title_status']>2){
  44. //目前只有跟团游产品,有自由行产品编号的产品,以及订单状态为待确认或已确认的才可取消
  45. return [
  46. 'code'=>7,
  47. 'info'=>'订单不可取消!',
  48. ];
  49. }
  50. //判断取消限制时间
  51. $refund_limit=$order_common->checkRefundTime($check_cancel['tourist_id'],$check_cancel['start_date']);
  52. if(!$refund_limit){
  53. return [
  54. 'code'=>8,
  55. 'info'=>'订单已过取消限制时间!',
  56. ];
  57. }
  58. //开启大事务
  59. $big_transaction=Yii::$app->db->beginTransaction();
  60. //1.查出自由行下的子资源订单
  61. $son_order_arr=$order_group_connect->getSonOrderId($title_id);
  62. //2.循环取消子资源,失败则回滚
  63. foreach($son_order_arr as $son_val){
  64. if($son_val['order_type']==1){
  65. #region巴士子资源取消
  66. #region 获取订单线路信息(只判断是否订单有效)
  67. $line_info = $order_main->getOrderLineIdCount($son_val['order_main_id']);
  68. //订单失效性检验
  69. if($line_info[$son_val['order_main_id']]['order_valid_status']==0){
  70. $big_transaction->rollBack();
  71. return[
  72. 'code'=>1,
  73. 'info'=>'巴士订单已失效',
  74. ];
  75. }
  76. //获取订单所属的班次信息
  77. $order_run_info = $order_main->getOrderRunInfo($son_val['order_main_id']);
  78. #endregion
  79. $cancel_bus = $order_main->cancelSingleBusOrder([0=>$son_val['order_main_id']], $order_run_info, $user_id, $cancel_reason);
  80. if($cancel_bus['code']!=0){
  81. $big_transaction->rollBack();
  82. return[
  83. 'code'=>2,
  84. 'info'=>'巴士订单取消失败',
  85. ];
  86. }
  87. #endregion
  88. }else if($son_val['order_type']==2 && $is_cancel_hotel==1){
  89. #region 酒店子资源取消
  90. //获取订单基本信息;
  91. //订单三种预订方法,组合单,录单,直连
  92. $data = $model->getOrderInfo($son_val['order_main_id']);
  93. //可取消检查
  94. $checkFlag = $model->checkIfCancel($data);
  95. if (!$checkFlag) {
  96. $big_transaction->rollBack();
  97. return[
  98. 'code'=>3,
  99. 'info'=>'酒店子资源不可取消',
  100. ];
  101. }
  102. $cancel_hotel= $model->cancelOrder($data,$user_id);
  103. if($cancel_hotel['code']!=0){
  104. $big_transaction->rollBack();
  105. return[
  106. 'code'=>4,
  107. 'info'=>'酒店子资源取消失败',
  108. ];
  109. }
  110. #endregion
  111. }else if ($son_val['order_type']==3){
  112. #region 门票子资源订单取消
  113. #region 1.获取订单详情
  114. $order_info = $order_main->getTicketOrderInfo($son_val['order_main_id']);
  115. if (count($order_info) == 0) {
  116. $big_transaction->rollBack();
  117. return[
  118. 'code'=>5,
  119. 'info'=>'门票子资源已取消或不存在',
  120. ];
  121. }
  122. #endregion
  123. #region 2.取消订单
  124. $cancel_ticket = $order_main->cancelTicketOrder($son_val['order_main_id'], $order_info, $user_id, $cancel_reason,0);
  125. if($cancel_ticket['code']!=0){
  126. $big_transaction->rollBack();
  127. return[
  128. 'code'=>6,
  129. 'info'=>'门票子资源取消失败',
  130. ];
  131. }
  132. //门票订单号收集,最后驴妈妈统一退票
  133. $ticket_order_arr[]=$son_val['order_main_id'];
  134. #endregion
  135. #endregion
  136. }
  137. }
  138. //3.判断是否需要取消对应保险单
  139. if($check_cancel['is_buy_insurance']==1){
  140. $order_insurance_connect=new OrderInsuranceConnect();
  141. $sub = new SubmitOrder();
  142. $insurance_arr=$order_insurance_connect->GetInsuranceOrderId($title_id);
  143. foreach($insurance_arr as $ticket_id){
  144. $sub->CancelTicketOrder([
  145. "order_id" => $ticket_id['insurance_order_id'],
  146. "user_id" => $user_id,
  147. "cancel_reason" => '巴士自由行取消,同步取消保险!'
  148. ]);
  149. }
  150. }
  151. //4.大事务提交
  152. $big_transaction->commit();
  153. //5.全部取消成功门票订单判断是否去驴妈妈退单
  154. if(!empty($ticket_order_arr)){
  155. $lvmama_order_connect = new LvmamaOrderConnect();
  156. foreach($ticket_order_arr as $val) {
  157. $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();
  158. if ($org_id['ORG_ID'] == 1369) {//org_id=1369时就是驴妈妈的产品
  159. //查出主订单所有关联订单
  160. $lvmama_ids = $lvmama_order_connect::find()->select('partner_id,lvmama_id')->from('lvmama_order_connect')->where(['main_order_id' => $val])->asArray()->all();
  161. if (!empty($lvmama_ids)) {
  162. foreach ($lvmama_ids as $v) {
  163. $lvmama_result=Util::OrderCancelForLvmama($v['partner_id'], $v['lvmama_id']);
  164. //异常错误数据库记录
  165. if ($lvmama_result['state']['code'] != '1000') {
  166. $error_order_info=new ErrorOrderLog();
  167. if(isset($lvmama_result['state']['message'])){
  168. $error_msg=$lvmama_result['state']['message'];
  169. }else{
  170. $error_msg='';
  171. }
  172. $error_order_info->istOrderLog($val,' '.$error_msg);
  173. }
  174. }
  175. }
  176. }
  177. }
  178. }
  179. return[
  180. 'code'=>0,
  181. 'info'=>'取消成功',
  182. ];
  183. }
  184. }