midway-fatcms 0.0.6 → 0.0.8
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/.qoder/skills/midway-fatcms/01-quick-start.md +231 -0
- package/.qoder/skills/midway-fatcms/02-crud-quick.md +337 -0
- package/.qoder/skills/midway-fatcms/03-crud-sharding.md +488 -0
- package/.qoder/skills/midway-fatcms/04-condition-operators.md +93 -0
- package/.qoder/skills/midway-fatcms/05-configuration.md +290 -0
- package/.qoder/skills/midway-fatcms/06-builtin-functions.md +241 -0
- package/.qoder/skills/midway-fatcms/07-examples.md +500 -0
- package/.qoder/skills/midway-fatcms/SKILL.md +96 -0
- package/README.md +9 -9
- package/dist/controller/base/BaseApiController.d.ts +1 -2
- package/dist/controller/base/BaseApiController.js +0 -4
- package/dist/controller/gateway/DocGatewayController.js +1 -1
- package/dist/controller/manage/FlowConfigManageApi.js +4 -2
- package/dist/controller/manage/SysConfigMangeApi.js +6 -1
- package/dist/controller/manage/UserAccountManageApi.js +7 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/libs/crud-pro/CrudPro.d.ts +23 -2
- package/dist/libs/crud-pro/CrudPro.js +53 -2
- package/dist/libs/crud-pro/interfaces.d.ts +82 -12
- package/dist/libs/crud-pro/models/CrudResult.d.ts +115 -0
- package/dist/libs/crud-pro/models/CrudResult.js +126 -0
- package/dist/libs/crud-pro/models/RequestModel.d.ts +2 -38
- package/dist/libs/crud-pro/models/RequestModel.js +2 -99
- package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +36 -2
- package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +8 -4
- package/dist/libs/crud-pro/services/CrudProTableMetaService.js +1 -2
- package/dist/libs/crud-pro/utils/OrderByUtils.d.ts +70 -0
- package/dist/libs/crud-pro/utils/OrderByUtils.js +158 -0
- package/dist/libs/crud-pro-quick/CrudProQuick.d.ts +295 -0
- package/dist/libs/crud-pro-quick/CrudProQuick.js +529 -0
- package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +30 -0
- package/dist/{service/curd → libs/crud-pro-quick}/fixSoftDelete.js +3 -6
- package/dist/libs/crud-pro-quick/index.d.ts +36 -0
- package/dist/libs/crud-pro-quick/index.js +49 -0
- package/dist/libs/crud-pro-quick/models.d.ts +33 -0
- package/dist/libs/crud-pro-quick/models.js +2 -0
- package/dist/libs/crud-sharding/ShardingConfig.d.ts +15 -2
- package/dist/libs/crud-sharding/ShardingConfig.js +2 -2
- package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +119 -274
- package/dist/libs/crud-sharding/ShardingCrudPro.js +559 -379
- package/dist/libs/crud-sharding/ShardingMerger.d.ts +12 -20
- package/dist/libs/crud-sharding/ShardingMerger.js +36 -51
- package/dist/libs/crud-sharding/ShardingResult.d.ts +33 -0
- package/dist/libs/crud-sharding/ShardingResult.js +16 -0
- package/dist/libs/crud-sharding/ShardingRouter.d.ts +1 -0
- package/dist/libs/crud-sharding/ShardingRouter.js +25 -6
- package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +21 -4
- package/dist/libs/crud-sharding/ShardingTableCreator.js +193 -59
- package/dist/libs/crud-sharding/ShardingUtils.d.ts +48 -0
- package/dist/libs/crud-sharding/ShardingUtils.js +122 -1
- package/dist/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
- package/dist/libs/crud-sharding/index.d.ts +4 -3
- package/dist/libs/crud-sharding/index.js +14 -2
- package/dist/models/bizmodels.d.ts +2 -6
- package/dist/service/SysAppService.d.ts +2 -2
- package/dist/service/SysAppService.js +16 -5
- package/dist/service/SysConfigService.d.ts +1 -1
- package/dist/service/SysConfigService.js +7 -2
- package/dist/service/SysDictDataService.js +14 -4
- package/dist/service/SysMenuService.js +7 -2
- package/dist/service/curd/CurdMixService.d.ts +6 -4
- package/dist/service/curd/CurdMixService.js +16 -2
- package/dist/service/curd/CurdProService.d.ts +43 -27
- package/dist/service/curd/CurdProService.js +32 -33
- package/dist/service/flow/FlowConfigService.js +7 -2
- package/dist/service/flow/FlowInstanceCrudService.js +22 -19
- package/package.json +2 -1
- package/src/controller/base/BaseApiController.ts +0 -5
- package/src/controller/gateway/DocGatewayController.ts +1 -1
- package/src/controller/manage/CrudStandardDesignApi.ts +4 -3
- package/src/controller/manage/FlowConfigManageApi.ts +4 -2
- package/src/controller/manage/SysConfigMangeApi.ts +6 -1
- package/src/controller/manage/UserAccountManageApi.ts +7 -2
- package/src/index.ts +2 -2
- package/src/libs/crud-pro/CrudPro.ts +62 -4
- package/src/libs/crud-pro/interfaces.ts +110 -15
- package/src/libs/crud-pro/models/CrudResult.ts +178 -0
- package/src/libs/crud-pro/models/RequestModel.ts +4 -110
- package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +41 -2
- package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +11 -7
- package/src/libs/crud-pro/services/CrudProTableMetaService.ts +1 -2
- package/src/libs/crud-pro/utils/OrderByUtils.ts +169 -0
- package/src/libs/crud-pro-quick/CrudProQuick.ts +594 -0
- package/src/{service/curd → libs/crud-pro-quick}/fixSoftDelete.ts +23 -13
- package/src/libs/crud-pro-quick/index.ts +52 -0
- package/src/libs/crud-pro-quick/models.ts +35 -0
- package/src/libs/crud-sharding/ShardingConfig.ts +18 -2
- package/src/libs/crud-sharding/ShardingCrudPro.ts +689 -440
- package/src/libs/crud-sharding/ShardingMerger.ts +47 -73
- package/src/libs/crud-sharding/ShardingResult.ts +29 -0
- package/src/libs/crud-sharding/ShardingRouter.ts +27 -6
- package/src/libs/crud-sharding/ShardingTableCreator.ts +214 -71
- package/src/libs/crud-sharding/ShardingUtils.ts +137 -0
- package/src/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
- package/src/libs/crud-sharding/index.ts +14 -3
- package/src/models/bizmodels.ts +4 -7
- package/src/service/SysAppService.ts +18 -7
- package/src/service/SysConfigService.ts +8 -3
- package/src/service/SysDictDataService.ts +14 -4
- package/src/service/SysMenuService.ts +7 -2
- package/src/service/crudstd/CrudStdService.ts +2 -2
- package/src/service/curd/CurdMixService.ts +26 -5
- package/src/service/curd/CurdProService.ts +58 -39
- package/src/service/flow/FlowConfigService.ts +7 -2
- package/src/service/flow/FlowInstanceCrudService.ts +23 -20
- package/dist/libs/crud-pro/README.md +0 -809
- package/dist/libs/crud-pro/README_FUNC.md +0 -193
- package/dist/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
- package/dist/models/StandardColumns.d.ts +0 -71
- package/dist/models/StandardColumns.js +0 -28
- package/dist/service/curd/CrudProQuick.d.ts +0 -190
- package/dist/service/curd/CrudProQuick.js +0 -319
- package/dist/service/curd/README.md +0 -1001
- package/dist/service/curd/fixSoftDelete.d.ts +0 -20
- package/src/libs/crud-pro/README.md +0 -809
- package/src/libs/crud-pro/README_FUNC.md +0 -193
- package/src/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
- package/src/models/StandardColumns.ts +0 -76
- package/src/service/curd/CrudProQuick.ts +0 -360
- package/src/service/curd/README.md +0 -1001
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
# 时间字段清理与转换场景说明
|
|
2
|
+
|
|
3
|
+
## 背景
|
|
4
|
+
|
|
5
|
+
时间分表(YEAR/MONTH/DAY)中,`timeColumn` 既是路由键也是查询条件。
|
|
6
|
+
用户传入的时间值可能精度不一致(如传 `'2024-01-15'` 但数据库存的是 `1705276800000` 毫秒时间戳),
|
|
7
|
+
直接作为 WHERE 条件会导致匹配失败。
|
|
8
|
+
|
|
9
|
+
## 校验与清理的职责分离
|
|
10
|
+
|
|
11
|
+
时间分表的 condition 处理分为两个独立阶段,由不同函数负责:
|
|
12
|
+
|
|
13
|
+
### 阶段1:校验(validateRoutingFieldForCondition)
|
|
14
|
+
|
|
15
|
+
**职责**:确保写操作的 condition 包含时间字段,用于路由定位分表。
|
|
16
|
+
|
|
17
|
+
**适用操作**:update / delete / restore / insertOrUpdate / insertOnDuplicateUpdate
|
|
18
|
+
|
|
19
|
+
**校验规则**:
|
|
20
|
+
- condition 中必须存在 timeColumn 字段(值不能为 falsy)
|
|
21
|
+
- 不存在则抛出错误,给出明确提示
|
|
22
|
+
- 查询操作(find*)不校验,允许回退到 recentTableCount
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// 校验通过:timeColumn 存在
|
|
26
|
+
{ order_id: 'ORD001', created_at: '2024-01-15' } // ✅
|
|
27
|
+
{ order_id: 'ORD001', created_at: { $gte: '2024-01' } } // ✅
|
|
28
|
+
|
|
29
|
+
// 校验失败:timeColumn 不存在
|
|
30
|
+
{ order_id: 'ORD001' } // ❌ 抛出错误
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 阶段2:清理/转换(cleanTimeColumnForSingleTableQuery)
|
|
34
|
+
|
|
35
|
+
**职责**:在校验通过后,根据值类型和主键情况,智能处理 timeColumn。
|
|
36
|
+
|
|
37
|
+
**适用操作**:所有操作(读 + 写),在校验之后执行。
|
|
38
|
+
|
|
39
|
+
**处理规则**:按下方「核心规则」和「判断流程图」执行。
|
|
40
|
+
|
|
41
|
+
### 执行顺序
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
写操作请求
|
|
45
|
+
│
|
|
46
|
+
├─ 1. validateRoutingFieldForCondition(校验 timeColumn 存在)
|
|
47
|
+
│ └─ 不存在 → 抛出错误,终止
|
|
48
|
+
│
|
|
49
|
+
└─ 2. cleanTimeColumnForSingleTableQuery(智能处理 timeColumn)
|
|
50
|
+
├─ 有主键 + 精确值 → 清理
|
|
51
|
+
├─ 无主键 + 日期粒度字符串 → 转换为范围
|
|
52
|
+
└─ 其他 → 保留原值
|
|
53
|
+
|
|
54
|
+
读操作请求
|
|
55
|
+
│
|
|
56
|
+
└─ 1. cleanTimeColumnForSingleTableQuery(智能处理 timeColumn)
|
|
57
|
+
(读操作不校验,允许无 timeColumn)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 核心规则
|
|
61
|
+
|
|
62
|
+
### 规则1:精确时间 + 有主键 → 清理
|
|
63
|
+
|
|
64
|
+
主键已唯一确定行,timeColumn 仅用于路由,从 WHERE 中移除。
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// 配置:{ primaryKey: 'order_id', timeColumn: 'created_at', type: MONTH }
|
|
68
|
+
|
|
69
|
+
// 清理前
|
|
70
|
+
{ order_id: 'ORD001', created_at: '2024-01-15' }
|
|
71
|
+
// SQL: WHERE order_id = 'ORD001' AND created_at = '2024-01-15' ← 精度可能不匹配
|
|
72
|
+
|
|
73
|
+
// 清理后
|
|
74
|
+
{ order_id: 'ORD001' }
|
|
75
|
+
// SQL: WHERE order_id = 'ORD001' ✅
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 规则2:精确时间 + 有主键 + 时间是操作符 → 保留
|
|
79
|
+
|
|
80
|
+
用户明确要按时间操作符查询,不做任何处理。
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
// $gte/$lte 范围 → 保留
|
|
84
|
+
{ order_id: 'ORD001', created_at: { $gte: '2024-01-01', $lte: '2024-06-30' } }
|
|
85
|
+
// SQL: WHERE order_id = 'ORD001' AND created_at >= '2024-01-01' AND created_at <= '2024-06-30' ✅
|
|
86
|
+
|
|
87
|
+
// $range → 保留
|
|
88
|
+
{ order_id: 'ORD001', created_at: { $range: ['2024-01-01', '2024-06-30'] } }
|
|
89
|
+
// SQL: WHERE order_id = 'ORD001' AND created_at BETWEEN '2024-01-01' AND '2024-06-30' ✅
|
|
90
|
+
|
|
91
|
+
// $in → 保留
|
|
92
|
+
{ order_id: 'ORD001', created_at: { $in: ['2024-01-15', '2024-02-20'] } }
|
|
93
|
+
// SQL: WHERE order_id = 'ORD001' AND created_at IN ('2024-01-15', '2024-02-20') ✅
|
|
94
|
+
|
|
95
|
+
// $null → 保留
|
|
96
|
+
{ order_id: 'ORD001', created_at: { $null: true } }
|
|
97
|
+
// SQL: WHERE order_id = 'ORD001' AND created_at IS NULL ✅
|
|
98
|
+
|
|
99
|
+
// $notNull → 保留
|
|
100
|
+
{ order_id: 'ORD001', created_at: { $notNull: true } }
|
|
101
|
+
// SQL: WHERE order_id = 'ORD001' AND created_at IS NOT NULL ✅
|
|
102
|
+
|
|
103
|
+
// $ne → 保留
|
|
104
|
+
{ order_id: 'ORD001', created_at: { $ne: '2024-01-15' } }
|
|
105
|
+
// SQL: WHERE order_id = 'ORD001' AND created_at != '2024-01-15' ✅
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 规则3:精确时间 + 无主键 → 转换为范围查询
|
|
109
|
+
|
|
110
|
+
无主键时,timeColumn 必须参与 WHERE。但精确值可能精度不匹配,
|
|
111
|
+
需要将日期字符串转换为对应粒度的 `$gte`/`$lte` 范围。
|
|
112
|
+
|
|
113
|
+
#### 3a. 年粒度字符串 → 年范围
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
// 配置:{ timeColumn: 'created_at', type: MONTH }
|
|
117
|
+
|
|
118
|
+
// 转换前
|
|
119
|
+
{ status: 'paid', created_at: '2024' }
|
|
120
|
+
|
|
121
|
+
// 转换后
|
|
122
|
+
{ status: 'paid', created_at: { $gte: '2024-01-01 00:00:00', $lte: '2024-12-31 23:59:59' } }
|
|
123
|
+
// SQL: WHERE status = 'paid' AND created_at >= '2024-01-01 00:00:00' AND created_at <= '2024-12-31 23:59:59' ✅
|
|
124
|
+
|
|
125
|
+
// 路由:根据范围定位 t_order_202401 ~ t_order_202412
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### 3b. 月粒度字符串 → 月范围
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
// 配置:{ timeColumn: 'created_at', type: MONTH }
|
|
132
|
+
|
|
133
|
+
// 转换前
|
|
134
|
+
{ status: 'paid', created_at: '2024-01' }
|
|
135
|
+
|
|
136
|
+
// 转换后
|
|
137
|
+
{ status: 'paid', created_at: { $gte: '2024-01-01 00:00:00', $lte: '2024-01-31 23:59:59' } }
|
|
138
|
+
// SQL: WHERE status = 'paid' AND created_at >= '2024-01-01 00:00:00' AND created_at <= '2024-01-31 23:59:59' ✅
|
|
139
|
+
|
|
140
|
+
// 路由:定位 t_order_202401
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
#### 3c. 日粒度字符串 → 日范围
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// 配置:{ timeColumn: 'created_at', type: MONTH }
|
|
147
|
+
|
|
148
|
+
// 转换前
|
|
149
|
+
{ status: 'paid', created_at: '2024-01-15' }
|
|
150
|
+
|
|
151
|
+
// 转换后
|
|
152
|
+
{ status: 'paid', created_at: { $gte: '2024-01-15 00:00:00', $lte: '2024-01-15 23:59:59' } }
|
|
153
|
+
// SQL: WHERE status = 'paid' AND created_at >= '2024-01-15 00:00:00' AND created_at <= '2024-01-15 23:59:59' ✅
|
|
154
|
+
|
|
155
|
+
// 路由:定位 t_order_202401
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### 3d. 带时分秒的字符串 → 不转换
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
// 精确到秒的时间字符串,精度已足够,不转换
|
|
162
|
+
{ status: 'paid', created_at: '2024-01-15 10:30:00' }
|
|
163
|
+
// 不转换,直接用于 WHERE
|
|
164
|
+
// SQL: WHERE status = 'paid' AND created_at = '2024-01-15 10:30:00' ✅
|
|
165
|
+
|
|
166
|
+
// 带毫秒的时间戳数字,精度已足够,不转换
|
|
167
|
+
{ status: 'paid', created_at: 1705305000000 }
|
|
168
|
+
// 不转换,直接用于 WHERE
|
|
169
|
+
// SQL: WHERE status = 'paid' AND created_at = 1705305000000 ✅
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 规则4:精确时间 + 无主键 + 时间是不可转换的精确值 → 不转换
|
|
173
|
+
|
|
174
|
+
数值型时间戳(非日期字符串)无法判断粒度,不做转换。
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
// 数值型时间戳:无法推断粒度,保留原值
|
|
178
|
+
{ status: 'paid', created_at: 1705276800000 }
|
|
179
|
+
// 不转换,直接 WHERE
|
|
180
|
+
// SQL: WHERE status = 'paid' AND created_at = 1705276800000
|
|
181
|
+
|
|
182
|
+
// 但如果有主键,则清理
|
|
183
|
+
{ order_id: 'ORD001', created_at: 1705276800000 }
|
|
184
|
+
// → 清理为 { order_id: 'ORD001' }
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 规则5:操作符时间 → 始终保留
|
|
188
|
+
|
|
189
|
+
无论有没有主键,操作符表达式一律保留在 WHERE 中。
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
// 无主键 + 操作符
|
|
193
|
+
{ status: 'paid', created_at: { $gte: '2024-01-01', $lte: '2024-06-30' } }
|
|
194
|
+
// 保留,不做任何处理 ✅
|
|
195
|
+
|
|
196
|
+
// 无主键 + $range
|
|
197
|
+
{ status: 'paid', created_at: { $range: ['2024-01-01', '2024-06-30'] } }
|
|
198
|
+
// 保留 ✅
|
|
199
|
+
|
|
200
|
+
// 无主键 + $null
|
|
201
|
+
{ status: 'paid', created_at: { $null: true } }
|
|
202
|
+
// 保留 ✅
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## 转换逻辑总结
|
|
206
|
+
|
|
207
|
+
### 判断日期字符串粒度
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
'2024' → 4位纯年 → 年范围
|
|
211
|
+
'2024-01' → 7位年-月 → 月范围
|
|
212
|
+
'2024-01-15' → 10位年-月-日 → 日范围
|
|
213
|
+
'2024-01-15 10' → 带时 → 日范围(补齐到秒)
|
|
214
|
+
'2024-01-15 10:30'→ 带时分 → 日范围(补齐到秒)
|
|
215
|
+
'2024-01-15 10:30:00' → 精确到秒 → 不转换
|
|
216
|
+
1705276800000 → number → 不转换(无法推断粒度)
|
|
217
|
+
new Date(...) → Date对象 → 不转换(精确到毫秒,视为精确值)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### 转换规则表
|
|
221
|
+
|
|
222
|
+
| 条件 | timeColumn 值类型 | 有主键? | 操作 |
|
|
223
|
+
|------|-------------------|---------|------|
|
|
224
|
+
| 1 | string 精确值(年/月/日粒度) | ✅ | 清理(从 WHERE 移除) |
|
|
225
|
+
| 2 | string 精确值(年/月/日粒度) | ❌ | 转换为 $gte/$lte 范围 |
|
|
226
|
+
| 3 | string 精确值(精确到秒) | ✅ | 清理 |
|
|
227
|
+
| 4 | string 精确值(精确到秒) | ❌ | 不转换,保留原值 |
|
|
228
|
+
| 5 | number 精确值 | ✅ | 清理 |
|
|
229
|
+
| 6 | number 精确值 | ❌ | 不转换,保留原值 |
|
|
230
|
+
| 7 | Date 对象 | ✅ | 清理(精确到毫秒,视为精确值) |
|
|
231
|
+
| 8 | Date 对象 | ❌ | 不转换,保留原值(精度已足够) |
|
|
232
|
+
| 9 | ICompareCondition($gte等) | 任意 | 保留,不做处理 |
|
|
233
|
+
| 10 | ICompareCondition($null等) | 任意 | 保留,不做处理 |
|
|
234
|
+
|
|
235
|
+
## 各分表类型的转换示例
|
|
236
|
+
|
|
237
|
+
### YEAR 分表
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
// 配置:{ type: YEAR, timeColumn: 'created_at' }
|
|
241
|
+
|
|
242
|
+
// '2024' → 年范围
|
|
243
|
+
{ created_at: '2024' }
|
|
244
|
+
→ { created_at: { $gte: '2024-01-01 00:00:00', $lte: '2024-12-31 23:59:59' } }
|
|
245
|
+
// 路由:t_log_2024
|
|
246
|
+
|
|
247
|
+
// '2024-06' → 月范围
|
|
248
|
+
{ created_at: '2024-06' }
|
|
249
|
+
→ { created_at: { $gte: '2024-06-01 00:00:00', $lte: '2024-06-30 23:59:59' } }
|
|
250
|
+
// 路由:t_log_2024
|
|
251
|
+
|
|
252
|
+
// '2024-06-15' → 日范围
|
|
253
|
+
{ created_at: '2024-06-15' }
|
|
254
|
+
→ { created_at: { $gte: '2024-06-15 00:00:00', $lte: '2024-06-15 23:59:59' } }
|
|
255
|
+
// 路由:t_log_2024
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### MONTH 分表
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// 配置:{ type: MONTH, timeColumn: 'created_at' }
|
|
262
|
+
|
|
263
|
+
// '2024' → 年范围(跨12张表)
|
|
264
|
+
{ created_at: '2024' }
|
|
265
|
+
→ { created_at: { $gte: '2024-01-01 00:00:00', $lte: '2024-12-31 23:59:59' } }
|
|
266
|
+
// 路由:t_order_202401 ~ t_order_202412
|
|
267
|
+
|
|
268
|
+
// '2024-01' → 月范围
|
|
269
|
+
{ created_at: '2024-01' }
|
|
270
|
+
→ { created_at: { $gte: '2024-01-01 00:00:00', $lte: '2024-01-31 23:59:59' } }
|
|
271
|
+
// 路由:t_order_202401
|
|
272
|
+
|
|
273
|
+
// '2024-01-15' → 日范围
|
|
274
|
+
{ created_at: '2024-01-15' }
|
|
275
|
+
→ { created_at: { $gte: '2024-01-15 00:00:00', $lte: '2024-01-15 23:59:59' } }
|
|
276
|
+
// 路由:t_order_202401
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### DAY 分表
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
// 配置:{ type: DAY, timeColumn: 'access_time' }
|
|
283
|
+
|
|
284
|
+
// '2024' → 年范围(跨365张表)
|
|
285
|
+
{ access_time: '2024' }
|
|
286
|
+
→ { access_time: { $gte: '2024-01-01 00:00:00', $lte: '2024-12-31 23:59:59' } }
|
|
287
|
+
// 路由:t_access_20240101 ~ t_access_20241231
|
|
288
|
+
|
|
289
|
+
// '2024-01' → 月范围(跨31张表)
|
|
290
|
+
{ access_time: '2024-01' }
|
|
291
|
+
→ { access_time: { $gte: '2024-01-01 00:00:00', $lte: '2024-01-31 23:59:59' } }
|
|
292
|
+
// 路由:t_access_20240101 ~ t_access_20240131
|
|
293
|
+
|
|
294
|
+
// '2024-01-15' → 日范围
|
|
295
|
+
{ access_time: '2024-01-15' }
|
|
296
|
+
→ { access_time: { $gte: '2024-01-15 00:00:00', $lte: '2024-01-15 23:59:59' } }
|
|
297
|
+
// 路由:t_access_20240115
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## 特殊边界场景
|
|
301
|
+
|
|
302
|
+
### 闰年2月
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
// 2024 是闰年
|
|
306
|
+
{ created_at: '2024-02' }
|
|
307
|
+
→ { created_at: { $gte: '2024-02-01 00:00:00', $lte: '2024-02-29 23:59:59' } }
|
|
308
|
+
// ✅ 2月有29天
|
|
309
|
+
|
|
310
|
+
// 2023 不是闰年
|
|
311
|
+
{ created_at: '2023-02' }
|
|
312
|
+
→ { created_at: { $gte: '2023-02-01 00:00:00', $lte: '2023-02-28 23:59:59' } }
|
|
313
|
+
// ✅ 2月有28天
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### 主键 + 日期粒度字符串 → 清理即可
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
// 有主键时,日期粒度字符串也直接清理,不需要转换
|
|
320
|
+
// 因为主键已唯一确定行,timeColumn 仅用于路由
|
|
321
|
+
|
|
322
|
+
{ order_id: 'ORD001', created_at: '2024' }
|
|
323
|
+
→ { order_id: 'ORD001' } // 清理,不需要转换为范围
|
|
324
|
+
|
|
325
|
+
{ order_id: 'ORD001', created_at: '2024-01' }
|
|
326
|
+
→ { order_id: 'ORD001' } // 清理
|
|
327
|
+
|
|
328
|
+
{ order_id: 'ORD001', created_at: '2024-01-15' }
|
|
329
|
+
→ { order_id: 'ORD001' } // 清理
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### 组合条件
|
|
333
|
+
|
|
334
|
+
```typescript
|
|
335
|
+
// 多个普通条件 + 日期粒度字符串
|
|
336
|
+
{ status: 'paid', region: 'CN', created_at: '2024-01' }
|
|
337
|
+
→ { status: 'paid', region: 'CN', created_at: { $gte: '2024-01-01 00:00:00', $lte: '2024-01-31 23:59:59' } }
|
|
338
|
+
// SQL: WHERE status = 'paid' AND region = 'CN' AND created_at >= '2024-01-01 00:00:00' AND created_at <= '2024-01-31 23:59:59' ✅
|
|
339
|
+
|
|
340
|
+
// 主键 + 其他条件 + 日期粒度字符串 → 只清理 timeColumn
|
|
341
|
+
{ order_id: 'ORD001', status: 'paid', created_at: '2024-01-15' }
|
|
342
|
+
→ { order_id: 'ORD001', status: 'paid' }
|
|
343
|
+
// SQL: WHERE order_id = 'ORD001' AND status = 'paid' ✅
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Date 对象
|
|
347
|
+
|
|
348
|
+
JavaScript 的 `Date` 对象 `typeof` 是 `'object'`,但不是 `ICompareCondition`,需要优先识别。
|
|
349
|
+
|
|
350
|
+
判断优先级:`value instanceof Date` → 先于 `typeof === 'object'` 判断。
|
|
351
|
+
|
|
352
|
+
```typescript
|
|
353
|
+
// Date 对象精确到毫秒,不存在粒度转换问题
|
|
354
|
+
|
|
355
|
+
// 有主键 → 清理
|
|
356
|
+
{ order_id: 'ORD001', created_at: new Date('2024-01-15T10:30:00') }
|
|
357
|
+
→ { order_id: 'ORD001' } // 清理
|
|
358
|
+
|
|
359
|
+
// 无主键 → 保留原值(精度已足够,不需要转换)
|
|
360
|
+
{ status: 'paid', created_at: new Date('2024-01-15T10:30:00') }
|
|
361
|
+
// 不转换,保留原值
|
|
362
|
+
// SQL: WHERE status = 'paid' AND created_at = '2024-01-15 10:30:00.000' ✅
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
> **注意**:通过 HTTP API 传参时,Date 对象会被 JSON 序列化为字符串,
|
|
366
|
+
> 只有在代码中直接调用(如测试代码、定时任务)时才会传入 Date 对象。
|
|
367
|
+
|
|
368
|
+
### timeColumn 本身是唯一条件
|
|
369
|
+
|
|
370
|
+
```typescript
|
|
371
|
+
// 只有日期粒度字符串 → 转换
|
|
372
|
+
{ created_at: '2024-01' }
|
|
373
|
+
→ { created_at: { $gte: '2024-01-01 00:00:00', $lte: '2024-01-31 23:59:59' } }
|
|
374
|
+
// ✅ 既能路由到正确分表,又能精确 WHERE
|
|
375
|
+
|
|
376
|
+
// 只有精确到秒 → 不转换
|
|
377
|
+
{ created_at: '2024-01-15 10:30:00' }
|
|
378
|
+
// 不转换,保留原值
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
## 非法/边界值处理
|
|
382
|
+
|
|
383
|
+
### null 值
|
|
384
|
+
|
|
385
|
+
`typeof null === 'object'`,但 null 不是操作符表达式,也不是合法的时间值。
|
|
386
|
+
|
|
387
|
+
```typescript
|
|
388
|
+
// 误用:想查 NULL 应该用 { $null: true }
|
|
389
|
+
{ status: 'paid', created_at: null }
|
|
390
|
+
// → 不清理、不转换,保留原值
|
|
391
|
+
// SQL: WHERE status = 'paid' AND created_at = NULL ← 通常匹配不到数据
|
|
392
|
+
|
|
393
|
+
// 正确写法
|
|
394
|
+
{ status: 'paid', created_at: { $null: true } }
|
|
395
|
+
// → 操作符表达式,保留
|
|
396
|
+
// SQL: WHERE status = 'paid' AND created_at IS NULL ✅
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
判断逻辑:`isOperatorExpression` 通过 `value !== null` 排除 null,null 被视为非操作符。
|
|
400
|
+
后续由于 null 不是 string/number/boolean/Date,不会命中任何清理或转换规则,保留原值。
|
|
401
|
+
|
|
402
|
+
### 空字符串
|
|
403
|
+
|
|
404
|
+
不匹配任何日期格式,不转换也不清理。
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
{ status: 'paid', created_at: '' }
|
|
408
|
+
// → 不清理、不转换,保留原值
|
|
409
|
+
// SQL: WHERE status = 'paid' AND created_at = '' ← 匹配不到数据,但不会报错
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### 数组值
|
|
413
|
+
|
|
414
|
+
`typeof [] === 'object'`,会被误判为操作符表达式而保留,但这不是合法的 condition 值。
|
|
415
|
+
|
|
416
|
+
```typescript
|
|
417
|
+
// 非法值,不应使用
|
|
418
|
+
{ status: 'paid', created_at: ['2024-01', '2024-02'] }
|
|
419
|
+
// → 被当作操作符表达式保留,但 SQL 生成可能出错
|
|
420
|
+
|
|
421
|
+
// 正确写法:用 $in
|
|
422
|
+
{ status: 'paid', created_at: { $in: ['2024-01-01', '2024-02-01'] } }
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### primaryKey 值为操作符
|
|
426
|
+
|
|
427
|
+
当 primaryKey 的值是操作符表达式(如 `$in`)时,仍触发 timeColumn 清理。
|
|
428
|
+
因为 primaryKey 的作用是判断"是否有字段能辅助定位行",而非"是否能唯一确定一行"。
|
|
429
|
+
|
|
430
|
+
```typescript
|
|
431
|
+
// primaryKey 使用 $in
|
|
432
|
+
{ order_id: { $in: ['ORD001', 'ORD002'] }, created_at: '2024-01-15' }
|
|
433
|
+
→ { order_id: { $in: ['ORD001', 'ORD002'] } } // 清理 created_at
|
|
434
|
+
// SQL: WHERE order_id IN ('ORD001', 'ORD002') ✅
|
|
435
|
+
// created_at 已通过路由定位到 t_order_202401,不需要在 WHERE 中
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
## 写操作安全性
|
|
439
|
+
|
|
440
|
+
无主键写操作(update/delete)中,日期粒度字符串被转换为范围后,
|
|
441
|
+
可能影响大量数据,需调用方自行保证条件精确性。
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
// ⚠️ 无主键删除 + 日期粒度字符串 → 转换为范围,可能删除大量数据
|
|
445
|
+
await sharding.delete({
|
|
446
|
+
condition: { created_at: '2024-01' }
|
|
447
|
+
});
|
|
448
|
+
// 转换后: { created_at: { $gte: '2024-01-01 00:00:00', $lte: '2024-01-31 23:59:59' } }
|
|
449
|
+
// SQL: DELETE FROM t_order_202401 WHERE created_at >= '2024-01-01 00:00:00' AND created_at <= '2024-01-31 23:59:59'
|
|
450
|
+
// ⚠️ 会删除整个1月份的所有数据!
|
|
451
|
+
|
|
452
|
+
// ✅ 推荐:写操作尽量使用主键
|
|
453
|
+
await sharding.delete({
|
|
454
|
+
condition: { order_id: 'ORD001', created_at: '2024-01-15' }
|
|
455
|
+
});
|
|
456
|
+
// 清理后: { order_id: 'ORD001' }
|
|
457
|
+
// SQL: DELETE FROM t_order_202401 WHERE order_id = 'ORD001' ✅ 精确删除
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
## 判断流程图
|
|
461
|
+
|
|
462
|
+
```
|
|
463
|
+
timeColumn 值在 condition 中
|
|
464
|
+
│
|
|
465
|
+
├─ 值为 undefined → 不处理
|
|
466
|
+
│
|
|
467
|
+
├─ 值 instanceof Date → 精确值(毫秒精度)
|
|
468
|
+
│ ├─ 有 primaryKey → 清理
|
|
469
|
+
│ └─ 无 primaryKey → 保留原值
|
|
470
|
+
│
|
|
471
|
+
├─ typeof === 'object' 且不为 null 且不为 Date → 操作符表达式 → 保留
|
|
472
|
+
│
|
|
473
|
+
├─ typeof === 'number' → 精确值(时间戳)
|
|
474
|
+
│ ├─ 有 primaryKey → 清理
|
|
475
|
+
│ └─ 无 primaryKey → 保留原值(无法推断粒度)
|
|
476
|
+
│
|
|
477
|
+
├─ typeof === 'boolean' → 精确值
|
|
478
|
+
│ ├─ 有 primaryKey → 清理
|
|
479
|
+
│ └─ 无 primaryKey → 保留原值
|
|
480
|
+
│
|
|
481
|
+
└─ typeof === 'string' → 检测日期粒度
|
|
482
|
+
├─ 年/月/日粒度('2024', '2024-01', '2024-01-15')
|
|
483
|
+
│ ├─ 有 primaryKey → 清理
|
|
484
|
+
│ └─ 无 primaryKey → 转换为 $gte/$lte 范围
|
|
485
|
+
└─ datetime 粒度 或 不匹配任何格式
|
|
486
|
+
├─ 有 primaryKey → 清理
|
|
487
|
+
└─ 无 primaryKey → 保留原值
|
|
488
|
+
```
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* });
|
|
28
28
|
*
|
|
29
29
|
* // 分页查询(自动合并多表结果)
|
|
30
|
-
* const result = await sharding.
|
|
30
|
+
* const result = await sharding.findPage({
|
|
31
31
|
* condition: { created_at: { $gte: '2024-01-01', $lte: '2024-03-31' } },
|
|
32
32
|
* pageNo: 1,
|
|
33
33
|
* pageSize: 10,
|
|
@@ -38,8 +38,9 @@ export { ShardingRouter } from './ShardingRouter';
|
|
|
38
38
|
export { ShardingMerger } from './ShardingMerger';
|
|
39
39
|
export { ShardingType } from './ShardingConfig';
|
|
40
40
|
export type { IShardingConfig, IShardingRouterContext, IShardingRouterFunc, IShardingTimeRange, IShardingTableCreateOptions, IShardingTableCreateResult, IShardingCountCacheConfig, } from './ShardingConfig';
|
|
41
|
-
export
|
|
42
|
-
export type {
|
|
41
|
+
export { ShardingBatchInsertResult } from './ShardingResult';
|
|
42
|
+
export type { IShardingPageQueryResult, IShardingListQueryResult } from './ShardingMerger';
|
|
43
|
+
export { CrudWriteResult, CrudQueryOneResult, CrudQueryListResult, CrudQueryPageResult, CrudExistResult, CrudCountResult, CrudUpsertResult, } from '../../libs/crud-pro/models/CrudResult';
|
|
43
44
|
export { ShardingTableCreator } from './ShardingTableCreator';
|
|
44
45
|
export { ShardingCountCache, shardingHashCondition } from './ShardingCountCache';
|
|
45
46
|
export type { ShardingTimeGranularity } from './ShardingUtils';
|
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
* });
|
|
29
29
|
*
|
|
30
30
|
* // 分页查询(自动合并多表结果)
|
|
31
|
-
* const result = await sharding.
|
|
31
|
+
* const result = await sharding.findPage({
|
|
32
32
|
* condition: { created_at: { $gte: '2024-01-01', $lte: '2024-03-31' } },
|
|
33
33
|
* pageNo: 1,
|
|
34
34
|
* pageSize: 10,
|
|
35
35
|
* });
|
|
36
36
|
*/
|
|
37
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
exports.shardingHashCondition = exports.ShardingCountCache = exports.ShardingTableCreator = exports.ShardingType = exports.ShardingMerger = exports.ShardingRouter = exports.ShardingCrudPro = void 0;
|
|
38
|
+
exports.shardingHashCondition = exports.ShardingCountCache = exports.ShardingTableCreator = exports.CrudUpsertResult = exports.CrudCountResult = exports.CrudExistResult = exports.CrudQueryPageResult = exports.CrudQueryListResult = exports.CrudQueryOneResult = exports.CrudWriteResult = exports.ShardingBatchInsertResult = exports.ShardingType = exports.ShardingMerger = exports.ShardingRouter = exports.ShardingCrudPro = void 0;
|
|
39
39
|
// 核心类
|
|
40
40
|
var ShardingCrudPro_1 = require("./ShardingCrudPro");
|
|
41
41
|
Object.defineProperty(exports, "ShardingCrudPro", { enumerable: true, get: function () { return ShardingCrudPro_1.ShardingCrudPro; } });
|
|
@@ -46,6 +46,18 @@ Object.defineProperty(exports, "ShardingMerger", { enumerable: true, get: functi
|
|
|
46
46
|
// 配置和类型
|
|
47
47
|
var ShardingConfig_1 = require("./ShardingConfig");
|
|
48
48
|
Object.defineProperty(exports, "ShardingType", { enumerable: true, get: function () { return ShardingConfig_1.ShardingType; } });
|
|
49
|
+
// 结果类型
|
|
50
|
+
var ShardingResult_1 = require("./ShardingResult");
|
|
51
|
+
Object.defineProperty(exports, "ShardingBatchInsertResult", { enumerable: true, get: function () { return ShardingResult_1.ShardingBatchInsertResult; } });
|
|
52
|
+
// 重新导出 CrudResult 类型
|
|
53
|
+
var CrudResult_1 = require("../../libs/crud-pro/models/CrudResult");
|
|
54
|
+
Object.defineProperty(exports, "CrudWriteResult", { enumerable: true, get: function () { return CrudResult_1.CrudWriteResult; } });
|
|
55
|
+
Object.defineProperty(exports, "CrudQueryOneResult", { enumerable: true, get: function () { return CrudResult_1.CrudQueryOneResult; } });
|
|
56
|
+
Object.defineProperty(exports, "CrudQueryListResult", { enumerable: true, get: function () { return CrudResult_1.CrudQueryListResult; } });
|
|
57
|
+
Object.defineProperty(exports, "CrudQueryPageResult", { enumerable: true, get: function () { return CrudResult_1.CrudQueryPageResult; } });
|
|
58
|
+
Object.defineProperty(exports, "CrudExistResult", { enumerable: true, get: function () { return CrudResult_1.CrudExistResult; } });
|
|
59
|
+
Object.defineProperty(exports, "CrudCountResult", { enumerable: true, get: function () { return CrudResult_1.CrudCountResult; } });
|
|
60
|
+
Object.defineProperty(exports, "CrudUpsertResult", { enumerable: true, get: function () { return CrudResult_1.CrudUpsertResult; } });
|
|
49
61
|
// 分表创建器
|
|
50
62
|
var ShardingTableCreator_1 = require("./ShardingTableCreator");
|
|
51
63
|
Object.defineProperty(exports, "ShardingTableCreator", { enumerable: true, get: function () { return ShardingTableCreator_1.ShardingTableCreator; } });
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IVisitor } from '../libs/crud-pro/interfaces';
|
|
2
2
|
import { CacheLevelEnum } from "../models/SystemEntities";
|
|
3
|
+
export type { IRequestCfgModel2 } from '../libs/crud-pro-quick';
|
|
3
4
|
export interface IAccountEntity {
|
|
4
5
|
nick_name: string;
|
|
5
6
|
avatar: string;
|
|
@@ -81,11 +82,6 @@ export declare const CTX_VISITOR_AVATAR = "visitor.avatar";
|
|
|
81
82
|
export declare const CTX_VISITOR_NICKNAME = "visitor.nickName";
|
|
82
83
|
export declare const CTX_VISITOR_ACCOUNT_TYPE = "visitor.accountType";
|
|
83
84
|
export declare const CTX_WORKBENCH_CODE = "visitor.workbenchCode";
|
|
84
|
-
export interface IRequestCfgModel2 extends IRequestCfgModel {
|
|
85
|
-
enableStandardUpdateCfg?: boolean | string[];
|
|
86
|
-
enableStandardUpdateCfgCondition?: boolean | string[];
|
|
87
|
-
enableSoftDelete?: boolean;
|
|
88
|
-
}
|
|
89
85
|
export interface IVisitorExt extends IVisitor {
|
|
90
86
|
workbenchCode: string;
|
|
91
87
|
avatar: string;
|
|
@@ -7,8 +7,8 @@ export declare class SysAppService extends BaseService {
|
|
|
7
7
|
getSysAppPageOne({ page_path, workbench_code }: {
|
|
8
8
|
page_path: string;
|
|
9
9
|
workbench_code: string;
|
|
10
|
-
}): Promise<any
|
|
11
|
-
getSysAppOne(app_code: string): Promise<any
|
|
10
|
+
}): Promise<Record<string, any>>;
|
|
11
|
+
getSysAppOne(app_code: string): Promise<Record<string, any>>;
|
|
12
12
|
deletePrivateField(parsedAppInfo: any): any;
|
|
13
13
|
removeSysAppOneCache(app_code: string): Promise<any>;
|
|
14
14
|
removeSysAppCacheByCondition({ condition }: any): Promise<void>;
|
|
@@ -20,11 +20,19 @@ const bizmodels_1 = require("../models/bizmodels");
|
|
|
20
20
|
let SysAppService = class SysAppService extends BaseService_1.BaseService {
|
|
21
21
|
get sysAppDao() {
|
|
22
22
|
const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
|
|
23
|
-
return this.curdProService.getQuickCrud(
|
|
23
|
+
return this.curdProService.getQuickCrud({
|
|
24
|
+
sqlDatabase: SystemDbName,
|
|
25
|
+
sqlDbType: SystemDbType,
|
|
26
|
+
sqlTable: SystemTables_1.SystemTables.sys_app,
|
|
27
|
+
});
|
|
24
28
|
}
|
|
25
29
|
get sysAppPageDao() {
|
|
26
30
|
const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
|
|
27
|
-
return this.curdProService.getQuickCrud(
|
|
31
|
+
return this.curdProService.getQuickCrud({
|
|
32
|
+
sqlDatabase: SystemDbName,
|
|
33
|
+
sqlDbType: SystemDbType,
|
|
34
|
+
sqlTable: SystemTables_1.SystemTables.sys_app_page,
|
|
35
|
+
});
|
|
28
36
|
}
|
|
29
37
|
async getSysAppPageOne({ page_path, workbench_code }) {
|
|
30
38
|
if (!page_path || typeof page_path !== 'string') {
|
|
@@ -37,9 +45,10 @@ let SysAppService = class SysAppService extends BaseService_1.BaseService {
|
|
|
37
45
|
cacheKey: `${workbench_code}#${page_path}`,
|
|
38
46
|
cacheName: bizmodels_1.CacheNameEnum.GetSysAppPageOne,
|
|
39
47
|
getter: async () => {
|
|
40
|
-
|
|
48
|
+
const res = await this.sysAppPageDao.findOne({
|
|
41
49
|
condition: { page_path, workbench_code, deleted_at: 0 }
|
|
42
50
|
});
|
|
51
|
+
return res.row;
|
|
43
52
|
},
|
|
44
53
|
});
|
|
45
54
|
}
|
|
@@ -51,9 +60,10 @@ let SysAppService = class SysAppService extends BaseService_1.BaseService {
|
|
|
51
60
|
cacheKey: app_code,
|
|
52
61
|
cacheName: bizmodels_1.CacheNameEnum.GetSysAppOne,
|
|
53
62
|
getter: async () => {
|
|
54
|
-
|
|
63
|
+
const res = await this.sysAppDao.findOne({
|
|
55
64
|
condition: { app_code, deleted_at: 0 }
|
|
56
65
|
});
|
|
66
|
+
return res.row;
|
|
57
67
|
},
|
|
58
68
|
});
|
|
59
69
|
}
|
|
@@ -85,10 +95,11 @@ let SysAppService = class SysAppService extends BaseService_1.BaseService {
|
|
|
85
95
|
if (!condition) {
|
|
86
96
|
throw new Error('[removeSysAppCacheByCondition] condition required');
|
|
87
97
|
}
|
|
88
|
-
const
|
|
98
|
+
const res = await this.sysAppDao.findList({
|
|
89
99
|
condition: condition,
|
|
90
100
|
columns: ['id', 'app_code']
|
|
91
101
|
});
|
|
102
|
+
const appList = res.rows;
|
|
92
103
|
for (const app of appList) {
|
|
93
104
|
await this.removeSysAppOneCache(app.app_code);
|
|
94
105
|
}
|
|
@@ -5,6 +5,6 @@ export declare class SysConfigService extends BaseService {
|
|
|
5
5
|
private curdProService;
|
|
6
6
|
private cacheServiceFactory;
|
|
7
7
|
private get sysConfigsDao();
|
|
8
|
-
getSysConfigOne(config_code: string): Promise<any
|
|
8
|
+
getSysConfigOne(config_code: string): Promise<Record<string, any>>;
|
|
9
9
|
removeSysConfigOneCache(config_code: string): Promise<any>;
|
|
10
10
|
}
|
|
@@ -20,7 +20,11 @@ const CacheServiceFactory_1 = require("../service/base/cache/CacheServiceFactory
|
|
|
20
20
|
let SysConfigService = class SysConfigService extends BaseService_1.BaseService {
|
|
21
21
|
get sysConfigsDao() {
|
|
22
22
|
const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
|
|
23
|
-
return this.curdProService.getQuickCrud(
|
|
23
|
+
return this.curdProService.getQuickCrud({
|
|
24
|
+
sqlDatabase: SystemDbName,
|
|
25
|
+
sqlDbType: SystemDbType,
|
|
26
|
+
sqlTable: SystemTables_1.SystemTables.sys_configs,
|
|
27
|
+
});
|
|
24
28
|
}
|
|
25
29
|
async getSysConfigOne(config_code) {
|
|
26
30
|
if (!config_code || typeof config_code !== 'string') {
|
|
@@ -30,9 +34,10 @@ let SysConfigService = class SysConfigService extends BaseService_1.BaseService
|
|
|
30
34
|
cacheKey: config_code,
|
|
31
35
|
cacheName: bizmodels_1.CacheNameEnum.GetSysConfigOne,
|
|
32
36
|
getter: async () => {
|
|
33
|
-
|
|
37
|
+
const res = await this.sysConfigsDao.findOne({
|
|
34
38
|
condition: { config_code, deleted_at: 0 }
|
|
35
39
|
});
|
|
40
|
+
return res.row;
|
|
36
41
|
},
|
|
37
42
|
});
|
|
38
43
|
}
|