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.
Files changed (121) hide show
  1. package/.qoder/skills/midway-fatcms/01-quick-start.md +231 -0
  2. package/.qoder/skills/midway-fatcms/02-crud-quick.md +337 -0
  3. package/.qoder/skills/midway-fatcms/03-crud-sharding.md +488 -0
  4. package/.qoder/skills/midway-fatcms/04-condition-operators.md +93 -0
  5. package/.qoder/skills/midway-fatcms/05-configuration.md +290 -0
  6. package/.qoder/skills/midway-fatcms/06-builtin-functions.md +241 -0
  7. package/.qoder/skills/midway-fatcms/07-examples.md +500 -0
  8. package/.qoder/skills/midway-fatcms/SKILL.md +96 -0
  9. package/README.md +9 -9
  10. package/dist/controller/base/BaseApiController.d.ts +1 -2
  11. package/dist/controller/base/BaseApiController.js +0 -4
  12. package/dist/controller/gateway/DocGatewayController.js +1 -1
  13. package/dist/controller/manage/FlowConfigManageApi.js +4 -2
  14. package/dist/controller/manage/SysConfigMangeApi.js +6 -1
  15. package/dist/controller/manage/UserAccountManageApi.js +7 -2
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.js +2 -2
  18. package/dist/libs/crud-pro/CrudPro.d.ts +23 -2
  19. package/dist/libs/crud-pro/CrudPro.js +53 -2
  20. package/dist/libs/crud-pro/interfaces.d.ts +82 -12
  21. package/dist/libs/crud-pro/models/CrudResult.d.ts +115 -0
  22. package/dist/libs/crud-pro/models/CrudResult.js +126 -0
  23. package/dist/libs/crud-pro/models/RequestModel.d.ts +2 -38
  24. package/dist/libs/crud-pro/models/RequestModel.js +2 -99
  25. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +36 -2
  26. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +8 -4
  27. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +1 -2
  28. package/dist/libs/crud-pro/utils/OrderByUtils.d.ts +70 -0
  29. package/dist/libs/crud-pro/utils/OrderByUtils.js +158 -0
  30. package/dist/libs/crud-pro-quick/CrudProQuick.d.ts +295 -0
  31. package/dist/libs/crud-pro-quick/CrudProQuick.js +529 -0
  32. package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +30 -0
  33. package/dist/{service/curd → libs/crud-pro-quick}/fixSoftDelete.js +3 -6
  34. package/dist/libs/crud-pro-quick/index.d.ts +36 -0
  35. package/dist/libs/crud-pro-quick/index.js +49 -0
  36. package/dist/libs/crud-pro-quick/models.d.ts +33 -0
  37. package/dist/libs/crud-pro-quick/models.js +2 -0
  38. package/dist/libs/crud-sharding/ShardingConfig.d.ts +15 -2
  39. package/dist/libs/crud-sharding/ShardingConfig.js +2 -2
  40. package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +119 -274
  41. package/dist/libs/crud-sharding/ShardingCrudPro.js +559 -379
  42. package/dist/libs/crud-sharding/ShardingMerger.d.ts +12 -20
  43. package/dist/libs/crud-sharding/ShardingMerger.js +36 -51
  44. package/dist/libs/crud-sharding/ShardingResult.d.ts +33 -0
  45. package/dist/libs/crud-sharding/ShardingResult.js +16 -0
  46. package/dist/libs/crud-sharding/ShardingRouter.d.ts +1 -0
  47. package/dist/libs/crud-sharding/ShardingRouter.js +25 -6
  48. package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +21 -4
  49. package/dist/libs/crud-sharding/ShardingTableCreator.js +193 -59
  50. package/dist/libs/crud-sharding/ShardingUtils.d.ts +48 -0
  51. package/dist/libs/crud-sharding/ShardingUtils.js +122 -1
  52. package/dist/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  53. package/dist/libs/crud-sharding/index.d.ts +4 -3
  54. package/dist/libs/crud-sharding/index.js +14 -2
  55. package/dist/models/bizmodels.d.ts +2 -6
  56. package/dist/service/SysAppService.d.ts +2 -2
  57. package/dist/service/SysAppService.js +16 -5
  58. package/dist/service/SysConfigService.d.ts +1 -1
  59. package/dist/service/SysConfigService.js +7 -2
  60. package/dist/service/SysDictDataService.js +14 -4
  61. package/dist/service/SysMenuService.js +7 -2
  62. package/dist/service/curd/CurdMixService.d.ts +6 -4
  63. package/dist/service/curd/CurdMixService.js +16 -2
  64. package/dist/service/curd/CurdProService.d.ts +43 -27
  65. package/dist/service/curd/CurdProService.js +32 -33
  66. package/dist/service/flow/FlowConfigService.js +7 -2
  67. package/dist/service/flow/FlowInstanceCrudService.js +22 -19
  68. package/package.json +2 -1
  69. package/src/controller/base/BaseApiController.ts +0 -5
  70. package/src/controller/gateway/DocGatewayController.ts +1 -1
  71. package/src/controller/manage/CrudStandardDesignApi.ts +4 -3
  72. package/src/controller/manage/FlowConfigManageApi.ts +4 -2
  73. package/src/controller/manage/SysConfigMangeApi.ts +6 -1
  74. package/src/controller/manage/UserAccountManageApi.ts +7 -2
  75. package/src/index.ts +2 -2
  76. package/src/libs/crud-pro/CrudPro.ts +62 -4
  77. package/src/libs/crud-pro/interfaces.ts +110 -15
  78. package/src/libs/crud-pro/models/CrudResult.ts +178 -0
  79. package/src/libs/crud-pro/models/RequestModel.ts +4 -110
  80. package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +41 -2
  81. package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +11 -7
  82. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +1 -2
  83. package/src/libs/crud-pro/utils/OrderByUtils.ts +169 -0
  84. package/src/libs/crud-pro-quick/CrudProQuick.ts +594 -0
  85. package/src/{service/curd → libs/crud-pro-quick}/fixSoftDelete.ts +23 -13
  86. package/src/libs/crud-pro-quick/index.ts +52 -0
  87. package/src/libs/crud-pro-quick/models.ts +35 -0
  88. package/src/libs/crud-sharding/ShardingConfig.ts +18 -2
  89. package/src/libs/crud-sharding/ShardingCrudPro.ts +689 -440
  90. package/src/libs/crud-sharding/ShardingMerger.ts +47 -73
  91. package/src/libs/crud-sharding/ShardingResult.ts +29 -0
  92. package/src/libs/crud-sharding/ShardingRouter.ts +27 -6
  93. package/src/libs/crud-sharding/ShardingTableCreator.ts +214 -71
  94. package/src/libs/crud-sharding/ShardingUtils.ts +137 -0
  95. package/src/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  96. package/src/libs/crud-sharding/index.ts +14 -3
  97. package/src/models/bizmodels.ts +4 -7
  98. package/src/service/SysAppService.ts +18 -7
  99. package/src/service/SysConfigService.ts +8 -3
  100. package/src/service/SysDictDataService.ts +14 -4
  101. package/src/service/SysMenuService.ts +7 -2
  102. package/src/service/crudstd/CrudStdService.ts +2 -2
  103. package/src/service/curd/CurdMixService.ts +26 -5
  104. package/src/service/curd/CurdProService.ts +58 -39
  105. package/src/service/flow/FlowConfigService.ts +7 -2
  106. package/src/service/flow/FlowInstanceCrudService.ts +23 -20
  107. package/dist/libs/crud-pro/README.md +0 -809
  108. package/dist/libs/crud-pro/README_FUNC.md +0 -193
  109. package/dist/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  110. package/dist/models/StandardColumns.d.ts +0 -71
  111. package/dist/models/StandardColumns.js +0 -28
  112. package/dist/service/curd/CrudProQuick.d.ts +0 -190
  113. package/dist/service/curd/CrudProQuick.js +0 -319
  114. package/dist/service/curd/README.md +0 -1001
  115. package/dist/service/curd/fixSoftDelete.d.ts +0 -20
  116. package/src/libs/crud-pro/README.md +0 -809
  117. package/src/libs/crud-pro/README_FUNC.md +0 -193
  118. package/src/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  119. package/src/models/StandardColumns.ts +0 -76
  120. package/src/service/curd/CrudProQuick.ts +0 -360
  121. package/src/service/curd/README.md +0 -1001
@@ -0,0 +1,231 @@
1
+ # 快速入门
2
+
3
+ ## 安装
4
+
5
+ ```bash
6
+ npm install midway-fatcms
7
+ ```
8
+
9
+ ## 服务注入
10
+
11
+ midway-fatcms 提供两个核心服务:
12
+
13
+ ```typescript
14
+ import { Provide, Inject } from '@midwayjs/core';
15
+ import { CurdMixService, CurdProService } from 'midway-fatcms';
16
+
17
+ @Provide()
18
+ export class MyService {
19
+ @Inject()
20
+ curdMixService: CurdMixService; // 协调层(带关联填充)
21
+
22
+ @Inject()
23
+ curdProService: CurdProService; // 核心层
24
+ }
25
+ ```
26
+
27
+ ## 数据库类型
28
+
29
+ ```typescript
30
+ import { SqlDbType } from 'midway-fatcms';
31
+
32
+ // 支持三种数据库
33
+ SqlDbType.mysql // MySQL
34
+ SqlDbType.postgres // PostgreSQL
35
+ SqlDbType.sqlserver // SQL Server
36
+ ```
37
+
38
+ ## 三种使用方式
39
+
40
+ ### 方式一:CrudProQuick(推荐入门)
41
+
42
+ 适用于单表 CRUD 操作:
43
+
44
+ ```typescript
45
+ const quick = this.curdProService.getQuickCrud({
46
+ sqlDatabase: 'mydb',
47
+ sqlDbType: SqlDbType.mysql,
48
+ sqlTable: 't_user',
49
+ });
50
+
51
+ // 查询列表
52
+ const result = await quick.findList({ condition: { status: 1 } });
53
+ console.log(result.rows, result.count);
54
+
55
+ // 分页查询
56
+ const page = await quick.findPage({
57
+ condition: { status: 1 },
58
+ pageNo: 1,
59
+ pageSize: 10,
60
+ orderBy: 'created_at DESC',
61
+ });
62
+ console.log(page.rows, page.totalCount);
63
+
64
+ // 插入
65
+ const insertResult = await quick.insert({
66
+ data: { name: '张三', age: 20 },
67
+ });
68
+ console.log(insertResult.insertId);
69
+
70
+ // 更新
71
+ await quick.update({
72
+ condition: { id: 1 },
73
+ data: { age: 21 },
74
+ });
75
+
76
+ // 删除
77
+ await quick.delete({ condition: { id: 1 } });
78
+ ```
79
+
80
+ ### 方式二:ShardingCrudPro(分表场景)
81
+
82
+ 适用于按时间、哈希分表的场景:
83
+
84
+ ```typescript
85
+ import { ShardingType } from 'midway-fatcms';
86
+
87
+ const sharding = this.curdProService.getShardingCrud({
88
+ sqlDatabase: 'mydb',
89
+ sqlDbType: SqlDbType.mysql,
90
+ shardingConfig: {
91
+ type: ShardingType.MONTH, // 按月分表
92
+ baseTable: 't_order', // 基础表名
93
+ timeColumn: 'created_at', // 时间字段
94
+ },
95
+ });
96
+
97
+ // 插入(自动路由到 t_order_202401)
98
+ await sharding.insert({
99
+ data: { order_id: '001', created_at: '2024-01-15' },
100
+ });
101
+
102
+ // 分页查询(自动合并多表结果)
103
+ const page = await sharding.findPage({
104
+ condition: { status: 'paid' },
105
+ pageNo: 1,
106
+ pageSize: 10,
107
+ orderBy: 'created_at DESC', // 时间分表必须传
108
+ });
109
+ ```
110
+
111
+ ### 方式三:CurdMixService(关联填充)
112
+
113
+ 适用于需要字典翻译、用户信息填充的场景:
114
+
115
+ ```typescript
116
+ const cfgModel = {
117
+ method: 'order.list',
118
+ sqlTable: 't_order',
119
+ sqlSimpleName: 'SIMPLE_QUERY_PAGE',
120
+ columnsRelation: [
121
+ // 订单状态字典翻译
122
+ {
123
+ relatedType: 'dict',
124
+ relatedCode: 'OrderStatusEnum',
125
+ sourceColumn: 'status',
126
+ targetColumns: [{ from: 'label', to: 'status_text' }],
127
+ },
128
+ // 创建者信息填充
129
+ {
130
+ relatedType: 'accountBasic',
131
+ sourceColumn: 'created_by',
132
+ targetColumns: [], // 使用默认映射
133
+ },
134
+ ],
135
+ };
136
+
137
+ const ctx = await this.curdMixService.executeCrudByCfg(
138
+ { condition: {}, pageNo: 1, pageSize: 10, orderBy: 'created_at DESC' },
139
+ cfgModel
140
+ );
141
+
142
+ const { rows } = ctx.getResModelForQueryPage();
143
+ // rows 自动包含 status_text、created_by_nickname 等字段
144
+ ```
145
+
146
+ ## 常用配置
147
+
148
+ ### 软删除
149
+
150
+ 启用后,DELETE 操作会转为 UPDATE:
151
+
152
+ ```typescript
153
+ quick.setBaseCfgModel({
154
+ enableSoftDelete: true,
155
+ });
156
+
157
+ // 实际执行:UPDATE t_user SET deleted_at=?, deleted_by=? WHERE id=1
158
+ await quick.delete({ condition: { id: 1 } });
159
+
160
+ // 查询时自动追加 deleted_at = 0
161
+ const users = await quick.findList({ condition: { status: 1 } });
162
+ ```
163
+
164
+ ### 标准字段自动填充
165
+
166
+ ```typescript
167
+ quick.setBaseCfgModel({
168
+ enableStandardUpdateCfg: true,
169
+ });
170
+
171
+ // INSERT 自动填充:created_by, created_at, created_nickname 等
172
+ await quick.insert({ data: { name: '张三' } });
173
+
174
+ // UPDATE 自动填充:modified_by, modified_at 等
175
+ await quick.update({ condition: { id: 1 }, data: { age: 21 } });
176
+ ```
177
+
178
+ ## 条件查询示例
179
+
180
+ ```typescript
181
+ // 简单条件
182
+ { status: 'active' }
183
+
184
+ // 比较操作
185
+ { age: { $gt: 18, $lt: 60 } }
186
+ { score: { $gte: 60 } }
187
+
188
+ // 范围操作
189
+ { id: { $in: [1, 2, 3] } }
190
+ { amount: { $range: [100, 500] } }
191
+
192
+ // 模糊查询
193
+ { name: { $like: '张%' } } // 前缀匹配
194
+ { name: { $likeInclude: '张三' } } // 包含匹配
195
+
196
+ // NULL 判断
197
+ { deleted_at: { $null: true } }
198
+ { phone: { $notNull: true } }
199
+
200
+ // 逻辑组合
201
+ {
202
+ $and: [
203
+ { status: 'active' },
204
+ { $or: [{ level: 'vip' }, { amount: { $gte: 1000 } }] }
205
+ ]
206
+ }
207
+ ```
208
+
209
+ ## 排序语法
210
+
211
+ ```typescript
212
+ // 字符串格式
213
+ orderBy: 'created_at DESC'
214
+ orderBy: 'created_at DESC, amount ASC'
215
+
216
+ // 简写格式(+ 升序,- 降序)
217
+ orderBy: 'created_at-'
218
+ orderBy: 'age+,created_at-'
219
+
220
+ // 数组格式
221
+ orderBy: [
222
+ { fieldName: 'created_at', orderType: 'DESC' },
223
+ { fieldName: 'amount', orderType: 'ASC' },
224
+ ]
225
+ ```
226
+
227
+ ## 下一步
228
+
229
+ - [CrudProQuick 单表操作](./02-crud-quick.md) - 完整 API 参考
230
+ - [ShardingCrudPro 分表操作](./03-crud-sharding.md) - 分表路由详解
231
+ - [条件操作符大全](./04-condition-operators.md) - 所有支持的查询条件
@@ -0,0 +1,337 @@
1
+ # CrudProQuick 单表操作
2
+
3
+ CrudProQuick 是在 CrudPro 之上封装的便捷操作层,提供简洁的 API 进行单表 CRUD 操作。
4
+
5
+ ## 获取实例
6
+
7
+ ```typescript
8
+ const quick = this.curdProService.getQuickCrud({
9
+ sqlDatabase: 'mydb', // 数据库名(必填)
10
+ sqlDbType: SqlDbType.mysql, // 数据库类型(必填)
11
+ sqlTable: 't_user', // 表名(可选,调用时传入)
12
+ });
13
+ ```
14
+
15
+ ## API 总览
16
+
17
+ ### 查询方法
18
+
19
+ | 方法 | 返回类型 | 说明 |
20
+ |------|----------|------|
21
+ | `findOne(req, table?)` | `CrudQueryOneResult<T>` | 查询单条(无顺序保证) |
22
+ | `findUniqueOne(req, table?)` | `CrudQueryOneResult<T>` | 唯一查询(多条报错) |
23
+ | `findList(req, table?)` | `CrudQueryListResult<T>` | 列表查询 |
24
+ | `findPage(req, table?)` | `CrudQueryPageResult<T>` | 分页查询 |
25
+ | `isExist(req, table?)` | `CrudExistResult` | 存在性判断 |
26
+ | `findCount(req, table?)` | `CrudCountResult` | 统计总数 |
27
+ | `findOneById(id, table?)` | `CrudQueryOneResult<T>` | 根据主键 ID 查询单条(多条报错) |
28
+ | `findListByIds(ids, table?)` | `CrudQueryListResult<T>` | 根据主键 ID 列表查询多条 |
29
+
30
+ ### 写入方法
31
+
32
+ | 方法 | 返回类型 | 说明 |
33
+ |------|----------|------|
34
+ | `insert(req, table?)` | `CrudWriteResult` | 插入单条 |
35
+ | `batchInsert(req, table?)` | `CrudWriteResult` | 批量插入 |
36
+ | `update(req, table?)` | `CrudWriteResult` | 更新 |
37
+ | `delete(req, table?)` | `CrudWriteResult` | 删除 |
38
+ | `restore(req, table?)` | `CrudWriteResult` | 恢复软删除记录(重置 deleted_at/deleted_by) |
39
+ | `insertOrUpdate(req, table?)` | `CrudUpsertResult` | 先查再插/更 |
40
+ | `insertOnDuplicateUpdate(req, uniqueCols?, table?)` | `CrudWriteResult` | 原生 upsert |
41
+
42
+ ### SQL 方法
43
+
44
+ | 方法 | 返回类型 | 说明 |
45
+ |------|----------|------|
46
+ | `executeSQL(sql, args?)` | `ExecuteSQLResult` | 框架封装 SQL |
47
+ | `executeNativeSQL<T>(sql, args?)` | `ExecuteSQLResult<T>` | 原生 SQL |
48
+
49
+ ---
50
+
51
+ ## 查询方法详解
52
+
53
+ ### findOne - 查询单条
54
+
55
+ 返回第一条匹配记录,不保证顺序:
56
+
57
+ ```typescript
58
+ const result = await quick.findOne({
59
+ condition: { status: 'active' },
60
+ orderBy: 'created_at DESC',
61
+ });
62
+
63
+ if (result.found) {
64
+ console.log(result.row);
65
+ }
66
+ ```
67
+
68
+ ### findUniqueOne - 唯一查询
69
+
70
+ 期望结果为 0 条或 1 条,多条时报错:
71
+
72
+ ```typescript
73
+ const result = await quick.findUniqueOne({
74
+ condition: { email: 'user@example.com' },
75
+ });
76
+
77
+ if (result.found) {
78
+ console.log(result.row);
79
+ }
80
+ // 多条时抛出异常
81
+ ```
82
+
83
+ ### findList - 列表查询
84
+
85
+ ```typescript
86
+ const result = await quick.findList({
87
+ condition: { status: 'active' },
88
+ orderBy: 'created_at DESC',
89
+ columns: ['id', 'name', 'email'],
90
+ });
91
+
92
+ console.log(result.rows, result.count);
93
+ ```
94
+
95
+ ### findPage - 分页查询
96
+
97
+ ```typescript
98
+ const page = await quick.findPage({
99
+ condition: { status: 'active' },
100
+ pageNo: 1,
101
+ pageSize: 20,
102
+ orderBy: 'created_at DESC',
103
+ });
104
+
105
+ console.log(page.rows, page.totalCount);
106
+ ```
107
+
108
+ ### isExist - 存在性判断
109
+
110
+ ```typescript
111
+ const result = await quick.isExist({
112
+ condition: { email: 'user@example.com' },
113
+ });
114
+ console.log(result.exists); // true / false
115
+ ```
116
+
117
+ ### findCount - 统计总数
118
+
119
+ ```typescript
120
+ const result = await quick.findCount({
121
+ condition: { status: 'active' },
122
+ });
123
+ console.log(result.count);
124
+ ```
125
+
126
+ ### findOneById - 根据主键 ID 查询单条
127
+
128
+ 等价于 `findUniqueOne({ condition: { id } })`,但更简洁。如果查询到多条记录会抛出异常。
129
+
130
+ ```typescript
131
+ // 根据 ID 查询单条
132
+ const result = await quick.findOneById(1);
133
+ if (result.found) {
134
+ console.log(result.row);
135
+ }
136
+
137
+ // 字符串 ID
138
+ const result = await quick.findOneById('ORD001', 't_order');
139
+ ```
140
+
141
+ ### findListByIds - 根据主键 ID 列表查询多条
142
+
143
+ 等价于 `findList({ condition: { id: { $in: ids } } })`,但更简洁。
144
+
145
+ ```typescript
146
+ // 根据 ID 列表查询
147
+ const result = await quick.findListByIds([1, 2, 3]);
148
+ console.log(result.rows, result.count);
149
+
150
+ // 字符串 ID 列表
151
+ const result = await quick.findListByIds(['ORD001', 'ORD002'], 't_order');
152
+ ```
153
+
154
+ ---
155
+
156
+ ## 写入方法详解
157
+
158
+ ### insert - 插入单条
159
+
160
+ ```typescript
161
+ const result = await quick.insert({
162
+ data: { name: '张三', email: 'test@example.com', age: 25 },
163
+ });
164
+ console.log(result.insertId, result.affectedRows);
165
+ ```
166
+
167
+ ### batchInsert - 批量插入
168
+
169
+ ```typescript
170
+ const result = await quick.batchInsert({
171
+ data: [
172
+ { name: '张三', age: 25 },
173
+ { name: '李四', age: 30 },
174
+ ],
175
+ });
176
+ console.log(result.affectedRows);
177
+ ```
178
+
179
+ ### update - 更新
180
+
181
+ ```typescript
182
+ const result = await quick.update({
183
+ condition: { id: 1 },
184
+ data: { name: '张三更新', age: 26 },
185
+ });
186
+ ```
187
+
188
+ ### delete - 删除
189
+
190
+ ```typescript
191
+ const result = await quick.delete({
192
+ condition: { id: 1 },
193
+ });
194
+ ```
195
+
196
+ ### restore - 恢复软删除
197
+
198
+ 恢复已软删除的记录,将 `deleted_at` 重置为 0,`deleted_by` 重置为空字符串。需要启用软删除(`setBaseCfgModel({ enableSoftDelete: true })`)。
199
+
200
+ ```typescript
201
+ // 恢复指定 ID 的记录
202
+ await quick.restore({ condition: { id: 1 } });
203
+
204
+ // 恢复多条记录(使用 $in 操作符)
205
+ await quick.restore({ condition: { id: { $in: [1, 2, 3] } } });
206
+
207
+ // 按条件批量恢复记录
208
+ await quick.restore({ condition: { status: 'deleted' } });
209
+ ```
210
+
211
+ ### insertOrUpdate - 先查再插/更
212
+
213
+ ```typescript
214
+ const result = await quick.insertOrUpdate({
215
+ condition: { email: 'test@example.com' },
216
+ data: { email: 'test@example.com', name: '用户' },
217
+ });
218
+ console.log(result.isExist ? '更新' : '插入');
219
+ ```
220
+
221
+ ### insertOnDuplicateUpdate - 原生 Upsert
222
+
223
+ ```typescript
224
+ const result = await quick.insertOnDuplicateUpdate(
225
+ { data: { id: 1, name: '用户' } },
226
+ ['id'] // 唯一列,PostgreSQL/SQL Server 必填
227
+ );
228
+ ```
229
+
230
+ ---
231
+
232
+ ## SQL 方法详解
233
+
234
+ ### executeNativeSQL - 原生 SQL
235
+
236
+ ```typescript
237
+ const users = await quick.executeNativeSQL<{ id: number; name: string }[]>(
238
+ 'SELECT id, name FROM t_user WHERE age > ?',
239
+ [18]
240
+ );
241
+ ```
242
+
243
+ ---
244
+
245
+ ## 配置方法
246
+
247
+ ### setBaseCfgModel
248
+
249
+ ```typescript
250
+ quick.setBaseCfgModel({
251
+ enableSoftDelete: true, // 启用软删除(delete 设置 deleted_at/deleted_by,而非物理删除)
252
+ enableStandardUpdateCfg: true,
253
+ maxLimit: 10000,
254
+ });
255
+ ```
256
+
257
+ 启用软删除后,`delete` 操作会设置 `deleted_at`(当前时间戳)和 `deleted_by`(当前用户 ID),查询时自动过滤已删除记录。可通过 `restore` 方法恢复。
258
+
259
+ ---
260
+
261
+ ## 软删除
262
+
263
+ 启用软删除后,数据不会被物理删除,而是标记删除状态:
264
+
265
+ ```typescript
266
+ const quick = this.curdProService.getQuickCrud({
267
+ sqlDatabase: 'mydb',
268
+ sqlDbType: SqlDbType.mysql,
269
+ sqlTable: 't_user',
270
+ });
271
+
272
+ // 启用软删除
273
+ quick.setBaseCfgModel({ enableSoftDelete: true });
274
+
275
+ // 软删除(设置 deleted_at 和 deleted_by)
276
+ await quick.delete({ condition: { id: 1 } });
277
+
278
+ // 恢复软删除记录
279
+ await quick.restore({ condition: { id: 1 } });
280
+
281
+ // 查询时自动过滤 deleted_at != 0 的记录
282
+ const result = await quick.findList({ condition: { status: 'active' } });
283
+ ```
284
+
285
+ ---
286
+
287
+ ## 返回类型
288
+
289
+ ```typescript
290
+ // 写操作结果
291
+ interface CrudWriteResult {
292
+ affectedRows: number;
293
+ insertId?: string | number;
294
+ }
295
+
296
+ // 单条查询结果
297
+ interface CrudQueryOneResult<T> {
298
+ row: T | null;
299
+ found: boolean;
300
+ }
301
+
302
+ // 列表查询结果
303
+ interface CrudQueryListResult<T> {
304
+ rows: T[];
305
+ count: number;
306
+ }
307
+
308
+ // 分页查询结果
309
+ interface CrudQueryPageResult<T> {
310
+ rows: T[];
311
+ totalCount: number;
312
+ count: number;
313
+ }
314
+
315
+ // 存在性结果
316
+ interface CrudExistResult {
317
+ exists: boolean;
318
+ }
319
+
320
+ // 计数结果
321
+ interface CrudCountResult {
322
+ count: number;
323
+ }
324
+ ```
325
+
326
+ ---
327
+
328
+ ## 实例复用
329
+
330
+ CrudProQuick **可以安全复用**:
331
+
332
+ ```typescript
333
+ const quick = this.curdProService.getQuickCrud({...});
334
+ await quick.findList({ condition: {...} });
335
+ await quick.insert({ data: {...} });
336
+ // 复用 OK!
337
+ ```