v1.0.10
This commit is contained in:
@@ -0,0 +1,173 @@
|
||||
/**
|
||||
* channel.js - 渠道管理逻辑(渠道列表 + 年度统计 + 效率数据)
|
||||
*/
|
||||
$(function () {
|
||||
renderShell('渠道管理', '业务模块 / 渠道管理');
|
||||
renderPage();
|
||||
initPage('channel', function (user) {
|
||||
if (!checkPagePermission('channel')) return;
|
||||
loadList(1);
|
||||
loadStats();
|
||||
});
|
||||
|
||||
var currentPage = 1;
|
||||
var pageRows = [];
|
||||
|
||||
/** 渲染页面内容(统计卡+工具栏+表格+分页) */
|
||||
function renderPage() {
|
||||
$('#page-content').html(
|
||||
'<div class="stat-cards" id="stat-summary"></div>' +
|
||||
'<div class="card">' +
|
||||
' <div class="toolbar">' +
|
||||
' <input type="text" data-filter="keyword" placeholder="渠道名称/联系人关键词">' +
|
||||
' <input type="text" data-filter="channel_type" placeholder="渠道类型">' +
|
||||
' <select id="year-select" data-filter="year"><option value="">选择年度</option></select>' +
|
||||
' <button class="btn btn-primary" id="btn-search">搜索</button>' +
|
||||
' <button class="btn" id="btn-reset">重置</button>' +
|
||||
' <span class="spacer"></span>' +
|
||||
' <button class="btn btn-success" id="btn-add">+ 新增</button>' +
|
||||
' </div>' +
|
||||
' <div class="table-wrap"><table class="grid">' +
|
||||
' <thead><tr><th>ID</th><th>渠道名称</th><th>类型</th><th>联系人</th><th>电话</th><th>邮箱</th><th>效率评分</th><th>备注</th><th>创建时间</th><th>操作</th></tr></thead>' +
|
||||
' <tbody id="channel-tbody"></tbody>' +
|
||||
' </table></div>' +
|
||||
' <div class="pagination" id="pagination"></div>' +
|
||||
'</div>'
|
||||
);
|
||||
}
|
||||
|
||||
/* ---------- 列表 ---------- */
|
||||
function loadList(page) {
|
||||
currentPage = page;
|
||||
var params = buildFilterParam();
|
||||
delete params.year; // 年度仅用于统计
|
||||
params.page = page;
|
||||
params.limit = PAGE_SIZE;
|
||||
|
||||
httpGet('channel/list.php', params).then(function (data) {
|
||||
var rows = data.list || [];
|
||||
pageRows = rows;
|
||||
var html = '';
|
||||
rows.forEach(function (r) {
|
||||
html += '<tr>' +
|
||||
'<td>' + r.id + '</td>' +
|
||||
'<td>' + escHtml(r.channel_name) + '</td>' +
|
||||
'<td>' + escHtml(r.channel_type || '-') + '</td>' +
|
||||
'<td>' + escHtml(r.contact_person || '-') + '</td>' +
|
||||
'<td>' + escHtml(r.contact_phone || '-') + '</td>' +
|
||||
'<td>' + escHtml(r.contact_email || '-') + '</td>' +
|
||||
'<td>' + escHtml(r.efficiency_score) + '</td>' +
|
||||
'<td title="' + escHtml(r.remark || '') + '">' + escHtml((r.remark || '-').substring(0, 20)) + '</td>' +
|
||||
'<td>' + fmtDate(r.created_at) + '</td>' +
|
||||
'<td class="ops"><a onclick="editChannel(' + r.id + ')">编辑</a>' +
|
||||
'<a class="danger" onclick="delChannel(' + r.id + ')">删除</a></td></tr>';
|
||||
});
|
||||
if (!rows.length) {
|
||||
html = '<tr><td colspan="10" class="empty-tip" style="padding:40px 0;">暂无渠道数据(渠道表为新增加的业务表,可在 sql/system_tables.sql 中创建)</td></tr>';
|
||||
}
|
||||
$('#channel-tbody').html(html);
|
||||
renderPagination($('#pagination'), data, loadList);
|
||||
});
|
||||
}
|
||||
|
||||
/* ---------- 年度统计 ---------- */
|
||||
function loadStats() {
|
||||
httpGet('channel/stats.php').then(function (data) {
|
||||
var years = data.years || [];
|
||||
var html = '<option value="">选择年度</option>';
|
||||
years.forEach(function (y) {
|
||||
html += '<option value="' + y + '"' + (y == data.year ? ' selected' : '') + '>' + y + '年</option>';
|
||||
});
|
||||
$('#year-select').html(html);
|
||||
|
||||
$('#stat-summary').html(
|
||||
'<div class="stat-card c-blue"><div class="num">' + data.summary.channel_count + '</div><div class="label">' + data.year + '年渠道数</div></div>' +
|
||||
'<div class="stat-card c-green"><div class="num">' + data.summary.avg_score + '</div><div class="label">平均效率评分</div></div>' +
|
||||
'<div class="stat-card c-orange"><div class="num">' + data.summary.max_score + '</div><div class="label">最高评分</div></div>' +
|
||||
'<div class="stat-card c-red"><div class="num">' + data.summary.min_score + '</div><div class="label">最低评分</div></div>'
|
||||
);
|
||||
window._channelStatData = data;
|
||||
});
|
||||
}
|
||||
|
||||
$('#year-select').on('change', function () {
|
||||
var y = $(this).val();
|
||||
if (!y) return;
|
||||
httpGet('channel/stats.php', { year: y }).then(function (data) {
|
||||
$('#stat-summary').html(
|
||||
'<div class="stat-card c-blue"><div class="num">' + data.summary.channel_count + '</div><div class="label">' + data.year + '年渠道数</div></div>' +
|
||||
'<div class="stat-card c-green"><div class="num">' + data.summary.avg_score + '</div><div class="label">平均效率评分</div></div>' +
|
||||
'<div class="stat-card c-orange"><div class="num">' + data.summary.max_score + '</div><div class="label">最高评分</div></div>' +
|
||||
'<div class="stat-card c-red"><div class="num">' + data.summary.min_score + '</div><div class="label">最低评分</div></div>'
|
||||
);
|
||||
window._channelStatData = data;
|
||||
});
|
||||
});
|
||||
|
||||
/* ---------- 新增/编辑 ---------- */
|
||||
$('#btn-add').on('click', function () { openForm(null); });
|
||||
window.editChannel = function (id) {
|
||||
var row = null;
|
||||
pageRows.forEach(function (r) { if (r.id == id) row = r; });
|
||||
openForm(row);
|
||||
};
|
||||
|
||||
function openForm(ch) {
|
||||
var isEdit = !!ch;
|
||||
var c = ch || {};
|
||||
var content =
|
||||
'<form id="channel-form" style="padding:18px 22px 4px;">' +
|
||||
'<div class="form-grid">' +
|
||||
' <div class="form-item"><label>渠道名称<span class="req">*</span></label><input type="text" name="channel_name" value="' + escHtml(c.channel_name) + '"></div>' +
|
||||
' <div class="form-item"><label>渠道类型</label><input type="text" name="channel_type" value="' + escHtml(c.channel_type) + '" placeholder="线上/线下/展会/转介绍"></div>' +
|
||||
' <div class="form-item"><label>联系人</label><input type="text" name="contact_person" value="' + escHtml(c.contact_person) + '"></div>' +
|
||||
' <div class="form-item"><label>联系电话</label><input type="text" name="contact_phone" value="' + escHtml(c.contact_phone) + '"></div>' +
|
||||
' <div class="form-item"><label>联系邮箱</label><input type="text" name="contact_email" value="' + escHtml(c.contact_email) + '"></div>' +
|
||||
' <div class="form-item"><label>效率评分(0-100)</label><input type="number" name="efficiency_score" min="0" max="100" step="0.01" value="' + escHtml(c.efficiency_score) + '"></div>' +
|
||||
' <div class="form-item full"><label>备注</label><textarea name="remark">' + escHtml(c.remark) + '</textarea></div>' +
|
||||
'</div>' +
|
||||
'<div class="dialog-footer"><button type="button" class="btn" id="form-cancel">取消</button>' +
|
||||
'<button type="submit" class="btn btn-primary">保存</button></div>' +
|
||||
'</form>';
|
||||
|
||||
var idx = Dialog.open({
|
||||
title: isEdit ? '编辑渠道' : '新增渠道',
|
||||
area: ['680px', 'auto'],
|
||||
content: content,
|
||||
btn: false
|
||||
});
|
||||
|
||||
$('#form-cancel').on('click', function () { Dialog.close(idx); });
|
||||
|
||||
$('#channel-form').on('submit', function (e) {
|
||||
e.preventDefault();
|
||||
var data = {};
|
||||
$(this).find('input, textarea').each(function () {
|
||||
var name = $(this).attr('name');
|
||||
if (!name) return;
|
||||
data[name] = $(this).val();
|
||||
});
|
||||
if (!data.channel_name) { Dialog.error('渠道名称为必填项'); return; }
|
||||
if (isEdit) data.id = c.id;
|
||||
|
||||
httpPost(isEdit ? 'channel/save.php' : 'channel/save.php', data).then(function () {
|
||||
Dialog.success('保存成功', function () {
|
||||
Dialog.close(idx);
|
||||
loadList(currentPage);
|
||||
loadStats();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
window.delChannel = function (id) {
|
||||
Dialog.confirm('确定删除该渠道吗?', function () {
|
||||
httpPost('channel/delete.php', { id: id }).then(function () {
|
||||
Dialog.success('删除成功', function () {
|
||||
loadList(currentPage);
|
||||
loadStats();
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
||||
Reference in New Issue
Block a user