代码之家  ›  专栏  ›  技术社区  ›  Wayne Molina

如何处理.NET中的定期日期(仅限日期)?

  •  4
  • Wayne Molina  · 技术社区  · 15 年前

    我正在尝试找出一种在.NET中处理重复事件的好方法,特别是针对ASP.NET MVC应用程序。其思想是用户可以创建一个事件,并指定该事件可以在特定的时间间隔(例如“每两周”、“每月一次”等)后重复发生。

    解决这个问题的最佳方法是什么?我现在的头脑风暴是有两个表:job和recurringjob。作业是“主”记录,具有作业的描述以及客户信息的关键,而递归作业链接回作业,并具有有关发生频率(例如1表示“每月一次”)和时间跨度(例如“每周”、“每月”)的附加信息。问题是如何确定和设置作业的下一个事件,因为这必须定期完成。我已经看到了两种思路:这个逻辑要么存储在数据库列中并定期更新,要么在代码中动态计算。

    关于解决这个问题有什么想法或建议吗?

    编辑:这是一个基于订阅的Web应用程序,我正在创建它,让服务企业轻松地安排他们的常见重复性工作,并跟踪他们的客户。因此,一个典型的用途可能是为史密斯先生创造一个“修剪草坪”的工作,每个月都会发生,确切的日期并不重要——这是客户看到史密斯先生每月修剪草坪并跟进的能力。

    让我重新表述以上内容,以便更好地表达我的想法。应用程序的示例用例可能如下所示:

    • 用户调出John Smith的客户记录并单击 添加作业 链接。
    • 用户填写表单以创建名为“切割草坪”的作业,开始日期为2009年11月15日,并选中一个复选框,指示此作业持续发生。用户将看到一个二级屏幕,询问作业频率。用户表示(目前还没有决定怎么做——让我们假设选择列表)作业每月发生一次。
    • 用户单击保存。

    现在,当用户查看John Smith的记录时,他们可以看到他有一份工作,“剪草坪”,从2009年11月15日开始每月都有。在主仪表板上,当它早于假定的开始日期一周时,用户会看到显示的作业带有一个指示器,如“12/15/2009-Cut Lawn(John Smith)”。在预定日期前一周,公司里有人给他打电话,说他要到2010年1月1日才能出城,所以他想重新安排他的约会。我们的用户可以将作业的日期更改为2010年1月1日,现在循环将从该日期开始一个月(例如,下一次将是2010年2月1日)。这背后的想法是,这个应用程序的目标是像草坪护理、水管工、地毯清洁工之类的企业,确切的日期并不那么重要(因为它可以而且会随着人们的忙碌而改变),关键是给企业一个指标,史密斯先生的每月服务即将到来,应该有人给他打电话让他去Dete。具体什么时候可以安排。实际上,给这些企业一种跟踪重复业务的方法,并知道何时该跟进客户。

    4 回复  |  直到 12 年前
        1
  •  2
  •   Murph    15 年前

    这是我之前考虑过的一个问题——虽然我没有在现实世界中付诸实践,但您所使用的元素如下:

    • 职位描述
    • 复发模式
    • 下一次计划发生
    • 作业/发生历史记录

    到目前为止,很容易。这些是存储在数据库中的东西,这意味着根据给定的日期计算“下一个”日期,并且在业务逻辑中存在定期模式。

    为客户提供的关键信息 一般来说 只要正确维护(当您将当前事件标记为“已完成”时创建一个新事件),下一次计划发生的列表是否有效。不幸的是,为了计划的目的,您可能需要能够显示接下来的几个事件,这是事情变得有趣的点(-:两种选择:即时计算(我认为这可能更好,尤其是在一些智能的“缓存”)或预计算(总体负载较低,但要管理和保存的数据较多)。t最新版本更为复杂(除了考虑到创建日程条目的进度还有多远之外)。

    所以-回答你的问题-为什么我认为在飞行中更好?基本上是因为 只有 “固定”点是下一个计划的事件,您将希望根据日志的当前值(ish)计算日志,如果日志发生更改,则需要重新计算。您可以创造性地保留为特定工作缓存的下一个日期的列表,以根据需要帮助提高性能,但在真正持久的存储方面,您只对下一个日期感兴趣。

    最后的几点想法——首先,如果发生的日期改变了(如你所问的),下一个日期有两个选择,要么a)不管改变(甚至取消——又是另一个挑战),继续原计划。当前事件或b)实际完成的时间表,即,对于某些事情,我们希望它们在某一天每隔n周发生一次,但可能需要不时地来回摆动日期,而对于其他事情,我们希望它们在上一次完成后4周发生。其次,正如jon所提示的,您应该查看iCal,不一定是为了实现,但一定要帮助理解哪些元素可能构成日历条目和重复模式。

        2
  •  2
  •   Jon Skeet    15 年前

    你的规则可能有多复杂?如果你能说服那些能让事情简单化的力量,你的生活将会更加愉快:)你也应该让他们在各种测试情况下签字——如果某件事情计划在30号每月发生一次,那它是否应该在2月发生?至少通过使用日期(没有时间),你应该不用担心夏令时…

    你可能想看看 DDay.iCal 或者为.NET寻找其他的iCal(RFC2445)实现——但是判断库的质量可能很难,因为它是一个复杂的领域,有大量的角落案例。

    在数据库方面,我会即时计算它,除非这证明太痛苦。很明显,您必须在某个地方保留相同的“解决下一次出现的问题”代码,它消除了定期更新的复杂性。

        3
  •  0
  •   dice    15 年前

    将计划存储在数据库表或XML文件中是有意义的。主要是因为作业只能由ASP.NET应用程序调度。事件必须由另一个应用程序触发-很可能是检查ASP.NET应用程序存储的配置的Windows服务。

    至于表的结构,它真正取决于您具体需要调度什么——我想您真正需要的只是在单个表中执行的用户ID、作业ID和日期。

        4
  •  0
  •   Joseph    15 年前

    我在数据库方面看到了这一点,让我告诉你 真的? 丑陋。

    我建议使用某种类型的业务模型来处理重复事件的想法(即从业务模型中即时计算)。

    就数据库而言,您肯定需要存储与业务模型相关的数据,但除此之外,您还应该考虑 预测 您的定期事件(可能长达一年左右),这将允许应用程序外部的使用能够使用您的事件。例如,如果您有一个报告系统,需要知道人们的日程安排等。

    推荐文章