Peso do Serviço

gborgesgborges Entry Level
Bom dia!
Estou com uma dificuldade com relação ao peso do serviço, não consigo fazer funcionar. Vou explicar a minha necessidade, preciso que um serviço tenha um peso para que com o tempo ele vá passando a frente dos outros na fila, vi que isso é configurado para o atendimento prioritário, mas nesse caso preciso que as prioridades passem logo para frente. Em resumo
Atendimento prioritário precisa ficar a frente sempre (já vi como fazer)
Preciso que um serviço x tenha mais peso mais que os outros, mas que ele so passe para frente dos demais a medida que o tempo de espera for aumentando.
Tagged:

Comments

  • voce está certo, o peso funciona dessa forma, para mudar o peso do serviço voce deve:
    - tela principal - Unidade - Configurações - Serviços
    voce configura o peso que quer, maior mais rapido será chamado.
  • gborgesgborges Entry Level
    Eu configurei o peso do serviço, mas nos meus testes eles não estão passando a frente dos demais
  • gborgesgborges Entry Level
    Boa tarde galera!
    Consegui fazer com que o peso do serviço funcionasse aqui para mim.
    No arquivo FileService.php fiz uma alteração no código, até agora não tive problemas.
    Se estiver errado o que fiz, peço a ajuda de vocês, não sou desenvolvedor, o que sei é pouco e apenas quebra um galho.
    Segue o que foi feito

    // default queue ordering
    public static $ordering = array(
    // wait time
    array(
    'exp' => '((p.peso + 0) * (CURRENT_TIMESTAMP() - e.dataChegada))',
    'order' => 'DESC',
    ),
    array(
    'exp' => '((su.peso + 1) * (CURRENT_TIMESTAMP() - e.dataChegada))',
    'order' => 'DESC', //adicionado para o peso do serviço funcionar.
    ),
    // priority
    array(
    'exp' => 'su.peso',
    'exp' => 'p.peso',
    'order' => 'DESC',
    ),
    // ticket number
    array(
    'exp' => 'e.numeroSenha',
    'order' => 'ASC',
    ),
    );
  • ggdutraggdutra Entry Level
    gborges, no meu diretório eu encontrei esse arquivo ./src/Novosga/Service/FilaService.php
    Esse código que voce implementou precisa ficar em algum lugar específico? no início ou no fim desse arquivo?
    Eu também não conheço de programação php por isso estou perdido.
  • gborgesgborges Entry Level
    Para facilitar, segue o codigo completo da pagina, espero que ajude.


    <?php
    namespace Novosga\Service;
    use Doctrine\ORM\QueryBuilder;
    use Novosga\Config\AppConfig;
    use Novosga\Model\Servico;
    use Novosga\Model\Unidade;
    use Novosga\Model\Util\UsuarioSessao;
    /**
    * FilaService.
    *
    * @author Rogerio Lino <rogeriolino@gmail.com>
    */
    class FilaService extends ModelService
    {
    // default queue ordering
    public static $ordering = array(
    // wait time
    array(
    'exp' => '((p.peso + 0) * (CURRENT_TIMESTAMP() - e.dataChegada))',
    'order' => 'DESC',
    ),
    array(
    'exp' => '((su.peso + 1) * (CURRENT_TIMESTAMP() - e.dataChegada))',
    'order' => 'DESC',
    ),
    // priority
    array(
    'exp' => 'su.peso',
    'exp' => 'p.peso',
    'order' => 'DESC',
    ),
    // ticket number
    array(
    'exp' => 'e.numeroSenha',
    'order' => 'ASC',
    ),
    );
    /**
    * Retorna a fila de atendimentos do usuario.
    *
    * @param UsuarioSessao $usuario
    * @param int $maxResults
    *
    * @return array
    */
    public function atendimentos(UsuarioSessao $usuario, $maxResults = 0)
    {
    $ids = [0];
    $servicos = $usuario->getServicos();
    foreach ($servicos as $s) {
    $ids[] = $s->getServico()->getId();
    }
    $cond = '';
    // se nao atende todos, filtra pelo tipo de atendimento
    if ($usuario->getTipoAtendimento() != UsuarioSessao::ATEND_TODOS) {
    $s = ($usuario->getTipoAtendimento() == UsuarioSessao::ATEND_CONVENCIONAL) ? '=' : '>';
    $cond = "p.peso $s 0";
    $rs = $this->atendimentosUsuario($usuario, $ids, $maxResults, $cond);
    } else {
    // se atende todos mas tem limite para sequencia de tipo de atendimento
    $maxPrioridade = (int) AppConfig::getInstance()->get('queue.limits.priority');
    if ($maxPrioridade > 0 && $usuario->getSequenciaPrioridade() > 0 && $usuario->getSequenciaPrioridade() % $maxPrioridade === 0) {
    $cond = 'p.peso = 0';
    }
    $rs = $this->atendimentosUsuario($usuario, $ids, $maxResults, $cond);
    // se a lista veio vazia, tenta pegar qualquer um
    if (count($rs) === 0) {
    $rs = $this->atendimentosUsuario($usuario, $ids, $maxResults);
    }
    }
    return $rs;
    }
    private function atendimentosUsuario(UsuarioSessao $usuario, $servicos, $maxResults = 0, $where = '')
    {
    $builder = $this->builder()
    ->where('e.status = :status AND su.unidade = :unidade AND s.id IN (:servicos)');
    if (!empty($where)) {
    $builder->andWhere($where);
    }
    $this->applyOrders($builder, $usuario->getUnidade());
    $query = $builder->getQuery()
    ->setParameter('status', AtendimentoService::SENHA_EMITIDA)
    ->setParameter('unidade', $usuario->getUnidade()->getId())
    ->setParameter('servicos', $servicos);
    if ($maxResults > 0) {
    $query->setMaxResults($maxResults);
    }
    return $query->getResult();
    }
    /**
    * Retorna a fila de espera do serviço na unidade.
    *
    * @param mixed $unidade
    * @param mixed $servico
    *
    * @return array
    */
    public function filaServico($unidade, $servico)
    {
    if (!($unidade instanceof Unidade)) {
    $unidade = $this->em->find('Novosga\Model\Unidade', $unidade);
    }
    if (!($servico instanceof Servico)) {
    $servico = $this->em->find('Novosga\Model\Servico', $servico);
    }
    $builder = $this->builder()
    ->where('e.status = :status AND su.unidade = :unidade AND su.servico = :servico');
    $this->applyOrders($builder, $unidade);
    $builder->setParameter('status', AtendimentoService::SENHA_EMITIDA);
    $builder->setParameter('unidade', $unidade);
    $builder->setParameter('servico', $servico);
    return $builder->getQuery()->getResult();
    }
    /**
    * @return QueryBuilder
    */
    public function builder()
    {
    return $this->em
    ->createQueryBuilder()
    ->select('e')
    ->from('Novosga\Model\Atendimento', 'e')
    ->join('e.prioridade', 'p')
    ->join('e.servicoUnidade', 'su')
    ->join('su.servico', 's')
    ->join('e.usuarioTriagem', 'ut')
    ->leftJoin('e.usuario', 'u');
    }
    /**
    * Aplica a ordenação na QueryBuilder.
    *
    * @param QueryBuilder $builder
    */
    public function applyOrders(QueryBuilder $builder, Unidade $unidade)
    {
    $ordering = AppConfig::getInstance()->get('queue.ordering');
    if (is_callable($ordering)) {
    $ordering = $ordering($unidade);
    }
    if (!$ordering || empty($ordering)) {
    $ordering = self::$ordering;
    }
    foreach ($ordering as $item) {
    if (!isset($item['exp'])) {
    break;
    }
    $exp = $item['exp'];
    $order = isset($item['order']) ? $item['order'] : 'ASC';
    $builder->addOrderBy($exp, $order);
    }
    }
    }
  • bryanbryan Entry Level
    Bom dia gborges, muito obrigado pelo código, funcionou perfeitamente. Desde já agradeço amigo.
  • Boa tarde, @bryan e @gborges!

    Obrigado pela contribuição. Funcionou como forma de andar mais rápido o atendimento sobre outros serviços, mas não consegui fazer com que o peso do serviço tivesse prioridade sobre as outras senhas prioritárias. Explico.

    Tenho um serviço de RETORNO que deve ser chamado para atendimento de forma prioritária porque o munícipe já ficou anteriormente esperando e só saiu para pagar uma guia no banco porque não temos recebimento de taxas direto no atendimento. Ele tem que voltar com quem o atendeu, porque todo o seu processo já foi acompanhado por aquele atendente.

    Não sei se consegui ser claro.

    Agradeço a ajuda!
Sign In or Register to comment.