diff --git a/api/fragment/hard_add.php b/api/fragment/hard_add.php index 37809ba..1e7c71d 100644 --- a/api/fragment/hard_add.php +++ b/api/fragment/hard_add.php @@ -29,6 +29,10 @@ $idNumber = trim($_POST['id_number'] ?? ''); $platform = trim($_POST['platform'] ?? ''); $accountId = trim($_POST['account_id'] ?? ''); $profileUrl = trim($_POST['profile_url'] ?? ''); +$industry = trim($_POST['industry'] ?? ''); // 企业:行业 +$registrationNum = trim($_POST['registration_number'] ?? ''); // 企业:注册号 +$category = trim($_POST['target_product_category'] ?? ''); // 产品:品类(存 extra) +$needCategory = trim($_POST['need_category'] ?? ''); // 需求:需求类别(存 extra) $sourceChannel = trim($_POST['source_channel'] ?? ''); // 硬数据标准校验: @@ -70,12 +74,14 @@ if ($accountId !== '' && $platform !== '') { } if (!empty($dups)) Response::duplicates($dups); -// 额外信息(身份证/社媒平台/账号ID/主页链接)存 extra_info +// 额外信息(身份证/社媒平台/账号ID/主页链接/产品品类/需求类别)存 extra_info $extra = []; if ($idNumber !== '') $extra['id_number'] = $idNumber; if ($platform !== '') $extra['platform'] = $platform; if ($accountId !== '') $extra['account_id'] = $accountId; if ($profileUrl !== '') $extra['profile_url'] = $profileUrl; +if ($category !== '') $extra['category'] = $category; +if ($needCategory !== '') $extra['need_category'] = $needCategory; // 至少有一项内容才能录为碎片 if ($companyName === '' && $personName === '' && $phone === '' && $email === '' && !$extra) { @@ -84,12 +90,14 @@ if ($companyName === '' && $personName === '' && $phone === '' && $email === '' $pdo->prepare( "INSERT INTO preliminary_data - (source_type, company_name, person_name, contact_phone, contact_email, + (source_type, company_name, industry, registration_number, person_name, contact_phone, contact_email, source_channel, recorded_by, status, extra_info) - VALUES (?, ?, ?, ?, ?, ?, ?, '待处理', ?)" + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, '待处理', ?)" )->execute([ $sourceType, $companyName !== '' ? $companyName : null, + $industry !== '' ? $industry : null, + $registrationNum !== '' ? $registrationNum : null, $personName !== '' ? $personName : null, $phone !== '' ? $phone : null, $email !== '' ? $email : null, diff --git a/api/fragment/hard_convert.php b/api/fragment/hard_convert.php index dc7aec1..d65ace6 100644 --- a/api/fragment/hard_convert.php +++ b/api/fragment/hard_convert.php @@ -41,15 +41,63 @@ $phone = trim($_POST['contact_phone'] ?? ($frag['contact_phone'] ?? '')); $email = trim($_POST['contact_email'] ?? ($frag['contact_email'] ?? '')); $category = trim($_POST['target_product_category'] ?? ''); // 仅补全录入表单提供(表中已无该字段) $description = trim($_POST['description'] ?? ''); // 仅补全录入表单提供 -$industry = trim($_POST['industry'] ?? ''); +$industry = trim($_POST['industry'] ?? ($frag['industry'] ?? '')); // 企业:行业(转软碎片必填) +$registrationNum = trim($_POST['registration_number'] ?? ($frag['registration_number'] ?? '')); // 企业:注册号(转软碎片必填) $sourceChannel = $frag['source_channel'] ?? null; +// 补全表单额外信息(extra_info) +$fragExtra = json_decode($frag['extra_info'] ?? 'null', true); +if (!is_array($fragExtra)) { + $fragExtra = []; +} +if ($category === '') $category = trim((string)($fragExtra['category'] ?? '')); +$needCategory = trim($_POST['need_category'] ?? ($fragExtra['need_category'] ?? '')); + $convertedId = 0; // 格式校验:手机 / 邮箱 checkFieldFormat('phone', $phone); checkFieldFormat('email', $email); +// 各类型转软碎片基本要求 +switch ($targetType) { + case 'company': + if ($companyName === '') { + Response::error('企业类型转软碎片:企业名称为必填项,请先「继续补全」', 400); + } + if ($industry === '') { + Response::error('企业类型转软碎片:行业为必填项,请先「继续补全」填写行业', 400); + } + if ($registrationNum === '') { + Response::error('企业类型转软碎片:注册号为必填项,请先「继续补全」填写注册号', 400); + } + break; + case 'person': + if ($personName === '') { + Response::error('人员类型转软碎片:姓名为必填项,请先「继续补全」', 400); + } + if ($phone === '' && $email === '') { + Response::error('人员类型转软碎片:手机号码、邮箱至少填写一项,请先「继续补全」', 400); + } + break; + case 'product': + if ($companyName === '') { + Response::error('产品类型转软碎片:公司名称为必填项,请先「继续补全」', 400); + } + if ($category === '') { + Response::error('产品类型转软碎片:产品品类为必填项,请先「继续补全」填写品类', 400); + } + break; + case 'need': + if ($companyName === '') { + Response::error('需求类型转软碎片:公司名称为必填项,请先「继续补全」', 400); + } + if ($needCategory === '') { + Response::error('需求类型转软碎片:需求类别为必填项,请先「继续补全」填写需求类别', 400); + } + break; +} + // 唯一性校验:按目标类型,收集全部重复 $dups = []; if ($targetType === 'company' && $companyName !== '') { @@ -79,7 +127,7 @@ $saveContacts = function ($ownerType, $ownerId) use ($pdo, $phone, $email) { }; /** 按名称找公司,找不到则自动创建 */ -$resolveCompany = function () use ($pdo, $companyName, $sourceChannel, $industry) { +$resolveCompany = function () use ($pdo, $companyName, $sourceChannel, $industry, $registrationNum) { $stmt = $pdo->prepare("SELECT id FROM companies WHERE display_name = ? AND is_active = 1 LIMIT 1"); $stmt->execute([$companyName]); $cid = (int)$stmt->fetchColumn(); @@ -87,22 +135,20 @@ $resolveCompany = function () use ($pdo, $companyName, $sourceChannel, $industry return $cid; } $pdo->prepare( - "INSERT INTO companies (display_name, name_zh, industry, source_channel) VALUES (?, ?, ?, ?)" - )->execute([$companyName, $companyName, $industry !== '' ? $industry : null, $sourceChannel]); + "INSERT INTO companies (display_name, name_zh, industry, registration_number, source_channel) VALUES (?, ?, ?, ?, ?)" + )->execute([$companyName, $companyName, $industry !== '' ? $industry : null, $registrationNum !== '' ? $registrationNum : null, $sourceChannel]); return (int)$pdo->lastInsertId(); }; switch ($targetType) { case 'company': - if ($companyName === '') { - Response::error('公司名称为必填项', 400); - } $pdo->prepare( - "INSERT INTO companies (display_name, name_zh, industry, business_scope, source_channel, source_detail) - VALUES (?, ?, ?, ?, ?, ?)" + "INSERT INTO companies (display_name, name_zh, industry, registration_number, business_scope, source_channel, source_detail) + VALUES (?, ?, ?, ?, ?, ?, ?)" )->execute([ $companyName, $companyName, $industry !== '' ? $industry : null, + $registrationNum !== '' ? $registrationNum : null, $description !== '' ? $description : null, $sourceChannel, $description !== '' ? $description : null, @@ -149,7 +195,6 @@ switch ($targetType) { } $companyId = $resolveCompany(); $contactPerson = trim($_POST['contact_person'] ?? ($frag['person_name'] ?? '')); - $needCategory = trim($_POST['need_category'] ?? ''); $scenario = trim($_POST['application_scenario'] ?? ''); $pdo->prepare( "INSERT INTO company_needs (company_id, contact_person, need_category, target_product_category, application_scenario, description) diff --git a/api/fragment/hard_update.php b/api/fragment/hard_update.php index 562cb74..e3df8ba 100644 --- a/api/fragment/hard_update.php +++ b/api/fragment/hard_update.php @@ -39,6 +39,10 @@ $idNumber = trim($_POST['id_number'] ?? ''); $platform = trim($_POST['platform'] ?? ''); $accountId = trim($_POST['account_id'] ?? ''); $profileUrl = trim($_POST['profile_url'] ?? ''); +$industry = trim($_POST['industry'] ?? ''); // 企业:行业 +$registrationNum = trim($_POST['registration_number'] ?? ''); // 企业:注册号 +$category = trim($_POST['target_product_category'] ?? ''); // 产品:品类 +$needCategory = trim($_POST['need_category'] ?? ''); // 需求:需求类别 if (!in_array($sourceType, ['company', 'person', 'product', 'need', 'mixed'], true)) { Response::error('碎片类型不合法', 400); } @@ -80,7 +84,7 @@ if ($accountId !== '' && $platform !== '') { } if (!empty($dups)) Response::duplicates($dups); -// extra_info 合并更新(身份证/平台/账号ID/主页链接) +// extra_info 合并更新(身份证/平台/账号ID/主页链接/品类/需求类别) $extra = json_decode($frag['extra_info'] ?? 'null', true); if (!is_array($extra)) { $extra = []; @@ -89,14 +93,19 @@ if ($idNumber !== '') $extra['id_number'] = $idNumber; else unset($extra['id_num if ($platform !== '') $extra['platform'] = $platform; else unset($extra['platform']); if ($accountId !== '') $extra['account_id'] = $accountId; else unset($extra['account_id']); if ($profileUrl !== '') $extra['profile_url'] = $profileUrl; else unset($extra['profile_url']); +if ($category !== '') $extra['category'] = $category; else unset($extra['category']); +if ($needCategory !== '') $extra['need_category'] = $needCategory; else unset($extra['need_category']); $pdo->prepare( "UPDATE preliminary_data - SET source_type = ?, company_name = ?, person_name = ?, contact_phone = ?, contact_email = ?, extra_info = ? + SET source_type = ?, company_name = ?, industry = ?, registration_number = ?, person_name = ?, + contact_phone = ?, contact_email = ?, extra_info = ? WHERE id = ?" )->execute([ $sourceType, $companyName !== '' ? $companyName : null, + $industry !== '' ? $industry : null, + $registrationNum !== '' ? $registrationNum : null, $personName !== '' ? $personName : null, $phone !== '' ? $phone : null, $email !== '' ? $email : null, diff --git a/sql/migration_v1.0.47.sql b/sql/migration_v1.0.47.sql new file mode 100644 index 0000000..1a346a5 --- /dev/null +++ b/sql/migration_v1.0.47.sql @@ -0,0 +1,9 @@ +-- ============================================================ +-- SuperLink Web - v1.0.47 数据库结构变更 +-- preliminary_data 增加企业重要字段:行业 / 注册号(转软碎片必要条件) +-- ============================================================ +SET NAMES utf8mb4; + +ALTER TABLE `preliminary_data` + ADD COLUMN `industry` varchar(100) DEFAULT NULL COMMENT '行业(企业转软碎片必填)' AFTER `company_name`, + ADD COLUMN `registration_number` varchar(100) DEFAULT NULL COMMENT '企业注册号(企业转软碎片必填)' AFTER `industry`; diff --git a/static/js/config.js b/static/js/config.js index d8c2053..f1b1bed 100644 --- a/static/js/config.js +++ b/static/js/config.js @@ -5,7 +5,7 @@ var BASE_URL = '/api/'; var PAGE_SIZE = 20; /** 系统版本号(logo旁展示):修改代码后运行 tools/bump_version.php 自动递增 */ -var APP_VERSION = 'v1.0.46'; +var APP_VERSION = 'v1.0.47'; /** 页脚版权/备案信息(在 config.js 中修改) */ var FOOTER_TEXT = '© 2026 SuperLink 管理系统 版权所有 | 备案号:请替换为真实备案号'; diff --git a/static/js/fragment.js b/static/js/fragment.js index 7b5494b..ead959d 100644 --- a/static/js/fragment.js +++ b/static/js/fragment.js @@ -204,9 +204,13 @@ $(function () { '