v1.0.50: 碎片处理6项修改 - 1)硬数据板块改名为「硬数据碎片新增与处理」;2)硬数据彻底移除「状态」字段(查看弹窗/数据表status列/列表接口全部删除,已转换以converted_id非空标识,preliminary旧页同步清理);3)硬数据操作列「继续补全」改「手动补全」+新增「AI补全」占位;4)软数据操作列「补全」改「手动补全」+新增「AI补全」占位;5)硬数据「废弃」改为从preliminary_data彻底硬删除;6)人员性别枚举收敛为男/女/未知(迁移归并其他/保密)

This commit is contained in:
nanguaboss
2026-08-11 00:09:33 +08:00
parent 9f06ee1cd9
commit 69fd4246c2
15 changed files with 92 additions and 85 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ var BASE_URL = '/api/';
var PAGE_SIZE = 20;
/** 系统版本号(logo旁展示):修改代码后运行 tools/bump_version.php 自动递增 */
var APP_VERSION = 'v1.0.49';
var APP_VERSION = 'v1.0.50';
/** 页脚版权/备案信息(在 config.js 中修改) */
var FOOTER_TEXT = '© 2026 SuperLink 管理系统 版权所有 | 备案号:请替换为真实备案号';
+28 -15
View File
@@ -1,7 +1,7 @@
/**
* fragment.js - 碎片处理中心(v1.0.27)
* fragment.js - 碎片处理中心(v1.0.50)
* 布局:顶部指标卡 + 【硬碎片】独立区块 + 【软碎片】独立区块(不用 Tab)
* 硬碎片:preliminary_data 中未终结记录(完整度/类型/内容摘要/来源/录入人/时间/状态/操作)
* 硬碎片:preliminary_data 中未转换记录(完整度/类型/内容摘要/来源/录入人/时间/操作;废弃即硬删除,无状态字段)
* 软碎片:四张主表 is_incomplete=1 记录(完整度/缺失层级标签/名称/缺失字段/所属表/时间/操作)
*/
$(function () {
@@ -42,8 +42,8 @@ $(function () {
// ================= 硬碎片 =================
'<div class="card" style="margin-top:14px;">' +
' <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;">' +
' <b style="font-size:15px;color:#1e2a3a;">硬数据新增与处理</b>' +
' <span style="font-size:12px;color:#8a94a6;">关键字段缺失、未入主表的原始线索(不含已转换/已废弃)</span>' +
' <b style="font-size:15px;color:#1e2a3a;">硬数据碎片新增与处理</b>' +
' <span style="font-size:12px;color:#8a94a6;">关键字段缺失、未入主表的原始线索(不含已转换)</span>' +
' </div>' +
' <div class="toolbar">' +
' <select id="hard-type"><option value="">全部类型</option>' +
@@ -147,7 +147,8 @@ $(function () {
'<td>' + fmtDate(r.updated_at) + '</td>' +
'<td class="ops">' +
' <a onclick="viewHard(' + r.id + ')">查看</a>' +
' <a onclick="convertHard(' + r.id + ')">继续补全</a>' +
' <a onclick="convertHard(' + r.id + ')">手动补全</a>' +
' <a onclick="aiCompleteHard(' + r.id + ')">AI补全</a>' +
' <a onclick="convertHardQuick(' + r.id + ')">转软碎片</a>' +
' <a onclick="discardHard(' + r.id + ')">废弃</a>' +
'</td></tr>';
@@ -184,7 +185,9 @@ $(function () {
'<td style="max-width:240px;">' + escHtml(missing) + '</td>' +
'<td>' + escHtml(r.table_label) + '</td>' +
'<td>' + fmtDate(r.updated_at) + '</td>' +
'<td class="ops"><a onclick="completeSoft(\'' + r.table + '\',' + r.id + ')">补全</a></td></tr>';
'<td class="ops">' +
' <a onclick="completeSoft(\'' + r.table + '\',' + r.id + ')">手动补全</a>' +
' <a onclick="aiCompleteSoft(\'' + r.table + '\',' + r.id + ')">AI补全</a></td></tr>';
});
if (!softRows.length) {
html = '<tr><td colspan="8" class="empty-tip" style="padding:30px 0;">暂无软碎片</td></tr>';
@@ -301,7 +304,7 @@ $(function () {
var fields = [
['类型', d.source_type_label], ['公司名称', d.company_name], ['联系人', d.person_name],
['联系电话', d.contact_phone], ['联系邮箱', d.contact_email],
['来源渠道', d.source_channel], ['录入人', d.recorded_by], ['状态', d.status],
['来源渠道', d.source_channel], ['录入人', d.recorded_by],
['录入时间', d.created_at], ['处理时间', d.processed_at]
];
fields.forEach(function (f) {
@@ -354,7 +357,7 @@ $(function () {
'</form>';
var idx = Dialog.open({
title: '硬数据继续补全',
title: '硬数据手动补全',
area: ['640px', 'auto'],
content: content,
btn: false
@@ -429,24 +432,24 @@ $(function () {
target = d.company_name ? 'company' : (d.person_name ? 'person' : '');
}
if (!target) {
Dialog.error('该碎片缺少可转换信息,请使用「继续补全」');
Dialog.error('该碎片缺少可转换信息,请使用「手动补全」');
return;
}
// 各类型转软碎片基本要求预检
if (target === 'company' && (!d.industry || !d.registration_number)) {
Dialog.error('企业类型转软碎片:请先「继续补全」填写行业和注册号');
Dialog.error('企业类型转软碎片:请先「手动补全」填写行业和注册号');
return;
}
if (target === 'person' && !d.person_name) {
Dialog.error('人员类型转软碎片:请先「继续补全」填写姓名');
Dialog.error('人员类型转软碎片:请先「手动补全」填写姓名');
return;
}
if (target === 'product' && !d.company_name) {
Dialog.error('产品类型转软碎片:请先「继续补全」填写公司名称');
Dialog.error('产品类型转软碎片:请先「手动补全」填写公司名称');
return;
}
if (target === 'need' && !d.company_name) {
Dialog.error('需求类型转软碎片:请先「继续补全」填写公司名称');
Dialog.error('需求类型转软碎片:请先「手动补全」填写公司名称');
return;
}
Dialog.confirm('确定将该硬数据直接转换为软数据碎片吗?', function () {
@@ -461,9 +464,14 @@ $(function () {
});
};
/* ================= 硬碎片:废弃 ================= */
/* ================= 硬碎片:AI补全(占位,后续开发) ================= */
window.aiCompleteHard = function (id) {
Dialog.alert('AI补全功能开发中,敬请期待');
};
/* ================= 硬碎片:废弃(彻底硬删除) ================= */
window.discardHard = function (id) {
Dialog.confirm('确定废弃该碎片吗?废弃后不可恢复。', function () {
Dialog.confirm('确定废弃该碎片吗?将从数据表中彻底删除,不可恢复。', function () {
httpPost('fragment/hard_discard.php', { id: id }).then(function () {
Dialog.success('已废弃', function () {
loadStats();
@@ -473,6 +481,11 @@ $(function () {
});
};
/* ================= 软碎片:AI补全(占位,后续开发) ================= */
window.aiCompleteSoft = function (table, id) {
Dialog.alert('AI补全功能开发中,敬请期待');
};
/* ================= 软碎片:补全 ================= */
window.completeSoft = function (table, id) {
httpGet('fragment/soft_detail.php', { table: table, id: id }).then(function (d) {
+2 -3
View File
@@ -27,7 +27,7 @@ $(function () {
' <input type="text" data-filter="keyword" placeholder="姓名/证件号/手机/邮箱关键词">' +
' <select data-filter="gender"><option value="">全部性别</option>' +
' <option value="男">男</option><option value="女">女</option>' +
' <option value="其他">其他</option><option value="保密">保密</option></select>' +
' <option value="未知">未知</option></select>' +
' <input type="text" data-filter="nationality" placeholder="国籍">' +
' <input type="text" data-filter="work_location" placeholder="工作所在地">' +
' <button class="btn btn-primary" id="btn-search">搜索</button>' +
@@ -287,10 +287,9 @@ $(function () {
'<div class="form-grid">' +
' <div class="form-item"><label>姓名<span class="req">*</span></label><input type="text" name="full_name" value="' + escHtml(p.full_name) + '"></div>' +
' <div class="form-item"><label>性别</label><select name="gender">' +
' <option value="保密"' + (!p.gender || p.gender === '保密' ? ' selected' : '') + '>保密</option>' +
' <option value="男"' + (p.gender === '男' ? ' selected' : '') + '>男</option>' +
' <option value="女"' + (p.gender === '女' ? ' selected' : '') + '>女</option>' +
' <option value="其他"' + (p.gender === '其他' ? ' selected' : '') + '>其他</option></select></div>' +
' <option value="未知"' + (!p.gender || p.gender === '未知' ? ' selected' : '') + '>未知</option></select></div>' +
' <div class="form-item"><label>国籍</label><input type="text" name="nationality" id="person-nationality" value="' + escHtml(p.nationality) + '" list="person-country-list" placeholder="选择或输入">' +
' <datalist id="person-country-list"></datalist></div>' +
' <div class="form-item"><label>证件类型</label><input type="text" name="id_type" value="' + escHtml(p.id_type) + '"></div>' +
+3 -18
View File
@@ -19,10 +19,6 @@ $(function () {
'<div class="card">' +
' <div class="toolbar">' +
' <input type="text" data-filter="keyword" placeholder="公司/姓名/电话/邮箱关键词">' +
' <select data-filter="status"><option value="">全部状态</option>' +
' <option value="待处理">待处理</option><option value="待分配">待分配</option>' +
' <option value="处理中">处理中</option><option value="已转换">已转换</option>' +
' <option value="已废弃">已废弃</option><option value="已拒收">已拒收</option></select>' +
' <select data-filter="source_type"><option value="">全部类型</option>' +
' <option value="company">公司</option><option value="person">人员</option>' +
' <option value="product">产品</option><option value="need">需求</option><option value="mixed">混合</option></select>' +
@@ -32,7 +28,7 @@ $(function () {
' <button class="btn" id="btn-reset">重置</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><th>录入时间</th></tr></thead>' +
' <thead><tr><th>ID</th><th>类型</th><th>公司</th><th>姓名</th><th>电话</th><th>邮箱</th><th>跟进人</th><th>录入时间</th></tr></thead>' +
' <tbody id="pre-tbody"></tbody>' +
' </table></div>' +
' <div class="pagination" id="pagination"></div>' +
@@ -42,16 +38,9 @@ $(function () {
function loadStats() {
httpGet('preliminary/stats.php').then(function (d) {
var statusMap = d.status || {};
var html = '';
(d.statuses || []).forEach(function (s) {
var cnt = statusMap[s] || 0;
html += '<div class="stat-card c-' + ['blue', 'orange', 'teal', 'green', 'red', 'gray'][(d.statuses || []).indexOf(s) % 6] + '">' +
'<div class="num">' + cnt + '</div><div class="label">' + escHtml(s) + '</div></div>';
});
$('#stat-cards').html(
'<div class="stat-card c-blue"><div class="num">' + d.total + '</div><div class="label">碎片总数</div></div>' +
'<div class="stat-card c-green"><div class="num">' + d.today + '</div><div class="label">今日新增</div></div>' + html
'<div class="stat-card c-green"><div class="num">' + d.today + '</div><div class="label">今日新增</div></div>'
);
});
}
@@ -66,7 +55,6 @@ $(function () {
var rows = data.list || [];
var html = '';
rows.forEach(function (r) {
var statusCls = { '待处理': 'tag-orange', '待分配': 'tag', '处理中': 'tag', '已转换': 'tag-green', '已废弃': 'tag-gray', '已拒收': 'tag-red' }[r.status] || 'tag';
html += '<tr>' +
'<td>' + r.id + '</td>' +
'<td>' + escHtml(r.source_type || '-') + '</td>' +
@@ -74,14 +62,11 @@ $(function () {
'<td>' + escHtml(r.person_name || '-') + '</td>' +
'<td>' + escHtml(r.contact_phone || '-') + '</td>' +
'<td>' + escHtml(r.contact_email || '-') + '</td>' +
'<td>' + escHtml(r.target_product_category || '-') + '</td>' +
'<td title="' + escHtml(r.description || '') + '">' + escHtml((r.description || '-').substring(0, 26)) + '</td>' +
'<td><span class="tag ' + statusCls + '">' + escHtml(r.status) + '</span></td>' +
'<td>' + escHtml(r.follow_person || '-') + '</td>' +
'<td>' + fmtDate(r.created_at) + '</td></tr>';
});
if (!rows.length) {
html = '<tr><td colspan="11" class="empty-tip" style="padding:40px 0;">暂无数据碎片</td></tr>';
html = '<tr><td colspan="8" class="empty-tip" style="padding:40px 0;">暂无数据碎片</td></tr>';
}
$('#pre-tbody').html(html);
renderPagination($('#pagination'), data, loadList);