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.
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.
İÇİNDEKİLER
1. TEKNİK NE YAPAR
Teknik modülü, tüm fabrikanın bağlı olduğu beş soruyu yanıtlar:
- 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.
- 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.
- 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.
- 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.).
- 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.
Kapasite tanımla
Kablo tasarımı
Onaylıları sakla
Kablo seç
Test tanımla
Adımlara ata
Gereksinimleri sakla
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ürasyon | Girdi Kodu |
|---|---|---|
kabatel_cekme_machines | hız, tav (tavlama akımı), çıkış çapı | A |
kalaylama_machines | hız, kalay kalınlığı (μm) | X |
incetel_cekme_machines | hız, girdi sayısı, çıkış çapı, tav | — |
buncher_machines | hız, hatve (büküm uzunluğu), girdi sayısı | Z,T,U |
extruder_machines | hız, izolasyon kalınlığı, kılıf kalınlığı | T,Z |
ebeam_machines | hı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)
| Tablo | Amaç | Anahtar Alanlar |
|---|---|---|
cable_designs | Playground’dan tasarım oturumları | design_code (benzersiz), standard (EN/UL/SLN), cross_section, design_data (JSON) |
design_steps | Tasarım içindeki bireysel üretim adımları | step_number, machine_type, configuration (JSON), inputs/outputs (JSON), tests (JSON) |
cable_database | Tamamlanmış, 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)
| Tablo | Amaç | Anahtar Alanlar |
|---|---|---|
test_standards | Test tanımları | standard_category (IEC-EN/UL/SLN), test_name, standard_number, test_samples |
test_parameters | Test içindeki parametreler | parameter_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
| Tablo | Amaç |
|---|---|
product_codes | Stok 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. |
markings | Kablo baskı şablonları. name (benzersiz) + words (JSON dize dizisi). Her sipariş-kablo bir markayı referans alır. |
production_operators | Operatö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 | Önek | Endpoint | Sorumluluk |
|---|---|---|---|
machine_routes.py | /teknik/machines | ~45 | 7 makine tipi için CRUD + seçenekler |
design_routes.py | /teknik/design | ~22 | Playground oturumları, adımlar, konfig, geri al/yinele, tamamla |
cable_database_routes.py | /teknik/cable-database | ~15 | Onaylı kablolar, ürün kodları, analitik |
standards_routes.py | /teknik/standards | ~12 | Test standartları, parametreler, sonuçlar |
marking_routes.py | /markings | ~6 | Markalama şablonu CRUD |
operator_routes.py | /operators | ~4 | Operatö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.
| Route | Sayfa | Satır | Karmaşıklık |
|---|---|---|---|
| /teknik/dashboard | Dashboard | ~400 | İstatistikler, hızlı işlemler, son tasarımlar |
| /teknik/playground | Cable Playground | ~4.300 | SVG canvas, 6 konfig formu, 3 görünüm, geri al/yinele, otomatik kaydet |
| /teknik/cable-database | Kablo Veritabanı | ~690 | Tablo + 3 sekmeli detay çekmecesi |
| /teknik/machines | Makine Yönetimi | ~730 | 7 makine sekmesi, dinamik formlar |
| /teknik/standards | Standartlar | ~550 | Standart CRUD + parametre formları |
| /teknik/markalama | Markalama | ~370 | Kelime dizili markalama şablonları |
| /teknik/operator-yonetimi | Operatörler | ~280 | Basit 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.
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.
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.
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.
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.
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.
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.
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 Tipi | Ne Yapar | Yapılandırılabilir Parametreler |
|---|---|---|---|
| 1 | Kabatel Çekme | Kalın bakır çubuğu (8mm filmaşin) ince tele çeker | Hız (m/s), TAV (A), Çıkış Çapı (mm) |
| 2 | Kalaylama | Çekilen teli iletkenlik ve korozyon direnci için kalaylar | Hız (m/s), Kalay Kalınlığı (μm) |
| 3 | İncetel Çekme | Teli daha ince çaplara çeker, isteğe bağlı birden fazla girdiden | Hız (m/s), Girdi Sayısı, Çıkış Çapı (mm), TAV (A) |
| 4 | Buncher | Birden fazla teli bir demet (büküm) haline getirir | Hız (m/s), Hatve, Girdi Sayısı, Büküm Yönü (S/Z) |
| 5 | Ekstrü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) |
| 6 | E-beam | Elektron ışını radyasyonuyla izolasyonu çapraz bağlar | Hız (m/s), Radyasyon Seviyesi (kGy) |
| 7 | Aktarma | Kabloyu 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ütun | Tip | Nullable | Varsayılan | Notlar |
|---|---|---|---|---|
id | Integer | Hayır | Otomatik | Birincil anahtar, indeksli |
brand | String(100) | Hayır | — | Makine üreticisi |
model | String(100) | Evet | NULL | Makine model tanımı |
is_active | Boolean | Hayır | True | İndeksli; soft-delete bayrağı |
created_by | Integer | Evet | NULL | FK → users.id |
created_at | DateTime | Hayır | utcnow | Oluşturma zaman damgası |
updated_at | DateTime | Hayır | utcnow | Değişiklikte otomatik güncellenir |
Kabatel Çekme — kabatel_cekme_machines
| Sütun | Tip | Birim | CHECK Kısıtlaması |
|---|---|---|---|
speed_min | Float | m/s | ≥ 0 |
speed_max | Float | m/s | > speed_min |
speed_increment | Float | m/s | > 0 |
tav_min | Float | Amper | ≥ 0 |
tav_max | Float | Amper | > tav_min |
tav_increment | Float | Amper | > 0 |
output_min | Float | mm | > 0 |
output_max | Float | mm | > output_min |
output_increment | Float | mm | > 0 |
input_type | String(50) | — | Varsayılan: '8mm_filmaşin' |
input_code | String(10) | — | Varsayılan: 'A' |
Kalaylama — kalaylama_machines
| Sütun | Tip | Birim | CHECK Kısıtlaması |
|---|---|---|---|
speed_min | Float | m/s | ≥ 0 |
speed_max | Float | m/s | > speed_min |
speed_increment | Float | m/s | > 0 |
thickness_min | Float | μm | > 0 |
thickness_max | Float | μm | > thickness_min |
thickness_increment | Float | μm | > 0 |
input_code | String(10) | — | Varsayılan: 'X' |
İncetel Çekme — incetel_cekme_machines
| Sütun | Tip | Birim | CHECK Kısıtlaması |
|---|---|---|---|
speed_min/max/increment | Float | m/s | Yukarıdakiyle aynı düzen |
input_number_min | Integer | — | ≥ 1 |
input_number_max | Integer | — | ≥ input_number_min |
output_min/max/increment | Float | mm | Yukarıdakiyle aynı düzen |
tav_min/max/increment | Float | Amper | Yukarıdakiyle aynı düzen |
Buncher — buncher_machines
| Sütun | Tip | Birim | CHECK Kısıtlaması |
|---|---|---|---|
speed_min/max/increment | Float | m/s | Aynı düzen |
hatve_min | Float | mm | > 0 |
hatve_max | Float | mm | > hatve_min |
hatve_increment | Float | mm | > 0 |
input_number_min | Integer | — | ≥ 0 |
input_number_max | Integer | — | ≥ input_number_min |
accepted_input_codes | Text | — | Varsayılan: 'Z,T,U' |
Extruder — extruder_machines
| Sütun | Tip | Birim | CHECK Kısıtlaması |
|---|---|---|---|
speed_min/max/increment | Float | m/s | Aynı düzen |
insulation_thickness_min | Float | mm | > 0 |
insulation_thickness_max | Float | mm | > insulation_thickness_min |
insulation_thickness_increment | Float | mm | > 0 |
sheath_thickness_min | Float | mm | > 0 |
sheath_thickness_max | Float | mm | > sheath_thickness_min |
sheath_thickness_increment | Float | mm | > 0 |
accepted_input_codes | Text | — | Varsayılan: 'T,Z' |
E-beam — ebeam_machines
| Sütun | Tip | Birim | CHECK Kısıtlaması |
|---|---|---|---|
speed_min/max/increment | Float | m/s | Aynı düzen |
radiation_level_min | Float | kGy | > 0 |
radiation_level_max | Float | kGy | > radiation_level_min |
radiation_level_increment | Float | kGy | > 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:
- Tam sayı aralıkları (İncetel Çekme & Buncher girdi sayıları): Float adımlama yerine
list(range(min, max + 1))kullanır — çünkü 3.5 girdi tel olamaz. - Sabit kodlanmış değerler (Buncher büküm yönü): Doğrudan
["S", "Z"]döndürür — kablo imalatında sadece iki olası büküm yönü vardır. - Seçenek yok (Aktarma): Hiç
/optionsendpoint’i yoktur — yapılandırılacak bir şey yok.
Ç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)
| Metod | Yol | Yetki | Ne 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}/options | Kimlik doğrulanmış | Min/maks/artış aralıklarından açılır menü değerleri üret. |
POST | /teknik/machines/{type} | super_admin, production_manager | Makine oluştur. created_by atar. Gerçek zamanlı güncelleme yayınlar. |
PUT | /teknik/machines/{type}/{id} | super_admin, production_manager | Kısmi güncelleme. Sadece sağlanan alanlar değişir. |
DELETE | /teknik/machines/{type}/{id} | Sadece super_admin | Kesin silme. 204 No Content döndürür. |
Ortak endpoint’ler
| Metod | Yol | Ne Yapar |
|---|---|---|
GET | /teknik/machines/types | 7 tip adını string dizisi olarak döndürür |
GET | /teknik/machines/all | Tü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 Tipi | Seçenek Alanları |
|---|---|
| Kabatel Çekme | speeds, tavs, output_diameters |
| Kalaylama | speeds, thicknesses |
| İncetel Çekme | speeds, input_numbers (int), output_diameters, tavs |
| Buncher | speeds, hatves, input_numbers (int), twist_directions (sabit S/Z) |
| Extruder | speeds, insulation_thicknesses, sheath_thicknesses |
| E-beam | speeds, 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:
| İşlem | Eski Roller | Granüler Yetki |
|---|---|---|
| Görüntüleme / Listeleme / Seçenekler | Kimliği doğrulanmış herkes | Kimliği doğrulanmış herkes |
| Oluşturma / Güncelleme | super_admin, production_manager | teknik.machines.create / teknik.machines.edit |
| Silme | Sadece super_admin | teknik.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ütun | Genişlik | Notlar |
|---|---|---|
| ID | 60px | Sola sabitli |
| Marka | otomatik | Ellipsis etkin |
| Model | otomatik | Boşsa “-” gösterir |
| Tipe özgü aralıklar | otomatik | “min–maks birim” formatında |
| Durum | 80px | Yeşil “Aktif” / Kırmızı “Pasif” etiket |
| İşlemler | 100px | Sağ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:
- Araç çubuğunda “Yeni Makine Ekle” butonuna tıkla
- “Yeni Makine Ekle” başlıklı modal açılır (600px, bulanık arkaplan)
- Form aktif sekmeye (makine tipine) göre dinamik alanlar gösterir
- Gönderimde:
POST /api/teknik/machines/{type}form değerleriyle - Sistem alanları (
id,created_at,updated_at,created_by,input_type,input_code,accepted_input_codes) otomatik olarak hariç tutulur - Başarıda: “Makine başarıyla eklendi!” bildirimi, modal kapanır, liste yenilenir
Düzenleme:
- İşlemler sütununda düzenle ikonuna tıkla
- “Makine Düzenle” başlıklı modal açılır, mevcut değerlerle doldurulmuş
- Gönderimde:
PUT /api/teknik/machines/{type}/{id}sadece değişen alanlarla - Başarıda: “Makine başarıyla güncellendi!” bildirimi, modal kapanır, liste yenilenir
Silme:
- İşlemler sütununda sil ikonuna tıkla
Popconfirmsorar: “Bu makineyi devre dışı bırakmak istediğinize emin misiniz?”- Makine zaten pasifse sil butonu devre dışıdır
- Onayda:
DELETE /api/teknik/machines/{type}/{id} - 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 Tipi | Form Alanları (Marka/Model dışında) |
|---|---|
| Kabatel Çekme | Hı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) |
| Kalaylama | Hız: min/maks/artış • Kalay Kalınlığı: min/maks/artış (adım 0.1) |
| İncetel Çekme | Girdi Sayısı: min (1), maks (1) • Hız: min/maks/artış • Çıkış Çapı: min/maks/artış (adım 0.01) • Tav: min/maks/artış |
| Buncher | Girdi Sayısı: min (0), maks (1) • Hız: min/maks/artış • Hatve: min/maks/artış (adım 0.1) |
| Extruder | Hı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-beam | Hız: min/maks/artış • Radyasyon Seviyesi: min/maks, artış (adım 1) |
| Aktarma | Yok (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ütun | Tip | Nullable | Kısıtlamalar / Varsayılan | Notlar |
|---|---|---|---|---|
id | Integer | Hayır | PK, indeksli | — |
standard_category | String(50) | Hayır | CHECK: IN (‘IEC-EN’, ‘UL’, ‘SLN’) | Hangi standart kuruluşu |
test_name | String(200) | Hayır | — | Türkçe test adı |
test_name_en | String(200) | Evet | — | İngilizce test adı |
standard_number | String(100) | Evet | — | örn. “EN 50618”, “IEC 60228” |
test_type | String(100) | Evet | — | Serbest metin: Mekanik, Elektriksel, Görsel, Boyutsal |
unit | String(50) | Evet | — | örn. “ohm/km”, “kV”, “N/mm²” |
number_of_values | Integer | Hayır | Varsayılan: 1, CHECK: ≥ 1 | Ölçüm başına kaç değer |
test_samples | Integer | Hayır | Varsayılan: 1, CHECK: ≥ 1 | Kaç numune test edilecek |
test_method | Text | Evet | — | Serbest metin test prosedürü açıklaması |
is_active | Boolean | Hayır | Varsayılan: True, indeksli | Soft-delete bayrağı |
created_by | Integer | Evet | FK → users.id | — |
created_at | DateTime | Hayır | utcnow | — |
updated_at | DateTime | Hayır | utcnow, 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ütun | Tip | Nullable | Kısıtlamalar / Varsayılan | Notlar |
|---|---|---|---|---|
id | Integer | Hayır | PK, indeksli | — |
test_standard_id | Integer | Hayır | FK → test_standards.id, ON DELETE CASCADE | — |
parameter_name | String(100) | Hayır | — | örn. “Çekme Dayanımı”, “Uzama”, “Direnç” |
parameter_unit | String(50) | Evet | — | örn. “N/mm²”, “%”, “ohm/km” |
parameter_order | Integer | Hayır | Varsayılan: 1 | Formlardaki görüntülenme sırası |
is_required | Boolean | Hayır | Varsayılan: True | Test sırasında doldurulmalı |
created_at | DateTime | Hayır | utcnow | — |
Benzersizlik kısıtlaması: (test_standard_id, parameter_name) — tek bir test içinde tekrarlanan parametre adları olmaz.
test_results
| Sütun | Tip | Nullable | Kısıtlamalar / Varsayılan | Notlar |
|---|---|---|---|---|
id | Integer | Hayır | PK, indeksli | — |
test_standard_id | Integer | Hayır | FK → test_standards.id | Hangi test yapıldı |
design_step_id | Integer | Evet | FK → design_steps.id | Sonucu belirli üretim adımına bağlar |
production_session_id | Integer | Evet | — | Üretim oturumuna bağlar |
cable_batch_code | String(50) | Evet | İndeksli | İzlenebilirlik için parti tanımlayıcı |
test_date | DateTime | Hayır | — | Testin yapıldığı tarih |
tested_by | Integer | Hayır | FK → users.id | Testi yapan kişi |
measurements | Text | Hayır | — | Ölçüm verilerinin JSON dizesi |
pass_fail | String(10) | Evet | CHECK: IN (‘PASS’, ‘FAIL’, ‘PENDING’) VEYA NULL | Test sonucu |
notes | Text | Evet | — | Durum güncellemelerinde zaman damgalı eklenir |
created_at | DateTime | Hayır | utcnow | — |
Ö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
kademeli silme
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ı
| Metod | Yol | Yetki | Ne Yapar |
|---|---|---|---|
POST | /teknik/tests | super_admin, lab_user, production_manager | Standart + parametreleri tek işlemde oluştur. Tekrar kontrolü yapar (kategori + ad + numara). Parametre eklemeden önce ID almak için DB flush. |
GET | /teknik/tests | Kimlik 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}/full | Kimlik 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_manager | Standart 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_user | Akıllı silme: sonuçları varsa soft, yoksa hard. |
Test Parametreleri
| Metod | Yol | Yetki | Ne Yapar |
|---|---|---|---|
POST | /teknik/tests/{id}/parameters | super_admin, lab_user, production_manager | Mevcut standarda tek parametre ekle. Tekrar ad kontrolü. |
DELETE | /teknik/parameters/{id} | super_admin, lab_user | Tek parametreyi hard delete. |
Test Sonuçları
| Metod | Yol | Yetki | Ne Yapar |
|---|---|---|---|
POST | /teknik/results | lab_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/results | Kimlik 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}/status | lab_user, super_admin | Geç/kal durumunu güncelle. Denetim izi için zaman damgası ve kullanıcı adıyla notlar ekler. |
Referans Verileri
| Metod | Yol | Dö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:
| Frekans | Türkçe | Anlamı |
|---|---|---|
üretim_başı | Üretim Başı | Üretim başlangıcında test et |
üretim_sonu | Üretim Sonu | Üretim sonunda test et |
her_ikisi | Her İkisi | Hem başında hem sonunda test et |
her_makara_sonu | Her Makara Sonu | Her 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
| İşlem | Eski Roller | Granüler Yetki |
|---|---|---|
| Görüntüleme / Listeleme / Arama | Kimliği doğrulanmış herkes | Kimliği doğrulanmış herkes |
| Oluşturma / Güncelleme | super_admin, lab_user, production_manager | teknik.standards.create / teknik.standards.edit |
| Silme | super_admin, lab_user | teknik.standards.delete |
| Sonuç Oluşturma / Güncelleme | lab_user, super_admin | teknik.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ütun | Genişlik | Notlar |
|---|---|---|
| ID | 60px | Sola sabitli |
| Kategori | 100px | Renk kodlu etiket: IEC-EN mavi, UL yeşil, SLN turuncu |
| Test Adı | otomatik | Türkçe test adı, ellipsis |
| Standart No | 150px | örn. “EN 50618” |
| Test Tipi | 120px | Boşsa “-” gösterir |
| Numune Sayısı | 100px | Ortalanır tam sayı |
| Parametre | 100px | Parametre sayısını gösterir (örn. “3”) |
| Durum | 80px | Yeşil “Aktif” / Kırmızı “Pasif” |
| İşlemler | 100px | Sağ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:
| Alan | Tip | Zorunlu | Notlar |
|---|---|---|---|
| Standart Kategorisi | Select | Evet | Seçenekler: IEC-EN, UL, SLN (Özel) |
| Test Adı (TR) | Input | Evet | Placeholder: “Örn: Çekme Dayanımı” |
| Test Adı (EN) | Input | Hayır | Placeholder: “Örn: Tensile Strength” |
| Standart Numarası | Input | Evet | Placeholder: “Örn: EN 50618” |
| Test Tipi | Select | Hayır | Seçenekler: Mekanik, Elektriksel, Görsel, Boyutsal |
| Numune Sayısı | InputNumber | Hayır | Min: 1 |
| Test Metodu | TextArea | Hayır | 3 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 Adı — Input, placeholder “Parametre Adı (örn: Çekme Dayanımı, Uzama, Direnç)”
- Birim — Input, placeholder “Birim (örn: N/mm², %, ohm/km)”
“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ütun | Tip | Nullable | Kısıtlamalar / Varsayılan | Notlar |
|---|---|---|---|---|
id | Integer | Hayır | PK, indeksli | — |
name | String(100) | Hayır | UNIQUE | Operatörün tam adı |
is_active | Boolean | Hayır | Varsayılan: True | Aktif durum bayrağı |
created_at | DateTime | Hayır | utcnow | — |
updated_at | DateTime | Hayır | utcnow, 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.
| Metod | Yol | Yetki | Ne Yapar |
|---|---|---|---|
GET | /operators/list | Kimlik 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/create | Kimlik 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ı
| Kontrol | Ne Zaman | Hata 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ütun | Nereyi Gösterir | Amacı |
|---|---|---|
operator_id | FK → users.id | Veritabanı bütünlüğü (oturumu başlatan kullanıcı) |
operator_name | String (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
İsimler burada tanımlanır
Operatör seç
Ad oturumda saklanır
Sonsuza kadar korunur
- Oturum Başlatma: Üretim sayfası
GET /operators/list?active_only=trueile operatörleri getirir. Operatör, önceden planlanmış iş kartını başlatmadan önce açılır menüden kendi adını seçer. Başlamak için zorunlu. - Oturum İçi Değişiklik: Operatörler oturum sırasında
POST /production/update-operatorile değiştirilebilir — vardiya değişimleri için kullanışlı. - Yarı Mamul Takibi: Stok sayfaları yarı mamul kayıtlarını onları üreten üretim oturumunun
operator_name’iyle zenginleştirir. - Geçmiş: Üretim geçmişi sayfaları tamamlanan her oturum için operatör adını gösterir.
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ütun | Genişlik | Notlar |
|---|---|---|
| ID | 80px | Sola sabitli |
| Operatör Adı | otomatik | Ellipsis etkin |
| İşlemler | 100px | Sağ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:
| Alan | Tip | Zorunlu | Notlar |
|---|---|---|---|
| Operatör Adı | Input (large) | Evet | Placeholder: “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:
- Oturum öncesi:
UserOutlinedikonluSelectaçılır menü, placeholder “Operatör seçin”,GET /operators/list?active_only=true’den doldurulur. “Üretime Başla” butonunu etkinleştirmek için zorunlu. - Oturum sırasında: Mevcut operatör adını gösteren kart ve oturum içi değişiklikler için tüm operatörleri tıklanabilir kartlar olarak listeleyen bir modal açan “Değiştir” butonu.
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ütun | Tip | Kısıtlamalar | Amaç |
|---|---|---|---|
id | Integer | PK, otomatik artış, indeksli | Benzersiz tanımlayıcı |
name | String(200) | UNIQUE, NOT NULL, indeksli | Şablon adı (ör. “SOLEN BEAM Standard”) |
words | JSON | NOT NULL | Sıralı string dizisi — kabloya basılan kelimeler |
is_active | Boolean | NOT NULL, varsayılan true | Soft delete bayrağı. Pasif markalamalar sipariş açılır menülerinde gizlenir. |
created_at | DateTime(tz) | sunucu varsayılanı now() | Oluşturma zaman damgası |
updated_at | DateTime(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
- UNIQUE isim: İki markalama şablonu aynı ismi paylaşamaz. Hem veritabanı seviyesinde (unique index) hem de uygulama seviyesinde (oluşturma/güncelleme öncesi tekrar kontrolü) uygulanır.
- Foreign key yok:
markingstablosunda FK yoktur. Bunun yerine Sipariş modülündekiorder_cables.marking_idbu tabloya referans verir. İlişki tüketici tarafındadır, burada tanımlanmamıştır.
6.4.2 API Endpoint’leri
/api/teknik/markings altında altı endpoint:
| Metod | Yol | Yetki | Ne Yapar |
|---|---|---|---|
POST | /markings/create | super_admin + teknik.markalama.create_marking | Şablon oluştur. Tekrar isim kontrolü. name + words dizisi saklar. |
GET | /markings/list | Kimlik 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_marking | Kısmi güncelleme. İsim değişirse çakışma kontrolü. Sadece sağlanan alanlar değişir. |
DELETE | /markings/{id}/hard-delete | super_admin + teknik.markalama.delete_marking | Kalıcı silme. Bu endpoint’te soft delete yok. |
PUT | /markings/{id}/toggle-status | Kimlik doğrulanmış | is_active’i true/false arasında değiştir. Kimlik doğrulama dışında yetki kontrolü yok. |
Doğrulama Detayları
| Kontrol | Nerede | Detaylar |
|---|---|---|
| İsim zorunlu | Şema (min_length=1) | Pydantic boş stringleri reddeder |
| İsim maks uzunluk | Şema + DB | Pydantic’te max_length=200, SQLAlchemy’de String(200) |
| Kelimeler boş değil | Şema validator | Özel @validator('words') ile len(v) > 0 kontrolü |
| Tekrar isim | Route handler | Oluşturmadan önce DB sorgusu. Güncellemede kendisini hariç tutar (Marking.id != marking_id) |
| Var mı kontrolü | Route handler | Get/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ı
| Şema | Alanlar | Kullanan |
|---|---|---|
MarkingCreateRequest | name: str, words: List[str] (min 1 öge) | POST oluştur |
MarkingUpdateRequest | name?: str, words?: List[str], is_active?: bool | PUT güncelle (kısmi için hepsi opsiyonel) |
MarkingResponse | id, name, words, is_active, created_at, updated_at | Tüm yanıtlar |
MarkingListResponse | success: bool, data: List[MarkingResponse], message: str | Tanı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şken | Ne Olur | Örnek |
|---|---|---|
{CABLE_SIZE} | Siparişten kablo kesiti | 4mm² |
{ORDER_NO} | Sipariş numarası | SLN-2025-0042 |
{YEAR} | Üretim yılı | 2025 |
{METER} | Kablo üzerinde sayılan metre işareti | 150 |
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
| İşlem | Rol Kontrolü | Yetki Anahtarı |
|---|---|---|
| Görüntüleme / Listeleme / Arama | Kimliği doğrulanmış herkes | Kimliği doğrulanmış herkes |
| Oluşturma | super_admin | teknik.markalama.create_marking |
| Güncelleme | super_admin | teknik.markalama.update_marking |
| Silme | super_admin | teknik.markalama.delete_marking |
| Durum Değiştirme | Kimliği doğrulanmış herkes | Ek 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:
access_page— Markalama sayfasını görüntüleyebilirview_markings— Markalama listesini görebilircreate_marking— Yeni markalama ekleyebiliredit_marking— Mevcut marklamaları düzenleyebilirdelete_marking— Marklamaları kalıcı olarak silebilir (kritik)
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ütun | Genişlik | Özellikler |
|---|---|---|---|
| 1 | İsim | 250px | Sola sabit. Sıralanabilir (localeCompare). Birincil tanımlayıcı. |
| 2 | Kelime Sayısı | 120px | Hesaplanmış: words JSON/dizi ayrıştırılır, .length döndürür. Kelimelerin kendisi değil. |
| 3 | Durum | 100px | Aktif için yeşil <Tag>, Pasif için kırmızı. |
| 4 | İşlemler | 100px | Sağ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ı
<Input>ile yer tutucu “ör: SOLEN BEAM Standard”- Zorunlu doğrulama
2. Kelimeler (Dinamik Liste)
- Dinamik ekleme/kaldırma için Ant Design
<Form.List>kullanır - Her kelime numaralı satırdır:
1.,2.,3.… 550px genişlikte giriş - Minimum 1 kelime özel validator ile zorunlu
- Kırmızı
<MinusCircleOutlined>ile kelime kaldırma (sadece 1 kelime kaldığında gizlenir) - Altta kesikli “Kelime Ekle” butonu ile yeni satır ekleme
- Oluşturmada bir boş kelime slotu ile başlar
- Düzenlemede mevcut tüm kelimeleri ön doldurur
- Etiket’te değişken ipucu metni: “Değişkenler: {CABLE_SIZE}, {ORDER_NO}, {YEAR}, {METER}”
CRUD Akışı
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 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:
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)
| # | Makine | Giriş | Çıkış | Temel Parametreler |
|---|---|---|---|---|
| 1 | Kabatel Çekme | 8mm filmaşin (ham bakır) | Çekilmiş tel (ör. 1.8mm) | output_diameter, speed, tav, adet |
| 2 | Kalaylama | KC’den çekilmiş tel | Kalaylanmış tel (ör. 21 adet) | tin_thickness, speed, adet (kritik!) |
| 3 | İncetel Çekme | KL’den kalaylanmış tel | İnce tel demetleri (ör. 10×0.30mm) | input_number, output_diameter, output_number, tav |
| 4 | Buncher | IC / diğer BN / EX’den ince teller | Bükülmüş tel | dinamik girişler (+ekle), hatve, büküm yönü (S/Z) |
| 5 | Extruder | BN / diğer EX’den bükülmüş tel | İzoleli/kılıflı kablo | insulation_thickness, sheath_thickness, katalizör, boya |
| 6 | E-beam | Ekstrüde kablo (katalizörsüz!) | Çapraz bağlı kablo | radiation_level, speed (üretim zamanında belirlenir) |
Makine Akış Kısıtlamaları
Her makine her makineden sonra gelemez. Sistem yönlü bir graf uygular:
Kritik döngü yetenekleri:
- Buncher → Buncher: Çok aşamalı bükme (bükülmüş tel tekrar bükülebilir)
- Extruder → Extruder: Çok katmanlı ekstrüzyon (önce izole, sonra kılıf)
- Extruder → Buncher: Çok damarlı kablolar (tek damarları izole et, birlikte bük, sonra kılıfla)
# 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:
| Dosya | Satır | Amaç |
|---|---|---|
design_routes.py | 1.155 | API endpoint’ler — oturum, adımlar, konfigürasyon, geri al/yinele, otomatik kaydetme, sonlandırma |
playground_session.py | 986 | Oturum yöneticisi — adım yaşam döngüsü, geri al/yinele yığınları, checkpoint/geri yükleme |
progression_manager_v2.py | 995 | Miktar takibi — girişleri tüket, çıkışları üret, makine bazlı işleme |
db_integration.py | 446 | Gerçek makine verileri — makine tablolarını okur, kapasite kesişimi hesaplar |
form_integration.py | 339 | Form doldurma — makine türüne göre açılır menü verileri oluşturur |
validation_engine.py | 465 | Konfigürasyon doğrulama — değerleri makine kapasitelerine karşı kontrol eder |
code_generator.py | 291 | Deterministik ürün kodları — SHA256 hash + okunabilir kodlar |
playground_configs.py | 446 | Pydantic ş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:
- session_id: UUID v4
- standard: EN / UL / SLN (oturum başlangıcında seçilir)
- cross_section: ör. “6mm²” (oturum başlangıcında seçilir)
- steps:
DesignStepdataclass örneklerinin listesi - progression: Tüm öğeleri takip eden
ProgressionManagerörneği - history_stack / redo_stack: Geri al/yinele için
StateSnapshotlisteleri (maks 50) - autosave: varsayılan olarak açık, 30 saniyelik aralık, kaydedilmemiş değişiklikleri izler
İ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:
- Oturum her zaman bir öğeyle başlar:
RAW_COPPER_8MM(8mm filmaşin, miktar 1) - Bir adım öğe tükettiğinde miktarları azalır. 0’a düştüğünde durum
inactiveolur. - Bir adım öğe ürettiğinde yeni
ProgressionItem’lar oluşturulup eklenir. - Her makine türünün tüketim/üretim mantığını yöneten kendi
process_*metodu vardır. - Aynı kodlu öğeler birleştirilir (miktar toplanır) — paralel süreç çıkışları hariç.
Miktar Takibi Örneği — 6mm² Kablo
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:
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
| Metod | Yol | Ne Yapar |
|---|---|---|
POST | /playground/start | Standart + kesit ile oturum başlat. session_id + başlangıç durumu döner. |
GET | /playground/{id}/state | Tam oturum durumunu al (adımlar + ilerleme + özet). |
Adım Yönetimi
| Metod | Yol | Ne Yapar |
|---|---|---|
POST | /playground/{id}/steps/add | Makine 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)
| Metod | Yol | Ne Yapar |
|---|---|---|
GET | /playground/{id}/form-data/kabatel-cekme | Makineler, sabit giriş (8mm), standarda uygun testler |
GET | /playground/{id}/form-data/kalaylama | Makineler, ilerlemeden girişler (KC çıkışları), testler |
GET | /playground/{id}/form-data/incetel-cekme | Makineler, max_quantity ile kalaylı girişler, makine giriş limitleri |
GET | /playground/{id}/form-data/buncher | Makineler, miktarlı Z/T/U kodlu girişler, büküm yönleri |
GET | /playground/{id}/form-data/extruder | Makineler, T/U kodlu girişler, katman seçenekleri (izolasyon/kılıf + katalizör/boya) |
GET | /playground/{id}/form-data/ebeam | Makineler, sadece katalizörsüz ekstrüder çıkışları |
Makine Konfigürasyonu (türe göre)
| Metod | Yol | Ne 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}/edit | Zaten konfigüre edilmiş adımı düzenle (geri al + yeniden uygula) |
Kapasite Kesişimi
| Metod | Yol | Ne 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
| Metod | Yol | Ne Yapar |
|---|---|---|
POST | /playground/{id}/undo | Geçmiş yığınından çıkar, mevcut durumu yinele yığınına it |
POST | /playground/{id}/redo | Yinele yığınından çıkar, mevcut durumu geçmiş yığınına it |
GET | /playground/{id}/history | Geri alınabilir mi? Yinelenebilir mi? Yığın boyutları. |
POST | /playground/{id}/autosave | Oturum durumunu kaydet, kaydedildi olarak işaretle |
GET | /playground/{id}/autosave-status | Açık mı, aralık, son kaydetmeden bu yana geçen saniye |
PUT | /playground/{id}/autosave-settings | Aç/kapat, aralığı değiştir |
Doğrulama & Sonlandırma
| Metod | Yol | Ne 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}/finalize | Tasarı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 | Şema | Alanlar (sırasıyla) |
|---|---|---|
| Kabatel Çekme | KabatelCekmeConfig | alternative_machines, input_type (sabit), output_diameter, speed, tav, adet, tests |
| Kalaylama | KalaylamaConfig | alternative_machines, input_item_id, tin_thickness, speed, adet, tests |
| İncetel Çekme | IncetelCekmeConfig | alternative_machines, input_item_id, input_number, output_diameter, speed, tav, output_number, tests |
| Buncher | BuncherConfig | alternative_machines, inputs (List[BuncherInputBlock]), adet, speed, hatve, twist_direction, tests |
| Extruder | ExtruderConfig | alternative_machines, inputs (ikiz için 1+), insulation_*, sheath_*, speed, tests. Adet yok (her zaman 1). |
| E-beam | EbeamConfig | alternative_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 malzeme | RAW_XX_spec | RAW_COPPER_8MM |
| Yarı mamul | MC_spec | KC_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ışı
Makine Konfigürasyon Akışı
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):
- “Oturum Başlat” butonuna tıkla → Modal standart (EN/UL/SLN) ve kesit sorar
POST /playground/start→ Bellekte oturum oluşturulur, ilerleme panelinde başlangıç girdisi olarak 8mm filmaşin belirir- Kütüphaneden makineyi canvas’a sürükle →
POST /playground/steps/add→ oturuma adım eklenir - Makine düğümüne tıkla →
GET /playground/form-data/{tür}→ ConfigurationDrawer açılır (1.215 satırlık bileşen) - 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 - Konfigürasyon formunu doldur →
POST /playground/configure/{tür}/{adım}→ ilerleme paneli yeni çıktılar + miktarlarla güncellenir - Her üretim makinesi için 3–6 adımları tekrarla (KC → KL → IC → BN → EX → isteğe bağlı E-beam)
- Sistem
POST /playground/autosaveile otomatik kaydeder (her değişiklik geri al/yinele için bir kontrol noktası oluşturur) - “Sonlandır” butonuna tıkla →
POST /playground/finalize→ atomik veritabanı işlemicable_designs,design_stepsvecable_databasetablolarına aynı anda yazar. Deterministik SHA-256 kod üretilir. Oturum yok edilir.
Oku (Oturumu Devam Ettir):
- Mevcut oturumlar bellekte kalır. Sayfayı yenile →
GET /playground/statusaktif oturum kontrol eder - Oturum varsa: canvas son kontrol noktasından tam ilerleme durumuyla geri yüklenir
Geri Al / Yinele (Oturum İçi):
- Geri Al’a tıkla →
POST /playground/undo→ oturum önceki kontrol noktasına geri döner - Yinele’ye tıkla →
POST /playground/redo→ oturum sonraki kontrol noktasına ilerler - 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):
- Canvas’taki makine düğümüne sağ tıkla → “Kaldır”
POST /playground/steps/remove→ adım oturumdan kaldırılır, ilerleme yeniden hesaplanır, kontrol noktası oluşturulur- 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:
| Tablo | Ne Kaydedilir |
|---|---|
cable_designs | Tasarım meta verileri: kod, ad, standart, kesit, tam JSON design_data, onay durumu, oluşturan |
design_steps | Her üretim adımı: step_number, machine_type, parallel_group, machine_ids, girişler/çıkışlar/konfigürasyon/testler JSON olarak |
cable_database | Sonlandı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ütun | Tür | Amaç |
|---|---|---|
id | Integer PK | Benzersiz ID |
design_code | String(50) UNIQUE | Üretilen kod |
design_name | String(200) | İsteğe bağlı ad |
standard | String(50), CHECK IN (EN, UL, SLN) | Kablo standardı |
cross_section | String(50) | ör. “6mm²” |
design_data | Text (JSON) | Tam oturum durumu |
is_approved | Boolean | Basitleştirilmiş iş akışında otomatik onaylı |
is_active | Boolean | Geçici silme |
created_by / approved_by | Integer FK → users | Kullanıcı takibi |
design_steps
| Sütun | Tür | Amaç |
|---|---|---|
id | Integer PK | Benzersiz ID |
design_id | Integer FK → cable_designs (CASCADE) | Üst tasarım |
step_number | Integer | Sıralı konum |
is_parallel / parallel_group | Boolean / Integer | Paralel işleme desteği |
machine_type | String(50) | kabatel_cekme, kalaylama vb. |
machine_ids | Text | Virgülle ayrılmış alternatif makine ID’leri |
configuration | Text (JSON) | Tam makine konfigürasyonu |
inputs / outputs / tests | Text (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ütun | Tür | Amaç |
|---|---|---|
id | Integer PK | Benzersiz ID |
design_id | Integer FK → cable_designs | Kaynak tasarım |
cable_code | String(100) UNIQUE, indeksli | Her yerde kullanılan benzersiz kablo tanımlayıcısı |
standard | String(50) | EN, UL, SLN |
cable_type | String(200) | ör. “EN 6mm² Klasik Kablo” |
cross_section | String(50) | ör. “6mm²” |
structure_formula | Text | Tam yapı notasyonu |
production_flow | Text (JSON) | Konfigürasyonlarla adım adım üretim dizisi |
half_products | Text (JSON) | Özelliklerle tüm ara ürünler |
raw_materials | Text (JSON) | Gerekli hammaddeler (A=Bakır, B=Kalay, C=Plastik, D=Katalizör, E=Boya) |
test_requirements | Text (JSON) | Frekanslarla her adımda atanmış testler |
is_active | Boolean | Geçici silme |
product_codes — Stok Yönetimi Köprüsü
| Sütun | Tür | Amaç |
|---|---|---|
system_code | String(100) UNIQUE | Okunabilir kod (KC_18, BN_73X030) |
spec_hash | String(256) UNIQUE | Spesifikasyonların SHA256’sı (deterministik) |
product_type | String(50) | raw / half / final |
machine_type | String(50) | Hangi makine üretir |
display_name_tr / en | String(200) | Türkçe/İngilizce görüntüleme adları |
used_in_designs | Text (JSON) | Bu ürünü kullanan kablo kodları dizisi |
stock_level | Float | Mevcut stok miktarı |
6.6.3 Kablo Veritabanı API — 15+ Endpoint
| Metod | Yol | Yetki | Ne Yapar |
|---|---|---|---|
GET | /cable-database | Doğ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}/full | Doğrulanmış | Malzeme hesaplayıcı için eksiksiz ham veri. TÜM özelliklerle half_products döner. |
GET | /cable-database/{kod}/production-flow | Doğrulanmış | Adım adım üretim dizisi. |
GET | /cable-database/{kod}/half-products | Doğrulanmış | Tüm ara ürünler. |
GET | /cable-database/{kod}/requirements | Doğrulanmış | Hammaddeler + test gereksinimleri. |
GET | /cable-database/{kod}/parsed-structure | Doğrulanmış | Sipariş formları için ekstrüzyon adımlarına ayrıştırılmış yapı. |
PUT | /cable-database/{kod}/deactivate | super_admin, üretim_müdürü | Geçici silme (is_active=false). |
DELETE | /cable-database/{kod}/permanent | super_admin | Kablo + ilişkili tasarımı kalıcı sil. Gerçek zamanlı güncelleme yayınlar. |
GET | /products/codes | Doğrulanmış | Filtrelerle tüm ürün kodlarını listele. |
GET | /products/{kod}/usage | Doğrulanmış | Hangi kablolar bu ürünü kullanıyor + stok seviyesi. |
PUT | /products/{kod}/stock | super_admin, üretim_müdürü, operatör | Stok seviyesini güncelle. |
GET | /analytics/common-products | Doğrulanmış | 2+ kabloda kullanılan ürünler (stok optimizasyonu). |
GET | /analytics/production-efficiency | Doğ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):
- Kullanıcı Playground’da tasarımı sonlandırır →
POST /playground/finalize - Backend fiziksel özelliklerin SHA-256 hash’i ile deterministik kablo kodu üretir
- Kod zaten varsa: sonlandırma reddedilir (aynı kablo zaten kayıtlı)
- Kod yeniyse: atomik işlem
cable_designs+design_steps+cable_databasesatırlarını tek seferde yazar teknikodasına WebSocket yayını → tüm bağlı kullanıcılarda Kablo Veritabanı tablosu yenilenir
Oku:
- /teknik/kablo-veritabani sayfasını aç →
GET /cable-database→ ProTable tüm kabloları display_name, cable_code, standart, kesit, durum ile listeler - İstemci tarafı arama kablo kodu, tür veya kesite göre filtreler
- 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
- Üretim Akışı:
- 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):
- Tablo satırındaki devre dışı bırakma ikonuna tıkla (
super_adminveyaproduction_manageryetkisi gerekir) - Onay diyalogu uyarısı
PUT /cable-database/{kod}/deactivate→is_active = falseolarak ayarlanır- Kablo varsayılan liste görünümlerinden kaybolur (
active_only=falsefiltresiyle 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:
- Kalıcı silme ikonuna tıkla (yalnızca
super_adminyetkisi gerekir) - Güçlü uyarı metniyle onay diyalogu
DELETE /cable-database/{kod}/permanent- Backend cable_database kaydını + ilişkili cable_designs + design_steps’i siler (cascade)
- WebSocket yayını → tüm bağlı kullanıcılarda tablo yenilenir
- 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ı):
- Ürün kodları görünümüne git →
GET /products/codes - Üründe stok düzenle’ye tıkla →
PUT /products/{kod}/stock(super_admin,production_managerveyaoperatorgerekir) - O yarı mamul/nihai ürün için stock_level alanını günceller
- 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üm | Alt Modül | Derinlik | Ana Çıkarım |
|---|---|---|---|
| 6.1 | Makine Yönetimi | Tam | Kapasite-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.2 | Standartlar & Testler | Tam | Üç katmanlı hiyerarşi (standart → test grubu → bireysel test) ile çoklu standart atamaları |
| 6.3 | Operatör Yönetimi | Tam | Çift depolama deseni: bütünlük için tam sayı FK + join’siz görüntüleme için denormalize ad |
| 6.4 | Markalama | Tam | Modüller arası veri akışı: marking_id sipariş → iş kartı → üretim planlama → operatör ekranı boyunca ilerler |
| 6.5 | Kablo Tasarım | Kapsamlı | Bellek içi oturumlar, atomik checkpoint’ler, miktar takibi ve makine akış kısıtlamaları ile üretim simülasyon motoru |
| 6.6 | Kablo 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
7.4 Teknik Fabrikayı Nasıl Besler
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.