選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 
 

303 行
12 KiB

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: 501810442
  5. * Date: 2017/7/6
  6. * Time: 10:46
  7. */
  8. namespace backend\modules\api\logic;
  9. use backend\modules\api\models\BaseUser;
  10. use backend\modules\api\models\OperaHotel;
  11. use backend\modules\api\models\OperaHotelBaseRoom;
  12. use backend\modules\api\models\OperaHotelRoom;
  13. use backend\modules\api\models\RunHotelDistrib;
  14. use backend\modules\api\models\RunHotelSubRoom;
  15. use backend\modules\api\models\OperaTouristCommon;
  16. use backend\modules\api\models\OperaTouristDetail;
  17. use backend\modules\api\models\OperaTouristRun;
  18. class TouristToResource
  19. {
  20. public function getTouristToAll($tourist_id, $date, $prod_arr, $customer_info, $order_info, $to_org_id)
  21. {
  22. //1.1获取成人票种 和儿童票种的数量
  23. $ticket_type_arr = [];
  24. //1.2票种数组处理 [1=>3,2=>2] key 1对应成人 key 2 对应儿童 v代表人数
  25. foreach ($prod_arr as $k => $v) {
  26. $ticket_type_arr[explode('-', $v['prod_id'])[2]] = $v['prod_num'];
  27. }
  28. //最终返回数据
  29. $fin_models = [];
  30. //酒店对象们
  31. $hotel_models = [];
  32. //巴士对象们
  33. $bus_models = [];
  34. //门票对象们
  35. $opera_models = [];
  36. //临时data
  37. $data = self::returnNow();
  38. // //特殊处理 order_info 中的outside_sale_org_id 传入为微信 传出为内部渠道
  39. // $order_info['outside_sale_org_id'] = BaseUser::getTouristMainCorporationToOrgId($order_info['user_id']);
  40. # 自由行销售渠道从运营主体的内部采购改为销售渠道
  41. $order_info['outside_sale_org_id'] = $to_org_id;
  42. //是否资源足够标识
  43. $flag = true;
  44. #2.获取对象们 限制tourist_id ,cancel_flag=0 res_type 为所有资源故不限制;
  45. $models = OperaTouristDetail::getOperaTouristDetailAll($tourist_id);
  46. if (!$models) {
  47. $data = self::returnNow(1, '数据为空');
  48. return $data;
  49. }
  50. foreach ($models as $k => $v) {
  51. if ($flag) {
  52. $v_date = date("Y-m-d", strtotime($date . "+$v->day_from_start day"));
  53. if ($v->res_type == OperaTouristRun::TOURIST_HOTEL_RES_TYPE) { //酒店部分
  54. //酒店部分总数组
  55. $hotel_models[$k] = [];
  56. $data = self::getTouristToHotel($v, $v_date, $ticket_type_arr, $hotel_models[$k], $order_info['outside_sale_org_id'], $customer_info);
  57. if ($data['code'] == 0)
  58. $hotel_models[$k] = $data['list'];
  59. else
  60. $flag = false;
  61. } elseif ($v->res_type == OperaTouristRun::TOURIST_BUS_RES_TYPE) { //巴士部分
  62. //巴士部分总数组
  63. $bus_models[$k] = [];
  64. $data = self::getTouristToBus($v, $v_date, $ticket_type_arr, $bus_models[$k], $order_info);
  65. if ($data['code'] == 0)
  66. $bus_models[$k] = $data['list'];
  67. else
  68. $flag = false;
  69. } elseif ($v->res_type == OperaTouristRun::TOURIST_OPERA_RES_TYPE) { //门票部分
  70. //门票部分总数组
  71. $opera_models[$k] = [];
  72. $data = self::getTouristToOpera($v, $v_date, $ticket_type_arr, $opera_models[$k], $to_org_id);
  73. if ($data['code'] == 0)
  74. $opera_models[$k] = $data['list'];
  75. else
  76. $flag = false;
  77. }
  78. }
  79. }
  80. if ($flag) {
  81. if (!empty($bus_models)) {
  82. foreach ($bus_models as $k => $v) {
  83. if ($v['prod_num'] == 0) {
  84. unset($bus_models[$k]);
  85. }
  86. }
  87. }
  88. if (!empty($hotel_models)) {
  89. foreach ($hotel_models as $hk => $hv) {
  90. foreach ($hv['run_room'] as $k => $v) {
  91. if ($v['prod_num'] == 0) {
  92. unset($hotel_models[$hk]['run_room'][$k]);
  93. }
  94. }
  95. }
  96. }
  97. if (!empty($opera_models)) {
  98. foreach ($opera_models as $ok => $ov) {
  99. foreach ($ov['son_ticket'] as $k => $v) {
  100. if ($v['prod_num'] == 0) {
  101. unset($opera_models[$ok]['son_ticket'][$k]);
  102. }
  103. }
  104. if (!$opera_models[$ok]['son_ticket']) {
  105. unset($opera_models[$ok]);
  106. }
  107. }
  108. }
  109. //处理返回数据格式
  110. $fin_models['product_name'] = OperaTouristCommon::getOperaTouristCommonOne($tourist_id)->tourist_name;
  111. $fin_models['bus_product'] = array_values($bus_models);
  112. $fin_models['hotel_product'] = array_values($hotel_models);
  113. $fin_models['ticket_product'] = array_values($opera_models);
  114. $fin_models['customer_info'] = $customer_info;
  115. $fin_models['order_info'] = $order_info;
  116. $fin_data = self::returnNow(0, '获取成功');
  117. $fin_data['list'] = $fin_models;
  118. } else {
  119. return $data;
  120. }
  121. return $fin_data;
  122. }
  123. /**
  124. * Function Description:获取酒店信息
  125. * Function Name: getTouristToHotel
  126. * @param $v //循环至当前酒店对象
  127. * @param $v_date //当前入住日期
  128. * @param $ticket_type_arr //票种相应信息
  129. * @param $hotel_models_k //最终酒店部分数组
  130. *
  131. * @return mixed
  132. *
  133. * @author LUOCJ
  134. */
  135. public function getTouristToHotel($v, $v_date, $ticket_type_arr, $hotel_models_k, $org_id, $customer_info)
  136. {
  137. if (
  138. //判断酒店是否停止售卖
  139. !OperaHotel::getOperaHotelOne($v) ||
  140. //判断该酒店基础房型是否被删
  141. !OperaHotelBaseRoom::getOperaHotelBaseRoom($v) ||
  142. //判断该酒店子房型是否上线
  143. !OperaHotelRoom::getOperaHotelRoomOne($v) ||
  144. //判断该渠道是否授权
  145. !RunHotelDistrib::getRunHotelDistribOne($v, $v_date, $org_id) ||
  146. //判断该天是否开房
  147. !RunHotelSubRoom::getRunHotelSubRoomOne($v, $v_date)
  148. ) {
  149. unset($hotel_models_k);
  150. } else {
  151. $model_rhd = RunHotelDistrib::getRunHotelDistribOne($v, $v_date, $org_id);
  152. //酒店id
  153. $hotel_models_k['hotel_id'] = $v->extra_res_info;
  154. //基础房型id
  155. $hotel_models_k['base_room_type'] = $v->top_res_id;
  156. //子房型id
  157. $hotel_models_k['room_type'] = $v->sub_res_id;
  158. //酒店备注
  159. $hotel_models_k['hotel_memo'] = $customer_info['customer_memo'];
  160. //入住日期
  161. $hotel_models_k['run_room'][0]['run_date'] = $v_date;
  162. //渠道价格
  163. $hotel_models_k['run_room'][0]['prod_price'] = $model_rhd->PROD_PRICE;
  164. //获取需要住几间房
  165. $hotel_models_k['run_room'][0]['prod_num'] = self::getProdNum($v, $ticket_type_arr);
  166. }
  167. $data = isset($hotel_models_k) ? self::returnNow(0, '返回成功') : self::returnNow(6, '酒店库存不满足条件');
  168. if ($data['code'] == 0)
  169. $data['list'] = $hotel_models_k;
  170. return $data;
  171. }
  172. /**
  173. * Function Description:获取巴士信息
  174. * Function Name: getTouristToBus
  175. * @param $v //循环至当前巴士对象
  176. * @param $v_date //当前日期
  177. * @param $ticket_type_arr //票种相关信息
  178. * @param $bus_models_k //最终巴士部分数组
  179. * @param $order_info // 订单信息
  180. *
  181. * @return array|mixed
  182. *
  183. * @author LUOCJ
  184. */
  185. public function getTouristToBus($v, $v_date, $ticket_type_arr, $bus_models_k, $order_info)
  186. {
  187. $run_model = new GetTouristStock();
  188. $run_data = $run_model->getBusRunInfo($v->sub_res_id, $v_date, $v->extra_res_info);
  189. $price_model = new GetStockData();
  190. $price_data = $price_model->getBusBasicCost($v->sub_res_id, $order_info['outside_sale_org_id'], $order_info['user_id']);
  191. if ($run_data['code'] != 0)
  192. return $run_data;
  193. if ($price_data['code'] != 0)
  194. return $price_data;
  195. $bus_models_k['run_id'] = $run_data['list']['run_id'];
  196. $bus_models_k['ticket_id'] = $v->sub_res_id;
  197. $bus_models_k['prod_num'] = self::getProdNum($v, $ticket_type_arr);
  198. $bus_models_k['prod_price'] = $price_data['list']['sale_price'];
  199. $data = self::returnNow(0, '获取成功');
  200. $data['list'] = $bus_models_k;
  201. return $data;
  202. }
  203. /**
  204. * Function Description:获取门票信息
  205. * Function Name: getTouristToOpera
  206. * @param $v //循环至当前门票对象
  207. * @param $v_date //当前日期
  208. * @param $ticket_type_arr //票种相关信息
  209. * @param $opera_models_k //最终门票部分数组
  210. *
  211. * @return array|mixed
  212. *
  213. * @author LUOCJ
  214. */
  215. public function getTouristToOpera($v, $v_date, $ticket_type_arr, $opera_models_k, $to_org_id)
  216. {
  217. //非成人+儿童
  218. $opera_data = ['code' => 0];
  219. //儿童
  220. $opera_data_child = [];
  221. //成人
  222. $opera_data_adult = [];
  223. $opera_model = new GetStockData();
  224. if ($v->crowd_type == OperaTouristRun::ADULT) { //为成人
  225. $opera_data = $opera_model->getTicketBasicStock($v->top_res_id, $v->sub_res_id, $v_date, $to_org_id);
  226. } elseif ($v->crowd_type == OperaTouristRun::CHILD) { //为儿童
  227. $opera_data = $opera_model->getTicketBasicStock($v->top_res_id, $v->sub_res_id1, $v_date, $to_org_id);
  228. } elseif ($v->crowd_type == OperaTouristRun::ADULT_CHILD) { //为成人+儿童
  229. $opera_data_child = $opera_model->getTicketBasicStock($v->top_res_id, $v->sub_res_id1, $v_date, $to_org_id);
  230. if ($opera_data_child['code'] != 0) {
  231. return $opera_data;
  232. }
  233. $opera_data_adult = $opera_model->getTicketBasicStock($v->top_res_id, $v->sub_res_id, $v_date, $to_org_id);
  234. if ($opera_data_adult['code'] != 0) {
  235. return $opera_data;
  236. }
  237. }
  238. if ($opera_data['code'] != 0) {
  239. return $opera_data;
  240. }
  241. $opera_models_k['ticket_id'] = $v->top_res_id;
  242. $opera_models_k['run_date'] = $v_date;
  243. if ($v->crowd_type == OperaTouristRun::ADULT_CHILD) { //特殊处理 如果为成人+儿童 则 son_ticket 会有两条数据 [0]接收成人 [1]接收儿童
  244. $opera_models_k['son_ticket'][0]['prod_num'] = $ticket_type_arr[1];
  245. $opera_models_k['son_ticket'][0]['prod_price'] = $opera_data_adult['list']['base_price'];
  246. $opera_models_k['son_ticket'][0]['son_ticket_id'] = $v->sub_res_id;
  247. $opera_models_k['son_ticket'][1]['prod_num'] = $ticket_type_arr[2];
  248. $opera_models_k['son_ticket'][1]['prod_price'] = $opera_data_child['list']['base_price'];
  249. $opera_models_k['son_ticket'][1]['son_ticket_id'] = $v->sub_res_id1;
  250. } else {
  251. $opera_models_k['son_ticket'][0]['prod_num'] = self::getProdNum($v, $ticket_type_arr);
  252. $opera_models_k['son_ticket'][0]['prod_price'] = $opera_data['list']['base_price'];
  253. $opera_models_k['son_ticket'][0]['son_ticket_id'] = $v->sub_res_id;
  254. }
  255. $data = self::returnNow(0, '获取成功');
  256. $data['list'] = $opera_models_k;
  257. return $data;
  258. }
  259. /**
  260. * Function Description:获取数量
  261. * Function Name: getProdNum
  262. * @param $v
  263. * @param $ticket_type_arr //票种信息
  264. *
  265. * @return int
  266. *
  267. * @author LUOCJ
  268. */
  269. public function getProdNum($v, $ticket_type_arr)
  270. {
  271. $sum_num = 0;
  272. foreach ($ticket_type_arr as $k_1 => $v_1) {
  273. if ($v->crowd_type == OperaTouristRun::ADULT_CHILD)
  274. $sum_num += $v_1;
  275. elseif ($v->crowd_type == OperaTouristRun::ADULT && $k_1 == 1)
  276. $sum_num += $v_1;
  277. elseif ($v->crowd_type == OperaTouristRun::CHILD && $k_1 == 2)
  278. $sum_num += $v_1;
  279. }
  280. $data = ceil($sum_num / $v->max_num);
  281. return $data;
  282. }
  283. public static function returnNow($code = 1, $info = '出错啦')
  284. {
  285. $data['code'] = $code;
  286. $data['info'] = $info;
  287. return $data;
  288. }
  289. }