TenantService.java 28 KB

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