/** * AKSRT Ticket Center — 用户中心「工单中心」面板。 * * - 列表 / 统计 / 详情全部走 REST,模板只输出容器与首屏骨架(profile-tickets.php) * - 统计卡兼作状态快捷筛选,与状态下拉双向同步;搜索输入防抖,旧请求结果按序号丢弃 * - 弹窗经 AksrtModalRuntime.open 打开(运行时自带标题栏 / 焦点陷阱 / 移动端底部抽屉), * 先出运行时骨架,数据到达后填充,避免点击后无反馈 * - 详情为对话时间线:问题描述作为首条消息,用户靠右、客服靠左;回复后原地刷新而不是关窗 * - 详情三段式:顶部可折叠概要(默认收起)+ 唯一滚动区时间线 + 底部回复框; * 回复框工具栏(图片 / 催单 / 关闭)在输入框上方,待发送图片以缩略图条展示 * - 提交工单与回复前先过人机验证(ticket_create / ticket_reply,场景未启用自动放行) * - 图片走 /aksrt/v1/ticket/upload-attachment,上传中显示占位格,未传完禁止提交 * * @package AKSRT */ (function () { 'use strict'; var core = window.AksrtTicketCore; if (!core) return; var settings = core.settings; var attachmentEnabled = core.attachmentEnabled; var attachmentMax = core.attachmentMax; var lengthMax = core.lengthMax; var escapeHtml = core.escapeHtml; var notyf = core.notyf; var request = core.request; var expectSuccess = core.expectSuccess; var runCaptcha = core.runCaptcha; var failMessage = core.failMessage; var timeTag = core.timeTag; var icon = core.icon; var statusBadge = core.statusBadge; var emptyHtml = core.emptyHtml; var setBusy = core.setBusy; var markInvalid = core.markInvalid; var openModal = core.openModal; var alive = core.alive; var setModalContent = core.setModalContent; var modalError = core.modalError; var collectAttachments = core.collectAttachments; var isUploading = core.isUploading; var bindShell = core.bindShell; var attachButtonHtml = core.attachButtonHtml; var attachTrayHtml = core.attachTrayHtml; var SEARCH_DEBOUNCE = 400; var CLOSE_CONFIRM_MS = 4000; var COMPOSER_MAX_HEIGHT = 160; var state = { page: 1, perPage: 10, totalPages: 1, status: '', type: '', keywords: '', meta: null, listSeq: 0, }; /* ------------------------------------------------------------------ * * 列表 / 统计 / 筛选 * ------------------------------------------------------------------ */ function panel() { return document.querySelector('[data-aksrt-ticket-center]'); } function listNode() { var root = panel(); return root ? root.querySelector('[data-aksrt-ticket-list]') : null; } function hasFilters() { return !!(state.status || state.type || state.keywords); } function skeletonHtml() { var card = '
' + icon('fa-lock') + '工单已关闭,如需继续沟通请提交新工单。
' : composerHtml(ticket); return html + '' + (quote.author_name ? '' + escapeHtml(quote.author_name) + '' : '') + '' + escapeHtml(text) + ''; } function excerpt(text) { var flat = String(text || '').replace(/\s+/g, ' ').trim(); return flat.length > 60 ? flat.slice(0, 60) + '…' : flat; } function messageHtml(msg, canQuote) { if (msg.author_type === 'system') { // 系统记录(如催单):居中提示,不可引用。 return '
我们会尽快处理,处理进度可随时在工单中心查看。
' + (notice.open && notice.text ? '