定期工作单系统的体系结构

时间:2013-05-20 04:42:12

标签: node.js architecture couchdb elasticsearch

我希望就设计一个必须支持经常性工作人员的工作订单系统提出建议。例如,管理员需要能够将工作单设置为在每6个月的单位时间内重复。

我使用NodeJS作为服务器,使用noSQL数据库(couchDB)进行存储,使用elasticsearch作为搜索引擎。这是我第一次尝试支持这个文档结构:

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计划是:

创建

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

这个有点棘手,因为工作人员有关联的注释,活动日志条目和系统日志条目。这些关联项目都存在于自己的文档中,这些文档的workorderId属性设置为父工作订单的ID。查找单个工作订单的相关文档非常简单,由couchdb完成。

但是,以笔记为例,客户希望查看过去工作人员的所有笔记以及发生工作单的笔记。我通过使用ElasticSearch查找所有共享相同recurFrom值(基本工作顺序的id)或具有与工作顺序的recurFrom属性(基本工作顺序)匹配的_id的workorderID来实现此功能。然后系统以createdAt顺序(按时间顺序)批量提取相应的注释,并将它们传递给视图。

我还没有弄清楚如何展示一切。理论上,用户可以在用户正在查看的最新笔记之后向之前的工作订单添加注释,因此按时间顺序显示注释可能会令人困惑。我可以通过颜色或单独的部分区分当前工单的笔记与其他笔记来解决这个问题,但我不确定。

更新

这里看起来很棘手的一件事是更新recurInValue。如果这发生了变化,我想我需要更改基本工作顺序,而不是发生工作顺序,因此,例如,如果用户清除recurInValue,则工作顺序将停止重复。

删除

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

如果用户删除基本工作单,则重复显然会停止,但所有出现工作单元都将具有指向不存在的文档的recurFrom属性。如果我按原样保留recurFrom属性,我将能够加载所有出现的workorer相关文档并正确显示它们,但感觉不对。

其他选项

我并不依赖于这个实现,这是我到目前为止所提出的。我考虑了一个链表实现,其中每个事件的工作顺序都会指向上一个工作顺序,但似乎必须在一长串工作单中“遍历列表”并单独加载每个工作单的相关文档会导致过多的查询和不是很有效率。

您可以给我的任何建议表示赞赏!

0 个答案:

没有答案