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.
 
 
 
 
 
 

2559 line
132 KiB

  1. <?php
  2. /**
  3. *
  4. * ============================================================================
  5. * * 版权所有 蜘蛛出行 * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * Author By: 温依莅
  12. * PhpStorm SubmitBusAgentOrder.php
  13. * Create By 2017/5/17 10:50 $
  14. */
  15. namespace backend\modules\api\logic;
  16. use backend\modules\api\models\BusCost;
  17. use backend\modules\api\models\OperaProductRun;
  18. use backend\modules\api\models\OperaTicketsDistrib;
  19. use backend\modules\api\models\OperaTouristCommon;
  20. use backend\modules\api\models\OrderCustomerInfo;
  21. use backend\modules\api\models\OrderInsuranceConnect;
  22. use backend\modules\api\models\OrderTitle;
  23. use backend\modules\api\util\Util;
  24. use common\models\Utils;
  25. use common\util\CurlInterface;
  26. use yii\base\Exception;
  27. use yii\db\Query;
  28. use backend\modules\api\models\OperaTickets;
  29. use backend\modules\api\models\OperaTicketsAgent;
  30. use backend\modules\api\models\OrderMain;
  31. use backend\modules\api\models\RunMain;
  32. use backend\modules\api\models\RunProd;
  33. use backend\modules\api\models\ToFrom;
  34. use backend\modules\api\models\BaseSupplier;
  35. use backend\modules\api\models\OperaLine;
  36. use backend\modules\api\models\RunStation;
  37. use backend\modules\api\models\BaseUniqueId2;
  38. use backend\modules\api\models\RunBus;
  39. use backend\modules\api\models\RunStock;
  40. use backend\modules\api\models\OrderPayMain;
  41. use backend\modules\api\models\OrderPayDetail;
  42. use backend\modules\api\models\OrderOperaLog;
  43. use backend\modules\api\models\OrderExtraInfo;
  44. use backend\modules\api\models\BaseResource;
  45. use backend\modules\api\models\BaseArea;
  46. use backend\modules\api\models\DictType;
  47. use backend\modules\api\models\BaseUser;
  48. use common\models\Msg;
  49. //use yii\base\Exception;
  50. use yii\db\Expression;
  51. use Yii;
  52. /**
  53. * Class SubmitBusOrder 单巴士产品下单类(主要包含串货下单逻辑)
  54. * @package backend\modules\api\logic
  55. */
  56. class SubmitBusAgentOrder extends Query
  57. {
  58. public $run_id = 0;
  59. public $bus_order_id = 0;
  60. /**
  61. * Function Description:根据票种判断代售相关信息
  62. * Function Name: getTicketAgentInfo
  63. * @param int $prod_id 票种id
  64. * @param int $supplier_id 销售渠道id
  65. * @param int $user_id 用户id
  66. * @param int $main_corp_id 运营主体id,如果没填,取user_id对应的main_corp_id
  67. *
  68. * @return array
  69. *
  70. * @author 温依莅
  71. */
  72. public function getTicketAgentInfo($prod_id, $supplier_id, $user_id, $main_corp_id = -1)
  73. {
  74. //$user_id = Yii::$app->request->cookies->getValue('user_id', 2);
  75. $result = array();
  76. $res = BaseUser::find()->select('id,main_corp_id,user_name')->where(['id' => $user_id, 'cancel_flag' => 0])->asArray()->one();
  77. if (!$res) {
  78. $result['code'] = '1';
  79. $result['info'] = '无效用户';
  80. return $result;
  81. }
  82. $real_main_corp_id = ($main_corp_id == -1 ? $res['main_corp_id'] : $main_corp_id);
  83. if ($real_main_corp_id == 0) { //如果main_corp_id为0,下单时视为蜘蛛国旅(运营主体为1)处理
  84. $real_main_corp_id = 1;
  85. }
  86. //1,根据prod_id,main_corp_id判断是否是代售
  87. $res2 = OperaTickets::find()
  88. ->select('a.ticket_id,a.line_id,b.main_corp_id')
  89. ->from('opera_tickets as a')
  90. ->leftJoin('opera_line as b', 'a.line_id=b.line_id')
  91. ->where(['a.ticket_id' => $prod_id])
  92. ->asArray()->one();
  93. if (!$res2) {
  94. $result['code'] = '1';
  95. $result['info'] = '票种信息错误或不可售';
  96. return $result;
  97. }
  98. $line_id = $res2['line_id'];
  99. $ori_main_corp_id = $res2['main_corp_id'];//线路所属运营主体
  100. $is_agent = 0;//是否是代售
  101. $agent_level = 1;//销售层级
  102. if ($ori_main_corp_id != $real_main_corp_id) {
  103. $is_agent = 1;
  104. }
  105. $ticket_agent_list = array();
  106. $org_id = $this->getLineOrgId($prod_id);//票种所在线路 的原始供应商id
  107. $org_name = $this->getSupplierName($org_id);//票种所在线路 的原始供应商名称
  108. $list = array('prod_id' => $prod_id, 'line_id' => $line_id, 'supplier_id' => $supplier_id, 'is_agent' => $is_agent, 'ori_main_corp_id' => $ori_main_corp_id, 'self_main_corp_id' => $real_main_corp_id, 'agent_depth' => $agent_level);
  109. //如果是自营非代收,返回信息
  110. if ($is_agent == 0) {
  111. $base_price_one = $this->getOwnerCost($prod_id);
  112. $ticket_agent_one = array(
  113. 'prod_top_org_id' => $org_id,
  114. 'prod_supply_org_name' => $org_name,
  115. 'outside_sale_org_id' => $supplier_id,
  116. 'outside_sale_org_name' => $this->getSupplierName($supplier_id),
  117. 'outside_order_no' => 'unknown',
  118. 'sub_channel_id' => $supplier_id,
  119. 'sub_channel_no' => 'unknown',
  120. 'main_corp_id' => $real_main_corp_id,
  121. 'source_main_corp_id' => $ori_main_corp_id,
  122. 'sale_path' => '',
  123. 'agent_level' => 1,
  124. 'base_price' => $base_price_one,
  125. 'order_price' => 'unknown'
  126. );
  127. $ticket_agent_list[1] = $ticket_agent_one;
  128. $list['ticket_agent_list'] = $ticket_agent_list;
  129. $result['code'] = '0';
  130. $result['info'] = '获取票种代售信息成功(自营票种)';
  131. $result['list'] = $list;
  132. return $result;
  133. }
  134. //2,判断代售票种是否可售,如果可售,获取相关信息
  135. #2.1 获取该运营主体所对应的渠道id
  136. $corp_supplier_id = $this->getCorpSupplierId($real_main_corp_id);//所属运营主体对应的渠道
  137. if (!$corp_supplier_id) {
  138. $result['code'] = '1';
  139. $result['info'] = '该运营主体无对应渠道';
  140. $result['error_info'] = $res['info'];
  141. return $result;
  142. }
  143. #2.2 判断代售票种是否可售
  144. $res = OperaTicketsAgent::find()->select('a.ticket_id,a.line_id,a.from_main_corp_id,a.to_main_corp_id,c.authority_status,c.prod_price as spec_prod_price,a.cost_price,a.prod_price')
  145. ->from(OperaTicketsAgent::tableName() . ' as a')
  146. ->leftJoin(OperaTicketsDistrib::tableName() . ' as b', 'a.ticket_id=b.ticket_id and b.supplier_id=' . $supplier_id)
  147. ->leftJoin(OperaTicketsDistrib::tableName() . ' as c', 'a.ticket_id=c.ticket_id and c.supplier_id=' . $corp_supplier_id)
  148. ->where([
  149. 'and',
  150. 'a.ticket_id= ' . $prod_id,
  151. 'a.to_main_corp_id=' . $real_main_corp_id,
  152. 'a.authority_status=1',
  153. 'a.is_onsale=1',
  154. 'a.cancel_flag=0',
  155. ['or', 'b.cancel_flag=0', 'b.cancel_flag is null'],
  156. ['or', 'c.cancel_flag=0', 'c.cancel_flag is null'],
  157. ['or', 'b.authority_status=1', 'b.authority_status is null'],
  158. ['or', 'c.authority_status=1', 'c.authority_status is null']
  159. ])->limit(1);
  160. $ticket_info_sql = $res->createCommand()->getRawSql();
  161. $ticket_info = $res->asArray()->one();
  162. if (!$ticket_info) {
  163. $list['agent_depth'] = $agent_level;
  164. $result['code'] = '1';
  165. $result['info'] = '代售票种' . $prod_id . '不可售';
  166. $result['list'] = $list;
  167. return $result;
  168. }
  169. #部分公用信息
  170. $res1 = $this->getCorpSupplierId(1);//取运营主体【蜘蛛国旅】对应的渠道id
  171. $res2 = $this->getCorpSupplierId(1, 187);//取运营主体【蜘蛛国旅】对应的供应商id
  172. if (!$res1 || !$res2) {
  173. $result['code'] = '1';
  174. $result['info'] = '运营主体对应渠道或供应商出错(spider)';
  175. $result['list'] = $list;
  176. return $result;
  177. }
  178. $spider_supplier_id = $res1;//运营主体【蜘蛛国旅】对应的渠道id
  179. $spider_org_id = $res2;//运营主体【蜘蛛国旅】对应的供应商id
  180. $spider_org_name = $this->getSupplierName($spider_org_id);//运营主体【蜘蛛国旅】对应的供应商名称
  181. //3,获取代售具体信息
  182. #--------------------- 3.1 两级结构 (1)蜘蛛代售其他运营主体票种,运营主体a=>蜘蛛 (2)其他运营主体代售蜘蛛的票种,蜘蛛=>运营主体b ---------
  183. if ($real_main_corp_id == 1 || $ori_main_corp_id == 1) {
  184. $agent_level = 2;
  185. #获取agent_level=1的成本 (是上级票种提供方的分销价)
  186. $base_price_one = $ticket_info['spec_prod_price'] ? $ticket_info['spec_prod_price'] : $ticket_info['cost_price'];
  187. $org_id_one = $this->getCorpSupplierId($ori_main_corp_id, 187);//上级运营渠道所对应的供应商id
  188. if (!$org_id_one) {
  189. $result['code'] = '1';
  190. $result['info'] = '运营主体对应渠道或供应商出错(spider)';
  191. return $result;
  192. }
  193. $org_name_one = $this->getSupplierName($org_id_one);//上级运营渠道所对应的供应商名称
  194. #获取agent_level=2的成本(实际应为用车成本,此处取预估成本)
  195. $base_price_two = $this->getOwnerCost($prod_id);
  196. #获取agent_level=1的相关信息 为'unknown'的项,在后续下单流程补充
  197. $ticket_agent_one = array(
  198. 'prod_top_org_id' => $org_id_one,
  199. 'prod_supply_org_name' => $org_name_one,
  200. 'outside_sale_org_id' => $supplier_id,
  201. 'outside_sale_org_name' => $this->getSupplierName($supplier_id),
  202. 'outside_order_no' => 'unknown',
  203. 'sub_channel_id' => $supplier_id,
  204. 'sub_channel_no' => 'unknown',
  205. 'main_corp_id' => $real_main_corp_id,
  206. 'source_main_corp_id' => $ori_main_corp_id,
  207. 'sale_path' => 'unknown',
  208. 'agent_level' => 1,
  209. 'base_price' => $base_price_one,
  210. 'order_price' => 'unknown'
  211. );
  212. #获取agent_level=2的相关信息 为'unknown'的项,在后续下单流程补充
  213. $ticket_agent_two = array(
  214. 'prod_top_org_id' => $org_id,
  215. 'prod_supply_org_name' => $org_name,
  216. 'outside_sale_org_id' => $corp_supplier_id,
  217. 'sales_man' => $this->getSupplierSalesName($corp_supplier_id),
  218. 'outside_sale_org_name' => $this->getSupplierName($corp_supplier_id),
  219. 'outside_order_no' => 'unknown',
  220. 'sub_channel_id' => $supplier_id,
  221. 'sub_channel_no' => 'unknown',
  222. 'main_corp_id' => $ori_main_corp_id,
  223. 'source_main_corp_id' => $ori_main_corp_id,
  224. 'sale_path' => 'unknown',
  225. 'agent_level' => 2,
  226. 'base_price' => $base_price_two,
  227. 'order_price' => $base_price_one
  228. );
  229. $ticket_agent_list[1] = $ticket_agent_one;
  230. $ticket_agent_list[2] = $ticket_agent_two;
  231. #3.2 ------------------- 三级结构,运营主体a=>蜘蛛=>运营主体b -------------------------------------------------------
  232. } else {
  233. $agent_level = 3;
  234. #获取agent_level=1的成本 (是票种上级2提供的分销价)
  235. $base_price_one = $ticket_info['spec_prod_price'] ? $ticket_info['spec_prod_price'] : $ticket_info['cost_price'];
  236. #获取agent_level=2的成本 (是票种上级3提供的分销价)
  237. $org_id_two = $this->getCorpSupplierId($ori_main_corp_id, 187);//上级运营渠道所对应的供应商id
  238. if (!$org_id_two) {
  239. $result['code'] = '1';
  240. $result['info'] = '运营主体对应渠道或供应商出错(spider)';
  241. return $result;
  242. }
  243. $org_name_two = $this->getSupplierName($org_id_two);//上级运营渠道所对应的供应商名称
  244. $mid_ticket = OperaTicketsAgent::find()->select('a.ticket_id,a.line_id,a.from_main_corp_id,a.to_main_corp_id,b.authority_status,b.prod_price as spec_prod_price,a.cost_price,a.prod_price')
  245. ->from(OperaTicketsAgent::tableName() . ' as a')
  246. ->leftJoin(OperaTicketsDistrib::tableName() . ' as b', 'a.ticket_id=b.ticket_id and b.supplier_id=' . $spider_supplier_id)
  247. ->where([
  248. 'and',
  249. 'a.ticket_id= ' . $prod_id,
  250. 'a.to_main_corp_id=1',
  251. 'a.authority_status=1',
  252. 'a.is_onsale=1',
  253. 'a.cancel_flag=0',
  254. ['or', 'b.cancel_flag=0', 'b.cancel_flag is null'],
  255. ['or', 'b.authority_status=1', 'b.authority_status is null']
  256. ])->asArray()->limit(1)->one();
  257. if (!$mid_ticket) {
  258. $list['agent_depth'] = $agent_level;
  259. $result['code'] = '1';
  260. $result['info'] = '代售票种' . $prod_id . '不可售(没有得到正确授权)';
  261. $result['list'] = $list;
  262. return $result;
  263. }
  264. $base_price_two = $mid_ticket['spec_prod_price'] ? $mid_ticket['spec_prod_price'] : $mid_ticket['cost_price'];
  265. #获取agent_level=3的成本(实际应为用车成本,此处取预估成本)
  266. $base_price_three = $this->getOwnerCost($prod_id);
  267. #获取agent_level=1的相关信息 为'unknown'的项,在后续下单流程补充
  268. $ticket_agent_one = array(
  269. 'prod_top_org_id' => $spider_org_id,
  270. 'prod_supply_org_name' => $spider_org_name,
  271. 'outside_sale_org_id' => $supplier_id,
  272. 'outside_sale_org_name' => $this->getSupplierName($supplier_id),
  273. 'outside_order_no' => 'unknown',
  274. 'sub_channel_id' => $supplier_id,
  275. 'sub_channel_no' => 'unknown',
  276. 'main_corp_id' => $real_main_corp_id,
  277. 'source_main_corp_id' => $ori_main_corp_id,
  278. 'sale_path' => 'unknown',
  279. 'agent_level' => 1,
  280. 'base_price' => $base_price_one,
  281. 'order_price' => 'unknown'
  282. );
  283. #获取agent_level=2的相关信息 为'unknown'的项,在后续下单流程补充
  284. $ticket_agent_two = array(
  285. 'prod_top_org_id' => $org_id_two,
  286. 'prod_supply_org_name' => $org_name_two,
  287. 'outside_sale_org_id' => $corp_supplier_id,
  288. 'outside_sale_org_name' => $this->getSupplierName($corp_supplier_id),
  289. 'sales_man' => $this->getSupplierSalesName($corp_supplier_id),
  290. 'outside_order_no' => 'unknown',
  291. 'sub_channel_id' => $supplier_id,
  292. 'sub_channel_no' => 'unknown',
  293. 'main_corp_id' => 1,
  294. 'source_main_corp_id' => $ori_main_corp_id,
  295. 'sale_path' => 'unknown',
  296. 'agent_level' => 2,
  297. 'base_price' => $base_price_two,
  298. 'order_price' => $base_price_one
  299. );
  300. #获取agent_level=3的相关信息 为'unknown'的项,在后续下单流程补充
  301. $ticket_agent_three = array(
  302. 'prod_top_org_id' => $org_id,
  303. 'prod_supply_org_name' => $org_name,
  304. 'outside_sale_org_id' => 1,
  305. 'outside_sale_org_name' => $this->getSupplierName(1),
  306. 'sales_man' => $this->getSupplierSalesName(1),
  307. 'outside_order_no' => 'unknown',
  308. 'sub_channel_id' => $corp_supplier_id,
  309. 'sub_channel_no' => 'unknown',
  310. 'main_corp_id' => $ori_main_corp_id,
  311. 'source_main_corp_id' => $ori_main_corp_id,
  312. 'sale_path' => 'unknown',
  313. 'agent_level' => 3,
  314. 'base_price' => $base_price_three,
  315. 'order_price' => $base_price_two
  316. );
  317. $ticket_agent_list[1] = $ticket_agent_one;
  318. $ticket_agent_list[2] = $ticket_agent_two;
  319. $ticket_agent_list[3] = $ticket_agent_three;
  320. }
  321. //4,构造返回数组
  322. $list['agent_depth'] = $agent_level;
  323. $list['ticket_agent_list'] = $ticket_agent_list;
  324. $result['code'] = '0';
  325. $result['info'] = '获取票种代售信息成功(代售票种)';
  326. $result['list'] = $list;
  327. return $result;
  328. }
  329. /**
  330. * Function Description:得到运营主体相对应的渠道id或者供应商id
  331. * Function Name: getCorpSupplierId
  332. * @param $main_corp_id
  333. * @param $type 301渠道商id,187供应商id
  334. * @return array
  335. *
  336. * @author 温依莅
  337. */
  338. public function getCorpSupplierId($main_corp_id, $type = 301)
  339. {
  340. $type_name = $type == 301 ? '渠道商' : '供应商';
  341. $res = BaseSupplier::find()->select('id,supplier_name')->where(['reflect_main_corp' => $main_corp_id, 'supplier_type' => $type, 'is_disabled' => 0, 'cancel_flag' => 0])->limit(1)->asArray()->one();
  342. $result = array();
  343. // if (!$res) {
  344. // $result['code'] = '1';
  345. // $result['info'] = '该运营主体无对应' . $type_name;
  346. // return $result;
  347. // }
  348. $corp_supplier_id = $res['id'];//所属运营主体对应的渠道/供应商
  349. // $result['code'] = '0';
  350. // $result['info'] = '返回对应' . $type_name . '成功';
  351. // $result['id'] = $corp_supplier_id;
  352. // return $result;
  353. return $corp_supplier_id;
  354. }
  355. /**
  356. * Function Description:得到票种拥有者的票种预估成本
  357. * Function Name: getOwnerCost
  358. * @param $prod_id
  359. *
  360. * @return int
  361. *
  362. * @author 温依莅
  363. */
  364. public function getOwnerCost($prod_id)
  365. {
  366. $res = OperaTickets::find()->select('ticket_id,cost_price')->where(['ticket_id' => $prod_id, 'cancel_flag' => 0])->limit(1)->asArray()->one();
  367. return $res['cost_price'];
  368. }
  369. /**
  370. * Function Description:取得票种所在线路的供应商id
  371. * Function Name: getLineOrgId
  372. * @param $prod_id
  373. *
  374. * @return int
  375. *
  376. * @author 温依莅
  377. */
  378. public function getLineOrgId($prod_id)
  379. {
  380. $res = OperaTickets::find()
  381. ->select('a.ticket_id,b.org_id')
  382. ->from(OperaTickets::tableName() . ' as a')
  383. ->leftJoin(OperaLine::tableName() . ' as b', 'a.line_id=b.line_id')
  384. ->where([
  385. 'ticket_id' => $prod_id
  386. ])->limit(1)->asArray()->one();
  387. return $res['org_id'];
  388. }
  389. /**
  390. * Function Description:根据id获取供应商(渠道商)名称
  391. * Function Name: getSupplierName
  392. * @param $supplier_id
  393. *
  394. * @return string
  395. *
  396. * @author 温依莅
  397. */
  398. public function getSupplierName($supplier_id)
  399. {
  400. $res = BaseSupplier::find()->select('id,supplier_name')->where(['id' => $supplier_id])->limit(1)->asArray()->one();
  401. return $res['supplier_name'];
  402. }
  403. /**
  404. * Function Description:根据id获取供应商(渠道商)业务员名称
  405. * Function Name: getSupplierSalesName
  406. * @param $supplier_id
  407. *
  408. * @return string
  409. *
  410. * @author 温依莅
  411. */
  412. public function getSupplierSalesName($supplier_id)
  413. {
  414. $res = BaseSupplier::find()->select('id,supplier_name,sales_man')->where(['id' => $supplier_id])->limit(1)->asArray()->one();
  415. return $res['sales_man'];
  416. }
  417. /**
  418. * Function Description:判断生成代收票种数据
  419. * Function Name: getFinalProductList
  420. * @param array $prod_list_arr 票种数据数组
  421. * @param int $outside_sale_org_id 渠道id
  422. * @param int $outside_order_no 渠道名称
  423. * @param int $user_id 下单用户id
  424. *
  425. * @return array
  426. *
  427. * @author 温依莅
  428. */
  429. public function getFinalProductList($prod_list_arr, $outside_sale_org_id, $outside_order_no, $user_id)
  430. {
  431. $result = array();
  432. $prod_list_final = $prod_list_arr;
  433. //1,初步将代收信息整合进票种数组
  434. foreach ($prod_list_arr as $k => $v) {
  435. $res = $this->getTicketAgentInfo($v['ticket_id'], $outside_sale_org_id, $user_id);
  436. if ($res['code'] != '0') {
  437. $result['code'] = 1;
  438. $result['info'] = $res['info'];
  439. return $result;
  440. }
  441. $list = $res['list'];
  442. #prod_list_final里ticket对应的值存 销售层级1的数据
  443. $prod_list_final[$k]['is_agent'] = $list['is_agent'];//是否是代理票种
  444. $prod_list_final[$k]['agent_depth'] = $list['agent_depth'];//销售层数
  445. $prod_list_final[$k]['prod_top_org_id'] = $list['ticket_agent_list'][1]['prod_top_org_id'];//供应商id
  446. $prod_list_final[$k]['prod_supply_org_name'] = $list['ticket_agent_list'][1]['prod_supply_org_name'];//供应商姓名
  447. $prod_list_final[$k]['outside_sale_org_id'] = $outside_sale_org_id;//渠道商id
  448. $prod_list_final[$k]['outside_order_no'] = $outside_order_no;//渠道订单号
  449. $prod_list_final[$k]['sub_channel_id'] = $outside_sale_org_id;//下级渠道id
  450. $prod_list_final[$k]['sub_channel_no'] = $outside_order_no;//下级渠道订单号
  451. $prod_list_final[$k]['main_corp_id'] = $list['ticket_agent_list'][1]['main_corp_id'];//订单所属运营主体
  452. $prod_list_final[$k]['source_main_corp_id'] = $list['ticket_agent_list'][1]['source_main_corp_id'];//线路所属运营主体
  453. $prod_list_final[$k]['sale_path'] = $list['ticket_agent_list'][1]['sale_path'];//销售路径(代售才有,自营为空)
  454. $prod_list_final[$k]['agent_level'] = $list['ticket_agent_list'][1]['agent_level'];//售卖层级:终端1,上一级2,再上一级3
  455. $prod_list_final[$k]['base_price'] = $list['ticket_agent_list'][1]['base_price'];//子订单成本
  456. $prod_list_final[$k]['total_base_price'] = $prod_list_final[$k]['base_price'] * $prod_list_final[$k]['people_num'];//主订单成本
  457. #根据销售层级得到代收数组
  458. $prod_list_final[$k]['agent_list'] = $list['ticket_agent_list'];
  459. }
  460. //2,生成订单号:其中主订单id直接嵌入数组相关字段,子订单给出起始id,完成base_unique_id2表的更新
  461. #2.1,计算BaseUniqueId 需要增加的值(往返程的主订单和子订单的id个数),,更新唯一键值
  462. $add_count = 0;
  463. $main_id_count = 0;
  464. foreach ($prod_list_final as $k => $v) {
  465. $add_count += ($v['people_num'] + 1) * $v['agent_depth'];
  466. $main_id_count += $v['agent_depth'];
  467. }
  468. $temp = BaseUniqueId2::find()->select('unique_id')->where(['id' => 1])->asArray()->one();
  469. $base_main_id = $temp['unique_id'] + 0;
  470. $son_id_begin = $base_main_id + $main_id_count + 1;//子订单起始id
  471. $time=time().rand(0,999999);
  472. $res = BaseUniqueId2::updateAll(['UNIQUE_ID' => $base_main_id + $add_count + 1,'UPDATE_TIME'=>$time], ['id' => 1]);
  473. if (!$res) {
  474. $result['code'] = '1';
  475. $result['info'] = 'BaseUniqueId更新失败';
  476. return $result;
  477. }
  478. #2.2,生成订单号,按需求重组进prod_list_final数组里
  479. $main_order_id_arr = array();//主订单号数组
  480. foreach ($prod_list_final as $k => $v) {
  481. $agent_depth = $v['agent_depth'];
  482. $id_arr = $this->getPointNum($base_main_id, $agent_depth);//array(1001,1002,1003)
  483. $base_main_id += $agent_depth;//增加初始值
  484. $id_str = implode(',', $id_arr);//1001,1002,1003
  485. $main_order_id_arr[$k] = $id_arr;
  486. $prod_list_final[$k]['order_id'] = $id_arr[1];
  487. $prod_list_final[$k]['sale_path'] = $v['is_agent'] ? $id_str : '';//如果是代售票种,写入销售路径,否则为空字符串
  488. foreach ($v['agent_list'] as $ak => $av) {
  489. $prod_list_final[$k]['agent_list'][$ak]['order_id'] = $id_arr[$ak];//主订单号
  490. $prod_list_final[$k]['agent_list'][$ak]['sale_path'] = $prod_list_final[$k]['sale_path'];//销售路径
  491. if ($ak == 1) { //agent_level_1
  492. $prod_list_final[$k]['agent_list'][$ak]['outside_order_no'] = $prod_list_final[$k]['outside_order_no'];//agent_level_1 渠道订单号
  493. $prod_list_final[$k]['agent_list'][$ak]['sub_channel_no'] = $prod_list_final[$k]['sub_channel_no'];//agent_level_1 下级订单号
  494. $prod_list_final[$k]['agent_list'][$ak]['order_price'] = $prod_list_final[$k]['order_price'];//agent_level_1 子订单售价
  495. $prod_list_final[$k]['agent_list'][$ak]['total_order_price'] = $prod_list_final[$k]['total_order_price'];//agent_level_1 主订单售价
  496. $prod_list_final[$k]['agent_list'][$ak]['total_base_price'] = $prod_list_final[$k]['total_base_price'];//agent_level_1 主订单成本
  497. } else if ($ak == 2) { //agent_level_2
  498. $prod_list_final[$k]['agent_list'][$ak]['outside_order_no'] = 'SPIDER-' . $id_arr[1];//agent_level_2 渠道订单号
  499. $prod_list_final[$k]['agent_list'][$ak]['sub_channel_no'] = $prod_list_final[$k]['outside_order_no'];//agent_level_2 下级订单号
  500. $prod_list_final[$k]['agent_list'][$ak]['total_order_price'] = $av['order_price'] * $prod_list_final[$k]['people_num'];//agent_level_2 主订单售价
  501. $prod_list_final[$k]['agent_list'][$ak]['total_base_price'] = $av['base_price'] * $prod_list_final[$k]['people_num'];//agent_level_2 主订单成本
  502. } else if ($ak == 3) { //agent_level_3
  503. $prod_list_final[$k]['agent_list'][$ak]['outside_order_no'] = 'SPIDER-' . $id_arr[2];//agent_level_3 渠道订单号
  504. $prod_list_final[$k]['agent_list'][$ak]['sub_channel_no'] = 'SPIDER-' . $id_arr[1];//agent_level_3 下级订单号
  505. $prod_list_final[$k]['agent_list'][$ak]['total_order_price'] = $av['order_price'] * $prod_list_final[$k]['people_num'];//agent_level_3 主订单售价
  506. $prod_list_final[$k]['agent_list'][$ak]['total_base_price'] = $av['base_price'] * $prod_list_final[$k]['people_num'];//agent_level_3 主订单成本
  507. }
  508. }
  509. }
  510. $result['code'] = 0;
  511. $result['info'] = '代售信息订单号整合成功';
  512. $result['prod_list'] = $prod_list_final;
  513. $result['main_order_id_arr'] = $main_order_id_arr;
  514. $result['son_id_begin'] = $son_id_begin;
  515. return $result;
  516. }
  517. /**
  518. * Function Description:单巴士下单接口
  519. * Function Name: submitBusOrder
  520. * @param array $prod_list_arr 产品列表
  521. * @param array $seat_arr 座位
  522. * @param array $order_info_arr 订单的其他信息
  523. * @param array $customer_info_arr 乘客
  524. * @param array $order_append_arr 附加产品
  525. * @param int $is_send_msg 是否发短信
  526. *
  527. * @return mixed
  528. *
  529. * @author 张帅
  530. */
  531. public function submitBusOrder($prod_list_arr, $seat_arr, $order_info_arr, $customer_info_arr, $order_append_arr, $is_send_msg, $buy_insurance = 0)
  532. {
  533. //一,判断生成 代售票种数据:同时生成好订单的id(其中主订单id直接嵌入数组关联字段,子订单给出起始id);计算更新base_unique_id2值
  534. $res = $this->getFinalProductList($prod_list_arr, $order_info_arr['outside_sale_org_id'], $order_info_arr['outside_order_no'], $order_info_arr['user_id']);
  535. if ($res['code'] != '0') {
  536. $result['code'] = '1';
  537. $result['info'] = $res['info'];
  538. return $result;
  539. }
  540. $prod_list = $res['prod_list'];
  541. $main_order_id_arr = $res['main_order_id_arr'];//生成好的主订单号(包含代售主订单号)
  542. $son_id_begin = $res['son_id_begin'];//子订单起始订单号
  543. //二,生成需要操作数据库的信息
  544. #region 提交订单操作数据库所需数据
  545. $main_order = [];//主订单数据
  546. $main_order_key = [];//提交主订单时所需key值
  547. $son_order = [];//子订单数据
  548. $son_order_key = [];//提交子订单时所需key值
  549. $run_x_arr = [];//run_x
  550. $run_bus_prod_stock_arr = [];//run_bus,run_prod,run_stock更新数据
  551. $main_order_id = [];//订单id数组
  552. $pay_main_arr = [];//主支付记录数据
  553. $pay_main_key = [];//主支付记录键值
  554. $order_price = 0;
  555. $son_order_id = $son_id_begin;//子订单起始订单号
  556. #endregion
  557. //如有半角双引号,替换成半角空格
  558. $customer_info_arr['customer_memo'] = str_replace('"', " ", $customer_info_arr['customer_memo']);
  559. #region 整理数据
  560. foreach ($prod_list as $key => $vel) {
  561. $run_x_one = [];//run_x_one
  562. #region 主订单数据
  563. $main_order_val = [
  564. 'ID' => $vel['order_id'],
  565. 'MAIN_CREATE_USER_ID' => $order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  566. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  567. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  568. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  569. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  570. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  571. 'SALE_TOP_ORG_ID' => 0,//'下单组织机构所属一级机构ID',
  572. 'PROD_TOP_ORG_ID' => $vel['prod_top_org_id'],//供应商id,
  573. 'ORDER_ID' => $vel['order_id'],
  574. 'ORDER_DESCRIPTION' => $vel['ticket_name'] . ',' . $vel['run_date'] . ',' . $vel['people_num'] . '|' . $vel['people_num'],//'最细颗粒度的订单描述',
  575. 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_order_no'],//'分销商订单编号',
  576. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  577. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  578. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  579. 'ORDER_PAY_MAIN_ID' => $vel['order_id'],//'支付记录主ID,ORDER_PAY_MAIN.ID',
  580. 'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
  581. 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  582. 'PARENT_ORDER_ID' => 0,
  583. 'PARENT_PROD_ID' => $vel['line_id'],
  584. 'PRINCIPAL_ID'=>$vel['principal_id'],
  585. 'PARENT_PROD_NAME' => $vel['line_name'],
  586. 'ORDER_PRICE' => $vel['total_order_price'],//'订单价格',
  587. 'ORDER_PROD_TYPE' => 81,//'订单类型',
  588. 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],//'上车站检票口资源ID',
  589. 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],//'上车站检票口资源名称',
  590. 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],//'上车站发车时间距发车日零点分钟数',
  591. 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],//'下车站发车时间距发车日零点分钟数',
  592. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  593. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  594. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  595. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  596. 'CUSTOMER_ADDRESS' => $customer_info_arr['customer_address'],//'顾客地址' 新增by luocj 2017-08-23,
  597. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  598. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  599. 'MEMBER_ID' => $order_info_arr['member_id'],
  600. 'ORDER_STATUS' => $order_info_arr['order_status'],//'订单当前状态',
  601. 'IF_LAST_PROD' => 1,//'是否最细颗粒度的判断',
  602. 'if_gift' => $buy_insurance,//'是否是赠票,0不是赠票,1是赠票',
  603. 'ORDER_LEVEL' => 0,//'Order Level',
  604. 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],//渠道id
  605. 'SALES_MAN' => $order_info_arr['sales_man'],
  606. 'RECEIVE_VALUE' => $vel['total_receiver_value'],
  607. 'PROD_SUPPLY_ORG_NAME' => $vel['prod_supply_org_name'],//供应商名字
  608. 'SUB_CHANNEL_ID' => $vel['sub_channel_id'],//下级渠道id
  609. 'SUB_CHANNEL_NO' => $vel['sub_channel_no'],//下级渠道订单号
  610. 'MAIN_CORP_ID' => $vel['main_corp_id'],//订单所属运营主体
  611. 'SOURCE_MAIN_CORP_ID' => $vel['source_main_corp_id'],//线路所属运营主体
  612. 'SALE_PATH' => $vel['sale_path'],//销售路径
  613. 'AGENT_LEVEL' => $vel['agent_level'],//售卖层级:终端1,上一级2,再上一级3
  614. 'BASE_PRICE' => $vel['total_base_price'] //成本价
  615. ];
  616. #endregion
  617. $single_price = $vel['total_order_price'];
  618. $order_price += $vel['total_order_price'];
  619. #region 收集主订单的id
  620. if ($vel['if_back'] == 1) {
  621. $main_order_id[0] = $vel['order_id'];//收集主订单的id
  622. } else {
  623. $main_order_id[1] = $vel['order_id'];//收集主订单的id
  624. }
  625. #endregion
  626. #region 主订单key值
  627. if (count($main_order_key) == 0) {
  628. $main_order_key = array_keys($main_order_val);
  629. }
  630. #endregion
  631. #region 主订单数组
  632. //1,agent_level_1的主订单
  633. $main_order[] = $main_order_val;
  634. //2,☆☆☆ 如果是代售,插入代售的相关主订单 ☆☆☆
  635. if ($vel['is_agent'] == 1) {
  636. $agent_list = $vel['agent_list'];
  637. unset($agent_list[1]);//去掉销售层级1的主订单,前面已插入
  638. foreach ($agent_list as $ak => $av) {
  639. $main_order_agent = [
  640. 'ID' => $av['order_id'],
  641. 'MAIN_CREATE_USER_ID' => 2,//$order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  642. 'CREATE_USER_ID' => 2,//$order_info_arr['user_id'],
  643. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  644. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  645. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  646. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  647. 'SALE_TOP_ORG_ID' => 0,//'下单组织机构所属一级机构ID',
  648. 'PROD_TOP_ORG_ID' => $av['prod_top_org_id'],//供应商id,
  649. 'ORDER_ID' => $av['order_id'],
  650. 'ORDER_DESCRIPTION' => $vel['ticket_name'] . ',' . $vel['run_date'] . ',' . $vel['people_num'] . '|' . $vel['people_num'],//'最细颗粒度的订单描述',
  651. 'OUTSIDE_ORDER_NO' => $av['outside_order_no'],//'分销商订单编号',
  652. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  653. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  654. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  655. 'ORDER_PAY_MAIN_ID' => $vel['order_id'],//'支付记录主ID,ORDER_PAY_MAIN.ID',
  656. 'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
  657. 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  658. 'PARENT_ORDER_ID' => 0,
  659. 'PARENT_PROD_ID' => $vel['line_id'],
  660. 'PRINCIPAL_ID'=>$vel['principal_id'],
  661. 'PARENT_PROD_NAME' => $vel['line_name'],
  662. 'ORDER_PRICE' => $av['total_order_price'],//'订单价格',
  663. 'ORDER_PROD_TYPE' => 81,//'订单类型',
  664. 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],//'上车站检票口资源ID',
  665. 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],//'上车站检票口资源名称',
  666. 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],//'上车站发车时间距发车日零点分钟数',
  667. 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],//'下车站发车时间距发车日零点分钟数',
  668. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  669. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  670. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  671. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  672. 'CUSTOMER_ADDRESS' => $customer_info_arr['customer_address'],//'顾客地址' 新增by luocj 2017-08-23,
  673. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  674. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  675. 'MEMBER_ID' => $order_info_arr['member_id'],
  676. 'ORDER_STATUS' => $order_info_arr['order_status'],//'订单当前状态',
  677. 'IF_LAST_PROD' => 1,//'是否最细颗粒度的判断',
  678. 'if_gift' => $buy_insurance,//'是否是赠票,0不是赠票,1是赠票',
  679. 'ORDER_LEVEL' => 0,//'Order Level',
  680. 'OUTSIDE_SALE_ORG_ID' => $av['outside_sale_org_id'],//渠道id
  681. 'SALES_MAN' => $av['sales_man'],//$order_info_arr['sales_man'],
  682. 'RECEIVE_VALUE' => $vel['total_receiver_value'],
  683. 'PROD_SUPPLY_ORG_NAME' => $av['prod_supply_org_name'],//供应商名字
  684. 'SUB_CHANNEL_ID' => $av['sub_channel_id'],//下级渠道id
  685. 'SUB_CHANNEL_NO' => $av['sub_channel_no'],//下级渠道订单号
  686. 'MAIN_CORP_ID' => $av['main_corp_id'],//订单所属运营主体
  687. 'SOURCE_MAIN_CORP_ID' => $av['source_main_corp_id'],//线路所属运营主体
  688. 'SALE_PATH' => $av['sale_path'],//销售路径
  689. 'AGENT_LEVEL' => $av['agent_level'],//售卖层级:终端1,上一级2,再上一级3
  690. 'BASE_PRICE' => $av['total_base_price'] //成本价
  691. ];
  692. $main_order[] = $main_order_agent;
  693. }
  694. }
  695. #endregion
  696. #region 根据人数遍历每个子订单的个数
  697. foreach ($seat_arr[$vel['ticket_id']] as $seat_key => $seat_vel) {
  698. $son_level_one_id = $son_order_id;
  699. #region 子订单数据
  700. $this->run_id = $vel['run_id'];
  701. $this->bus_order_id = $seat_vel['bus_order_id'];
  702. $son_order_val = [
  703. 'ID' => $son_order_id,
  704. 'MAIN_CREATE_USER_ID' => $order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  705. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  706. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  707. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  708. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  709. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  710. 'SALE_TOP_ORG_ID' => 0,
  711. 'PROD_TOP_ORG_ID' => $vel['prod_top_org_id'],//供应商id,
  712. 'ORDER_ID' => $son_order_id,
  713. 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_order_no'],//'分销商订单编号',
  714. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  715. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  716. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  717. 'ORDER_PAY_MAIN_ID' => $vel['order_id'],//'支付记录主ID,ORDER_PAY_MAIN.ID',
  718. 'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
  719. 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  720. 'PARENT_ORDER_ID' => $vel['order_id'],
  721. 'PROD_ID' => $vel['ticket_id'],
  722. 'PARENT_PROD_ID' => $vel['line_id'],
  723. 'PRINCIPAL_ID'=>$vel['principal_id'],
  724. 'PROD_NAME' => $vel['ticket_name'],
  725. 'PARENT_PROD_NAME' => $vel['line_name'],
  726. 'ORDER_PRICE' => $vel['order_price'],
  727. 'ORDER_PROD_TYPE' => 82,
  728. 'RUN_ID' => $vel['run_id'],
  729. 'RUN_DATE' => $vel['run_date'],
  730. 'RUN_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),//'班次首发日期参数,发车日期至2016-01-01天数,算法使用',
  731. 'RUN_TIME' => $vel['run_time'],
  732. 'RUN_BUS_ORDER_ID' => $seat_vel['bus_order_id'],//'班次车号,RUN_BUS.BUS_ORDER_ID',
  733. 'RUN_BUS_SEAT_TYPE' => $vel['seat_type'],//'座位类型,DICT_TYPE.ID,普通座、贵宾座等',
  734. 'RUN_BUS_SEAT_SEQ_ID' => $seat_vel['seat_seq_id'],//'座位内部序列ID',
  735. 'RUN_BUS_SEAT_NAME' => $seat_vel['seat_name'],
  736. 'PROD_START_STATION_RES_ID' => $vel['start_res_id'],
  737. 'PROD_START_STATION_RES_NAME' => $vel['start_res_name'],
  738. 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],
  739. 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],
  740. 'PROD_START_STATION_SEQ_ID' => $vel['start_seq_id'],
  741. 'PROD_START_STATION_DATE' => $vel['run_date'],
  742. 'PROD_START_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
  743. 'PROD_START_STATION_TIME' => $vel['start_time'],
  744. 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],
  745. 'PROD_START_STATION_AREA_ID' => $vel['start_area_id'],
  746. 'PROD_START_STATION_AREA_NAME' => $vel['start_area_name'],
  747. 'PROD_END_STATION_RES_ID' => $vel['end_res_id'],
  748. 'PROD_END_STATION_RES_NAME' => $vel['end_res_name'],
  749. 'PROD_END_STATION_SEQ_ID' => $vel['end_seq_id'],
  750. 'PROD_END_STATION_DATE' => $vel['run_date'],
  751. 'PROD_END_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
  752. 'PROD_END_STATION_TIME' => $vel['end_time'],
  753. 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],
  754. 'PROD_END_STATION_AREA_ID' => $vel['end_area_id'],
  755. 'PROD_END_STATION_AREA_NAME' => $vel['end_area_name'],
  756. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  757. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  758. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  759. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  760. 'CUSTOMER_ADDRESS' => $customer_info_arr['customer_address'],//'顾客地址' 新增by luocj 2017-08-23,
  761. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  762. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  763. 'MEMBER_ID' => $order_info_arr['member_id'],
  764. 'ORDER_STATUS' => $order_info_arr['order_status'],
  765. 'if_gift' => $buy_insurance,//'是否是赠票,0不是赠票,1是赠票',
  766. 'ORDER_LEVEL' => 0,
  767. 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],
  768. 'SALES_MAN' => $order_info_arr['sales_man'],
  769. 'RECEIVE_VALUE' => $vel['receiver_value'],
  770. 'PROD_SUPPLY_ORG_NAME' => $vel['prod_supply_org_name'],//供应商名字
  771. 'SUB_CHANNEL_ID' => $vel['sub_channel_id'],//下级渠道id
  772. 'SUB_CHANNEL_NO' => $vel['sub_channel_no'],//下级渠道订单号
  773. 'MAIN_CORP_ID' => $vel['main_corp_id'],//订单所属运营主体
  774. 'SOURCE_MAIN_CORP_ID' => $vel['source_main_corp_id'],//线路所属运营主体
  775. 'SALE_PATH' => $vel['sale_path'],//销售路径
  776. 'AGENT_LEVEL' => $vel['agent_level'],//售卖层级:终端1,上一级2,再上一级3
  777. 'BASE_PRICE' => $vel['base_price'] //成本价
  778. ];
  779. #endregion
  780. $son_order_id++;//子订单号递增
  781. #region 子订单key值
  782. if (count($son_order_key) == 0) {
  783. $son_order_key = array_keys($son_order_val);
  784. }
  785. #endregion
  786. #region 子订单数组
  787. //1,agent_level_1的子订单
  788. $son_order[] = $son_order_val;
  789. //2,☆☆☆ 如果是代售,插入代售的相关主订单 ☆☆☆
  790. if ($vel['is_agent'] == 1) {
  791. $agent_list_copy = $vel['agent_list'];
  792. unset($agent_list_copy[1]);//去掉销售层级1的主订单,前面已插入
  793. foreach ($agent_list_copy as $akp => $avp) {
  794. $son_order_agent = [
  795. 'ID' => $son_order_id,
  796. 'MAIN_CREATE_USER_ID' => 2,//$order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  797. 'CREATE_USER_ID' => 2,//$order_info_arr['user_id'],
  798. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  799. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  800. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  801. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  802. 'SALE_TOP_ORG_ID' => 0,
  803. 'PROD_TOP_ORG_ID' => $avp['prod_top_org_id'],//供应商id,
  804. 'ORDER_ID' => $son_order_id,
  805. 'OUTSIDE_ORDER_NO' => $avp['outside_order_no'],//'分销商订单编号',
  806. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  807. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  808. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  809. 'ORDER_PAY_MAIN_ID' => $vel['order_id'],//'支付记录主ID,ORDER_PAY_MAIN.ID',
  810. 'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
  811. 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  812. 'PARENT_ORDER_ID' => $avp['order_id'],
  813. 'PROD_ID' => $vel['ticket_id'],
  814. 'PARENT_PROD_ID' => $vel['line_id'],
  815. 'PRINCIPAL_ID'=>$vel['principal_id'],
  816. 'PROD_NAME' => $vel['ticket_name'],
  817. 'PARENT_PROD_NAME' => $vel['line_name'],
  818. 'ORDER_PRICE' => $avp['order_price'],
  819. 'ORDER_PROD_TYPE' => 82,
  820. 'RUN_ID' => $vel['run_id'],
  821. 'RUN_DATE' => $vel['run_date'],
  822. 'RUN_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),//'班次首发日期参数,发车日期至2016-01-01天数,算法使用',
  823. 'RUN_TIME' => $vel['run_time'],
  824. 'RUN_BUS_ORDER_ID' => $seat_vel['bus_order_id'],//'班次车号,RUN_BUS.BUS_ORDER_ID',
  825. 'RUN_BUS_SEAT_TYPE' => $vel['seat_type'],//'座位类型,DICT_TYPE.ID,普通座、贵宾座等',
  826. 'RUN_BUS_SEAT_SEQ_ID' => $seat_vel['seat_seq_id'],//'座位内部序列ID',
  827. 'RUN_BUS_SEAT_NAME' => $seat_vel['seat_name'],
  828. 'PROD_START_STATION_RES_ID' => $vel['start_res_id'],
  829. 'PROD_START_STATION_RES_NAME' => $vel['start_res_name'],
  830. 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],
  831. 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],
  832. 'PROD_START_STATION_SEQ_ID' => $vel['start_seq_id'],
  833. 'PROD_START_STATION_DATE' => $vel['run_date'],
  834. 'PROD_START_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
  835. 'PROD_START_STATION_TIME' => $vel['start_time'],
  836. 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],
  837. 'PROD_START_STATION_AREA_ID' => $vel['start_area_id'],
  838. 'PROD_START_STATION_AREA_NAME' => $vel['start_area_name'],
  839. 'PROD_END_STATION_RES_ID' => $vel['end_res_id'],
  840. 'PROD_END_STATION_RES_NAME' => $vel['end_res_name'],
  841. 'PROD_END_STATION_SEQ_ID' => $vel['end_seq_id'],
  842. 'PROD_END_STATION_DATE' => $vel['run_date'],
  843. 'PROD_END_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
  844. 'PROD_END_STATION_TIME' => $vel['end_time'],
  845. 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],
  846. 'PROD_END_STATION_AREA_ID' => $vel['end_area_id'],
  847. 'PROD_END_STATION_AREA_NAME' => $vel['end_area_name'],
  848. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  849. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  850. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  851. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  852. 'CUSTOMER_ADDRESS' => $customer_info_arr['customer_address'],//'顾客地址' 新增by luocj 2017-08-23,
  853. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  854. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  855. 'MEMBER_ID' => $order_info_arr['member_id'],
  856. 'ORDER_STATUS' => $order_info_arr['order_status'],
  857. 'if_gift' => $buy_insurance,//'是否是赠票,0不是赠票,1是赠票',
  858. 'ORDER_LEVEL' => 0,
  859. 'OUTSIDE_SALE_ORG_ID' => $avp['outside_sale_org_id'],
  860. 'SALES_MAN' => $avp['sales_man'],//$order_info_arr['sales_man'],
  861. 'RECEIVE_VALUE' => $vel['receiver_value'],
  862. 'PROD_SUPPLY_ORG_NAME' => $avp['prod_supply_org_name'],//供应商名字
  863. 'SUB_CHANNEL_ID' => $avp['sub_channel_id'],//下级渠道id
  864. 'SUB_CHANNEL_NO' => $avp['sub_channel_no'],//下级渠道订单号
  865. 'MAIN_CORP_ID' => $avp['main_corp_id'],//订单所属运营主体
  866. 'SOURCE_MAIN_CORP_ID' => $avp['source_main_corp_id'],//线路所属运营主体
  867. 'SALE_PATH' => $avp['sale_path'],//销售路径
  868. 'AGENT_LEVEL' => $avp['agent_level'],//售卖层级:终端1,上一级2,再上一级3
  869. 'BASE_PRICE' => $avp['base_price'] //成本价
  870. ];
  871. $son_order[] = $son_order_agent;
  872. $son_order_id++;//子订单号递增
  873. }
  874. }
  875. #endregion
  876. #region run_bus,run_prod,run_stock更新数据
  877. if (!isset($run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']])) {
  878. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['num'] = $vel['people_num'];//数量
  879. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['run_id'] = $vel['run_id'];//班次id
  880. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['bus_order_id'] = $seat_vel['bus_order_id'];//车次号
  881. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['ticket_id'] = $vel['ticket_id'];//票种id
  882. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['start_seq_id'] = $vel['start_seq_id'];//开始站顺序号
  883. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['end_seq_id'] = $vel['end_seq_id'];//结束站顺序号
  884. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['seat_type'] = $vel['seat_type'];//座位类型
  885. }
  886. #endregion
  887. #region 更新run_x配置数据
  888. $run_x_one[$seat_key]['run_x_id'] = $seat_vel['run_x_id'];
  889. $run_x_one[$seat_key]['run_date'] = substr($vel['run_date'], 0, 7);
  890. $run_x_one[$seat_key]['run_date'] = str_replace('-', '', $run_x_one[$seat_key]['run_date']);//run_x表的日期后缀
  891. $run_x_one[$seat_key]['order_main_id'] = $son_level_one_id;//子订单号
  892. $run_x_one[$seat_key]['order_main_prod_id'] = $vel['line_id'];//线路id
  893. $run_x_one[$seat_key]['order_prod_id'] = $vel['ticket_id'];//票种id
  894. #endregion
  895. }
  896. #endregion
  897. #region 更新run_x配置数据
  898. $run_x_arr[$key] = $run_x_one;
  899. #endregion
  900. }
  901. #endregion
  902. #region 主支付记录数据数组
  903. foreach ($main_order_id as $key => $vel) {
  904. #region 主支付记录
  905. $pay_main_one = [
  906. 'ID' => $main_order_id[0],
  907. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  908. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  909. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  910. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  911. 'PAY_TOTAL' => $single_price,
  912. 'ORDER_ID' => $vel,
  913. ];
  914. #endregion
  915. $pay_main_arr[] = $pay_main_one;//主支付记录数组
  916. #region 主支付记录key值
  917. if (count($pay_main_key) == 0) {
  918. $pay_main_key = array_keys($pay_main_one);
  919. }
  920. #endregion
  921. }
  922. #endregion
  923. //三,正式执行,插入更新数据库
  924. $transaction = Yii::$app->db->beginTransaction();
  925. try {
  926. #region 1.占座 更新run_x表
  927. foreach ($run_x_arr as $run_x_key => $run_x_vel) {
  928. foreach ($run_x_vel as $key => $vel) {
  929. $update_sql = 'update run_' . $vel['run_date'] . '
  930. set order_main_id = ' . $vel['order_main_id'] . ',
  931. order_main_prod_id = ' . $vel['order_main_prod_id'] . ',
  932. order_prod_id = ' . $vel['order_prod_id'] . ',
  933. seat_status = 2,
  934. order_lock_user_id = ' . $order_info_arr['user_id'] . ',
  935. order_lock_time = \'' . date('Y-m-d H:i:s') . '\'
  936. where id in (' . $vel['run_x_id'] . ')';
  937. $res = Yii::$app->db->createCommand($update_sql)->execute();
  938. if (!$res) {
  939. throw new Exception('占位失败');
  940. }
  941. }
  942. }
  943. #endregion
  944. #region 2.插入主订单
  945. $res = Yii::$app->db->createCommand()->batchInsert(OrderMain::tableName(), $main_order_key, $main_order)->execute();
  946. if (!$res) {
  947. throw new Exception('主订单提交失败');
  948. }
  949. #endregion
  950. #region 3.插入子订单
  951. $res = Yii::$app->db->createCommand()->batchInsert(OrderMain::tableName(), $son_order_key, $son_order)->execute();
  952. if (!$res) {
  953. throw new Exception('子订单提交失败');
  954. }
  955. #endregion
  956. #region 4.更新run_prod,run_bus,run_stock
  957. foreach ($run_bus_prod_stock_arr as $key => $vel) {
  958. #region (1).更新run_prod
  959. $update_value = [
  960. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  961. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  962. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  963. ];
  964. $update_where = [
  965. 'and',
  966. ['=', 'run_id', $vel['run_id']],
  967. ['=', 'prod_id', $vel['ticket_id']],
  968. ['=', 'cancel_flag', 0],
  969. ];
  970. $res = RunProd::updateAll($update_value, $update_where);
  971. if (!$res) {
  972. throw new Exception('更新run_prod失败');
  973. }
  974. #endregion
  975. #region (2).更新run_bus
  976. $update_value = [
  977. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  978. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  979. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  980. ];
  981. $update_where = [
  982. 'and',
  983. ['=', 'run_id', $vel['run_id']],
  984. ['=', 'bus_order_id', $vel['bus_order_id']],
  985. ['=', 'cancel_flag', 0],
  986. ];
  987. $res = RunBus::updateAll($update_value, $update_where);
  988. if (!$res) {
  989. throw new Exception('更新run_bus失败');
  990. }
  991. #endregion
  992. #region (3).更新run_stock
  993. $update_value = [
  994. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  995. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  996. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  997. ];
  998. $update_where = [
  999. 'and',
  1000. ['=', 'run_id', $vel['run_id']],
  1001. ['>=', 'seq_id', $vel['start_seq_id']],
  1002. ['<', 'seq_id', $vel['end_seq_id']],
  1003. ['=', 'seat_type', $vel['seat_type']],
  1004. ['=', 'cancel_flag', 0],
  1005. ];
  1006. $res = RunStock::updateAll($update_value, $update_where);
  1007. if (!$res) {
  1008. throw new Exception('更新run_stock失败');
  1009. }
  1010. #endregion
  1011. }
  1012. #endregion
  1013. //==================这里加判断,只有是已支付状态,才插入支付记录=============
  1014. // if ($order_info_arr['order_pay_status'] == 1) {
  1015. #region 5.插入主支付记录
  1016. $res = Yii::$app->db->createCommand()->batchInsert(OrderPayMain::tableName(), $pay_main_key, $pay_main_arr)->execute();
  1017. if (!$res) {
  1018. throw new Exception('插入主支付记录失败');
  1019. }
  1020. #endregion
  1021. #region 6.插入支付明细
  1022. $order_pay_detail = new OrderPayDetail();
  1023. $order_pay_detail->attributes = [
  1024. 'ID' => $main_order_id[0],
  1025. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  1026. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  1027. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1028. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1029. 'PAY_MAIN_ID' => $main_order_id[0],
  1030. 'PAY_TYPE_ID_1' => $order_info_arr['pay_type'],
  1031. 'PAY_MONEY' => $order_price,
  1032. ];
  1033. $res = $order_pay_detail->insert();
  1034. if (!$res) {
  1035. throw new Exception('插入支付明细失败');
  1036. }
  1037. #endregion
  1038. // }
  1039. #region 8.如果是往返 建立往返关系
  1040. if (count($main_order_id) == 2) {
  1041. $to_from = new ToFrom();
  1042. $to_from->attributes = [
  1043. 'to_orderid' => $main_order_id[0],
  1044. 'back_orderid' => $main_order_id[1],
  1045. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  1046. ];
  1047. $res = $to_from->insert();
  1048. if (!$res) {
  1049. throw new Exception('建立往返关系失败');
  1050. }
  1051. }
  1052. #endregion
  1053. #region 9.插入酒店门票价格
  1054. if ($order_append_arr['gate_price'] != 0 || $order_append_arr['hotel_price'] != 0) {
  1055. $order_extra_info = new OrderExtraInfo();
  1056. $order_extra_info->attributes = [
  1057. 'order_id' => $main_order_id[0],
  1058. 'hotel_price' => $order_append_arr['hotel_price'],
  1059. 'gate_price' => $order_append_arr['gate_price'],
  1060. ];
  1061. $res = $order_extra_info->insert();
  1062. if (!$res) {
  1063. throw new Exception('酒店门票价格提交失败' . serialize($order_extra_info->getErrors()));
  1064. }
  1065. }
  1066. #endregion
  1067. #region 10.插入日志
  1068. $opera_time = date('Y-m-d H:i:s');
  1069. foreach ($prod_list as $key => $vel) {
  1070. foreach ($vel['agent_list'] as $ak => $av) {
  1071. $order_opera_log = new OrderOperaLog();
  1072. $order_opera_log->attributes = [
  1073. 'order_id' => $av['order_id'],
  1074. 'opera_user_id' => $av['agent_level'] == 1 ? $order_info_arr['user_id'] : 2,
  1075. 'opera_type' => 1,
  1076. 'opera_time' => $opera_time,
  1077. 'opera_detail' => '创建订单,出发日期' . $vel['run_date'] . ',订单渠道' . $order_info_arr['org_name'] . ',单价' . $av['order_price'] . ',总额' . $av['total_order_price'] . ',联系人信息:' . $customer_info_arr['customer_name'] . ',' . $customer_info_arr['customer_mobile'] . ',' . $customer_info_arr['customer_id_no'] . ',备注信息:' . $customer_info_arr['customer_memo'] . ',乘客地址:' . $customer_info_arr['customer_address'],
  1078. 'member_id' => $order_info_arr['member_id'],
  1079. 'opera_platform' => '统一下单',
  1080. ];
  1081. $res = $order_opera_log->insert();
  1082. if (!$res) {
  1083. throw new Exception('插入日志失败');
  1084. }
  1085. }
  1086. }
  1087. #endregion
  1088. $transaction->commit();
  1089. //$transaction->rollBack();
  1090. #region 13.修改bus_cost库存和单价
  1091. if ($this->run_id != 0 && $this->bus_order_id != 0) {
  1092. $res = self::updateBusCost($this->run_id, $this->bus_order_id);
  1093. if (!file_exists(__DIR__ . '/../log/bus_cost')) {
  1094. mkdir(__DIR__ . '/../log/bus_cost');
  1095. }
  1096. file_put_contents(__DIR__ . '/../log/bus_cost/' . date("Y-m-d") . '.log', date("Y-m-d H:i:s") . json_encode($res) . PHP_EOL, FILE_APPEND);
  1097. }
  1098. #endregion
  1099. #region 11.发送短信
  1100. /*$order_run_time = array();
  1101. foreach($prod_list as $sk=>$sv){
  1102. $order_run_time[$sv['order_id']] = $sv['run_date'];
  1103. }*/
  1104. if ($order_info_arr['order_pay_status'] == 1) {
  1105. foreach ($main_order_id as $key => $vel) {
  1106. //这里对发送短信时间做一个判断,满足条件的才发送短信
  1107. $time_diff = $this->get_time_diff($vel);
  1108. if ($time_diff >= 0) {
  1109. //如果已支付,添加出票成功短信 到数据库
  1110. if ($order_info_arr['order_pay_status'] == 1) {
  1111. // $tomorrow_day = date("Y-m-d", strtotime("+1 days"));
  1112. // $current_time = date("H:i");
  1113. // $order_run_day = $order_run_time[$vel];
  1114. // if ($order_run_day > $tomorrow_day || ($order_run_day == $order_run_day && $current_time < "18:30")) {
  1115. $url = 'http://' . CS1_DOMAIN . '/api/msg/order-send-success-msg';
  1116. $sendInfo['order_id'] = $vel;
  1117. Msg::httpRequestForasyn($url, $sendInfo);
  1118. // }
  1119. }
  1120. if ($is_send_msg == 1) {
  1121. $url = 'http://' . CS1_DOMAIN . '/api/msg/order-send-msg';
  1122. $sendInfo['order_id'] = $vel;
  1123. $sendInfo['msg_type'] = 'cs';
  1124. Msg::httpRequestForasyn($url, $sendInfo);
  1125. }
  1126. }
  1127. }
  1128. }
  1129. #endregion
  1130. #region 12.添加订单状态
  1131. foreach ($main_order_id_arr as $key => $vel) {
  1132. foreach ($vel as $ik => $iv) {
  1133. $url = 'http://' . CS_DOMAIN . '/st-xm/Api/add_order_status_log.php';
  1134. $post_data['order_id'] = $iv;
  1135. if ($order_info_arr['order_pay_status'] == 1) {
  1136. $post_data['order_status'] = '451,452,453';
  1137. } else {
  1138. $post_data['order_status'] = '451';
  1139. }
  1140. Msg::httpRequestForasyn($url, $post_data);
  1141. }
  1142. }
  1143. #endregion
  1144. $result['code'] = '0';
  1145. $result['info'] = '下单成功';
  1146. $result['data'] = implode(',', $main_order_id);
  1147. } catch (Exception $e) {
  1148. # 回滚事务
  1149. $transaction->rollBack();
  1150. $result['code'] = '1';
  1151. $result['info'] = '下单失败';
  1152. $result['error'] = $e->getMessage();
  1153. }
  1154. return $result;
  1155. }
  1156. /**
  1157. * Function Description:获取短信发送时间差(巴士班次时间-当前时间)
  1158. * Function Name: get_time_diff
  1159. * @param int $order_id 巴士主订单
  1160. *
  1161. * @return mixed
  1162. *
  1163. * @author 温依莅
  1164. */
  1165. public function get_time_diff($order_id)
  1166. {
  1167. $now = time();
  1168. //$sql="select b.run_date,b.RUN_MINUTES,(UNIX_TIMESTAMP(b.run_date)+b.run_minutes*60) as stamp from order_main a left join run_main b on a.run_id=b.run_id where a.PARENT_ORDER_ID=$order_id limit 1";
  1169. //$sql = "select b.run_date,b.RUN_MINUTES,(UNIX_TIMESTAMP(b.run_date)) as stamp from order_main a left join run_main b on a.run_id=b.run_id where a.PARENT_ORDER_ID=$order_id limit 1";
  1170. $res = OrderMain::find()->select([
  1171. 'b.run_date',
  1172. 'b.run_minutes',
  1173. 'stamp' => new Expression('UNIX_TIMESTAMP(b.run_date)'),
  1174. ])->from('order_main a')
  1175. ->leftJoin('run_main b', 'a.run_id=b.run_id')
  1176. ->where(['a.parent_order_id' => $order_id])
  1177. ->asArray()
  1178. ->one();
  1179. $run_stamp = $res['stamp'];
  1180. return ($run_stamp + 3600 * 24) - $now;
  1181. }
  1182. /**
  1183. * Function Description:整理产品数据
  1184. * Function Name: getBusProductList
  1185. * @param string $prod_str 选购产品,格式为{去程/返程标志(1:去程 2:返程),去程/返程班次ID,票种ID,票种单价,预定数量,车号}...
  1186. *
  1187. * @return array
  1188. *
  1189. * @author 张帅
  1190. */
  1191. public function getBusProductList($prod_str)
  1192. {
  1193. $result = [];
  1194. $prod_str = substr($prod_str, 1, -1);
  1195. $prod_arr = explode('}{', $prod_str);
  1196. foreach ($prod_arr as $key => $vel) {
  1197. $vel = explode(',', $vel);
  1198. $result[$vel[2]]['if_back'] = $vel[0];//1:去程 2:返程
  1199. $result[$vel[2]]['run_id'] = $vel[1];//班次id
  1200. $result[$vel[2]]['ticket_id'] = $vel[2];//票种id
  1201. //新增判断 如果票种不在上下车可收范围内 则直接不可下单
  1202. $arr = $this->getInOutTickets($vel[1]);
  1203. if (!in_array($vel[2], $arr)) {
  1204. return [];
  1205. }
  1206. $result[$vel[2]]['price'] = $vel[3];//单价
  1207. $result[$vel[2]]['num'] = $vel[4];//数量
  1208. $result[$vel[2]]['bus_order_id'] = isset($vel[5]) ? $vel[5] : 0;//车号
  1209. }
  1210. return $result;
  1211. }
  1212. /**
  1213. * Function Description:获取准确的票种信息
  1214. * Function Name: getInOutTickets
  1215. * @param $run_id
  1216. *
  1217. * @return array
  1218. *
  1219. * @author LUOCJ
  1220. */
  1221. public function getInOutTickets($run_id)
  1222. {
  1223. $sql_line = "select prod_id as line_id from run_station where run_id ={$run_id}";
  1224. $line_id = Yii::$app->db->createCommand($sql_line)->queryAll();
  1225. $sql = "select ticket_id from opera_tickets ot left join run_station rsa on ot.START_STATION_RES_ID = rsa.STATION_RES_ID and rsa.run_id = {$run_id} left join run_station rsb on ot.END_STATION_RES_ID = rsb.STATION_RES_ID and rsb.run_id = {$run_id} where ot.line_id = {$line_id[0]['line_id']} and rsa.STATION_INOUT_TYPE<>114 and rsb.STATION_INOUT_TYPE <>114";
  1226. $data = Yii::$app->db->createCommand($sql)->queryAll();
  1227. $res = [];
  1228. foreach ($data as $k => $v) {
  1229. $res[] = $v['ticket_id'];
  1230. }
  1231. return $res;
  1232. }
  1233. /**
  1234. * Function Description:获取订单数据
  1235. * Function Name: getOrderInfoArray
  1236. * @param string $order_info_str 订单基础信息{下单用户,会员号,渠道id,渠道订单号,是否自动退票(0否1是),支付方式(授信275),是否支付(0否1是),业务员}
  1237. *
  1238. * @return mixed
  1239. *
  1240. * @author 张帅
  1241. */
  1242. public function getOrderInfoArray($order_info_str)
  1243. {
  1244. $order_info_str = substr($order_info_str, 1, -1);
  1245. $order_info_arr = explode(',', $order_info_str);
  1246. $result['user_id'] = (!isset($order_info_arr[0]) || empty($order_info_arr[0])) ? 1 : $order_info_arr[0];//下单用户id
  1247. $result['member_id'] = (!isset($order_info_arr[1]) || empty($order_info_arr[1])) ? 0 : $order_info_arr[1];//会员id
  1248. $result['outside_sale_org_id'] = (!isset($order_info_arr[2]) || empty($order_info_arr[2])) ? 0 : $order_info_arr[2];//外部下单id
  1249. $result['outside_order_no'] = (!isset($order_info_arr[3]) || empty($order_info_arr[3])) ? '' : $order_info_arr[3];//外部下单号
  1250. $result['order_book_status'] = (!isset($order_info_arr[4]) || $order_info_arr[4] === '') ? 1 : $order_info_arr[4];//订单预订状态
  1251. $result['pay_type'] = (!isset($order_info_arr[5]) || empty($order_info_arr[5])) ? 275 : $order_info_arr[5];//支付方式(授信,微信)
  1252. $result['order_pay_status'] = (!isset($order_info_arr[6]) || empty($order_info_arr[6])) ? 0 : $order_info_arr[6];//是否支付
  1253. $result['sales_man'] = (!isset($order_info_arr[7]) || empty($order_info_arr[7])) ? '' : $order_info_arr[7];//业务员
  1254. $supplier_info = BaseSupplier::find()->select('sales_man,supplier_name')->where(['id' => $result['outside_sale_org_id']])->asArray()->one();
  1255. if ($result['sales_man'] == '') {
  1256. $result['sales_man'] = empty($supplier_info['sales_man']) ? '' : $supplier_info['sales_man'];
  1257. }
  1258. $result['org_name'] = empty($supplier_info['supplier_name']) ? '' : $supplier_info['supplier_name'];
  1259. $result['order_status'] = $result['order_pay_status'] == 0 ? 145 : 146;
  1260. return $result;
  1261. }
  1262. /**
  1263. * Function Description:获取乘客信息
  1264. * Function Name: getCustomerInfoArray
  1265. * @param string $customer_info_str 顾客信息,格式为{联系人,联系电话,z证件类型,联系人身份证,备注}
  1266. *
  1267. * @return mixed
  1268. *
  1269. * @author 张帅
  1270. */
  1271. public function getCustomerInfoArray($customer_info_str)
  1272. {
  1273. $customer_info_str = substr($customer_info_str, 1, -1);
  1274. $customer_info_arr = explode(',', $customer_info_str);
  1275. $result['customer_name'] = (!isset($customer_info_arr[0]) || empty($customer_info_arr[0])) ? '' : $customer_info_arr[0];//乘客姓名
  1276. $result['customer_mobile'] = (!isset($customer_info_arr[1]) || empty($customer_info_arr[1])) ? '' : $customer_info_arr[1];//乘客电话
  1277. $result['customer_id_type'] = (!isset($customer_info_arr[2]) || empty($customer_info_arr[2])) ? 150 : $customer_info_arr[2];//乘客证件类型
  1278. $result['customer_id_no'] = (!isset($customer_info_arr[3]) || empty($customer_info_arr[3])) ? '' : $customer_info_arr[3];//乘客证件号
  1279. $result['customer_memo'] = (!isset($customer_info_arr[4]) || empty($customer_info_arr[4])) ? '' : $customer_info_arr[4];//乘客备注
  1280. $result['customer_address'] = (!isset($customer_info_arr[5]) || empty($customer_info_arr[5])) ? '' : $customer_info_arr[5];//乘客地址
  1281. return $result;
  1282. }
  1283. /**
  1284. * Function Description:订单附加产品
  1285. * Function Name: getOrderAppendArray
  1286. * @param string $order_append_str 订单附加产品,格式为{门票价格,酒店价格}
  1287. *
  1288. * @return mixed
  1289. *
  1290. * @author 张帅
  1291. */
  1292. public function getOrderAppendArray($order_append_str)
  1293. {
  1294. $order_append_str = substr($order_append_str, 1, -1);
  1295. $order_append_arr = explode(',', $order_append_str);
  1296. $result['gate_price'] = (!isset($order_append_arr[0]) || empty($order_append_arr[0])) ? '0' : $order_append_arr[0];//门票价格
  1297. $result['hotel_price'] = (!isset($order_append_arr[1]) || empty($order_append_arr[1])) ? '0' : $order_append_arr[1];//酒店价格
  1298. return $result;
  1299. }
  1300. /**
  1301. * Function Description:根据班次和票种id获取产品详情列表
  1302. * Function Name: getBusProductListByRunTicket
  1303. * @param array $run_ticket_arr 产品详情列表
  1304. *
  1305. * @return array|\yii\db\ActiveRecord[]
  1306. *
  1307. * @author 张帅
  1308. */
  1309. public function getBusProductListByRunTicket($run_ticket_arr)
  1310. {
  1311. #region 1.班次票种筛选条件
  1312. $and_where = [
  1313. 'or',
  1314. ];
  1315. foreach ($run_ticket_arr as $key => $vel) {
  1316. $and_where[] = [
  1317. 'and',
  1318. ['=', 'rp.run_id', $vel['run_id']],
  1319. ['=', 'rp.prod_id', $vel['ticket_id']],
  1320. ];
  1321. }
  1322. #endregion
  1323. #region 2.查询结果
  1324. $result = RunProd::find()
  1325. ->select([
  1326. 'run_id' => 'rm.run_id',//班次id
  1327. 'run_date' => 'rm.run_date',//出发日期
  1328. 'run_time' => 'rm.run_time',//出发时间
  1329. 'run_minutes' => 'rm.run_minutes',//出发分钟数
  1330. 'ticket_id' => 'rp.prod_id',//票种id
  1331. 'ticket_name' => 't.ticket_name',//票种名称
  1332. 'seat_type' => 't.seat_type',//座位类型
  1333. 'human_type' => 't.human_type',//人群属性
  1334. 'line_id' => 't.line_id',//线路id
  1335. 'line_name' => 'l.line_name',//线路名称
  1336. 'start_res_id' => 't.start_station_res_id',//上车站id
  1337. 'start_res_name' => BaseResource::find()->select('res_name')->where('res_id = t.start_station_res_id')->limit(1),//上车站name
  1338. 'start_area_id' => 't.start_station_area_id',//出发地id
  1339. 'start_area_name' => BaseArea::find()->select('area_name')->where('id = t.start_station_area_id')->limit(1),//出发地name
  1340. 'start_seq_id' => 's1.station_order_id',//开始站顺序号
  1341. 'start_time' => 's1.start_time',//开始时间
  1342. 'start_minutes' => 's1.start_minutes',//开始分钟数
  1343. 'checkport_res_id' => 's1.checkport_res_id',//检票口id
  1344. 'checkport_res_name' => BaseResource::find()->select('res_name')->where('res_id = s1.checkport_res_id')->limit(1),//检票口name
  1345. 'end_res_id' => 't.end_station_res_id',//下车站id
  1346. 'end_res_name' => BaseResource::find()->select('res_name')->where('res_id = t.end_station_res_id')->limit(1),//下车站name
  1347. 'end_area_id' => 't.end_station_area_id',//目的地id
  1348. 'end_area_name' => BaseArea::find()->select('area_name')->where('id = t.end_station_area_id')->limit(1),//目的地name
  1349. 'end_seq_id' => 's2.station_order_id',//结束站顺序号
  1350. 'end_time' => 's2.start_time',//结束时间
  1351. 'end_minutes' => 's2.start_minutes',//结束分钟数
  1352. 'prod_price' => 't.prod_price',//分销价
  1353. 'cus_price' => 't.cus_price',//零售价
  1354. 'principal_id' => 'l.run_duty_id',//运营负责人
  1355. ])
  1356. ->from(RunProd::tableName() . ' as rp')
  1357. ->leftJoin(RunMain::tableName() . ' as rm', 'rp.run_id = rm.run_id')
  1358. ->leftJoin(OperaTickets::tableName() . ' as t', 'rp.prod_id = t.ticket_id')
  1359. ->leftJoin(OperaLine::tableName() . ' as l', 't.line_id = l.line_id')
  1360. ->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')
  1361. ->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')
  1362. ->where([
  1363. 'and',
  1364. ['=', 'rp.cancel_flag', 0],
  1365. ['=', 't.cancel_flag', 0],
  1366. ['=', 't.is_onsale', 1],
  1367. ])
  1368. ->andWhere($and_where);
  1369. $result_sql = $result->createCommand()->getRawSql();
  1370. $final = $result->indexBy('ticket_id')->asArray()->all();
  1371. #endregion
  1372. return $final;
  1373. }
  1374. /**
  1375. * Function Description:检查run_x中是否有班次
  1376. * Function Name: checkRunX
  1377. * @param array $date_run_arr 日期班次数组
  1378. *
  1379. * @return bool
  1380. *
  1381. * @author 张帅
  1382. */
  1383. public function checkRunX($date_run_arr)
  1384. {
  1385. #region 没有班次直接返回错误
  1386. if (count($date_run_arr) == 0) {
  1387. return false;
  1388. }
  1389. #endregion
  1390. #region 判断每个班次是否存在run_x
  1391. foreach ($date_run_arr as $key => $vel) {
  1392. $sql = '' . 'select
  1393. count(*) as total_count
  1394. from run_' . $key . '
  1395. where run_id in (' . implode(',', $vel) . ')
  1396. group by run_id';
  1397. $res = Yii::$app->db->createCommand($sql)->queryAll();
  1398. #region 如果有不存在班次的直接返回错误
  1399. if (count($res) != count($vel)) {
  1400. return false;
  1401. }
  1402. foreach ($res as $res_key => $res_vel) {
  1403. if ($res_vel['total_count'] == 0) {
  1404. return false;
  1405. }
  1406. }
  1407. #endregion
  1408. }
  1409. #endregion
  1410. return true;
  1411. }
  1412. /**
  1413. * Function Description:获取所有的座位
  1414. * Function Name: getRunBunSeat
  1415. * @param array $run_bus_arr 班次信息
  1416. *
  1417. * @return array|bool
  1418. *
  1419. * @author 张帅
  1420. */
  1421. public function getRunBusSeat($run_bus_arr)
  1422. {
  1423. $result = [];
  1424. foreach ($run_bus_arr as $key => $vel) {
  1425. $sql_and = '';
  1426. if ($vel['bus_order_id'] != 0) {
  1427. $sql_and = ' and bus_order_id = ' . $vel['bus_order_id'];
  1428. }
  1429. $sql = '' . 'select
  1430. 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
  1431. from
  1432. run_' . $vel['run_date'] . '
  1433. where
  1434. run_id = ' . $vel['run_id'] . '
  1435. and order_id >= ' . $vel['start_seq_id'] . '
  1436. and order_id < ' . $vel['end_seq_id'] . '
  1437. and seat_type = ' . $vel['seat_type'] . $sql_and . '
  1438. and cancel_flag = 0
  1439. and seat_status = 0
  1440. group by
  1441. run_id,bus_order_id,seat_type,seat_seq_id,seat_name
  1442. order by seat_seq_id ASC';
  1443. $res = Yii::$app->db->createCommand($sql)->queryAll();
  1444. if (count($res) == 0) {
  1445. return false;
  1446. }
  1447. //分车归理数据
  1448. $res_one = [];
  1449. foreach ($res as $res_key => $res_vel) {
  1450. if ($res_vel['seat_count'] == $vel['seat_count']) {
  1451. $res_one[$res_vel['bus_order_id']][$res_vel['seat_seq_id']] = $res_vel;
  1452. }
  1453. }
  1454. //挑出可以放订单的车次,否则返回错误
  1455. $result_one = [];
  1456. foreach ($res_one as $res_key => $res_vel) {
  1457. if (count($res_vel) >= $vel['num']) {
  1458. $result_one = $res_vel;
  1459. break;
  1460. }
  1461. }
  1462. if (count($result_one) == 0) {
  1463. return false;
  1464. }
  1465. //通过票种索引塞入数据
  1466. $result[$vel['ticket_id']] = $result_one;
  1467. }
  1468. return $result;
  1469. }
  1470. /**
  1471. * Function Description:获取座位信息
  1472. * Function Name: getSeatArray
  1473. * @param array $run_bus_arr 班次车次数组
  1474. * @param array $prod_arr 产品数据
  1475. *
  1476. * @return array
  1477. *
  1478. * @author 张帅
  1479. */
  1480. public function getSeatArray($run_bus_arr, $prod_arr)
  1481. {
  1482. $result = [];
  1483. foreach ($run_bus_arr as $key => $vel) {
  1484. $seat_no = [];
  1485. $i = 0;
  1486. #region 连座筛选
  1487. foreach ($vel as $key1 => $vel2) {
  1488. $seat_no[$key1 - $i][$key1] = $vel2;
  1489. $i++;
  1490. }
  1491. #endregion
  1492. #region 挑选座位
  1493. $run_seat_value = [];
  1494. foreach ($seat_no as $key1 => $vel2) {
  1495. if (count($vel2) >= $prod_arr[$key]['num']) {
  1496. $run_seat_value = array_slice($vel2, 0, $prod_arr[$key]['num'], true);
  1497. break;
  1498. }
  1499. }
  1500. if (count($run_seat_value) == 0) {
  1501. $run_seat_value = array_slice($vel, 0, $prod_arr[$key]['num'], true);
  1502. }
  1503. #endregion
  1504. $result[$key] = $run_seat_value;
  1505. }
  1506. return $result;
  1507. }
  1508. /**
  1509. * Function Description:获取指定数量的连续数字
  1510. * Function Name: getPointNum
  1511. * @param int $start 开始数值
  1512. * @param int $num 取数字数量
  1513. * @return array
  1514. * @author 温依莅
  1515. */
  1516. public function getPointNum($start, $num)
  1517. {
  1518. $start += 0;
  1519. $num += 0;//转为数字
  1520. $list = array();
  1521. for ($i = 1; $i <= $num; $i++) {
  1522. $list[$i] = ++$start;
  1523. }
  1524. return $list;
  1525. }
  1526. /**
  1527. * Function Description:原无代售逻辑下单接口
  1528. * Function Name: submitBusOrderBack
  1529. * @param array $prod_list 产品列表
  1530. * @param array $seat_arr 座位
  1531. * @param array $order_info_arr 订单的其他信息
  1532. * @param array $customer_info_arr 乘客
  1533. * @param array $order_append_arr 附加产品
  1534. * @param int $is_send_msg 是否发短信
  1535. *
  1536. * @return mixed
  1537. *
  1538. * @author 张帅
  1539. */
  1540. public function submitBusOrderBack($prod_list, $seat_arr, $order_info_arr, $customer_info_arr, $order_append_arr, $is_send_msg)
  1541. {
  1542. #region 获取最大唯一值,先赋给支付id,然后递增
  1543. $base_main_id = BaseUniqueId2::find()->select('unique_id')->where(['id' => 1])->asArray()->one();
  1544. //※更新唯一键值
  1545. #计算BaseUniqueId 需要 增加的值(往返程的主订单和子订单的id个数)
  1546. $add_count = 0;
  1547. foreach ($prod_list as $k => $v) {
  1548. $add_count += $v['people_num'] + 1;
  1549. }
  1550. $time=time().rand(0,999999);
  1551. $res = BaseUniqueId2::updateAll(['UNIQUE_ID' => $base_main_id['unique_id'] + $add_count + 1,'UPDATE_TIME'=>$time], ['id' => 1]);
  1552. if (!$res) {
  1553. $result['code'] = '1';
  1554. $result['info'] = '下单失败';
  1555. $result['error'] = 'BaseUniqueId更新失败';
  1556. return $result;
  1557. }
  1558. $pay_main_id = $base_main_id['unique_id'] + 1;
  1559. $parent_order_id = $pay_main_id;
  1560. #endregion
  1561. #region 提交订单操作数据库所需数据
  1562. $main_order = [];//主订单数据
  1563. $main_order_key = [];//提交主订单时所需key值
  1564. $son_order = [];//子订单数据
  1565. $son_order_key = [];//提交子订单时所需key值
  1566. $run_x_arr = [];//run_x
  1567. $run_bus_prod_stock_arr = [];//run_bus,run_prod,run_stock更新数据
  1568. $main_order_id = [];//订单id数组
  1569. $pay_main_arr = [];//主支付记录数据
  1570. $pay_main_key = [];//主支付记录键值
  1571. $order_price = 0;
  1572. $son_order_id = 0;
  1573. #endregion
  1574. #region 整理数据
  1575. foreach ($prod_list as $key => $vel) {
  1576. $run_x_one = [];//run_x_one
  1577. $prod_list[$key]['order_id'] = $parent_order_id;//订单号
  1578. #region 主订单数据
  1579. $main_order_val = [
  1580. 'ID' => $parent_order_id,
  1581. 'MAIN_CREATE_USER_ID' => $order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  1582. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  1583. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  1584. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1585. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1586. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  1587. 'SALE_TOP_ORG_ID' => 0,//'下单组织机构所属一级机构ID',
  1588. 'PROD_TOP_ORG_ID' => 0,//'产品所属一级机构ID',
  1589. 'ORDER_ID' => $parent_order_id,
  1590. 'ORDER_DESCRIPTION' => $vel['ticket_name'] . ',' . $vel['run_date'] . ',' . $vel['people_num'] . '|' . $vel['people_num'],//'最细颗粒度的订单描述',
  1591. 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_sale_order_no'],//'分销商订单编号',
  1592. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  1593. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  1594. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  1595. 'ORDER_PAY_MAIN_ID' => $pay_main_id,//'支付记录主ID,ORDER_PAY_MAIN.ID',
  1596. 'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
  1597. 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  1598. 'PARENT_ORDER_ID' => 0,
  1599. 'PARENT_PROD_ID' => $vel['line_id'],
  1600. 'PARENT_PROD_NAME' => $vel['line_name'],
  1601. 'ORDER_PRICE' => $vel['total_price'],//'订单价格',
  1602. 'ORDER_PROD_TYPE' => 81,//'订单类型',
  1603. 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],//'上车站检票口资源ID',
  1604. 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],//'上车站检票口资源名称',
  1605. 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],//'上车站发车时间距发车日零点分钟数',
  1606. 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],//'下车站发车时间距发车日零点分钟数',
  1607. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  1608. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  1609. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  1610. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  1611. 'CUSTOMER_ADDRESS' => $customer_info_arr['customer_address'],//'顾客地址' 新增by luocj 2017-08-23,
  1612. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  1613. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  1614. 'MEMBER_ID' => $order_info_arr['member_id'],
  1615. 'ORDER_STATUS' => $order_info_arr['order_status'],//'订单当前状态',
  1616. 'IF_LAST_PROD' => 1,//'是否最细颗粒度的判断',
  1617. 'ORDER_LEVEL' => 0,//'Order Level',
  1618. 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],//
  1619. 'SALES_MAN' => $order_info_arr['sales_man'],
  1620. 'RECEIVE_VALUE' => $vel['total_receiver_value'],
  1621. ];
  1622. #endregion
  1623. $single_price = $vel['total_price'];
  1624. $order_price += $vel['total_price'];
  1625. #region 收集主订单的id
  1626. if ($vel['if_back'] == 1) {
  1627. $main_order_id[0] = $parent_order_id;//收集主订单的id
  1628. } else {
  1629. $main_order_id[1] = $parent_order_id;//收集主订单的id
  1630. }
  1631. #endregion
  1632. #region 主订单key值
  1633. if (count($main_order_key) == 0) {
  1634. $main_order_key = array_keys($main_order_val);
  1635. }
  1636. #endregion
  1637. $son_order_id = $parent_order_id;//子订单id号
  1638. #region 根据人数遍历每个子订单的个数
  1639. foreach ($seat_arr[$vel['ticket_id']] as $seat_key => $seat_vel) {
  1640. $son_order_id++;//子订单号递增
  1641. #region 子订单数据
  1642. $son_order_val = [
  1643. 'ID' => $son_order_id,
  1644. 'MAIN_CREATE_USER_ID' => $order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  1645. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  1646. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  1647. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1648. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1649. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  1650. 'SALE_TOP_ORG_ID' => 0,
  1651. 'PROD_TOP_ORG_ID' => 0,
  1652. 'ORDER_ID' => $son_order_id,
  1653. 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_sale_order_no'],//'分销商订单编号',
  1654. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  1655. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  1656. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  1657. 'ORDER_PAY_MAIN_ID' => $pay_main_id,//'支付记录主ID,ORDER_PAY_MAIN.ID',
  1658. 'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
  1659. 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  1660. 'PARENT_ORDER_ID' => $parent_order_id,
  1661. 'PROD_ID' => $vel['ticket_id'],
  1662. 'PARENT_PROD_ID' => $vel['line_id'],
  1663. 'PROD_NAME' => $vel['ticket_name'],
  1664. 'PARENT_PROD_NAME' => $vel['line_name'],
  1665. 'ORDER_PRICE' => $vel['order_price'],
  1666. 'ORDER_PROD_TYPE' => 82,
  1667. 'RUN_ID' => $vel['run_id'],
  1668. 'RUN_DATE' => $vel['run_date'],
  1669. 'RUN_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),//'班次首发日期参数,发车日期至2016-01-01天数,算法使用',
  1670. 'RUN_TIME' => $vel['run_time'],
  1671. 'RUN_BUS_ORDER_ID' => $seat_vel['bus_order_id'],//'班次车号,RUN_BUS.BUS_ORDER_ID',
  1672. 'RUN_BUS_SEAT_TYPE' => $vel['seat_type'],//'座位类型,DICT_TYPE.ID,普通座、贵宾座等',
  1673. 'RUN_BUS_SEAT_SEQ_ID' => $seat_vel['seat_seq_id'],//'座位内部序列ID',
  1674. 'RUN_BUS_SEAT_NAME' => $seat_vel['seat_name'],
  1675. 'PROD_START_STATION_RES_ID' => $vel['start_res_id'],
  1676. 'PROD_START_STATION_RES_NAME' => $vel['start_res_name'],
  1677. 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],
  1678. 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],
  1679. 'PROD_START_STATION_SEQ_ID' => $vel['start_seq_id'],
  1680. 'PROD_START_STATION_DATE' => $vel['run_date'],
  1681. 'PROD_START_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
  1682. 'PROD_START_STATION_TIME' => $vel['start_time'],
  1683. 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],
  1684. 'PROD_START_STATION_AREA_ID' => $vel['start_area_id'],
  1685. 'PROD_START_STATION_AREA_NAME' => $vel['start_area_name'],
  1686. 'PROD_END_STATION_RES_ID' => $vel['end_res_id'],
  1687. 'PROD_END_STATION_RES_NAME' => $vel['end_res_name'],
  1688. 'PROD_END_STATION_SEQ_ID' => $vel['end_seq_id'],
  1689. 'PROD_END_STATION_DATE' => $vel['run_date'],
  1690. 'PROD_END_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
  1691. 'PROD_END_STATION_TIME' => $vel['end_time'],
  1692. 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],
  1693. 'PROD_END_STATION_AREA_ID' => $vel['end_area_id'],
  1694. 'PROD_END_STATION_AREA_NAME' => $vel['end_area_name'],
  1695. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  1696. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  1697. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  1698. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  1699. 'CUSTOMER_ADDRESS' => $customer_info_arr['customer_address'],//'顾客地址' 新增by luocj 2017-08-23,
  1700. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  1701. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  1702. 'MEMBER_ID' => $order_info_arr['member_id'],
  1703. 'ORDER_STATUS' => $order_info_arr['order_status'],
  1704. 'if_gift' => 0,//'是否是赠票,0不是赠票,1是赠票',
  1705. 'ORDER_LEVEL' => 0,
  1706. 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],
  1707. 'SALES_MAN' => $order_info_arr['sales_man'],
  1708. 'RECEIVE_VALUE' => $vel['receiver_value'],
  1709. ];
  1710. #endregion
  1711. #region 子订单key值
  1712. if (count($son_order_key) == 0) {
  1713. $son_order_key = array_keys($son_order_val);
  1714. }
  1715. #endregion
  1716. #region run_bus,run_prod,run_stock更新数据
  1717. if (!isset($run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']])) {
  1718. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['num'] = $vel['people_num'];//数量
  1719. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['run_id'] = $vel['run_id'];//班次id
  1720. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['bus_order_id'] = $seat_vel['bus_order_id'];//车次号
  1721. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['ticket_id'] = $vel['ticket_id'];//票种id
  1722. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['start_seq_id'] = $vel['start_seq_id'];//开始站顺序号
  1723. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['end_seq_id'] = $vel['end_seq_id'];//结束站顺序号
  1724. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['seat_type'] = $vel['seat_type'];//座位类型
  1725. }
  1726. #endregion
  1727. #region 更新run_x配置数据
  1728. $run_x_one[$seat_key]['run_x_id'] = $seat_vel['run_x_id'];
  1729. $run_x_one[$seat_key]['run_date'] = substr($vel['run_date'], 0, 7);
  1730. $run_x_one[$seat_key]['run_date'] = str_replace('-', '', $run_x_one[$seat_key]['run_date']);//run_x表的日期后缀
  1731. $run_x_one[$seat_key]['order_main_id'] = $son_order_id;//主订单号
  1732. $run_x_one[$seat_key]['order_main_prod_id'] = $vel['line_id'];//线路id
  1733. $run_x_one[$seat_key]['order_prod_id'] = $vel['ticket_id'];//票种id
  1734. #endregion
  1735. #region 子订单数组
  1736. $son_order[] = $son_order_val;
  1737. #endregion
  1738. }
  1739. #endregion
  1740. #region 更新run_x配置数据
  1741. $run_x_arr[$key] = $run_x_one;
  1742. #endregion
  1743. $parent_order_id = $son_order_id + 1;
  1744. #region 主订单数组
  1745. $main_order[] = $main_order_val;
  1746. #endregion
  1747. }
  1748. #endregion
  1749. $unique_id = $son_order_id;//唯一主键
  1750. #region 主支付记录数据数组
  1751. foreach ($main_order_id as $key => $vel) {
  1752. #region 主支付记录
  1753. $pay_main_one = [
  1754. 'ID' => $pay_main_id,
  1755. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  1756. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  1757. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1758. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1759. 'PAY_TOTAL' => $single_price,
  1760. 'ORDER_ID' => $vel,
  1761. ];
  1762. #endregion
  1763. $pay_main_arr[] = $pay_main_one;//主支付记录数组
  1764. #region 主支付记录key值
  1765. if (count($pay_main_key) == 0) {
  1766. $pay_main_key = array_keys($pay_main_one);
  1767. }
  1768. #endregion
  1769. }
  1770. #endregion
  1771. $transaction = Yii::$app->db->beginTransaction();
  1772. try {
  1773. #region 1.占座 更新run_x表
  1774. foreach ($run_x_arr as $run_x_key => $run_x_vel) {
  1775. foreach ($run_x_vel as $key => $vel) {
  1776. $update_sql = 'update run_' . $vel['run_date'] . '
  1777. set order_main_id = ' . $vel['order_main_id'] . ',
  1778. order_main_prod_id = ' . $vel['order_main_prod_id'] . ',
  1779. order_prod_id = ' . $vel['order_prod_id'] . ',
  1780. seat_status = 2,
  1781. order_lock_user_id = ' . $order_info_arr['user_id'] . ',
  1782. order_lock_time = \'' . date('Y-m-d H:i:s') . '\'
  1783. where id in (' . $vel['run_x_id'] . ')';
  1784. $res = Yii::$app->db->createCommand($update_sql)->execute();
  1785. if (!$res) {
  1786. throw new Exception('占位失败');
  1787. }
  1788. }
  1789. }
  1790. #endregion
  1791. #region 2.插入主订单
  1792. $res = Yii::$app->db->createCommand()->batchInsert(OrderMain::tableName(), $main_order_key, $main_order)->execute();
  1793. if (!$res) {
  1794. throw new Exception('主订单提交失败');
  1795. }
  1796. #endregion
  1797. #region 3.插入子订单
  1798. $res = Yii::$app->db->createCommand()->batchInsert(OrderMain::tableName(), $son_order_key, $son_order)->execute();
  1799. if (!$res) {
  1800. throw new Exception('子订单提交失败');
  1801. }
  1802. #endregion
  1803. #region 4.更新run_prod,run_bus,run_stock
  1804. foreach ($run_bus_prod_stock_arr as $key => $vel) {
  1805. #region (1).更新run_prod
  1806. $update_value = [
  1807. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1808. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1809. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  1810. ];
  1811. $update_where = [
  1812. 'and',
  1813. ['=', 'run_id', $vel['run_id']],
  1814. ['=', 'prod_id', $vel['ticket_id']],
  1815. ['=', 'cancel_flag', 0],
  1816. ];
  1817. $res = RunProd::updateAll($update_value, $update_where);
  1818. if (!$res) {
  1819. throw new Exception('更新run_prod失败');
  1820. }
  1821. #endregion
  1822. #region (2).更新run_bus
  1823. $update_value = [
  1824. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1825. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1826. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  1827. ];
  1828. $update_where = [
  1829. 'and',
  1830. ['=', 'run_id', $vel['run_id']],
  1831. ['=', 'bus_order_id', $vel['bus_order_id']],
  1832. ['=', 'cancel_flag', 0],
  1833. ];
  1834. $res = RunBus::updateAll($update_value, $update_where);
  1835. if (!$res) {
  1836. throw new Exception('更新run_bus失败');
  1837. }
  1838. #endregion
  1839. #region (3).更新run_stock
  1840. $update_value = [
  1841. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1842. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1843. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  1844. ];
  1845. $update_where = [
  1846. 'and',
  1847. ['=', 'run_id', $vel['run_id']],
  1848. ['>=', 'seq_id', $vel['start_seq_id']],
  1849. ['<', 'seq_id', $vel['end_seq_id']],
  1850. ['=', 'seat_type', $vel['seat_type']],
  1851. ['=', 'cancel_flag', 0],
  1852. ];
  1853. $res = RunStock::updateAll($update_value, $update_where);
  1854. if (!$res) {
  1855. throw new Exception('更新run_stock失败');
  1856. }
  1857. #endregion
  1858. }
  1859. #endregion
  1860. //==================这里加判断,只有是已支付状态,才插入支付记录=============
  1861. if ($order_info_arr['order_pay_status'] == 1) {
  1862. #region 5.插入主支付记录
  1863. $res = Yii::$app->db->createCommand()->batchInsert(OrderPayMain::tableName(), $pay_main_key, $pay_main_arr)->execute();
  1864. if (!$res) {
  1865. throw new Exception('插入主支付记录失败');
  1866. }
  1867. #endregion
  1868. #region 6.插入支付明细
  1869. $order_pay_detail = new OrderPayDetail();
  1870. $order_pay_detail->attributes = [
  1871. 'ID' => $pay_main_id,
  1872. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  1873. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  1874. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1875. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1876. 'PAY_MAIN_ID' => $pay_main_id,
  1877. 'PAY_TYPE_ID_1' => $order_info_arr['pay_type'],
  1878. 'PAY_MONEY' => $order_price,
  1879. ];
  1880. $res = $order_pay_detail->insert();
  1881. if (!$res) {
  1882. throw new Exception('插入支付明细失败');
  1883. }
  1884. #endregion
  1885. }
  1886. /*#region 7.更新唯一键值
  1887. $res = BaseUniqueId2::updateAll(['UNIQUE_ID' => $unique_id], ['id' => 1]);
  1888. if (!$res) {
  1889. throw new Exception('更新唯一键值失败');
  1890. }
  1891. #endregion*/
  1892. #region 8.如果是往返 建立往返关系
  1893. if (count($main_order_id) == 2) {
  1894. $to_from = new ToFrom();
  1895. $to_from->attributes = [
  1896. 'to_orderid' => $main_order_id[0],
  1897. 'back_orderid' => $main_order_id[1],
  1898. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  1899. ];
  1900. $res = $to_from->insert();
  1901. if (!$res) {
  1902. throw new Exception('建立往返关系失败');
  1903. }
  1904. }
  1905. #endregion
  1906. #region 9.插入酒店门票价格
  1907. if ($order_append_arr['gate_price'] != 0 || $order_append_arr['hotel_price'] != 0) {
  1908. $order_extra_info = new OrderExtraInfo();
  1909. $order_extra_info->attributes = [
  1910. 'order_id' => $main_order_id[0],
  1911. 'hotel_price' => $order_append_arr['hotel_price'],
  1912. 'gate_price' => $order_append_arr['gate_price'],
  1913. ];
  1914. $res = $order_extra_info->insert();
  1915. if (!$res) {
  1916. throw new Exception('酒店门票价格提交失败' . serialize($order_extra_info->getErrors()));
  1917. }
  1918. }
  1919. #endregion
  1920. #region 10.插入日志
  1921. $order_run_time = array();
  1922. $opera_time = date('Y-m-d H:i:s');
  1923. foreach ($prod_list as $key => $vel) {
  1924. $order_opera_log = new OrderOperaLog();
  1925. $order_opera_log->attributes = [
  1926. 'order_id' => $vel['order_id'],
  1927. 'opera_user_id' => $order_info_arr['user_id'],
  1928. 'opera_type' => 1,
  1929. 'opera_time' => $opera_time,
  1930. 'opera_detail' => '创建订单,出发日期' . $vel['run_date'] . ',订单渠道' . $order_info_arr['org_name'] . ',单价' . $vel['order_price'] . ',总额' . $vel['total_price'] . ',联系人信息:' . $customer_info_arr['customer_name'] . ',' . $customer_info_arr['customer_mobile'] . ',' . $customer_info_arr['customer_id_no'] . ',备注信息:' . $customer_info_arr['customer_memo'] . ',乘客地址:' . $customer_info_arr['customer_address'],
  1931. 'member_id' => $order_info_arr['member_id'],
  1932. 'opera_platform' => '统一下单',
  1933. ];
  1934. $order_run_time[$vel['order_id']] = $vel['run_date'];
  1935. $res = $order_opera_log->insert();
  1936. if (!$res) {
  1937. throw new Exception('插入日志失败');
  1938. }
  1939. }
  1940. #endregion
  1941. //$transaction->commit();
  1942. $transaction->rollBack();
  1943. #region 11.发送短信
  1944. if ($order_info_arr['order_pay_status'] == 1 && $is_send_msg == 1) {
  1945. foreach ($main_order_id as $key => $vel) {
  1946. //这里对发送短信时间做一个判断,满足条件的才发送短信
  1947. $time_diff = $this->get_time_diff($vel);
  1948. if ($time_diff >= 0) {
  1949. $url = 'http://' . CS1_DOMAIN . '/api/msg/order-send-msg';
  1950. $sendInfo['order_id'] = $vel;
  1951. $sendInfo['msg_type'] = 'cs';
  1952. Msg::httpRequestForasyn($url, $sendInfo);
  1953. }
  1954. }
  1955. }
  1956. #endregion
  1957. #region 12.添加订单状态
  1958. if ($order_info_arr['order_pay_status'] == 1) {
  1959. //添加出票成功短信
  1960. $tomorrow_day = date("Y-m-d", strtotime("+1 days"));
  1961. $current_time = date("H:i");
  1962. foreach ($main_order_id as $key => $vel) {
  1963. $order_run_day = $order_run_time[$vel];
  1964. //if( $order_run_day > $tomorrow_day || ( $order_run_day == $order_run_day && $current_time < "18:30" ) ) {
  1965. $url = 'http://' . CS1_DOMAIN . '/api/msg/order-send-success-msg';
  1966. $sendInfo['order_id'] = $vel;
  1967. Msg::httpRequestForasyn($url, $sendInfo);
  1968. //}
  1969. $url = 'http://' . CS_DOMAIN . '/st-xm/Api/add_order_status_log.php';
  1970. $post_data['order_id'] = $vel;
  1971. if ($order_info_arr['order_pay_status'] == 1) {
  1972. $post_data['order_status'] = '451,452,453';
  1973. } else {
  1974. $post_data['order_status'] = '451';
  1975. }
  1976. Msg::httpRequestForasyn($url, $post_data);
  1977. }
  1978. }
  1979. #endregion
  1980. $result['code'] = '0';
  1981. $result['info'] = '下单成功';
  1982. $result['data'] = implode(',', $main_order_id);
  1983. } catch (Exception $e) {
  1984. # 回滚事务
  1985. $transaction->rollBack();
  1986. $result['code'] = '1';
  1987. $result['info'] = '下单失败';
  1988. $result['error'] = $e->getMessage();
  1989. }
  1990. return $result;
  1991. }
  1992. /**
  1993. * Function Description:获取代收价
  1994. * Function Name: getBusProductListReceiver
  1995. * @param array $prod_list 产品列表
  1996. * @param string $receiver_value_str 代收信息
  1997. * @param array $prod_arr 产品简易数据
  1998. *
  1999. * @return mixed
  2000. *
  2001. * @author 张帅
  2002. */
  2003. public function getBusProductListReceiver($prod_list, $receiver_value_str, $prod_arr)
  2004. {
  2005. $result = [];
  2006. $receiver_value_str = substr($receiver_value_str, 1, -1);
  2007. $receiver_value_arr = explode(',', $receiver_value_str);//代收价格信息
  2008. $receiver_value = (!isset($receiver_value_arr[0]) || empty($receiver_value_arr[0])) ? 0 : $receiver_value_arr[0];//代收单价
  2009. $total_receiver_value = (!isset($receiver_value_arr[1]) || empty($receiver_value_arr[1])) ? 0 : $receiver_value_arr[1];//代收总价
  2010. $receiver_value = $receiver_value / count($prod_list);
  2011. $total_receiver_value = $total_receiver_value / count($prod_list);
  2012. //将订单单价,人数,总价,往返标志,代收单价,代收总价放入产品列表中
  2013. foreach ($prod_list as $key => $vel) {
  2014. if ($total_receiver_value != 0) {
  2015. $prod_list[$key]['total_receiver_value'] = round($total_receiver_value, 2);
  2016. $prod_list[$key]['receiver_value'] = round($total_receiver_value / $prod_arr[$key]['num'], 2);
  2017. } else {
  2018. $prod_list[$key]['total_receiver_value'] = round($receiver_value * $prod_arr[$key]['num'], 2);
  2019. $prod_list[$key]['receiver_value'] = round($receiver_value, 2);
  2020. }
  2021. $prod_list[$key]['order_price'] = $prod_arr[$key]['price'];
  2022. $prod_list[$key]['total_order_price'] = $prod_arr[$key]['price'] * $prod_arr[$key]['num'];
  2023. $prod_list[$key]['people_num'] = $prod_arr[$key]['num'];
  2024. $prod_list[$key]['if_back'] = $prod_arr[$key]['if_back'];
  2025. }
  2026. //将产品安往返排序
  2027. foreach ($prod_arr as $key => $vel) {
  2028. $result[$key] = $prod_list[$key];
  2029. }
  2030. return $result;
  2031. }
  2032. public static function updateBusCost($run_id, $bus_order_id)
  2033. {
  2034. $data = ['code' => '0', 'info' => 'bus_cost表数据修改成功'];
  2035. $bus_cost_model = BusCost::find()->where(['RUN_ID' => $run_id, 'BUS_ORDER_ID' => $bus_order_id, 'COST_TYPE' => 478, 'CREATE_USER_ID' => 2])->orderBy('CREATE_TIME ASC')->one();
  2036. $run_bus_model = BusCost::findOne(['RUN_ID' => $run_id, 'BUS_ORDER_ID' => $bus_order_id]);
  2037. if (!$bus_cost_model || !$run_bus_model) {
  2038. $data['code'] = '1';
  2039. $data['info'] = '找不到bus_cost 或run_bus 对应的记录';
  2040. return $data;
  2041. }
  2042. $bus_cost_model->SALED_COUNT = $run_bus_model->SALED_COUNT;
  2043. $bus_cost_model->COST_PRICE = round($bus_cost_model->TOTAL_COST_PRICE / $bus_cost_model->SALED_COUNT, 2);
  2044. $bus_cost_model->save(false);
  2045. return $data;
  2046. }
  2047. /**
  2048. * Function Description:增加自由行的保险订单
  2049. * Function Name: addFreeWalkInsurance
  2050. * @param $order_info_arr
  2051. * @param $bus_order_id
  2052. * @param $insurance
  2053. * @param $tourist_id
  2054. *
  2055. *
  2056. * @author 田玲菲
  2057. */
  2058. public static function addFreeWalkInsurance($order_info_arr, $bus_order_id, $insurance, $tourist_id)
  2059. {
  2060. $config = Yii::$app->params;
  2061. $order_id_arr = explode(',', $bus_order_id); //其实是自由行产品(组合产品)的title_id
  2062. foreach ($order_id_arr as $order_id) {
  2063. if (empty($order_id)) {
  2064. continue;
  2065. }
  2066. $orderTitle = new OrderTitle();
  2067. $getOrderInfo = $orderTitle->getTitleInfoById($order_id);
  2068. try {
  2069. //订单信息
  2070. $oderInfo = [
  2071. $order_info_arr['user_id'],//下单用户
  2072. $order_info_arr['member_id'],//会员号
  2073. $order_info_arr['outside_sale_org_id'],//渠道ID
  2074. $order_info_arr['outside_order_no'],//渠道订单号
  2075. 0,//是否自动退票
  2076. $order_info_arr['pay_type'],//支付方式
  2077. 1,//是否支付
  2078. $order_info_arr['sales_man'],//业务员
  2079. ];
  2080. $operaTouristCommon = new OperaTouristCommon();
  2081. $result = $operaTouristCommon->getDays($tourist_id);
  2082. $days = $result['day_num'];
  2083. $main_prod_id = $config['tourist_insurance']['main_prod_id'];//主票种D
  2084. $data = [
  2085. #请求头
  2086. 'auth_code' => Yii::$app->request->post('auth_code'),
  2087. 'user_key' => Yii::$app->request->post('user_key'),
  2088. 'user' => Yii::$app->request->post('user'),
  2089. 'user_id' => Yii::$app->request->post('user_id'),
  2090. 'request_time' => Yii::$app->request->post('request_time'),
  2091. #请求内容
  2092. 'main_prod_id' => $main_prod_id,//主票种D
  2093. 'run_date' => $getOrderInfo['run_date'],//出行日期
  2094. 'prod_str' => '',//购买票种列表
  2095. 'order_info_str' => '{' . implode(',', $oderInfo) . '}',//订单信息
  2096. 'customer_info_str' => '',
  2097. 'action' => 'submit_ticket_order'
  2098. ];
  2099. #设置购买票种列表
  2100. $operaProdRun = new OperaProductRun();
  2101. $getInfo = $operaProdRun->getRunInfoByProdIdAndDate($config['tourist_insurance']['sun_prod_id'][$days - 1], $getOrderInfo['run_date']);
  2102. $data['prod_str'] = '{' . implode(',', [$config['tourist_insurance']['sun_prod_id'][$days - 1], $getInfo['prod_price'], 1]) . '}';
  2103. #循环下单
  2104. $addMpFail = 0;
  2105. $addMpSu = [];
  2106. foreach ($insurance as $val) {
  2107. #设置联系人信息
  2108. $memo = $getOrderInfo['order_title_prod_name'] . '旅意险';//备注信息
  2109. $memo .= '<br/>' . $getOrderInfo['prod_start_station_time'] . '|';
  2110. $customer_info = [
  2111. $val['0'], $getOrderInfo['cus_phone'], '150', $val['1'], $memo
  2112. ];
  2113. $data['customer_info_str'] = '{' . implode(',', $customer_info) . '}';
  2114. #发起保险单下单功能
  2115. $addMp = Utils::httpRequest('http://' . CS1_DOMAIN . '/api/submit-order', $data);
  2116. $addMp = json_decode($addMp, true);
  2117. if (!isset($addMp['code']) || $addMp['code'] != 0) {//当保险单下单失败
  2118. $addMpFail++;
  2119. } else {
  2120. #保险单下单成功,进行订单绑定
  2121. $oderInsurance = new OrderInsuranceConnect();
  2122. $insuranceDate = [
  2123. 'main_order_id' => $order_id, //此处是title_id
  2124. 'insurance_order_id' => $addMp['data'],
  2125. ];
  2126. $flag = $oderInsurance->addOne($insuranceDate);
  2127. if ($flag == false) {#绑定失败
  2128. $addMpFail++;
  2129. } else {
  2130. $addMpSu[] = $addMp['data'];
  2131. }
  2132. }
  2133. }
  2134. static:: sendInsuranceMsg($addMpSu, $insurance, $order_id, $getOrderInfo, $addMpFail, 4);
  2135. } catch (Exception $e) {
  2136. //如果程序异常 发送短信通知
  2137. if (empty($config['YunYinPhone']) == false) {
  2138. foreach ($config['YunYinPhone'] as $phone) {
  2139. $msg = "自由行订单title_id为({$order_id})带来了新的保险订单。注意:出现保险下单失败,请去自由行订单详情页确认保险人的具体信息并搬单。";
  2140. Msg::sendTelMsg($phone, $msg);
  2141. }
  2142. }
  2143. }
  2144. }
  2145. }
  2146. /**
  2147. * Des:添加保险单
  2148. * Name: addInsurance
  2149. * @param $order_info_arr
  2150. * @param $bus_order_id
  2151. * @param $insurance
  2152. * @author 倪宗锋
  2153. */
  2154. public static function addInsurance($order_info_arr, $bus_order_id, $insurance)
  2155. {
  2156. $config = Yii::$app->params;
  2157. $order_id_arr = explode(',', $bus_order_id);
  2158. foreach ($order_id_arr as $order_id) {
  2159. if (empty($order_id)) {
  2160. continue;
  2161. }
  2162. $orderMain = new OrderMain();
  2163. $getOrderInfo = $orderMain->getOrderInfoForGetSeat($order_id);
  2164. try {
  2165. //订单信息
  2166. $oderInfo = [
  2167. $order_info_arr['user_id'],//下单用户
  2168. $order_info_arr['member_id'],//会员号
  2169. $order_info_arr['outside_sale_org_id'],//渠道ID
  2170. $order_info_arr['outside_order_no'],//渠道订单号
  2171. 0,//是否自动退票
  2172. $order_info_arr['pay_type'],//支付方式
  2173. 1,//是否支付
  2174. $order_info_arr['sales_man'],//业务员
  2175. ];
  2176. $main_prod_id = $config['insurance']['main_prod_id'];//主票种D
  2177. $data = [
  2178. #请求头
  2179. 'auth_code' => Yii::$app->request->post('auth_code'),
  2180. 'user_key' => Yii::$app->request->post('user_key'),
  2181. 'user' => Yii::$app->request->post('user'),
  2182. 'user_id' => Yii::$app->request->post('user_id'),
  2183. 'request_time' => Yii::$app->request->post('request_time'),
  2184. #请求内容
  2185. 'main_prod_id' => $main_prod_id,//主票种D
  2186. 'run_date' => $getOrderInfo['run_date'],//出行日期
  2187. 'prod_str' => '',//购买票种列表
  2188. 'order_info_str' => '{' . implode(',', $oderInfo) . '}',//订单信息
  2189. 'customer_info_str' => '',
  2190. 'action' => 'submit_ticket_order'
  2191. ];
  2192. #设置购买票种列表
  2193. $operaProdRun = new OperaProductRun();
  2194. $getInfo = $operaProdRun->getRunInfoByProdIdAndDate($config['insurance']['sun_prod_id'], $getOrderInfo['run_date']);
  2195. $data['prod_str'] = '{' . implode(',', [$config['insurance']['sun_prod_id'], $getInfo['prod_price'], 1]) . '}';
  2196. #循环下单
  2197. $addMpFail = 0;
  2198. $addMpSu = [];
  2199. //投保人信息
  2200. $policy_holder = [
  2201. 'name'=>$insurance[0][0],
  2202. 'cardid'=>$insurance[0][1]
  2203. ];
  2204. foreach ($insurance as $val){
  2205. $name = $val[0];
  2206. $cardid = $val[1];
  2207. $cardobj=Util::getIDCardInfo($cardid);
  2208. if($cardobj['old']>=18){
  2209. $policy_holder['name']=$name;
  2210. $policy_holder['cardid']=$cardid;
  2211. break;
  2212. }
  2213. }
  2214. foreach ($insurance as $val) {
  2215. #设置联系人信息
  2216. $memo = $getOrderInfo['start_area_name'] . '-->' . $getOrderInfo['end_area_name'];//备注信息
  2217. $memo .= '<br/>' . $getOrderInfo['prod_start_station_time'] . '|' . $getOrderInfo['run_id'];
  2218. $customer_info = [
  2219. $val['0'], $getOrderInfo['customer_mobile'], '150', $val['1'], $memo
  2220. ];
  2221. $data['customer_info_str'] = '{' . implode(',', $customer_info) . '}';
  2222. #发起保险单下单功能
  2223. $addMp = Utils::httpRequest('http://' . CS1_DOMAIN . '/api/submit-order', $data);
  2224. $addMp = json_decode($addMp, true);
  2225. if (!isset($addMp['code']) || $addMp['code'] != 0) {//当保险单下单失败
  2226. $addMpFail++;
  2227. } else {
  2228. #保险单下单成功,进行订单绑定
  2229. $oderInsurance = new OrderInsuranceConnect();
  2230. $insuranceDate = [
  2231. 'main_order_id' => $order_id,
  2232. 'insurance_order_id' => $addMp['data'],
  2233. ];
  2234. $flag = $oderInsurance->addOne($insuranceDate);
  2235. if ($flag == false) {#绑定失败
  2236. $addMpFail++;
  2237. } else {
  2238. $addMpSu[] = $addMp['data'];
  2239. #保险下单成功后,调用保险第三方接口进行下单
  2240. $insuranceParam=[];
  2241. $insuranceParam['start_date']=$getOrderInfo['run_date'];
  2242. $insuranceParam['end_date']=$getOrderInfo['run_date'];
  2243. $insuranceParam['start_time'] = $getOrderInfo['prod_start_station_time'].':00';
  2244. $insuranceParam['passenger_cardid']=$val[1];
  2245. $insuranceParam['passenger_name']=$val[0];
  2246. $insuranceParam['contacts_phone']=$getOrderInfo['customer_mobile'];
  2247. $insuranceParam['order_id']=$insuranceDate['insurance_order_id'];
  2248. $insuranceParam['prod_type']='1'; //1乘客意外险 2旅行意外险
  2249. $insuranceParam['policy_holder_name'] = $policy_holder['name'];
  2250. $insuranceParam['policy_holder_cardid'] = $policy_holder['cardid'];
  2251. $curl = new CurlInterface($insuranceParam, 5);
  2252. $verifyResult = $curl->execute('http://'. CS1_DOMAIN. '/api/sunshine-insurance/verify-order','POST');
  2253. $verifyResult = json_decode($verifyResult,true);
  2254. if(!$verifyResult['flag']){
  2255. //不允许下单
  2256. //如果在保险第三方平台下单失败,则发送短信通知
  2257. if (empty($config['YunYinPhone']) == false) {
  2258. foreach ($config['YunYinPhone'] as $phone) {
  2259. $msg = "保险下单直连失败,请及时确认并搬单。订单号:".$insuranceDate['insurance_order_id'];
  2260. Msg::sendTelMsg($phone, $msg);
  2261. }
  2262. }
  2263. }else{
  2264. $insuranceResult = $curl->execute('http://'. CS1_DOMAIN. '/api/sunshine-insurance/create-order', 'POST');
  2265. $insuranceResult = json_decode($insuranceResult,true);
  2266. if($insuranceResult['flag']){
  2267. //成功
  2268. if (empty($config['YunYinPhone']) == false) {
  2269. foreach ($config['YunYinPhone'] as $phone) {
  2270. $msg = "保险下单直连成功success,请及时确认并搬单。订单号:".$insuranceDate['insurance_order_id'];
  2271. Msg::sendTelMsg($phone, $msg);
  2272. }
  2273. }
  2274. }else{
  2275. //失败
  2276. //如果在保险第三方平台下单失败,则发送短信通知
  2277. if (empty($config['YunYinPhone']) == false) {
  2278. foreach ($config['YunYinPhone'] as $phone) {
  2279. $msg = "保险下单直连失败,请及时确认并搬单。订单号:".$insuranceDate['insurance_order_id'];
  2280. Msg::sendTelMsg($phone, $msg);
  2281. }
  2282. }
  2283. }
  2284. }
  2285. }
  2286. }
  2287. }
  2288. static:: sendInsuranceMsg($addMpSu, $insurance, $order_id, $getOrderInfo, $addMpFail);
  2289. } catch (Exception $e) {
  2290. //如果程序异常 发送短信通知
  2291. if (empty($config['YunYinPhone']) == false) {
  2292. foreach ($config['YunYinPhone'] as $phone) {
  2293. $msg = "巴士订单({$order_id})带来了新的保险订单。注意:出现保险下单失败,请去巴士订单详情页确认保险人的具体信息并搬单。";
  2294. Msg::sendTelMsg($phone, $msg);
  2295. }
  2296. }
  2297. }
  2298. }
  2299. }
  2300. /**
  2301. * Des:发送保险单短信
  2302. * Name: sendInsuranceMsg
  2303. * @param $addMpSu
  2304. * @param $insurance
  2305. * @param $order_id
  2306. * @param $getOrderInfo
  2307. * @param $type
  2308. * @author 倪宗锋
  2309. */
  2310. public static function sendInsuranceMsg($addMpSu, $insurance, $order_id, $getOrderInfo, $addMpFail, $type = '2')
  2311. {
  2312. $runTime = strtotime($getOrderInfo['prod_start_station_date'] . ' ' . $getOrderInfo['prod_start_station_time']);//出发日期时间戳
  2313. $createTime = strtotime($getOrderInfo['create_time']);//下单时间
  2314. $msg = '';
  2315. /**判断是否紧急订单*/
  2316. $jinji = false;
  2317. //1、下单时间 为 晚上18点到晚上24点间 且出发日期为当天或第二天早上10点之前的订单
  2318. if ($jinji == false) {
  2319. $runtimeCh = $runTime >= strtotime(date('Y-m-d 00:00')) && $runTime < strtotime(date("Y-m-d 10:00", strtotime("+1 day")));//出发日期为当天或第二天早上10点之前的订单
  2320. $creatTimeCh = $createTime >= strtotime(date('Y-m-d 18:00')) && $createTime < strtotime(date("Y-m-d 00:00", strtotime("+1 day")));//下单时间 为 晚上18点到晚上24点间
  2321. if ($runtimeCh && $creatTimeCh) {
  2322. $remainingTime = '距离发车还有' . ceil((($runTime - time()) / 60)) . '分钟';
  2323. $msg = '【紧急订单!!】' . $remainingTime;
  2324. $jinji = true;
  2325. }
  2326. }
  2327. //2、下单时间为早上0点到9点,且出发时间为当天早上10点之前的订单
  2328. if ($jinji == false) {
  2329. $runtimeCh = $runTime >= strtotime(date('Y-m-d 00:00')) && $runTime < strtotime(date("Y-m-d 10:00"));//出发时间为当天早上10点之前的订单
  2330. $creatTimeCh = $createTime >= strtotime(date('Y-m-d 00:00')) && $createTime < strtotime(date("Y-m-d 09:00"));//下单时间为早上0点到9点
  2331. if ($runtimeCh && $creatTimeCh) {
  2332. $remainingTime = '距离发车还有' . ceil((($runTime - time()) / 60)) . '分钟';
  2333. $msg = '【紧急订单!!】' . $remainingTime;
  2334. $jinji = true;
  2335. }
  2336. }
  2337. //3、下单时间距离发车时间小于60分钟 的订单
  2338. if ($jinji == false) {
  2339. if ($runTime < time() + 3600 && $runTime > time()) {
  2340. $remainingTime = '距离发车还有' . ceil((($runTime - time()) / 60)) . '分钟';
  2341. $msg = '【紧急订单!!】' . $remainingTime;
  2342. }
  2343. }
  2344. /**发送短信通知*/
  2345. $config = Yii::$app->params;
  2346. if (empty($config['YunYinPhone']) == false) {
  2347. foreach ($config['YunYinPhone'] as $phone) {
  2348. if ($type == 4) {//巴士自由行订单
  2349. if (count($addMpSu) == count($insurance)) {
  2350. $msg .= "自由行订单({$order_id})带来了新的保险订单。系统订单号:" . implode(',', $addMpSu) . "。请及时确认及搬单。";
  2351. } else {
  2352. $msg .= "自由行订单({$order_id})带来了新的保险订单。系统订单号:" . implode(',', $addMpSu) . "。※注意:出现保险下单失败,失败数{$addMpFail}※ 请及时确认及搬单。";
  2353. }
  2354. } else {
  2355. if (count($addMpSu) == count($insurance)) {
  2356. $msg .= "巴士订单({$order_id})带来了新的保险订单,每单保险3元。系统订单号:" . implode(',', $addMpSu) . "。请及时确认及搬单。";
  2357. } else {
  2358. $msg .= "巴士订单({$order_id})带来了新的保险订单,每单保险3元。系统订单号:" . implode(',', $addMpSu) . "。※注意:出现保险下单失败,失败数{$addMpFail}※ 请及时确认及搬单。";
  2359. }
  2360. }
  2361. Msg::sendTelMsg($phone, $msg);
  2362. }
  2363. }
  2364. }
  2365. /**
  2366. * Function Description:插入乘车人身份信息
  2367. * Function Name: IstPassengerInfo
  2368. * @param $order_id
  2369. * @param $passenger_info
  2370. *
  2371. * @return bool
  2372. *
  2373. * @author 娄梦宁
  2374. */
  2375. public function IstPassengerInfo($order_id, $passenger_info)
  2376. {
  2377. try {
  2378. $order_main = new OrderMain();
  2379. $order_customer_info = new OrderCustomerInfo();
  2380. $order_son_info = $order_main->getSonOrderArr($order_id);
  2381. foreach ($order_son_info as $key => $val) {
  2382. $value = [
  2383. 'order_main_id' => $val['order_id'],
  2384. 'order_parent_id' => $order_id,
  2385. 'cus_name' => $passenger_info[$key]['passenger_name'],
  2386. 'cus_id_type' => 1,
  2387. 'cus_id_no' => $passenger_info[$key]['passenger_cardid'],
  2388. 'create_time' => date('Y-m-d H:i:s')
  2389. ];
  2390. $clone = clone $order_customer_info;
  2391. $clone->attributes = $value;
  2392. $clone->insert();
  2393. }
  2394. return true;
  2395. } catch (\yii\db\Exception $e) {
  2396. return false;
  2397. }
  2398. }
  2399. }