@ddd-tool/domain-designer-cli 0.1.0-beta.13 → 0.1.0-beta.15
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/README.md +12 -20
- package/bin/domain-designer-cli.cjs +6 -5
- package/package.json +2 -2
- package/src/views/complex-example-detail/book.ts +447 -0
- package/src/views/complex-example-detail/common.ts +4 -0
- package/src/views/complex-example-detail/user.ts +83 -0
- package/src/views/complex-example.ts +4 -0
- package/src/views/design-en.ts +1 -1
- package/src/views/design-zh.ts +1 -1
- package/src/views/index.ts +12 -4
- package/src/views/simple-example.ts +94 -0
- package/templates/complex-example-detail/book.ts +447 -0
- package/templates/complex-example-detail/common.ts +4 -0
- package/templates/complex-example-detail/user.ts +83 -0
- package/templates/complex-example.ts +4 -0
- package/templates/node_modules/version.txt +1 -1
- package/templates/simple-example.ts +94 -0
- package/templates/example-agg.ts +0 -31
- package/templates/example.ts +0 -91
package/README.md
CHANGED
|
@@ -12,13 +12,11 @@
|
|
|
12
12
|
|
|
13
13
|
## 1 前置依赖
|
|
14
14
|
|
|
15
|
-
[nodejs](https://nodejs.org/en/download/) >= 18
|
|
15
|
+
- [nodejs](https://nodejs.org/en/download/) >= 18
|
|
16
16
|
|
|
17
|
-
[bun](https://bun.sh/) OR [pnpm](https://pnpm.io/) >= 9
|
|
17
|
+
- 可选:[bun](https://bun.sh/) OR [pnpm](https://pnpm.io/) >= 9
|
|
18
18
|
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
- 本程序会优先使用 bun 运行,如果没有则切换为 pnpm
|
|
19
|
+
- 本程序会优先使用 bun 运行,如果没有则切换为 pnpm,再其次使用 npm
|
|
22
20
|
|
|
23
21
|
## 2 安装
|
|
24
22
|
|
|
@@ -28,12 +26,6 @@ bun i @ddd-tool/domain-designer-cli -g
|
|
|
28
26
|
pnpm i @ddd-tool/domain-designer-cli -g
|
|
29
27
|
```
|
|
30
28
|
|
|
31
|
-
对于 linux / macOS 系统:
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
chmod +x *.sh
|
|
35
|
-
```
|
|
36
|
-
|
|
37
29
|
## 3 更新版本
|
|
38
30
|
|
|
39
31
|
### 3.1 更新软件
|
|
@@ -44,12 +36,6 @@ bun i @ddd-tool/domain-designer-cli@latest -g
|
|
|
44
36
|
pnpm i @ddd-tool/domain-designer-cli@latest -g
|
|
45
37
|
```
|
|
46
38
|
|
|
47
|
-
对于 linux / macOS 系统:
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
chmod +x *.sh
|
|
51
|
-
```
|
|
52
|
-
|
|
53
39
|
### 3.2 更新工作空间
|
|
54
40
|
|
|
55
41
|
在已有的工作空间中执行命令
|
|
@@ -72,6 +58,12 @@ bunx domain-designer-cli init
|
|
|
72
58
|
domain-designer-cli init
|
|
73
59
|
```
|
|
74
60
|
|
|
61
|
+
对于 linux / macOS 系统用户,需要再执行:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
chmod +x *.sh
|
|
65
|
+
```
|
|
66
|
+
|
|
75
67
|
- 推荐将工作空间中的所有文件放入实际项目,随项目一起进行版本控制。由于 ts 代码的表达能力并不弱,在多人协作的时候,即使其他人没有安装本工具,也可以通过代码安全地了解、调整领域模型。
|
|
76
68
|
|
|
77
69
|
- 初始化后的目录包含如下内容:
|
|
@@ -106,9 +98,9 @@ domain-designer-cli init
|
|
|
106
98
|
|
|
107
99
|
- [x] Kotlin
|
|
108
100
|
|
|
109
|
-
- [
|
|
101
|
+
- [x] C#
|
|
110
102
|
|
|
111
|
-
- [
|
|
103
|
+
- [x] GoLang
|
|
112
104
|
|
|
113
105
|
## 5 其他说明
|
|
114
106
|
|
|
@@ -140,7 +132,7 @@ domain-designer-cli init
|
|
|
140
132
|
|
|
141
133
|
- [x] Windows
|
|
142
134
|
|
|
143
|
-
- [
|
|
135
|
+
- [x] Linux
|
|
144
136
|
|
|
145
137
|
- [ ] Mac
|
|
146
138
|
|
|
@@ -13529,7 +13529,7 @@ function onCancel() {
|
|
|
13529
13529
|
// src/utils/package-info.ts
|
|
13530
13530
|
var package_info_default = {
|
|
13531
13531
|
"name": "@ddd-tool/domain-designer-cli",
|
|
13532
|
-
"version": "0.1.0-beta.
|
|
13532
|
+
"version": "0.1.0-beta.15",
|
|
13533
13533
|
"private": true,
|
|
13534
13534
|
"type": "module",
|
|
13535
13535
|
"files": [
|
|
@@ -13544,7 +13544,7 @@ var package_info_default = {
|
|
|
13544
13544
|
},
|
|
13545
13545
|
"readme": "ERROR: No README data found!",
|
|
13546
13546
|
"homepage": "https://github.com/ddd-tool/domain-designer-cli-node#readme",
|
|
13547
|
-
"_id": "@ddd-tool/domain-designer-cli@0.1.0-beta.
|
|
13547
|
+
"_id": "@ddd-tool/domain-designer-cli@0.1.0-beta.15"
|
|
13548
13548
|
};
|
|
13549
13549
|
|
|
13550
13550
|
// src/domain/environment-agg/index.ts
|
|
@@ -13948,8 +13948,9 @@ async function execute(args) {
|
|
|
13948
13948
|
if (existsFiles.filter((name) => name.endsWith(".ts")).length === 0) {
|
|
13949
13949
|
throw new Error($t2("error.shouldBeValidWorkspaceOrEmptyDir{dir}", { dir: distDir }));
|
|
13950
13950
|
}
|
|
13951
|
-
copyIgnores.push("example
|
|
13952
|
-
copyIgnores.push("example.ts");
|
|
13951
|
+
copyIgnores.push("simple-example.ts");
|
|
13952
|
+
copyIgnores.push("complex-example.ts");
|
|
13953
|
+
copyIgnores.push("complex-example-detail");
|
|
13953
13954
|
copyIgnores.push("node_modules");
|
|
13954
13955
|
}
|
|
13955
13956
|
log_default.printInfo("================ \u521D\u59CB\u5316\u5DE5\u4F5C\u7A7A\u95F4: Starting... ================");
|
|
@@ -14042,7 +14043,7 @@ async function execute3(args) {
|
|
|
14042
14043
|
import_fs4.default.rmSync(import_path5.default.join(distDir, gitignore.name));
|
|
14043
14044
|
}
|
|
14044
14045
|
copyFolderRecursive(import_path5.default.join(environmentAgg3.states.webRoot.value, "templates"), distDir, {
|
|
14045
|
-
ignore: ["example.ts", "example
|
|
14046
|
+
ignore: ["simple-example.ts", "complex-example.ts", "complex-example-detail"]
|
|
14046
14047
|
});
|
|
14047
14048
|
if (runWebScript) {
|
|
14048
14049
|
import_fs4.default.writeFileSync(import_path5.default.join(distDir, runWebScript.name), runWebScript.content, "utf-8");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ddd-tool/domain-designer-cli",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.15",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "",
|
|
6
6
|
"type": "module",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"license": "Apache-2.0",
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@ddd-tool/domain-designer-core": "0.1.0-beta.10",
|
|
31
|
-
"@ddd-tool/domain-designer-ui-component": "0.1.0-beta.
|
|
31
|
+
"@ddd-tool/domain-designer-ui-component": "0.1.0-beta.10",
|
|
32
32
|
"@primeuix/themes": "^1.1.1",
|
|
33
33
|
"@types/node": "^22.15.21",
|
|
34
34
|
"@vitejs/plugin-vue": "^5.2.4",
|
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
import { i, d } from './common';
|
|
2
|
+
import {
|
|
3
|
+
管理员,
|
|
4
|
+
会员,
|
|
5
|
+
userValues,
|
|
6
|
+
定时器,
|
|
7
|
+
用户聚合,
|
|
8
|
+
会员账号读模型,
|
|
9
|
+
} from './user';
|
|
10
|
+
|
|
11
|
+
export const bookValues = {
|
|
12
|
+
二维码: i.id('qrCode', '二维码,一书一码,业务id'),
|
|
13
|
+
书名: i.valueObj('bookName'),
|
|
14
|
+
ISBN: i.valueObj('isbn', '国际标准书号'),
|
|
15
|
+
图片: i.valueObj('picture'),
|
|
16
|
+
简介: i.valueObj('bookIntroduction'),
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const 新书已入库 = d.event(
|
|
20
|
+
'BookPutInStorage',
|
|
21
|
+
[
|
|
22
|
+
bookValues.二维码,
|
|
23
|
+
bookValues.ISBN,
|
|
24
|
+
bookValues.书名,
|
|
25
|
+
bookValues.图片,
|
|
26
|
+
bookValues.简介,
|
|
27
|
+
],
|
|
28
|
+
'新书已入库',
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
const 书已上架 = d.event('BookPutOnShelf', [bookValues.二维码], '书已上架');
|
|
32
|
+
|
|
33
|
+
const 书已下架 = d.event('BookPutOnShelf', [bookValues.二维码], '书已下架');
|
|
34
|
+
|
|
35
|
+
const 书已被预定 = d.event(
|
|
36
|
+
'BookReserved',
|
|
37
|
+
[i.id('预定id'), bookValues.二维码, '预定人: userId', '预定时间'],
|
|
38
|
+
'书已被预定',
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const 预定已超时 = d.event(
|
|
42
|
+
'BookReserveTimeOut',
|
|
43
|
+
[i.id('预定id'), bookValues.二维码, '预定人: userId'],
|
|
44
|
+
'预定已超时',
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
const 预定已取消 = d.event(
|
|
48
|
+
'BookReserveCanceled',
|
|
49
|
+
['预定id', bookValues.二维码, '预定人: userId'],
|
|
50
|
+
'预定已取消',
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const 书已被借出 = d.event(
|
|
54
|
+
'BookBorrowedOut',
|
|
55
|
+
['借书id', bookValues.二维码, '借出人: userId', '借出时间', '应还书时间'],
|
|
56
|
+
'书已被借出',
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const 书已被还 = d.event(
|
|
60
|
+
'BookReturned',
|
|
61
|
+
['借书id', bookValues.二维码, '借出人: userId', '归还前已遗失'],
|
|
62
|
+
'书已被还',
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const 书已被遗失 = d.event(
|
|
66
|
+
'BookLost',
|
|
67
|
+
['借书id', bookValues.二维码, '借书人: userId'],
|
|
68
|
+
'书已被遗失',
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
export const 用户还书已逾期 = d.event(
|
|
72
|
+
'UserReturnBookTimeOut',
|
|
73
|
+
[userValues.用户id],
|
|
74
|
+
'用户还书已逾期',
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
const 还书已逾期 = d.event(
|
|
78
|
+
'BookReturnTimeOut',
|
|
79
|
+
['借书id', '借书人: userId', bookValues.二维码],
|
|
80
|
+
'还书已逾期',
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const 入库新书 = d.command(
|
|
84
|
+
'PutBookInStorage',
|
|
85
|
+
[
|
|
86
|
+
bookValues.二维码,
|
|
87
|
+
bookValues.ISBN,
|
|
88
|
+
bookValues.书名,
|
|
89
|
+
bookValues.图片,
|
|
90
|
+
bookValues.简介,
|
|
91
|
+
],
|
|
92
|
+
d.note`入库新书
|
|
93
|
+
1. 二维码不能重复`,
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
const 上架书 = d.command(
|
|
97
|
+
'PutBookOnShelf',
|
|
98
|
+
[bookValues.二维码],
|
|
99
|
+
d.note`上架书
|
|
100
|
+
1. 书存在且已下架才能上架`,
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
const 下架书 = d.command(
|
|
104
|
+
'RemoveBookFromShelf',
|
|
105
|
+
[bookValues.二维码],
|
|
106
|
+
d.note`下架书
|
|
107
|
+
1. 书存在且已上架才能下架`,
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
const 预定书 = d.command(
|
|
111
|
+
'ReserveBook',
|
|
112
|
+
[bookValues.ISBN, '预定人: userId'],
|
|
113
|
+
d.note`预定书
|
|
114
|
+
1.有可预定的书
|
|
115
|
+
2.会员账户没有被暂停
|
|
116
|
+
3.会员已预定或者借出的书小于3本
|
|
117
|
+
4.从可预订的指定ISBN的书里随机选取`,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
const 超时预定 = d.command(
|
|
121
|
+
'ReserveTimeOut',
|
|
122
|
+
['预定id'],
|
|
123
|
+
d.note`超时预定
|
|
124
|
+
1.当前时间离预定时间超过24小时`,
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
const 取消预定 = d.command(
|
|
128
|
+
'ReserveCanceled',
|
|
129
|
+
['预定id'],
|
|
130
|
+
d.note`取消预定
|
|
131
|
+
1.有预定,且在24小时内`,
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const 借出书装饰命令 = d.facadeCmd(
|
|
135
|
+
'BorrowOut',
|
|
136
|
+
['借书人:userId'],
|
|
137
|
+
d.note`借出书装饰命令
|
|
138
|
+
1.会员账号没有被暂停
|
|
139
|
+
2.书已上架,没有被借出,没有被预定
|
|
140
|
+
3.会员已预定或者借出的书小于3本
|
|
141
|
+
4.书的二维码存在`,
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
const 还书 = d.command(
|
|
145
|
+
'ReturnBook',
|
|
146
|
+
[bookValues.二维码],
|
|
147
|
+
d.note`还书
|
|
148
|
+
1.书的二维码存在
|
|
149
|
+
2.书已被借出或者遗失
|
|
150
|
+
3.归还已遗失的书,如果时间过了1个月,也算逾期`,
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
const 上报遗失 = d.command(
|
|
154
|
+
'ReportLost',
|
|
155
|
+
['借书id'],
|
|
156
|
+
d.note`上报遗失
|
|
157
|
+
1.书存在,被借出
|
|
158
|
+
2.遗失的书自动下架`,
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
const 逾期 = d.command(
|
|
162
|
+
'TimeOutBorrowing',
|
|
163
|
+
['借书id'],
|
|
164
|
+
d.note`逾期
|
|
165
|
+
1.书被借出,且1个月未还
|
|
166
|
+
2.增加借书会员的逾期次数`,
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
const 书聚合 = d.agg('BookAgg', [bookValues.二维码], '书聚合');
|
|
170
|
+
|
|
171
|
+
const 用户占用书聚合 = d.agg(
|
|
172
|
+
'UserOcuppyBookAgg',
|
|
173
|
+
[userValues.用户id, '占用数量'],
|
|
174
|
+
'用户占用书聚合',
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
const 增加账户逾期次数规则 = d.policy(
|
|
178
|
+
'SuspendAccountWhenTimeOut',
|
|
179
|
+
d.note`增加账户逾期次数`,
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
const 增加逾期次数 = d.command(
|
|
183
|
+
'IncreaseAccountTimeOutCount',
|
|
184
|
+
[userValues.用户id],
|
|
185
|
+
d.note`增加逾期次数
|
|
186
|
+
1.会员累计逾期达到3次暂停账户
|
|
187
|
+
2.会员账户当前是启用才能被暂停`,
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
const 下架已遗失书规则 = d.policy('RemoveBookWhenLost', d.note`下架已遗失书`);
|
|
191
|
+
|
|
192
|
+
const 上架被找回的遗失的书规则 = d.policy(
|
|
193
|
+
'PutShelfLostBook',
|
|
194
|
+
d.note`上架被找回的遗失的书规则
|
|
195
|
+
1.书被借出后遗失`,
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
const 下架书时取消预定规则 = d.policy(
|
|
199
|
+
'CancelReserveWhenRemoveFromShelf',
|
|
200
|
+
'下架书时取消预定规则',
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
const 用户占用书规则 = d.policy(
|
|
204
|
+
'modifyUserOcuppyBookPolicy',
|
|
205
|
+
d.note`用户占用书规则
|
|
206
|
+
借出、预定占用书增加
|
|
207
|
+
归还、取消预定、预定超时、遗失时占用书减少`,
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
const 用户占用书变化了 = d.event(
|
|
211
|
+
'UserOcuppyBookChanged',
|
|
212
|
+
[userValues.用户id, '新占用量', '旧占用量'],
|
|
213
|
+
'用户占用书变化了',
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
const 调整用户占书量 = d.command(
|
|
217
|
+
'ModifyUserOcuppyBook',
|
|
218
|
+
[userValues.用户id, '调整值'],
|
|
219
|
+
'调整用户占书量',
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
const 预定聚合 = d.agg(
|
|
223
|
+
'ReserveAgg',
|
|
224
|
+
[i.id('预定id'), '预定时间', '预定人', bookValues.二维码, '是否有效'],
|
|
225
|
+
'预定聚合',
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
const 借出聚合 = d.agg(
|
|
229
|
+
'',
|
|
230
|
+
['借书ID', bookValues.二维码, '上报过遗失', '是否待还书', '借出时间'],
|
|
231
|
+
'借出聚合',
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
const 可预订书聚合 = d.agg(
|
|
235
|
+
'AvailableBooksAgg',
|
|
236
|
+
[
|
|
237
|
+
bookValues.ISBN,
|
|
238
|
+
i.valueObj('二维码集合', d.note`${bookValues.二维码}`),
|
|
239
|
+
i.func('是否包含书'),
|
|
240
|
+
],
|
|
241
|
+
'可预订书聚合',
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
const 添加可预订书 = d.command(
|
|
245
|
+
'AddToAvailableBooksCmd',
|
|
246
|
+
[bookValues.ISBN, bookValues.二维码],
|
|
247
|
+
'添加可预订书',
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
const 移除可预订书 = d.command(
|
|
251
|
+
'RemoveFromAvailableBooksCmd',
|
|
252
|
+
[bookValues.ISBN, bookValues.二维码],
|
|
253
|
+
'移除可预订书',
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
const 书已可预订 = d.event(
|
|
257
|
+
'BookAddedToAvailableEvt',
|
|
258
|
+
[bookValues.ISBN, bookValues.二维码],
|
|
259
|
+
'书已可预订',
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
const 书已不可预订 = d.event(
|
|
263
|
+
'BookRemovedFromAvailableEvt',
|
|
264
|
+
[bookValues.ISBN, bookValues.二维码],
|
|
265
|
+
'书已不可预订',
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
const 添加可预订策略 = d.policy('AddAvailablePolicy', '添加可预订策略');
|
|
269
|
+
|
|
270
|
+
const 移除可预订策略 = d.policy('RemoveAvailablePolicy', '移除可预订策略');
|
|
271
|
+
|
|
272
|
+
const 借书服务 = d.service(
|
|
273
|
+
'BorrowBookService',
|
|
274
|
+
d.note`借书服务
|
|
275
|
+
书可预定则可借出
|
|
276
|
+
书已预定时借书人是预定则可借`,
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
const 借出书 = d.command(
|
|
280
|
+
'BorrowOutCmd',
|
|
281
|
+
['借书人id', bookValues.二维码],
|
|
282
|
+
'借出书',
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
const ISBN读模型 = d.readModel(
|
|
286
|
+
'ISBNStatsRM',
|
|
287
|
+
[
|
|
288
|
+
bookValues.ISBN,
|
|
289
|
+
'累计借出次数',
|
|
290
|
+
'当前在馆数',
|
|
291
|
+
'当前借出数',
|
|
292
|
+
'书名',
|
|
293
|
+
'图片',
|
|
294
|
+
'简介',
|
|
295
|
+
],
|
|
296
|
+
'ISBN读模型',
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
const ISBN每日借出数读模型 = d.readModel(
|
|
300
|
+
'ISBNDailyBorrowCountRM',
|
|
301
|
+
[bookValues.ISBN, i.id('date'), '借出次数'],
|
|
302
|
+
'ISBN每日借出数',
|
|
303
|
+
);
|
|
304
|
+
|
|
305
|
+
const 借出读模型 = d.readModel(
|
|
306
|
+
'',
|
|
307
|
+
[
|
|
308
|
+
'借书id',
|
|
309
|
+
bookValues.二维码,
|
|
310
|
+
bookValues.ISBN,
|
|
311
|
+
'书名',
|
|
312
|
+
'借书人id',
|
|
313
|
+
'借书人名',
|
|
314
|
+
'借出时间',
|
|
315
|
+
'应还书时间',
|
|
316
|
+
'还书时间',
|
|
317
|
+
'是否逾期',
|
|
318
|
+
'是否遗失',
|
|
319
|
+
],
|
|
320
|
+
'借出读模型',
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
// =========================== 流程定义 ===========================
|
|
324
|
+
|
|
325
|
+
const 新书入库流程 = d.startWorkflow('新书入库流程');
|
|
326
|
+
管理员.command(入库新书).agg(书聚合).event(新书已入库).readModel(ISBN读模型);
|
|
327
|
+
|
|
328
|
+
const 上架流程 = d.startWorkflow('上架流程');
|
|
329
|
+
管理员
|
|
330
|
+
.command(上架书)
|
|
331
|
+
.agg(书聚合)
|
|
332
|
+
.event(书已上架)
|
|
333
|
+
.policy(添加可预订策略)
|
|
334
|
+
.command(添加可预订书)
|
|
335
|
+
.agg(可预订书聚合)
|
|
336
|
+
.event(书已可预订);
|
|
337
|
+
|
|
338
|
+
const 下架流程 = d.startWorkflow('下架流程');
|
|
339
|
+
管理员.command(下架书).agg(书聚合).event(书已下架);
|
|
340
|
+
书已下架
|
|
341
|
+
.policy(移除可预订策略)
|
|
342
|
+
.command(移除可预订书)
|
|
343
|
+
.agg(可预订书聚合)
|
|
344
|
+
.event(书已不可预订);
|
|
345
|
+
书已下架
|
|
346
|
+
.policy(下架书时取消预定规则)
|
|
347
|
+
.command(取消预定)
|
|
348
|
+
.agg(预定聚合)
|
|
349
|
+
.event(预定已取消)
|
|
350
|
+
.policy(用户占用书规则)
|
|
351
|
+
.command(调整用户占书量)
|
|
352
|
+
.agg(用户占用书聚合)
|
|
353
|
+
.event(用户占用书变化了);
|
|
354
|
+
|
|
355
|
+
d.defineUserStory('管理员对书状态进行维护', [新书入库流程, 上架流程, 下架流程]);
|
|
356
|
+
|
|
357
|
+
const 预定流程 = d.startWorkflow('预定流程');
|
|
358
|
+
会员.command(预定书).agg(预定聚合).event(书已被预定);
|
|
359
|
+
书已被预定
|
|
360
|
+
.policy(用户占用书规则)
|
|
361
|
+
.command(调整用户占书量)
|
|
362
|
+
.agg(用户占用书聚合)
|
|
363
|
+
.event(用户占用书变化了);
|
|
364
|
+
书已被预定
|
|
365
|
+
.policy(移除可预订策略)
|
|
366
|
+
.command(移除可预订书)
|
|
367
|
+
.agg(可预订书聚合)
|
|
368
|
+
.event(书已不可预订);
|
|
369
|
+
|
|
370
|
+
const 取消预定流程 = d.startWorkflow('取消预定流程');
|
|
371
|
+
会员.command(取消预定).agg(预定聚合).event(预定已取消);
|
|
372
|
+
预定已取消
|
|
373
|
+
.policy(用户占用书规则)
|
|
374
|
+
.command(调整用户占书量)
|
|
375
|
+
.agg(用户占用书聚合)
|
|
376
|
+
.event(用户占用书变化了);
|
|
377
|
+
预定已取消
|
|
378
|
+
.policy(添加可预订策略)
|
|
379
|
+
.command(添加可预订书)
|
|
380
|
+
.agg(可预订书聚合)
|
|
381
|
+
.event(书已可预订);
|
|
382
|
+
|
|
383
|
+
const 借书流程 = d.startWorkflow('借书流程');
|
|
384
|
+
会员.facadeCmd(借出书装饰命令).service(借书服务);
|
|
385
|
+
借书服务.agg(可预订书聚合).event(书已不可预订);
|
|
386
|
+
借书服务.command(借出书).agg(借出聚合).event(书已被借出);
|
|
387
|
+
书已被借出.readModel(ISBN读模型);
|
|
388
|
+
书已被借出.readModel(ISBN每日借出数读模型);
|
|
389
|
+
书已被借出.readModel(借出读模型);
|
|
390
|
+
书已被借出.readModel(借出读模型);
|
|
391
|
+
书已被借出
|
|
392
|
+
.policy(用户占用书规则)
|
|
393
|
+
.command(调整用户占书量)
|
|
394
|
+
.agg(用户占用书聚合)
|
|
395
|
+
.event(用户占用书变化了);
|
|
396
|
+
|
|
397
|
+
const 还书流程 = d.startWorkflow('还书流程');
|
|
398
|
+
会员.command(还书)
|
|
399
|
+
.agg(借出聚合)
|
|
400
|
+
.event(书已被还)
|
|
401
|
+
.policy(上架被找回的遗失的书规则);
|
|
402
|
+
|
|
403
|
+
const 上报遗失流程 = d.startWorkflow('上报遗失流程');
|
|
404
|
+
会员.command(上报遗失)
|
|
405
|
+
.agg(借出聚合)
|
|
406
|
+
.event(书已被遗失)
|
|
407
|
+
.policy(下架已遗失书规则)
|
|
408
|
+
.command(下架书)
|
|
409
|
+
.agg(书聚合)
|
|
410
|
+
.event(书已下架)
|
|
411
|
+
.policy(移除可预订策略)
|
|
412
|
+
.command(移除可预订书)
|
|
413
|
+
.agg(可预订书聚合)
|
|
414
|
+
.event(书已不可预订);
|
|
415
|
+
|
|
416
|
+
d.defineUserStory('会员对书进行预定、借阅', [
|
|
417
|
+
预定流程,
|
|
418
|
+
取消预定流程,
|
|
419
|
+
借书流程,
|
|
420
|
+
还书流程,
|
|
421
|
+
上报遗失流程,
|
|
422
|
+
]);
|
|
423
|
+
|
|
424
|
+
const 自动处理逾期流程 = d.startWorkflow('自动处理逾期流程');
|
|
425
|
+
定时器.command(逾期).agg(借出聚合).event(还书已逾期);
|
|
426
|
+
还书已逾期.readModel(借出读模型);
|
|
427
|
+
还书已逾期
|
|
428
|
+
.policy(增加账户逾期次数规则)
|
|
429
|
+
.command(增加逾期次数)
|
|
430
|
+
.agg(用户聚合)
|
|
431
|
+
.event(用户还书已逾期)
|
|
432
|
+
.readModel(会员账号读模型);
|
|
433
|
+
|
|
434
|
+
const 自动处理预定超时流程 = d.startWorkflow('自动处理预定超时流程');
|
|
435
|
+
定时器.command(超时预定).agg(预定聚合).event(预定已超时);
|
|
436
|
+
预定已超时
|
|
437
|
+
.policy(用户占用书规则)
|
|
438
|
+
.command(调整用户占书量)
|
|
439
|
+
.agg(用户占用书聚合)
|
|
440
|
+
.event(用户占用书变化了);
|
|
441
|
+
预定已超时
|
|
442
|
+
.policy(添加可预订策略)
|
|
443
|
+
.command(添加可预订书)
|
|
444
|
+
.agg(可预订书聚合)
|
|
445
|
+
.event(书已可预订);
|
|
446
|
+
|
|
447
|
+
d.defineUserStory('定时任务', [自动处理预定超时流程, 自动处理逾期流程]);
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { i, d } from './common';
|
|
2
|
+
|
|
3
|
+
export const userValues = {
|
|
4
|
+
用户id: i.id('userId'),
|
|
5
|
+
逾期次数: i.valueObj('overdueTimes', '正整数,每当用户有逾期行为,自增1'),
|
|
6
|
+
是否暂停: i.valueObj('isSuspended'),
|
|
7
|
+
} as const;
|
|
8
|
+
|
|
9
|
+
export const 管理员 = d.actor('管理员');
|
|
10
|
+
export const 会员 = d.actor('会员');
|
|
11
|
+
export const 定时器 = d.actor('定时器');
|
|
12
|
+
|
|
13
|
+
const 会员账户已暂停 = d.event(
|
|
14
|
+
'UserAccountSuspended',
|
|
15
|
+
['userId'],
|
|
16
|
+
'会员账户已暂停',
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
const 会员账户已启用 = d.event(
|
|
20
|
+
'UserAccountResumed',
|
|
21
|
+
['userId'],
|
|
22
|
+
'会员账户已启用',
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
const 启用会员账户 = d.command(
|
|
26
|
+
'ResumeAccount',
|
|
27
|
+
['userId'],
|
|
28
|
+
d.note`启用会员账户
|
|
29
|
+
1.会员账户当前被暂停才能启用`,
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
export const 用户聚合 = d.agg('userAgg', [
|
|
33
|
+
userValues.用户id,
|
|
34
|
+
userValues.是否暂停,
|
|
35
|
+
userValues.逾期次数,
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
const 会员外部系统 = d.system('UserSystem', '会员外部系统');
|
|
39
|
+
|
|
40
|
+
const 会员账号已创建 = d.event(
|
|
41
|
+
'UserAccountCreatedEvt',
|
|
42
|
+
['会员id : userId', '会员名'],
|
|
43
|
+
'会员账号已创建',
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
export const 会员账号读模型 = d.readModel(
|
|
47
|
+
'UserAccountStatsRM',
|
|
48
|
+
['会员id : userId', '会员名', '是否暂停', '累计逾期次数'],
|
|
49
|
+
'会员账号读模型',
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
const 增加逾期次数 = d.command(
|
|
53
|
+
'IncreaseAccountTimeOutCount',
|
|
54
|
+
[userValues.用户id],
|
|
55
|
+
d.note`增加逾期次数
|
|
56
|
+
1.会员累计逾期达到3次暂停账户
|
|
57
|
+
2.会员账户当前是启用才能被暂停`,
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// ============================= 流程定义 =============================
|
|
61
|
+
|
|
62
|
+
const 创建会员流程 = d.startWorkflow('创建会员流程');
|
|
63
|
+
会员外部系统.event(会员账号已创建).readModel(会员账号读模型);
|
|
64
|
+
|
|
65
|
+
const 暂停会员流程 = d.startWorkflow('暂停会员流程');
|
|
66
|
+
用户聚合.event(会员账户已暂停).readModel(会员账号读模型);
|
|
67
|
+
|
|
68
|
+
const 启动会员流程 = d.startWorkflow('启动会员流程');
|
|
69
|
+
管理员
|
|
70
|
+
.command(启用会员账户)
|
|
71
|
+
.agg(用户聚合)
|
|
72
|
+
.event(会员账户已启用)
|
|
73
|
+
.readModel(会员账号读模型);
|
|
74
|
+
|
|
75
|
+
const 增加逾期次数流程 = d.startWorkflow('增加逾期次数流程');
|
|
76
|
+
管理员.command(增加逾期次数).agg(用户聚合);
|
|
77
|
+
|
|
78
|
+
d.defineUserStory('会员管理', [
|
|
79
|
+
创建会员流程,
|
|
80
|
+
暂停会员流程,
|
|
81
|
+
启动会员流程,
|
|
82
|
+
增加逾期次数流程,
|
|
83
|
+
]);
|
package/src/views/design-en.ts
CHANGED
|
@@ -31,7 +31,7 @@ const deductFailure = d.event('deductFailure', [orderId, orderTime])
|
|
|
31
31
|
// rule
|
|
32
32
|
const paymentRule = d.policy(
|
|
33
33
|
'paymentRule',
|
|
34
|
-
d.
|
|
34
|
+
d.note`
|
|
35
35
|
if ${userAccount} has opened the automatic payment service, then automatic payment is initiated
|
|
36
36
|
rule 1:
|
|
37
37
|
rule 2:
|