fix 添加租户

V0.5.x
jay 2024-06-14 18:19:36 +08:00
parent 2d71b0126b
commit b5db785c53
10 changed files with 107 additions and 11 deletions

View File

@ -67,4 +67,7 @@ public interface ISysMenuData extends ICommonData<SysMenu, Long> {
boolean checkMenuNameUnique(SysMenu menu); boolean checkMenuNameUnique(SysMenu menu);
List<Long> selectParentIdByMenuIds(List<Long> menuIds);
List<Long> findByMenuIdListAndNotParentIdList(List<Long> menuIds, List<Long> parentIds);
} }

View File

@ -35,8 +35,11 @@ import cc.iotkit.data.model.TbSysMenu;
import cc.iotkit.data.system.ISysMenuData; import cc.iotkit.data.system.ISysMenuData;
import cc.iotkit.data.util.PredicateBuilder; import cc.iotkit.data.util.PredicateBuilder;
import cc.iotkit.model.system.SysMenu; import cc.iotkit.model.system.SysMenu;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.Projections; import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
@ -229,4 +232,18 @@ public class SysMenuDataImpl implements ISysMenuData, IJPACommData<SysMenu, Long
.build()).fetchOne(); .build()).fetchOne();
return Objects.isNull(tbSysMenu); return Objects.isNull(tbSysMenu);
} }
@Override
public List<Long> selectParentIdByMenuIds(List<Long> menuIds) {
return jpaQueryFactory.select(tbSysMenu.parentId).from(tbSysMenu).where(tbSysMenu.id.in(menuIds)).fetch();
}
@Override
public List<Long> findByMenuIdListAndNotParentIdList(List<Long> menuIds, List<Long> parentIds) {
Predicate build = PredicateBuilder.instance()
.and(tbSysMenu.id.in(menuIds))
.and(CollectionUtil.isNotEmpty(parentIds), () -> tbSysMenu.id.notIn(parentIds)).build();
return jpaQueryFactory.select(tbSysMenu.id).from(tbSysMenu).where(build).fetch();
}
} }

View File

@ -23,6 +23,8 @@
package cc.iotkit.data.service; package cc.iotkit.data.service;
import cc.iotkit.common.tenant.dao.TenantAware;
import cc.iotkit.common.tenant.helper.TenantHelper;
import cc.iotkit.common.utils.MapstructUtils; import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.common.utils.StringUtils; import cc.iotkit.common.utils.StringUtils;
import cc.iotkit.data.dao.IJPACommData; import cc.iotkit.data.dao.IJPACommData;
@ -30,7 +32,10 @@ import cc.iotkit.data.dao.SysTenantRepository;
import cc.iotkit.data.model.TbSysTenant; import cc.iotkit.data.model.TbSysTenant;
import cc.iotkit.data.system.ISysTenantData; import cc.iotkit.data.system.ISysTenantData;
import cc.iotkit.data.util.PredicateBuilder; import cc.iotkit.data.util.PredicateBuilder;
import cc.iotkit.model.TenantModel;
import cc.iotkit.model.system.SysTenant; import cc.iotkit.model.system.SysTenant;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -40,6 +45,7 @@ import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
import static cc.iotkit.data.model.QTbSysTenant.tbSysTenant; import static cc.iotkit.data.model.QTbSysTenant.tbSysTenant;
@ -100,4 +106,20 @@ public class SysTenantDataImpl implements ISysTenantData, IJPACommData<SysTenant
.build()).fetchOne(); .build()).fetchOne();
return Objects.isNull(ret); return Objects.isNull(ret);
} }
@Override
public SysTenant save(SysTenant data) {
Long id = data.getId();
Object tbData = MapstructUtils.convert(data, getJpaRepositoryClass());
Optional byId = id == null ? Optional.empty() : getBaseRepository().findById(id);
if (byId.isPresent()) {
Object dbObj = byId.get();
//只更新不为空的字段
BeanUtil.copyProperties(tbData, dbObj, CopyOptions.create().ignoreNullValue());
tbData = dbObj;
}
Object o = getBaseRepository().save(tbData);
return (SysTenant) MapstructUtils.convert(o, getTClass());
}
} }

View File

@ -176,6 +176,22 @@ public class SysMenuController extends BaseController {
menuService.updateMenu(menu); menuService.updateMenu(menu);
} }
/**
*
*
* @param packageId ID
*/
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
@SaCheckPermission("system:menu:query")
@PostMapping(value = "/tenantPackageMenuTreeselect")
public MenuTreeSelectVo tenantPackageMenuTreeselect(@Validated @RequestBody Request<Long> bo) {
List<SysMenuVo> menus = menuService.selectMenuList(LoginHelper.getUserId());
MenuTreeSelectVo selectVo = new MenuTreeSelectVo();
selectVo.setCheckedKeys(menuService.selectMenuListByPackageId(bo.getData()));
selectVo.setMenus(menuService.buildMenuTreeSelect(menus));
return selectVo;
}
/** /**
* *
* *

View File

@ -114,7 +114,7 @@ public class SysTenantController extends BaseController {
if (!tenantService.checkCompanyNameUnique(data)) { if (!tenantService.checkCompanyNameUnique(data)) {
fail("新增租户'" + data.getCompanyName() + "'失败,企业名称已存在"); fail("新增租户'" + data.getCompanyName() + "'失败,企业名称已存在");
} }
tenantService.insertByBo(data); TenantHelper.ignore(()->tenantService.insertByBo(data));
} }
/** /**
@ -131,7 +131,7 @@ public class SysTenantController extends BaseController {
if (!tenantService.checkCompanyNameUnique(data)) { if (!tenantService.checkCompanyNameUnique(data)) {
fail("修改租户'" + data.getCompanyName() + "'失败,公司名称已存在"); fail("修改租户'" + data.getCompanyName() + "'失败,公司名称已存在");
} }
tenantService.updateByBo(data); TenantHelper.ignore(()->tenantService.updateByBo(data)); ;
} }
/** /**

View File

@ -99,15 +99,14 @@ public class SysTenantPackageController extends BaseController {
/** /**
* *
* *
* @param packageId * @param
*/ */
@ApiOperation("获取租户套餐详细信息") @ApiOperation("获取租户套餐详细信息")
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
@SaCheckPermission("system:tenantPackage:query") @SaCheckPermission("system:tenantPackage:query")
@PostMapping("/getInfo") @PostMapping("/getInfo")
public SysTenantPackageVo getInfo(@NotNull(message = "主键不能为空") public SysTenantPackageVo getInfo(@RequestBody @Validated Request<Long> bo) {
@PathVariable Long packageId) { return tenantPackageService.queryById(bo.getData());
return tenantPackageService.queryById(packageId);
} }
/** /**
@ -149,15 +148,13 @@ public class SysTenantPackageController extends BaseController {
/** /**
* *
* *
* @param packageIds
*/ */
@ApiOperation("删除租户套餐") @ApiOperation("删除租户套餐")
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
@SaCheckPermission("system:tenantPackage:remove") @SaCheckPermission("system:tenantPackage:remove")
@Log(title = "租户套餐", businessType = BusinessType.DELETE) @Log(title = "租户套餐", businessType = BusinessType.DELETE)
@PostMapping("/delete") @PostMapping("/delete")
public void remove(@NotEmpty(message = "主键不能为空") public void remove(@RequestBody Request<List<Long>> bo) {
@PathVariable Long[] packageIds) { tenantPackageService.deleteWithValidByIds(bo.getData(), true);
tenantPackageService.deleteWithValidByIds(List.of(packageIds), true);
} }
} }

View File

@ -24,6 +24,7 @@
package cc.iotkit.system.dto.bo; package cc.iotkit.system.dto.bo;
import cc.iotkit.common.api.BaseDto; import cc.iotkit.common.api.BaseDto;
import cc.iotkit.common.utils.DateUtils;
import cc.iotkit.common.validate.AddGroup; import cc.iotkit.common.validate.AddGroup;
import cc.iotkit.common.validate.EditGroup; import cc.iotkit.common.validate.EditGroup;
import cc.iotkit.model.system.SysTenant; import cc.iotkit.model.system.SysTenant;
@ -32,7 +33,9 @@ import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
/** /**
@ -120,6 +123,7 @@ public class SysTenantBo extends BaseDto {
/** /**
* *
*/ */
@DateTimeFormat(pattern = DateUtils.YYYY_MM_DD_HH_MM_SS)
private Date expireTime; private Date expireTime;
/** /**

View File

@ -159,4 +159,6 @@ public interface ISysMenuService {
* @return * @return
*/ */
boolean checkMenuNameUnique(SysMenuBo menu); boolean checkMenuNameUnique(SysMenuBo menu);
List<Long> selectMenuListByPackageId(Long data);
} }

View File

@ -30,23 +30,34 @@ import cc.iotkit.common.utils.MapstructUtils;
import cc.iotkit.common.utils.StreamUtils; import cc.iotkit.common.utils.StreamUtils;
import cc.iotkit.common.utils.StringUtils; import cc.iotkit.common.utils.StringUtils;
import cc.iotkit.common.utils.TreeBuildUtils; import cc.iotkit.common.utils.TreeBuildUtils;
import cc.iotkit.data.dao.SysTenantPackageRepository;
import cc.iotkit.data.system.ISysMenuData; import cc.iotkit.data.system.ISysMenuData;
import cc.iotkit.data.system.ISysRoleData; import cc.iotkit.data.system.ISysRoleData;
import cc.iotkit.data.system.ISysRoleMenuData; import cc.iotkit.data.system.ISysRoleMenuData;
import cc.iotkit.data.system.ISysTenantPackageData;
import cc.iotkit.data.util.PredicateBuilder;
import cc.iotkit.model.system.SysMenu; import cc.iotkit.model.system.SysMenu;
import cc.iotkit.model.system.SysRole; import cc.iotkit.model.system.SysRole;
import cc.iotkit.model.system.SysTenantPackage;
import cc.iotkit.system.dto.bo.SysMenuBo; import cc.iotkit.system.dto.bo.SysMenuBo;
import cc.iotkit.system.dto.vo.MetaVo; import cc.iotkit.system.dto.vo.MetaVo;
import cc.iotkit.system.dto.vo.RouterVo; import cc.iotkit.system.dto.vo.RouterVo;
import cc.iotkit.system.dto.vo.SysMenuVo; import cc.iotkit.system.dto.vo.SysMenuVo;
import cc.iotkit.system.service.ISysMenuService; import cc.iotkit.system.service.ISysMenuService;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.Tree;
import com.querydsl.core.types.Predicate;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
import static cc.iotkit.data.model.QTbSysConfig.tbSysConfig;
import static cc.iotkit.data.model.QTbSysMenu.tbSysMenu;
/** /**
* *
* *
@ -60,6 +71,9 @@ public class SysMenuServiceImpl implements ISysMenuService {
private final ISysRoleData sysRoleData; private final ISysRoleData sysRoleData;
private final ISysRoleMenuData iSysRoleMenuData; private final ISysRoleMenuData iSysRoleMenuData;
private final ISysTenantPackageData iSysTenantPackageData;
/** /**
* *
* *
@ -383,6 +397,23 @@ public class SysMenuServiceImpl implements ISysMenuService {
return sysMenuData.checkMenuNameUnique(bo.to(SysMenu.class)); return sysMenuData.checkMenuNameUnique(bo.to(SysMenu.class));
} }
@Override
public List<Long> selectMenuListByPackageId(Long packageId) {
SysTenantPackage tenantPackage = iSysTenantPackageData.findById(packageId);
List<Long> menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong);
if (CollUtil.isEmpty(menuIds)) {
return List.of();
}
List<Long> parentIds;
if (Objects.equals(tenantPackage.getMenuCheckStrictly(),true)) {
parentIds = sysMenuData.selectParentIdByMenuIds(menuIds);
} else {
parentIds = null;
}
return sysMenuData.findByMenuIdListAndNotParentIdList(menuIds, parentIds);
}
/** /**
* ID * ID
* *

View File

@ -111,7 +111,9 @@ public class SysTenantServiceImpl implements ISysTenantService {
@Override @Override
public void insertByBo(SysTenantBo bo) { public void insertByBo(SysTenantBo bo) {
bo.setTenantId(YitIdHelper.nextId()); long tenantId = YitIdHelper.nextId();
bo.setId(tenantId);
bo.setTenantId(tenantId);
SysTenant sysTenant=sysTenantData.save(bo.to(SysTenant.class)); SysTenant sysTenant=sysTenantData.save(bo.to(SysTenant.class));
// 根据套餐创建角色 // 根据套餐创建角色
Long roleId = createTenantRole(sysTenant.getTenantId(), bo.getPackageId()); Long roleId = createTenantRole(sysTenant.getTenantId(), bo.getPackageId());
@ -131,6 +133,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
SysRoleDept roleDept = new SysRoleDept(); SysRoleDept roleDept = new SysRoleDept();
roleDept.setRoleId(roleId); roleDept.setRoleId(roleId);
roleDept.setDeptId(deptId); roleDept.setDeptId(deptId);
roleDept.setTenantId(tenantId);
sysRoleDeptData.save(roleDept); sysRoleDeptData.save(roleDept);
// 创建系统用户 // 创建系统用户
@ -155,6 +158,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
SysUserRole userRole = new SysUserRole(); SysUserRole userRole = new SysUserRole();
userRole.setUserId(retUser.getId()); userRole.setUserId(retUser.getId());
userRole.setRoleId(roleId); userRole.setRoleId(roleId);
userRole.setTenantId(tenantId);
sysUserRoleData.save(userRole); sysUserRoleData.save(userRole);
Long defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; Long defaultTenantId = TenantConstants.DEFAULT_TENANT_ID;