You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1477 lines
67 KiB

  1. <?php
  2. /**
  3. *
  4. * ============================================================================
  5. * * 版权所有 蜘蛛出行 * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * Author By: 温依莅
  12. * PhpStorm ModifyBusOrder.php
  13. * Create By 2017/5/17 10:50 $
  14. */
  15. namespace backend\modules\api\logic;
  16. use yii\db\Query;
  17. use backend\modules\api\models\OperaTickets;
  18. use backend\modules\api\models\OrderMain;
  19. use backend\modules\api\models\RunMain;
  20. use backend\modules\api\models\RunProd;
  21. use backend\modules\api\models\BaseSupplier;
  22. use backend\modules\api\models\OperaLine;
  23. use backend\modules\api\models\RunStation;
  24. use backend\modules\api\models\BaseUniqueId2;
  25. use backend\modules\api\models\RunBus;
  26. use backend\modules\api\models\RunStock;
  27. use backend\modules\api\models\OrderPayMain;
  28. use backend\modules\api\models\OrderPayDetail;
  29. use backend\modules\api\models\OrderOperaLog;
  30. use backend\modules\api\models\OrderExtraInfo;
  31. use backend\modules\api\models\BaseResource;
  32. use backend\modules\api\models\BaseArea;
  33. use backend\modules\api\models\DictType;
  34. use backend\modules\api\models\BaseUser;
  35. use common\models\Msg;
  36. use common\models\Utils;
  37. use yii\base\Exception;
  38. use yii\db\Expression;
  39. use Yii;
  40. /**
  41. * Class ModifyBusOrder 巴士产品修改类
  42. * @package backend\modules\api\logic
  43. */
  44. class ModifyBusOrder extends Query
  45. {
  46. /**
  47. * Function Description:单巴士修改订单主接口
  48. * Function Name: modifyBusHub
  49. * @param int $para_order_id 订单号
  50. * @param array $para_prod_arr 巴士产品修改信息json: eg {"to_go":1,"run_id":"907812","prod_id":"453300","order_price":"33.94","bus_people_num":3,"bus_order_id":0}
  51. * @param array $para_order_info_arr 巴士订单信息json: eg {"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":"业务员"}
  52. * @param array $para_customer_info_arr 顾客信息json: eg {"customer_name":"测试员","customer_phone":"15753206507","customer_id_type":"150","customer_id_no":"","customer_remark":""}
  53. * @param array $para_order_append_arr 附加信息json: eg 门票价格,酒店价格{'gate_price':0,'hotel_price':0}
  54. * @param array $para_receiver_value_arr 代收价格json: eg 代售单价,代售总价{'sin_rec_value' : 0, 'total_rec_value' : 0}
  55. *
  56. * @return mixed
  57. *
  58. * @author 温依莅
  59. */
  60. public function modifyBusHub($para_order_id, $para_prod_arr, $para_order_info_arr, $para_customer_info_arr, $para_order_append_arr, $para_receiver_value_arr)
  61. {
  62. //【〇】参数转换
  63. $order_id = $para_order_id; // 需要修改的订单id
  64. $prod_arr = $para_prod_arr; // 购买票种列表 格式为{去程/返程标志(1:去程 2:返程),去程/返程班次ID,票种ID,票种单价,预定数量,车号}...{"to_go":1,"run_id":"907812","prod_id":"453300","order_price":"33.94","bus_people_num":3,"bus_order_id":0}
  65. $order_info_arr = $para_order_info_arr; // 订单信息 {下单用户,会员号,渠道id,渠道订单号,是否自动退票(0否1是),支付方式(授信275),是否支付(0否1是),业务员}{"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":"业务员"}
  66. $customer_info_arr = $para_customer_info_arr; //联系人信息,格式为{联系人,联系电话,z证件类型,联系人身份证,备注}{"customer_name":"测试员","customer_phone":"15753206507","customer_id_type":"150","customer_id_no":"","customer_remark":""}
  67. $order_append_arr = $para_order_append_arr; // 订单附加 ,格式为{门票价格,酒店价格}{'gate_price':0,'hotel_price':0}
  68. $receiver_value_arr = $para_receiver_value_arr; // 代收,格式为{代收单价,代收总价}{'sin_rec_value' : 0, 'total_rec_value' : 0}
  69. $is_send_msg = 0; // 是否发短信(0否1是) 默认0
  70. //$user_id = Yii::$app->request->cookies->getValue('user_id', 2);//修改订单用户id 默认2
  71. //获取订单配置信息,获取传递的user_id
  72. $order_info_arr = $this->getOrderInfoArray($order_info_arr);
  73. $user_id = $order_info_arr['user_id'];
  74. //获取原订单相关信息
  75. $ori_order_info = $this->getOrderModifyInfo($order_id);
  76. $transaction = Yii::$app->db->beginTransaction();//开始事务
  77. //【一】,释放原order_id所占用的资源
  78. $res = $this->emptyBusOrder($order_id, $user_id);
  79. if ($res['code'] != '0') {
  80. $transaction->rollBack();
  81. $result['code'] = '1';
  82. $result['info'] = '释放原订单所占资源失败';
  83. $result['error_info'] = $res['info'];
  84. return $result;
  85. }
  86. //【二】, 根据参数修改订单
  87. $prod_arr = $this->getBusProductList($prod_arr);
  88. if (count($prod_arr) == 0) {
  89. $transaction->rollBack();
  90. $result['code'] = '1';
  91. $result['info'] = '没有选购产品';
  92. return $result;
  93. }
  94. // 1,获取原订单相关信息
  95. // 2.获取订单配置数据
  96. // 3.获取乘客信息
  97. $customer_info_arr = $this->getCustomerInfoArray($customer_info_arr);
  98. // 4.获取附属产品
  99. $order_append_arr = $this->getOrderAppendArray($order_append_arr);
  100. // 5.获取产品的详细属性
  101. $run_ticket_arr = [];//班次票种数组
  102. foreach ($prod_arr as $key => $vel) {
  103. $run_ticket_one['run_id'] = $vel['run_id'];
  104. $run_ticket_one['ticket_id'] = $vel['ticket_id'];
  105. $run_ticket_arr[] = $run_ticket_one;
  106. }
  107. $prod_list = $this->getBusProductListByRunTicket($run_ticket_arr);
  108. #region 判断获取的产品和要下单的产品数量是否一致
  109. if (count($prod_arr) != count($prod_list)) {
  110. $transaction->rollBack();
  111. $result['code'] = '1';
  112. $result['info'] = '产品有误';
  113. return $result;
  114. }
  115. #region 6.判断价格
  116. #endregion
  117. // 7.检查run_x中是否有班次是否存在
  118. $date_run_arr = [];//日期-班次数组
  119. foreach ($prod_list as $key => $vel) {
  120. $vel_run_date = substr($vel['run_date'], 0, 7);
  121. $vel_run_date = str_replace('-', '', $vel_run_date);
  122. $date_run_arr[$vel_run_date][] = $vel['run_id'];
  123. }
  124. $check_run_result = $this->checkRunX($date_run_arr);
  125. if (!$check_run_result) {
  126. $transaction->rollBack();
  127. $result['code'] = '1';
  128. $result['info'] = '没有班次';
  129. return $result;
  130. }
  131. // 8.获取每个班次的可订座位量
  132. $run_bus_arr = [];
  133. foreach ($prod_list as $key => $vel) {
  134. $run_one['run_id'] = $vel['run_id'];//班次id
  135. $run_one['run_date'] = substr($vel['run_date'], 0, 7);//班次日期
  136. $run_one['run_date'] = str_replace('-', '', $run_one['run_date']);//班次日期
  137. $run_one['seat_type'] = $vel['seat_type'];//座位类型
  138. $run_one['start_seq_id'] = $vel['start_seq_id'];//开始站顺序号
  139. $run_one['end_seq_id'] = $vel['end_seq_id'];//结束站顺序号
  140. $run_one['seat_count'] = $run_one['end_seq_id'] - $run_one['start_seq_id'];//途径个数
  141. $run_one['ticket_id'] = $vel['ticket_id'];
  142. $run_one['num'] = $prod_arr[$vel['ticket_id']]['num'];
  143. $run_one['bus_order_id'] = $prod_arr[$vel['ticket_id']]['bus_order_id'];
  144. $run_bus_arr[] = $run_one;
  145. }
  146. $run_bus_seat = $this->getRunBusSeat($run_bus_arr);
  147. #检查库存
  148. if (!$run_bus_seat) {
  149. $transaction->rollBack();
  150. $result['code'] = '1';
  151. $result['info'] = '库存不足';
  152. return $result;
  153. }
  154. // 9.连坐优先分配座位
  155. $seat_arr = $this->getSeatArray($run_bus_seat, $prod_arr);
  156. // 10.获取代收价
  157. $prod_list = $this->getBusProductListReceiver($prod_list, $receiver_value_arr, $prod_arr);
  158. // 11.修改巴士订单
  159. $final_res = $this->modifyBusOrder($prod_list, $seat_arr, $order_info_arr, $customer_info_arr, $order_append_arr, $is_send_msg, $ori_order_info);
  160. if ($final_res['code'] != '0') {
  161. $transaction->rollBack();
  162. $result['code'] = '1';
  163. $result['info'] = '订单修改失败';
  164. $result['error_info'] = $final_res['info'];
  165. return $result;
  166. }
  167. //12.供应商渠道商先把已扣款的钱退回去
  168. $submit_order=new SubmitOrder();
  169. $submit_order->SupplierBalance($order_id,2,'巴士订单,修改先取消');
  170. $transaction->commit();
  171. $submit_order->SupplierBalance($order_id,2,'巴士订单,修改后新增');
  172. //$transaction->rollBack();
  173. $result['code'] = '0';
  174. $result['info'] = '订单修改成功';
  175. $result['data'] = $final_res['data'];
  176. return $result;
  177. }
  178. /**
  179. * Function Description:释放单一线路订单所占资源
  180. * Function Name: emptySingleBusOrder
  181. * @param array $order_id_arr 订单号
  182. * @param array $order_run_info 订单班次信息
  183. * @param int $user_id 操作用户
  184. * @param string $cancel_reason 退票原因
  185. *
  186. * @return mixed
  187. *
  188. * @author 张帅
  189. */
  190. public
  191. function emptySingleBusOrder($order_id_arr, $order_run_info, $user_id, $cancel_reason = '组合产品修改')
  192. {
  193. //$transaction = Yii::$app->db->beginTransaction();
  194. try {
  195. #region 1.更新主订单信息
  196. $update_value = [
  197. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  198. 'ORDER_STATUS' => 148,
  199. 'ORDER_VALID_STATUS' => 0,
  200. 'ORDER_DISABLE_USER_ID' => $user_id,
  201. 'ORDER_DISABLE_TIME' => date('Y-m-d H:i:s'),
  202. ];
  203. $update_where = [
  204. 'in', 'order_id', $order_id_arr
  205. ];
  206. $res = OrderMain::updateAll($update_value, $update_where);
  207. if (!$res) {
  208. throw new Exception('更新主订单信息失败');
  209. }
  210. #endregion
  211. #region 1.更新子订单信息
  212. $update_value = [
  213. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  214. 'ORDER_STATUS' => 148,
  215. 'ORDER_VALID_STATUS' => 0,
  216. 'CANCEL_FLAG' => 1,
  217. 'ORDER_DISABLE_USER_ID' => $user_id,
  218. 'ORDER_DISABLE_TIME' => date('Y-m-d H:i:s'),
  219. ];
  220. $update_where = [
  221. 'in', 'parent_order_id', $order_id_arr
  222. ];
  223. $res = OrderMain::updateAll($update_value, $update_where);
  224. if (!$res) {
  225. throw new Exception('更新子订单信息失败');
  226. }
  227. #endregion
  228. #region 2.更新run_x
  229. foreach ($order_run_info as $key => $vel) {
  230. $run_x_date = substr($vel['run_date'], 0, 7);
  231. $run_x_date = str_replace('-', '', $run_x_date);
  232. $update_sql = 'update run_' . $run_x_date . '
  233. set order_main_id = 0,
  234. order_main_prod_id = 0,
  235. order_prod_id = 0,
  236. seat_status = 0,
  237. order_lock_user_id = 0,
  238. order_lock_time = \'' . date('Y-m-d H:i:s') . '\'
  239. where run_id = ' . $vel['run_id'] . '
  240. and order_main_id in (' . $vel['order_id'] . ')';
  241. $res = Yii::$app->db->createCommand($update_sql)->execute();
  242. if (!$res) {
  243. throw new Exception('更新run_x失败');
  244. }
  245. }
  246. #endregion
  247. #region 3.更新run_prod,run_bus,run_stock
  248. foreach ($order_run_info as $key => $vel) {
  249. #region (1).更新run_prod
  250. $update_value = [
  251. 'UPDATE_USER_ID' => $user_id,
  252. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  253. 'SALED_COUNT' => new Expression('SALED_COUNT-' . $vel['order_num']),
  254. ];
  255. $update_where = [
  256. 'and',
  257. ['=', 'run_id', $vel['run_id']],
  258. ['=', 'prod_id', $vel['ticket_id']],
  259. ['=', 'cancel_flag', 0],
  260. ];
  261. $res = RunProd::updateAll($update_value, $update_where);
  262. if (!$res) {
  263. throw new Exception('更新run_prod失败');
  264. }
  265. #endregion
  266. #region (2).更新run_bus
  267. $update_value = [
  268. 'UPDATE_USER_ID' => $user_id,
  269. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  270. 'SALED_COUNT' => new Expression('SALED_COUNT-' . $vel['order_num']),
  271. ];
  272. $update_where = [
  273. 'and',
  274. ['=', 'run_id', $vel['run_id']],
  275. ['=', 'bus_order_id', $vel['bus_order_id']],
  276. ['=', 'cancel_flag', 0],
  277. ];
  278. $res = RunBus::updateAll($update_value, $update_where);
  279. if (!$res) {
  280. throw new Exception('更新run_bus失败');
  281. }
  282. #endregion
  283. #region (3).更新run_stock
  284. $update_value = [
  285. 'UPDATE_USER_ID' => $user_id,
  286. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  287. 'SALED_COUNT' => new Expression('SALED_COUNT-' . $vel['order_num']),
  288. ];
  289. $update_where = [
  290. 'and',
  291. ['=', 'run_id', $vel['run_id']],
  292. ['>=', 'seq_id', $vel['start_seq_id']],
  293. ['<', 'seq_id', $vel['end_seq_id']],
  294. ['=', 'seat_type', $vel['seat_type']],
  295. ['=', 'cancel_flag', 0],
  296. ];
  297. $res = RunStock::updateAll($update_value, $update_where);
  298. if (!$res) {
  299. throw new Exception('更新run_stock失败');
  300. }
  301. #endregion
  302. }
  303. #endregion
  304. $result['code'] = '0';
  305. $result['info'] = '退票成功';
  306. $result['data'] = implode(',', $order_id_arr);
  307. } catch (Exception $e) {
  308. # 回滚事务
  309. $result['code'] = '1';
  310. $result['info'] = '退票失败';
  311. $result['error'] = $e->getMessage();
  312. }
  313. return $result;
  314. }
  315. /**
  316. * Function Description:修改巴士订单
  317. * Function Name: submitBusOrder
  318. * @param array $prod_list 产品列表
  319. * @param array $seat_arr 座位
  320. * @param array $order_info_arr 订单的其他信息
  321. * @param array $customer_info_arr 乘客
  322. * @param array $order_append_arr 附加产品
  323. * @param int $is_send_msg 是否发短信
  324. * @param array $ori_order_info 原订单信息
  325. *
  326. * @return mixed
  327. *
  328. * @author 张帅
  329. */
  330. public
  331. function modifyBusOrder($prod_list, $seat_arr, $order_info_arr, $customer_info_arr, $order_append_arr, $is_send_msg, $ori_order_info)
  332. {
  333. #region 获取最大唯一值,先赋给支付id,然后递增
  334. $base_main_id = BaseUniqueId2::find()->select('unique_id')->where(['id' => 1])->asArray()->one();
  335. //更新唯一键值
  336. #获取订单人数
  337. $people_num = count(current($seat_arr));
  338. $time=time().rand(0,999999);
  339. $res = BaseUniqueId2::updateAll(['UNIQUE_ID' => $base_main_id['unique_id'] + $people_num + 1,'UPDATE_TIME'=>$time], ['id' => 1]);
  340. if (!$res) {
  341. $result['code'] = '1';
  342. $result['info'] = 'baseUnique更新失败';
  343. return $result;
  344. }
  345. $pay_main_id = $ori_order_info['order_pay_main_id']; // 原订单 支付记录order_pay_main 的id 和 支付明细order_pay_detail 的pay_main_id
  346. $parent_order_id = $ori_order_info['order_id']; // 原主订单记录
  347. $order_status = $ori_order_info['order_status']; // 原订单状态
  348. #endregion
  349. #region 提交订单操作数据库所需数据
  350. $main_order = [];//主订单数据
  351. $main_order_key = [];//提交主订单时所需key值
  352. $son_order = [];//子订单数据
  353. $son_order_key = [];//提交子订单时所需key值
  354. $run_x_arr = [];//run_x
  355. $run_bus_prod_stock_arr = [];//run_bus,run_prod,run_stock更新数据
  356. $main_order_id = [];//订单id数组
  357. $pay_main_arr = [];//主支付记录数据
  358. $pay_main_key = [];//主支付记录键值
  359. $order_price = 0;
  360. $son_order_id = 0;
  361. #endregion
  362. #region 整理数据
  363. foreach ($prod_list as $key => $vel) {
  364. $run_x_one = [];//run_x_one
  365. $prod_list[$key]['order_id'] = $parent_order_id;//订单号
  366. #region 主订单数据
  367. $main_order_val = [
  368. //'ID' => $parent_order_id,
  369. //'MAIN_CREATE_USER_ID' => $order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  370. //'CREATE_USER_ID' => $order_info_arr['user_id'],
  371. //'CREATE_TIME' => date('Y-m-d H:i:s'),
  372. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  373. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  374. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  375. 'SALE_TOP_ORG_ID' => 0,//'下单组织机构所属一级机构ID',
  376. //'PROD_TOP_ORG_ID' => 0,//'产品所属一级机构ID',
  377. //'ORDER_ID' => $parent_order_id,
  378. 'ORDER_DESCRIPTION' => $vel['ticket_name'] . ',' . $vel['run_date'] . ',' . $vel['people_num'] . '|' . $vel['people_num'],//'最细颗粒度的订单描述',
  379. 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_sale_order_no'],//'分销商订单编号',
  380. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  381. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  382. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  383. 'ORDER_PAY_MAIN_ID' => $pay_main_id,//'支付记录主ID,ORDER_PAY_MAIN.ID',
  384. //'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
  385. //'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  386. 'PARENT_ORDER_ID' => 0,
  387. 'PARENT_PROD_ID' => $vel['line_id'],
  388. 'PARENT_PROD_NAME' => $vel['line_name'],
  389. 'ORDER_PRICE' => $vel['total_price'],//'订单价格',
  390. 'ORDER_PROD_TYPE' => 81,//'订单类型',
  391. 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],//'上车站检票口资源ID',
  392. 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],//'上车站检票口资源名称',
  393. 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],//'上车站发车时间距发车日零点分钟数',
  394. 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],//'下车站发车时间距发车日零点分钟数',
  395. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  396. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  397. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  398. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  399. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  400. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  401. 'MEMBER_ID' => $order_info_arr['member_id'],
  402. 'ORDER_STATUS' => $order_status,//'订单当前状态',
  403. 'IF_LAST_PROD' => 1,//'是否最细颗粒度的判断',
  404. 'ORDER_LEVEL' => 0,//'Order Level',
  405. 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],//
  406. 'SALES_MAN' => $order_info_arr['sales_man'],
  407. 'RECEIVE_VALUE' => $vel['total_receiver_value'],
  408. 'ORDER_DISABLE_TIME' => '',
  409. 'BASE_PRICE' => $ori_order_info['base_price'] * $vel['people_num'],
  410. ];
  411. #endregion
  412. $order_price += $vel['total_price'];
  413. #region 收集主订单的id
  414. if ($vel['if_back'] == 1) {
  415. $main_order_id[0] = $parent_order_id;//收集主订单的id
  416. } else {
  417. $main_order_id[1] = $parent_order_id;//收集主订单的id
  418. }
  419. #endregion
  420. #region 主订单key值
  421. if (count($main_order_key) == 0) {
  422. $main_order_key = array_keys($main_order_val);
  423. }
  424. #endregion
  425. $son_order_id = $base_main_id['unique_id'] + 1;//子订单id号
  426. #region 根据人数遍历每个子订单的个数
  427. foreach ($seat_arr[$vel['ticket_id']] as $seat_key => $seat_vel) {
  428. $son_order_id++;//子订单号递增
  429. #region 子订单数据
  430. $son_order_val = [
  431. 'ID' => $son_order_id,
  432. 'MAIN_CREATE_USER_ID' => $ori_order_info['main_create_user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  433. 'CREATE_USER_ID' => $ori_order_info['create_user_id'],
  434. 'CREATE_TIME' => $ori_order_info['create_time'],
  435. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  436. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  437. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  438. 'SALE_TOP_ORG_ID' => 0,
  439. 'ORDER_ID' => $son_order_id,
  440. 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_sale_order_no'],//'分销商订单编号',
  441. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  442. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  443. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  444. 'ORDER_PAY_MAIN_ID' => $pay_main_id,//'支付记录主ID,ORDER_PAY_MAIN.ID',
  445. 'ORDER_PAY_USER_ID' => $ori_order_info['create_user_id'],//'支付操作用户ID,BASE_USER.ID',
  446. 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  447. 'PARENT_ORDER_ID' => $parent_order_id,
  448. 'PROD_ID' => $vel['ticket_id'],
  449. 'PARENT_PROD_ID' => $vel['line_id'],
  450. 'PROD_NAME' => $vel['ticket_name'],
  451. 'PARENT_PROD_NAME' => $vel['line_name'],
  452. 'ORDER_PRICE' => $vel['order_price'],
  453. 'ORDER_PROD_TYPE' => 82,
  454. 'RUN_ID' => $vel['run_id'],
  455. 'RUN_DATE' => $vel['run_date'],
  456. 'RUN_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),//'班次首发日期参数,发车日期至2016-01-01天数,算法使用',
  457. 'RUN_TIME' => $vel['run_time'],
  458. 'RUN_BUS_ORDER_ID' => $seat_vel['bus_order_id'],//'班次车号,RUN_BUS.BUS_ORDER_ID',
  459. 'RUN_BUS_SEAT_TYPE' => $vel['seat_type'],//'座位类型,DICT_TYPE.ID,普通座、贵宾座等',
  460. 'RUN_BUS_SEAT_SEQ_ID' => $seat_vel['seat_seq_id'],//'座位内部序列ID',
  461. 'RUN_BUS_SEAT_NAME' => $seat_vel['seat_name'],
  462. 'PROD_START_STATION_RES_ID' => $vel['start_res_id'],
  463. 'PROD_START_STATION_RES_NAME' => $vel['start_res_name'],
  464. 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],
  465. 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],
  466. 'PROD_START_STATION_SEQ_ID' => $vel['start_seq_id'],
  467. 'PROD_START_STATION_DATE' => $vel['run_date'],
  468. 'PROD_START_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
  469. 'PROD_START_STATION_TIME' => $vel['start_time'],
  470. 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],
  471. 'PROD_START_STATION_AREA_ID' => $vel['start_area_id'],
  472. 'PROD_START_STATION_AREA_NAME' => $vel['start_area_name'],
  473. 'PROD_END_STATION_RES_ID' => $vel['end_res_id'],
  474. 'PROD_END_STATION_RES_NAME' => $vel['end_res_name'],
  475. 'PROD_END_STATION_SEQ_ID' => $vel['end_seq_id'],
  476. 'PROD_END_STATION_DATE' => $vel['run_date'],
  477. 'PROD_END_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
  478. 'PROD_END_STATION_TIME' => $vel['end_time'],
  479. 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],
  480. 'PROD_END_STATION_AREA_ID' => $vel['end_area_id'],
  481. 'PROD_END_STATION_AREA_NAME' => $vel['end_area_name'],
  482. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  483. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  484. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  485. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  486. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  487. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  488. 'MEMBER_ID' => $order_info_arr['member_id'],
  489. 'ORDER_STATUS' => $order_info_arr['order_status'],
  490. //'if_gift' => 0,//'是否是赠票,0不是赠票,1是赠票',
  491. 'ORDER_LEVEL' => 0,
  492. 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],
  493. 'SALES_MAN' => $order_info_arr['sales_man'],
  494. 'RECEIVE_VALUE' => $vel['receiver_value'],
  495. 'ORDER_TITLE_ID' => $ori_order_info['order_title_id'],
  496. 'SUB_CHANNEL_ID' => $ori_order_info['sub_channel_id'],
  497. 'SUB_CHANNEL_NO' => $ori_order_info['sub_channel_no'],
  498. 'MAIN_CORP_ID' => $ori_order_info['main_corp_id'],
  499. 'SALE_PATH' => $ori_order_info['sale_path'],
  500. 'AGENT_LEVEL' => $ori_order_info['agent_level'],
  501. 'SOURCE_MAIN_CORP_ID' => $ori_order_info['source_main_corp_id'],
  502. 'PROD_SUPPLY_ORG_NAME' => $ori_order_info['prod_supply_org_name'],
  503. 'PROD_TOP_ORG_ID' => $ori_order_info['prod_top_org_id'],
  504. 'BASE_PRICE' => $ori_order_info['base_price'],
  505. ];
  506. #endregion
  507. #region 子订单key值
  508. if (count($son_order_key) == 0) {
  509. $son_order_key = array_keys($son_order_val);
  510. }
  511. #endregion
  512. #region run_bus,run_prod,run_stock更新数据
  513. if (!isset($run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']])) {
  514. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['num'] = $vel['people_num'];//数量
  515. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['run_id'] = $vel['run_id'];//班次id
  516. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['bus_order_id'] = $seat_vel['bus_order_id'];//车次号
  517. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['ticket_id'] = $vel['ticket_id'];//票种id
  518. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['start_seq_id'] = $vel['start_seq_id'];//开始站顺序号
  519. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['end_seq_id'] = $vel['end_seq_id'];//结束站顺序号
  520. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['seat_type'] = $vel['seat_type'];//座位类型
  521. }
  522. #endregion
  523. #region 更新run_x配置数据
  524. $run_x_one[$seat_key]['run_x_id'] = $seat_vel['run_x_id'];
  525. $run_x_one[$seat_key]['run_date'] = substr($vel['run_date'], 0, 7);
  526. $run_x_one[$seat_key]['run_date'] = str_replace('-', '', $run_x_one[$seat_key]['run_date']);//run_x表的日期后缀
  527. $run_x_one[$seat_key]['order_main_id'] = $son_order_id;//主订单号
  528. $run_x_one[$seat_key]['order_main_prod_id'] = $vel['line_id'];//线路id
  529. $run_x_one[$seat_key]['order_prod_id'] = $vel['ticket_id'];//票种id
  530. #endregion
  531. #region 子订单数组
  532. $son_order[] = $son_order_val;
  533. #endregion
  534. }
  535. #endregion
  536. #region 更新run_x配置数据
  537. $run_x_arr[$key] = $run_x_one;
  538. #endregion
  539. //$parent_order_id = $son_order_id + 1;
  540. #region 主订单数组
  541. $main_order[] = $main_order_val;
  542. #endregion
  543. }
  544. #endregion
  545. $unique_id = $son_order_id;//唯一主键
  546. #region 主支付记录数据数组
  547. foreach ($main_order_id as $key => $vel) {
  548. #region 主支付记录
  549. $pay_main_one = [
  550. //'ID' => $pay_main_id,
  551. //'CREATE_USER_ID' => $order_info_arr['user_id'],
  552. //'CREATE_TIME' => date('Y-m-d H:i:s'),
  553. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  554. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  555. 'PAY_TOTAL' => $order_price,
  556. //'ORDER_ID' => $vel,
  557. ];
  558. #endregion
  559. $pay_main_arr[] = $pay_main_one;//主支付记录数组
  560. #region 主支付记录key值
  561. if (count($pay_main_key) == 0) {
  562. $pay_main_key = array_keys($pay_main_one);
  563. }
  564. #endregion
  565. }
  566. #endregion
  567. try {
  568. #region 1.占座 更新run_x表
  569. foreach ($run_x_arr as $run_x_key => $run_x_vel) {
  570. foreach ($run_x_vel as $key => $vel) {
  571. $update_sql = 'update run_' . $vel['run_date'] . '
  572. set order_main_id = ' . $vel['order_main_id'] . ',
  573. order_main_prod_id = ' . $vel['order_main_prod_id'] . ',
  574. order_prod_id = ' . $vel['order_prod_id'] . ',
  575. seat_status = 2,
  576. order_lock_user_id = ' . $order_info_arr['user_id'] . ',
  577. order_lock_time = \'' . date('Y-m-d H:i:s') . '\'
  578. where id in (' . $vel['run_x_id'] . ')';
  579. $res = Yii::$app->db->createCommand($update_sql)->execute();
  580. if (!$res) {
  581. throw new Exception('占位失败');
  582. }
  583. }
  584. }
  585. #endregion
  586. #region 2.更新主订单
  587. $order_main = new OrderMain();
  588. foreach ($main_order as $k => $v) {
  589. $update_where = [
  590. '=', 'order_id', $parent_order_id
  591. ];
  592. $res = $order_main::updateAll($v, $update_where);
  593. if (!$res) {
  594. throw new Exception('更新主订单失败' . serialize($order_main->getErrors()));
  595. }
  596. }
  597. #endregion
  598. #region 3.插入子订单
  599. $res = Yii::$app->db->createCommand()->batchInsert(OrderMain::tableName(), $son_order_key, $son_order)->execute();
  600. if (!$res) {
  601. throw new Exception('子订单提交失败');
  602. }
  603. #endregion
  604. #region 4.更新run_prod,run_bus,run_stock
  605. foreach ($run_bus_prod_stock_arr as $key => $vel) {
  606. #region (1).更新run_prod
  607. $update_value = [
  608. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  609. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  610. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  611. ];
  612. $update_where = [
  613. 'and',
  614. ['=', 'run_id', $vel['run_id']],
  615. ['=', 'prod_id', $vel['ticket_id']],
  616. ['=', 'cancel_flag', 0],
  617. ];
  618. $res = RunProd::updateAll($update_value, $update_where);
  619. if (!$res) {
  620. throw new Exception('更新run_prod失败');
  621. }
  622. #endregion
  623. #region (2).更新run_bus
  624. $update_value = [
  625. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  626. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  627. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  628. ];
  629. $update_where = [
  630. 'and',
  631. ['=', 'run_id', $vel['run_id']],
  632. ['=', 'bus_order_id', $vel['bus_order_id']],
  633. ['=', 'cancel_flag', 0],
  634. ];
  635. $res = RunBus::updateAll($update_value, $update_where);
  636. if (!$res) {
  637. throw new Exception('更新run_bus失败');
  638. }
  639. #endregion
  640. #region (3).更新run_stock
  641. $update_value = [
  642. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  643. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  644. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  645. ];
  646. $update_where = [
  647. 'and',
  648. ['=', 'run_id', $vel['run_id']],
  649. ['>=', 'seq_id', $vel['start_seq_id']],
  650. ['<', 'seq_id', $vel['end_seq_id']],
  651. ['=', 'seat_type', $vel['seat_type']],
  652. ['=', 'cancel_flag', 0],
  653. ];
  654. $res = RunStock::updateAll($update_value, $update_where);
  655. if (!$res) {
  656. throw new Exception('更新run_stock失败');
  657. }
  658. #endregion
  659. }
  660. #endregion
  661. #region 5.修改主支付记录
  662. foreach ($pay_main_arr as $k => $v) {
  663. $update_where = [
  664. 'and',
  665. //['=', 'id', $pay_main_id],
  666. ['=', 'order_id', $parent_order_id],
  667. ];
  668. $res = OrderPayMain::updateAll($v, $update_where);
  669. if (!$res) {
  670. throw new Exception('更新主支付记录失败');
  671. }
  672. }
  673. #endregion
  674. #region 6.修改支付明细
  675. $order_pay_detail = OrderPayDetail::findOne(['pay_main_id' => $pay_main_id]);
  676. if ($order_pay_detail) {
  677. $order_pay_detail->attributes = [
  678. //'ID' => $pay_main_id,
  679. //'CREATE_USER_ID' => $order_info_arr['user_id'],
  680. //'CREATE_TIME' => date('Y-m-d H:i:s'),
  681. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  682. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  683. //'PAY_MAIN_ID' => $pay_main_id,
  684. 'PAY_TYPE_ID_1' => $order_info_arr['pay_type'],
  685. 'PAY_MONEY' => $order_price,
  686. ];
  687. $res = $order_pay_detail->update();
  688. if (!$res) {
  689. throw new Exception('修改支付明细失败');
  690. }
  691. }
  692. #endregion
  693. #region 7 修改酒店门票价格
  694. $order_extra_info = new OrderExtraInfo();
  695. $is_exist = $order_extra_info::findOne(['order_id' => $main_order_id[0]]);
  696. if ($is_exist) {
  697. #判断值是否有变化,如果有则修改
  698. $res = 1;
  699. if ($ori_order_info['gate_price'] != $order_append_arr['gate_price'] || $ori_order_info['hotel_price'] != $order_append_arr['hotel_price']) {
  700. $is_exist->attributes = [
  701. 'hotel_price' => $order_append_arr['hotel_price'],
  702. 'gate_price' => $order_append_arr['gate_price'],
  703. ];
  704. $res = $is_exist->update();
  705. }
  706. } else {
  707. $order_extra_info->attributes = [
  708. 'order_id' => $main_order_id[0],
  709. 'hotel_price' => $order_append_arr['hotel_price'],
  710. 'gate_price' => $order_append_arr['gate_price'],
  711. ];
  712. $res = $order_extra_info->insert();
  713. }
  714. if (!$res) {
  715. throw new Exception('酒店门票价格修改失败' . serialize($is_exist->getErrors()) . '|' . serialize($order_extra_info->getErrors()));
  716. }
  717. #endregion
  718. #region 8.插入日志
  719. $new_order_info = $this->getOrderModifyInfo($ori_order_info['order_id']); //修改后的订单信息
  720. //8.1,插入订单修改记录表(需要对原数据和新数据做比对,仅记录修改过的联系人信息项)
  721. $opera_detail1 = '修改订单-修改联系人信息:';
  722. $opera_detail_extra = '';
  723. ($ori_order_info['customer_name'] != $new_order_info['customer_name']) && ($opera_detail_extra .= '[联系人:' . $ori_order_info['customer_name'] . "=>" . $new_order_info['customer_name'] . "] ");
  724. ($ori_order_info['customer_mobile'] != $new_order_info['customer_mobile']) && ($opera_detail_extra .= '[手机号:' . $ori_order_info['customer_mobile'] . "=>" . $new_order_info['customer_mobile'] . "] ");
  725. ($ori_order_info['customer_id_no'] != $new_order_info['customer_id_no']) && ($opera_detail_extra .= '[身份证号:' . $ori_order_info['customer_id_no'] . "=>" . $new_order_info['customer_id_no'] . "] ");
  726. ($ori_order_info['customer_memo'] != $new_order_info['customer_memo']) && ($opera_detail_extra .= '[备注:' . $ori_order_info['customer_memo'] . "=>" . $new_order_info['customer_memo'] . "] ");
  727. $opera_detail1 .= $opera_detail_extra;
  728. if ($opera_detail_extra) {
  729. $values = [
  730. 'order_id' => $ori_order_info['order_id'],
  731. 'opera_platform' => 'CS系统',
  732. 'opera_user_id' => $order_info_arr['user_id'],
  733. 'opera_type' => 3,
  734. 'opera_time' => date('Y-m-d H:i:s', time()),
  735. 'opera_detail' => $opera_detail1
  736. ];
  737. $order_opera_log = new OrderOperaLog();
  738. $order_opera_log->attributes = $values;
  739. if (!$order_opera_log->insert()) {
  740. throw new Exception(serialize($order_opera_log->getErrors()));
  741. }
  742. }
  743. //8.2,插入订单修改记录表(需要对原数据和新数据做比对,仅记录修改过的产品信息项)
  744. $opera_detail = '修改订单-修改产品信息:';
  745. $opera_detail_extra = '';
  746. #8.2.1如果上下车站点变化,则记录上下车站点和票种变化; 如果上下车站点不变,(价格,数量)变化,则只记录票种变化
  747. if ($ori_order_info['start_station_name'] != $new_order_info['start_station_name'] || $ori_order_info['end_station_name'] != $new_order_info['end_station_name']) {
  748. $opera_detail_extra .= '【上下车站点:『' . $ori_order_info['start_station_name'] . '-->' . $ori_order_info['end_station_name'] . '』 => 『' . $new_order_info['start_station_name'] . '-->' . $new_order_info['end_station_name'] . '』】';
  749. $opera_detail_extra .= '【票种:『ID:' . $ori_order_info['prod_id'] . ',价格:' . $ori_order_info['order_price'] . ',数量:' . $ori_order_info['num'] . '』 => 『ID:' . $new_order_info['prod_id'] . ',价格:' . $new_order_info['order_price'] . ',数量:' . $new_order_info['num'] . '』】';
  750. } else if ($ori_order_info['order_price'] != $new_order_info['order_price'] || $ori_order_info['num'] != $new_order_info['num']) {
  751. $opera_detail_extra .= '【票种:『ID:' . $ori_order_info['prod_id'] . ',价格:' . $ori_order_info['order_price'] . ',数量:' . $ori_order_info['num'] . '』 => 『ID:' . $new_order_info['prod_id'] . ',价格:' . $new_order_info['order_price'] . ',数量:' . $new_order_info['num'] . '』】';
  752. }
  753. #8.2.2套餐产品(门票价格,酒店价格)
  754. if ($ori_order_info['gate_price'] != $new_order_info['gate_price'] || $ori_order_info['hotel_price'] != $new_order_info['hotel_price']) {
  755. $opera_detail_extra .= '【套餐价格:『门票:' . $ori_order_info['gate_price'] . ',酒店:' . $ori_order_info['hotel_price'] . '』 => 『门票:' . $new_order_info['gate_price'] . ',酒店:' . $new_order_info['hotel_price'] . '』】';
  756. }
  757. #8.2.3代收单价 代收总价
  758. if ($ori_order_info['sin_rec_value'] != $new_order_info['sin_rec_value'] || $ori_order_info['tot_rec_value'] != $new_order_info['tot_rec_value']) {
  759. $opera_detail_extra .= '【代收:『单价:' . $ori_order_info['sin_rec_value'] . ',总价:' . $ori_order_info['tot_rec_value'] . '』 => 『单价:' . $new_order_info['sin_rec_value'] . ',总价:' . $new_order_info['tot_rec_value'] . '』】';
  760. }
  761. $opera_detail .= $opera_detail_extra;
  762. if ($opera_detail_extra) {
  763. $values = [
  764. 'order_id' => $ori_order_info['order_id'],
  765. 'opera_platform' => 'CS系统',
  766. 'opera_user_id' => $order_info_arr['user_id'],
  767. 'opera_type' => 3,
  768. 'opera_time' => date('Y-m-d H:i:s', time()),
  769. 'opera_detail' => $opera_detail
  770. ];
  771. $order_opera_log = new OrderOperaLog();
  772. $order_opera_log->attributes = $values;
  773. if (!$order_opera_log->insert()) {
  774. throw new Exception(serialize($order_opera_log->getErrors()));
  775. }
  776. }
  777. #endregion
  778. $result['code'] = '0';
  779. $result['info'] = '修改订单成功';
  780. $result['data'] = implode(',', $main_order_id);
  781. } catch (Exception $e) {
  782. # 回滚事务
  783. //$transaction->rollBack();
  784. $result['code'] = '1';
  785. $result['info'] = '修改订单失败' . $e->getMessage();
  786. $result['error_info'] = $e->getMessage();
  787. }
  788. return $result;
  789. }
  790. /**
  791. * Function Description:整理产品数据
  792. * Function Name: getBusProductList
  793. * @param array $prod_arr 选购产品,格式为{去程/返程标志(1:去程 2:返程),去程/返程班次ID,票种ID,票种单价,预定数量,车号}...
  794. *
  795. * @return array
  796. *
  797. * @author 温依莅
  798. */
  799. public
  800. function getBusProductList($prod_arr)
  801. {
  802. $result = [];
  803. $prod_arr = array(0 => $prod_arr);
  804. foreach ($prod_arr as $key => $vel) {
  805. $result[$vel['prod_id']]['if_back'] = $vel['to_go'];//1:去程 2:返程
  806. $result[$vel['prod_id']]['run_id'] = $vel['run_id'];//班次id
  807. $result[$vel['prod_id']]['ticket_id'] = $vel['prod_id'];//票种id
  808. $result[$vel['prod_id']]['price'] = $vel['order_price'];//单价
  809. $result[$vel['prod_id']]['num'] = $vel['bus_people_num'];//数量
  810. //$result[$vel['prod_id']]['main_price'] = $vel['main_price'];//主订单价格()
  811. $result[$vel['prod_id']]['bus_order_id'] = isset($vel['bus_order_id']) ? $vel['bus_order_id'] : 0;//车号
  812. }
  813. return $result;
  814. }
  815. /**
  816. * Function Description:获取订单数据
  817. * Function Name: getOrderInfoArray
  818. * @param array $order_info_arr 订单基础信息{下单用户,会员号,渠道id,渠道订单号,是否自动退票(0否1是),支付方式(授信275),是否支付(0否1是),业务员}
  819. *
  820. * @return mixed
  821. *
  822. * @author 温依莅
  823. */
  824. public
  825. function getOrderInfoArray($order_info_arr)
  826. {
  827. $user_id = Yii::$app->request->cookies->getValue('user_id', 2);//修改订单用户id 默认2;
  828. $result['user_id'] = (!isset($order_info_arr['modify_user_id']) || empty($order_info_arr['modify_user_id'])) ? $user_id : $order_info_arr['modify_user_id'];//修改订单用户id
  829. //$result['user_id'] = $user_id;
  830. $result['member_id'] = (!isset($order_info_arr['member_id']) || empty($order_info_arr['member_id'])) ? 0 : $order_info_arr[member_id];//会员id
  831. $result['outside_sale_org_id'] = (!isset($order_info_arr['outside_sale_org_id']) || empty($order_info_arr['outside_sale_org_id'])) ? 0 : $order_info_arr['outside_sale_org_id'];//渠道id
  832. $result['outside_sale_order_no'] = (!isset($order_info_arr['outside_order_no']) || empty($order_info_arr['outside_order_no'])) ? '' : $order_info_arr['outside_order_no'];//渠道下单号
  833. $result['order_book_status'] = (!isset($order_info_arr['is_book']) || $order_info_arr['is_book'] === '') ? 0 : $order_info_arr['is_book'];//订单预订状态
  834. $result['pay_type'] = (!isset($order_info_arr['pay_type']) || empty($order_info_arr['pay_type'])) ? 275 : $order_info_arr['pay_type'];//支付方式(授信,微信)
  835. $result['order_pay_status'] = (!isset($order_info_arr['is_pay']) || empty($order_info_arr['is_pay'])) ? 0 : $order_info_arr['is_pay'];//是否支付
  836. $result['sales_man'] = (!isset($order_info_arr['sales_man']) || empty($order_info_arr['sales_man'])) ? '' : $order_info_arr['sales_man'];//业务员
  837. $supplier_info = BaseSupplier::find()->select('sales_man,supplier_name')->where(['id' => $result['outside_sale_org_id']])->asArray()->one();
  838. if ($result['sales_man'] == '') {
  839. $result['sales_man'] = empty($supplier_info['sales_man']) ? '' : $supplier_info['sales_man'];
  840. }
  841. $result['org_name'] = empty($supplier_info['supplier_name']) ? '' : $supplier_info['supplier_name'];
  842. $result['order_status'] = $result['order_pay_status'] == 0 ? 145 : 146;
  843. return $result;
  844. }
  845. /**
  846. * Function Description:获取乘客信息
  847. * Function Name: getCustomerInfoArray
  848. * @param array $customer_info_arr 顾客信息,格式为{联系人,联系电话,z证件类型,联系人身份证,备注}
  849. *
  850. * @return mixed
  851. *
  852. * @author 温依莅
  853. */
  854. public
  855. function getCustomerInfoArray($customer_info_arr)
  856. {
  857. $result['customer_name'] = (!isset($customer_info_arr['customer_name']) || empty($customer_info_arr['customer_name'])) ? '' : $customer_info_arr['customer_name'];//乘客姓名
  858. $result['customer_mobile'] = (!isset($customer_info_arr['customer_phone']) || empty($customer_info_arr['customer_phone'])) ? '' : $customer_info_arr['customer_phone'];//乘客电话
  859. $result['customer_id_type'] = (!isset($customer_info_arr['customer_id_type']) || empty($customer_info_arr['customer_id_type'])) ? 150 : $customer_info_arr['customer_id_type'];//乘客证件类型
  860. $result['customer_id_no'] = (!isset($customer_info_arr['customer_id_no']) || empty($customer_info_arr['customer_id_no'])) ? '' : $customer_info_arr['customer_id_no'];//乘客证件号
  861. $result['customer_memo'] = (!isset($customer_info_arr['customer_remark']) || empty($customer_info_arr['customer_remark'])) ? '' : $customer_info_arr['customer_remark'];//乘客备注
  862. return $result;
  863. }
  864. /**
  865. * Function Description:订单附加产品
  866. * Function Name: getOrderAppendArray
  867. * @param array $order_append_arr 订单附加产品,格式为{门票价格,酒店价格}
  868. *
  869. * @return mixed
  870. *
  871. * @author 温依莅
  872. */
  873. public
  874. function getOrderAppendArray($order_append_arr)
  875. {
  876. $result['gate_price'] = (!isset($order_append_arr['gate_price']) || empty($order_append_arr['gate_price'])) ? '0' : $order_append_arr['gate_price'];//门票价格
  877. $result['hotel_price'] = (!isset($order_append_arr['hotel_price']) || empty($order_append_arr['hotel_price'])) ? '0' : $order_append_arr['hotel_price'];//酒店价格
  878. return $result;
  879. }
  880. /**
  881. * Function Description:根据班次和票种id获取产品详情列表
  882. * Function Name: getBusProductListByRunTicket
  883. * @param array $run_ticket_arr 产品详情列表
  884. *
  885. * @return array|\yii\db\ActiveRecord[]
  886. *
  887. * @author 张帅
  888. */
  889. public
  890. function getBusProductListByRunTicket($run_ticket_arr)
  891. {
  892. #region 1.班次票种筛选条件
  893. $and_where = [
  894. 'or',
  895. ];
  896. foreach ($run_ticket_arr as $key => $vel) {
  897. $and_where[] = [
  898. 'and',
  899. ['=', 'rp.run_id', $vel['run_id']],
  900. ['=', 'rp.prod_id', $vel['ticket_id']],
  901. ];
  902. }
  903. #endregion
  904. #region 2.查询结果
  905. $result = RunProd::find()
  906. ->select([
  907. 'run_id' => 'rm.run_id',//班次id
  908. 'run_date' => 'rm.run_date',//出发日期
  909. 'run_time' => 'rm.run_time',//出发时间
  910. 'run_minutes' => 'rm.run_minutes',//出发分钟数
  911. 'ticket_id' => 'rp.prod_id',//票种id
  912. 'ticket_name' => 't.ticket_name',//票种名称
  913. 'seat_type' => 't.seat_type',//座位类型
  914. 'human_type' => 't.human_type',//人群属性
  915. 'line_id' => 't.line_id',//线路id
  916. 'line_name' => 'l.line_name',//线路名称
  917. 'start_res_id' => 't.start_station_res_id',//上车站id
  918. 'start_res_name' => BaseResource::find()->select('res_name')->where('res_id = t.start_station_res_id')->limit(1),//上车站name
  919. 'start_area_id' => 't.start_station_area_id',//出发地id
  920. 'start_area_name' => BaseArea::find()->select('area_name')->where('id = t.start_station_area_id')->limit(1),//出发地name
  921. 'start_seq_id' => 's1.station_order_id',//开始站顺序号
  922. 'start_time' => 's1.start_time',//开始时间
  923. 'start_minutes' => 's1.start_minutes',//开始分钟数
  924. 'checkport_res_id' => 's1.checkport_res_id',//检票口id
  925. 'checkport_res_name' => BaseResource::find()->select('res_name')->where('res_id = s1.checkport_res_id')->limit(1),//检票口name
  926. 'end_res_id' => 't.end_station_res_id',//下车站id
  927. 'end_res_name' => BaseResource::find()->select('res_name')->where('res_id = t.end_station_res_id')->limit(1),//下车站name
  928. 'end_area_id' => 't.end_station_area_id',//目的地id
  929. 'end_area_name' => BaseArea::find()->select('area_name')->where('id = t.end_station_area_id')->limit(1),//目的地name
  930. 'end_seq_id' => 's2.station_order_id',//结束站顺序号
  931. 'end_time' => 's2.start_time',//结束时间
  932. 'end_minutes' => 's2.start_minutes',//结束分钟数
  933. 'prod_price' => 't.prod_price',//分销价
  934. 'cus_price' => 't.cus_price',//零售价
  935. ])
  936. ->from(RunProd::tableName() . ' as rp')
  937. ->leftJoin(RunMain::tableName() . ' as rm', 'rp.run_id = rm.run_id')
  938. ->leftJoin(OperaTickets::tableName() . ' as t', 'rp.prod_id = t.ticket_id')
  939. ->leftJoin(OperaLine::tableName() . ' as l', 't.line_id = l.line_id')
  940. ->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')
  941. ->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')
  942. ->where([
  943. 'and',
  944. ['=', 'rp.cancel_flag', 0],
  945. ['=', 't.cancel_flag', 0],
  946. ])
  947. ->andWhere($and_where)
  948. ->indexBy('ticket_id')
  949. ->asArray()->all();
  950. #endregion
  951. return $result;
  952. }
  953. /**
  954. * Function Description:检查run_x中是否有班次
  955. * Function Name: checkRunX
  956. * @param array $date_run_arr 日期班次数组
  957. *
  958. * @return bool
  959. *
  960. * @author 张帅
  961. */
  962. public
  963. function checkRunX($date_run_arr)
  964. {
  965. #region 没有班次直接返回错误
  966. if (count($date_run_arr) == 0) {
  967. return false;
  968. }
  969. #endregion
  970. #region 判断每个班次是否存在run_x
  971. foreach ($date_run_arr as $key => $vel) {
  972. $sql = '' . 'select
  973. count(*) as toatl_count
  974. from run_' . $key . '
  975. where run_id in (' . implode(',', $vel) . ')
  976. group by run_id';
  977. $res = Yii::$app->db->createCommand($sql)->queryAll();
  978. #region 如果有不存在班次的直接返回错误
  979. if (count($res) != count($vel)) {
  980. return false;
  981. }
  982. foreach ($res as $res_key => $res_vel) {
  983. if ($res_vel['toatl_count'] == 0) {
  984. return false;
  985. }
  986. }
  987. #endregion
  988. }
  989. #endregion
  990. return true;
  991. }
  992. /**
  993. * Function Description:获取所有的座位
  994. * Function Name: getRunBunSeat
  995. * @param array $run_bus_arr 班次信息
  996. *
  997. * @return array|bool
  998. *
  999. * @author 张帅
  1000. */
  1001. public
  1002. function getRunBusSeat($run_bus_arr)
  1003. {
  1004. $result = [];
  1005. foreach ($run_bus_arr as $key => $vel) {
  1006. $sql_and = '';
  1007. if ($vel['bus_order_id'] != 0) {
  1008. $sql_and = ' and bus_order_id = ' . $vel['bus_order_id'];
  1009. }
  1010. $sql = '' . 'select
  1011. group_concat(id) as run_x_id,run_id,bus_order_id,seat_x,seat_y,seat_type,seat_seq_id,seat_name,count(id) as seat_count
  1012. from
  1013. run_' . $vel['run_date'] . '
  1014. where
  1015. run_id = ' . $vel['run_id'] . '
  1016. and order_id >= ' . $vel['start_seq_id'] . '
  1017. and order_id < ' . $vel['end_seq_id'] . '
  1018. and seat_type = ' . $vel['seat_type'] . $sql_and . '
  1019. and cancel_flag = 0
  1020. and seat_status = 0
  1021. group by
  1022. run_id,bus_order_id,seat_type,seat_seq_id,seat_name
  1023. order by seat_seq_id ASC';
  1024. $res = Yii::$app->db->createCommand($sql)->queryAll();
  1025. if (count($res) == 0) {
  1026. return false;
  1027. }
  1028. //分车归理数据
  1029. $res_one = [];
  1030. foreach ($res as $res_key => $res_vel) {
  1031. if ($res_vel['seat_count'] == $vel['seat_count']) {
  1032. $res_one[$res_vel['bus_order_id']][$res_vel['seat_seq_id']] = $res_vel;
  1033. }
  1034. }
  1035. //挑出可以放订单的车次,否则返回错误
  1036. $result_one = [];
  1037. foreach ($res_one as $res_key => $res_vel) {
  1038. if (count($res_vel) >= $vel['num']) {
  1039. $result_one = $res_vel;
  1040. break;
  1041. }
  1042. }
  1043. if (count($result_one) == 0) {
  1044. return false;
  1045. }
  1046. //通过票种索引塞入数据
  1047. $result[$vel['ticket_id']] = $result_one;
  1048. }
  1049. return $result;
  1050. }
  1051. /**
  1052. * Function Description:获取座位信息
  1053. * Function Name: getSeatArray
  1054. * @param array $run_bus_arr 班次车次数组
  1055. * @param array $prod_arr 产品数据
  1056. *
  1057. * @return array
  1058. *
  1059. * @author 张帅
  1060. */
  1061. public
  1062. function getSeatArray($run_bus_arr, $prod_arr)
  1063. {
  1064. $result = [];
  1065. foreach ($run_bus_arr as $key => $vel) {
  1066. $seat_no = [];
  1067. $i = 0;
  1068. #region 连座筛选
  1069. foreach ($vel as $key1 => $vel2) {
  1070. $seat_no[$key1 - $i][$key1] = $vel2;
  1071. $i++;
  1072. }
  1073. #endregion
  1074. #region 挑选座位
  1075. $run_seat_value = [];
  1076. foreach ($seat_no as $key1 => $vel2) {
  1077. if (count($vel2) >= $prod_arr[$key]['num']) {
  1078. $run_seat_value = array_slice($vel2, 0, $prod_arr[$key]['num'], true);
  1079. break;
  1080. }
  1081. }
  1082. if (count($run_seat_value) == 0) {
  1083. $run_seat_value = array_slice($vel, 0, $prod_arr[$key]['num'], true);
  1084. }
  1085. #endregion
  1086. $result[$key] = $run_seat_value;
  1087. }
  1088. return $result;
  1089. }
  1090. /**
  1091. * Function Description:获取代收价
  1092. * Function Name: getBusProductListReceiver
  1093. * @param array $prod_list 产品列表
  1094. * @param array $receiver_value_arr 代收信息
  1095. * @param array $prod_arr 产品简易数据
  1096. *
  1097. * @return mixed
  1098. *
  1099. * @author 张帅
  1100. */
  1101. public
  1102. function getBusProductListReceiver($prod_list, $receiver_value_arr, $prod_arr)
  1103. {
  1104. $result = [];
  1105. // $receiver_value_str = substr($receiver_value_str, 1, -1);
  1106. // $receiver_value_arr = explode(',', $receiver_value_str);//代收价格信息
  1107. $receiver_value = (!isset($receiver_value_arr['sin_rec_value']) || empty($receiver_value_arr['sin_rec_value'])) ? 0 : $receiver_value_arr['sin_rec_value'];//代收单价
  1108. $total_receiver_value = (!isset($receiver_value_arr['total_rec_value']) || empty($receiver_value_arr['total_rec_value'])) ? 0 : $receiver_value_arr['total_rec_value'];//代收总价
  1109. $receiver_value = $receiver_value / count($prod_list);
  1110. $total_receiver_value = $total_receiver_value / count($prod_list);
  1111. //将订单单价,人数,总价,往返标志,代收单价,代收总价放入产品列表中
  1112. foreach ($prod_list as $key => $vel) {
  1113. if ($total_receiver_value != 0) {
  1114. $prod_list[$key]['total_receiver_value'] = round($total_receiver_value, 2);
  1115. $prod_list[$key]['receiver_value'] = round($total_receiver_value / $prod_arr[$key]['num'], 2);
  1116. } else {
  1117. $prod_list[$key]['total_receiver_value'] = round($receiver_value * $prod_arr[$key]['num'], 2);
  1118. $prod_list[$key]['receiver_value'] = round($receiver_value, 2);
  1119. }
  1120. $prod_list[$key]['order_price'] = $prod_arr[$key]['price'];
  1121. $prod_list[$key]['total_price'] = $prod_arr[$key]['price'] * $prod_arr[$key]['num'];
  1122. //$prod_list[$key]['total_price'] = $prod_arr[$key]['main_price'];
  1123. $prod_list[$key]['people_num'] = $prod_arr[$key]['num'];
  1124. $prod_list[$key]['if_back'] = $prod_arr[$key]['if_back'];
  1125. }
  1126. //将产品安往返排序
  1127. foreach ($prod_arr as $key => $vel) {
  1128. $result[$key] = $prod_list[$key];
  1129. }
  1130. return $result;
  1131. }
  1132. /**
  1133. * Function Description:得到巴士订单修改所需信息
  1134. * Function Name: getOrderModifyInfo
  1135. * @param int $order_id
  1136. * @return array
  1137. *
  1138. * @author 温依莅
  1139. */
  1140. public
  1141. function getOrderModifyInfo($order_id)
  1142. {
  1143. //得到该订单的部分信息
  1144. $order_main = new OrderMain();
  1145. $order_info = $order_main::find()->select([
  1146. 'b.order_id',
  1147. 'a.run_id',
  1148. 'a.main_create_user_id',
  1149. 'a.create_user_id',
  1150. 'b.create_time',
  1151. 'd.bus_order_id',
  1152. 'd.send_bus_no',
  1153. 'd.send_driver_name',
  1154. 'd.send_driver_mobile',
  1155. 'seat_type' => DictType::find()->select('type_name')->where('id=e.parent_id')->limit(1),
  1156. 'a.prod_id',
  1157. 'a.prod_start_station_res_id as start_station_id',
  1158. 'a.prod_end_station_res_id as end_station_id',
  1159. 'a.prod_start_station_res_name as start_station_name',
  1160. 'a.prod_end_station_res_name as end_station_name',
  1161. 'a.order_price',
  1162. 'b.order_price as total_price',
  1163. 'num' => OrderMain::find()->select('count(*)')->where(['parent_order_id' => $order_id, 'cancel_flag' => 0, 'order_valid_status' => 1]),
  1164. 'a.receive_value as sin_rec_value',
  1165. 'b.receive_value as tot_rec_value',
  1166. 'c.gate_price',
  1167. 'c.hotel_price',
  1168. 'a.customer_name',
  1169. 'a.customer_mobile',
  1170. 'a.customer_memo',
  1171. 'a.customer_id_no',
  1172. 'a.outside_sale_org_id',
  1173. 'a.outside_order_no',
  1174. 'a.order_pay_main_id',
  1175. 'a.order_status',
  1176. 'a.sales_man',
  1177. 'l.line_id',
  1178. 'l.line_name',
  1179. 'r.run_date',
  1180. 'r.run_time',
  1181. 'b.order_valid_status',
  1182. 'b.order_title_id',
  1183. 'a.sub_channel_id',
  1184. 'a.sub_channel_no',
  1185. 'a.main_corp_id',
  1186. 'a.sale_path',
  1187. 'a.agent_level',
  1188. 'a.source_main_corp_id',
  1189. 'a.prod_supply_org_name',
  1190. 'a.prod_top_org_id',
  1191. 'a.base_price',
  1192. ])->from(OrderMain::tableName() . ' as a')
  1193. ->leftJoin(OrderMain::tableName() . ' as b', 'a.parent_order_id=b.order_id')
  1194. ->leftJoin(OrderExtraInfo::tableName() . ' as c', 'c.order_id=b.order_id')
  1195. ->leftJoin(RunBus::tableName() . ' as d', 'a.run_id=d.run_id and a.run_bus_order_id=d.bus_order_id')
  1196. ->leftJoin(RunMain::tableName() . ' as r', 'a.run_id=r.run_id')
  1197. ->leftJoin(BaseResource::tableName() . ' as e', 'd.bus_type_res_id=e.id')
  1198. ->leftJoin(OperaLine::tableName() . ' as l', 'a.parent_prod_id=l.line_id')
  1199. ->where(['a.cancel_flag' => 0, 'b.order_id' => $order_id, 'b.order_valid_status' => 1, 'a.order_valid_status' => 1]);
  1200. $sql = $order_info->createCommand()->getRawSql();
  1201. $res = $order_info->asArray()
  1202. ->one();
  1203. //$error=$order_main->getErrors();
  1204. return $res;
  1205. }
  1206. /**
  1207. * Function Description:释放原巴士订单所占资源
  1208. * Function Name: emptyBusOrder
  1209. * @param int $order_id 订单号
  1210. * @param int $user_id 操作员id
  1211. *
  1212. * @return string
  1213. *
  1214. * @author 温依莅
  1215. */
  1216. public
  1217. function emptyBusOrder($order_id, $user_id)
  1218. {
  1219. $order_id_arr = [];//订单id数组
  1220. $line_type = 'single';
  1221. $order_id_arr[$order_id] = $order_id;
  1222. #region 判断线路类型是单一还是组合
  1223. $line_info = $this->getOrderLineIdCount($order_id_arr);
  1224. if (!$line_info) {
  1225. $result['code'] = '2';
  1226. $result['info'] = '错误订单号';
  1227. return $result;
  1228. }
  1229. #endregion
  1230. #region 判断订单是否已失效
  1231. foreach ($line_info as $key => $vel) {
  1232. if ($vel['order_valid_status'] == 0) {
  1233. unset($order_id_arr[$key]);
  1234. } else {
  1235. if ($vel['line_id'] == 0 || $vel['line_type'] == 255 || $vel['line_type'] == 256) {
  1236. $line_type = 'single';
  1237. } else {
  1238. $line_type = 'group';
  1239. }
  1240. }
  1241. }
  1242. if (count($order_id_arr) == 0) {
  1243. $result['code'] = '3';
  1244. $result['info'] = '订单已取消';
  1245. return $result;
  1246. }
  1247. #endregion
  1248. if ($line_type == 'single') {//单一线路
  1249. #region 获取订单所属的班次信息
  1250. $order_run_info = $this->getOrderRunInfo($order_id_arr);
  1251. #endregion
  1252. #region 释放单一订单所占资源
  1253. $result = $this->emptySingleBusOrder($order_id_arr, $order_run_info, $user_id);
  1254. #endregion
  1255. } else {//组合线路
  1256. $result['code'] = '1';
  1257. $result['info'] = '暂不支持组合线路退单';
  1258. return $result;
  1259. }
  1260. return $result;
  1261. }
  1262. /**
  1263. * Function Description:获取订单所属线路
  1264. * Function Name: getOrderLineIdCount
  1265. * @param array $order_id_arr 订单id数组
  1266. *
  1267. * @return array|null|ActiveRecord
  1268. *
  1269. * @author 张帅
  1270. */
  1271. public
  1272. function getOrderLineIdCount($order_id_arr)
  1273. {
  1274. $result = OrderMain::find()
  1275. ->select([
  1276. 'order_id',
  1277. 'line_id' => 'parent_prod_id',//线路id
  1278. 'order_count' => "substring_index(order_description,'|',-1)",//人数
  1279. 'order_valid_status',//订单是否有效
  1280. 'line_type' => OperaLine::find()->select('line_type')->where('line_id = m.parent_prod_id')->limit(1),//线路类型
  1281. ])
  1282. ->from(OrderMain::tableName() . ' as m')
  1283. ->where([
  1284. 'and',
  1285. ['in', 'order_id', $order_id_arr],
  1286. ['=', 'parent_order_id', 0],
  1287. ])
  1288. ->indexBy('order_id')
  1289. ->asArray()->all();
  1290. return $result;
  1291. }
  1292. /**
  1293. * Function Description:获取订单班次信息
  1294. * Function Name: getOrderRunInfo
  1295. * @param array $order_id_arr 订单id数组
  1296. *
  1297. * @return array|\yii\db\ActiveRecord[]
  1298. *
  1299. * @author 张帅
  1300. */
  1301. public
  1302. function getOrderRunInfo($order_id_arr)
  1303. {
  1304. $result = OrderMain::find()
  1305. ->select([
  1306. 'run_id',//班次id
  1307. 'run_date',//班次日期
  1308. 'bus_order_id' => "group_concat(distinct run_bus_order_id)",//车次号
  1309. 'start_seq_id' => 'prod_start_station_seq_id',//开始站顺序号
  1310. 'end_seq_id' => 'prod_end_station_seq_id',//结束站站顺序号
  1311. 'order_num' => "count(*)",//订单人数
  1312. 'ticket_id' => 'prod_id',//票种id
  1313. 'order_id' => "group_concat(order_id)",//订单id
  1314. 'seat_type' => 'run_bus_seat_type',//座位类型
  1315. ])
  1316. ->where([
  1317. 'and',
  1318. ['in', 'parent_order_id', $order_id_arr],
  1319. ['=', 'cancel_flag', 0],
  1320. ])
  1321. ->groupBy([
  1322. 'run_id',
  1323. 'start_seq_id',
  1324. 'end_seq_id',
  1325. ])
  1326. ->indexBy('run_id')
  1327. ->asArray()->all();
  1328. return $result;
  1329. }
  1330. }