package jnpf.limsMapper; import jnpf.base.mapper.SuperMapper; import jnpf.limsEntity.LimsBaogaoShouquanEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @Mapper public interface LimsBaogaoShouquanMapper extends SuperMapper { /** * 是否存在一条「未软删 + 启用 + 级别命中 + 用户在被授权列表 + 分类在授权清单」的记录。 * *

三个判定列均为 JSON 数组: *

* 用 {@code haystack::jsonb @> to_jsonb(needle::text)} 统一判断"单值 needle 是否在数组 haystack 中" * (PostgreSQL 写法;MySQL 时代为 {@code JSON_CONTAINS(haystack, JSON_QUOTE(needle))})。 * *

历史变更(2026-05-21):早期 {@code shenhe_jibie} 是 PLAIN 单选字符串 * (baogao_zhizhuo / baogao_shenhe / baogao_qianfa 三选一),SQL 用 {@code = #{jibie}} 直接等值匹配。 * 业务方后续将该字段调整为多选 JSON 数组(一条授权记录可同时覆盖多个审核级别), * 已统一为数组包含判断。不要再退回到等值匹配,否则会漏判数组形态的现网数据; * 历史 PLAIN 单值数据已被业务侧逻辑删除({@code f_delete_mark=1}),不影响。 * 注意:三列是 varchar 存 JSON 文本,{@code ::jsonb} 遇非法 JSON 会抛错——若回归时踩到脏数据, * 改用 {@code CASE WHEN pg_input_is_valid(col,'jsonb') THEN ... END} 兜底。 * *

查 1 条 LIMIT 1,避免重复授权记录把 count 拉大。 */ @Select("SELECT COUNT(*) FROM (" + " SELECT 1 FROM lims_baogao_shouquan" + " WHERE (f_delete_mark IS NULL OR f_delete_mark <> 1)" + " AND biz_enabled = 'yes'" + " AND shenhe_jibie::jsonb @> to_jsonb(#{jibie}::text)" + " AND bei_shouquanren::jsonb @> to_jsonb(#{userId}::text)" + " AND shenhe_fenlei::jsonb @> to_jsonb(#{bizType}::text)" + " LIMIT 1" + ") AS t") int countAuthority(@Param("userId") String userId, @Param("jibie") String jibie, @Param("bizType") String bizType); }