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

460 wiersze
18 KiB

  1. <?php
  2. /**
  3. *
  4. * ============================================================================
  5. * * 版权所有 蜘蛛出行 * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * Author By: 张帅
  12. * PhpStorm GetTicketOrderData.php
  13. * Create By 2017/4/17 17:32 $
  14. */
  15. namespace backend\modules\api\logic;
  16. use backend\modules\api\models\OperaProduct;
  17. use backend\modules\api\models\OperaProductRun;
  18. use yii\db\Expression;
  19. use yii\db\Query;
  20. class GetTicketOrderData extends Query
  21. {
  22. public $ticket_product;//门票产品
  23. public $order_main_base = [];//订单基础配置
  24. public $pay_main_base = [];//主支付记录基础配置
  25. public $pay_detail_base = [];//支付明细
  26. public $user_id;//用户id
  27. public $create_time;//创建时间
  28. /**
  29. * Function Description:获取主门票信息详情
  30. * Function Name: getTicketMainProductList
  31. * @param array $ticket_product 门票选购产品
  32. *
  33. * @return mixed
  34. *
  35. * @author 张帅
  36. */
  37. public function getTicketMainProductList($ticket_product)
  38. {
  39. #region 获取所有的主票种id
  40. $ticket_id_arr = [];
  41. foreach ($ticket_product as $key => $vel) {
  42. $ticket_id_arr[$vel['ticket_id']] = $vel['ticket_id'];
  43. }
  44. #endregion
  45. #region 获取主票种数据列表
  46. $ticket_info_list = OperaProduct::find()
  47. ->select([
  48. 'ticket_id' => 'prod_id',//票种id
  49. 'prod_code',
  50. 'prod_name',
  51. 'prod_type',
  52. 'run_duty_id as principal_id',
  53. ])
  54. ->where([
  55. 'and',
  56. ['in', 'prod_id', $ticket_id_arr],
  57. ['=', 'cancel_flag', 0],
  58. ['=', 'is_onsale', 1],
  59. ])
  60. ->indexBy('ticket_id')
  61. ->asArray()->all();
  62. #endregion
  63. #region 检查主门票产品
  64. foreach ($ticket_product as $key => $vel) {
  65. if (!isset($ticket_info_list[$vel['ticket_id']])) {
  66. $json['code'] = '1';
  67. $json['info'] = '门票产品有误';
  68. return $json;
  69. }
  70. $ticket_product[$key]['ticket_code'] = $ticket_info_list[$vel['ticket_id']]['prod_code'];//门票编号
  71. $ticket_product[$key]['ticket_name'] = $ticket_info_list[$vel['ticket_id']]['prod_name'];//门票名称
  72. $ticket_product[$key]['ticket_type'] = $ticket_info_list[$vel['ticket_id']]['prod_type'];//门票类型
  73. $ticket_product[$key]['principal_id'] = $ticket_info_list[$vel['ticket_id']]['principal_id'];//运营负责人
  74. }
  75. #endregion
  76. $this->ticket_product = $ticket_product;
  77. $json['code'] = '0';
  78. $json['info'] = '成功';
  79. return $json;
  80. }
  81. /**
  82. * Function Description:获取子门票产品详情并检验库存
  83. * Function Name: getTicketSonProductList
  84. *
  85. * @return mixed
  86. *
  87. * @author 张帅
  88. */
  89. public function getTicketSonProductList()
  90. {
  91. #region 获取门票选购产品数据
  92. $ticket_product_info = $this->ticket_product;
  93. #endregion
  94. #region 获取and_where
  95. $and_where = ['or'];
  96. foreach ($ticket_product_info as $main_key => $main_vel) {
  97. $son_ticket_id = [];
  98. foreach ($main_vel['son_ticket'] as $son_key => $son_vel) {
  99. $son_ticket_id[$son_vel['son_ticket_id']] = $son_vel['son_ticket_id'];
  100. }
  101. $and_where[] = [
  102. 'and',
  103. ['=', 'p.parent_id', $main_vel['ticket_id']],
  104. ['=', 'pr.run_date', $main_vel['run_date']],
  105. ['in', 'p.prod_id', $son_ticket_id],
  106. ];
  107. }
  108. #endregion
  109. #region 获取数据详情
  110. $son_ticket_list = OperaProductRun::find()
  111. ->select([
  112. 'son_ticket_id' => 'p.prod_id',//票种id
  113. 'main_ticket_id' => 'p.parent_id',//父票种id
  114. 'p.prod_code',
  115. 'p.prod_name',
  116. 'p.prod_type',
  117. 'pr.run_date',//日期
  118. 'pr.run_time',//时间
  119. 'pr.cus_price',//销售价
  120. 'pr.prod_price',//成本价
  121. 'ticket_stock' => new Expression("pr.total_count-pr.saled_count"),//库存
  122. 'p.run_duty_id as principal_id',//运营负责人
  123. ])
  124. ->from(OperaProductRun::tableName() . ' as pr')
  125. ->leftJoin(OperaProduct::tableName() . ' as p', 'p.prod_id = pr.prod_id')
  126. ->where([
  127. 'and',
  128. ['=', 'p.cancel_flag', 0],
  129. ['=', 'pr.cancel_flag', 0],
  130. ['=', 'p.is_onsale', 1],
  131. ['=', 'pr.is_onsale', 1],
  132. ])
  133. ->andWhere($and_where)
  134. ->groupBy(['son_ticket_id', 'run_date'])
  135. ->asArray()->all();
  136. #endregion
  137. #region 整理数据并检验库存
  138. foreach ($son_ticket_list as $key => $vel) {
  139. $son_ticket_arr[$vel['son_ticket_id'] . '-' . $vel['run_date']] = $vel;
  140. }
  141. foreach ($ticket_product_info as $main_key => $main_vel) {
  142. foreach ($main_vel['son_ticket'] as $son_key => $son_vel) {
  143. if (!isset($son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']])) {
  144. $json['code'] = '1';
  145. $json['info'] = '子门票产品有误';
  146. return $json;
  147. }
  148. if ($son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['ticket_stock'] < $son_vel['prod_num']) {
  149. $json['code'] = '1';
  150. $json['info'] = '门票库存不足';
  151. return $json;
  152. }
  153. $ticket_product_info[$main_key]['son_ticket'][$son_key]['ticket_code'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['prod_code'];//子门票编号
  154. $ticket_product_info[$main_key]['son_ticket'][$son_key]['ticket_name'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['prod_name'];//子门票名称
  155. $ticket_product_info[$main_key]['son_ticket'][$son_key]['ticket_type'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['prod_type'];//子门票编号
  156. $ticket_product_info[$main_key]['son_ticket'][$son_key]['price'] = $ticket_product_info[$main_key]['son_ticket'][$son_key]['prod_price'];//子门票价格
  157. $ticket_product_info[$main_key]['son_ticket'][$son_key]['cus_price'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['cus_price'];//零售价
  158. $ticket_product_info[$main_key]['son_ticket'][$son_key]['prod_price'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['prod_price'];//分销价
  159. $ticket_product_info[$main_key]['son_ticket'][$son_key]['run_time'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['run_time'];//游玩时间
  160. $ticket_product_info[$main_key]['son_ticket'][$son_key]['principal_id'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['principal_id'];//运营负责人
  161. $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['ticket_stock'] -= $son_vel['prod_num'];
  162. }
  163. }
  164. #endregion
  165. $this->ticket_product = $ticket_product_info;
  166. return $ticket_product_info;
  167. }
  168. /**
  169. * Function Description:获取提交门票订单数据
  170. * Function Name: getSubmitTicketData
  171. * @param int $unique_id 唯一主键
  172. * @param array $order_main_base 订单基础配置
  173. * @param array $pay_main_base 主支付记录基础配置
  174. * @param array $pay_detail_base 支付明细
  175. * @param int $user_id 用户id
  176. * @param string $create_time 创建时间
  177. *
  178. * @return array
  179. *
  180. * @author 张帅
  181. */
  182. public function getSubmitTicketData($unique_id, $order_main_base, $pay_main_base, $pay_detail_base, $user_id, $create_time)
  183. {
  184. #region 设置常量
  185. $this->order_main_base = $order_main_base;
  186. $this->pay_main_base = $pay_main_base;
  187. $this->pay_detail_base = $pay_detail_base;
  188. $this->user_id = $user_id;
  189. $this->create_time = $create_time;
  190. #endregion
  191. #region 获取门票选购产品数据
  192. $ticket_product_info = $this->ticket_product;
  193. #endregion
  194. #region 提交订单素材
  195. $order_main_arr = [];//订单表提交数据
  196. $main_order_id_arr = [];//巴士订单组
  197. $opera_product_run_arr = [];//opera_product_run需要修改数据
  198. $pay_main_arr = [];//主支付记录
  199. $pay_detail_arr = [];//支付明细
  200. #endregion
  201. #region 遍历主订单
  202. foreach ($ticket_product_info as $main_key => $main_vel) {
  203. $pay_main_id = $unique_id;
  204. $order_id = $pay_main_id + 1;//订单递增id
  205. $main_order_id = $order_id;//主订单id
  206. #region 主订单单一数据
  207. $order_main_one = $this->getMainOrderInfoArray($order_id, $pay_main_id, $main_vel);
  208. #endregion
  209. #region 插入主订单
  210. $order_main_arr[] = $order_main_one;
  211. $main_order_id_arr[$order_id] = $order_id;//收集主订单号
  212. #endregion
  213. #region 遍历子订单
  214. foreach ($main_vel['son_ticket'] as $son_key => $son_vel) {
  215. for ($i = 1; $i <= $son_vel['prod_num']; $i++) {
  216. $order_id++;//获取订单号
  217. #region 子订单单一数据
  218. $order_main_one = $this->getSonOrderInfoArray($order_id, $main_order_id, $pay_main_id, $main_vel, $son_vel);
  219. #endregion
  220. #region 插入子订单
  221. $order_main_arr[] = $order_main_one;
  222. #endregion
  223. }
  224. #region 获取opera_product_run数据
  225. $opera_product_run_arr = $this->getOperaProductRunInfo($opera_product_run_arr, $main_vel['run_date'], $son_vel['son_ticket_id'], $son_vel['prod_num']);
  226. #endregion
  227. }
  228. #endregion
  229. #region 获取主支付记录数据
  230. $total_price = 0;
  231. foreach ($main_vel['son_ticket'] as $key => $vel) {
  232. $total_price += $vel['price'] * $vel['prod_num'];
  233. }
  234. $pay_main_one = $this->getPayMainInfo($pay_main_id, $main_order_id, $total_price);
  235. $pay_main_arr[] = $pay_main_one;
  236. #endregion
  237. #region 获取支付明细数据
  238. $pay_detail_one = $this->getPayDetailInfo($pay_main_id, $total_price);
  239. $pay_detail_arr[] = $pay_detail_one;
  240. #endregion
  241. $unique_id = $order_id + 1;
  242. }
  243. #endregion
  244. $result = [
  245. 'main_order_id_arr' => $main_order_id_arr,//巴士订单号数组
  246. 'order_main_arr' => $order_main_arr,//订单表数据
  247. 'opera_product_run_arr' => $opera_product_run_arr,//opera_product_run需要修改数据
  248. 'pay_main_arr' => $pay_main_arr,//主支付记录
  249. 'pay_detail_arr' => $pay_detail_arr,//支付明细
  250. 'unique_id' => $unique_id,//唯一键值
  251. ];
  252. return $result;
  253. }
  254. /**
  255. * Function Description:获取门票主订单数据
  256. * Function Name: getMainOrderInfoArray
  257. * @param int $order_id 订单号
  258. * @param int $pay_main_id 支付号
  259. * @param array $main_order 订单信息
  260. *
  261. * @return mixed
  262. *
  263. * @author 张帅
  264. */
  265. public function getMainOrderInfoArray($order_id, $pay_main_id, $main_order)
  266. {
  267. #region 获取订单配置
  268. $result = $this->order_main_base;
  269. #endregion
  270. $result['ID'] = $order_id;//订单号
  271. $result['ORDER_ID'] = $order_id;//订单号
  272. #region 获取订单描述 和 总价 总人数 总成本价
  273. $order_description = [];
  274. $total_price = 0;
  275. $total_base_price = 0;
  276. $total_prod_num = 0;
  277. foreach ($main_order['son_ticket'] as $key => $vel) {
  278. $order_description[] = $vel['ticket_name'] . ',' . date('Y-m-d', time()) . ',' . $vel['prod_num'];
  279. $total_price += $vel['price'] * $vel['prod_num'];
  280. $total_base_price += $vel['prod_price'] * $vel['prod_num'];
  281. $total_prod_num += $vel['prod_num'];
  282. }
  283. $order_description[] = $total_prod_num;
  284. $order_description = implode('|', $order_description);
  285. #endregion
  286. $result['ORDER_DESCRIPTION'] = $order_description;//订单描述
  287. $result['ORDER_PAY_MAIN_ID'] = $pay_main_id;//主支付记录id
  288. $result['PROD_ID'] = $main_order['ticket_id'];//父门票id
  289. $result['PROD_NAME'] = $main_order['ticket_name'];//父门票名称
  290. $result['PARENT_PROD_ID'] = $main_order['ticket_id'];//父门票id
  291. $result['PARENT_PROD_NAME'] = $main_order['ticket_name'];//父门票名称
  292. $result['BASE_PRICE'] = $total_base_price;//产品成本
  293. $result['ORDER_PRICE'] = $total_base_price;//订单价格
  294. $result['ORDER_PROD_TYPE'] = 311;//订单类型
  295. $result['RUN_DATE'] = $main_order['run_date'];//游玩日期
  296. $result['PRINCIPAL_ID'] = isset($main_order['principal_id'])?$main_order['principal_id']:0; //运营负责人
  297. $result['RUN_DATE_NUM'] = (strtotime($main_order['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);//班次首发日期参数,发车日期至2016-01-01天数,算法使用,
  298. return $result;
  299. }
  300. /**
  301. * Function Description:获取门票子订单数据
  302. * Function Name: getSonOrderInfoArray
  303. * @param int $order_id 订单号
  304. * @param int $main_order_id 父订单号
  305. * @param int $pay_main_id 支付号
  306. * @param array $main_order 订单信息
  307. * @param array $son_order 子票种信息
  308. *
  309. * @return mixed
  310. *
  311. * @author 张帅
  312. */
  313. public function getSonOrderInfoArray($order_id, $main_order_id, $pay_main_id, $main_order, $son_order)
  314. {
  315. #region 获取订单配置
  316. $result = $this->order_main_base;
  317. #endregion
  318. $result['ID'] = $order_id;//订单号
  319. $result['ORDER_ID'] = $order_id;//订单号
  320. $result['ORDER_PAY_MAIN_ID'] = $pay_main_id;//主支付记录id
  321. $result['PARENT_ORDER_ID'] = $main_order_id;//父订单id
  322. $result['PROD_ID'] = $son_order['son_ticket_id'];//子产品id
  323. $result['PROD_NAME'] = $son_order['ticket_name'];//子产品名称
  324. $result['PARENT_PROD_ID'] = $main_order['ticket_id'];//父产品id
  325. $result['PARENT_PROD_NAME'] = $main_order['ticket_name'];//父产品名称
  326. $result['BASE_PRICE'] = $son_order['prod_price'];//产品成本
  327. $result['ORDER_PRICE'] = $son_order['price'];//订单价格
  328. $result['ORDER_PROD_TYPE'] = $son_order['ticket_type'];//订单类型
  329. $result['RUN_DATE'] = $main_order['run_date'];//出行日期
  330. $result['PRINCIPAL_ID'] = isset($main_order['principal_id'])?$main_order['principal_id']:0; //运营负责人
  331. $result['RUN_DATE_NUM'] = (strtotime($main_order['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);//班次首发日期参数,发车日期至2016-01-01天数,算法使用,
  332. $result['RUN_TIME'] = $son_order['run_time'];//出行日期
  333. return $result;
  334. }
  335. /**
  336. * Function Description:opera_product_run要更新的数据
  337. * Function Name: getOperaProductRunInfo
  338. * @param array $opera_product_run_arr opera_product_run要更新的数据
  339. * @param string $run_date 游玩日期
  340. * @param int $son_ticket_id 子票种id
  341. * @param int $prod_num 人数
  342. *
  343. * @return mixed
  344. *
  345. * @author 张帅
  346. */
  347. public function getOperaProductRunInfo($opera_product_run_arr, $run_date, $son_ticket_id, $prod_num)
  348. {
  349. if (!isset($opera_product_run_arr[$run_date . '-' . $son_ticket_id])) {
  350. $opera_product_run_one = [];
  351. $opera_product_run_one['run_date'] = $run_date;//游玩日期
  352. $opera_product_run_one['ticket_id'] = $son_ticket_id;//子票种id
  353. $opera_product_run_one['update_user_id'] = $this->user_id;//更新用户id
  354. $opera_product_run_one['update_time'] = $this->create_time;//更新时间
  355. $opera_product_run_one['num'] = $prod_num;//人数
  356. $opera_product_run_arr[$run_date . '-' . $son_ticket_id] = $opera_product_run_one;//run_bus数据
  357. } else {
  358. $opera_product_run_arr[$run_date . '-' . $son_ticket_id]['num']++;//增加人数
  359. }
  360. return $opera_product_run_arr;
  361. }
  362. /**
  363. * Function Description:获取主支付记录数据
  364. * Function Name: getPayMainInfo
  365. * @param int $pay_main_id 支付id
  366. * @param int $order_id 订单id
  367. * @param double $total_price 总价
  368. *
  369. * @return mixed
  370. *
  371. * @author 张帅
  372. */
  373. public function getPayMainInfo($pay_main_id, $order_id, $total_price)
  374. {
  375. #region 获取主支付记录配置
  376. $result = $this->pay_main_base;
  377. #endregion
  378. $result['ID'] = $pay_main_id;//支付id
  379. $result['PAY_TOTAL'] = $total_price;//订单id
  380. $result['ORDER_ID'] = $order_id;//总价
  381. return $result;
  382. }
  383. /**
  384. * Function Description:获取支付明细数据
  385. * Function Name: getPayDetailInfo
  386. * @param int $pay_main_id 支付id
  387. * @param double $total_price 总价
  388. *
  389. * @return mixed
  390. *
  391. * @author 张帅
  392. */
  393. public function getPayDetailInfo($pay_main_id, $total_price)
  394. {
  395. #region 获取支付明细配置
  396. $result = $this->pay_detail_base;
  397. #endregion
  398. $result['ID'] = $pay_main_id;//支付id
  399. $result['PAY_MAIN_ID'] = $pay_main_id;//订单id
  400. $result['PAY_MONEY'] = $total_price;//总价
  401. return $result;
  402. }
  403. }