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.
 
 
 
 
 
 

971 lignes
44 KiB

  1. <?php
  2. /**
  3. *
  4. * ============================================================================
  5. * * 版权所有 蜘蛛出行 * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * Author By: 张帅
  12. * PhpStorm GetBusOrderData.php
  13. * Create By 2017/4/14 18:18 $
  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\OperaTickets;
  20. use backend\modules\api\models\RunMain;
  21. use backend\modules\api\models\RunProd;
  22. use backend\modules\api\models\RunStation;
  23. use yii\db\Query;
  24. class GetBusOrderData extends Query
  25. {
  26. public $bus_product;//巴士产品
  27. public $order_main_base = [];//订单基础配置
  28. public $pay_main_base = [];//主支付记录基础配置
  29. public $pay_detail_base = [];//支付明细
  30. public $user_id;//用户id
  31. public $create_time;//创建时间
  32. /**
  33. * Function Description:获取巴士产品详情列表
  34. * Function Name: getBusProductListData
  35. * @param array $bus_product 巴士选购产品
  36. *
  37. * @return array|\yii\db\ActiveRecord[]
  38. *
  39. * @author 张帅
  40. */
  41. public function getBusProductListData($bus_product)
  42. {
  43. #region 1.班次票种筛选条件
  44. $and_where = [
  45. 'or',
  46. ];
  47. foreach ($bus_product as $key => $vel) {
  48. $and_where[] = [
  49. 'and',
  50. ['=', 'rp.run_id', $vel['run_id']],
  51. ['=', 'rp.prod_id', $vel['ticket_id']],
  52. ];
  53. }
  54. #endregion
  55. //判断产品中是否有相同班次票种的产品,如果有,返回错误信息
  56. $check_unique_runticket = array();
  57. foreach ($bus_product as $key => $vel) {
  58. $runticket_token = $vel['run_id'] . "-" . $vel['ticket_id'];
  59. if (in_array($runticket_token, $check_unique_runticket)) {
  60. $json['code'] = '1';
  61. $json['info'] = '添加了重复的巴士订单,请仔细检查确认';
  62. return $json;
  63. } else {
  64. $check_unique_runticket[] = $runticket_token;
  65. }
  66. }
  67. #region 2.查询结果
  68. $prod_list = RunProd::find()
  69. ->select([
  70. 'run_id' => 'rm.run_id',//班次id
  71. 'run_date' => 'rm.run_date',//出发日期
  72. 'run_time' => 'rm.run_time',//出发时间
  73. 'run_minutes' => 'rm.run_minutes',//出发分钟数
  74. 'ticket_id' => 'rp.prod_id',//票种id
  75. 'ticket_name' => 't.ticket_name',//票种名称
  76. 'seat_type' => 't.seat_type',//座位类型
  77. 'human_type' => 't.human_type',//人群属性
  78. 'line_id' => 't.line_id',//线路id
  79. 'line_name' => 'l.line_name',//线路名称
  80. 'start_res_id' => 't.start_station_res_id',//上车站id
  81. 'start_res_name' => BaseResource::find()->select('res_name')->where('res_id = t.start_station_res_id')->limit(1),//上车站name
  82. 'start_area_id' => 't.start_station_area_id',//出发地id
  83. 'start_area_name' => BaseArea::find()->select('area_name')->where('id = t.start_station_area_id')->limit(1),//出发地name
  84. 'start_seq_id' => 's1.station_order_id',//开始站顺序号
  85. 'start_time' => 's1.start_time',//开始时间
  86. 'start_minutes' => 's1.start_minutes',//开始分钟数
  87. 'checkport_res_id' => 's1.checkport_res_id',//检票口id
  88. 'checkport_res_name' => BaseResource::find()->select('res_name')->where('res_id = s1.checkport_res_id')->limit(1),//检票口name
  89. 'end_res_id' => 't.end_station_res_id',//下车站id
  90. 'end_res_name' => BaseResource::find()->select('res_name')->where('res_id = t.end_station_res_id')->limit(1),//下车站name
  91. 'end_area_id' => 't.end_station_area_id',//目的地id
  92. 'end_area_name' => BaseArea::find()->select('area_name')->where('id = t.end_station_area_id')->limit(1),//目的地name
  93. 'end_seq_id' => 's2.station_order_id',//结束站顺序号
  94. 'end_time' => 's2.start_time',//结束时间
  95. 'end_minutes' => 's2.start_minutes',//结束分钟数
  96. 'prod_price' => 't.prod_price',//分销价
  97. 'cus_price' => 't.cus_price',//零售价
  98. 'principal_id' => 'l.run_duty_id', //运营负责人
  99. ])
  100. ->from(RunProd::tableName() . ' as rp')
  101. ->leftJoin(RunMain::tableName() . ' as rm', 'rp.run_id = rm.run_id')
  102. ->leftJoin(OperaTickets::tableName() . ' as t', 'rp.prod_id = t.ticket_id')
  103. ->leftJoin(OperaLine::tableName() . ' as l', 't.line_id = l.line_id')
  104. ->leftJoin(RunStation::tableName() . ' as s1', 'rm.run_id = s1.run_id and l.line_id = s1.prod_id and t.start_station_res_id = s1.station_res_id')
  105. ->leftJoin(RunStation::tableName() . ' as s2', 'rm.run_id = s2.run_id and l.line_id = s2.prod_id and t.end_station_res_id = s2.station_res_id')
  106. ->where([
  107. 'and',
  108. ['=', 'rp.cancel_flag', 0],
  109. ['=', 't.cancel_flag', 0],
  110. ['=', 't.is_onsale', 1],
  111. ])
  112. ->andWhere($and_where)
  113. ->indexBy(function ($row) {
  114. return $row['run_id'] . '-' . $row['ticket_id'];
  115. })
  116. ->asArray()->all();
  117. #endregion
  118. #region 3.整理数据
  119. $result = [];
  120. foreach ($bus_product as $key => $vel) {
  121. $runticket_token = $vel['run_id'] . "-" . $vel['ticket_id'];
  122. //判断巴士产品在提交过程中是否有改变
  123. if (isset($prod_list[$runticket_token])) {
  124. $prod_one = $prod_list[$runticket_token];
  125. $prod_one['prod_num'] = $vel['prod_num'];//人数
  126. $prod_one['price'] = $vel['prod_price'];//价格
  127. $prod_one['bus_no'] = $vel['bus_no'];//车号
  128. } else {
  129. $json['code'] = '1';
  130. $json['info'] = '巴士产品有误';
  131. return $json;
  132. }
  133. $result[] = $prod_one;
  134. }
  135. #endregion
  136. $this->bus_product = $result;
  137. $json['code'] = '0';
  138. $json['info'] = '成功';
  139. return $json;
  140. }
  141. /**
  142. * Function Description:检验班次是否存在并粗略检查库存
  143. * Function Name: checkRunX
  144. *
  145. * @return bool
  146. *
  147. * @author 张帅
  148. */
  149. public function checkRunX()
  150. {
  151. #region 获取巴士选购产品数据
  152. $bus_product_info = $this->bus_product;
  153. #endregion
  154. #region 整理月份相同的班次,节约查询次数
  155. $run_month = [];
  156. foreach ($bus_product_info as $key => $vel) {
  157. $table_name = 'run_' . date('Ym', strtotime($vel['run_date']));
  158. if (!isset($run_month[$table_name][$vel['run_id']])) {
  159. $run_month[$table_name][$vel['run_id']] = $vel['prod_num'];
  160. } else {
  161. $run_month[$table_name][$vel['run_id']] += $vel['prod_num'];
  162. }
  163. }
  164. #endregion
  165. #region 判断每个班次是否存在run_x
  166. foreach ($run_month as $key => $vel) {
  167. #region 获取每趟班次的库存
  168. $query = new Query;
  169. $check_run = $query
  170. ->select([
  171. 'run_id',
  172. 'toatl_count' => "count(run_id)",
  173. ])
  174. ->from($key)
  175. ->where([
  176. 'and',
  177. ['in', 'run_id', array_keys($vel)],
  178. ['=', 'cancel_flag', 0],
  179. ['=', 'seat_status', 0],
  180. ['=', 'order_id', 1],
  181. ['not in', 'seat_type', [104, 105]],
  182. ])
  183. ->groupBy(['run_id'])
  184. ->indexBy('run_id')
  185. ->all();
  186. #endregion
  187. #region 查看每个班次是否存在及库存情况
  188. foreach ($vel as $k => $v) {
  189. if (!isset($check_run[$k])) {
  190. $json['code'] = '1';
  191. $json['info'] = '巴士班次有误';
  192. return $json;
  193. }
  194. if ($check_run[$k]['toatl_count'] < $v) {
  195. $json['code'] = '1';
  196. $json['info'] = '巴士库存不足';
  197. return $json;
  198. }
  199. }
  200. #endregion
  201. #endregion
  202. }
  203. #endregion
  204. $json['code'] = '0';
  205. $json['info'] = '成功';
  206. return $json;
  207. }
  208. /**
  209. * Function Description:获取巴士产品座位
  210. * Function Name: getRunBusSeat
  211. *
  212. * @return mixed
  213. *
  214. * @author 张帅
  215. */
  216. public function getRunBusSeat()
  217. {
  218. #region 获取巴士选购产品数据
  219. $bus_product_info = $this->bus_product;
  220. #endregion
  221. #region 整理月份相同的班次,节约查询次数
  222. $run_month = [];
  223. foreach ($bus_product_info as $key => $vel) {
  224. $table_name = 'run_' . date('Ym', strtotime($vel['run_date']));
  225. $run_month[$table_name][$vel['run_id']] = $vel['run_id'];
  226. }
  227. #endregion
  228. #region 获取所有班次的所有座位
  229. $run_seat_arr = [];
  230. foreach ($run_month as $key => $vel) {
  231. $query = new Query;
  232. $run_seat_one = $query
  233. ->select([
  234. 'id',
  235. 'run_id',
  236. 'bus_order_id',
  237. 'seat_x',
  238. 'seat_y',
  239. 'seat_type',
  240. 'seat_seq_id',
  241. 'seat_name',
  242. 'seat_status',
  243. 'order_id',
  244. ])
  245. ->from($key)
  246. ->where([
  247. 'and',
  248. ['in', 'run_id', array_keys($vel)],
  249. ['=', 'cancel_flag', 0],
  250. ['=', 'seat_status', 0],
  251. ['not in', 'seat_type', [104, 105]],
  252. ])
  253. ->orderBy('bus_order_id ASC,order_id ASC,seat_seq_id ASC')
  254. ->all();
  255. #endregion
  256. $run_seat_arr = array_merge($run_seat_arr, $run_seat_one);
  257. }
  258. #endregion
  259. #region 整理座位数组
  260. $run_seat_list = [];
  261. foreach ($run_seat_arr as $key => $vel) {
  262. $run_seat_list[$vel['run_id']][$vel['bus_order_id']][$vel['order_id']][$vel['seat_type']][$vel['seat_seq_id']] = $vel;
  263. }
  264. #endregion
  265. #region 分配座位
  266. $result = $this->getBusProductSeat($run_seat_list);
  267. if (isset($result['code']) && $result['code'] == '1') {
  268. return $result;
  269. }
  270. return $this->bus_product;
  271. #endregion
  272. }
  273. /**
  274. * Function Description:巴士分配座位
  275. * Function Name: getBusProductSeat
  276. * @param array $run_seat_list 座位表
  277. *
  278. * @return mixed
  279. *
  280. * @author 张帅
  281. */
  282. public function getBusProductSeat($run_seat_list)
  283. {
  284. #region 获取巴士选购产品数据
  285. $bus_product_info = $this->bus_product;
  286. #endregion
  287. #region 遍历所有巴士产品
  288. foreach ($bus_product_info as $bus_key => $bus_vel) {
  289. $seat_arr = [];
  290. #region 遍历每条产品数据的车次
  291. foreach ($run_seat_list[$bus_vel['run_id']] as $seat_key => $seat_vel) {
  292. $seat_arr = [];
  293. #region 遍历首发站的所有空座
  294. foreach ($seat_vel[$bus_vel['start_seq_id']][$bus_vel['seat_type']] as $key => $vel) {
  295. $seat_arr[$key] = $vel;
  296. $seat_arr[$key]['id_arr'][] = $vel['id'];
  297. #region 获取中间站均有空座的座位
  298. for ($i = $bus_vel['start_seq_id'] + 1; $i < $bus_vel['end_seq_id']; $i++) {
  299. if (!isset($seat_vel[$i][$bus_vel['seat_type']][$key])) {
  300. unset($seat_arr[$key]);
  301. break;
  302. } else {
  303. $seat_arr[$key]['id_arr'][] = $seat_vel[$i][$bus_vel['seat_type']][$key]['id'];
  304. }
  305. }
  306. #endregion
  307. }
  308. #endregion
  309. if (count($seat_arr) >= $bus_vel['prod_num']) {
  310. #region 获取座位信息(优先获取连坐)
  311. $seat_arr = $this->getSeatArray($seat_arr, $bus_vel['prod_num']);
  312. #endregion
  313. #region 剔除挑出的座位
  314. foreach ($seat_arr as $key => $vel) {
  315. for ($i = $bus_vel['start_seq_id']; $i < $bus_vel['end_seq_id']; $i++) {
  316. unset($run_seat_list[$bus_vel['run_id']][$seat_key][$i][$bus_vel['seat_type']][$key]);
  317. }
  318. }
  319. #endregion
  320. break;
  321. }
  322. }
  323. #endregion
  324. if (count($seat_arr) != $bus_vel['prod_num']) {
  325. $json['code'] = '1';
  326. $json['info'] = '巴士库存不足';
  327. return $json;
  328. }
  329. $bus_product_info[$bus_key]['seat_arr'] = $seat_arr;
  330. }
  331. #endregion
  332. $this->bus_product = $bus_product_info;
  333. $json['code'] = '0';
  334. $json['info'] = '成功';
  335. return $json;
  336. }
  337. /**
  338. * Function Description:获取座位信息(优先获取连坐)
  339. * Function Name: getSeatArray
  340. * @param array $seat_arr 座位数组
  341. * @param int $prod_num 产品数
  342. *
  343. * @return array
  344. *
  345. * @author 张帅
  346. */
  347. public function getSeatArray($seat_arr, $prod_num)
  348. {
  349. $result = [];
  350. $seat_no = [];
  351. $i = 0;
  352. #region 连座筛选
  353. foreach ($seat_arr as $key => $vel) {
  354. $seat_no[$key - $i][$key] = $vel;
  355. $i++;
  356. }
  357. #endregion
  358. #region 挑选座位
  359. foreach ($seat_no as $key => $vel) {
  360. if (count($vel) >= $prod_num) {
  361. $result = array_slice($vel, 0, $prod_num, true);
  362. break;
  363. }
  364. }
  365. if (count($result) == 0) {
  366. $result = array_slice($seat_arr, 0, $prod_num, true);
  367. }
  368. #endregion
  369. return $result;
  370. }
  371. /**
  372. * Function Description:获取提交巴士订单数据
  373. * Function Name: getSubmitBusData
  374. * @param int $unique_id 唯一主键
  375. * @param array $order_main_base 订单基础配置
  376. * @param array $pay_main_base 主支付记录基础配置
  377. * @param array $pay_detail_base 支付明细
  378. * @param int $user_id 用户id
  379. * @param string $create_time 创建时间
  380. * @param array $bus_product_list 最新巴士数据
  381. * @return array
  382. *
  383. * @author 张帅
  384. */
  385. public function getSubmitBusData($unique_id, $order_main_base, $pay_main_base, $pay_detail_base, $user_id, $create_time, $bus_product_list)
  386. {
  387. #region 设置常量
  388. $this->order_main_base = $order_main_base;
  389. $this->pay_main_base = $pay_main_base;
  390. $this->pay_detail_base = $pay_detail_base;
  391. $this->user_id = $user_id;
  392. $this->create_time = $create_time;
  393. #endregion
  394. $this->bus_product = $bus_product_list;
  395. #region 获取巴士选购产品数据
  396. $bus_product_info = $this->bus_product;
  397. #endregion
  398. #region 提交订单素材
  399. $order_main_arr = [];//订单表提交数据
  400. $main_order_id_arr = [];//巴士订单组
  401. $run_x_arr = [];//run_x需要修改数据
  402. $run_bus_arr = [];//run_bus需要修改数据
  403. $run_prod_arr = [];//run_prod需要修改数据
  404. $run_stock_arr = [];//run_stock需要更新数据
  405. $pay_main_arr = [];//主支付记录
  406. $pay_detail_arr = [];//支付明细
  407. #endregion
  408. $son_order_id = $unique_id;//巴士子订单起始订单号
  409. #region 遍历主订单
  410. foreach ($bus_product_info as $main_key => $main_vel) {
  411. //$order_id = $pay_main_id + 1;//订单递增id
  412. $main_order_id = $main_vel['order_id'];//主订单id
  413. $pay_main_id = $main_order_id;
  414. #region 主订单数据(如果是代售有多组数据)
  415. $order_main_one = $this->getMainOrderInfoArray($main_order_id, $pay_main_id, $main_vel);
  416. #endregion
  417. #region 插入主订单
  418. foreach ($order_main_one as $ok => $ov) {
  419. $order_main_arr[] = $ov;
  420. }
  421. $main_order_id_arr[$main_order_id] = $main_order_id;//收集主订单号
  422. #endregion
  423. #region 遍历子订单
  424. foreach ($main_vel['seat_arr'] as $son_key => $son_vel) {
  425. #region 子订单数据(如果是代售有多组数据)
  426. $order_main_one = $this->getSonOrderInfoArray($son_order_id, $main_order_id, $pay_main_id, $main_vel, $son_vel);
  427. #endregion
  428. $son_order_id = $son_order_id + $main_vel['agent_depth'];//子订单号增加(增加agent_depth)
  429. #region 插入子订单
  430. foreach ($order_main_one as $ok => $ov) {
  431. $order_main_arr[] = $ov;
  432. }
  433. #endregion
  434. #region 获取run_x数据
  435. $run_x_one = $this->getRunXInfo($order_main_one[0], $son_vel);//取agent_level_1的子订单
  436. $run_x_arr[] = $run_x_one;
  437. #endregion
  438. #region 获取run_bus数据
  439. $run_bus_arr = $this->getRunBusInfo($run_bus_arr, $main_vel['run_id'], $son_vel['bus_order_id']);
  440. #endregion
  441. }
  442. #endregion
  443. #region 获取run_prod数据
  444. $run_prod_arr = $this->getRunProdInfo($run_prod_arr, $main_vel['run_id'], $main_vel['ticket_id'], $main_vel['prod_num']);
  445. #endregion
  446. #region 获取run_stock数据
  447. for ($i = $main_vel['start_seq_id']; $i < $main_vel['end_seq_id']; $i++) {
  448. $run_stock_arr = $this->getRunStockInfo($run_stock_arr, $main_vel['run_id'], $i, $main_vel['seat_type'], $main_vel['prod_num']);
  449. }
  450. #endregion
  451. #region 获取主支付记录数据
  452. $total_price = $main_vel['prod_num'] * $main_vel['price'];
  453. $pay_main_one = $this->getPayMainInfo($pay_main_id, $main_order_id, $total_price);
  454. $pay_main_arr[] = $pay_main_one;
  455. #endregion
  456. #region 获取支付明细数据
  457. $pay_detail_one = $this->getPayDetailInfo($pay_main_id, $total_price);
  458. $pay_detail_arr[] = $pay_detail_one;
  459. #endregion
  460. $unique_id = $son_order_id;
  461. }
  462. #endregion
  463. $result = [
  464. 'main_order_id_arr' => $main_order_id_arr,//巴士订单号数组
  465. 'order_main_arr' => $order_main_arr,//订单表数据
  466. 'run_x_arr' => $run_x_arr,//run_x需要修改数据
  467. 'run_bus_arr' => $run_bus_arr,//run_bus需要修改数据
  468. 'run_prod_arr' => $run_prod_arr,//run_prod需要修改数据
  469. 'run_stock_arr' => $run_stock_arr,//run_stock需要更新数据
  470. 'pay_main_arr' => $pay_main_arr,//主支付记录
  471. 'pay_detail_arr' => $pay_detail_arr,//支付明细
  472. 'unique_id' => $unique_id,//唯一键值
  473. ];
  474. return $result;
  475. }
  476. #==============================================================================================================================================================================#
  477. #==============================================================================================================================================================================#
  478. #==============================================================================================================================================================================#
  479. #==============================================================================================================================================================================#
  480. #==============================================================================================================================================================================#
  481. /**
  482. * Function Description:获取巴士主订单数据
  483. * Function Name: getMainOrderInfoArray
  484. * @param int $order_id 订单号
  485. * @param int $pay_main_id 支付号
  486. * @param array $main_order 订单信息
  487. *
  488. * @return mixed
  489. *
  490. * @author 张帅
  491. */
  492. public function getMainOrderInfoArray($order_id, $pay_main_id, $main_order)
  493. {
  494. $final = array();//主订单数组,如果是自营票种,只有一个值;如果是代售,则有几层,插几个值
  495. #region 获取订单配置
  496. $result = $this->order_main_base;
  497. #endregion
  498. //1,终端主订单号数组(agent_level_1的主订单)
  499. $result['ID'] = $main_order['order_id'];//订单号
  500. $result['ORDER_ID'] = $main_order['order_id'];//订单号
  501. $order_description = $main_order['ticket_name'] . ',' . date('Y-m-d', time()) . ',' . $main_order['prod_num'] . '|' . $main_order['prod_num'];//订单描述
  502. $result['ORDER_DESCRIPTION'] = $order_description;//订单描述
  503. $result['ORDER_PAY_MAIN_ID'] = $main_order['order_id'];//主支付记录id
  504. $result['PARENT_PROD_ID'] = $main_order['line_id'];//父产品id
  505. $result['PARENT_PROD_NAME'] = $main_order['line_name'];//父产品名称
  506. $order_price = $main_order['prod_num'] * $main_order['price'];//订单价格
  507. $result['ORDER_PRICE'] = $order_price;//订单价格
  508. $result['ORDER_PROD_TYPE'] = 81;//订单类型
  509. $result['PROD_START_STATION_CHECKPORT_RES_ID'] = $main_order['checkport_res_id'];//上车站检票口资源ID
  510. $result['PROD_START_STATION_CHECKPORT_RES_NAME'] = empty($main_order['checkport_res_name']) ? '' : $main_order['checkport_res_name'];//上车站检票口资源名称
  511. $result['PROD_START_STATION_TIME_MINUTES'] = $main_order['start_minutes'];//上车站发车时间距发车日零点分钟数
  512. $result['PROD_END_STATION_TIME_MINUTES'] = $main_order['end_minutes'];//下车站发车时间距发车日零点分钟数
  513. $result['OUTSIDE_SALE_ORG_ID'] = $main_order['outside_sale_org_id'];//渠道商ID
  514. $result['OUTSIDE_ORDER_NO'] = $main_order['outside_order_no'];//渠道订单号
  515. $result['PROD_TOP_ORG_ID'] = $main_order['prod_top_org_id'];//供应商ID
  516. $result['PROD_SUPPLY_ORG_NAME'] = $main_order['prod_supply_org_name'];//供应商名字
  517. $result['SUB_CHANNEL_ID'] = $main_order['sub_channel_id'];//下级渠道id
  518. $result['SUB_CHANNEL_NO'] = $main_order['sub_channel_no'];//下级渠道订单号
  519. $result['MAIN_CORP_ID'] = $main_order['main_corp_id'];//订单所属运营主体
  520. $result['SOURCE_MAIN_CORP_ID'] = $main_order['source_main_corp_id'];//线路所属运营主体
  521. $result['SALE_PATH'] = $main_order['sale_path'];//销售路径
  522. $result['AGENT_LEVEL'] = $main_order['agent_level'];//售卖层级:终端1,上一级2,再上一级3
  523. $result['BASE_PRICE'] = $main_order['total_base_price']; //成本价
  524. $result['PRINCIPAL_ID'] = $main_order['principal_id']; //运营负责人
  525. $final[] = $result;
  526. //2,☆☆☆ 如果是代售,插入代售的相关主订单 ☆☆☆
  527. if ($main_order['is_agent'] == 1) {
  528. $agent_list = $main_order['agent_list'];
  529. unset($agent_list[1]);//去掉销售层级1的主订单,前面已插入
  530. foreach ($agent_list as $ak => $av) {
  531. $result_new = $this->order_main_base;
  532. #endregion
  533. //1,终端主订单号数组(agent_level_1的主订单)
  534. $result_new ['ID'] = $av['order_id'];//订单号
  535. $result_new ['MAIN_CREATE_USER_ID'] = 2;//代售非终端下单用户为 2-系统自动
  536. $result_new ['CREATE_USER_ID'] = 2;//代售非终端下单用户为 2-系统自动
  537. $result_new ['ORDER_ID'] = $av['order_id'];//订单号
  538. $order_description = $main_order['ticket_name'] . ',' . date('Y-m-d', time()) . ',' . $main_order['prod_num'] . '|' . $main_order['prod_num'];//订单描述
  539. $result_new ['ORDER_DESCRIPTION'] = $order_description;//订单描述
  540. $result_new ['ORDER_PAY_MAIN_ID'] = $av['order_id'];//主支付记录id
  541. $result_new ['PARENT_PROD_ID'] = $main_order['line_id'];//父产品id
  542. $result_new ['PARENT_PROD_NAME'] = $main_order['line_name'];//父产品名称
  543. $result_new ['ORDER_PRICE'] = $av['total_order_price'];//订单价格
  544. $result_new ['ORDER_PROD_TYPE'] = 81;//订单类型
  545. $result_new ['PROD_START_STATION_CHECKPORT_RES_ID'] = $main_order['checkport_res_id'];//上车站检票口资源ID
  546. $result_new ['PROD_START_STATION_CHECKPORT_RES_NAME'] = empty($main_order['checkport_res_name']) ? '' : $main_order['checkport_res_name'];//上车站检票口资源名称
  547. $result_new ['PROD_START_STATION_TIME_MINUTES'] = $main_order['start_minutes'];//上车站发车时间距发车日零点分钟数
  548. $result_new ['PROD_END_STATION_TIME_MINUTES'] = $main_order['end_minutes'];//下车站发车时间距发车日零点分钟数
  549. $result_new ['OUTSIDE_SALE_ORG_ID'] = $av['outside_sale_org_id'];//渠道商ID
  550. $result_new ['OUTSIDE_ORDER_NO'] = $av['outside_order_no'];//渠道订单号
  551. $result_new ['SALES_MAN'] = $av['sales_man'];//业务员
  552. $result_new ['PROD_TOP_ORG_ID'] = $av['prod_top_org_id'];//供应商ID
  553. $result_new ['PROD_SUPPLY_ORG_NAME'] = $av['prod_supply_org_name'];//供应商名字
  554. $result_new ['SUB_CHANNEL_ID'] = $av['sub_channel_id'];//下级渠道id
  555. $result_new ['SUB_CHANNEL_NO'] = $av['sub_channel_no'];//下级渠道订单号
  556. $result_new ['MAIN_CORP_ID'] = $av['main_corp_id'];//订单所属运营主体
  557. $result_new ['SOURCE_MAIN_CORP_ID'] = $av['source_main_corp_id'];//线路所属运营主体
  558. $result_new ['SALE_PATH'] = $av['sale_path'];//销售路径
  559. $result_new ['AGENT_LEVEL'] = $av['agent_level'];//售卖层级:终端1,上一级2,再上一级3
  560. $result_new ['BASE_PRICE'] = $av['total_base_price']; //成本价
  561. $result_new ['PRINCIPAL_ID'] = isset($av['principal_id']) ? $av['principal_id'] : 0; //运营负责人
  562. $result_new ['ORDER_TITLE_ID'] = 0;//组合产品代售非终端订单此值为0
  563. $final[] = $result_new;
  564. }
  565. }
  566. return $final;
  567. }
  568. /**
  569. * Function Description:获取巴士子订单数据
  570. * Function Name: getSonOrderInfoArray
  571. * @param int $son_order_id 订单号
  572. * @param int $main_order_id 父订单号
  573. * @param int $pay_main_id 支付号
  574. * @param array $main_order 订单信息
  575. * @param array $seat_info 座位信息
  576. *
  577. * @return mixed
  578. *
  579. * @author 张帅
  580. */
  581. public function getSonOrderInfoArray($son_order_id, $main_order_id, $pay_main_id, $main_order, $seat_info)
  582. {
  583. $final = array();//子订单数组,如果是自营票种,只有一个值;如果是代售,则有几层,插几个值
  584. #region 获取订单配置
  585. $result = $this->order_main_base;
  586. #endregion
  587. //1,终端子订单号数组(agent_level_1的子订单)
  588. $result['ID'] = $son_order_id;//订单号
  589. $result['ORDER_ID'] = $son_order_id;//订单号
  590. $result['ORDER_PAY_MAIN_ID'] = $main_order_id;//主支付记录id
  591. $result['PARENT_ORDER_ID'] = $main_order_id;//父订单id
  592. $result['PROD_ID'] = $main_order['ticket_id'];//子产品id
  593. $result['PROD_NAME'] = $main_order['ticket_name'];//子产品名称
  594. $result['PARENT_PROD_ID'] = $main_order['line_id'];//父产品id
  595. $result['PARENT_PROD_NAME'] = $main_order['line_name'];//父产品名称
  596. $result['ORDER_PRICE'] = $main_order['price'];//订单价格
  597. $result['ORDER_PROD_TYPE'] = 82;//订单类型
  598. $result['RUN_BUS_ORDER_ID'] = $seat_info['bus_order_id'];//车号
  599. $result['RUN_BUS_SEAT_TYPE'] = $seat_info['seat_type'];//座位类型
  600. $result['RUN_BUS_SEAT_SEQ_ID'] = $seat_info['seat_seq_id'];//座位内部序列ID
  601. $result['RUN_BUS_SEAT_NAME'] = $seat_info['seat_name'];//座位名称
  602. $result['RUN_ID'] = $main_order['run_id'];//班次
  603. $result['RUN_DATE'] = $main_order['run_date'];//出行日期
  604. $result['RUN_DATE_NUM'] = (strtotime($main_order['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);//班次首发日期参数,发车日期至2016-01-01天数,算法使用,
  605. $result['RUN_TIME'] = $main_order['run_time'];//出行日期
  606. $result['PROD_START_STATION_RES_ID'] = $main_order['start_res_id'];//上车站id
  607. $result['PROD_START_STATION_RES_NAME'] = $main_order['start_res_name'];//上车站名称
  608. $result['PROD_START_STATION_CHECKPORT_RES_ID'] = $main_order['checkport_res_id'];//上车站检票口资源ID
  609. $result['PROD_START_STATION_CHECKPORT_RES_NAME'] = empty($main_order['checkport_res_name']) ? '' : $main_order['checkport_res_name'];//上车站检票口资源名称
  610. $result['PROD_START_STATION_SEQ_ID'] = $main_order['start_seq_id'];//上车站点顺序号
  611. $result['PROD_START_STATION_DATE'] = $main_order['run_date'];//上车站点上车日期
  612. $result['PROD_START_STATION_DATE_NUM'] = (strtotime($main_order['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);//上车站距2016-01-01天数
  613. $result['PROD_START_STATION_TIME'] = $main_order['start_time'];//上车站上车时间
  614. $result['PROD_START_STATION_TIME_MINUTES'] = $main_order['start_minutes'];//上车站点分钟数
  615. $result['PROD_START_STATION_AREA_ID'] = $main_order['start_area_id'];//出发地id
  616. $result['PROD_START_STATION_AREA_NAME'] = $main_order['start_area_name'];//出发地名称
  617. $result['PROD_END_STATION_RES_ID'] = $main_order['end_res_id'];//下车站id
  618. $result['PROD_END_STATION_RES_NAME'] = $main_order['end_res_name'];//下车站名称
  619. $result['PROD_END_STATION_SEQ_ID'] = $main_order['end_seq_id'];//下车站点顺序号
  620. $result['PROD_END_STATION_DATE'] = $main_order['run_date'];//下车站点下车日期
  621. $result['PROD_END_STATION_DATE_NUM'] = (strtotime($main_order['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);//下车站距2016-01-01天数
  622. $result['PROD_END_STATION_TIME'] = $main_order['end_time'];//下车站下车时间
  623. $result['PROD_END_STATION_TIME_MINUTES'] = $main_order['end_minutes'];//下车站点分钟数
  624. $result['PROD_END_STATION_AREA_ID'] = $main_order['end_area_id'];//目的地id
  625. $result['PROD_END_STATION_AREA_NAME'] = $main_order['end_area_name'];//目的地名称
  626. $result['OUTSIDE_SALE_ORG_ID'] = $main_order['outside_sale_org_id'];//渠道商ID
  627. $result['OUTSIDE_ORDER_NO'] = $main_order['outside_order_no'];//渠道订单号
  628. $result['PROD_TOP_ORG_ID'] = $main_order['prod_top_org_id'];//供应商ID
  629. $result['PROD_SUPPLY_ORG_NAME'] = $main_order['prod_supply_org_name'];//供应商名字
  630. $result['SUB_CHANNEL_ID'] = $main_order['sub_channel_id'];//下级渠道id
  631. $result['SUB_CHANNEL_NO'] = $main_order['sub_channel_no'];//下级渠道订单号
  632. $result['MAIN_CORP_ID'] = $main_order['main_corp_id'];//订单所属运营主体
  633. $result['SOURCE_MAIN_CORP_ID'] = $main_order['source_main_corp_id'];//线路所属运营主体
  634. $result['SALE_PATH'] = $main_order['sale_path'];//销售路径
  635. $result['AGENT_LEVEL'] = $main_order['agent_level'];//售卖层级:终端1,上一级2,再上一级3
  636. $result['BASE_PRICE'] = $main_order['base_price']; //成本价
  637. $result['PRINCIPAL_ID'] = $main_order['principal_id']; //运营负责人
  638. $final[] = $result;
  639. $son_order_id++;
  640. //2,☆☆☆ 如果是代售,插入代售的相关子订单 ☆☆☆
  641. if ($main_order['is_agent'] == 1) {
  642. $agent_list = $main_order['agent_list'];
  643. unset($agent_list[1]);//去掉销售层级1的主订单,前面已插入
  644. foreach ($agent_list as $ak => $av) {
  645. $result_new = $this->order_main_base;
  646. #endregion
  647. //1,终端主订单号数组(agent_level_1的主订单)
  648. $result_new['ID'] = $son_order_id;//订单号
  649. $result_new ['MAIN_CREATE_USER_ID'] = 2;//代售非终端下单用户为 2-系统自动
  650. $result_new ['CREATE_USER_ID'] = 2;//代售非终端下单用户为 2-系统自动
  651. $result_new['ORDER_ID'] = $son_order_id;//订单号
  652. $result_new['ORDER_PAY_MAIN_ID'] = $main_order_id;//主支付记录id (agent_level 为2或3的代售订单,无单独的pay_main记录,使用终端订单的order_pay_main_id)
  653. $result_new['PARENT_ORDER_ID'] = $av['order_id'];//父订单id
  654. $result_new['PROD_ID'] = $main_order['ticket_id'];//子产品id
  655. $result_new['PROD_NAME'] = $main_order['ticket_name'];//子产品名称
  656. $result_new['PARENT_PROD_ID'] = $main_order['line_id'];//父产品id
  657. $result_new['PARENT_PROD_NAME'] = $main_order['line_name'];//父产品名称
  658. $result_new['ORDER_PRICE'] = $av['price'];//订单价格
  659. $result_new['ORDER_PROD_TYPE'] = 82;//订单类型
  660. $result_new['RUN_BUS_ORDER_ID'] = $seat_info['bus_order_id'];//车号
  661. $result_new['RUN_BUS_SEAT_TYPE'] = $seat_info['seat_type'];//座位类型
  662. $result_new['RUN_BUS_SEAT_SEQ_ID'] = $seat_info['seat_seq_id'];//座位内部序列ID
  663. $result_new['RUN_BUS_SEAT_NAME'] = $seat_info['seat_name'];//座位名称
  664. $result_new['RUN_ID'] = $main_order['run_id'];//班次
  665. $result_new['RUN_DATE'] = $main_order['run_date'];//出行日期
  666. $result_new['RUN_DATE_NUM'] = (strtotime($main_order['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);//班次首发日期参数,发车日期至2016-01-01天数,算法使用,
  667. $result_new['RUN_TIME'] = $main_order['run_time'];//出行日期
  668. $result_new['PROD_START_STATION_RES_ID'] = $main_order['start_res_id'];//上车站id
  669. $result_new['PROD_START_STATION_RES_NAME'] = $main_order['start_res_name'];//上车站名称
  670. $result_new['PROD_START_STATION_CHECKPORT_RES_ID'] = $main_order['checkport_res_id'];//上车站检票口资源ID
  671. $result_new['PROD_START_STATION_CHECKPORT_RES_NAME'] = empty($main_order['checkport_res_name']) ? '' : $main_order['checkport_res_name'];//上车站检票口资源名称
  672. $result_new['PROD_START_STATION_SEQ_ID'] = $main_order['start_seq_id'];//上车站点顺序号
  673. $result_new['PROD_START_STATION_DATE'] = $main_order['run_date'];//上车站点上车日期
  674. $result_new['PROD_START_STATION_DATE_NUM'] = (strtotime($main_order['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);//上车站距2016-01-01天数
  675. $result_new['PROD_START_STATION_TIME'] = $main_order['start_time'];//上车站上车时间
  676. $result_new['PROD_START_STATION_TIME_MINUTES'] = $main_order['start_minutes'];//上车站点分钟数
  677. $result_new['PROD_START_STATION_AREA_ID'] = $main_order['start_area_id'];//出发地id
  678. $result_new['PROD_START_STATION_AREA_NAME'] = $main_order['start_area_name'];//出发地名称
  679. $result_new['PROD_END_STATION_RES_ID'] = $main_order['end_res_id'];//下车站id
  680. $result_new['PROD_END_STATION_RES_NAME'] = $main_order['end_res_name'];//下车站名称
  681. $result_new['PROD_END_STATION_SEQ_ID'] = $main_order['end_seq_id'];//下车站点顺序号
  682. $result_new['PROD_END_STATION_DATE'] = $main_order['run_date'];//下车站点下车日期
  683. $result_new['PROD_END_STATION_DATE_NUM'] = (strtotime($main_order['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);//下车站距2016-01-01天数
  684. $result_new['PROD_END_STATION_TIME'] = $main_order['end_time'];//下车站下车时间
  685. $result_new['PROD_END_STATION_TIME_MINUTES'] = $main_order['end_minutes'];//下车站点分钟数
  686. $result_new['PROD_END_STATION_AREA_ID'] = $main_order['end_area_id'];//目的地id
  687. $result_new['PROD_END_STATION_AREA_NAME'] = $main_order['end_area_name'];//目的地名称
  688. $result_new['OUTSIDE_SALE_ORG_ID'] = $av['outside_sale_org_id'];//渠道商ID
  689. $result_new['OUTSIDE_ORDER_NO'] = $av['outside_order_no'];//渠道订单号
  690. $result_new['SALES_MAN'] = $av['sales_man'];//业务员
  691. $result_new['PROD_TOP_ORG_ID'] = $av['prod_top_org_id'];//供应商ID
  692. $result_new['PROD_SUPPLY_ORG_NAME'] = $av['prod_supply_org_name'];//供应商名字
  693. $result_new['SUB_CHANNEL_ID'] = $av['sub_channel_id'];//下级渠道id
  694. $result_new['SUB_CHANNEL_NO'] = $av['sub_channel_no'];//下级渠道订单号
  695. $result_new['MAIN_CORP_ID'] = $av['main_corp_id'];//订单所属运营主体
  696. $result_new['SOURCE_MAIN_CORP_ID'] = $av['source_main_corp_id'];//线路所属运营主体
  697. $result_new['SALE_PATH'] = $av['sale_path'];//销售路径
  698. $result_new['AGENT_LEVEL'] = $av['agent_level'];//售卖层级:终端1,上一级2,再上一级3
  699. $result_new['BASE_PRICE'] = $av['base_price']; //成本价
  700. $result_new ['PRINCIPAL_ID'] = isset($av['principal_id']) ? $av['principal_id'] : 0; //运营负责人
  701. $result_new ['ORDER_TITLE_ID'] = 0;//组合产品代售非终端订单此值为0
  702. $son_order_id++;
  703. $final[] = $result_new;
  704. }
  705. }
  706. return $final;
  707. }
  708. /**
  709. * Function Description:获取run_x要更新的数据
  710. * Function Name: getRunXInfo
  711. * @param array $order_main 订单信息
  712. * @param array $seat_arr 座位信息
  713. *
  714. * @return array
  715. *
  716. * @author 张帅
  717. */
  718. public function getRunXInfo($order_main, $seat_arr)
  719. {
  720. $result = [];
  721. $result['run_date'] = $order_main['RUN_DATE'];
  722. $result['order_main_id'] = $order_main['ORDER_ID'];//订单号
  723. $result['order_main_prod_id'] = $order_main['PARENT_PROD_ID'];//线路id
  724. $result['order_prod_id'] = $order_main['PROD_ID'];//票种id
  725. $result['seat_status'] = 2;//座位状态
  726. $result['order_lock_user_id'] = $order_main['CREATE_USER_ID'];
  727. $result['order_lock_time'] = $order_main['CREATE_TIME'];
  728. $result['run_x_id'] = $seat_arr['id_arr'];
  729. return $result;
  730. }
  731. /**
  732. * Function Description:获取run_bus要更新的数据
  733. * Function Name: getRunBusInfo
  734. * @param array $run_bus_arr run_bus要更新的数据
  735. * @param int $run_id 班次id
  736. * @param int $bus_order_id 车号
  737. *
  738. * @return mixed
  739. *
  740. * @author 张帅
  741. */
  742. public function getRunBusInfo($run_bus_arr, $run_id, $bus_order_id)
  743. {
  744. if (!isset($run_bus_arr[$run_id . '-' . $bus_order_id])) {
  745. $run_bus_one = [];
  746. $run_bus_one['run_id'] = $run_id;//班次id
  747. $run_bus_one['bus_order_id'] = $bus_order_id;//班次id
  748. $run_bus_one['update_user_id'] = $this->user_id;//更新用户id
  749. $run_bus_one['update_time'] = $this->create_time;//更新时间
  750. $run_bus_one['num'] = 1;//人数
  751. $run_bus_arr[$run_id . '-' . $bus_order_id] = $run_bus_one;//run_bus数据
  752. } else {
  753. $run_bus_arr[$run_id . '-' . $bus_order_id]['num']++;//增加人数
  754. }
  755. return $run_bus_arr;
  756. }
  757. /**
  758. * Function Description:获取run_prod要更新的数据
  759. * Function Name: getRunProdInfo
  760. * @param array $run_prod_arr run_prod要更新的数据
  761. * @param int $run_id 班次id
  762. * @param int $ticket_id 票种id
  763. * @param int $prod_num 人数
  764. *
  765. * @return mixed
  766. *
  767. * @author 张帅
  768. */
  769. public function getRunProdInfo($run_prod_arr, $run_id, $ticket_id, $prod_num)
  770. {
  771. if (!isset($run_prod_arr[$run_id . '-' . $ticket_id])) {
  772. $run_prod = [];
  773. $run_prod['run_id'] = $run_id;//班次id
  774. $run_prod['ticket_id'] = $ticket_id;//班次id
  775. $run_prod['update_user_id'] = $this->user_id;//更新用户id
  776. $run_prod['update_time'] = $this->create_time;//更新时间
  777. $run_prod['num'] = $prod_num;//人数
  778. $run_prod_arr[$run_id . '-' . $ticket_id] = $run_prod;//run_prod数据
  779. } else {
  780. $run_prod_arr[$run_id . '-' . $ticket_id]['num'] += $prod_num;//增加人数
  781. }
  782. return $run_prod_arr;
  783. }
  784. /**
  785. * Function Description:获取run_stock要更新的数据
  786. * Function Name: getRunStockInfo
  787. * @param array $run_stock_arr run_stock要更新的数据
  788. * @param int $run_id 班次id
  789. * @param int $seq_id 站点顺序号id
  790. * @param int $seat_type 座位类型
  791. * @param int $prod_num 人数
  792. *
  793. * @return mixed
  794. *
  795. * @author 张帅
  796. */
  797. public function getRunStockInfo($run_stock_arr, $run_id, $seq_id, $seat_type, $prod_num)
  798. {
  799. if (!isset($run_stock_arr[$run_id . '-' . $seq_id . '-' . $seat_type])) {
  800. $run_stock = [];
  801. $run_stock['run_id'] = $run_id;//班次id
  802. $run_stock['seq_id'] = $seq_id;//站点顺序号id
  803. $run_stock['seat_type'] = $seat_type;//座位类型
  804. $run_stock['update_user_id'] = $this->user_id;//更新用户id
  805. $run_stock['update_time'] = $this->create_time;//更新时间
  806. $run_stock['num'] = $prod_num;//人数
  807. $run_stock_arr[$run_id . '-' . $seq_id . '-' . $seat_type] = $run_stock;//run_stock数据
  808. } else {
  809. $run_stock_arr[$run_id . '-' . $seq_id . '-' . $seat_type]['num'] += $prod_num;//增加人数
  810. }
  811. return $run_stock_arr;
  812. }
  813. /**
  814. * Function Description:获取主支付记录数据
  815. * Function Name: getPayMainInfo
  816. * @param int $pay_main_id 支付id
  817. * @param int $order_id 订单id
  818. * @param double $total_price 总价
  819. *
  820. * @return mixed
  821. *
  822. * @author 张帅
  823. */
  824. public function getPayMainInfo($pay_main_id, $order_id, $total_price)
  825. {
  826. #region 获取主支付记录配置
  827. $result = $this->pay_main_base;
  828. #endregion
  829. $result['ID'] = $pay_main_id;//支付id
  830. $result['PAY_TOTAL'] = $total_price;//订单id
  831. $result['ORDER_ID'] = $order_id;//总价
  832. return $result;
  833. }
  834. /**
  835. * Function Description:获取支付明细数据
  836. * Function Name: getPayDetailInfo
  837. * @param int $pay_main_id 支付id
  838. * @param double $total_price 总价
  839. *
  840. * @return mixed
  841. *
  842. * @author 张帅
  843. */
  844. public function getPayDetailInfo($pay_main_id, $total_price)
  845. {
  846. #region 获取支付明细配置
  847. $result = $this->pay_detail_base;
  848. #endregion
  849. $result['ID'] = $pay_main_id;//支付id
  850. $result['PAY_MAIN_ID'] = $pay_main_id;//订单id
  851. $result['PAY_MONEY'] = $total_price;//总价
  852. return $result;
  853. }
  854. }