feat: bug-369 添加对产品线和数据权限的支持

This commit is contained in:
曹鹏飞 2025-06-23 18:04:16 +08:00
parent 0c0178c78a
commit 07203f095c
17 changed files with 499 additions and 1 deletions

View File

@ -174,6 +174,8 @@ public class AdminUserController extends ControllerBase {
.setDepartmentId(request.getDepartmentId())
.setPhone(request.getPhone())
.setTitleId(request.getTitleId())
.setProductionLineId(request.getProductionLineId())
.setDataRoleId(request.getDataRoleId())
.setUpdateBy(AdminUserUtil.getUserId())
.setUpdateTime(LocalDateTime.now());
if (!Objects.equals(user.getState(), UserState.ToBeActivated.getState()) && Objects.nonNull(request.getEnable())) {

View File

@ -0,0 +1,96 @@
package com.nflg.mobilebroken.admin.controller;
import com.nflg.mobilebroken.admin.annotation.ApiMark;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.DataRoleAddRequest;
import com.nflg.mobilebroken.common.pojo.request.DataRoleUpdateRequest;
import com.nflg.mobilebroken.common.pojo.request.EnableRoleRequest;
import com.nflg.mobilebroken.common.pojo.request.RoleSearchRequest;
import com.nflg.mobilebroken.common.pojo.vo.DataRoleVO;
import com.nflg.mobilebroken.common.pojo.vo.SimpleVO;
import com.nflg.mobilebroken.repository.service.IDataRoleService;
import com.nflg.mobilebroken.starter.annotation.MethodInfoMark;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
* 数据权限角色管理
* @author 曹鹏飞
*/
@RestController
@RequestMapping("/datarole")
public class DataRoleController {
@Resource
private IDataRoleService dataRoleService;
/**
* 新增角色
* @param request 请求参数
*/
@PostMapping("addRole")
@MethodInfoMark(value = "新增角色", menuName = "数据权限角色管理")
@ApiMark(moduleName = "数据权限角色管理", apiName = "新增角色")
public ApiResult<Void> addRole(@Valid @RequestBody DataRoleAddRequest request) {
dataRoleService.add(request);
return ApiResult.success();
}
/**
* 修改角色
* @param request 请求参数
*/
@PostMapping("updateRole")
@MethodInfoMark(value = "修改角色", menuName = "数据权限角色管理")
@ApiMark(moduleName = "数据权限角色管理", apiName = "修改角色")
public ApiResult<Void> updateRole(@Valid @RequestBody DataRoleUpdateRequest request) {
dataRoleService.update(request);
return ApiResult.success();
}
/**
* 启用/禁用角色
* @param request 请求参数
*/
@PostMapping("enableRole")
@ApiMark(moduleName = "数据权限角色管理", apiName = "启用/禁用角色")
public ApiResult<Void> enableRole(@Valid @RequestBody EnableRoleRequest request) {
dataRoleService.enable(request);
return ApiResult.success();
}
/**
* 删除角色
* @param ids 角色id列表
*/
@PostMapping("deleteRole")
@ApiMark(moduleName = "数据权限角色管理", apiName = "删除角色")
public ApiResult<Void> deleteRole(@Valid @RequestBody @NotEmpty List<Integer> ids) {
dataRoleService.removeByIds(ids);
return ApiResult.success();
}
/**
* 搜索角色
* @param request 请求参数
*/
@PostMapping("searchRoles")
@ApiMark(moduleName = "数据权限角色管理", apiName = "搜索角色")
public ApiResult<PageData<DataRoleVO>> searchRoles(@Valid @RequestBody RoleSearchRequest request) {
return ApiResult.success(dataRoleService.search(request));
}
/**
* 获取角色下拉列表
*/
@GetMapping("getSimpleRoles")
@ApiMark(moduleName = "数据权限角色管理", apiName = "获取角色下拉列表",isPublic = true)
public ApiResult<List<SimpleVO>> getSimpleRoles(){
return ApiResult.success(dataRoleService.getSimpleRoles());
}
}

View File

@ -0,0 +1,27 @@
package com.nflg.mobilebroken.common.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
@Getter
@AllArgsConstructor
public enum ProductionLinePermissionType {
ShowMe(0, "只看自己"),
ShowOwned(1, "只看本产品线"),
Customize(2, "自定义产品线");
private final int type;
private final String description;
public static ProductionLinePermissionType findByValue(int value) {
for (ProductionLinePermissionType valueEnum : ProductionLinePermissionType.values()) {
if (Objects.equals(valueEnum.getType(), value)) {
return valueEnum;
}
}
return null;
}
}

View File

@ -48,4 +48,9 @@ public class AccountAddRequest {
*/
@NotNull
private Integer productionLineId;
/**
* 数据权限角色id
*/
private Integer dataRoleId;
}

View File

@ -0,0 +1,21 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Data
@Accessors(chain = true)
public class DataRoleAddRequest {
@NotBlank
private String name;
@NotEmpty
@Valid
private List<DataRoleItemRequest> configs;
}

View File

@ -0,0 +1,22 @@
package com.nflg.mobilebroken.common.pojo.request;
import com.nflg.mobilebroken.common.constant.ProductionLinePermissionType;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class DataRoleItemRequest {
/**
* 模块ID字典项id
*/
@NotNull
private Integer moduleId;
/**
* 产品线权限类型
*/
@NotNull
private ProductionLinePermissionType type;
}

View File

@ -0,0 +1,18 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class DataRoleUpdateRequest extends DataRoleAddRequest {
@NotNull
private Integer id;
/**
* 是否启用
*/
@NotNull
private Boolean enable;
}

View File

@ -63,4 +63,16 @@ public class AdminUserVO {
//微信openid
private String openId;
//产品线id
private Integer productionLineId;
//产品线名称
private String productionLineName;
//数据权限角色id
private Integer dataRoleId;
//数据权限角色名称
private String dataRoleName;
}

View File

@ -0,0 +1,46 @@
package com.nflg.mobilebroken.common.pojo.vo;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.nflg.mobilebroken.common.pojo.request.DataRoleItemRequest;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class DataRoleVO {
private Integer id;
private String name;
@JsonIgnore
private String config;
private List<DataRoleItemRequest> configs;
/**
* 是否启用
*/
private Boolean enable;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 最后更新人
*/
private String updateBy;
/**
* 最后更新时间
*/
private LocalDateTime updateTime;
public List<DataRoleItemRequest> getConfigs() {
return JSONUtil.toList(config, DataRoleItemRequest.class);
}
}

View File

@ -84,6 +84,16 @@ public class AdminUser implements Serializable {
*/
private byte state;
/**
* 产品线id
*/
private Integer productionLineId;
/**
* 数据权限id
*/
private Integer dataRoleId;
/**
* 创建人id
*/

View File

@ -0,0 +1,66 @@
package com.nflg.mobilebroken.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 数据权限角色
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("data_role")
public class DataRole implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 名称
*/
private String name;
/**
* 配置信息
*/
private String config;
/**
* 是否启用
*/
private Boolean enable;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 最后更新人
*/
private String updateBy;
/**
* 最后更新时间
*/
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,26 @@
package com.nflg.mobilebroken.repository.mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.RoleSearchRequest;
import com.nflg.mobilebroken.common.pojo.vo.DataRoleVO;
import com.nflg.mobilebroken.common.pojo.vo.SimpleVO;
import com.nflg.mobilebroken.repository.entity.DataRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
* <p>
* 数据权限角色 Mapper 接口
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
public interface DataRoleMapper extends BaseMapper<DataRole> {
PageData<DataRoleVO> search(RoleSearchRequest request, Page<?> page);
List<SimpleVO> getSimpleRoles();
}

View File

@ -0,0 +1,35 @@
package com.nflg.mobilebroken.repository.service;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.DataRoleAddRequest;
import com.nflg.mobilebroken.common.pojo.request.DataRoleUpdateRequest;
import com.nflg.mobilebroken.common.pojo.request.EnableRoleRequest;
import com.nflg.mobilebroken.common.pojo.request.RoleSearchRequest;
import com.nflg.mobilebroken.common.pojo.vo.DataRoleVO;
import com.nflg.mobilebroken.common.pojo.vo.SimpleVO;
import com.nflg.mobilebroken.repository.entity.DataRole;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid;
import java.util.List;
/**
* <p>
* 数据权限角色 服务类
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
public interface IDataRoleService extends IService<DataRole> {
void add(@Valid DataRoleAddRequest request);
void update(@Valid DataRoleUpdateRequest request);
void enable(@Valid EnableRoleRequest request);
PageData<DataRoleVO> search(@Valid RoleSearchRequest request);
List<SimpleVO> getSimpleRoles();
}

View File

@ -64,6 +64,12 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
@Resource
private ITBaseDeviceTypeService deviceTypeService;
@Resource
private IProductionLineService productionLineService;
@Resource
private IDataRoleService dataRoleService;
@Override
public AdminUser getUser(String userName, String password) {
AdminUser user = lambdaQuery()
@ -89,6 +95,8 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
.setPhone(request.getPhone())
.setUserName(request.getUserName())
.setDepartmentId(request.getDepartmentId())
.setProductionLineId(request.getProductionLineId())
.setDataRoleId(request.getDataRoleId())
.setUpdateBy(AdminUserUtil.getUserId())
.setUpdateTime(LocalDateTime.now());
updateById(user);
@ -103,6 +111,8 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
.setLoginName(request.getLoginName())
.setPhone(request.getPhone())
.setTitleId(request.getTitleId())
.setProductionLineId(request.getProductionLineId())
.setDataRoleId(request.getDataRoleId())
.setCreateBy(AdminUserUtil.getUserId())
.setCreateTime(LocalDateTime.now());
save(user);
@ -132,6 +142,8 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
pageData.setPage((int) page.getCurrent());
pageData.setPageSize((int) page.getSize());
pageData.setTotal((int) page.getTotal());
List<ProductionLine> productionLines=productionLineService.list();
List<DataRole> dataRoles=dataRoleService.list();
pageData.setItems(page.getRecords().stream().map(u ->{
AdminUser userCreate=getById(u.getCreateBy());
return new AdminUserVO()
@ -151,6 +163,10 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
.setDepartmentId(u.getDepartmentId())
.setTitleId(u.getTitleId())
.setTitleName(getTitleName(u.getTitleId()))
.setProductionLineId(u.getProductionLineId())
.setProductionLineName(productionLines.stream().filter(p->Objects.equals(p.getId(),u.getProductionLineId())).findFirst().map(ProductionLine::getName).orElse(""))
.setDataRoleId(u.getDataRoleId())
.setDataRoleName(dataRoles.stream().filter(p->Objects.equals(p.getId(),u.getDataRoleId())).findFirst().map(DataRole::getName).orElse(""))
.setDepartmentName(getDepartmentName(u.getDepartmentId()))
.setRoles(getRoles(u.getId()));
}).collect(Collectors.toList()));

View File

@ -0,0 +1,78 @@
package com.nflg.mobilebroken.repository.service.impl;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.DataRoleAddRequest;
import com.nflg.mobilebroken.common.pojo.request.DataRoleUpdateRequest;
import com.nflg.mobilebroken.common.pojo.request.EnableRoleRequest;
import com.nflg.mobilebroken.common.pojo.request.RoleSearchRequest;
import com.nflg.mobilebroken.common.pojo.vo.DataRoleVO;
import com.nflg.mobilebroken.common.pojo.vo.SimpleVO;
import com.nflg.mobilebroken.common.util.AdminUserUtil;
import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.DataRole;
import com.nflg.mobilebroken.repository.mapper.DataRoleMapper;
import com.nflg.mobilebroken.repository.service.IDataRoleService;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
* 数据权限角色 服务实现类
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
@Service
public class DataRoleServiceImpl extends ServiceImpl<DataRoleMapper, DataRole> implements IDataRoleService {
@Override
public void add(DataRoleAddRequest request) {
VUtils.trueThrowBusinessError(lambdaQuery().eq(DataRole::getName, request.getName()).exists())
.throwMessage("角色已存在,请勿重复添加");
save(new DataRole()
.setName(request.getName())
.setConfig(JSONUtil.toJsonStr(request.getConfigs()))
.setCreateBy(AdminUserUtil.getUserName())
.setCreateTime(LocalDateTime.now()));
}
@Override
public void update(DataRoleUpdateRequest request) {
VUtils.trueThrowBusinessError(lambdaQuery().eq(DataRole::getName, request.getName()).ne(DataRole::getId, request.getId()).exists())
.throwMessage("角色已存在");
lambdaUpdate()
.set(DataRole::getName, request.getName())
.set(DataRole::getEnable, request.getEnable())
.set(DataRole::getConfig, JSONUtil.toJsonStr(request.getConfigs()))
.set(DataRole::getUpdateBy, AdminUserUtil.getUserName())
.set(DataRole::getUpdateTime, LocalDateTime.now())
.eq(DataRole::getId, request.getId())
.update();
}
@Override
public void enable(EnableRoleRequest request) {
lambdaUpdate()
.set(DataRole::getEnable, request.getEnable())
.set(DataRole::getUpdateBy, AdminUserUtil.getUserName())
.set(DataRole::getUpdateTime, LocalDateTime.now())
.eq(DataRole::getId, request.getRoleId())
.update();
}
@Override
public PageData<DataRoleVO> search(RoleSearchRequest request) {
return baseMapper.search(request, new Page<>(request.getPage(), request.getPageSize()));
}
@Override
public List<SimpleVO> getSimpleRoles() {
return baseMapper.getSimpleRoles();
}
}

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.mobilebroken.repository.mapper.DataRoleMapper">
<select id="search" resultType="com.nflg.mobilebroken.common.pojo.vo.DataRoleVO">
select *
from data_role
<where>
<if test="request.name != null and request.name!=''">
and `name` like concat('%', #{request.name}, '%')
</if>
</where>
</select>
<select id="getSimpleRoles" resultType="com.nflg.mobilebroken.common.pojo.vo.SimpleVO">
select * from data_role where enable=1
</select>
</mapper>

View File

@ -34,7 +34,7 @@ public class CodeGenerator {
)
.strategyConfig(builder -> {
builder
.addInclude("^production_line*") //只生成指定表
.addInclude("admin_user_data_role_map") //只生成指定表
.entityBuilder()
.enableLombok()
.enableChainModel()