v1.0.27: 碎片处理中心(完整方案) - 完整度计算引擎(四表分层/阈值)+is_incomplete标记(写操作挂钩)+api/fragment八接口(统计/硬碎片列表详情转换废弃/软碎片列表详情补全)+fragment.html前端(指标卡+硬软碎片双区块)

This commit is contained in:
nanguaboss
2026-08-09 15:47:05 +08:00
parent b68232bff3
commit 76431c20ac
25 changed files with 1342 additions and 3 deletions
+56
View File
@@ -0,0 +1,56 @@
<?php
/**
* 硬碎片公共逻辑:字段分层 / 完整度计算 / 内容摘要
* 被 hard_list.php 与 hard_detail.php 共用
*/
/** 硬碎片字段分层(按 source_type) */
const HARD_LAYERS = [
'company' => ['core' => ['company_name', 'contact_phone'], 'important' => ['contact_email'], 'supplementary' => ['person_name', 'description', 'target_product_category']],
'person' => ['core' => ['person_name', 'contact_phone'], 'important' => ['contact_email'], 'supplementary' => ['company_name', 'description', 'target_product_category']],
'product' => ['core' => ['company_name', 'target_product_category'], 'important' => ['contact_phone', 'contact_email'], 'supplementary' => ['person_name', 'description']],
'need' => ['core' => ['company_name', 'target_product_category'], 'important' => ['contact_phone', 'contact_email'], 'supplementary' => ['person_name', 'description']],
'mixed' => ['core' => ['company_name', 'person_name'], 'important' => ['contact_phone', 'contact_email'], 'supplementary' => ['description', 'target_product_category']],
];
const HARD_LABELS = [
'company_name' => '公司名称', 'person_name' => '联系人', 'contact_phone' => '电话',
'contact_email' => '邮箱', 'target_product_category' => '产品品类', 'description' => '描述',
];
/** 计算硬碎片完整度与缺失层级 */
function hardCompleteness($row)
{
$layers = HARD_LAYERS[$row['source_type']] ?? HARD_LAYERS['mixed'];
$missing = ['core' => [], 'important' => [], 'supplementary' => []];
foreach (['core', 'important', 'supplementary'] as $layer) {
foreach ($layers[$layer] as $field) {
if ($row[$field] === null || trim((string)$row[$field]) === '') {
$missing[$layer][] = $field;
}
}
}
$score = 100 - count($missing['core']) * 20 - count($missing['important']) * 8 - count($missing['supplementary']) * 2;
$score = max(0, $score);
$level = 'complete';
if (!empty($missing['core'])) {
$level = 'core';
} elseif (!empty($missing['important'])) {
$level = 'important';
} elseif (!empty($missing['supplementary'])) {
$level = 'supplementary';
}
return ['score' => $score, 'level' => $level, 'missing' => $missing];
}
/** 内容摘要:拼接已有关键信息 */
function hardSummary($row)
{
$parts = [];
if (!empty($row['company_name'])) $parts[] = '公司:' . $row['company_name'];
if (!empty($row['person_name'])) $parts[] = '联系人:' . $row['person_name'];
if (!empty($row['contact_phone'])) $parts[] = '手机:' . $row['contact_phone'];
if (!empty($row['contact_email'])) $parts[] = '邮箱:' . $row['contact_email'];
if (!empty($row['target_product_category'])) $parts[] = '品类:' . $row['target_product_category'];
if (empty($parts) && !empty($row['description'])) $parts[] = '描述:' . mb_substr($row['description'], 0, 20);
return implode(' ', $parts);
}