ApplicationController.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. <?php
  2. namespace app\platform\modules\application\controllers;
  3. use app\common\events\DeleteAccountEvent;
  4. use app\common\facades\Setting;
  5. use app\common\models\Option;
  6. use app\platform\controllers\BaseController;
  7. use app\platform\modules\application\models\UniacidApp;
  8. use app\common\helpers\Cache;
  9. use app\platform\modules\pluginsSetMeal\models\PluginsMealModel;
  10. use app\platform\modules\pluginsSetMeal\models\pluginsMealPlatform;
  11. use app\platform\modules\system\models\SystemSetting;
  12. use app\platform\modules\user\models\AdminUser;
  13. use app\platform\modules\application\models\AppUser;
  14. use Illuminate\Support\Facades\DB;
  15. use app\backend\modules\member\models\Member;
  16. use app\backend\modules\member\models\McMappingFans;
  17. use app\common\models\MemberMiniAppModel;
  18. use app\common\models\MemberWechatModel;
  19. use app\backend\modules\member\models\MemberShopInfo;
  20. use app\backend\modules\member\models\MemberUnique;
  21. use app\backend\modules\goods\models\Goods;
  22. use app\backend\modules\order\models\Order;
  23. use app\backend\modules\menu\Menu;
  24. use app\common\modules\wechat\models\Rule;
  25. use app\common\modules\wechat\models\RuleKeyword;
  26. use Illuminate\Foundation\Bus\DispatchesJobs;
  27. use app\Jobs\deleteUniacidColumnsJob;
  28. class ApplicationController extends BaseController
  29. {
  30. protected $key = 'application';
  31. use DispatchesJobs;
  32. public function index()
  33. {
  34. $search = request()->search;
  35. $app = new UniacidApp();
  36. $ids = self::checkRole();
  37. if (\Auth::guard('admin')->user()->uid != 1) {
  38. if (!is_array($ids)) {
  39. return $this->errorJson($ids);
  40. }
  41. $list = $app->select('id', 'name', 'img', 'validity_time', 'status', 'is_top')
  42. ->whereIn('id', $ids)->where('status', 1)
  43. ->search($search)
  44. ->orderBy('is_top', 'desc')
  45. ->orderBy('topped_at', 'desc')
  46. ->orderBy('id', 'desc')
  47. ->paginate()
  48. ->toArray();
  49. } else {
  50. $list = $app->select('id', 'name', 'img', 'validity_time', 'status', 'admin_is_top as is_top')
  51. ->where('status', 1)
  52. ->search($search)
  53. ->orderBy('admin_is_top', 'desc')
  54. ->orderBy('admin_topped_at', 'desc')
  55. ->orderBy('id', 'desc')
  56. ->paginate()
  57. ->toArray();
  58. }
  59. foreach ($list['data'] as $key => &$value) {
  60. $value['img'] = yz_tomedia($value['img']);
  61. if ($value['validity_time'] == 0) {
  62. $list['data'][$key]['validity_time'] = intval($value['validity_time']);
  63. } else {
  64. //到期前一周的时间 当前+1 直到 +7 小于等于 $value['validity_time']
  65. $week = date('W');
  66. $nowstamp = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
  67. $time_week = date('W', $value['validity_time']);
  68. if ((date('W', strtotime('+1 week')) == $time_week) || (date('W') == $time_week && $value['validity_time'] >= $nowstamp)) {
  69. $list['data'][$key]['is_expire'] = 1; //到期前一周
  70. }
  71. if ($value['validity_time'] != 0 && $value['validity_time'] < $nowstamp) {
  72. $list['data'][$key]['is_expire'] = 2; //已经到期
  73. }
  74. if ($value['validity_time'] === 0 || (date('W', strtotime('+1 week') - $time_week > 1) && $value['validity_time'] > $nowstamp)) {
  75. $list['data'][$key]['is_expire'] = 0;
  76. }
  77. $list['data'][$key]['validity_time'] = date('Y-m-d', $value['validity_time']);
  78. }
  79. }
  80. return $this->successJson('获取成功', $list);
  81. }
  82. public static function checkRole()
  83. {
  84. $ids = [];
  85. $uid = \Auth::guard('admin')->user()->uid;
  86. $user = AdminUser::find($uid);
  87. $appUser = AppUser::where('uid', $uid)->get();
  88. if (!$user || !$appUser || $user->type == 3) {
  89. return '您无权限查看平台应用';
  90. }
  91. if ($user->endtime != 0 && $user->endtime < time()) {
  92. return '您的账号已过期';
  93. }
  94. foreach ($appUser->toArray() as $k => $v) {
  95. $ids[] = $v['uniacid'];
  96. }
  97. $app = UniacidApp::where('creator', $uid)->get();
  98. if ($app) {
  99. foreach ($app as $key => $value) {
  100. $ids[] = $value['id'];
  101. }
  102. }
  103. return $ids;
  104. }
  105. public function checkAddRole()
  106. {
  107. //判断用户是否有权限添加平台
  108. $uid = \Auth::guard('admin')->user()->uid;
  109. $num = UniacidApp::withTrashed()->where('creator', $uid)->count();
  110. $realnum = AdminUser::find($uid)->application_number;
  111. if ($uid != 1 && $num >= $realnum) {
  112. return $this->errorJson('您无权限添加平台');
  113. }
  114. return $this->successJson('可以添加平台');
  115. }
  116. public function add()
  117. {
  118. $app = new UniacidApp();
  119. //判断用户是否有权限添加平台
  120. $uid = \Auth::guard('admin')->user()->uid;
  121. $num = UniacidApp::withTrashed()->where('creator', $uid)->count();
  122. $adminUser = AdminUser::find($uid);
  123. if ($uid != 1 && $num >= $adminUser->application_number) {
  124. return $this->errorJson('您无权限添加平台');
  125. }
  126. $set = SystemSetting::settingLoad('basicsetting', 'basic_setting');
  127. if (!empty($set) and $set['type'] != 0) {
  128. if ($set['type'] == 1 and request()->input('validity_time') > $adminUser->endtime and $adminUser->endtime != 0) {
  129. return $this->errorJson('平台期限不能超过管理员有效期');
  130. }elseif ($set['type'] == 2 and request()->input('validity_time') > strtotime("+ {$set['endtime']} day") and $adminUser->endtime != 0){
  131. return $this->errorJson('平台期限不能超过指定效期');
  132. }
  133. }
  134. if (!request()->input()) {
  135. return $this->errorJson('请输入参数');
  136. }
  137. $platform = [
  138. 'img' => request()->input('img'),
  139. 'name' => request()->input('name'),
  140. 'validity_time' => request()->input('validity_time')
  141. ];
  142. $data = $this->fillData($platform);
  143. $id = $app->insertGetId($data);
  144. if ($id) {
  145. if ($uid != 1) {
  146. // 新框架角色表插入数据
  147. AppUser::create([
  148. 'role' => 'manager',
  149. 'uid' => $uid,
  150. 'uniacid' => $id
  151. ]);
  152. }
  153. $up = UniacidApp::where('id', $id)->update(['uniacid' => $id]);
  154. if (!$up) {
  155. \Log::info('平台添加修改uniacid字段失败, id为', $id);
  156. }
  157. //添加商城key
  158. Setting::$uniqueAccountId = $id;
  159. $upgrade = Setting::get('shop.key');
  160. if (empty($upgrade['key']) && empty($upgrade['secret'])) {
  161. $platformShopValue = Setting::getNotUniacid('platform_shop.key');
  162. Setting::set('shop.key', $platformShopValue);
  163. \Cache::forget('app_auth' . $id);
  164. }
  165. //更新缓存
  166. if ($this->enabledPlugins($id,request()->input('plugins_meal_id'))){
  167. return $this->successJson('添加成功,套餐启动成功');
  168. }
  169. return $this->successJson('添加成功,套餐启动失败');
  170. } else {
  171. return $this->errorJson('添加失败');
  172. }
  173. }
  174. public function update()
  175. {
  176. $id = request()->id;
  177. $app = new UniacidApp();
  178. $info = $app->find($id);
  179. if (!$id || !$info) {
  180. return $this->errorJson('请选择应用');
  181. }
  182. if (request()->input()) {
  183. $data = $this->fillData(request()->input());
  184. $data['id'] = $id;
  185. $data['uniacid'] = $id;
  186. $app->fill($data);
  187. $validator = $app->validator($data);
  188. if ($validator->fails()) {
  189. return $this->errorJson($validator->messages());
  190. } else {
  191. if ($app->where('id', $id)->update($data)) {
  192. //更新缓存
  193. // Cache::put($this->key . ':' . $id, $app->find($id), $data['validity_time']);
  194. if($this->enabledPlugins($id,request()->input('plugins_meal_id'))){
  195. return $this->successJson('修改成功');
  196. }
  197. return $this->successJson('修改成功 ,但套餐使用失败');
  198. } else {
  199. return $this->errorJson('修改失败');
  200. }
  201. }
  202. }
  203. }
  204. private function enabledPlugins($uniacid, $plugins_meal_id)
  205. {
  206. if (empty($uniacid) or empty($plugins_meal_id)) {
  207. return false;
  208. }
  209. $pluginsMeal = (new PluginsMealModel())->getPluginsMealList($plugins_meal_id);
  210. $pluginsList = Option::where('uniacid', $uniacid)->pluck('option_name')->toArray();
  211. if (!$pluginsMeal) {
  212. return false;
  213. }
  214. Menu::flush();
  215. $plugins = array_keys(app('plugins')->getPlugins()->toArray());
  216. \Setting::$uniqueAccountId = $uniacid;
  217. $pluginManager = app('app\common\services\PluginManager');
  218. $afterPluginsCheck = ['store-alone-temp']; //todo 某些插件可能需要启动别的先驱插件才能启动,暂时它放在这处理
  219. $afterPluginsList = []; //后启动插件数组
  220. try {
  221. $pluginsMealPlatform = PluginsMealPlatform::where('uniacid', $uniacid)->first();
  222. if ($pluginsMealPlatform->plugins_meal_id == $plugins_meal_id) {
  223. return true;
  224. }
  225. if (!$pluginsMealPlatform ) {
  226. if ($pluginsList) {
  227. $pluginManager->disableMeal($uniacid);//关闭所有插件
  228. foreach ($pluginsList as $plugin) {
  229. $pluginManager->dispatchEvent($plugin);
  230. }
  231. }
  232. foreach ($pluginsMeal[0]['plugins'] as $plugin) {
  233. if (in_array($plugin, $plugins)) {
  234. if (in_array($plugin, $afterPluginsCheck)) {
  235. $afterPluginsList[] = $plugin;
  236. continue;
  237. }
  238. $pluginManager->enableMeal($plugin); //启用插件套餐
  239. }
  240. }
  241. if (!empty($afterPluginsList)) {
  242. \Artisan::call('config:cache'); //todo 必须刷新缓存,否则无法启动
  243. \Cache::flush();
  244. foreach ($afterPluginsList as $item) {
  245. $pluginManager->enableMeal($item); //启用插件套餐
  246. }
  247. }
  248. (new pluginsMealPlatform())->create([
  249. 'uniacid' => $uniacid,
  250. 'plugins_meal_id' => $plugins_meal_id
  251. ]);
  252. } else {
  253. $pluginManager->disableMeal($uniacid);//关闭所有插件
  254. foreach ($pluginsList as $plugin) {
  255. $pluginManager->dispatchEvent($plugin);
  256. }
  257. foreach ($pluginsMeal[0]['plugins'] as $plugin) {
  258. $plugin = str_replace('_', '-', $plugin);
  259. if (in_array($plugin, $plugins)) {
  260. if (in_array($plugin, $afterPluginsCheck)) {
  261. $afterPluginsList[] = $plugin;
  262. continue;
  263. }
  264. $pluginManager->enableMeal($plugin); //启用插件套餐
  265. }
  266. }
  267. if (!empty($afterPluginsList)) {
  268. \Artisan::call('config:cache'); //todo 必须刷新缓存,否则无法启动
  269. \Cache::flush();
  270. foreach ($afterPluginsList as $item) {
  271. $pluginManager->enableMeal($item); //启用插件套餐
  272. }
  273. }
  274. PluginsMealPlatform::where('uniacid', $uniacid)->update(['plugins_meal_id' => $plugins_meal_id]);
  275. }
  276. \Setting::$uniqueAccountId = '';
  277. \Artisan::call('config:cache');
  278. \Cache::flush();
  279. return true;
  280. } catch (\Exception $e) {
  281. \Artisan::call('config:cache');
  282. \Cache::flush();
  283. return false;
  284. }
  285. }
  286. public function getMessage()
  287. {
  288. if (\YunShop::app()->uid == 1){
  289. $plugin = PluginsMealModel::orderBy('order_by','desc')->get()->toArray();
  290. }else {
  291. $plugin = PluginsMealModel::where('state',1)->orderBy('order_by','desc')->get()->toArray();
  292. }
  293. $uid = \Auth::guard('admin')->user()->uid;
  294. $adminUser = AdminUser::find($uid);
  295. $set = SystemSetting::settingLoad('basicsetting', 'basic_setting');
  296. $data['type'] = $set['type'];
  297. switch ($set['type']){
  298. case 0:
  299. $data['validity_time'] = 0;
  300. break;
  301. case 1:
  302. $data['validity_time'] = $adminUser->endtime;
  303. break;
  304. case 2:
  305. $data['validity_time'] = strtotime("+ {$set['endtime']} day");
  306. break;
  307. }
  308. $data['plugin'] = $plugin;
  309. return $this->successJson('ok', $data);
  310. }
  311. public function getApp()
  312. {
  313. $id = request()->id;
  314. $app = new UniacidApp();
  315. $info = $app->find($id);
  316. $info['isfounder'] = intval(\YunShop::app()->isfounder);
  317. $info['plugins_meal_id'] = pluginsMealPlatform::where('uniacid', $id)->first()->plugins_meal_id;
  318. if (\YunShop::app()->uid == 1) {
  319. $info['plugin'] = PluginsMealModel::orderBy('order_by', 'desc')->get()->toArray();
  320. } else {
  321. $info['plugin'] = PluginsMealModel::where('state', 1)->orderBy('order_by', 'desc')->get()->toArray();
  322. }
  323. if (!$id || !$info) {
  324. return $this->errorJson('获取失败');
  325. }
  326. return $this->successJson('获取成功', $info);
  327. }
  328. //加入回收站 删除
  329. public function delete()
  330. {
  331. $id = request()->id;
  332. $info = UniacidApp::withTrashed()->find($id);
  333. if (!$id || !$info) {
  334. return $this->errorJson('请选择要修改的应用');
  335. }
  336. if ($info->deleted_at) {
  337. //强制删除相关会员信息
  338. $this->forceDel($info);
  339. // Cache::forget($this->key . ':' . $id);
  340. } else {
  341. if (!$info->delete()) {
  342. return $this->errorJson('操作失败');
  343. }
  344. UniacidApp::withTrashed()->where('id', $id)->update(['status' => 0]);
  345. // Cache::put($this->key . ':' . $id, UniacidApp::find($id));
  346. }
  347. return $this->successJson('操作成功');
  348. }
  349. //强制删除平台关联数据
  350. public function forceDel($info)
  351. {
  352. $uniacid = $info->uniacid;
  353. \YunShop::app()->uniacid = $uniacid;
  354. event(new DeleteAccountEvent($uniacid));
  355. DB::transaction(function () use ($uniacid) {
  356. if (!empty($uniacid)) {
  357. //删除yz_uniacid_app
  358. UniacidApp::where('uniacid',$uniacid)->forceDelete();
  359. //删除会员 mc_member
  360. Member::where('uniacid',$uniacid)->forceDelete();
  361. //小程序会员表 yz_member_mini_app
  362. MemberMiniAppModel::where('uniacid',$uniacid)->forceDelete();
  363. //app会员表 yz_member_wechat
  364. MemberWechatModel::where('uniacid',$uniacid)->forceDelete();
  365. //删除微擎mc_mapping_fans 表数据
  366. McMappingFans::where('uniacid',$uniacid)->forceDelete();
  367. //清空 yz_member 关联
  368. MemberShopInfo::where('uniacid',$uniacid)->forceDelete();
  369. //强制删除 yz_member_unique
  370. MemberUnique::where('uniacid',$uniacid)->forceDelete();
  371. //强制删除yz_goods
  372. Goods::where('uniacid',$uniacid)->forceDelete();
  373. //强制删除yz_order
  374. Order::where('uniacid',$uniacid)->forceDelete();
  375. //强制删除 yz_wechat_rule
  376. Rule::where('uniacid',$uniacid)->forceDelete();
  377. //强制删除 ims_yz_wechat_rule
  378. RuleKeyword::where('uniacid',$uniacid)->forceDelete();
  379. //删除yz_wechat_menu
  380. if(app('plugins')->isEnabled('wechat')){
  381. \Yunshop\Wechat\common\model\Menu::where('uniacid',$uniacid)->forceDelete();
  382. }
  383. $tables = DB::select("SELECT DISTINCT TABLE_NAME FROM information_schema.COLUMNS WHERE COLUMN_NAME = 'uniacid'");
  384. $tables = array_column($tables, 'TABLE_NAME');
  385. foreach ($tables as $v) {
  386. $this->dispatch(new deleteUniacidColumnsJob($v, $uniacid));
  387. }
  388. }
  389. });
  390. \Log::info('------删除平台关联会员数据------', [$uniacid, \Auth::guard('admin')->user()]);
  391. }
  392. //启用禁用或恢复应用
  393. public function switchStatus()
  394. {
  395. $id = request()->id;
  396. $info = UniacidApp::withTrashed()->find($id);
  397. if (!$id || !$info) {
  398. return $this->errorJson('请选择要修改的应用');
  399. }
  400. if (request()->status) {
  401. //修改状态
  402. $res = UniacidApp::where('id', $id)->update(['status' => $info->status == 1 ? 0 : 1]);
  403. }
  404. if (request()->url) {
  405. //修改应用跳转链接
  406. $res = UniacidApp::where('id', $id)->update(['url' => filter_var(trim(request()->url), FILTER_VALIDATE_URL)]);
  407. }
  408. if ($info->deleted_at) {
  409. //从回收站中恢复应用
  410. $res = UniacidApp::withTrashed()->where('id', $id)->restore();
  411. $info->update(['status' => 1]);
  412. }
  413. if ($res) {
  414. return $this->successJson('操作成功');
  415. } else {
  416. return $this->errorJson('操作失败');
  417. }
  418. }
  419. //回收站 列表
  420. public function recycle()
  421. {
  422. $search = request()->search;
  423. $app = new UniacidApp();
  424. if (\Auth::guard('admin')->user()->uid != 1) {
  425. $list = $app->onlyTrashed()->where('creator', \Auth::guard('admin')->user()->uid)->search($search)->orderBy('id', 'desc')->paginate()->toArray();
  426. } else {
  427. $list = $app
  428. ->onlyTrashed()
  429. ->search($search)
  430. ->orderBy('id', 'desc')
  431. ->paginate()
  432. ->toArray();
  433. }
  434. foreach ($list['data'] as $key => $value) {
  435. if ($value['validity_time'] == 0) {
  436. $list['data'][$key]['validity_time'] = intval($value['validity_time']);
  437. } else {
  438. $list['data'][$key]['validity_time'] = date('Y-m-d', $value['validity_time']);
  439. }
  440. }
  441. if ($list) {
  442. return $this->successJson('获取成功', $list);
  443. } else {
  444. return $this->errorJson('获取失败,暂无数据');
  445. }
  446. }
  447. private function fillData($data)
  448. {
  449. return [
  450. 'img' => $data['img'] ?: 'http://www.baidu.com',
  451. 'url' => $data['url'],
  452. 'name' => $data['name'] ?: 'test',
  453. 'kind' => $data['kind'] ?: '',
  454. 'type' => $data['type'] ?: 2,
  455. 'title' => $data['title'] ?: '',
  456. 'description' => $data['description'] ?: '',
  457. 'status' => $data['status'] ?: 1,
  458. 'version' => $data['version'] ?: 0.00,
  459. 'validity_time' => $data['validity_time'] ?: 0,
  460. 'creator' => \Auth::guard('admin')->user()->uid,
  461. ];
  462. }
  463. public function setTop()
  464. {
  465. $id = request()->id;
  466. $info = UniacidApp::withTrashed()->find($id);
  467. if (!$id || !$info) {
  468. return $this->errorJson('请选择要置顶的应用');
  469. }
  470. if (\Auth::guard('admin')->user()->uid != 1) {
  471. if ($info->is_top) {
  472. //修改置顶状态
  473. $res = UniacidApp::where('id', $id)->update(['is_top' => 0]);
  474. } else {
  475. //非置顶状态--取消其他置顶--再置顶
  476. $ids = self::checkRole();
  477. UniacidApp::whereIn('id', $ids)->where('is_top', 1)->update(['is_top' => 0]);
  478. $res = UniacidApp::where('id', $id)->update(['is_top' => 1, 'topped_at' => time()]);
  479. }
  480. } else {
  481. //修改置顶状态
  482. if ($info->admin_is_top) {
  483. $res = UniacidApp::where('id', $id)->update(['admin_is_top' => 0, 'admin_topped_at' => '']);
  484. } else {
  485. UniacidApp::where('admin_is_top', 1)->update(['admin_is_top' => 0]);
  486. $res = UniacidApp::where('id', $id)->update(['admin_is_top' => 1, 'admin_topped_at' => time()]);
  487. }
  488. }
  489. if ($res) {
  490. return $this->successJson('操作成功');
  491. } else {
  492. return $this->errorJson('操作失败');
  493. }
  494. }
  495. public function basicSettings()
  496. {
  497. if (request()->isMethod("GET"))
  498. {
  499. $set = SystemSetting::settingLoad('basicsetting', 'basic_setting');
  500. if (empty($set)) {
  501. $set['type'] = 0;
  502. }
  503. return $this->successJson('ok', $set);
  504. }
  505. $data = request()->input('term_of_validity');
  506. if ($data) {
  507. $site = SystemSetting::settingSave($data, 'basicsetting', 'basic_setting');
  508. if ($site) {
  509. return $this->successJson('成功', '');
  510. } else {
  511. return $this->errorJson('失败', '');
  512. }
  513. }
  514. }
  515. }