修正版本:还缺少数据同步

This commit is contained in:
root
2026-06-04 17:01:40 +08:00
parent e4f19c09bc
commit 8afe25a960
5 changed files with 36 additions and 43 deletions
@@ -8,6 +8,8 @@ use app\admin\model\split\Link as LinkModel;
use app\admin\model\split\Ticket as TicketModel; use app\admin\model\split\Ticket as TicketModel;
use app\common\controller\Backend; use app\common\controller\Backend;
use think\Db; use think\Db;
use think\Lang;
use think\Loader;
use think\Exception; use think\Exception;
use think\exception\DbException; use think\exception\DbException;
use think\exception\PDOException; use think\exception\PDOException;
@@ -45,15 +47,6 @@ class Ticket extends Backend
$lang = $this->request->langset(); $lang = $this->request->langset();
$lang = preg_match('/^([a-zA-Z\-_]{2,10})$/i', $lang) ? $lang : 'zh-cn'; $lang = preg_match('/^([a-zA-Z\-_]{2,10})$/i', $lang) ? $lang : 'zh-cn';
$langFile = ROOT_PATH . 'patches/application/admin/lang/' . $lang . '/split/ticket.php';
if (is_file($langFile)) {
\think\Lang::load($langFile);
}
$linkLangFile = ROOT_PATH . 'patches/application/admin/lang/' . $lang . '/split/link.php';
if (is_file($linkLangFile)) {
\think\Lang::load($linkLangFile);
}
$this->model = new \app\admin\model\split\Ticket(); $this->model = new \app\admin\model\split\Ticket();
$this->view->assign('ticketTypeList', $this->model->getTicketTypeList()); $this->view->assign('ticketTypeList', $this->model->getTicketTypeList());
$this->view->assign('numberTypeList', $this->model->getNumberTypeList()); $this->view->assign('numberTypeList', $this->model->getNumberTypeList());
@@ -66,6 +59,32 @@ class Ticket extends Backend
$this->setupPatchFrontend(); $this->setupPatchFrontend();
} }
/**
* 加载工单语言包(优先 patches)
*/
protected function loadlang($name): void
{
$lang = $this->request->langset();
$lang = preg_match('/^([a-zA-Z\-_]{2,10})$/i', $lang) ? $lang : 'zh-cn';
$name = Loader::parseName($name);
$name = preg_match('/^([a-zA-Z0-9_\.\/]+)$/i', $name) ? $name : 'index';
$files = [
APP_PATH . 'admin/lang/' . $lang . '/' . str_replace('.', '/', $name) . '.php',
ROOT_PATH . 'patches/application/admin/lang/' . $lang . '/split/ticket.php',
];
$loaded = false;
foreach ($files as $file) {
if (is_file($file)) {
Lang::load($file);
$loaded = true;
}
}
if (!$loaded) {
parent::loadlang($name);
}
}
/** /**
* 未部署 JS 时指向 script 接口 * 未部署 JS 时指向 script 接口
*/ */
@@ -39,4 +39,6 @@ return [
'Reply statements tip'=> '一行填写一条回复语句,保存后与当前分流链接关联', 'Reply statements tip'=> '一行填写一条回复语句,保存后与当前分流链接关联',
'Auto reply saved' => '自动回复已保存', 'Auto reply saved' => '自动回复已保存',
'Reply statements column' => '回复语', 'Reply statements column' => '回复语',
'NS' => 'NS',
'DNS' => 'DNS',
]; ];
@@ -6,8 +6,6 @@ return [
'Ticket_url' => '工单链接', 'Ticket_url' => '工单链接',
'Ticket_total' => '工单总量', 'Ticket_total' => '工单总量',
'Split_link_id' => '分流链接', 'Split_link_id' => '分流链接',
'View split link tip' => '点击查看分流链接与复制完整 URL',
'Copy link code tip' => '复制链接码',
'Number_type' => '号码类型', 'Number_type' => '号码类型',
'Number_type_custom' => '自定义号码类型', 'Number_type_custom' => '自定义号码类型',
'Start_time' => '开始时间', 'Start_time' => '开始时间',
@@ -466,8 +466,8 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
var statusHtml = ''; var statusHtml = '';
if (options.showStatus) { if (options.showStatus) {
statusHtml = '<span class="split-domain-status">' statusHtml = '<span class="split-domain-status">'
+ '<span class="label ' + Controller.api.statusLabelClass(options.nsStatus) + '">NS:' + Fast.api.escape(options.nsText || '-') + '</span>' + '<span class="label ' + Controller.api.statusLabelClass(options.nsStatus) + '">' + __('NS') + ':' + Fast.api.escape(options.nsText || '-') + '</span>'
+ '<span class="label ' + Controller.api.statusLabelClass(options.dnsStatus, true) + '">DNS:' + Fast.api.escape(options.dnsText || '-') + '</span>' + '<span class="label ' + Controller.api.statusLabelClass(options.dnsStatus, true) + '">' + __('DNS') + ':' + Fast.api.escape(options.dnsText || '-') + '</span>'
+ '</span>'; + '</span>';
} }
return '<div class="split-domain-item' + checkedClass + '">' return '<div class="split-domain-item' + checkedClass + '">'
@@ -1,4 +1,4 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'backend/split/link'], function ($, undefined, Backend, Table, Form, SplitLink) { define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = { var Controller = {
index: function () { index: function () {
@@ -116,25 +116,6 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'backend/split/link']
] ]
}); });
table.on('click', '.btn-ticket-split-link', function (e) {
e.preventDefault();
e.stopPropagation();
var linkCode = $.trim($(this).data('link-code') || '');
if (!linkCode || !SplitLink || !SplitLink.api || !SplitLink.api.openCopyModal) {
return false;
}
SplitLink.api.openCopyModal(linkCode);
});
table.on('click', '.btn-ticket-copy-link-code', function (e) {
e.preventDefault();
e.stopPropagation();
var linkCode = $.trim($(this).data('link-code') || '');
if (linkCode && SplitLink && SplitLink.api && SplitLink.api.copyText) {
SplitLink.api.copyText(linkCode);
}
});
Table.api.bindevent(table); Table.api.bindevent(table);
}, },
add: function () { add: function () {
@@ -158,7 +139,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'backend/split/link']
return '<span class="split-ticket-type-plain">' + Fast.api.escape(text) + '</span>'; return '<span class="split-ticket-type-plain">' + Fast.api.escape(text) + '</span>';
}, },
/** /**
* 分流链接:链接样式 + 操作图标(点击文字打开复制弹窗) * 分流链接:纯文本 + 边框背景标记,不可点击
*/ */
splitLinkCode: function (value) { splitLinkCode: function (value) {
value = value == null ? '' : String(value); value = value == null ? '' : String(value);
@@ -166,15 +147,8 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'backend/split/link']
return '<span class="text-muted">-</span>'; return '<span class="text-muted">-</span>';
} }
var safe = Fast.api.escape(value); var safe = Fast.api.escape(value);
var viewTip = __('View split link tip'); return '<span class="split-ticket-link-badge" style="display:inline-block;max-width:100%;padding:2px 8px;font-size:12px;line-height:1.5;color:#555;background:#f5f5f5;border:1px solid #ddd;border-radius:3px;word-break:break-all;">'
var copyTip = __('Copy link code tip'); + safe + '</span>';
return '<span class="split-ticket-link-cell">'
+ '<a href="javascript:;" class="btn-ticket-split-link split-ticket-link-text" data-link-code="' + safe + '"'
+ ' data-toggle="tooltip" title="' + Fast.api.escape(viewTip) + '"'
+ ' style="font-weight:600;color:#337ab7;text-decoration:underline;cursor:pointer;">' + safe + '</a>'
+ ' <a href="javascript:;" class="btn-ticket-copy-link-code text-primary" data-link-code="' + safe + '"'
+ ' data-toggle="tooltip" title="' + Fast.api.escape(copyTip) + '"><i class="fa fa-copy"></i></a>'
+ '</span>';
}, },
speedPerHour: function (value) { speedPerHour: function (value) {
var num = parseFloat(value); var num = parseFloat(value);