Reserve.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\store\model;
  11. use app\model\BaseModel;
  12. use app\model\member\Member;
  13. /**
  14. * 预约
  15. */
  16. class Reserve extends BaseModel
  17. {
  18. /**
  19. * 预约状态
  20. * @var array
  21. */
  22. public $reserve_state = [
  23. 'wait_confirm' => [
  24. 'state' => 'wait_confirm',
  25. 'name' => '待确认',
  26. 'color' => '#8558FA'
  27. ],
  28. 'wait_to_store' => [
  29. 'state' => 'wait_to_store',
  30. 'name' => '待到店',
  31. 'color' => '#1475FA'
  32. ],
  33. 'arrived_store' => [
  34. 'state' => 'arrived_store',
  35. 'name' => '已到店',
  36. 'color' => '#FA5B14'
  37. ],
  38. 'completed' => [
  39. 'state' => 'completed',
  40. 'name' => '已完成',
  41. 'color' => '#10C610'
  42. ],
  43. 'cancelled' => [
  44. 'state' => 'cancelled',
  45. 'name' => '已取消',
  46. 'color' => '#CCCCCC'
  47. ]
  48. ];
  49. /**
  50. * 设置预约配置
  51. * @param $data
  52. * @param $site_id
  53. * @param $app_module
  54. * @return array
  55. */
  56. public function setReserveConfig($data, $site_id, $store_id)
  57. {
  58. $save_data[ 'config_desc' ] = '预约配置';
  59. $save_data[ 'is_use' ] = 1;
  60. $save_data[ 'value' ] = json_encode($data);
  61. $config_model = model('reserve_config');
  62. $condition = [
  63. [ 'site_id', '=', $site_id ],
  64. [ 'store_id', '=', $store_id ],
  65. [ 'config_key', '=', 'RESERVE_CONFIG' ]
  66. ];
  67. $info = $config_model->getInfo($condition, 'id');
  68. if (empty($info)) {
  69. $save_data[ 'create_time' ] = time();
  70. $save_data[ 'site_id' ] = $site_id;
  71. $save_data[ 'store_id' ] = $store_id;
  72. $save_data[ 'config_key' ] = 'RESERVE_CONFIG';
  73. $res = $config_model->add($save_data);
  74. } else {
  75. $save_data[ 'modify_time' ] = time();
  76. $res = $config_model->update($save_data, $condition);
  77. }
  78. return $this->success($res);
  79. }
  80. /**
  81. * 获取预约配置
  82. * @param $site_id
  83. * @param $app_module
  84. * @return array
  85. */
  86. public function getReserveConfig($site_id, $store_id)
  87. {
  88. $key = 'RESERVE_CONFIG';
  89. $info = model('reserve_config')->getInfo([ [ 'site_id', '=', $site_id ], [ 'store_id', '=', $store_id ], [ 'config_key', '=', $key ] ], 'site_id, store_id, config_key, value, config_desc, is_use, create_time, modify_time');
  90. if (!empty($info)) {
  91. $info[ 'value' ] = json_decode($info[ 'value' ], true);
  92. } else {
  93. $info = [
  94. 'site_id' => $site_id,
  95. 'store_id' => $store_id,
  96. 'config_key' => $key,
  97. 'value' => [
  98. 'week' => '[1,2,3,4,5]',
  99. 'start' => 32400,
  100. 'end' => 79200,
  101. 'interval' => 30,
  102. 'advance' => 1,
  103. 'max' => 10
  104. ],
  105. 'config_desc' => '',
  106. 'is_use' => 0,
  107. 'create_time' => 0,
  108. 'modify_time' => 0
  109. ];
  110. }
  111. $info[ 'value' ][ 'week' ] = json_decode($info[ 'value' ][ 'week' ], true);
  112. return $this->success($info);
  113. }
  114. /**
  115. * 添加预约
  116. * @param array $param
  117. * @return array
  118. */
  119. public function addReserve(array $param)
  120. {
  121. $member_info = ( new Member() )->getMemberInfo([ [ 'member_id', '=', $param[ 'member_id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ])[ 'data' ];
  122. if (empty($member_info)) return $this->error('', '未查找到会员信息');
  123. $store_info = model('store')->getInfo([ [ 'store_id', '=', $param[ 'store_id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ], 'status');
  124. if (empty($store_info)) return $this->error('', '未查找到门店信息');
  125. $check_res = $this->checkReserve($param);
  126. if ($check_res[ 'code' ] != 0) return $check_res;
  127. model('reserve')->startTrans();
  128. try {
  129. $data = [
  130. 'site_id' => $param[ 'site_id' ],
  131. 'member_id' => $param[ 'member_id' ],
  132. 'reserve_name' => $member_info[ 'nickname' ],
  133. 'reserve_time' => strtotime("{$param['date']} {$param['time']}"),
  134. 'reserve_state' => $this->reserve_state[ 'wait_confirm' ][ 'state' ],
  135. 'reserve_state_name' => $this->reserve_state[ 'wait_confirm' ][ 'name' ],
  136. 'remark' => $param[ 'remark' ],
  137. 'store_id' => $param[ 'store_id' ],
  138. 'source' => $param[ 'source' ] ?? 'member',
  139. 'create_time' => time()
  140. ];
  141. $reserve_id = model('reserve')->add($data);
  142. $reserve_item = [];
  143. $reserve_item_data = [];
  144. foreach ($param[ 'goods' ] as $item) {
  145. $goods_info = model('goods')->getInfo([ [ 'site_id', '=', $param[ 'site_id' ] ], [ 'sku_id', '=', $item[ 'sku_id' ] ], [ 'goods_state', '=', 1 ], [ 'is_delete', '=', 0 ] ], 'goods_name');
  146. if (empty($goods_info)) return $this->error('', '未查找到所预约的服务');
  147. array_push($reserve_item, $goods_info[ 'goods_name' ]);
  148. array_push($reserve_item_data, [
  149. 'reserve_id' => $reserve_id,
  150. 'site_id' => $param[ 'site_id' ],
  151. 'member_id' => $param[ 'member_id' ],
  152. 'reserve_name' => $member_info[ 'nickname' ],
  153. 'reserve_time' => strtotime("{$param['date']} {$param['time']}"),
  154. 'remark' => $param[ 'remark' ],
  155. 'reserve_user_id' => $item[ 'uid' ] ?? 0,
  156. 'reserve_goods_sku_id' => $item[ 'sku_id' ],
  157. 'reserve_state' => $this->reserve_state[ 'wait_confirm' ][ 'state' ],
  158. 'store_id' => $param[ 'store_id' ],
  159. ]);
  160. }
  161. model('reserve_item')->addList($reserve_item_data);
  162. model('reserve')->update([ 'reserve_item' => implode($reserve_item) ], [ [ 'reserve_id', '=', $reserve_id ] ]);
  163. model('reserve')->commit();
  164. return $this->success($reserve_id);
  165. } catch (\Exception $e) {
  166. model('reserve')->rollback();
  167. return $this->error('添加失败' . $e->getMessage() . $e->getFile() . $e->getLine());
  168. }
  169. }
  170. /**
  171. * 编辑预约
  172. * @param $param
  173. * @return array
  174. */
  175. public function editReserve($param)
  176. {
  177. $condition = [
  178. [ 'reserve_id', '=', $param[ 'reserve_id' ] ],
  179. [ 'site_id', '=', $param[ 'site_id' ] ]
  180. ];
  181. if (isset($param[ 'member_id' ])) $condition[] = [ 'member_id', '=', $param[ 'member_id' ] ];
  182. $info = model('reserve')->getInfo($condition);
  183. if (empty($info)) return $this->error('', '未获取到预约信息');
  184. if (!in_array($info[ 'reserve_state' ], [ $this->reserve_state[ 'wait_confirm' ][ 'state' ], $this->reserve_state[ 'wait_to_store' ][ 'state' ] ]))
  185. return $this->error('', '该预约已不可更改');
  186. $check_res = $this->checkReserve($param);
  187. if ($check_res[ 'code' ] != 0) return $check_res;
  188. model('reserve')->startTrans();
  189. try {
  190. $res = model('reserve')->update([
  191. 'reserve_time' => strtotime("{$param['date']} {$param['time']}"),
  192. 'remark' => $param[ 'remark' ],
  193. ], $condition);
  194. // 删除原预约项
  195. $reserve_item = [];
  196. $reserve_item_data = [];
  197. foreach ($param[ 'goods' ] as $item) {
  198. $goods_info = model('goods')->getInfo([ [ 'site_id', '=', $param[ 'site_id' ] ], [ 'sku_id', '=', $item[ 'sku_id' ] ], [ 'goods_state', '=', 1 ], [ 'is_delete', '=', 0 ] ], 'goods_name');
  199. if (empty($goods_info)) return $this->error('', '未查找到所预约的服务');
  200. array_push($reserve_item, $goods_info[ 'goods_name' ]);
  201. array_push($reserve_item_data, [
  202. 'reserve_id' => $param[ 'reserve_id' ],
  203. 'site_id' => $param[ 'site_id' ],
  204. 'member_id' => $info[ 'member_id' ],
  205. 'reserve_name' => $info[ 'reserve_name' ],
  206. 'reserve_time' => strtotime("{$param['date']} {$param['time']}"),
  207. 'remark' => $param[ 'remark' ],
  208. 'reserve_user_id' => $item[ 'uid' ] ?? 0,
  209. 'reserve_goods_sku_id' => $item[ 'sku_id' ],
  210. 'reserve_state' => $info[ 'reserve_state' ],
  211. 'store_id' => $info[ 'store_id' ]
  212. ]);
  213. }
  214. model('reserve_item')->delete([ [ 'reserve_id', '=', $param[ 'reserve_id' ] ] ]);
  215. model('reserve_item')->addList($reserve_item_data);
  216. model('reserve')->update([ 'reserve_item' => implode($reserve_item) ], [ [ 'reserve_id', '=', $param[ 'reserve_id' ] ] ]);
  217. model('reserve')->commit();
  218. return $this->success($res);
  219. } catch (\Exception $e) {
  220. model('reserve')->rollback();
  221. return $this->error();
  222. }
  223. }
  224. /**
  225. * 校验预约是否可添加
  226. * @param $param
  227. * @return array
  228. */
  229. public function checkReserve($param)
  230. {
  231. $site_id = $param[ 'site_id' ] ?? 0;
  232. $date = $param[ 'date' ] ?? 0;
  233. $time = $param[ 'time' ] ?? 0;
  234. $store_id = $param[ 'store_id' ] ?? 0;
  235. $reserve_id = $param[ 'reserve_id' ] ?? 0;
  236. $app_module = $param[ 'app_module' ] ?? '';
  237. $config = $this->getReserveConfig($site_id, $store_id)[ 'data' ][ 'value' ];
  238. // 预约时间
  239. $reserve_time = strtotime($date . ' ' . $time);
  240. if (( $reserve_time - time() ) < ( $config[ 'advance' ] * 3600 )) return $this->error('', '需提前' . $config[ 'advance' ] . '小时预约');
  241. $week = date('w', strtotime($date));
  242. if (!in_array($week, $config[ 'week' ])) return $this->error('', '所选时间不在可预约时间内');
  243. $time = strtotime(date('Y-m-d') . ' ' . $time) - strtotime(date('Y-m-d'));
  244. if ($time < $config[ 'start' ] || $time > $config[ 'end' ]) return $this->error('', '所选时间不在可预约时间内');
  245. $max_condition = [
  246. [ 'site_id', '=', $site_id ],
  247. [ 'reserve_time', '=', strtotime("{$date} {$time}") ],
  248. [ 'reserve_state', '<>', $this->reserve_state[ 'cancelled' ][ 'state' ] ]
  249. ];
  250. if ($reserve_id > 0) $max_condition[] = [ 'reserve_id', '<>', $reserve_id ];
  251. $max = model('reserve')->getCount($max_condition);
  252. if ($max > $config[ 'max' ]) return $this->error('', '所选时段内预约人数已达上限');
  253. return $this->success();
  254. }
  255. /**
  256. * 获取预约列表
  257. * @param array $condition
  258. * @param string $field
  259. * @param string $order
  260. * @param null $limit
  261. * @return array
  262. */
  263. public function getReserveList($condition = [], $field = '*', $order = '', $limit = null)
  264. {
  265. $list = model('reserve')->getList($condition, $field, $order, '', '', '', $limit);
  266. return $this->success($list);
  267. }
  268. /**
  269. * 获取预约数量
  270. * @param array $condition
  271. * @return array
  272. */
  273. public function getReserveCount($condition = [], $field = '*')
  274. {
  275. $list = model('reserve')->getCount($condition, $field);
  276. return $this->success($list);
  277. }
  278. /**
  279. * 获取预约分页列表
  280. * @param array $condition
  281. * @param int $page
  282. * @param int $page_size
  283. * @param string $order
  284. * @param string $field
  285. * @return array
  286. */
  287. public function getReservePageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
  288. {
  289. $join = [
  290. [
  291. 'member nm',
  292. 'noy.member_id = nm.member_id',
  293. 'left'
  294. ],
  295. [
  296. 'store os',
  297. 'noy.store_id = os.store_id',
  298. 'left'
  299. ]
  300. ];
  301. $list = model('reserve')->pageList($condition, $field, $order, $page, $page_size, 'noy', $join);
  302. return $this->success($list);
  303. }
  304. /**
  305. * 获取预约项列表
  306. * @param $condition
  307. * @param $field
  308. * @param $order
  309. * @param string $alias
  310. * @param null $join
  311. * @return array
  312. */
  313. public function getReserveItemList($condition, $field, $order, $alias = 'oyi', $join = null)
  314. {
  315. $list = model('reserve_item')->getList($condition, $field, $order, $alias, $join);
  316. return $this->success($list);
  317. }
  318. /**
  319. * 获取预约详情
  320. * @param $condition
  321. * @param string $field
  322. * @param string $alias
  323. * @param null $join
  324. * @return array
  325. */
  326. public function getReserveInfo($condition, $field = '*', $alias = 'a', $join = null)
  327. {
  328. $res = model('reserve')->getInfo($condition, $field, $alias, $join);
  329. return $this->success($res);
  330. }
  331. /**
  332. * 确认预约
  333. * @param $reserve_id
  334. * @param $site_id
  335. * @return array
  336. */
  337. public function confirmReserve($reserve_id, $site_id)
  338. {
  339. $condition = [
  340. [ 'reserve_id', '=', $reserve_id ],
  341. [ 'site_id', '=', $site_id ],
  342. [ 'reserve_state', '=', $this->reserve_state[ 'wait_confirm' ][ 'state' ] ]
  343. ];
  344. model('reserve')->update([
  345. 'reserve_state' => $this->reserve_state[ 'wait_to_store' ][ 'state' ],
  346. 'reserve_state_name' => $this->reserve_state[ 'wait_to_store' ][ 'name' ]
  347. ], $condition);
  348. model('reserve_item')->update([ 'reserve_state' => $this->reserve_state[ 'wait_to_store' ][ 'state' ] ], $condition);
  349. return $this->success();
  350. }
  351. /**
  352. * 取消预约
  353. * @param $reserve_id
  354. * @param $site_id
  355. * @return array
  356. */
  357. public function cancelReserve($reserve_id, $site_id, $member_id = 0)
  358. {
  359. model('reserve')->startTrans();
  360. try {
  361. $condition = [
  362. [ 'reserve_id', '=', $reserve_id ],
  363. [ 'site_id', '=', $site_id ],
  364. [ 'reserve_state', 'in', [ $this->reserve_state[ 'wait_confirm' ][ 'state' ], $this->reserve_state[ 'wait_to_store' ][ 'state' ] ] ]
  365. ];
  366. if ($member_id) $condition[] = [ 'member_id', '=', $member_id ];
  367. model('reserve')->update([
  368. 'reserve_state' => $this->reserve_state[ 'cancelled' ][ 'state' ],
  369. 'reserve_state_name' => $this->reserve_state[ 'cancelled' ][ 'name' ],
  370. 'cancel_time' => time()
  371. ], $condition);
  372. model('reserve_item')->update([ 'reserve_state' => $this->reserve_state[ 'cancelled' ][ 'state' ] ], $condition);
  373. model('reserve')->commit();
  374. return $this->success();
  375. } catch (\Exception $e) {
  376. model('reserve')->rollback();
  377. return $this->error();
  378. }
  379. }
  380. /**
  381. * 删除预约
  382. * @param $reserve_id
  383. * @param $site_id
  384. * @return array
  385. */
  386. public function deleteReserve($reserve_id, $site_id, $member_id = 0)
  387. {
  388. $condition = [
  389. [ 'reserve_id', '=', $reserve_id ],
  390. [ 'site_id', '=', $site_id ],
  391. [ 'reserve_state', '=', $this->reserve_state[ 'cancelled' ][ 'state' ] ]
  392. ];
  393. if ($member_id) $condition[] = [ 'member_id', '=', $member_id ];
  394. model('reserve')->delete($condition);
  395. model('reserve_item')->delete($condition);
  396. return $this->success();
  397. }
  398. /**
  399. * 确认到店
  400. * @param $reserve_id
  401. * @param $site_id
  402. * @return array
  403. */
  404. public function confirmToStore($reserve_id, $site_id)
  405. {
  406. $condition = [
  407. [ 'reserve_id', '=', $reserve_id ],
  408. [ 'site_id', '=', $site_id ],
  409. [ 'reserve_state', '=', $this->reserve_state[ 'wait_to_store' ][ 'state' ] ]
  410. ];
  411. model('reserve')->update([
  412. 'reserve_state' => $this->reserve_state[ 'arrived_store' ][ 'state' ],
  413. 'reserve_state_name' => $this->reserve_state[ 'arrived_store' ][ 'name' ],
  414. 'to_store_time' => time()
  415. ], $condition);
  416. model('reserve_item')->update([ 'reserve_state' => $this->reserve_state[ 'arrived_store' ][ 'state' ] ], $condition);
  417. return $this->success();
  418. }
  419. /**
  420. * 确认完成
  421. * @param $reserve_id
  422. * @param $site_id
  423. * @return array
  424. */
  425. public function confirmComplete($reserve_id, $site_id)
  426. {
  427. $condition = [
  428. [ 'reserve_id', '=', $reserve_id ],
  429. [ 'site_id', '=', $site_id ],
  430. [ 'reserve_state', '=', $this->reserve_state[ 'arrived_store' ][ 'state' ] ]
  431. ];
  432. model('reserve')->update([
  433. 'reserve_state' => $this->reserve_state[ 'completed' ][ 'state' ],
  434. 'reserve_state_name' => $this->reserve_state[ 'completed' ][ 'name' ],
  435. 'complete_time' => time()
  436. ], $condition);
  437. model('reserve_item')->update([ 'reserve_state' => $this->reserve_state[ 'completed' ][ 'state' ] ], $condition);
  438. return $this->success();
  439. }
  440. /**
  441. * 获取周看板日期数据
  442. * @param $week_offset
  443. * @return array
  444. */
  445. public function getWeekDays($week_offset)
  446. {
  447. $first_day = mktime(0, 0, 0, date("m"), date("d") - date("w") + 1, date("Y"));
  448. $first_day = strtotime($week_offset . ' week', $first_day);
  449. $week_names = [ '周日', '周一', '周二', '周三', '周四', '周五', '周六' ];
  450. $data = [];
  451. for ($i = 0; $i < 7; $i++) {
  452. $time = strtotime("+ {$i} day", $first_day);
  453. $data[] = [
  454. 'start_time' => $time,
  455. 'end_time' => strtotime(date('Y-m-d 23:59:59', $time)),
  456. 'year' => date('Y', $time),
  457. 'month' => date('m', $time),
  458. 'day' => date('d', $time),
  459. 'week' => date('w', $time),
  460. 'week_name' => $week_names[ date('w', $time) ],
  461. 'is_curr_day' => date('Y-m-d', $time) == date('Y-m-d') ? 1 : 0
  462. ];
  463. }
  464. return $this->success($data);
  465. }
  466. /**
  467. * 获取月看板日期数据
  468. * @param $year
  469. * @param $month
  470. * @return array
  471. */
  472. public function getMonthDays($year, $month)
  473. {
  474. $month_start_day = mktime(0, 0, 0, $month, 1, $year);
  475. //获取日历的第一天
  476. $first_day = mktime(0, 0, 0, $month, 1 - ( date("w", $month_start_day) - 1 ), $year);
  477. //获取日历的最后一天
  478. if ($month < 12) {
  479. $next_month = $month + 1;
  480. $next_month_year = $year;
  481. } else {
  482. $next_month = 1;
  483. $next_month_year = $year + 1;
  484. }
  485. $month_end_day = mktime(0, 0, 0, $next_month, 0, $next_month_year);
  486. $end_day = $month_end_day + ( 7 - date('w', $month_end_day) ) * 3600 * 24;
  487. $data = [];
  488. for ($timestamp = $first_day; $timestamp <= $end_day; $timestamp += 3600 * 24) {
  489. $data_item = [
  490. 'start_time' => $timestamp,
  491. 'end_time' => $timestamp + 3600 * 24 - 1,
  492. 'year' => date('Y', $timestamp),
  493. 'month' => date('m', $timestamp),
  494. 'day' => date('d', $timestamp),
  495. 'week' => date('w', $timestamp),
  496. ];
  497. $data_item[ 'is_curr_month' ] = ( $month == $data_item[ 'month' ] );
  498. $data[] = $data_item;
  499. }
  500. return $this->success($data);
  501. }
  502. /**
  503. * 通过给定时间获取预约数据
  504. * @param $param
  505. */
  506. public function getReserveDataByDays($param)
  507. {
  508. $days_data = $param[ 'days_data' ] ?? [];
  509. $query_num = $param[ 'query_num' ] ?? 10;
  510. $site_id = $param[ 'site_id' ] ?? 0;
  511. $reserve_ids = [];
  512. foreach ($days_data as $key => $val) {
  513. $field = 'noy.reserve_id,noy.reserve_state,noy.reserve_time,nm.nickname';
  514. $list_data = $this->getReservePageList([
  515. [ 'noy.site_id', '=', $site_id ],
  516. [ 'noy.reserve_time', 'between', [ $val[ 'start_time' ], $val[ 'end_time' ] ] ]
  517. ], 1, $query_num, 'noy.create_time desc', $field)[ 'data' ];
  518. $reserve_ids = array_merge($reserve_ids, array_column($list_data[ 'list' ], 'reserve_id'));
  519. $days_data[ $key ][ 'data' ] = $list_data;
  520. }
  521. //查询所有预约项 并按照预约分配数据
  522. $reserve_item_list = $this->getReserveItemList([
  523. [ 'oyi.reserve_id', 'in', $reserve_ids ],
  524. ], 'oyi.reserve_id,g.goods_name,g.goods_id,g.sku_id', 'reserve_item_id desc', 'oyi',
  525. [ [ 'goods g', 'g.sku_id = oyi.reserve_goods_sku_id', 'right' ] ])[ 'data' ];
  526. $reserve_data = [];
  527. foreach ($reserve_item_list as $val) {
  528. if (!isset($reserve_data[ $val[ 'reserve_id' ] ])) {
  529. $reserve_data[ $val[ 'reserve_id' ] ] = [];
  530. }
  531. $reserve_data[ $val[ 'reserve_id' ] ][] = $val;
  532. }
  533. //预约项关联预约
  534. foreach ($days_data as $key => $val) {
  535. foreach ($val[ 'data' ][ 'list' ] as $k => $item) {
  536. $days_data[ $key ][ 'data' ][ 'list' ][ $k ][ 'item' ] = $reserve_data[ $item[ 'reserve_id' ] ] ?? [];
  537. }
  538. }
  539. return $this->success($days_data);
  540. }
  541. }