diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/BatchPermissionCheckReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/BatchPermissionCheckReq.java index 617fdd72..b51f78a9 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/BatchPermissionCheckReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/BatchPermissionCheckReq.java @@ -6,7 +6,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.List; @@ -24,6 +23,13 @@ public class BatchPermissionCheckReq { @NotEmpty(message = "workspaceOUPairs不能为空") private List workspaceOUPairs; - @NotBlank(message = "itemCode不能为空") + /** + * app端的应用code + */ private String itemCode; + + /** + * 端:OMS上的菜单分端维护 + */ + private Set terminals; } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CreateDataObjectReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CreateDataObjectReq.java index cfa1abf7..dc4c2f01 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CreateDataObjectReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CreateDataObjectReq.java @@ -45,6 +45,11 @@ public class CreateDataObjectReq { */ private List attrs; + /** + * 是否过滤工程 0否1是 + */ + private Integer isFilterProject; + /** * 默认规则 */ diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/EditDataObjectReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/EditDataObjectReq.java index becb1985..2c2be87c 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/EditDataObjectReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/EditDataObjectReq.java @@ -55,6 +55,11 @@ public class EditDataObjectReq { @Valid private List dataObjectRuleBOList; + /** + * 是否过滤工程 0否1是 + */ + private Integer isFilterProject; + /** * 排序 (从小到大) */ diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasFeatureResourceReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasFeatureResourceReq.java index 680a86c1..2dbc0bfd 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasFeatureResourceReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasFeatureResourceReq.java @@ -43,6 +43,9 @@ public class PageSaasFeatureResourceReq implements IPageReq { @CriteriaField(field = "authType", operator = Operator.EQ) private Integer authType; + @CriteriaField(field = "featureName", operator = Operator.EQ) + private String featureName; + /** * 资源所属端 */ diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/DataObjectRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/DataObjectRes.java index 721bf230..10616f80 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/DataObjectRes.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/DataObjectRes.java @@ -46,6 +46,11 @@ public class DataObjectRes { */ private List dataObjectRuleBOList; + /** + * 是否过滤工程 0否1是 + */ + private Integer isFilterProject; + /** * 排序 (从小到大) */ diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/TerminalConfigRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/TerminalConfigRes.java index d8c0de8a..fd90e99a 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/TerminalConfigRes.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/TerminalConfigRes.java @@ -65,5 +65,10 @@ public class TerminalConfigRes { * DISABLED,ENABLED */ private String status; + + /** + * 是否允许删除 + */ + private Boolean allowDelete; } } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/TerminalRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/TerminalRes.java index 4c6a2e32..9e45c49d 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/TerminalRes.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/TerminalRes.java @@ -31,4 +31,9 @@ public class TerminalRes { * 是否允许克隆 */ private Boolean allowClone; + + /** + * 是否允许删除 + */ + private Boolean allowDelete; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java index a735c4c9..1cfd394d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java @@ -28,9 +28,10 @@ public enum BizResultCode implements IResultCode { PAGE_CODE_DUPLICATE("100018", "资源元素code重复,重复的code:{}"), PARAM_ERROR("100019", "参数错误"), FEATURE_NAME_EXIST("100020", "菜单组件名字已经存在:{}"), - TERMINAL_EXIST("100021", "新端已经存在:{}"), + TERMINAL_CODE_EXIST("100021", "端code已经存在,请修改"), TERMINAL_NOT_FOUND("100022", "原端不存在:{}"), - FEATURE_CODE_OVER_LENGTH("100023", "组件code不能超过100个字符:{}"); + FEATURE_CODE_OVER_LENGTH("100023", "组件code不能超过100个字符:{}"), + TERMINAL_NAME_EXIST("100024", "端名字已经存在,请修改"); private String errorCode; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java index 6399b0bb..6c65e11e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java @@ -21,12 +21,14 @@ import cn.axzo.tyr.client.model.res.ProductFeatureResourceResp; import cn.axzo.tyr.client.model.res.TreePermissionResp; import cn.axzo.tyr.server.service.PermissionQueryService; import cn.axzo.tyr.server.service.TyrSaasAuthService; +import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -67,6 +69,9 @@ public class PermissionQueryController implements PermissionQueryApi { List pairs = BeanMapper.copyList(req.getWorkspaceOUPairs(), IdentityAuthReq.WorkspaceOuPair.class); request.setWorkspaceOusPairs(pairs); request.setItemCode(req.getItemCode()); + request.setTerminal(Optional.ofNullable(req.getTerminals()) + .map(Lists::newArrayList) + .orElse(null)); IdentityAuthRes authRes = tyrSaasAuthService.findIdentityAuthMix(request); return ApiResult.ok(BatchPermissionCheckRes.builder() diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java index 80227edc..9d211406 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java @@ -4,6 +4,7 @@ import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.foundation.page.PageResp; import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.framework.rocketmq.Event; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.feign.TyrSaasRoleUserApi; @@ -22,32 +23,14 @@ import cn.axzo.tyr.client.model.roleuser.req.GantOrUnGantaWorkerLeaderRoleReq; import cn.axzo.tyr.client.model.roleuser.req.GetUserAutoOwnRoleReq; import cn.axzo.tyr.client.model.roleuser.req.GetUserFeatureResourceIdsReq; import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; +import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationParam; import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationReq; import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; import cn.axzo.tyr.client.model.roleuser.req.RoleUserReq; import cn.axzo.tyr.client.model.roleuser.req.SuperAdminParam; import cn.axzo.tyr.client.model.roleuser.req.WorkerManagerRoleUserReq; -import cn.axzo.tyr.client.model.roleuser.req.AutoOwnRoleUserReq; -import cn.axzo.tyr.client.model.roleuser.req.CreateSuperAdminRoleParam; -import cn.axzo.tyr.client.model.roleuser.req.GantOrUnGantaWorkerLeaderRoleReq; -import cn.axzo.tyr.client.model.roleuser.req.GetUserAutoOwnRoleReq; -import cn.axzo.tyr.client.model.roleuser.req.GetUserFeatureResourceIdsReq; -import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; -import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationParam; -import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; -import cn.axzo.tyr.client.model.roleuser.req.RoleUserReq; -import cn.axzo.tyr.client.model.roleuser.req.SuperAdminParam; -import cn.axzo.tyr.client.model.roleuser.req.WorkerManagerRoleUserReq; -import cn.axzo.tyr.client.model.roleuser.req.AutoOwnRoleUserReq; -import cn.axzo.tyr.client.model.roleuser.req.CreateSuperAdminRoleParam; -import cn.axzo.tyr.client.model.roleuser.req.GantOrUnGantaWorkerLeaderRoleReq; -import cn.axzo.tyr.client.model.roleuser.req.GetUserAutoOwnRoleReq; -import cn.axzo.tyr.client.model.roleuser.req.GetUserFeatureResourceIdsReq; -import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; -import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; -import cn.axzo.tyr.client.model.roleuser.req.RoleUserReq; -import cn.axzo.tyr.client.model.roleuser.req.SuperAdminParam; -import cn.axzo.tyr.client.model.roleuser.req.WorkerManagerRoleUserReq; +import cn.axzo.tyr.server.config.MqProducer; +import cn.axzo.tyr.server.event.payload.SaasRoleUserRelationRemovePayload; import cn.axzo.tyr.server.model.PermissionCacheKey; import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; @@ -55,11 +38,10 @@ import cn.axzo.tyr.server.repository.mapper.SaasRoleUserRelationMapper; import cn.axzo.tyr.server.service.PermissionCacheService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import cn.axzo.tyr.server.service.SaasRoleUserService; +import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; -import cn.hutool.core.bean.BeanUtil; -import com.google.common.collect.Lists; import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -72,12 +54,12 @@ import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; import java.util.Collections; import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; +import static cn.axzo.tyr.server.event.inner.EventTypeEnum.SAAS_ROLE_USER_RELATION_REMOVED; + /** * @author tanjie@axzo.cn * @date 2023/9/13 15:47 @@ -91,6 +73,8 @@ public class RoleUserController implements TyrSaasRoleUserApi { private final SaasRoleUserRelationDao saasRoleUserRelationDao; private final PermissionCacheService permissionCacheService; private final SaasRoleUserRelationMapper saasRoleUserRelationMapper; + private final MqProducer mqProducer; + private static final String TARGET_TYPE = "saasRoleUserRelationId"; @Override public ApiResult saveOrUpdate(@Valid RoleUserReq req) { @@ -245,6 +229,15 @@ public class RoleUserController implements TyrSaasRoleUserApi { .identityType(IdentityType.getIdentityType(relation.getIdentityType())) .build()); } + + Event event = Event.builder() + .targetType(TARGET_TYPE) + .eventCode(SAAS_ROLE_USER_RELATION_REMOVED.getEventCode()) + .data(SaasRoleUserRelationRemovePayload.builder() + .values(relations) + .build()) + .build(); + mqProducer.send(event); return ApiResult.ok(); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/terminal/TerminalController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/terminal/TerminalController.java index b1e2a901..82eeca8f 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/terminal/TerminalController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/terminal/TerminalController.java @@ -2,6 +2,7 @@ package cn.axzo.tyr.server.controller.terminal; import cn.axzo.foundation.dao.support.mysql.MybatisPlusOperatorProcessor; import cn.axzo.foundation.dao.support.wrapper.Operator; +import cn.axzo.foundation.exception.Axssert; import cn.axzo.framework.auth.domain.TerminalInfo; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.common.enums.FeatureResourceType; @@ -22,7 +23,6 @@ import cn.axzo.tyr.client.model.res.TerminalRes; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.service.TerminalService; import cn.hutool.json.JSONObject; -import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -37,6 +37,7 @@ import java.util.function.Function; import java.util.stream.Collectors; import static cn.axzo.tyr.client.model.res.SaasFeatureResourceResp.ROOT_PARENT_ID; +import static cn.axzo.tyr.server.config.exception.BizResultCode.TERMINAL_NAME_EXIST; @Slf4j @RestController @@ -111,15 +112,28 @@ public class TerminalController implements TerminalApi { .allowClone(Optional.ofNullable(terminalBizType) .map(TerminalConfigRes.TerminalBizType::getAllowClone) .orElse(false)) + .allowDelete(Optional.ofNullable(terminalBizType) + .map(TerminalConfigRes.TerminalBizType::getAllowDelete) + .orElse(false)) .featureType(e.getFeatureType()) .build(); }) .collect(Collectors.toList())); } + private void checkTerminalName(CreateTerminalReq req) { + List newFeatureResources = featureResourceService.list(PageSaasFeatureResourceReq.builder() + .featureResourceTypes(Lists.newArrayList(FeatureResourceType.ROOT.getCode())) + .featureName(req.getName()) + .build()); + Axssert.check(CollectionUtils.isEmpty(newFeatureResources), TERMINAL_NAME_EXIST); + } + @Override public ApiResult create(CreateTerminalReq req) { + checkTerminalName(req); + FeatureResourceTreeSaveReq featureResourceTreeSaveReq = FeatureResourceTreeSaveReq.builder() .parentId(ROOT_PARENT_ID) .featureName(req.getName()) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/EventTypeEnum.java b/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/EventTypeEnum.java index ab8f938b..5331efd5 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/EventTypeEnum.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/EventTypeEnum.java @@ -12,6 +12,7 @@ public enum EventTypeEnum { SAAS_FEATURE_RESOURCE_UPSERT("saas-feature-resource", "saas-feature-resource-upsert", "新菜单树更新"), PAGE_ELEMENT_FEATURE_RESOURCE_UPSERT("page-element-feature-resource", "page-element-feature-resource-upsert", "菜单-页面元素绑定关系更新"), SAAS_ROLE_USER_RELATION_REMOVED("saas-role-user-relation", "saas-role-user-relation-removed", "删除用户角色信息"), + SAAS_ROLE_USER_RELATION_UPSERT("saas-role-user-relation", "saas-role-user-relation-upsert", "更新用户角色信息"), ; EventTypeEnum(String model, String name, String desc) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/event/payload/SaasRoleUserRelationUpsertPayload.java b/tyr-server/src/main/java/cn/axzo/tyr/server/event/payload/SaasRoleUserRelationUpsertPayload.java new file mode 100644 index 00000000..a6ca0920 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/event/payload/SaasRoleUserRelationUpsertPayload.java @@ -0,0 +1,30 @@ +package cn.axzo.tyr.server.event.payload; + +import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; +import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.beans.BeanUtils; + +import java.io.Serializable; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SaasRoleUserRelationUpsertPayload implements Serializable { + + private List oldValues; + + private List newValues; + + public static SaasRoleUserRelation from(SaasRoleUserV2DTO saasRoleUserV2DTO) { + SaasRoleUserRelation result = new SaasRoleUserRelation(); + BeanUtils.copyProperties(saasRoleUserV2DTO, result); + result.setNaturalPersonId(saasRoleUserV2DTO.getSaasRoleUser().getPersonId()); + return result; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/DataObject.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/DataObject.java index fccc9e20..7cd4c201 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/DataObject.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/DataObject.java @@ -36,4 +36,9 @@ public class DataObject extends BaseOperatorEntity implements Serial private Integer tenantScope; private Integer sort; + + /** + * 是否过滤工程 + */ + private Integer isFilterProject; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/DataObjectServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/DataObjectServiceImpl.java index c9d27339..e5c55b7a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/DataObjectServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/DataObjectServiceImpl.java @@ -4,6 +4,7 @@ import cn.axzo.basics.common.constant.enums.DeleteEnum; import cn.axzo.basics.common.exception.ServiceException; import cn.axzo.basics.common.page.PageResult; import cn.axzo.tyr.client.common.enums.ReturnCodeEnum; +import cn.axzo.tyr.client.common.enums.TenantScopeEnum; import cn.axzo.tyr.client.common.enums.YesNoEnum; import cn.axzo.tyr.client.model.data.object.AttributeBO; import cn.axzo.tyr.client.model.data.object.AttributePermissionBO; @@ -33,6 +34,7 @@ import cn.axzo.tyr.server.repository.entity.DataObjectRuleScope; import cn.axzo.tyr.server.service.DataObjectService; import cn.axzo.tyr.server.utils.mapper.DataObjectMapper; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.EnumUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.metadata.IPage; import com.google.common.collect.Lists; @@ -84,6 +86,12 @@ public class DataObjectServiceImpl implements DataObjectService { // 准备 DataObject dataObject = DataObjectMapper.INSTANCE.createReq2DataObject(req); + + // 如果租户类型为非项目租户, 则是否过滤工程字段设置为0 + if (!TenantScopeEnum.WORKSPACE.getValue().equals(dataObject.getTenantScope()) ) { + dataObject.setIsFilterProject(0); + } + dataObject.setCreateBy(req.getCreateBy()); List objectAttrList = DataObjectMapper.INSTANCE.attributeBOs2DataObjectAttrs(req.getAttrs()); @@ -195,7 +203,12 @@ public class DataObjectServiceImpl implements DataObjectService { dataObject.setTenantScope(req.getTenantScope()); dataObject.setSort(req.getSort()); dataObject.setUpdateBy(req.getUpdateBy()); - + // 如果租户类型为非项目租户, 则是否过滤工程字段设置为0 + if (!TenantScopeEnum.WORKSPACE.getValue().equals(dataObject.getTenantScope()) ) { + dataObject.setIsFilterProject(0); + } else { + dataObject.setIsFilterProject(req.getIsFilterProject()); + } List objectAttrList = DataObjectMapper.INSTANCE.attributeBOs2DataObjectAttrs(req.getAttrs()); List defaultDataObjectRules = DataObjectMapper.INSTANCE.defaultRuleBOs2Rules(Lists.newArrayList(req.getDefaultDataObjectRuleBO())); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index 9e655605..60cfb7a2 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -404,6 +404,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .versionMax(req.getVersionMax()) .parentUniCode(req.getParentUniCode()) .status(req.getStatus()) + .system(req.getSystem()) .build(); Set featureIds = listUserPermissionFeatureIds(treePermissionReq); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 3631331c..5c0f7d66 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -766,7 +766,7 @@ public class RoleServiceImpl extends ServiceImpl saasRole.setIsDisplay(saveOrUpdateRole.getIsDisplay()); saasRole.setEnabled(saveOrUpdateRole.getEnabled()); saasRole.setName(saveOrUpdateRole.getName()); - saasRole.setDescription(saasRole.getDescription()); + saasRole.setDescription(saveOrUpdateRole.getDescription()); saasRole.setRoleType(saveOrUpdateRole.getRoleType()); saasRole.setWorkspaceId(saveOrUpdateRole.getWorkspaceId()); saasRole.setOwnerOuId(saveOrUpdateRole.getOwnerOuId()); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java index 0e6a492b..be98ed25 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java @@ -7,6 +7,7 @@ import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; import cn.axzo.basics.common.exception.ServiceException; import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.framework.rocketmq.Event; import cn.axzo.maokai.api.client.OrgJobApi; import cn.axzo.maokai.api.client.OrganizationalNodeUserQueryApi; import cn.axzo.maokai.api.vo.request.OrgJobListReq; @@ -18,7 +19,6 @@ import cn.axzo.pokonyan.util.KeysUtil; import cn.axzo.tyr.client.common.enums.RoleResourceTypeEnum; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.BaseWorkspaceModel; -import cn.axzo.tyr.client.model.enums.DictWorkSpaceTypeEnum; import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.enums.WorkerLeaderRoleEnum; import cn.axzo.tyr.client.model.req.ListRoleReq; @@ -39,6 +39,8 @@ import cn.axzo.tyr.client.model.roleuser.req.RoleUserReq; import cn.axzo.tyr.client.model.roleuser.req.SuperAdminParam; import cn.axzo.tyr.client.model.roleuser.req.WorkerManagerRoleUserReq; import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; +import cn.axzo.tyr.server.config.MqProducer; +import cn.axzo.tyr.server.event.payload.SaasRoleUserRelationUpsertPayload; import cn.axzo.tyr.server.model.RoleUserInfo; import cn.axzo.tyr.server.repository.dao.RemoveRoleUserByResource; import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao; @@ -82,6 +84,9 @@ import java.util.Objects; import java.util.Set; import java.util.function.Supplier; import java.util.stream.Collectors; + +import static cn.axzo.tyr.server.event.inner.EventTypeEnum.SAAS_ROLE_USER_RELATION_UPSERT; + /** * 角色 * @@ -106,6 +111,8 @@ public class RoleUserService implements SaasRoleUserService { private final WorkspaceConfigApi workspaceConfigApi; private final OrganizationalNodeUserQueryApi organizationalNodeUserQueryApi; private final RoleService roleService; + private final MqProducer mqProducer; + private static final String TARGET_TYPE = "saasRoleUserRelationId"; // 单位类型默认角色关系,后面可以座位管理员的逻辑进行迭代 @Value("#{${participateUnitDefaultRoleId:{}}}") @@ -263,23 +270,41 @@ public class RoleUserService implements SaasRoleUserService { updateRoleIds.addAll(notAdminAndAutoOwnRole); } // 清空所有角色 - if (CollectionUtil.isEmpty(updateRoleIds)) { - return; + if (!CollectionUtil.isEmpty(updateRoleIds)) { + roleUserRelationDao.saveBatch(updateRoleIds.stream().map(e -> { + SaasRoleUserRelation saasRoleUserRelation = new SaasRoleUserRelation(); + saasRoleUserRelation.setIdentityId(req.getIdentityId()); + saasRoleUserRelation.setIdentityType(req.getIdentityType().getCode()); + saasRoleUserRelation.setRoleId(e); + saasRoleUserRelation.setNaturalPersonId(req.getPersonId()); + saasRoleUserRelation.setOuId(req.getOuId()); + saasRoleUserRelation.setWorkspaceId(req.getWorkspaceId()); + saasRoleUserRelation.setCreateBy(req.getOperator()); + saasRoleUserRelation.setUpdateBy(req.getOperator()); + return saasRoleUserRelation; + }).collect(Collectors.toList())); } - roleUserRelationDao.saveBatch(updateRoleIds.stream().map(e -> { - SaasRoleUserRelation saasRoleUserRelation = new SaasRoleUserRelation(); - saasRoleUserRelation.setIdentityId(req.getIdentityId()); - saasRoleUserRelation.setIdentityType(req.getIdentityType().getCode()); - saasRoleUserRelation.setRoleId(e); - saasRoleUserRelation.setNaturalPersonId(req.getPersonId()); - saasRoleUserRelation.setOuId(req.getOuId()); - saasRoleUserRelation.setWorkspaceId(req.getWorkspaceId()); - saasRoleUserRelation.setCreateBy(req.getOperator()); - saasRoleUserRelation.setUpdateBy(req.getOperator()); - return saasRoleUserRelation; - }).collect(Collectors.toList())); + List newSaasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .identityId(req.getIdentityId()) + .identityType(req.getIdentityType()) + .workspaceId(req.getWorkspaceId()) + .ouId(req.getOuId()) + .build()); + Event event = Event.builder() + .targetType(TARGET_TYPE) + .eventCode(SAAS_ROLE_USER_RELATION_UPSERT.getEventCode()) + .data(SaasRoleUserRelationUpsertPayload.builder() + .oldValues(saasRoleUsers.stream() + .map(SaasRoleUserRelationUpsertPayload::from) + .collect(Collectors.toList())) + .newValues(newSaasRoleUsers.stream() + .map(SaasRoleUserRelationUpsertPayload::from) + .collect(Collectors.toList())) + .build()) + .build(); + mqProducer.send(event); } @Override @@ -298,6 +323,13 @@ public class RoleUserService implements SaasRoleUserService { AssertUtil.notNull(superAdmin, "超管角色不存在,请联系业务初始化超管角色"); + List oldValues = roleUserRelationDao.lambdaQuery() + .eq(SaasRoleUserRelation::getIdentityId, param.getIdentityId()) + .eq(SaasRoleUserRelation::getIdentityType, param.getIdentityType().getCode()) + .eq(SaasRoleUserRelation::getNaturalPersonId, param.getNaturalPersonId()) + .eq(SaasRoleUserRelation::getOuId, param.getOuId()) + .eq(SaasRoleUserRelation::getWorkspaceId, param.getWorkspaceId()) + .list(); //删除当前超管角色 removeOldSuperAdmin(superAdmin.getId(), param.getWorkspaceId(), param.getOuId()); @@ -310,6 +342,22 @@ public class RoleUserService implements SaasRoleUserService { saasRoleUserRelation.setOuId(param.getOuId()); saasRoleUserRelation.setWorkspaceId(param.getWorkspaceId()); roleUserRelationDao.save(saasRoleUserRelation); + + Event event = Event.builder() + .targetType(TARGET_TYPE) + .eventCode(SAAS_ROLE_USER_RELATION_UPSERT.getEventCode()) + .data(SaasRoleUserRelationUpsertPayload.builder() + .oldValues(oldValues) + .newValues(roleUserRelationDao.lambdaQuery() + .eq(SaasRoleUserRelation::getIdentityId, param.getIdentityId()) + .eq(SaasRoleUserRelation::getIdentityType, param.getIdentityType().getCode()) + .eq(SaasRoleUserRelation::getNaturalPersonId, param.getNaturalPersonId()) + .eq(SaasRoleUserRelation::getOuId, param.getOuId()) + .eq(SaasRoleUserRelation::getWorkspaceId, param.getWorkspaceId()) + .list()) + .build()) + .build(); + mqProducer.send(event); } private void removeOldSuperAdmin(Long id, Long workspaceId, Long ouId) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 43507f43..9cbadd83 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -96,7 +96,8 @@ import static cn.axzo.tyr.server.config.exception.BizResultCode.FEATURE_CODE_EXI import static cn.axzo.tyr.server.config.exception.BizResultCode.FEATURE_CODE_OVER_LENGTH; import static cn.axzo.tyr.server.config.exception.BizResultCode.FEATURE_NAME_EXIST; import static cn.axzo.tyr.server.config.exception.BizResultCode.FEATURE_RESOURCE_NOT_FOUND; -import static cn.axzo.tyr.server.config.exception.BizResultCode.TERMINAL_EXIST; +import static cn.axzo.tyr.server.config.exception.BizResultCode.TERMINAL_CODE_EXIST; +import static cn.axzo.tyr.server.config.exception.BizResultCode.TERMINAL_NAME_EXIST; import static cn.axzo.tyr.server.config.exception.BizResultCode.TERMINAL_NOT_FOUND; import static cn.axzo.tyr.server.event.inner.EventTypeEnum.SAAS_FEATURE_RESOURCE_UPSERT; import static cn.axzo.tyr.server.repository.entity.SaasFeatureResource.DEFAULT_WORKSPACE_TYPE; @@ -1187,16 +1188,7 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl newFeatureResources = this.list(PageSaasFeatureResourceReq.builder() - .featureResourceTypes(Lists.newArrayList(FeatureResourceType.ROOT.getCode())) - .terminal(req.getNewTerminalCode()) - .build()); - Axssert.check(CollectionUtils.isEmpty(newFeatureResources), TERMINAL_EXIST, TERMINAL_EXIST.getErrorMessage(), req.getNewTerminalCode()); - - List fromTerminalFeatureResources = this.list(PageSaasFeatureResourceReq.builder() - .ids(Lists.newArrayList(req.getFromTerminalId())) - .build()); - Axssert.checkNotEmpty(fromTerminalFeatureResources, TERMINAL_NOT_FOUND, TERMINAL_NOT_FOUND.getErrorMessage(), req.getFromTerminalId()); + check(req); PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder() .parentId(req.getFromTerminalId()) @@ -1334,4 +1326,36 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl newCode.length(), FEATURE_CODE_OVER_LENGTH, FEATURE_CODE_OVER_LENGTH.getErrorMessage(), newCode); return newCode; } + + private void check(CloneTerminalReq req) { + + checkTerminalCode(req); + + checkTerminalName(req); + + checkFromTerminal(req); + } + + private void checkFromTerminal(CloneTerminalReq req) { + List fromTerminalFeatureResources = this.list(PageSaasFeatureResourceReq.builder() + .ids(Lists.newArrayList(req.getFromTerminalId())) + .build()); + Axssert.checkNotEmpty(fromTerminalFeatureResources, TERMINAL_NOT_FOUND, TERMINAL_NOT_FOUND.getErrorMessage(), req.getFromTerminalId()); + } + + private void checkTerminalName(CloneTerminalReq req) { + List newFeatureResources = this.list(PageSaasFeatureResourceReq.builder() + .featureResourceTypes(Lists.newArrayList(FeatureResourceType.ROOT.getCode())) + .featureName(req.getNewTerminalName()) + .build()); + Axssert.check(CollectionUtils.isEmpty(newFeatureResources), TERMINAL_NAME_EXIST); + } + + private void checkTerminalCode(CloneTerminalReq req) { + List newFeatureResources = this.list(PageSaasFeatureResourceReq.builder() + .featureResourceTypes(Lists.newArrayList(FeatureResourceType.ROOT.getCode())) + .terminal(req.getNewTerminalCode()) + .build()); + Axssert.check(CollectionUtils.isEmpty(newFeatureResources), TERMINAL_CODE_EXIST); + } } diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImplTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImplTest.java index d0f3ed41..111bbb76 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImplTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImplTest.java @@ -4,15 +4,13 @@ import cn.axzo.foundation.exception.BusinessException; import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; import cn.axzo.tyr.client.model.req.CloneTerminalReq; -import cn.axzo.tyr.client.model.req.SaveOrUpdatePageElementReq; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; -import static cn.axzo.tyr.server.config.exception.BizResultCode.PAGE_ELEMENT_ERROR; -import static cn.axzo.tyr.server.config.exception.BizResultCode.TERMINAL_EXIST; +import static cn.axzo.tyr.server.config.exception.BizResultCode.TERMINAL_CODE_EXIST; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -45,7 +43,7 @@ class SaasFeatureResourceServiceImplTest extends BaseTest { .build(); saasFeatureResourceService.clone(req); }); - assertEquals(businessException.getErrorCode(), TERMINAL_EXIST.getErrorCode()); + assertEquals(businessException.getErrorCode(), TERMINAL_CODE_EXIST.getErrorCode()); assertEquals(businessException.getErrorMsg(), "新端已经存在:[3434]"); } } \ No newline at end of file diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImplTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImplTest.java index ff4bb510..89e3bc3e 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImplTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImplTest.java @@ -1,10 +1,13 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.foundation.exception.BusinessException; +import cn.axzo.foundation.page.PageResp; import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; +import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationParam; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import com.google.common.collect.Lists; @@ -56,4 +59,63 @@ class SaasRoleUserRelationServiceImplTest extends BaseTest { .build()); Assertions.assertEquals(saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder().build()).size(), 2); } + + @Test + void list() { + + ListRoleUserRelationParam list = ListRoleUserRelationParam.builder() + .roleCodes(Sets.newHashSet("cms:mafb_business_vice_officer")) + .build(); + List result = saasRoleUserRelationService.listV2(list); + Assertions.assertEquals(result.size(), 1); + + + list = ListRoleUserRelationParam.builder() + .roleCodes(Sets.newHashSet("cms:mafb_business_vice_officer1")) + .build(); + result = saasRoleUserRelationService.listV2(list); + Assertions.assertEquals(result.size(), 0); + + list = ListRoleUserRelationParam.builder() + .roleCodes(Sets.newHashSet("cms:mafb_business_vice_officer", "cms:mafb_productivity_vice_officer")) + .build(); + result = saasRoleUserRelationService.listV2(list); + Assertions.assertEquals(result.size(), 2); + + list = ListRoleUserRelationParam.builder() + .roleTypes(Sets.newHashSet(RoleTypeEnum.ADMIN)) + .build(); + result = saasRoleUserRelationService.listV2(list); + Assertions.assertEquals(result.size(), 1); + + list = ListRoleUserRelationParam.builder() + .roleTypes(Sets.newHashSet(RoleTypeEnum.SUPER_ADMIN)) + .build(); + result = saasRoleUserRelationService.listV2(list); + Assertions.assertEquals(result.size(), 1); + + list = ListRoleUserRelationParam.builder() + .roleTypes(Sets.newHashSet(RoleTypeEnum.ADMIN, RoleTypeEnum.SUPER_ADMIN)) + .build(); + result = saasRoleUserRelationService.listV2(list); + Assertions.assertEquals(result.size(), 2); + + list = ListRoleUserRelationParam.builder() + .roleTypes(Sets.newHashSet(RoleTypeEnum.ADMIN, RoleTypeEnum.SUPER_ADMIN)) + .roleCodes(Sets.newHashSet("sdfdsf")) + .build(); + result = saasRoleUserRelationService.listV2(list); + Assertions.assertEquals(result.size(), 0); + + list = ListRoleUserRelationParam.builder() + .roleTypes(Sets.newHashSet(RoleTypeEnum.ADMIN, RoleTypeEnum.SUPER_ADMIN)) + .roleCodes(Sets.newHashSet("oms:project_manager")) + .workspaceOuPairs(Lists.newArrayList(ListRoleUserRelationParam.WorkspaceOuPair.builder() + .workspaceId(8L) + .ouId(1L) + .build())) + .build(); + result = saasRoleUserRelationService.listV2(list); + Assertions.assertEquals(result.size(), 1); + } } \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/SaasRoleUserRelationServiceImplTest.sql b/tyr-server/src/test/resources/mysql/SaasRoleUserRelationServiceImplTest.sql index c1d5014d..75494e01 100644 --- a/tyr-server/src/test/resources/mysql/SaasRoleUserRelationServiceImplTest.sql +++ b/tyr-server/src/test/resources/mysql/SaasRoleUserRelationServiceImplTest.sql @@ -5,4 +5,14 @@ INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, na INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) VALUES (16401, 98, 3417, 3, 2020, 6, 1, 0, 0, 0, '2021-09-16 22:09:29', '2021-09-16 22:09:29', 0, 0, 2); INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) VALUES (16402, 106, 3418, 3, 3577, 12, 1, 0, 0, 0, '2021-09-16 22:09:29', '2021-09-16 22:09:29', 0, 0, 2); + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (3415, '项目经理', '', 'super_admin', 'oms:project_manager', -1, -1, 6, 6, 0, '2023-09-19 15:22:55', '2024-08-13 10:25:25', 2003043, 2003028, 1, 65535, 0, null, 0, '', 1, 2, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (3416, '项目负责人', '', 'admin', 'cms:mafb_project_commissioner', -1, -1, 5, 2, 0, '2023-10-23 17:49:59', '2024-08-13 10:25:40', -1, 9000399985, 1, 65535, 0, null, 0, '', 1, 1, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (3417, '商务副经理', '', 'init', 'cms:mafb_business_vice_officer', -1, -1, 5, 2, 0, '2023-10-23 17:50:00', '2024-08-13 10:25:41', -1, 2006333, 1, 65535, 0, null, 0, '', 1, 2, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (3418, '生产副经理', '', 'init', 'cms:mafb_productivity_vice_officer', -1, -1, 5, 2, 0, '2023-10-23 17:50:00', '2024-08-13 10:25:41', -1, 2006333, 1, 65535, 0, null, 0, '', 1, 3, 1); + #-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file