Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

502 строки
19 KiB

  1. <?php
  2. /**
  3. *
  4. * ============================================================================
  5. * * 版权所有 蜘蛛出行 * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * Author By: 倪宗锋
  12. * PhpStorm CtripBus.php
  13. * Create By 2018/4/17 9:33 $
  14. */
  15. namespace backend\modules\api\logic;
  16. use backend\modules\api\models\BaseArea;
  17. use backend\modules\api\models\BaseResource;
  18. use backend\modules\api\models\OperaLine;
  19. use backend\modules\api\models\OperaStation;
  20. use backend\modules\api\models\OperaTickets;
  21. use backend\modules\api\models\OrderCustomerInfo;
  22. use backend\modules\api\models\OrderMain;
  23. use backend\modules\api\models\OutsideSubmitOrder;
  24. use backend\modules\api\models\RunMain;
  25. use backend\modules\api\models\RunProd;
  26. use backend\modules\api\models\RunStation;
  27. use backend\modules\api\util\Util;
  28. use backend\modules\api\models\OperaMessageTemplate;
  29. use backend\modules\api\models\OrderSendMessage;
  30. use common\util\CtripBusUtil;
  31. use common\util\CurlInterface;
  32. class CtripBus
  33. {
  34. /**
  35. * Function Description:获取出发城市列表
  36. * Function Name: GetFromCityList
  37. * @param $params
  38. * @return array
  39. * @author 田玲菲
  40. */
  41. public function GetFromCityList($params)
  42. {
  43. $baseResource = new BaseResource();
  44. $res = $baseResource->getFromCity();
  45. $result = [];
  46. foreach ($res as $val) {
  47. $result[] = $val['AREA_NAME'];
  48. }
  49. return Util::returnArrSu('', ['fromCityList' => array_values($result)]);
  50. }
  51. /**
  52. * Function Description:获取到达城市列表
  53. * Function Name: GetToCityList
  54. * @param $params
  55. * @return array
  56. * @author 田玲菲
  57. */
  58. public function GetToCityList($params)
  59. {
  60. //1. 验证参数
  61. if (empty($params['fromCity'])) { //出发城市
  62. return Util::returnArrEr("参数为空【fromCity】", [], '2100');
  63. }
  64. $baseArea = new BaseArea();
  65. $fromCity = $baseArea->getInfoByName($params['fromCity']);
  66. if (empty($fromCity['ID'])) {
  67. return Util::returnArrEr("查询出错", [], '2101');
  68. }
  69. $fromCityId = $fromCity['ID'];
  70. //2.获取近期出发的所有线路的上下车城市
  71. $baseResource = new BaseResource();
  72. $result = $baseResource->getInOutCity($fromCityId);
  73. return Util::returnArrSu('', ['toCityList' => $result]);
  74. }
  75. /**
  76. * Des:获取线路数据
  77. * Name: GetLine
  78. * @param $params
  79. * @return array
  80. * @author 倪宗锋
  81. */
  82. public function GetLine($params)
  83. {
  84. if (empty($params['fromCity'])) {//出发城市
  85. return Util::returnArrEr("参数为空【fromCity】", [], '1005');
  86. }
  87. if (empty($params['fromDate'])) {//出发日期
  88. return Util::returnArrEr("参数为空【fromDate】", [], '1005');
  89. }
  90. if (empty($params['toCity'])) {//到达城市
  91. return Util::returnArrEr("参数为空【toCity】", [], '1005');
  92. }
  93. $fromDate = $params['fromDate'];
  94. // 1.查询出发城市和到达城市的res_id
  95. $baseArea = new BaseArea();
  96. $fromCity = $baseArea->getInfoByName($params['fromCity']);
  97. if (empty($fromCity['ID'])) {
  98. return Util::returnArrEr("查询出错", [], '2101');
  99. }
  100. $fromCityId = $fromCity['ID'];
  101. $toCity = $baseArea->getInfoByName($params['toCity']);
  102. if (empty($toCity['ID'])) {
  103. return Util::returnArrEr("查询出错", [], '2101');
  104. }
  105. $toCityId = $toCity['ID'];
  106. // 2.根据出发日期查出当天有哪些线路
  107. //todo
  108. $return = [
  109. 'fromCity' => $params['fromCity'],
  110. 'toCity' => $params['toCity'],
  111. 'lineSchedule' => [
  112. ],
  113. ];
  114. $runMain = new RunMain();
  115. $lineIdArr = $runMain->getLineArrayByDateAndArea($fromDate, $fromCityId, $toCityId);
  116. if (empty($lineIdArr[0]['line_id'])) {//没有获取到 可以售卖的线路
  117. return Util::returnArrEr('未获取到数据', $return, '1');
  118. }
  119. $runProd = new RunProd();
  120. #3设置线路信息
  121. $operaLine = new OperaLine();
  122. $runStation = new OperaStation();
  123. foreach ($lineIdArr as $v) {
  124. $line_id = $v['line_id'];
  125. //校验黑名单
  126. $blackLine = [454085, 453973];
  127. if (in_array($line_id, $blackLine)) {
  128. continue;
  129. }
  130. $lineListInfo['schedule'] = $runProd->getSchedule($fromDate, $fromCityId, $toCityId, $line_id);
  131. $line_info = $operaLine->getLineInfo($line_id);
  132. $line_station = $runStation->getStationList($line_id, $fromCityId, $toCityId);
  133. $ticket_array = $operaLine->getOperaLineTicketsFromLine($line_id, $fromCityId, $toCityId);
  134. $bottomPrice = 0;
  135. foreach ($ticket_array as $val) {
  136. if ($bottomPrice == 0) {
  137. $bottomPrice = $val['price'];
  138. }
  139. if ($val['price'] < $bottomPrice) {
  140. $bottomPrice = $val['price'];
  141. }
  142. }
  143. $lineListInfo['line'] = [
  144. 'id' => $line_id . '_' . $fromCityId . '_' . $toCityId,//线路ID
  145. 'desc' => $line_info['desc'],//线路 说明
  146. 'name' => $line_info['name'],//线路名称
  147. 'distance' => intval($line_info['distance']),//总路程
  148. 'timeExpendMinutes' => $line_info['timeExpendMinutes'],//时间
  149. 'bottomPrice' => $bottomPrice,//最低价
  150. 'segmentPrices' => $ticket_array,//特殊站点价格
  151. // 'commissionRule' => [],//佣金规则
  152. 'checkTicketMethods' => ['短信'],//验票方式
  153. 'stations' => $line_station,//站点信息
  154. 'limitTicketCntMin' => 1,//最少购买数量
  155. 'limitTicketCntMax' => 20,//最多购买 数量
  156. // 'luggageLimit' => [],//行李大小设置
  157. // 'obtainTicket' => [],//取票地址
  158. // 'refundTicketRules' => [],//取消规则
  159. // 'specialTickets' => [],//儿童设置
  160. // 'parkingPoints' => [],//游玩点
  161. // 'TransferPoint' => [],//换车说明
  162. // 'ScenicTicket' => [],//景点信息
  163. // 'Gift' => [],//礼物 信息
  164. ];
  165. $return['lineSchedule'][] = $lineListInfo;
  166. }
  167. return util::returnArrSu('成功', $return);
  168. }
  169. /**
  170. * Des:取消订单
  171. * Name: refundTicket
  172. * @param $params
  173. * @return array
  174. * @author 倪宗锋
  175. */
  176. public function refundTicket($params)
  177. {
  178. if (empty($params['corpOrderId'])) {
  179. return Util::returnArrEr('params error', '', '301');
  180. }
  181. $orderMain = new OrderMain();
  182. $checkOutsideOrderNo = $orderMain->checkOutsideOrderNo($params['corpOrderId'], CtripBusUtil::util()->getSupplierId());
  183. if (empty($checkOutsideOrderNo['0']['order_id'])) {
  184. return Util::returnArrEr('order not exist', '', '301');
  185. }
  186. if ($checkOutsideOrderNo[0]['order_status'] == '148') {
  187. $orderDetail = $this->orderDetail(['corpOrderId' => $params['corpOrderId']]);
  188. return Util::returnArrSu('success', $orderDetail['data']);
  189. }
  190. $data = [
  191. 'order_id' => $checkOutsideOrderNo['0']['order_id'],
  192. ];
  193. $curl = new CurlInterface($data, 4);
  194. $result = $curl->execute('http://' . CS1_DOMAIN . '/api/submit-order/cancel-bus-order', 'POST');
  195. if (!isset($result['code']) || $result['code'] != '0') {
  196. $msg = empty($result['info']) ? '取消订单失败!' : $result['info'];
  197. return Util::returnArrEr($msg, '', $result['code']);
  198. }
  199. $orderDetail = $this->orderDetail(['corpOrderId' => $params['corpOrderId']]);
  200. return Util::returnArrSu('success', $orderDetail['data']);
  201. }
  202. /**
  203. * Des:出票信息
  204. * Name: orderDetail
  205. * @param $params
  206. * @return array
  207. * @author 倪宗锋
  208. */
  209. public function orderDetail($params)
  210. {
  211. if (empty($params['corpOrderId'])) {
  212. return Util::returnArrEr('params error', '', '301');
  213. }
  214. $orderMain = new OrderMain();
  215. $checkOutsideOrderNo = $orderMain->checkOutsideOrderNo($params['corpOrderId'], CtripBusUtil::util()->getSupplierId());
  216. if (empty($checkOutsideOrderNo['0']['order_id'])) {
  217. return Util::returnArrEr('order not exist', '', '301');
  218. }
  219. /*******设置订单状态**********/
  220. $message = '';
  221. if (in_array($checkOutsideOrderNo['0']['order_status'], [146, 117, 314])) {
  222. $order_status = 2;
  223. } else if ($checkOutsideOrderNo['0']['order_status'] == 148) {
  224. $order_status = 5;
  225. } else {
  226. $order_status = 4;
  227. $message = '未支付';
  228. }
  229. #获取出行人 信息
  230. $order_id = $checkOutsideOrderNo['0']['order_id'];
  231. $orderCustomer = new OrderCustomerInfo();
  232. $getCustomer = $orderCustomer->getCustomer($order_id);
  233. $tickets = [];
  234. foreach ($getCustomer as $val) {
  235. $array = [
  236. 'certificateNo' => $val['cus_id_no'],//乘客证件号码
  237. 'ticketStatus' => $order_status,//订单出票状态,1出票中,2已出票,3 无票,4退票中,5已退票,6退票失败
  238. ];
  239. if (empty($message) == false) {
  240. $array['noTicketReason'] = $message;//无票原因。ticketStatus=3时必填
  241. }
  242. if ($order_status == 2) {
  243. $array['ticketNo'] = $order_id;//出票号
  244. $array['ticketPwd'] = $order_id;//票密码/验证码
  245. }
  246. $tickets[] = $array;
  247. }
  248. //获取出票短信
  249. //返回值
  250. $return = [
  251. 'orderId' => $order_id,
  252. 'corpOrderId' => $params['corpOrderId'],
  253. 'smsTemplate' => $params['send_message'],
  254. 'tickets' => $tickets
  255. ];
  256. return Util::returnArrSu('', $return);
  257. }
  258. /**
  259. * Des:下单
  260. * Name: order
  261. * @param $params
  262. * @return array
  263. * @author 倪宗锋
  264. */
  265. public function makeOrder($params)
  266. {
  267. $checkParams = $this->checkOrderParams($params);//参数 校验并返回产品详情
  268. if ($checkParams['flag'] == false) {
  269. return $checkParams;
  270. }
  271. $params['lineId'] = explode('_', $params['lineId'])[0];
  272. $prodInfo = $checkParams['data'];
  273. //错误返回值
  274. $errorTicketArray = [];
  275. foreach ($params["tickets"] as $val) {
  276. $errorTicket = [
  277. "certificateNo" => $val["certificateNo"],
  278. "ticketStatus" => 3,
  279. "noTicketReason" => "无票"
  280. ];
  281. $errorTicketArray[] = $errorTicket;
  282. }
  283. $errorReturn = [
  284. "order_id" => "",
  285. "corpOrderId" => $params["corpOrderId"],
  286. 'smsTemplate' => '',
  287. "tickets" => $errorTicketArray
  288. ];
  289. #校验订单是否已经存在
  290. $orderDetail = $this->orderDetail(['corpOrderId' => $params['corpOrderId']]);//获取定下详情,如果存在则直接返回
  291. if ($orderDetail['flag'] == true) {
  292. return Util::returnArrSu('error', $errorReturn);
  293. }
  294. #不存在则去下单
  295. #获取班次ID
  296. $runMain = new RunMain();
  297. $run_id = $runMain->getRunIdByLine($params['lineId'], $params['fromDate'], $params['fromTime']);
  298. if (empty($run_id)) {
  299. return Util::returnArrSu('get run error', $errorReturn);
  300. }
  301. #获取票种ID
  302. $operaTicket = new OperaTickets();
  303. $getTicket = $operaTicket->getTicketByRes($params['lineId'], $params['fromStationCode'], $params['toStationCode']);
  304. if (empty($getTicket['ticket_id'])) {
  305. return Util::returnArrSu('get ticket error', $errorReturn);
  306. }
  307. $ticket_id = $getTicket['ticket_id'];
  308. $outSideSubmitOrder = new OutsideSubmitOrder();
  309. $date = [
  310. 'from_org_id' => CtripBusUtil::util()->getSupplierId(),
  311. 'outside_order_no' => $params['corpOrderId'],
  312. 'ticket_id' => $ticket_id,
  313. 'ticket_num' => $prodInfo['prod_cnt'],
  314. 'price' => $prodInfo['price'],
  315. 'all_price' => $prodInfo['total_money'],
  316. 'customer_name' => $params['contactName'],
  317. 'customer_mobile' => $params['contactMobile'],
  318. 'customer_id_no' => '',
  319. 'passenger' => $prodInfo['passenger_str']
  320. ];
  321. $submitOrderId = $outSideSubmitOrder->addRow($date);
  322. #设置 返回下单接口参数
  323. $prod_str = [1, $run_id, $ticket_id, $prodInfo['price'], $prodInfo['prod_cnt']];
  324. $order_info_str = [2, 0, CtripBusUtil::util()->getSupplierId(), $params['corpOrderId'], 0, 275, 1, '李秉臻'];
  325. $customer_info_str = [$params['contactName'], $params['contactMobile'], 1, '', ''];
  326. $passenger_info = $prodInfo['passenger_info'];
  327. $data = [
  328. 'prod_str' => '{' . implode(',', $prod_str) . '}',
  329. 'order_info_str' => '{' . implode(',', $order_info_str) . '}',
  330. 'customer_info_str' => '{' . implode(',', $customer_info_str) . '}',
  331. 'passenger_info' => json_encode($passenger_info),
  332. 'is_send_msg' => 0
  333. ];
  334. $curl = new CurlInterface($data, 4);
  335. $result = $curl->execute('http://' . CS1_DOMAIN . '/api/submit-order/submit-bus-order', 'POST');
  336. if (!isset($result['code']) || $result['code'] != '0') {
  337. $msg = empty($result['info']) ? '取消订单失败!' : $result['info'];
  338. $outSideSubmitOrder->editInfo(['status' => 2, 'ID' => $submitOrderId]);
  339. return Util::returnArrSu($msg, $errorReturn);
  340. }
  341. $outSideSubmitOrder->editInfo(['status' => 1, 'ID' => $submitOrderId]);
  342. //获取短信内容,同时模拟插入发送短信履历
  343. $order_id_array = explode(",", $result['data']);
  344. $send_message = $this->getSendMessageAndSimulateSend($order_id_array[0]);
  345. return $this->orderDetail(['corpOrderId' => $params['corpOrderId'], 'send_message' => $send_message]);
  346. }
  347. /**
  348. * Des:下单参数校验并返回整理后的数据
  349. * Name: checkOrderParams
  350. * @param $params
  351. * @return array
  352. * @author 倪宗锋
  353. */
  354. public function checkOrderParams($params)
  355. {
  356. if (empty($params['corpOrderId'])) {
  357. return Util::returnArrEr('params error', '', '301');
  358. }
  359. if (empty($params['contactMobile'])) {
  360. return Util::returnArrEr('params error', '', '301');
  361. }
  362. if (empty($params['contactName'])) {
  363. return Util::returnArrEr('params error', '', '301');
  364. }
  365. if (empty($params['fromDate'])) {
  366. return Util::returnArrEr('params error', '', '301');
  367. }
  368. if (empty($params['fromTime'])) {
  369. return Util::returnArrEr('params error', '', '301');
  370. }
  371. if (empty($params['fromStationCode'])) {
  372. return Util::returnArrEr('params error', '', '301');
  373. }
  374. if (empty($params['toStationCode'])) {
  375. return Util::returnArrEr('params error', '', '301');
  376. }
  377. if (empty($params['lineId'])) {
  378. return Util::returnArrEr('params error', '', '301');
  379. }
  380. if (empty($params['tickets']) || !is_array($params['tickets'])) {
  381. return Util::returnArrEr('params error', '', '301');
  382. }
  383. //购买的产品数量
  384. $prod_info = [
  385. 'total_money' => 0,
  386. 'price' => 0,
  387. 'prod_cnt' => 0,
  388. 'passenger_info' => []
  389. ];
  390. foreach ($params['tickets'] as $val) {
  391. if (empty($val['certificateNo'])) {
  392. return Util::returnArrEr('params error', '', '301');
  393. }
  394. if (empty($val['passengerName'])) {
  395. return Util::returnArrEr('params error', '', '301');
  396. }
  397. #产品信息
  398. $prod_info['price'] = $val['price'];
  399. $prod_info['total_money'] += intval($val['price']);
  400. $prod_info['prod_cnt'] += 1;
  401. #出行人信息
  402. $pass = [
  403. 'passenger_name' => $val['passengerName'],
  404. 'passenger_cardid' => $val['certificateNo'],
  405. ];
  406. $pass_str = $val['passengerName'] . '*' . $val['certificateNo'];
  407. $prod_info['passenger_info'][] = $pass;
  408. if (empty($prod_info['passenger_str'])) {
  409. $prod_info['passenger_str'] = $pass_str;
  410. } else {
  411. $prod_info['passenger_str'] .= '/' . $pass_str;
  412. }
  413. }
  414. return Util::returnArrSu('', $prod_info);
  415. }
  416. /**
  417. * Des:查询余票
  418. * Name: remainTicket
  419. * @param $params
  420. * @return array
  421. * @author 倪宗锋
  422. */
  423. public function remainTicket($params)
  424. {
  425. #参数校验
  426. if (empty($params['fromDate'])) {
  427. return Util::returnArrEr('params error', '', '301');
  428. }
  429. if (empty($params['fromTime'])) {
  430. return Util::returnArrEr('params error', '', '301');
  431. }
  432. if (empty($params['fromStationCode'])) {
  433. return Util::returnArrEr('params error', '', '301');
  434. }
  435. if (empty($params['toStationCode'])) {
  436. return Util::returnArrEr('params error', '', '301');
  437. }
  438. if (empty($params['lineId'])) {
  439. return Util::returnArrEr('params error', '', '301');
  440. }
  441. $params['lineId'] = explode('_', $params['lineId'])[0];
  442. #获取库存
  443. $runMain = new RunMain();
  444. $getStock = $runMain->getStockByDateLineIdRes($params['lineId'], $params['fromDate'], $params['fromTime'], $params['fromStationCode'], $params['toStationCode']);
  445. if (empty($getStock[0]['count'])) {
  446. $count = 0;
  447. } else {
  448. $count = $getStock[0]['count'];
  449. }
  450. return Util::returnArrSu('', ['leftTicketCnt' => $count]);
  451. }
  452. /**
  453. *
  454. */
  455. public function getSendMessageAndSimulateSend($order_id)
  456. {
  457. $msg = new OperaMessageTemplate();
  458. $res = $msg->otaGetMsgInfo($order_id);
  459. if (!isset($res["code"]) || $res["code"] != 0) {
  460. return "获取短信错误,请联系客服!!!";
  461. } else {
  462. $current_time = date("Y-m-d H:i:s");
  463. $send_message = $res["content"];
  464. $send_tel = $res["mobile"];
  465. $send_msg_values = [
  466. 'ORDER_ID' => $order_id,
  467. 'SEND_MOBILE' => $send_tel,
  468. 'SEND_MESSAGE' => $send_message,
  469. 'SEND_TIME' => $current_time,
  470. 'SEND_ERROR' => 1,
  471. 'CREATE_USER_ID' => 2,
  472. 'CREATE_TIME' => $current_time,
  473. 'UPDATE_USER_ID' => 2,
  474. 'UPDATE_TIME' => $current_time
  475. ];
  476. $msgRecord = new OrderSendMessage();
  477. $msgRecord->attributes = $send_msg_values;
  478. $res = $msgRecord->insert();
  479. return $send_message;
  480. }
  481. }
  482. }