Pergunta

Eu tenho tentado descobrir a melhor maneira de modelar essa entidade e estou ficando preso. Aqui está o caso/história de uso básico:

Temos equipamentos que chegam no local. Não saberemos qual é o equipamento até chegar. Quando o equipamento chega no local, ele deve ser registrado como tendo chegado e se estava ocioso ou ativo. Se estiver ativo, o usuário deve anotar o trabalho que o equipamento realizou. Quando o equipamento sai do local, isso deve ser observado.

Eu deveria poder consultar facilmente se houver algum equipamento no site, qual equipamento estava anteriormente no local etc.

Estou ficando preso no aspecto da data. Estou tentando evitar confiar em um trabalho de cron para executar e marcar o equipamento como ocioso se não tiver sido marcado em uma data paticular. Parece que deve haver uma maneira de fazer isso. Aqui está o que eu criei:

public class Equipment {
    public int Id { get; set; }
    public Site Site { get; set; }
    public DateTime Arrival { get; set; }
    public DateTime Departure { get; set; }
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }
}

public class EquipmentUtilization {
    public int Id { get; set; }
    public Equipment Equipment { get; set; }
    public DateTime ReportDate { get; set; }
    public string WorkPerformed { get; set; }
}

A ideia é que eu poderia executar uma consulta como Site.Equipment.Where(x=>x.Departure == null) Para ver qual equipamento ainda está no local. Se não houver utilização de equipamentos para uma data específica, assume -se que fique ocioso. Eu poderia então configurar um DateTimeEnumerator:

public class DateTimeEnumerator : System.Collections.IEnumerable
{
    private DateTime begin;
    private DateTime end;

    public DateTimeEnumerator ( DateTime begin , DateTime end ) 
    {            
        this.begin = begin;
        this.end = end;
    }
    public System.Collections.IEnumerator GetEnumerator()
    {
        for(DateTime date = begin; date < end; date = date.AddDays(1))
        {
            yield return date;
        }
    }
}

Crie uma lista de datas a partir da data de chegada até o DateTime.now ou despaturate, se isso não for nulo. Por alguma razão, isso parece feio. Devo colocar o enumerador DateTime no interior por objeto de equipamento? Parece que tudo isso deve estar junto ou feito de uma maneira diferente, embora isso funcione se eu o executar. Sugestões?

Foi útil?

Solução

Se eu entendo você corretamente, você busca uma maneira de determinar qual equipamento está ocioso em um determinado site em uma determinada data com base nos objetos de equipamento capturado associados ao seu equipamento (talvez o equipamento residency seja um nome melhor?).

Como você deseja evitar a criação de objetos do equipamento de utilização para os dias ociosos (concordo que isso pode ser uma manutenção significativa), que tal adicionar um método de Isidleon (data) à classe do equipamento que retornar não?

A consulta associada seria algo como se o local do local.EQUIPEM (x => x.EQUIPmentUtilization.isidleon (data) == true)

Não tenho certeza se tenho a sintaxe certa, mas apenas uma sugestão.

Outras dicas

Um problema em potencial que vejo é que um equipamento conhece apenas seu site atual. Se você quiser saber se o Loader123 estava no Sitexyz há 2 meses, não pode recuperar essas informações, usando seu modelo atual.

Parece que sua granularidade de uso é para um determinado dia. Definitivamente, isso simplifica as coisas, pois você não precisa descobrir como rastreá-lo, se um equipamento for usado das 23:00 às 4:00 no SiteABC, depois das 13:00 às 17:00 no SiteXYZ.

Com essas coisas em mente, eu faria algumas pequenas alterações no seu modelo. Eu manteria uma coleção de todos os sites em que o equipamento estava (equipamento.history) e fornecesse uma função de conveniência para encontrar o site em que está atualmente (qualquer site que o sitehistory.departure não tenha um valor). Para as próprias utilizações, eu forneceria uma função de conveniência para devolvê -las como dicionário, digitada pelo DateTime. Você pode então fazer operações na coleção de chaves desse dicionário, para contar facilmente quantos dias um equipamento foi realmente utilizado dentro de um determinado período.

public class Equipment 
{
    public int Id { get; set; }
    public IList<SiteHistory> History { get; set; }
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }
    public IDictionary<DateTime, EquipmentUtilization> UtilizationsDictionary { get{...} }
    public Site CurrentSite { get{...} }
}

public class SiteHistory {
    public Site Site { get; set; }
    public DateTime Arrival { get; set; }
    public DateTime? Departure { get; set; }
}

public class EquipmentUtilization {
    public int Id { get; set; }
    public Equipment Equipment { get; set; }  // is this a circular-reference back to the parent?  Might be able to omit it.
    public DateTime ReportDate { get; set; }
    public string WorkPerformed { get; set; }
}

Como em qualquer design Quick-N-Dirty, tenho certeza de que este tem alguns orifícios e pode usar alguns refinamentos. Mas espero que isso o leve um pouco mais perto do que está procurando.

Eu não teria um enumerador DateTime pessoalmente; Como você disse, parece errado.

Devo admitir que estou lutando para segui -lo aqui quando você diz que algo deve ser classificado como ocioso. Tudo o que você usa para determinar se algo está ocioso, você pode ser colocado em uma propriedade, por exemplo:

public class Equipment
{ 
    public int Id { get; set; } 
    public Site Site { get; set; } 
    public DateTime Arrival { get; set; } 
    public DateTime Departure { get; set; } 
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }

    public bool IsIdle
    {
        get
        {
            // This checks if the EquipmentUtilizations is empty
            // or if the Equipment is older than three days
            return (this.EquipmentUtilizations == null) ||
                   ((this.Departure == null) &&
                    (this.Arrival < DateTime.Today.AddDays(-3))
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top