| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522 |
- <?php
- namespace addons\ShareRedpack\api\modules\v1\controllers;
- use addons\ShareRedpack\common\enums\ShareRedpackEnum;
- use addons\ShareRedpack\common\models\ShareRedpack;
- use addons\ShareRedpack\common\models\ShareRedpackCode;
- use addons\ShareRedpack\common\models\ShareRedpackInvate;
- use addons\ShareRedpack\common\models\ShareRedpackInvateLog;
- use addons\ShareRedpack\common\models\ShareRedpackRecord;
- use addons\ShareRedpack\common\models\ShareRedpackRecordLog;
- use common\components\export\CsvTool;
- use common\enums\DiyEnum;
- use common\enums\RabbitMqEnum;
- use common\enums\StatusEnum;
- use common\models\common\Attachment;
- use common\models\common\PosterCode;
- use common\models\user\User;
- use common\events\census\ShareEvent;
- use common\models\user\UserWallet;
- use Exception;
- use services\common\UserWalletService;
- use Yii;
- use api\controllers\OnAuthController;
- use yii\helpers\Json;
- /**
- * 默认控制器
- *
- * Class DefaultController
- * @package addons\ShareRedpack\api\modules\v1\controllers
- */
- class DefaultController extends OnAuthController
- {
- public $modelClass = '';
- /**
- * 不用进行登录验证的方法
- *
- * 例如: ['index', 'update', 'create', 'view', 'delete']
- * 默认全部需要验证
- *
- * @var array
- */
- protected $authOptional = ['index','share-redpack-popup'];
- /**
- * 首页
- *
- * @return string
- */
- public function actionIndex()
- {
- return 'Hello world';
- }
- /**
- * 海报分享列表
- * @DateTime: 2021/12/24 0024 15:19
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @return mixed|void
- */
- public function actionShareList()
- {
- $retuest = Yii::$app->request;
- if ($retuest->isPost) {
- $mall_id = $this->mall_id;
- $sign = $this->mall['mall_sign'];
- $where[] = ['=', 'status', StatusEnum::ENABLED];
- $where[] = ['=', 'mall_id', $mall_id];
- $select = "id,name,key_word,poster_content";
- $params = ['where' => $where, 'order' => 'id desc', 'select' => $select];
- $list = ShareRedpack::lists($params);
- if (empty($list)) return $this->success('获取成功', $list);
- foreach ($list as $key => $item) {
- $data = [
- 'user_id' => $this->user_id,
- 'nickname' => $this->user->nickname,
- 'avatar_url' => $this->user->avatar_url,
- 'item_id' => $item['id'],
- ];
- // 生成海报对应码
- $select_code = "id,mall_id,user_id,source,code,content,applet_code";
- if ($key == 0) $select_code.= ",applet_code";
- $poster = PosterCode::setData($this->mall_id, $this->user->id, User::SOURCE_SHARE_REDPACK, $data, $select_code);
- $sharePoster = ShareRedpackCode::setData($this->mall_id, $this->user->id, User::SOURCE_SHARE_REDPACK, $data, $select_code,$poster['code']);
- if ($poster == false) return $this->error(ShareRedpackCode::getStaticError());
- $list[$key]['poster_code_id'] = $poster['id'];
- // $list[$key]['qrcode_url'] = DiyEnum::HOME_PAGE_PATH . "?sign={$sign}&parent_id=" . $this->user->id."&source=".User::SOURCE_SHARE_REDPACK;
- $list[$key]['qrcode_url'] = DiyEnum::USER_LOGIN . "?sign={$sign}&scene=" . $poster['code'];
- // 第一张图片请求获取小程序二维码
- if ($this->platform == User::PLATFORM_MP_WX && $key == 0 && empty($poster['applet_code'])) {
- //二维码携带user_id 跟活动类型
- // $codeParams = 'parent_id='.$this->user_id.'&'.'source='.User::SOURCE_SHARE_REDPACK;
- // $codeParams = $this->user_id.'&'.User::SOURCE_SHARE_REDPACK;
- $applet_url = $this->getAppletQrCode(DiyEnum::USER_LOGIN , $poster['code']);// 获取小程序二维码base64数据
- // $applet_url = $this->getAppletQrCode(DiyEnum::USER_LOGIN , $codeParams);// 获取小程序二维码base64数据
- if ($applet_url == false) return $this->error('获取小程序二维码失败');
- $list[$key]['applet_code'] = $applet_url;
- ShareRedpackCode::setData($this->mall_id, $this->user->id, User::SOURCE_SHARE_REDPACK, array_merge($data,['id' => $sharePoster['id'], 'applet_code' => $applet_url]), $select_code,$poster['code']);
- PosterCode::setData($this->mall_id, $this->user->id, User::SOURCE_SHARE_REDPACK, array_merge($data,['id' => $poster['id'], 'applet_code' => $applet_url]), $select_code);
- }
- if ($key == 0) {
- // 统计浏览次数
- ShareRedpack::updateAllCounters(['look_num' => 1],"id=" . $item['id']);
- }
- }
- //生成邀请详情表数据
- $findInvate = ShareRedpackInvate::findOne(['mall_id'=>$this->mall_id,'user_id'=>$this->user_id]);
- if(empty($findInvate)){
- $invateCode = $this->randomkeys(2);
- $invateModel = new ShareRedpackInvate();
- $invateModel->mall_id = $this->mall_id;
- $invateModel->user_id = $this->user_id;
- $invateModel->invite_code = $invateCode;
- $invateModel->num = 0;
- if(!$invateModel->save()){
- return $this->error($invateModel->getStaticError());
- }
- }
- //浏览
- $event = new ShareEvent($this->mall_id);
- $data['mall_id'] =$this->mall_id;
- \Yii::$app->services->events->dispatch($event, ['mall_id'=>$this->mall_id,'user_id'=>$this->user_id], $event->listeners);
- $this->success('获取成功', $list);
- }
- }
- /**
- * 获取海报码详情
- * @Author: lun
- * @DateTime: 2021/12/30 0030 14:07
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @return mixed|void
- */
- public function actionPosterCodeDetail()
- {
- $retuest = Yii::$app->request;
- if ($retuest->isPost) {
- $params = \Yii::$app->request->post();
- $res = \Yii::$app->services->validate->validate($params, [
- [['scene'], 'string'],
- [['poster_code_id'], 'integer'],
- ]);
- if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
- $mall_id = $this->mall_id;
- $is_save = false;
- !empty($params['poster_code_id']) && $where['id'] = $params['poster_code_id'];
- $where['mall_id'] = $mall_id;
- !empty($params['scene']) && $where['code'] = $params['scene'];
- $where['status'] = StatusEnum::ENABLED;
- $select = "id,applet_code,user_id,source,item_id,source,content";
- $detail = ShareRedpackCode::find()->select($select)->where($where)->one();
- if (empty($detail)) return $this->error('暂无内容');
- if (!empty($params['poster_code_id']) && $this->platform == User::PLATFORM_MP_WX) {
- // 小程序二维码为空则去获取小程序二维码
- if (empty($detail['applet_code'])) {
- //二维码携带user_id 跟活动类型
- // $codeParams = 'parent_id='.$detail->user_id.'&'.'source='.User::SOURCE_SHARE_REDPACK;
- $applet_url = $this->getAppletQrCode(DiyEnum::USER_LOGIN, $detail['code']);// 获取小程序二维码base64数据
- // $applet_url = $this->getAppletQrCode(DiyEnum::USER_LOGIN, $codeParams);// 获取小程序二维码base64数据
- if ($applet_url == false) $this->error('获取小程序二维码失败');
- // 获取到base64将其临时存服务器
- $detail->applet_code = $applet_url;
- $is_save = true;
- }
- }
- // 统计浏览次数
- if (!empty($params['poster_code_id'])) {
- ShareRedpack::updateAllCounters(['look_num' => 1],"id=" . $detail->item_id);
- }
- // 统计海报扫码次数
- if (!empty($params['scene']) && $detail['source'] == User::SOURCE_SHARE_REDPACK) {
- ShareRedpack::updateAllCounters(['scan_code_num' => 1],"id=" . $detail->item_id);
- }
- // 保存数据
- if ($is_save && !$detail->save()) return $this->error("获取错误:" . ShareRedpackCode::getStaticError());
- // 解析json
- $content = Json::decode($detail['content'], true);
- if (!empty($content['user_id'])) {
- $content = array_merge(['share_user_id' => $content['user_id']], $content);
- $user = User::findOne(['id'=>$content['user_id']]);
- $content['invite_mobile'] = $user['mobile']??'';
- $detail['content'] = Json::encode($content);
- }
- $this->success('获取成功', $detail->toArray());
- }
- }
- /**
- * 红包设置页面
- */
- public function actionRedPacketSettingPage()
- {
- $retuest = Yii::$app->request;
- if ($retuest->isPost) {
- //获取用户余额
- $userWallet = UserWallet::findOne(['mall_id'=>$this->mall_id, 'user_id'=>$this->user_id]);
- $balance = 0;
- if(!empty($userWallet)){
- $balance = $userWallet->balance;
- }
- $data = [];
- $data['head_title'] = '发红包';
- $data['red_packet_text'] = '红包记录';
- $data['amount_text'] = '单个红包金额';
- $data['number_text'] = '红包个数';
- $data['balance'] = $balance;
- $data['button_text'] = '塞钱进红包(从余额中扣款)';
- $data['notes'] = '红包扣款源于您的消费钱包余额';
- $this->success('获取成功', $data);
- }
- }
- /**
- * 红包设置(发红包)
- */
- public function actionRedPacketSetting()
- {
- $retuest = Yii::$app->request;
- if ($retuest->isPost) {
- $params = \Yii::$app->request->post();
- $res = \Yii::$app->services->validate->validate($params, [
- [['money','num','id'], 'required'],
- [['money'], 'double'],
- [['num','id'], 'integer'],
- ]);
- if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
- if ($params['money'] < 0.01) return $this->error("金额必须大于或等于一分钱",['recharge_balance'=>0]);
- //获取用户钱包数据
- $walletData = UserWallet::findOne(['mall_id'=>$this->mall_id,'user_id'=>$this->user_id]);
- $allMoney = $params['money'] * $params['num'];
- if($walletData->balance < $allMoney) return $this->error("红包余额不足,请前往余额充值",['recharge_balance'=>1]);
- $trans = Yii::$app->db->beginTransaction();
- try {
- //生成红包活动
- $RedpackRecord = ShareRedpackRecord::findOne(['mall_id'=>$this->mall_id,'user_id'=>$this->user_id]);
- if(empty($RedpackRecord)){
- $RedpackRecord = new ShareRedpackRecord();
- }else{
- //判断红包个数是否消费完
- if($RedpackRecord->num > 0){
- return $this->error("还有剩余的红包".$RedpackRecord->num.'个未领取',['recharge_balance'=>0]);
- }
- }
- $RedpackRecord->mall_id = $this->mall_id;
- $RedpackRecord->user_id = $this->user_id;
- $RedpackRecord->money = $params['money'];
- $RedpackRecord->all_num = $params['num'];
- $RedpackRecord->num = $params['num'];
- $RedpackRecord->repack_id = $params['id'];
- if(!$RedpackRecord->save()){
- throw new Exception(ShareRedpackRecord::getStaticError());
- }
- //扣除用户余额
- $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id,
- 'is_frozen' => false,
- 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE,
- 'money' => '-'.$allMoney,
- 'desc' => '分享海报得红包',
- 'source_table' => ShareRedpackRecord::tableName(),
- 'source_table_id' => $this->user_id,
- 'from_type' => ShareRedpackEnum::FROM_SHARE_REDPACK,
- 'capital_type' => ShareRedpackEnum::SHARE_REDPACK_SETTING,
- ];
- $res = UserWalletService::batchHandleByQueue($insert_wallet);
- if ($res == false) throw new Exception(UserWalletService::getStaticError());
- $trans->commit();
- return $this->success('操作成功',['recharge_balance'=>0]);
- } catch (\Exception $e) {
- $trans->rollBack();
- return $this->error($e->getMessage());
- }
- }
- }
- /**
- * 红包记录列表(领取红包的时候会生成记录)
- */
- public function actionRedPacketList()
- {
- if (Yii::$app->request->isPost) {
- $params = Yii::$app->request->post();
- $where = [];
- $where[] = ['=', 'mall_id', $this->mall_id];
- $where[] = ['=', 'user_id', $this->user_id];
- $where[] = ['=', 'status', StatusEnum::ENABLED];
- $order = 'id desc';
- $select = "id,user_id,get_user_id,change_num,change_type,desc,created_at";
- $limit = $params['limit'] ?? 20;
- $with = ['user'];
- $params = compact('where','order','select','limit','with');
- // $params = ['select' => $select, 'where' => $where, 'order' => $order, 'with'=>$with];
- $list = ShareRedpackRecordLog::listPage($params, false, true);
- if(!empty($list['list'])){
- foreach ($list['list'] as &$item){
- $item['created_at'] = date('Y-m-d H:i:s',$item['created_at']);
- $item['desc'] = '发给用户:'.$item['user']['id'].' '.$item['user']['nickname'];
- }
- }
- unset($list['sql']);
- return $this->success('获取成功', compact('list'));
- }
- }
- /**
- * 登录判断是否显示红包弹框
- */
- public function actionShareRedpackPopup()
- {
- if (Yii::$app->request->isPost && $this->user_id) {
- //登录调用
- //判断用户来源
- $userData = User::findOne(['id' => $this->user_id]);
- $data = [];
- $data['is_open'] = 0;
- if ($userData->source == ShareRedpackEnum::SOURCE_SHARE_REDPACK) {
- //判断是否领取
- $find = ShareRedpackRecordLog::findOne(['get_user_id' => $this->user_id]);
- $record = ShareRedpackRecord::findOne(['mall_id'=>$this->mall_id, 'user_id'=>$userData->parent_id]);
- if (empty(($find)) && !empty($record)) {
- $data['is_open'] = 1;
- }
- }
- return $this->success('操作成功',$data);
- }
- }
- /**
- * 用户登录获取红包
- */
- public function actionGetRedpack()
- {
- if (Yii::$app->request->isPost) {
- //登录调用
- //判断用户来源
- $userData = User::findOne(['id'=>$this->user_id]);
- if($userData->source == ShareRedpackEnum::SOURCE_SHARE_REDPACK){
- //判断是否领取
- $find = ShareRedpackRecordLog::findOne(['get_user_id' => $this->user_id]);
- $record = ShareRedpackRecord::findOne(['mall_id'=>$this->mall_id, 'user_id'=>$userData->parent_id]);
- $trans = Yii::$app->db->beginTransaction();
- try {
- $data = [];
- if (empty($find) && !empty($record)) {
- $model = new ShareRedpackRecordLog();
- $model->record_id = $record->id;
- $model->mall_id = $this->mall_id;
- $model->user_id = $userData->parent_id;
- $model->get_user_id = $this->user_id;
- $model->change_num = $record->money;
- $model->change_type = 'sub';
- $model->desc = '发给用户:'.$userData->id.$userData->nickname;
- if (!$model->save()) {
- throw new Exception($model->getStaticError());
- }
- //红包数量-1
- $num = $record->num - 1;
- if ($num < 0) {
- return $this->error('来慢了,红包已被领取完');
- }
- $record->num = $num;
- if (!$record->save()) {
- throw new Exception($record->getStaticError());
- }
- //海报扫码次数加一
- $shareRepack = ShareRedpack::findOne(['id'=>$record->repack_id]);
- if(!empty($shareRepack)){
- $shareRepack->scan_code_num = $shareRepack->scan_code_num+1;
- if (!$shareRepack->save()) {
- throw new Exception($shareRepack->getStaticError());
- }
- }
- //增加用户余额
- $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id,
- 'is_frozen' => false,
- 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE,
- 'money' => $record->money,
- 'desc' => '分享海报得红包',
- 'source_table' => ShareRedpackRecord::tableName(),
- 'source_table_id' => $this->user_id,
- 'from_type' => ShareRedpackEnum::FROM_SHARE_REDPACK,
- 'capital_type' => ShareRedpackEnum::SHARE_REDPACK_SETTING,
- ];
- $res = UserWalletService::batchHandleByQueue($insert_wallet);
- if ($res == false) throw new Exception(UserWalletService::getStaticError());
- //share_redpack_invate 邀请数量 +1
- $invateModel = ShareRedpackInvate::findOne(['user_id'=>$userData->parent_id]);
- if(!empty($invateModel)){
- $invateModel->num = $invateModel->num + 1;
- if(!$invateModel->save()) throw new Exception($invateModel->getStaticError());
- //share_redpack_invate_log 生成邀请记录
- $invateLogModel = new ShareRedpackInvateLog();
- $invateLogModel->mall_id = $this->mall_id;
- $invateLogModel->invate_id = $invateModel->id;
- $invateLogModel->user_id = $this->user_id;
- if(!$invateLogModel->save()) throw new Exception($invateLogModel->getStaticError());
- }
- $data['desc'] = '恭喜您获得好友发放的红包';
- $data['money'] = $record->money.'元';
- }
- $trans->commit();
- return $this->success('操作成功',$data);
- } catch (\Exception $e) {
- $trans->rollBack();
- return $this->error($e->getMessage());
- }
- }
- }
- }
- function randomkeys($length)
- {
- $key = '';
- $pattern = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ';
- $time = time();
- $number = substr($time,6,4);
- for($i=0;$i<=$length;$i++)
- {
- $key .= $pattern[mt_rand(0,35)]; //生成php随机数
- }
- return $key.$number;
- }
- /**
- * 获取小程序二维码
- * @Author: lun
- * @DateTime: 2021/12/27 0027 17:25
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $page
- * @param $scene
- * @return mixed|void
- */
- public function getAppletQrCode($page, $scene)
- {
- $page = ltrim($page, '/');
- $url = '';
- /** @var Wechat $wechat */
- Yii::$app->params['wechatMiniProgramConfig'] = Yii::$app->services->setting->mall->get($this->mall_id, 'mini_program');
- $miniProgram = Yii::$app->wechat->miniProgram;
- $response = $miniProgram->app_code->getUnlimit($scene, ['width' => 200, 'page' => $page]);
- if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) {
- if (in_array('image/jpeg', $response->getHeader('Content-Type'))) {
- //返回base64图片
- $content = 'data:image/jpg;base64,'. base64_encode($response->getBody()->getContents());
- $path = Yii::getAlias('@attachment') . '/download/qrcode';
- if (!file_exists($path)) {// 异步生成小程序图片文件夹
- Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, ['path' => $path], PosterCode::class, 'mkdirQrcode');
- }
- $fileName = $this->base64_image_content($content, $path);
- if ($fileName == false) return false;
- // 图片上传到云存储
- $csv = new CsvTool();
- $url = $csv->upload($this->mall_id, 'download/qrcode/' . $fileName);
- $config = Yii::$app->services->attachment->getStorageConfig($this->mall_id);
- if ($config['drive'] != Attachment::DRIVE_LOCAL) unlink($path .'/'. $fileName);// 删除临时存储的文件
- } else {
- //返回文字
- // $res = Json::decode($response->getBody()->getContents(), true);
- return $this->error('获取失败:' . $response->getBody()->getContents());
- // return false;
- }
- }else{
- return $this->error($response['errmsg']);
- // return false;
- }
- return $url;
- }
- function base64_image_content($base64_image_content,$path, $fileName = ''){
- try {
- //匹配出图片的格式
- if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
- $type = $result[2];
- if(!file_exists($path)){
- //检查是否有该文件夹,如果没有就创建,并给予最高权限
- mkdir($path, 0777, true);
- }
- $fileName = !empty($fileName) ? $fileName : md5(microtime(true));
- if (file_put_contents($path . '/' . $fileName. ".{$type}", base64_decode(str_replace($result[1],'', $base64_image_content)))){
- return $fileName . ".{$type}";
- }else{
- return false;
- }
- }else{
- return false;
- }
- } catch (\Exception $e) {
- // echo $e->getMessage();
- return false;
- }
- }
- }
|