通知公告新增阅读用户列表
This commit is contained in:
parent
80f24d9403
commit
ec11034c61
|
|
@ -109,7 +109,6 @@ public class SysNoticeController extends BaseController
|
||||||
/**
|
/**
|
||||||
* 查询公告详细
|
* 查询公告详细
|
||||||
*/
|
*/
|
||||||
@RequiresPermissions("system:notice:list")
|
|
||||||
@GetMapping("/view/{noticeId}")
|
@GetMapping("/view/{noticeId}")
|
||||||
public String view(@PathVariable("noticeId") Long noticeId, ModelMap mmap)
|
public String view(@PathVariable("noticeId") Long noticeId, ModelMap mmap)
|
||||||
{
|
{
|
||||||
|
|
@ -157,6 +156,30 @@ public class SysNoticeController extends BaseController
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 已读用户页面
|
||||||
|
*/
|
||||||
|
@RequiresPermissions("system:notice:list")
|
||||||
|
@GetMapping("/readUsers/{noticeId}")
|
||||||
|
public String readUsers(@PathVariable("noticeId") Long noticeId, ModelMap mmap)
|
||||||
|
{
|
||||||
|
mmap.put("notice", noticeService.selectNoticeById(noticeId));
|
||||||
|
return prefix + "/readUsers";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 已读用户列表数据
|
||||||
|
*/
|
||||||
|
@RequiresPermissions("system:notice:list")
|
||||||
|
@PostMapping("/readUsers/list")
|
||||||
|
@ResponseBody
|
||||||
|
public TableDataInfo readUsersList(Long noticeId, String searchValue)
|
||||||
|
{
|
||||||
|
startPage();
|
||||||
|
List<?> list = noticeReadService.selectReadUsersByNoticeId(noticeId, searchValue);
|
||||||
|
return getDataTable(list);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除公告
|
* 删除公告
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -993,13 +993,15 @@ var table = {
|
||||||
closeItem(dataId);
|
closeItem(dataId);
|
||||||
},
|
},
|
||||||
// 右侧弹出窗口打开
|
// 右侧弹出窗口打开
|
||||||
popupRight: function(title, url){
|
popupRight: function(title, url, width, height) {
|
||||||
var width = 150;
|
var defaultWidth = 150;
|
||||||
if (top.location !== self.location) {
|
if (top.location !== self.location) {
|
||||||
if ($(top.window).outerWidth() < 400) {
|
if ($(top.window).outerWidth() < 400) {
|
||||||
width = 50;
|
defaultWidth = 50;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
var finalWidth = width || ($(window).outerWidth() - defaultWidth) + 'px';
|
||||||
|
var finalHeight = height || '100%';
|
||||||
top.layer.open({
|
top.layer.open({
|
||||||
type: 2,
|
type: 2,
|
||||||
offset: 'r',
|
offset: 'r',
|
||||||
|
|
@ -1008,7 +1010,7 @@ var table = {
|
||||||
title: title,
|
title: title,
|
||||||
shade: 0.3,
|
shade: 0.3,
|
||||||
shadeClose: true,
|
shadeClose: true,
|
||||||
area: [($(window).outerWidth() - width) + 'px', '100%'],
|
area: [finalWidth, finalHeight],
|
||||||
content: url
|
content: url
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
@ -1657,7 +1659,9 @@ var table = {
|
||||||
if (!format) format = "yyyy-MM-dd";
|
if (!format) format = "yyyy-MM-dd";
|
||||||
switch (typeof date) {
|
switch (typeof date) {
|
||||||
case "string":
|
case "string":
|
||||||
date = new Date(date.replace(/-/g, "/"));
|
date = date.replace("T", " ");
|
||||||
|
date = date.replace(/-/g, "/");
|
||||||
|
date = new Date(date);
|
||||||
break;
|
break;
|
||||||
case "number":
|
case "number":
|
||||||
date = new Date(date);
|
date = new Date(date);
|
||||||
|
|
|
||||||
|
|
@ -1,121 +1,128 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
|
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
|
||||||
<head>
|
<head>
|
||||||
<th:block th:include="include :: header('通知公告列表')" />
|
<th:block th:include="include :: header('通知公告列表')" />
|
||||||
</head>
|
</head>
|
||||||
<body class="gray-bg">
|
<body class="gray-bg">
|
||||||
<div class="container-div">
|
<div class="container-div">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-12 search-collapse">
|
<div class="col-sm-12 search-collapse">
|
||||||
<form id="notice-form">
|
<form id="notice-form">
|
||||||
<div class="select-list">
|
<div class="select-list">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
公告标题:<input type="text" name="noticeTitle"/>
|
公告标题:<input type="text" name="noticeTitle"/>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
操作人员:<input type="text" name="createBy"/>
|
操作人员:<input type="text" name="createBy"/>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
公告类型:<select name="noticeType" th:with="type=${@dict.getType('sys_notice_type')}">
|
公告类型:<select name="noticeType" th:with="type=${@dict.getType('sys_notice_type')}">
|
||||||
<option value="">所有</option>
|
<option value="">所有</option>
|
||||||
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
|
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
|
||||||
</select>
|
</select>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i> 搜索</a>
|
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i> 搜索</a>
|
||||||
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i> 重置</a>
|
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i> 重置</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="btn-group-sm" id="toolbar" role="group">
|
<div class="btn-group-sm" id="toolbar" role="group">
|
||||||
<a class="btn btn-success" onclick="$.operate.addFull()" shiro:hasPermission="system:notice:add">
|
<a class="btn btn-success" onclick="$.operate.addFull()" shiro:hasPermission="system:notice:add">
|
||||||
<i class="fa fa-plus"></i> 新增
|
<i class="fa fa-plus"></i> 新增
|
||||||
</a>
|
</a>
|
||||||
<a class="btn btn-primary single disabled" onclick="$.operate.editFull()" shiro:hasPermission="system:notice:edit">
|
<a class="btn btn-primary single disabled" onclick="$.operate.editFull()" shiro:hasPermission="system:notice:edit">
|
||||||
<i class="fa fa-edit"></i> 修改
|
<i class="fa fa-edit"></i> 修改
|
||||||
</a>
|
</a>
|
||||||
<a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="system:notice:remove">
|
<a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="system:notice:remove">
|
||||||
<i class="fa fa-remove"></i> 删除
|
<i class="fa fa-remove"></i> 删除
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-sm-12 select-table table-striped">
|
<div class="col-sm-12 select-table table-striped">
|
||||||
<table id="bootstrap-table"></table>
|
<table id="bootstrap-table"></table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<th:block th:include="include :: footer" />
|
<th:block th:include="include :: footer" />
|
||||||
<script th:inline="javascript">
|
<script th:inline="javascript">
|
||||||
var editFlag = [[${@permission.hasPermi('system:notice:edit')}]];
|
var editFlag = [[${@permission.hasPermi('system:notice:edit')}]];
|
||||||
var removeFlag = [[${@permission.hasPermi('system:notice:remove')}]];
|
var removeFlag = [[${@permission.hasPermi('system:notice:remove')}]];
|
||||||
var types = [[${@dict.getType('sys_notice_type')}]];
|
var types = [[${@dict.getType('sys_notice_type')}]];
|
||||||
var datas = [[${@dict.getType('sys_notice_status')}]];
|
var datas = [[${@dict.getType('sys_notice_status')}]];
|
||||||
var prefix = ctx + "system/notice";
|
var prefix = ctx + "system/notice";
|
||||||
|
|
||||||
$(function() {
|
$(function() {
|
||||||
var options = {
|
var options = {
|
||||||
url: prefix + "/list",
|
url: prefix + "/list",
|
||||||
viewUrl: prefix + "/view/{id}",
|
viewUrl: prefix + "/view/{id}",
|
||||||
createUrl: prefix + "/add",
|
createUrl: prefix + "/add",
|
||||||
updateUrl: prefix + "/edit/{id}",
|
updateUrl: prefix + "/edit/{id}",
|
||||||
removeUrl: prefix + "/remove",
|
removeUrl: prefix + "/remove",
|
||||||
modalName: "公告",
|
modalName: "公告",
|
||||||
columns: [{
|
columns: [{
|
||||||
checkbox: true
|
checkbox: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field : 'noticeId',
|
field : 'noticeId',
|
||||||
title : '序号'
|
title : '序号'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'noticeTitle',
|
field: 'noticeTitle',
|
||||||
title: '公告标题',
|
title: '公告标题',
|
||||||
formatter: function (value, row, index) {
|
formatter: function (value, row, index) {
|
||||||
return '<a href="javascript:void(0)" onclick="$.operate.view(\'' + row.noticeId + '\')">' + value + '</a>';
|
return '<a href="javascript:void(0)" onclick="$.operate.view(\'' + row.noticeId + '\')">' + value + '</a>';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'noticeType',
|
field: 'noticeType',
|
||||||
title: '公告类型',
|
title: '公告类型',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
formatter: function(value, row, index) {
|
formatter: function(value, row, index) {
|
||||||
return $.table.selectDictLabel(types, value);
|
return $.table.selectDictLabel(types, value);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'status',
|
field: 'status',
|
||||||
title: '状态',
|
title: '状态',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
formatter: function(value, row, index) {
|
formatter: function(value, row, index) {
|
||||||
return $.table.selectDictLabel(datas, value);
|
return $.table.selectDictLabel(datas, value);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field : 'createBy',
|
field : 'createBy',
|
||||||
title : '创建者'
|
title : '创建者'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'createTime',
|
field: 'createTime',
|
||||||
title: '创建时间',
|
title: '创建时间',
|
||||||
sortable: true
|
sortable: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '操作',
|
title: '操作',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
formatter: function(value, row, index) {
|
formatter: function(value, row, index) {
|
||||||
var actions = [];
|
var actions = [];
|
||||||
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.editFull(\'' + row.noticeId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
|
actions.push('<a class="btn btn-info btn-xs" href="javascript:void(0)" onclick="showReadUsers(\'' + row.noticeId + '\', \'' + row.noticeTitle + '\')"><i class="fa fa-eye"></i>阅读用户</a> ');
|
||||||
actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.noticeId + '\')"><i class="fa fa-remove"></i>删除</a>');
|
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.editFull(\'' + row.noticeId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
|
||||||
return actions.join('');
|
actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.noticeId + '\')"><i class="fa fa-remove"></i>删除</a>');
|
||||||
}
|
return actions.join('');
|
||||||
}]
|
}
|
||||||
};
|
}]
|
||||||
$.table.init(options);
|
};
|
||||||
});
|
$.table.init(options);
|
||||||
</script>
|
});
|
||||||
</body>
|
|
||||||
|
// 阅读用户
|
||||||
|
function showReadUsers(noticeId, noticeTitle) {
|
||||||
|
var url = ctx + "system/notice/readUsers/" + noticeId;
|
||||||
|
$.modal.popupRight("「" + noticeTitle + "」阅读用户", url, '800px');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<th:block th:include="include :: header('已读用户')" />
|
||||||
|
</head>
|
||||||
|
<body class="gray-bg">
|
||||||
|
<div class="container-div">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12 select-table table-striped">
|
||||||
|
<table id="bootstrap-table"></table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<th:block th:include="include :: footer" />
|
||||||
|
<script th:inline="javascript">
|
||||||
|
var prefix = ctx + "system/notice";
|
||||||
|
var noticeId = [[${notice.noticeId}]];
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
var options = {
|
||||||
|
url: prefix + "/readUsers/list",
|
||||||
|
search: true,
|
||||||
|
showSearch: false,
|
||||||
|
queryParams: queryParams,
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
field: 'loginName',
|
||||||
|
title: '登录名称'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'userName',
|
||||||
|
title: '用户名称'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'deptName',
|
||||||
|
title: '所属部门',
|
||||||
|
align: 'center'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'phonenumber',
|
||||||
|
title: '手机号码',
|
||||||
|
align: 'center'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'readTime',
|
||||||
|
title: '阅读时间',
|
||||||
|
align: 'center',
|
||||||
|
sortable: true,
|
||||||
|
formatter: function(value, row, index) {
|
||||||
|
return $.common.dateFormat(value, 'yyyy-MM-dd HH:mm:ss');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
$.table.init(options);
|
||||||
|
});
|
||||||
|
|
||||||
|
function queryParams(params) {
|
||||||
|
var search = $.table.queryParams(params);
|
||||||
|
search.noticeId = noticeId;
|
||||||
|
return search;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
package com.ruoyi.system.mapper;
|
package com.ruoyi.system.mapper;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
import com.ruoyi.system.domain.SysNoticeRead;
|
|
||||||
import com.ruoyi.system.domain.SysNotice;
|
import com.ruoyi.system.domain.SysNotice;
|
||||||
|
import com.ruoyi.system.domain.SysNoticeRead;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 公告已读记录 数据层
|
* 公告已读记录 数据层
|
||||||
|
|
@ -62,4 +63,13 @@ public interface SysNoticeReadMapper
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
public int deleteByNoticeIds(@Param("noticeIds") String[] noticeIds);
|
public int deleteByNoticeIds(@Param("noticeIds") String[] noticeIds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询已阅读某公告的用户列表
|
||||||
|
*
|
||||||
|
* @param noticeId 公告ID
|
||||||
|
* @param searchValue 搜索值
|
||||||
|
* @return 已读用户列表
|
||||||
|
*/
|
||||||
|
public List<Map<String, Object>> selectReadUsersByNoticeId(@Param("noticeId") Long noticeId, @Param("searchValue") String searchValue);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package com.ruoyi.system.service;
|
package com.ruoyi.system.service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import com.ruoyi.system.domain.SysNotice;
|
import com.ruoyi.system.domain.SysNotice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -49,4 +50,13 @@ public interface ISysNoticeReadService
|
||||||
* @param ids 公告ID字符串(逗号分隔)
|
* @param ids 公告ID字符串(逗号分隔)
|
||||||
*/
|
*/
|
||||||
public void deleteByNoticeIds(String ids);
|
public void deleteByNoticeIds(String ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询已阅读某公告的用户列表
|
||||||
|
*
|
||||||
|
* @param noticeId 公告ID
|
||||||
|
* @param searchValue 搜索值
|
||||||
|
* @return 已读用户列表
|
||||||
|
*/
|
||||||
|
public List<Map<String, Object>> selectReadUsersByNoticeId(Long noticeId, String searchValue);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,12 @@
|
||||||
package com.ruoyi.system.service.impl;
|
package com.ruoyi.system.service.impl;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import com.ruoyi.common.core.text.Convert;
|
import com.ruoyi.common.core.text.Convert;
|
||||||
import com.ruoyi.system.domain.SysNoticeRead;
|
|
||||||
import com.ruoyi.system.domain.SysNotice;
|
import com.ruoyi.system.domain.SysNotice;
|
||||||
|
import com.ruoyi.system.domain.SysNoticeRead;
|
||||||
import com.ruoyi.system.mapper.SysNoticeReadMapper;
|
import com.ruoyi.system.mapper.SysNoticeReadMapper;
|
||||||
import com.ruoyi.system.service.ISysNoticeReadService;
|
import com.ruoyi.system.service.ISysNoticeReadService;
|
||||||
|
|
||||||
|
|
@ -71,4 +72,13 @@ public class SysNoticeReadServiceImpl implements ISysNoticeReadService
|
||||||
{
|
{
|
||||||
noticeReadMapper.deleteByNoticeIds(Convert.toStrArray(ids));
|
noticeReadMapper.deleteByNoticeIds(Convert.toStrArray(ids));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询已阅读某公告的用户列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<Map<String, Object>> selectReadUsersByNoticeId(Long noticeId, String searchValue)
|
||||||
|
{
|
||||||
|
return noticeReadMapper.selectReadUsersByNoticeId(noticeId, searchValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -63,4 +63,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
</foreach>
|
</foreach>
|
||||||
</delete>
|
</delete>
|
||||||
|
|
||||||
|
<!-- 查询已阅读某公告的用户列表,支持按登录名/用户名模糊筛选 -->
|
||||||
|
<select id="selectReadUsersByNoticeId" resultType="java.util.Map">
|
||||||
|
select
|
||||||
|
u.user_id as userId,
|
||||||
|
u.login_name as loginName,
|
||||||
|
u.user_name as userName,
|
||||||
|
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.login_name like concat('%', #{searchValue}, '%')
|
||||||
|
or u.user_name like concat('%', #{searchValue}, '%')
|
||||||
|
)
|
||||||
|
</if>
|
||||||
|
order by r.read_time desc
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user