From 2587c55ab6e4a548d569952b1a3d2fa049862944 Mon Sep 17 00:00:00 2001 From: nanguaboss <602995148@qq.com> Date: Sun, 9 Aug 2026 22:38:35 +0800 Subject: [PATCH] =?UTF-8?q?v1.0.35:=20=E9=87=8D=E5=A4=8D=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E5=AD=97=E6=AE=B5=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=20-=20=E6=A0=A1=E9=AA=8C=E5=BC=95=E6=93=8E?= =?UTF-8?q?=E6=94=B9=E6=94=B6=E9=9B=86=E6=A8=A1=E5=BC=8F=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E9=87=8D=E5=A4=8D,Response::duplicates?= =?UTF-8?q?=E5=8D=95=E5=BC=B9=E7=AA=97=E5=88=97=E5=87=BA,=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E9=81=8D=E5=8E=86=E5=B1=95=E7=A4=BA=E6=89=80=E6=9C=89?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/common/duplicate_check.php | 27 +++++++++++++-------------- api/common/response.php | 14 ++++++++++++-- api/company/add.php | 11 ++++++----- api/company/official_media_add.php | 6 +++--- api/company/update.php | 11 ++++++----- api/fragment/hard_convert.php | 12 ++++++------ api/media/add.php | 6 +++--- api/media/update.php | 6 +++--- api/person/add.php | 9 +++++---- api/person/update.php | 9 +++++---- static/js/common.js | 16 +++++++++------- static/js/config.js | 2 +- 12 files changed, 72 insertions(+), 57 deletions(-) diff --git a/api/common/duplicate_check.php b/api/common/duplicate_check.php index 89e4122..45b0d6a 100644 --- a/api/common/duplicate_check.php +++ b/api/common/duplicate_check.php @@ -177,16 +177,17 @@ function findDuplicate(PDO $pdo, $type, $value, $excludeIds = [], $platform = nu } /** - * 校验单条账号(媒体模块扁平字段) + * 校验单条账号(媒体模块扁平字段),返回所有重复项数组(空=无重复) * @param PDO $pdo * @param string $platform * @param string $accountId * @param string $profileUrl * @param array $excludeIds - * @return array|null + * @return array */ function checkSingleAccountDuplicate(PDO $pdo, $platform, $accountId, $profileUrl = '', $excludeIds = []) { + $dups = []; $platform = trim((string)$platform); $accountId = trim((string)$accountId); if ($platform !== '' && $accountId !== '') { @@ -196,45 +197,43 @@ function checkSingleAccountDuplicate(PDO $pdo, $platform, $accountId, $profileUr $dup = findDuplicate($pdo, 'account_id', $accountId, $excludeIds, $platform); } if ($dup) { - return $dup; + $dups[] = $dup; } } $profileUrl = trim((string)$profileUrl); if ($profileUrl !== '') { $dup = findDuplicate($pdo, 'profile_url', $profileUrl, $excludeIds); if ($dup) { - return $dup; + $dups[] = $dup; } } - return null; + return $dups; } /** - * 校验联系方式数组(persons/companies 的 contacts/accounts JSON) + * 校验联系方式数组(persons/companies 的 contacts/accounts JSON),返回所有重复项数组(空=无重复) * @param PDO $pdo * @param array $accounts [{platform,account_id,profile_url,...}] * @param array $excludeIds 整表替换时排除自身既有账号ID - * @return array|null + * @return array */ function checkAccountsDuplicates(PDO $pdo, $accounts, $excludeIds = []) { + $dups = []; if (!is_array($accounts)) { - return null; + return $dups; } foreach ($accounts as $a) { if (!is_array($a)) { continue; } - $dup = checkSingleAccountDuplicate( + $dups = array_merge($dups, checkSingleAccountDuplicate( $pdo, $a['platform'] ?? '', $a['account_id'] ?? '', $a['profile_url'] ?? '', $excludeIds - ); - if ($dup) { - return $dup; - } + )); } - return null; + return $dups; } diff --git a/api/common/response.php b/api/common/response.php index 4913167..201f372 100644 --- a/api/common/response.php +++ b/api/common/response.php @@ -31,10 +31,20 @@ class Response */ public static function duplicate($dup) { + self::duplicates([$dup]); + } + + /** + * 多条重复数据错误(一次录入多个字段均重复时,单弹窗全部列出) + * @param array $dups 重复记录数组 + */ + public static function duplicates($dups) + { + $dups = array_values((array)$dups); self::json([ 'code' => 1001, - 'msg' => ($dup['label'] ?? '字段') . '「' . ($dup['value'] ?? '') . '」出现重复', - 'data' => $dup, + 'msg' => count($dups) . ' 个字段出现重复', + 'data' => $dups, ]); } diff --git a/api/company/add.php b/api/company/add.php index 8c51d8b..6d81d3a 100644 --- a/api/company/add.php +++ b/api/company/add.php @@ -30,21 +30,22 @@ if ((int)($data['is_listed'] ?? 0) !== 1) { $pdo = DB::getInstance()->getPdo(); -// 唯一性校验:企业名称 / 注册号 / 联系方式(手机/邮箱/社媒账号/主页链接) +// 唯一性校验:企业名称 / 注册号 / 联系方式,收集全部重复 +$dups = []; $dup = findDuplicate($pdo, 'company_name', $data['name_zh'] ?? $data['display_name'] ?? ''); -if ($dup) Response::duplicate($dup); +if ($dup) $dups[] = $dup; if (!empty($data['registration_number'])) { $dup = findDuplicate($pdo, 'registration_number', $data['registration_number']); - if ($dup) Response::duplicate($dup); + if ($dup) $dups[] = $dup; } if (isset($_POST['accounts'])) { $accounts = json_decode($_POST['accounts'], true); if (!is_array($accounts)) { Response::error('联系方式格式错误', 400); } - $dup = checkAccountsDuplicates($pdo, $accounts); - if ($dup) Response::duplicate($dup); + $dups = array_merge($dups, checkAccountsDuplicates($pdo, $accounts)); } +if (!empty($dups)) Response::duplicates($dups); [$sql, $params] = buildInsert($data); $pdo->prepare("INSERT INTO companies $sql")->execute($params); diff --git a/api/company/official_media_add.php b/api/company/official_media_add.php index 50ae58f..17982c1 100644 --- a/api/company/official_media_add.php +++ b/api/company/official_media_add.php @@ -31,9 +31,9 @@ if ((int)$chk->fetchColumn() === 0) { Response::error('企业不存在'); } -// 唯一性校验:社媒账号ID(同平台)/ 手机 / 邮箱 / 主页链接 -$dup = checkSingleAccountDuplicate($pdo, $platform, $accountId, $_POST['profile_url'] ?? ''); -if ($dup) Response::duplicate($dup); +// 唯一性校验:社媒账号ID(同平台)/ 手机 / 邮箱 / 主页链接,收集全部重复 +$dups = checkSingleAccountDuplicate($pdo, $platform, $accountId, $_POST['profile_url'] ?? ''); +if (!empty($dups)) Response::duplicates($dups); $ins = $pdo->prepare( "INSERT INTO social_accounts (owner_type, owner_id, platform, account_id, profile_url, remark, is_primary, is_defult, is_active) diff --git a/api/company/update.php b/api/company/update.php index 4ae624e..221adbc 100644 --- a/api/company/update.php +++ b/api/company/update.php @@ -41,12 +41,13 @@ if (!$old) { Response::error('企业不存在'); } -// 唯一性校验(排除自身):企业名称 / 注册号 / 联系方式 +// 唯一性校验(排除自身):企业名称 / 注册号 / 联系方式,收集全部重复 +$dups = []; $dup = findDuplicate($pdo, 'company_name', $data['name_zh'] ?? $old['display_name'] ?? '', [$id]); -if ($dup) Response::duplicate($dup); +if ($dup) $dups[] = $dup; if (!empty($data['registration_number'])) { $dup = findDuplicate($pdo, 'registration_number', $data['registration_number'], [$id]); - if ($dup) Response::duplicate($dup); + if ($dup) $dups[] = $dup; } $accounts = null; if ($hasAccounts) { @@ -56,9 +57,9 @@ if ($hasAccounts) { } // 整表替换:排除企业自身既有联系方式ID $ownIds = $pdo->query("SELECT id FROM social_accounts WHERE owner_type = 'company' AND owner_id = $id")->fetchAll(PDO::FETCH_COLUMN); - $dup = checkAccountsDuplicates($pdo, $accounts, $ownIds); - if ($dup) Response::duplicate($dup); + $dups = array_merge($dups, checkAccountsDuplicates($pdo, $accounts, $ownIds)); } +if (!empty($dups)) Response::duplicates($dups); if (!empty($data)) { [$sets, $params] = buildUpdate($data); diff --git a/api/fragment/hard_convert.php b/api/fragment/hard_convert.php index 1d92bef..73aede5 100644 --- a/api/fragment/hard_convert.php +++ b/api/fragment/hard_convert.php @@ -45,17 +45,17 @@ $sourceChannel = $frag['source_channel'] ?? null; $convertedId = 0; -// 唯一性校验:按目标类型 +// 唯一性校验:按目标类型,收集全部重复 +$dups = []; if ($targetType === 'company' && $companyName !== '') { $dup = findDuplicate($pdo, 'company_name', $companyName); - if ($dup) Response::duplicate($dup); + if ($dup) $dups[] = $dup; } if (in_array($targetType, ['person', 'company'], true)) { - $dup = checkSingleAccountDuplicate($pdo, $phone !== '' ? 'phone' : '', $phone, ''); - if ($dup) Response::duplicate($dup); - $dup = checkSingleAccountDuplicate($pdo, $email !== '' ? 'email' : '', $email, ''); - if ($dup) Response::duplicate($dup); + $dups = array_merge($dups, checkSingleAccountDuplicate($pdo, $phone !== '' ? 'phone' : '', $phone, '')); + $dups = array_merge($dups, checkSingleAccountDuplicate($pdo, $email !== '' ? 'email' : '', $email, '')); } +if (!empty($dups)) Response::duplicates($dups); /** 创建 social_accounts(phone/email,常用) */ $saveContacts = function ($ownerType, $ownerId) use ($pdo, $phone, $email) { diff --git a/api/media/add.php b/api/media/add.php index 205355f..c6bd090 100644 --- a/api/media/add.php +++ b/api/media/add.php @@ -43,9 +43,9 @@ if ((int)$chk->fetchColumn() > 0) { Response::error('该平台账号已存在', 400); } -// 唯一性校验:社媒账号ID(同平台)/ 手机 / 邮箱 / 主页链接 -$dup = checkSingleAccountDuplicate($pdo, $data['platform'] ?? '', $data['account_id'] ?? '', $data['profile_url'] ?? ''); -if ($dup) Response::duplicate($dup); +// 唯一性校验:社媒账号ID(同平台)/ 手机 / 邮箱 / 主页链接,收集全部重复 +$dups = checkSingleAccountDuplicate($pdo, $data['platform'] ?? '', $data['account_id'] ?? '', $data['profile_url'] ?? ''); +if (!empty($dups)) Response::duplicates($dups); [$sql, $params] = buildInsert($data); $pdo->prepare("INSERT INTO social_accounts $sql")->execute($params); diff --git a/api/media/update.php b/api/media/update.php index 3d36d5f..6978efc 100644 --- a/api/media/update.php +++ b/api/media/update.php @@ -30,16 +30,16 @@ if (!$old) { $data = extractFields(MEDIA_FIELDS); unset($data['owner_type'], $data['owner_id']); // 归属关系不允许改 -// 唯一性校验(排除自身):社媒账号ID(同平台)/ 手机 / 邮箱 / 主页链接 +// 唯一性校验(排除自身):社媒账号ID(同平台)/ 手机 / 邮箱 / 主页链接,收集全部重复 if (isset($_POST['platform']) || isset($_POST['account_id']) || isset($_POST['profile_url'])) { - $dup = checkSingleAccountDuplicate( + $dups = checkSingleAccountDuplicate( $pdo, $_POST['platform'] ?? ($old['platform'] ?? ''), $_POST['account_id'] ?? ($old['account_id'] ?? ''), $_POST['profile_url'] ?? ($old['profile_url'] ?? ''), [$id] ); - if ($dup) Response::duplicate($dup); + if (!empty($dups)) Response::duplicates($dups); } if (!empty($data)) { diff --git a/api/person/add.php b/api/person/add.php index 971caf1..da27eb6 100644 --- a/api/person/add.php +++ b/api/person/add.php @@ -32,17 +32,18 @@ if ((int)$chk->fetchColumn() > 0) { Response::error('union_id 已存在,请更换'); } -// 唯一性校验:身份证号码 / 联系方式(手机/邮箱/社媒账号/主页链接) +// 唯一性校验:身份证号码 / 联系方式(手机/邮箱/社媒账号/主页链接),收集全部重复 +$dups = []; if (!empty($data['id_number'])) { $dup = findDuplicate($pdo, 'id_number', $data['id_number']); - if ($dup) Response::duplicate($dup); + if ($dup) $dups[] = $dup; } $contacts = json_decode($_POST['contacts'] ?? '[]', true); if (!is_array($contacts)) { $contacts = []; } -$dup = checkAccountsDuplicates($pdo, $contacts); -if ($dup) Response::duplicate($dup); +$dups = array_merge($dups, checkAccountsDuplicates($pdo, $contacts)); +if (!empty($dups)) Response::duplicates($dups); [$sql, $params] = buildInsert($data); $pdo->prepare("INSERT INTO persons $sql")->execute($params); diff --git a/api/person/update.php b/api/person/update.php index cfefe90..ee61944 100644 --- a/api/person/update.php +++ b/api/person/update.php @@ -30,10 +30,11 @@ if (!$old) { Response::error('人员不存在'); } -// 唯一性校验(排除自身):身份证号码 / 联系方式 +// 唯一性校验(排除自身):身份证号码 / 联系方式,收集全部重复 +$dups = []; if (!empty($data['id_number'])) { $dup = findDuplicate($pdo, 'id_number', $data['id_number'], [$id]); - if ($dup) Response::duplicate($dup); + if ($dup) $dups[] = $dup; } $contacts = null; if (isset($_POST['contacts'])) { @@ -43,9 +44,9 @@ if (isset($_POST['contacts'])) { } // 整体替换:排除人员自身既有联系方式ID $ownIds = $pdo->query("SELECT id FROM social_accounts WHERE owner_type = 'person' AND owner_id = $id")->fetchAll(PDO::FETCH_COLUMN); - $dup = checkAccountsDuplicates($pdo, $contacts, $ownIds); - if ($dup) Response::duplicate($dup); + $dups = array_merge($dups, checkAccountsDuplicates($pdo, $contacts, $ownIds)); } +if (!empty($dups)) Response::duplicates($dups); $contactsChanged = false; if ($contacts !== null) { diff --git a/static/js/common.js b/static/js/common.js index 7adad01..9010a9a 100644 --- a/static/js/common.js +++ b/static/js/common.js @@ -49,17 +49,19 @@ function handleResp(resp) { location.href = 'index.html'; return $.Deferred().reject(resp).promise(); } - // 重复数据:弹窗提示字段 + 重复记录的表名与 id + // 重复数据:单弹窗列出所有重复字段 + 重复记录的表名与 id if (resp && resp.code === 1001 && resp.data) { - var d = resp.data; + var list = $.isArray(resp.data) ? resp.data : [resp.data]; + var items = ''; + (list || []).forEach(function (x) { + items += '