Files
toolbox/app/Http/Controllers/SqlGeneratorController.php

271 lines
9.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
class SqlGeneratorController extends Controller
{
/**
* 查询 agentslave.case_extras 中已存在的 OB 外部 ID 记录。
*/
public function checkObExternalId(Request $request): JsonResponse
{
try {
$request->validate([
'case_codes' => 'required|array|min:1',
'case_codes.*' => 'required|string|max:255',
]);
$caseCodes = array_values(array_unique(array_filter(array_map('trim', $request->input('case_codes')))));
if (empty($caseCodes)) {
return response()->json([
'success' => false,
'message' => '请提供有效的 case_id 列表',
], 400);
}
$existingCaseCodes = [];
foreach (array_chunk($caseCodes, 1000) as $chunk) {
$results = DB::connection('agentslave')
->table('case_extras')
->where('source', 'ob')
->where('field', 'OB Case ID')
->whereIn('case_code', $chunk)
->pluck('case_code')
->all();
$existingCaseCodes = array_merge($existingCaseCodes, $results);
}
$existingCaseCodes = array_values(array_unique(array_map('strval', $existingCaseCodes)));
return response()->json([
'success' => true,
'data' => [
'existing_case_codes' => $existingCaseCodes,
],
]);
} catch (ValidationException $e) {
return response()->json([
'success' => false,
'message' => '请求参数验证失败',
'errors' => $e->errors(),
], 422);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => '查询 case_extras 失败: '.$e->getMessage(),
], 500);
}
}
/**
* 查询 CRM 加工单关联地址国家,用于区分 PP-CN / PP-US。
*/
public function checkProductionCountries(Request $request): JsonResponse
{
try {
$request->validate([
'production_codes' => 'required|array|min:1',
'production_codes.*' => 'required|string|max:255',
]);
$productionCodes = array_values(array_unique(array_filter(array_map('trim', $request->input('production_codes')))));
if (empty($productionCodes)) {
return response()->json([
'success' => false,
'message' => '请提供有效的加工单列表',
], 400);
}
$productionCountries = $this->getProductionCountries($productionCodes);
return response()->json([
'success' => true,
'data' => [
'production_countries' => $productionCountries,
],
]);
} catch (ValidationException $e) {
return response()->json([
'success' => false,
'message' => '请求参数验证失败',
'errors' => $e->errors(),
], 422);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => '查询 CRM 加工单国家失败: '.$e->getMessage(),
], 500);
}
}
private function getProductionCountries(array $productionCodes): array
{
$productionCountries = [];
foreach (array_chunk($productionCodes, 1000) as $chunk) {
$productions = DB::connection('crmslave')
->table('ea_production as ep')
->join('ea_production_cstm as epc', 'ep.id', '=', 'epc.id_c')
->where('ep.deleted', 0)
->whereIn('ep.name', $chunk)
->select([
'ep.name as production_code',
'epc.ea_case_id_c',
'epc.ea_businessorder_id_c',
'epc.ea_salesorder_id_c',
])
->get();
$caseIds = $productions->pluck('ea_case_id_c')->filter()->unique()->values()->all();
$businessOrderIds = $productions->pluck('ea_businessorder_id_c')->filter()->unique()->values()->all();
$salesOrderIds = $productions->pluck('ea_salesorder_id_c')->filter()->unique()->values()->all();
$caseCountries = $this->getCountriesByCaseIds($caseIds);
$businessOrderCountries = $this->getCountriesByBusinessOrderIds($businessOrderIds);
$salesOrderCountries = $this->getCountriesBySalesOrderIds($salesOrderIds);
foreach ($productions as $production) {
$countries = array_merge(
$caseCountries[(string) $production->ea_case_id_c] ?? [],
$businessOrderCountries[(string) $production->ea_businessorder_id_c] ?? [],
$salesOrderCountries[(string) $production->ea_salesorder_id_c] ?? []
);
$productionCountries[(string) $production->production_code] = array_values(array_unique(array_filter($countries)));
}
}
return $productionCountries;
}
private function getCountriesByCaseIds(array $caseIds): array
{
if (empty($caseIds)) {
return [];
}
$results = DB::connection('crmslave')
->table('ea_case as ec')
->join('accounts_ea_case_1_c as aec1c', function ($join) {
$join->on('aec1c.accounts_ea_case_1ea_case_idb', '=', 'ec.id')
->where('aec1c.deleted', '=', 0);
})
->join('accounts as a', 'a.id', '=', 'aec1c.accounts_ea_case_1accounts_ida')
->join('accounts_cstm as ac', 'ac.id_c', '=', 'a.id')
->where('ec.deleted', 0)
->where('a.deleted', 0)
->whereIn('ec.id', $caseIds)
->whereNotNull('ac.country_c')
->select([
'ec.id as entity_id',
'ac.country_c as country',
'ac.province_c as province',
])
->get();
return $this->groupCountriesByEntityId($results);
}
private function getCountriesByBusinessOrderIds(array $businessOrderIds): array
{
if (empty($businessOrderIds)) {
return [];
}
$results = DB::connection('crmslave')
->table('ea_businessorder as eb')
->join('accounts_ea_businessorder_1_c as aeb1c', function ($join) {
$join->on('aeb1c.accounts_ea_businessorder_1ea_businessorder_idb', '=', 'eb.id')
->where('aeb1c.deleted', '=', 0);
})
->join('accounts as a', 'a.id', '=', 'aeb1c.accounts_ea_businessorder_1accounts_ida')
->join('accounts_cstm as ac', 'ac.id_c', '=', 'a.id')
->where('eb.deleted', 0)
->where('a.deleted', 0)
->whereIn('eb.id', $businessOrderIds)
->whereNotNull('ac.country_c')
->select([
'eb.id as entity_id',
'ac.country_c as country',
'ac.province_c as province',
])
->get();
return $this->groupCountriesByEntityId($results);
}
private function getCountriesBySalesOrderIds(array $salesOrderIds): array
{
if (empty($salesOrderIds)) {
return [];
}
$results = DB::connection('crmslave')
->table('ea_salesorder as es')
->join('accounts_ea_salesorder_1_c as aes1c', function ($join) {
$join->on('aes1c.accounts_ea_salesorder_1ea_salesorder_idb', '=', 'es.id')
->where('aes1c.deleted', '=', 0);
})
->join('accounts as a_base', 'a_base.id', '=', 'aes1c.accounts_ea_salesorder_1accounts_ida')
->join('accounts_cstm as ac', 'ac.id_c', '=', 'aes1c.accounts_ea_salesorder_1accounts_ida')
->where('es.deleted', 0)
->where('a_base.deleted', 0)
->whereIn('es.id', $salesOrderIds)
->whereNotNull('ac.country_c')
->select([
'es.id as entity_id',
'ac.country_c as country',
'ac.province_c as province',
])
->get();
return $this->groupCountriesByEntityId($results);
}
private function groupCountriesByEntityId($results): array
{
$countriesByEntityId = [];
foreach ($results as $result) {
$countryCode = $this->getCountryCode($result->country, $result->province);
if (! $countryCode) {
continue;
}
$entityId = (string) $result->entity_id;
$countriesByEntityId[$entityId] ??= [];
$countriesByEntityId[$entityId][] = $countryCode;
}
return array_map(fn ($countries) => array_values(array_unique($countries)), $countriesByEntityId);
}
private function getCountryCode(?string $country, ?string $province): ?string
{
if (! $country) {
return null;
}
if (in_array($country, ['1', '156'], true) && ! in_array((string) $province, ['710000', '810000', '820000'], true)) {
return 'CN';
}
return [
'840' => 'US',
'US' => 'US',
'316' => 'GU',
'GU' => 'GU',
'630' => 'PR',
'PR' => 'PR',
][strtoupper($country)] ?? strtoupper($country);
}
}