Ir para conteúdo
Fórum Script Brasil
  • 0

Comparando 3.000 produtos em menos de um minuto


Frank K Hosaka

Pergunta

Eu tenho um componente chamado Bling, e ele gastava 3 minutos para comparar 3.000 produtos do MySQL com o Bling.

Eu usava o MySQL para gravar as informações obtidas do Bling. Ao invés de usar o MySQL, decidi usar um array, mas isso em nada ajudou a melhorar o tempo de resposta.

Apresentei o meu código ao Copilot, ele mudou muita coisa, principalmente na hora de indexar um array e o tempo de resposta ficou bem melhor:

arquivo app > Livewire > Bling.php
<?php
namespace App\Livewire;
use App\Models\tbprod;
use Livewire\Attributes\Layout;
use Livewire\Component;
use Livewire\WithFileUploads;

#[Layout('components.layouts.app',['titulo'=>'Diferença na Bling'])]
class Bling extends Component {

    use WithFileUploads;
    public $contaProdBling,$contaProduto,$dif=[],$files=[];
    public $modal=true,$tbBling=[];

    function updatedFiles() {
        $this->modal=false;
        foreach($this->files as $arquivo) {
            $dados=explode(PHP_EOL,$arquivo->get());
            foreach($dados as $linha) {
                if($linha<>"") {
                    $campos=explode(';',$linha);
                    if(aspas($campos[1])!=="Código") {
                        $codprod=intval(trim(aspas($campos[1])));
                        $un=aspas($campos[3]);
                        $prod=aspas($campos[2]);
                        $custo=deca(aspas($campos[11]));
                        $codbar=trim(aspas($campos[19]));
                        $cf=deca(aspas($campos[4]));
                        $venda=deca(aspas($campos[6]));
                        $this->tbBling[]=['codprod'=>$codprod,'un'=>$un,
                           'prod'=>$prod,'custo'=>$custo,'codbar'=>$codbar,
                           'cf'=>$cf,'venda'=>$venda];
                    }
                }
            }
        }
        
        // Criação do índice associativo por codprod
        $blingIndex = [];
        foreach ($this->tbBling as $item) {
            $blingIndex[$item['codprod']] = $item;
        }

        // Carrega os produtos do banco (opcionalmente como array)
        $produto = tbprod::where('loc','<>','a24')->get();
        $this->contaProduto = count($produto);
        $this->contaProdBling = count($this->tbBling);

        // Verifica diferença de quantidade
        if ($this->contaProdBling > $this->contaProduto) {
            $prod = $produto->pluck('codprod');
            $pBling = collect(array_column($this->tbBling, 'codprod'));
            $difs = $pBling->diff($prod);
            foreach ($difs as $d) {
                echo "problema no codprod $d na Bling <br>";
            }
            dd('parada total'); 
            // essa rotina não funciona no Laravel, precisa melhorar
        }

        // Compara os produtos
        foreach ($produto as $key => $pr) {
            $codprod = $pr->codprod;

            if (!isset($blingIndex[$codprod])) {
                $this->dif[$key][] = ['Codigo' => $codprod];
                $this->dif[$key][] = ['Incluir' => $codprod, 'Incluir2' => 'Incluir'];
            } else {
                $a = $blingIndex[$codprod];
                $un     = ($pr->un     == $a['un'])     ? 1 : 0;
                $prod   = ($pr->prod   == $a['prod'])   ? 1 : 0;
                $custo  = ($pr->custo  == $a['custo'])  ? 1 : 0;
                $codbar = ($pr->codbar == $a['codbar']) ? 1 : 0;
                $cf     = ($pr->cf     == $a['cf'])     ? 1 : 0;
                $venda  = ($pr->venda  == $a['venda'])  ? 1 : 0;

                if ($un.$prod.$custo.$codbar.$cf.$venda !== '111111') {
                    $this->dif[$key][] = ['Codigo' => $pr->codprod, 'Codigo2' => $a['codprod']];

                    if ($pr->prod !== $a['prod']) {
                    $this->dif[$key][] = ['Descricao' => $pr->prod, 'Descricao2' => $a['prod']];
                    }
                    if ($pr->custo !== $a['custo']) {
                        if ($pr->custo || $a['custo'] != 0) {
                            $this->dif[$key][] = ['Custo' => $pr->custo, 'Custo2' => $a['custo']];
                        }
                    }
                    if ($pr->codbar != $a['codbar']) {
                        $this->dif[$key][] = ['Codigo de Barra' => $pr->codbar, 'Codigo de Barra2' => $a['codbar']];
                    }
                    if ($pr->cf !== $a['cf']) {
                        if ($pr->cf || $a['cf']) {
                            $this->dif[$key][] = ['NCM' => $pr->cf, 'NCM2' => $a['cf']];
                        }
                    }
                    if ($pr->venda !== $a['venda']) {
                        $this->dif[$key][] = ['Venda' => $pr->venda, 'Venda2' => $a['venda']];
                    }
                    if ($pr->un !== $a['un']) {
                        $this->dif[$key][] = ['Un' => $pr->un, 'Un2' => $a['un']];
                    }
                }
            }
        }
    }
}

arquivo resources > views > livewire > bling.blade.php
<div>
    @if($modal)
        <div class="h-5"></div>
        <flux:input type="file" wire:model="files" multiple 
            label="Selecione os arquivos de produtos da Bling" />
    @else
        <script>
            function copiar(elemento) {
                conteudo=elemento.innerText || elemento.textContent
                navigator.clipboard.writeText(conteudo)
                elemento.parentElement.style.display="none"
            }
        </script>
        <div class="font-semibold flex">
            <div class=w-[100px]>Código</div>
            <div class=w-[100px]>Campo</div>
            <div class=w-[100px]>MySQL</div>
            <div class=w-[100px]>Bling</div>
        </div>
        <div class=flex>
            <div class=w-[100px]></div>
            <div class=w-[100px]>Produtos</div>
            <div class=w-[100px]>{{ $contaProduto }}</div>
            <div class=w-[100px]>{{ $contaProdBling }}</div>
        </div>
        @foreach($dif as $d)
            @foreach($d as $v)
                @if(array_keys($v)[0]=="Codigo") 
                    @php $codigo=array_values($v)[0]; @endphp
                @else
                    @if(array_keys($v)[0]!=="Descricao") 
                        <div class="flex">
                            <div class=w-[100px]>{{$codigo}}</div>
                            <div class=w-[100px]>{{array_keys($v)[0]}}</div>
                            <div class=w-[100px] onclick=copiar(this)>
                                <pre class="font-sans"><?=array_values($v)[0]?></pre>
                            </div>
                            <div class=w-[100px]>
                                <pre class="font-sans"><?=array_values($v)[1]?></pre>
                            </div>
                        </div>
                    @else
                        <div class=flex>
                            <div class=w-[100px]>{{$codigo}}</div>
                            <div class=w-[100px]>{{array_keys($v)[0]}}</div>
                            <div class=w-[100px] onclick=copiar(this)>
                                <pre class="font-sans"><?=array_values($v)[0]?></pre>
                            </div>
                        </div>
                        <div class=flex>
                            <div class=w-[200px]></div>
                            <div class=w-[100px] onclick=copiar(this)>
                                <pre class="font-sans"><?=array_values($v)[1]?></pre>
                            </div>
                        </div>
                    @endif
                @endif
            @endforeach
        @endforeach
    @endif
</div>



 

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,5k
    • Posts
      652,3k
×
×
  • Criar Novo...