// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\store\model; use app\common\model\GiveOutCoupon as GiveOutCouponModel; use think\cache\driver\Redis; use think\facade\Queue; /** * 发放优惠券模型 * Class ShopsDailySalesSt * @package app\common\model */ class GiveOutCoupon extends GiveOutCouponModel { public function add($params){ //主管发优惠券 if ($params['role'] == 1){//系统主动发券 if ($params['rev_type'] == 2){ $flag = $this->gitOutActByRevUser($params); if ($flag === false){ $this->error = '系统繁忙'; return false; } } $params['audit_user_id'] = $params['create_admin_id']; $params['audit_time'] = date('Y-m-d H:i:s'); $params['audit_status'] = 1; }else{ if ($params['rev_user'] == 1){ $keys = $params['mobile_keys']??''; if ($keys){ $rds = new Redis(config('cache.stores.redis')); $mobiles = $rds->get($keys); if (!$mobiles){ $this->error = '请导入电话号码'; return false; } }else{ $mobiles_str = $params['mobiles']; $mobiles_arr = explode(',',trim($mobiles_str)); $mobiles = json_encode($mobiles_arr); } $params['mobiles'] = $mobiles; } } $this->save($params); return true; } private function gitOutActByRevUser(&$params,$isAudit = false){ if ($params['rev_user'] == 1){//指定用户 if ($isAudit == true){ $mobiles = $params['mobiles']; $mobiles_str = $params['mobiles']; $mobiles_arr = json_decode($mobiles_str); }else{ $keys = $params['mobile_keys']??''; if ($keys){ $rds = new Redis(config('cache.stores.redis')); $mobiles = $rds->get($keys); if (!$mobiles){ $this->error = '请导入电话号码'; return false; } $mobiles_arr = json_decode($mobiles); }else{ $mobiles_str = $params['mobiles']; $mobiles_arr = explode(',',trim($mobiles_str)); $mobiles = json_encode($mobiles_arr); } } $params['mobiles'] = $mobiles; return $this->giveUserCouponAct($mobiles_arr,$params['coupon_id']); } if ($params['rev_user'] == 2){ if ($params['user_type'] == 1){//新用户 $newUserIds = User::getNewUserIds(); return $this->giveUserCouponActByUserId($newUserIds,$params['coupon_id']); } if ($params['user_type'] == 2){//老用户 $oldUserIds = User::getOldUserIds(); return $this->giveUserCouponActByUserId($oldUserIds,$params['coupon_id']); } } if ($params['rev_user'] == 3){//活跃用户 todo /* if ($params['user_type'] == 7){//7日活跃用户 } if ($params['user_type'] == 14){//14日活跃用户 }*/ return true; } return true; } private function giveUserCouponAct($mobiles_arr,$coupon_id): bool { foreach ($mobiles_arr as $mobile){ $user = User::where(['mobile'=>$mobile])->field('user_id')->find(); if (!$user){ continue; } $this->giveOutCouponQueue($coupon_id,$user['user_id']); } return true; } private function giveUserCouponActByUserId($userIds,$coupon_id){ foreach ($userIds as $userId){ $this->giveOutCouponQueue($coupon_id,$userId); } return true; } public function getList($param){ return $this->with(['coupon','createrAdmin','auditAdmin'])->where(['is_delete'=>0]) ->field('id,coupon_id,rev_type,rev_user,reason,audit_status,audit_time,create_admin_id,audit_user_id') ->order('id desc')->paginate(15); } public function coupon(){ return $this->belongsTo(Coupon::class,'coupon_id','coupon_id'); } public function createrAdmin(){ return $this->belongsTo(\app\store\model\store\User::class,'create_admin_id','store_user_id') ->field('store_user_id,user_name,real_name'); } public function auditAdmin(){ return $this->belongsTo(\app\store\model\store\User::class,'audit_user_id','store_user_id') ->field('store_user_id,user_name,real_name'); } public function audit($param){ $this->where('id',$param['id'])->update($param); if ($param['audit_status'] == 1){ $params = $this->where('id',$param['id'])->find(); //主管发优惠券 if ($params['rev_type'] == 2){//系统主动发券 //dd($params->toArray()); $this->gitOutActByRevUser($params,true); } } return true; } /** * 给用户发券队列 * @param $coupon_id * @param $user_id * @return bool */ public function giveOutCouponQueue($coupon_id,$user_id){ $jobHandlerClassName = 'app\job\GiveOutCouponToUser'; $jobQueueName = "orderWaitCommissionsQueue"; //数组数据 $orderData = [ 'coupon_id' => $coupon_id, 'user_id' => $user_id, ]; $isPushed = Queue::push($jobHandlerClassName, $orderData ,$jobQueueName); //$isPushed = Queue::later(5, $jobHandlerClassName, $orderData, $jobQueueName); if( $isPushed !== false ){ return true; }else{ log_record('加队列失败:'.$coupon_id.'--'.$user_id,'error'); return false; } } public function detail($id){ $d = $this->with(['coupon','createrAdmin','auditAdmin'])->where(['id'=>$id,'is_delete'=>0]) ->field('id,coupon_id,rev_type,rev_user,user_type,mobiles,reason,audit_status,audit_time,create_admin_id,audit_user_id') ->find(); if ($d['mobiles']){ $d['mobiles'] = json_decode($d['mobiles']); $d['mobiles'] = implode(',',$d['mobiles']); }else{ $d['mobiles'] = ''; } return $d; } }