diff --git a/src/app/uygulamalar/paylasim-sistemi/paylasim-sistemi.component.ts b/src/app/uygulamalar/paylasim-sistemi/paylasim-sistemi.component.ts index d20c18b..5443493 100644 --- a/src/app/uygulamalar/paylasim-sistemi/paylasim-sistemi.component.ts +++ b/src/app/uygulamalar/paylasim-sistemi/paylasim-sistemi.component.ts @@ -52,6 +52,8 @@ import { SISTEM_PARAMETRE_SETLERI } from '@/src/service/fikoyt-ui/src/lib/parame ] }) export class PaylasimSistemiComponent extends FikoYTKokBilesenComponent { + /** Kullan─▒c─▒ filtresinin pipeline'daki sabit konumu (son a┼şama ÔÇö lookup/addFields/project sonras─▒) */ + private static readonly FILTRE_ASAMASI = 10; listeIstek: FikoYTIstekSayfalama; u_id: string | null = null; ustKart: IKart | null = null; @@ -233,6 +235,8 @@ export class PaylasimSistemiComponent extends FikoYTKokBilesenComponent { } }, { $project: { _altKartSayim: 0, _kutukDurumAlt: 0, _projeDurumAlt: 0, _projeIlerlemeAlt: 0 } }, + // Kullan─▒c─▒ filtresi ÔÇö daima pipeline sonunda (bkz. FILTRE_ASAMASI) + { $match: {} }, ], sayfalama: { sayi: 10, @@ -423,15 +427,84 @@ export class PaylasimSistemiComponent extends FikoYTKokBilesenComponent { effect(() => { const id = this.canliGuncelleme.kartSilindi(); if (!id) return; + const onceki = this.listeIstek.liste.length; this.listeIstek.liste = this.listeIstek.liste.filter(k => k._id !== id); + if (this.listeIstek.liste.length < onceki && this.listeIstek.sayfalama.toplamKayitSayisi > 0) { + this.listeIstek.sayfalama.toplamKayitSayisi--; + } this.CD.detectChanges(); }); effect(() => { const kart = this.canliGuncelleme.kartYeni(); if (!kart) return; + if (this.listeIstek.liste.some(k => k._id === kart._id)) return; this.listeIstek.liste = [kart, ...this.listeIstek.liste]; + this.listeIstek.sayfalama.toplamKayitSayisi++; this.CD.detectChanges(); }); + + // Sunucudan (Socket.IO) gelen kart olaylar─▒ ÔÇö di─şer kullan─▒c─▒/cihazlar + this.canliGuncelleme.socketBagla(this.FikoYT.io); + effect(() => { + const olay = this.canliGuncelleme.sunucuOlayi(); + if (!olay) return; + switch (olay.tip) { + case 'silindi': + this.canliGuncelleme.kartSilindi.set(olay.kartId); + break; + case 'guncellendi': + this.tekKartYenile(olay.kartId); + break; + case 'yeni': + this.listeYenileGecikmeli(); + break; + } + }); + } + + /** Yeni kart olaylar─▒nda listeyi tek seferde yeniler (art arda olaylar─▒ toplar) */ + private listeYenileZamanlayici: any = null; + private listeYenileGecikmeli() { + if (this.listeYenileZamanlayici) clearTimeout(this.listeYenileZamanlayici); + this.listeYenileZamanlayici = setTimeout(() => { + this.listeYenileZamanlayici = null; + this.listeIstek.isteSync(); + }, 600); + } + + /** Tek kart─▒ (i├ğerik lookup'l─▒) sunucudan ├ğekip listede yerine koyar */ + private async tekKartYenile(kartId: string) { + if (!this.listeIstek.liste.some((k: any) => k._id === kartId) && this.ustKart?._id !== kartId) { + // Kart hen├╝z listede de─şil (yeni geldi / yenileme s├╝r├╝yor) ÔÇö listeyi topluca yenile + this.listeYenileGecikmeli(); + return; + } + try { + const istek = new FikoYTIstekKok({ + metod: 'POST', + komut: 'FikoYT.sistem.DB.hareketler.aggregate', + parametreler: { + aggregate: [ + { $match: { _id: kartId } }, + { $lookup: { from: 'hareketler', localField: 'veri.icerikler', foreignField: '_id', as: 'veri.icerikler' } }, + { $limit: 1 } + ] + } + }); + const cevap: any = await istek.isteSync(); + const kart = cevap?.cevap?.sonuc?.[0]; + if (!kart) return; + if (kart.silindi) { + this.canliGuncelleme.kartSilindi.set(kartId); + return; + } + if (this.ustKart?._id === kartId) { + this.ustKart = kart; + this.CD.detectChanges(); + return; + } + this.kartYerineKoy(kart); + } catch { /* sessiz ÔÇö sonraki olay/yenileme telafi eder */ } } async ustKartYukle(kartId: string) { @@ -508,6 +581,7 @@ export class PaylasimSistemiComponent extends FikoYTKokBilesenComponent { siralamaDegisti(deger: any) { this.aktifSiralama = deger; this.listeIstek.sayfalama.siralama = deger; + this.listeIstek.sayfalama.sayfa = 1; this.listeIstek.parametreler.aggregate = this.listeIstek._alAggregate(); this.listeIstek.isteSync(); } @@ -577,20 +651,30 @@ export class PaylasimSistemiComponent extends FikoYTKokBilesenComponent { filtreUygula() { const mongoSorgu = FikoFilitreciComponent.toMongoFromSablon(this.filitreciSablon) || {}; const match = (mongoSorgu && Object.keys(mongoSorgu).length) ? mongoSorgu : {}; - // Filtreyi prepipe (lookup'lar + addFields'ler + project) sonras─▒na yerle┼ştir ÔÇö index 9 - this.listeIstek.filitreler[9] = { $match: match }; + this.listeIstek.filitreler[PaylasimSistemiComponent.FILTRE_ASAMASI] = { $match: match }; + this.listeIstek.sayfalama.sayfa = 1; this.listeIstek.parametreler.aggregate = this.listeIstek._alAggregate(); this.listeIstek.isteSync(); } filtreTemizle() { this.filitreciSablon = { veVeya: "ve", acik: true, alanlar: [] }; - this.listeIstek.filitreler[3] = { $match: {} }; + this.listeIstek.filitreler[PaylasimSistemiComponent.FILTRE_ASAMASI] = { $match: {} }; + this.listeIstek.sayfalama.sayfa = 1; this.listeIstek.parametreler.aggregate = this.listeIstek._alAggregate(); this.listeIstek.isteSync(); this.CD.detectChanges(); } + /** G├╝ncellenen kart─▒ _id e┼şle┼şmesiyle listeye yerle┼ştirir ($index kaymalar─▒na dayan─▒kl─▒) */ + kartYerineKoy(guncel: IKart) { + const idx = this.listeIstek.liste.findIndex((k: any) => k._id === (guncel as any)._id); + if (idx < 0) return; + this.listeIstek.liste[idx] = guncel; + this.listeIstek.liste = this.listeIstek.liste.slice(); + this.CD.detectChanges(); + } + // --- Toplu ─░┼şlem Modu --- topluIslemModu = false; seciliKartIdler = new Set(); @@ -632,16 +716,14 @@ export class PaylasimSistemiComponent extends FikoYTKokBilesenComponent { return this.seciliKartIdler.size; } - async topluSil() { - if (this.seciliSayi === 0) return; - this.topluIslemMesgul = true; - this.CD.detectChanges(); - + /** Toplu i┼şlemleri s─▒n─▒rl─▒ e┼şzamanl─▒l─▒kla (5) paralel y├╝r├╝t├╝r */ + private async topluYurut(govdeler: any[]): Promise { let basarili = 0; - for (const kartId of this.seciliKartIdler) { - try { + const ESZAMANLI = 5; + for (let i = 0; i < govdeler.length; i += ESZAMANLI) { + const grup = govdeler.slice(i, i + ESZAMANLI).map(async (govde) => { const formData = new FormData(); - formData.append('req_body', JSON.stringify({ _id: kartId, silindi: true })); + formData.append('req_body', JSON.stringify(govde)); const istek = new FikoYTIstekKok({ metod: 'POST', komut: 'FikoYT.sistem.DB.hareketler.ekle', @@ -650,12 +732,22 @@ export class PaylasimSistemiComponent extends FikoYTKokBilesenComponent { depoModu: false, }); await istek.isteSync(); - basarili++; - } catch (e) { - this.nzMessage.error(`Bir kart silinemedi`); - } + }); + const sonuclar = await Promise.allSettled(grup); + basarili += sonuclar.filter(s => s.status === 'fulfilled').length; } + return basarili; + } + async topluSil() { + if (this.seciliSayi === 0) return; + this.topluIslemMesgul = true; + this.CD.detectChanges(); + + const govdeler = [...this.seciliKartIdler].map(kartId => ({ _id: kartId, silindi: true })); + const basarili = await this.topluYurut(govdeler); + + if (basarili < govdeler.length) this.nzMessage.error(`${govdeler.length - basarili} kart silinemedi`); this.nzMessage.success(`${basarili} kart silindi`); this.seciliKartIdler.clear(); this.topluIslemMesgul = false; @@ -668,31 +760,15 @@ export class PaylasimSistemiComponent extends FikoYTKokBilesenComponent { this.topluIslemMesgul = true; this.CD.detectChanges(); - let basarili = 0; - for (const kartId of this.seciliKartIdler) { - try { - const kart = this.listeIstek.liste.find((k: any) => k._id === kartId); - const mevcutEtiketler = kart?.etiketler ?? []; - if (!mevcutEtiketler.includes(etiket)) { - mevcutEtiketler.push(etiket); - } - - const formData = new FormData(); - formData.append('req_body', JSON.stringify({ _id: kartId, etiketler: mevcutEtiketler })); - const istek = new FikoYTIstekKok({ - metod: 'POST', - komut: 'FikoYT.sistem.DB.hareketler.ekle', - parametreler: formData, - onEkOlsun: true, - depoModu: false, - }); - await istek.isteSync(); - basarili++; - } catch (e) { - this.nzMessage.error(`Bir kart etiketlenemedi`); - } - } + const govdeler = [...this.seciliKartIdler].map(kartId => { + const kart = this.listeIstek.liste.find((k: any) => k._id === kartId); + const mevcutEtiketler = kart?.etiketler ?? []; + if (!mevcutEtiketler.includes(etiket)) mevcutEtiketler.push(etiket); + return { _id: kartId, etiketler: mevcutEtiketler }; + }); + const basarili = await this.topluYurut(govdeler); + if (basarili < govdeler.length) this.nzMessage.error(`${govdeler.length - basarili} kart etiketlenemedi`); this.nzMessage.success(`${basarili} kart etiketlendi: ${etiket}`); this.topluIslemMesgul = false; this.listeIstek.isteSync();