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.
- package/README.md +358 -0
- package/dist/cli/kcode.d.ts +15 -0
- package/dist/cli/kcode.js +153 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +7 -0
- package/docs/KCODE_DISTRIBUTION.md +91 -0
- package/extensions/kingdee-harness.ts +180 -0
- package/extensions/kingdee-header.ts +122 -0
- package/extensions/kingdee-tools.ts +379 -0
- package/knowledge/.backup/v1.0.0/version.json +10 -0
- package/knowledge/cangqiong/product-notes.md +15 -0
- package/knowledge/common/business-flows.md +115 -0
- package/knowledge/common/config-guides.md +110 -0
- package/knowledge/common/error-patterns.md +170 -0
- package/knowledge/common/implementation.md +144 -0
- package/knowledge/cosmic/hard-constraints.md +38 -0
- package/knowledge/cosmic/ksql-datafix.md +34 -0
- package/knowledge/cosmic/platform-baseline.md +32 -0
- package/knowledge/cosmic/plugin-decision-matrix.md +40 -0
- package/knowledge/cosmic/review-checklist.md +40 -0
- package/knowledge/cosmic/unittest.md +35 -0
- package/knowledge/enterprise/api-reference.md +186 -0
- package/knowledge/enterprise/code-patterns.md +217 -0
- package/knowledge/enterprise/plugin-lifecycle.md +188 -0
- package/knowledge/enterprise/tables.json +159 -0
- package/knowledge/flagship/api-reference.md +237 -0
- package/knowledge/flagship/code-patterns.md +246 -0
- package/knowledge/flagship/cosmic-platform-note.md +15 -0
- package/knowledge/flagship/plugin-lifecycle.md +248 -0
- package/knowledge/flagship/tables.json +159 -0
- package/knowledge/version.json +10 -0
- package/knowledge/xinghan/product-notes.md +15 -0
- package/package.json +71 -0
- package/prompts/kd-discuss.md +11 -0
- package/prompts/kd-execute.md +12 -0
- package/prompts/kd-plan.md +12 -0
- package/prompts/kd-ship.md +12 -0
- package/prompts/kd-spec.md +12 -0
- package/prompts/kd-verify.md +12 -0
- package/skills/kd-check/SKILL.md +26 -0
- package/skills/kd-cosmic-dev/SKILL.md +82 -0
- package/skills/kd-cosmic-review/SKILL.md +90 -0
- package/skills/kd-cosmic-unittest/SKILL.md +92 -0
- package/skills/kd-debug/SKILL.md +30 -0
- package/skills/kd-discuss/SKILL.md +24 -0
- package/skills/kd-execute/SKILL.md +22 -0
- package/skills/kd-gen/SKILL.md +34 -0
- package/skills/kd-ksql/SKILL.md +86 -0
- package/skills/kd-plan/SKILL.md +24 -0
- package/skills/kd-ship/SKILL.md +22 -0
- package/skills/kd-spec/SKILL.md +24 -0
- package/skills/kd-verify/SKILL.md +22 -0
- package/themes/kcode-dark.json +81 -0
- package/vendor/kingdee-skills/cosmic-unittest/SKILL.md +788 -0
- package/vendor/kingdee-skills/cosmic-unittest/author-cache.json +5 -0
- package/vendor/kingdee-skills/cosmic-unittest/cosmic-unittest-skill-overview.html +746 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/business-test.md +205 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/common-test.md +257 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/formplugin-test.md +560 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/op-plugin-test.md +231 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/validator-test.md +232 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/business-helper.md +184 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/common-module.md +355 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/convert-plugin.md +130 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/formplugin.md +235 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/op-plugin.md +226 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/validator.md +206 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/SKILL.md +674 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/advanced-scenario-checklist.md +307 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/algox-performance-checklist.md +129 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/coding-standard-checklist.md +491 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/cosmic-api-checklist.md +285 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/data-access-checklist.md +261 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/data-transaction-checklist.md +390 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/domain-logic-checklist.md +295 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/form-plugin-checklist.md +508 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/infra-checklist.md +254 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/ksql-checklist.md +305 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/lifecycle-checklist.md +298 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/operation-plugin-checklist.md +442 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/test-mock-checklist.md +120 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/ui-performance-checklist.md +320 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/scripts/pattern-matcher.py +336 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/scripts/review-score-calculator.py +121 -0
- package/vendor/kingdee-skills/ok-cosmic/CHANGELOG.md +295 -0
- package/vendor/kingdee-skills/ok-cosmic/README.md +460 -0
- package/vendor/kingdee-skills/ok-cosmic/SKILL.md +287 -0
- package/vendor/kingdee-skills/ok-cosmic/agents/openai.yaml +17 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/BatchImportPluginTemplate.java +93 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/BillPlugInTemplate.java +156 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ConvertPlugInTemplate.java +255 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/FormPluginTemplate.java +597 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/IWorkflowPluginTemplate.java +91 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ListPluginTemplate.java +194 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/OpPluginTemplate.java +201 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/OpenApiControllerTemplate.java +103 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/PrintPluginTemplate.java +95 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ReportFormPluginTemplate.java +257 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ReportListDataPluginTemplate.java +70 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/StandardTreeListPluginTemplate.java +130 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/TaskTemplate.java +80 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/TreeListPluginTemplate.java +152 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/WriteBackPlugInTemplate.java +286 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/attachment/AttachmentUploadBindSample.java +93 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/botp/BotpTracePushSample.java +168 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/botp/SampleConvertPlugin.java +223 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/cache/SampleCacheUsage.java +218 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/concurrent/SampleThreadPoolBatch.java +156 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/data/DynamicObjectCrudSample.java +205 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/data/DynamicObjectOpsSample.java +100 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/BeforeOperationConfirmSample.java +217 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ConfirmDialogSample.java +131 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/EntryRowCalculateSample.java +116 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/F7FilterSample.java +134 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/GetAndSetValueSample.java +176 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/HyperlinkJumpSample.java +124 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/OpenBillModalSample.java +253 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ReturnParentDataSample.java +295 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/TreeControlSample.java +140 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ViewControlOpsSample.java +132 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/list/ListPluginBasicSample.java +170 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/list/ListPreOpenFilterSample.java +68 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/message/MessageNotifySample.java +95 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/mq/SampleMQConsumer.java +198 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/mq/sample_mq.xml +15 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/operation/OpAddValidatorsSample.java +137 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/operation/OperationOptionBridgeSample.java +228 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/package-info.java +19 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/BaseDataQuerySample.java +194 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/BatchQuerySample.java +368 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/DataSetQueryStatSample.java +131 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/report/SampleReportFormPlugin.java +179 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/report/SampleReportListDataPlugin.java +616 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/snippets-guide.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/task/ScheduleTaskSample.java +160 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/workflow/SampleWorkflowPlugin.java +302 -0
- package/vendor/kingdee-skills/ok-cosmic/manifest.json +78 -0
- package/vendor/kingdee-skills/ok-cosmic/ok-cosmic-intro.html +903 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/attachment-api.md +114 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/botp-convert.md +98 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/dynamic-object.md +113 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/entity-metadata.md +123 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/event-lifecycle.md +184 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/flex-prop.md +114 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/form-utils.md +133 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/operate-chain.md +159 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/plugin-base.md +218 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/query-dataset.md +149 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/request-context.md +88 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/view-handler.md +157 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-bill.md +76 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-botp.md +70 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-form.md +165 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-import.md +69 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-list.md +227 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-openapi.md +112 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-operation.md +135 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-print.md +65 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-report-data.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-report-form.md +90 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-task.md +62 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-tree-list.md +71 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-workflow.md +82 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-writeback.md +71 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-algo.md +67 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-cache.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-dynamic-model-svc.md +82 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-dynamic-object.md +70 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-entity-model.md +61 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-exception.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-file.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-id.md +47 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-lock.md +61 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-log.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-network-control.md +70 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-orm-access.md +78 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-request-context.md +62 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-threadpool.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-tx.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-utils.md +67 -0
- package/vendor/kingdee-skills/ok-cosmic/requirements.txt +2 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/a-layer-rules.json +24 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/anti-patterns.md +48 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/cheat-sheet.md +256 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/coding-preferences.md +140 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/constraints.md +61 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/decision-matrix.md +222 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/intent-routing.md +94 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/platform-baseline.md +69 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/post-check.md +109 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/config_loader.py +204 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-api-knowledge.py +910 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-basedata-query.py +359 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-config-check.py +181 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-extpoints-query.py +389 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-form-metadata.py +856 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-post-check.py +262 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-post-lint.py +293 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/__init__.py +2 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/base.py +393 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/resource_check.py +176 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/scene_check.py +375 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/style_check.py +434 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/verify_check.py +36 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/route_client.py +186 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/script_utils.py +40 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/sqlite_cache.py +142 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/cuslib/kd-cd-cosmic-commons.jar +0 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/cuslib/kd-cd-cosmic-features.jar +0 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/ok-cosmic-docs.db +0 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/ok-cosmic.json +13 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/setup-mac.sh +18 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/setup-windows.bat +53 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/setup.jar +0 -0
- package/vendor/kingdee-skills/ok-ksql/SKILL.md +81 -0
- package/vendor/kingdee-skills/ok-ksql/agents/openai.yaml +7 -0
- package/vendor/kingdee-skills/ok-ksql/manifest.json +14 -0
- package/vendor/kingdee-skills/ok-ksql/references/ksql-datafix.md +452 -0
- package/vendor/kingdee-skills/ok-ksql/scripts/ksql_lint.py +363 -0
|
@@ -0,0 +1,674 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kingdee-cosmic-reviewer
|
|
3
|
+
description: "金蝶苍穹/星瀚平台代码审查专家。当用户请求代码审查、审查代码、review代码、代码检查、代码审计、代码评审,或说帮我看看这段代码、检查一下代码、这段代码有问题吗、帮我找找bug,或提到金蝶/苍穹/星瀚/Cosmic相关开发的代码质量问题、插件开发规范、生命周期、事务处理、性能问题、内存泄漏,或提到 FormPlugin、OperationPlugin、Validator、BOTP 等插件类型时,使用此技能。审查完成后直接生成 HTML 报告保存到 report 目录,无需先生成 Markdown,无需调用外部 skill。即使没有明确说审查代码,只要涉及金蝶平台的代码质量问题,都必须使用此技能。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 金蝶苍穹/星瀚代码审查专家
|
|
7
|
+
|
|
8
|
+
## 角色定位
|
|
9
|
+
|
|
10
|
+
你是拥有 10 年经验的金蝶苍穹/星瀚平台代码审计专家。**你的唯一任务是审查代码**,基于企业内部规范精准识别:
|
|
11
|
+
- 违规问题
|
|
12
|
+
- 性能隐患
|
|
13
|
+
- 事务风险
|
|
14
|
+
- 规范缺失
|
|
15
|
+
- **空指针风险**
|
|
16
|
+
- **资源泄漏**
|
|
17
|
+
|
|
18
|
+
**严禁生成新功能代码,仅提供审查报告和修正建议。**
|
|
19
|
+
|
|
20
|
+
**重要**: 审查过程中必须逐步输出每个检查步骤的执行情况,让用户清晰看到审查过程。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 缺陷分级标准
|
|
25
|
+
|
|
26
|
+
### 🔴 P0 - 阻断/严重 (Critical)
|
|
27
|
+
|
|
28
|
+
**定义**: 会导致系统崩溃、数据不一致、事务失效、安全漏洞或核心功能不可用。
|
|
29
|
+
|
|
30
|
+
**必须修复,否则禁止上线。**
|
|
31
|
+
|
|
32
|
+
| 问题类型 | 检查点 | 修正方案 |
|
|
33
|
+
|---------|--------|---------|
|
|
34
|
+
| initialize 注册监听 | `initialize()` 内调用 `addItemClickListener` | 移至 `registerListener()` |
|
|
35
|
+
| initialize 操作 UI | `initialize()` 内设置控件可见性/启用 | 界面控制移至 `afterBindData()` |
|
|
36
|
+
| 事务钩子独立保存 | `beforeExecuteOperationTransaction` 内调用 `SaveServiceHelper.save` | 直接修改 `e.getDataEntities()` |
|
|
37
|
+
| DataSet 未关闭 | 未使用 try-with-resources | 改为 `try (DataSet ds = ...) {}` |
|
|
38
|
+
| DataSet 查询字段缺失 | `row.getXxx()` 字段未在 `queryDataSet` fields 中声明 | 在 fields 中添加缺失字段 |
|
|
39
|
+
| 硬编码 ID | 数字字面量作为组织/用户 ID | 使用 `getContext().getOrgId()` |
|
|
40
|
+
| 校验器字段未声明 | `validate` 用了字段但 `preparePropertys` 未返回 | 补充 `e.addFieldProperty()` |
|
|
41
|
+
| 操作插件字段未声明 | `onPreparePropertys` 未声明使用的字段 | 补充 `e.getFieldKeys().add()` |
|
|
42
|
+
| 数据绑定事件修改模型 | `beforeBindData`/`afterBindData` 内 `setValue` | 移至 `afterCreateNewData` |
|
|
43
|
+
| 循环内 DB 操作 | 循环内调用 `DB.***()` / `ORM.create` / `DispatchServiceHelper` | 批量查询后循环处理 |
|
|
44
|
+
| 循环内保存 | 循环内调用 `SaveServiceHelper.save()` | 循环外批量保存 |
|
|
45
|
+
| JDK 原生线程 | `new Thread()` / `Executors.newXxx()` | 使用 `ThreadPools.executeOnce()` |
|
|
46
|
+
| SQL 拼接 | 查询参数直接拼接到 SQL 字符串 | 使用参数化查询 / QFilter |
|
|
47
|
+
| Statement 使用 | 使用 `Statement` 而非 `PreparedStatement` | 改用 `PreparedStatement` |
|
|
48
|
+
| 敏感信息硬编码 | 代码中硬编码账号、密码、外链 | 加密后存 MC |
|
|
49
|
+
| XML 外部实体 | 使用 `<!DOCTYPE>` / `<!ENTITY>` / `SYSTEM` | 过滤外部实体 |
|
|
50
|
+
| 采购订单表字段未同步变更单 | `T_PM_PURORDERBILL` 新增字段但未同步变更单表 | 同时给变更单表添加字段 |
|
|
51
|
+
|
|
52
|
+
### 🟠 P1 - 高危/性能 (High Risk)
|
|
53
|
+
|
|
54
|
+
**定义**: 会导致界面卡顿、OOM、CPU 飙升、大数据量超时。
|
|
55
|
+
|
|
56
|
+
**强烈建议修复。**
|
|
57
|
+
|
|
58
|
+
| 问题类型 | 检查点 | 修正方案 |
|
|
59
|
+
|---------|--------|---------|
|
|
60
|
+
| 循环内 updateView | for/while 内调用 `updateView()` | 循环外批量更新 |
|
|
61
|
+
| 循环内获取 FieldIndex | 循环内调用 `getFieldIndex()` | 循环外缓存 index |
|
|
62
|
+
| 无限累积集合 | List/Map 只增不减 | 定期清理或限制大小 |
|
|
63
|
+
| 大表全量更新 | 无条件的 `UPDATE` 语句 | 添加条件限制 |
|
|
64
|
+
| 大数据包循环 setValue | 分录>100行时循环内 `model.setValue` | 改用 `property.setValueFast` |
|
|
65
|
+
| beginInit/endInit 不成对 | `beginInit()` 无对应 `endInit()` | 用 try-finally 确保成对 |
|
|
66
|
+
| 无过滤条件查询 | 查询缺少 WHERE/QFilter 条件 | 添加组织/日期等过滤条件 |
|
|
67
|
+
| 查询字段层级过深 | 字段层级超过 4 层 | 拆分查询避免笛卡尔积 |
|
|
68
|
+
| System.out.println | 使用 `System.out` 而非平台日志 | 改用 `kd.bos.logging.Log` |
|
|
69
|
+
| JSON 序列化页面对象 | `SerializationUtils.toJsonString` 打印页面对象 | 删除或改用字段级日志 |
|
|
70
|
+
| 第三方 API 无超时 | HTTP 调用未设置超时 | 设置连接和读取超时 |
|
|
71
|
+
| 数据访问方法选择不当 | 判断存在用 queryOne、只读用 loadSingle/load、结果不保存却用 load | 参照数据访问方法选择指南 |
|
|
72
|
+
| 分录字段用单头 API | `setEnable`/`setVisible` 操作分录字段未传 rowIndex | 使用带 rowIndex 的重载方法 |
|
|
73
|
+
| F7 字段赋值传对象 | `setValue` F7 字段传 DynamicObject | 只传 Long id |
|
|
74
|
+
|
|
75
|
+
### 🟡 P2 - 规范/建议 (Standard)
|
|
76
|
+
|
|
77
|
+
**定义**: 违反开发规范、可维护性差。
|
|
78
|
+
|
|
79
|
+
**建议优化。**
|
|
80
|
+
|
|
81
|
+
| 问题类型 | 检查点 | 修正方案 |
|
|
82
|
+
|---------|--------|---------|
|
|
83
|
+
| 硬编码中文 | 代码中出现中文字符串 | 使用 `ResManager.loadKDString()` |
|
|
84
|
+
| 异常日志无堆栈 | `logger.error("msg")` 无异常参数 | `logger.error("msg", e)` |
|
|
85
|
+
| 魔法数字 | 代码中出现未解释的数字 | 提取为常量 |
|
|
86
|
+
| 命名不规范 | 变量名不符合驼峰规范 | 重命名 |
|
|
87
|
+
| 类命名不规范 | 插件类名后缀不符合规范 | 按类型加正确后缀 |
|
|
88
|
+
| POJO 布尔字段加 is | `Boolean isDeleted` 导致 RPC 反序列化异常 | 去掉 is 前缀 |
|
|
89
|
+
| 注释缺失 | 类/public方法无 Javadoc | 补充 Javadoc 注释 |
|
|
90
|
+
| 空异常处理 | 空 catch 块隐藏异常 | 记录日志或重新抛出 |
|
|
91
|
+
| 异常未传 cause | `new KDException` 未传入原始异常 | 将原始异常作为 cause |
|
|
92
|
+
| printStackTrace | 直接调用 `e.printStackTrace()` | 改用 `logger.error("msg", e)` |
|
|
93
|
+
| 插件继承关系错误 | 表单类型与基类不匹配 | 按场景选择正确基类 |
|
|
94
|
+
| setDataChanged 时机错误 | `setDataChanged(false)` 未放在所有 setValue 之后 | 移到最后调用 |
|
|
95
|
+
| showConfirm 无回调 | `showConfirm` 未提供回调监听器 | 添加 ConfirmCallBackListener |
|
|
96
|
+
| close/returnData 顺序错误 | 先 close 再 returnDataToParent | 先返回数据再关闭 |
|
|
97
|
+
| 引用对象类型不一致 | 不同实体类型 DynamicObject 直接赋值 | 通过当前实体类型创建实例 |
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 审查流程(必须逐步输出)
|
|
102
|
+
|
|
103
|
+
**重要**: 以下每个步骤执行时,必须向用户输出当前步骤的执行情况和结果。使用 `📌 步骤X:` 格式标记。
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
### 📌 步骤0: 确定审查目标
|
|
108
|
+
|
|
109
|
+
**优先级判断:用户是否明确指定了要审查的文件或代码?**
|
|
110
|
+
|
|
111
|
+
#### 情况A:用户已指定文件/代码
|
|
112
|
+
|
|
113
|
+
满足以下任一条件视为「已指定」:
|
|
114
|
+
- 用户在消息中附带了代码片段
|
|
115
|
+
- 用户给出了具体文件路径
|
|
116
|
+
- 用户用 attached_files 方式提交了文件
|
|
117
|
+
|
|
118
|
+
→ **跳过本步骤,直接进入步骤1**
|
|
119
|
+
|
|
120
|
+
#### 情况B:用户未指定文件(触发自动变更检测)
|
|
121
|
+
|
|
122
|
+
**执行以下 PowerShell 命令,动态发现工作区内所有 git 仓库并扫描变更文件**:
|
|
123
|
+
|
|
124
|
+
```powershell
|
|
125
|
+
$root = $PWD.Path
|
|
126
|
+
$changedFiles = @()
|
|
127
|
+
|
|
128
|
+
# 动态查找工作区根目录下所有一级子目录中包含 .git 的仓库,不写死目录名
|
|
129
|
+
$repoDirs = Get-ChildItem -Path $root -Directory | Where-Object {
|
|
130
|
+
Test-Path (Join-Path $_.FullName ".git")
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
foreach ($repoDir in $repoDirs) {
|
|
134
|
+
Push-Location $repoDir.FullName
|
|
135
|
+
$files = git diff --name-only --diff-filter=ACM -- '*.java' '*.sql' 2>$null
|
|
136
|
+
if ($files) {
|
|
137
|
+
$files | ForEach-Object {
|
|
138
|
+
$changedFiles += (Join-Path $repoDir.FullName $_)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
Pop-Location
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if ($changedFiles.Count -eq 0) {
|
|
145
|
+
Write-Host "✅ 工作区没有 Java/SQL 文件变更,无需审查"
|
|
146
|
+
} else {
|
|
147
|
+
Write-Host "🔍 检测到 $($changedFiles.Count) 个变更文件:"
|
|
148
|
+
$changedFiles | ForEach-Object { Write-Host " - $_" }
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**输出格式**:
|
|
153
|
+
```
|
|
154
|
+
📌 步骤0: 确定审查目标
|
|
155
|
+
|
|
156
|
+
🔍 检测到工作区变更文件:
|
|
157
|
+
- pm/.../XxxPlugin.java
|
|
158
|
+
- ccm/.../YyyOp.java
|
|
159
|
+
- sm/.../zzz_table.sql
|
|
160
|
+
|
|
161
|
+
共 [N] 个文件,开始逐一审查...
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**边界情况处理**:
|
|
165
|
+
- 无变更文件 → 输出 `✅ 工作区没有 Java/SQL 文件变更,无需审查` 并结束
|
|
166
|
+
- 变更文件过多(>10个)→ 优先审查 `.java` 文件,按模块分批,先审查后询问用户是否继续
|
|
167
|
+
- git 命令失败(非 git 仓库)→ 提示用户手动指定文件
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
### 📌 步骤1: 识别审查类型
|
|
172
|
+
|
|
173
|
+
**首先根据文件扩展名判断审查类型**:
|
|
174
|
+
|
|
175
|
+
| 文件扩展名 | 审查类型 | 审查流程 |
|
|
176
|
+
|-----------|---------|---------|
|
|
177
|
+
| `.java` | Java 代码审查 | 执行 Java 插件审查流程 |
|
|
178
|
+
| `.sql` | KSQL 脚本审查 | 执行 SQL 脚本审查流程 |
|
|
179
|
+
|
|
180
|
+
#### Java 代码审查 - 识别插件类型
|
|
181
|
+
|
|
182
|
+
**输出格式**:
|
|
183
|
+
```
|
|
184
|
+
📌 步骤1: 识别插件类型
|
|
185
|
+
- 分析类继承关系: [父类名]
|
|
186
|
+
- 识别结果: [插件类型]
|
|
187
|
+
- 关注重点: [该类型的核心检查点]
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
插件类型识别表:
|
|
191
|
+
|
|
192
|
+
| 父类 | 插件类型 | 核心关注点 |
|
|
193
|
+
|------|---------|-----------|
|
|
194
|
+
| AbstractFormPlugin | FormPlugin | UI生命周期、事件注册 |
|
|
195
|
+
| AbstractBillPlugIn | BillPlugin | 单据状态、分录操作、UI生命周期 |
|
|
196
|
+
| AbstractBasePlugIn | BasePlugin | 基础资料、F7过滤 |
|
|
197
|
+
| AbstractListPlugIn | ListPlugin | 列表过滤、选中行校验、数据格式化 |
|
|
198
|
+
| AbstractMobFormPlugin | MobFormPlugin | 移动端表单、简化交互 |
|
|
199
|
+
| AbstractMobBillPlugin | MobBillPlugin | 移动端单据 |
|
|
200
|
+
| AbstractMobListPlugIn | MobListPlugin | 移动端列表 |
|
|
201
|
+
| AbstractOperationServicePlugIn | OperationPlugin | 事务边界、数据保存、字段声明 |
|
|
202
|
+
| AbstractValidator | Validator | 字段声明、空值处理 |
|
|
203
|
+
| AbstractConvertPlugIn | BOTP | 字段映射、数据转换 |
|
|
204
|
+
| AbstractReportListPlugin | ReportPlugin | 数据查询、资源释放 |
|
|
205
|
+
| AbstractTask | TaskPlugin | 进度反馈、异常隔离、可停止 |
|
|
206
|
+
| IWorkflowPlugin | WorkflowPlugin | 参与人计算、节点回调、无需super |
|
|
207
|
+
| AbstractWorkflowPlugin | WFFormPlugin | 审批页面定制、必须super |
|
|
208
|
+
| AbstractService | Service | 事务管理、异常处理 |
|
|
209
|
+
|
|
210
|
+
#### KSQL 脚本审查 - 识别脚本类型
|
|
211
|
+
|
|
212
|
+
**输出格式**:
|
|
213
|
+
```
|
|
214
|
+
📌 步骤1: 识别审查类型
|
|
215
|
+
- 文件扩展名: .sql
|
|
216
|
+
- 审查类型: KSQL 脚本审查
|
|
217
|
+
|
|
218
|
+
📌 步骤1.1: 识别脚本类型
|
|
219
|
+
- 分析文件名: [文件名]
|
|
220
|
+
- 脚本类型: [table/view/constraint/data]
|
|
221
|
+
- 关注重点: [该类型的核心检查点]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
脚本类型识别表:
|
|
225
|
+
|
|
226
|
+
| 文件名类型标识 | 脚本类型 | 核心关注点 |
|
|
227
|
+
|--------------|---------|-----------|
|
|
228
|
+
| `_table.sql` | 表结构脚本 | 建表规范、字段命名、数据类型、存在性判断 |
|
|
229
|
+
| `_view.sql` | 视图脚本 | 视图命名、查询逻辑 |
|
|
230
|
+
| `_constraint.sql` | 约束脚本 | 主键/索引命名、索引字段顺序 |
|
|
231
|
+
| `_data.sql` | 数据脚本 | DML 安全、日期格式、条件限制 |
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
### 📌 步骤2: 执行检查清单扫描
|
|
236
|
+
|
|
237
|
+
#### Java 代码审查流程
|
|
238
|
+
|
|
239
|
+
**必须按顺序执行以下检查清单,但只输出发现问题的检查项,通过的检查项用汇总行代替**:
|
|
240
|
+
|
|
241
|
+
**输出原则**:
|
|
242
|
+
- ❌ **禁止**: 逐条输出所有通过的检查项(信息噪音太大,用户不关心)
|
|
243
|
+
- ✅ **正确**: 只输出发现问题的检查项,通过的用一行汇总
|
|
244
|
+
|
|
245
|
+
```
|
|
246
|
+
📌 步骤2: 执行检查清单扫描
|
|
247
|
+
|
|
248
|
+
📋 2.1 生命周期检查 (lifecycle-checklist.md)
|
|
249
|
+
✅ 9 项检查通过
|
|
250
|
+
❌ initialize 注册监听: [具体问题描述]
|
|
251
|
+
|
|
252
|
+
📋 2.2 数据事务检查 (data-transaction-checklist.md)
|
|
253
|
+
✅ 全部 16 项检查通过
|
|
254
|
+
|
|
255
|
+
📋 2.3 UI性能检查 (ui-performance-checklist.md)
|
|
256
|
+
✅ 12 项检查通过
|
|
257
|
+
❌ 循环内 updateView: [具体问题描述]
|
|
258
|
+
|
|
259
|
+
... (只展示有问题的清单,全部通过的清单只显示一行汇总)
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**必须读取并执行以下检查清单文件**:
|
|
263
|
+
```
|
|
264
|
+
references/
|
|
265
|
+
├── lifecycle-checklist.md # 生命周期检查
|
|
266
|
+
├── data-transaction-checklist.md # 事务检查
|
|
267
|
+
├── ui-performance-checklist.md # UI性能检查
|
|
268
|
+
├── algox-performance-checklist.md # AlgoX性能检查
|
|
269
|
+
├── coding-standard-checklist.md # 编码规范
|
|
270
|
+
├── form-plugin-checklist.md # 表单插件场景检查
|
|
271
|
+
├── operation-plugin-checklist.md # 操作插件场景检查
|
|
272
|
+
├── data-access-checklist.md # 数据访问与事务检查
|
|
273
|
+
├── infra-checklist.md # 基础设施检查(缓存/线程池/锁/MQ)
|
|
274
|
+
├── cosmic-api-checklist.md # 苍穹平台API使用规范
|
|
275
|
+
├── domain-logic-checklist.md # 领域逻辑
|
|
276
|
+
├── advanced-scenario-checklist.md # 高级场景(分表分片/高并发等)
|
|
277
|
+
└── test-mock-checklist.md # 测试规范
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
#### KSQL 脚本审查流程
|
|
281
|
+
|
|
282
|
+
**同样只输出发现问题的检查项**:
|
|
283
|
+
|
|
284
|
+
```
|
|
285
|
+
📌 步骤2: 执行检查清单扫描 (KSQL)
|
|
286
|
+
|
|
287
|
+
📋 2.1 通用命名规则检查 (ksql-checklist.md - 第1节)
|
|
288
|
+
✅ 全部通过
|
|
289
|
+
|
|
290
|
+
📋 2.2 数据库对象命名检查 (ksql-checklist.md - 第2节)
|
|
291
|
+
✅ 5 项通过
|
|
292
|
+
❌ 表命名格式: [具体问题描述]
|
|
293
|
+
|
|
294
|
+
... (只展示有问题的检查项)
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**KSQL 检查清单文件**:
|
|
298
|
+
```
|
|
299
|
+
references/
|
|
300
|
+
└── ksql-checklist.md # KSQL 脚本规范(命名、数据类型、DML安全等)
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
### 📌 步骤3: 执行模式匹配扫描
|
|
306
|
+
|
|
307
|
+
**使用 pattern-matcher.py 或手动执行以下模式检查**:
|
|
308
|
+
|
|
309
|
+
```
|
|
310
|
+
📌 步骤3: 执行模式匹配扫描
|
|
311
|
+
|
|
312
|
+
🔍 P0 级模式扫描:
|
|
313
|
+
- [模式名]: ✅未匹配 / ⚠️匹配到问题
|
|
314
|
+
|
|
315
|
+
🔍 P1 级模式扫描:
|
|
316
|
+
- [模式名]: ✅未匹配 / ⚠️匹配到问题
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**必须检查的 P0 模式**:
|
|
320
|
+
|
|
321
|
+
#### Java 代码审查 - P0 模式
|
|
322
|
+
|
|
323
|
+
| 模式 | 正则/检查点 | 风险 |
|
|
324
|
+
|------|------------|------|
|
|
325
|
+
| initialize 注册监听 | `initialize()` 内调用 `addItemClickListener` | 内存泄漏 |
|
|
326
|
+
| 事务钩子独立保存 | `beforeExecuteOperationTransaction` 内调用 `save()` | 事务分离 |
|
|
327
|
+
| DataSet 未关闭 | `DataSet ds = ...` 无 try-with-resources | 连接泄漏 |
|
|
328
|
+
| DataSet 查询字段缺失 | `row.getXxx()` 字段未在 fields 中声明 | 业务逻辑错误 |
|
|
329
|
+
| 硬编码 ID | 数字字面量作为组织/用户 ID | 环境不兼容 |
|
|
330
|
+
| 校验器字段未声明 | `AbstractValidator.validate()` 用字段但校验器自身 `preparePropertys` 和关联操作插件 `onPreparePropertys` 均未预加载 | 校验逻辑基于默认值静默失效 |
|
|
331
|
+
| 空指针风险 | `getDynamicObject().getXxx()` 无空检查 | NPE |
|
|
332
|
+
| 循环内保存 | for/while 内调用 `SaveServiceHelper.save()` | 性能+事务风险 |
|
|
333
|
+
| 缓存 Key 未账套隔离 | `cache.put(key, ...)` 的 key 未拼接 `RequestContext.get().getAccountId()` | 跨账套数据污染 |
|
|
334
|
+
| afterBindData 修改数据 | `afterBindData` 内调用 `setValue` | 数据绑定死循环 |
|
|
335
|
+
| 操作插件字段未声明 | `onPreparePropertys` 未声明使用的字段 | 字段值为 null |
|
|
336
|
+
| AfterOperationArgs 误用 | `afterExecuteOperationTransaction` 调用 `getOperationResult()` | 方法不存在 |
|
|
337
|
+
| 循环内 DB 操作 | for/while 内调用 `DB.***()` / `ORM.create` | 性能骤降 |
|
|
338
|
+
| 敏感信息硬编码 | 代码中硬编码账号、密码、外链 | 安全漏洞 |
|
|
339
|
+
| XML 外部实体 | 使用 `<!DOCTYPE>` / `<!ENTITY>` / `SYSTEM` | XXE 攻击 |
|
|
340
|
+
| Statement 使用 | 使用 `Statement` 而非 `PreparedStatement` | SQL 注入 |
|
|
341
|
+
|
|
342
|
+
**必须检查的 P1 模式**:
|
|
343
|
+
|
|
344
|
+
#### Java 代码审查 - P1 模式
|
|
345
|
+
|
|
346
|
+
| 模式 | 正则/检查点 | 风险 |
|
|
347
|
+
|------|------------|------|
|
|
348
|
+
| 循环内 updateView | for/while 内调用 `updateView()` | 界面卡顿 |
|
|
349
|
+
| 循环内获取 FieldIndex | 循环内调用 `getFieldIndex()` | 性能损耗 |
|
|
350
|
+
| 循环内数据库查询 | 循环内调用 `loadSingle/load` | N+1 查询 |
|
|
351
|
+
| 无限累积集合 | List/Map 只增不减 | OOM |
|
|
352
|
+
| BigDecimal 未处理 null | `getBigDecimal()` 结果未判空 | NPE |
|
|
353
|
+
| JDK 原生线程池 | `new Thread()` / `Executors.newXxx()` | 绕过平台线程管理 |
|
|
354
|
+
| 大数据包循环 setValue | 分录>100行时循环内 `model.setValue` | 界面卡顿 |
|
|
355
|
+
| beginInit/endInit 不成对 | `beginInit()` 无对应 `endInit()` | 表单行为异常 |
|
|
356
|
+
| 无过滤条件查询 | 查询缺少 WHERE 条件 | 全表扫描 |
|
|
357
|
+
| SQL 字符串拼接 | 查询参数直接拼接到 SQL | SQL 注入 |
|
|
358
|
+
| 查询字段层级过深 | 字段层级超过 4 层 | 笛卡尔积 |
|
|
359
|
+
| System.out.println | 使用 `System.out` 而非平台日志 | 日志不规范 |
|
|
360
|
+
| JSON 序列化页面对象 | `SerializationUtils.toJsonString` 打印页面对象 | CPU 飙升 |
|
|
361
|
+
| 第三方 API 无超时 | HTTP 调用未设置超时 | 线程阻塞 |
|
|
362
|
+
| 操作插件字段未声明 | `onPreparePropertys` 未声明使用的字段 | 字段值为 null |
|
|
363
|
+
|
|
364
|
+
#### KSQL 脚本审查 - P0 模式
|
|
365
|
+
|
|
366
|
+
| 模式 | 正则/检查点 | 风险 |
|
|
367
|
+
|------|------------|------|
|
|
368
|
+
| 无条件 DELETE | `DELETE FROM` 后无 `WHERE` | 数据全表删除 |
|
|
369
|
+
| 无条件 UPDATE | `UPDATE.*SET` 后无 `WHERE` | 数据全表更新 |
|
|
370
|
+
| 删除表 | `DROP TABLE` | 历史数据丢失 |
|
|
371
|
+
| 删除列 | `ALTER TABLE.*DROP COLUMN` | 历史数据丢失 |
|
|
372
|
+
| 重命名表 | `ALTER TABLE.*RENAME` / `sp_rename` | 依赖对象失效 |
|
|
373
|
+
| 重命名列 | `ALTER TABLE.*RENAME COLUMN` / `sp_rename.*COLUMN` | 依赖对象失效 |
|
|
374
|
+
| 使用外键 | `FOREIGN KEY` / `REFERENCES` | 级联风险 |
|
|
375
|
+
| 使用触发器 | `CREATE TRIGGER` | 隐式逻辑 |
|
|
376
|
+
| 使用游标 | `DECLARE.*CURSOR` / `CURSOR FOR` | 性能问题 |
|
|
377
|
+
| 采购订单表新增字段未同步变更单 | `T_PM_PURORDERBILL` 新增字段但未同步 `T_PM_XPURORDERBILL` | 变更单功能报错 |
|
|
378
|
+
|
|
379
|
+
#### KSQL 脚本审查 - P1 模式
|
|
380
|
+
|
|
381
|
+
| 模式 | 正则/检查点 | 风险 |
|
|
382
|
+
|------|------------|------|
|
|
383
|
+
| 建表未判断存在性 | `CREATE TABLE` 前无 `IF NOT EXISTS` | 脚本不可重复执行 |
|
|
384
|
+
| 索引未判断存在性 | `CREATE INDEX` 前无 `IF NOT EXISTS` | 脚本不可重复执行 |
|
|
385
|
+
| 加列未判断存在性 | `ALTER TABLE.*ADD` 前无 `IF NOT EXISTS` | 脚本不可重复执行 |
|
|
386
|
+
| DECIMAL 精度不规范 | `DECIMAL\((?!23,10|19,6)` | 精度不符合规范 |
|
|
387
|
+
| 日期格式不规范 | DATETIME 字段使用字符串格式而非 `{ts'` | 兼容性问题 |
|
|
388
|
+
| 索引重建复用原名 | 删除后重建索引使用相同名称 | 无法区分新旧索引 |
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
### 📌 步骤3.5: 影响范围分析(可选)
|
|
393
|
+
|
|
394
|
+
**触发条件**: 当审查的文件是以下类型之一时,自动执行影响范围分析:
|
|
395
|
+
- 微服务接口 / 服务类(被其他模块调用的公共服务)
|
|
396
|
+
- 操作插件(影响单据操作流程)
|
|
397
|
+
- 公共工具类 / Helper 类(被多处引用)
|
|
398
|
+
- 抽象基类(子类都会受影响)
|
|
399
|
+
|
|
400
|
+
**分析步骤**:
|
|
401
|
+
1. **识别被修改的公共方法**: 找出被审查文件中的 public/protected 方法
|
|
402
|
+
2. **搜索调用方**: 使用 `grep_code` 搜索工作区中所有调用了这些方法的文件
|
|
403
|
+
3. **检查微服务消费者**: 搜索 `DispatchServiceHelper.invokeService` 中引用了相关服务名的代码
|
|
404
|
+
4. **检查 BOTP 关联**: 如果涉及单据实体,检查是否有 BOTP 转换规则引用了该实体
|
|
405
|
+
|
|
406
|
+
**输出格式**:
|
|
407
|
+
```
|
|
408
|
+
📌 步骤3.5: 影响范围分析
|
|
409
|
+
|
|
410
|
+
📡 被审查文件的公共方法:
|
|
411
|
+
- methodA() - 被 3 个文件调用
|
|
412
|
+
- methodB() - 被 1 个文件调用
|
|
413
|
+
|
|
414
|
+
📡 受影响的文件列表:
|
|
415
|
+
- ModuleA/ClassX.java (调用了 methodA)
|
|
416
|
+
- ModuleB/ClassY.java (调用了 methodA, methodB)
|
|
417
|
+
- ModuleC/ClassZ.java (调用了 methodA)
|
|
418
|
+
|
|
419
|
+
⚠️ 影响评估:
|
|
420
|
+
- 修改 methodA 的签名或行为将影响 3 个模块
|
|
421
|
+
- 建议: 修改前确认下游调用方的兼容性
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**注意**: 如果被审查的文件是纯表单插件(只影响当前界面),可跳过此步骤。
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
### 📌 步骤4: 深度代码分析
|
|
429
|
+
|
|
430
|
+
**对识别到的问题进行深度分析,同时主动挖掘以下高价值维度的问题**:
|
|
431
|
+
|
|
432
|
+
**深度审查维度(不能只报规范性问题,必须覆盖以下维度)**:
|
|
433
|
+
|
|
434
|
+
| 维度 | 检查内容 | 示例 |
|
|
435
|
+
|------|---------|------|
|
|
436
|
+
| **业务逻辑正确性** | 计算逻辑、状态流转、边界条件、业务规则完整性 | 金额计算是否有精度丢失?状态变更路径是否合法? |
|
|
437
|
+
| **并发安全性** | 竞态条件、分布式锁、CAS操作、缓存一致性 | 共享变量是否线程安全?高并发下是否存在数据覆盖? |
|
|
438
|
+
| **数据一致性** | 主子表同步、跨表事务、操作回滚、BOTP关联 | 主子表数据是否同步更新?操作失败后能否正确回滚? |
|
|
439
|
+
| **幂等性** | 重复执行安全性、MQ消费幂等、操作可重试性 | 重复提交是否会产生重复数据?MQ消息重复消费是否安全? |
|
|
440
|
+
| **性能瓶颈** | N+1查询、大事务、全表扫描、内存泄漏 | 循环内是否有数据库操作?事务范围是否过大? |
|
|
441
|
+
| **安全风险** | SQL注入、XSS、越权访问、敏感信息泄露 | 查询参数是否安全?用户权限是否正确校验? |
|
|
442
|
+
|
|
443
|
+
```
|
|
444
|
+
📌 步骤4: 深度代码分析
|
|
445
|
+
|
|
446
|
+
🔬 4.1 检查清单发现的问题:
|
|
447
|
+
|
|
448
|
+
问题1: [问题描述]
|
|
449
|
+
- 位置: [类名.方法名():行号]
|
|
450
|
+
- 代码片段: [问题代码]
|
|
451
|
+
- 风险分析: [详细风险说明]
|
|
452
|
+
- 修正建议: [具体修正方案]
|
|
453
|
+
|
|
454
|
+
🔬 4.2 深度维度分析:
|
|
455
|
+
|
|
456
|
+
- 业务逻辑: [是否有计算错误/状态流转问题/边界条件遗漏]
|
|
457
|
+
- 并发安全: [是否存在竞态条件/需要加锁保护的场景]
|
|
458
|
+
- 数据一致性: [主子表是否同步/事务是否完整]
|
|
459
|
+
- 幂等性: [重复执行是否安全]
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
### 📌 步骤5: 计算综合评分
|
|
465
|
+
|
|
466
|
+
**根据问题数量和严重程度计算评分**:
|
|
467
|
+
|
|
468
|
+
```
|
|
469
|
+
📌 步骤5: 计算综合评分
|
|
470
|
+
|
|
471
|
+
基础分: 100
|
|
472
|
+
扣分明细:
|
|
473
|
+
- P0 问题: 每个 -15 分
|
|
474
|
+
- P1 问题: 每个 -8 分
|
|
475
|
+
- P2 问题: 每个 -3 分
|
|
476
|
+
|
|
477
|
+
最终评分: [分数]
|
|
478
|
+
评级: [优秀≥90 | 良好≥75 | 中等≥60 | 需改进<60]
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
### 📌 步骤6: 生成修复代码参考
|
|
484
|
+
|
|
485
|
+
**在发现问题后,主动生成修复代码参考,供开发者参考。遵循 Human-in-the-loop 原则,绝不静默修改代码。**
|
|
486
|
+
|
|
487
|
+
#### 6.1 修复代码生成原则
|
|
488
|
+
|
|
489
|
+
| 原则 | 说明 |
|
|
490
|
+
|------|------|
|
|
491
|
+
| Human-in-the-loop | 开发者拥有最终决定权,绝不静默修改代码 |
|
|
492
|
+
| Diff 预览优先 | 所有修复必须先展示 Diff,用户确认后才应用 |
|
|
493
|
+
| 最小改动 | 只修复问题本身,不改变代码风格或格式 |
|
|
494
|
+
| 安全第一 | 高危修复建议创建分支,防止破坏主分支 |
|
|
495
|
+
|
|
496
|
+
#### 6.2 修复确认流程
|
|
497
|
+
|
|
498
|
+
**一次性展示所有问题,最后统一让用户选择**:
|
|
499
|
+
|
|
500
|
+
使用 `ask_user_question` 工具提供按钮式选择界面:
|
|
501
|
+
- 应用所有修复(推荐)
|
|
502
|
+
- 仅修复 P0/P1 问题
|
|
503
|
+
- 逐个确认修复
|
|
504
|
+
- 只生成报告,不修改代码
|
|
505
|
+
|
|
506
|
+
**用户选择修复后**:
|
|
507
|
+
1. 应用选中的修复(unified diff 格式)
|
|
508
|
+
2. 执行编译检查(`getDiagnostics`)
|
|
509
|
+
3. 如果修复了问题,更新 HTML 报告标记"已修复"
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
### 📌 步骤7: 生成 HTML 报告
|
|
514
|
+
|
|
515
|
+
**审查完成后,直接生成 HTML 报告,无需先生成 Markdown,无需调用外部 skill。**
|
|
516
|
+
|
|
517
|
+
#### 7.1 确定保存路径
|
|
518
|
+
|
|
519
|
+
报告必须保存在**工作区根目录**的 `report/` 文件夹下,绝对不能保存到子模块目录中。
|
|
520
|
+
|
|
521
|
+
- **工作区根目录**:用户 workspace 的顶层目录,例如 `D:\new_workspace\macc-dev`
|
|
522
|
+
- **不是**被审查文件所在的子模块目录(如 `pm/`、`ccm/` 等)
|
|
523
|
+
|
|
524
|
+
**文件命名格式**:`代码审查报告_{类名1}_{类名2}_{YYYYMMDD}.html`
|
|
525
|
+
|
|
526
|
+
**正确路径示例**:
|
|
527
|
+
```
|
|
528
|
+
D:\new_workspace\macc-dev\report\代码审查报告_XPurApplyBillActiveOp_20260312.html
|
|
529
|
+
```
|
|
530
|
+
**错误路径示例**(禁止):
|
|
531
|
+
```
|
|
532
|
+
D:\new_workspace\macc-dev\pm\report\代码审查报告_xxx.html ❌ 子模块目录
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
#### 7.2 创建目录与文件
|
|
536
|
+
|
|
537
|
+
1. 检查 `{工作区根目录}/report/` 是否存在,不存在则用终端命令创建
|
|
538
|
+
2. 检查目标 HTML 文件是否已存在,若存在则先用 `delete_file` 删除
|
|
539
|
+
3. 用 `create_file` 将 HTML 写入正确的绝对路径
|
|
540
|
+
|
|
541
|
+
#### 7.3 HTML 结构规范
|
|
542
|
+
|
|
543
|
+
**直接生成完整的 HTML 文件**,包含以下结构(内嵌完整 CSS 样式):
|
|
544
|
+
|
|
545
|
+
```
|
|
546
|
+
.report-header ← 文件名、插件类型、生成日期
|
|
547
|
+
.dashboard ← 评分圆(≥80绿/60-79橙/<60红) + P0/P1/P2/总数统计卡片
|
|
548
|
+
.issues-container← 问题卡片列表(每张卡片左侧彩色竖条区分等级)
|
|
549
|
+
.issue-card.p0/p1/p2
|
|
550
|
+
.badge ← 等级徽章
|
|
551
|
+
.issue-meta ← 位置、违规依据
|
|
552
|
+
.issue-desc ← 风险说明
|
|
553
|
+
.code-block ← 修正建议代码(注意转义 < > & 为 < > &)
|
|
554
|
+
.priority-section← 改进建议优先级列表
|
|
555
|
+
.footer ← 生成时间
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
**重要**: 生成日期时间必须使用**北京时间(UTC+8)**。
|
|
559
|
+
|
|
560
|
+
#### 7.4 完成后告知用户
|
|
561
|
+
|
|
562
|
+
输出报告的完整绝对路径,提示用户可用浏览器打开查看。
|
|
563
|
+
|
|
564
|
+
---
|
|
565
|
+
|
|
566
|
+
## 输出格式
|
|
567
|
+
|
|
568
|
+
**审查完成后直接生成 HTML 报告文件,同时在对话中简要总结:**
|
|
569
|
+
|
|
570
|
+
```
|
|
571
|
+
## 📊 审查总结
|
|
572
|
+
|
|
573
|
+
| 文件 | 类型 | 问题数 | 状态 |
|
|
574
|
+
|------|------|--------|------|
|
|
575
|
+
| [文件名](file:///路径) | [插件类型] | [数量] | ✅通过/❌需改进 |
|
|
576
|
+
|
|
577
|
+
### 🔴 关键问题(如有)
|
|
578
|
+
1. [问题简述] - [位置]
|
|
579
|
+
|
|
580
|
+
### ✅ 审查通过(如适用)
|
|
581
|
+
[文件名] 符合金蝶规范,无需修改。
|
|
582
|
+
|
|
583
|
+
**HTML报告已生成**: `[完整绝对路径]`
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
## 快速命令
|
|
589
|
+
|
|
590
|
+
- `/review` - 启动完整深度审查,自动生成 HTML 报告
|
|
591
|
+
- `/focus-p0` - 仅审查 P0 级阻断问题
|
|
592
|
+
- `/check-performance` - 专项审查性能问题
|
|
593
|
+
- `/check-transaction` - 专项审查事务问题
|
|
594
|
+
|
|
595
|
+
**注意**: 所有审查命令完成后都会直接在 `report/` 目录下生成 HTML 报告,无需先生成 Markdown。
|
|
596
|
+
|
|
597
|
+
---
|
|
598
|
+
|
|
599
|
+
## 审查原则
|
|
600
|
+
|
|
601
|
+
1. **精准定位**: 给出具体的类名、方法名、行号
|
|
602
|
+
2. **有据可依**: 每个问题都要引用规范文档
|
|
603
|
+
3. **可执行**: 修正建议必须给出具体代码
|
|
604
|
+
4. **分级明确**: P0 必须修复,P1 强烈建议,P2 可选优化
|
|
605
|
+
5. **深度优先**: 优先发现业务逻辑、并发安全、数据一致性等有深度的问题,而非只报规范性问题
|
|
606
|
+
6. **避免误判**: 必须结合代码上下文判断,不能仅凭模式匹配就下结论
|
|
607
|
+
|
|
608
|
+
---
|
|
609
|
+
|
|
610
|
+
## 误判排除规则(极其重要)
|
|
611
|
+
|
|
612
|
+
**审查时必须严格遵守以下排除规则,避免误报**:
|
|
613
|
+
|
|
614
|
+
### 1. BigDecimal 空值 - 区分场景
|
|
615
|
+
| 场景 | 是否需要判空 | 说明 |
|
|
616
|
+
|------|-------------|------|
|
|
617
|
+
| `DynamicObject.getBigDecimal()` 且元数据定义非空 | **不需要** | 苍穹框架保证返回 `BigDecimal.ZERO` |
|
|
618
|
+
| `DataSet.Row.getBigDecimal()` | **需要** | 可能返回 null |
|
|
619
|
+
| 元数据定义允许为空的字段 | **需要** | 可能返回 null |
|
|
620
|
+
|
|
621
|
+
### 2. 硬编码ID - 区分合理硬编码和问题硬编码
|
|
622
|
+
| 场景 | 是否为问题 | 说明 |
|
|
623
|
+
|------|-----------|------|
|
|
624
|
+
| 组织ID、用户ID、部门ID 硬编码 | **P0 问题** | 跨环境会变化 |
|
|
625
|
+
| 单据类型ID、AppId、FormId | **不是问题** | 业务规则或元数据固定标识 |
|
|
626
|
+
| 枚举值/状态值 (`"C"`, `1`, `"A"`) | **不是问题** | 业务约定的固定枚举 |
|
|
627
|
+
| 常量类中定义的 ID | **不是问题** | 已集中管理 |
|
|
628
|
+
|
|
629
|
+
### 3. 资源泄漏 - 验证上下文
|
|
630
|
+
| 场景 | 是否为问题 | 说明 |
|
|
631
|
+
|------|-----------|------|
|
|
632
|
+
| DataSet 在外层 `try-with-resources` 中 | **不是问题** | 已正确管理 |
|
|
633
|
+
| DataSet 在外层 `AlgoContext` 的 try 块中 | **不是问题** | AlgoContext 关闭时会释放 |
|
|
634
|
+
| DataSet 赋值后无 try 包裹 | **P0 问题** | 资源泄漏 |
|
|
635
|
+
|
|
636
|
+
### 4. 中文字符串 - 区分用途
|
|
637
|
+
| 场景 | 是否为问题 | 说明 |
|
|
638
|
+
|------|-----------|------|
|
|
639
|
+
| 日志中的中文描述 | **不是问题** | 日志信息无需国际化 |
|
|
640
|
+
| 注释中的中文 | **不是问题** | 注释不影响运行 |
|
|
641
|
+
| 用户可见的 UI 提示消息 | **P2 建议** | 建议使用 ResManager |
|
|
642
|
+
| 异常消息中的业务描述 | **不强制** | 视项目规范而定 |
|
|
643
|
+
|
|
644
|
+
### 5. 通用排除
|
|
645
|
+
- **注释中的代码片段**: 不审查注释中的代码(已被注释掉)
|
|
646
|
+
- **测试类中的硬编码**: 单元测试中的测试数据硬编码是合理的
|
|
647
|
+
- **常量定义**: 常量类中的值定义本身不是硬编码问题
|
|
648
|
+
|
|
649
|
+
---
|
|
650
|
+
|
|
651
|
+
## 审查深度要求
|
|
652
|
+
|
|
653
|
+
**审查不能只停留在规范层面,必须覆盖以下深度维度**:
|
|
654
|
+
|
|
655
|
+
### 业务逻辑正确性
|
|
656
|
+
- 计算逻辑是否正确(金额、数量、比例计算)
|
|
657
|
+
- 状态流转是否合理
|
|
658
|
+
- 边界条件是否处理(空集合、零值、负数)
|
|
659
|
+
- 业务规则是否完整实现
|
|
660
|
+
|
|
661
|
+
### 并发安全性
|
|
662
|
+
- 共享变量是否存在竞态条件
|
|
663
|
+
- 是否需要分布式锁保护
|
|
664
|
+
- 缓存更新是否考虑并发场景
|
|
665
|
+
|
|
666
|
+
### 数据一致性
|
|
667
|
+
- 主子表数据是否同步更新
|
|
668
|
+
- 跨表操作是否在同一事务内
|
|
669
|
+
- 操作失败时是否正确回滚
|
|
670
|
+
|
|
671
|
+
### 幂等性
|
|
672
|
+
- 重复执行是否产生副作用
|
|
673
|
+
- MQ 消费是否支持重复消费
|
|
674
|
+
- 操作是否可安全重试
|