/* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.springblade.modules.system.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.yomahub.liteflow.core.FlowExecutor; import com.yomahub.liteflow.flow.LiteflowResponse; import lombok.AllArgsConstructor; import org.springblade.core.cache.utils.CacheUtil; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.tenant.TenantId; import org.springblade.core.tool.constant.BladeConstant; import org.springblade.core.tool.jackson.JsonUtil; import org.springblade.core.tool.support.Kv; import org.springblade.core.tool.utils.DesUtil; import org.springblade.core.tool.utils.Func; import org.springblade.modules.system.entity.*; import org.springblade.modules.system.mapper.TenantMapper; import org.springblade.modules.system.rule.TenantContext; import org.springblade.modules.system.service.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import static org.springblade.common.constant.TenantConstant.DES_KEY; import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; /** * 服务实现类 * * @author Chill */ @Service @AllArgsConstructor public class TenantServiceImpl extends BaseServiceImpl implements ITenantService { private final TenantId tenantIdGenerator; private final IRoleService roleService; private final IMenuService menuService; private final IDeptService deptService; private final IPostService postService; private final IRoleMenuService roleMenuService; private final IDictBizService dictBizService; private final IUserService userService; private final FlowExecutor flowExecutor; @Override public IPage selectTenantPage(IPage page, Tenant tenant) { return page.setRecords(baseMapper.selectTenantPage(page, tenant)); } @Override public Tenant getByTenantId(String tenantId) { return getOne(Wrappers.query().lambda().eq(Tenant::getTenantId, tenantId)); } @Override @Transactional(rollbackFor = Exception.class) public boolean submitTenant(Tenant tenant) { if (Func.isEmpty(tenant.getId())) { TenantContext tenantContext = new TenantContext(); tenantContext.setTenantIdGenerator(tenantIdGenerator); tenantContext.setTenant(tenant); tenantContext.setMenuService(menuService); tenantContext.setDictBizService(dictBizService); tenantContext.setTenantService(this); LiteflowResponse resp = flowExecutor.execute2Resp("tenantChain", null, tenantContext); if (resp.isSuccess()) { Role role = tenantContext.getRole(); roleService.save(role); Long roleId = role.getId(); List roleMenuList = tenantContext.getRoleMenuList(); roleMenuList.forEach(roleMenu -> roleMenu.setRoleId(roleId)); roleMenuService.saveBatch(roleMenuList); Dept dept = tenantContext.getDept(); deptService.save(dept); Post post = tenantContext.getPost(); postService.save(post); List dictBizList = tenantContext.getDictBizList(); dictBizService.saveBatch(dictBizList); User user = tenantContext.getUser(); user.setRoleId(String.valueOf(role.getId())); user.setDeptId(String.valueOf(dept.getId())); user.setPostId(String.valueOf(post.getId())); userService.submit(user); } else { throw new ServiceException("租户业务数据构建异常"); } } CacheUtil.clear(SYS_CACHE, tenant.getTenantId()); return super.saveOrUpdate(tenant); } @Override @Transactional(rollbackFor = Exception.class) public boolean removeTenant(List ids) { List tenantIds = this.list(Wrappers.query().lambda().in(Tenant::getId, ids)) .stream().map(tenant -> Func.toStr(tenant.getTenantId())).distinct().collect(Collectors.toList()); CacheUtil.clear(SYS_CACHE, tenantIds); if (tenantIds.contains(BladeConstant.ADMIN_TENANT_ID)) { throw new ServiceException("不可删除管理租户!"); } boolean tenantTemp = this.deleteLogic(ids); boolean userTemp = userService.remove(Wrappers.query().lambda().in(User::getTenantId, tenantIds)); return tenantTemp && userTemp; } @Override public boolean setting(Integer accountNumber, Date expireTime, String ids) { List tenantIds = this.list(Wrappers.query().lambda().in(Tenant::getId, ids)) .stream().map(tenant -> Func.toStr(tenant.getTenantId())).distinct().collect(Collectors.toList()); CacheUtil.clear(SYS_CACHE, tenantIds); Func.toLongList(ids).forEach(id -> { Kv kv = Kv.create().set("accountNumber", accountNumber).set("expireTime", expireTime).set("id", id); String licenseKey = DesUtil.encryptToHex(JsonUtil.toJson(kv), DES_KEY); update( Wrappers.update().lambda() .set(Tenant::getAccountNumber, accountNumber) .set(Tenant::getExpireTime, expireTime) .set(Tenant::getLicenseKey, licenseKey) .eq(Tenant::getId, id) ); }); return true; } }