package com.dms.mapper; import com.dms.model.RolePermissionEntity; import java.time.LocalDateTime; import java.util.List; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; public interface RolePermissionMapper { @Select("SELECT * FROM sys_role_permission WHERE role_id = #{roleId} AND is_deleted = 0 " + "ORDER BY id ASC") List listActiveByRole(@Param("roleId") long roleId); /** 矩阵命中行:一级分类 × 种类 × 密级 × 部门范围(契约1.48,对齐 _matrix_actions)。 * topCategoryId 为一级分类 id(主体方案与分类下附件行);共享资料库行组用 * {@link #findLibraryMatrixRow}。 */ @Select("SELECT * FROM sys_role_permission WHERE role_id = #{roleId} " + "AND top_category_id = #{topCategoryId} AND doc_kind = #{docKind} " + "AND security_level = #{securityLevel} AND dept_scope = #{deptScope} " + "AND is_deleted = 0 LIMIT 1") RolePermissionEntity findMatrixRow(@Param("roleId") long roleId, @Param("topCategoryId") long topCategoryId, @Param("docKind") String docKind, @Param("securityLevel") String securityLevel, @Param("deptScope") String deptScope); /** 共享资料库行组(top_category_id IS NULL,仅 OWN):未挂载附件判定用。 */ @Select("SELECT * FROM sys_role_permission WHERE role_id = #{roleId} " + "AND top_category_id IS NULL AND doc_kind = #{docKind} " + "AND security_level = #{securityLevel} AND dept_scope = 'OWN' " + "AND is_deleted = 0 LIMIT 1") RolePermissionEntity findLibraryMatrixRow(@Param("roleId") long roleId, @Param("docKind") String docKind, @Param("securityLevel") String securityLevel); /** 会话 permUpload 位:生效角色任一主体方案 OWN 行 can_upload=1(契约1.31)。 */ @Select("SELECT COUNT(*) FROM sys_role_permission WHERE role_id = #{roleId} " + "AND doc_kind = 'MAIN' AND dept_scope = 'OWN' AND can_upload = 1 " + "AND is_deleted = 0") int countOwnUpload(@Param("roleId") long roleId); /** 会话 permAttachmentLibrary 位(契约1.41/1.44):任一共享资料行任一附件位=1。 */ @Select("SELECT COUNT(*) FROM sys_role_permission WHERE role_id = #{roleId} " + "AND doc_kind != 'MAIN' AND (can_attachment_view = 1 " + "OR can_attachment_download = 1 OR can_attachment_edit = 1 " + "OR can_attachment_upload = 1 OR can_attachment_delete = 1) " + "AND is_deleted = 0") int countOwnAnyAttachment(@Param("roleId") long roleId); /** 会话 permAttachmentUpload 位(契约1.41):任一共享资料行附件上传位=1。 */ @Select("SELECT COUNT(*) FROM sys_role_permission WHERE role_id = #{roleId} " + "AND doc_kind != 'MAIN' AND can_attachment_upload = 1 AND is_deleted = 0") int countOwnAttachmentUpload(@Param("roleId") long roleId); /** 新建角色种子行(can_* 走 DB 默认值 0;top_category_id/doc_kind 见实体)。 */ @Insert("INSERT INTO sys_role_permission (role_id, top_category_id, doc_kind, " + "security_level, dept_scope, created_by, updated_by) VALUES " + "(#{roleId}, #{topCategoryId}, #{docKind}, #{securityLevel}, #{deptScope}, " + "#{createdBy}, #{updatedBy})") int insert(RolePermissionEntity row); /** 角色删除时矩阵行级联软删。 */ @Update("UPDATE sys_role_permission SET is_deleted = 1, deleted_at = #{now}, " + "updated_by = #{actorId}, updated_at = #{now} " + "WHERE role_id = #{roleId} AND is_deleted = 0") int softDeleteByRole(@Param("roleId") long roleId, @Param("now") LocalDateTime now, @Param("actorId") Long actorId); @Update("UPDATE sys_role_permission SET can_view = #{canView}, " + "can_upload = #{canUpload}, " + "can_download = #{canDownload}, can_edit = #{canEdit}, " + "can_delete = #{canDelete}, can_config_permission = #{canConfigPermission}, " + "can_bind_attachment = #{canBindAttachment}, " + "can_unbind_attachment = #{canUnbindAttachment}, " + "can_attachment_upload = #{canAttachmentUpload}, " + "can_attachment_edit = #{canAttachmentEdit}, " + "can_attachment_view = #{canAttachmentView}, " + "can_attachment_download = #{canAttachmentDownload}, " + "can_attachment_delete = #{canAttachmentDelete}, " + "updated_by = #{updatedBy}, updated_at = #{updatedAt} WHERE id = #{id}") int updateFlags(RolePermissionEntity row); }