liusuyi
2026-05-30 f4f4fc53260eb67483dce406a963628273786a61
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?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.ard.system.mapper.SysNoticeReadMapper">
 
    <resultMap type="SysNoticeRead" id="SysNoticeReadResult">
        <id     property="readId"   column="read_id"     />
        <result property="noticeId" column="notice_id"   />
        <result property="userId"   column="user_id"     />
        <result property="readTime" column="read_time"   />
    </resultMap>
 
    <!-- 新增已读记录 -->
    <insert id="insertNoticeRead" parameterType="SysNoticeRead">
        insert ignore into sys_notice_read (notice_id, user_id, read_time)
        values (#{noticeId}, #{userId}, sysdate())
    </insert>
 
    <!-- 查询未读数量:正常状态公告 减去 当前用户已读数 -->
    <select id="selectUnreadCount" resultType="int">
        select count(*) from sys_notice n
        where n.status = '0' and not exists (select 1 from sys_notice_read r where r.notice_id = n.notice_id and r.user_id = #{userId})
    </select>
 
    <!-- 查询是否已读 -->
    <select id="selectIsRead" resultType="int">
        select count(*) from sys_notice_read where notice_id = #{noticeId} and user_id = #{userId}
    </select>
 
    <!-- 查询带已读状态的公告列表(直接在SQL中限制条数) -->
    <select id="selectNoticeListWithReadStatus" resultType="SysNotice">
        select
            n.notice_id    as noticeId,
            n.notice_title as noticeTitle,
            n.notice_type  as noticeType,
            n.status,
            n.create_by    as createBy,
            n.create_time  as createTime,
            case when r.notice_id is not null then true else false end as isRead
        from sys_notice n
        left join sys_notice_read r
            on r.notice_id = n.notice_id and r.user_id = #{userId}
        where n.status = '0'
        order by n.notice_id desc
        limit #{limit}
    </select>
 
    <!-- 批量标记已读 -->
    <insert id="insertNoticeReadBatch">
        insert ignore into sys_notice_read (notice_id, user_id, read_time)
        values
        <foreach collection="noticeIds" item="noticeId" separator=",">
            (#{noticeId}, #{userId}, sysdate())
        </foreach>
    </insert>
 
    <!-- 删除公告时清理已读记录 -->
    <delete id="deleteByNoticeIds">
        delete from sys_notice_read where notice_id in
        <foreach collection="noticeIds" item="noticeId" open="(" separator="," close=")">
            #{noticeId}
        </foreach>
    </delete>
 
    <!-- 查询已阅读某公告的用户列表,支持按登录名/用户名模糊筛选 -->
    <select id="selectReadUsersByNoticeId" resultType="java.util.Map">
        select
            u.user_id      as userId,
            u.user_name    as userName,
            u.nick_name    as nickName,
            d.dept_name    as deptName,
            u.phonenumber  as phonenumber,
            r.read_time    as readTime
        from sys_notice_read r
        inner join sys_user u on u.user_id = r.user_id and u.del_flag = '0'
        left join sys_dept d on d.dept_id = u.dept_id
        where r.notice_id = #{noticeId}
        <if test="searchValue != null and searchValue != ''">
            and (
                u.user_name like concat('%', #{searchValue}, '%')
                or u.nick_name like concat('%', #{searchValue}, '%')
            )
        </if>
        order by r.read_time desc
    </select>
 
</mapper>