kcode-pi 0.1.0

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 (219) hide show
  1. package/README.md +358 -0
  2. package/dist/cli/kcode.d.ts +15 -0
  3. package/dist/cli/kcode.js +153 -0
  4. package/dist/cli/main.d.ts +2 -0
  5. package/dist/cli/main.js +7 -0
  6. package/docs/KCODE_DISTRIBUTION.md +91 -0
  7. package/extensions/kingdee-harness.ts +180 -0
  8. package/extensions/kingdee-header.ts +122 -0
  9. package/extensions/kingdee-tools.ts +379 -0
  10. package/knowledge/.backup/v1.0.0/version.json +10 -0
  11. package/knowledge/cangqiong/product-notes.md +15 -0
  12. package/knowledge/common/business-flows.md +115 -0
  13. package/knowledge/common/config-guides.md +110 -0
  14. package/knowledge/common/error-patterns.md +170 -0
  15. package/knowledge/common/implementation.md +144 -0
  16. package/knowledge/cosmic/hard-constraints.md +38 -0
  17. package/knowledge/cosmic/ksql-datafix.md +34 -0
  18. package/knowledge/cosmic/platform-baseline.md +32 -0
  19. package/knowledge/cosmic/plugin-decision-matrix.md +40 -0
  20. package/knowledge/cosmic/review-checklist.md +40 -0
  21. package/knowledge/cosmic/unittest.md +35 -0
  22. package/knowledge/enterprise/api-reference.md +186 -0
  23. package/knowledge/enterprise/code-patterns.md +217 -0
  24. package/knowledge/enterprise/plugin-lifecycle.md +188 -0
  25. package/knowledge/enterprise/tables.json +159 -0
  26. package/knowledge/flagship/api-reference.md +237 -0
  27. package/knowledge/flagship/code-patterns.md +246 -0
  28. package/knowledge/flagship/cosmic-platform-note.md +15 -0
  29. package/knowledge/flagship/plugin-lifecycle.md +248 -0
  30. package/knowledge/flagship/tables.json +159 -0
  31. package/knowledge/version.json +10 -0
  32. package/knowledge/xinghan/product-notes.md +15 -0
  33. package/package.json +71 -0
  34. package/prompts/kd-discuss.md +11 -0
  35. package/prompts/kd-execute.md +12 -0
  36. package/prompts/kd-plan.md +12 -0
  37. package/prompts/kd-ship.md +12 -0
  38. package/prompts/kd-spec.md +12 -0
  39. package/prompts/kd-verify.md +12 -0
  40. package/skills/kd-check/SKILL.md +26 -0
  41. package/skills/kd-cosmic-dev/SKILL.md +82 -0
  42. package/skills/kd-cosmic-review/SKILL.md +90 -0
  43. package/skills/kd-cosmic-unittest/SKILL.md +92 -0
  44. package/skills/kd-debug/SKILL.md +30 -0
  45. package/skills/kd-discuss/SKILL.md +24 -0
  46. package/skills/kd-execute/SKILL.md +22 -0
  47. package/skills/kd-gen/SKILL.md +34 -0
  48. package/skills/kd-ksql/SKILL.md +86 -0
  49. package/skills/kd-plan/SKILL.md +24 -0
  50. package/skills/kd-ship/SKILL.md +22 -0
  51. package/skills/kd-spec/SKILL.md +24 -0
  52. package/skills/kd-verify/SKILL.md +22 -0
  53. package/themes/kcode-dark.json +81 -0
  54. package/vendor/kingdee-skills/cosmic-unittest/SKILL.md +788 -0
  55. package/vendor/kingdee-skills/cosmic-unittest/author-cache.json +5 -0
  56. package/vendor/kingdee-skills/cosmic-unittest/cosmic-unittest-skill-overview.html +746 -0
  57. package/vendor/kingdee-skills/cosmic-unittest/examples/business-test.md +205 -0
  58. package/vendor/kingdee-skills/cosmic-unittest/examples/common-test.md +257 -0
  59. package/vendor/kingdee-skills/cosmic-unittest/examples/formplugin-test.md +560 -0
  60. package/vendor/kingdee-skills/cosmic-unittest/examples/op-plugin-test.md +231 -0
  61. package/vendor/kingdee-skills/cosmic-unittest/examples/validator-test.md +232 -0
  62. package/vendor/kingdee-skills/cosmic-unittest/patterns/business-helper.md +184 -0
  63. package/vendor/kingdee-skills/cosmic-unittest/patterns/common-module.md +355 -0
  64. package/vendor/kingdee-skills/cosmic-unittest/patterns/convert-plugin.md +130 -0
  65. package/vendor/kingdee-skills/cosmic-unittest/patterns/formplugin.md +235 -0
  66. package/vendor/kingdee-skills/cosmic-unittest/patterns/op-plugin.md +226 -0
  67. package/vendor/kingdee-skills/cosmic-unittest/patterns/validator.md +206 -0
  68. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/SKILL.md +674 -0
  69. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/advanced-scenario-checklist.md +307 -0
  70. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/algox-performance-checklist.md +129 -0
  71. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/coding-standard-checklist.md +491 -0
  72. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/cosmic-api-checklist.md +285 -0
  73. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/data-access-checklist.md +261 -0
  74. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/data-transaction-checklist.md +390 -0
  75. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/domain-logic-checklist.md +295 -0
  76. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/form-plugin-checklist.md +508 -0
  77. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/infra-checklist.md +254 -0
  78. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/ksql-checklist.md +305 -0
  79. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/lifecycle-checklist.md +298 -0
  80. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/operation-plugin-checklist.md +442 -0
  81. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/test-mock-checklist.md +120 -0
  82. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/ui-performance-checklist.md +320 -0
  83. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/scripts/pattern-matcher.py +336 -0
  84. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/scripts/review-score-calculator.py +121 -0
  85. package/vendor/kingdee-skills/ok-cosmic/CHANGELOG.md +295 -0
  86. package/vendor/kingdee-skills/ok-cosmic/README.md +460 -0
  87. package/vendor/kingdee-skills/ok-cosmic/SKILL.md +287 -0
  88. package/vendor/kingdee-skills/ok-cosmic/agents/openai.yaml +17 -0
  89. package/vendor/kingdee-skills/ok-cosmic/assets/BatchImportPluginTemplate.java +93 -0
  90. package/vendor/kingdee-skills/ok-cosmic/assets/BillPlugInTemplate.java +156 -0
  91. package/vendor/kingdee-skills/ok-cosmic/assets/ConvertPlugInTemplate.java +255 -0
  92. package/vendor/kingdee-skills/ok-cosmic/assets/FormPluginTemplate.java +597 -0
  93. package/vendor/kingdee-skills/ok-cosmic/assets/IWorkflowPluginTemplate.java +91 -0
  94. package/vendor/kingdee-skills/ok-cosmic/assets/ListPluginTemplate.java +194 -0
  95. package/vendor/kingdee-skills/ok-cosmic/assets/OpPluginTemplate.java +201 -0
  96. package/vendor/kingdee-skills/ok-cosmic/assets/OpenApiControllerTemplate.java +103 -0
  97. package/vendor/kingdee-skills/ok-cosmic/assets/PrintPluginTemplate.java +95 -0
  98. package/vendor/kingdee-skills/ok-cosmic/assets/ReportFormPluginTemplate.java +257 -0
  99. package/vendor/kingdee-skills/ok-cosmic/assets/ReportListDataPluginTemplate.java +70 -0
  100. package/vendor/kingdee-skills/ok-cosmic/assets/StandardTreeListPluginTemplate.java +130 -0
  101. package/vendor/kingdee-skills/ok-cosmic/assets/TaskTemplate.java +80 -0
  102. package/vendor/kingdee-skills/ok-cosmic/assets/TreeListPluginTemplate.java +152 -0
  103. package/vendor/kingdee-skills/ok-cosmic/assets/WriteBackPlugInTemplate.java +286 -0
  104. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/attachment/AttachmentUploadBindSample.java +93 -0
  105. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/botp/BotpTracePushSample.java +168 -0
  106. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/botp/SampleConvertPlugin.java +223 -0
  107. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/cache/SampleCacheUsage.java +218 -0
  108. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/concurrent/SampleThreadPoolBatch.java +156 -0
  109. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/data/DynamicObjectCrudSample.java +205 -0
  110. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/data/DynamicObjectOpsSample.java +100 -0
  111. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/BeforeOperationConfirmSample.java +217 -0
  112. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ConfirmDialogSample.java +131 -0
  113. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/EntryRowCalculateSample.java +116 -0
  114. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/F7FilterSample.java +134 -0
  115. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/GetAndSetValueSample.java +176 -0
  116. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/HyperlinkJumpSample.java +124 -0
  117. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/OpenBillModalSample.java +253 -0
  118. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ReturnParentDataSample.java +295 -0
  119. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/TreeControlSample.java +140 -0
  120. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ViewControlOpsSample.java +132 -0
  121. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/list/ListPluginBasicSample.java +170 -0
  122. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/list/ListPreOpenFilterSample.java +68 -0
  123. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/message/MessageNotifySample.java +95 -0
  124. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/mq/SampleMQConsumer.java +198 -0
  125. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/mq/sample_mq.xml +15 -0
  126. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/operation/OpAddValidatorsSample.java +137 -0
  127. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/operation/OperationOptionBridgeSample.java +228 -0
  128. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/package-info.java +19 -0
  129. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/BaseDataQuerySample.java +194 -0
  130. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/BatchQuerySample.java +368 -0
  131. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/DataSetQueryStatSample.java +131 -0
  132. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/report/SampleReportFormPlugin.java +179 -0
  133. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/report/SampleReportListDataPlugin.java +616 -0
  134. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/snippets-guide.md +64 -0
  135. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/task/ScheduleTaskSample.java +160 -0
  136. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/workflow/SampleWorkflowPlugin.java +302 -0
  137. package/vendor/kingdee-skills/ok-cosmic/manifest.json +78 -0
  138. package/vendor/kingdee-skills/ok-cosmic/ok-cosmic-intro.html +903 -0
  139. package/vendor/kingdee-skills/ok-cosmic/references/adv/attachment-api.md +114 -0
  140. package/vendor/kingdee-skills/ok-cosmic/references/adv/botp-convert.md +98 -0
  141. package/vendor/kingdee-skills/ok-cosmic/references/adv/dynamic-object.md +113 -0
  142. package/vendor/kingdee-skills/ok-cosmic/references/adv/entity-metadata.md +123 -0
  143. package/vendor/kingdee-skills/ok-cosmic/references/adv/event-lifecycle.md +184 -0
  144. package/vendor/kingdee-skills/ok-cosmic/references/adv/flex-prop.md +114 -0
  145. package/vendor/kingdee-skills/ok-cosmic/references/adv/form-utils.md +133 -0
  146. package/vendor/kingdee-skills/ok-cosmic/references/adv/operate-chain.md +159 -0
  147. package/vendor/kingdee-skills/ok-cosmic/references/adv/plugin-base.md +218 -0
  148. package/vendor/kingdee-skills/ok-cosmic/references/adv/query-dataset.md +149 -0
  149. package/vendor/kingdee-skills/ok-cosmic/references/adv/request-context.md +88 -0
  150. package/vendor/kingdee-skills/ok-cosmic/references/adv/view-handler.md +157 -0
  151. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-bill.md +76 -0
  152. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-botp.md +70 -0
  153. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-form.md +165 -0
  154. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-import.md +69 -0
  155. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-list.md +227 -0
  156. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-openapi.md +112 -0
  157. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-operation.md +135 -0
  158. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-print.md +65 -0
  159. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-report-data.md +64 -0
  160. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-report-form.md +90 -0
  161. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-task.md +62 -0
  162. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-tree-list.md +71 -0
  163. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-workflow.md +82 -0
  164. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-writeback.md +71 -0
  165. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-algo.md +67 -0
  166. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-cache.md +63 -0
  167. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-dynamic-model-svc.md +82 -0
  168. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-dynamic-object.md +70 -0
  169. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-entity-model.md +61 -0
  170. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-exception.md +64 -0
  171. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-file.md +63 -0
  172. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-id.md +47 -0
  173. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-lock.md +61 -0
  174. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-log.md +63 -0
  175. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-network-control.md +70 -0
  176. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-orm-access.md +78 -0
  177. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-request-context.md +62 -0
  178. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-threadpool.md +63 -0
  179. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-tx.md +64 -0
  180. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-utils.md +67 -0
  181. package/vendor/kingdee-skills/ok-cosmic/requirements.txt +2 -0
  182. package/vendor/kingdee-skills/ok-cosmic/rules/a-layer-rules.json +24 -0
  183. package/vendor/kingdee-skills/ok-cosmic/rules/anti-patterns.md +48 -0
  184. package/vendor/kingdee-skills/ok-cosmic/rules/cheat-sheet.md +256 -0
  185. package/vendor/kingdee-skills/ok-cosmic/rules/coding-preferences.md +140 -0
  186. package/vendor/kingdee-skills/ok-cosmic/rules/constraints.md +61 -0
  187. package/vendor/kingdee-skills/ok-cosmic/rules/decision-matrix.md +222 -0
  188. package/vendor/kingdee-skills/ok-cosmic/rules/intent-routing.md +94 -0
  189. package/vendor/kingdee-skills/ok-cosmic/rules/platform-baseline.md +69 -0
  190. package/vendor/kingdee-skills/ok-cosmic/rules/post-check.md +109 -0
  191. package/vendor/kingdee-skills/ok-cosmic/scripts/config_loader.py +204 -0
  192. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-api-knowledge.py +910 -0
  193. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-basedata-query.py +359 -0
  194. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-config-check.py +181 -0
  195. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-extpoints-query.py +389 -0
  196. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-form-metadata.py +856 -0
  197. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-post-check.py +262 -0
  198. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-post-lint.py +293 -0
  199. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/__init__.py +2 -0
  200. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/base.py +393 -0
  201. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/resource_check.py +176 -0
  202. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/scene_check.py +375 -0
  203. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/style_check.py +434 -0
  204. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/verify_check.py +36 -0
  205. package/vendor/kingdee-skills/ok-cosmic/scripts/route_client.py +186 -0
  206. package/vendor/kingdee-skills/ok-cosmic/scripts/script_utils.py +40 -0
  207. package/vendor/kingdee-skills/ok-cosmic/scripts/sqlite_cache.py +142 -0
  208. package/vendor/kingdee-skills/ok-cosmic/setup/cuslib/kd-cd-cosmic-commons.jar +0 -0
  209. package/vendor/kingdee-skills/ok-cosmic/setup/cuslib/kd-cd-cosmic-features.jar +0 -0
  210. package/vendor/kingdee-skills/ok-cosmic/setup/ok-cosmic-docs.db +0 -0
  211. package/vendor/kingdee-skills/ok-cosmic/setup/ok-cosmic.json +13 -0
  212. package/vendor/kingdee-skills/ok-cosmic/setup/setup-mac.sh +18 -0
  213. package/vendor/kingdee-skills/ok-cosmic/setup/setup-windows.bat +53 -0
  214. package/vendor/kingdee-skills/ok-cosmic/setup/setup.jar +0 -0
  215. package/vendor/kingdee-skills/ok-ksql/SKILL.md +81 -0
  216. package/vendor/kingdee-skills/ok-ksql/agents/openai.yaml +7 -0
  217. package/vendor/kingdee-skills/ok-ksql/manifest.json +14 -0
  218. package/vendor/kingdee-skills/ok-ksql/references/ksql-datafix.md +452 -0
  219. package/vendor/kingdee-skills/ok-ksql/scripts/ksql_lint.py +363 -0
@@ -0,0 +1,254 @@
1
+ # 基础设施检查表(缓存/线程池/分布式锁/MQ)
2
+
3
+ ## 🔴 P0 级问题
4
+
5
+ ### 1. 缓存 Key 未账套隔离
6
+ **检查点**:
7
+ - `AppCache` / `DistributeSessionlessCache` 的 key 是否拼接了 `RequestContext.get().getAccountId()`?
8
+ - 缓存 key 是否可能在不同租户间冲突?
9
+
10
+ **风险**: 跨账套数据污染,A 租户读到 B 租户的缓存数据
11
+
12
+ **修正方案**:
13
+ ```java
14
+ // ❌ 错误写法 - key 未隔离
15
+ cache.put("materialList", data);
16
+
17
+ // ✅ 正确写法 - key 拼接账套ID
18
+ String accountId = RequestContext.get().getAccountId();
19
+ cache.put(accountId + ":materialList", data);
20
+ ```
21
+
22
+ ---
23
+
24
+ ### 2. JDK 原生线程池
25
+ **检查点**:
26
+ - 是否使用了 `new Thread()`、`Executors.newFixedThreadPool()` 等 JDK 原生线程创建方式?
27
+ - 是否使用了 `CompletableFuture.runAsync()` 未指定平台线程池?
28
+
29
+ **风险**: 绕过平台线程管理,无法传递 RequestContext,线程泄漏无法监控
30
+
31
+ **修正方案**:
32
+ ```java
33
+ // ❌ 错误写法
34
+ new Thread(() -> doSomething()).start();
35
+ Executors.newFixedThreadPool(5);
36
+
37
+ // ✅ 正确写法 - 使用平台线程池
38
+ ThreadPools.executeOnce("taskName", () -> doSomething());
39
+ // 需要传递请求上下文时
40
+ ThreadPools.executeOnceIncludeRequestContext("taskName", () -> doSomething());
41
+ ```
42
+
43
+ ---
44
+
45
+ ### 3. 分布式锁未在 finally 中释放
46
+ **检查点**:
47
+ - `DLock.lock()` / `DLock.tryLock()` 后是否在 `finally` 块中调用了 `unlock()`?
48
+ - 是否存在异常路径导致锁永久不释放?
49
+
50
+ **风险**: 业务异常导致锁永久不释放,其他线程永久阻塞
51
+
52
+ **修正方案**:
53
+ ```java
54
+ // ❌ 错误写法 - 未在 finally 中释放
55
+ DLock lock = DLock.create("key", "desc");
56
+ lock.lock();
57
+ doSomething(); // 如果抛异常,锁永远不释放!
58
+ lock.unlock();
59
+
60
+ // ✅ 正确写法
61
+ DLock lock = DLock.create("key", "desc");
62
+ lock.lock();
63
+ try {
64
+ doSomething();
65
+ } finally {
66
+ lock.unlock();
67
+ }
68
+ ```
69
+
70
+ ---
71
+
72
+ ### 4. MQ 发布者未关闭
73
+ **检查点**:
74
+ - `MQFactory.get().createSimplePublisher()` 创建的 publisher 是否在 finally 中调用了 `close()`?
75
+
76
+ **风险**: 资源泄漏,连接池耗尽
77
+
78
+ **修正方案**:
79
+ ```java
80
+ // ❌ 错误写法 - publisher 未关闭
81
+ MessagePublisher publisher = MQFactory.get().createSimplePublisher("queue");
82
+ publisher.publish(message);
83
+ // 缺少 close!
84
+
85
+ // ✅ 正确写法
86
+ MessagePublisher publisher = MQFactory.get().createSimplePublisher("queue");
87
+ try {
88
+ publisher.publish(message);
89
+ } finally {
90
+ publisher.close();
91
+ }
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 🟠 P1 级问题
97
+
98
+ ### 5. 异步线程丢失 RequestContext
99
+ **检查点**:
100
+ - 异步线程中是否需要访问 `RequestContext`(如获取当前用户、组织、账套)?
101
+ - 是否使用了 `ThreadPools.executeOnce` 而非 `executeOnceIncludeRequestContext`?
102
+
103
+ **风险**: 异步线程中 `RequestContext.get()` 返回 null,导致 NPE 或获取到错误的上下文
104
+
105
+ **修正方案**:
106
+ ```java
107
+ // ❌ 错误写法 - 异步线程无 RequestContext
108
+ ThreadPools.executeOnce("task", () -> {
109
+ String accountId = RequestContext.get().getAccountId(); // NPE!
110
+ });
111
+
112
+ // ✅ 正确写法 - 传递 RequestContext
113
+ ThreadPools.executeOnceIncludeRequestContext("task", () -> {
114
+ String accountId = RequestContext.get().getAccountId(); // 正常
115
+ });
116
+ ```
117
+
118
+ ---
119
+
120
+ ### 6. 不可重入锁嵌套使用
121
+ **检查点**:
122
+ - 使用 `DLock.create()` 创建的不可重入锁,是否存在同一线程对同一 key 嵌套加锁的情况?
123
+
124
+ **风险**: 不可重入锁嵌套加锁会导致死锁
125
+
126
+ **修正方案**:
127
+ ```java
128
+ // ❌ 错误写法 - 不可重入锁嵌套
129
+ DLock lock = DLock.create("key", "desc");
130
+ public void methodA() {
131
+ lock.lock();
132
+ try {
133
+ methodB(); // methodB 也对同一 key 加锁,死锁!
134
+ } finally {
135
+ lock.unlock();
136
+ }
137
+ }
138
+
139
+ // ✅ 正确写法 - 使用可重入锁
140
+ DLock lock = DLock.createReentrant("key");
141
+ public void methodA() {
142
+ lock.lock();
143
+ try {
144
+ methodB(); // 可重入,不会死锁
145
+ } finally {
146
+ lock.unlock();
147
+ }
148
+ }
149
+ public void methodB() {
150
+ lock.lock();
151
+ try {
152
+ // ...
153
+ } finally {
154
+ lock.unlock();
155
+ }
156
+ }
157
+ ```
158
+
159
+ ---
160
+
161
+ ### 7. MQ 消费者未处理幂等
162
+ **检查点**:
163
+ - MQ 消费者 `onMessage` 方法是否支持重复消费不产生副作用?
164
+ - 是否检查了 `resend` 参数判断是否为重发消息?
165
+
166
+ **风险**: MQ 消息可能重复投递,非幂等消费导致数据重复处理
167
+
168
+ **修正方案**:
169
+ ```java
170
+ // ❌ 错误写法 - 未处理幂等
171
+ @Override
172
+ public void onMessage(Object message, String messageId, boolean resend, MessageAcker acker) {
173
+ insertRecord(message); // 重复消费会插入重复数据!
174
+ acker.ack(messageId);
175
+ }
176
+
177
+ // ✅ 正确写法 - 幂等处理
178
+ @Override
179
+ public void onMessage(Object message, String messageId, boolean resend, MessageAcker acker) {
180
+ try {
181
+ if (isProcessed(messageId)) {
182
+ acker.ack(messageId);
183
+ return;
184
+ }
185
+ insertRecord(message);
186
+ markProcessed(messageId);
187
+ acker.ack(messageId);
188
+ } catch (Throwable e) {
189
+ logger.error("消费异常", e);
190
+ if (e instanceof IOException) {
191
+ acker.discard(messageId); // 不可重试的错误,丢弃
192
+ } else {
193
+ acker.deny(messageId); // 可重试的错误,重新投递
194
+ }
195
+ }
196
+ }
197
+ ```
198
+
199
+ ---
200
+
201
+ ### 8. MQ 消费者未调用 acker
202
+ **检查点**:
203
+ - `onMessage` 的所有执行路径是否都调用了 `acker.ack()` / `acker.deny()` / `acker.discard()` 之一?
204
+
205
+ **风险**: 未确认的消息会被 MQ 一直重新投递,造成消息堆积
206
+
207
+ **修正方案**:
208
+ ```java
209
+ // ❌ 错误写法 - 异常路径未调用 acker
210
+ @Override
211
+ public void onMessage(Object message, String messageId, boolean resend, MessageAcker acker) {
212
+ processMessage(message); // 如果抛异常,acker 未调用
213
+ acker.ack(messageId);
214
+ }
215
+
216
+ // ✅ 正确写法 - 所有路径都有 acker 调用
217
+ @Override
218
+ public void onMessage(Object message, String messageId, boolean resend, MessageAcker acker) {
219
+ try {
220
+ processMessage(message);
221
+ acker.ack(messageId);
222
+ } catch (Throwable e) {
223
+ logger.error("消费异常", e);
224
+ acker.deny(messageId);
225
+ }
226
+ }
227
+ ```
228
+
229
+ ---
230
+
231
+ ## 🟡 P2 级问题
232
+
233
+ ### 9. 分布式锁 key 不规范
234
+ **检查点**:
235
+ - 锁 key 是否使用了业务唯一标识(如 `应用/模块/单据号`)?
236
+ - 锁 key 是否过于宽泛(如只用模块名),导致不必要的锁竞争?
237
+
238
+ **修正方案**:
239
+ ```java
240
+ // ❌ 错误写法 - key 过于宽泛
241
+ DLock lock = DLock.create("voucher", "凭证锁");
242
+
243
+ // ✅ 正确写法 - 使用业务唯一标识
244
+ DLock lock = DLock.create("fi/gl/" + voucherNo, "凭证" + voucherNo);
245
+ ```
246
+
247
+ ---
248
+
249
+ ### 10. 缓存无过期策略
250
+ **检查点**:
251
+ - 缓存数据是否设置了合理的过期时间?
252
+ - 是否存在缓存数据永不过期导致内存持续增长?
253
+
254
+ **修正方案**: 根据业务场景设置合理的 TTL,避免缓存无限增长
@@ -0,0 +1,305 @@
1
+ # KSQL脚本规范审查清单
2
+
3
+ ## 1. 通用命名规则审查
4
+
5
+ - [ ] 名称由字母、下划线或数字组成
6
+ - [ ] 首字符必须为字母
7
+ - [ ] 禁止使用中文、空格、特殊字符
8
+ - [ ] 禁止使用无意义的数字
9
+ - [ ] 名词使用单数形式
10
+ - [ ] 同一概念使用统一单词翻译
11
+ - [ ] 避免与数据库关键字冲突
12
+ - [ ] 推荐使用大写(非强制),表名、字段名、索引名等数据库对象名建议使用大写,避免大小写混用(如 `T_APPID_BILL`符合,`t_appid_bill` 建议修改)
13
+
14
+
15
+ ## 2. 数据库对象命名审查
16
+
17
+ ### 表命名规范
18
+ - [ ] 格式:`T_` + 系统标识 + `_` + 名称
19
+ - [ ] 最大长度:24字符
20
+ - [ ] 示例:`T_BAS_USER`
21
+ - [ ] 如果是分录表,需要加`entry`后缀标识,普通表不用加
22
+ - [ ] 建表必须判断是否存在避免重复执行:
23
+ ```sql
24
+ IF NOT EXISTS (SELECT 1 FROM KSQL_USERTABLES WHERE KSQL_TABNAME = '表名')
25
+ CREATE TABLE 表名 (...);
26
+ ```
27
+
28
+ ### 字段命名规范
29
+ - [ ] 格式:`F` + 名称
30
+ - [ ] 最大长度:30字符
31
+ - [ ] 示例:`FUSERNAME`
32
+
33
+ ### 视图命名规范
34
+ - [ ] 格式:`V_` + 系统标识 + `_` + 名称
35
+ - [ ] 最大长度:24字符
36
+ - [ ] 示例:`V_BAS_USER`
37
+
38
+ ### 存储过程命名规范
39
+ - [ ] 格式:`P_` + 系统标识 + `_` + 名称
40
+ - [ ] 最大长度:30字符
41
+ - [ ] 示例:`P_BAS_GETUSERLIST`
42
+
43
+ ### 主键命名规范
44
+ - [ ] 格式:`PK_` + 系统标识 + `_` + 名称
45
+ - [ ] 最大长度:25字符
46
+ - [ ] 示例:`PK_BAS_USER`
47
+ - [ ] 使用存储过程创建:`EXEC P_ALTERPK '主键名', '表名', '主键字段', '1'`
48
+ - [ ] 主键可在constraint文件中定义,也可与建表语句放在同一文件,不强制分文件
49
+ - [ ] **审查范围**:在table文件中不强制审查主键是否存在;在constraint文件或合并文件中审查主键命名规范
50
+
51
+ ### 索引命名规范
52
+ - [ ] 格式:`IDX_` + 系统标识 + `_` + 表/表缩写 + 字段/字段缩写
53
+ - [ ] 最大长度:30字符
54
+ - [ ] 超长时可用首字母缩写
55
+ - [ ] 示例:`IDX_T_BAS_USER_FID`、`IDX_BAS_BCRE_FRULEID`
56
+ - [ ] 多语言表(_L后缀表)索引字段顺序:`(FID, FLOCALEID)`
57
+ - [ ] 必须判断是否存在避免重复执行:
58
+ ```sql
59
+ IF NOT EXISTS (SELECT 1 FROM KSQL_INDEXES WHERE KSQL_INDNAME = '索引名')
60
+ CREATE INDEX 索引名 ON 表名 (字段);
61
+ ```
62
+ - [ ] **审查范围**:在table文件中不强制审查索引是否存在;在constraint文件或合并文件中审查索引命名规范和字段顺序(特别是多语言表)
63
+
64
+ ### 索引重建规范
65
+ - [ ] **删除索引后重建时,如果索引字段有变更,必须使用新的索引名,禁止复用原索引名**
66
+ - [ ] 原因:1、提前手工升级时即使提前了会导致重新执行;2、在大量客户场景下,无法区分客户使用的是旧索引还是新索引
67
+ - [ ] 【建议】删除索引建议使用 `p_DropIdx` 存储过程,格式:`EXEC p_DropIdx '索引名', '表名'`
68
+ - [ ] ❌ 不符合规范示例:
69
+ ```sql
70
+ IF EXISTS (SELECT 1 FROM KSQL_INDEXES WHERE KSQL_INDNAME = 'idx_appid_bill_status')
71
+ DROP INDEX T_APPID_BILL.idx_appid_bill_status;
72
+
73
+ IF NOT EXISTS (SELECT 1 FROM KSQL_INDEXES WHERE KSQL_INDNAME = 'idx_appid_bill_status')
74
+ CREATE INDEX idx_appid_bill_status ON T_APPID_BILL (org, stauts);
75
+ ```
76
+ - [ ] ✅ 符合规范示例:
77
+ ```sql
78
+ -- 方式1:使用存储过程(推荐)
79
+ EXEC p_DropIdx 'IDX_APPID_BILL_STATUS', 'T_APPID_BILL';
80
+
81
+ -- 方式2:判断存在性后删除
82
+ IF EXISTS (SELECT 1 FROM KSQL_INDEXES WHERE KSQL_INDNAME = 'IDX_APPID_BILL_STATUS')
83
+ DROP INDEX T_APPID_BILL.IDX_APPID_BILL_STATUS;
84
+
85
+ IF NOT EXISTS (SELECT 1 FROM KSQL_INDEXES WHERE KSQL_INDNAME = 'IDX_APPID_BILL_STATUS_V2')
86
+ CREATE INDEX IDX_APPID_BILL_STATUS_V2 ON T_APPID_BILL (ORG, STAUTS);
87
+ ```
88
+ - [ ] **审查范围**:在table文件中不强制审查索引是否存在;在constraint文件或合并文件中审查索引命名规范和字段顺序(特别是多语言表)
89
+
90
+ ### 缺省值命名规范
91
+ - [ ] 格式:`DF_` + 系统标识 + `_` + 名称(表名可选)
92
+ - [ ] 最大长度:30字符
93
+ - [ ] 示例:`DF_T_BAS_USER_FID`、`DF_BAS_FNAME`
94
+
95
+ ### 函数命名规范
96
+ - [ ] 格式:`FN_` + 名称
97
+ - [ ] 最大长度:30字符
98
+ - [ ] 示例:`FN_GETUSERCOUNT`
99
+
100
+ ### 规则命名规范
101
+ - [ ] 格式:`RUL_` + 名称
102
+ - [ ] 最大长度:30字符
103
+ - [ ] 示例:`RUL_CREATEBATCHNO`
104
+
105
+ ### 约束命名规范
106
+ - [ ] 格式:`CR_` + 名称
107
+ - [ ] 最大长度:30字符
108
+ - [ ] 示例:`CR_FIELDLENGTH`
109
+
110
+ ### 序列命名规范
111
+ - [ ] 格式:`Z_` + 名称
112
+ - [ ] 最大长度:30字符
113
+ - [ ] 示例:`Z_STK_INVENTORY`
114
+
115
+ ### 禁用项(禁止使用)
116
+ - [ ] 外键 - 禁止使用
117
+ - [ ] 触发器 - 禁止使用
118
+ - [ ] 游标 - 禁止使用
119
+ - [ ] 用户自定义数据类型 - 不推荐使用
120
+
121
+ ## 3. 常用字段规范审查
122
+
123
+ | 字段描述 | 字段名称 | 建议类型 |
124
+ |---------|---------|---------|
125
+ | 主键 | FID | BIGINT, VARCHAR(18), VARCHAR(36), VARCHAR(N) |
126
+ | 从表主键(分录表) | FENTRYID | BIGINT, VARCHAR(18), VARCHAR(36), VARCHAR(N) |
127
+ | 多语言表主键(_L后缀表) | FPKID | VARCHAR(18), VARCHAR(N) |
128
+ | 名称 | FNAME | NVARCHAR |
129
+ | 全名 | FFULLNAME | NVARCHAR |
130
+ | 标题 | FTITLE | NVARCHAR |
131
+ | 顺序号 | FSEQ | INT |
132
+ | 描述 | FDESCRIPTION | NVARCHAR |
133
+ | 备注 | FCOMMENT | NVARCHAR |
134
+ | 备注 | FREMARK | NVARCHAR |
135
+ | 创建人 | FCREATORID | - |
136
+ | 创建日期 | FCREATEDATE | - |
137
+ | 物料内码 | FMATERIALID | - |
138
+ | 修改人 | FMODIFIERID | - |
139
+ | 修改日期 | FMODIFYDATE | - |
140
+ | 审核人 | FAPPROVERID | - |
141
+ | 审核日期 | FAPPROVEDATE | - |
142
+ | 禁用人 | FDISABLERID | - |
143
+ | 禁用日期 | FDISABLEDATE | - |
144
+ | 状态 | FxxxSTATUS | CHAR(1), VARCHAR, INT(不强制;若使用CHAR则必须为CHAR(1),不允许CHAR(2)等) |
145
+
146
+ ## 4. KSQL数据类型规范审查
147
+
148
+ ### 支持的数据类型
149
+ - **整型**:SMALLINT, INT, BIGINT
150
+ - **字符型**:CHAR, NCHAR, VARCHAR, NVARCHAR
151
+ - **大对象型**:NCLOB, BLOB
152
+ - **数值型**:DECIMAL
153
+ - **日期时间型**:DATETIME
154
+ - **布尔类型**:KSQL不支持布尔类型,布尔类型使用CHAR(1)
155
+
156
+ ### DECIMAL精度要求
157
+ - [ ] DECIMAL仅允许使用:`DECIMAL(23,10)` 或 `DECIMAL(19,6)`
158
+ - [ ] 其他精度(如`DECIMAL(18,2)`)需告警并人工评审
159
+
160
+ ### 非空及默认值要求
161
+ - [ ] 除NCLOB、BLOB、DATETIME外,其他类型必须`NOT NULL`且有默认值
162
+ - [ ] NCLOB、BLOB、DATETIME可为空,不强制要求默认值
163
+ - [ ] 正确示例:
164
+ - `FID BIGINT DEFAULT 0 NOT NULL` ✅
165
+ - `FNAME NVARCHAR(50) DEFAULT ' ' NOT NULL` ✅
166
+ - `FCREATETIME DATETIME` ✅(可为空)
167
+ - `FRESULTS NCLOB` ✅(可为空)
168
+
169
+ ## 5. 表结构变更审查
170
+
171
+ ### 禁止删除和重命名表和字段
172
+ - [ ] **禁止删除表(DROP TABLE)** - 会导致历史数据丢失,严重影响业务连续性
173
+ - [ ] **禁止重命名表(RENAME TABLE/ALTER TABLE RENAME)** - 会导致依赖该表的对象失效
174
+ - [ ] **禁止删除列(ALTER TABLE DROP COLUMN)** - 会导致历史数据丢失
175
+ - [ ] **禁止重命名列(ALTER TABLE RENAME COLUMN/sp_rename)** - 会导致依赖该列的对象失效
176
+ - [ ] ❌ 不符合规范示例:
177
+ ```sql
178
+ -- 禁止删除表
179
+ DROP TABLE T_XXX_YYYY;
180
+
181
+ -- 禁止重命名表
182
+ ALTER TABLE T_XXX_YYYY RENAME TO T_XXX_ZZZZ;
183
+ EXEC sp_rename 'T_XXX_YYYY', 'T_XXX_ZZZZ';
184
+
185
+ -- 禁止删除列
186
+ ALTER TABLE T_XXX_YYYY DROP COLUMN FCOLUMNNAME;
187
+
188
+ -- 禁止重命名列
189
+ ALTER TABLE T_XXX_YYYY RENAME COLUMN FCOLUMNNAME TO FNEWCOLUMN;
190
+ EXEC sp_rename 'T_XXX_YYYY.FCOLUMNNAME', 'FNEWCOLUMN', 'COLUMN';
191
+ ```
192
+
193
+ ### 增加列(ALTER TABLE ADD)
194
+ - [ ] 必须判断列是否存在,避免重复执行:
195
+ ```sql
196
+ IF NOT EXISTS (SELECT 1 FROM KSQL_USERCOLUMNS WHERE KSQL_COL_TABNAME = '表名' AND KSQL_COL_NAME ='字段名')
197
+ ALTER TABLE 表名 ADD (字段名 类型 DEFAULT 默认值 非空属性);
198
+ ```
199
+ - [ ] 新增列同样遵守字段命名、数据类型、非空默认值规范
200
+
201
+ ### 修改列(p_AlterColumn存储过程)
202
+ - [ ] 格式:`EXEC p_AlterColumn '表名', '字段名', '类型', '非空约束', '标志位', '默认值'`
203
+ - [ ] 标志位为4位,各位含义:
204
+ - 第1位:是否修改类型(1=是,0=否)
205
+ - 第2位:是否修改字段长度(1=是,0=否)
206
+ - 第3位:是否修改非空约束(1=是,0=否)
207
+ - 第4位:是否修改默认值(1=是,0=否)
208
+ - [ ] **若第1位为1(修改类型),其他位也建议为1(即`1111`)**;第1位为1而其他位出现0(如`1000`)需告警,建议人工评审
209
+ - [ ] **若第1位为0(不修改类型),其他位不做强制约束**,如`0001`(仅修改默认值)符合规范
210
+ - [ ] 示例:
211
+ - ✅ 符合(修改类型):`EXEC p_AlterColumn 'T_XXX', 'FNAME', 'NVARCHAR(100)', 'NOT NULL', '1111', ''' '''`
212
+ - ✅ 符合(仅修改默认值):`EXEC p_AlterColumn 'T_XXX', 'FSTATUS', 'CHAR(1)', 'NOT NULL', '0001', '''0'''`
213
+ - ⚠️ 告警(第1位为1但其他位出现0):`EXEC p_AlterColumn 'T_XXX', 'FNAME', 'NVARCHAR(100)', 'NOT NULL', '1000', ''' '''`
214
+
215
+ ### 变更单表字段同步(P0)
216
+ - [ ] **采购订单表新增字段时,采购订单变更单表必须同步添加相同字段**
217
+ - [ ] 表对应关系:
218
+ - 表头:`t_pm_purorderbill` → `t_pm_xpurorderbill`
219
+ - 物料明细分录:`t_pm_purorderbillentry` → `t_pm_xpurorderbillentry`
220
+ - 付款计划:`t_pm_purorderpayentry` → `t_pm_xpurorderpayentry`
221
+
222
+ **风险**: 变更单功能运行报错,字段不存在导致数据读写失败
223
+
224
+ **修正方案**:
225
+ ```sql
226
+ -- ❌ 错误写法 - 只给采购订单表添加字段
227
+ IF NOT EXISTS (SELECT 1 FROM KSQL_USERCOLUMNS WHERE KSQL_COL_TABNAME = 'T_PM_PURORDERBILL' AND KSQL_COL_NAME ='FNEWFIELD')
228
+ ALTER TABLE T_PM_PURORDERBILL ADD (FNEWFIELD BIGINT DEFAULT 0 NOT NULL);
229
+
230
+ -- ✅ 正确写法 - 同时给采购订单表和变更单表添加字段
231
+ IF NOT EXISTS (SELECT 1 FROM KSQL_USERCOLUMNS WHERE KSQL_COL_TABNAME = 'T_PM_PURORDERBILL' AND KSQL_COL_NAME ='FNEWFIELD')
232
+ ALTER TABLE T_PM_PURORDERBILL ADD (FNEWFIELD BIGINT DEFAULT 0 NOT NULL);
233
+
234
+ IF NOT EXISTS (SELECT 1 FROM KSQL_USERCOLUMNS WHERE KSQL_COL_TABNAME = 'T_PM_XPURORDERBILL' AND KSQL_COL_NAME ='FNEWFIELD')
235
+ ALTER TABLE T_PM_XPURORDERBILL ADD (FNEWFIELD BIGINT DEFAULT 0 NOT NULL);
236
+ ```
237
+
238
+ ---
239
+
240
+ ## 6. DML操作规范审查
241
+
242
+ ### DELETE和UPDATE语句规范
243
+ - [ ] **必须带WHERE条件**,避免影响范围扩大
244
+ - [ ] 符合规范示例:
245
+ ```sql
246
+ DELETE FROM T_XXX_YYYY WHERE FID = 'xxx';
247
+ UPDATE T_XXX_YYYY SET FNAME = 'xxx' WHERE FID = 'xxx';
248
+ ```
249
+ - [ ] 不符合规范示例(❌ 警告):
250
+ ```sql
251
+ DELETE FROM T_XXX_YYYY;
252
+ UPDATE T_XXX_YYYY SET FNAME = 'xxx';
253
+ ```
254
+
255
+ ### KSQL日期时间格式规范
256
+ - [ ] **DATETIME类型字段必须使用 `{ts'YYYY-MM-DD HH:MM:SS'}` 或 `{ts'YYYY-MM-DD'}` 格式**
257
+ - [ ] 符合规范示例:
258
+ ```sql
259
+ INSERT INTO T_XXX_YYYY (FID, FCREATEDATE) VALUES (123, {ts'2024-01-12 16:15:17'});
260
+ ```
261
+ - [ ] 不符合规范示例(❌ 警告):
262
+ ```sql
263
+ INSERT INTO T_XXX_YYYY (FID, FCREATEDATE) VALUES (123, '2024-01-12 16:15:17');
264
+ ```
265
+
266
+ ## 7. 脚本文件命名规范审查
267
+
268
+ ### 强制要求
269
+ - [ ] 文件名在产品中唯一
270
+ - [ ] 分库系统共用表定义在基础库
271
+ - [ ] 分库系统禁止DDL脚本跨库执行
272
+ - [ ] 升级按分库分别执行
273
+ - [ ] 公共预插数据由基础库维护
274
+
275
+ ### 命名格式
276
+ ```
277
+ 产品代号_版本号_云标识_应用标识_类型标识[_功能标识][_子功能标识][_多语言后缀].sql
278
+ ```
279
+
280
+ ### 版本号格式
281
+ ```
282
+ 主版本号.子版本号[.迭代版本号][_特殊版本号]
283
+ ```
284
+
285
+ - 子版本号从0开始
286
+ - 迭代版本号是个大于等于0数值
287
+ - 特殊版本号:`sp`、`alpha`、`rc`
288
+ - 文件名全部小写
289
+
290
+ ### 类型标识
291
+ - `table` - 表结构
292
+ - `view` - 视图
293
+ - `constraint` - 约束
294
+ - `data` - 数据
295
+
296
+ ### 多语言后缀(RFC 4646标准)
297
+ - `zh_CN` - 简体中文
298
+ - `zh_TW` - 繁体中文
299
+ - `en_US` - 英文
300
+
301
+ ### 命名示例
302
+ - `kd_3.0_bos_botp_table.sql` - 升级脚本
303
+ - `kd_3.0.1_bos_botp_table.sql` - 迭代版本
304
+ - `kd_1.0_sp1_bos_meta_table.sql` - sp1补丁
305
+ - `kd_1.0_sp2_bos_base_table.sql` - sp2补丁