Modüllere Dön

TEKNİK — TEMEL MODÜL

Altındaki her şey buna bağlı. Burada tanımlanan veri olmadan ne sipariş, ne üretim, ne de test başlayabilir.

Şubat 2026 • Solen Kablo • Yaşayan Doküman

Teknik, kablonun doğduğu yerdir. Tek bir metre tel çekilmeden, müşteri siparişi alınmadan, test atanmadan önce — birinin fabrika hangi kabloları üretebilir, hangi makineler var, bu makineler hangi parametreleri kabul eder, kablolar hangi standartları geçmeli ve üzerlerine ne yazılmalıyı tanımlaması gerekir. Teknik tüm bunları barındırır. Diğer her modülün okuduğu ama asla yazmadığı tek doğru kaynağıdır.

6
ALT MODÜL
~75
API ENDPOINT
12
VERİTABANI TABLOSU
4000+
FRONTEND SATIRI

İÇİNDEKİLER

1. Teknik Ne Yapar 2. Veri Akışı 3. Veritabanı Katmanı 4. Backend Mimarisi 5. Frontend 6. Alt Modüller 6.1 Makine Yönetimi 6.2 Standart Yönetimi 6.3 Operatör Yönetimi 6.4 Markalama 6.5 & 6.6 Kablo Tasarım & Kablo Veritabanı 7. Sonuç

1. TEKNİK NE YAPAR

Teknik modülü, tüm fabrikanın bağlı olduğu beş soruyu yanıtlar:

  1. Hangi kabloları üretebiliriz? — Cable Playground tasarımları yapar. Cable Database onaylanan sonuçları saklar. Her kablo, kesin parametrelerle sıralı makine adımları olarak tanımlanır.
  2. Hangi makinelerimiz var? — Makine Yönetimi, 7 makine tipini fiziksel kapasiteleriyle (hız aralıkları, çap limitleri, kalınlık aralıkları) kayıt altına alır. Playground bunları kullanarak tasarımın fiziksel olarak üretilebilir olduğunu doğrular.
  3. Hangi kalite standartları karşılanmalı? — Standart Yönetimi her testi (IEC-EN, UL, SLN) parametreleri, geç/kal kriterleri ve test frekanslarıyla tanımlar. Bunlar kablo tasarımlarına bağlıdır — her tasarım hangi üretim adımında hangi testlerin gerektiğini bilir.
  4. Kablonun üzerine ne yazılır? — Markalama, ekstrüderin üretim sırasında yazdığı sıralı kelime dizilerini tanımlar (şirket adı, standart, voltaj, kesit vb.).
  5. Makineleri kim kullanır? — Operatör Yönetimi, üretim oturumlarına atanan operatörlerin kaydını tutar.

Sıfır bağımlılık. Teknik hiçbir iş modülüne bağlı değildir. Sadece users tablosunu okur (created_by takibi için). Diğer her modül — Sipariş, Üretim, Lab, Stok — Teknik’e bağlıdır. Bu onu tüm sistemin temel katmanı yapar.

2. VERİ AKIŞI

Veri tek yönde akar: Teknik’ten dışarıya. Her alt modülün sistemi nasıl beslediği aşağıda gösterilmiştir.

MAKİNELER
Kapasite tanımla
PLAYGROUND
Kablo tasarımı
KABLO DB
Onaylıları sakla
SİPARİŞ
Kablo seç
STANDARTLAR
Test tanımla
PLAYGROUND
Adımlara ata
KABLO DB
Gereksinimleri sakla
LAB
Testleri uygula

Kablo Veritabanı birleşme noktasıdır. Tamamlanmış tasarımı yapılandırılmış JSON olarak saklar: eksiksiz üretim akışı, oluşturulacak her yarı mamul, hammadde listesi ve tüm test gereksinimleri. Sipariş malzeme ihtiyacını hesaplarken veya Üretim iş kartları oluştururken Kablo Veritabanı’ndan okur — asla doğrudan Playground veya Makinelerden değil.

3. VERİTABANI KATMANI

Teknik modülüne 12 tablo hizmet eder. Dört gruba ayrılırlar:

Makine Tabloları (7)

Her makine tipi için bir tablo. Her biri o makinenin fiziksel kapasitesini min/maks/artış aralıkları olarak saklar. Sistem bu aralıklarda ilerleyerek açılır menü seçeneklerini oluşturur.

TabloÖzel KonfigürasyonGirdi Kodu
kabatel_cekme_machineshız, tav (tavlama akımı), çıkış çapıA
kalaylama_machineshız, kalay kalınlığı (μm)X
incetel_cekme_machineshız, girdi sayısı, çıkış çapı, tav
buncher_machineshız, hatve (büküm uzunluğu), girdi sayısıZ,T,U
extruder_machineshız, izolasyon kalınlığı, kılıf kalınlığıT,Z
ebeam_machineshız, radyasyon seviyesi (kGy)
aktarma_machines(sadece marka/model)

Her yapılandırılabilir parametrenin veritabanı seviyesinde CHECK kısıtlaması vardır: max > min, increment > 0, min ≥ 0. Bu, geçersiz makine konfigürasyonlarının kaydedilmesini imkansız kılar — veritabanı fiziksel tutarlılığı kendi başına zorlar.

Tasarım Tabloları (3)

TabloAmaçAnahtar Alanlar
cable_designsPlayground’dan tasarım oturumlarıdesign_code (benzersiz), standard (EN/UL/SLN), cross_section, design_data (JSON)
design_stepsTasarım içindeki bireysel üretim adımlarıstep_number, machine_type, configuration (JSON), inputs/outputs (JSON), tests (JSON)
cable_databaseTamamlanmış, onaylı kablo tanımlarıcable_code (benzersiz), production_flow (JSON), half_products (JSON), raw_materials (JSON), test_requirements (JSON)

İlişki: CableDesign → birden fazla DesignStep (kademeli silme) → tamamlamada bir CableDatabase kaydı. Kablo Veritabanı her şeyi denormalize JSON blob’ları olarak saklar — bilerek. Malzeme Hesaplayıcı bir sipariş için bakır gereksinimini hesaplaması gerektiğinde, cable_database’den tek bir satır okur ve hiçbir join olmadan eksiksiz üretim akışına sahip olur.

Kalite Tabloları (2)

TabloAmaçAnahtar Alanlar
test_standardsTest tanımlarıstandard_category (IEC-EN/UL/SLN), test_name, standard_number, test_samples
test_parametersTest içindeki parametrelerparameter_name, parameter_unit, parameter_order, is_required

Bir test standardının N parametresi vardır (kademeli silme). Playground’da bir tasarım adımına test atanırken, standart ID ve frekans (başlangıç/bitiş/her makara) adımın JSON’ına gömülür. Bu, Kablo Veritabanı’nın tam test haritasını taşıması demektir — Lab, üretim sırasında Teknik’i sorgulamadan neyi ne zaman test edeceğini bilir.

Destekleyici Tablolar

TabloAmaç
product_codesStok tekilleştirme için SHA-256 hash’li ürün tanımlayıcıları. system_code (okunabilir, örn. BN_73X030) + spec_hash (spesifikasyonların deterministik hash’i). Farklı tasarımlardaki aynı ürünlerin aynı stok havuzunu paylaşmasını sağlar.
markingsKablo baskı şablonları. name (benzersiz) + words (JSON dize dizisi). Her sipariş-kablo bir markayı referans alır.
production_operatorsOperatör kaydı. name (benzersiz). Üretim oturumları tarafından referans alınır.

4. BACKEND MİMARİSİ

Teknik backend’i /api/teknik/ altına monte edilmiş 6 route dosyası ve Playground’un simülasyon motorunu çalıştıran 6 yardımcı modülden oluşur.

Route Dosyaları

DosyaÖnekEndpointSorumluluk
machine_routes.py/teknik/machines~457 makine tipi için CRUD + seçenekler
design_routes.py/teknik/design~22Playground oturumları, adımlar, konfig, geri al/yinele, tamamla
cable_database_routes.py/teknik/cable-database~15Onaylı kablolar, ürün kodları, analitik
standards_routes.py/teknik/standards~12Test standartları, parametreler, sonuçlar
marking_routes.py/markings~6Markalama şablonu CRUD
operator_routes.py/operators~4Operatör CRUD

Playground Motoru (6 yardımcı modül)

Cable Playground basit bir CRUD sayfası değildir — tamamen bellekte çalışan bir gerçek zamanlı simülasyon motorudur. İşte onu çalıştıran modüller:

Oturum Yöneticisi

Bellek içi oturum depolama. Her tasarım oturumunun benzersiz ID’si, adım sayaçı, geri al/yinele yığınları (maks 50 durum), otomatik kaydetme zamanlayıcısı (varsayılan 30sn) ve atomik işlemler için checkpoint/restore’u vardır.

İlerleme Motoru

Her adımdan sonra neyin var olduğunu takip eder. Öğelerin kodları, miktarları, durumları (aktif/tüketilmiş) vardır. Her makine tipinin girdileri tüketen ve doğru kodlarla çıktı üreten kendi işleme fonksiyonu vardır (örn. BN_73X030).

Form Entegrasyonu

Veritabanı + mevcut ilerleme durumundan frontend açılır menülerini doldurur. Makine tipine göre mevcut girdileri filtreler (örn. Buncher sadece Z/T/U kodlu öğeleri görür). Konfigürasyon öncesi miktarları doğrular.

DB Entegrasyonu

Gerçek makine tablolarını okur. Birden fazla makine seçildiğinde kapasite kesişimini hesaplar — sadece SEÇİLEN TÜM makinelerin üretebileceği parametre değerlerini döndürür.

Doğrulama Motoru

İki doğrulayıcı: MachineValidator konfigürasyonları makine aralıklarına karşı kontrol eder. ProductionFlowValidator adım sıralarını, paralel grupları ve test atamalarını kontrol eder.

Kod Üreteci

Deterministik ürün kodu üretimi. Stok tekilleştirme için SHA-256 spec hash’leme. Okunabilir sistem kodları (örn. KC_18 — 1.8mm Kabatel teli). Son kablo kodları standart, kesit, yapı ve katman kalınlıklarını kodlar.

5. FRONTEND

/teknik/* altında 7 sayfa, canTeknik erişim bayrağıyla korunur. Tüm sayfalar Ant Design Pro’nun ProTable bileşenini Türkçe yerel ayar, istemci taraflı arama ve bulanık arkaplan modallarıyla kullanır.

RouteSayfaSatırKarmaşıklık
/teknik/dashboardDashboard~400İstatistikler, hızlı işlemler, son tasarımlar
/teknik/playgroundCable Playground~4.300SVG canvas, 6 konfig formu, 3 görünüm, geri al/yinele, otomatik kaydet
/teknik/cable-databaseKablo Veritabanı~690Tablo + 3 sekmeli detay çekmecesi
/teknik/machinesMakine Yönetimi~7307 makine sekmesi, dinamik formlar
/teknik/standardsStandartlar~550Standart CRUD + parametre formları
/teknik/markalamaMarkalama~370Kelime dizili markalama şablonları
/teknik/operator-yonetimiOperatörler~280Basit isim CRUD

Cable Playground tek başına frontend kodunun yarısından fazlasını oluşturur. Modüler bir bileşen sistemi olarak inşa edilmiştir: usePlayground hook’u durum ve API çağrılarını yönetir, FlowCanvas SVG diyagramını çizer, MachineLibrary yan panel paletidir, ConfigurationDrawer 6 makineye özgü formu barındırır (1.215 satır) ve ProgressionPanel gerçek zamanlı malzeme takibini gösterir.

6. ALT MODÜLLER

Aşağıdaki bölümler her alt modülü tam detayıyla belgeler — her form alanı, her API endpoint, her veritabanı sütunu, her doğrulama kuralı ve arkasındaki tasarım kararları. Temel veriden onu tüketen araçlara doğru sıralanmıştır.

6.1

Makine Yönetimi

7 fabrika makine tipi için CRUD. Her tipin min/maks/artış aralıklarıyla benzersiz konfigürasyon şeması vardır. Playground, tasarımların fiziksel olarak üretilebilir olduğunu doğrulamak için bunları okur.

~45 ENDPOINTS 7 MACHINE TYPES DB CHECK CONSTRAINTS
6.2

Standart Yönetimi

Dinamik parametreler, geç/kal kriterleri ve test frekans kurallarıyla test standardı tanımları. Adım seviyesinde kablo tasarımlarına bağlıdır — Lab modülü neyi ne zaman test edeceğini bilmek için bunları okur.

12 ENDPOINTS 3 CATEGORIES DYNAMIC PARAMETERS
6.3

Operatör Yönetimi

Üretim operatörü kaydı. Operatörler oturumu başlatan kişi tarafından üretim oturumlarına atanır — sistem girişine ihtiyaçları yoktur. Benzersizlik kısıtlamasıyla basit isim CRUD.

4 ENDPOINTS SIMPLE CRUD
6.4

Markalama

Markalama şablonları, ekstrüzyon sırasında kabloların üzerine yazılan metni tanımlar. Değişken desteğiyle sıralı kelime dizileri olarak saklanır ({CABLE_SIZE}, {YEAR} vb.). Her sipariş-kablo bir markalama şablonunu referans alır.

6 ENDPOINTS WORD ARRAYS VARIABLES
6.5

Kablo Tasarım (Playground)

Görsel kablo tasarım atölyesi. Makineleri canvas’a sürükleyin, parametreleri yapılandırın, üretim akışının gerçek zamanlı oluşumunu izleyin. Tüm temel verinin — makineler, standartlar, operatörler, markalar — bir kablo tasarımında birleştiği yer.

22 ENDPOINTS 4.300 LOC 6 UTILITY MODULES SVG CANVAS
6.6

Kablo Veritabanı

Onaylı kablo tasarımlarının kütüphanesi. Her kayıt eksiksiz üretim akışını, yarı mamul ağacını, hammadde listesini ve test gereksinimlerini yapılandırılmış JSON olarak saklar. Sipariş ve Üretim için tek doğru kaynak.

15 ENDPOINTS SHA-256 PRODUCT CODES ANALYTICS

Bundan sonrası: Yukarıdaki her alt modül, veritabanı şemaları, eksiksiz API endpoint dokümantasyonu, frontend form alanları, doğrulama kuralları, kod parçaları ve temel tasarım kararlarının arkasındaki mantıkla tam bir bölüme genişletilecektir.

6.1 MAKİNE YÖNETİMİ

Bir kablo tasarlamadan önce, sisteme fabrikanın hangi makinelere sahip olduğunu söylemeniz gerekir. Makine Yönetimi, üretim katındaki her fiziksel makinenin kaydıdır — markası, modeli ve en önemlisi kapasite aralıkları. Bu aralıklar (hız min/maks, çap min/maks vb.) sistem genelinde açılır menü seçenekleri oluşturmak ve bir kablo tasarımının fiziksel olarak üretilebilir olduğunu doğrulamak için kullanılır.

Neden her makine tipi için ayrı tablo? Her makine tipinin temelden farklı yapılandırılabilir parametreleri vardır. Kabatel Çekme’nin tav (tavlama akımı) ve çıkış çapı vardır. Buncher’ın hatve (büküm uzunluğu) ve girdi sayısı vardır. Aktarma’nın hiç parametresi yoktur. Düzinelerce nullable sütunlu tek bir tablo yerine, her tip tam olarak ihtiyaç duyduğu sütunlara sahip kendi tablosunu alır. Böylece veritabanı CHECK kısıtlamaları her makine tipine özgü fiziksel tutarlılığı zorlayabilir.

6.1.1 Yedi Makine Tipi

Fabrikanın üretim hattı, kablo imalat sürecinde her biri belirli bir adımı gerçekleştiren 7 makine tipinden oluşur:

#Makine TipiNe YaparYapılandırılabilir Parametreler
1Kabatel ÇekmeKalın bakır çubuğu (8mm filmaşin) ince tele çekerHız (m/s), TAV (A), Çıkış Çapı (mm)
2KalaylamaÇekilen teli iletkenlik ve korozyon direnci için kalaylarHız (m/s), Kalay Kalınlığı (μm)
3İncetel ÇekmeTeli daha ince çaplara çeker, isteğe bağlı birden fazla girdidenHız (m/s), Girdi Sayısı, Çıkış Çapı (mm), TAV (A)
4BuncherBirden fazla teli bir demet (büküm) haline getirirHız (m/s), Hatve, Girdi Sayısı, Büküm Yönü (S/Z)
5Ekstrüderİzolasyon ve/veya kılıf katmanları uygular (plastik kaplama)Hız (m/s), İzolasyon Kalınlığı (mm), Kılıf Kalınlığı (mm)
6E-beamElektron ışını radyasyonuyla izolasyonu çapraz bağlarHız (m/s), Radyasyon Seviyesi (kGy)
7AktarmaKabloyu makaralar arasında aktarır (dönüşüm yok)Yok (sadece marka/model)

6.1.2 Veritabanı Şeması

7 tablo, her makine tipi için bir tane. Hepsi ortak bir yapıyı (id, brand, model, is_active, created_by, zaman damgaları) ve tipe özgü parametre sütunlarını min/maks/artış üçlüleri olarak paylaşır.

Ortak Sütunlar (7 tablonun tamamı)

SütunTipNullableVarsayılanNotlar
idIntegerHayırOtomatikBirincil anahtar, indeksli
brandString(100)HayırMakine üreticisi
modelString(100)EvetNULLMakine model tanımı
is_activeBooleanHayırTrueİndeksli; soft-delete bayrağı
created_byIntegerEvetNULLFK → users.id
created_atDateTimeHayırutcnowOluşturma zaman damgası
updated_atDateTimeHayırutcnowDeğişiklikte otomatik güncellenir

Kabatel Çekme — kabatel_cekme_machines

SütunTipBirimCHECK Kısıtlaması
speed_minFloatm/s≥ 0
speed_maxFloatm/s> speed_min
speed_incrementFloatm/s> 0
tav_minFloatAmper≥ 0
tav_maxFloatAmper> tav_min
tav_incrementFloatAmper> 0
output_minFloatmm> 0
output_maxFloatmm> output_min
output_incrementFloatmm> 0
input_typeString(50)Varsayılan: '8mm_filmaşin'
input_codeString(10)Varsayılan: 'A'

Kalaylama — kalaylama_machines

SütunTipBirimCHECK Kısıtlaması
speed_minFloatm/s≥ 0
speed_maxFloatm/s> speed_min
speed_incrementFloatm/s> 0
thickness_minFloatμm> 0
thickness_maxFloatμm> thickness_min
thickness_incrementFloatμm> 0
input_codeString(10)Varsayılan: 'X'

İncetel Çekme — incetel_cekme_machines

SütunTipBirimCHECK Kısıtlaması
speed_min/max/incrementFloatm/sYukarıdakiyle aynı düzen
input_number_minInteger≥ 1
input_number_maxInteger≥ input_number_min
output_min/max/incrementFloatmmYukarıdakiyle aynı düzen
tav_min/max/incrementFloatAmperYukarıdakiyle aynı düzen

Buncher — buncher_machines

SütunTipBirimCHECK Kısıtlaması
speed_min/max/incrementFloatm/sAynı düzen
hatve_minFloatmm> 0
hatve_maxFloatmm> hatve_min
hatve_incrementFloatmm> 0
input_number_minInteger≥ 0
input_number_maxInteger≥ input_number_min
accepted_input_codesTextVarsayılan: 'Z,T,U'

Extruder — extruder_machines

SütunTipBirimCHECK Kısıtlaması
speed_min/max/incrementFloatm/sAynı düzen
insulation_thickness_minFloatmm> 0
insulation_thickness_maxFloatmm> insulation_thickness_min
insulation_thickness_incrementFloatmm> 0
sheath_thickness_minFloatmm> 0
sheath_thickness_maxFloatmm> sheath_thickness_min
sheath_thickness_incrementFloatmm> 0
accepted_input_codesTextVarsayılan: 'T,Z'

E-beam — ebeam_machines

SütunTipBirimCHECK Kısıtlaması
speed_min/max/incrementFloatm/sAynı düzen
radiation_level_minFloatkGy> 0
radiation_level_maxFloatkGy> radiation_level_min
radiation_level_incrementFloatkGy> 0

Aktarma — aktarma_machines

Yapılandırılabilir parametre yok. Sadece ortak sütunlar (brand, model, is_active, zaman damgaları). Ortak olanlar dışında CHECK kısıtlaması yok.

6.1.3 Seçenek Üretimi — Temel Mekanizma

Tüm Makine Yönetimi → Playground hattını çalıştıran mekanizma budur. Playground bir makine parametresi için açılır menü seçenekleri göstermesi gerektiğinde, /options endpoint’ini çağırır; bu da min/maks/artış aralığında ilerleyerek geçerli her değeri döndürür.

def generate_dropdown_options(min_val, max_val, increment):
    options = []
    current = min_val
    while current <= max_val:
        options.append(round(current, 4))  # Kayan nokta kaymasını önle
        current += increment
    return options

# Örnek: speed_min=5, speed_max=25, speed_increment=5 olan makine
# → [5.0, 10.0, 15.0, 20.0, 25.0]

Özel durumlar:

Çoklu makine kesişimi: Playground aynı tipte birden fazla makine seçtiğinde, sistem kapasite aralıklarının kesişimini hesaplar. Makine A [5, 10, 15, 20] hızlarını destekliyorsa ve Makine B [10, 15, 20, 25] destekliyorsa, açılır menü [10, 15, 20] gösterir. Bu Playground’un db_integration.py dosyasında yaşar, burada değil — ama bu modül tarafından üretilen seçenekleri tüketir.

6.1.4 API Endpoint’leri

Toplam 38 endpoint. Her makine tipi tutarlı bir düzen izleyen 5–6 endpoint alır (Aktarma’nın /options’ı yoktur).

Makine tipi başına düzen ({type} yerine örn. kabatel-cekme)

MetodYolYetkiNe Yapar
GET/teknik/machines/{type}Kimlik doğrulanmışTüm makineleri listele. ?active_only=true (varsayılan). Marka, modele göre sıralı.
GET/teknik/machines/{type}/{id}Kimlik doğrulanmışTekil makine detayı. Bulunamazsa 404.
GET/teknik/machines/{type}/{id}/optionsKimlik doğrulanmışMin/maks/artış aralıklarından açılır menü değerleri üret.
POST/teknik/machines/{type}super_admin, production_managerMakine oluştur. created_by atar. Gerçek zamanlı güncelleme yayınlar.
PUT/teknik/machines/{type}/{id}super_admin, production_managerKısmi güncelleme. Sadece sağlanan alanlar değişir.
DELETE/teknik/machines/{type}/{id}Sadece super_adminKesin silme. 204 No Content döndürür.

Ortak endpoint’ler

MetodYolNe Yapar
GET/teknik/machines/types7 tip adını string dizisi olarak döndürür
GET/teknik/machines/allTüm tiplerdeki tüm makineleri tek yanıtta, tip adına göre anahtarlanmış döndürür

Tip başına seçenek yanıt şekilleri

Makine TipiSeçenek Alanları
Kabatel Çekmespeeds, tavs, output_diameters
Kalaylamaspeeds, thicknesses
İncetel Çekmespeeds, input_numbers (int), output_diameters, tavs
Buncherspeeds, hatves, input_numbers (int), twist_directions (sabit S/Z)
Extruderspeeds, insulation_thicknesses, sheath_thicknesses
E-beamspeeds, radiation_levels
Aktarma— (seçenek endpoint’i yok)

6.1.5 Yetki Modeli

Hem eski user_type sistemini hem de granüler yetki sistemini destekleyen check_permission_smart() kullanır:

İşlemEski RollerGranüler Yetki
Görüntüleme / Listeleme / SeçeneklerKimliği doğrulanmış herkesKimliği doğrulanmış herkes
Oluşturma / Güncellemesuper_admin, production_managerteknik.machines.create / teknik.machines.edit
SilmeSadece super_adminteknik.machines.delete

6.1.6 Frontend — Makineler Sayfası

Tek dosya: pages/Teknik/Machines/index.tsx (726 satır). Route: /teknik/machines, canTeknik erişim bayrağıyla korunur.

Sayfa Yapısı

7 Tabs içeren bir Card’ı saran PageContainer — her makine tipi için bir sekme. Sekme değiştirme o tip için makine listesini getirir ve arama metnini sıfırlar. Varsayılan sekme: Kabatel Çekme.

Tablo Sütunları

Her sekme, şu temel sütunlara sahip bir ProTable ve tipe özgü sütunlar gösterir:

SütunGenişlikNotlar
ID60pxSola sabitli
MarkaotomatikEllipsis etkin
ModelotomatikBoşsa “-” gösterir
Tipe özgü aralıklarotomatik“min–maks birim” formatında
Durum80pxYeşil “Aktif” / Kırmızı “Pasif” etiket
İşlemler100pxSağa sabitli; düzenle + sil ikonları

Arama & Sayfalama

Arama istemci tarafındadır: metin girişi yüklü listeyi ID, marka, model veya durum (“aktif”/“pasif”) üzerinden filtreler. Makine sayıları küçük olduğundan (genellikle tip başına <50) sunucu tarafı arama gereksizdir.

Sayfalama varsayılan 10 satır, seçenekler [10, 20, 50, 100]. Toplam “X-Y / Z kayıt” olarak gösterilir.

CRUD Akışı

Oluşturma:

  1. Araç çubuğunda “Yeni Makine Ekle” butonuna tıkla
  2. “Yeni Makine Ekle” başlıklı modal açılır (600px, bulanık arkaplan)
  3. Form aktif sekmeye (makine tipine) göre dinamik alanlar gösterir
  4. Gönderimde: POST /api/teknik/machines/{type} form değerleriyle
  5. Sistem alanları (id, created_at, updated_at, created_by, input_type, input_code, accepted_input_codes) otomatik olarak hariç tutulur
  6. Başarıda: “Makine başarıyla eklendi!” bildirimi, modal kapanır, liste yenilenir

Düzenleme:

  1. İşlemler sütununda düzenle ikonuna tıkla
  2. “Makine Düzenle” başlıklı modal açılır, mevcut değerlerle doldurulmuş
  3. Gönderimde: PUT /api/teknik/machines/{type}/{id} sadece değişen alanlarla
  4. Başarıda: “Makine başarıyla güncellendi!” bildirimi, modal kapanır, liste yenilenir

Silme:

  1. İşlemler sütununda sil ikonuna tıkla
  2. Popconfirm sorar: “Bu makineyi devre dışı bırakmak istediğinize emin misiniz?”
  3. Makine zaten pasifse sil butonu devre dışıdır
  4. Onayda: DELETE /api/teknik/machines/{type}/{id}
  5. Başarıda: “Makine devre dışı bırakıldı!” bildirimi, liste yenilenir

Makine Tipine Göre Form Alanları

Form, aktif sekmeye göre renderFormFields() ile dinamik olarak oluşturulur. Ortak alanlar (Marka, Model) tüm tipler için görünür. Tipe özgü alanlar uygun min, step ve Türkçe etiketlerle InputNumber kullanır:

Makine TipiForm Alanları (Marka/Model dışında)
Kabatel ÇekmeHız: min (0), maks (0.1), artış (0.1) • Tav: min (0), maks (1), artış (1) • Çıkış Çapı: min/maks/artış (hepsi adım 0.01)
KalaylamaHız: min/maks/artış • Kalay Kalınlığı: min/maks/artış (adım 0.1)
İncetel ÇekmeGirdi Sayısı: min (1), maks (1) • Hız: min/maks/artış • Çıkış Çapı: min/maks/artış (adım 0.01) • Tav: min/maks/artış
BuncherGirdi Sayısı: min (0), maks (1) • Hız: min/maks/artış • Hatve: min/maks/artış (adım 0.1)
ExtruderHız: min/maks/artış • İzolasyon Kalınlığı: min/maks/artış (adım 0.01) • Kılıf Kalınlığı: min/maks/artış (adım 0.01)
E-beamHız: min/maks/artış • Radyasyon Seviyesi: min/maks, artış (adım 1)
AktarmaYok (sadece Marka/Model)

6.1.7 Servis Katmanı (Frontend)

API çağrıları services/teknik/index.ts içinde sarmalanmıştır ve URL dönüşümü yapılır: makine tipi adındaki alt çizgiler URL yolu için tire ile değiştirilir.

// kabatel_cekme → URL'de kabatel-cekme olur
export async function getMachines(type: MachineType) {
  return request(`/api/teknik/machines/${type.replace('_', '-')}`);
}

export async function createMachine(type: MachineType, data: any) {
  return request(`/api/teknik/machines/${type.replace('_', '-')}`, {
    method: 'POST', data
  });
}

// updateMachine (PUT), deleteMachine (DELETE) için aynı düzen
// getMachineDropdown, Playground kullanımı için /{id}/dropdown çağrır

6.1.8 Diğer Alt Modüllerle Bağlantılar

→ Kablo Tasarım (6.5)

Birincil tüketici. Canvas’a makine ekleyip yapılandırdığınızda, Playground açılır menüleri doldurmak için /options endpoint’ini çağırır. Birden fazla makine seçildiğinde, tüm aralıkları okur ve kesişimi hesaplar — sadece seçilen tüm makinelerin fiziksel olarak üretebileceği parametre değerlerini gösterir.

→ Kablo Veritabanı (6.6)

Dolaylı. Makine ID’leri her DesignStep’in machine_ids alanında saklanır. Kablo Veritabanı hangi makinelerin kullanıldığı dahil tamamlanmış tasarımı saklar, böylece Üretim her adıma hangi fiziksel makineyi atayacağını bilir.

→ Üretim Modülü

İş kartı oluşturulduğunda, üretim sistemi kablo tasarımının hangi makineleri gerektirdiğini okur. Tasarımda saklanan makine ID’leri doğrudan burada tutulan kayıta eşlenir.

Tasarım ilkesi: Makine Yönetimi saf bir veri sağlayıcısıdır. Tasarımlar, siparişler veya üretim hakkında hiçbir şey bilmez. Sadece “bu makine ne yapabilir?” sorusunu yanıtlar — geri kalan her şey tüketicinin sorumluluğudur. Bu, modülü basit tutar (~726 satır frontend, ~38 endpoint) ve onu Teknik alt sisteminin en kararlı parçası yapar.

6.2 STANDART YÖNETİMİ

Satılan her kablo, uluslararası standart kuruluşları (IEC, CENELEC) veya müşteri tarafından tanımlanan kalite testlerini geçmelidir. Standart Yönetimi, bu testlerin tanımlandığı yerdir — neyin ölçüleceği, kaç numune alınacağı, hangi parametrelerle ve referans standart numarasının ne olduğu. Bu tanımlar daha sonra kablo tasarımlarına gömülür, böylece Lab modülü üretim sırasında tam olarak neyi ne zaman test edeceğini bilir.

Üç kalite katmanı: IEC-EN Avrupa uyumlaştırılmış standartlarını kapsar (EN 50618, IEC 60228). UL Amerikan standartlarını kapsar (UL 4703, UL 854). SLN Solen’in kendi iç testlerini kapsar — standartların gerektirdiğinin ötesine geçen şirkete özgü kontroller. Playground’da kablo tasarımı oluşturulurken, sadece tasarımın standart kategorisiyle eşleşen testler gösterilir.

6.2.1 Veri Modeli

Üç tablo birlikte çalışır: standartlar neyin test edileceğini, parametreler her test içinde neyin ölçüleceğini, sonuçlar ise üretimden gerçek ölçümleri saklar.

test_standards

SütunTipNullableKısıtlamalar / VarsayılanNotlar
idIntegerHayırPK, indeksli
standard_categoryString(50)HayırCHECK: IN (‘IEC-EN’, ‘UL’, ‘SLN’)Hangi standart kuruluşu
test_nameString(200)HayırTürkçe test adı
test_name_enString(200)Evetİngilizce test adı
standard_numberString(100)Evetörn. “EN 50618”, “IEC 60228”
test_typeString(100)EvetSerbest metin: Mekanik, Elektriksel, Görsel, Boyutsal
unitString(50)Evetörn. “ohm/km”, “kV”, “N/mm²”
number_of_valuesIntegerHayırVarsayılan: 1, CHECK: ≥ 1Ölçüm başına kaç değer
test_samplesIntegerHayırVarsayılan: 1, CHECK: ≥ 1Kaç numune test edilecek
test_methodTextEvetSerbest metin test prosedürü açıklaması
is_activeBooleanHayırVarsayılan: True, indeksliSoft-delete bayrağı
created_byIntegerEvetFK → users.id
created_atDateTimeHayırutcnow
updated_atDateTimeHayırutcnow, otomatik güncellenir

Benzersizlik kısıtlaması: (standard_category, test_name, standard_number) — aynı standart kuruluşu içinde tekrarlanan test tanımlarını önler.

test_parameters

SütunTipNullableKısıtlamalar / VarsayılanNotlar
idIntegerHayırPK, indeksli
test_standard_idIntegerHayırFK → test_standards.id, ON DELETE CASCADE
parameter_nameString(100)Hayırörn. “Çekme Dayanımı”, “Uzama”, “Direnç”
parameter_unitString(50)Evetörn. “N/mm²”, “%”, “ohm/km”
parameter_orderIntegerHayırVarsayılan: 1Formlardaki görüntülenme sırası
is_requiredBooleanHayırVarsayılan: TrueTest sırasında doldurulmalı
created_atDateTimeHayırutcnow

Benzersizlik kısıtlaması: (test_standard_id, parameter_name) — tek bir test içinde tekrarlanan parametre adları olmaz.

test_results

SütunTipNullableKısıtlamalar / VarsayılanNotlar
idIntegerHayırPK, indeksli
test_standard_idIntegerHayırFK → test_standards.idHangi test yapıldı
design_step_idIntegerEvetFK → design_steps.idSonucu belirli üretim adımına bağlar
production_session_idIntegerEvetÜretim oturumuna bağlar
cable_batch_codeString(50)Evetİndeksliİzlenebilirlik için parti tanımlayıcı
test_dateDateTimeHayırTestin yapıldığı tarih
tested_byIntegerHayırFK → users.idTesti yapan kişi
measurementsTextHayırÖlçüm verilerinin JSON dizesi
pass_failString(10)EvetCHECK: IN (‘PASS’, ‘FAIL’, ‘PENDING’) VEYA NULLTest sonucu
notesTextEvetDurum güncellemelerinde zaman damgalı eklenir
created_atDateTimeHayırutcnow

Ölçüm depolama: measurements sütunu bir JSON dizisi saklar. Her giriş parameter (ad), values (float dizisi), isteğe bağlı unit ve isteğe bağlı parametre başına result içeren bir MeasurementData nesnesidir. Modelin yardımcı metodları vardır: get_measurements() JSON’ı ayrıştırır, set_measurements() serileştirir ve evaluate_result() tüm zorunlu parametrelerin değerleri olup olmadığına göre PASS/FAIL/PENDING döndürür.

6.2.2 İlişkiler

TestStandard
N × TestParameter
kademeli silme
TestStandard
N × TestResult
kademeli silme yok

Silme davranışı akıllıdır: bir standardın test sonuçları varsa, sonuç izlenebilirliğini korumak için soft delete yapılır (is_active = false). Sonuçları yoksa hard delete yapılır. Parametreler her zaman kademeli silinir — bir standardı silmek tüm parametrelerini kaldırır.

6.2.3 API Endpoint’leri

Üç gruba ayrılmış 12 endpoint: standart CRUD, parametre yönetimi ve test sonuçları.

Test Standartları

MetodYolYetkiNe Yapar
POST/teknik/testssuper_admin, lab_user, production_managerStandart + parametreleri tek işlemde oluştur. Tekrar kontrolü yapar (kategori + ad + numara). Parametre eklemeden önce ID almak için DB flush.
GET/teknik/testsKimlik doğrulanmışTümünü listele. ?category=IEC-EN, ?active_only=true (varsayılan), ?search=tensile. Parametreleri eager-load eder. Kategori sonra ada göre sıralar.
GET/teknik/tests/{id}Kimlik doğrulanmışTekil standart detayı.
GET/teknik/tests/{id}/fullKimlik doğrulanmışSıralı parametreler + has_parameters bayrağıyla tam standart. Playground dinamik form üretimi için kullanır.
PUT/teknik/tests/{id}super_admin, lab_user, production_managerStandart güncelle. parameters sağlanırsa: mevcut tümünü sil, yenilerini oluştur (tam değiştirme).
DELETE/teknik/tests/{id}super_admin, lab_userAkıllı silme: sonuçları varsa soft, yoksa hard.

Test Parametreleri

MetodYolYetkiNe Yapar
POST/teknik/tests/{id}/parameterssuper_admin, lab_user, production_managerMevcut standarda tek parametre ekle. Tekrar ad kontrolü.
DELETE/teknik/parameters/{id}super_admin, lab_userTek parametreyi hard delete.

Test Sonuçları

MetodYolYetkiNe Yapar
POST/teknik/resultslab_user, super_adminÖlçüm JSON’ıyla sonuç oluştur. tested_by’ı otomatik atar. İlk geç/kal için evaluate_result() çağırır.
GET/teknik/resultsKimlik doğrulanmışSonuçları listele. ?batch_code, ?test_standard_id, ?pass_fail filtresi. Limit: 1–200, varsayılan 50. test_date DESC sıralı.
GET/teknik/results/{id}Kimlik doğrulanmışTest eden adı ve standart bilgisiyle tekil sonuç.
PUT/teknik/results/{id}/statuslab_user, super_adminGeç/kal durumunu güncelle. Denetim izi için zaman damgası ve kullanıcı adıyla notlar ekler.

Referans Verileri

MetodYolDöndürür
GET/teknik/categories["IEC-EN", "UL", "SLN"]
GET/teknik/frequencies["üretim_başı", "üretim_sonu", "her_ikisi", "her_makara_sonu"]
GET/teknik/result-statuses["PASS", "FAIL", "PENDING"]

6.2.4 Test Frekansları — Testler Ne Zaman Çalışır

Playground’da bir kablo tasarım adımına test atanırken, kullanıcı Lab’a üretim sırasında testi ne zaman yapacağını söyleyen bir frekans seçer:

FrekansTürkçeAnlamı
üretim_başıÜretim BaşıÜretim başlangıcında test et
üretim_sonuÜretim SonuÜretim sonunda test et
her_ikisiHer İkisiHem başında hem sonunda test et
her_makara_sonuHer Makara SonuHer makaranın sonunda test et (en sık)

6.2.5 Standartlar Kablo Tasarımlarına Nasıl Bağlanır

Bu kritik entegrasyon noktasıdır. Playground bir makine adımını yapılandırırken, testler tasarımın standart kategorisine göre getirilir ve filtrelenir:

# db_integration.py içinde — tasarımın standardıyla eşleşen testleri getirir
def get_tests_by_standard(db, standard):
    # Frontend kodunu veritabanı kategorisine eşler
    category_map = {'EN': 'IEC-EN', 'UL': 'UL', 'SLN': 'SLN'}
    category = category_map.get(standard, standard)

    standards = db.query(TestStandard).filter(
        TestStandard.standard_category == category,
        TestStandard.is_active == True
    ).all()
    return [{'id': s.id, 'test_name': s.test_name, ...} for s in standards]

Tasarım tamamlandığında, atanan testler cable_database.test_requirements içinde JSON dizisi olarak saklanır:

# cable_database.test_requirements içindeki depolama formatı
[
  {
    "step": 3,
    "machine_type": "extruder",
    "test_id": 12,
    "test_name": "Çekme Dayanımı",
    "standard_number": "EN 50618",
    "frequency": "her_ikisi"
  }
]

Tasarım gereği denormalize: Test adları ve standart numaraları Kablo Veritabanı JSON’ına kopyalanır, sadece ID ile referans verilmez. Bu, bir test standardı daha sonra yeniden adlandırılır veya devre dışı bırakılırsa, mevcut kablo tasarımlarının orijinal test gereksinimlerini koruması anlamına gelir. Lab üretim sırasında Kablo Veritabanı’ndan okur — neyi test edeceğini bilmek için asla Standartlar tablosunu sorgulamaz.

6.2.6 Yetki Modeli

İşlemEski RollerGranüler Yetki
Görüntüleme / Listeleme / AramaKimliği doğrulanmış herkesKimliği doğrulanmış herkes
Oluşturma / Güncellemesuper_admin, lab_user, production_managerteknik.standards.create / teknik.standards.edit
Silmesuper_admin, lab_userteknik.standards.delete
Sonuç Oluşturma / Güncellemelab_user, super_adminteknik.standards.create

Not: lab_user burada Makine Yönetimi’nden daha geniş erişime sahiptir — bu bilerek yapılmıştır çünkü laboratuvar personeli standartlar sisteminin birincil kullanıcılarıdır.

6.2.7 Frontend — Standartlar Sayfası

Tek dosya: pages/Teknik/Standards/index.tsx (553 satır). Route: /teknik/standards.

Sayfa Yapısı

Oluşturma/düzenleme için bir ProTable ve modal içeren PageContainer. Sekme yok — tüm standartlar tek tabloda gösterilir, kategori renk kodlu etiketlerle ayırt edilir.

Tablo Sütunları (9)

SütunGenişlikNotlar
ID60pxSola sabitli
Kategori100pxRenk kodlu etiket: IEC-EN mavi, UL yeşil, SLN turuncu
Test AdıotomatikTürkçe test adı, ellipsis
Standart No150pxörn. “EN 50618”
Test Tipi120pxBoşsa “-” gösterir
Numune Sayısı100pxOrtalanır tam sayı
Parametre100pxParametre sayısını gösterir (örn. “3”)
Durum80pxYeşil “Aktif” / Kırmızı “Pasif”
İşlemler100pxSağa sabitli; düzenle + sil ikonları

Oluşturma/Düzenleme Modalı (800px, bulanık arkaplan)

Modal 7 form alanı ve dinamik parametre listesi içerir:

AlanTipZorunluNotlar
Standart KategorisiSelectEvetSeçenekler: IEC-EN, UL, SLN (Özel)
Test Adı (TR)InputEvetPlaceholder: “Örn: Çekme Dayanımı”
Test Adı (EN)InputHayırPlaceholder: “Örn: Tensile Strength”
Standart NumarasıInputEvetPlaceholder: “Örn: EN 50618”
Test TipiSelectHayırSeçenekler: Mekanik, Elektriksel, Görsel, Boyutsal
Numune SayısıInputNumberHayırMin: 1
Test MetoduTextAreaHayır3 satır, prosedür açıklaması

Parametre Yönetimi (modal içinde)

“Test Parametreleri” ayırıcısının altında her parametre iki alanlı küçük bir Card olarak gösterilir:

“Parametre Ekle” butonu (kesikli çizgi, tam genişlik) yeni boş parametre kartı ekler. Her kartın başlığında sil butonu vardır. Sıra otomatik olarak sıralı atanır. Güncellemede, mevcut tüm parametreler yeni setle değiştirilir (tümünü sil + yenilerini oluştur).

CRUD Akışı

Oluşturma: “Yeni Test Standardı” tıkla → Modal açılır → Kategori, ad, standart numarası doldur → İsteğe bağlı parametre ekle → “Ekle” tıkla → POST /api/teknik/standards/tests → “Test standardı başarıyla eklendi!” → Modal kapanır, liste yenilenir.

Düzenleme: Düzenle ikonuna tıkla → Modal önceden doldurulmuş açılır → Alanları/parametreleri değiştir → “Güncelle” tıkla → PUT /api/teknik/standards/tests/{id} → “Test standardı başarıyla güncellendi!” → Modal kapanır, liste yenilenir.

Silme: Sil ikonuna tıkla → Popconfirm “Bu standardı devre dışı bırakmak istediğinize emin misiniz?” → DELETE /api/teknik/standards/tests/{id} → “Test standardı devre dışı bırakıldı!” → Liste yenilenir. Zaten pasif standartlar için sil butonu devre dışı.

Arama & Sayfalama

Arama istemci tarafındadır (200px yuvarlak giriş). ID, kategori, test adı, standart numarası, test tipi, numune sayısı ve durum (aktif/pasif) üzerinde arar. Sayfalama varsayılan 10 satır, [10, 20, 50, 100] seçenekleriyle. ID azalan sırada (en yeni önce).

6.2.8 Diğer Alt Modüllerle Bağlantılar

→ Kablo Tasarım (6.5)

Playground’daki her makine formu get_tests_by_standard() ile doldurulan bir available_tests bölümü içerir. Kullanıcılar adımlara frekansla test atar. Playground form entegrasyonu Standartlardan okur ama asla yazmaz.

→ Kablo Veritabanı (6.6)

Tamamlanmış tasarımlar test_requirements’ı denormalize JSON olarak saklar — test ID’leri, adları, standart numaraları ve frekanslar tamamlama anında kopyalanır. Bu anlık görüntü değişmezliği sağlar.

→ Lab Modülü

Üretim sırasında Lab, Kablo Veritabanı’ndan test gereksinimlerini okur ve standarda bağlı TestResult kayıtları oluşturur. Lab kullanıcıları ölçümleri doldurur ve denetim izi için zaman damgalı notlarla geç/kal durumu belirler.

Tasarım ilkesi: Standartlar bir kez tanımlanır, tasarımlara değer olarak gömülür (referans olarak değil) ve üretim sırasında test edilir. Üç tablolu yapı (standart → parametreler → sonuçlar) tanımı yürütmeden ayırır. Standart Yönetimi asla üretim verisine dokunmaz — sadece “ne test edilmeli?” sorusunu yanıtlar, “sonuç ne oldu?” sorusunu Lab modülüne bırakır.

6.3 OPERATÖR YÖNETİMİ

Üretim operatörleri fabrika katında makineleri çalıştıran kişilerdir. Sistem girişine ihtiyaçları yoktur — sadece bir kayıt defterindeki isimlerdir ve birisi üretim çalıştırması başlattığında üretim oturumlarına atanırlar. Teknik’in en basit alt modülüdür (284 satır frontend, 4 endpoint), ama verisi her üretim oturumunda, her iş kartında ve her yarı mamul kaydında görünür.

Sistemde iki tür “operatör”: ProductionOperator (bu alt modül) basit bir isim kaydıdır — giriş yok, şifre yok, yetki yok. Kullanıcı sistemindeki ayrı Operator modeli, sisteme giriş yapan operatör tipi kullanıcılar için kullanıcı hesaplarını genişletir. Operatör üretim oturumu başlatırken bu kayıttan kendi adını seçer. Üreteceği iş kartı daha önce üretim müdürü tarafından planlama modülü ile planlanmıştır.

6.3.1 Veritabanı Şeması

production_operators

SütunTipNullableKısıtlamalar / VarsayılanNotlar
idIntegerHayırPK, indeksli
nameString(100)HayırUNIQUEOperatörün tam adı
is_activeBooleanHayırVarsayılan: TrueAktif durum bayrağı
created_atDateTimeHayırutcnow
updated_atDateTimeHayırutcnow, otomatik güncellenir

Tablonun tamamı bu. Beş sütun. Foreign key yok, ilişki yok, JSON blob yok. name üzerindeki UNIQUE kısıtlaması tek iş kuralıdır — aynı isimde iki operatör olamaz.

İlişki tanımlanmamış. ProductionOperator modelinin sıfır SQLAlchemy ilişkisi vardır. Üretim oturumları operatörleri operator_name’i denormalize string olarak saklayarak referans alır — foreign key değil. Bu, bir operatörü silmenin oturumlara kademeli silinme yapmaması ama eski oturum kayıtlarının operatör daha sonra kaldırılsa bile her zaman doğru operatör adını koruması anlamına gelir.

6.3.2 API Endpoint’leri

/operators altında 4 endpoint. Özellikle, kimlik doğrulama dışında rol kontrolü yoktur — giriş yapmış herkes operatörleri yönetebilir. Pydantic şemaları da yok; route’lar ham sözlük kabul eder ve döndürür.

MetodYolYetkiNe Yapar
GET/operators/listKimlik doğrulanmışTüm operatörleri listele. ?active_only=true (varsayılan). Ada göre artan sıralı. Dizi + toplam sayı döndürür.
POST/operators/createKimlik doğrulanmışOperatör oluştur. Adı kırpar, boş kontrolü, tekrar kontrolü. is_active=true atar.
PUT/operators/{id}Kimlik doğrulanmışOperatör adını güncelle. Varlık, boşluk, tekrar kontrolü (kendisi hariç).
DELETE/operators/{id}Kimlik doğrulanmışKesin silme. Kademeli kontrol yok. Üretim oturumları referans veriyorsa başarısız olabilir.

Doğrulama Detayları

KontrolNe ZamanHata Mesajı
Ad boşOluşturma / Güncelleme“Operatör adı gerekli”
Ad tekrarıOluşturma“‘{name}’ adında operatör zaten mevcut”
Ad tekrarı (kendisi hariç)Güncelleme“‘{name}’ adında başka operatör zaten mevcut”
BulunamadıGüncelleme / Silme“Operatör bulunamadı”

6.3.3 Operatörler Üretimde Nasıl Kullanılır

Basit isim kaydının kritik hale geldiği yer burasıdır. Bir üretim oturumu başladığında, operatör atanır ve adı doğrudan oturum kaydında saklanır:

# production_routes.py içinde — üretim oturumu başlatma
if request.operator_id:
    prod_operator = db.query(ProductionOperator).filter(
        ProductionOperator.id == request.operator_id
    ).first()
    if prod_operator:
        operator_name = prod_operator.name

# production_sessions tablosunda saklanır:
# operator_id  → current_user.id (users’a FK, DB bütünlüğü için)
# operator_name → prod_operator.name (denormalize, geçmiş için)

Çift Depolama Düzeni

Üretim oturumları operatör bilgisini iki şekilde saklar:

SütunNereyi GösterirAmacı
operator_idFK → users.idVeritabanı bütünlüğü (oturumu başlatan kullanıcı)
operator_nameString (denormalize)Makineyi çalıştıran üretim operatörü (bu kayıttan)

Bu ayrım, sistemin hem kimin giriş yaptığını (kullanıcı hesabı, operator_id FK olarak saklanır) hem de hangi üretim operatörünün makineyi fiziksel olarak çalıştırdığını (bu kayıttan gelen isim, operator_name olarak saklanır) takip etmesinden dolayı vardır. Operatör, üretim müdürü tarafından önceden planlanmış bir iş kartı için üretim oturumu başlatırken açılır menüden kendi adını seçer.

Üretim Yaşam Döngüsünde Operatör

Kayıt Defteri
İsimler burada tanımlanır
Oturum Başlat
Operatör seç
Üretim
Ad oturumda saklanır
Geçmiş
Sonsuza kadar korunur

6.3.4 Frontend — Operatör Sayfası

Tek dosya: pages/Teknik/OperatorYonetimi/index.tsx (284 satır). Route: /teknik/operator-yonetimi. Tüm Teknik modülündeki en küçük sayfa.

Tablo Sütunları (3)

SütunGenişlikNotlar
ID80pxSola sabitli
Operatör AdıotomatikEllipsis etkin
İşlemler100pxSağa sabitli; düzenle + sil ikonları

Durum sütunu yok, zaman damgası yok. Sadece isim. is_active ve created_at/updated_at alanları veri arayüzünde var ama gösterilmiyor.

Oluşturma/Düzenleme Modalı (400px, bulanık arkaplan)

Tek alan:

AlanTipZorunluNotlar
Operatör AdıInput (large)EvetPlaceholder: “Operatör adını girin”

CRUD Akışı

Oluşturma: “Yeni Operatör” tıkla → Modal (400px) → İsim gir → “Oluştur” tıkla → POST /api/operators/create → “Operatör oluşturuldu” → Modal kapanır, liste yenilenir.

Düzenleme: Düzenle ikonuna tıkla → Modal önceden doldurulmuş → İsmi değiştir → “Güncelle” tıkla → PUT /api/operators/{id} → “Operatör güncellendi” → Modal kapanır, liste yenilenir.

Silme: Sil ikonuna tıkla → Popconfirm “Operatörü silmek istediğinize emin misiniz?” → DELETE /api/operators/{id} → “Operatör silindi” → Liste yenilenir.

Arama & Sayfalama

Arama istemci tarafındadır (200px giriş). Ad ve ID üzerinden filtreler (büyük/küçük harf duyarsız). Sayfalama varsayılan 20 satır (operatör listesi kısa olduğundan diğer sayfalardan yüksek), [10, 20, 50, 100] seçenekleriyle.

Operatörler Üretim Sayfalarında Nasıl Görünür

Üretim sayfaları (KabatelÇekme, Kalaylama vb.) operatör seçimini iki durumda gösterir:

6.3.5 Diğer Alt Modüllerle Bağlantılar

→ Üretim Modülü

Birincil tüketici. Her üretim oturumu bir operatör gerektirir. Ad oturum kaydında denormalize saklanır. Vardiya devir teslimleri için operatörler oturum sırasında değiştirilebilir. Üretim geçmişi oturum başına operatörü gösterir.

→ Stok Modülü

Yarı mamul kayıtları onları oluşturan üretim oturumuna kadar izlenebilir. Stok sayfaları hangi operatörün her öğeyi ürettiğini göstermek için session.operator_name’i çözer — tam üretim izlenebilirliği.

Tasarım ilkesi: Radikal basitlik. Bir tablo, önemli olan tek alan (isim), dört endpoint, kimlik doğrulama ötesinde rol kontrolü yok. Karmaşıklık üretimin bu veriyi nasıl tükettiğinde yaşar — çift depolama düzeni (bütünlük için FK, geçmiş için isim) akıllı kısımdır. Bir operatörün adı kayıt defterine bir kez girilir ve o andan itibaren her üretim oturumu başlatışında açılır menüden seçilir — bu ad ürettikleri her metre kabloyu takip eder.

6.4 Markalama (Kablo Markalama)

Fabrikadan çıkan her metre kablonun kılıfı üzerine fiziksel olarak metin basılır — firma adı, standart, gerilim değeri, kesit, üretim yılı. Markalama, ekstrüder makinesinin üretim sırasında kabloya bastığı bu markalama şablonlarını yöneten alt modüldür: sıralı kelime/segment dizileri.

Markalama şablonu nedir: Tek bir metin değil, sıralı bir JSON dizisidir. Her kelime ekstrüzyon sırasında kabloya sırayla basılır ve kablonun tüm uzunluğu boyunca tekrarlanır. Kelimeler üretim zamanında çözümlenen dinamik değişkenler içerebilir ({CABLE_SIZE}, {ORDER_NO}, {YEAR}, {METER}). Örnek: ["SOLEN BEAM", "TUV RHEINLAND", "H07V-K", "{CABLE_SIZE}", "{YEAR}"] → kabloya SOLEN BEAM · TUV RHEINLAND · H07V-K · 4mm² · 2025 şeklinde tekrarlayarak basılır.

6.4.1 Veritabanı Şeması

Tek tablo. Minimal tasarım.

SütunTipKısıtlamalarAmaç
idIntegerPK, otomatik artış, indeksliBenzersiz tanımlayıcı
nameString(200)UNIQUE, NOT NULL, indeksliŞablon adı (ör. “SOLEN BEAM Standard”)
wordsJSONNOT NULLSıralı string dizisi — kabloya basılan kelimeler
is_activeBooleanNOT NULL, varsayılan trueSoft delete bayrağı. Pasif markalamalar sipariş açılır menülerinde gizlenir.
created_atDateTime(tz)sunucu varsayılanı now()Oluşturma zaman damgası
updated_atDateTime(tz)güncellemede now()Son değişiklik zaman damgası

Kelimeler için JSON depolama: words sütunu bir JSON dizisi saklar (ör. ["SOLEN BEAM", "TUV RHEINLAND", "H07V-K"]). Backend hem native JSON hem de string kodlu JSON’u işler — listeleme endpoint’i açıkça ayrıştırır: json.loads(m.words) if isinstance(m.words, str) else m.words. Bu çift yönlü işleme, veritabanı sürücüsünün sütunu nasıl serileştirdiğinden bağımsız sağlamlık sağlar.

Temel Kısıtlamalar

6.4.2 API Endpoint’leri

/api/teknik/markings altında altı endpoint:

MetodYolYetkiNe Yapar
POST/markings/createsuper_admin + teknik.markalama.create_markingŞablon oluştur. Tekrar isim kontrolü. name + words dizisi saklar.
GET/markings/listKimlik doğrulanmışTümünü listele. ?active_only=true (varsayılan), ?search=solen (isim ilike). İsme göre sıralı. JSON kelimeleri ayrıştırır.
GET/markings/{id}Kimlik doğrulanmışID ile tek markalama.
PUT/markings/{id}super_admin + teknik.markalama.update_markingKısmi güncelleme. İsim değişirse çakışma kontrolü. Sadece sağlanan alanlar değişir.
DELETE/markings/{id}/hard-deletesuper_admin + teknik.markalama.delete_markingKalıcı silme. Bu endpoint’te soft delete yok.
PUT/markings/{id}/toggle-statusKimlik doğrulanmışis_active’i true/false arasında değiştir. Kimlik doğrulama dışında yetki kontrolü yok.

Doğrulama Detayları

KontrolNeredeDetaylar
İsim zorunluŞema (min_length=1)Pydantic boş stringleri reddeder
İsim maks uzunlukŞema + DBPydantic’te max_length=200, SQLAlchemy’de String(200)
Kelimeler boş değilŞema validatorÖzel @validator('words') ile len(v) > 0 kontrolü
Tekrar isimRoute handlerOluşturmadan önce DB sorgusu. Güncellemede kendisini hariç tutar (Marking.id != marking_id)
Var mı kontrolüRoute handlerGet/update/delete’te bulunamazsa 404

Silme Davranışı

Silme endpoint’i kalıcı silmedir (db.delete(marking)). Standart Yönetimi’nden farklı olarak akıllı silme mantığı yoktur. Bir markalama mevcut siparişler tarafından referans alınıyorsa, o siparişler marking_id tam sayısını tutar ama markalama kaydı silinmiş olur. Daha güvenli iş akışı, /toggle-status endpoint’ini kullanarak durumu pasife çevirmektir; bu, yeni siparişlerde marklamayı gizlerken geçmiş sorgular için kaydı korur.

6.4.3 Pydantic Şemaları

ŞemaAlanlarKullanan
MarkingCreateRequestname: str, words: List[str] (min 1 öge)POST oluştur
MarkingUpdateRequestname?: str, words?: List[str], is_active?: boolPUT güncelle (kısmi için hepsi opsiyonel)
MarkingResponseid, name, words, is_active, created_at, updated_atTüm yanıtlar
MarkingListResponsesuccess: bool, data: List[MarkingResponse], message: strTanımlı ama kullanılmıyor (liste ham dizi döndürür)

Kullanılmayan sarıcı: MarkingListResponse şemalarda tanımlıdır ama /list endpoint’i sarıcı yerine ham dizi döndürür. Endpoint, Pydantic response_model kullanmak yerine ayrıştırılmış JSON kelimelerle sözlükleri elle oluşturur. Bu, JSON string/native ikili formatı ele almak için pragmatik bir seçimdir.

6.4.4 Dinamik Değişkenler

Markalama kelimeleri üretim sırasında çözümlenen dört çalışma zamanı değişkeni destekler:

DeğişkenNe OlurÖrnek
{CABLE_SIZE}Siparişten kablo kesiti4mm²
{ORDER_NO}Sipariş numarasıSLN-2025-0042
{YEAR}Üretim yılı2025
{METER}Kablo üzerinde sayılan metre işareti150

Değişken çözümleme üretim/ekstrüzyon katmanında yapılır, bu alt modülde değil. Markalama şablonları sadece yer tutucu sözdizimiyle saklar. Frontend bunları formda yardımcı metin olarak gösterir: “Değişkenler: {CABLE_SIZE}, {ORDER_NO}, {YEAR}, {METER}”.

6.4.5 Yetki Modeli

İşlemRol KontrolüYetki Anahtarı
Görüntüleme / Listeleme / AramaKimliği doğrulanmış herkesKimliği doğrulanmış herkes
Oluşturmasuper_adminteknik.markalama.create_marking
Güncellemesuper_adminteknik.markalama.update_marking
Silmesuper_adminteknik.markalama.delete_marking
Durum DeğiştirmeKimliği doğrulanmış herkesEk kontrol yok

Makinelerden (production_manager izni olan) veya Standartlardan (lab_user izni olan) farklı olarak, Markalama yazma işlemleri yalnızca super_admin ile sınırlıdır. check_permission_smart fonksiyonu hem rolü hem de ayrıntılı yetki anahtarını doğrular. Durum değiştirme endpoint’i istisnadır — kimliği doğrulanmış herkes bir marklamayı aktifleştirebilir/pasifleştirebilir.

Yetki Manifesti (Frontend)

Frontend yetki sistemi Markalama sayfası için 5 buton tanımlar:

6.4.6 Frontend — Sayfa Yapısı

Tek dosya: src/pages/Teknik/Markalama/index.tsx (374 satır). Rota: /teknik/markalama.

PageContainer

Ant Design Pro sarıcısı, başlık “Markalama”.

ProTable

Ana veri tablosu. /api/teknik/markings/list’ten active_only=false ile çeker (pasifler dahil tümünü gösterir). İstemci tarafı arama ve sayfalama.

Modal (700px)

Oluşturma/düzenleme formu. İsim girişi + dinamik kelime listesi (Form.List) içerir. Arka plan bulanıklaştırma efekti.

Tablo Sütunları (4)

#SütunGenişlikÖzellikler
1İsim250pxSola sabit. Sıralanabilir (localeCompare). Birincil tanımlayıcı.
2Kelime Sayısı120pxHesaplanmış: words JSON/dizi ayrıştırılır, .length döndürür. Kelimelerin kendisi değil.
3Durum100pxAktif için yeşil <Tag>, Pasif için kırmızı.
4İşlemler100pxSağa sabit. Düzenle butonu + Popconfirm ile Sil (“Emin misiniz?”).

Oluşturma/Düzenleme Modalı

Modal iki form bölümüne sahiptir:

1. İsim Alanı

2. Kelimeler (Dinamik Liste)

CRUD Akışı

“Yeni Markalama” tıkla Modal açılır (1 boş kelime slotu) İsim gir + kelime ekle POST /markings/create Tablo yenilenir (key artışı)
Düzenle ikonuna tıkla Modal açılır (ön doldurulmuş) İsim/kelimeleri değiştir PUT /markings/{id} Tablo yenilenir
Sil ikonuna tıkla Popconfirm diyaloğu DELETE /markings/{id}/hard-delete Tablo yenilenir

Arama & Sayfalama

Arama istemci tarafındadır (200px yuvarlak giriş). İsim, durum metni (aktif/pasif) ve kelime sayısı üzerinden filtreler. Sayfalama varsayılan 10 satır, [10, 20, 50, 100] seçenekleriyle. “X-Y / Z kayıt” toplamını gösterir.

6.4.7 Marklamalar Sistemde Nasıl Akar

Markalama şablonları referans verileridir. Teknik modülünde bir kez oluşturulur ve siparişten üretime giden hatta iki kritik noktada tüketilir:

Adım 1: Sipariş Oluşturma (Sipariş Modülü)

Sipariş oluşturma sayfası yüklenir GET /markings/list?active_only=true Her kablo için markalama açılır menüsünü doldur

Sipariş oluşturma formunda her kablo girişinin bir “Markalama” açılır menüsü (aranabilir <Select>) vardır. Sadece aktif marklamaları gösterir. Kullanıcı birini seçer ve marking_id order_cables.marking_id’ye (tam sayı FK) kaydedilir. Bir kablonun sipariş formunda “tamamlanmış” sayılması için markalama seçimi zorunludur.

// Sipariş formu kablo tamamlanma kontrolü (SiparisOlustur/index.tsx)
const isComplete = hasDesign && hasMeters && hasMakara
  && hasMarking && hasPrice && hasCurrency && materialsComplete;

Adım 2: İş Kartı Üretimi & Üretim Planlama

Sipariş onaylandığında ve iş kartları üretildiğinde:

Sipariş onaylandı İş kartı üreteci kablo verisini okur marking_id → marking_name çözümler Her ikisini ekstrüder material_details’e saklar

work_card_generator.py servisi her kablonun marking_id’sini Marking tablosunu sorgulayarak gerçek markalama adına çözümler. Hem marking_id hem de marking_name ekstrüder iş kartının material_details JSON’una gömülür:

# work_card_generator.py — ekstrüder material_details
{
    'marking_id': cable_data.get('marking_id'),    # Tam sayı FK
    'marking_name': cable_data.get('marking_name'), # Çözümlenmiş metin
    'tests': ex_tests,
    'breakdown': [],
    ...
}

Adım 3: Üretim Planlama Görüntüsü

Üretim Planlama sayfası ekstrüder iş kartının material_details’ini okur ve markalama adını kart arayüzünde gösterir:

// Production/Planning/index.tsx
{materialDetails.marking_name && (
  <div>
    <div style={{ fontSize: 10, fontWeight: 600 }}>Markalama</div>
    <div style={{ fontSize: 11 }}>{materialDetails.marking_name}</div>
  </div>
)}

Adım 4: Sipariş Detay Görünümü

Mevcut bir sipariş görüntülenirken detay sayfası marklamayı gösterir. order_routes.py endpoint’i marking_id’yi sorgu zamanında isme çözümler:

# order_routes.py — markalama çözümleme
marking_name = None
if cable.marking_id:
    marking = db.query(Marking).filter(Marking.id == cable.marking_id).first()
    marking_name = marking.name if marking else None

Bu desen order_routes.py’da iki kez geçer: bir kez tek sipariş detay endpoint’i için, bir kez iş kartı üretimi veri çıkarma için.

6.4.8 Veri Depolama Düzeni — ID vs İsim

Tüketimde çift depolama: Operatör çift depolama düzenine (6.3) benzer şekilde, marklamalar hibrit bir yaklaşım kullanır — ancak farklı depolama konumlarına dağılmıştır. order_cables tablosu yalnızca marking_id (tam sayı) saklar. İş kartı material_details JSON’u hem marking_id hem de marking_name’i (denormalize) saklar. Bu, sipariş detay görüntülemelerinin çalışma zamanında Marking tablosunu sorgulamak zorunda olduğu, ama üretim planlamanın ek bir join olmadan adı doğrudan JSON’dan gösterebildiği anlamına gelir.

6.4.9 Diğer Alt Modüllerle Bağlantılar

→ Sipariş (Sipariş Modülü)

Birincil tüketici. Siparişteki her kablonun markings tablosuna işaret eden bir marking_id FK’sı vardır. Sipariş oluşturma sayfası aktif marklamaları aranabilir açılır menü olarak getirir. Kablo tamamlanması için markalama zorunludur.

→ Üretim Planlama

İş kartı üreteci markalama adlarını çözümler ve ekstrüder iş kartı material_details’e gömer. Üretim planlama, operatörlerin kablodaki metni doğrulayabilmeleri için markalama adını ekstrüder kartlarında gösterir.

→ Sipariş Detay Görünümü

Sipariş detay sayfaları sorgu zamanında marking_id’yi marking_name’e çözümler. Şablon adını gösteren ValueDisplay bileşeni olarak görüntülenir.

Tasarım ilkesi: Şablon tabanlı markalama. Sipariş başına serbest metin markalama talimatları saklamak yerine, sistem yeniden kullanılabilir şablonlar kaydı tutar. Bu tutarlılık sağlar — aynı kablo tipi için her sipariş tamamen aynı markalama metnini kullanır. Sıralı kelime dizisi yapısı, ekstrüder baskı kafasının çalışma şekliyle doğrudan eşleşir: kelimeleri sırayla döngüyle gezer, aralarında boşluk bırakarak kablo uzunluğu boyunca basar. Dinamik değişkenler ({CABLE_SIZE}, {YEAR} vb.) yeni şablon oluşturmadan siparişe özel bağlam ekler.

6.5 & 6.6 Kablo Tasarım (Cable Playground) & Kablo Veritabanı (Cable Database)

Bu iki alt modül birlikte belgelenir çünkü ayrılmazdır: Playground, gerçek fabrika makineleri kullanılarak kabloların adım adım tasarlandığı yerdir ve Kablo Veritabanı, tamamlanmış tasarımların kalıcı olarak saklandığı depodur. Sistemdeki diğer tüm modüller — Siparişler, Üretim Planlama, İş Kartları, Malzeme Hesaplamaları, Stok — nihayetinde Playground’un oluşturup Kablo Veritabanı’na kaydettiği kayıtlara bağlıdır.

Birleşim noktası: Tüm Teknik alt modüllerinin birleştiği yer burasıdır. Makine Yönetimi makineleri ve kapasite aralıklarını sağlar. Standart Yönetimi her adıma atanacak testleri sağlar. Operatör Yönetimi tasarımı yürütecek operatörleri sağlar. Markalama, ekstrüzyon sırasında basılacak metni sağlar. Playground tüm bu verileri tüketerek eksiksiz bir üretim planı oluşturur ve bunu tüm imalat hattı için tek doğru kaynak olarak Kablo Veritabanı’na kaydeder.

6.5.1 Temel Kavram — Kablo Tasarımı Nasıl Çalışır

Kablo imalatı katı bir sıralı hat izler. Ham bakır (8mm filmaşin) ilk makineye girer ve 6 makine türü üzerinden ilerleyerek bitmiş kabloya dönüşür. Playground bu sürecin tamamını dijital olarak simüle eder.

Altı Makine Türü (sırasıyla)

#MakineGirişÇıkışTemel Parametreler
1Kabatel Çekme8mm filmaşin (ham bakır)Çekilmiş tel (ör. 1.8mm)output_diameter, speed, tav, adet
2KalaylamaKC’den çekilmiş telKalaylanmış tel (ör. 21 adet)tin_thickness, speed, adet (kritik!)
3İncetel ÇekmeKL’den kalaylanmış telİnce tel demetleri (ör. 10×0.30mm)input_number, output_diameter, output_number, tav
4BuncherIC / diğer BN / EX’den ince tellerBükülmüş teldinamik girişler (+ekle), hatve, büküm yönü (S/Z)
5ExtruderBN / diğer EX’den bükülmüş telİzoleli/kılıflı kabloinsulation_thickness, sheath_thickness, katalizör, boya
6E-beamEkstrüde kablo (katalizörsüz!)Çapraz bağlı kabloradiation_level, speed (üretim zamanında belirlenir)

Makine Akış Kısıtlamaları

Her makine her makineden sonra gelemez. Sistem yönlü bir graf uygular:

Kabatel Çekme Kalaylama İncetel Çekme Buncher Extruder E-beam

Kritik döngü yetenekleri:

# Makine akış kısıtlamaları (playground_session.py)
MACHINE_FLOW = {
    'kabatel_cekme': ['kalaylama'],
    'kalaylama':     ['incetel_cekme', 'buncher'],
    'incetel_cekme': ['buncher', 'extruder'],
    'buncher':       ['extruder', 'buncher'],    # Kendi döngüsü!
    'extruder':      ['ebeam', 'extruder'],      # Kendi döngüsü!
    'ebeam':         []                          # Son
}

6.5.2 Backend Mimarisi — Motor

Playground backend’i toplam ~4.700 satır olan 8 Python dosyasından oluşur:

DosyaSatırAmaç
design_routes.py1.155API endpoint’ler — oturum, adımlar, konfigürasyon, geri al/yinele, otomatik kaydetme, sonlandırma
playground_session.py986Oturum yöneticisi — adım yaşam döngüsü, geri al/yinele yığınları, checkpoint/geri yükleme
progression_manager_v2.py995Miktar takibi — girişleri tüket, çıkışları üret, makine bazlı işleme
db_integration.py446Gerçek makine verileri — makine tablolarını okur, kapasite kesişimi hesaplar
form_integration.py339Form doldurma — makine türüne göre açılır menü verileri oluşturur
validation_engine.py465Konfigürasyon doğrulama — değerleri makine kapasitelerine karşı kontrol eder
code_generator.py291Deterministik ürün kodları — SHA256 hash + okunabilir kodlar
playground_configs.py446Pydantic şemaları — her makine türü için tipli konfigürasyon

Oturum Yönetimi (Bellekte)

Oturumlar bir Python sözlüğünde saklanır (_active_sessions: Dict[str, PlaygroundSession]). Her oturum içerir:

İlerleme Paneli — Tasarımın Kalbi

ProgressionManager, ProgressionItem nesnelerinin bir listesini tutar. Her öğe, imalatın herhangi bir aşamasındaki fiziksel bir ürünü (tel, bükülmüş tel, kablo) temsil eder:

# ProgressionItem alanları
{
    'id': 'uuid',                    # Benzersiz tanımlayıcı
    'code': 'KC_18',                 # Deterministik ürün kodu
    'quantity': 21,                  # Mevcut kullanılabilir miktar
    'original_quantity': 21,         # İlk üretildiğindeki miktar
    'structure': '1.8mm',            # Yapı formülü
    'specification': '1.8mm Tel',    # Okunabilir ad
    'status': 'active' | 'inactive', # Inactive = tamamen tüketildi
    'produced_by_step': 1,           # Hangi adım oluşturdu
    'consumed_by_steps': [2],        # Bundan tüketen adımlar
    'machine_type': 'kabatel_cekme', # Kaynak makine
    'properties': { ... }            # Makineye özel veri
}

Temel kurallar:

Miktar Takibi Örneği — 6mm² Kablo

8mm Filmaşin (mkt: 1) → KC 1.8mm Tel (mkt: 1) → KL (adet=21) 1.8mm Kalaylı (mkt: 21)
↓ IC (10 tüketildi) 10×0.30 (mkt: 4)     ↓ IC (11 tüketildi) 11×0.30 (mkt: 3)
↓ Buncher (4×10 + 3×11 = 73 tel) BN_73X030 (mkt: 1) → EX EX_4X10X03_3X11X03+INS+SHT (mkt: 1)

Kritik adet parametresi: Kalaylama adımında adet=21, tüm 6mm² kablo tasarımının çalışmasını sağlayan şeydir. Kalaylama 1 giriş tüketir ama 21 parça üretir, bunlar daha sonra iki paralel İncetel Çekme süreci arasında bölünür (10+11=21). Bu miktar takibi, ilerleme sisteminin temel yenilikçiliğidir.

Checkpoint/Geri Yükleme ile Atomik İşlemler

Her konfigürasyon denemesi atomik bir işlemle sarılır:

Checkpoint oluştur Konfig uygula Adımı simüle et Başarılı? Koru. Başarısız? Checkpoint’e dön.

StateSnapshot, oturumun tam durumunu yakalar (adımlar + ilerleme öğeleri + tüketim günlüğü + adım sayaç). Başarısızlıkta oturum tam olarak önceki durumuna geri yüklenir.

6.5.3 API Endpoint’ler — 30+ Endpoint

Oturum Yönetimi

MetodYolNe Yapar
POST/playground/startStandart + kesit ile oturum başlat. session_id + başlangıç durumu döner.
GET/playground/{id}/stateTam oturum durumunu al (adımlar + ilerleme + özet).

Adım Yönetimi

MetodYolNe Yapar
POST/playground/{id}/steps/addMakine adımı ekle (sıralı veya paralel). Akış kısıtlamalarını doğrular.
DELETE/playground/{id}/steps/{step_id}Tüketilen öğelerin tam geri alımıyla adımı kaldır. Etkilenen bağımlı adımları bildirir.

Form Verileri (makine türüne göre)

MetodYolNe Yapar
GET/playground/{id}/form-data/kabatel-cekmeMakineler, sabit giriş (8mm), standarda uygun testler
GET/playground/{id}/form-data/kalaylamaMakineler, ilerlemeden girişler (KC çıkışları), testler
GET/playground/{id}/form-data/incetel-cekmeMakineler, max_quantity ile kalaylı girişler, makine giriş limitleri
GET/playground/{id}/form-data/buncherMakineler, miktarlı Z/T/U kodlu girişler, büküm yönleri
GET/playground/{id}/form-data/extruderMakineler, T/U kodlu girişler, katman seçenekleri (izolasyon/kılıf + katalizör/boya)
GET/playground/{id}/form-data/ebeamMakineler, sadece katalizörsüz ekstrüder çıkışları

Makine Konfigürasyonu (türe göre)

MetodYolNe Yapar
POST/playground/{id}/configure/kabatel-cekme/{step}KC konfigüre: output_diameter, speed, tav, adet
POST/playground/{id}/configure/kalaylama/{step}KL konfigüre: giriş seçimi, tin_thickness, speed, adet
POST/playground/{id}/configure/incetel-cekme/{step}IC konfigüre: giriş, input_number, output_diameter, output_number
POST/playground/{id}/configure/buncher/{step}BN konfigüre: dinamik girişler, hatve, büküm yönü
POST/playground/{id}/configure/extruder/{step}EX konfigüre: girişler (ikiz için 1+), izolasyon/kılıf katmanları
POST/playground/{id}/configure/ebeam/{step}EB konfigüre: giriş seçimi (katalizörsüz)
PUT/playground/{id}/configure/{step}/editZaten konfigüre edilmiş adımı düzenle (geri al + yeniden uygula)

Kapasite Kesişimi

MetodYolNe Yapar
POST/playground/{id}/calculate-intersection/{type}Seçilen makine ID’leri verildiğinde, sadece TÜMÜNÜN üretebileceği değerleri döner. Kullanıcı makine onay kutusunu işaretleyip kaldırdığında dinamik olarak çağrılır.

Geri Al/Yinele & Otomatik Kaydetme

MetodYolNe Yapar
POST/playground/{id}/undoGeçmiş yığınından çıkar, mevcut durumu yinele yığınına it
POST/playground/{id}/redoYinele yığınından çıkar, mevcut durumu geçmiş yığınına it
GET/playground/{id}/historyGeri alınabilir mi? Yinelenebilir mi? Yığın boyutları.
POST/playground/{id}/autosaveOturum durumunu kaydet, kaydedildi olarak işaretle
GET/playground/{id}/autosave-statusAçık mı, aralık, son kaydetmeden bu yana geçen saniye
PUT/playground/{id}/autosave-settingsAç/kapat, aralığı değiştir

Doğrulama & Sonlandırma

MetodYolNe Yapar
POST/playground/{id}/validate/{step}Kuru çalıştırma doğrulaması: girişlerin varlığını, miktarların yeterliliğini kontrol eder
POST/playground/{id}/finalizeTasarımı sonlandır → tek işlemde cable_designs + design_steps + cable_database’e kaydeder

6.5.4 Makine Konfigürasyon Şemaları

Her makine türünün form alanlarını sırasıyla tanımlayan bir Pydantic şeması vardır:

MakineŞemaAlanlar (sırasıyla)
Kabatel ÇekmeKabatelCekmeConfigalternative_machines, input_type (sabit), output_diameter, speed, tav, adet, tests
KalaylamaKalaylamaConfigalternative_machines, input_item_id, tin_thickness, speed, adet, tests
İncetel ÇekmeIncetelCekmeConfigalternative_machines, input_item_id, input_number, output_diameter, speed, tav, output_number, tests
BuncherBuncherConfigalternative_machines, inputs (List[BuncherInputBlock]), adet, speed, hatve, twist_direction, tests
ExtruderExtruderConfigalternative_machines, inputs (ikiz için 1+), insulation_*, sheath_*, speed, tests. Adet yok (her zaman 1).
E-beamEbeamConfigalternative_machines, input_item_id, tests. Hız/radyasyon üretim zamanında belirlenir.

E-beam yalnızca tasarım içindir: Diğer makinelerden farklı olarak, E-beam’in hızı ve radyasyon seviyesi tasarım sırasında belirlenmez. Bunlar kablonun malzeme özelliklerine göre belirlenen üretim zamanı parametreleridir. Playground yalnızca hangi kablonun E-beam’den geçeceğini kaydeder ve testler atar.

6.5.5 Kapasite Kesişimi — Çoklu Makine Esnekliği

Kullanıcı bir adım için birden fazla alternatif makine seçtiğinde, sistem kapasite aralıklarının kesişimini hesaplar. Açılır menülerde yalnızca seçilen tüm makinelerin üretebileceği değerler görünür.

# Makine A hız seçenekleri: [5, 10, 15, 20, 25]
# Makine B hız seçenekleri: [10, 15, 20, 25, 30]
# Kesişim: [10, 15, 20, 25]
# Bu, kesişimdeki herhangi bir değerin seçilen
# HERHANGI BİR makinede üretilebileceği anlamına gelir → üretim esnekliği

Bu, kullanıcı konfigürasyon çekmecesinde bir makine onay kutusunu her işaretlediğinde veya kaldırdığında POST /calculate-intersection/{machine_type} üzerinden dinamik olarak çağrılır.

6.5.6 Deterministik Kod Üretimi

CableCodeGenerator, aynı ürünlerin her zaman aynı kodu almasını sağlar; bu stok yönetimi için kritiktir:

Ürün TürüKod FormatıÖrnek
Ham malzemeRAW_XX_specRAW_COPPER_8MM
Yarı mamulMC_specKC_18 (Kabatel’den 1.8mm tel), BN_73X030 (73 telli büküm)
Nihai kablo{standard}_{item_code}_{id}StandardEnum.EN_EX_4X10X03_3X11X03+INS_07_CAT_DYE+SHT_08_CAT_DYE_6

Tam spesifikasyonlardan (product_type + machine_type + girişler + çıkışlar + parametreler) deterministlik için sort_keys=True ile SHA256 spec_hash hesaplanır. Aynı hash’e sahip bir ürün product_codes’da zaten varsa, mevcut system_code döner. Yoksa çakışma yönetimiyle (sıra eki _001, _002 vb.) yeni bir kod üretilir.

6.5.7 Özel Kablo Türleri

İkiz Kablolar (Extruder)

Extruder, ikiz/üçüz kablolar için çoklu giriş destekler. Yapıda || ayırıcısı kullanılır: (kablo1 || kablo2)+SHT_0.8mm. Frontend ||’dan ikiz sayısını tespit eder ve Türkçe adlar üretir: İkiz, Üçüz, Dördüz, Beşiz.

Çok Damarlı Kablolar (Extruder → Buncher → Extruder)

Çok damarlı kablolar için akış döngü yapar: Extruder tek damarları izole eder, Buncher izoleli damarları gruplar, sonra Extruder dış kılıfı uygular. Sistem bunu yapı formülündeki INS_ desenlerinden tespit eder.

E-beam Kablolar (Katalizörsüz)

E-beam çapraz bağlama, kimyasal katalizörün yerini alır. Form entegrasyonu, katalizörlü kabloları E-beam giriş açılır menüsünden tamamen gizler — geçersiz kombinasyonları önlemek için hiç gösterilmezler.

6.5.8 Frontend — Playground Sayfası

Ana dosya: src/pages/Teknik/CablePlayground/index.tsx (947 satır), 7 bileşen dosyası ve 1 özel hook ile.

CablePlayground (index.tsx)

Ana orkestratör. Oturum başlatma modalı (standart + kesit seçimi), görünüm modu değiştirme (akış/zaman çizelgesi/kod), geri al/yinele/otomatik kaydetme kontrolleri.

FlowCanvas

Sürükle-bırak makine yerleştirme ile görsel akış diyagramı. Üretim adımlarını bağlı düğümler olarak gösterir.

ConfigurationDrawer

~1.215 satır. En büyük bileşen. Makine konfigüre edilirken yan çekmece olarak açılır. Makine türüne göre dinamik formlar. Makine onay kutusu değişikliğinde kesişim hesaplaması.

ProgressionPanel

Sağ taraf paneli. Tüm öğeleri (aktif/inaktif) miktarlar, kodlar, yapılarla gösterir. Sonraki adımlar için giriş seçimini yönlendirir.

MachineLibrary

Sürüklenebilir makine paleti. 6 makine türü ikon ve etiketlerle.

usePlayground Hook

591 satır. Tüm API entegrasyonu. Oturum durumunu, yükleme durumlarını, hata yönetimini yönetir. localStorage üzerinden Bearer token kimlik doğrulama.

Oturum Başlatma Akışı

“Oturum Başlat” tıkla Modal: EN/UL/SLN + kesit seç POST /playground/start Canvas, ilerlemede 8mm filmaşin ile görünür

Makine Konfigürasyon Akışı

Kütüphaneden makine ekle POST /steps/add Canvas’ta makine düğümüne tıkla GET /form-data/{tür} ConfigurationDrawer açılır
Makine seç → POST /calculate-intersection Açılır menüler dinamik güncellenir Formu doldur → POST /configure/{tür}/{adım} İlerleme güncellenir

CRUD Akışı

Playground geleneksel bir CRUD sayfası değildir. Oturum tabanlı bir üretim simülasyon motorudur. “Oluşturma” tek bir form göndermesi değil, çok adımlı bir tasarım sürecidir.

Oluştur (Kablo Tasarla):

  1. “Oturum Başlat” butonuna tıkla → Modal standart (EN/UL/SLN) ve kesit sorar
  2. POST /playground/start → Bellekte oturum oluşturulur, ilerleme panelinde başlangıç girdisi olarak 8mm filmaşin belirir
  3. Kütüphaneden makineyi canvas’a sürükle → POST /playground/steps/add → oturuma adım eklenir
  4. Makine düğümüne tıkla → GET /playground/form-data/{tür} → ConfigurationDrawer açılır (1.215 satırlık bileşen)
  5. Gerçek makineleri seç (onay kutuları) → POST /playground/calculate-intersection → açılır listeler yalnızca tüm seçilen makinelerin üretebileceği değerlerle güncellenir
  6. Konfigürasyon formunu doldur → POST /playground/configure/{tür}/{adım} → ilerleme paneli yeni çıktılar + miktarlarla güncellenir
  7. Her üretim makinesi için 3–6 adımları tekrarla (KC → KL → IC → BN → EX → isteğe bağlı E-beam)
  8. Sistem POST /playground/autosave ile otomatik kaydeder (her değişiklik geri al/yinele için bir kontrol noktası oluşturur)
  9. “Sonlandır” butonuna tıkla → POST /playground/finalize → atomik veritabanı işlemi cable_designs, design_steps ve cable_database tablolarına aynı anda yazar. Deterministik SHA-256 kod üretilir. Oturum yok edilir.

Oku (Oturumu Devam Ettir):

  1. Mevcut oturumlar bellekte kalır. Sayfayı yenile → GET /playground/status aktif oturum kontrol eder
  2. Oturum varsa: canvas son kontrol noktasından tam ilerleme durumuyla geri yüklenir

Geri Al / Yinele (Oturum İçi):

  1. Geri Al’a tıkla → POST /playground/undo → oturum önceki kontrol noktasına geri döner
  2. Yinele’ye tıkla → POST /playground/redo → oturum sonraki kontrol noktasına ilerler
  3. Her yapılandır/ekle/kaldır eylemi atomik bir kontrol noktası oluşturur. Geri alma yığını oturum içinde sınırsızdır.

Sil (Adım Kaldır):

  1. Canvas’taki makine düğümüne sağ tıkla → “Kaldır”
  2. POST /playground/steps/remove → adım oturumdan kaldırılır, ilerleme yeniden hesaplanır, kontrol noktası oluşturulur
  3. Aşağı akış bağımlılıkları olan bir adımı kaldırmak, bu adımların da zincirleme kaldırılmasını tetikler

Neden geleneksel CRUD değil: Sonlandırmadan sonra “kabloyu düzenle” butonu yoktur. Bir tasarım Kablo Veritabanı’na sonlandırıldığında değiştirilemez. Bir kabloyu “düzenlemek” için yeni bir Playground oturumu başlatılır, yeniden tasarlanır ve tekrar sonlandırılır. Deterministik kod sistemi, elde edilen kablo aynı fiziksel özelliklere sahipse otomatik olarak aynı kodu alır. Farklıysa yeni bir kod alır. Bu, halihazırda üretilen bir kablonun değiştirilme riskini ortadan kaldırır.

6.6 Kablo Veritabanı (Cable Database)

6.6.1 Ne Kaydedilir — Sonlandırma Süreci

Kullanıcı Playground’da “Sonlandır” düğmesine bastığında, sistem tek bir veritabanı işleminde üç şey kaydeder:

TabloNe Kaydedilir
cable_designsTasarım meta verileri: kod, ad, standart, kesit, tam JSON design_data, onay durumu, oluşturan
design_stepsHer üretim adımı: step_number, machine_type, parallel_group, machine_ids, girişler/çıkışlar/konfigürasyon/testler JSON olarak
cable_databaseSonlandırılmış kablo kaydı: cable_code, cable_type, cross_section, structure_formula, production_flow, half_products, raw_materials, test_requirements (tümü JSON)

6.6.2 Veritabanı Şeması — 4 Tablo

cable_designs

SütunTürAmaç
idInteger PKBenzersiz ID
design_codeString(50) UNIQUEÜretilen kod
design_nameString(200)İsteğe bağlı ad
standardString(50), CHECK IN (EN, UL, SLN)Kablo standardı
cross_sectionString(50)ör. “6mm²”
design_dataText (JSON)Tam oturum durumu
is_approvedBooleanBasitleştirilmiş iş akışında otomatik onaylı
is_activeBooleanGeçici silme
created_by / approved_byInteger FK → usersKullanıcı takibi

design_steps

SütunTürAmaç
idInteger PKBenzersiz ID
design_idInteger FK → cable_designs (CASCADE)Üst tasarım
step_numberIntegerSıralı konum
is_parallel / parallel_groupBoolean / IntegerParalel işleme desteği
machine_typeString(50)kabatel_cekme, kalaylama vb.
machine_idsTextVirgülle ayrılmış alternatif makine ID’leri
configurationText (JSON)Tam makine konfigürasyonu
inputs / outputs / testsText (her biri JSON)Adım G/Ç ve test atamaları

Benzersiz kısıt: (design_id, step_number, parallel_group)

cable_database — Ana Kayıt

SütunTürAmaç
idInteger PKBenzersiz ID
design_idInteger FK → cable_designsKaynak tasarım
cable_codeString(100) UNIQUE, indeksliHer yerde kullanılan benzersiz kablo tanımlayıcısı
standardString(50)EN, UL, SLN
cable_typeString(200)ör. “EN 6mm² Klasik Kablo”
cross_sectionString(50)ör. “6mm²”
structure_formulaTextTam yapı notasyonu
production_flowText (JSON)Konfigürasyonlarla adım adım üretim dizisi
half_productsText (JSON)Özelliklerle tüm ara ürünler
raw_materialsText (JSON)Gerekli hammaddeler (A=Bakır, B=Kalay, C=Plastik, D=Katalizör, E=Boya)
test_requirementsText (JSON)Frekanslarla her adımda atanmış testler
is_activeBooleanGeçici silme

product_codes — Stok Yönetimi Köprüsü

SütunTürAmaç
system_codeString(100) UNIQUEOkunabilir kod (KC_18, BN_73X030)
spec_hashString(256) UNIQUESpesifikasyonların SHA256’sı (deterministik)
product_typeString(50)raw / half / final
machine_typeString(50)Hangi makine üretir
display_name_tr / enString(200)Türkçe/İngilizce görüntüleme adları
used_in_designsText (JSON)Bu ürünü kullanan kablo kodları dizisi
stock_levelFloatMevcut stok miktarı

6.6.3 Kablo Veritabanı API — 15+ Endpoint

MetodYolYetkiNe Yapar
GET/cable-databaseDoğrulanmışKabloları listele. Filtreler: arama, kesit, sadece_aktif. İkiz/damar/katman tespitli display_name üretir.
GET/cable-database/{kod}DoğrulanmışKoda göre tek kablo.
GET/cable-database/{kod}/fullDoğrulanmışMalzeme hesaplayıcı için eksiksiz ham veri. TÜM özelliklerle half_products döner.
GET/cable-database/{kod}/production-flowDoğrulanmışAdım adım üretim dizisi.
GET/cable-database/{kod}/half-productsDoğrulanmışTüm ara ürünler.
GET/cable-database/{kod}/requirementsDoğrulanmışHammaddeler + test gereksinimleri.
GET/cable-database/{kod}/parsed-structureDoğrulanmışSipariş formları için ekstrüzyon adımlarına ayrıştırılmış yapı.
PUT/cable-database/{kod}/deactivatesuper_admin, üretim_müdürüGeçici silme (is_active=false).
DELETE/cable-database/{kod}/permanentsuper_adminKablo + ilişkili tasarımı kalıcı sil. Gerçek zamanlı güncelleme yayınlar.
GET/products/codesDoğrulanmışFiltrelerle tüm ürün kodlarını listele.
GET/products/{kod}/usageDoğrulanmışHangi kablolar bu ürünü kullanıyor + stok seviyesi.
PUT/products/{kod}/stocksuper_admin, üretim_müdürü, operatörStok seviyesini güncelle.
GET/analytics/common-productsDoğrulanmış2+ kabloda kullanılan ürünler (stok optimizasyonu).
GET/analytics/production-efficiencyDoğrulanmışYeniden kullanım %, verimlilik puanı, öneriler.

6.6.4 Frontend — Kablo Veritabanı Sayfası

Tek dosya: src/pages/Teknik/CableDatabase/index.tsx (691 satır). Rota: /teknik/kablo-veritabani.

ProTable

Tüm kabloları display_name, cable_code, standard, cross_section, durum ile listeleyen ana veri tablosu. İstemci tarafı arama.

Detay Çekmecesi

Kabloya tıklandığında açılır. Sekmeler: Üretim Akışı (Zaman çizelgesi görselleştirme), Yarı Mamuller (Liste), Gereksinimler (hammaddeler + testler).

ProductionFlowViewer

Makine ikonları, parametreler ve paralel göstergelerle her üretim adımını gösteren Ant Design Timeline bileşeni.

CRUD Akışı

Kablo Veritabanı esas olarak okuma ağırlıklı, bir kez yaz deposudur. Kablolar yalnızca Playground sonlandırması yoluyla girer — manuel “kablo oluştur” formu yoktur.

Oluştur (Playground Sonlandırması Yoluyla):

  1. Kullanıcı Playground’da tasarımı sonlandırır → POST /playground/finalize
  2. Backend fiziksel özelliklerin SHA-256 hash’i ile deterministik kablo kodu üretir
  3. Kod zaten varsa: sonlandırma reddedilir (aynı kablo zaten kayıtlı)
  4. Kod yeniyse: atomik işlem cable_designs + design_steps + cable_database satırlarını tek seferde yazar
  5. teknik odasına WebSocket yayını → tüm bağlı kullanıcılarda Kablo Veritabanı tablosu yenilenir

Oku:

  1. /teknik/kablo-veritabani sayfasını aç → GET /cable-database → ProTable tüm kabloları display_name, cable_code, standart, kesit, durum ile listeler
  2. İstemci tarafı arama kablo kodu, tür veya kesite göre filtreler
  3. Kablo satırına tıkla → Detay Çekmecesi üç sekmeli açılır:
    • Üretim Akışı: GET /cable-database/{kod}/production-flow → Ant Design Timeline ile her üretim adımının görselleştirilmesi
    • Yarı Mamul Ürünler: GET /cable-database/{kod}/half-products → özellikleriyle tüm ara ürünler
    • Gereksinimler: GET /cable-database/{kod}/requirements → hammaddeler (bakır, kalay, plastik, katalist, boya) + test gereksinimleri
  4. Diğer modüller kablo verilerini özel endpoint’ler üzerinden okur: /full (malzeme hesaplayıcı), /parsed-structure (sipariş formları)

Geçici Silme (Devre Dışı Bırakma):

  1. Tablo satırındaki devre dışı bırakma ikonuna tıkla (super_admin veya production_manager yetkisi gerekir)
  2. Onay diyalogu uyarısı
  3. PUT /cable-database/{kod}/deactivateis_active = false olarak ayarlanır
  4. Kablo varsayılan liste görünümlerinden kaybolur (active_only=false filtresiyle hala erişilebilir). Bu kablo koduna referans veren aşağı akış modülleri çalışmaya devam eder — devre dışı bırakma yeni siparişlerin bunu kullanmasını engeller.

Kalıcı Silme:

  1. Kalıcı silme ikonuna tıkla (yalnızca super_admin yetkisi gerekir)
  2. Güçlü uyarı metniyle onay diyalogu
  3. DELETE /cable-database/{kod}/permanent
  4. Backend cable_database kaydını + ilişkili cable_designs + design_steps’i siler (cascade)
  5. WebSocket yayını → tüm bağlı kullanıcılarda tablo yenilenir
  6. Tehlike: Bu yıkıcı bir işlemdir. Aktif siparişler veya iş kartları bu kablo koduna referans veriyorsa, bu referanslar yetim kalır.

Güncelle (Stok Seviyesi — Ürün Kodları):

  1. Ürün kodları görünümüne git → GET /products/codes
  2. Üründe stok düzenle’ye tıkla → PUT /products/{kod}/stock (super_admin, production_manager veya operator gerekir)
  3. O yarı mamul/nihai ürün için stock_level alanını günceller
  4. Stok güncellemeleri için WebSocket yayını yok — yoklama tabanlı

Temel ayrım: Kablo Veritabanı kayıtları oluşturulduktan sonra değiştirilemez. Bir kablonun yapısını, üretim akışını veya malzeme gereksinimlerini düzenleyemezsiniz. Değiştirilebilir tek alanlar is_active (geçici silme değiştirici) ve ürün kodlarındaki stock_level’dır. Bir kablo tasarımının değiştirilmesi gerekiyorsa, Playground’da sıfırdan yeni bir kablo tasarlanmalıdır; bu kablo aynı fiziksel özelliklere sahipse aynı kodu, farklıysa yeni bir kod alır.

6.6.5 Kablo Veritabanı Sistemin Geri Kalanını Nasıl Besler

→ Sipariş Modülü

Sipariş oluşturma, kablo veritabanından kablo tasarımlarını çeker. Her sipariş kablosu cable_code saklar. /parsed-structure endpoint’i, dinamik malzeme seçimi için (katman başına plastik, katalizör, boya) ekstrüzyon adım verilerini sağlar.

→ Üretim Planlama

İş kartı üreteci, her makine adımı için iş kartları oluşturmak üzere production_flow ve half_products’ı okur. /full endpoint’i malzeme hesaplamaları için eksiksiz veri sağlar.

→ Malzeme Hesaplayıcı

half_products özelliklerine (wire_count, wire_groups, bundle_diameter) dayanarak hammadde miktarlarını (bakır kg, plastik kg, kalay kg, katalizör kg, boya kg) hesaplamak için kablo veritabanını okur.

→ Stok Modülü

Kablo veritabanındaki ürün kodları stok takibine bağlanır. Birden fazla kabloda kullanılan aynı yarı mamul = paylaşılan stok. used_in_designs dizisi kablolar arası stok optimizasyonunu mümkün kılar.

→ Genel Arama

Arama modülü, sistem geneli arama için cable_database alanlarını (cable_code, cable_type, cross_section, structure_formula) indeksler.

Tasarım ilkesi: Playground bir üretim simülasyon motorudur, bir çizim aracı değil. Sadece spesifikasyonları kaydetmez — tüm imalat mantığını adım adım yürütür, kesin miktarları takip eder, makine akış kısıtlamalarını uygular, gerçek makine kapasitelerine karşı doğrular ve kapasite kesişimlerini hesaplar. Sonuç, her alt modülün tek doğru kaynak olarak güvendiği Kablo Veritabanı’nda saklanmış eksiksiz bir üretim planıdır. Deterministik kod üretimi, aynı ürünlerin her zaman aynı kodu almasını sağlayarak farklı kablo tasarımları arasında stok yeniden kullanımını mümkün kılar. Atomik checkpoint/geri yükleme ile bellek içi oturum mimarisi, hiçbir kısmi veya geçersiz durumun veritabanına ulaşmamasını garanti eder.

7. SONUÇ

Teknik sadece bir modül değil — tüm Solen ERP sisteminin üzerine inşa edildiği temeldir. Fabrikanın ürettiği her kablo, hayatına burada tanımlanan veri olarak başlar. Her sipariş, her iş kartı, her kalite testi, her malzeme hesaplaması, her stok kaydı Teknik’in oluşturduğu bir kayıda geri döner. Teknik olmadan sistemin geri kalanının üzerinde çalışacağı hiçbir şey yoktur.

7.1 Bu Belgenin Kapsamı

Bu derin analiz, Teknik modülünü altı alt modül boyunca, üst düzey mimariden bireysel kod satırlarına kadar inceledi:

BölümAlt ModülDerinlikAna Çıkarım
6.1Makine YönetimiTamKapasite-aralık modeli (min/maks/artış) dinamik açılır menü üretimi ve makineler arası kesişim hesaplamasını mümkün kılar
6.2Standartlar & TestlerTamÜç katmanlı hiyerarşi (standart → test grubu → bireysel test) ile çoklu standart atamaları
6.3Operatör YönetimiTamÇift depolama deseni: bütünlük için tam sayı FK + join’siz görüntüleme için denormalize ad
6.4MarkalamaTamModüller arası veri akışı: marking_id sipariş → iş kartı → üretim planlama → operatör ekranı boyunca ilerler
6.5Kablo TasarımKapsamlıBellek içi oturumlar, atomik checkpoint’ler, miktar takibi ve makine akış kısıtlamaları ile üretim simülasyon motoru
6.6Kablo VeritabanıKapsamlıTek doğru kaynak: tüm alt modüller için sıfır-join okuma sağlayan denormalize JSON blob’ları

7.2 Mimari İlkeler

Teknik modülü boyunca birkaç tasarım ilkesi tekrarlanır ve modülün karakterini tanımlar:

Aşağı Yönlü Salt Okunur

Diğer tüm modüller Teknik’ten okur ama asla yazmaz. Makineler, standartlar, operatörler, markalar ve kablo tasarımları burada tanımlanır ve her yerde tüketilir. Bu, temiz bir bağımlılık yönü uygular.

Depolamadan Önce Simülasyon

Playground serbest form giriş kabul etmez. Gerçek üretim hattını simüle eder: akış kısıtlamalarını uygular, gerçek makine kapasitelerine karşı doğrular, kesişimleri hesaplar, miktarları takip eder. Yalnızca tamamen geçerli bir tasarım veritabanına sonlandırılabilir.

Deterministik Kimlik

SHA-256 spec hash’leme, aynı fiziksel ürünün hangi kablo tasarımı oluşturursa oluştursun her zaman aynı kodu almasını garanti eder. Kablo tasarımları arasında stok havuzlamasını mümkün kılan budur.

Hız İçin Denormalize

Kablo Veritabanı, production_flow, half_products, raw_materials ve test_requirements’ı JSON blob’ları olarak saklar. Bu bilinçlidir: alt modüller tam resmi tek bir okumada ister, 12 tablolu bir join’de değil.

7.3 Sayılarla

6
ALT MODÜL
~75
API ENDPOINT
12
VERİTABANI TABLOSU
~12.000
SATIR BACKEND
~4.000
SATIR FRONTEND
6
MAKİNE TİPİ

7.4 Teknik Fabrikayı Nasıl Besler

Teknik Kablo Veritabanı Sipariş Üretim Planlama Stok & Malzeme

Her kablo siparişi, Kablo Veritabanı’ndan bir cable_code’a referans verir. Her iş kartı, production_flow JSON’undan üretilir. Her malzeme hesaplaması, half_products özelliklerini okur. Her kalite testi, Teknik’te tanımlanan standart hiyerarşisinden atanır. Kablo üzerine basılan markalama, Markalama alt modülünden gelir. Kabloları üreten makineler, Makine Yönetimi’nde saklanan kapasitelere karşı doğrulanır.

Kısacası: Teknik yanlışsa, aşağıdaki her şey yanlıştır. Bu yüzden Playground atomik işlemler, kapasite doğrulaması ve deterministik kod üretimi kullanır — Kablo Veritabanı’na giren her şeyin üretime hazır ve doğru olduğunu garanti etmek için.

7.5 Son Söz

Teknik modülü, alan uzmanlığını — tel çapları, makine kapasiteleri, üretim sıraları, test standartları, markalama şablonları — yapılandırılmış, doğrulanmış, makine tarafından okunabilir veriye dönüştürür. Mühendislerin bildikleri ile yazılımın yürütebildikleri arasındaki köprüdür. Burada oluşturulan her kayıt, peşinden gelen tüm üretim zincirinin ağırlığını taşır. Bu belge, o zinciri — 8mm filmaşinin Kabatel Çekme’ye girmesinden veritabanında saklanan nihai kablo koduna kadar, her makine adımından, her miktar bölünmesinden, her doğrulama kontrolünden ve her alt tüketiciden geçerek — izlemiştir. Sistem çalışır çünkü Teknik titizdir. Bu belge, bunu kanıtlamak için vardır.