Files
sam-api/app/Services/ItemMaster/ItemMasterService.php
hskwon a1604b6189 refactor: 섹션 관리를 entity_relationships 참조 방식으로 전환
- SectionTemplateService: 독립 섹션 생성, page_id 있으면 링크 연결
- ItemMasterService: init API가 linkedSections 기반으로 조회
- SectionTemplateStoreRequest: page_id nullable로 변경
- Swagger: 스키마 업데이트 (sectionTemplates → sections)
2025-11-26 18:08:03 +09:00

143 lines
4.6 KiB
PHP

<?php
namespace App\Services\ItemMaster;
use App\Models\ItemMaster\CustomTab;
use App\Models\ItemMaster\EntityRelationship;
use App\Models\ItemMaster\ItemField;
use App\Models\ItemMaster\ItemMasterField;
use App\Models\ItemMaster\ItemPage;
use App\Models\ItemMaster\ItemSection;
use App\Models\ItemMaster\UnitOption;
use App\Services\Service;
class ItemMasterService extends Service
{
/**
* 초기화 데이터 로드
*
* - pages (linkedSections 기반 중첩)
* - sections (모든 독립 섹션)
* - masterFields
* - customTabs (columnSetting 포함)
* - unitOptions
*/
public function init(): array
{
$tenantId = $this->tenantId();
// 1. 페이지 목록
$pages = ItemPage::where('tenant_id', $tenantId)
->where('is_active', 1)
->get();
// 2. 페이지별 linkedSections 조회 (entity_relationships 기반)
$pagesWithSections = $pages->map(function ($page) use ($tenantId) {
$linkedSections = $this->getLinkedSections($tenantId, $page->id);
return [
'id' => $page->id,
'tenant_id' => $page->tenant_id,
'group_id' => $page->group_id,
'page_name' => $page->page_name,
'item_type' => $page->item_type,
'absolute_path' => $page->absolute_path,
'is_active' => $page->is_active,
'created_by' => $page->created_by,
'updated_by' => $page->updated_by,
'created_at' => $page->created_at,
'updated_at' => $page->updated_at,
'sections' => $linkedSections,
];
});
// 3. 모든 독립 섹션 (재사용 가능 목록)
$sections = ItemSection::where('tenant_id', $tenantId)
->with(['fields', 'bomItems'])
->orderBy('created_at', 'desc')
->get();
// 4. 마스터 필드
$masterFields = ItemMasterField::where('tenant_id', $tenantId)->get();
// 5. 커스텀 탭 (컬럼 설정 포함)
$customTabs = CustomTab::with('columnSetting')
->where('tenant_id', $tenantId)
->orderBy('order_no')
->get();
// 6. 단위 옵션
$unitOptions = UnitOption::where('tenant_id', $tenantId)->get();
return [
'pages' => $pagesWithSections,
'sections' => $sections,
'masterFields' => $masterFields,
'customTabs' => $customTabs,
'unitOptions' => $unitOptions,
];
}
/**
* 페이지에 연결된 섹션 조회 (entity_relationships 기반)
*/
private function getLinkedSections(int $tenantId, int $pageId): array
{
// 페이지-섹션 관계 조회
$relationships = EntityRelationship::where('tenant_id', $tenantId)
->where('parent_type', EntityRelationship::TYPE_PAGE)
->where('parent_id', $pageId)
->where('child_type', EntityRelationship::TYPE_SECTION)
->orderBy('order_no')
->get();
$sections = [];
foreach ($relationships as $rel) {
$section = ItemSection::with(['fields', 'bomItems'])
->find($rel->child_id);
if ($section) {
// 섹션에 연결된 필드 (entity_relationships 기반)
$linkedFields = $this->getLinkedFields($tenantId, $section->id);
$sectionData = $section->toArray();
$sectionData['order_no'] = $rel->order_no;
// FK 기반 필드 + 링크 기반 필드 병합
if (! empty($linkedFields)) {
$sectionData['fields'] = $linkedFields;
}
$sections[] = $sectionData;
}
}
return $sections;
}
/**
* 섹션에 연결된 필드 조회 (entity_relationships 기반)
*/
private function getLinkedFields(int $tenantId, int $sectionId): array
{
$relationships = EntityRelationship::where('tenant_id', $tenantId)
->where('parent_type', EntityRelationship::TYPE_SECTION)
->where('parent_id', $sectionId)
->where('child_type', EntityRelationship::TYPE_FIELD)
->orderBy('order_no')
->get();
$fields = [];
foreach ($relationships as $rel) {
$field = ItemField::find($rel->child_id);
if ($field) {
$fieldData = $field->toArray();
$fieldData['order_no'] = $rel->order_no;
$fields[] = $fieldData;
}
}
return $fields;
}
}