Untitled

 avatar
unknown
plain_text
a month ago
4.4 kB
3
Indexable
def process_orders_continuously(self, check_interval=30):
        """Memproses pesanan secara berkelanjutan"""
        # Track pesanan yang sudah diproses di batch ini untuk mencegah duplikasi
        processed_ids_this_batch = set()
        
        while True:
            try:
                # Selalu refresh koneksi database untuk mendapatkan data terbaru
                if not self.conn or not self.conn.is_connected():
                    logger.info("Koneksi database terputus, mencoba menghubungkan kembali...")
                    self.connect_database()
                
                # Reset tracking ID yang diproses untuk batch baru
                processed_ids_this_batch.clear()
                
                # Dapatkan pesanan yang pending
                orders = self.get_pending_orders()
                
                if orders:
                    logger.info(f"Mulai memproses batch dengan {len(orders)} pesanan")
                    
                    # Grup pesanan berdasarkan created_at untuk memastikan semua diproses
                    orders_by_timestamp = {}
                    for order in orders:
                        ts = str(order['created_at'])
                        if ts not in orders_by_timestamp:
                            orders_by_timestamp[ts] = []
                        orders_by_timestamp[ts].append(order)
                    
                    # Proses timestamp dari yang terlama
                    for ts in sorted(orders_by_timestamp.keys()):
                        orders_same_ts = orders_by_timestamp[ts]
                        
                        # Log informasi timestamp
                        if len(orders_same_ts) > 1:
                            order_ids = [o['id'] for o in orders_same_ts]
                            logger.info(f"Memproses {len(orders_same_ts)} pesanan dengan timestamp sama ({ts}): {order_ids}")
                        
                        # Proses pesanan dalam grup timestamp ini berdasarkan ID
                        sorted_orders = sorted(orders_same_ts, key=lambda x: x['id'])
                        
                        for order in sorted_orders:
                            order_id = order['id']
                            
                            # Skip jika sudah diproses di batch ini
                            if order_id in processed_ids_this_batch:
                                logger.info(f"Pesanan #{order_id} sudah diproses di batch ini, melewati...")
                                continue
                            
                            logger.info(f"Memproses pesanan #{order_id} (created: {order['created_at']})")
                            
                            success = self.process_order(order)
                            if success:
                                self.processed_count += 1
                                logger.info(f"Pesanan #{order_id} berhasil diproses (total: {self.processed_count})")
                                # Tandai sebagai sudah diproses
                                processed_ids_this_batch.add(order_id)
                            else:
                                logger.warning(f"Pesanan #{order_id} gagal diproses")
                            
                            time.sleep(1)  # Jeda antar pesanan
                    
                    logger.info(f"Selesai memproses batch, total {len(processed_ids_this_batch)} pesanan berhasil diproses")
                else:
                    logger.info(f"Tidak ada pesanan pending, menunggu {check_interval} detik...")
                    # Refresh koneksi database saat tidak ada orderan
                    self.connect_database()
                
                # Tunggu interval waktu yang ditentukan
                time.sleep(check_interval)
                
                # Refresh koneksi database setelah interval waktu
                logger.info("Me-refresh koneksi database untuk siklus baru...")
                self.connect_database()
                
            except KeyboardInterrupt:
                logger.info("Bot dihentikan oleh pengguna")
                break
            except Exception as e:
                logger.error(f"Error dalam loop pemrosesan pesanan: {e}")
                time.sleep(check_interval)
Editor is loading...
Leave a Comment