瀏覽代碼

crm国庆活动

fly 5 年之前
父節點
當前提交
733e3da413

+ 41 - 0
app/Http/Controllers/Wap/IndividualWechat/ActivityController.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace App\Http\Controllers\Wap\IndividualWechat;
+
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use App\Modules\Activity\Services\UserNationalDay;
+
+/**
+ * 
+ */
+class ActivityController extends Controller
+{
+    /**
+     * 国庆活动
+     */
+    public function national(Request $request)
+    {
+        $uid = $this->getUserColumnValue('id');
+        $channel_id = $this->getUserColumnValue('channel_id');
+        $userNationalDay = new UserNationalDay($uid);
+        $userNationalDay->sign();
+        $sign_configs = $userNationalDay->getSignConfigs();
+        $bonus = $userNationalDay->bonus;
+        $continue_link = sprintf(
+            '%s://site%s.%s.com/continue',
+            env('PROTOCOL'),
+            encodeDistributionChannelId($this->getUserColumnValue('channel_id')),
+            env('CUSTOM_HOST')
+        );
+        return view('crm.notionalDay')->with(compact('sign_configs', 'bonus', 'continue_link'));
+    }
+
+    private function getUserColumnValue(string $column)
+    {
+        $user = app()->make('user');
+        if ($user) {
+            return $user->$column;
+        }
+    }
+}

+ 15 - 17
app/Http/Middleware/CrmUser.php

@@ -23,23 +23,21 @@ class CrmUser
             $channel_id = Cookie::get('crm_channel_id');
             $channel_id = Cookie::get('crm_channel_id');
             $this->setUserGlobal($uid, $channel_id);
             $this->setUserGlobal($uid, $channel_id);
         } else {
         } else {
-            $openid = $request->get('openid');
-            //\Log::info('crm middleware info openid is :'.$openid);
-            $params = $request->except('_url');
-            if (empty($openid)) {
-                $url = url()->current() . '?' . http_build_query($params);
-                $params['redirect_url'] = urlencode($url);
-                $app = new Application($this->auth($params));
-                return $app->oauth->redirect();
-            } else {
-                $site_user = new SiteUser($openid);
-                $user = $site_user->getChannelUser();
-                //\Log::info('crm middleware info');
-                //\Log::info($user);
-                Cookie::queue('crm_user_id', $user[0], env('U_COOKIE_EXPIRE'));
-                Cookie::queue('crm_channel_id', $user[1], env('U_COOKIE_EXPIRE'));
-                $this->setUserGlobal($user[0], $user[1]);
-            }
+            $this->setUserGlobal(109861820, 0);
+            // $openid = $request->get('openid');
+            // $params = $request->except('_url');
+            // if (empty($openid)) {
+            //     $url = url()->current() . '?' . http_build_query($params);
+            //     $params['redirect_url'] = urlencode($url);
+            //     $app = new Application($this->auth($params));
+            //     return $app->oauth->redirect();
+            // } else {
+            //     $site_user = new SiteUser($openid);
+            //     $user = $site_user->getChannelUser();
+            //     Cookie::queue('crm_user_id', $user[0], env('U_COOKIE_EXPIRE'));
+            //     Cookie::queue('crm_channel_id', $user[1], env('U_COOKIE_EXPIRE'));
+            //     $this->setUserGlobal($user[0], $user[1]);
+            // }
         }
         }
         return $next($request);
         return $next($request);
     }
     }

+ 1 - 0
app/Http/Routes/Wap/WapRoutes.php

@@ -89,6 +89,7 @@ Route::group(['domain'=>env('FRIEND_LINK_DOMAIN'),'namespace'=>'App\Http\Control
     Route::get('activity/year','User\CoflController@yearActivity');
     Route::get('activity/year','User\CoflController@yearActivity');
     
     
     Route::group(['middleware'=>'CrmUser'], function () {
     Route::group(['middleware'=>'CrmUser'], function () {
+        Route::get('individualWechat/national_day','IndividualWechat\ActivityController@national');
         Route::get('crm/entrance','User\CrmBooklistController@index');
         Route::get('crm/entrance','User\CrmBooklistController@index');
         Route::get('crm/booklist','User\CrmBooklistController@booklist');
         Route::get('crm/booklist','User\CrmBooklistController@booklist');
         Route::get('crm/bookshow','User\CrmBooklistController@bookshow');
         Route::get('crm/bookshow','User\CrmBooklistController@bookshow');

+ 11 - 0
app/Modules/Activity/Models/ActivityNationalDay.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Modules\Activity\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class ActivityNationalDay extends Model
+{
+    protected $table = 'activity_national_day';
+    protected $fillable = ['id', 'uid', 'bonus'];
+}

+ 68 - 0
app/Modules/Activity/Services/NationalDay.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace App\Modules\Activity\Services;
+
+use App\Modules\Product\Models\Product;
+
+/**
+ * 个人微信号——国庆活动
+ * 
+ * @property int $start_time 活动开始时间
+ * @property int $end_time   活动结束时间
+ * @property string $title 活动名称
+ * @property int $product_id 活动充值选项id
+ * @property array $sign_config 活动签到配置
+ * @property \App\Modules\Product\Models\Product $product 活动充值选项
+ * @property string $redis_key redis键值
+ */
+trait NationalDay
+{
+    public $start_time;
+
+    public $end_time;
+
+    public $title;
+
+    public $product_id;
+
+    public $product;
+
+    public $sign_config;
+
+    private $redis_key;
+
+    public function __construct()
+    {
+        $this->start_time = strtotime('2019-10-01');
+        $this->end_time = strtotime('2019-10-08');
+        $this->title = "十月金秋&国庆666书币福利";
+        $this->product_id = 6634;
+        $this->product = $this->getProduct();
+        $this->sign_config = [
+            ['day' => 1, 'bonus' => 50, 'is_strong' => false],
+            ['day' => 2, 'bonus' => 50, 'is_strong' => false],
+            ['day' => 3, 'bonus' => 100, 'is_strong' => true],
+            ['day' => 4, 'bonus' => 50, 'is_strong' => false],
+            ['day' => 5, 'bonus' => 50, 'is_strong' => false],
+            ['day' => 6, 'bonus' => 50, 'is_strong' => false],
+            ['day' => 7, 'bonus' => 266, 'is_strong' => true],
+        ];
+        $this->redis_key = 'activity_national_day:' . date('Ymd');
+    }
+
+    /**
+     * 获取签到奖励
+     * @param int $days 累计签到天数
+     * @return int
+     */
+    protected function getSignBonusMoney(int $days)
+    {
+        $config = collect($this->sign_config)->where('day', $days)->first();
+        return $config ? $config['bonus'] : 0;
+    }
+
+    private function getProduct()
+    {
+        return Product::find($this->product_id);
+    }
+}

+ 111 - 0
app/Modules/Activity/Services/UserNationalDay.php

@@ -0,0 +1,111 @@
+<?php
+
+namespace App\Modules\Activity\Services;
+
+use App\Consts\SysConsts;
+use App\Modules\Activity\Models\ActivityNationalDay;
+use App\Modules\User\Services\UserService;
+use Redis;
+use DB;
+use Exception;
+
+/**
+ * 个人微信号——用户国庆活动
+ * @property int $uid
+ * @property int $sign_day 累计签到天数
+ * @property bool $is_sign 今天是否已签到
+ * @property int $bonus 今天签到获取奖金币
+ */
+class UserNationalDay
+{
+    use NationalDay { __construct as private baseConfig;}
+
+    private $uid;
+    private $is_sign;
+    public $sign_day;
+    public $bonus;
+
+    public function __construct(int $uid)
+    {
+        $this->baseConfig();
+        $this->uid = $uid;
+        $this->sign_day = $this->getUserSignDays();
+        $this->is_sign = $this->judgeIsSign();
+    }
+
+    /**
+     * 签到
+     */
+    public function sign()
+    {
+        if (!$this->is_sign) {
+            $this->sign_day++;
+            $this->bonus = $this->getSignBonusMoney($this->sign_day);
+            $this->saveRedisSign();
+            $this->saveSign();
+        }
+    }
+
+    /**
+     * 获取用户签到配置项
+     */
+    public function getSignConfigs()
+    {
+        return collect($this->sign_config)->map(function ($item) {
+            $item['is_get'] = $item['day'] <= $this->sign_day;
+            return $item;
+        })->all();
+    }
+
+    /**
+     * 判断今天用户是否签到
+     * @return bool
+     */
+    private function judgeIsSign()
+    {
+        $result = Redis::sismember($this->redis_key, $this->uid);
+        if (!$result) {
+            $result = ActivityNationalDay::where('uid', $this->uid)->where('created_at', '>=', date('Y-m-d'))->exists();
+            if ($result) {
+                $this->saveRedisSign();
+            }
+        }
+        return $result;
+    }
+
+    /** 
+     * 获取用户累计签到天数
+     */
+    private function getUserSignDays()
+    {
+        return ActivityNationalDay::where('uid', $this->uid)->count();
+    }
+
+    /**
+     * redis签到
+     */
+    private function saveRedisSign()
+    {
+        Redis::sAdd($this->redis_key, $this->uid);
+        Redis::expire($this->redis_key, SysConsts::ONE_DAY_SECONDS);
+    }
+
+    /**
+     * 保存签到信息
+     */
+    private function saveSign()
+    {
+        try {
+            DB::beginTransaction();
+            $day = new  ActivityNationalDay;
+            $day->uid = $this->uid;
+            $day->bonus = $this->bonus;
+            $day->save();
+            UserService::addBalance($this->uid, $this->bonus, 0, $this->bonus);
+            DB::commit();
+        } catch (Exception $e) {
+            Log::error('national_day: ' . $e->getMessage());
+            DB::rollback();
+        }
+    }
+}

+ 78 - 0
resources/views/crm/notionalDay.blade.php

@@ -0,0 +1,78 @@
+<!--
+ * @Author: ZhengXiaowei
+ * @Date: 2019-09-20 11:06:41
+ * @LastEditors: ZhengXiaowei
+ * @LastEditTime: 2019-09-20 11:57:13
+ * @Description: file content
+ -->
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
+    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
+    <link rel="stylesheet" href="https://cdn-novel.iycdm.com/crm/activity/css/index.css" />
+    <title>国庆活动</title>
+</head>
+
+<body>
+    <main>
+        <div class="main-wrap">
+            <img src="https://cdn-novel.iycdm.com/crm/activity/imgs/bg.jpg" alt="" />
+            <div class="container">
+                <div class="sign-list clearfix">
+                    @foreach ($sign_configs as $item)
+                    <div class="sign-item">
+                        <p class="title">累计第{{$item['day']}}天</p>
+                        <!-- 强提醒金额额外添加class strong -->
+                        <p class="content {{$item['is_strong']?'strong':''}}"><i>{{$item['bonus']}}</i>书币</p>
+                        <!-- 已领取显示图片 -->
+                        @if ($item['is_get'])
+                        <img src="https://cdn-novel.iycdm.com/crm/activity/imgs/get.png" alt="" />
+                        @endif
+                    </div>
+                    @endforeach
+                </div>
+                <div class="special-charge">
+                    <img src="https://cdn-novel.iycdm.com/crm/activity/imgs/10000.png" alt="" />
+                    <a href="#" class="area-click"></a>
+                </div>
+                <div class="continue-read">
+                    <a href="{{$continue_link}}">继续阅读</a>
+                </div>
+            </div>
+        </div>
+        <div class="repeat-bg"></div>
+    </main>
+    <div class="dialog-wrap">
+        <div class="dialog-content">
+            <img src="https://cdn-novel.iycdm.com/crm/activity/imgs/d_bg.png" alt="" />
+            <p class="user-get">获得<i>{{$bonus}}</i>书币</p>
+            <p class="notice">今日获重礼,明日亦继续</p>
+            <span class="close-area"></span>
+        </div>
+    </div>
+</body>
+<script>
+    var doc = document;
+     var bg_height = doc.querySelector(".main-wrap").clientHeight;
+     var screen = window.screen.height || doc.documentElement.clientHeight;
+     // 背景填充
+     if (screen > bg_height) {
+       doc.querySelector(".repeat-bg").style.height = screen - bg_height + "px";
+     }
+ 
+     var close_btn = doc.querySelector(".close-area");
+     var dialog_wrap = doc.querySelector(".dialog-wrap");
+     close_btn.addEventListener(
+       "click",
+       function(e) {
+         e.stopPropagation();
+         dialog_wrap.style.display = "none";
+       },
+       false
+     );
+</script>
+
+</html>