TenantService.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. package cn.cslg.permission.service;
  2. import cn.cslg.permission.common.model.vo.*;
  3. import cn.cslg.permission.common.utils.*;
  4. import cn.cslg.permission.common.utils.SecurityUtils.SecurityUtils;
  5. import cn.cslg.permission.common.utils.message.MessageUtils;
  6. import cn.cslg.permission.domain.*;
  7. import cn.cslg.permission.domain.sys.SysDictItem;
  8. import cn.cslg.permission.mapper.AssoTenantVipTypeFunctionMapper;
  9. import cn.cslg.permission.mapper.SysDictItemMapper;
  10. import cn.cslg.permission.mapper.TenantEntityMapper;
  11. import cn.cslg.permission.service.associate.PersonRoleService;
  12. import cn.cslg.permission.service.associate.RoleFunctionDataService;
  13. import cn.dev33.satoken.stp.StpUtil;
  14. import cn.hutool.crypto.SecureUtil;
  15. import cn.hutool.extra.mail.MailUtil;
  16. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  17. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  18. import com.baomidou.mybatisplus.core.metadata.IPage;
  19. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  20. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  21. import io.swagger.v3.oas.models.security.SecurityScheme;
  22. import lombok.RequiredArgsConstructor;
  23. import lombok.extern.slf4j.Slf4j;
  24. import org.springframework.context.annotation.Lazy;
  25. import org.springframework.stereotype.Service;
  26. import org.springframework.transaction.annotation.Transactional;
  27. import org.springframework.transaction.interceptor.TransactionAspectSupport;
  28. import java.util.*;
  29. import java.util.stream.Collectors;
  30. /**
  31. * @author 沈永艺
  32. * @date 2022-8-2
  33. * @description 租户类 Service 层
  34. */
  35. @Slf4j
  36. @Service
  37. @RequiredArgsConstructor(onConstructor_ = {@Lazy})
  38. public class TenantService extends ServiceImpl<TenantEntityMapper, Tenant> {
  39. private final PersonnelService personnelService;
  40. private final DepartmentService departmentService;
  41. private final RoleFunctionDataService roleFunctionDataService;
  42. private final PersonRoleService personRoleService;
  43. private final DeleteService deleteService;
  44. private final CacheUtils cacheUtils;
  45. private final AssoTenantVipTypeFunctionMapper assoTenantVipTypeFunctionMapper; //租户会员类型id和功能的关联表的Mapper层装配
  46. private final ClientService clientService;
  47. private final TenantService tenantService;
  48. private final InvitationService invitationService;
  49. private final LoginUtils loginUtils;
  50. private final RoleService roleService;
  51. private final SysDictItemMapper sysDictItemMapper;
  52. private final MessageUtils mailUtils;
  53. @Transactional(rollbackFor = Exception.class)
  54. public Integer addTenant(TenantVO tenantVO) {
  55. log.info("开始处理【新增租户】的业务,参数为:{}", tenantVO);
  56. Personnel personnel = new Personnel();
  57. //检查管理员账号是否已存在
  58. LambdaQueryWrapper<Personnel> queryWrapper = new LambdaQueryWrapper<>();
  59. queryWrapper.eq(Personnel::getPersonnelUserName, tenantVO.getUsername());
  60. List<Personnel> personnelList = personnelService.list(queryWrapper);
  61. if (personnelList.size() != 0) {
  62. return -1;
  63. }
  64. //租户表保存租户信息
  65. Tenant tenant = new Tenant();
  66. tenant
  67. .setTenantName(tenantVO.getName())
  68. .setTenantAddress(tenantVO.getAddress())
  69. .setTenantContacts(tenantVO.getContacts())
  70. .setTenantEmail(tenantVO.getEmail())
  71. .setTenantDescription((tenantVO.getDescribe()))
  72. .setTenantQuota((tenantVO.getNumber()))
  73. .setTenantStatus(tenantVO.getState())
  74. .setTenantType(tenantVO.getType())
  75. .setTenantVipType(tenantVO.getTenantVipType());
  76. if (tenantVO.getAddType() == null) {
  77. tenant.setCreateUser(StpUtil.getLoginIdAsInt());
  78. }
  79. //数据入租户表
  80. boolean suc = tenant.insert();
  81. if (suc) {
  82. //更新客户表数据
  83. if (tenantVO.getClientId() != null && tenantVO.getClientId() > 0) {
  84. Client client = clientService.getById(tenantVO.getClientId());
  85. client.setTenantId(tenant.getId());
  86. client.updateById();
  87. }
  88. //更新人员表数据,保存管理员用户
  89. PersonnelVO personnelVO1 = new PersonnelVO();
  90. personnelVO1
  91. .setUsername(tenantVO.getUsername())
  92. .setName(tenantVO.getContacts())
  93. .setEmail(tenantVO.getEmail())
  94. .setState(tenantVO.getState())
  95. .setPassword(tenantVO.getPassword())
  96. .setTenant(tenant.getId())
  97. .setAddType(1);
  98. personnel = personnelService.addPersonnel(personnelVO1);
  99. tenant.setPersonnelId(personnel.getId());
  100. tenant.updateById();
  101. }
  102. //角色功能权限关联表,角色表保存信息
  103. //根据租户会员类型查询功能权限
  104. Integer tenantVipType = tenantVO.getTenantVipType();
  105. List<AssoTenantVipTypeAndFunctionVO> assoTenantVipTypeAndFunctionVOS = assoTenantVipTypeFunctionMapper.selectByTenantVipTypeId(tenantVipType);
  106. List<List<Integer>> functions = new ArrayList<>();
  107. for (AssoTenantVipTypeAndFunctionVO assoTenantVipTypeAndFunctionVO : assoTenantVipTypeAndFunctionVOS) {
  108. String functionModifyPath = assoTenantVipTypeAndFunctionVO.getFunctionModifyPath();
  109. //将以逗号分隔的功能组件树字符串路径转换为Integer集合
  110. List<Integer> function = Arrays.stream(functionModifyPath.split(",")).map(Integer::parseInt).collect(Collectors.toList());
  111. functions.add(function);
  112. }
  113. List<RoleVO.Permission> permissions = new ArrayList<>();
  114. List<Integer> ids = new ArrayList<>(); //作为判断是否有重复functionId的标识
  115. functions.forEach(item -> {
  116. if (item.size() > 1) {
  117. //从第二个开始遍历
  118. for (int i = 1; i < item.size(); i++) {
  119. if (!ids.contains(item.get(i))) {
  120. ids.add(item.get(i));
  121. RoleVO.Permission permission = new RoleVO.Permission();
  122. DataVO dataVO = new DataVO();
  123. dataVO.setId(0);
  124. permission.setData(dataVO);
  125. permission.setFunctionId(item.get(i));
  126. permissions.add(permission);
  127. }
  128. }
  129. }
  130. }
  131. );
  132. //数据入角色功能数据权限关联表
  133. RoleVO roleVO = new RoleVO();
  134. roleVO.setTenant(tenant.getId());
  135. roleVO.setName(tenantVO.getName() + "管理员");
  136. roleVO.setRemark("管理租户下所拥有的功能");
  137. roleVO.setPermissionData(permissions);
  138. //数据入角色表
  139. Role role = new Role();
  140. role
  141. .setRoleName(roleVO.getName())
  142. .setRoleDescription(roleVO.getRemark())
  143. .setTenantId(roleVO.getTenant())
  144. .setRoleType(2);
  145. role.insert();
  146. //数据入角色表后拿到角色id,装载角色id
  147. roleVO.setId(role.getId());
  148. //数据入角色功能数据权限关联表
  149. roleFunctionDataService.add(roleVO);
  150. //数据入角色人员关联表
  151. List<Integer> roles = new ArrayList<>();
  152. roles.add(role.getId());
  153. personRoleService.addAssociatePerRole(roles, personnel.getId());
  154. return tenant.getId();
  155. }
  156. @Transactional(rollbackFor = Exception.class)
  157. public void deleteTenant(TenantVO tenantVO) {
  158. log.info("开始处理【删除租户】的业务,参数为:{}", tenantVO.getId());
  159. try {
  160. Tenant tenant = new Tenant();
  161. Integer tenantId = tenantVO.getId();
  162. tenant.setId(tenantId);
  163. //根据id删除租户
  164. tenant.deleteById();
  165. //删除关联数据
  166. UpdateWrapper<Client> wrapper = new UpdateWrapper<>();
  167. wrapper.set("TENANT_ID", null).eq("TENANT_ID", tenant.getId());
  168. //客户表更新数据
  169. clientService.update(wrapper);
  170. //删除和租户有关的所有关联表数据
  171. deleteService.deleteTenantAsso(tenantId);
  172. } catch (Exception e) {
  173. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  174. e.printStackTrace();
  175. }
  176. }
  177. @Transactional(rollbackFor = Exception.class)
  178. public void updateTenant(TenantVO tenantVO) {
  179. log.info("开始处理【修改租户】的业务,参数为:{}", tenantVO);
  180. try {
  181. //修改租户
  182. Tenant tenant = new Tenant();
  183. tenant.setTenantName(tenantVO.getName())
  184. .setTenantAddress(tenantVO.getAddress())
  185. .setTenantContacts(tenantVO.getContacts())
  186. .setTenantEmail(tenantVO.getEmail())
  187. .setTenantDescription((tenantVO.getDescribe()))
  188. .setTenantQuota((tenantVO.getNumber()))
  189. .setTenantStatus(tenantVO.getState())
  190. .setTenantType(tenantVO.getType())
  191. .setTenantVipType(tenantVO.getTenantVipType())
  192. .setPersonnelId(tenantVO.getPersonnelId())
  193. .setId(tenantVO.getId());
  194. tenant.updateById();
  195. //修改人员
  196. PersonnelVO personnelVO1 = new PersonnelVO();
  197. personnelVO1.setUsername(tenantVO.getUsername());
  198. personnelVO1.setPassword(tenantVO.getPassword());
  199. personnelVO1.setId(tenant.getPersonnelId());
  200. personnelService.updatePersonnel(personnelVO1);
  201. //修改关联客户
  202. //更新客户
  203. if (tenantVO.getClientId() != null && tenantVO.getClientId() > 0) {
  204. UpdateWrapper<Client> wrapper = new UpdateWrapper<>();
  205. wrapper.set("TENANT_ID", null).eq("TENANT_ID", tenant.getId());
  206. clientService.update(wrapper);
  207. Client client = clientService.getById(tenantVO.getClientId());
  208. client.setTenantId(tenant.getId());
  209. client.updateById();
  210. }
  211. //更新部门
  212. LambdaQueryWrapper<Department> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  213. lambdaQueryWrapper
  214. .eq(Department::getTenantId, tenant.getId());
  215. List<Department> tenantIds = departmentService.list(lambdaQueryWrapper);
  216. tenantIds.forEach(item -> item.setTenantName(tenantVO.getName()));
  217. departmentService.updateBatchById(tenantIds);
  218. } catch (Exception e) {
  219. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  220. e.printStackTrace();
  221. }
  222. }
  223. public String getTenantList() {
  224. LambdaQueryWrapper<Tenant> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  225. //根据租户状态(1启用0停用)查询启用的租户列表
  226. lambdaQueryWrapper.eq(Tenant::getTenantStatus, 1);
  227. SecurityUtils.startDataScope("/admin/client/check");
  228. List<Tenant> tenantPeople = this.list(lambdaQueryWrapper);
  229. return Response.success(setTenantToVO(tenantPeople));
  230. }
  231. public String queryPageList(TenantVO tenantVO) {
  232. LambdaQueryWrapper<Tenant> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  233. //根据租户名称或是租户联系地址或是租户描述模糊查询租户列表
  234. lambdaQueryWrapper.and((wrapper) -> wrapper.like(Tenant::getTenantName, tenantVO.getName())
  235. .or()
  236. .like(Tenant::getTenantAddress, tenantVO.getName())
  237. .or()
  238. .like(Tenant::getTenantDescription, tenantVO.getName()));
  239. SecurityUtils.startDataScope("/admin/client/check");
  240. List<Tenant> tenantPeople = this.page(new Page<>(tenantVO.getCurrent(), tenantVO.getSize()), lambdaQueryWrapper).getRecords();
  241. SecurityUtils.startDataScope("/admin/client/check");
  242. long count = this.count(lambdaQueryWrapper);
  243. return Response.success(setTenantToVO(tenantPeople), DataUtils.setPageColumn(tenantVO.getSize(), tenantVO.getCurrent(), Math.toIntExact(count)));
  244. }
  245. public IPage<Tenant> getTenants(Integer tenantId, String tenantName, Integer current, Integer size) {
  246. IPage<Tenant> tenants;
  247. Tenant tenant = tenantService.getById(tenantId);
  248. List<Integer> ids = new ArrayList<>();
  249. ids.add(tenantId);
  250. //当租户类型为服务机构时,获得该租户所有客户的租户
  251. if (tenant.getTenantType().equals("1")) {
  252. List<Integer> temIds = clientService.queryTenantClients(tenantId);
  253. ids.addAll(temIds);
  254. }
  255. LambdaQueryWrapper<Tenant> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  256. //根据租户id获得客户列表
  257. lambdaQueryWrapper.in(Tenant::getId, ids)
  258. .like(Tenant::getTenantName, tenantName)
  259. .eq(Tenant::getTenantStatus, 1);
  260. tenants = this.page(new Page<>(current, size), lambdaQueryWrapper);
  261. return tenants;
  262. }
  263. private Object setTenantToVO(List<Tenant> tenantList) {
  264. List<TenantVO> tenantVOs = new ArrayList<>();
  265. for (Tenant tenant : tenantList) {
  266. TenantVO tenantVO = new TenantVO();
  267. Integer personnelId = tenant.getPersonnelId();
  268. Personnel personnel = personnelService.getById(personnelId);
  269. String personnelUserName = "";
  270. if (personnel != null) {
  271. personnelUserName = personnel.getPersonnelUserName();
  272. }
  273. tenantVO
  274. .setId(tenant.getId())
  275. .setAddress(tenant.getTenantAddress())
  276. .setName(tenant.getTenantName())
  277. .setContacts(tenant.getTenantContacts())
  278. .setEmail(tenant.getTenantEmail())
  279. .setDescribe(tenant.getTenantDescription())
  280. .setNumber(tenant.getTenantQuota())
  281. .setState(tenant.getTenantStatus())
  282. .setType(tenant.getTenantType())
  283. .setTenantVipType(tenant.getTenantVipType())
  284. .setUsername(personnelUserName)
  285. .setPersonnelId(tenant.getPersonnelId());
  286. // .setFunction(lst)
  287. // .setFunctionList(tenantFunctionService.getFunction(tenant.getId()));
  288. tenantVOs.add(tenantVO);
  289. }
  290. return tenantVOs;
  291. }
  292. @Transactional(rollbackFor = Exception.class)
  293. public void addByInvitation(TenantVO tenantVo) {
  294. //根据邀请码查询是否存在
  295. LambdaQueryWrapper<Invitation> wrapper = new LambdaQueryWrapper<>();
  296. wrapper.eq(Invitation::getInvitation, tenantVo.getInvitation());
  297. List<Invitation> invitations = invitationService.list(wrapper);
  298. if (invitations == null || invitations.size() == 0) {
  299. ThrowException.throwXiaoShiException("邀请码不存在");
  300. }
  301. Invitation invitation = invitations.get(0);
  302. if (invitation.getIsInvalid().equals(1)) {
  303. ThrowException.throwXiaoShiException("邀请码已被使用");
  304. }
  305. tenantVo.setTenantVipType(invitation.getVipType());
  306. tenantVo.setNumber(1);
  307. tenantVo.setType(0 + "");
  308. tenantVo.setAddType(1);
  309. tenantVo.setState(1);
  310. tenantVo.setName(invitation.getName());
  311. //如果联系人信息没有传来,就使用邀请码中的联系人信息
  312. if (tenantVo.getContacts() == null || tenantVo.getContacts().equals("")) {
  313. tenantVo.setContacts(invitation.getContacts());
  314. }
  315. tenantVo.setUsername(invitation.getEmail());
  316. //如果联系地址信息没有传来,就使用邀请码中的联系地址信息
  317. if (tenantVo.getAddress() == null || tenantVo.getAddress().equals("")) {
  318. tenantVo.setAddress(invitation.getAddress());
  319. }
  320. //租户id
  321. Integer tenantId = invitation.getTenant();
  322. if (tenantId != null) {
  323. //根据租户id获得租户管理员id
  324. LambdaQueryWrapper<Role> wrapper1 = new LambdaQueryWrapper<>();
  325. wrapper1.eq(Role::getTenantId, invitation.getTenant())
  326. .eq(Role::getRoleType, 2);
  327. List<Role> roles = roleService.list(wrapper1);
  328. if (roles.size() == 0) {
  329. ThrowException.throwXiaoShiException("租户已创建,但未有租户管理员角色");
  330. }
  331. //保存管理员用户
  332. PersonnelVO personnelVO1 = new PersonnelVO();
  333. personnelVO1
  334. .setUsername(tenantVo.getUsername())
  335. .setName(tenantVo.getContacts())
  336. .setEmail(tenantVo.getEmail())
  337. .setState(tenantVo.getState())
  338. .setPassword(tenantVo.getPassword())
  339. .setTenant(tenantId)
  340. .setAddType(1);
  341. Personnel personnel = personnelService.addPersonnel(personnelVO1);
  342. invitation.setPersonnelId(personnel.getId());
  343. Role role = roles.get(0);
  344. List<Integer> temrole = new ArrayList<>();
  345. temrole.add(role.getId());
  346. personRoleService.addAssociatePerRole(temrole, personnel.getId());
  347. } else {
  348. tenantId = this.addTenant2(tenantVo, invitation);
  349. if (tenantId < 0) {
  350. ThrowException.throwXiaoShiException("人员的账号已存在");
  351. }
  352. //查找同公司的激活码
  353. invitation.setIsInvalid(1);
  354. //邀请码表更新信息
  355. invitation.updateById();
  356. }
  357. //查找同公司的激活码
  358. invitation.setIsInvalid(1);
  359. //邀请码表更新信息
  360. invitation.updateById();
  361. //更新所有该公司的激活码的租户id
  362. UpdateWrapper<Invitation> updateWrapper = new UpdateWrapper<>();
  363. updateWrapper.eq("COMPANY_NAME", invitation.getCompanyName()).set("TENANT", tenantId);
  364. invitationService.update(null, updateWrapper);
  365. }
  366. @Transactional(rollbackFor = Exception.class)
  367. public void addByInvitation2(TenantVO tenantVo) {
  368. //根据验证码查询是否存在
  369. LambdaQueryWrapper<Invitation> wrapper = new LambdaQueryWrapper<>();
  370. wrapper.eq(Invitation::getInvitation, tenantVo.getInvitation());
  371. List<Invitation> invitations = invitationService.list(wrapper);
  372. if (invitations == null || invitations.size() == 0) {
  373. ThrowException.throwXiaoShiException("邀请码不存在");
  374. }
  375. Invitation invitation = invitations.get(0);
  376. if (invitation.getIsInvalid().equals(1)) {
  377. ThrowException.throwXiaoShiException("邀请码已被使用");
  378. }
  379. //保存管理员用户
  380. Integer personId = invitation.getPersonnelId();
  381. if (personId == null) {
  382. ThrowException.throwXiaoShiException("此邀请码初始数据有误,请联系管理员");
  383. }
  384. //根据人员id获得人员信息
  385. Personnel personnel = personnelService.getById(personId);
  386. personnel.setPersonnelPassword(SecureUtil.md5(tenantVo.getPassword()));
  387. personnel.setPersonnelStatus(1);
  388. personnel.updateById();
  389. //邀请码表更新信息
  390. invitation.setIsInvalid(1);
  391. invitation.updateById();
  392. }
  393. @Transactional(rollbackFor = Exception.class)
  394. public void addByInvitation3(TenantVO tenantVo) {
  395. log.info("开始处理【根据邀请码添加租户】的业务,参数为:{}", tenantVo);
  396. //检查邀请码是否存在
  397. LambdaQueryWrapper<Invitation> wrapper = new LambdaQueryWrapper<>();
  398. wrapper.eq(Invitation::getInvitation, tenantVo.getInvitation());
  399. List<Invitation> invitations = invitationService.list(wrapper);
  400. if (invitations == null || invitations.size() == 0) {
  401. ThrowException.throwXiaoShiException("邀请码不存在");
  402. }
  403. //检查邀请码是否有效(1无效 0有效)
  404. Invitation invitation = invitations.get(0);
  405. if (invitation.getIsInvalid().equals(1)) {
  406. ThrowException.throwXiaoShiException("邀请码已被使用");
  407. }
  408. //邀请码表更新信息
  409. //地址
  410. invitation.setAddress(tenantVo.getAddress());
  411. //电话
  412. invitation.setPhoneNumber(tenantVo.getPhoneNumber());
  413. //联系人
  414. invitation.setContacts(tenantVo.getContacts());
  415. //邮箱
  416. invitation.setEmail(tenantVo.getEmail());
  417. //租户名称
  418. invitation.setName(tenantVo.getName());
  419. invitation.setIsInvalid(1);
  420. invitation.updateById();
  421. //从字典表里获得配置联系人数
  422. LambdaQueryWrapper<SysDictItem> wrapper1 = new LambdaQueryWrapper<>();
  423. wrapper1.eq(SysDictItem::getDictParentKey, "ADMIN_EMAIL");
  424. List<SysDictItem> sysDictItems = sysDictItemMapper.selectList(wrapper1);
  425. sysDictItems.forEach(item -> {
  426. Map<String, Object> map = new LinkedHashMap<>();
  427. map.put("title", "激活码审核通知");
  428. map.put("template", "mail/adminEmail.html");
  429. map.put("value1", item.getDictChildLabel());
  430. map.put("img", "/logo.png");
  431. map.put("email", item.getDictChildValue());
  432. map.put("value2", invitation.getInvitation());
  433. map.put("value3", invitation.getName());
  434. map.put("value4", invitation.getContacts());
  435. map.put("value5", invitation.getEmail());
  436. map.put("value6", invitation.getPhoneNumber());
  437. map.put("value7", invitation.getAddress());
  438. mailUtils.sendEmailMessage(map);
  439. });
  440. }
  441. public Invitation queryByInvitation(String invitation) {
  442. log.info("开始处理【根据邀请码查询租户】的业务,参数为:{}", invitation);
  443. LambdaQueryWrapper<Invitation> wrapper = new LambdaQueryWrapper<>();
  444. wrapper.eq(Invitation::getInvitation, invitation);
  445. List<Invitation> invitations = invitationService.list(wrapper);
  446. if (invitations == null || invitations.size() == 0) {
  447. ThrowException.throwXiaoShiException("邀请码不存在");
  448. }
  449. return invitations.get(0);
  450. }
  451. @Transactional(rollbackFor = Exception.class)
  452. public Integer addTenant2(TenantVO tenantVO, Invitation invitation) {
  453. Personnel personnel = new Personnel();
  454. LambdaQueryWrapper<Personnel> queryWrapper = new LambdaQueryWrapper<>();
  455. queryWrapper.eq(Personnel::getPersonnelUserName, tenantVO.getUsername());
  456. List<Personnel> personnelList = personnelService.list(queryWrapper);
  457. if (personnelList.size() != 0) {
  458. return -1;
  459. }
  460. //租户表保存租户信息
  461. Tenant tenant = new Tenant();
  462. tenant
  463. .setTenantName(tenantVO.getName())
  464. .setTenantAddress(tenantVO.getAddress())
  465. .setTenantContacts(tenantVO.getContacts())
  466. .setTenantEmail(tenantVO.getEmail())
  467. .setTenantDescription((tenantVO.getDescribe()))
  468. .setTenantQuota((tenantVO.getNumber()))
  469. .setTenantStatus(tenantVO.getState())
  470. .setTenantType(tenantVO.getType())
  471. .setTenantVipType(tenantVO.getTenantVipType());
  472. if (tenantVO.getAddType() == null) {
  473. tenant.setCreateUser(StpUtil.getLoginIdAsInt());
  474. }
  475. boolean suc = tenant.insert();
  476. if (suc) {
  477. //更新客户
  478. if (tenantVO.getClientId() != null && tenantVO.getClientId() > 0) {
  479. Client client = clientService.getById(tenantVO.getClientId());
  480. client.setTenantId(tenant.getId());
  481. client.updateById();
  482. }
  483. //保存管理员用户
  484. PersonnelVO personnelVO1 = new PersonnelVO();
  485. personnelVO1
  486. .setUsername(tenantVO.getUsername())
  487. .setName(tenantVO.getContacts())
  488. .setEmail(tenantVO.getEmail())
  489. .setState(tenantVO.getState())
  490. .setPassword(tenantVO.getPassword())
  491. .setTenant(tenant.getId())
  492. .setAddType(1);
  493. personnel = personnelService.addPersonnel(personnelVO1);
  494. invitation.setPersonnelId(personnel.getId());
  495. tenant.setPersonnelId(personnel.getId());
  496. tenant.updateById();
  497. }
  498. //角色功能权限关联表,角色表保存信息
  499. //根据租户会员类型查询功能权限
  500. Integer tenantVipType = tenantVO.getTenantVipType();
  501. List<AssoTenantVipTypeAndFunctionVO> assoTenantVipTypeAndFunctionVOS = assoTenantVipTypeFunctionMapper.selectByTenantVipTypeId(tenantVipType);
  502. List<List<Integer>> functions = new ArrayList<>();
  503. for (AssoTenantVipTypeAndFunctionVO assoTenantVipTypeAndFunctionVO : assoTenantVipTypeAndFunctionVOS) {
  504. String functionModifyPath = assoTenantVipTypeAndFunctionVO.getFunctionModifyPath();
  505. //将以逗号分隔的功能组件树字符串路径转换为Integer集合
  506. List<Integer> function = Arrays.stream(functionModifyPath.split(",")).map(Integer::parseInt).collect(Collectors.toList());
  507. functions.add(function);
  508. }
  509. List<RoleVO.Permission> permissions = new ArrayList<>();
  510. List<Integer> ids = new ArrayList<>(); //作为判断是否有重复functionId的标识
  511. functions.forEach(item -> {
  512. if (item.size() > 1) {
  513. //从第二个开始遍历
  514. for (int i = 1; i < item.size(); i++) {
  515. if (!ids.contains(item.get(i))) {
  516. ids.add(item.get(i));
  517. RoleVO.Permission permission = new RoleVO.Permission();
  518. DataVO dataVO = new DataVO();
  519. dataVO.setId(0);
  520. permission.setData(dataVO);
  521. permission.setFunctionId(item.get(i));
  522. permissions.add(permission);
  523. }
  524. }
  525. }
  526. }
  527. );
  528. RoleVO roleVO = new RoleVO();
  529. roleVO.setTenant(tenant.getId());
  530. roleVO.setName(tenantVO.getName() + "管理员");
  531. roleVO.setRemark("管理租户下所拥有的功能");
  532. roleVO.setPermissionData(permissions);
  533. Role role = new Role();
  534. role
  535. .setRoleName(roleVO.getName())
  536. .setRoleDescription(roleVO.getRemark())
  537. .setTenantId(roleVO.getTenant())
  538. .setRoleType(2);
  539. role.insert();
  540. roleVO.setId(role.getId());
  541. roleFunctionDataService.add(roleVO);
  542. List<Integer> roles = new ArrayList<>();
  543. roles.add(role.getId());
  544. personRoleService.addAssociatePerRole(roles, personnel.getId());
  545. return tenant.getId();
  546. }
  547. public List<SysDictItem> getAdminEmailPersons() {
  548. LambdaQueryWrapper<SysDictItem> wrapper1 = new LambdaQueryWrapper<>();
  549. wrapper1.eq(SysDictItem::getDictParentKey, "ADMIN_EMAIL");
  550. List<SysDictItem> sysDictItems = sysDictItemMapper.selectList(wrapper1);
  551. return sysDictItems;
  552. }
  553. }