Reserve.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
  9. * 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
  10. * =========================================================
  11. */
  12. namespace addon\store\shop\controller;
  13. use addon\store\model\Reserve as ReserveModel;
  14. use app\model\store\Store as StoreModel;
  15. use app\model\goods\Goods as GoodsModel;
  16. use app\model\system\User;
  17. use app\model\system\UserGroup;
  18. use app\shop\controller\BaseShop;
  19. class Reserve extends BaseShop
  20. {
  21. protected $replace = [
  22. 'ADDON_STORE_CSS' => __ROOT__ . '/addon/store/shop/view/public/css',
  23. 'ADDON_STORE_JS' => __ROOT__ . '/addon/store/shop/view/public/js',
  24. 'ADDON_STORE_IMG' => __ROOT__ . '/addon/store/shop/view/public/img',
  25. ];
  26. /**
  27. * 预约看板
  28. * @return mixed
  29. */
  30. public function index()
  31. {
  32. $this->assign('reserve_state', ( new ReserveModel )->reserve_state);
  33. $data = $this->getReserveByWeek();
  34. $this->assign('data', $data[ 'data' ]);
  35. $store_model = new StoreModel();
  36. $store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
  37. $this->assign('store_list', $store_list);
  38. return $this->fetch('reserve/index', [], $this->replace);
  39. }
  40. /**
  41. * 获取一周内的时间段
  42. * @param $length
  43. * @return array
  44. */
  45. public function getWeekDay($length = 0)
  46. {
  47. $first_day = mktime(0, 0, 0, date("m"), date("d") - date("w") + 1, date("Y"));
  48. $first_day = strtotime($length . ' week', $first_day);
  49. $week = [ '周日', '周一', '周二', '周三', '周四', '周五', '周六' ];
  50. $data = [];
  51. for ($i = 0; $i < 7; $i++) {
  52. $time = strtotime("+ {$i} day", $first_day);
  53. array_push($data, [
  54. 'start' => $time,
  55. 'end' => strtotime(date('Y-m-d 23:59:59', $time)),
  56. 'date' => date('m/d', $time),
  57. 'w' => date('w', $time),
  58. 'week' => $week[ date('w', $time) ],
  59. 'currday' => date('Y-m-d', $time) == date('Y-m-d') ? 1 : 0
  60. ]);
  61. }
  62. return success(0, '', $data);
  63. }
  64. public function getMonthDays()
  65. {
  66. if (request()->isAjax()) {
  67. $reserve_model = new ReserveModel();
  68. $year = input('year', '');
  69. $month = input('month', '');
  70. $days_data = $reserve_model->getMonthDays($year, $month)[ 'data' ];
  71. return success(0, '', $days_data);
  72. }
  73. }
  74. public function getReserveByWeek()
  75. {
  76. $reserve_model = new ReserveModel();
  77. $length = input('length', 0);
  78. $data = $this->getWeekDay($length)[ 'data' ];
  79. foreach ($data as $wk => $w_item) {
  80. $field = 'noy.reserve_id,noy.reserve_state,noy.reserve_time,nm.nickname,noy.reserve_item';
  81. $list = $reserve_model->getReservePageList([
  82. [ 'noy.site_id', '=', $this->site_id ],
  83. [ 'noy.reserve_time', 'between', [ $w_item[ 'start' ], $w_item[ 'end' ] ] ]
  84. ], 1, PAGE_LIST_ROWS, 'noy.create_time desc', $field);
  85. $data[ $wk ][ 'data' ] = $list[ 'data' ];
  86. }
  87. return success(0, '', $data);
  88. }
  89. /**
  90. * 获取预约周数据
  91. * @return array
  92. */
  93. public function getReserveWeekData()
  94. {
  95. if (request()->isAjax()) {
  96. $reserve_model = new ReserveModel();
  97. $week_offset = input('week_offset', 0);
  98. $days_data = $reserve_model->getWeekDays($week_offset)[ 'data' ];
  99. $res = $reserve_model->getReserveDataByDays([
  100. 'days_data' => $days_data,
  101. 'query_num' => 4,
  102. 'site_id' => $this->site_id,
  103. ]);
  104. return $res;
  105. }
  106. }
  107. /**
  108. * 获取预约月数据
  109. * @return array
  110. */
  111. public function getYuYueMonthData()
  112. {
  113. if (request()->isAjax()) {
  114. $reserve_model = new ReserveModel();
  115. $year = input('year', date('Y'));
  116. $month = input('year', date('m'));
  117. $days_data = $reserve_model->getMonthDays($year, $month)[ 'data' ];
  118. $res = $reserve_model->getReserveDataByDays([
  119. 'days_data' => $days_data,
  120. 'query_num' => 3,
  121. 'site_id' => $this->site_id,
  122. ]);
  123. return $res;
  124. }
  125. }
  126. /**
  127. * 添加预约
  128. * @return mixed
  129. */
  130. public function addReserve()
  131. {
  132. $reserve_model = new ReserveModel();
  133. if (request()->isAjax()) {
  134. return $reserve_model->addReserve([
  135. 'site_id' => $this->site_id,
  136. 'app_module' => $this->app_module,
  137. 'member_id' => input('member_id'),
  138. 'goods' => json_decode(input('goods'), true),
  139. 'store_id' => input('store_id'),
  140. 'date' => input('date'),
  141. 'time' => input('time'),
  142. 'remark' => input('remark', ''),
  143. 'source' => 'store'
  144. ]);
  145. }
  146. $service_model = new GoodsModel();
  147. $condition = [
  148. [ 'g.site_id', '=', $this->site_id ],
  149. [ 'g.goods_state', '=', 1 ],
  150. [ 'g.goods_class', '=', 4 ]
  151. ];
  152. $service = $service_model->getGoodsList($condition, 'g.goods_id,g.sku_id,g.goods_name,g.price,sku.service_length', 'g.create_time desc'
  153. , 0, 'g', [
  154. [ 'goods_sku sku', 'sku.goods_id=g.goods_id', 'inner' ]
  155. ]);
  156. $this->assign('service', $service[ 'data' ]);
  157. $store_model = new StoreModel();
  158. $store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
  159. $this->assign('store_list', $store_list);
  160. $config = $reserve_model->getReserveConfig($this->site_id, $store_list[ 0 ][ 'store_id' ]);
  161. $this->assign('config', $config[ 'data' ][ 'value' ]);
  162. $user_model = new User();
  163. $user_list = $user_model->getUserList([ [ 'site_id', '=', $this->site_id ], [ 'app_module', '=', 'servicer' ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
  164. $this->assign('user_list', $user_list);
  165. return $this->fetch('reserve/add_reserve', [], $this->replace);
  166. }
  167. /**
  168. * 修改预约
  169. * @return mixed|void
  170. */
  171. public function updateReserve()
  172. {
  173. $model = new ReserveModel();
  174. if (request()->isAjax()) {
  175. $reserve_id = input('reserve_id', 0);
  176. return $model->editReserve([
  177. 'site_id' => $this->site_id,
  178. 'app_module' => $this->app_module,
  179. 'reserve_id' => $reserve_id,
  180. 'store_id' => input('store_id'),
  181. 'goods' => json_decode(input('goods'), true),
  182. 'date' => input('date'),
  183. 'time' => input('time'),
  184. 'remark' => input('remark', '')
  185. ]);
  186. } else {
  187. $reserve_id = input('id', 0);
  188. // 查询预约信息
  189. $info = $model->getReserveInfo([
  190. [ 'reserve_id', '=', $reserve_id ],
  191. [ 'oy.site_id', '=', $this->site_id ]
  192. ], 'oy.*, nm.headimg, nm.nickname, nm.mobile, os.store_name', 'oy', [
  193. [ 'member nm', 'oy.member_id = nm.member_id', 'left' ],
  194. [ 'store os', 'oy.store_id = os.store_id', 'left' ]
  195. ])[ 'data' ];
  196. if (empty($info)) {
  197. $this->error('未获取到预约信息');
  198. return;
  199. }
  200. $info[ 'item' ] = $model->getReserveItemList([
  201. [
  202. 'oyi.reserve_id', '=', $reserve_id
  203. ],
  204. ], 'g.goods_name,sku.service_length,g.goods_id,g.sku_id,g.price,ys.username,oyi.reserve_user_id', 'reserve_item_id desc', 'oyi',
  205. [
  206. [ 'goods g', 'g.sku_id = oyi.reserve_goods_sku_id', 'right' ],
  207. [ 'goods_sku sku', 'sku.sku_id = oyi.reserve_goods_sku_id', 'right' ],
  208. [ 'user ys', 'oyi.reserve_user_id = ys.uid', 'left' ]
  209. ])[ 'data' ];
  210. $this->assign('info', $info);
  211. // 查询预约配置
  212. $config = $model->getReserveConfig($this->site_id, $info[ 'store_id' ]);
  213. $this->assign('config', $config[ 'data' ][ 'value' ]);
  214. // 查询可预约服务
  215. $service_model = new GoodsModel();
  216. $condition = [
  217. [ 'g.site_id', '=', $this->site_id ],
  218. [ 'g.goods_state', '=', 1 ],
  219. [ 'g.goods_class', '=', 4 ]
  220. ];
  221. $service = $service_model->getGoodsList($condition, 'g.goods_id,g.sku_id,g.goods_name,g.price,sku.service_length', 'g.create_time desc'
  222. , 0, 'g', [
  223. [ 'goods_sku sku', 'sku.goods_id=g.goods_id', 'inner' ]
  224. ]);
  225. $this->assign('service', $service[ 'data' ]);
  226. $store_model = new StoreModel();
  227. $store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
  228. $this->assign('store_list', $store_list);
  229. $user_model = new User();
  230. $user_list = $user_model->getUserList([ [ 'site_id', '=', $this->site_id ], [ 'app_module', '=', 'servicer' ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
  231. $this->assign('user_list', $user_list);
  232. return $this->fetch('reserve/add_reserve', [], $this->replace);
  233. }
  234. }
  235. /**
  236. * 预约列表
  237. */
  238. public function lists()
  239. {
  240. $reserve_model = new ReserveModel();
  241. if (request()->isAjax()) {
  242. $page = input('page', 1);
  243. $page_size = input('page_size', PAGE_LIST_ROWS);
  244. $search_text = input('search_text', '');
  245. $reserve_state = input('reserve_state', 'all');
  246. $start = input('start_time', 0);
  247. $end = input('end_time', 0);
  248. $store_id = !empty(input('store_id', 0)) ? input('store_id', 0) : $this->store_id;
  249. $condition = [
  250. [ 'noy.site_id', '=', $this->site_id ]
  251. ];
  252. if ($reserve_state != 'all') {
  253. $condition[] = [ 'noy.reserve_state', '=', $reserve_state ];
  254. }
  255. if (!empty($search_text)) {
  256. $condition[] = [ 'nm.mobile|nm.nickname', 'like', '%' . $search_text . '%' ];
  257. }
  258. if (!empty($store_id)) {
  259. $condition[] = [ 'noy.store_id', 'in', $store_id ];
  260. }
  261. if ($start && $end) {
  262. $condition[] = [ 'noy.reserve_time', 'between', [ $start, $end ] ];
  263. } else {
  264. if ($start && !$end) {
  265. $condition[] = [ 'noy.reserve_time', '>=', $start ];
  266. } else {
  267. if (!$start && $end) {
  268. $condition[] = [ 'noy.reserve_time', '<=', $end ];
  269. }
  270. }
  271. }
  272. $field = 'noy.store_id, noy.member_id, noy.remark, noy.reserve_id, noy.reserve_name, noy.reserve_state_name, noy.reserve_state, noy.reserve_time, noy.reserve_item, noy.create_time, noy.source, nm.headimg, nm.nickname, nm.mobile, os.store_name';
  273. $result = $reserve_model->getReservePageList($condition, $page, $page_size, 'noy.create_time desc', $field);
  274. return $result;
  275. } else {
  276. $this->assign('reserve_state', $reserve_model->reserve_state);
  277. $start_time = input('start_time', '');
  278. $end_time = input('end_time', '');
  279. $this->assign('start_time', $start_time);
  280. $this->assign('end_time', $end_time);
  281. $store_model = new StoreModel();
  282. $store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
  283. $this->assign('store_list', $store_list);
  284. return $this->fetch('reserve/lists', [], $this->replace);
  285. }
  286. }
  287. public function servicerList()
  288. {
  289. if (request()->isAjax()) {
  290. $store_id = !empty(input('store_id', 0)) ? input('store_id', 0) : $this->store_id;
  291. $condition = [
  292. [ 'u.site_id', '=', $this->site_id ],
  293. ];
  294. $condition[] = [ 'ug.store_id', '=', $store_id ];
  295. $user_model = new UserGroup();
  296. $result = $user_model->getUserList($condition, 'u.username,u.status,u.uid,u.group_name', 'u.uid desc', 'ug', [
  297. [ 'user u', 'ug.uid=u.uid', 'left' ]
  298. ]);
  299. return $result;
  300. }
  301. }
  302. /**
  303. * 预约设置
  304. * @return mixed
  305. */
  306. public function getConfig()
  307. {
  308. if (request()->isAjax()) {
  309. $model = new ReserveModel();
  310. $store_id = input('store_id', 0);
  311. $config = $model->getReserveConfig($this->site_id, $store_id);
  312. return $config;
  313. }
  314. }
  315. /**
  316. * 确认预约
  317. * @return array
  318. */
  319. public function confirm()
  320. {
  321. if (request()->isAjax()) {
  322. $reserve_id = input('reserve_id', 0);
  323. $reserve_model = new ReserveModel();
  324. return $reserve_model->confirmReserve($reserve_id, $this->site_id);
  325. }
  326. }
  327. /**
  328. * 取消预约
  329. * @return array
  330. */
  331. public function cancel()
  332. {
  333. if (request()->isAjax()) {
  334. $reserve_id = input('reserve_id', 0);
  335. $reserve_model = new ReserveModel();
  336. return $reserve_model->cancelReserve($reserve_id, $this->site_id);
  337. }
  338. }
  339. /**
  340. * 删除预约
  341. * @return array
  342. */
  343. public function deleteReserve()
  344. {
  345. if (request()->isAjax()) {
  346. $reserve_id = input('reserve_id', 0);
  347. $reserve_model = new ReserveModel();
  348. return $reserve_model->deleteReserve($reserve_id, $this->site_id);
  349. }
  350. }
  351. /**
  352. * 确认到店
  353. * @return array
  354. */
  355. public function confirmToStore()
  356. {
  357. if (request()->isAjax()) {
  358. $reserve_id = input('reserve_id', 0);
  359. $reserve_model = new ReserveModel();
  360. return $reserve_model->confirmToStore($reserve_id, $this->site_id);
  361. }
  362. }
  363. /**
  364. * 确认完成
  365. * @return array
  366. */
  367. public function complete()
  368. {
  369. if (request()->isAjax()) {
  370. $reserve_id = input('reserve_id', 0);
  371. $reserve_model = new ReserveModel();
  372. return $reserve_model->confirmComplete($reserve_id, $this->site_id);
  373. }
  374. }
  375. /**
  376. * 预约详情
  377. * @return mixed|void
  378. */
  379. public function detail()
  380. {
  381. $reserve_id = input('id', 0);
  382. $model = new ReserveModel();
  383. $info = $model->getReserveInfo([
  384. [ 'reserve_id', '=', $reserve_id ],
  385. [ 'oy.site_id', '=', $this->site_id ]
  386. ], 'oy.*, nm.headimg, nm.nickname, nm.mobile,os.store_name', 'oy', [
  387. [ 'member nm', 'oy.member_id = nm.member_id', 'left' ],
  388. [ 'store os', 'oy.store_id = os.store_id', 'left' ]
  389. ])[ 'data' ];
  390. if (empty($info)) {
  391. $this->error('未获取到预约信息');
  392. return;
  393. }
  394. $info[ 'item' ] = $model->getReserveItemList([
  395. [
  396. 'oyi.reserve_id', '=', $reserve_id
  397. ]
  398. ], 'g.goods_name,sku.service_length,g.goods_id,g.sku_id,g.price,ys.username,oyi.reserve_user_id', 'reserve_item_id desc', 'oyi',
  399. [
  400. [ 'goods g', 'g.sku_id = oyi.reserve_goods_sku_id', 'right' ],
  401. [ 'goods_sku sku', 'sku.sku_id = oyi.reserve_goods_sku_id', 'right' ],
  402. [ 'user ys', 'oyi.reserve_user_id = ys.uid', 'left' ]
  403. ])[ 'data' ];
  404. $this->assign('info', $info);
  405. return $this->fetch('reserve/detail', [], $this->replace);
  406. }
  407. }