SiteGroupService.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Niucloud-admin 企业快速开发的saas管理平台
  4. // +----------------------------------------------------------------------
  5. // | 官方网址:https://www.niucloud.com
  6. // +----------------------------------------------------------------------
  7. // | niucloud团队 版权所有 开源版本可自由商用
  8. // +----------------------------------------------------------------------
  9. // | Author: Niucloud Team
  10. // +----------------------------------------------------------------------
  11. namespace app\service\admin\site;
  12. use app\model\site\Site;
  13. use app\model\site\SiteGroup;
  14. use app\service\admin\sys\MenuService;
  15. use app\service\core\addon\CoreAddonService;
  16. use app\service\core\site\CoreSiteService;
  17. use core\base\BaseAdminService;
  18. use core\exception\AdminException;
  19. use core\exception\CommonException;
  20. use think\db\exception\DataNotFoundException;
  21. use think\db\exception\DbException;
  22. use think\db\exception\ModelNotFoundException;
  23. use think\facade\Cache;
  24. /**
  25. * 站点分组服务层
  26. * Class SiteGroupService
  27. * @package app\service\admin\site
  28. */
  29. class SiteGroupService extends BaseAdminService
  30. {
  31. public static $cache_tag_name = 'site_group_cache';
  32. public static $cache_name = 'site_group_menu_ids';
  33. public function __construct()
  34. {
  35. parent::__construct();
  36. $this->model = new SiteGroup();
  37. }
  38. /**
  39. * 站点分组列表
  40. * @param array $where
  41. * @return array
  42. */
  43. public function getPage(array $where = [])
  44. {
  45. $field = 'group_id, group_name, group_desc, app, addon, create_time, update_time';
  46. $search_model = $this->model->withSearch(['keywords'],$where)->field($field)->append(['app_name', 'addon_name'])->order('create_time desc');
  47. return $this->pageQuery($search_model);
  48. }
  49. /**
  50. * 获取站点分组列表
  51. * @param array $where
  52. * @param string $field
  53. * @return array
  54. */
  55. public function getList(array $where = [], $field = 'group_id, group_name, group_desc, app, addon, create_time, update_time')
  56. {
  57. $order = 'create_time desc';
  58. return $this->model->withSearch([ "keywords" ], $where)->field($field)->select()->order($order)->toArray();
  59. }
  60. /**
  61. * 获取所有分组
  62. * @return array
  63. * @throws DataNotFoundException
  64. * @throws DbException
  65. * @throws ModelNotFoundException
  66. */
  67. public function getAll()
  68. {
  69. $field = 'group_id, group_name, group_desc, create_time, update_time, app';
  70. return $this->model->field($field)->select()->toArray();
  71. }
  72. /**
  73. * 分组详情
  74. * @param int $group_id
  75. * @return array
  76. */
  77. public function getInfo(int $group_id)
  78. {
  79. $field = 'group_id, group_name, group_desc, app, addon, create_time, update_time';
  80. return $this->model->where([['group_id', '=', $group_id]])->field($field)->findOrEmpty()->toArray();
  81. }
  82. /**
  83. * 添加站点分组
  84. * @param array $data
  85. * @return mixed
  86. */
  87. public function add(array $data)
  88. {
  89. //判断应用是否全部是有效的已安装应用
  90. $this->checkAddon(array_merge($data['app'], $data['addon']));
  91. $res = $this->model->create($data);
  92. return $res->group_id;
  93. }
  94. /**
  95. * 修改站点分组
  96. * @param int $group_id
  97. * @param array $data
  98. * @return true
  99. */
  100. public function edit(int $group_id, array $data){
  101. $group = $this->model->where([['group_id', '=', $group_id]])->findOrEmpty()->toArray();
  102. //判断应用是否全部是有效的已安装应用
  103. $this->checkAddon(array_merge($data['app'], $data['addon']));
  104. $this->model->update($data, [['group_id', '=', $group_id]]);
  105. //删除缓存
  106. $cache_name = self::$cache_name . $group_id;
  107. Cache::delete($cache_name);
  108. $site_list = (new Site())->field('site_id,initalled_addon')->where([ ['group_id', '=', $group_id] ])->select()->toArray();
  109. if (!empty($site_list)) {
  110. foreach ($site_list as $site) {
  111. if (count(array_diff($data['app'], $group['app'])) || count(array_diff($data['addon'], $group['addon']))) {
  112. $this->siteAddonsChange($site, $group, $data);
  113. }
  114. Cache::tag(CoreSiteService::$cache_tag_name . $site['site_id'])->clear();
  115. }
  116. }
  117. return true;
  118. }
  119. /**
  120. * 站点套餐插件变更后相关站点执行插件初始化
  121. * @param $site_info
  122. * @param $old_group
  123. * @param $new_group
  124. * @return void
  125. */
  126. public function siteAddonsChange($site_info, $old_group, $new_group) {
  127. $initalled_addon = $site_info['initalled_addon'];
  128. if (empty($initalled_addon)) {
  129. $initalled_addon = array_merge($old_group['app'], $old_group['addon']);
  130. }
  131. //添加站点成功事件
  132. event("AddSiteAfter", [ 'site_id' => $site_info['site_id'], 'main_app' => array_diff($new_group['app'], $initalled_addon) , 'site_addons' => array_diff($new_group['addon'], $initalled_addon) ]);
  133. $initalled_addon = array_values(array_unique(array_merge($initalled_addon, $new_group['app'], $new_group['addon'])));
  134. (new Site())->update(['initalled_addon' => $initalled_addon], [ ['site_id', '=', $site_info['site_id'] ] ]);
  135. }
  136. public function checkAddon($group_roles){
  137. $install_addon_list = (new CoreAddonService())->getInstallAddonList();
  138. $install_addon_keys = array_column($install_addon_list, 'key');
  139. if(count(array_intersect($install_addon_keys, $group_roles)) != count($group_roles)) throw new AdminException('SITE_GROUP_APP_NOT_EXIST');
  140. return true;
  141. }
  142. /**
  143. * 删除分组
  144. * @param int $group_id
  145. * @return bool
  146. * @throws DbException
  147. */
  148. public function del(int $group_id)
  149. {
  150. $count = (new Site())->where([['group_id', '=', $group_id]])->count();
  151. if($count > 0)
  152. {
  153. throw new CommonException('SITE_GROUP_IS_EXIST');
  154. }
  155. $res = $this->model->where([['group_id', '=', $group_id]])->delete();
  156. $cache_name = self::$cache_name . $group_id;
  157. Cache::delete($cache_name);
  158. return $res;
  159. }
  160. /**
  161. * 通过站点分组获取站点包含的权限和应用
  162. * @param $group_id
  163. * @return void
  164. */
  165. public function getGroupAddon($group_id){
  166. $cache_name = self::$cache_name . $group_id;
  167. return cache_remember(
  168. $cache_name,
  169. function () use ($group_id) {
  170. $group = $this->model->findOrEmpty($group_id);
  171. $addon = [];
  172. if (!$group->isEmpty()) {
  173. $addon = array_merge([ $group['app'] ], $group['addon']);
  174. }
  175. return $addon;
  176. },
  177. [MenuService::$cache_tag_name,self::$cache_tag_name]
  178. );
  179. }
  180. /**
  181. * 创建所有权限的菜单
  182. */
  183. public function addAllMenuGroup()
  184. {
  185. // $menus = (new SysMenu())->where([['app_type', '=', 'site']])->column("menu_key");
  186. $data = [
  187. 'group_name' => "默认套餐",
  188. 'group_desc' => '',
  189. 'app' => '',
  190. 'addon' => []
  191. ];
  192. return $this->add($data);
  193. }
  194. }