assign('breadcrumb1','营销管理');
$this->assign('breadcrumb2','优惠券管理');
}
/**
* 首页列表
*
* */
public function index(Model $Model,CustomCoupon $CustomCoupon,City $City,CouponRebate $CouponRebate){
// 接受参数
$code = request('coupon_code','');
$status = request('status');
$startTime = request('start_time','');
$endTime = request('end_time','');
// 编码转ID
$id = $code ? $Model->codeToId($code) : 0;
// 查询条件
$map = [];
// 编码ID
if( $id ) $map[] = ['id','=',$id];
if( $startTime ) $map[] = ['start_time','>=',strtotime($startTime)];
if( $endTime ) $map[] = ['end_time','<=',strtotime($endTime)];
if( !is_null($status) ) $map[] = ['status','=',$status];
$session = session('userRule');
if ($session){
$map[] = ['company_id','=',$session['company_id']];
if ($session['business_id']){
$map[] = ['business_id','=',$session['business_id']];
}
if ($session['menu_type'] == 1 && $session['data_type'] == 2){
$shopIds = Business::query()->where('leader_uid',$session['admin_uid'])->pluck('id')->toArray();
}
}
// 查询数据
$list = $Model->query()->where($map);
if (isset($shopIds)) $list->whereIn('business_id',$shopIds);
$list = $list->orderByDesc('id')->paginate(request('limit',config('page_num',10)))->appends(request()->all());
// 计算各个优惠券的数量
$customTotal = $CustomCoupon->whereIn('coupon_id',array_column($list->toArray()['data'],'id'))->groupBy('coupon_id')->select([DB::raw('count(*) as total'),'coupon_id'])->pluck('total','coupon_id')->toArray();
// 循环处理数据
foreach ($list as $key => $value) {
// id转编号
$value['coupon_code']= $Model->idToCode($value['id']);
$value['business_name']= Business::query()->where('id',$value['business_id'])->value('name');
// 发放类型
$value['gant_name'] = $Model->getGrantType($value['grant_type'],'name');
// 如果已经到了结束时间。活动结束
if( $value['status'] == 0 && $value['end_time'] <= time() ) {
// 状态设置
$Model->edit($value['id'],['status'=>3]);
// 状态设置
$value['status'] = 3;
}
// 判断是不是可以参与
if( $value['city_ids'] ) {
// 解析数组
$cityids = explode(',',$value['city_ids']);
// 获取城市
foreach ($cityids as $kk=>$vv) {
// 获取值
$vv = $City->getOne($vv,'name');
// 获取城市名
$cityids[$kk] = $vv;
}
// 城市列表
$value['city_ids'] = implode('、',$cityids);
}
// 赠品
if( $value['rebate_type'] == 3 ) {
// 返回结果
$value['rebate'] = (string) $CouponRebate->query()->join('product','coupon_rebate.product_id','=','product.id')->where([['coupon_id','=',$value['id']]])->value('product.name');
}
// id转编号
$value['custom_total'] = isset($customTotal[$value['id']]) ? $customTotal[$value['id']] : 0;
// 重组
$list[$key] = $value;
}
// 分配数据
$this->assign('empty', '
~~暂无数据 |
');
$this->assign('list', $list);
// 加载模板
return $this->fetch();
}
/**
* 添加
*
* */
public function add( Request $request, Model $Model,City $City,CouponRebate $CouponRebate,Product $Product,Business $Business){
if( request()->isMethod('post') ){
// 验证参数
$request->scene('add')->validate();
// 组合数据
$data['name'] = request('name',0);
$data['rebate_type'] = request('rebate_type',0);
$data['std_pay'] = request('std_pay',0);
$data['rebate'] = request('rebate',0);
$data['issue_total'] = request('issue_total',0);
$data['start_time'] = request('start_time','');
$data['end_time'] = request('end_time','');
$data['type_id'] = request('type_id',1);
$data['grant_type'] = request('grant_type',1);
$data['status'] = request('status',2);
$data['business_id'] = request('business_id',0);
$cityIds = request('city_ids',[]);
$data['city_ids'] = implode(',',$cityIds);
// 转换时间,默认现在现在生效
$data['start_time'] = $data['start_time'] ? strtotime($data['start_time']) : time();
// 转换时间,默认无结束时间
$data['end_time'] = $data['end_time'] ? strtotime($data['end_time']) : 0;
// 转换时间,默认无结束时间
$data['exp_time'] = request('exp_time',0) ? strtotime(request('exp_time','')) : 0;
// 判断有效时间类型。获取不同的过期时间
$data['exp_time'] = request('exp_type',0) == 1 ? request('exp_days',0) : $data['exp_time'];
// 验证信息
if( $data['rebate_type'] == 2 && $data['rebate'] > 9.99 ) return json_send(['code'=>'error','msg'=>'不能设置大于9.99折']);
if( $data['start_time'] < 0 ) return json_send(['code'=>'error','msg'=>'请填写活动开始时间']);
if( $data['end_time'] < time() ) return json_send(['code'=>'error','msg'=>'活动时间必须大于当前时间']);
if( $data['exp_time'] <= 0 ) return json_send(['code'=>'error','msg'=>'请填写领用后有效期']);
// 赠品ID
$rebateId = 0;
// 如果是赠品表的话。处理赠品逻辑
if( $data['rebate_type'] == 3 ) {
// 产品编码
$rebateId = $Product->codeToId($data['rebate']);
// 赠品ID不存在
if( !$rebateId ) return json_send(['code'=>'error','msg'=>'赠品编码格式有误']);
// 设置为0,避免数据异常
$data['rebate'] = 0;
}
// 组合数据,写入订单表,子表
DB::beginTransaction();
try {
// 写入
$id = $Model->add($data);
// 提示新增失败
if( !$id ) {
// 回滚
DB::rollBack();
// 提示
return json_send(['code'=>'error','msg'=>'新增失败']);
}
// 如果是赠品
if( $rebateId ) {
// 写入数据
$result = $CouponRebate->add(['coupon_id'=>$id,'product_id'=>$rebateId,'rebate_num'=>1]);
// 提示新增失败
if( !$result ) {
// 回滚
DB::rollBack();
// 提示失败
return json_send(['code'=>'error','msg'=>'赠品结果写入失败']);
}
}
// 提交
DB::commit();
// 记录行为
$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,1,[],$data);
// 告知结果
return json_send(['code'=>'success','msg'=>'新增成功','action'=>'add']);
} catch (\Throwable $th) {
// 回滚
DB::rollBack();
// 提示失败
return json_send(['code'=>'error','msg'=>'内部错误,请重试','data'=>['error'=>$th->getMessage()]]);
}
}
// 获取列表
$cityList = $City->getCityList();
$grantList = $Model->getGrantTypeList();
$businessList = $Business->getList();
// 分配数据
$this->assign('cityList',$cityList);
$this->assign('grantList',$grantList);
$this->assign('businessList',$businessList);
$this->assign('crumbs','新增');
// 加载模板
return $this->fetch();
}
/**
* 编辑
*
* */
public function edit( Request $request, Model $Model,City $City,CouponRebate $CouponRebate,Product $Product,Business $Business){
// 接收参数
$id = request('id',0);
// 查询数据
$oldData = $Model->where(['id'=>$id])->first();
// 修改
if(request()->isMethod('post')){
// 验证参数
$request->scene('edit')->validate();
// 组合数据
$data['name'] = request('name',0);
$data['rebate_type'] = request('rebate_type',0);
$data['std_pay'] = request('std_pay',0);
$data['rebate'] = request('rebate',0);
$data['issue_total'] = request('issue_total',0);
$data['start_time'] = request('start_time','');
$data['end_time'] = request('end_time','');
$data['type_id'] = request('type_id',1);
$data['grant_type'] = request('grant_type',1);
$data['business_id'] = request('business_id',1);
$cityIds = request('city_ids',[]);
$data['city_ids'] = implode(',',$cityIds);
// 转换时间,默认现在现在生效
$data['start_time'] = $data['start_time'] ? strtotime($data['start_time']) : time();
// 转换时间,默认无结束时间
$data['end_time'] = $data['end_time'] ? strtotime($data['end_time']) : 0;
// 转换时间,默认无结束时间
$data['exp_time'] = request('exp_time',0) ? strtotime(request('exp_time','')) : 0;
// 判断有效时间类型。获取不同的过期时间
$data['exp_time'] = request('exp_type',0) == 1 ? request('exp_days',0) : $data['exp_time'];
// 赠品ID
$rebateId = 0;
// 如果是赠品表的话。处理赠品逻辑
if( $data['rebate_type'] == 3 ) {
// 产品编码
$rebateId = $Product->codeToId($data['rebate']);
// 赠品ID不存在
if( !$rebateId ) return json_send(['code'=>'error','msg'=>'赠品编码格式有误']);
// 设置为0,避免数据异常
$data['rebate'] = 0;
}
// 验证信息
if( $data['rebate_type'] == 2 && $data['rebate'] > 9.99 ) return json_send(['code'=>'error','msg'=>'不能设置大于9.99折']);
if( $data['start_time'] < 0 ) return json_send(['code'=>'error','msg'=>'请填写活动开始时间']);
if( $data['end_time'] < time() ) return json_send(['code'=>'error','msg'=>'活动时间必须大于当前时间']);
if( $data['exp_time'] <= 0 ) return json_send(['code'=>'error','msg'=>'请填写领用后有效期']);
// 组合数据,写入订单表,子表
DB::beginTransaction();
try {
// 写入
$result = $Model->edit($id,$data);
// 提示新增失败
if( !$result ) {
// 回滚
DB::rollBack();
// 提示
return json_send(['code'=>'error','msg'=>'新增失败']);
}
// 如果是赠品券
if( $rebateId ) {
// 查询旧的
$oldRebateId = $CouponRebate->query()->where([['coupon_id','=',$id],['product_id','=',$rebateId]])->value('id');
// 有旧的修改,无则添加新的
$result = $oldRebateId ? $CouponRebate->edit($oldRebateId,['product_id'=>$rebateId,'rebate_num'=>1]) : $CouponRebate->add(['coupon_id'=>$id,'product_id'=>$rebateId,'rebate_num'=>1]);
// 提示新增失败
if( !$result ) {
// 回滚
DB::rollBack();
// 提示失败
return json_send(['code'=>'error','msg'=>'赠品结果写入失败']);
}
}
// 提交
DB::commit();
// 记录行为
$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,[],$data);
// 告知结果
return json_send(['code'=>'success','msg'=>'修改成功','action'=>'edit']);
} catch (\Throwable $th) {
// 回滚
DB::rollBack();
// 提示失败
return json_send(['code'=>'error','msg'=>'内部错误,请重试','data'=>['error'=>$th->getMessage()]]);
}
}
// 如果是没有数据
if( !$oldData ) return $this->error('查无数据');
// 如果是赠品表的话。处理赠品逻辑
if( $oldData['rebate_type'] == 3 ) {
// 产品编码
$rebateId = $CouponRebate->getProductByCouponId($oldData['id']);
// 产品ID
$rebateId = isset($rebateId[0]['product_id']) ? $Product->idToCode($rebateId[0]['product_id']) : '';
// 设置为0,避免数据异常
$oldData['rebate'] = $rebateId;
}
// 城市处理
$oldData['city_ids'] = explode(',',$oldData['city_ids']);
// 有效期,时间戳或者时间为0表示的时间段,否则表示领取后N天
$oldData['exp_type'] = $oldData['exp_time'] > 1000 ? 2 : 1;
// 获取列表
$cityList = $City->getCityList();
$grantList = $Model->getGrantTypeList();
$businessList = $Business->getList();
// 分配数据
$this->assign('cityList',$cityList);
$this->assign('grantList',$grantList);
$this->assign('businessList',$businessList);
$this->assign('oldData',$oldData);
$this->assign('crumbs','修改');
// 加载模板
return $this->fetch();
}
/**
* 状态
*
* */
public function set_status( Request $request, Model $Model,CustomCoupon $CustomCoupon ){
// 验证参数
$request->scene('set_status')->validate();
// 接收参数
$id = request('id',0);
$status = request('status',0);
// 查询数据
$result = $Model->edit($id,['status'=>$status]);
// 提示新增失败
if( !$result ) return json_send(['code'=>'error','msg'=>'设置失败']);
// 查询数据
$result = $CustomCoupon->setStatusByCouponId($id,$status);
// 记录行为
$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,[],['status'=>$status]);
// 告知结果
return json_send(['code'=>'success','msg'=>'设置成功','path'=>'']);
}
}