| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628 |
- <?php
- namespace app\platform\modules\application\controllers;
- use app\common\events\DeleteAccountEvent;
- use app\common\facades\Setting;
- use app\common\models\Option;
- use app\platform\controllers\BaseController;
- use app\platform\modules\application\models\UniacidApp;
- use app\common\helpers\Cache;
- use app\platform\modules\pluginsSetMeal\models\PluginsMealModel;
- use app\platform\modules\pluginsSetMeal\models\pluginsMealPlatform;
- use app\platform\modules\system\models\SystemSetting;
- use app\platform\modules\user\models\AdminUser;
- use app\platform\modules\application\models\AppUser;
- use Illuminate\Support\Facades\DB;
- use app\backend\modules\member\models\Member;
- use app\backend\modules\member\models\McMappingFans;
- use app\common\models\MemberMiniAppModel;
- use app\common\models\MemberWechatModel;
- use app\backend\modules\member\models\MemberShopInfo;
- use app\backend\modules\member\models\MemberUnique;
- use app\backend\modules\goods\models\Goods;
- use app\backend\modules\order\models\Order;
- use app\backend\modules\menu\Menu;
- use app\common\modules\wechat\models\Rule;
- use app\common\modules\wechat\models\RuleKeyword;
- use Illuminate\Foundation\Bus\DispatchesJobs;
- use app\Jobs\deleteUniacidColumnsJob;
- class ApplicationController extends BaseController
- {
- protected $key = 'application';
- use DispatchesJobs;
- public function index()
- {
- $search = request()->search;
- $app = new UniacidApp();
- $ids = self::checkRole();
- if (\Auth::guard('admin')->user()->uid != 1) {
- if (!is_array($ids)) {
- return $this->errorJson($ids);
- }
- $list = $app->select('id', 'name', 'img', 'validity_time', 'status', 'is_top')
- ->whereIn('id', $ids)->where('status', 1)
- ->search($search)
- ->orderBy('is_top', 'desc')
- ->orderBy('topped_at', 'desc')
- ->orderBy('id', 'desc')
- ->paginate()
- ->toArray();
- } else {
- $list = $app->select('id', 'name', 'img', 'validity_time', 'status', 'admin_is_top as is_top')
- ->where('status', 1)
- ->search($search)
- ->orderBy('admin_is_top', 'desc')
- ->orderBy('admin_topped_at', 'desc')
- ->orderBy('id', 'desc')
- ->paginate()
- ->toArray();
- }
- foreach ($list['data'] as $key => &$value) {
- $value['img'] = yz_tomedia($value['img']);
- if ($value['validity_time'] == 0) {
- $list['data'][$key]['validity_time'] = intval($value['validity_time']);
- } else {
- //到期前一周的时间 当前+1 直到 +7 小于等于 $value['validity_time']
- $week = date('W');
- $nowstamp = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
- $time_week = date('W', $value['validity_time']);
- if ((date('W', strtotime('+1 week')) == $time_week) || (date('W') == $time_week && $value['validity_time'] >= $nowstamp)) {
- $list['data'][$key]['is_expire'] = 1; //到期前一周
- }
- if ($value['validity_time'] != 0 && $value['validity_time'] < $nowstamp) {
- $list['data'][$key]['is_expire'] = 2; //已经到期
- }
- if ($value['validity_time'] === 0 || (date('W', strtotime('+1 week') - $time_week > 1) && $value['validity_time'] > $nowstamp)) {
- $list['data'][$key]['is_expire'] = 0;
- }
- $list['data'][$key]['validity_time'] = date('Y-m-d', $value['validity_time']);
- }
- }
- return $this->successJson('获取成功', $list);
- }
- public static function checkRole()
- {
- $ids = [];
- $uid = \Auth::guard('admin')->user()->uid;
- $user = AdminUser::find($uid);
- $appUser = AppUser::where('uid', $uid)->get();
- if (!$user || !$appUser || $user->type == 3) {
- return '您无权限查看平台应用';
- }
- if ($user->endtime != 0 && $user->endtime < time()) {
- return '您的账号已过期';
- }
- foreach ($appUser->toArray() as $k => $v) {
- $ids[] = $v['uniacid'];
- }
- $app = UniacidApp::where('creator', $uid)->get();
- if ($app) {
- foreach ($app as $key => $value) {
- $ids[] = $value['id'];
- }
- }
- return $ids;
- }
- public function checkAddRole()
- {
- //判断用户是否有权限添加平台
- $uid = \Auth::guard('admin')->user()->uid;
- $num = UniacidApp::withTrashed()->where('creator', $uid)->count();
- $realnum = AdminUser::find($uid)->application_number;
- if ($uid != 1 && $num >= $realnum) {
- return $this->errorJson('您无权限添加平台');
- }
- return $this->successJson('可以添加平台');
- }
- public function add()
- {
- $app = new UniacidApp();
- //判断用户是否有权限添加平台
- $uid = \Auth::guard('admin')->user()->uid;
- $num = UniacidApp::withTrashed()->where('creator', $uid)->count();
- $adminUser = AdminUser::find($uid);
- if ($uid != 1 && $num >= $adminUser->application_number) {
- return $this->errorJson('您无权限添加平台');
- }
- $set = SystemSetting::settingLoad('basicsetting', 'basic_setting');
- if (!empty($set) and $set['type'] != 0) {
- if ($set['type'] == 1 and request()->input('validity_time') > $adminUser->endtime and $adminUser->endtime != 0) {
- return $this->errorJson('平台期限不能超过管理员有效期');
- }elseif ($set['type'] == 2 and request()->input('validity_time') > strtotime("+ {$set['endtime']} day") and $adminUser->endtime != 0){
- return $this->errorJson('平台期限不能超过指定效期');
- }
- }
- if (!request()->input()) {
- return $this->errorJson('请输入参数');
- }
- $platform = [
- 'img' => request()->input('img'),
- 'name' => request()->input('name'),
- 'validity_time' => request()->input('validity_time')
- ];
- $data = $this->fillData($platform);
- $id = $app->insertGetId($data);
- if ($id) {
- if ($uid != 1) {
- // 新框架角色表插入数据
- AppUser::create([
- 'role' => 'manager',
- 'uid' => $uid,
- 'uniacid' => $id
- ]);
- }
- $up = UniacidApp::where('id', $id)->update(['uniacid' => $id]);
- if (!$up) {
- \Log::info('平台添加修改uniacid字段失败, id为', $id);
- }
- //添加商城key
- Setting::$uniqueAccountId = $id;
- $upgrade = Setting::get('shop.key');
- if (empty($upgrade['key']) && empty($upgrade['secret'])) {
- $platformShopValue = Setting::getNotUniacid('platform_shop.key');
- Setting::set('shop.key', $platformShopValue);
- \Cache::forget('app_auth' . $id);
- }
- //更新缓存
- if ($this->enabledPlugins($id,request()->input('plugins_meal_id'))){
- return $this->successJson('添加成功,套餐启动成功');
- }
- return $this->successJson('添加成功,套餐启动失败');
- } else {
- return $this->errorJson('添加失败');
- }
- }
- public function update()
- {
- $id = request()->id;
- $app = new UniacidApp();
- $info = $app->find($id);
- if (!$id || !$info) {
- return $this->errorJson('请选择应用');
- }
- if (request()->input()) {
- $data = $this->fillData(request()->input());
- $data['id'] = $id;
- $data['uniacid'] = $id;
- $app->fill($data);
- $validator = $app->validator($data);
- if ($validator->fails()) {
- return $this->errorJson($validator->messages());
- } else {
- if ($app->where('id', $id)->update($data)) {
- //更新缓存
- // Cache::put($this->key . ':' . $id, $app->find($id), $data['validity_time']);
- if($this->enabledPlugins($id,request()->input('plugins_meal_id'))){
- return $this->successJson('修改成功');
- }
- return $this->successJson('修改成功 ,但套餐使用失败');
- } else {
- return $this->errorJson('修改失败');
- }
- }
- }
- }
- private function enabledPlugins($uniacid, $plugins_meal_id)
- {
- if (empty($uniacid) or empty($plugins_meal_id)) {
- return false;
- }
- $pluginsMeal = (new PluginsMealModel())->getPluginsMealList($plugins_meal_id);
- $pluginsList = Option::where('uniacid', $uniacid)->pluck('option_name')->toArray();
- if (!$pluginsMeal) {
- return false;
- }
- Menu::flush();
- $plugins = array_keys(app('plugins')->getPlugins()->toArray());
- \Setting::$uniqueAccountId = $uniacid;
- $pluginManager = app('app\common\services\PluginManager');
- $afterPluginsCheck = ['store-alone-temp']; //todo 某些插件可能需要启动别的先驱插件才能启动,暂时它放在这处理
- $afterPluginsList = []; //后启动插件数组
- try {
- $pluginsMealPlatform = PluginsMealPlatform::where('uniacid', $uniacid)->first();
- if ($pluginsMealPlatform->plugins_meal_id == $plugins_meal_id) {
- return true;
- }
- if (!$pluginsMealPlatform ) {
- if ($pluginsList) {
- $pluginManager->disableMeal($uniacid);//关闭所有插件
- foreach ($pluginsList as $plugin) {
- $pluginManager->dispatchEvent($plugin);
- }
- }
- foreach ($pluginsMeal[0]['plugins'] as $plugin) {
- if (in_array($plugin, $plugins)) {
- if (in_array($plugin, $afterPluginsCheck)) {
- $afterPluginsList[] = $plugin;
- continue;
- }
- $pluginManager->enableMeal($plugin); //启用插件套餐
- }
- }
- if (!empty($afterPluginsList)) {
- \Artisan::call('config:cache'); //todo 必须刷新缓存,否则无法启动
- \Cache::flush();
- foreach ($afterPluginsList as $item) {
- $pluginManager->enableMeal($item); //启用插件套餐
- }
- }
- (new pluginsMealPlatform())->create([
- 'uniacid' => $uniacid,
- 'plugins_meal_id' => $plugins_meal_id
- ]);
- } else {
- $pluginManager->disableMeal($uniacid);//关闭所有插件
- foreach ($pluginsList as $plugin) {
- $pluginManager->dispatchEvent($plugin);
- }
- foreach ($pluginsMeal[0]['plugins'] as $plugin) {
- $plugin = str_replace('_', '-', $plugin);
- if (in_array($plugin, $plugins)) {
- if (in_array($plugin, $afterPluginsCheck)) {
- $afterPluginsList[] = $plugin;
- continue;
- }
- $pluginManager->enableMeal($plugin); //启用插件套餐
- }
- }
- if (!empty($afterPluginsList)) {
- \Artisan::call('config:cache'); //todo 必须刷新缓存,否则无法启动
- \Cache::flush();
- foreach ($afterPluginsList as $item) {
- $pluginManager->enableMeal($item); //启用插件套餐
- }
- }
- PluginsMealPlatform::where('uniacid', $uniacid)->update(['plugins_meal_id' => $plugins_meal_id]);
- }
- \Setting::$uniqueAccountId = '';
- \Artisan::call('config:cache');
- \Cache::flush();
- return true;
- } catch (\Exception $e) {
- \Artisan::call('config:cache');
- \Cache::flush();
- return false;
- }
- }
- public function getMessage()
- {
- if (\YunShop::app()->uid == 1){
- $plugin = PluginsMealModel::orderBy('order_by','desc')->get()->toArray();
- }else {
- $plugin = PluginsMealModel::where('state',1)->orderBy('order_by','desc')->get()->toArray();
- }
- $uid = \Auth::guard('admin')->user()->uid;
- $adminUser = AdminUser::find($uid);
- $set = SystemSetting::settingLoad('basicsetting', 'basic_setting');
- $data['type'] = $set['type'];
- switch ($set['type']){
- case 0:
- $data['validity_time'] = 0;
- break;
- case 1:
- $data['validity_time'] = $adminUser->endtime;
- break;
- case 2:
- $data['validity_time'] = strtotime("+ {$set['endtime']} day");
- break;
- }
- $data['plugin'] = $plugin;
- return $this->successJson('ok', $data);
- }
- public function getApp()
- {
- $id = request()->id;
- $app = new UniacidApp();
- $info = $app->find($id);
- $info['isfounder'] = intval(\YunShop::app()->isfounder);
- $info['plugins_meal_id'] = pluginsMealPlatform::where('uniacid', $id)->first()->plugins_meal_id;
- if (\YunShop::app()->uid == 1) {
- $info['plugin'] = PluginsMealModel::orderBy('order_by', 'desc')->get()->toArray();
- } else {
- $info['plugin'] = PluginsMealModel::where('state', 1)->orderBy('order_by', 'desc')->get()->toArray();
- }
- if (!$id || !$info) {
- return $this->errorJson('获取失败');
- }
- return $this->successJson('获取成功', $info);
- }
- //加入回收站 删除
- public function delete()
- {
- $id = request()->id;
- $info = UniacidApp::withTrashed()->find($id);
- if (!$id || !$info) {
- return $this->errorJson('请选择要修改的应用');
- }
- if ($info->deleted_at) {
- //强制删除相关会员信息
- $this->forceDel($info);
- // Cache::forget($this->key . ':' . $id);
- } else {
- if (!$info->delete()) {
- return $this->errorJson('操作失败');
- }
- UniacidApp::withTrashed()->where('id', $id)->update(['status' => 0]);
- // Cache::put($this->key . ':' . $id, UniacidApp::find($id));
- }
- return $this->successJson('操作成功');
- }
- //强制删除平台关联数据
- public function forceDel($info)
- {
- $uniacid = $info->uniacid;
- \YunShop::app()->uniacid = $uniacid;
- event(new DeleteAccountEvent($uniacid));
- DB::transaction(function () use ($uniacid) {
- if (!empty($uniacid)) {
- //删除yz_uniacid_app
- UniacidApp::where('uniacid',$uniacid)->forceDelete();
- //删除会员 mc_member
- Member::where('uniacid',$uniacid)->forceDelete();
- //小程序会员表 yz_member_mini_app
- MemberMiniAppModel::where('uniacid',$uniacid)->forceDelete();
- //app会员表 yz_member_wechat
- MemberWechatModel::where('uniacid',$uniacid)->forceDelete();
- //删除微擎mc_mapping_fans 表数据
- McMappingFans::where('uniacid',$uniacid)->forceDelete();
- //清空 yz_member 关联
- MemberShopInfo::where('uniacid',$uniacid)->forceDelete();
- //强制删除 yz_member_unique
- MemberUnique::where('uniacid',$uniacid)->forceDelete();
- //强制删除yz_goods
- Goods::where('uniacid',$uniacid)->forceDelete();
- //强制删除yz_order
- Order::where('uniacid',$uniacid)->forceDelete();
- //强制删除 yz_wechat_rule
- Rule::where('uniacid',$uniacid)->forceDelete();
- //强制删除 ims_yz_wechat_rule
- RuleKeyword::where('uniacid',$uniacid)->forceDelete();
- //删除yz_wechat_menu
- if(app('plugins')->isEnabled('wechat')){
- \Yunshop\Wechat\common\model\Menu::where('uniacid',$uniacid)->forceDelete();
- }
- $tables = DB::select("SELECT DISTINCT TABLE_NAME FROM information_schema.COLUMNS WHERE COLUMN_NAME = 'uniacid'");
- $tables = array_column($tables, 'TABLE_NAME');
- foreach ($tables as $v) {
- $this->dispatch(new deleteUniacidColumnsJob($v, $uniacid));
- }
- }
- });
- \Log::info('------删除平台关联会员数据------', [$uniacid, \Auth::guard('admin')->user()]);
- }
- //启用禁用或恢复应用
- public function switchStatus()
- {
- $id = request()->id;
- $info = UniacidApp::withTrashed()->find($id);
- if (!$id || !$info) {
- return $this->errorJson('请选择要修改的应用');
- }
- if (request()->status) {
- //修改状态
- $res = UniacidApp::where('id', $id)->update(['status' => $info->status == 1 ? 0 : 1]);
- }
- if (request()->url) {
- //修改应用跳转链接
- $res = UniacidApp::where('id', $id)->update(['url' => filter_var(trim(request()->url), FILTER_VALIDATE_URL)]);
- }
- if ($info->deleted_at) {
- //从回收站中恢复应用
- $res = UniacidApp::withTrashed()->where('id', $id)->restore();
- $info->update(['status' => 1]);
- }
- if ($res) {
- return $this->successJson('操作成功');
- } else {
- return $this->errorJson('操作失败');
- }
- }
- //回收站 列表
- public function recycle()
- {
- $search = request()->search;
- $app = new UniacidApp();
- if (\Auth::guard('admin')->user()->uid != 1) {
- $list = $app->onlyTrashed()->where('creator', \Auth::guard('admin')->user()->uid)->search($search)->orderBy('id', 'desc')->paginate()->toArray();
- } else {
- $list = $app
- ->onlyTrashed()
- ->search($search)
- ->orderBy('id', 'desc')
- ->paginate()
- ->toArray();
- }
- foreach ($list['data'] as $key => $value) {
- if ($value['validity_time'] == 0) {
- $list['data'][$key]['validity_time'] = intval($value['validity_time']);
- } else {
- $list['data'][$key]['validity_time'] = date('Y-m-d', $value['validity_time']);
- }
- }
- if ($list) {
- return $this->successJson('获取成功', $list);
- } else {
- return $this->errorJson('获取失败,暂无数据');
- }
- }
- private function fillData($data)
- {
- return [
- 'img' => $data['img'] ?: 'http://www.baidu.com',
- 'url' => $data['url'],
- 'name' => $data['name'] ?: 'test',
- 'kind' => $data['kind'] ?: '',
- 'type' => $data['type'] ?: 2,
- 'title' => $data['title'] ?: '',
- 'description' => $data['description'] ?: '',
- 'status' => $data['status'] ?: 1,
- 'version' => $data['version'] ?: 0.00,
- 'validity_time' => $data['validity_time'] ?: 0,
- 'creator' => \Auth::guard('admin')->user()->uid,
- ];
- }
- public function setTop()
- {
- $id = request()->id;
- $info = UniacidApp::withTrashed()->find($id);
- if (!$id || !$info) {
- return $this->errorJson('请选择要置顶的应用');
- }
- if (\Auth::guard('admin')->user()->uid != 1) {
- if ($info->is_top) {
- //修改置顶状态
- $res = UniacidApp::where('id', $id)->update(['is_top' => 0]);
- } else {
- //非置顶状态--取消其他置顶--再置顶
- $ids = self::checkRole();
- UniacidApp::whereIn('id', $ids)->where('is_top', 1)->update(['is_top' => 0]);
- $res = UniacidApp::where('id', $id)->update(['is_top' => 1, 'topped_at' => time()]);
- }
- } else {
- //修改置顶状态
- if ($info->admin_is_top) {
- $res = UniacidApp::where('id', $id)->update(['admin_is_top' => 0, 'admin_topped_at' => '']);
- } else {
- UniacidApp::where('admin_is_top', 1)->update(['admin_is_top' => 0]);
- $res = UniacidApp::where('id', $id)->update(['admin_is_top' => 1, 'admin_topped_at' => time()]);
- }
- }
- if ($res) {
- return $this->successJson('操作成功');
- } else {
- return $this->errorJson('操作失败');
- }
- }
- public function basicSettings()
- {
- if (request()->isMethod("GET"))
- {
- $set = SystemSetting::settingLoad('basicsetting', 'basic_setting');
- if (empty($set)) {
- $set['type'] = 0;
- }
- return $this->successJson('ok', $set);
- }
- $data = request()->input('term_of_validity');
- if ($data) {
- $site = SystemSetting::settingSave($data, 'basicsetting', 'basic_setting');
- if ($site) {
- return $this->successJson('成功', '');
- } else {
- return $this->errorJson('失败', '');
- }
- }
- }
- }
|