Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

3 lat temu
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Steven
  5. * Date: 2016/8/30
  6. * Time: 14:17
  7. * 根据订单信息分配车辆创建订单
  8. */
  9. require_once __DIR__ . '/common.php';
  10. class createOrder extends virtifyUsers
  11. {
  12. /**
  13. * @param $mem memcache对象
  14. * @param $orderService orderService对象
  15. * @param $runID runID
  16. * @param $res 车调度结果
  17. * @param $bus_order_num 人数
  18. * @param $prodID prodID
  19. */
  20. function calShortTime($prodID, $runID, $orderID, $num, $beginX_Y, $begin_name, $endX_Y, $end_name, $run_date)
  21. {
  22. $mem = new Memcache();
  23. $mem->connect('127.0.0.1', 11211);
  24. $PoolStatus = $mem->get("orderPoolStatus[$runID]"); //添加runid标记是为了区别是哪个时间的班次
  25. $unlock_orderlist = $mem->get("orderList[$runID]"); //拿到当前的未锁定的订单池进行进一步操作
  26. $orderService = new createOrderService();
  27. if ($PoolStatus) //存在订单状态池
  28. {
  29. foreach ($PoolStatus as $k => $v) {
  30. if (isset($v['status']) && $v['status'] == 1) { //还有未锁定的订单池
  31. $orderService->stock($runID);
  32. $value = $unlock_orderlist[$k];
  33. $pool_passager_num = $orderService->poolNum($value); //计算该订单池中总共的乘客数
  34. if (!$value || $pool_passager_num + $num > 6) { //说明该订单池不能加入该订单
  35. continue;
  36. }
  37. $begin_x_y = $orderService->timeMatrix($value, $beginX_Y, 1); //获取所有起点时间矩阵
  38. $end_x_y = $orderService->timeMatrix($value, $endX_Y, 2); //获取所有终点时间矩阵
  39. $new_order = array("order_id" => $orderID, "num" => $num, "startx_y" => $beginX_Y, "endx_y" => $endX_Y, "begin_name" => $begin_name, "end_name" => $end_name);
  40. $da = new dispatch_algorithm();
  41. $res = $da->dispatch($prodID, $value, $new_order, $begin_x_y, $end_x_y, $run_date, $should_be_count = true);//调用调配订单算法
  42. if (!$res) {
  43. continue;
  44. }
  45. $order = array('order_id' => $orderID, 'num' => $num, 'startx_y' => $beginX_Y, 'endx_y' => $endX_Y, "begin_name" => $begin_name, "end_name" => $end_name);
  46. array_push($unlock_orderlist[$k], $order);
  47. $mem->set("orderList[$runID]", $unlock_orderlist); //加入订单池
  48. //如果该订单池满6个人之后,就要将这个订单池的状态置为锁定
  49. if ($pool_passager_num + $num == 6) {
  50. $PoolStatus[$k]['status'] = 0;
  51. $mem->set("orderPoolStatus[$runID]", $PoolStatus); //加入状态
  52. //更改该订单池在状态池中的状态
  53. }
  54. //TODO:将订单信息存入数据库中
  55. $orderService->makeOrder($mem, $runID, $res, $k, $prodID);
  56. //更新order_main中该车的里面的其他订单的上车时间和下车时间
  57. $start_end_time = array();
  58. foreach ($res as $id => $arr) {
  59. if (!isset($start_end_time[$arr['order_id']])) {
  60. $start_end_time[$arr['order_id']] = array();
  61. $start_end_time[$arr['order_id']]["start_time"] = $arr['time'];
  62. } else {
  63. $start_end_time[$arr['order_id']]["end_time"] = $arr['time'];
  64. $orderService->update_order_time($arr['order_id'], $start_end_time[$arr['order_id']]["start_time"], $arr['time']);
  65. }
  66. }
  67. $arr_result['order_id'] = $orderID;
  68. $arr_result['bus_no'] = $k;
  69. $order_time = array();
  70. foreach ($res as $num => $order) {
  71. if ($order["order_id"] == $orderID) {
  72. $order_time[] = $order['time'];
  73. }
  74. }
  75. $arr_result['start_time'] = $order_time[0];
  76. $arr_result['end_time'] = $order_time[1];
  77. $data['code'] = '0';
  78. $data['info'] = "配车成功,该订单已加入{$k}号车";
  79. $data['result'] = $arr_result;
  80. return $data;
  81. }
  82. }
  83. //如果该订单均不能符合当前存在的任意订单池,继续派车
  84. $stock = $orderService->stock($runID);
  85. if ($stock['bus_num'] < 1) {
  86. $data['code'] = '101';
  87. $data['info'] = '当前班次无可派车辆';
  88. return $data;
  89. }
  90. //$stock['next_blank_car'] 车ID
  91. $unlock_orderlist[$stock['next_blank_car']][] = array('order_id' => $orderID, 'num' => $num, 'startx_y' => $beginX_Y, 'endx_y' => $endX_Y, "begin_name" => $begin_name, "end_name" => $end_name); //通过orderID标记不同的订单池
  92. $mem->set("orderList[$runID]", $unlock_orderlist); //加入订单池
  93. //初始化该订单池,状态值:0:已锁定;1:未锁定
  94. $PoolStatus[$stock['next_blank_car']] = array('status' => 1);
  95. $mem->set("orderPoolStatus[{$runID}]", $PoolStatus);
  96. //如果该订单池人数满6,状态池置为锁定
  97. if ($num >= 6) {
  98. $PoolStatus[$stock['next_blank_car']]['status'] = 0;
  99. $mem->set("orderPoolStatus[$runID]", $PoolStatus); //加入状态
  100. //更改该订单池在状态池中的状态
  101. }
  102. //TODO:将订单信息存入数据库中
  103. $order_res = $orderService->firstOrderTime($orderID, $beginX_Y, $endX_Y, $run_date);
  104. $orderService->makeOrder($mem, $runID, $order_res, $stock['next_blank_car'], $prodID);
  105. $result['code'] = 0;
  106. $result['info'] = "该订单不能与有订单的车辆匹配,加入{$stock['next_blank_car']}成功";
  107. $res_arr['order_id'] = $orderID;
  108. $res_arr['bus_no'] = $stock['next_blank_car'];
  109. $res_arr['start_time'] = $order_res[0]['time'];
  110. $res_arr['end_time'] = $order_res[1]['time'];
  111. $result['result'] = $res_arr;
  112. return $result;
  113. } else { //不存在当前班次的订单池,直接创建新的订单池以及订单状态池
  114. //这里还需要进行判断有没有可以派的车(即有没有超出规定车辆数量的限制) 需要从数据库读取当前
  115. $stock = $orderService->stock($runID);
  116. if ($stock['bus_num'] < 1) {
  117. $data['code'] = '101';
  118. $data['info'] = '当前班次无可派车辆(当前班次的第一个订单)';
  119. return $data;
  120. }
  121. //初始化该订单状态池,状态值:0:已锁定;1:未锁定
  122. $PoolStatus[$stock['next_blank_car']] = array('status' => 1);
  123. $mem->set("orderPoolStatus[$runID]", $PoolStatus);
  124. $orderList[$stock['next_blank_car']][] = array('order_id' => $orderID, 'num' => $num, 'startx_y' => $beginX_Y, 'endx_y' => $endX_Y, "begin_name" => $begin_name, "end_name" => $end_name); //通过orderID标记不同的订单池
  125. $mem->set("orderList[$runID]", $orderList); //加入订单池
  126. //如果该订单池人数满6,状态池置为锁定
  127. if ($num >= 6) {
  128. $PoolStatus[$stock['next_blank_car']]['status'] = 0;
  129. $mem->set("orderPoolStatus[$runID]", $PoolStatus); //加入状态
  130. //更改该订单池在状态池中的状态
  131. }
  132. //TODO:将订单信息存入数据库中
  133. $order_res = $orderService->firstOrderTime($orderID, $beginX_Y, $endX_Y, $run_date);
  134. $orderService->makeOrder($mem, $runID, $order_res, $stock['next_blank_car'], $prodID);
  135. $result['code'] = 0;
  136. $result['info'] = "当前班次的第一个订单";
  137. $res_arr['order_id'] = $orderID;
  138. $res_arr['bus_no'] = $stock['next_blank_car'];
  139. $res_arr['start_time'] = $order_res[0]['time'];
  140. $res_arr['end_time'] = $order_res[1]['time'];
  141. $result['result'] = $res_arr;
  142. return $result;
  143. }
  144. }
  145. }