去掉演示数据bizdata

This commit is contained in:
wh
2026-04-27 00:05:59 +08:00
parent ebe8b6c7ed
commit 849e78658d
7 changed files with 9 additions and 186 deletions

View File

@@ -1,24 +0,0 @@
package com.labelsys.backend.dto.response;
import com.labelsys.backend.entity.BizDataRecord;
import com.labelsys.backend.enums.UserRole;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "数据记录响应")
public record DataRecordResponse(
@Schema(description = "记录ID") Long id,
@Schema(description = "公司ID") Long companyId,
@Schema(description = "创建人ID") Long creatorId,
@Schema(description = "创建人角色枚举值EMPLOYEE员工、MANAGER部门经理、ENGINEER总工程师") UserRole creatorRole,
@Schema(description = "记录名称") String recordName
) {
public static DataRecordResponse from(BizDataRecord record) {
return new DataRecordResponse(
record.getId(),
record.getCompanyId(),
record.getCreatorId(),
record.getCreatorRole(),
record.getRecordName()
);
}
}

View File

@@ -1,27 +0,0 @@
package com.labelsys.backend.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.labelsys.backend.enums.UserRole;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("biz_data_record")
public class BizDataRecord {
@TableId(type = IdType.INPUT)
private Long id;
private Long companyId;
private Long creatorId;
private UserRole creatorRole;
private String recordName;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}

View File

@@ -1,15 +0,0 @@
package com.labelsys.backend.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.labelsys.backend.entity.BizDataRecord;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface BizDataRecordMapper extends BaseMapper<BizDataRecord> {
List<BizDataRecord> listVisibleByEmployee(@Param("companyId") Long companyId, @Param("creatorId") Long creatorId);
List<BizDataRecord> listVisibleByManager(@Param("companyId") Long companyId);
List<BizDataRecord> listVisibleByEngineer(@Param("companyId") Long companyId);
}

View File

@@ -1,30 +1,15 @@
package com.labelsys.backend.service; package com.labelsys.backend.service;
import com.labelsys.backend.context.LoginUser; import com.labelsys.backend.context.LoginUser;
import com.labelsys.backend.entity.BizDataRecord;
import com.labelsys.backend.enums.UserRole; import com.labelsys.backend.enums.UserRole;
import com.labelsys.backend.mapper.BizDataRecordMapper;
import java.util.List; import java.util.List;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
@RequiredArgsConstructor
public class DataPermissionService { public class DataPermissionService {
private final BizDataRecordMapper bizDataRecordMapper;
public List<BizDataRecord> listVisibleRecords(LoginUser currentUser) {
return switch (currentUser.role()) {
case EMPLOYEE -> bizDataRecordMapper.listVisibleByEmployee(currentUser.companyId(), currentUser.userId());
case MANAGER -> bizDataRecordMapper.listVisibleByManager(currentUser.companyId());
case ENGINEER -> bizDataRecordMapper.listVisibleByEngineer(currentUser.companyId());
};
}
public boolean canAccessCreator(LoginUser currentUser, Long creatorId, UserRole creatorRole) { public boolean canAccessCreator(LoginUser currentUser, Long creatorId, UserRole creatorRole) {
return switch (currentUser.role()) { return switch (currentUser.role()) {
case EMPLOYEE -> currentUser.userId().equals(creatorId); case EMPLOYEE -> currentUser.userId().equals(creatorId);
@@ -34,21 +19,14 @@ public class DataPermissionService {
} }
/** /**
* 通用数据过滤方法(内存过滤,适用于已加载的数据) * Generic in-memory role-based data filter for records already loaded in memory.
*
* @param currentUser 当前登录用户
* @param allRecords 待过滤的全量数据列表
* @param roleExtractor 从数据对象中提取"关联角色"或"创建者角色"的函数
* @param ownerIdExtractor 从数据对象中提取"所有者ID"的函数(用于员工只能看自己的情况)
* @param <T> 数据类型
* @return 过滤后的数据列表
*/ */
public <T> List<T> filterByRole( public <T> List<T> filterByRole(
LoginUser currentUser, LoginUser currentUser,
List<T> allRecords, List<T> allRecords,
Function<T, UserRole> roleExtractor, Function<T, UserRole> roleExtractor,
Function<T, Long> ownerIdExtractor) { Function<T, Long> ownerIdExtractor) {
if (allRecords == null || allRecords.isEmpty()) { if (allRecords == null || allRecords.isEmpty()) {
return List.of(); return List.of();
} }
@@ -62,49 +40,29 @@ public class DataPermissionService {
Long recordOwnerId = ownerIdExtractor.apply(record); Long recordOwnerId = ownerIdExtractor.apply(record);
return switch (currentRole) { return switch (currentRole) {
case EMPLOYEE -> case EMPLOYEE -> currentUserId.equals(recordOwnerId);
currentUserId.equals(recordOwnerId); case MANAGER -> recordRole == UserRole.EMPLOYEE || recordRole == UserRole.MANAGER;
case ENGINEER -> true;
case MANAGER ->
recordRole == UserRole.EMPLOYEE || recordRole == UserRole.MANAGER;
case ENGINEER ->
true;
}; };
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
/** /**
* 针对 BizDataRecord 的便捷调用方法 * Returns the creator roles visible to the current user for SQL-side filtering.
*/
public List<BizDataRecord> listVisibleRecordsGeneric(LoginUser currentUser, List<BizDataRecord> allRecords) {
return filterByRole(
currentUser,
allRecords,
BizDataRecord::getCreatorRole,
BizDataRecord::getCreatorId
);
}
/**
* 获取当前用户允许查看的角色列表(用于构建 SQL 查询条件)
*
* @param currentUser 当前登录用户
* @return 允许查看的角色列表
*/ */
public List<String> getAllowedRoles(LoginUser currentUser) { public List<String> getAllowedRoles(LoginUser currentUser) {
return switch (currentUser.role()) { return switch (currentUser.role()) {
case EMPLOYEE -> List.of(); // 员工通过 userId 过滤,不需要角色列表 case EMPLOYEE -> List.of();
case MANAGER -> List.of("EMPLOYEE", "MANAGER"); case MANAGER -> List.of("EMPLOYEE", "MANAGER");
case ENGINEER -> List.of("EMPLOYEE", "MANAGER", "ENGINEER"); case ENGINEER -> List.of("EMPLOYEE", "MANAGER", "ENGINEER");
}; };
} }
/** /**
* 判断当前用户是否应该通过 userId 过滤(员工专属) * Whether SQL queries should additionally restrict by creator/user id.
*/ */
public boolean shouldFilterByUserId(LoginUser currentUser) { public boolean shouldFilterByUserId(LoginUser currentUser) {
return currentUser.role() == UserRole.EMPLOYEE; return currentUser.role() == UserRole.EMPLOYEE;
} }
} }

View File

@@ -1,40 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.labelsys.backend.mapper.BizDataRecordMapper">
<resultMap id="BizDataRecordResultMap" type="com.labelsys.backend.entity.BizDataRecord">
<id column="id" property="id"/>
<result column="company_id" property="companyId"/>
<result column="creator_id" property="creatorId"/>
<result column="creator_role" property="creatorRole"/>
<result column="record_name" property="recordName"/>
<result column="created_at" property="createdAt"/>
<result column="updated_at" property="updatedAt"/>
</resultMap>
<sql id="RecordColumns">
id, company_id, creator_id, creator_role, record_name, created_at, updated_at
</sql>
<select id="listVisibleByEmployee" resultMap="BizDataRecordResultMap">
select <include refid="RecordColumns"/>
from biz_data_record
where company_id = #{companyId}
and creator_id = #{creatorId}
order by id
</select>
<select id="listVisibleByManager" resultMap="BizDataRecordResultMap">
select <include refid="RecordColumns"/>
from biz_data_record
where company_id = #{companyId}
and creator_role in ('EMPLOYEE', 'MANAGER')
order by id
</select>
<select id="listVisibleByEngineer" resultMap="BizDataRecordResultMap">
select <include refid="RecordColumns"/>
from biz_data_record
where company_id = #{companyId}
order by id
</select>
</mapper>

View File

@@ -55,12 +55,6 @@ INSERT INTO sys_config (
'{"provider":"rustfs","defaultBucket":"source-data"}', 'ENABLED', 2) '{"provider":"rustfs","defaultBucket":"source-data"}', 'ENABLED', 2)
ON CONFLICT DO NOTHING; ON CONFLICT DO NOTHING;
INSERT INTO biz_data_record (id, company_id, creator_id, creator_role, record_name) VALUES
(501, 2, 3, 'EMPLOYEE', '员工创建的数据'),
(502, 2, 5, 'MANAGER', '经理创建的数据'),
(503, 2, 6, 'ENGINEER', '总工程师创建的数据')
ON CONFLICT DO NOTHING;
INSERT INTO source_resource ( INSERT INTO source_resource (
id, company_id, creator_id, creator_role, resource_name, resource_type, id, company_id, creator_id, creator_role, resource_name, resource_type,
bucket_name, file_path, file_size, source_status, storage_provider, remark bucket_name, file_path, file_size, source_status, storage_provider, remark

View File

@@ -10,7 +10,6 @@ DROP TABLE IF EXISTS annotation_result CASCADE;
DROP TABLE IF EXISTS annotation_task_resource CASCADE; DROP TABLE IF EXISTS annotation_task_resource CASCADE;
DROP TABLE IF EXISTS annotation_task CASCADE; DROP TABLE IF EXISTS annotation_task CASCADE;
DROP TABLE IF EXISTS source_resource CASCADE; DROP TABLE IF EXISTS source_resource CASCADE;
DROP TABLE IF EXISTS biz_data_record CASCADE;
DROP TABLE IF EXISTS sys_config CASCADE; DROP TABLE IF EXISTS sys_config CASCADE;
DROP TABLE IF EXISTS sys_menu CASCADE; DROP TABLE IF EXISTS sys_menu CASCADE;
DROP TABLE IF EXISTS sys_user CASCADE; DROP TABLE IF EXISTS sys_user CASCADE;
@@ -117,27 +116,6 @@ COMMENT ON COLUMN sys_config.creator_id IS '创建人用户ID。';
COMMENT ON COLUMN sys_config.created_at IS '创建时间。'; COMMENT ON COLUMN sys_config.created_at IS '创建时间。';
COMMENT ON COLUMN sys_config.updated_at IS '更新时间。'; COMMENT ON COLUMN sys_config.updated_at IS '更新时间。';
CREATE TABLE IF NOT EXISTS biz_data_record (
id BIGINT PRIMARY KEY,
company_id BIGINT NOT NULL,
creator_id BIGINT NOT NULL,
creator_role VARCHAR(32) NOT NULL DEFAULT 'EMPLOYEE',
record_name VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_biz_data_record_company FOREIGN KEY (company_id) REFERENCES sys_company(id),
CONSTRAINT fk_biz_data_record_creator FOREIGN KEY (creator_id) REFERENCES sys_user(id)
);
COMMENT ON TABLE biz_data_record IS '一期数据权限演示表。';
COMMENT ON COLUMN biz_data_record.id IS '演示记录主键ID。';
COMMENT ON COLUMN biz_data_record.company_id IS '所属公司ID。';
COMMENT ON COLUMN biz_data_record.creator_id IS '创建人用户ID。';
COMMENT ON COLUMN biz_data_record.creator_role IS '创建人数据权限角色,默认 EMPLOYEE。';
COMMENT ON COLUMN biz_data_record.record_name IS '演示记录名称。';
COMMENT ON COLUMN biz_data_record.created_at IS '创建时间。';
COMMENT ON COLUMN biz_data_record.updated_at IS '更新时间。';
CREATE TABLE IF NOT EXISTS source_resource ( CREATE TABLE IF NOT EXISTS source_resource (
id BIGINT PRIMARY KEY, id BIGINT PRIMARY KEY,
company_id BIGINT NOT NULL, company_id BIGINT NOT NULL,
@@ -416,7 +394,6 @@ CREATE INDEX IF NOT EXISTS idx_sys_user_role ON sys_user(company_id, role);
CREATE INDEX IF NOT EXISTS idx_sys_user_position ON sys_user(company_id, position); CREATE INDEX IF NOT EXISTS idx_sys_user_position ON sys_user(company_id, position);
CREATE INDEX IF NOT EXISTS idx_sys_menu_company_sort ON sys_menu(company_id, sort_order); CREATE INDEX IF NOT EXISTS idx_sys_menu_company_sort ON sys_menu(company_id, sort_order);
CREATE INDEX IF NOT EXISTS idx_sys_config_company_type ON sys_config(company_id, config_type); CREATE INDEX IF NOT EXISTS idx_sys_config_company_type ON sys_config(company_id, config_type);
CREATE INDEX IF NOT EXISTS idx_biz_data_record_company_role ON biz_data_record(company_id, creator_role);
CREATE INDEX IF NOT EXISTS idx_source_resource_company_type ON source_resource(company_id, resource_type); CREATE INDEX IF NOT EXISTS idx_source_resource_company_type ON source_resource(company_id, resource_type);
CREATE INDEX IF NOT EXISTS idx_source_resource_company_status ON source_resource(company_id, source_status); CREATE INDEX IF NOT EXISTS idx_source_resource_company_status ON source_resource(company_id, source_status);
CREATE INDEX IF NOT EXISTS idx_source_resource_creator ON source_resource(company_id, creator_id); CREATE INDEX IF NOT EXISTS idx_source_resource_creator ON source_resource(company_id, creator_id);