刘光辉
昨天 bb638871a7fb692d80f1b7a758f991dc0879002c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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<LimsBaogaoShouquanEntity> {
 
    /**
     * 是否存在一条「未软删 + 启用 + 级别命中 + 用户在被授权列表 + 分类在授权清单」的记录。
     *
     * <p>三个判定列均为 JSON 数组:
     * <ul>
     *   <li>{@code bei_shouquanren}:被授权用户列表 ["userId1","userId2"]</li>
     *   <li>{@code shenhe_jibie}:授权的审核级别集合 ["baogao_zhizhuo","baogao_shenhe","baogao_qianfa"]</li>
     *   <li>{@code shenhe_fenlei}:授权的分类集合 ["CP","ZJP","YY",...]</li>
     * </ul>
     * 用 {@code haystack::jsonb @> to_jsonb(needle::text)} 统一判断"单值 needle 是否在数组 haystack 中"
     * (PostgreSQL 写法;MySQL 时代为 {@code JSON_CONTAINS(haystack, JSON_QUOTE(needle))})。
     *
     * <p><b>历史变更(2026-05-21)</b>:早期 {@code shenhe_jibie} 是 PLAIN 单选字符串
     * (baogao_zhizhuo / baogao_shenhe / baogao_qianfa 三选一),SQL 用 {@code = #{jibie}} 直接等值匹配。
     * 业务方后续将该字段调整为多选 JSON 数组(一条授权记录可同时覆盖多个审核级别),
     * 已统一为数组包含判断。<b>不要再退回到等值匹配</b>,否则会漏判数组形态的现网数据;
     * 历史 PLAIN 单值数据已被业务侧逻辑删除({@code f_delete_mark=1}),不影响。
     * 注意:三列是 varchar 存 JSON 文本,{@code ::jsonb} 遇非法 JSON 会抛错——若回归时踩到脏数据,
     * 改用 {@code CASE WHEN pg_input_is_valid(col,'jsonb') THEN ... END} 兜底。
     *
     * <p>查 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);
}