123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704 |
- <?php
- require_once 'conn.php';
- checkLogin();
- // 获取当前登录员工ID
- $employee_id = $_SESSION['employee_id'];
- // 筛选参数
- $message_type = isset($_GET['message_type']) ? intval($_GET['message_type']) : 0;
- $is_read = isset($_GET['is_read']) ? intval($_GET['is_read']) : -1;
- $priority = isset($_GET['priority']) ? intval($_GET['priority']) : -1;
- $urlStr = '';
- // 搜索参数
- $keys = $_GET['Keys'] ?? '';
- $keyscode = mysqli_real_escape_string($conn, $keys);
- // 页码参数
- $page = $_GET['Page'] ?? 1;
- $ord = $_GET['Ord'] ?? '';
- $ordStr = !empty($ord) ? "$ord," : "";
- // 构建SQL查询
- $sql = "SELECT m.*, mr.is_read, mr.read_time
- FROM messages m
- LEFT JOIN message_recipients mr ON m.id = mr.message_id AND mr.employee_id = $employee_id
- WHERE (m.target_type = 2 OR (mr.employee_id = $employee_id)) AND (mr.is_deleted = 0 OR mr.is_deleted IS NULL)";
- // 添加筛选条件
- if ($message_type > 0) {
- $sql .= " AND m.message_type = $message_type";
- $urlStr .= "&message_type=" . urlencode($message_type);
- }
- if ($is_read >= 0) {
- $sql .= " AND mr.is_read = $is_read";
- $urlStr .= "&is_read=" . urlencode($is_read);
- }
- if ($priority >= 0) {
- $sql .= " AND m.priority = $priority";
- $urlStr .= "&priority=" . urlencode($priority);
- }
- // 关键词搜索
- if (!empty($keyscode)) {
- $sql .= " AND (m.title LIKE '%$keyscode%' OR m.content LIKE '%$keyscode%')";
- $urlStr .= "&Keys=" . urlencode($keys);
- }
- // 排序 - 未读优先,然后按时间倒序
- $sql .= " ORDER BY CASE WHEN mr.is_read = 0 OR mr.is_read IS NULL THEN 0 ELSE 1 END, m.created_at DESC";
- ?>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>消息列表</title>
- <link rel="stylesheet" href="css/common.css" type="text/css" />
- <link rel="stylesheet" href="css/alert.css" type="text/css" />
- <script src="js/jquery-1.7.2.min.js"></script>
- <script src="js/js.js"></script>
- <style>
- body {
- margin: 0;
- padding: 20px;
- background: #fff;
- }
- #man_zone {
- margin-left: 0;
- }
-
- /* 表格布局修复 */
- .table2 {
- width: 100%;
- }
-
- .theader, .tline {
- display: flex;
- flex-direction: row;
- align-items: center;
- width: 100%;
- border-bottom: 1px solid #ddd;
- }
-
- .theader {
- background-color: #f2f2f2;
- font-weight: bold;
- height: 40px;
- }
-
- .tline {
- height: 45px;
- }
-
- .tline:hover {
- background-color: #f5f5f5;
- }
-
- .col2 { width: 5%; text-align: center; }
- .col3 { width: 40%; }
- .col4 { width: 10%; }
- .col5 { width: 10%; }
- .col6 { width: 15%; }
- .col7 { width: 20%; }
-
- .theader > div, .tline > div {
- padding: 0 5px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- /* 消息状态标签 */
- .badge {
- display: inline-block;
- padding: 3px 6px;
- border-radius: 3px;
- font-size: 12px;
- color: white;
- box-sizing: border-box;
- height: 22px;
- line-height: 16px;
- vertical-align: middle;
- }
-
- .badge-primary {
- background-color: #4285f4;
- }
-
- .badge-secondary {
- background-color: #888;
- }
-
- .badge-warning {
- background-color: #f4b400;
- color: #333;
- }
-
- .badge-danger {
- background-color: #db4437;
- }
-
- /* 按钮样式 */
- .btn {
- display: inline-block;
- padding: 3px 8px;
- margin: 0 2px;
- border-radius: 3px;
- cursor: pointer;
- text-decoration: none;
- font-size: 12px;
- box-sizing: border-box;
- height: 32px;
- line-height: 26px;
- vertical-align: middle;
- }
-
- .btn-info {
- background-color: #4285f4;
- color: white;
- }
-
- .btn-success {
- background-color: #0f9d58;
- color: white;
- }
-
- .btn-danger {
- background-color: #db4437;
- color: white;
- }
-
- .btn:hover {
- /* opacity: 0.8; */
- color: #fff;
- /* background-color: #999; */
- }
-
- /* 未读消息样式 */
- .unread {
- font-weight: bold;
- }
-
- /* 优先级颜色 */
- .priority-1 {
- color: #f4b400;
- }
-
- .priority-2 {
- color: #db4437;
- font-weight: bold;
- }
-
- /* 筛选控件样式 */
- .filter-select {
- padding: 3px;
- border: 1px solid #ccc;
- border-radius: 3px;
- margin: 3px 5px 3px 0;
- width: 100px;
- height: 32px;
- box-sizing: border-box;
- vertical-align: middle;
- }
-
- /* 筛选条件区域样式 */
- .filter-row {
- display: flex;
- flex-wrap: nowrap;
- align-items: center;
- margin-bottom: 8px;
- overflow-x: auto;
- padding-bottom: 5px;
- }
-
- .filter-item {
- display: flex;
- align-items: center;
- margin-right: 10px;
- white-space: nowrap;
- }
-
- .filter-item label {
- margin-right: 5px;
- white-space: nowrap;
- }
-
- /* 搜索框样式 */
- .search-input {
- padding: 3px 8px;
- border: 1px solid #ccc;
- border-radius: 3px;
- width: 120px;
- margin-right: 5px;
- height: 32px;
- box-sizing: border-box;
- vertical-align: middle;
- font-size: 12px;
- }
-
- .search-btn {
- padding: 3px 10px;
- background-color: #4285f4;
- color: white;
- border: none;
- border-radius: 3px;
- cursor: pointer;
- height: 32px;
- box-sizing: border-box;
- vertical-align: middle;
- font-size: 12px;
- line-height: 1;
- }
-
- .search-btn:hover {
- background-color: #999;
- }
-
- /* 使按钮容器垂直居中 */
- .col7 {
- display: flex;
- align-items: center;
- justify-content: flex-start;
- width: 20%;
- text-align: left;
- }
-
- /* 状态标签容器垂直居中 */
- .col2 {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 5%;
- text-align: center;
- }
-
- /* 滑动面板样式 */
- .msg-slidepanel {
- cursor: pointer;
- }
-
- .msg-slidepanel.open {
- font-weight: bold;
- color: #3366cc;
- }
-
- .notepanel {
- display: none;
- background: #f9f9f9;
- padding: 10px;
- border: 1px solid #eee;
- margin-bottom: 10px;
- text-align: left;
- }
-
- .notepanel .noteItem {
- font-weight: bold;
- margin-bottom: 5px;
- text-align: left;
- padding-top:0px;
- }
-
- .notepanel .noteContent {
- margin: 10px 0;
- line-height: 1.5;
- white-space: pre-line;
- text-align: left;
- padding-top:0px;
- }
-
- .notepanel .noteInfo {
- display: flex;
- flex-wrap: wrap;
- gap: 15px;
- margin-bottom: 10px;
- text-align: left;
- }
-
- .notepanel .message-header-row {
- display: flex;
- align-items: center;
- margin-bottom: 10px;
- }
-
- .notepanel .message-header-row .noteItem {
- margin-right: 15px;
- margin-bottom: 0;
- min-width: 80px;
- }
- </style>
- </head>
- <body>
- <div id="man_zone">
- <div class="fastSelect clear">
- <H1>筛选条件</H1>
- <div class="filter-row">
- <div class="filter-item">
- <label>消息类型:</label>
- <select name="message_type" class="filter-select filterSearch">
- <option value="0" <?= $message_type == 0 ? 'selected' : '' ?>>所有类型</option>
- <option value="1" <?= $message_type == 1 ? 'selected' : '' ?>>系统消息</option>
- <option value="2" <?= $message_type == 2 ? 'selected' : '' ?>>客户相关</option>
- <option value="3" <?= $message_type == 3 ? 'selected' : '' ?>>订单相关</option>
- <option value="4" <?= $message_type == 4 ? 'selected' : '' ?>>任务提醒</option>
- <option value="5" <?= $message_type == 5 ? 'selected' : '' ?>>其他</option>
- </select>
- </div>
-
- <div class="filter-item">
- <label>状态:</label>
- <select name="is_read" class="filter-select filterSearch">
- <option value="-1" <?= $is_read == -1 ? 'selected' : '' ?>>全部状态</option>
- <option value="0" <?= $is_read == 0 ? 'selected' : '' ?>>未读</option>
- <option value="1" <?= $is_read == 1 ? 'selected' : '' ?>>已读</option>
- </select>
- </div>
-
- <div class="filter-item">
- <label>优先级:</label>
- <select name="priority" class="filter-select filterSearch">
- <option value="-1" <?= $priority == -1 ? 'selected' : '' ?>>所有优先级</option>
- <option value="0" <?= $priority == 0 ? 'selected' : '' ?>>普通</option>
- <option value="1" <?= $priority == 1 ? 'selected' : '' ?>>重要</option>
- <option value="2" <?= $priority == 2 ? 'selected' : '' ?>>紧急</option>
- </select>
- </div>
-
- <div class="filter-item">
- <label>搜索:</label>
- <input type="text" id="keys" class="search-input" placeholder="标题或内容" value="<?= htmlspecialcharsFix($keys) ?>" />
- <input type="button" class="search-btn" value="搜索" onClick="doSearch()" />
- </div>
- </div>
- </div>
- <div class="table2 em<?= $_SESSION['employee_id'] ?>">
- <div class="theader">
- <div class="col2">状态</div>
- <div class="col3">标题</div>
- <div class="col4">类型</div>
- <div class="col5">优先级</div>
- <div class="col6">时间</div>
- <div class="col7">操作</div>
- </div>
- <?php
- // 设置每页显示记录数
- $pageSize = 20;
- // 获取总记录数
- $countSql = "SELECT COUNT(*) AS total
- FROM messages m
- LEFT JOIN message_recipients mr ON m.id = mr.message_id AND mr.employee_id = $employee_id
- WHERE (m.target_type = 2 OR (mr.employee_id = $employee_id)) AND (mr.is_deleted = 0 OR mr.is_deleted IS NULL)";
-
- // 添加筛选条件
- if ($message_type > 0) {
- $countSql .= " AND m.message_type = $message_type";
- }
- if ($is_read >= 0) {
- $countSql .= " AND mr.is_read = $is_read";
- }
- if ($priority >= 0) {
- $countSql .= " AND m.priority = $priority";
- }
-
- // 添加关键词搜索条件
- if (!empty($keyscode)) {
- $countSql .= " AND (m.title LIKE '%$keyscode%' OR m.content LIKE '%$keyscode%')";
- }
- $countResult = mysqli_query($conn, $countSql);
- $countRow = mysqli_fetch_assoc($countResult);
- $totalRecords = $countRow['total'];
- // 计算总页数
- $totalPages = ceil($totalRecords / $pageSize);
- if ($totalPages < 1) $totalPages = 1;
- // 验证当前页码
- $page = (int)$page;
- if ($page < 1) $page = 1;
- if ($page > $totalPages) $page = $totalPages;
- // 计算起始记录
- $offset = ($page - 1) * $pageSize;
- // 添加分页条件
- $sql .= " LIMIT $offset, $pageSize";
- $result = mysqli_query($conn, $sql);
- if (mysqli_num_rows($result) > 0) {
- $tempNum = ($page - 1) * $pageSize;
- while ($row = mysqli_fetch_assoc($result)) {
- $tempNum++;
-
- // 确定消息状态
- $is_read_status = $row['is_read'] ?? 0;
-
- // 确定消息类型
- $message_type_text = [
- 1 => '系统消息',
- 2 => '客户相关',
- 3 => '订单相关',
- 4 => '任务提醒',
- 5 => '其他'
- ][$row['message_type']] ?? '未知';
-
- // 确定优先级
- $priority_class = [
- 0 => '',
- 1 => 'priority-1',
- 2 => 'priority-2'
- ][$row['priority']] ?? '';
-
- $priority_text = [
- 0 => '普通',
- 1 => '重要',
- 2 => '紧急'
- ][$row['priority']] ?? '未知';
-
- // 行样式类,未读消息加粗显示
- $row_class = $is_read_status ? '' : 'unread';
- ?>
- <div class="tline <?= $row_class ?>">
- <div class="col2">
- <?php if ($is_read_status): ?>
- <span class="badge badge-secondary">已读</span>
- <?php else: ?>
- <span class="badge badge-primary">未读</span>
- <?php endif; ?>
- </div>
- <div class="col3 msg-slidepanel"><?= htmlspecialcharsFix($row['title']) ?></div>
- <div class="col4"><?= $message_type_text ?></div>
- <div class="col5 <?= $priority_class ?>"><?= $priority_text ?></div>
- <div class="col6"><?= date('Y-m-d H:i', strtotime($row['created_at'])) ?></div>
- <div class="col7">
- <a href="message_detail.php?id=<?= $row['id'] ?>" class="btn btn-info">查看</a>
- <?php if (!$is_read_status): ?>
- <a href="javascript:void(0)" class="btn btn-success mark-read" data-id="<?= $row['id'] ?>">标记已读</a>
- <?php endif; ?>
- <a href="javascript:void(0)" class="btn btn-danger delete-message" data-id="<?= $row['id'] ?>">删除</a>
- </div>
- </div>
- <div class="notepanel clear">
-
- <div class="noteItem" style="padding-top:0px;">详情</div>
- <div class="noteInfo">
- <div><strong>类型:</strong> <?= $message_type_text ?></div>
- <div><strong>优先级:</strong> <span class="<?= $priority_class ?>"><?= $priority_text ?></span></div>
- <div><strong>时间:</strong> <?= date('Y-m-d H:i:s', strtotime($row['created_at'])) ?></div>
- <?php if ($row['read_time']): ?>
- <div><strong>阅读时间:</strong> <?= date('Y-m-d H:i:s', strtotime($row['read_time'])) ?></div>
- <?php endif; ?>
- </div>
-
- <div class="noteItem" style="padding-top:0px;">内容</div>
- <div class="noteContent"><?= nl2br(htmlspecialcharsFix($row['content'])) ?></div>
- </div>
- <?php
- }
- } else {
- if (empty($keys) && $message_type == 0 && $is_read == -1 && $priority == -1) {
- echo '<div class="tline"><div align="center" colspan="6">当前暂无消息记录</div></div>';
- } else {
- echo '<div class="tline"><div align="center" colspan="6"><a href="?">没有找到匹配的消息记录,点击返回</a></div></div>';
- }
- }
- ?>
- <div class="showpagebox">
- <?php
- if ($totalPages > 1) {
- $pageName = "?$urlStr&";
- if ($pageName == "?&") {
- $pageName = "?";
- }
- $pageLen = 3;
- if ($page > 1) {
- echo "<a href=\"{$pageName}Page=1\">首页</a>";
- echo "<a href=\"{$pageName}Page=" . ($page - 1) . "\">上一页</a>";
- }
- if ($pageLen * 2 + 1 >= $totalPages) {
- $startPage = 1;
- $endPage = $totalPages;
- } else {
- if ($page <= $pageLen + 1) {
- $startPage = 1;
- $endPage = $pageLen * 2 + 1;
- } else {
- $startPage = $page - $pageLen;
- $endPage = $page + $pageLen;
- }
- if ($page + $pageLen > $totalPages) {
- $startPage = $totalPages - $pageLen * 2;
- $endPage = $totalPages;
- }
- }
- for ($i = $startPage; $i <= $endPage; $i++) {
- if ($i == $page) {
- echo "<a class=\"current\">$i</a>";
- } else {
- echo "<a href=\"{$pageName}Page=$i\">$i</a>";
- }
- }
- if ($page < $totalPages) {
- if ($totalPages - $page > $pageLen) {
- echo "<a href=\"{$pageName}Page=$totalPages\">...$totalPages</a>";
- }
- echo "<a href=\"{$pageName}Page=" . ($page + 1) . "\">下一页</a>";
- echo "<a href=\"{$pageName}Page=$totalPages\">尾页</a>";
- }
- }
- ?>
- </div>
- </div>
- <script>
- $(document).ready(function() {
- // 处理筛选条件改变
- $('.filterSearch').change(function() {
- var url = buildSearchUrl();
- location.href = url;
- });
-
- // 标记为已读
- $('.mark-read').click(function() {
- var messageId = $(this).data('id');
- $.post('message_action.php', {
- action: 'mark_read',
- message_id: messageId
- }, function(response) {
- try {
- var data = typeof response === 'string' ? JSON.parse(response) : response;
- if (data.success) {
- location.reload();
- } else {
- alert('操作失败:' + data.message);
- }
- } catch (e) {
- alert('操作失败:服务器返回未知错误');
- }
- });
- });
- // 删除消息
- $('.delete-message').click(function() {
- if (confirm('确定要删除这条消息吗?')) {
- var messageId = $(this).data('id');
- $.post('message_action.php', {
- action: 'delete',
- message_id: messageId
- }, function(response) {
- try {
- var data = typeof response === 'string' ? JSON.parse(response) : response;
- if (data.success) {
- location.reload();
- } else {
- alert('操作失败:' + data.message);
- }
- } catch (e) {
- alert('操作失败:服务器返回未知错误');
- }
- });
- }
- });
-
- // 点击标题展开消息内容
- $('.msg-slidepanel').click(function() {
- var $this = $(this);
- var $panel = $this.closest('.tline').next('.notepanel');
-
- // 判断是否已经打开
- if ($panel.is(':visible')) {
- $panel.slideUp('fast');
- $this.removeClass('open');
- } else {
- // 先关闭其他已打开的面板
- $('.notepanel').slideUp('fast');
- $('.msg-slidepanel').removeClass('open');
-
- // 打开当前点击的面板
- $panel.slideDown('fast');
- $this.addClass('open');
-
- // 如果消息未读,自动标记为已读
- var $row = $this.closest('.tline');
- if ($row.hasClass('unread')) {
- var messageId = $row.find('.mark-read').data('id');
- if (messageId) {
- $.post('message_action.php', {
- action: 'mark_read',
- message_id: messageId
- }, function(response) {
- try {
- var data = typeof response === 'string' ? JSON.parse(response) : response;
- if (data.success) {
- // 只更新样式,不刷新页面
- $row.removeClass('unread');
- $row.find('.badge-primary').removeClass('badge-primary').addClass('badge-secondary').text('已读');
- $row.find('.mark-read').remove();
- }
- } catch (e) {
- // 忽略错误,不影响用户体验
- }
- });
- }
- }
- }
- });
-
- // 回车键触发搜索
- $('#keys').keypress(function(e) {
- if (e.which == 13) {
- doSearch();
- return false;
- }
- });
- });
-
- // 执行搜索
- function doSearch() {
- var url = buildSearchUrl();
- location.href = url;
- }
-
- // 构建搜索URL
- function buildSearchUrl() {
- var url = '?';
- var keys = $.trim($('#keys').val());
- if (keys) {
- url += 'Keys=' + encodeURIComponent(keys) + '&';
- }
- $('.filterSearch').each(function() {
- var name = $(this).attr('name');
- var value = $(this).val();
- if (value && value != -1) {
- url += name + '=' + encodeURIComponent(value) + '&';
- }
- });
- // 移除末尾的&
- if (url.endsWith('&')) {
- url = url.substring(0, url.length - 1);
- }
-
- return url;
- }
- </script>
- </div>
- </body>
- </html>
|