v1.0.20: 需求迭代(0808文档) - 文件管理迁入竞品资料+企业筛选弹窗(多条件且/或)+搜索框内嵌字段+渠道计划费用字段/状态行内编辑

This commit is contained in:
nanguaboss
2026-08-08 22:54:56 +08:00
parent 1c8b374a72
commit b8c2a2d5c7
14 changed files with 500 additions and 50 deletions
+114 -11
View File
@@ -28,17 +28,20 @@ $(function () {
$('#page-content').html(
'<div class="card">' +
' <div class="toolbar">' +
' <select id="search-field"><option value="">全部字段</option>' +
' <option value="name_zh">企业名称</option><option value="name_en">英文名称</option>' +
' <option value="registration_number">注册号</option><option value="legal_representative">法定代表人</option>' +
' <option value="address">注册地址</option><option value="industry">行业</option>' +
' <option value="industry_subdivision">行业细分</option><option value="website">官网</option>' +
' <option value="source_channel">来源渠道</option><option value="source_detail">来源详情</option>' +
' <option value="business_scope">经营范围</option><option value="stock_code">股票代码</option></select>' +
' <input type="text" id="search-keyword" placeholder="输入要检索的内容">' +
' <button class="btn" id="btn-filter" title="按字段设置多个筛选条件(支持 且/或 逻辑)">筛选</button>' +
' <div class="search-wrap">' +
' <select id="search-field"><option value="">全字段</option>' +
' <option value="name_zh">企业名称</option><option value="name_en">英文名称</option>' +
' <option value="registration_number">注册号</option><option value="legal_representative">法定代表人</option>' +
' <option value="address">注册地址</option><option value="industry">行业</option>' +
' <option value="industry_subdivision">行业细分</option><option value="website">官网</option>' +
' <option value="source_channel">来源渠道</option><option value="source_detail">来源详情</option>' +
' <option value="business_scope">经营范围</option><option value="stock_code">股票代码</option></select>' +
' <input type="text" id="search-keyword" placeholder="输入关键词,回车搜索">' +
' <span class="search-icon" id="btn-search" title="搜索"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg></span>' +
' </div>' +
' <select id="search-industry" data-filter="industry"><option value="">全部行业</option></select>' +
' <select id="search-company-type" data-filter="company_type"><option value="">全部企业类型</option></select>' +
' <button class="btn btn-primary" id="btn-search">搜索</button>' +
' <select id="search-company-type" data-filter="company_type"><option value="">全部业务类型</option></select>' +
' <button class="btn" id="btn-reset">重置</button>' +
' <span class="spacer"></span>' +
' <button class="btn btn-success" id="btn-add">+ 新增</button>' +
@@ -71,6 +74,8 @@ $(function () {
}
/* ---------- 列表 ---------- */
var companyFilters = { logic: 'and', conditions: [] }; // 筛选弹窗条件(多字段 + 且/或)
function loadList(page) {
currentPage = page;
var params = {
@@ -81,6 +86,11 @@ $(function () {
page: page,
limit: PAGE_SIZE
};
// 筛选弹窗条件(多字段 + 逻辑关系)
if (companyFilters.conditions.length) {
params.filters = JSON.stringify(companyFilters.conditions);
params.filter_logic = companyFilters.logic;
}
// 空值不传
Object.keys(params).forEach(function (k) {
if (params[k] === '') delete params[k];
@@ -118,17 +128,110 @@ $(function () {
});
}
/* ---------- 筛选 ---------- */
/* ---------- 检索:搜索(字段范围+关键词) / 筛选弹窗 / 行业+业务类型快速筛选 ---------- */
$('#btn-search').on('click', function () { loadList(1); });
$('#search-keyword').on('keydown', function (e) { if (e.keyCode === 13) loadList(1); });
$('#search-industry, #search-company-type').on('change', function () { loadList(1); });
$('#btn-reset').on('click', function () {
$('#search-field').val('');
$('#search-keyword').val('');
$('#search-industry').val('');
$('#search-company-type').val('');
companyFilters = { logic: 'and', conditions: [] };
loadList(1);
});
/* ---------- 筛选弹窗:多字段条件 + 且/或 逻辑关系 ---------- */
var FILTER_FIELDS = [
['name_zh', '企业名称'], ['name_en', '英文名称'], ['registration_number', '注册号'],
['legal_representative', '法定代表人'], ['address', '注册地址'], ['country', '国家/地区'],
['industry', '行业'], ['industry_subdivision', '行业细分'], ['legal_form', '企业类型'],
['business_role', '业务角色'], ['website', '官网'], ['source_channel', '来源渠道'],
['source_detail', '来源详情'], ['business_scope', '经营范围'], ['stock_code', '股票代码'],
['established_date', '成立日期'], ['latest_employee_count', '最新员工数'],
['latest_annual_revenue', '最新年营收']
];
var FILTER_OPS = [
['contains', '包含'], ['eq', '等于'], ['neq', '不等于'],
['starts_with', '开头是'], ['ends_with', '结尾是'],
['gt', '大于'], ['lt', '小于'], ['gte', '大于等于'], ['lte', '小于等于'],
['is_empty', '为空'], ['is_not_empty', '不为空']
];
function filterFieldOptions(cur) {
var h = '';
FILTER_FIELDS.forEach(function (f) {
h += '<option value="' + f[0] + '"' + (f[0] === cur ? ' selected' : '') + '>' + f[1] + '</option>';
});
return h;
}
function filterOpOptions(cur) {
var h = '';
FILTER_OPS.forEach(function (o) {
h += '<option value="' + o[0] + '"' + (o[0] === cur ? ' selected' : '') + '>' + o[1] + '</option>';
});
return h;
}
function filterRowHtml(c) {
c = c || {};
var valInput = (c.op === 'is_empty' || c.op === 'is_not_empty')
? '<input type="text" value="" disabled placeholder="(无需填值)" style="background:#f2f4f8;color:#8a94a6;width:180px;">'
: '<input type="text" value="' + escHtml(c.value || '') + '" placeholder="条件值" style="width:180px;">';
return '<div class="filter-row">' +
' <select class="f-field" style="width:150px;">' + filterFieldOptions(c.field) + '</select>' +
' <select class="f-op" style="width:110px;">' + filterOpOptions(c.op) + '</select>' +
valInput +
' <button type="button" class="btn btn-sm btn-danger" onclick="$(this).closest(\'.filter-row\').remove()">删除</button>' +
'</div>';
}
window.openFilterDialog = function () {
var logicHtml =
'<label style="margin-right:14px;font-size:13px;"><input type="radio" name="f-logic" value="and"' +
(companyFilters.logic !== 'or' ? ' checked' : '') + '> 且(同时满足)</label>' +
'<label style="font-size:13px;"><input type="radio" name="f-logic" value="or"' +
(companyFilters.logic === 'or' ? ' checked' : '') + '> 或(任一满足)</label>';
var rowsHtml = '';
if (companyFilters.conditions.length) {
companyFilters.conditions.forEach(function (c) { rowsHtml += filterRowHtml(c); });
} else {
rowsHtml = filterRowHtml(null);
}
var content =
'<div style="padding:16px 20px 6px;">' +
' <div style="margin-bottom:10px;font-size:13px;color:#5a6472;">每个字段是一个筛选条件,不同条件之间可为「且」「或」关系:</div>' +
' <div style="margin-bottom:10px;">' + logicHtml + '</div>' +
' <div id="filter-rows">' + rowsHtml + '</div>' +
' <button type="button" class="btn btn-sm" id="btn-add-filter" style="margin-top:8px;">+ 添加条件</button>' +
'</div>' +
'<div class="dialog-footer"><button type="button" class="btn" id="filter-cancel">取消</button>' +
'<button type="button" class="btn btn-primary" id="filter-apply">应用筛选</button></div>';
var idx = Dialog.open({
title: '设置筛选条件',
area: ['620px', 'auto'],
content: content,
btn: false
});
$('#btn-add-filter').on('click', function () { $('#filter-rows').append(filterRowHtml(null)); });
$('#filter-cancel').on('click', function () { Dialog.close(idx); });
$('#filter-apply').on('click', function () {
var logic = $('input[name="f-logic"]:checked').val() || 'and';
var conds = [];
$('#filter-rows .filter-row').each(function () {
var field = $(this).find('.f-field').val();
var op = $(this).find('.f-op').val();
var value = $.trim($(this).find('input[type="text"]').val());
if (!field || !op) return;
if (op !== 'is_empty' && op !== 'is_not_empty' && value === '') return; // 无值且需要值的条件跳过
conds.push({ field: field, op: op, value: value });
});
companyFilters = { logic: logic, conditions: conds };
Dialog.close(idx);
loadList(1);
});
};
$('#btn-filter').on('click', function () { openFilterDialog(); });
/* ---------- 新增/编辑 ---------- */
$('#btn-add').on('click', function () {
httpGet('company/cert_types.php').then(function (d) {