Ir para conteúdo

eiwes

Members
  • Total de itens

    32
  • Registro em

  • Última visita

Posts postados por eiwes


  1. Eu tenho esse código, mas preciso retornar funções puras em vez de funções mutáveis.

     

    É possível? Talvez usando OOP? Não sei como melhorar isso.

     

    Tentei retornar os valores de cada função, mas não obtive sucesso.

     

    import { AssetStatusType } from '@domain/interfaces/common'
    
    import {
      BothComponentType,
      ComponentsType,
      GroupFiltersType,
      OperationType,
      OverviewModelType,
      PendenciesOverviewType,
      PendenciesType,
      StructurePendenciesCount,
      StructureStatusCount
    } from '../../types'
    
    const updateStatusCount = (
      statusCount: StructureStatusCount,
      status: AssetStatusType
    ) => {
      statusCount[status] = (statusCount[status] || 0) + 1
    }
    
    const updatePendenciesCount = (
      pendenciesCount: StructurePendenciesCount,
      key: AssetStatusType,
      subKey: OperationType | PendenciesOverviewType
    ) => {
      pendenciesCount[key] = pendenciesCount[key] ?? {}
      pendenciesCount[key][subKey] = (pendenciesCount[key]?.[subKey] || 0) + 1
    }
    
    const processOverviewPendencies = (
      pendencies: PendenciesType[] | null | undefined,
      pendenciesCount: StructurePendenciesCount,
      countedIds: Set<string>,
      id: string
    ) => {
      if (pendencies?.length) {
        for (const { state, pendencyType } of pendencies) {
          const uniqueId = `${state}-${pendencyType}-${id}`
          if (!countedIds.has(uniqueId)) {
            updatePendenciesCount(pendenciesCount, state, pendencyType)
    
            countedIds.add(uniqueId)
          }
        }
      }
    }
    
    const processOverviewComponents = (
      components: ComponentsType[],
      isGroupByTree: boolean,
      statusCount: StructureStatusCount,
      pendenciesCount: StructurePendenciesCount,
      countedIds: Set<string>,
      id: string,
      type: BothComponentType
    ) => {
      for (const { pendencies, status, operationType } of components) {
        if (isGroupByTree && type === 'location') {
          updateStatusCount(statusCount, status)
    
          if (operationType) {
            updatePendenciesCount(pendenciesCount, status, operationType)
          }
        }
        processOverviewPendencies(pendencies, pendenciesCount, countedIds, id)
      }
    }
    
    const processOverviewData = (
      data: OverviewModelType[],
      groupBy: GroupFiltersType,
      statusCount: StructureStatusCount,
      pendenciesCount: StructurePendenciesCount,
      countedIds: Set<string>
    ) => {
      const isGroupByTree = groupBy === 'tree'
      const isGroupByAsset = groupBy === 'asset'
    
      for (const { id, status, components, operationType, type } of data) {
        if (isGroupByAsset || type === 'asset') {
          updateStatusCount(statusCount, status)
          if (operationType) {
            updatePendenciesCount(pendenciesCount, status, operationType)
          }
        }
    
        processOverviewComponents(
          components,
          isGroupByTree,
          statusCount,
          pendenciesCount,
          countedIds,
          id,
          type
        )
      }
    }
    
    export const calculateOverviewCounts = (
      data: OverviewModelType[],
      groupBy: GroupFiltersType
    ) => {
      const statusCount: StructureStatusCount = {} as StructureStatusCount
      const pendenciesCount: StructurePendenciesCount =
        {} as StructurePendenciesCount
    
      const countedIds = new Set<string>()
    
      processOverviewData(data, groupBy, statusCount, pendenciesCount, countedIds)
    
      return { ...statusCount, pendencies: pendenciesCount }
    }

    Existe uma maneira mais limpa e elegante de fazer isso? Preciso retornar um objeto como este:

    // calculateOverviewCounts return this
    
    {
        pendencies: StructurePendenciesCount;
        working: number;
        inAlert: number;
        warning: number;
        stopped: number;
        off: number;
    }

    StructurePendenciesCount é:

    image.thumb.png.515970af4c98d649ef0da98710a0b233.png


  2. 4 horas atrás, Williams Duarte disse:

     

    Então, Williams. Agradeço muito pelo link, porém, gostaria de entender o porquê desse erro.

     

    Saberia me ajudar com isso? Pois estou encabulado tentando entender: no primeiro laço do array ele conclui com o fechamento e após ele não faz o fechamento.

     


  3. Fiz uma iteração foreach para gerar categorias e subcategorias, pois não queria fazer DOIS SELECTS, ficando assim:

     

    //----> Foreach para gerar a categoria, pois são vários items com as mesmas chaves, portanto agrupo
    		foreach($exibeLista as $row){
                $dlD[$row["nameD"]][] = [
                  "nameD"=>$row["nameD"],
                  "idD"=>$row["idD"],
                  "qtdR"=>$row["qtdR"],
                  "qtdF"=>$row["qtdF"]
                ];
              }
    
    //----> Foreach para gerar subcategorias
              foreach($exibeLista as $row){
                $dLA[$row["nameP"]][] = [
                  "nameD"=>$row["nameD"],
                  "idD"=>$row["idD"],
                  "idAss"=>$row["idAss"],
                  "idT"=>$row["idT"],
                  "nameP"=>$row["nameP"],
                  "qtdR"=>$row["qtdR"],
                  "qtdF"=>$row["qtdF"]
                ];
              }
    
    
              $fsHTML = [];
              $rateD = 0;
              $qtdAss = 0;
    
              if(is_array($dlD) || is_object($dlD)){
                foreach ($dlD as $key => $ds) {
    
                  if ($key <> '' && $key <> NULL) {
                    $rateD += (($ds[0]["qtdR"]*100)/$ds[0]["qtdF"]);
                    $qtdAss += count($dlD[$key]);
    	
    //----> Array para inserir HTML da Categoria criada e criar accordion
                        $fsHTML[] = '
                        <div class="col-md-12 col-sm-12 col-xs-12">
                          <div class="x_panel overflow_hidden padding-into-row-qsts bg-white-row filtro-on">
                            <span class="rateD">'.ceil($rateD/$qtdAss).'%</span>
                            <span class="opcao-into-top">'.$ds[0]["idD"].' - '.$ds[0]["nameD"].' 
                              <a class="collapse-link open-filter-qsts border-radius8"><i class="fa fa-chevron-up"></i></a></span>
                            <div class="x_content" style="display:none;padding-top:10px">
                              <div class="accordion" id="accordion" role="tablist" aria-multiselectable="true">
                        ';
                                
    //----> Verificar se a subcategoria contém a categoria, se contém é incluída na array
                                
                    foreach ($dLA as $keys => $ass) {
                      if($ass[0]["idD"] == $ds[0]["idD"] ){
                        if($ass[0]['idT'] <> 0){ $link = 't='.$ass[0]['idT']; }else{ $link = 'a='.$ass[0]['idAss'];}
                        $fsHTML[] = '
                        <div class="panel">
                          <a class="panel-heading collapsed" href="/v/fs/st?mz=y&type=c&'.$link.'">
                            <span class="eficiencia-accordion">'.ceil(($ass[0]['qtdR']*100)/$ass[0]['qtdF']).'%</span>
                            <h4 class="panel-title">'.$ass[0]['nameP'].'</h4>
                            <span class="unicamente">'.$ass[0]['qtdR'].' respondido de '.$ass[0]['qtdF'].'</span>
                          </a>
                        </div>
                        ';
                      }//if ass
                    }//foreach ass
                  }//if ds
                                
    //----> Aqui é aonde ocorre o ERRO! Era pra fazer o fechamento do Accordion e gerar uma nova DIV. 
    //No índice [0] isso ocorre normalmente, porém no [1] ela agrupa todos os accordions. (abaixo farei a amostra)
                                
                        $fsHTML[] = '</div></div></div></div>';
                }//foreach ds
              }//if verifica se é array e se é objeto
              
                      return implode('', array_unique($fsHTML));

    O correto seria assim:

     

    - Categoria

      - Subcategoria

      - Subcategoria

     

    - Categoria

     - Subcategoria

     - Subcategoria

     

     

    Como está acontecendo:

     

    - Categoria

      - Subcategoria

      - Subcategoria

     

    - Categoria

      - Subcategoria

      - Subcategoria

        - Categoria

          - Subcategoria

          - Subcategoria

            - Categoria

              - Subcategoria

              - Subcategoria

                - Categoria

                  - Subcategoria

                  - Subcategoria

     

     

    Não consigo entender de jeito nenhum pq o primeiro fecha corretamente e a partir do segundo não.

    Alguém me ajuda?

     

     


  4. Fala, galera

     

    Tenho duas Tabelas:

    1 - dados

    2 - respostas dados (usuários vão respondendo e é gravado aqui)

     

    Na verdade, não precisa ser nada pronto, mas sim um início, pois não consigo imaginar em nada que consiga dar certo.

     

    As respostas possuem níveis (como assim?), eles vão de 1 até 5. Na qual, 1 é Completamente Insatisfeito e 5 Completamente Satisfeito.

     

    Ao responder, o usuário “criteriza” aquela resposda de 1 até 5.

     

    Agora entra a inteligência que eu não consigo pensar em algo atingível.

     

    Caso ele aponte como 1: o usuário responderá +3 perguntas e aquela primeira voltaria na sequência.

     

    caso aponte 2: responderia +5 e voltaria aquela na sequência.

     

    caso aponte 3: responderia +7 e voltaria aquela na sequência.

     

    [...] e assim sucessivamente.

     

    Alguém teria alguma ideia de como daria pra filtrar esses dados e exibir com esses critérios inteligentes? Pois utilizar ORDER BY com CASE WHEN não daria, né?! Já utilizo o ORDER BY para colocar as respostas em ordem “cronológica”.

     

    Por favor, solicito ajuda para desencalhar esse projeto.

     

    Desde já, agradeço quaisquer comentários.

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.