| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595 |
- <?php
- /**
- * Niushop商城系统 - 团队十年电商经验汇集巨献!
- * =========================================================
- * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
- * ----------------------------------------------
- * 官方网址: https://www.niushop.com
- * =========================================================
- */
- namespace addon\store\model;
- use app\model\BaseModel;
- use app\model\member\Member;
- /**
- * 预约
- */
- class Reserve extends BaseModel
- {
- /**
- * 预约状态
- * @var array
- */
- public $reserve_state = [
- 'wait_confirm' => [
- 'state' => 'wait_confirm',
- 'name' => '待确认',
- 'color' => '#8558FA'
- ],
- 'wait_to_store' => [
- 'state' => 'wait_to_store',
- 'name' => '待到店',
- 'color' => '#1475FA'
- ],
- 'arrived_store' => [
- 'state' => 'arrived_store',
- 'name' => '已到店',
- 'color' => '#FA5B14'
- ],
- 'completed' => [
- 'state' => 'completed',
- 'name' => '已完成',
- 'color' => '#10C610'
- ],
- 'cancelled' => [
- 'state' => 'cancelled',
- 'name' => '已取消',
- 'color' => '#CCCCCC'
- ]
- ];
- /**
- * 设置预约配置
- * @param $data
- * @param $site_id
- * @param $app_module
- * @return array
- */
- public function setReserveConfig($data, $site_id, $store_id)
- {
- $save_data[ 'config_desc' ] = '预约配置';
- $save_data[ 'is_use' ] = 1;
- $save_data[ 'value' ] = json_encode($data);
- $config_model = model('reserve_config');
- $condition = [
- [ 'site_id', '=', $site_id ],
- [ 'store_id', '=', $store_id ],
- [ 'config_key', '=', 'RESERVE_CONFIG' ]
- ];
- $info = $config_model->getInfo($condition, 'id');
- if (empty($info)) {
- $save_data[ 'create_time' ] = time();
- $save_data[ 'site_id' ] = $site_id;
- $save_data[ 'store_id' ] = $store_id;
- $save_data[ 'config_key' ] = 'RESERVE_CONFIG';
- $res = $config_model->add($save_data);
- } else {
- $save_data[ 'modify_time' ] = time();
- $res = $config_model->update($save_data, $condition);
- }
- return $this->success($res);
- }
- /**
- * 获取预约配置
- * @param $site_id
- * @param $app_module
- * @return array
- */
- public function getReserveConfig($site_id, $store_id)
- {
- $key = 'RESERVE_CONFIG';
- $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');
- if (!empty($info)) {
- $info[ 'value' ] = json_decode($info[ 'value' ], true);
- } else {
- $info = [
- 'site_id' => $site_id,
- 'store_id' => $store_id,
- 'config_key' => $key,
- 'value' => [
- 'week' => '[1,2,3,4,5]',
- 'start' => 32400,
- 'end' => 79200,
- 'interval' => 30,
- 'advance' => 1,
- 'max' => 10
- ],
- 'config_desc' => '',
- 'is_use' => 0,
- 'create_time' => 0,
- 'modify_time' => 0
- ];
- }
- $info[ 'value' ][ 'week' ] = json_decode($info[ 'value' ][ 'week' ], true);
- return $this->success($info);
- }
- /**
- * 添加预约
- * @param array $param
- * @return array
- */
- public function addReserve(array $param)
- {
- $member_info = ( new Member() )->getMemberInfo([ [ 'member_id', '=', $param[ 'member_id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ])[ 'data' ];
- if (empty($member_info)) return $this->error('', '未查找到会员信息');
- $store_info = model('store')->getInfo([ [ 'store_id', '=', $param[ 'store_id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ], 'status');
- if (empty($store_info)) return $this->error('', '未查找到门店信息');
- $check_res = $this->checkReserve($param);
- if ($check_res[ 'code' ] != 0) return $check_res;
- model('reserve')->startTrans();
- try {
- $data = [
- 'site_id' => $param[ 'site_id' ],
- 'member_id' => $param[ 'member_id' ],
- 'reserve_name' => $member_info[ 'nickname' ],
- 'reserve_time' => strtotime("{$param['date']} {$param['time']}"),
- 'reserve_state' => $this->reserve_state[ 'wait_confirm' ][ 'state' ],
- 'reserve_state_name' => $this->reserve_state[ 'wait_confirm' ][ 'name' ],
- 'remark' => $param[ 'remark' ],
- 'store_id' => $param[ 'store_id' ],
- 'source' => $param[ 'source' ] ?? 'member',
- 'create_time' => time()
- ];
- $reserve_id = model('reserve')->add($data);
- $reserve_item = [];
- $reserve_item_data = [];
- foreach ($param[ 'goods' ] as $item) {
- $goods_info = model('goods')->getInfo([ [ 'site_id', '=', $param[ 'site_id' ] ], [ 'sku_id', '=', $item[ 'sku_id' ] ], [ 'goods_state', '=', 1 ], [ 'is_delete', '=', 0 ] ], 'goods_name');
- if (empty($goods_info)) return $this->error('', '未查找到所预约的服务');
- array_push($reserve_item, $goods_info[ 'goods_name' ]);
- array_push($reserve_item_data, [
- 'reserve_id' => $reserve_id,
- 'site_id' => $param[ 'site_id' ],
- 'member_id' => $param[ 'member_id' ],
- 'reserve_name' => $member_info[ 'nickname' ],
- 'reserve_time' => strtotime("{$param['date']} {$param['time']}"),
- 'remark' => $param[ 'remark' ],
- 'reserve_user_id' => $item[ 'uid' ] ?? 0,
- 'reserve_goods_sku_id' => $item[ 'sku_id' ],
- 'reserve_state' => $this->reserve_state[ 'wait_confirm' ][ 'state' ],
- 'store_id' => $param[ 'store_id' ],
- ]);
- }
- model('reserve_item')->addList($reserve_item_data);
- model('reserve')->update([ 'reserve_item' => implode($reserve_item) ], [ [ 'reserve_id', '=', $reserve_id ] ]);
- model('reserve')->commit();
- return $this->success($reserve_id);
- } catch (\Exception $e) {
- model('reserve')->rollback();
- return $this->error('添加失败' . $e->getMessage() . $e->getFile() . $e->getLine());
- }
- }
- /**
- * 编辑预约
- * @param $param
- * @return array
- */
- public function editReserve($param)
- {
- $condition = [
- [ 'reserve_id', '=', $param[ 'reserve_id' ] ],
- [ 'site_id', '=', $param[ 'site_id' ] ]
- ];
- if (isset($param[ 'member_id' ])) $condition[] = [ 'member_id', '=', $param[ 'member_id' ] ];
- $info = model('reserve')->getInfo($condition);
- if (empty($info)) return $this->error('', '未获取到预约信息');
- if (!in_array($info[ 'reserve_state' ], [ $this->reserve_state[ 'wait_confirm' ][ 'state' ], $this->reserve_state[ 'wait_to_store' ][ 'state' ] ]))
- return $this->error('', '该预约已不可更改');
- $check_res = $this->checkReserve($param);
- if ($check_res[ 'code' ] != 0) return $check_res;
- model('reserve')->startTrans();
- try {
- $res = model('reserve')->update([
- 'reserve_time' => strtotime("{$param['date']} {$param['time']}"),
- 'remark' => $param[ 'remark' ],
- ], $condition);
- // 删除原预约项
- $reserve_item = [];
- $reserve_item_data = [];
- foreach ($param[ 'goods' ] as $item) {
- $goods_info = model('goods')->getInfo([ [ 'site_id', '=', $param[ 'site_id' ] ], [ 'sku_id', '=', $item[ 'sku_id' ] ], [ 'goods_state', '=', 1 ], [ 'is_delete', '=', 0 ] ], 'goods_name');
- if (empty($goods_info)) return $this->error('', '未查找到所预约的服务');
- array_push($reserve_item, $goods_info[ 'goods_name' ]);
- array_push($reserve_item_data, [
- 'reserve_id' => $param[ 'reserve_id' ],
- 'site_id' => $param[ 'site_id' ],
- 'member_id' => $info[ 'member_id' ],
- 'reserve_name' => $info[ 'reserve_name' ],
- 'reserve_time' => strtotime("{$param['date']} {$param['time']}"),
- 'remark' => $param[ 'remark' ],
- 'reserve_user_id' => $item[ 'uid' ] ?? 0,
- 'reserve_goods_sku_id' => $item[ 'sku_id' ],
- 'reserve_state' => $info[ 'reserve_state' ],
- 'store_id' => $info[ 'store_id' ]
- ]);
- }
- model('reserve_item')->delete([ [ 'reserve_id', '=', $param[ 'reserve_id' ] ] ]);
- model('reserve_item')->addList($reserve_item_data);
- model('reserve')->update([ 'reserve_item' => implode($reserve_item) ], [ [ 'reserve_id', '=', $param[ 'reserve_id' ] ] ]);
- model('reserve')->commit();
- return $this->success($res);
- } catch (\Exception $e) {
- model('reserve')->rollback();
- return $this->error();
- }
- }
- /**
- * 校验预约是否可添加
- * @param $param
- * @return array
- */
- public function checkReserve($param)
- {
- $site_id = $param[ 'site_id' ] ?? 0;
- $date = $param[ 'date' ] ?? 0;
- $time = $param[ 'time' ] ?? 0;
- $store_id = $param[ 'store_id' ] ?? 0;
- $reserve_id = $param[ 'reserve_id' ] ?? 0;
- $app_module = $param[ 'app_module' ] ?? '';
- $config = $this->getReserveConfig($site_id, $store_id)[ 'data' ][ 'value' ];
- // 预约时间
- $reserve_time = strtotime($date . ' ' . $time);
- if (( $reserve_time - time() ) < ( $config[ 'advance' ] * 3600 )) return $this->error('', '需提前' . $config[ 'advance' ] . '小时预约');
- $week = date('w', strtotime($date));
- if (!in_array($week, $config[ 'week' ])) return $this->error('', '所选时间不在可预约时间内');
- $time = strtotime(date('Y-m-d') . ' ' . $time) - strtotime(date('Y-m-d'));
- if ($time < $config[ 'start' ] || $time > $config[ 'end' ]) return $this->error('', '所选时间不在可预约时间内');
- $max_condition = [
- [ 'site_id', '=', $site_id ],
- [ 'reserve_time', '=', strtotime("{$date} {$time}") ],
- [ 'reserve_state', '<>', $this->reserve_state[ 'cancelled' ][ 'state' ] ]
- ];
- if ($reserve_id > 0) $max_condition[] = [ 'reserve_id', '<>', $reserve_id ];
- $max = model('reserve')->getCount($max_condition);
- if ($max > $config[ 'max' ]) return $this->error('', '所选时段内预约人数已达上限');
- return $this->success();
- }
- /**
- * 获取预约列表
- * @param array $condition
- * @param string $field
- * @param string $order
- * @param null $limit
- * @return array
- */
- public function getReserveList($condition = [], $field = '*', $order = '', $limit = null)
- {
- $list = model('reserve')->getList($condition, $field, $order, '', '', '', $limit);
- return $this->success($list);
- }
- /**
- * 获取预约数量
- * @param array $condition
- * @return array
- */
- public function getReserveCount($condition = [], $field = '*')
- {
- $list = model('reserve')->getCount($condition, $field);
- return $this->success($list);
- }
- /**
- * 获取预约分页列表
- * @param array $condition
- * @param int $page
- * @param int $page_size
- * @param string $order
- * @param string $field
- * @return array
- */
- public function getReservePageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
- {
- $join = [
- [
- 'member nm',
- 'noy.member_id = nm.member_id',
- 'left'
- ],
- [
- 'store os',
- 'noy.store_id = os.store_id',
- 'left'
- ]
- ];
- $list = model('reserve')->pageList($condition, $field, $order, $page, $page_size, 'noy', $join);
- return $this->success($list);
- }
- /**
- * 获取预约项列表
- * @param $condition
- * @param $field
- * @param $order
- * @param string $alias
- * @param null $join
- * @return array
- */
- public function getReserveItemList($condition, $field, $order, $alias = 'oyi', $join = null)
- {
- $list = model('reserve_item')->getList($condition, $field, $order, $alias, $join);
- return $this->success($list);
- }
- /**
- * 获取预约详情
- * @param $condition
- * @param string $field
- * @param string $alias
- * @param null $join
- * @return array
- */
- public function getReserveInfo($condition, $field = '*', $alias = 'a', $join = null)
- {
- $res = model('reserve')->getInfo($condition, $field, $alias, $join);
- return $this->success($res);
- }
- /**
- * 确认预约
- * @param $reserve_id
- * @param $site_id
- * @return array
- */
- public function confirmReserve($reserve_id, $site_id)
- {
- $condition = [
- [ 'reserve_id', '=', $reserve_id ],
- [ 'site_id', '=', $site_id ],
- [ 'reserve_state', '=', $this->reserve_state[ 'wait_confirm' ][ 'state' ] ]
- ];
- model('reserve')->update([
- 'reserve_state' => $this->reserve_state[ 'wait_to_store' ][ 'state' ],
- 'reserve_state_name' => $this->reserve_state[ 'wait_to_store' ][ 'name' ]
- ], $condition);
- model('reserve_item')->update([ 'reserve_state' => $this->reserve_state[ 'wait_to_store' ][ 'state' ] ], $condition);
- return $this->success();
- }
- /**
- * 取消预约
- * @param $reserve_id
- * @param $site_id
- * @return array
- */
- public function cancelReserve($reserve_id, $site_id, $member_id = 0)
- {
- model('reserve')->startTrans();
- try {
- $condition = [
- [ 'reserve_id', '=', $reserve_id ],
- [ 'site_id', '=', $site_id ],
- [ 'reserve_state', 'in', [ $this->reserve_state[ 'wait_confirm' ][ 'state' ], $this->reserve_state[ 'wait_to_store' ][ 'state' ] ] ]
- ];
- if ($member_id) $condition[] = [ 'member_id', '=', $member_id ];
- model('reserve')->update([
- 'reserve_state' => $this->reserve_state[ 'cancelled' ][ 'state' ],
- 'reserve_state_name' => $this->reserve_state[ 'cancelled' ][ 'name' ],
- 'cancel_time' => time()
- ], $condition);
- model('reserve_item')->update([ 'reserve_state' => $this->reserve_state[ 'cancelled' ][ 'state' ] ], $condition);
- model('reserve')->commit();
- return $this->success();
- } catch (\Exception $e) {
- model('reserve')->rollback();
- return $this->error();
- }
- }
- /**
- * 删除预约
- * @param $reserve_id
- * @param $site_id
- * @return array
- */
- public function deleteReserve($reserve_id, $site_id, $member_id = 0)
- {
- $condition = [
- [ 'reserve_id', '=', $reserve_id ],
- [ 'site_id', '=', $site_id ],
- [ 'reserve_state', '=', $this->reserve_state[ 'cancelled' ][ 'state' ] ]
- ];
- if ($member_id) $condition[] = [ 'member_id', '=', $member_id ];
- model('reserve')->delete($condition);
- model('reserve_item')->delete($condition);
- return $this->success();
- }
- /**
- * 确认到店
- * @param $reserve_id
- * @param $site_id
- * @return array
- */
- public function confirmToStore($reserve_id, $site_id)
- {
- $condition = [
- [ 'reserve_id', '=', $reserve_id ],
- [ 'site_id', '=', $site_id ],
- [ 'reserve_state', '=', $this->reserve_state[ 'wait_to_store' ][ 'state' ] ]
- ];
- model('reserve')->update([
- 'reserve_state' => $this->reserve_state[ 'arrived_store' ][ 'state' ],
- 'reserve_state_name' => $this->reserve_state[ 'arrived_store' ][ 'name' ],
- 'to_store_time' => time()
- ], $condition);
- model('reserve_item')->update([ 'reserve_state' => $this->reserve_state[ 'arrived_store' ][ 'state' ] ], $condition);
- return $this->success();
- }
- /**
- * 确认完成
- * @param $reserve_id
- * @param $site_id
- * @return array
- */
- public function confirmComplete($reserve_id, $site_id)
- {
- $condition = [
- [ 'reserve_id', '=', $reserve_id ],
- [ 'site_id', '=', $site_id ],
- [ 'reserve_state', '=', $this->reserve_state[ 'arrived_store' ][ 'state' ] ]
- ];
- model('reserve')->update([
- 'reserve_state' => $this->reserve_state[ 'completed' ][ 'state' ],
- 'reserve_state_name' => $this->reserve_state[ 'completed' ][ 'name' ],
- 'complete_time' => time()
- ], $condition);
- model('reserve_item')->update([ 'reserve_state' => $this->reserve_state[ 'completed' ][ 'state' ] ], $condition);
- return $this->success();
- }
- /**
- * 获取周看板日期数据
- * @param $week_offset
- * @return array
- */
- public function getWeekDays($week_offset)
- {
- $first_day = mktime(0, 0, 0, date("m"), date("d") - date("w") + 1, date("Y"));
- $first_day = strtotime($week_offset . ' week', $first_day);
- $week_names = [ '周日', '周一', '周二', '周三', '周四', '周五', '周六' ];
- $data = [];
- for ($i = 0; $i < 7; $i++) {
- $time = strtotime("+ {$i} day", $first_day);
- $data[] = [
- 'start_time' => $time,
- 'end_time' => strtotime(date('Y-m-d 23:59:59', $time)),
- 'year' => date('Y', $time),
- 'month' => date('m', $time),
- 'day' => date('d', $time),
- 'week' => date('w', $time),
- 'week_name' => $week_names[ date('w', $time) ],
- 'is_curr_day' => date('Y-m-d', $time) == date('Y-m-d') ? 1 : 0
- ];
- }
- return $this->success($data);
- }
- /**
- * 获取月看板日期数据
- * @param $year
- * @param $month
- * @return array
- */
- public function getMonthDays($year, $month)
- {
- $month_start_day = mktime(0, 0, 0, $month, 1, $year);
- //获取日历的第一天
- $first_day = mktime(0, 0, 0, $month, 1 - ( date("w", $month_start_day) - 1 ), $year);
- //获取日历的最后一天
- if ($month < 12) {
- $next_month = $month + 1;
- $next_month_year = $year;
- } else {
- $next_month = 1;
- $next_month_year = $year + 1;
- }
- $month_end_day = mktime(0, 0, 0, $next_month, 0, $next_month_year);
- $end_day = $month_end_day + ( 7 - date('w', $month_end_day) ) * 3600 * 24;
- $data = [];
- for ($timestamp = $first_day; $timestamp <= $end_day; $timestamp += 3600 * 24) {
- $data_item = [
- 'start_time' => $timestamp,
- 'end_time' => $timestamp + 3600 * 24 - 1,
- 'year' => date('Y', $timestamp),
- 'month' => date('m', $timestamp),
- 'day' => date('d', $timestamp),
- 'week' => date('w', $timestamp),
- ];
- $data_item[ 'is_curr_month' ] = ( $month == $data_item[ 'month' ] );
- $data[] = $data_item;
- }
- return $this->success($data);
- }
- /**
- * 通过给定时间获取预约数据
- * @param $param
- */
- public function getReserveDataByDays($param)
- {
- $days_data = $param[ 'days_data' ] ?? [];
- $query_num = $param[ 'query_num' ] ?? 10;
- $site_id = $param[ 'site_id' ] ?? 0;
- $reserve_ids = [];
- foreach ($days_data as $key => $val) {
- $field = 'noy.reserve_id,noy.reserve_state,noy.reserve_time,nm.nickname';
- $list_data = $this->getReservePageList([
- [ 'noy.site_id', '=', $site_id ],
- [ 'noy.reserve_time', 'between', [ $val[ 'start_time' ], $val[ 'end_time' ] ] ]
- ], 1, $query_num, 'noy.create_time desc', $field)[ 'data' ];
- $reserve_ids = array_merge($reserve_ids, array_column($list_data[ 'list' ], 'reserve_id'));
- $days_data[ $key ][ 'data' ] = $list_data;
- }
- //查询所有预约项 并按照预约分配数据
- $reserve_item_list = $this->getReserveItemList([
- [ 'oyi.reserve_id', 'in', $reserve_ids ],
- ], 'oyi.reserve_id,g.goods_name,g.goods_id,g.sku_id', 'reserve_item_id desc', 'oyi',
- [ [ 'goods g', 'g.sku_id = oyi.reserve_goods_sku_id', 'right' ] ])[ 'data' ];
- $reserve_data = [];
- foreach ($reserve_item_list as $val) {
- if (!isset($reserve_data[ $val[ 'reserve_id' ] ])) {
- $reserve_data[ $val[ 'reserve_id' ] ] = [];
- }
- $reserve_data[ $val[ 'reserve_id' ] ][] = $val;
- }
- //预约项关联预约
- foreach ($days_data as $key => $val) {
- foreach ($val[ 'data' ][ 'list' ] as $k => $item) {
- $days_data[ $key ][ 'data' ][ 'list' ][ $k ][ 'item' ] = $reserve_data[ $item[ 'reserve_id' ] ] ?? [];
- }
- }
- return $this->success($days_data);
- }
- }
|