connect_error) { die("Connection failed: " . $conn->connect_error); } $conn->set_charset("utf8mb4"); // 检查登录 function checkLogin() { if (empty($_SESSION['employee_id'])) { echo ""; exit; } } function checkAdmin() { if ((empty($_SESSION['em_permission_role_id'])||($_SESSION['em_permission_role_id']!=1))) { die("No permission , Please contact the administrator"); exit; } } function checkPermissionDie(...$permission_role_ids) { // 检查会话中是否设置权限ID if (empty($_SESSION['em_permission_role_id'])) { die("No permission , Please contact the administrator"); } // 如果是超级管理员(ID=1),直接返回true if ($_SESSION['em_permission_role_id'] == 1) { // return true; } // 检查当前角色ID是否在允许的角色ID中 if(!in_array($_SESSION['em_permission_role_id'], $permission_role_ids)) { die("No permission , Please contact the administrator"); } } function checkPermission(...$permission_role_ids) { // 检查会话中是否设置权限ID if (empty($_SESSION['em_permission_role_id'])) { return false; } // 如果是超级管理员(ID=1),直接返回true if ($_SESSION['em_permission_role_id'] == 1) { return true; } // 检查当前角色ID是否在允许的角色ID中 return in_array($_SESSION['em_permission_role_id'], $permission_role_ids); } // 检查管理员或组长或组员 function checkAdminOrEmployee () { if ((empty($_SESSION['em_permission_role_id'])||($_SESSION['em_permission_role_id']!=1)&&($_SESSION['em_permission_role_id']!=2)&&($_SESSION['em_permission_role_id']!=3))) { return false; } else { return true; } } // 检查是否管理员 function checkIfAdmin() { if ((empty($_SESSION['em_permission_role_id'])||($_SESSION['em_permission_role_id']!=1))) { return false; } else { return true; } } // 获取IP function getIp() { $ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR']; if (strlen($ip) > 15) { $ip = "UnKnow"; } return htmlspecialcharsFix($ip); } // 记录操作日志 function logAction($action) { global $conn; // 从SESSION获取当前用户名 $loginName = $_SESSION['employee_name'] ?? 'Unknown User'; // 获取当前IP $loginIp = getIp(); // 当前时间 $loginTime = date('Y-m-d H:i:s'); // 记录到日志表 $stmt = "INSERT INTO logrecord (loginName, loginIp, loginTime, loginAct) VALUES ( '" . mysqli_real_escape_string($conn, $loginName) . "', '" . mysqli_real_escape_string($conn, $loginIp) . "', '$loginTime', '" . mysqli_real_escape_string($conn, $action) . "')"; $conn->query($stmt); } // 移除HTML function removeHTML($t0) { if (empty($t0)) { return ""; } $t0 = preg_replace("//is", "", $t0); $t0 = preg_replace("//is", "", $t0); $t0 = str_replace(["<", ">", " "], ["<", ">", ""], $t0); $t0 = preg_replace("/<.+?>/", "", $t0); return str_replace(["\r\n", "\t", "\r", "\n"], "", $t0); } // Text转HTML function txt2HTML($t0) { if (empty($t0) || is_array($t0)) { return ""; } return str_replace( ["&", "\"", "<", ">", " "], ["&", """, "<", ">", " "], $t0 ); } // HTML转Text function html2Txt($t0) { if (empty($t0) || is_array($t0)) { return ""; } return str_replace( [""", "<", ">", " ", "&"], ["\"", "<", ">", " ", "&"], $t0 ); } // HTML编码 function htmlEncode($t0) { if (empty($t0) || is_array($t0)) { return ""; } $replacements = [ chr(38) => "&", chr(9) => " ", chr(11) => " ", chr(10) => " ", chr(13) => " ", chr(32) => " ", chr(34) => """, chr(37) => "%", chr(39) => "'", chr(40) => "(", chr(41) => ")", chr(60) => "<", chr(62) => ">", chr(91) => "[", chr(93) => "]", chr(94) => "^", chr(95) => "_", chr(123) => "{", chr(124) => "|", chr(125) => "}" ]; return strtr($t0, $replacements); } // HTML解码 function htmlUnCode($t0) { if (empty($t0) || is_array($t0)) { return ""; } $replacements = [ " " => chr(9), " " => chr(11), " " => chr(10), " " => chr(13), " " => chr(32), """ => chr(34), "%" => chr(37), "'" => chr(39), "(" => chr(40), ")" => chr(41), "<" => chr(60), ">" => chr(62), "[" => chr(91), "]" => chr(93), "^" => chr(94), "_" => chr(95), "{" => chr(123), "|" => chr(124), "}" => chr(125), "&" => chr(38) ]; return strtr($t0, $replacements); } // 文本编码 function textEncode($t0) { if (empty($t0) || is_array($t0)) { return ""; } $t0 = trim($t0); $remove = [chr(8), chr(9), chr(11), chr(12), chr(10), chr(13)]; $t0 = str_replace($remove, "", $t0); $replacements = [ chr(38) => "&", chr(47) => "/", chr(32) => " ", chr(34) => """, chr(37) => "%", chr(39) => "'", chr(40) => "(", chr(41) => ")", "(" => "(", ")" => ")", chr(60) => "<", chr(62) => ">", chr(91) => "[", chr(93) => "]", chr(94) => "^", chr(95) => "_", chr(123) => "{", chr(124) => "|", chr(125) => "}" ]; return strtr($t0, $replacements); } // 数字格式化 function numFormat($t0) { if (empty($t0) || is_array($t0)) { return ""; } $t0 = trim($t0); $remove = ["-", "+", " ", "&", " ", chr(34), "*", "%", "'", "(", ")", "<", ">", "[", "]", "^", "_", "{", "\\", "/", "|", "}", "(", ")"]; return str_replace($remove, "", $t0); } // 文本解码 function textUncode($t0) { if (empty($t0) || is_array($t0)) { return ""; } $replacements = [ " " => chr(32), """ => chr(34), "%" => chr(37), "'" => chr(39), "(" => chr(40), ")" => chr(41), "<" => chr(60), ">" => chr(62), "[" => chr(91), "]" => chr(93), "^" => chr(94), "_" => chr(95), "{" => chr(123), "|" => chr(124), "}" => chr(125), "/" => chr(47), "&" => chr(38) ]; return strtr($t0, $replacements); } // HTML解码1 function htmlUnCode1($t0) { if (empty($t0) || is_array($t0)) { return ""; } $replacements = [ " " => chr(9), " " => chr(11), " " => "
", " " => "
", " " => "
", " " => " ", "&" => chr(38) ]; return strtr($t0, $replacements); } // 格式化时间 function formatTime($ttime, $tparam) { if (!strtotime($ttime)) { return ""; } $date = new DateTime($ttime); $tsrt = $tparam; $replacements = [ "yyyy" => $date->format("Y"), "yy" => $date->format("y"), "mm" => $date->format("m"), "dd" => $date->format("d"), "hh" => $date->format("H"), "ff" => $date->format("i"), "ss" => $date->format("s"), "m" => $date->format("n"), "d" => $date->format("j"), "h" => $date->format("G"), "f" => $date->format("i"), "s" => $date->format("s") ]; return strtr($tsrt, $replacements); } // 英文月份 function enMonth($m) { $months = [ "1" => "Jan", "2" => "Feb", "3" => "Mar", "4" => "Apr", "5" => "May", "6" => "Jun", "7" => "Jul", "8" => "Aug", "9" => "Sep", "10" => "Oct", "11" => "Nov", "12" => "Dec" ]; return $months[$m] ?? "Dec"; } // 字符串截取 function strLeft($str, $strLen) { if (empty($str)) { return ""; } $length = 0; $result = ""; for ($i = 0; $i < mb_strlen($str); $i++) { $char = mb_substr($str, $i, 1); $length += (mb_ord($char) > 255) ? 2 : 1; if ($length > $strLen) { return $result . ".."; } $result .= $char; } return $result; } // 验证邮箱 function isValidEmail($email) { $names = explode("@", $email); if (count($names) !== 2) { return false; } foreach ($names as $name) { if (empty($name)) { return false; } if (preg_match("/[^a-z0-9_.-]/", strtolower($name))) { return false; } if (str_starts_with($name, ".") || str_ends_with($name, ".")) { return false; } } $domainParts = explode(".", $names[1]); if (count($domainParts) < 2) { return false; } $tldLength = strlen(end($domainParts)); if ($tldLength !== 2 && $tldLength !== 3) { return false; } if (str_contains($email, "..")) { return false; } return true; } // 站点链接替换 function sitelink_replace($t0, $t1, $t2, $t3) { if (empty($t0)) { return ""; } $t4 = $t0; $pattern = "/(\]+\>.+?\<\/a\>)|(\]+\>)|(\.+?\<\/h[1-6]+\>)/i"; preg_match_all($pattern, $t4, $matches); $myarray = []; if (count($matches[0]) > 0) { foreach ($matches[0] as $i => $match) { $myarray[$i] = $match; $t4 = str_replace($match, "[$i]", $t4, $t3); } } if (empty($myarray)) { return str_replace($t1, $t2, $t0, $t3); } $t4 = str_replace($t1, $t2, $t4, $t3); foreach ($myarray as $i => $value) { $t4 = str_replace("[$i]", $value, $t4, $t3); } return $t4; } if(!function_exists('htmlspecialcharsFix')) { //处理特殊字符 function htmlspecialcharsFix($input_str) { return textUncode($input_str); //return $input_str; } } if(!function_exists('htmlspecialcharsAjaxFix')) { //处理特殊字符 function htmlspecialcharsAjaxFix($input_str) { return textUncode($input_str); } } if(!function_exists('textDecode')) { function textDecode($str) { return textUncode($str); } } if(!function_exists('htmlDecode')) { function htmlDecode($str) { return htmlspecialchars_decode($str, ENT_QUOTES); } } if(!function_exists('formatCurrency')) { function formatCurrency($value) { return '¥' . number_format($value ?? 0, 2); } } // // 发送个人消息 // $message_id = sendMessage( // '个人消息标题', // '消息内容', // 2, // 客户相关 // 0, // 个人消息 // 123, // 员工ID // 1 // 重要 // ); // // 发送部分群发消息 // $message_id = sendMessage( // '部门通知', // '通知内容', // 1, // 系统消息 // 1, // 部分群发 // [101, 102, 103], // 员工ID数组 // 0 // 普通优先级 // ); // // 发送全体公告 // $message_id = sendMessage( // '系统升级通知', // '系统将于今晚10点维护', // 1, // 系统消息 // 2, // 全体公告 // [], // 无需指定接收者 // 2 // 紧急 // ); // // 获取未读消息数 // $unread_count = getUnreadMessageCount(); /** * 发送消息函数 * * @param string $title 消息标题 * @param string $content 消息内容 * @param int $message_type 消息类型: 1=系统消息, 2=客户相关, 3=订单相关, 4=任务提醒, 5=其他 * @param int $target_type 接收目标类型: 0=个人, 1=部分群发, 2=全体公告 * @param array|int $recipients 当target_type=0或1时,接收者ID数组或单个接收者ID * @param int $priority 优先级: 0=普通, 1=重要, 2=紧急 * @param int|null $related_customer_id 相关客户ID (可选) * @param int|null $related_order_id 相关订单ID (可选) * @return int|false 成功返回消息ID,失败返回false */ function sendMessage($title, $content, $message_type = 1, $target_type = 0, $recipients = [], $priority = 0, $related_customer_id = null, $related_order_id = null) { global $conn; // 验证和清理输入 $title = mysqli_real_escape_string($conn, trim($title)); $content = mysqli_real_escape_string($conn, trim($content)); $message_type = intval($message_type); $target_type = intval($target_type); $priority = intval($priority); $related_customer_id = $related_customer_id ? intval($related_customer_id) : "NULL"; $related_order_id = $related_order_id ? intval($related_order_id) : "NULL"; // 验证必填字段 if (empty($title) || empty($content)) { return false; } // 插入消息主表 $sql = "INSERT INTO messages (title, content, message_type, target_type, priority, related_customer_id, related_order_id) VALUES ('$title', '$content', $message_type, $target_type, $priority, $related_customer_id, $related_order_id)"; if (!$conn->query($sql)) { return false; } // 获取新插入消息的ID $message_id = $conn->insert_id; // 处理接收人 if ($target_type == 0 || $target_type == 1) { // 个人消息或部分群发 if (!is_array($recipients)) { $recipients = [$recipients]; // 转换为数组 } if (empty($recipients)) { return false; // 接收人为空,返回失败 } // 插入接收人记录 $values = []; foreach ($recipients as $employee_id) { $employee_id = intval($employee_id); if ($employee_id > 0) { $values[] = "($message_id, $employee_id, 0, NULL, 0, NOW())"; } } if (!empty($values)) { $recipientSql = "INSERT INTO message_recipients (message_id, employee_id, is_read, read_time, is_deleted, created_at) VALUES " . implode(",", $values); $conn->query($recipientSql); } } else if ($target_type == 2) { // 全体公告,不需要添加接收人记录 // 在message_list.php中通过target_type=2来判断全员可见 } // 记录操作日志 logAction("发送消息: $title"); return $message_id; } /** * 获取未读消息数量 * * @param int $employee_id 员工ID,默认为当前登录员工 * @return int 未读消息数量 */ function getUnreadMessageCount($employee_id = null) { global $conn; // 如果没有指定员工ID,使用当前登录员工ID if ($employee_id === null) { if (empty($_SESSION['employee_id'])) { return 0; } $employee_id = $_SESSION['employee_id']; } $employee_id = intval($employee_id); // 查询未读消息数量 $sql = "SELECT COUNT(*) AS count 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) AND (mr.is_read = 0 OR mr.is_read IS NULL)"; $result = mysqli_query($conn, $sql); $row = mysqli_fetch_assoc($result); return intval($row['count']); }