重复性工作订单系统的体系结构

我希望得到关于devise一个必须支持反复工作的工作订单系统的build议。 例如,pipe理员需要设置一个工单,以每6个月为单位重复一次。

我使用的NodeJS作为服务器,一个noSQL数据库(couchDB)的存储和elasticsearch作为search引擎。 这是我第一次尝试在文档结构上支持这个function:

Base Workorder { _id: 1 ... Unrelated fields "recurInValue" : 6, "recurInUnit" : "months" "lastRecurredOn": 1368914552527, "numOcurrences": 1, "numTimesToRepeat": null, "stopOn" : 1384920941195, "createdAt" 1364936177618 } Occurrence Workorder { _id: 2 ... Unrelated fields "recurFrom" : 1 } Occurrence Workorder { _id: 3 ... Unrelated fields "recurFrom" : 1 } 

我目前的CRUD计划是:

创build

cron作业将每小时轮询一次数据库,并获取所有具有非空的recurInValue(基本工作订单)的工作订单。 然后,它会通过将recurInValue和recurInUnit给予lastRecurredOn(如果存在)或creationAt(如果不存在)的时间相加来计算重复的实际date。 moment.js很适合这个。 如果重现的实际date<=现在,系统将复制工单,将recurFrom属性设置为基工单的ID,并更新相应的字段。

这是一个棘手的问题,因为工作人员已经关联了笔记,活动日志条目和系统日志条目。 这些关联的项目都存在于其自己的文档中,该文档的workorderId属性设置为父工作订单的ID。 定位一个单独的工单的相关文件是微不足道的,由couchdb完成。

但是,以笔记为例,客户希望看到过去的工作订单中的所有笔记以及事件工单的笔记。 我已经通过使用ElasticSearch来find所有工作订单ID,它们共享相同的recurFrom值(基本工作订单的ID)或者具有与工作订单的recurFrom属性(基本工作订单)相匹配的_id的所有工作订单ID。 系统然后批量获取createdAt顺序(按时间顺序)的相应音符,并将其传递给视图。

我还没有制定出如何显示一切。 用户理论上可以在用户正在查看的最新音符之后向先前的工作音符添加音符,以便按照时间顺序显示音符可能是令人困惑的。 我可以通过将当前工作顺序的笔记与其他笔记以不同颜色或单独的部分区分开来,来解决这个问题,但我不确定。

更新

有一点似乎棘手的是更新recurInValue。 如果这种变化,我想我需要改变基本的工作顺序,而不是发生的工作顺序,例如,如果用户清除了recurInValue,工作顺序将停止重复。

删除

我对此仍然有点模糊。 如果用户想要删除一个事件工单,我可以删除它和相关的文档,并询问他们是否要停止工单重复。 如果他们说是,我可以清除基本工单的recurInValue。

如果用户删除了一个基本工作顺序,重复显然会停止,但是所有的发生工作顺序都会有一个指向一个不存在的文档的recurFrom属性。 如果我按照原样离开recurFrom属性,我将能够加载所有出现工作人员的相关文档并正确显示它们,但是这种感觉不正确。

其他选项

我没有被绑定到这个实现,这只是我到目前为止。 我考虑了一个链接列表实现,其中每个出现的工作单将指向以前的工作单,但是似乎必须在工作单的一个长链中“走单”,并单独加载每个工单的相关单据会导致过多的查询和不是很有效率。

任何build议,你可以给我感激!