From e776d98a339c9321aa17d5ade0c237e8060c46ef Mon Sep 17 00:00:00 2001 From: wuhui_zzw <1760308791@qq.com> Date: Thu, 2 Nov 2023 18:08:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=9A=E6=96=87=E5=88=9B?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E6=8F=92=E4=BB=B6=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=EF=BC=9A=E8=B4=AD=E4=B9=B0=E5=95=86=E5=93=81=E5=A5=96=E5=8A=B1?= =?UTF-8?q?=E8=B4=A1=E7=8C=AE=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/common/models/member/MemberParent.php | 16 +- plugins/cultural-space/README.md | 1 + plugins/cultural-space/callbacks.php | 14 + plugins/cultural-space/lang/en/locale.js | 8 + plugins/cultural-space/lang/en/test.php | 5 + plugins/cultural-space/lang/zh-CN/locale.js | 6 + plugins/cultural-space/lang/zh-CN/test.php | 5 + plugins/cultural-space/package.json | 11 + .../cultural-space/src/PluginApplication.php | 165 ++++++++++ .../src/admin/ContributionController.php | 27 ++ .../src/admin/IndexController.php | 55 ++++ .../src/admin/widget/CulturalSpaceWidget.php | 27 ++ .../src/listener/OrderPaidListener.php | 30 ++ .../src/models/ContributionLog.php | 39 +++ .../src/models/CulturalSpace.php | 155 +++++++++ .../src/models/GoodsCulturalSpace.php | 50 +++ plugins/cultural-space/views/config.tpl | 0 .../views/contribution/index.blade.php | 305 ++++++++++++++++++ .../views/index/index.blade.php | 305 ++++++++++++++++++ .../cultural-space/views/index/set.blade.php | 84 +++++ .../views/widget/marketing/cultural_space.js | 66 ++++ 21 files changed, 1371 insertions(+), 3 deletions(-) create mode 100644 plugins/cultural-space/README.md create mode 100644 plugins/cultural-space/callbacks.php create mode 100644 plugins/cultural-space/lang/en/locale.js create mode 100644 plugins/cultural-space/lang/en/test.php create mode 100644 plugins/cultural-space/lang/zh-CN/locale.js create mode 100644 plugins/cultural-space/lang/zh-CN/test.php create mode 100644 plugins/cultural-space/package.json create mode 100644 plugins/cultural-space/src/PluginApplication.php create mode 100644 plugins/cultural-space/src/admin/ContributionController.php create mode 100644 plugins/cultural-space/src/admin/IndexController.php create mode 100644 plugins/cultural-space/src/admin/widget/CulturalSpaceWidget.php create mode 100644 plugins/cultural-space/src/listener/OrderPaidListener.php create mode 100644 plugins/cultural-space/src/models/ContributionLog.php create mode 100644 plugins/cultural-space/src/models/CulturalSpace.php create mode 100644 plugins/cultural-space/src/models/GoodsCulturalSpace.php create mode 100644 plugins/cultural-space/views/config.tpl create mode 100644 plugins/cultural-space/views/contribution/index.blade.php create mode 100644 plugins/cultural-space/views/index/index.blade.php create mode 100644 plugins/cultural-space/views/index/set.blade.php create mode 100644 plugins/cultural-space/views/widget/marketing/cultural_space.js diff --git a/app/common/models/member/MemberParent.php b/app/common/models/member/MemberParent.php index c756dbb7..e6251bd5 100644 --- a/app/common/models/member/MemberParent.php +++ b/app/common/models/member/MemberParent.php @@ -42,9 +42,19 @@ class MemberParent extends BaseModel ->get() ->toArray(); } - - - + /** + * Common: 获取用户直推上级用户ID + * Author: wu-hui + * Time: 2023/11/02 16:13 + * @param $uid + * @return int + */ + public static function getParentId($uid){ + return (int)self::uniacid() + ->where('member_id', $uid) + ->where('level',1)// 只获取直推间推 + ->value('parent_id'); + } } \ No newline at end of file diff --git a/plugins/cultural-space/README.md b/plugins/cultural-space/README.md new file mode 100644 index 00000000..e57beb1f --- /dev/null +++ b/plugins/cultural-space/README.md @@ -0,0 +1 @@ +## 文创空间 diff --git a/plugins/cultural-space/callbacks.php b/plugins/cultural-space/callbacks.php new file mode 100644 index 00000000..2c67f22a --- /dev/null +++ b/plugins/cultural-space/callbacks.php @@ -0,0 +1,14 @@ + function ($plugins) { + \Artisan::call('migrate',['--path'=>'plugins/cultural-space/migrations','--force'=>true]); + }, + app\common\events\PluginWasDisabled::class => function ($plugin) { + + + }, + app\common\events\PluginWasDeleted::class => function () { + \Artisan::call('migrate:rollback',['--path'=>'plugins/cultural-space/migrations']); + } +]; diff --git a/plugins/cultural-space/lang/en/locale.js b/plugins/cultural-space/lang/en/locale.js new file mode 100644 index 00000000..6f5de3aa --- /dev/null +++ b/plugins/cultural-space/lang/en/locale.js @@ -0,0 +1,8 @@ + +"use strict"; + +$.extend($.locales['en'], { + 'welfare': { + test: "JavaScript i18n test: English" + } +}); diff --git a/plugins/cultural-space/lang/en/test.php b/plugins/cultural-space/lang/en/test.php new file mode 100644 index 00000000..8999558a --- /dev/null +++ b/plugins/cultural-space/lang/en/test.php @@ -0,0 +1,5 @@ +'this is test title' +]; \ No newline at end of file diff --git a/plugins/cultural-space/lang/zh-CN/locale.js b/plugins/cultural-space/lang/zh-CN/locale.js new file mode 100644 index 00000000..1be84a97 --- /dev/null +++ b/plugins/cultural-space/lang/zh-CN/locale.js @@ -0,0 +1,6 @@ + +$.extend($.locales['zh-CN'], { + 'welfare': { + test: "JavaScript i18n test: 简体中文" + } +}); diff --git a/plugins/cultural-space/lang/zh-CN/test.php b/plugins/cultural-space/lang/zh-CN/test.php new file mode 100644 index 00000000..14fbcffc --- /dev/null +++ b/plugins/cultural-space/lang/zh-CN/test.php @@ -0,0 +1,5 @@ +'测试标题' +]; \ No newline at end of file diff --git a/plugins/cultural-space/package.json b/plugins/cultural-space/package.json new file mode 100644 index 00000000..8a9b3b08 --- /dev/null +++ b/plugins/cultural-space/package.json @@ -0,0 +1,11 @@ +{ + "name": "cultural-space", + "terminal": "wechat|min|wap", + "version": "1.0.1", + "title": "文创空间", + "description": "文创空间", + "author": "zzw", + "url": "", + "namespace": "Yunshop\\CulturalSpace", + "config": "config.tpl" +} \ No newline at end of file diff --git a/plugins/cultural-space/src/PluginApplication.php b/plugins/cultural-space/src/PluginApplication.php new file mode 100644 index 00000000..24dedd40 --- /dev/null +++ b/plugins/cultural-space/src/PluginApplication.php @@ -0,0 +1,165 @@ +setPluginMenu('cultural-space', [ + 'name' => '文创空间', + 'type' => 'marketing', + 'url' => 'plugin.cultural-space.admin.index.index',// url 可以填写http 也可以直接写路由 + 'url_params' => '',//如果是url填写的是路由则启用参数否则不启用 + 'permit' => 1,//如果不设置则不会做权限检测 + 'menu' => 1,//如果不设置则不显示菜单,子菜单也将不显示 + 'icon' => '',//菜单图标 + 'list_icon' => 'cultural-space', + 'parents' => [], + 'top_show' => 0, + 'left_first_show' => 0, + 'left_second_show' => 1, + 'child' => [ + /* 'plugin_cultural_space_index' => [ + 'name' => '文创空间', + 'permit' => 1, + 'menu' => 1, + 'icon' => '', + 'url' => 'plugin.cultural-space.admin.index.index', + 'url_params' => '', + 'item' => 'plugin_cultural_space_index', + 'parents' => ['cultural-space'], + 'child' => [ + // 权限补充 + 'plugin_cultural_space_index_index' => [ + 'name' => '权重值明细', + 'url' => 'plugin.cultural-space.admin.index.index', + 'url_params' => '', + 'permit' => 1, + 'menu' => 0, + 'icon' => '', + 'item' => 'plugin_cultural_space_index_index', + 'parents' => ['cultural-space','plugin_cultural_space_index'] + ], + 'plugin_cultural_space_index_record' => [ + 'name' => '变更记录', + 'url' => 'plugin.cultural-space.admin.index.record', + 'url_params' => '', + 'permit' => 1, + 'menu' => 0, + 'icon' => '', + 'item' => 'plugin_cultural_space_index_record', + 'parents' => ['cultural-space','plugin_cultural_space_index'] + ], + ] + ],*/ + + + 'plugin_cultural_space_contribution' => [ + 'name' => '贡献值管理', + 'permit' => 1, + 'menu' => 1, + 'icon' => '', + 'url' => 'plugin.cultural-space.admin.contribution.index', + 'url_params' => '', + 'item' => 'plugin_cultural_space_contribution', + 'parents' => ['cultural-space'], + 'child' => [ + // 权限补充 + 'plugin_cultural_space_contribution_index' => [ + 'name' => '变更明细', + 'url' => 'plugin.cultural-space.admin.contribution.index', + 'url_params' => '', + 'permit' => 1, + 'menu' => 0, + 'icon' => '', + 'item' => 'plugin_cultural_space_contribution_index', + 'parents' => ['cultural-space','plugin_cultural_space_contribution'] + ], + 'plugin_cultural_space_contribution_hold' => [ + 'name' => '用户持有统计', + 'url' => 'plugin.cultural-space.admin.contribution.hold', + 'url_params' => '', + 'permit' => 1, + 'menu' => 0, + 'icon' => '', + 'item' => 'plugin_cultural_space_contribution_hold', + 'parents' => ['cultural-space','plugin_cultural_space_contribution'] + ], + 'plugin_cultural_space_contribution_bonus' => [ + 'name' => '分红记录', + 'url' => 'plugin.cultural-space.admin.contribution.bonus', + 'url_params' => '', + 'permit' => 1, + 'menu' => 0, + 'icon' => '', + 'item' => 'plugin_cultural_space_contribution_bonus', + 'parents' => ['cultural-space','plugin_cultural_space_contribution'] + ], + ] + ], + 'plugin_cultural_space_set' => [ + 'name' => '基本设置', + 'permit' => 1, + 'menu' => 1, + 'icon' => '', + 'url' => 'plugin.cultural-space.admin.index.set', + 'url_params' => '', + 'parents' => ['cultural-space'], + 'child' => [ + // 权限补充 + 'plugin_cultural_space_index_set' => [ + 'name' => '基本设置', + 'url' => 'plugin.cultural-space.admin.index.set', + 'url_params' => '', + 'permit' => 1, + 'menu' => 0, + 'icon' => '', + 'item' => 'plugin_cultural_space_index_set', + 'parents' => ['cultural-space', 'plugin_cultural_space_set'], + ] + ] + ], + ] + ]); + } + + + public function getWidgetItems() + { + return [ + 'vue-goods.cultural_space' => [ + 'title' => '文创空间', + 'class' => \Yunshop\CulturalSpace\admin\widget\CulturalSpaceWidget::class, + ], + ]; + } + + protected function setConfig(){ + \app\common\modules\shop\ShopConfig::current()->set( + 'observer.goods.cultural_space', [ + 'class' => 'Yunshop\CulturalSpace\models\GoodsCulturalSpace', + 'function_save' => 'relationSave' + ] + ); + } + + public function boot(){ + $events = app('events'); + + // 订单支付成功 + $events->subscribe(OrderPaidListener::class); + + + + + + + + + + } + +} \ No newline at end of file diff --git a/plugins/cultural-space/src/admin/ContributionController.php b/plugins/cultural-space/src/admin/ContributionController.php new file mode 100644 index 00000000..4e7b16e2 --- /dev/null +++ b/plugins/cultural-space/src/admin/ContributionController.php @@ -0,0 +1,27 @@ +render(); + } + + + + + + + +} diff --git a/plugins/cultural-space/src/admin/IndexController.php b/plugins/cultural-space/src/admin/IndexController.php new file mode 100644 index 00000000..c1f565ea --- /dev/null +++ b/plugins/cultural-space/src/admin/IndexController.php @@ -0,0 +1,55 @@ +render(); + } + /** + * Common: 设置信息编辑 + * Author: wu-hui + * Time: 2023/11/02 13:50 + * @return array|mixed|string|void + * @throws \Throwable + */ + public function set(){ + // 获取设置信息 判断是否为设置 + $setInfo = request()->input('cultural_space_set'); + if ($setInfo) { + // 设置信息 + if (Setting::set('plugin.cultural_space_set', $setInfo)) return $this->successJson('编辑成功'); + else return $this->errorJson('设置失败'); + }else{ + // 获取信息 + $set = Setting::get('plugin.cultural_space_set'); + + return view('Yunshop\CulturalSpace::index.set',[ + 'set' => $set, + ])->render(); + } + } + + + + + public function test(){ + + // (new CulturalSpace())->buyGoodsGiveContribution(19,76);// 订单支付成功奖励贡献值 + + + + + + } + + + + +} diff --git a/plugins/cultural-space/src/admin/widget/CulturalSpaceWidget.php b/plugins/cultural-space/src/admin/widget/CulturalSpaceWidget.php new file mode 100644 index 00000000..1dfee0dd --- /dev/null +++ b/plugins/cultural-space/src/admin/widget/CulturalSpaceWidget.php @@ -0,0 +1,27 @@ +where('goods_id', $this->goods->id) + ->first(); + } + + public function pagePath(){ + return plugin_assets('cultural-space','views/widget'); + } +} \ No newline at end of file diff --git a/plugins/cultural-space/src/listener/OrderPaidListener.php b/plugins/cultural-space/src/listener/OrderPaidListener.php new file mode 100644 index 00000000..3cafa841 --- /dev/null +++ b/plugins/cultural-space/src/listener/OrderPaidListener.php @@ -0,0 +1,30 @@ +listen(AfterOrderPaidEvent::class, self::class . '@handle'); + } + + public function handle(AfterOrderPaidEvent $event){ + date_default_timezone_set("PRC"); + $model = $event->getOrderModel(); + // 订单支付成功奖励贡献值 + (new CulturalSpace())->buyGoodsGiveContribution($model->uid,$model->id); + } + + + + + +} diff --git a/plugins/cultural-space/src/models/ContributionLog.php b/plugins/cultural-space/src/models/ContributionLog.php new file mode 100644 index 00000000..6e732bea --- /dev/null +++ b/plugins/cultural-space/src/models/ContributionLog.php @@ -0,0 +1,39 @@ + 'datetime:Y-m-d h:i:s' + ]; + protected $fillable = [ + 'uniacid', + 'uid', + 'goods_id', + 'order_id', + 'order_goods_id', + 'change_type', + 'change_quantity', + 'change_front', + 'change_after', + 'remark', + 'created_at', + 'source' + ]; + + + + + + + + + + + +} diff --git a/plugins/cultural-space/src/models/CulturalSpace.php b/plugins/cultural-space/src/models/CulturalSpace.php new file mode 100644 index 00000000..d1d7013e --- /dev/null +++ b/plugins/cultural-space/src/models/CulturalSpace.php @@ -0,0 +1,155 @@ + $uid,'order_id' => $orderId]); + DB::beginTransaction(); + try{ + $set = Setting::get('plugin.cultural_space_set'); + if($set['is_give_contribution'] != 1 || (float)$set['contribution_ratio'] <= 0) throw new \Exception('文创空间 - 购买商品奖励贡献值 - 未开启贡献值奖励或者奖励比例为0'); + // 获取直推上级id && 获取订单商品信息 + $parentUid = (int)MemberParent::getParentId($uid); + $orderGoodsList = (array)$this->getGoodsModel($orderId) + ->where('yz_goods_cultural_space.is_give_contribution',1) + ->get() + ->makeHidden(['buttons','after_sales','order']) + ->toArray(); + if(count($orderGoodsList) <= 0) throw new \Exception('文创空间 - 购买商品奖励贡献值 - 无奖励商品信息'); + // 获取文创空间用户信息 + $memberList = $parentUid <= 0 ? $this->getCulturalSpace([$uid]) : $this->getCulturalSpace([$uid,$parentUid]); + $userName = Member::getMemberById($uid,['realname','nickname'])->username ?? ''; + // 循环商品处理奖励贡献值 + $changeList = []; + foreach($orderGoodsList as $goodsInfo){ + // 计算奖励贡献值 + $contribution = (float)sprintf('%.2f',$goodsInfo['payment_amount'] * (float)$set['contribution_ratio'] / 100); + if($contribution > 0){ + foreach($memberList as $memberInfo){ + // 用户当前持有数量 + $changeFront = (float)$memberList[$memberInfo['uid']]['contribution']; + // 变更后的数量 + $changeAfter = (float)sprintf("%.2f",$changeFront + $contribution); + // 记录变更信息 + $changeList[] = [ + 'uniacid' => $goodsInfo['uniacid'], + 'uid' => $memberInfo['uid'], + 'goods_id' => $goodsInfo['goods_id'], + 'order_id' => $orderId, + 'order_goods_id' => $goodsInfo['id'], + 'change_type' => 1, + 'change_quantity' => $contribution, + 'change_front' => $changeFront, + 'change_after' => $changeAfter, + 'remark' => ($memberInfo['uid'] == $uid ? '' : "【{$userName}】") . "购买商品【{$goodsInfo['title']}】赠送", + 'created_at' => time(), + ]; + // 刷新持有处理 + $memberList[$memberInfo['uid']]['contribution'] = $changeAfter; + } + } + } + // 数据操作 + if(count($changeList) > 0) { + $this->batchUpdate($memberList,'uid','uid'); + ContributionLog::insert($changeList); + } + + DB::commit(); + }catch(\Exception $e){ + \Log::debug('文创空间 - 购买商品奖励贡献值 - 错误抛出',$e->getMessage()); + DB::rollBack(); + } + + return; + } + /** + * Common: 获取订单商品查询model + * Author: wu-hui + * Time: 2023/11/02 16:26 + * @param $orderId + * @return mixed + */ + private function getGoodsModel($orderId){ + return OrderGoods::uniacid() + ->select([ + 'yz_order_goods.id', + 'yz_order_goods.uniacid', + 'yz_order_goods.goods_id', + 'yz_order_goods.total', + 'yz_order_goods.title', + 'yz_order_goods.payment_amount', + ]) + ->leftJoin('yz_goods_cultural_space', 'yz_goods_cultural_space.goods_id', 'yz_order_goods.goods_id') + ->where('yz_order_goods.order_id',$orderId) + ->where('yz_goods_cultural_space.is_open',1); + } + /** + * Common: 根据用户ids获取用户文创空间相关信息(如果不存在则添加默认信息并且返回默认信息) + * Author: wu-hui + * Time: 2023/11/02 17:36 + * @param $ids + * @return array + */ + private function getCulturalSpace($ids){ + // 获取已经存在的信息 + $list = self::uniacid() + ->select(['id','uid','contribution']) + ->whereIn('uid',$ids) + ->get() + ->keyBy('uid') + ->toArray(); + // 循环处理:不存在则添加,并且赋值默认值;存在则使用已经存在的信息 + $memberList = []; + $insertData = []; + foreach($ids as $userId){ + if($list[$userId]){ + // 存在 + $memberList[$userId] = $list[$userId]; + }else{ + // 不存在 + $insertData[] = [ + 'uniacid' => \YunShop::app()->uniacid, + 'uid' => $userId, + ]; + $memberList[$userId] = [ + 'uniacid' => \YunShop::app()->uniacid, + 'uid' => $userId, + 'contribution' => 0 + ]; + } + } + + if($insertData) self::insert($insertData); + + return $memberList; + } + + + +} diff --git a/plugins/cultural-space/src/models/GoodsCulturalSpace.php b/plugins/cultural-space/src/models/GoodsCulturalSpace.php new file mode 100644 index 00000000..e0166616 --- /dev/null +++ b/plugins/cultural-space/src/models/GoodsCulturalSpace.php @@ -0,0 +1,50 @@ +delete(); + // 公共 + $info->uniacid = \YunShop::app()->uniacid; + $info->goods_id = $goodsId;// 商品ID + $info->is_open = $data['is_open'] ?? 0;// 当前商品是否参与文创空间:0=未开启,1=开启 + $info->is_give_contribution = $data['is_give_contribution'] ?? 0;// 是否赠送贡献值:0=不赠送,1=赠送 + + + + return $info->save(); + } + + public static function getModel($goodsId, $operate){ + $model = false; + // 商品设置 + if ($operate != 'created') $model = static::where(['goods_id' => $goodsId])->first(); + + !$model && $model = new static; + + return $model; + } + + public function getGoodsSet($goodsId){ + self::where('goods_id', $goodsId); + } + + //关联商品信息 + public function belongsToGoods(){ + return $this->belongsTo(Goods::class, 'goods_id', 'id'); + } + +} diff --git a/plugins/cultural-space/views/config.tpl b/plugins/cultural-space/views/config.tpl new file mode 100644 index 00000000..e69de29b diff --git a/plugins/cultural-space/views/contribution/index.blade.php b/plugins/cultural-space/views/contribution/index.blade.php new file mode 100644 index 00000000..10b6da4a --- /dev/null +++ b/plugins/cultural-space/views/contribution/index.blade.php @@ -0,0 +1,305 @@ +@extends('layouts.base') + +@section('content') +