Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

987 строки
42 KiB

  1. <?php
  2. /**
  3. *
  4. * ============================================================================
  5. * * 版权所有 蜘蛛出行 * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * Author By: 张帅
  12. * PhpStorm GetHotelOrderData.php
  13. * Create By 2017/4/18 9:44 $
  14. */
  15. namespace backend\modules\api\logic;
  16. use backend\modules\api\models\BaseArea;
  17. use backend\modules\api\models\BaseSupplier;
  18. use backend\modules\api\models\OperaHotel;
  19. use backend\modules\api\models\OperaHotelRoom;
  20. use backend\modules\api\models\RunHotelDistrib;
  21. use backend\modules\api\models\RunHotel;
  22. use backend\modules\api\models\RunHotelSubRoom;
  23. use yii\db\Expression;
  24. use yii\db\Query;
  25. class GetHotelOrderData extends Query
  26. {
  27. public $hotel_product;//酒店产品
  28. public $room_stock;//基础库存
  29. public $channel_id;//渠道id
  30. public $order_main_base = [];//订单基础配置
  31. public $pay_main_base = [];//主支付记录基础配置
  32. public $pay_detail_base = [];//支付明细
  33. public $user_id;//用户id
  34. public $create_time;//创建时间
  35. /**
  36. * Function Description:获取酒店产品的基础房型
  37. * Function Name: getBaseRoomInfo
  38. *
  39. * @param array $hotel_product 酒店选购产品
  40. *
  41. * @return mixed
  42. *
  43. * @author 张帅
  44. */
  45. public function getBaseRoomInfo($hotel_product)
  46. {
  47. #region 获取房型数据
  48. $and_where = ['or'];
  49. foreach ($hotel_product as $key => $vel) {
  50. $and_where[] = [
  51. 'and',
  52. ['=', 'ohr.hotel_id', $vel['hotel_id']],
  53. ['=', 'ohr.room_type', $vel['room_type']],
  54. ];
  55. }
  56. $base_room_list = OperaHotel::find()
  57. ->select([
  58. 'oh.hotel_id',//酒店id
  59. 'oh.hotel_name',//酒店名称
  60. 'oh.supplier_id',//供应商id
  61. 'supplier_name' => BaseSupplier::find()->select('supplier_name')->where('id = oh.supplier_id')->limit(1),
  62. 'ohr.room_type',//房间类型
  63. 'base_room_type' => 'ohr.parent_room_type',//基础房型
  64. 'ohr.room_name',//房间名称
  65. 'oh.area_id',//酒店地点id
  66. 'area_name' => BaseArea::find()->select('area_name')->where('id = oh.area_id')->limit(1),
  67. ])
  68. ->from(OperaHotel::tableName() . ' as oh')
  69. ->leftJoin(OperaHotelRoom::tableName() . ' as ohr', 'oh.hotel_id = ohr.hotel_id')
  70. ->where([
  71. 'and',
  72. ['=', 'oh.cancel_flag', 0],
  73. ['=', 'oh.hotel_status', 1],//表示上线
  74. ['=', 'ohr.cancel_flag', 0],
  75. ['=', 'ohr.is_onsale', 1],//表示上线
  76. ])
  77. ->andWhere($and_where)
  78. ->groupBy(['hotel_id', 'room_type'])
  79. ->asArray()->all();
  80. #endregion
  81. #region 整理数据
  82. $base_room_arr = [];
  83. foreach ($base_room_list as $key => $vel) {
  84. $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']] = $vel;
  85. }
  86. foreach ($hotel_product as $key => $vel) {
  87. #region 判断产品是否存在
  88. if (!isset($base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']])) {
  89. $json['code'] = '1';
  90. $json['info'] = '酒店产品有误';
  91. return $json;
  92. }
  93. #endregion
  94. $hotel_product[$key]['hotel_name'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['hotel_name'];//酒店名称
  95. $hotel_product[$key]['supplier_id'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['supplier_id'];//供应商
  96. $hotel_product[$key]['supplier_name'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['supplier_name'];//供应商
  97. $hotel_product[$key]['room_name'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['room_name'];//子房型名称
  98. $hotel_product[$key]['base_room_type'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['base_room_type'];//基础房型
  99. $hotel_product[$key]['area_id'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['area_id'];//酒店地点id
  100. $hotel_product[$key]['area_name'] = $base_room_arr[$vel['hotel_id'] . '-' . $vel['room_type']]['area_name'];//酒店地点
  101. }
  102. #endregion
  103. $this->hotel_product = $hotel_product;
  104. $json['code'] = '0';
  105. $json['info'] = '成功';
  106. return $json;
  107. }
  108. /**
  109. * Function Description:获取酒店基础库存
  110. * Function Name: getHotelBaseStock
  111. *
  112. * @param int $channel_id 渠道id
  113. *
  114. * @return mixed
  115. *
  116. * @author 张帅
  117. */
  118. public function getRoomBaseStock($channel_id)
  119. {
  120. #region 设置渠道号
  121. $this->channel_id = $channel_id;
  122. #endregion
  123. #region 获取酒店选购产品数据
  124. $hotel_product_info = $this->hotel_product;
  125. #endregion
  126. #region 获取基础库存
  127. $and_where = ['or'];
  128. foreach ($hotel_product_info as $hotel_key => $hotel_vel) {
  129. foreach ($hotel_vel['run_room'] as $room_key => $room_vel) {
  130. $and_where[] = [
  131. 'and',
  132. ['=', 'run_date', $room_vel['run_date']],
  133. ['=', 'hotel_id', $hotel_vel['hotel_id']],
  134. ['=', 'base_room_type', $hotel_vel['base_room_type']],
  135. ['=', 'room_type', $hotel_vel['room_type']],
  136. ];
  137. }
  138. }
  139. $room_stock_list = RunHotelDistrib::find()
  140. ->select([
  141. 'run_date',
  142. 'hotel_id',
  143. 'base_room_type',
  144. 'room_type',
  145. 'remaining_count',//数量
  146. 'oversell_flag',//超卖标志
  147. 'consume_stock_type',//售卖顺序
  148. ])
  149. ->where([
  150. 'and',
  151. ['=', 'distrib_id', $channel_id],
  152. ['=', 'authority_status', 1],//授权
  153. ['=', 'run_status', 326],//房态 :326 固定数量,329 关房
  154. ])
  155. ->andWhere($and_where)
  156. ->asArray()->all();
  157. #endregion
  158. #region 判断库存
  159. if (count($room_stock_list) == 0) {
  160. $json['code'] = '1';
  161. $json['info'] = '酒店库存不足';
  162. return $json;
  163. }
  164. #endregion
  165. #region 处理数据
  166. $room_stock_arr = [];
  167. foreach ($room_stock_list as $key => $vel) {
  168. $stock_type_arr = explode(',', $vel['consume_stock_type']);//下单时消耗的库存类型顺序
  169. $stock_type_arr = array_unique($stock_type_arr);
  170. $vel['stock_type_arr'] = $stock_type_arr;
  171. $room_stock_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']] = $vel;
  172. }
  173. #endregion
  174. $this->room_stock = $room_stock_arr;
  175. $json['code'] = '0';
  176. $json['info'] = '成功';
  177. return $json;
  178. }
  179. /**
  180. * Function Description:获取详情库存
  181. * Function Name: getRoomInfoStock
  182. *
  183. * @return mixed
  184. *
  185. * @author 张帅
  186. */
  187. public function getRoomInfoStock()
  188. {
  189. #region 获取酒店选购产品数据
  190. $room_base_stock = $this->room_stock;
  191. #endregion
  192. #region 获取库存详情
  193. $and_where = ['or'];
  194. foreach ($room_base_stock as $key => $vel) {
  195. $and_where[] = [
  196. 'and',
  197. ['=', 'rh.run_date', $vel['run_date']],
  198. ['=', 'rh.hotel_id', $vel['hotel_id']],
  199. ['=', 'rh.base_room_type', $vel['base_room_type']],
  200. ['in', 'rh.stock_type', $vel['stock_type_arr']],
  201. ['=', 'rhs.room_type', $vel['room_type']],
  202. ];
  203. }
  204. $stock_list = RunHotel::find()
  205. ->select([
  206. 'rh.hotel_id',
  207. 'rh.base_room_type',
  208. 'rhs.room_type',
  209. 'rh.run_date',//入住日期
  210. 'rh.stock_type',//库存类型
  211. 'rh.remaining_count',//库存剩余数量
  212. 'cost_price' => new Expression("case rh.stock_type when 228 then rhs.base_price_buyout when 230 then rhs.base_price_reserve when 229 then rhs.base_price_inquiry else 0 end"),//价格
  213. ])
  214. ->from(RunHotel::tableName() . ' as rh')
  215. ->leftJoin(RunHotelSubRoom::tableName() . ' as rhs', 'rh.hotel_id = rhs.hotel_id and rh.base_room_type = rhs.base_room_type and rh.run_date = rhs.run_date')
  216. ->where([
  217. 'and',
  218. ['=', 'rhs.run_status', 1],
  219. ['=', 'rhs.is_onsale', 1],
  220. ['=', 'rh.is_onsale', 1],
  221. ])
  222. ->andWhere($and_where)
  223. ->asArray()->all();
  224. #endregion
  225. #region 整理库存详情
  226. $stock_list_arr = [];
  227. foreach ($stock_list as $key => $vel) {
  228. $stock_list_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date'] . '-' . $vel['stock_type']] = $vel;
  229. }
  230. foreach ($room_base_stock as $room_key => $room_vel) {
  231. $room_base_stock[$room_key]['consume_stock_count1'] = 0;
  232. $room_base_stock[$room_key]['consume_stock_count2'] = 0;
  233. foreach ($room_vel['stock_type_arr'] as $key => $vel) {
  234. if (isset($stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel])) {
  235. if ($vel == 228 || $vel == 230) {
  236. $room_base_stock[$room_key]['consume_stock_count1'] += $stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel]['remaining_count'];
  237. $room_base_stock[$room_key]['stock_type_arr1'][] = $stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel];
  238. } elseif ($vel == 229) {
  239. $room_base_stock[$room_key]['consume_stock_count2'] = $stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel]['remaining_count'];
  240. $room_base_stock[$room_key]['stock_type_arr2'][] = $stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel];
  241. }
  242. $room_base_stock[$room_key]['stock_type_arr'][$key] = $stock_list_arr[$room_vel['hotel_id'] . '-' . $room_vel['base_room_type'] . '-' . $room_vel['room_type'] . '-' . $room_vel['run_date'] . '-' . $vel];//不同库存类型的库存和价格
  243. }
  244. }
  245. }
  246. #endregion
  247. $this->room_stock = $room_base_stock;
  248. $json['code'] = '0';
  249. $json['info'] = '成功';
  250. return $json;
  251. }
  252. /**
  253. * Function Description:获取酒店产品的库存情况
  254. * Function Name: checkHotelProductStock
  255. *
  256. * @return mixed
  257. *
  258. * @author 张帅
  259. */
  260. public function checkHotelProductStock()
  261. {
  262. #endregion
  263. $is_reserve_ok = $this->FxCheckHotelStock(1);
  264. if ($is_reserve_ok['code'] == 1) {//总库存不足
  265. return $is_reserve_ok;
  266. } elseif ($is_reserve_ok['code'] == 2) {//买断和保留库存不足
  267. $is_inquiry_ok = $this->FxCheckHotelStock(2);//尝试所有都用现询房
  268. if ($is_inquiry_ok['code'] != 0) {
  269. return [
  270. 'code' => 1,
  271. 'info' => '酒店库存不足'
  272. ];
  273. } else {
  274. $hotel_product_info = $is_inquiry_ok['result'];
  275. }
  276. } else {
  277. $hotel_product_info = $is_reserve_ok['result'];
  278. }
  279. #endregion
  280. $this->hotel_product = $hotel_product_info;
  281. return $hotel_product_info;
  282. }
  283. /**
  284. * Function Description:判断酒店库存是否足够函数
  285. * Function Name: FxCheckHotelStock
  286. *
  287. * @param $is_reserve 1 :买断和保留库存 2:现询库存
  288. *
  289. * @return array
  290. *
  291. * @author 娄梦宁
  292. */
  293. public function FxCheckHotelStock($is_reserve)
  294. {
  295. #region 获取酒店选购产品数据
  296. $hotel_product_info = $this->hotel_product;
  297. #endregion
  298. #region 获取酒店选购产品库存数据
  299. $room_stock = $this->room_stock;
  300. #endregion
  301. #region 整理数据并判断库存
  302. foreach ($hotel_product_info as $hotel_key => $hotel_vel) {
  303. #region 主订单必需数据
  304. $hotel_vel['refuse_flag'] = 0;//是否可拒单状态
  305. $hotel_vel['total_price'] = 0;//订单总价
  306. $hotel_vel['total_commision'] = 0;//订单总返佣
  307. $hotel_vel['total_cost_price'] = 0;//订单总成本
  308. $hotel_vel['total_num'] = 0;//订单总人数
  309. #endregion
  310. foreach ($hotel_vel['run_room'] as $room_key => $room_vel) {
  311. #region 判断库存是否存在
  312. if (!isset($room_stock[$hotel_vel['hotel_id'] . '-' . $hotel_vel['base_room_type'] . '-' . $hotel_vel['room_type'] . '-' . $room_vel['run_date']])) {
  313. $json['code'] = '1';
  314. $json['info'] = '酒店库存不足';
  315. return $json;
  316. }
  317. #endregion
  318. #region 单房间库存
  319. $room_stock_one = $room_stock[$hotel_vel['hotel_id'] . '-' . $hotel_vel['base_room_type'] . '-' . $hotel_vel['room_type'] . '-' . $room_vel['run_date']];
  320. #endregion
  321. $room_vel['oversell_flag'] = $room_stock_one['oversell_flag'];//超卖标志
  322. $room_vel['remaining_count'] = $room_stock_one['remaining_count'];//房间基础库存
  323. $room_vel['consume_stock_count' . $is_reserve] = $room_stock_one['consume_stock_count' . $is_reserve];//房间总库存
  324. #region 判断库存
  325. if ($room_vel['prod_num'] > $room_vel['consume_stock_count' . $is_reserve] || ($room_vel['oversell_flag'] == 0 && $room_vel['prod_num'] > $room_vel['remaining_count'])) {
  326. $json['code'] = '2';
  327. return $json;
  328. }
  329. if ($room_vel['prod_num'] > $room_vel['remaining_count']) {
  330. $hotel_vel['refuse_flag'] = 1;
  331. }
  332. #endregion
  333. #region 按人数拆单
  334. $room_vel['total_price'] = $room_vel['prod_num'] * $room_vel['prod_price'];//总价格
  335. if ($room_vel['back_commision_method'] == 308) {//按百分比算佣金
  336. $room_vel['total_commision'] = (int)$room_vel['back_percent'] * 0.01 * $room_vel['prod_price'] * $room_vel['prod_num'];
  337. } else {
  338. $room_vel['total_commision'] = $room_vel['prod_num'] * $room_vel['back_value'];//总返佣
  339. }
  340. $room_vel['total_cost_price'] = 0;//总成本
  341. $son_order = [];
  342. for ($i = 0; $i < $room_vel['prod_num']; $i++) {
  343. $son_order[$i]['price'] = $room_vel['prod_price'];//价格
  344. //佣金规则--娄梦宁
  345. if ($room_vel['back_commision_method'] == 308) {//按百分比算
  346. $son_order[$i]['commision'] = (int)$room_vel['back_percent'] * 0.01 * $room_vel['prod_price'];
  347. } else {
  348. $son_order[$i]['commision'] = $room_vel['back_value'];
  349. }
  350. #region 获取成本
  351. foreach ($room_stock_one['stock_type_arr' . $is_reserve] as $key => $vel) {
  352. if ($vel['remaining_count'] > 0) {
  353. $son_order[$i]['cost_price'] = $vel['cost_price'];//成本
  354. $son_order[$i]['stock_type'] = $vel['stock_type'];//库存类型
  355. $room_stock_one['stock_type_arr' . $is_reserve][$key]['remaining_count']--;//库存类型库存减少
  356. $room_vel['total_cost_price'] += $vel['cost_price'];
  357. break;
  358. }
  359. }
  360. #endregion
  361. }
  362. $room_vel['son_order'] = $son_order;
  363. $hotel_vel['total_price'] += $room_vel['total_price'];
  364. $hotel_vel['total_commision'] += $room_vel['total_commision'];
  365. $hotel_vel['total_cost_price'] += $room_vel['total_cost_price'];
  366. $hotel_vel['total_num'] += $room_vel['prod_num'];//订单总人数
  367. #endregion
  368. #region 库存减少
  369. if ($room_vel['prod_num'] > $room_stock_one['remaining_count']) {
  370. $room_vel['is_disperse'] = $room_vel['prod_num'] - $room_stock_one['remaining_count'];//需要分发到其他渠道的订单数
  371. $room_vel['no_disperse'] = $room_stock_one['remaining_count'];//本渠道的订单数
  372. $room_stock_one['remaining_count'] = 0;//渠道预售
  373. } else {
  374. $room_vel['is_disperse'] = 0;//需要分发到其他渠道的订单数
  375. $room_vel['no_disperse'] = $room_vel['prod_num'];//本渠道的订单数
  376. $room_stock_one['remaining_count'] -= $room_vel['prod_num'];//渠道预售
  377. }
  378. $room_stock_one['consume_stock_count' . $is_reserve] -= $room_vel['prod_num'];//总库存
  379. $room_stock[$hotel_vel['hotel_id'] . '-' . $hotel_vel['base_room_type'] . '-' . $hotel_vel['room_type'] . '-' . $room_vel['run_date']] = $room_stock_one;
  380. #endregion
  381. $hotel_vel['run_room'][$room_key] = $room_vel;
  382. }
  383. $hotel_product_info[$hotel_key] = $hotel_vel;
  384. }
  385. return [
  386. 'code' => 0,
  387. 'result' => $hotel_product_info
  388. ];
  389. }
  390. /**
  391. * Function Description:获取提交酒店订单数据
  392. * Function Name: getSubmitHotelData
  393. *
  394. * @param int $unique_id 唯一主键
  395. * @param array $order_main_base 订单基础配置
  396. * @param array $pay_main_base 主支付记录基础配置
  397. * @param array $pay_detail_base 支付明细
  398. * @param int $user_id 用户id
  399. * @param string $create_time 创建时间
  400. *
  401. * @return array
  402. *
  403. * @author 张帅
  404. */
  405. public function getSubmitHotelData($unique_id, $order_main_base, $pay_main_base, $pay_detail_base, $user_id, $create_time)
  406. {
  407. #region 设置常量
  408. $this->order_main_base = $order_main_base;
  409. $this->pay_main_base = $pay_main_base;
  410. $this->pay_detail_base = $pay_detail_base;
  411. $this->user_id = $user_id;
  412. $this->create_time = $create_time;
  413. #endregion
  414. #region 获取酒店选购产品数据
  415. $hotel_product_info = $this->hotel_product;
  416. #endregion
  417. #region 提交订单素材
  418. $order_main_arr = [];//订单表提交数据
  419. $main_order_id_arr = [];//巴士订单组
  420. $run_hotel_arr = [];//run_hotel需要修改数据
  421. $run_hotel_distrib_arr = [];//run_hotel_distrib需要修改数据
  422. $run_hotel_disperse_arr = [];//run_hotel_distrib需要分摊数据
  423. $pay_main_arr = [];//主支付记录
  424. $pay_detail_arr = [];//支付明细
  425. $run_hotel_disperse_result = [];
  426. $order_comment_arr = [];
  427. #endregion
  428. #region 遍历主订单
  429. foreach ($hotel_product_info as $main_key => $main_vel) {
  430. $pay_main_id = $unique_id;
  431. $order_id = $pay_main_id + 1;//订单递增id
  432. $main_order_id = $order_id;//主订单id
  433. #region 主订单单一数据
  434. $order_main_one = $this->getMainOrderInfoArray($order_id, $pay_main_id, $main_vel);
  435. #endregion
  436. #region 插入主订单
  437. $order_main_arr[] = $order_main_one;
  438. $main_order_id_arr[$order_id] = $order_id;//收集主订单号
  439. #endregion
  440. #region 遍历子订单
  441. foreach ($main_vel['run_room'] as $room_key => $room_vel) {
  442. foreach ($room_vel['son_order'] as $son_key => $son_vel) {
  443. $order_id++;//获取订单号
  444. #region 子订单单一数据
  445. $order_main_one = $this->getSonOrderInfoArray($order_id, $main_order_id, $pay_main_id, $main_vel, $room_vel, $son_vel);
  446. #endregion
  447. #region 插入子订单
  448. $order_main_arr[] = $order_main_one;
  449. #endregion
  450. #region 获取run_hotel需要修改的库存
  451. $run_hotel_arr = $this->getRunHotelInfo($run_hotel_arr, $main_vel['hotel_id'], $main_vel['base_room_type'], $room_vel['run_date'], $son_vel['stock_type']);
  452. #endregion
  453. }
  454. #region 获取run_hotel_distrib需要修改的库存
  455. $run_hotel_distrib_arr = $this->getRunHotelDistriblInfo($run_hotel_distrib_arr, $main_vel['hotel_id'], $main_vel['base_room_type'], $main_vel['room_type'], $room_vel['run_date'], $room_vel['no_disperse'], $room_vel['is_disperse']);
  456. #endregion
  457. #region 获取run_hotel_distrib需要分摊数据
  458. if ($room_vel['is_disperse'] > 0) {
  459. $run_hotel_disperse_arr = $this->getRunHotelDisperselInfo($run_hotel_disperse_arr, $main_vel['hotel_id'], $main_vel['base_room_type'], $main_vel['room_type'], $room_vel['run_date'], $room_vel['is_disperse'], $main_order_id);
  460. }
  461. #endregion
  462. }
  463. #endregion
  464. #region 获取酒店订单备注
  465. if ($main_vel['hotel_memo'] != '') {
  466. $order_comment_one = $this->getOrderCommentInfo($main_order_id, $main_vel['hotel_memo']);
  467. $order_comment_arr[] = $order_comment_one;
  468. }
  469. #endregion
  470. #region 获取主支付记录数据
  471. $pay_main_one = $this->getPayMainInfo($pay_main_id, $main_order_id, $main_vel['total_price']);
  472. $pay_main_arr[] = $pay_main_one;
  473. #endregion
  474. #region 获取支付明细数据
  475. $pay_detail_one = $this->getPayDetailInfo($pay_main_id, $main_vel['total_price']);
  476. $pay_detail_arr[] = $pay_detail_one;
  477. #endregion
  478. $unique_id = $order_id + 1;
  479. }
  480. #endregion
  481. #region 获取分摊库存需要更新数据
  482. if (count($run_hotel_disperse_arr) > 0) {
  483. $run_hotel_disperse_result = $this->getDisperseData($run_hotel_disperse_arr);
  484. }
  485. #endregion
  486. $result = [
  487. 'main_order_id_arr' => $main_order_id_arr,//巴士订单号数组
  488. 'order_main_arr' => $order_main_arr,//订单表数据
  489. 'run_hotel_arr' => $run_hotel_arr,//run_hotel需要修改的库存
  490. 'run_hotel_distrib_arr' => $run_hotel_distrib_arr,//run_hotel_distrib需要修改的库存
  491. 'run_hotel_disperse_result' => $run_hotel_disperse_result,//run_hotel_distrib需要分摊数据
  492. 'order_comment_arr' => $order_comment_arr,
  493. 'pay_main_arr' => $pay_main_arr,//主支付记录
  494. 'pay_detail_arr' => $pay_detail_arr,//支付明细
  495. 'unique_id' => $unique_id,//唯一键值
  496. ];
  497. return $result;
  498. }
  499. /**
  500. * Function Description:获取酒店主订单数据
  501. * Function Name: getMainOrderInfoArray
  502. *
  503. * @param int $order_id 订单号
  504. * @param int $pay_main_id 支付号
  505. * @param array $main_order 订单信息
  506. *
  507. * @return mixed
  508. *
  509. * @author 张帅
  510. */
  511. public function getMainOrderInfoArray($order_id, $pay_main_id, $main_order)
  512. {
  513. #region 获取订单配置
  514. $result = $this->order_main_base;
  515. #endregion
  516. $result['ID'] = $order_id;//订单号
  517. $result['ORDER_ID'] = $order_id;//订单号
  518. $result['PROD_TOP_ORG_ID'] = $main_order['supplier_id'];//供应商id
  519. $result['PROD_SUPPLY_ORG_NAME'] = $main_order['supplier_name'];//供应商名称
  520. $order_description = [];
  521. foreach ($main_order['run_room'] as $key => $vel) {
  522. $order_description[] = $main_order['room_name'] . ',' . $vel['run_date'] . ',' . $vel['prod_num'];
  523. }
  524. $order_description[] = $main_order['total_num'];
  525. $order_description = implode('|', $order_description);
  526. $result['ORDER_DESCRIPTION'] = $order_description;//订单描述
  527. $result['ORDER_PAY_MAIN_ID'] = $pay_main_id;//主支付记录id
  528. $result['PROD_ID'] = $main_order['room_type'];//房间类型
  529. $result['PROD_NAME'] = $main_order['room_name'];//房间名称
  530. $result['PARENT_PROD_ID'] = $main_order['hotel_id'];//酒店id
  531. $result['PARENT_PROD_NAME'] = $main_order['hotel_name'];//酒店名称
  532. $result['ORDER_PRICE'] = $main_order['total_price'];//订单价格
  533. $result['ORDER_PROD_TYPE'] = 25;//订单类型
  534. $result['BASE_PRICE'] = $main_order['total_cost_price'];//成本价
  535. $result['PROD_START_STATION_DATE'] = $main_order['start_date'];//入住时间
  536. $result['PROD_START_STATION_DATE_NUM'] = (strtotime($main_order['start_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);
  537. $result['PROD_START_STATION_AREA_ID'] = $main_order['area_id'];//酒店地址id
  538. $result['PROD_START_STATION_AREA_NAME'] = $main_order['area_name'];//酒店地址名称
  539. $end_date = date('Y-m-d', strtotime(" {$main_order['end_date']} +1 day"));
  540. $result['PROD_END_STATION_DATE'] = $end_date;//离店时间
  541. $result['PROD_END_STATION_DATE_NUM'] = (strtotime($end_date) - strtotime('2016-01-01')) / (60 * 60 * 24);
  542. $result['REFUSE_FLAG'] = $main_order['refuse_flag'];//是否可拒单
  543. $total_profit = $main_order['total_price'] - $main_order['total_commision'] - $main_order['total_cost_price'];//总利润
  544. $result['PROFIT_VALUE'] = $total_profit;//总利润
  545. $result['TOTAL_COMMISSION'] = $main_order['total_commision'];//总分佣
  546. $result['ORDER_STATUS'] = 198;
  547. return $result;
  548. }
  549. /**
  550. * Function Description:获取酒店子订单数据
  551. * Function Name: getSonOrderInfoArray
  552. *
  553. * @param int $order_id 订单号
  554. * @param int $main_order_id 父订单号
  555. * @param int $pay_main_id 支付号
  556. * @param array $main_order 订单信息
  557. * @param array $room_arr 房间信息
  558. * @param array $son_order 子订单信息
  559. *
  560. * @return mixed
  561. *
  562. * @author 张帅
  563. */
  564. public function getSonOrderInfoArray($order_id, $main_order_id, $pay_main_id, $main_order, $room_arr, $son_order)
  565. {
  566. #region 获取订单配置
  567. $result = $this->order_main_base;
  568. #endregion
  569. $result['ID'] = $order_id;//订单号
  570. $result['ORDER_ID'] = $order_id;//订单号
  571. $result['PROD_TOP_ORG_ID'] = $main_order['supplier_id'];//供应商id
  572. $result['PROD_SUPPLY_ORG_NAME'] = $main_order['supplier_name'];//供应商名称
  573. $result['ORDER_PAY_MAIN_ID'] = $pay_main_id;//主支付记录id
  574. $result['PARENT_ORDER_ID'] = $main_order_id;//父订单号
  575. $result['PROD_ID'] = $main_order['room_type'];//房间类型
  576. $result['PROD_NAME'] = $main_order['room_name'];//房间名称
  577. $result['PARENT_PROD_ID'] = $main_order['hotel_id'];//酒店id
  578. $result['PARENT_PROD_NAME'] = $main_order['hotel_name'];//酒店名称
  579. $result['ORDER_PRICE'] = $son_order['price'];//订单价格
  580. $result['ORDER_PROD_TYPE'] = 26;//订单类型
  581. $result['BASE_PRICE'] = $son_order['cost_price'];//成本价
  582. $result['RUN_DATE'] = $room_arr['run_date'];//入住日期
  583. $result['RUN_DATE_NUM'] = (strtotime($room_arr['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);
  584. $result['RUN_TIME'] = $room_arr['run_time'];//入住时间
  585. $result['RUN_TIME_MINUTES'] = (strtotime($room_arr['run_time'])) / (60 * 60);
  586. $result['PROD_START_STATION_DATE'] = $room_arr['run_date'];//入住时间
  587. $result['PROD_START_STATION_DATE_NUM'] = (strtotime($room_arr['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);
  588. $result['PROD_START_STATION_AREA_ID'] = $main_order['area_id'];//酒店地址id
  589. $result['PROD_START_STATION_AREA_NAME'] = $main_order['area_name'];//酒店地址名称
  590. $end_date = date('Y-m-d', strtotime(" {$room_arr['run_date']} +1 day"));
  591. $result['PROD_END_STATION_DATE'] = $end_date;//离店时间
  592. $result['PROD_END_STATION_DATE_NUM'] = (strtotime($end_date) - strtotime('2016-01-01')) / (60 * 60 * 24);
  593. $result['REFUSE_FLAG'] = $main_order['refuse_flag'];//是否可拒单
  594. $profit = $son_order['price'] - $son_order['commision'] - $son_order['cost_price'];//利润
  595. $result['PROFIT_VALUE'] = $profit;//利润
  596. $result['TOTAL_COMMISSION'] = $son_order['commision'];//分佣
  597. $result['STOCK_TYPE'] = $son_order['stock_type'];
  598. $result['ORDER_STATUS'] = 198;
  599. return $result;
  600. }
  601. /**
  602. * Function Description:获取主支付记录数据
  603. * Function Name: getPayMainInfo
  604. *
  605. * @param int $pay_main_id 支付id
  606. * @param int $order_id 订单id
  607. * @param double $total_price 总价
  608. *
  609. * @return mixed
  610. *
  611. * @author 张帅
  612. */
  613. public function getPayMainInfo($pay_main_id, $order_id, $total_price)
  614. {
  615. #region 获取主支付记录配置
  616. $result = $this->pay_main_base;
  617. #endregion
  618. $result['ID'] = $pay_main_id;//支付id
  619. $result['PAY_TOTAL'] = $total_price;//订单id
  620. $result['ORDER_ID'] = $order_id;//总价
  621. return $result;
  622. }
  623. /**
  624. * Function Description:获取支付明细数据
  625. * Function Name: getPayDetailInfo
  626. *
  627. * @param int $pay_main_id 支付id
  628. * @param double $total_price 总价
  629. *
  630. * @return mixed
  631. *
  632. * @author 张帅
  633. */
  634. public function getPayDetailInfo($pay_main_id, $total_price)
  635. {
  636. #region 获取支付明细配置
  637. $result = $this->pay_detail_base;
  638. #endregion
  639. $result['ID'] = $pay_main_id;//支付id
  640. $result['PAY_MAIN_ID'] = $pay_main_id;//订单id
  641. $result['PAY_MONEY'] = $total_price;//总价
  642. return $result;
  643. }
  644. /**
  645. * Function Description:获取run_hotel需要修改数据
  646. * Function Name: getRunHotelInfo
  647. *
  648. * @param array $run_hotel_arr run_hotel需要修改数据
  649. * @param int $hotel_id 酒店id
  650. * @param int $base_room_type 基础房型
  651. * @param string $run_date 入住日期
  652. * @param int $stock_type 库存类型
  653. *
  654. * @return mixed
  655. *
  656. * @author 张帅
  657. */
  658. public function getRunHotelInfo($run_hotel_arr, $hotel_id, $base_room_type, $run_date, $stock_type)
  659. {
  660. if (!isset($run_hotel_arr[$hotel_id . '-' . $base_room_type . '-' . $run_date . '-' . $stock_type])) {
  661. $result = [];
  662. $result['hotel_id'] = $hotel_id;//酒店id
  663. $result['base_room_type'] = $base_room_type;//基础房型
  664. $result['run_date'] = $run_date;//入住日期
  665. $result['stock_type'] = $stock_type;//库存类型
  666. $result['update_user_id'] = $this->user_id;//更新用户id
  667. $result['update_time'] = $this->create_time;//更新时间
  668. $result['num'] = 1;//人数
  669. $run_hotel_arr[$hotel_id . '-' . $base_room_type . '-' . $run_date . '-' . $stock_type] = $result;
  670. } else {
  671. $run_hotel_arr[$hotel_id . '-' . $base_room_type . '-' . $run_date . '-' . $stock_type]['num']++;//增加人数
  672. }
  673. return $run_hotel_arr;
  674. }
  675. /**
  676. * Function Description:获取酒店订单备注
  677. * Function Name: getOrderCommentInfo
  678. *
  679. * @param int $main_order_id 订单id
  680. * @param string $hotel_memo 酒店备注
  681. *
  682. * @return array
  683. *
  684. * @author 张帅
  685. */
  686. public function getOrderCommentInfo($main_order_id, $hotel_memo)
  687. {
  688. $result = [
  689. 'ORDER_ID' => $main_order_id,
  690. 'COMMENT_TYPE' => 1,
  691. 'COMMENT_TXT' => $hotel_memo,
  692. 'CREATE_USER_ID' => $this->user_id,//更新用户id
  693. 'CREATE_TIME' => $this->create_time,//更新时间
  694. 'UPDATE_USER_ID' => $this->user_id,//更新用户id
  695. 'UPDATE_TIME' => $this->create_time,//更新时间
  696. ];
  697. return $result;
  698. }
  699. /**
  700. * Function Description:获取run_hotel_distrib需要修改数据
  701. * Function Name: getRunHoteDistriblInfo
  702. *
  703. * @param array $run_hotel_distrib_arr run_hotel_distrib需要修改数据
  704. * @param int $hotel_id 酒店id
  705. * @param int $base_room_type 基础房型
  706. * @param int $room_type 房型类型
  707. * @param string $run_date 入住日期
  708. * @param int $prod_num 人数
  709. * @param int $disperse 需要向其他渠道分配的人数
  710. *
  711. * @return mixed
  712. *
  713. * @author 张帅
  714. */
  715. public function getRunHotelDistriblInfo($run_hotel_distrib_arr, $hotel_id, $base_room_type, $room_type, $run_date, $prod_num, $disperse)
  716. {
  717. if (!isset($run_hotel_distrib_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date])) {
  718. $result = [];
  719. $result['channel_id'] = $this->channel_id;//渠道id
  720. $result['hotel_id'] = $hotel_id;//酒店id
  721. $result['base_room_type'] = $base_room_type;//基础房型
  722. $result['room_type'] = $room_type;//房型类型
  723. $result['run_date'] = $run_date;//入住日期
  724. $result['update_user_id'] = $this->user_id;//更新用户id
  725. $result['update_time'] = $this->create_time;//更新时间
  726. $result['num'] = $prod_num;//人数
  727. $result['saled_count'] = $prod_num + $disperse;//人数
  728. $run_hotel_distrib_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date] = $result;
  729. } else {
  730. $run_hotel_distrib_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date]['num'] += $prod_num;//增加人数
  731. $run_hotel_distrib_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date]['saled_count'] += $prod_num + $disperse;//增加人数
  732. }
  733. return $run_hotel_distrib_arr;
  734. }
  735. /**
  736. * Function Description:获取run_hotel_distrib需要分摊数据
  737. * Function Name: getRunHoteDisperselInfo
  738. *
  739. * @param array $run_hotel_disperse_arr run_hotel_distrib需要分摊数据
  740. * @param int $hotel_id 酒店id
  741. * @param int $base_room_type 基础房型
  742. * @param int $room_type 房型类型
  743. * @param string $run_date 入住日期
  744. * @param int $prod_num 人数
  745. * @param int $main_order_id 主订单号
  746. *
  747. * @return mixed
  748. *
  749. * @author 张帅
  750. */
  751. public function getRunHotelDisperselInfo($run_hotel_disperse_arr, $hotel_id, $base_room_type, $room_type, $run_date, $prod_num, $main_order_id)
  752. {
  753. if (!isset($run_hotel_disperse_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date])) {
  754. $result = [];
  755. $result['hotel_id'] = $hotel_id;//酒店id
  756. $result['base_room_type'] = $base_room_type;//基础房型
  757. $result['room_type'] = $room_type;//房型类型
  758. $result['run_date'] = $run_date;//入住日期
  759. $result['update_user_id'] = $this->user_id;//更新用户id
  760. $result['update_time'] = $this->create_time;//更新时间
  761. $result['num'] = $prod_num;//人数
  762. $result['order_disperse'][$main_order_id] = $prod_num;
  763. $run_hotel_disperse_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date] = $result;
  764. } else {
  765. $run_hotel_disperse_arr[$hotel_id . '-' . $base_room_type . '-' . $room_type . '-' . $run_date]['num'] += $prod_num;//增加人数
  766. $result['order_disperse'][$main_order_id] = $prod_num;
  767. }
  768. return $run_hotel_disperse_arr;
  769. }
  770. /**
  771. * Function Description:获取借房
  772. * Function Name: getDisperseData
  773. *
  774. * @param array $run_hotel_disperse_arr 需要借房的数据
  775. *
  776. * @return mixed
  777. *
  778. * @author 张帅
  779. */
  780. public function getDisperseData($run_hotel_disperse_arr)
  781. {
  782. $run_hotel_distrib_disperse_arr = [];
  783. $order_ht_consume_stock = [];
  784. #region 获取可以借房的渠道
  785. $and_where = ['or'];
  786. foreach ($run_hotel_disperse_arr as $key => $vel) {
  787. $and_where[] = [
  788. 'and',
  789. ['=', 'hotel_id', $vel['hotel_id']],
  790. ['=', 'base_room_type', $vel['base_room_type']],
  791. ['=', 'room_type', $vel['room_type']],
  792. ['=', 'run_date', $vel['run_date']],
  793. ];
  794. }
  795. $channel_list = RunHotelDistrib::find()
  796. ->select([
  797. 'id',
  798. 'hotel_id',//酒店id
  799. 'base_room_type',//基础房型
  800. 'room_type',//房型类型
  801. 'run_date',//入住日期
  802. 'distrib_id',//渠道id
  803. 'remaining_count',
  804. ])
  805. ->where([
  806. 'and',
  807. ['>', 'remaining_count', 0],
  808. ['!=', 'distrib_id', $this->channel_id],
  809. ])
  810. ->andWhere($and_where)
  811. ->orderBy(['remaining_count' => SORT_DESC])
  812. ->asArray()->all();
  813. #endregion
  814. foreach ($channel_list as $key => $vel) {//$vel['distrib_id'] . '-' . $vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']
  815. $num = $run_hotel_disperse_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']]['num'];
  816. if ($num > 0) {
  817. $order_disperse = $run_hotel_disperse_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']]['order_disperse'];
  818. #region 获取借房的渠道的数据
  819. $run_hotel_distrib_disperse_arr_one['distrib_id'] = $vel['distrib_id'];//渠道id
  820. $run_hotel_distrib_disperse_arr_one['hotel_id'] = $vel['hotel_id'];//酒店id
  821. $run_hotel_distrib_disperse_arr_one['base_room_type'] = $vel['base_room_type'];//基础房型
  822. $run_hotel_distrib_disperse_arr_one['room_type'] = $vel['room_type'];//房型类型
  823. $run_hotel_distrib_disperse_arr_one['run_date'] = $vel['run_date'];//入住日期
  824. $run_hotel_distrib_disperse_arr_one['update_time'] = $this->create_time;//
  825. $run_hotel_distrib_disperse_arr_one['update_user_id'] = $this->user_id;//
  826. if ($vel['remaining_count'] >= $num) {
  827. $run_hotel_distrib_disperse_arr_one['num'] = $num;//房间数
  828. $num = 0;
  829. } else {
  830. $run_hotel_distrib_disperse_arr_one['num'] = $vel['remaining_count'];//房间数
  831. $num = $num - $vel['remaining_count'];
  832. // $num = $num - $vel['num'];
  833. }
  834. $run_hotel_distrib_disperse_arr[] = $run_hotel_distrib_disperse_arr_one;
  835. #endregion
  836. $o_num = $vel['remaining_count'];
  837. foreach ($order_disperse as $o_key => $o_vel) {
  838. #region 获取借房记录数据
  839. $order_ht_consume_stock_one['distrib_id'] = $vel['distrib_id'];//渠道id
  840. $order_ht_consume_stock_one['run_date'] = $vel['run_date'];//渠道id
  841. $order_ht_consume_stock_one['order_id'] = $o_key;//订单号
  842. $order_ht_consume_stock_one['update_time'] = $this->create_time;//
  843. $order_ht_consume_stock_one['update_user_id'] = $this->user_id;//
  844. if ($vel['remaining_count'] >= $num + $vel['remaining_count']) {
  845. $order_ht_consume_stock_one['num'] = $o_vel;
  846. $order_disperse[$o_key] = 0;
  847. } else {
  848. if ($o_num >= $o_vel) {
  849. $order_ht_consume_stock_one['num'] = $o_vel;
  850. $order_disperse[$o_key] = 0;
  851. $o_num -= $o_vel;
  852. } else {
  853. $order_ht_consume_stock_one['num'] = $o_num;
  854. $order_disperse[$o_key] = $o_vel - $o_num;
  855. $o_num = 0;
  856. }
  857. }
  858. $order_ht_consume_stock[] = $order_ht_consume_stock_one;
  859. #endregion
  860. }
  861. $run_hotel_disperse_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']]['num'] = $num;
  862. $run_hotel_disperse_arr[$vel['hotel_id'] . '-' . $vel['base_room_type'] . '-' . $vel['room_type'] . '-' . $vel['run_date']]['order_disperse'] = $order_disperse;
  863. }
  864. }
  865. $result['run_hotel_distrib_disperse_arr'] = $run_hotel_distrib_disperse_arr;
  866. $result['order_ht_consume_stock'] = $order_ht_consume_stock;
  867. return $result;
  868. }
  869. }