SF / Boot Sequence SIGNAL FORGE Initializing portfolio interface
Ali Kılıçarslan Signal Forge / 2026

← Projelere dön

Mekanik Sayaç Saha Takip Sistemi

Sayaç değişim işlerini ofisten sahaya kadar tek yerde yöneten sistem

Kurum
ASKİ Genel Müdürlüğü · Abone İşleri Dairesi Başkanlığı
Yıl
2026
Durum
Tamamlandı
Rolüm
Mobil uygulamanın geliştirilmesi ve saha sürecinin iyileştirilmesi
Ekip
Ali Kılıçarslan · Mustafa Doğan · Yasin Anıl Özalpay
  • Mobil
  • CBS ve Saha
  • Kurumsal Sistemler
  • Veritabanı

01 Proje ne yapıyor?

Sayaç değişim işlerini başvurudan ofis kontrolüne kadar tek yerde yöneten web ve mobil sistem. Görevler ekiplere atanır; personel işi fotoğraf, konum ve sayaç bilgileriyle tamamlar.

02 Hangi sorunu çözüyor?

İşler kâğıt listelerle takip edildiği için görevin kimde olduğu ve ne zaman bittiği anlık görülemiyordu. Yanlış sayaç veya eksik kayıtlar çoğu zaman iş bittikten sonra fark ediliyordu.

03 Ben ne yaptım?

Mobil uygulamanın geliştirilmesi ve saha sürecinin iyileştirilmesi.

Teknik ayrıntılar İsteyenler için

Yaptığım çalışmalar

  • Flutter tabanlı mobil saha uygulamasının geliştirilmesi
  • Çevrimdışı çalışma, yerel kuyruk (outbox) ve senkronizasyon tasarımı
  • Görev, form, stok, fotoğraf ve konum akışlarının analizi ve ekran tasarımı
  • API sözleşmesinin doğrulanması ve API ekibine değişiklik taleplerinin hazırlanması
  • Gerçek cihaz üzerinde işlevsel test, saha pilotu ve kök neden analizi raporlaması

Sistem nasıl çalışıyor?

  1. 01 Mobil istemci Flutter · katmanlı yapı: app (tema, yönlendirme), core (ağ, konum, fotoğraf, senkron, depolama), features (auth, dashboard, görevler, görev detayı, form, stok, senkron, ayarlar), shared bileşenler
  2. 02 Yerel depolama SQLite / Drift · görev durumu, taslak form, fotoğraf kaydı, stok rezervasyonu ve outbox kayıtları uygulama yeniden başlasa da korunur
  3. 03 Senkronizasyon Outbox deseni · form doğrudan API'ye gitmez, önce yerel kuyruğa yazılır; her kayıt cihaz + görev + zaman damgası + UUID biçiminde benzersiz anahtar taşır
  4. 04 API katmanı ASP.NET Core · kimlik doğrulama, görev/stok çekme, form gönderimi, fotoğraf yükleme
  5. 05 Veritabanı Oracle · başvuru havuzu view'ı, saha mobil ek veri tablosu ve işlemi tamamlayan stored procedure

Kullanılan araçlar

  • Flutter
  • Dart
  • SQLite / Drift
  • Dio
  • ASP.NET Core
  • Oracle
  • PL/SQL
  • JWT
  • GPS / konum
  • Kamera (çoklu fotoğraf)
  • Bluetooth termal yazıcı

Alınan önemli kararlar

Form gönderimi hiçbir zaman doğrudan API'ye gitmez

Usta "gönder" dediğinde istek ağa çıkmaz; önce yerel outbox kaydı oluşur. Görev tamamlanmış sayılır, kayıt senkron ekranında bekleyen olarak görünür. Böylece şebekesiz bir bodrumda çalışan personel işine devam edebilir, veri de kaybolmaz.

Her kayıt benzersiz bir idempotency anahtarı taşır

Anahtar `cihaz + görevId + zaman damgası + uuid` biçiminde üretilir. Aynı kayıt tekrar gönderildiğinde sunucu tarafında çift işlem oluşmaması için bu anahtar esas alınır — mobil tarafta tekrar denemeyi güvenli hâle getiren şey budur.

Stok üç aşamalı durum makinesiyle izlenir

Seçilen sayaç/mühür önce `reserved`, form gönderime alındığında `usedPending`, senkron başarıyla tamamlandığında `synced` olur. Bu ayrım olmadan, gönderilmemiş bir işin stoğu düşmüş görünür ve depo sayımı tutmaz.

Form tamamlama tek bir veritabanı işlemi içinde kapanır

Görev durumu, stok hareketi, form sonucu, taslak silme ve outbox yazımı ayrı ayrı başlatıldığında uygulama o an kapanırsa görev tamamlanıp kayıt kuyruğa girmeyebilir. Bu adımlar tek transaction içine alındı; arayüz ancak commit sonrası başarı gösteriyor.

Karşılaşılan zorluklar

Çevrimdışıyken senkron "başarılı" görünüyordu

İşlevsel testte Wi-Fi tamamen kapalıyken "Hepsini Gönder" işlemi bütün kayıtları başarılı işaretliyordu. Veritabanı kanıtı nettti: outbox, görev ve stok kayıtları `synced` olmuş, buna karşılık fotoğraf kayıtları hâlâ `local` durumdaydı. Kök neden, senkron fonksiyonunun ağ çağrısı yapmadan yalnızca gecikme sonrası kayıtları işaretlemesiydi. Mock ve gerçek senkron kesin olarak ayrıldı; gerçek modda sunucu onayı olmadan hiçbir kayıt `synced` yazılmıyor.

Prosedür commit ediyor, API telafi edemiyordu

Saha pilotunda tamamlanan işler mobilde sürekli hata veriyordu. İnceleme, veritabanı prosedürünün işlem sonunda kendi içinde commit ettiğini gösterdi. API ise atamayı ayrı bir transaction ile yönetiyor, hata durumunda yalnızca kendi satırını geri alabiliyordu. Prosedür asıl sayaç işlemini kalıcı yazdığı için telafi adımı etkisiz kalıyor, tekrar denemeler ise "kayıt artık bekleyen listede yok" hatasına düşüyordu. Bulgu canlı kayıt kanıtıyla belgelenip sorumlu katman API transaction/telafi tasarımı olarak raporlandı.

Sekmeler değişen veriyi göstermiyordu

Form tamamlandıktan sonra senkron sekmesi "gönderilecek kayıt yok", görevler sekmesi ise eski durumu göstermeye devam ediyordu; uygulama yeniden başlatılınca doğru görünüyordu. Neden, sekme içeriklerinin sabit oluşturulup durum değişikliğini dinlememesiydi. Sayfalar durumu dinleyecek şekilde bağlandı ve sekme değişimi ile senkron sonrası için test eklendi.

GPS süresiz bekliyordu

Çevrimdışı ve son bilinen konumu olmayan cihazda konum isteği 8 saniyeden uzun süre sonuç vermedi, rota ekranındaki yükleniyor göstergesi kalıcı hâle geldi. Konum istekleri zaman aşımı ve kullanıcıya görünür durum göstergesiyle sınırlandırıldı.

Ek sonuç notları

  • Gerçek cihaz üzerinde (PM95, Android 13) tam saha akışı doğrulandı: giriş, görev listesi, görev detayı, form, dört fotoğraf, konum, stok seçimi, tamamlama, rota, senkron ve ayarlar.
  • Taslak form, fotoğraf, konum ve stok rezervasyonu uygulama yeniden başlatıldıktan sonra eksiksiz geri geldi — yerel kalıcılık doğrulandı.
  • Teslim öncesi otomatik doğrulama: `flutter analyze` temiz, `flutter test` 44/44 başarılı, release APK üretildi, API release derlemesi 0 hata 0 uyarı.
  • Saha pilotunu bloke eden hatanın kök nedeni canlı kayıt kanıtıyla tespit edilip API ekibine somut değişiklik talebi olarak iletildi.

Teknik öğrenimler

  • Sessiz başarı, gürültülü hatadan tehlikelidir. Gönderilmemiş kaydı "gönderildi" göstermek, kullanıcının sisteme güvenini tek seferde bitirir.
  • Mock ile gerçek davranış aynı kod yolunu paylaşmamalı. Demo kolaylığı için yazılan kısa yol, üretimde veri kaybı algısına dönüşüyor.
  • Kök neden analizi için üretim veritabanına yazmaya gerek yok; yalnızca okuma sorgularıyla da kanıt zinciri kurulabilir.

04 Ortaya çıkan sonuç

Saha çalışanları görevlerini telefondan tamamlayabiliyor. İnternet kesildiğinde bilgiler kaybolmadan saklanıyor ve bağlantı geri geldiğinde gönderiliyor.

05 Bu projeden ne öğrendim?

Bir saha uygulamasında kullanıcıya doğru durumu göstermek, yeni özellik eklemek kadar önemlidir.