我希望获得有关设计必须支持重复工作订单的工作订单系统的建议。例如,管理员需要能够将工单设置为在某个时间单位内重复,例如每 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(如果存在)或 createdAt(如果不存在)来计算实际的重复日期。moment.js 非常适合这个。如果实际的重复日期是 <= now,系统将复制工单,将 recurFrom 属性设置为基本工单的 ID,并更新相应的字段。
读
这个有点棘手,因为工作订单有相关的注释、活动日志条目和系统日志条目。这些关联的项目都存在于它们自己的文档中,它们的 workorderId 属性设置为父工作订单的 ID。查找单个工作订单的相关文档很简单,由 couchdb 完成。
但是,以注释为例,客户希望查看过去工作订单的所有注释以及发生工作订单的注释。我通过使用 ElasticSearch 来查找共享相同 recurFrom 值(基本工作订单的 id)或具有与工作订单的 recurFrom 属性(基本工作订单)匹配的 _id 的所有工作订单 ID 来完成这项工作。然后系统按 createdAt 顺序(按时间顺序)批量获取相应的注释并将它们传递给视图。
我还没有弄清楚如何显示所有内容。理论上,用户可以在用户正在查看的最新注释之后将注释添加到先前的工作订单,因此按时间顺序显示注释可能会造成混淆。通过按颜色或单独的部分区分当前工作订单的笔记与其他笔记,我也许可以在视图中解决这个问题,但我不确定。
更新
这里看起来很棘手的一件事是更新 recurInValue。如果情况发生变化,我认为我需要更改基本工作订单,而不是发生工作订单,例如,如果用户清除 recurInValue,工作订单将停止重复。
删除
这一点我还是有点模糊。如果用户想删除一个发生工单,我可以删除它及其相关文档,并询问他们是否要阻止工单重复。如果他们说是,我可以清除基本工单的 recurInValue。
如果用户删除了一个基本工单,重复显然会停止,但所有出现的工单都会有一个指向不存在的文档的 recurFrom 属性。如果我保持 recurFrom 属性不变,我将能够加载所有发生工作人员的相关文档并正确显示它们,但感觉不对。
其他选项
我不依赖于这个实现,这只是我到目前为止想出的。我考虑了一个链表实现,其中每个出现的工作订单都会指向前一个工作订单,但似乎必须在一长串工作订单中“遍历列表”并单独加载每个工作订单的关联文档会导致查询数量过多和效率不是很高。
您能给我的任何建议都将不胜感激!