Files
superlink/api/company/update.php
T

107 lines
3.8 KiB
PHP

<?php
/**
* 企业编辑接口 POST /api/company/update.php
* 入参:id + 需要更新的白名单字段
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/logger.php';
require_once __DIR__ . '/../common/helpers.php';
require_once __DIR__ . '/../common/completeness.php';
require_once __DIR__ . '/../common/duplicate_check.php';
checkAjax();
checkPermission('company');
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
Response::error('参数错误', 400);
}
$data = extractFields(COMPANY_FIELDS);
unset($data['display_name']); // 显示名称不允许通过编辑接口置空/改名,如需改名请走完整字段
// 非上市(否)不允许有股票代码:提交 is_listed=0 时强制清空
if (array_key_exists('is_listed', $data) && (int)$data['is_listed'] !== 1) {
$data['stock_code'] = null;
}
$hasFinancials = array_key_exists('financials', $_POST);
$hasCertifications = array_key_exists('certifications', $_POST);
$hasAccounts = array_key_exists('accounts', $_POST);
if (empty($data) && !$hasFinancials && !$hasCertifications && !$hasAccounts) {
Response::error('没有需要更新的字段', 400);
}
$pdo = DB::getInstance()->getPdo();
$check = $pdo->prepare("SELECT id, display_name FROM companies WHERE id = ?");
$check->execute([$id]);
$old = $check->fetch();
if (!$old) {
Response::error('企业不存在');
}
// 唯一性校验(排除自身):企业名称 / 注册号 / 联系方式
$dup = findDuplicate($pdo, 'company_name', $data['name_zh'] ?? $old['display_name'] ?? '', [$id]);
if ($dup) Response::duplicate($dup);
if (!empty($data['registration_number'])) {
$dup = findDuplicate($pdo, 'registration_number', $data['registration_number'], [$id]);
if ($dup) Response::duplicate($dup);
}
$accounts = null;
if ($hasAccounts) {
$accounts = json_decode($_POST['accounts'], true);
if (!is_array($accounts)) {
Response::error('联系方式格式错误', 400);
}
// 整表替换:排除企业自身既有联系方式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);
}
if (!empty($data)) {
[$sets, $params] = buildUpdate($data);
$params[] = $id;
$pdo->prepare("UPDATE companies SET $sets WHERE id = ?")->execute($params);
}
// 财务信息 / 资质认证 / 联系方式(可选,整表替换)
if ($hasFinancials || $hasCertifications || $hasAccounts) {
$pdo->beginTransaction();
try {
if ($hasFinancials) {
$financials = json_decode($_POST['financials'], true);
if (!is_array($financials)) {
$pdo->rollBack();
Response::error('财务信息格式错误', 400);
}
saveCompanyFinancials($pdo, $id, $financials);
}
if ($hasCertifications) {
$certs = json_decode($_POST['certifications'], true);
if (!is_array($certs)) {
$pdo->rollBack();
Response::error('资质认证格式错误', 400);
}
saveCompanyCertifications($pdo, $id, $certs);
}
if ($hasAccounts) {
saveCompanyAccounts($pdo, $id, $accounts);
}
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
Response::error('关联信息保存失败:' . $e->getMessage());
}
}
// 完整度检查:企业主表 + 其 social_accounts
updateIncomplete($pdo, 'companies', $id);
updateAccountsIncomplete($pdo, 'company', $id);
if (!empty($data)) {
logCurrent('update', 'company', 'companies', $id, ['before' => $old, 'after' => $data]);
}
Response::success(null, '更新成功');