كيف يمكنني تصميم كائن لتتبع المعدات / الأصول بمرور الوقت؟

StackOverflow https://stackoverflow.com/questions/3427772

سؤال

لقد كنت أحاول معرفة أفضل طريقة لتصميم هذا الكيان ، وأنا يتعثر. إليك حالة الاستخدام الأساسية/القصة:

لدينا معدات تصل في الموقع. لن نعرف ما هي المعدات حتى وصولها. بمجرد وصول المعدات في الموقع ، يجب تسجيلها على أنها وصولها وما إذا كانت خامدة أو نشطة. إذا كان نشطًا ، فيجب على المستخدم تدوين العمل الذي تم تنفيذ الجهاز. عندما يغادر الجهاز الموقع ، يجب ملاحظة ذلك.

يجب أن أكون قادرًا على الاستعلام بسهولة عما إذا كان هناك أي معدات على الموقع ، وما هي المعدات التي كانت موجودة سابقًا في الموقع ، إلخ.

أنا عالق في جانب التاريخ. أحاول تجنب الاعتماد على وظيفة cron للركض وتمييز المعدات على أنها خاملة إذا لم يتم وضع علامة على الخمول في تاريخ paticular. يبدو أنه يجب أن يكون هناك طريقة للقيام بذلك. هذا ما توصلت إليه:

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; }
}

الفكرة هي أنه يمكنني تشغيل استعلام مثل Site.Equipment.Where(x=>x.Departure == null) لمعرفة المعدات التي لا تزال في الموقع. إذا لم يكن هناك معدات لتاريخ معين ، فمن المفترض أن تكون خاملاً. يمكنني بعد ذلك إعداد 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;
        }
    }
}

قم بإنشاء قائمة بالتواريخ من تاريخ الوصول حتى DateTime.Now أو DEPARTIDATE إذا لم يكن هذا فارغًا. لسبب ما هذا يبدو قبيح. هل يجب أن أضع العداد في وقت البيانات في الداخل بواسطة كائن المعدات؟ يبدو أن هذا يجب أن يكون كل شيء معًا أو القيام به بطريقة مختلفة ، على الرغم من أن هذا يعمل إذا قمت بتشغيله. اقتراحات؟

هل كانت مفيدة؟

المحلول

إذا فهمت لك بشكل صحيح ، فأنت تبحث عن طريقة لتحديد المعدات الخاملة في موقع معين في تاريخ معين استنادًا إلى كائنات المعدات التي تم التقاطها المرتبطة بالمعدات الخاصة بك (ربما تكون مجموعة المعدات هي اسم أفضل؟).

نظرًا لأنك ترغب في تجنب إنشاء كائنات معدات لأيام الخمول (أوافق على أنه يمكن أن تكون صيانة كبيرة) ، ماذا عن إضافة طريقة Isidleon (التاريخ) إلى فئة المعدات التي تُرجع بشكل صحيح إذا كان تاريخ تم تمريره يتطابق مع التقرير الذي تم القبض عليه وكاذبة إذا كان ذلك ليس؟

سيكون الاستعلام المرتبط بشيء على غرار الموقع.

لست متأكدًا مما إذا كان لدي بناء الجملة ، ولكن مجرد اقتراح.

نصائح أخرى

إحدى المشكلات المحتملة التي أراها هي قطعة من المعدات فقط تعرف موقعها الحالي. إذا كنت تريد معرفة ما إذا كان Loader123 في موقع Sitexyz منذ شهرين ، فلا يمكنك استرداد هذه المعلومات ، باستخدام نموذجك الحالي.

يبدو أن حبيبات الاستخدام الخاصة بك هي ليوم معين. هذا بالتأكيد يجعل الأمور أكثر بساطة ، حيث لا تحتاج إلى معرفة كيفية تتبعها ، إذا تم استخدام قطعة من المعدات من الساعة 11 مساءً إلى 4 صباحًا على Siteabc ، ثم من 1 مساءً إلى 5 مساءً على موقع Sitexyz.

مع وضع هذه الأشياء في الاعتبار ، سأقوم بإجراء تغييرات طفيفة على النموذج الخاص بك. أود أن أحتفظ بمجموعة من جميع المواقع التي كانت المعدات في (المعدات. التاريخ) ، وأوفر وظيفة راحة للعثور على الموقع الذي يوجد حاليًا (أيًا كان الموقع. بالنسبة للاستخدامات نفسها ، أود أن أقدم وظيفة راحة لإعادتها كقاموس ، مفتاح بواسطة DateTime. يمكنك بعد ذلك القيام بعمليات على مجموعة مفاتيح هذا القاموس ، لالتقاط عدد الأيام التي تم فيها استخدام قطعة من المعدات بالفعل خلال فترة معينة.

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; }
}

كما هو الحال مع أي تصميم سريع n-dirty ، أنا متأكد من أن هذا واحد لديه بعض الثقوب ، ويمكن أن يستخدم بعض التحسينات. ولكن نأمل أن يجعلك أقرب إلى ما تبحث عنه.

لن يكون لدي عداد في وقت البيانات شخصيًا ؛ كما قلت ، يبدو خطأ.

يجب أن أعترف أنني أعاني من متابعتك هنا عندما تقول يجب تصنيف شيء ما على أنه خمول. كل ما تستخدمه لتحديد ما إذا كان هناك شيء خمول ، يمكن وضعك في خاصية ، على سبيل المثال:

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))
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top