Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 
 

947 rader
40 KiB

  1. <?php
  2. namespace backend\modules\api\controllers;
  3. use backend\modules\api\logic\HotelCancelOrder;
  4. use backend\modules\api\logic\SubmitBusAgentOrder;
  5. use backend\modules\api\logic\SubmitGroupOrder;
  6. use backend\modules\api\logic\ModifyBusOrder;
  7. use backend\modules\api\logic\SubmitOrder;
  8. use backend\modules\api\models\BaseSupplier;
  9. use backend\modules\api\models\ErrorOrderLog;
  10. use backend\modules\api\models\OrderInsuranceConnect;
  11. use backend\modules\api\util\Util;
  12. use backend\modules\zzcs\logic\GroupOrderList;
  13. use backend\modules\api\models\OperaProduct;
  14. use backend\modules\api\models\OperaProductRun;
  15. use backend\modules\api\models\OperaTickets;
  16. use backend\modules\api\models\OrderMain;
  17. use backend\modules\api\models\RunMain;
  18. use backend\modules\api\models\RunProd;
  19. use backend\modules\api\models\ToFrom;
  20. use common\util\CtripUtil;
  21. use yii\web\Controller;
  22. use common\models\Msg;
  23. use Yii;
  24. use backend\modules\api\logic\CancelTourist;
  25. use backend\modules\api\logic\BaseBalance;
  26. use common\models\Utils;
  27. class SubmitOrderController extends Controller
  28. {
  29. public $enableCsrfValidation = false;
  30. /**
  31. * Function Description:入口
  32. * Function Name: actionIndex
  33. *
  34. * @return string
  35. *
  36. * @author 张帅
  37. */
  38. public function actionIndex()
  39. {
  40. $request = Yii::$app->request;
  41. $action = $request->post('action');
  42. $func = 'action';
  43. $action = explode('_', $action);
  44. foreach ($action as $key => $vel) {
  45. $func .= ucfirst($vel);
  46. }
  47. if ($action === false || method_exists($this, $func) == false) {
  48. $json = ['code' => 1, 'info' => '必要参数缺失'];
  49. return json_encode($json);
  50. }
  51. return $this->$func();
  52. }
  53. /**
  54. * Function Description:得到票种代售信息(测试接口)
  55. * Function Name: actionGetTicketAgentInfo
  56. *
  57. * @return string
  58. *
  59. * @author 温依莅
  60. */
  61. public function actionGetTicketAgentInfo()
  62. {
  63. $prod_id = Yii::$app->request->post('prod_id');
  64. $supplier_id = Yii::$app->request->post('supplier_id');
  65. $user_id = Yii::$app->request->post('user_id');
  66. $main_corp_id = Yii::$app->request->post('main_corp_id', -1);
  67. $SubmitBusOrder = new SubmitBusAgentOrder();
  68. $res = $SubmitBusOrder->getTicketAgentInfo($prod_id, $supplier_id, $user_id, $main_corp_id);
  69. return json_encode($res);
  70. }
  71. /**
  72. * Function Description:提交巴士订单
  73. * Function Name: actionSubmitBusOrder
  74. *
  75. *
  76. * @author 张帅
  77. */
  78. public function actionSubmitBusOrder()
  79. {
  80. // $opera_tickets = new OperaTickets();
  81. // $run_prod = new RunProd();
  82. // $run_main = new RunMain();
  83. // $order_main = new OrderMain();
  84. $agent_obj = new SubmitBusAgentOrder();
  85. #region 获取参数
  86. $prod_str = Yii::$app->request->post('prod_str');//购买票种列表 格式为{去程/返程标志(1:去程 2:返程),去程/返程班次ID,票种ID,票种单价,预定数量,车号}...其中车号若不指定则传0或不传
  87. $order_info_str = Yii::$app->request->post('order_info_str');//'订单信息 {下单用户,会员号,渠道id,渠道订单号,是否预定(0否1是),支付方式(授信275),是否支付(0否1是),业务员}'
  88. $customer_info_str = Yii::$app->request->post('customer_info_str');//联系人信息,格式为{联系人,联系电话,z证件类型,联系人身份证,备注}
  89. $order_append_str = Yii::$app->request->post('order_append_str', '{0,0}');//订单附加 ,格式为{门票价格,酒店价格}
  90. $receiver_value_str = Yii::$app->request->post('receiver_value_str', '{0,0}');//代收,格式为{代收单价,代收总价}
  91. $is_send_msg = Yii::$app->request->post('is_send_msg', 1);//是否发短信(0否1是) 默认1
  92. $buy_insurance = Yii::$app->request->post('buy_insurance', 0);//是否购买保险信 默认0 ,内部保险 1,外部保险 2
  93. $insurance = Yii::$app->request->post('insurance', '');//保险单详细 [{姓名,身份证},{姓名,身份证},{姓名,身份证}] array数组json_encode
  94. $passenger_info=json_decode(Yii::$app->request->post('passenger_info','[]'),true);//乘车人详细 [{姓名,身份证},{姓名,身份证},{姓名,身份证}] array数组json_encode
  95. #endregion
  96. // $prod_str = "{1,934866,454959,30.00,1}";
  97. // $order_info_str = "{1,1,12,123,1,275,1,黄小霞}";
  98. // $customer_info_str = "{test,,150,,}";
  99. // $order_append_str = "{0,0}";
  100. // $receiver_value_str = "{0,0}";
  101. // $is_send_msg = 0;
  102. #region 0.巴士实名制判断
  103. // $prod_str_check = substr($prod_str, 1, -1);
  104. // $prod_str_check = explode(',',explode('}{', $prod_str_check)[0]);
  105. // if(count($passenger_info)==0 || count($passenger_info) !=$prod_str_check[4]){
  106. // $result['code'] = '3';
  107. // $result['info'] = '乘车人信息不全!';
  108. // return json_encode($result);
  109. // }
  110. # endregion
  111. #region 1.获取票种信息
  112. $prod_arr = $agent_obj->getBusProductList($prod_str);
  113. if (count($prod_arr) == 0) {
  114. $result['code'] = '1';
  115. $result['info'] = '没有选购产品';
  116. return json_encode($result);
  117. }
  118. // return json_encode($prod_arr);
  119. #endregion
  120. #region 2.获取订单配置数据
  121. $order_info_arr = $agent_obj->getOrderInfoArray($order_info_str);
  122. #endregion
  123. #region 3.获取乘客信息
  124. $customer_info_arr = $agent_obj->getCustomerInfoArray($customer_info_str);
  125. #endregion
  126. #region 4.获取附属产品
  127. $order_append_arr = $agent_obj->getOrderAppendArray($order_append_str);
  128. #endregion
  129. #region 5.获取产品的详细属性
  130. $run_ticket_arr = [];//班次票种数组
  131. foreach ($prod_arr as $key => $vel) {
  132. $run_ticket_one['run_id'] = $vel['run_id'];
  133. $run_ticket_one['ticket_id'] = $vel['ticket_id'];
  134. $run_ticket_arr[] = $run_ticket_one;
  135. }
  136. $prod_list = $agent_obj->getBusProductListByRunTicket($run_ticket_arr);
  137. #region 判断获取的产品和要下单的产品数量是否一致
  138. if (count($prod_arr) != count($prod_list)) {
  139. $result['code'] = '2';
  140. $result['info'] = '产品有误';
  141. $result['prod_list'] = $prod_list;
  142. $result['prod_arr'] = $prod_arr;
  143. return json_encode($result);
  144. }
  145. #endregion
  146. #endregion
  147. #region 6.判断价格
  148. #endregion
  149. #region 7.检查run_x中是否有班次是否存在
  150. $date_run_arr = [];//日期-班次数组
  151. $run_date = '';
  152. foreach ($prod_list as $key => $vel) {
  153. $run_date = $vel['run_date'];
  154. $vel_run_date = substr($vel['run_date'], 0, 7);
  155. $vel_run_date = str_replace('-', '', $vel_run_date);
  156. $date_run_arr[$vel_run_date][] = $vel['run_id'];
  157. }
  158. $check_run_result = $agent_obj->checkRunX($date_run_arr);
  159. #region 检查run_x数据
  160. if (!$check_run_result) {
  161. $result['code'] = '1';
  162. $result['info'] = '没有班次';
  163. return json_encode($result);
  164. }
  165. #endregion
  166. #endregion
  167. #region 8.获取每个班次的可订座位量
  168. $run_bus_arr = [];
  169. foreach ($prod_list as $key => $vel) {
  170. $run_one['run_id'] = $vel['run_id'];//班次id
  171. $run_one['run_date'] = substr($vel['run_date'], 0, 7);//班次日期
  172. $run_one['run_date'] = str_replace('-', '', $run_one['run_date']);//班次日期
  173. $run_one['seat_type'] = $vel['seat_type'];//座位类型
  174. $run_one['start_seq_id'] = $vel['start_seq_id'];//开始站顺序号
  175. $run_one['end_seq_id'] = $vel['end_seq_id'];//结束站顺序号
  176. $run_one['seat_count'] = $run_one['end_seq_id'] - $run_one['start_seq_id'];//途径个数
  177. $run_one['ticket_id'] = $vel['ticket_id'];
  178. $run_one['num'] = $prod_arr[$vel['ticket_id']]['num'];
  179. $run_one['bus_order_id'] = $prod_arr[$vel['ticket_id']]['bus_order_id'];
  180. $run_bus_arr[] = $run_one;
  181. }
  182. $run_bus_seat = $agent_obj->getRunBusSeat($run_bus_arr);
  183. #region 检查库存
  184. if (!$run_bus_seat) {
  185. $result['code'] = '1';
  186. $result['info'] = '库存不足';
  187. return json_encode($result);
  188. }
  189. #endregion
  190. #endregion
  191. #region 9.连坐优先分配座位
  192. $seat_arr = $agent_obj->getSeatArray($run_bus_seat, $prod_arr);
  193. #endregion
  194. #region 10.获取订单价格信息(包含代收价)
  195. $prod_list_arr = $agent_obj->getBusProductListReceiver($prod_list, $receiver_value_str, $prod_arr);
  196. #endregion
  197. #region 11.判断整合代收信息
  198. $res = $agent_obj->getFinalProductList($prod_list_arr, $order_info_arr['outside_sale_org_id'], $order_info_arr['outside_order_no'], $order_info_arr['user_id']);
  199. if ($res['code'] != '0') {
  200. $result['code'] = '1';
  201. $result['info'] = '存在不可售票种';
  202. $result['error_info'] = $res['info'];
  203. return json_encode($result);
  204. }
  205. #endregion
  206. #region 11.下单插入数据
  207. $result = $agent_obj->submitBusOrder($prod_list_arr, $seat_arr, $order_info_arr, $customer_info_arr, $order_append_arr, $is_send_msg, $buy_insurance);
  208. #endregion
  209. #region 12.记录乘客身份证信息
  210. if(count($passenger_info)!=0) {
  211. $insert_passenger_info = $agent_obj->IstPassengerInfo($result['data'], $passenger_info);
  212. if (!$insert_passenger_info) {
  213. $order_main = new OrderMain();
  214. $memo = $customer_info_arr['customer_memo'] . ' 乘车人身份证录入错误!';
  215. $order_main::updateAll( ['customer_memo' => $memo],['order_id' => $result['data']]);
  216. }
  217. }
  218. #endregion
  219. #region 13.下保险单 不论成功失败 不影响正常订单流程
  220. if ($buy_insurance !=0 && $insurance != '' && $result['code'] == 0) {
  221. $insuraceData = [
  222. #请求头
  223. 'auth_code' => Yii::$app->request->post('auth_code'),
  224. 'user_key' => Yii::$app->request->post('user_key'),
  225. 'user' => Yii::$app->request->post('user'),
  226. 'user_id' => Yii::$app->request->post('user_id'),
  227. 'request_time' => Yii::$app->request->post('request_time'),
  228. #报文体
  229. 'order_info_arr' => json_encode($order_info_arr),
  230. 'bus_order_id' => $result['data'],
  231. 'insurance' => $insurance,
  232. 'action' => 'add_insurance'
  233. ];
  234. Utils::httpRequestForasyn('http://' . CS1_DOMAIN . '/api/submit-order', $insuraceData);
  235. }
  236. #endregion
  237. #region 14.订单相关后续操作
  238. #判断下单渠道是否需要预付#
  239. $order_id_arr = explode(',', $result['data']);
  240. $submit_order=new SubmitOrder();
  241. foreach ($order_id_arr as $val) {
  242. #插入渠道商预付记录
  243. $submit_order->SupplierBalance($val,1,'巴士订单支付');
  244. #判断是否要录入检票信息
  245. $submit_order->CheckTicketByOrder($val,$order_info_arr['user_id']);
  246. }
  247. #endregion
  248. return json_encode($result);
  249. }
  250. /**
  251. * Des:新增订单保险单
  252. * Name: actionAddInsurance
  253. * @author 倪宗锋
  254. */
  255. public function actionAddInsurance()
  256. {
  257. /**1、获取参数*/
  258. $order_info_arr = Yii::$app->request->post('order_info_arr');//订单配置数据
  259. $bus_order_id = Yii::$app->request->post('bus_order_id', '');//巴士订单ID
  260. $insurance = Yii::$app->request->post('insurance', ''); //保险人列表
  261. $tourist_id = Yii::$app->request->post('tourist_id', ''); //有tourist_id的是自由行过来的保险,没有的是车票的保险
  262. /**2、校验参数*/
  263. if (empty($order_info_arr) || empty($bus_order_id) || empty($insurance)) {
  264. $result['code'] = '1';
  265. $result['info'] = '参数错误!';
  266. return json_encode($result);
  267. }
  268. $agent_obj = new SubmitBusAgentOrder();
  269. if($tourist_id == ''){
  270. //车票过来的保险下单
  271. $agent_obj::addInsurance(json_decode($order_info_arr, true), $bus_order_id, json_decode($insurance, true));
  272. }else{
  273. //自由行保险
  274. $agent_obj::addFreeWalkInsurance(json_decode($order_info_arr, true), $bus_order_id, json_decode($insurance, true),$tourist_id);
  275. }
  276. $result['code'] = '0';
  277. $result['info'] = '执行结束!';
  278. return json_encode($result);
  279. }
  280. /**
  281. * Function Description:巴士订单修改接口
  282. * Function Name: actionModifyBusOrder
  283. *
  284. * @return string
  285. *
  286. * @author 温依莅
  287. */
  288. public function actionModifyBusOrder()
  289. {
  290. $GroupModify = new ModifyBusOrder();
  291. //获取参数
  292. $order_id = Yii::$app->request->post('order_id', -1);//需要修改巴士订单号
  293. $prod_str = Yii::$app->request->post('prod_str', -1);//巴士产品修改信息json:{"to_go":1,"run_id":"907812","prod_id":"453300","order_price":"33.94","bus_people_num":3,"bus_order_id":0}
  294. $order_info_str = Yii::$app->request->post('order_info_str', -1);//巴士订单信息json:{"modify_user_id":"1","member_id":0,"outside_sale_org_id":"75","outside_order_no":"","is_book":0,"pay_type":275,"is_pay":1,"sales_man":"业务员"}
  295. $customer_info_str = Yii::$app->request->post('customer_info_str', -1);//顾客信息json:{"customer_name":"测试员","customer_phone":"15753206507","customer_id_type":"150","customer_id_no":"","customer_remark":""}
  296. $order_append_str = Yii::$app->request->post('order_append_str', json_encode(array('gate_price' => 0, 'hotel_price' => 0)));//附加信息json:门票价格,酒店价格{'gate_price':0,'hotel_price':0}
  297. $receiver_value_str = Yii::$app->request->post('receiver_value_str', json_encode(array('sin_rec_value' => 0, 'total_rec_value' => 0)));//代收价格array:代售单价,代售总价{'sin_rec_value' : 0, 'total_rec_value' : 0}
  298. if ($order_id == -1 || $prod_str == -1 || $order_info_str == -1 || $customer_info_str == -1) {
  299. $json = array();
  300. $json['code'] = 1;
  301. $json['info'] = '参数有误';
  302. return json_encode($json);
  303. }
  304. //调用ModifyBusOrder的ModifyBusHub方法处理修改请求
  305. $result = $GroupModify->ModifyBusHub($order_id, json_decode($prod_str, true), json_decode($order_info_str, true), json_decode($customer_info_str, true), json_decode($order_append_str, true), json_decode($receiver_value_str, true));
  306. return json_encode($result);
  307. }
  308. /**
  309. * Function Description:巴士订单退票
  310. * Function Name: actionCancelBusOrder
  311. *
  312. * @return string
  313. *
  314. * @author 张帅
  315. */
  316. public function actionCancelBusOrder()
  317. {
  318. $order_main = new OrderMain();
  319. $to_from = new ToFrom();
  320. #region 获取参数
  321. $order_id = Yii::$app->request->post('order_id', '');//订单号(必传)
  322. $user_id = Yii::$app->request->post('user_id', 2);//用户id 默认1
  323. $if_link = Yii::$app->request->post('if_link', 0);//是否一起退单 0是1否 默认0
  324. $cancel_reason = Yii::$app->request->post('cancel_reason', '系统退单');//退票原因 默认:系统退单
  325. //$opera_platform = Yii::$app->request->post('opera_platform', '统一退票');//操作平台 默认:cs
  326. #endregion
  327. if ($order_id == "") {
  328. return json_encode(["code" => "1", "info" => "缺少订单号"]);
  329. }
  330. $order_id_arr = [];//订单id数组
  331. $line_type = 'single';
  332. //判断用户是否有退票权限及该票是否是销售终端
  333. $check_cancel = $order_main->check_cancel($order_id);
  334. if ($check_cancel != 1) {
  335. $result['code'] = '1';
  336. $result['info'] = '无退票权限';
  337. return json_encode($result);
  338. }
  339. #region 判断是否一起退票
  340. if ($if_link == 0) {
  341. #region 查询是否为往返单
  342. $order_to_from = $to_from->getToFromOrder($order_id);
  343. count($order_to_from) == 0 ? $order_id_array[] = $order_id : $order_id_array = array_merge($order_to_from);
  344. foreach ($order_id_array as $key => $vel) {
  345. $order_id_arr[$vel] = $vel;
  346. }
  347. #endregion
  348. } else {
  349. $order_id_arr[$order_id] = $order_id;
  350. }
  351. #endregion
  352. #region 判断线路类型是单一还是组合
  353. $line_info = $order_main->getOrderLineIdCount($order_id_arr);
  354. #endregion
  355. #region 判断订单是否已失效
  356. foreach ($line_info as $key => $vel) {
  357. if ($vel['order_valid_status'] == 0) {
  358. unset($order_id_arr[$key]);
  359. } else {
  360. if ($vel['line_id'] == 0 || $vel['line_type'] == 255 || $vel['line_type'] == 256) {
  361. $line_type = 'single';
  362. } else {
  363. $line_type = 'group';
  364. }
  365. }
  366. }
  367. if (count($order_id_arr) == 0) {
  368. $result['code'] = '0';
  369. $result['info'] = '订单已取消';
  370. return json_encode($result);
  371. }
  372. #endregion
  373. if ($line_type == 'single') {//单一线路
  374. #region 获取订单所属的班次信息
  375. $order_run_info = $order_main->getOrderRunInfo($order_id_arr);
  376. #endregion
  377. #region 取消单一订单
  378. $result = $order_main->cancelSingleBusOrder($order_id_arr, $order_run_info, $user_id, $cancel_reason);
  379. #endregion
  380. // if ($result['code'] == 0 && $user_id != 698) {
  381. // #region 微信车票订单通知微信端
  382. // $outside_sale_org_id = $order_main->getOutsideSaleOrgId($order_id_arr);
  383. // if ($outside_sale_org_id == 164) {
  384. // $util = new Util();
  385. // //微信渠道
  386. // foreach ($order_id_arr as $val) {
  387. // $cancel_push = $util::interfaceZzcx($val, 1);
  388. // //推送错误记录错误
  389. // if ($cancel_push['code'] != 0) {
  390. // $error_order_info = new ErrorOrderLog();
  391. // if (isset($cancel_push['info'])) {
  392. // $error_msg = $cancel_push['info'];
  393. // } else {
  394. // $error_msg = '';
  395. // }
  396. // $error_order_info->istOrderLog($val, '微信车票订单通知微信端返回值错误 ' . $error_msg);
  397. // }
  398. // }
  399. // }
  400. // #endregion
  401. // }
  402. #region 保险退单 //update : fuhc 2017-10-23
  403. $order_insurance_connect = new OrderInsuranceConnect();
  404. $config = Yii::$app->params;
  405. foreach ($order_id_arr as $order_key => $order_val) {
  406. $res = $order_insurance_connect->getOneInfo($order_val);
  407. if ($res) {
  408. //将保险退掉 --- 门票退单
  409. $sub = new SubmitOrder();
  410. $order_id_ary = [];
  411. foreach ($res as $key => $val) {
  412. $order_id_ary[] = $val['insurance_order_id'];
  413. $sub->CancelTicketOrder([
  414. "order_id" => $val['insurance_order_id'],
  415. "user_id" => $user_id,
  416. "cancel_reason" => $cancel_reason
  417. ]);
  418. }
  419. $order_id_cstr = implode(',', $order_id_ary);
  420. //发送取消保险短信通知
  421. if (empty($config['YunYinPhone']) == false) {
  422. foreach ($config['YunYinPhone'] as $phone) {
  423. $msg = "巴士订单({$order_val})退掉了保险订单,单价3元。系统订单号:" . $order_id_cstr . "。请及时确认及取消订单。。";
  424. Msg::sendTelMsg($phone, $msg);
  425. }
  426. }
  427. }
  428. }
  429. #endregion
  430. #region 插入记录和供应商余额接口
  431. #判断下单渠道是否需要预付#
  432. $submit_order=new SubmitOrder();
  433. $submit_order->SupplierBalance($order_id,2,'巴士订单取消');
  434. #endregion
  435. } else {//组合线路
  436. $result['code'] = '1';
  437. $result['info'] = '暂不支持组合线路退单';
  438. return json_encode($result);
  439. }
  440. return json_encode($result);
  441. }
  442. /**
  443. * Function Description:修改订单成本价
  444. * Function Name: actionUpdateBasePrice
  445. *
  446. * @return bool
  447. *
  448. * @author 张帅
  449. */
  450. public function actionUpdateBasePrice()
  451. {
  452. $order_main = new OrderMain();
  453. #region 获取参数
  454. $order_id = Yii::$app->request->post('order_id');//订单id
  455. $people_num = Yii::$app->request->post('people_num');//人数
  456. $base_price = Yii::$app->request->post('base_price');//成本价
  457. #endregion
  458. $result = $order_main->updateBasePrice($order_id, $people_num, $base_price);
  459. return $result;
  460. }
  461. /**
  462. * Function Description:提交门票订单
  463. * Function Name: actionSubmitTicketOrder
  464. *
  465. * @return string
  466. *
  467. * @author 张帅
  468. */
  469. public function actionSubmitTicketOrder()
  470. {
  471. $order_main = new OrderMain();
  472. $opera_product = new OperaProduct();
  473. $opera_product_run = new OperaProductRun();
  474. #region 获取参数
  475. $main_prod_id = Yii::$app->request->post('main_prod_id');//主票种id
  476. $run_date = Yii::$app->request->post('run_date');//出行日期
  477. $prod_str = Yii::$app->request->post('prod_str');//购买票种列表 格式为{子票种ID,票种单价,预定数量}...
  478. $order_info_str = Yii::$app->request->post('order_info_str');//'订单信息 {下单用户,会员号,渠道id,渠道订单号,是否自动退票(0否1是),支付方式(授信275),是否支付(0否1是),业务员}'
  479. $customer_info_str = Yii::$app->request->post('customer_info_str');//联系人信息,格式为{联系人,联系电话,z证件类型,联系人身份证,备注}
  480. $receiver_value_str = Yii::$app->request->post('receiver_value_str');//代收,格式为{代收单价,代收总价}
  481. #endregion
  482. #region 1.获取票种信息
  483. $prod_arr = $opera_product->getTicketProductList($prod_str);
  484. if (count($prod_arr) == 0) {
  485. $result['code'] = '1';
  486. $result['info'] = '没有选购产品';
  487. return json_encode($result);
  488. }
  489. #endregion
  490. #region 2.获取订单配置数据
  491. $order_info_arr = $order_main->getOrderInfoArray($order_info_str);
  492. $to_org_id = $order_info_arr['outside_sale_org_id'];
  493. #endregion
  494. #region 3.获取乘客信息
  495. $customer_info_arr = $order_main->getCustomerInfoArray($customer_info_str);
  496. #endregion
  497. #region 4.获取主订单数据详情
  498. $main_prod = $opera_product->getTicketMainProductListByProdId($main_prod_id);
  499. if (count($main_prod) == 0) {
  500. $result['code'] = '1';
  501. $result['info'] = '产品有误';
  502. return json_encode($result);
  503. }
  504. #endregion
  505. #region 5.获取产品的详细属性
  506. $prod_list = $opera_product_run->getTicketProductListByTicketDate($main_prod_id, $run_date, $prod_arr,$to_org_id);
  507. #region 判断获取的产品和要下单的产品数量是否一致
  508. if (isset($prod_list['code']) && $prod_list['code'] == 1) {
  509. return json_encode($prod_list);
  510. }
  511. #endregion
  512. #endregion
  513. #region 6.获取代收价及主订单部分信息
  514. $prod_list_result = $order_main->getTicketProductListReceiver($prod_list, $receiver_value_str);
  515. $prod_list = $prod_list_result['prod_list'];
  516. $main_prod += $prod_list_result['main_order_info'];
  517. $main_prod['run_date'] = $run_date;
  518. #endregion
  519. #region 7.下单插入数据
  520. $result = $order_main->submitTicketOrder($main_prod, $prod_list, $order_info_arr, $customer_info_arr);
  521. #endregion
  522. return json_encode($result);
  523. }
  524. /**
  525. * Function Description:门票退单
  526. * Function Name: actionCancelTicketOrder
  527. *
  528. * @return string
  529. *
  530. * @author 张帅
  531. */
  532. public function actionCancelTicketOrder()
  533. {
  534. $order_id = Yii::$app->request->post('order_id');//订单号(必传)
  535. $user_id = Yii::$app->request->post('user_id', 1);//用户id 默认1
  536. $cancel_reason = Yii::$app->request->post('cancel_reason', '系统退单');//退票原因 默认:系统退单
  537. $sub = new SubmitOrder();
  538. $result = $sub->CancelTicketOrder([
  539. "order_id" => $order_id,
  540. "user_id" => $user_id,
  541. "cancel_reason" => $cancel_reason
  542. ]);
  543. return json_encode($result);
  544. }
  545. /**
  546. * Function Description:提交组合订单
  547. * Function Name: actionSubmitGroupOrder
  548. *
  549. * @return string
  550. *
  551. * @author 张帅
  552. */
  553. public function actionSubmitGroupOrder()
  554. {
  555. $submit_group_order = new SubmitGroupOrder();
  556. $group_order_list = new GroupOrderList();
  557. // $a=json_decode('{"product_name":"\u676d\u5dde-\u4e4c\u9547(HZWZ-CZ001)+\u6d4b\u8bd5\u65b0\u95e8\u7968","bus_product":"[{\"run_id\":\"943601\",\"ticket_id\":\"452870\",\"prod_num\":\"1\",\"prod_price\":480}]","hotel_product":"","ticket_product":"[{\"ticket_id\":\"3873777\",\"run_date\":\"2018-03-09\",\"son_ticket\":[{\"son_ticket_id\":\"3873784\",\"prod_num\":\"1\",\"prod_price\":\"100.00\"}]}]","customer_info":"{\"customer_name\":\"\u6d4b\u8bd5\u5a04\",\"customer_mobile\":\"18616307052\",\"customer_id_type\":\"150\",\"customer_id_no\":\"430321\",\"customer_memo\":\"\"}","order_info":"{\"user_id\":\"263\",\"member_id\":\"263\",\"outside_sale_org_id\":\"164\",\"outside_sale_order_no\":\"15620\",\"order_book_status\":0,\"pay_type\":275,\"order_pay_status\":1,\"sales_man\":\"\"}","group_order_price":"500","action":"submit_group_order"}',true);
  558. //
  559. // Yii::$app->request->setBodyParams($a);
  560. #region 1,获取参数
  561. $product_name = Yii::$app->request->post('product_name', '未命名组合产品');//产品名称
  562. $bus_product = Yii::$app->request->post('bus_product', '');//巴士订购产品
  563. $hotel_product = Yii::$app->request->post('hotel_product', '');//酒店订购产品
  564. $ticket_product = Yii::$app->request->post('ticket_product', '');//门票订购产品
  565. $customer_info = Yii::$app->request->post('customer_info', '');//顾客信息
  566. $order_info = Yii::$app->request->post('order_info', '');//订单基础信息
  567. $group_order_price = Yii::$app->request->post('group_order_price');//组合产品总价格
  568. $tourist_mark = Yii::$app->request->post('tourist_mark', 0);//标志该组合下单是否是自由行产品下单:0表示否,如是则传组合产品的ID值 tourist_id
  569. $tourist_org_id = Yii::$app->request->post('tourist_org_id', 0);//自由行产品销售渠道id,区别于order_info里的outside_sale_org_id[运营主体所对应]内部采购渠道id
  570. $tourist_extra_info = Yii::$app->request->post('tourist_extra_info', json_encode(array('adult_num' => 0, 'child_num' => 0)));//自由行产品下单其他参数(成人,儿童数)
  571. $passenger_info=json_decode(Yii::$app->request->post('passenger_info','[]'),true);//乘车人详细 [{姓名,身份证},{姓名,身份证},{姓名,身份证}] array数组json_encode
  572. $insurance = Yii::$app->request->post('insurance', '');
  573. $buy_insurance = Yii::$app->request->post('buy_insurance', 0);//是否购买保险,0:不购买,1:购买
  574. #endregion
  575. $order_info_arr = json_decode($order_info, true); //订单基础信息数组
  576. #region 2,检查数据,并对酒店产品添加佣金相关参数
  577. if ($tourist_mark && !$tourist_org_id) {
  578. $result = array();
  579. $result['code'] = '1';
  580. $result['info'] = '该组合产品无渠道数据';
  581. return json_encode($result);
  582. }
  583. $result_data = $submit_group_order->checkSubmitData($product_name, $bus_product, $hotel_product, $ticket_product, $customer_info, $order_info, $group_order_price, $tourist_mark, $tourist_org_id, $tourist_extra_info,$passenger_info);
  584. if (isset($result_data['code']) && $result_data['code'] == '1') {
  585. return json_encode($result_data);
  586. }
  587. //如果有酒店产品,得到酒店产品的相关佣金参数
  588. if ($hotel_product) {
  589. $hotel_product = $submit_group_order->getHotelCommission($hotel_product, $order_info_arr['outside_sale_org_id']);
  590. }
  591. #endregion
  592. #region 3,※根据财务规则重新计算子订单价格【对组合产品($tourist_mark非0)情形不计算,只在普通组合产品下单使用】
  593. $user_id = $order_info_arr['user_id'];
  594. $finance_info=[];
  595. if (!$tourist_mark) {
  596. $prod_info = array(
  597. 'bus_arr' => json_decode($bus_product, true),
  598. 'hotel_arr' => json_decode($hotel_product, true),
  599. 'ticket_arr' => json_decode($ticket_product, true),
  600. 'group_order_price' => $group_order_price,
  601. 'channel_id' => $order_info_arr['outside_sale_org_id'],
  602. 'user_id' => $user_id,
  603. );
  604. $finance_compute = $group_order_list->countCost($prod_info);
  605. if (!isset($finance_compute['code']) || $finance_compute['code'] != '0') {
  606. return json_encode($finance_compute);
  607. }
  608. $finance_info = $finance_compute['info_arr'];//财务信息,用于组合下单后插入财务信息
  609. $prod_list = $finance_compute['prod_list'];//根据财务规则重新计算后的子订单价格
  610. //刷新 $submit_group_order 类的product_info属性
  611. $result_refresh = $submit_group_order->checkSubmitData($product_name, json_encode($prod_list['bus_arr']), json_encode($prod_list['hotel_arr']), json_encode($prod_list['ticket_arr']), $customer_info, $order_info, $group_order_price, $tourist_mark, $tourist_org_id, $tourist_extra_info);
  612. if (isset($result_refresh['code']) && $result_refresh['code'] == '1') {
  613. return json_encode($result_refresh);
  614. }
  615. }
  616. #endregion
  617. #region 4,获取订单配置
  618. $submit_group_order->getOrderMainBase();//订单配置数据
  619. #endregion
  620. #region 5,检验并获取巴士数据详情
  621. $bus_result = $submit_group_order->getBusOrderData();
  622. if (isset($bus_result['code']) && $bus_result['code'] == '1') {
  623. return json_encode($bus_result);
  624. }
  625. #endregion
  626. #region 6,检验并获取酒店数据详情
  627. $hotel_result = $submit_group_order->getHotelOrderData();
  628. if (isset($hotel_result['code']) && $hotel_result['code'] == '1') {
  629. return json_encode($hotel_result);
  630. }
  631. #endregion
  632. #region 7,检验并获取门票数据详情
  633. $ticket_result = $submit_group_order->getTicketOrderData();
  634. if (isset($ticket_result['code']) && $ticket_result['code'] == '1') {
  635. return json_encode($ticket_result);
  636. }
  637. #endregion
  638. #region 8,获取唯一键值并补充主订单配置
  639. $unique_result = $submit_group_order->getUniqueId();
  640. if (isset($unique_result['code']) && $unique_result['code'] != '0') {
  641. return json_encode($unique_result);
  642. }
  643. #endregion
  644. #region 9,获取订单提交数据配置
  645. $submit_group_order->getSubmitGroupOrderData();
  646. #endregion
  647. #region 10,提交订单
  648. //判断是否购买保险
  649. if($buy_insurance==1){
  650. $submit_group_order->order_title_base['is_buy_insurance']=1;
  651. }else{
  652. $submit_group_order->order_title_base['is_buy_insurance']=0;
  653. }
  654. $result_sub = $submit_group_order->submitGroupOrder();
  655. if ($result_sub['code'] != '0') {
  656. return json_encode($result_sub);
  657. }
  658. #endregion
  659. #region 12,※插入供应商余额
  660. //供应商余额插入
  661. $submit_group_order->insertBalance($result_sub['order_title_id']);
  662. #endregion
  663. #region 11,※插入财务信息(部分组合下单后续操作)【$tourist_mark为真情况下不插入财务信息】
  664. $result = $group_order_list->InsertGroupCost($result_sub, $finance_info, $user_id, $tourist_mark);
  665. #endregion
  666. #region 12,※其他后续处理
  667. #发送成功短信
  668. // $url = 'http://' . CS1_DOMAIN . '/api/msg/group-order-send-success-msg';
  669. // $sendInfo = array();
  670. // $sendInfo['order_id'] = $result_sub["order_title_id"];
  671. // Msg::httpRequest($url, $sendInfo);
  672. #endregion
  673. #region 13.下保险单 不论成功失败 不影响正常订单流程
  674. if ($buy_insurance !=0 && $insurance != '' && $result['code'] == 0) {
  675. $insuraceData = [
  676. #请求头
  677. 'auth_code' => Yii::$app->request->post('auth_code'),
  678. 'user_key' => Yii::$app->request->post('user_key'),
  679. 'user' => Yii::$app->request->post('user'),
  680. 'user_id' => Yii::$app->request->post('user_id'),
  681. 'request_time' => Yii::$app->request->post('request_time'),
  682. #报文体
  683. 'order_info_arr' => json_encode($order_info_arr),
  684. 'bus_order_id' => $result_sub["order_title_id"],
  685. 'insurance' => $insurance,
  686. 'tourist_id'=>Yii::$app->request->post('tourist_id',''),
  687. 'action' => 'add_insurance'
  688. ];
  689. Utils::httpRequestForasyn('http://' . CS1_DOMAIN . '/api/submit-order/', $insuraceData);
  690. }
  691. return json_encode($result);
  692. }
  693. /**
  694. * Function Description:提交组合订单(参考备用)
  695. * Function Name: actionSubmitGroupOrderBackup
  696. *
  697. * @return string
  698. *
  699. * @author 张帅
  700. */
  701. public function actionSubmitGroupOrderBackup()
  702. {
  703. /*$submit_group_order = new SubmitGroupOrder();
  704. #region 获取参数
  705. $product_name = Yii::$app->request->post('product_name', '未命名组合产品');//产品名称
  706. $bus_product = Yii::$app->request->post('bus_product', '');//巴士订购产品
  707. $hotel_product = Yii::$app->request->post('hotel_product', '');//酒店订购产品
  708. $ticket_product = Yii::$app->request->post('ticket_product', '');//门票订购产品
  709. $customer_info = Yii::$app->request->post('customer_info', '');//顾客信息
  710. $order_info = Yii::$app->request->post('order_info', '');//订单基础信息
  711. #endregion
  712. #region 检查数据
  713. $result_data = $submit_group_order->checkSubmitData($product_name, $bus_product, $hotel_product, $ticket_product, $customer_info, $order_info);
  714. if (isset($result_data['code']) && $result_data['code'] == '1') {
  715. return json_encode($result_data);
  716. }
  717. #endregion
  718. #region 获取订单配置
  719. $submit_group_order->getOrderMainBase();//订单配置数据
  720. #endregion
  721. #region 检验并获取巴士数据详情
  722. $bus_result = $submit_group_order->getBusOrderData();
  723. if (isset($bus_result['code']) && $bus_result['code'] == '1') {
  724. return json_encode($bus_result);
  725. }
  726. #endregion
  727. #region 检验并获取酒店数据详情
  728. $hotel_result = $submit_group_order->getHotelOrderData();
  729. if (isset($hotel_result['code']) && $hotel_result['code'] == '1') {
  730. return json_encode($hotel_result);
  731. }
  732. #endregion
  733. #region 检验并获取门票数据详情
  734. $ticket_result = $submit_group_order->getTicketOrderData();
  735. if (isset($ticket_result['code']) && $ticket_result['code'] == '1') {
  736. return json_encode($ticket_result);
  737. }
  738. #endregion
  739. #region 获取唯一键值并补充主订单配置
  740. $unique_result = $submit_group_order->getUniqueId();
  741. if (isset($unique_result['code']) && $unique_result['code'] != '0') {
  742. return json_encode($unique_result);
  743. }
  744. #endregion
  745. #region 获取订单提交数据配置
  746. $submit_group_order->getSubmitGroupOrderData();
  747. #endregion
  748. #region 提交订单
  749. $result = $submit_group_order->submitGroupOrder();
  750. #endregion
  751. return json_encode($result);*/
  752. }
  753. // 酒店退单接口
  754. public function actionHotelOrderCancel()
  755. {
  756. // $order_id = '1011653';
  757. // $merge_status = 27;
  758. $order_id = Yii::$app->request->post('order_id');
  759. // $merge_status = Yii::$app->request->post('merge_status');
  760. $user_id = Yii::$app->request->post('user_id', 1);
  761. $model = new HotelCancelOrder();
  762. //获取订单基本信息;
  763. //订单三种预订方法,组合单,录单,直连
  764. $data = $model->getOrderInfo($order_id);
  765. //可取消检查
  766. $checkFlag = $model->checkIfCancel($data);
  767. if (!$checkFlag) {
  768. $res['code'] = '2';
  769. $res['info'] = '该订单不可取消';
  770. return json_encode($res);
  771. }
  772. //556直连 557录单 直连与录单 就多置一个channel_order_status 其余无差别
  773. // if ($data['docking_type'] == 557) {
  774. //录单与组合订单
  775. $res = $model->cancelOrder($data, $user_id);
  776. return json_encode($res);
  777. // }
  778. }
  779. /**
  780. * Function Description:取消自由行订单统一接口
  781. * Function Name: actionCancelTourist
  782. *
  783. * @return string
  784. *
  785. * @author 娄梦宁
  786. */
  787. public function actionCancelTourist()
  788. {
  789. //身份校验
  790. // if ($this->actionCheckAuthCode() == false) {
  791. // $json = ['code' => 1, 'info' => '验证身份失败'];
  792. // return json_encode($json);
  793. // }
  794. $cancelTourist = new CancelTourist();
  795. $title_id = Yii::$app->request->post('sign',27266);//自由行订单id
  796. $user_id = Yii::$app->request->post('user_id', 2);//用户id 默认1
  797. $cancel_reason = Yii::$app->request->post('cancel_reason', '系统退单');//退票原因 默认:系统退单
  798. $result = $cancelTourist->CancelTouristById($title_id, $user_id, $cancel_reason);
  799. return json_encode($result);
  800. }
  801. /**
  802. * Function Description:验证验证码
  803. * Function Name: actionCheckAuthCode
  804. *
  805. * @return string
  806. *
  807. * @author Redstop
  808. */
  809. public function actionCheckAuthCode()
  810. {
  811. $user = Yii::$app->request->post('user');
  812. $user_key = Yii::$app->request->post('user_key');
  813. $request_time = Yii::$app->request->post('request_time');
  814. $auth_code = Yii::$app->request->post('auth_code');
  815. //加密规则为 request_time(linux时间戳)前三位 + user + user_key + request_time(linux时间戳)末尾三位,进行MD5加密后,换成大写字母
  816. $real_auth_code = strtoupper(md5(substr($request_time, 0, 3) . "|" . $user . "|" . $user_key . "|" . substr($request_time, strlen($request_time) - 3, 3)));
  817. if ($real_auth_code == $auth_code) {
  818. return true;
  819. }
  820. return false;
  821. }
  822. /**
  823. * Function Description:处理订单渠道商和供应商的预付款
  824. * Function Name: SupplierBalance
  825. *
  826. *
  827. * @author 娄梦宁
  828. */
  829. public function actionSupplierBalance(){
  830. $order_id = Yii::$app->request->post('order_id');
  831. $pay_type = Yii::$app->request->post('pay_type');
  832. $memo = Yii::$app->request->post('memo');
  833. $submit_order=new SubmitOrder();
  834. $submit_order->SupplierBalance($order_id,$pay_type,$memo);
  835. }
  836. // public function actionCancelForWeChat(){
  837. // $util=new Util();
  838. // $order_id=Yii::$app->request->post('order_id');//订单号
  839. // $result=$util->interfaceZzcx($order_id);
  840. // return $result;
  841. // }
  842. public function actionCtripFinish(){
  843. $otaOrderId=Yii::$app->request->get('otaOrderId');
  844. $vendorOrderId=Yii::$app->request->get('vendorOrderId');
  845. $ctrip_util=CtripUtil::NoticeOrderConsumed($otaOrderId,$vendorOrderId,1);
  846. }
  847. }