458 lines
16 KiB
PHP
458 lines
16 KiB
PHP
<?php
|
|
/**
|
|
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
|
|
* =========================================================
|
|
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
|
|
* ----------------------------------------------
|
|
* 官方网址: https://www.gobuysaas.com
|
|
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
|
|
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
|
|
* =========================================================
|
|
*/
|
|
|
|
namespace addon\store\shop\controller;
|
|
|
|
use addon\store\model\Reserve as ReserveModel;
|
|
use app\model\store\Store as StoreModel;
|
|
use app\model\goods\Goods as GoodsModel;
|
|
use app\model\system\User;
|
|
use app\model\system\UserGroup;
|
|
use app\shop\controller\BaseShop;
|
|
|
|
|
|
class Reserve extends BaseShop
|
|
{
|
|
|
|
protected $replace = [
|
|
'ADDON_STORE_CSS' => __ROOT__ . '/addon/store/shop/view/public/css',
|
|
'ADDON_STORE_JS' => __ROOT__ . '/addon/store/shop/view/public/js',
|
|
'ADDON_STORE_IMG' => __ROOT__ . '/addon/store/shop/view/public/img',
|
|
];
|
|
|
|
/**
|
|
* 预约看板
|
|
* @return mixed
|
|
*/
|
|
public function index()
|
|
{
|
|
$this->assign('reserve_state', ( new ReserveModel )->reserve_state);
|
|
|
|
$data = $this->getReserveByWeek();
|
|
$this->assign('data', $data[ 'data' ]);
|
|
$store_model = new StoreModel();
|
|
$store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
|
$this->assign('store_list', $store_list);
|
|
return $this->fetch('reserve/index', [], $this->replace);
|
|
}
|
|
|
|
/**
|
|
* 获取一周内的时间段
|
|
* @param $length
|
|
* @return array
|
|
*/
|
|
public function getWeekDay($length = 0)
|
|
{
|
|
$first_day = mktime(0, 0, 0, date("m"), date("d") - date("w") + 1, date("Y"));
|
|
$first_day = strtotime($length . ' week', $first_day);
|
|
|
|
$week = [ '周日', '周一', '周二', '周三', '周四', '周五', '周六' ];
|
|
$data = [];
|
|
for ($i = 0; $i < 7; $i++) {
|
|
$time = strtotime("+ {$i} day", $first_day);
|
|
array_push($data, [
|
|
'start' => $time,
|
|
'end' => strtotime(date('Y-m-d 23:59:59', $time)),
|
|
'date' => date('m/d', $time),
|
|
'w' => date('w', $time),
|
|
'week' => $week[ date('w', $time) ],
|
|
'currday' => date('Y-m-d', $time) == date('Y-m-d') ? 1 : 0
|
|
]);
|
|
}
|
|
return success(0, '', $data);
|
|
}
|
|
|
|
public function getMonthDays()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$reserve_model = new ReserveModel();
|
|
$year = input('year', '');
|
|
$month = input('month', '');
|
|
$days_data = $reserve_model->getMonthDays($year, $month)[ 'data' ];
|
|
return success(0, '', $days_data);
|
|
}
|
|
}
|
|
|
|
public function getReserveByWeek()
|
|
{
|
|
$reserve_model = new ReserveModel();
|
|
|
|
$length = input('length', 0);
|
|
$data = $this->getWeekDay($length)[ 'data' ];
|
|
foreach ($data as $wk => $w_item) {
|
|
$field = 'noy.reserve_id,noy.reserve_state,noy.reserve_time,nm.nickname,noy.reserve_item';
|
|
$list = $reserve_model->getReservePageList([
|
|
[ 'noy.site_id', '=', $this->site_id ],
|
|
[ 'noy.reserve_time', 'between', [ $w_item[ 'start' ], $w_item[ 'end' ] ] ]
|
|
], 1, PAGE_LIST_ROWS, 'noy.create_time desc', $field);
|
|
$data[ $wk ][ 'data' ] = $list[ 'data' ];
|
|
}
|
|
|
|
return success(0, '', $data);
|
|
}
|
|
|
|
/**
|
|
* 获取预约周数据
|
|
* @return array
|
|
*/
|
|
public function getReserveWeekData()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$reserve_model = new ReserveModel();
|
|
$week_offset = input('week_offset', 0);
|
|
$days_data = $reserve_model->getWeekDays($week_offset)[ 'data' ];
|
|
$res = $reserve_model->getReserveDataByDays([
|
|
'days_data' => $days_data,
|
|
'query_num' => 4,
|
|
'site_id' => $this->site_id,
|
|
]);
|
|
return $res;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取预约月数据
|
|
* @return array
|
|
*/
|
|
public function getYuYueMonthData()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$reserve_model = new ReserveModel();
|
|
$year = input('year', date('Y'));
|
|
$month = input('year', date('m'));
|
|
$days_data = $reserve_model->getMonthDays($year, $month)[ 'data' ];
|
|
$res = $reserve_model->getReserveDataByDays([
|
|
'days_data' => $days_data,
|
|
'query_num' => 3,
|
|
'site_id' => $this->site_id,
|
|
]);
|
|
return $res;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 添加预约
|
|
* @return mixed
|
|
*/
|
|
public function addReserve()
|
|
{
|
|
$reserve_model = new ReserveModel();
|
|
if (request()->isAjax()) {
|
|
return $reserve_model->addReserve([
|
|
'site_id' => $this->site_id,
|
|
'app_module' => $this->app_module,
|
|
'member_id' => input('member_id'),
|
|
'goods' => json_decode(input('goods'), true),
|
|
'store_id' => input('store_id'),
|
|
'date' => input('date'),
|
|
'time' => input('time'),
|
|
'remark' => input('remark', ''),
|
|
'source' => 'store'
|
|
]);
|
|
}
|
|
|
|
$service_model = new GoodsModel();
|
|
$condition = [
|
|
[ 'g.site_id', '=', $this->site_id ],
|
|
[ 'g.goods_state', '=', 1 ],
|
|
[ 'g.goods_class', '=', 4 ]
|
|
];
|
|
$service = $service_model->getGoodsList($condition, 'g.goods_id,g.sku_id,g.goods_name,g.price,sku.service_length', 'g.create_time desc'
|
|
, 0, 'g', [
|
|
[ 'goods_sku sku', 'sku.goods_id=g.goods_id', 'inner' ]
|
|
]);
|
|
$this->assign('service', $service[ 'data' ]);
|
|
|
|
$store_model = new StoreModel();
|
|
$store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
|
$this->assign('store_list', $store_list);
|
|
|
|
$config = $reserve_model->getReserveConfig($this->site_id, $store_list[ 0 ][ 'store_id' ]);
|
|
$this->assign('config', $config[ 'data' ][ 'value' ]);
|
|
|
|
$user_model = new User();
|
|
$user_list = $user_model->getUserList([ [ 'site_id', '=', $this->site_id ], [ 'app_module', '=', 'servicer' ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
|
$this->assign('user_list', $user_list);
|
|
|
|
return $this->fetch('reserve/add_reserve', [], $this->replace);
|
|
}
|
|
|
|
/**
|
|
* 修改预约
|
|
* @return mixed|void
|
|
*/
|
|
public function updateReserve()
|
|
{
|
|
$model = new ReserveModel();
|
|
|
|
if (request()->isAjax()) {
|
|
$reserve_id = input('reserve_id', 0);
|
|
return $model->editReserve([
|
|
'site_id' => $this->site_id,
|
|
'app_module' => $this->app_module,
|
|
'reserve_id' => $reserve_id,
|
|
'store_id' => input('store_id'),
|
|
'goods' => json_decode(input('goods'), true),
|
|
'date' => input('date'),
|
|
'time' => input('time'),
|
|
'remark' => input('remark', '')
|
|
]);
|
|
} else {
|
|
$reserve_id = input('id', 0);
|
|
// 查询预约信息
|
|
$info = $model->getReserveInfo([
|
|
[ 'reserve_id', '=', $reserve_id ],
|
|
[ 'oy.site_id', '=', $this->site_id ]
|
|
], 'oy.*, nm.headimg, nm.nickname, nm.mobile, os.store_name', 'oy', [
|
|
[ 'member nm', 'oy.member_id = nm.member_id', 'left' ],
|
|
[ 'store os', 'oy.store_id = os.store_id', 'left' ]
|
|
])[ 'data' ];
|
|
|
|
if (empty($info)) {
|
|
$this->error('未获取到预约信息');
|
|
return;
|
|
}
|
|
$info[ 'item' ] = $model->getReserveItemList([
|
|
[
|
|
'oyi.reserve_id', '=', $reserve_id
|
|
],
|
|
|
|
], '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',
|
|
[
|
|
[ 'goods g', 'g.sku_id = oyi.reserve_goods_sku_id', 'right' ],
|
|
[ 'goods_sku sku', 'sku.sku_id = oyi.reserve_goods_sku_id', 'right' ],
|
|
[ 'user ys', 'oyi.reserve_user_id = ys.uid', 'left' ]
|
|
])[ 'data' ];
|
|
|
|
$this->assign('info', $info);
|
|
|
|
// 查询预约配置
|
|
$config = $model->getReserveConfig($this->site_id, $info[ 'store_id' ]);
|
|
$this->assign('config', $config[ 'data' ][ 'value' ]);
|
|
|
|
// 查询可预约服务
|
|
$service_model = new GoodsModel();
|
|
$condition = [
|
|
[ 'g.site_id', '=', $this->site_id ],
|
|
[ 'g.goods_state', '=', 1 ],
|
|
[ 'g.goods_class', '=', 4 ]
|
|
];
|
|
$service = $service_model->getGoodsList($condition, 'g.goods_id,g.sku_id,g.goods_name,g.price,sku.service_length', 'g.create_time desc'
|
|
, 0, 'g', [
|
|
[ 'goods_sku sku', 'sku.goods_id=g.goods_id', 'inner' ]
|
|
]);
|
|
$this->assign('service', $service[ 'data' ]);
|
|
|
|
$store_model = new StoreModel();
|
|
$store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
|
$this->assign('store_list', $store_list);
|
|
|
|
$user_model = new User();
|
|
$user_list = $user_model->getUserList([ [ 'site_id', '=', $this->site_id ], [ 'app_module', '=', 'servicer' ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
|
$this->assign('user_list', $user_list);
|
|
|
|
return $this->fetch('reserve/add_reserve', [], $this->replace);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 预约列表
|
|
*/
|
|
public function lists()
|
|
{
|
|
$reserve_model = new ReserveModel();
|
|
if (request()->isAjax()) {
|
|
$page = input('page', 1);
|
|
$page_size = input('page_size', PAGE_LIST_ROWS);
|
|
$search_text = input('search_text', '');
|
|
$reserve_state = input('reserve_state', 'all');
|
|
$start = input('start_time', 0);
|
|
$end = input('end_time', 0);
|
|
$store_id = !empty(input('store_id', 0)) ? input('store_id', 0) : $this->store_id;
|
|
|
|
$condition = [
|
|
[ 'noy.site_id', '=', $this->site_id ]
|
|
];
|
|
if ($reserve_state != 'all') {
|
|
$condition[] = [ 'noy.reserve_state', '=', $reserve_state ];
|
|
}
|
|
if (!empty($search_text)) {
|
|
$condition[] = [ 'nm.mobile|nm.nickname', 'like', '%' . $search_text . '%' ];
|
|
}
|
|
if (!empty($store_id)) {
|
|
$condition[] = [ 'noy.store_id', 'in', $store_id ];
|
|
}
|
|
if ($start && $end) {
|
|
$condition[] = [ 'noy.reserve_time', 'between', [ $start, $end ] ];
|
|
} else {
|
|
if ($start && !$end) {
|
|
$condition[] = [ 'noy.reserve_time', '>=', $start ];
|
|
} else {
|
|
if (!$start && $end) {
|
|
$condition[] = [ 'noy.reserve_time', '<=', $end ];
|
|
}
|
|
}
|
|
}
|
|
|
|
$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';
|
|
$result = $reserve_model->getReservePageList($condition, $page, $page_size, 'noy.create_time desc', $field);
|
|
return $result;
|
|
} else {
|
|
$this->assign('reserve_state', $reserve_model->reserve_state);
|
|
|
|
$start_time = input('start_time', '');
|
|
$end_time = input('end_time', '');
|
|
$this->assign('start_time', $start_time);
|
|
$this->assign('end_time', $end_time);
|
|
|
|
$store_model = new StoreModel();
|
|
$store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
|
|
|
$this->assign('store_list', $store_list);
|
|
return $this->fetch('reserve/lists', [], $this->replace);
|
|
}
|
|
}
|
|
|
|
public function servicerList()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$store_id = !empty(input('store_id', 0)) ? input('store_id', 0) : $this->store_id;
|
|
$condition = [
|
|
[ 'u.site_id', '=', $this->site_id ],
|
|
];
|
|
$condition[] = [ 'ug.store_id', '=', $store_id ];
|
|
|
|
$user_model = new UserGroup();
|
|
$result = $user_model->getUserList($condition, 'u.username,u.status,u.uid,u.group_name', 'u.uid desc', 'ug', [
|
|
[ 'user u', 'ug.uid=u.uid', 'left' ]
|
|
]);
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 预约设置
|
|
* @return mixed
|
|
*/
|
|
public function getConfig()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$model = new ReserveModel();
|
|
$store_id = input('store_id', 0);
|
|
$config = $model->getReserveConfig($this->site_id, $store_id);
|
|
return $config;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 确认预约
|
|
* @return array
|
|
*/
|
|
public function confirm()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$reserve_id = input('reserve_id', 0);
|
|
$reserve_model = new ReserveModel();
|
|
return $reserve_model->confirmReserve($reserve_id, $this->site_id);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 取消预约
|
|
* @return array
|
|
*/
|
|
public function cancel()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$reserve_id = input('reserve_id', 0);
|
|
$reserve_model = new ReserveModel();
|
|
return $reserve_model->cancelReserve($reserve_id, $this->site_id);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除预约
|
|
* @return array
|
|
*/
|
|
public function deleteReserve()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$reserve_id = input('reserve_id', 0);
|
|
$reserve_model = new ReserveModel();
|
|
return $reserve_model->deleteReserve($reserve_id, $this->site_id);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 确认到店
|
|
* @return array
|
|
*/
|
|
public function confirmToStore()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$reserve_id = input('reserve_id', 0);
|
|
$reserve_model = new ReserveModel();
|
|
return $reserve_model->confirmToStore($reserve_id, $this->site_id);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 确认完成
|
|
* @return array
|
|
*/
|
|
public function complete()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$reserve_id = input('reserve_id', 0);
|
|
$reserve_model = new ReserveModel();
|
|
return $reserve_model->confirmComplete($reserve_id, $this->site_id);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 预约详情
|
|
* @return mixed|void
|
|
*/
|
|
public function detail()
|
|
{
|
|
$reserve_id = input('id', 0);
|
|
|
|
$model = new ReserveModel();
|
|
|
|
$info = $model->getReserveInfo([
|
|
[ 'reserve_id', '=', $reserve_id ],
|
|
[ 'oy.site_id', '=', $this->site_id ]
|
|
], 'oy.*, nm.headimg, nm.nickname, nm.mobile,os.store_name', 'oy', [
|
|
[ 'member nm', 'oy.member_id = nm.member_id', 'left' ],
|
|
[ 'store os', 'oy.store_id = os.store_id', 'left' ]
|
|
])[ 'data' ];
|
|
|
|
if (empty($info)) {
|
|
$this->error('未获取到预约信息');
|
|
return;
|
|
}
|
|
|
|
$info[ 'item' ] = $model->getReserveItemList([
|
|
[
|
|
'oyi.reserve_id', '=', $reserve_id
|
|
]
|
|
], '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',
|
|
[
|
|
[ 'goods g', 'g.sku_id = oyi.reserve_goods_sku_id', 'right' ],
|
|
[ 'goods_sku sku', 'sku.sku_id = oyi.reserve_goods_sku_id', 'right' ],
|
|
[ 'user ys', 'oyi.reserve_user_id = ys.uid', 'left' ]
|
|
])[ 'data' ];
|
|
|
|
$this->assign('info', $info);
|
|
return $this->fetch('reserve/detail', [], $this->replace);
|
|
}
|
|
} |