diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/controller/RoleCategoryController.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/controller/RoleCategoryController.java new file mode 100644 index 000000000..00f20e596 --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/controller/RoleCategoryController.java @@ -0,0 +1,114 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.controller; + +import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; +import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest; +import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData; +import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData; +import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource; +import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource; +import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource; +import cn.stylefeng.roses.kernel.sys.modular.role.entity.RoleCategory; +import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleCategoryRequest; +import cn.stylefeng.roses.kernel.sys.modular.role.service.RoleCategoryService; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 角色分类控制器 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ +@RestController +@ApiResource(name = "角色分类") +public class RoleCategoryController { + + @Resource + private RoleCategoryService roleCategoryService; + + /** + * 添加角色分类 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + @PostResource(name = "添加角色分类", path = "/roleCategory/add") + public ResponseData add(@RequestBody @Validated(RoleCategoryRequest.add.class) RoleCategoryRequest roleCategoryRequest) { + roleCategoryService.add(roleCategoryRequest); + return new SuccessResponseData<>(); + } + + /** + * 删除角色分类 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + @PostResource(name = "删除角色分类", path = "/roleCategory/delete") + public ResponseData delete(@RequestBody @Validated(RoleCategoryRequest.delete.class) RoleCategoryRequest roleCategoryRequest) { + roleCategoryService.del(roleCategoryRequest); + return new SuccessResponseData<>(); + } + + /** + * 批量删除角色分类 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + @PostResource(name = "批量删除角色分类", path = "/roleCategory/batchDelete") + public ResponseData batchDelete(@RequestBody @Validated(BaseRequest.batchDelete.class) RoleCategoryRequest roleCategoryRequest) { + roleCategoryService.batchDelete(roleCategoryRequest); + return new SuccessResponseData<>(); + } + + /** + * 编辑角色分类 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + @PostResource(name = "编辑角色分类", path = "/roleCategory/edit") + public ResponseData edit(@RequestBody @Validated(RoleCategoryRequest.edit.class) RoleCategoryRequest roleCategoryRequest) { + roleCategoryService.edit(roleCategoryRequest); + return new SuccessResponseData<>(); + } + + /** + * 查看角色分类详情 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + @GetResource(name = "查看角色分类详情", path = "/roleCategory/detail") + public ResponseData detail(@Validated(RoleCategoryRequest.detail.class) RoleCategoryRequest roleCategoryRequest) { + return new SuccessResponseData<>(roleCategoryService.detail(roleCategoryRequest)); + } + + /** + * 获取角色分类列表 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + @GetResource(name = "获取角色分类列表", path = "/roleCategory/list") + public ResponseData> list(RoleCategoryRequest roleCategoryRequest) { + return new SuccessResponseData<>(roleCategoryService.findList(roleCategoryRequest)); + } + + /** + * 获取角色分类列表(带分页) + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + @GetResource(name = "获取角色分类列表(带分页)", path = "/roleCategory/page") + public ResponseData> page(RoleCategoryRequest roleCategoryRequest) { + return new SuccessResponseData<>(roleCategoryService.findPage(roleCategoryRequest)); + } + +} diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/entity/RoleCategory.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/entity/RoleCategory.java new file mode 100644 index 000000000..116cf35ed --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/entity/RoleCategory.java @@ -0,0 +1,70 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.entity; + +import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity; +import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 角色分类实例类 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ +@TableName("sys_role_category") +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleCategory extends BaseEntity { + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + @ChineseDescription("主键id") + private Long id; + + /** + * 父级角色分类id + */ + @TableField("category_parent_id") + @ChineseDescription("父级角色分类id") + private Long categoryParentId; + + /** + * 父级角色分类id集合 + */ + @TableField("category_pids") + @ChineseDescription("父级角色分类id集合") + private String categoryPids; + + /** + * 角色分类名称 + */ + @TableField("role_category_name") + @ChineseDescription("角色分类名称") + private String roleCategoryName; + + /** + * 角色分类类型:15-业务角色,20-公司角色 + */ + @TableField("category_type") + @ChineseDescription("角色分类类型:15-业务角色,20-公司角色") + private Integer categoryType; + + /** + * 删除标记:Y-已删除,N-未删除 + */ + @TableField(value = "del_flag", fill = FieldFill.INSERT) + @ChineseDescription("删除标记:Y-已删除,N-未删除") + @TableLogic + private String delFlag; + + /** + * 租户号 + */ + @TableField(value = "tenant_id", fill = FieldFill.INSERT) + @ChineseDescription("租户号") + private Long tenantId; + +} \ No newline at end of file diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/enums/RoleCategoryExceptionEnum.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/enums/RoleCategoryExceptionEnum.java new file mode 100644 index 000000000..06d9f65d5 --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/enums/RoleCategoryExceptionEnum.java @@ -0,0 +1,36 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.enums; + +import cn.stylefeng.roses.kernel.rule.constants.RuleConstants; +import cn.stylefeng.roses.kernel.rule.exception.AbstractExceptionEnum; +import lombok.Getter; + +/** + * 角色分类异常相关枚举 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ +@Getter +public enum RoleCategoryExceptionEnum implements AbstractExceptionEnum { + + /** + * 查询结果不存在 + */ + ROLE_CATEGORY_NOT_EXISTED(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10001", "查询结果不存在"); + + /** + * 错误编码 + */ + private final String errorCode; + + /** + * 提示用户信息 + */ + private final String userTip; + + RoleCategoryExceptionEnum(String errorCode, String userTip) { + this.errorCode = errorCode; + this.userTip = userTip; + } + +} diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/mapper/RoleCategoryMapper.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/mapper/RoleCategoryMapper.java new file mode 100644 index 000000000..d8088c3f5 --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/mapper/RoleCategoryMapper.java @@ -0,0 +1,28 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.mapper; + +import cn.stylefeng.roses.kernel.sys.modular.role.entity.RoleCategory; +import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleCategoryRequest; +import cn.stylefeng.roses.kernel.sys.modular.role.pojo.response.RoleCategoryVo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 角色分类 Mapper 接口 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ +public interface RoleCategoryMapper extends BaseMapper { + + /** + * 获取自定义查询列表 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + List customFindList(@Param("page") Page page, @Param("param")RoleCategoryRequest request); + +} diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/mapper/mapping/RoleCategoryMapper.xml b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/mapper/mapping/RoleCategoryMapper.xml new file mode 100644 index 000000000..ab3a14677 --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/mapper/mapping/RoleCategoryMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + id,category_parent_id,category_pids,role_category_name,category_type,del_flag,create_time,create_user,update_time,update_user,tenant_id + + + + + + + + diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/pojo/request/RoleCategoryRequest.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/pojo/request/RoleCategoryRequest.java new file mode 100644 index 000000000..c19e0fbc9 --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/pojo/request/RoleCategoryRequest.java @@ -0,0 +1,70 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.pojo.request; + +import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription; +import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 角色分类封装类 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RoleCategoryRequest extends BaseRequest { + + /** + * 主键id + */ + @NotNull(message = "主键id不能为空", groups = {edit.class, delete.class}) + @ChineseDescription("主键id") + private Long id; + + /** + * 父级角色分类id + */ + @NotNull(message = "父级角色分类id不能为空", groups = {add.class, edit.class}) + @ChineseDescription("父级角色分类id") + private Long categoryParentId; + + /** + * 父级角色分类id集合 + */ + @NotBlank(message = "父级角色分类id集合不能为空", groups = {add.class, edit.class}) + @ChineseDescription("父级角色分类id集合") + private String categoryPids; + + /** + * 角色分类名称 + */ + @NotBlank(message = "角色分类名称不能为空", groups = {add.class, edit.class}) + @ChineseDescription("角色分类名称") + private String roleCategoryName; + + /** + * 角色分类类型:15-业务角色,20-公司角色 + */ + @NotNull(message = "角色分类类型:15-业务角色,20-公司角色不能为空", groups = {add.class, edit.class}) + @ChineseDescription("角色分类类型:15-业务角色,20-公司角色") + private Integer categoryType; + + /** + * 租户号 + */ + @ChineseDescription("租户号") + private Long tenantId; + + /** + * 批量删除用的id集合 + */ + @NotNull(message = "批量删除id集合不能为空", groups = batchDelete.class) + @ChineseDescription("批量删除用的id集合") + private List batchDeleteIdList; + +} \ No newline at end of file diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/pojo/response/RoleCategoryVo.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/pojo/response/RoleCategoryVo.java new file mode 100644 index 000000000..8be9258ea --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/pojo/response/RoleCategoryVo.java @@ -0,0 +1,17 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.pojo.response; + +import cn.stylefeng.roses.kernel.sys.modular.role.entity.RoleCategory; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 角色分类返回值封装 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RoleCategoryVo extends RoleCategory { + +} diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/RoleCategoryService.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/RoleCategoryService.java new file mode 100644 index 000000000..f73f99668 --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/RoleCategoryService.java @@ -0,0 +1,83 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.service; + +import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; +import cn.stylefeng.roses.kernel.sys.modular.role.entity.RoleCategory; +import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleCategoryRequest; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 角色分类服务类 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ +public interface RoleCategoryService extends IService { + + /** + * 新增角色分类 + * + * @param roleCategoryRequest 请求参数 + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + void add(RoleCategoryRequest roleCategoryRequest); + + /** + * 删除角色分类 + * + * @param roleCategoryRequest 请求参数 + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + void del(RoleCategoryRequest roleCategoryRequest); + + /** + * 批量删除角色分类 + * + * @param roleCategoryRequest 请求参数 + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + void batchDelete(RoleCategoryRequest roleCategoryRequest); + + /** + * 编辑角色分类 + * + * @param roleCategoryRequest 请求参数 + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + void edit(RoleCategoryRequest roleCategoryRequest); + + /** + * 查询详情角色分类 + * + * @param roleCategoryRequest 请求参数 + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + RoleCategory detail(RoleCategoryRequest roleCategoryRequest); + + /** + * 获取角色分类列表 + * + * @param roleCategoryRequest 请求参数 + * @return List 返回结果 + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + List findList(RoleCategoryRequest roleCategoryRequest); + + /** + * 获取角色分类分页列表 + * + * @param roleCategoryRequest 请求参数 + * @return PageResult 返回结果 + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + PageResult findPage(RoleCategoryRequest roleCategoryRequest); + +} diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleCategoryServiceImpl.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleCategoryServiceImpl.java new file mode 100644 index 000000000..2a19ef3d3 --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleCategoryServiceImpl.java @@ -0,0 +1,117 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.stylefeng.roses.kernel.db.api.factory.PageFactory; +import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory; +import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; +import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; +import cn.stylefeng.roses.kernel.sys.modular.role.entity.RoleCategory; +import cn.stylefeng.roses.kernel.sys.modular.role.enums.RoleCategoryExceptionEnum; +import cn.stylefeng.roses.kernel.sys.modular.role.mapper.RoleCategoryMapper; +import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleCategoryRequest; +import cn.stylefeng.roses.kernel.sys.modular.role.service.RoleCategoryService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 角色分类业务实现层 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ +@Service +public class RoleCategoryServiceImpl extends ServiceImpl implements RoleCategoryService { + + @Override + public void add(RoleCategoryRequest roleCategoryRequest) { + RoleCategory roleCategory = new RoleCategory(); + BeanUtil.copyProperties(roleCategoryRequest, roleCategory); + this.save(roleCategory); + } + + @Override + public void del(RoleCategoryRequest roleCategoryRequest) { + RoleCategory roleCategory = this.queryRoleCategory(roleCategoryRequest); + this.removeById(roleCategory.getId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchDelete(RoleCategoryRequest roleCategoryRequest) { + this.removeByIds(roleCategoryRequest.getBatchDeleteIdList()); + } + + @Override + public void edit(RoleCategoryRequest roleCategoryRequest) { + RoleCategory roleCategory = this.queryRoleCategory(roleCategoryRequest); + BeanUtil.copyProperties(roleCategoryRequest, roleCategory); + this.updateById(roleCategory); + } + + @Override + public RoleCategory detail(RoleCategoryRequest roleCategoryRequest) { + return this.queryRoleCategory(roleCategoryRequest); + } + + @Override + public PageResult findPage(RoleCategoryRequest roleCategoryRequest) { + LambdaQueryWrapper wrapper = createWrapper(roleCategoryRequest); + Page pageList = this.page(PageFactory.defaultPage(), wrapper); + return PageResultFactory.createPageResult(pageList); + } + + @Override + public List findList(RoleCategoryRequest roleCategoryRequest) { + LambdaQueryWrapper wrapper = this.createWrapper(roleCategoryRequest); + return this.list(wrapper); + } + + /** + * 获取信息 + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + private RoleCategory queryRoleCategory(RoleCategoryRequest roleCategoryRequest) { + RoleCategory roleCategory = this.getById(roleCategoryRequest.getId()); + if (ObjectUtil.isEmpty(roleCategory)) { + throw new ServiceException(RoleCategoryExceptionEnum.ROLE_CATEGORY_NOT_EXISTED); + } + return roleCategory; + } + + /** + * 创建查询wrapper + * + * @author fengshuonan + * @since 2025/01/22 17:40 + */ + private LambdaQueryWrapper createWrapper(RoleCategoryRequest roleCategoryRequest) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + Long id = roleCategoryRequest.getId(); + queryWrapper.eq(ObjectUtil.isNotNull(id), RoleCategory::getId, id); + + Long categoryParentId = roleCategoryRequest.getCategoryParentId(); + queryWrapper.eq(ObjectUtil.isNotNull(categoryParentId), RoleCategory::getCategoryParentId, categoryParentId); + + String categoryPids = roleCategoryRequest.getCategoryPids(); + queryWrapper.like(ObjectUtil.isNotEmpty(categoryPids), RoleCategory::getCategoryPids, categoryPids); + + String roleCategoryName = roleCategoryRequest.getRoleCategoryName(); + queryWrapper.like(ObjectUtil.isNotEmpty(roleCategoryName), RoleCategory::getRoleCategoryName, roleCategoryName); + + Integer categoryType = roleCategoryRequest.getCategoryType(); + queryWrapper.eq(ObjectUtil.isNotNull(categoryType), RoleCategory::getCategoryType, categoryType); + + + return queryWrapper; + } + +}