@things-factory/worklist 6.0.41 → 6.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/pages/activity/activity-list-page.ts +12 -7
- package/client/pages/todo/done-list-page.ts +1 -1
- package/client/pages/todo/todo-list-page.ts +1 -1
- package/dist-client/pages/activity/activity-list-page.js +12 -7
- package/dist-client/pages/activity/activity-list-page.js.map +1 -1
- package/dist-client/pages/todo/done-list-page.js +1 -1
- package/dist-client/pages/todo/done-list-page.js.map +1 -1
- package/dist-client/pages/todo/todo-list-page.js +1 -1
- package/dist-client/pages/todo/todo-list-page.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/controllers/activity-approval/_abort.js +11 -0
- package/dist-server/controllers/activity-approval/_abort.js.map +1 -0
- package/dist-server/controllers/activity-approval/abort.js +34 -0
- package/dist-server/controllers/activity-approval/abort.js.map +1 -0
- package/dist-server/controllers/activity-approval/approve.js +10 -0
- package/dist-server/controllers/activity-approval/approve.js.map +1 -1
- package/dist-server/controllers/activity-approval/delegate.js +10 -0
- package/dist-server/controllers/activity-approval/delegate.js.map +1 -1
- package/dist-server/controllers/activity-approval/reject.js +10 -0
- package/dist-server/controllers/activity-approval/reject.js.map +1 -1
- package/dist-server/controllers/activity-instance/abort.js +35 -1
- package/dist-server/controllers/activity-instance/abort.js.map +1 -1
- package/dist-server/controllers/activity-instance/adjust-xxx.js +16 -0
- package/dist-server/controllers/activity-instance/adjust-xxx.js.map +1 -0
- package/dist-server/controllers/activity-instance/assign.js +11 -0
- package/dist-server/controllers/activity-instance/assign.js.map +1 -1
- package/dist-server/controllers/activity-instance/end.js +34 -1
- package/dist-server/controllers/activity-instance/end.js.map +1 -1
- package/dist-server/controllers/activity-instance/index.js +0 -4
- package/dist-server/controllers/activity-instance/index.js.map +1 -1
- package/dist-server/controllers/activity-instance/pick.js +11 -0
- package/dist-server/controllers/activity-instance/pick.js.map +1 -1
- package/dist-server/controllers/activity-instance/post.js +10 -0
- package/dist-server/controllers/activity-instance/post.js.map +1 -1
- package/dist-server/controllers/activity-instance/start-xxx.js +16 -0
- package/dist-server/controllers/activity-instance/start-xxx.js.map +1 -0
- package/dist-server/controllers/activity-instance/terminate-xxx.js +25 -0
- package/dist-server/controllers/activity-instance/terminate-xxx.js.map +1 -0
- package/dist-server/controllers/activity-thread/_abort.js +29 -0
- package/dist-server/controllers/activity-thread/_abort.js.map +1 -0
- package/dist-server/controllers/activity-thread/abort.js +15 -2
- package/dist-server/controllers/activity-thread/abort.js.map +1 -1
- package/dist-server/controllers/activity-thread/delegate.js +10 -0
- package/dist-server/controllers/activity-thread/delegate.js.map +1 -1
- package/dist-server/controllers/activity-thread/end.js +12 -0
- package/dist-server/controllers/activity-thread/end.js.map +1 -1
- package/dist-server/controllers/activity-thread/index.js +0 -2
- package/dist-server/controllers/activity-thread/index.js.map +1 -1
- package/dist-server/controllers/activity-thread/restart.js +11 -0
- package/dist-server/controllers/activity-thread/restart.js.map +1 -1
- package/dist-server/controllers/activity-thread/save.js +13 -0
- package/dist-server/controllers/activity-thread/save.js.map +1 -1
- package/dist-server/controllers/activity-thread/start.js +10 -0
- package/dist-server/controllers/activity-thread/start.js.map +1 -1
- package/dist-server/controllers/activity-thread/submit.js +10 -0
- package/dist-server/controllers/activity-thread/submit.js.map +1 -1
- package/dist-server/service/activity/activity-type.js +8 -0
- package/dist-server/service/activity/activity-type.js.map +1 -1
- package/dist-server/service/activity/activity.js +19 -1
- package/dist-server/service/activity/activity.js.map +1 -1
- package/dist-server/service/activity-approval/activity-approval.js +1 -1
- package/dist-server/service/activity-approval/activity-approval.js.map +1 -1
- package/dist-server/service/activity-instance/activity-instance-mutation.js +0 -29
- package/dist-server/service/activity-instance/activity-instance-mutation.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/worklist/worklist-concept.md +69 -0
- package/package.json +9 -9
- package/server/controllers/activity-approval/_abort.ts +20 -0
- package/server/controllers/activity-approval/abort.ts +44 -0
- package/server/controllers/activity-approval/approve.ts +13 -0
- package/server/controllers/activity-approval/delegate.ts +13 -0
- package/server/controllers/activity-approval/reject.ts +13 -0
- package/server/controllers/activity-instance/abort.ts +46 -2
- package/server/controllers/activity-instance/assign.ts +17 -1
- package/server/controllers/activity-instance/end.ts +45 -2
- package/server/controllers/activity-instance/index.ts +0 -4
- package/server/controllers/activity-instance/pick.ts +17 -1
- package/server/controllers/activity-instance/post.ts +13 -0
- package/server/controllers/activity-thread/_abort.ts +43 -0
- package/server/controllers/activity-thread/abort.ts +20 -10
- package/server/controllers/activity-thread/delegate.ts +13 -0
- package/server/controllers/activity-thread/end.ts +17 -0
- package/server/controllers/activity-thread/index.ts +0 -2
- package/server/controllers/activity-thread/restart.ts +14 -0
- package/server/controllers/activity-thread/save.ts +18 -0
- package/server/controllers/activity-thread/start.ts +13 -0
- package/server/controllers/activity-thread/submit.ts +13 -0
- package/server/service/activity/activity-type.ts +7 -1
- package/server/service/activity/activity.ts +19 -0
- package/server/service/activity-approval/activity-approval.ts +1 -1
- package/server/service/activity-instance/activity-instance-mutation.ts +1 -23
- package/dist-client/components/activity-search-keys-input.d.ts +0 -17
- package/dist-client/components/activity-search-keys-input.js +0 -173
- package/dist-client/components/activity-search-keys-input.js.map +0 -1
- package/dist-client/components/grist-editor-activity-search-key.d.ts +0 -12
- package/dist-client/components/grist-editor-activity-search-key.js +0 -70
- package/dist-client/components/grist-editor-activity-search-key.js.map +0 -1
- package/dist-client/components/popup-activity-search-keys-input.d.ts +0 -17
- package/dist-client/components/popup-activity-search-keys-input.js +0 -177
- package/dist-client/components/popup-activity-search-keys-input.js.map +0 -1
- package/dist-client/pages/activity-thread/activity-thread-view.d.ts +0 -11
- package/dist-client/pages/activity-thread/activity-thread-view.js +0 -103
- package/dist-client/pages/activity-thread/activity-thread-view.js.map +0 -1
- package/dist-client/pages/todo/approval-waiting-list-page.d.ts +0 -40
- package/dist-client/pages/todo/approval-waiting-list-page.js +0 -361
- package/dist-client/pages/todo/approval-waiting-list-page.js.map +0 -1
- package/dist-client/pages/todo/assigned-list-page.d.ts +0 -36
- package/dist-client/pages/todo/assigned-list-page.js +0 -266
- package/dist-client/pages/todo/assigned-list-page.js.map +0 -1
- package/dist-client/types/domain.d.ts +0 -16
- package/dist-client/types/domain.js +0 -3
- package/dist-client/types/domain.js.map +0 -1
- package/dist-client/types/privilege.d.ts +0 -16
- package/dist-client/types/privilege.js +0 -3
- package/dist-client/types/privilege.js.map +0 -1
- package/dist-client/types/role.d.ts +0 -19
- package/dist-client/types/role.js +0 -3
- package/dist-client/types/role.js.map +0 -1
- package/dist-client/types/user.d.ts +0 -18
- package/dist-client/types/user.js +0 -12
- package/dist-client/types/user.js.map +0 -1
- package/dist-client/types.d.ts +0 -25
- package/dist-client/types.js +0 -38
- package/dist-client/types.js.map +0 -1
- package/dist-server/controllers/activity-installation/callback-registry.js +0 -21
- package/dist-server/controllers/activity-installation/callback-registry.js.map +0 -1
- package/dist-server/controllers/activity-installation-controller.js +0 -17
- package/dist-server/controllers/activity-installation-controller.js.map +0 -1
- package/dist-server/controllers/call-webhook.js +0 -41
- package/dist-server/controllers/call-webhook.js.map +0 -1
- package/dist-server/service/activity-key-set/activity-key-item-type.js +0 -50
- package/dist-server/service/activity-key-set/activity-key-item-type.js.map +0 -1
- package/dist-server/service/activity-key-set/activity-key-set-mutation.js +0 -127
- package/dist-server/service/activity-key-set/activity-key-set-mutation.js.map +0 -1
- package/dist-server/service/activity-key-set/activity-key-set-query.js +0 -97
- package/dist-server/service/activity-key-set/activity-key-set-query.js.map +0 -1
- package/dist-server/service/activity-key-set/activity-key-set-type.js +0 -74
- package/dist-server/service/activity-key-set/activity-key-set-type.js.map +0 -1
- package/dist-server/service/activity-key-set/activity-key-set.js +0 -86
- package/dist-server/service/activity-key-set/activity-key-set.js.map +0 -1
- package/dist-server/service/activity-key-set/index.js +0 -9
- package/dist-server/service/activity-key-set/index.js.map +0 -1
- package/server/controllers/activity-instance/adjust.ts +0 -25
- package/server/controllers/activity-instance/bid.ts +0 -52
- package/server/controllers/activity-instance/delegate.ts +0 -56
- package/server/controllers/activity-instance/start.ts +0 -20
- package/server/controllers/activity-instance/terminate.ts +0 -39
- package/server/controllers/activity-thread/adjust.ts +0 -40
- package/server/controllers/activity-thread/terminate.ts +0 -37
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# 워크리스트 개요
|
|
2
|
+
|
|
3
|
+
## 유저태스크
|
|
4
|
+
|
|
5
|
+
유저태스크(User Task)는 BPMN(Business Process Model and Notation)에서 프로세스를 구성하는 액티비티(Activity) 중 하나로, 사용자가 직접 수행하는 타입의 태스크를 의미합니다.
|
|
6
|
+
|
|
7
|
+
유저태스크는 프로세스에서 발생하는 업무나 작업 중에서 인간의 개입이 필요한 부분을 나타내며, 일반적으로 사용자에게 할당되어 수행됩니다. 예를 들어, 고객 정보를 입력받는 폼을 작성하거나, 결재 문서를 검토하고 승인하는 과정 등이 유저태스크에 해당됩니다.
|
|
8
|
+
|
|
9
|
+
유저태스크는 다른 액티비티와 마찬가지로 입력(Input), 출력(Output), 수행 조건(Condition) 등을 가지며, 이를 바탕으로 프로세스의 실행 흐름을 결정합니다. 또한, 유저태스크는 프로세스 진행 상황을 추적하고 모니터링할 수 있도록 사용자 인터페이스를 제공하는 것이 일반적입니다.
|
|
10
|
+
|
|
11
|
+
유저태스크의 수행은 사용자가 직접 수행하는 것이기 때문에, 수행 시간이 상대적으로 불확실하고 변동이 큰 경우가 많습니다. 따라서, 프로세스의 설계나 구현 시에는 이러한 부분을 고려하여 적절한 조치를 취해야 합니다. 예를 들어, 대기 시간을 최소화하거나, 자동화된 예외 처리를 구현하는 등의 방법이 있습니다.
|
|
12
|
+
|
|
13
|
+
## 워크리스트
|
|
14
|
+
|
|
15
|
+
워크리스트(Worklist)는 BPM(Business Process Management) 시스템에서 유저태스크를 관리하는 데 사용되는 모듈입니다. 워크리스트는 사용자가 자신에게 할당된 유저태스크 목록을 제공하며, 이를 기반으로 작업을 수행하고, 결과를 제출할 수 있도록 도와줍니다.
|
|
16
|
+
|
|
17
|
+
구체적인 기능으로는 다음과 같은 것들이 있습니다.
|
|
18
|
+
|
|
19
|
+
- 할당된 작업 목록 확인: 워크리스트는 사용자에게 할당된 모든 유저태스크 목록을 제공합니다. 이를 통해 사용자는 자신에게 할당된 작업의 현황을 한 눈에 파악할 수 있습니다.
|
|
20
|
+
- 작업 수행: 사용자는 워크리스트에서 제공하는 인터페이스를 통해 유저태스크를 수행할 수 있습니다. 예를 들어, 결재 문서를 검토하고 승인 또는 거절하는 등의 작업을 수행할 수 있습니다.
|
|
21
|
+
- 작업 상태 추적: 워크리스트는 각 유저태스크의 수행 상태를 추적하여, 현재 작업이 어느 단계에 있는지를 알려줍니다. 이를 통해 사용자는 작업이 얼마나 진행되었는지를 파악할 수 있습니다.
|
|
22
|
+
- 히스토리 조회: 워크리스트는 사용자가 수행한 작업의 히스토리를 제공합니다. 이를 통해 사용자는 자신이 어떤 작업을 수행했는지, 언제 수행했는지 등을 파악할 수 있습니다.
|
|
23
|
+
- 예외 처리: 워크리스트는 예외 상황 발생 시에도 적절한 조치를 취할 수 있도록 도와줍니다. 예를 들어, 다른 사용자에게 작업을 할당하거나, 자동으로 작업을 다시 할당하는 등의 기능을 제공합니다.
|
|
24
|
+
|
|
25
|
+
이와 같은 기능을 통해 워크리스트는 사용자가 유저태스크를 효율적으로 수행할 수 있도록 도와주며, 프로세스의 실행을 원활하게 진행할 수 있도록 지원합니다.
|
|
26
|
+
|
|
27
|
+
## 유저태스크 상태전이
|
|
28
|
+
|
|
29
|
+
워크리스트에서 관리하는 유저태스크의 상태는 보통 다음과 같이 정의됩니다.
|
|
30
|
+
|
|
31
|
+
- 대기(Waiting): 유저태스크가 생성되었지만, 아직 수행 가능한 사용자가 할당되지 않은 상태입니다.
|
|
32
|
+
- 할당(Assigned): 유저태스크가 수행 가능한 사용자에게 할당된 상태입니다.
|
|
33
|
+
- 진행중(In progress): 유저태스크가 수행 중인 상태입니다.
|
|
34
|
+
- 보류(Hold): 유저태스크의 수행이 일시 중단된 상태입니다.
|
|
35
|
+
- 완료(Completed): 유저태스크의 수행이 완료된 상태입니다.
|
|
36
|
+
|
|
37
|
+
각 상태 전이를 일으키는 이벤트는 다음과 같이 정의됩니다.
|
|
38
|
+
|
|
39
|
+
- 할당: 대기 상태의 유저태스크가 수행 가능한 사용자에게 할당됩니다.
|
|
40
|
+
- 수락: 할당 상태의 유저태스크가 사용자에게 수락되어 진행 중인 상태가 됩니다.
|
|
41
|
+
- 보류: 진행 중인 유저태스크가 보류 상태가 됩니다.
|
|
42
|
+
- 재개: 보류 상태의 유저태스크가 다시 진행 중인 상태가 됩니다.
|
|
43
|
+
- 완료: 진행 중인 유저태스크가 완료 상태가 됩니다.
|
|
44
|
+
|
|
45
|
+
## TODO 리스트
|
|
46
|
+
|
|
47
|
+
TODO 리스트는 업무 처리에서 아직 해야 할 일들을 기록하고 추적하는 방법 중 하나입니다. 예를 들어, 업무 처리 중에 다음과 같은 상황이 생길 수 있습니다.
|
|
48
|
+
|
|
49
|
+
- 중요한 일을 먼저 처리해야 할 때
|
|
50
|
+
- 기한이 다가오는 일정을 놓치지 않기 위해 일정 조율이 필요할 때
|
|
51
|
+
- 다른 사람과 공유해야 할 정보를 적어두고 추적해야 할 때
|
|
52
|
+
|
|
53
|
+
이런 경우, TODO 리스트를 작성하고 업무 처리 상황에 따라 업무를 우선순위에 따라 정렬하거나 필요한 정보를 추가로 작성하고 삭제하는 등의 작업을 수행할 수 있습니다. 이를 통해 업무 처리를 보다 체계적으로 관리할 수 있으며, 더욱 효율적으로 일을 처리할 수 있습니다.
|
|
54
|
+
|
|
55
|
+
또한, TODO 리스트는 작성자의 생각을 정리하는 데에도 도움이 됩니다. 작성자가 어떤 일을 해야 하는지 명확하게 파악하고, 일을 처리하는 과정에서 생각이 더해질 경우 리스트에 추가하고, 처리가 완료된 일은 리스트에서 제거하여 업무 처리 상황을 파악할 수 있습니다. 이를 통해 업무 처리의 투명성을 높이고, 업무 처리에 대한 관리와 추적이 용이해집니다.
|
|
56
|
+
|
|
57
|
+
## DONE 리스트
|
|
58
|
+
|
|
59
|
+
DONE 리스트는 이미 완료된 업무나 작업을 기록하는 리스트입니다. 즉, TODO 리스트에 작성한 일들을 실제로 처리하고 완료하면, 해당 업무나 작업을 DONE 리스트에 추가하여 기록합니다.
|
|
60
|
+
|
|
61
|
+
DONE 리스트를 유지하는 것은 업무나 작업의 완료 상태를 파악하고, 추후에 해당 작업이나 업무를 참조해야 할 때 유용합니다. 또한, 완료된 작업들을 모아놓고 살펴보면, 자신이 수행한 일들에 대한 성취감과 자신감을 얻을 수 있습니다.
|
|
62
|
+
|
|
63
|
+
또한, DONE 리스트를 통해 얻은 정보는 다음과 같은 용도로 활용할 수 있습니다.
|
|
64
|
+
|
|
65
|
+
- 추후에 유사한 업무나 작업을 할 때, 이전에 수행한 일들을 참고하여 좀 더 효율적으로 처리할 수 있습니다.
|
|
66
|
+
- 일정관리나 프로젝트 관리 시, 완료된 작업들의 기록을 통해 진척상황을 파악하고, 예상 완료일자를 조정하는 데 활용할 수 있습니다.
|
|
67
|
+
- 회고를 할 때, DONE 리스트를 살펴보며 지난 시간 동안의 성취감과 더불어 개선할 점을 찾을 수 있습니다.
|
|
68
|
+
|
|
69
|
+
(이 페이지는 ChatGPT로 작성되었습니다.)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/worklist",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.43",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "dist-client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -27,14 +27,14 @@
|
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@operato/graphql": "^1.0.0",
|
|
29
29
|
"@operato/grist-editor": "^1.0.0",
|
|
30
|
-
"@things-factory/attachment-base": "^6.0.
|
|
31
|
-
"@things-factory/auth-base": "^6.0.
|
|
32
|
-
"@things-factory/board-service": "^6.0.
|
|
33
|
-
"@things-factory/context-ui": "^6.0.
|
|
34
|
-
"@things-factory/organization": "^6.0.
|
|
35
|
-
"@things-factory/scheduler-client": "^6.0.
|
|
36
|
-
"@things-factory/shell": "^6.0.
|
|
30
|
+
"@things-factory/attachment-base": "^6.0.43",
|
|
31
|
+
"@things-factory/auth-base": "^6.0.43",
|
|
32
|
+
"@things-factory/board-service": "^6.0.43",
|
|
33
|
+
"@things-factory/context-ui": "^6.0.43",
|
|
34
|
+
"@things-factory/organization": "^6.0.43",
|
|
35
|
+
"@things-factory/scheduler-client": "^6.0.43",
|
|
36
|
+
"@things-factory/shell": "^6.0.43",
|
|
37
37
|
"moment-timezone": "^0.5.40"
|
|
38
38
|
},
|
|
39
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "08a649f00a8f0f489142207cb34de4b28c2e5630"
|
|
40
40
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ActivityApproval, ActivityApprovalJudgment } from '../../service/activity-approval/activity-approval'
|
|
2
|
+
|
|
3
|
+
export async function _abort(
|
|
4
|
+
{ activityApproval, comment }: { activityApproval: ActivityApproval; comment: string },
|
|
5
|
+
context: ResolverContext
|
|
6
|
+
): Promise<ActivityApproval> {
|
|
7
|
+
const { domain, user, tx } = context.state
|
|
8
|
+
|
|
9
|
+
var result = await tx.getRepository(ActivityApproval).save({
|
|
10
|
+
...activityApproval,
|
|
11
|
+
judgment: ActivityApprovalJudgment.Aborted,
|
|
12
|
+
comment,
|
|
13
|
+
transaction: 'abort',
|
|
14
|
+
updater: user,
|
|
15
|
+
terminatedAt: new Date(),
|
|
16
|
+
terminator: user
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
return result
|
|
20
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ActivityApproval, ActivityApprovalJudgment } from '../../service/activity-approval/activity-approval'
|
|
2
|
+
import { updateActivityInstanceState } from '../common'
|
|
3
|
+
import { _abort } from './_abort'
|
|
4
|
+
|
|
5
|
+
export async function abort(
|
|
6
|
+
{ id, comment }: { id: string; comment: string },
|
|
7
|
+
context: ResolverContext
|
|
8
|
+
): Promise<ActivityApproval> {
|
|
9
|
+
const { domain, user, tx } = context.state
|
|
10
|
+
|
|
11
|
+
var repository = tx.getRepository(ActivityApproval)
|
|
12
|
+
|
|
13
|
+
var activityApproval = await repository.findOne({
|
|
14
|
+
where: { domain: { id: domain.id }, id },
|
|
15
|
+
relations: ['activityThread']
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
if (!activityApproval) {
|
|
19
|
+
throw new Error(
|
|
20
|
+
context.t('error.activity-approval not found', {
|
|
21
|
+
activityApproval: id
|
|
22
|
+
})
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
Prerequisite of Abortion
|
|
28
|
+
- Previous judgement should be 'pending'
|
|
29
|
+
*/
|
|
30
|
+
if (activityApproval.judgment !== ActivityApprovalJudgment.Pending) {
|
|
31
|
+
throw new Error(
|
|
32
|
+
context.t(`error.activity-approval is already terminated`, {
|
|
33
|
+
activityInstance: id,
|
|
34
|
+
actual: activityApproval.judgment
|
|
35
|
+
})
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
var result = await _abort({ activityApproval, comment }, context)
|
|
40
|
+
|
|
41
|
+
await updateActivityInstanceState(activityApproval.activityThread.activityInstanceId, context)
|
|
42
|
+
|
|
43
|
+
return result
|
|
44
|
+
}
|
|
@@ -24,6 +24,19 @@ export async function approve(
|
|
|
24
24
|
)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
/*
|
|
28
|
+
Prerequisite of Approval
|
|
29
|
+
- Previous judgement should be 'pending'
|
|
30
|
+
*/
|
|
31
|
+
if (activityApproval.judgment !== ActivityApprovalJudgment.Pending) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
context.t(`error.activity-approval is already terminated`, {
|
|
34
|
+
activityInstance: id,
|
|
35
|
+
actual: activityApproval.judgment
|
|
36
|
+
})
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
27
40
|
const activityThread = await tx.getRepository(ActivityThread).findOne({
|
|
28
41
|
where: { domain: { id: domain.id }, id: activityApproval.activityThreadId },
|
|
29
42
|
relations: ['activityInstance']
|
|
@@ -22,6 +22,19 @@ export async function delegate(
|
|
|
22
22
|
)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/*
|
|
26
|
+
Prerequisite of Delegation
|
|
27
|
+
- Previous judgement should be 'pending'
|
|
28
|
+
*/
|
|
29
|
+
if (activityApproval.judgment !== ActivityApprovalJudgment.Pending) {
|
|
30
|
+
throw new Error(
|
|
31
|
+
context.t(`error.activity-approval is already terminated`, {
|
|
32
|
+
activityInstance: id,
|
|
33
|
+
actual: activityApproval.judgment
|
|
34
|
+
})
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
25
38
|
/* TODO user validation .. */
|
|
26
39
|
const approver = await tx.getRepository(User).findOneBy({ id: to.id })
|
|
27
40
|
|
|
@@ -23,6 +23,19 @@ export async function reject(
|
|
|
23
23
|
)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
/*
|
|
27
|
+
Prerequisite of Rejection
|
|
28
|
+
- Previous judgement should be 'pending'
|
|
29
|
+
*/
|
|
30
|
+
if (activityApproval.judgment !== ActivityApprovalJudgment.Pending) {
|
|
31
|
+
throw new Error(
|
|
32
|
+
context.t(`error.activity-approval is already terminated`, {
|
|
33
|
+
activityInstance: id,
|
|
34
|
+
actual: activityApproval.judgment
|
|
35
|
+
})
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
26
39
|
var result = await repository.save({
|
|
27
40
|
...activityApproval,
|
|
28
41
|
judgment: ActivityApprovalJudgment.Rejected,
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ActivityThreadStatus } from '../../service/activity-thread/activity-thread'
|
|
2
|
+
import { ActivityInstance, ActivityInstanceStatus } from '../../service/activity-instance/activity-instance'
|
|
2
3
|
import { evalActivityInstanceState } from '../common'
|
|
3
4
|
|
|
5
|
+
import { _abort as abortActivityThread } from '../activity-thread/_abort'
|
|
6
|
+
|
|
4
7
|
export async function abort(
|
|
5
8
|
{ id, reason }: { id: string; reason: string },
|
|
6
9
|
context: ResolverContext
|
|
@@ -11,7 +14,17 @@ export async function abort(
|
|
|
11
14
|
|
|
12
15
|
var activityInstance = await repository.findOne({
|
|
13
16
|
where: { domain: { id: domain.id }, id },
|
|
14
|
-
relations: [
|
|
17
|
+
relations: [
|
|
18
|
+
'domain',
|
|
19
|
+
'activity',
|
|
20
|
+
'activityThreads',
|
|
21
|
+
'assigneeRole',
|
|
22
|
+
'supervisoryRole',
|
|
23
|
+
'updater',
|
|
24
|
+
'creator',
|
|
25
|
+
'starter',
|
|
26
|
+
'terminator'
|
|
27
|
+
]
|
|
15
28
|
})
|
|
16
29
|
|
|
17
30
|
if (!activityInstance) {
|
|
@@ -22,6 +35,37 @@ export async function abort(
|
|
|
22
35
|
)
|
|
23
36
|
}
|
|
24
37
|
|
|
38
|
+
/*
|
|
39
|
+
Prerequisites for a Task to Be Aborted.
|
|
40
|
+
- The previous state of the task must not be End or Aborted.
|
|
41
|
+
*/
|
|
42
|
+
if (
|
|
43
|
+
activityInstance.state == ActivityInstanceStatus.Aborted ||
|
|
44
|
+
activityInstance.state == ActivityInstanceStatus.Ended
|
|
45
|
+
) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
context.t(`error.activity-instance is already terminated`, {
|
|
48
|
+
id,
|
|
49
|
+
state: activityInstance.state
|
|
50
|
+
})
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/*
|
|
55
|
+
Actions to be processed when a task is aborted
|
|
56
|
+
- All related activity threads must be aborted.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
const TERMINATED = [ActivityThreadStatus.Aborted, ActivityThreadStatus.Delegated, ActivityThreadStatus.Ended]
|
|
60
|
+
|
|
61
|
+
for (let activityThread of activityInstance.activityThreads) {
|
|
62
|
+
if (TERMINATED.includes(activityThread.state)) {
|
|
63
|
+
continue
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
await abortActivityThread({ activityThread, reason }, context)
|
|
67
|
+
}
|
|
68
|
+
|
|
25
69
|
return await repository.save({
|
|
26
70
|
...activityInstance,
|
|
27
71
|
reason,
|
|
@@ -2,7 +2,7 @@ import { In } from 'typeorm'
|
|
|
2
2
|
|
|
3
3
|
import { User } from '@things-factory/auth-base'
|
|
4
4
|
|
|
5
|
-
import { ActivityInstance } from '../../service/activity-instance/activity-instance'
|
|
5
|
+
import { ActivityInstance, ActivityInstanceStatus } from '../../service/activity-instance/activity-instance'
|
|
6
6
|
import { createActivityThreadsForUsers } from '../common'
|
|
7
7
|
|
|
8
8
|
export async function assign(
|
|
@@ -26,6 +26,22 @@ export async function assign(
|
|
|
26
26
|
)
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
/*
|
|
30
|
+
Prerequisites for a Task to Be Assigned.
|
|
31
|
+
- The previous state of the task must not be Assigned.
|
|
32
|
+
*/
|
|
33
|
+
if (
|
|
34
|
+
activityInstance.state !== ActivityInstanceStatus.Posted &&
|
|
35
|
+
activityInstance.state !== ActivityInstanceStatus.PendingAssignment
|
|
36
|
+
) {
|
|
37
|
+
throw new Error(
|
|
38
|
+
context.t(`error.activity-instance should not be assigned`, {
|
|
39
|
+
id,
|
|
40
|
+
actual: activityInstance.state
|
|
41
|
+
})
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
29
45
|
if (dueAt) {
|
|
30
46
|
activityInstance.dueAt = dueAt
|
|
31
47
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ActivityInstance } from '../../service/activity-instance/activity-instance'
|
|
1
|
+
import { ActivityInstance, ActivityInstanceStatus } from '../../service/activity-instance/activity-instance'
|
|
2
|
+
import { ActivityThreadStatus } from '../../service/activity-thread/activity-thread'
|
|
2
3
|
import { evalActivityInstanceState } from '../common'
|
|
3
4
|
|
|
4
5
|
export async function end(
|
|
@@ -10,7 +11,17 @@ export async function end(
|
|
|
10
11
|
|
|
11
12
|
var activityInstance = await repository.findOne({
|
|
12
13
|
where: { domain: { id: domain.id }, id },
|
|
13
|
-
relations: [
|
|
14
|
+
relations: [
|
|
15
|
+
'domain',
|
|
16
|
+
'activity',
|
|
17
|
+
'activityThreads',
|
|
18
|
+
'assigneeRole',
|
|
19
|
+
'supervisoryRole',
|
|
20
|
+
'updater',
|
|
21
|
+
'creator',
|
|
22
|
+
'starter',
|
|
23
|
+
'terminator'
|
|
24
|
+
]
|
|
14
25
|
})
|
|
15
26
|
|
|
16
27
|
if (!activityInstance) {
|
|
@@ -21,6 +32,38 @@ export async function end(
|
|
|
21
32
|
)
|
|
22
33
|
}
|
|
23
34
|
|
|
35
|
+
/*
|
|
36
|
+
Prerequisites for a Task to Be End.
|
|
37
|
+
- The previous state of the task must not be End or Aborted.
|
|
38
|
+
- There should be no unfinished activity threads.
|
|
39
|
+
*/
|
|
40
|
+
if (
|
|
41
|
+
activityInstance.state == ActivityInstanceStatus.Aborted ||
|
|
42
|
+
activityInstance.state == ActivityInstanceStatus.Ended
|
|
43
|
+
) {
|
|
44
|
+
throw new Error(
|
|
45
|
+
context.t(`error.activity-instance is already terminated`, {
|
|
46
|
+
id,
|
|
47
|
+
state: activityInstance.state
|
|
48
|
+
})
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const TERMINATED = [ActivityThreadStatus.Aborted, ActivityThreadStatus.Delegated, ActivityThreadStatus.Ended]
|
|
53
|
+
|
|
54
|
+
for (let activityThread of activityInstance.activityThreads) {
|
|
55
|
+
if (TERMINATED.includes(activityThread.state)) {
|
|
56
|
+
continue
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
throw new Error(
|
|
60
|
+
context.t(`error.all activity threads should be terminated`, {
|
|
61
|
+
activityThread: activityThread.id,
|
|
62
|
+
state: activityInstance.state
|
|
63
|
+
})
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
|
|
24
67
|
if (!activityInstance.startedAt) {
|
|
25
68
|
activityInstance.startedAt = new Date()
|
|
26
69
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ActivityInstance } from '../../service/activity-instance/activity-instance'
|
|
1
|
+
import { ActivityInstance, ActivityInstanceStatus } from '../../service/activity-instance/activity-instance'
|
|
2
2
|
import { ActivityThread } from '../../service/activity-thread/activity-thread'
|
|
3
3
|
import { createActivityThreadsForUsers } from '../common'
|
|
4
4
|
|
|
@@ -19,6 +19,22 @@ export async function pick(id: string, context: ResolverContext): Promise<Activi
|
|
|
19
19
|
)
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
/*
|
|
23
|
+
Prerequisites for a Task to Be Picked.
|
|
24
|
+
- The previous state of the task must not be Assigned.
|
|
25
|
+
*/
|
|
26
|
+
if (
|
|
27
|
+
activityInstance.state !== ActivityInstanceStatus.Posted &&
|
|
28
|
+
activityInstance.state !== ActivityInstanceStatus.PendingAssignment
|
|
29
|
+
) {
|
|
30
|
+
throw new Error(
|
|
31
|
+
context.t(`error.activity-instance should not be assigned`, {
|
|
32
|
+
id,
|
|
33
|
+
actual: activityInstance.state
|
|
34
|
+
})
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
22
38
|
const picked = await repository.save({
|
|
23
39
|
...activityInstance,
|
|
24
40
|
transaction: 'pick',
|
|
@@ -49,6 +49,19 @@ export async function post(
|
|
|
49
49
|
})
|
|
50
50
|
: null
|
|
51
51
|
|
|
52
|
+
/*
|
|
53
|
+
Prerequisites for a Task to Be Posted.
|
|
54
|
+
- The previous state of the task should be Draft.
|
|
55
|
+
*/
|
|
56
|
+
if (origin && origin.state !== ActivityInstanceStatus.Draft) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
context.t(`error.activity-instance is already posted`, {
|
|
59
|
+
id: id,
|
|
60
|
+
state: origin.state
|
|
61
|
+
})
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
|
|
52
65
|
if (!origin && activityId) {
|
|
53
66
|
var repository = tx.getRepository(Activity)
|
|
54
67
|
var activity = {} as Activity
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ActivityThread, ActivityThreadStatus } from '../../service/activity-thread/activity-thread'
|
|
2
|
+
import { ActivityApproval, ActivityApprovalJudgment } from '../../service/activity-approval/activity-approval'
|
|
3
|
+
import { _abort as abortActivityApproval } from '../activity-approval/_abort'
|
|
4
|
+
|
|
5
|
+
export async function _abort(
|
|
6
|
+
{ activityThread, reason }: { activityThread: ActivityThread; reason: string },
|
|
7
|
+
context: ResolverContext
|
|
8
|
+
): Promise<ActivityThread> {
|
|
9
|
+
const { domain, user, tx } = context.state
|
|
10
|
+
|
|
11
|
+
var repository = tx.getRepository(ActivityThread)
|
|
12
|
+
|
|
13
|
+
let activityApprovals = await tx.getRepository(ActivityApproval).find({
|
|
14
|
+
where: {
|
|
15
|
+
activityThread: { id: activityThread.id },
|
|
16
|
+
judgment: ActivityApprovalJudgment.Pending
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
Actions to be processed when a activity thread is aborted
|
|
22
|
+
- All related activity approvals must be aborted.
|
|
23
|
+
*/
|
|
24
|
+
for (let activityApproval of activityApprovals) {
|
|
25
|
+
await abortActivityApproval(
|
|
26
|
+
{
|
|
27
|
+
activityApproval,
|
|
28
|
+
comment: reason
|
|
29
|
+
},
|
|
30
|
+
context
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return await repository.save({
|
|
35
|
+
...activityThread,
|
|
36
|
+
reason,
|
|
37
|
+
state: ActivityThreadStatus.Aborted,
|
|
38
|
+
transaction: 'abort',
|
|
39
|
+
updater: user,
|
|
40
|
+
terminatedAt: new Date(),
|
|
41
|
+
terminator: user
|
|
42
|
+
})
|
|
43
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ActivityThread, ActivityThreadStatus } from '../../service/activity-thread/activity-thread'
|
|
2
2
|
import { updateActivityInstanceState } from '../common'
|
|
3
|
+
import { _abort } from './_abort'
|
|
3
4
|
|
|
4
5
|
export async function abort(
|
|
5
6
|
{ id, reason }: { id: string; reason: string },
|
|
@@ -22,21 +23,30 @@ export async function abort(
|
|
|
22
23
|
)
|
|
23
24
|
}
|
|
24
25
|
|
|
26
|
+
/*
|
|
27
|
+
Prerequisites for a activity thread to Be Aborted.
|
|
28
|
+
- The previous state of the activity thread must not be End or Aborted.
|
|
29
|
+
*/
|
|
30
|
+
if (
|
|
31
|
+
activityThread.state == ActivityThreadStatus.Aborted ||
|
|
32
|
+
activityThread.state == ActivityThreadStatus.Ended ||
|
|
33
|
+
activityThread.state == ActivityThreadStatus.Delegated
|
|
34
|
+
) {
|
|
35
|
+
throw new Error(
|
|
36
|
+
context.t(`error.activity-thread is already terminated`, {
|
|
37
|
+
id,
|
|
38
|
+
state: activityThread.state
|
|
39
|
+
})
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
25
43
|
if (!activityThread.startedAt) {
|
|
26
44
|
activityThread.startedAt = new Date()
|
|
27
45
|
}
|
|
28
46
|
|
|
29
|
-
|
|
30
|
-
...activityThread,
|
|
31
|
-
reason,
|
|
32
|
-
state: ActivityThreadStatus.Aborted,
|
|
33
|
-
transaction: 'abort',
|
|
34
|
-
updater: user,
|
|
35
|
-
terminatedAt: new Date(),
|
|
36
|
-
terminator: user
|
|
37
|
-
})
|
|
47
|
+
const result = await _abort({ activityThread, reason }, context)
|
|
38
48
|
|
|
39
49
|
await updateActivityInstanceState(activityThread.activityInstanceId, context)
|
|
40
50
|
|
|
41
|
-
return
|
|
51
|
+
return result
|
|
42
52
|
}
|
|
@@ -31,6 +31,19 @@ export async function delegate(
|
|
|
31
31
|
)
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
/*
|
|
35
|
+
Prerequisites for a activity thread to Be Delegated.
|
|
36
|
+
- The previous state of the activity thread should be assigned or started.
|
|
37
|
+
*/
|
|
38
|
+
if (activityThread.state !== ActivityThreadStatus.Assigned && activityThread.state !== ActivityThreadStatus.Started) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
context.t(`error.activity-thread is already terminated`, {
|
|
41
|
+
id,
|
|
42
|
+
actual: activityThread.state
|
|
43
|
+
})
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
34
47
|
if (dueAt) {
|
|
35
48
|
activityThread.dueAt = dueAt
|
|
36
49
|
}
|
|
@@ -21,6 +21,23 @@ export async function end(
|
|
|
21
21
|
)
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
/*
|
|
25
|
+
Prerequisites for a activity thread to Be End.
|
|
26
|
+
- The previous state of the activity thread must not be End or End.
|
|
27
|
+
*/
|
|
28
|
+
if (
|
|
29
|
+
activityThread.state == ActivityThreadStatus.Aborted ||
|
|
30
|
+
activityThread.state == ActivityThreadStatus.Ended ||
|
|
31
|
+
activityThread.state == ActivityThreadStatus.Delegated
|
|
32
|
+
) {
|
|
33
|
+
throw new Error(
|
|
34
|
+
context.t(`error.activity-thread is already terminated`, {
|
|
35
|
+
id,
|
|
36
|
+
actual: activityThread.state
|
|
37
|
+
})
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
|
|
24
41
|
if (!activityThread.startedAt) {
|
|
25
42
|
activityThread.startedAt = new Date()
|
|
26
43
|
}
|
|
@@ -22,6 +22,20 @@ export async function restart(
|
|
|
22
22
|
)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/*
|
|
26
|
+
Prerequisites for a activity thread to Be Delegated.
|
|
27
|
+
- The previous state of the activity thread should be Rejected.
|
|
28
|
+
*/
|
|
29
|
+
if (activityThread.state !== ActivityThreadStatus.Rejected) {
|
|
30
|
+
throw new Error(
|
|
31
|
+
context.t(`error.activity-thread should be the state`, {
|
|
32
|
+
id,
|
|
33
|
+
state: ActivityThreadStatus.Rejected,
|
|
34
|
+
actual: activityThread.state
|
|
35
|
+
})
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
25
39
|
if (output) {
|
|
26
40
|
activityThread.output = output
|
|
27
41
|
}
|
|
@@ -18,7 +18,25 @@ export async function save(id: string, save: ActivityThreadSave, context: Resolv
|
|
|
18
18
|
)
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
/*
|
|
22
|
+
Prerequisites for a activity thread to Be Saved.
|
|
23
|
+
- The previous state of the activity thread must not be terminated.
|
|
24
|
+
*/
|
|
25
|
+
if (
|
|
26
|
+
activityThread.state == ActivityThreadStatus.Aborted ||
|
|
27
|
+
activityThread.state == ActivityThreadStatus.Ended ||
|
|
28
|
+
activityThread.state == ActivityThreadStatus.Delegated
|
|
29
|
+
) {
|
|
30
|
+
throw new Error(
|
|
31
|
+
context.t(`error.activity-thread is already terminated`, {
|
|
32
|
+
id,
|
|
33
|
+
actual: activityThread.state
|
|
34
|
+
})
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
21
38
|
if (!activityThread.startedAt) {
|
|
39
|
+
/* The act of saving means automatically starting the work. */
|
|
22
40
|
activityThread.startedAt = new Date()
|
|
23
41
|
}
|
|
24
42
|
|
|
@@ -22,6 +22,19 @@ export async function start(
|
|
|
22
22
|
)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/*
|
|
26
|
+
Prerequisites for a activity thread to Be Started.
|
|
27
|
+
- The previous state of the activity thread must not be terminated.
|
|
28
|
+
*/
|
|
29
|
+
if (activityThread.state !== ActivityThreadStatus.Assigned) {
|
|
30
|
+
throw new Error(
|
|
31
|
+
context.t(`error.activity-thread should not be started`, {
|
|
32
|
+
id,
|
|
33
|
+
actual: activityThread.state
|
|
34
|
+
})
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
25
38
|
if (output) {
|
|
26
39
|
activityThread.output = output
|
|
27
40
|
}
|