• 03-06-2024, 10:26:03
    #1
    Selamun Aleyküm Arkadaşlar.

    Otomatik dağıtım yapan bir sistem yapmaya çalışıyorum. Sistemin mantığı şöyle; Sisteme otomatik olarak müşteri formları düşüyor. Sistemde pek çok sayıda satış danışmanı var. Bu satış danışmanlarına konuştukları dile göre gelen müşteri formlarının dağıtımını yapmak istiyorum. Sistem dağıtım yaparken aynı zamanda en son dağıtımda en son formu alan kişiyi dikkate alarak form dağıtacak. Yani son form alana yeni dağıtımda ilk formu vermemeli. Bu şekilde bir yapı kurmayı çalışıyorum. Mantık ve yapı olarak yardımcı olabilirseniz sevinirim.
  • 03-06-2024, 10:30:56
    #2
    En son hangi temsilciye hangi koşul ile dağıtım yaptığınızı başka bir tabloda tutup ona göre hareket etmeniz gerekiyor. Ayrıca kullanıcıları gruplandırıp (takım olarak, mesela "ingilizce" takımı) kuyruklamayı gruplar üzerinden yapabilirsiniz. Tablo şöyle olabilir:
    temsilci_id
    takım_id
    Sonra temsilcileri ID ye göre sıralı alın, son otomatik temsilci_id 'den daha yeni bir temsilci_id yoksa ilk sıradakine gönderin, aksi halde sıradaki ilk ID ye gönderin
  • 03-06-2024, 10:35:02
    #3
    Anladığım kadarıyla son data alan kişiyi (diline göre) bir tabloda tutup daha sonra işlem yaparken o koşula göre hareket et diyorsunuz. Ama burada şöyle bir dezavantaj ortaya çıkıyor. Diyelim ki 6 tane satış danışmanı var. Formlar bir bir belirli aralıklarla sisteme düşüyor. Bu mantığa göre o zaman formlar listedeki ilk satış danışmanı ile son data alan arasında gidip gelecek, aradaki satış danışmanları hiç form alamayacak.
  • 03-06-2024, 10:40:18
    #4
    Hocam her form geldiğinde ilgili gruptan son form alan kişi zamanına bakarım en eski olana formu atarım. Örneğin ingilizce form geldi, ingilizce grubuna bakarım 10 kişi var, bunlar aktif pasif mola durumu varmı bilmiyorum aktif olanlara bakarım, sonra da zamana bakarım en son formu en eski tarihte veya saatte alana iş ataması yaparım
  • 03-06-2024, 10:52:38
    #5

    Mantık ve Yapı

    1. Veritabanı Yapısı:
      • Müşteri Formları Tablosu (CustomerForms):
        • FormID (birincil anahtar)
        • FormContent (formun içeriği)
        • Language (formun dili)
        • AssignedTo (formun atandığı satış danışmanı)
      • Satış Danışmanları Tablosu (SalesAgents):
        • AgentID (birincil anahtar)
        • Name (danışmanın adı)
        • Languages (danışmanın konuştuğu diller)
        • LastAssignedTime (son form atama zamanı)
    2. Algoritma:
      • Yeni Form Geldiğinde:
        1. Yeni formun dilini belirle.
        2. Belirtilen dili konuşan satış danışmanlarını seç.
        3. Seçilen satış danışmanları arasında, en son form alan kişiyi sona alacak şekilde sırala.
        4. İlk sıradaki satış danışmanına formu ata.
        5. Atamanın ardından, atama zamanını ve formun atandığı kişiyi güncelle.
    3. Algoritmanın Adımları:
    4. import datetime
      
      # Örnek veri yapıları
      customer_forms = [
          {"FormID": 1, "FormContent": "İçerik 1", "Language": "Türkçe", "AssignedTo": None},
          {"FormID": 2, "FormContent": "İçerik 2", "Language": "İngilizce", "AssignedTo": None},
          # Diğer formlar
      ]
      
      sales_agents = [
          {"AgentID": 1, "Name": "Ahmet", "Languages": ["Türkçe"], "LastAssignedTime": None},
          {"AgentID": 2, "Name": "John", "Languages": ["İngilizce"], "LastAssignedTime": None},
          {"AgentID": 3, "Name": "Mehmet", "Languages": ["Türkçe", "İngilizce"], "LastAssignedTime": None},
          # Diğer danışmanlar
      ]
      
      def assign_form_to_agent(form):
          # Formun dilini al
          form_language = form["Language"]
      
          # Belirtilen dili konuşan danışmanları filtrele
          available_agents = [agent for agent in sales_agents if form_language in agent["Languages"]]
      
          # Danışmanları en son atama zamanına göre sırala
          available_agents.sort(key=lambda x: (x["LastAssignedTime"] is not None, x["LastAssignedTime"]))
      
          # İlk sıradaki danışmana formu ata
          assigned_agent = available_agents[0]
          form["AssignedTo"] = assigned_agent["AgentID"]
          assigned_agent["LastAssignedTime"] = datetime.datetime.now()
      
          return assigned_agent["AgentID"]
      
      # Örnek kullanım
      for form in customer_forms:
          assigned_agent_id = assign_form_to_agent(form)
          print(f"Form ID {form['FormID']} assigned to Agent ID {assigned_agent_id}")
    5. 4.Sistem Akışı:
      • Sistem, yeni bir müşteri formu geldiğinde assign_form_to_agent fonksiyonunu çağırır.
      • Formun diline uygun danışmanlar bulunur ve en son form alan danışman en sona alınarak sıraya konur.
      • En üstteki danışmana form atanır ve atama zamanı güncellenir.
    6. Dikkat Edilmesi Gerekenler

      • Veritabanı işlemlerinde veri bütünlüğünü sağlamak için transaction kullanımı önemlidir.
      • Yük dengelemesi için danışmanların meşguliyet durumu ve iş yoğunluğu gibi ek kriterler eklenebilir.
      • Kod, gerçek veri yapıları ve hata kontrolü ile genişletilmelidir.
  • 03-06-2024, 10:52:50
    #6
    Bu mantıklı bir yöntem gibi görünüyor, fikir için teşekkür ederim, deneyeceğim. Son durumu yazacağım buraya.
  • 03-06-2024, 11:15:33
    #7
    ChatGPT

    Bu tür bir otomatik dağıtım sistemi oluşturmak için aşağıdaki adımları izleyebilirsiniz. Bu yapıyı oluşturmak için PHP ve MySQL gibi araçları kullanarak bir örnek senaryo üzerinden ilerleyeceğiz.

    Adım 1: Veritabanı Tasarımı


    Öncelikle gerekli tabloları oluşturmanız gerekecek:
    1. Danışmanlar (consultants):
      • id (int, primary key)
      • name (varchar)
      • language (varchar)
      • last_assigned (timestamp) - Bu alan, danışmana en son ne zaman form atandığını tutar.
    2. Müşteri Formları (customer_forms):
      • id (int, primary key)
      • customer_name (varchar)
      • language (varchar)
      • assigned_to (int, foreign key to consultants.id) - Bu alan, formun hangi danışmana atandığını tutar.
      • assigned_at (timestamp) - Bu alan, formun ne zaman atandığını tutar.

    Adım 2: Form Dağıtım Mantığı

    1. Uygun Danışmanları Bulma: Gelen formun diline göre danışmanları seçin.
    2. En Az Yüklenmiş Danışmanı Bulma: Son form atamasını dikkate alarak en az yüklenmiş danışmanı seçin.
    3. Formu Atama: Formu seçilen danışmana atayın ve atama zamanını güncelleyin.

    Adım 3: PHP ve MySQL ile Uygulama


    Aşağıda, bu mantığı uygulayan bir PHP örneği verilmiştir:
    <?php
    // Veritabanı bağlantısı
    $dsn = 'mysql:host=localhost;dbname=mydatabase';
    $username = 'myuser';
    $password = 'mypassword';
    $options = [];
    
    try {
        $pdo = new PDO($dsn, $username, $password, $options);
    } catch (PDOException $e) {
        die('Database connection failed: ' . $e->getMessage());
    }
    
    // Gelen müşteri formu
    $incomingForm = [
        'customer_name' => 'John Doe',
        'language' => 'en'
    ];
    
    // Adım 1: Formun diline uygun danışmanları seç
    $language = $incomingForm['language'];
    $query = "SELECT * FROM consultants WHERE language = :language ORDER BY last_assigned ASC";
    $stmt = $pdo->prepare($query);
    $stmt->execute(['language' => $language]);
    $consultants = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // Adım 2: En az yüklenmiş danışmanı bul
    if (count($consultants) > 0) {
        $selectedConsultant = $consultants[0];
        $consultantId = $selectedConsultant['id'];
    
        // Adım 3: Formu atama
        $query = "INSERT INTO customer_forms (customer_name, language, assigned_to, assigned_at) VALUES (:customer_name, :language, :assigned_to, NOW())";
        $stmt = $pdo->prepare($query);
        $stmt->execute([
            'customer_name' => $incomingForm['customer_name'],
            'language' => $incomingForm['language'],
            'assigned_to' => $consultantId
        ]);
    
        // Danışmanın son atama zamanını güncelle
        $query = "UPDATE consultants SET last_assigned = NOW() WHERE id = :id";
        $stmt = $pdo->prepare($query);
        $stmt->execute(['id' => $consultantId]);
    
        echo "Form başarıyla atandı: " . $selectedConsultant['name'];
    } else {
        echo "Uygun danışman bulunamadı.";
    }
    ?>

    Açıklamalar

    1. Veritabanı Bağlantısı: PDO kullanarak veritabanına bağlanıyoruz.
    2. Uygun Danışmanları Seçme: Formun diline göre uygun danışmanları seçiyoruz ve last_assigned alanına göre sıralıyoruz.
    3. En Az Yüklenmiş Danışmanı Bulma ve Formu Atama: En az yüklenmiş danışmanı seçiyor ve formu atıyoruz. Atama sonrası danışmanın last_assigned alanını güncelliyoruz.

    İyileştirmeler

    1. Eşit Yük Dağılımı: En az yüklenmiş danışmanı seçerken eşit yük dağılımı yapabilmek için daha gelişmiş bir algoritma kullanabilirsiniz.
    2. Hata Yönetimi: Hataları yakalamak ve kullanıcıya uygun mesajlar göstermek için try-catch blokları kullanabilirsiniz.
    3. Performans İyileştirmeleri: Büyük veri setlerinde performansı artırmak için sorgu optimizasyonları yapabilirsiniz.
    Bu yapı, sisteminize uygun şekilde özelleştirilebilir ve geliştirilebilir.
  • 03-06-2024, 12:14:34
    #8
    PHP - WORDPRESS - YAZILIM
    Sağlık turizmi otomasyonunda kullandığım bir yöntem,
    dile göre kullanıcıyı gruplayıp, akabinde veritabanına hergün 12'den sonra sıfırlanan bir kolon ekliyorum.
    daha sonrasında her giden lead'de count'u artırıyorum.
    daha sonrasında, yeni lead geldiğinde count'u en düşük olandan sıralama yaptırıp en üsttekine veriyorum böylece daima en az lead almış kişi en üste geliyor. hem dile göre kırabiliyorum hemde lead sayısına göre ayrım yapabiliyorum. Gece 12 oldumu counter sıfırlanıyor baştan başa tekrar lead vermeye başlıyor. ben konuyu spesifikleştirip operasyon kırılımı saat bazlı dağılım gibi eklemelerde yapmıştım iyi çalışmalar.
  • 03-06-2024, 14:17:40
    #9
    yardımlar için teşekkür ederim, sonucu buraya yazacağım.