@shundoo-ai/dsh-cosmic 1.0.21 → 1.0.22
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/package.json +1 -1
- package/skills/cosmic-build/LOCAL-PATCHES.md +43 -14
- package/skills/cosmic-build/SKILL.md +24 -9
- package/skills/cosmic-build/examples/java-rules/CosmicReportAggregation.java +26 -17
- package/skills/cosmic-build/examples/java-rules/CosmicReportFilters.java +96 -2
- package/skills/cosmic-build/knowledge/cosmic/arch/security/security_standard.md +4 -4
- package/skills/cosmic-build/knowledge/cosmic/platform/allimport.md +2 -1
- package/skills/cosmic-build/knowledge/cosmic/platform/core/dynamic-object-collection.md +6 -4
- package/skills/cosmic-build/knowledge/cosmic/platform/core/model.md +9 -9
- package/skills/cosmic-build/knowledge/cosmic/platform/core/view.md +5 -5
- package/skills/cosmic-build/knowledge/cosmic/platform/form-plugin.md +8 -4
- package/skills/cosmic-build/knowledge/cosmic/platform/list-plugin.md +5 -3
- package/skills/cosmic-build/knowledge/cosmic/platform/print-plugin-guide.md +1 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/report-plugin.md +269 -57
- package/skills/cosmic-build/knowledge/cosmic/platform/reportlistdata-plugin.md +130 -23
- package/skills/cosmic-build/knowledge/cosmic/platform/reporttreedata-plugin.md +48 -28
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/_index.md +12 -3
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/common/attachment-name-process.md +17 -13
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/common/dynamic-update-field.md +4 -4
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/filter-grid/filter-grid-set-value.md +1 -1
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-basedatafield.md +2 -3
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-container-init.md +0 -1
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-popup.md +0 -1
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-value-parse.md +5 -6
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/list-show-form.md +1 -1
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/query-field-dynamic.md +0 -7
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/business-data/delete-service.md +24 -29
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/ksql/db-batch.md +4 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/ksql/db-direct-access.md +4 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/qfilter/entity-object-access.md +8 -3
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/qfilter/qfilter-compose.md +6 -5
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/after-bind-data-set-visible.md +5 -1
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/click-return-data.md +2 -2
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/closed-call-back-set-value.md +2 -2
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/register-listener.md +1 -1
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/set-filter-tab-org.md +3 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/dispatch-service/microservice-dev.md +18 -11
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/dist-lock/dist-lock-basic.md +3 -6
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/mq/mq-subscribe.md +5 -1
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/thread-pool/async-operation.md +10 -6
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/thread-pool/big-task-async.md +4 -2
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/thread-pool/schedule-task.md +9 -7
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/operation-interactive.md +33 -34
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/operation-plugin-events.md +30 -22
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-async-query.md +133 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-batch-query.md +26 -22
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-chart.md +112 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-dataset-assembly.md +200 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-head-filter.md +177 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-hyperlink-drill.md +216 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-list-data-query.md +12 -12
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-merge-column.md +44 -6
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-print-data.md +163 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-row-data-toolbar.md +188 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-subtotal-total.md +139 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-tree-data-query.md +108 -12
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-tree-list.md +181 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/system-service/report-plugin-interface.md +3 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-basedata-cascade-confirm.md +14 -11
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-before-item-validate.md +1 -1
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-build-filter.md +1 -1
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-multi-level-filter.md +11 -11
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-refresh-node.md +22 -15
- package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-algo.md +2 -2
- package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-entity-model.md +3 -4
- package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-exception.md +9 -5
- package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-orm-access.md +4 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-request-context.md +7 -3
- package/skills/cosmic-build/knowledge/cosmic/platform/standards.md +28 -3
- package/skills/cosmic-build/references/compile-guide.md +36 -1
- package/skills/cosmic-build/references/dcs-code-rules.md +180 -0
- package/skills/cosmic-build/references/delivery.md +16 -2
- package/skills/cosmic-build/references/execution-contract.md +15 -3
- package/skills/cosmic-build/references/java-plugin-delivery.md +21 -11
- package/skills/cosmic-build/references/plugin-handoff-input.md +82 -24
- package/skills/cosmic-build/references/plugin-runtime-routing.md +23 -6
- package/skills/cosmic-build/references/report-filter-contract.md +53 -15
- package/skills/cosmic-build/references/sdk-inspection.md +4 -1
- package/skills/cosmic-build/references/type-registry.json +26 -17
- package/skills/cosmic-build/schemas/data-model-authoring.schema.json +1 -1
- package/skills/cosmic-build/scripts/_http_client.py +3 -0
- package/skills/cosmic-build/scripts/compile_plugin_source.py +251 -42
- package/skills/cosmic-build/scripts/configure_list.py +112 -0
- package/skills/cosmic-build/scripts/dcs-rule-catalog.json +799 -0
- package/skills/cosmic-build/scripts/dcs_code_gate.py +1976 -0
- package/skills/cosmic-build/scripts/execution_binding.py +25 -0
- package/skills/cosmic-build/scripts/platform_api_contract.py +352 -7
- package/skills/cosmic-build/scripts/plugin_source_gate.py +9 -1
- package/skills/cosmic-build/scripts/plugin_target_sdk.py +12 -8
- package/skills/cosmic-build/scripts/prepare_plugin_handoff.py +488 -88
- package/skills/cosmic-build/scripts/query_plugin_handoff.py +207 -20
- package/skills/cosmic-build/scripts/register_plugins.py +27 -10
- package/skills/cosmic-build/scripts/render_output_cards.py +57 -20
- package/skills/cosmic-build/scripts/resolve_output_path.py +60 -26
- package/skills/cosmic-build/scripts/run_java_tests.py +162 -0
- package/skills/cosmic-build/scripts/sync_generated_locale_assets.py +28 -0
- package/skills/cosmic-build/scripts/test/fixtures/ReportSdkCheck.java +1 -22
- package/skills/cosmic-build/scripts/test/fixtures/list_column_property_declarations.json +887 -0
- package/skills/cosmic-build/scripts/test/fixtures/operation-entry-field-prepare.java +78 -0
- package/skills/cosmic-build/scripts/test/test_add_field_required_contract.py +12 -0
- package/skills/cosmic-build/scripts/test/test_batch5_drift_governance.py +23 -2
- package/skills/cosmic-build/scripts/test/test_compile_plugin_source.py +287 -4
- package/skills/cosmic-build/scripts/test/test_configure_list_delivery.py +132 -0
- package/skills/cosmic-build/scripts/test/test_cosmic_sdk_examples.py +58 -1
- package/skills/cosmic-build/scripts/test/test_data_model_contract.py +19 -0
- package/skills/cosmic-build/scripts/test/test_dcs_code_gate.py +901 -0
- package/skills/cosmic-build/scripts/test/test_delivery_stage_boundary.py +1 -1
- package/skills/cosmic-build/scripts/test/test_direct_cli_architecture.py +2 -0
- package/skills/cosmic-build/scripts/test/test_http_client.py +6 -0
- package/skills/cosmic-build/scripts/test/test_java_toolchain_feedback.py +206 -0
- package/skills/cosmic-build/scripts/test/test_kd_api.py +21 -0
- package/skills/cosmic-build/scripts/test/test_list_configuration_closure.py +184 -0
- package/skills/cosmic-build/scripts/test/test_mcp_cli.py +139 -2
- package/skills/cosmic-build/scripts/test/test_menu_creation_closure.py +16 -0
- package/skills/cosmic-build/scripts/test/test_modeling_input_recovery.py +55 -1
- package/skills/cosmic-build/scripts/test/test_open_world_cli_catalog.py +1 -1
- package/skills/cosmic-build/scripts/test/test_operation_field_preparation.py +84 -0
- package/skills/cosmic-build/scripts/test/test_platform_api_contract.py +322 -1
- package/skills/cosmic-build/scripts/test/test_plugin_handoff.py +951 -4
- package/skills/cosmic-build/scripts/test/test_plugin_source_gate.py +30 -2
- package/skills/cosmic-build/scripts/test/test_plugin_target_sdk.py +21 -0
- package/skills/cosmic-build/scripts/test/test_property_reroute.py +165 -0
- package/skills/cosmic-build/scripts/test/test_property_schema_first.py +35 -0
- package/skills/cosmic-build/scripts/test/test_query_plugin_handoff.py +221 -0
- package/skills/cosmic-build/scripts/test/test_register_plugins.py +76 -4
- package/skills/cosmic-build/scripts/test/test_render_output_cards.py +75 -3
- package/skills/cosmic-build/scripts/test/test_report_business_contract.py +27 -5
- package/skills/cosmic-build/scripts/test/test_report_doc_contract_sync.py +103 -11
- package/skills/cosmic-build/scripts/test/test_report_plugin_source_gate.py +46 -16
- package/skills/cosmic-build/scripts/test/test_report_properties.py +74 -15
- package/skills/cosmic-build/scripts/test/test_report_query_data_source.py +3 -1
- package/skills/cosmic-build/scripts/test/test_report_sdk_optimization.py +1 -2
- package/skills/cosmic-build/scripts/test/test_test_environment.py +76 -1
- package/skills/cosmic-build/scripts/test_environment.py +67 -1
- package/skills/cosmic-build/skills/cosmic-coding-impl/SKILL.md +52 -10
- package/skills/cosmic-build/skills/cosmic-meta-api/apis/ai_meta.md +16 -3
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/report-write-contracts.json +59 -26
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/rule-domain.json +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/report-write.schema.json +75 -18
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/scripts/pdm_auto.py +39 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/scripts/pdm_client.py +97 -10
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/verify/SKILL.md +10 -12
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_apps.py +3 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_formactions.py +38 -29
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_listui.py +400 -233
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_metaops.py +87 -45
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_properties.py +42 -15
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_rules.py +135 -5
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/config.py +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/execution_errors.py +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/formatters.py +17 -11
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/property_reroute.py +15 -5
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/report_ops.py +1429 -238
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/validators.py +56 -28
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/cosmic_api.py +380 -134
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/field_decorator.py +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/meta_export.py +12 -11
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/meta_verifier.py +42 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_add_field_placement_closure.py +8 -8
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_build_configuration_readback.py +94 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_build_receipt_resume.py +47 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_metadata_unchanged_fail_closed.py +87 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_dym_evidence.py +23 -23
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_entity_integrity.py +279 -4
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_field_guard.py +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_plugin_contract.py +509 -32
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_readback_derivation.py +178 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_recreate_plan.py +125 -10
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_serve_contract.py +208 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_typed_filters.py +259 -50
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_rule_inventory_perf.py +29 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_rule_write_closure.py +20 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_post_build_recovery.py +18 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_verification_evidence.py +35 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_identity_guard.py +25 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_time_range_rule.py +98 -0
- package/skills/cosmic-build/skills/cosmic-meta-knowledge/domain-model/report-model.md +20 -9
- package/skills/cosmic-build/skills/cosmic-meta-knowledge/generation/report-modeling-guide.md +55 -25
- package/skills/cosmic-build/skills/cosmic-meta-knowledge/property-guides/report-column-properties.md +15 -39
- package/skills/cosmic-build/skills/cosmic-meta-modeling/SKILL.md +19 -17
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/SKILL.md +82 -38
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/examples/golden-example-report-batch.md +64 -19
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/examples/golden-example-report-plugin.md +32 -20
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/examples/golden-example-report-tree.md +78 -31
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/report-artifact-schema.json +2 -1
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-companion-fields.md +3 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-list-configuration.md +2 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_contract.py +3 -1
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_emit.py +27 -4
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/report_validator.py +99 -44
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/test_report_examples.py +31 -4
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/test_report_validator.py +129 -29
- package/skills/cosmic-build/skills/cosmic-meta-modifier/SKILL.md +6 -2
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/validation.md +2 -0
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/SKILL.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/report-op/SKILL.md +104 -25
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/SKILL.md +9 -0
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/verify/usage-guide.md +2 -2
- package/skills/cosmic-build/skills/cosmic-meta-modifier/references/list-filter-modification.md +39 -12
- package/skills/cosmic-build/skills/mcp-server/SKILL.md +39 -24
- package/skills/cosmic-build/skills/mcp-server/scripts/mcp_cli.py +20 -6
- package/skills/cosmic-dev-best-practices/SKILL.md +1 -1
- package/skills/cosmic-dev-best-practices/references/README.md +2 -2
- package/skills/cosmic-dev-best-practices/references/basedata-dev-convention.md +2 -2
- package/skills/cosmic-dev-best-practices/references/bill-dev-convention.md +4 -4
- package/skills/cosmic-dev-best-practices/references/design-document-convention.md +2 -2
- package/skills/cosmic-dev-best-practices/references/design-examples/basedata-design-example.md +4 -4
- package/skills/cosmic-dev-best-practices/references/design-examples/bill-design-example.md +13 -13
- package/skills/cosmic-dev-best-practices/references/elements/CustomerField.md +1 -1
- package/skills/cosmic-dev-best-practices/references/elements/README.md +1 -1
- package/skills/cosmic-dev-best-practices/references/elements/SupplierField.md +1 -1
- package/skills/cosmic-dev-best-practices/references/elements/common-field-property-conventions.md +109 -13
- package/skills/cosmic-dev-best-practices/references/layout-control-convention.md +1 -1
- package/skills/erp-analysis/references/delivery-contract.md +2 -1
- package/skills/erp-analysis/templates/AGENTS.template.md +3 -1
- package/skills/cosmic-build/assets/platform-report-filters/TypedReportFilterFields.java +0 -169
- package/skills/cosmic-build/assets/platform-report-filters/platform.patch +0 -98
- package/skills/cosmic-build/scripts/apply_report_filter_extension.py +0 -39
|
@@ -40,10 +40,13 @@
|
|
|
40
40
|
|
|
41
41
|
- `bos_rpttpl`:默认报表;
|
|
42
42
|
- `bos_rptqingtpl`:轻分析;
|
|
43
|
-
- `bos_grouprpttpl
|
|
43
|
+
- `bos_grouprpttpl`:分组报表,报表分组面板里放分组列表(它本身是带查询插件的报表列表),旁边是
|
|
44
|
+
报表数据面板及其报表列表。它不是左树报表;
|
|
44
45
|
- `bos_commfilterrpttpl`:通用过滤查询报表。
|
|
45
46
|
|
|
46
|
-
需求未指定其他模板时使用 `bos_rpttpl
|
|
47
|
+
需求未指定其他模板时使用 `bos_rpttpl`。没有任何公共模板预置左树(`ReportTreeAp`):只有用户在设计器里
|
|
48
|
+
给报表新增「报表树」控件后报表才有左树,CLI 也没有发布添加该控件的命令。所以要求在左树上导航的需求,
|
|
49
|
+
创建时不带 `reportProperties.tree`;`run` 之后的步骤见 `examples/golden-example-report-tree.md`。
|
|
47
50
|
|
|
48
51
|
`entities[0].bizName` 不带 ISV 前缀。`entities[0].formNumber` 是最终装饰后的编码:非标准产品为
|
|
49
52
|
`<isvNumber>_<bizName>`,标准产品为 `<bizName>`。`isvNumber` 来自 CLI 自有的 `getDevInfo` 身份,
|
|
@@ -67,7 +70,14 @@
|
|
|
67
70
|
列和分组的 `fieldKey` 都不同:控件会把这个 key 当成自己的元素 key,复用列 key 会让报表在设计器
|
|
68
71
|
里无法保存。要按某个展示列过滤,就用 `flt_<列>` 这样的独立 key,由插件在 `query()` 里把它作用
|
|
69
72
|
到该列上;
|
|
70
|
-
- 每个排序 `fieldKey`
|
|
73
|
+
- 每个排序 `fieldKey` 引用叶子报表列;默认排序要求恰好一个已启用的 Java 取数插件。
|
|
74
|
+
在 `reportContract.defaultSorts` 中保留规则顺序与区分大小写的 `dateIndex` 映射;仅绑定查询数据源
|
|
75
|
+
不构成已验证的排序通道。无可承接插件时,`REPORT_DEFAULT_SORT_PLUGIN_REQUIRED` 会在创建前拒绝;
|
|
76
|
+
禁止丢弃排序或未经授权新增/替换插件;
|
|
77
|
+
- `reportPlugins` 是一个槽位,即报表列表的取数插件,所以只放一个条目;左树的插件是
|
|
78
|
+
`ReportTreeAp.ReportPlugin`,在报表有了「报表树」控件后由 `setReportProperties --target tree` 写入,
|
|
79
|
+
负责页面行为的 `reportform` 插件两者都不是:它单独走一次 Java 交付,
|
|
80
|
+
由 `register_plugins.py` 注册到报表表单的插件列表(`targetType` `BILL_FORM`);
|
|
71
81
|
- 插件注册只证明元数据注册,不等于业务取数语义已可执行。
|
|
72
82
|
|
|
73
83
|
已有的完整示例,全部在 CI 中用下面这个校验器校验过:
|
|
@@ -76,9 +86,9 @@
|
|
|
76
86
|
|---|---|
|
|
77
87
|
| `examples/golden-example-report-plugin.md` | 常规场景:列、分组、过滤、排序、一个取数插件,以及列的 `presentation` |
|
|
78
88
|
| `examples/golden-example-report-batch.md` | 大数据量报表:Artifact 里没有任何「分批」字样,该需求落在插件的 `queryBatchBy()` |
|
|
79
|
-
| `examples/golden-example-report-tree.md` |
|
|
89
|
+
| `examples/golden-example-report-tree.md` | 左树右表:两个插件注册在两个槽位、用户在 `run` 之后新增的报表树控件,以及它与折叠式树形行的区别 |
|
|
80
90
|
|
|
81
|
-
先用 `{ROOT_DIR}/skills/cosmic-meta-modeling/scripts/report_validator.py` 校验 Artifact
|
|
91
|
+
先用 `{python} "{ROOT_DIR}/skills/cosmic-meta-modeling/scripts/report_validator.py" --artifact "{artifactPath}" --json` 校验 Artifact;该校验器不接收 `--app-root`。然后执行:
|
|
82
92
|
|
|
83
93
|
```bash
|
|
84
94
|
{python} "{cosmic_api}" run --app-root "{appRoot}" --artifact "{artifactPath}"
|
|
@@ -90,13 +100,28 @@
|
|
|
90
100
|
2. 绑定声明的查询数据源;
|
|
91
101
|
3. 设置完整报表列树;
|
|
92
102
|
4. 设置完整过滤条件;
|
|
93
|
-
5.
|
|
103
|
+
5. 保留默认排序到 Java 查询契约(不写元数据);
|
|
94
104
|
6. 注册声明的插件;
|
|
95
105
|
7. 应用声明的报表属性。
|
|
96
106
|
|
|
97
107
|
每条原子 CLI 自行完成目标校验和独立报表读回。失败时只报告对应业务区段;不要搜索源码、
|
|
98
108
|
猜测载荷或切换到通用元数据写入。
|
|
99
109
|
|
|
110
|
+
## 默认排序是查询要求
|
|
111
|
+
|
|
112
|
+
`setReportSorts` 以 `REPORT_SORTS_API_UNSAFE` 被阻断,包括 dry-run 和通用回退路径。它的 API
|
|
113
|
+
把排序条目混入默认显示列属性 `InitField`,缺少 `isvisible` 值会使表格设置抛出
|
|
114
|
+
`NullPointerException`。禁止补 `isvisible: true` 掩盖问题或改写显示列配置。存量污染报表
|
|
115
|
+
需要单独进行 API 侧修复;更新技能不会自动修复它们。
|
|
116
|
+
|
|
117
|
+
Java 交付必须消费报表契约中的 `defaultSorts` 与 `defaultSortPolicy`。
|
|
118
|
+
在 `query()` 中,先处理 `ReportQueryParam.getSortInfo()` 的交互排序,把校验后的 `fieldKey`
|
|
119
|
+
映射到 `dateIndex`;仅在没有交互排序时,按声明顺序应用默认规则。
|
|
120
|
+
在关联、合并、汇总完成后的最终 DataSet 上排序,时机在分页/导出之前,保留权限过滤。
|
|
121
|
+
使用目标 SDK 已核验的排序 API,禁止拼接未经校验的 SQL 片段。契约存在、源码、编译或注册
|
|
122
|
+
均不构成运行证据:默认排序和交互覆盖必须分别验收。run 的 `reportDefaultSorts`
|
|
123
|
+
仍标记为等待 Java 实现,绝不宣称已写入排序元数据或已验证运行行为。
|
|
124
|
+
|
|
100
125
|
## 报表属性,一次声明到位
|
|
101
126
|
|
|
102
127
|
`reportProperties` 承载那些原先需要创建后再调一次才能设的属性。它的成员就是修改期命令面对的那些
|
|
@@ -119,13 +144,15 @@
|
|
|
119
144
|
|
|
120
145
|
- 列的键要拿本 artifact 自己的 `reportColumns` 去解析,判断它是叶子列还是列分组,因为两者接受的属性
|
|
121
146
|
集不同,而平台对发错宿主的键照收却什么都不改。`R-property-column` 会拒绝它;
|
|
122
|
-
- `tree` 作用于 `ReportTreeAp
|
|
123
|
-
`R-property-tree`
|
|
147
|
+
- `tree` 作用于 `ReportTreeAp`,没有任何公共模板带它——`bos_grouprpttpl` 是分组报表,不是左树。本次 run
|
|
148
|
+
创建的报表没有左树,该写入会在 `createPage` 之后被拒绝,所以 `R-property-tree` 直接拒绝这一段。等用户
|
|
149
|
+
新增「报表树」控件后,再用 `setReportProperties --target tree` 写入;
|
|
124
150
|
- 其余全部按修改期命令用的同一份白名单校验,于是本会被静默忽略的属性在这里变成 `R-property-target`。
|
|
125
151
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
152
|
+
这个段**最后**应用,在过滤条件之后。这个顺序正是要点:在未安装类型化报表过滤补丁的平台上,
|
|
153
|
+
`setReportFilters` 把 `ShowFilterFields` 写成运行时无法解析的逗号拼接串,因此在这里声明字段列表,
|
|
154
|
+
才能让在那里新建出来的报表带上 JSON 数组形态;不声明它的报表会一直带着那个坏值,直到有人去修。
|
|
155
|
+
已安装补丁的平台自己写数组,但会按过滤条件重置 `FilterMustInput` 和初始字段,最终值由本段确定。
|
|
129
156
|
|
|
130
157
|
读路径观察不到的属性——`ColumnWidthStyle`、`MaxRowHeight`、`HeadHeight`、`ReportSumMeta` 以及行背景
|
|
131
158
|
色——在 run 结果里记在 `unverifiable` 下而不是判为失败,并由流水线本来就会同步的设计态导出来结算。
|
|
@@ -163,12 +190,15 @@ id 和显示名由平台解析:调用方给的 id 无法证明存在,而存
|
|
|
163
190
|
|
|
164
191
|
`setReportColumns` 只在创建时跑一次。平台是往报表实体上**追加**字段而不是替换,所以对同一张报表第二次
|
|
165
192
|
调用会让每个字段 key 重名、保存被拒,而追加的字段已经留下——此后该表单任何保存都不会成功,CLI 会拒绝
|
|
166
|
-
这第二次写入。后续要**加**列可以用 `addReportColumns`
|
|
167
|
-
|
|
168
|
-
|
|
193
|
+
这第二次写入。后续要**加**列可以用 `addReportColumns` 增量追加。
|
|
194
|
+
后端支持 `ReportColumns.remove` 时,用 `removeReportColumn` 删除一个叶子列;旧后端以
|
|
195
|
+
`REPORT_COLUMN_DELETE_API_UNAVAILABLE` 安全停止,不隐藏或重建。
|
|
196
|
+
删除分组、重排或改列类型仍需单独授权重建,由 `skills/cosmic-meta-modifier/modules/report-op`
|
|
197
|
+
用 `planReportRecreate` 规划——不可逆且会丢掉菜单绑定。删列只更新元数据与本地需求,不会修改
|
|
198
|
+
既有 Java;核对其列绑定后才能宣称运行完成。
|
|
169
199
|
|
|
170
200
|
因此在调用 `run` 之前就要把完整列清单、标题和类型定好。特别要确认每一列都是取数插件真能产出的。
|
|
171
|
-
注意分组最小值/最大值**是可以表达的** —— `DataSet.
|
|
201
|
+
注意分组最小值/最大值**是可以表达的** —— `DataSet.groupBy` + `min` / `max`,见
|
|
172
202
|
`{ROOT_DIR}/knowledge/cosmic/platform/sdk/sdk-algo.md` —— 不要因为以为算不出来就把这类列去掉。
|
|
173
203
|
|
|
174
204
|
## 能力边界
|
|
@@ -186,12 +216,12 @@ Java 交接消费 filterValueContracts。优先已发布 CLI 和独立回读;
|
|
|
186
216
|
|
|
187
217
|
剩余边界需明确:
|
|
188
218
|
|
|
189
|
-
-
|
|
190
|
-
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
219
|
+
- 报表列展现通过插件契约交接;已记录的 ReportColumnFactory 签名本身不能证明动态精度可运行。
|
|
220
|
+
- 过滤的控件就是它的 `fieldType`(F7 选择、下拉框、日期范围等,共 25 种),连同该类型的参数,如
|
|
221
|
+
`basedataNumber` 或 `comboItems`,由平台的类型化报表过滤 API 创建。该 API 以平台补丁发布,而本技能
|
|
222
|
+
随客户端发布:未安装补丁的平台渲染旧控件(文本框,`between` 时为日期范围),run 在
|
|
223
|
+
`reportFilterEditors` 下把该过滤报告为降级,而不是失败。回复中要说明这一点;补丁安装后重新设置
|
|
224
|
+
过滤即可,不必重建报表。`compare` 仍是查询要求,控件本身不证明过滤生效。
|
|
195
225
|
|
|
196
226
|
这两类需求都不会被丢弃:它们会被编译进一份插件契约
|
|
197
227
|
`{appRoot}/_runtime/<formNumber>.report-plugin-contract.json`,由 `prepare_plugin_handoff` 以
|
|
@@ -201,12 +231,16 @@ Java 交接消费 filterValueContracts。优先已发布 CLI 和独立回读;
|
|
|
201
231
|
`createDecimalColumn`),以及需要随后调用的 `javaFollowUp` setter —— 因为这些签名有文档,而多数
|
|
202
232
|
`ReportColumn.TYPE_*` 常量名没有。
|
|
203
233
|
|
|
204
|
-
`currencyField` / `measureUnitField`
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
`
|
|
209
|
-
|
|
234
|
+
动态 `currencyField` / `measureUnitField` 绑定当前在所有写入前以
|
|
235
|
+
`REPORT_PRECISION_REFERENCE_UNVERIFIED` 阻断。声明 `fieldType: bigint` 和 `hide: true`
|
|
236
|
+
只会得到 Long,不是精度格式化器读取的 DynamicObject。`fieldKey` 与 `dateIndex` 相同
|
|
237
|
+
不证明引用已物化。`R-presentation-binding` 检查名称;平台引用属性、旧标量迁移和格式化前
|
|
238
|
+
批量物化验证前,`R-presentation-binding-target` 是错误。保留需求,不能通过取消绑定或固定精度
|
|
239
|
+
来宣称完成。
|
|
240
|
+
|
|
241
|
+
原始/历史插件契约保留 `precisionSource`,其中 `runtimeVerified` 为 false、
|
|
242
|
+
`metadataWriteBlocked` 为 true。工厂调用和 `javaFollowUp` 是签名,不是完整引用实现。
|
|
243
|
+
开放输入契约前须验证混合币别/单位、分组、合计、分页和导出,禁止猜测转换 API。
|
|
210
244
|
|
|
211
245
|
只要报表有列,就一定有这份契约,因为最基本的那条要求就在里面:`dataSetColumnTypes` 给出每一列的
|
|
212
246
|
`rowAccessor`、`javaType` 与 `algoDataType`。报表会把每个值 set 进一个元数据字段,因此返回错误的
|
|
@@ -215,18 +249,20 @@ Java 类型是在 set 阶段失败、报的是字段而不是查询 —— `date
|
|
|
215
249
|
|
|
216
250
|
分批查询和导出行为没有元数据通道。在取数插件里实现 `queryBatchBy()` 和 `export()`;树形行为请先读
|
|
217
251
|
`{ROOT_DIR}/references/plugin-runtime-routing.md`,因为左树导航和折叠式树形行是两种不同的插件类型。
|
|
218
|
-
左树自身的元数据设置**确实**有通道——`setReportProperties --target tree
|
|
252
|
+
左树自身的元数据设置**确实**有通道——`setReportProperties --target tree`,其 `ReportPlugin` 用来注册树插件——
|
|
253
|
+
但导航本身仍是插件的工作。
|
|
219
254
|
|
|
220
255
|
## 读回证据
|
|
221
256
|
|
|
222
257
|
`getReportSchema` 在 `readBackSource` 中说明本次写入由哪种来源证明:
|
|
223
258
|
|
|
224
|
-
- `canonical`:后端暴露了 `data.reportSchema
|
|
259
|
+
- `canonical`:后端暴露了 `data.reportSchema`,比较可观察元数据;尚未确认支持的原生排序契约,
|
|
260
|
+
所以 `reportSorts` 保持未核验。
|
|
225
261
|
- `formLayout`:没有 canonical 投影(已在被测部署上确认不存在)。列和过滤条件从布局树反解,
|
|
226
262
|
所以只能证明其结构,`undecidable*Properties` 给出它看不到的逐项属性。
|
|
227
|
-
- `formLayout+dym
|
|
228
|
-
|
|
229
|
-
|
|
263
|
+
- `formLayout+dym`:流水线同步了平台自身的设计态导出,`<ReportQueryPlugin>` 证明 `reportPlugins`,
|
|
264
|
+
`unverifiableSections` 相应缩小。`<InitField>` 是显示列配置,绝不证明 `reportSorts`。
|
|
265
|
+
它还能证明每个过滤控件上的 `mustInput` 与 `visible` —— 因为
|
|
230
266
|
布局树已经证明了控件存在,所以这是按属性提升而不是按区段提升;这两个名字会离开
|
|
231
267
|
`undecidableFilterProperties`,随后被真正逐项比较。该导出不含插件的 `type` / `bizAppId` / `fpk`,
|
|
232
268
|
也没有 `<DefaultValue>`,这些仍保持不可判定,而不是拿去和缺失值比较。
|
|
@@ -253,12 +289,20 @@ Java 类型是在 set 阶段失败、报的是字段而不是查询 —— `date
|
|
|
253
289
|
一次成功的 `run` —— 或空白路径上的 `createPage` —— 只是元数据边界,不是本轮的终点。
|
|
254
290
|
把已验证的报表身份与 run 结果交还给 app-build,由它在同一轮内完成固定交付顺序:
|
|
255
291
|
|
|
256
|
-
- 只要 Artifact 声明了插件(`reportPlugins` 或
|
|
257
|
-
就无需询问地进入 `references/java-plugin-delivery.md
|
|
258
|
-
`prepare_plugin_handoff.py
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
292
|
+
- 只要 Artifact 声明了插件(`reportPlugins` 或
|
|
293
|
+
`reportProperties.pluginExts`),app-build 就无需询问地进入 `references/java-plugin-delivery.md`:
|
|
294
|
+
把报表 Artifact 与 run 结果交给 `prepare_plugin_handoff.py`,随后在回复结束前完成源码生成、
|
|
295
|
+
窄编译、注册与插件读回。每个类按其槽位运行的类型交付 —— 契约的 `pluginTypes` 给出该类型 ——
|
|
296
|
+
并按该类型的 guide 及其列出的报表场景编码。编译器自己解析 Java 模块根;只有它返回
|
|
297
|
+
`PLUGIN_WORKSPACE_UNRESOLVED` 时才允许问一个关于 Java 模块根的问题。禁止在 `run` 之后以
|
|
298
|
+
「下一步:Java 源码」式的总结结束本轮,也禁止凭自己对工作区的查看去询问 Java 项目或编译器位置;
|
|
299
|
+
- 左树的插件永远不在这次 run 里:用户新增「报表树」控件、`setReportProperties --target tree` 写入其
|
|
300
|
+
`ReportPlugin` 之后,该类按同一流程以 `reporttreelist` 类型针对已有表单编码交付;
|
|
301
|
+
- 需求要求页面行为 —— 表头过滤、工具栏按钮、钻取联查、合计行标签、图表、折叠式树形行 —— 时,app-build
|
|
302
|
+
还要在同一个报表表单编码上按同一流程交付一个 `reportform` 类,按
|
|
303
|
+
`{ROOT_DIR}/knowledge/cosmic/platform/report-plugin.md` 及其列出的报表场景编码。
|
|
304
|
+
`register_plugins.py --verify` 以 `targetType` `BILL_FORM` 注册它,只有回读在 `location` `BILL_FORM`
|
|
305
|
+
找到它才算交付完成;
|
|
262
306
|
- 未声明插件时,直接进入卡片收口。
|
|
263
307
|
|
|
264
308
|
两种情况下 app-build 随后都会渲染唯一一组最终产物卡片;用户不需要另行要求输出卡片。
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
# 黄金示例:库存台账报表(分批查询)
|
|
2
2
|
|
|
3
3
|
> 分批查询没有元数据通道。Artifact 里不会出现「分批」二字:这个判断来自需求,最终落在插件的
|
|
4
|
-
> `queryBatchBy()`
|
|
4
|
+
> `queryBatchBy()` 覆写上。下面保留的是历史报表需求,不是当前可写输入。
|
|
5
|
+
>
|
|
6
|
+
> **当前写前拒绝**:`REPORT_PRECISION_REFERENCE_UNVERIFIED`。
|
|
7
|
+
> 三个数量列绑定的隐藏 `unit_id: bigint` 只提供 Long,不能证明格式化前存在 DynamicObject 单位引用。
|
|
8
|
+
> 这是保留分批及动态单位精度要求的历史反例;验证平台引用字段、旧字段迁移和批量物化后才能开放写入。
|
|
5
9
|
|
|
6
10
|
## 用户需求
|
|
7
11
|
|
|
@@ -106,6 +110,8 @@
|
|
|
106
110
|
{
|
|
107
111
|
"fieldPath": "flt_warehouse",
|
|
108
112
|
"displayName": "仓库",
|
|
113
|
+
"fieldType": "MulBasedataField",
|
|
114
|
+
"basedataNumber": "bd_warehouse",
|
|
109
115
|
"compare": "in"
|
|
110
116
|
},
|
|
111
117
|
{
|
|
@@ -133,13 +139,16 @@
|
|
|
133
139
|
```
|
|
134
140
|
|
|
135
141
|
注意过滤条件的 key:`flt_warehouse` 和 `flt_biz_date` 与每个列 key 都不同,所以生成的控件不会和
|
|
136
|
-
列元素撞 key
|
|
142
|
+
列元素撞 key。仓库过滤声明了自己的控件 —— 基于 `bd_warehouse` 的仓库选择,用户选仓库而不是手输;
|
|
143
|
+
未安装类型化报表过滤补丁的平台会改为渲染文本框,run 把该过滤报告为降级而不是失败。日期过滤还声明了
|
|
144
|
+
`mustInput: true`,只有已安装补丁的平台才会落地这一项 —— 见下面编译出的契约。
|
|
137
145
|
|
|
138
146
|
## 编译出的插件契约
|
|
139
147
|
|
|
140
|
-
`run`
|
|
141
|
-
|
|
142
|
-
|
|
148
|
+
当前 `run` 在创建报表和写元数据之前拒绝上述输入,不生成成功交付回执。
|
|
149
|
+
以下为原始/历史需求编译结果的节选,不代表输入可写;能力验证后才可进入
|
|
150
|
+
`run` → `{appRoot}/_runtime/kdtest_inv_ledger_rpt.report-plugin-contract.json` →
|
|
151
|
+
`prepare_plugin_handoff` 的目标流程。每种 kind 只展示一条呈现要求:
|
|
143
152
|
|
|
144
153
|
```json
|
|
145
154
|
{
|
|
@@ -161,7 +170,30 @@
|
|
|
161
170
|
{
|
|
162
171
|
"fieldKey": "in_qty",
|
|
163
172
|
"kind": "qty",
|
|
164
|
-
"java": "ReportColumnFactory.createQtyColumn(new LocaleString(\"入库\"), \"in_qty\", \"unit_id\")"
|
|
173
|
+
"java": "ReportColumnFactory.createQtyColumn(new LocaleString(\"入库\"), \"in_qty\", \"unit_id\")",
|
|
174
|
+
"precisionSource": {
|
|
175
|
+
"fieldKey": "unit_id",
|
|
176
|
+
"requiredRuntimeValueType": "DynamicObject",
|
|
177
|
+
"runtimeVerified": false,
|
|
178
|
+
"rawIdIsReference": false,
|
|
179
|
+
"metadataWriteBlocked": true
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
],
|
|
183
|
+
"filterValueContracts": [
|
|
184
|
+
{
|
|
185
|
+
"filterKey": "flt_warehouse",
|
|
186
|
+
"compare": "in",
|
|
187
|
+
"editorFieldType": "MulBasedataField",
|
|
188
|
+
"valueAccessor": "ReportQueryParam.getFilter().getDynamicObjectCollection(\"flt_warehouse\")",
|
|
189
|
+
"valueJavaType": "DynamicObjectCollection",
|
|
190
|
+
"legacyEditor": {
|
|
191
|
+
"fieldType": "TextField",
|
|
192
|
+
"valueAccessor": "ReportQueryParam.getFilter().getString(\"flt_warehouse\")",
|
|
193
|
+
"valueJavaType": "String"
|
|
194
|
+
},
|
|
195
|
+
"basedataNumber": "bd_warehouse",
|
|
196
|
+
"multiValue": true
|
|
165
197
|
}
|
|
166
198
|
],
|
|
167
199
|
"filterEnforcement": [
|
|
@@ -175,10 +207,15 @@
|
|
|
175
207
|
}
|
|
176
208
|
```
|
|
177
209
|
|
|
178
|
-
`unit_id`
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
210
|
+
`unit_id` 的 `requiredBy` 只记录三个数量列的共享依赖;隐藏 bigint 的 Long 值不是
|
|
211
|
+
DynamicObject 引用。声明列、名称一致及 `createQtyColumn` 工厂签名均不证明已有 BigInt
|
|
212
|
+
属性已迁移或运行行已物化。三个数量列都必须保留 `precisionSource` 未验证状态;平台能力
|
|
213
|
+
验证前整体拒绝,不能删除绑定或改成固定精度来完成。插件仍须在取数前拒绝空的
|
|
214
|
+
`flt_biz_date`,配置必录不能代替查询必录校验。
|
|
215
|
+
|
|
216
|
+
`flt_warehouse` 给出了 `query()` 可能收到的两种值:选中的仓库是 `DynamicObjectCollection`,未安装
|
|
217
|
+
补丁的平台渲染的文本框则给出用户输入的 `String`。选中记录必须经业务引用提取真实编码,不能读取包装行身份。
|
|
218
|
+
文本形态只是旧部署兼容边界,不代表仓库选择/F7 多选体验完成;所需补丁安装、过滤重新设置并运行验收后才能交付。
|
|
182
219
|
|
|
183
220
|
物料列这一条要看仔细。它的 `fieldKey` 是 `material_ref`,`dateIndex` 是 `material_id`,而没有任何
|
|
184
221
|
`ReportColumnFactory` 签名接受 `dateIndex` —— 所以工厂造出来的列只带 fieldKey,会渲染成空。这就是
|
|
@@ -188,22 +225,27 @@
|
|
|
188
225
|
|
|
189
226
|
## 插件形态
|
|
190
227
|
|
|
191
|
-
`queryBatchBy`
|
|
228
|
+
`queryBatchBy` 返回按分批键自身排序的分批键,让每一批是一段连续范围,并配置批量大小:每批 100 个键,让每批的
|
|
229
|
+
`in` 列表保持较短。随后 `query` 会被逐批调用,并用当前批次的行收窄自己的
|
|
192
230
|
查询。`queryBatchBy` 返回 `null` 表示让框架走单次查询 —— 用户选的日期区间很小时正是这样处理。
|
|
193
231
|
|
|
232
|
+
以下 Java 片段仅展示分批和 DataSet 别名形状,省略的过滤 helper 必须落实身份、compare、必录及权限。
|
|
233
|
+
`unit as unit_id` 返回 Long 主键,尚无格式化前批量 DynamicObject 物化实现;该片段不能作为动态精度根治交付。
|
|
234
|
+
|
|
194
235
|
```java
|
|
195
236
|
public class InvLedgerReportPlugin extends AbstractReportListDataPlugin {
|
|
196
237
|
|
|
197
238
|
private static final String ALGO_NAME = InvLedgerReportPlugin.class.getName();
|
|
198
239
|
private static final String ENTITY_NUMBER = "im_stock_trans_detail";
|
|
199
|
-
private static final
|
|
240
|
+
private static final String BILL_NO = "billno";
|
|
241
|
+
private static final int COUNT_PER_BATCH = 100;
|
|
200
242
|
private static final int MAX_ROW_COUNT_CACHED = 100000;
|
|
201
243
|
|
|
202
244
|
@Override
|
|
203
245
|
public DataSet queryBatchBy(ReportQueryParam queryParam) {
|
|
204
|
-
|
|
205
|
-
DataSet keys =
|
|
206
|
-
filtersOf(queryParam),
|
|
246
|
+
// 按分批键自身排序,让每一批是一段连续范围
|
|
247
|
+
DataSet keys = QueryServiceHelper.queryDataSet(ALGO_NAME, ENTITY_NUMBER, BILL_NO,
|
|
248
|
+
filtersOf(queryParam), BILL_NO, 100000000);
|
|
207
249
|
IReportBatchQueryInfo batchInfo = queryParam.byBatchInfo();
|
|
208
250
|
batchInfo.setCountPerBatch(COUNT_PER_BATCH);
|
|
209
251
|
batchInfo.setMaxRowCountCached(MAX_ROW_COUNT_CACHED);
|
|
@@ -219,13 +261,13 @@ public class InvLedgerReportPlugin extends AbstractReportListDataPlugin {
|
|
|
219
261
|
for (Row row : batchInfo.getCurrentBatchRows()) {
|
|
220
262
|
billNos.add(row.getString(0));
|
|
221
263
|
}
|
|
222
|
-
filters.add(new QFilter(
|
|
264
|
+
filters.add(new QFilter(BILL_NO, QCP.in, billNos));
|
|
223
265
|
}
|
|
224
266
|
// DataSet 列名必须与每个 dateIndex 相等,包括 unit_id。
|
|
225
|
-
return
|
|
267
|
+
return QueryServiceHelper.queryDataSet(ALGO_NAME, ENTITY_NUMBER,
|
|
226
268
|
"warehouse.name as warehouse_name, material as material_id, biz_date,"
|
|
227
269
|
+ " in_qty, out_qty, closing_qty, unit as unit_id",
|
|
228
|
-
filters.toArray(new QFilter[
|
|
270
|
+
filters.toArray(new QFilter[filters.size()]), queryParam.getSortInfo());
|
|
229
271
|
}
|
|
230
272
|
}
|
|
231
273
|
```
|
|
@@ -234,9 +276,12 @@ public class InvLedgerReportPlugin extends AbstractReportListDataPlugin {
|
|
|
234
276
|
|
|
235
277
|
## 预期结果
|
|
236
278
|
|
|
279
|
+
当前输入被写前拒绝,不创建报表、不写元数据。以下仅是平台引用链路与技能契约开放后的待验收目标,
|
|
280
|
+
包括混合单位精度、分组、合计、分页和导出;保存回执或分批源码不构成运行验收。
|
|
281
|
+
|
|
237
282
|
- 报表表单 `kdtest_inv_ledger_rpt` 由 `bos_rpttpl` 创建
|
|
238
283
|
- 7 个列,其中 3 个分组在「数量」之下,1 个隐藏计量单位列
|
|
239
|
-
-
|
|
284
|
+
- 过滤面板含仓库选择(平台安装类型化过滤补丁之前是文本框)和一个由插件强制必填的日期区间
|
|
240
285
|
- 默认排序 `warehouse_name asc`、`material_ref asc`
|
|
241
286
|
- `kd.kdtest.report.InvLedgerReportPlugin` 已注册到报表取数插件位
|
|
242
287
|
- 插件契约携带 4 条展现绑定和 1 条过滤要求
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# 黄金示例:KPI 分析报表(取数插件)
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> 每张报表都由插件驱动:报表元数据声明展现,取数插件返回数据行。本历史示例现为拒绝用例:
|
|
4
|
+
> `REPORT_PRECISION_REFERENCE_UNVERIFIED` 在创建前阻断。隐藏 bigint 币别列不能满足动态精度。
|
|
5
|
+
> 保留需求至平台引用和批量物化验证完成;禁止把它复制为可运行的黄金输入。
|
|
5
6
|
|
|
6
7
|
## 用户需求
|
|
7
8
|
|
|
@@ -86,6 +87,8 @@
|
|
|
86
87
|
{
|
|
87
88
|
"fieldPath": "org_id",
|
|
88
89
|
"displayName": "Sales Org",
|
|
90
|
+
"fieldType": "MulBasedataField",
|
|
91
|
+
"basedataNumber": "bos_org",
|
|
89
92
|
"compare": "in"
|
|
90
93
|
},
|
|
91
94
|
{
|
|
@@ -113,17 +116,19 @@
|
|
|
113
116
|
|
|
114
117
|
## 执行流程
|
|
115
118
|
|
|
119
|
+
0. 写前校验 → 拒绝本历史 Artifact,不发送写入。以下仅描述平台引用能力和技能契约验证后的目标流程。
|
|
116
120
|
1. `createPage` → 用默认模板创建报表;获取 `formId`
|
|
117
121
|
2. `setReportColumns` → 6 个列,其中 2 个在 "Growth Indicators" 分组下、1 个隐藏:
|
|
118
122
|
`currency_id` 存在的原因是收入列绑定了它
|
|
119
|
-
3. `setReportFilters` →
|
|
120
|
-
`flt_period` 而不是 `period`:控件以自己的 key 作为元素 key
|
|
121
|
-
|
|
122
|
-
4. `
|
|
123
|
+
3. `setReportFilters` → 销售组织选择(基于 `bos_org` 的 `MulBasedataField`,所以用 `in`)和期间区间
|
|
124
|
+
(`between`)。期间过滤的 key 是 `flt_period` 而不是 `period`:控件以自己的 key 作为元素 key,而展示列
|
|
125
|
+
已经占用了 `period`。插件从 `ReportQueryParam.getFilter()` 读 `flt_period`,再作用到该列。
|
|
126
|
+
4. 保留 `reportSorts` → 将先 `period desc`、再 `org_name asc` 编译为 `defaultSorts`;不调用已阻断的 `setReportSorts`
|
|
123
127
|
5. `registerReportPlugin` → 注册 `kd.kdtest.report.KpiAnalysisReportPlugin`
|
|
124
128
|
6. Java 交付 → 实现 `query()`,返回列名恰好为 `org_name`、`period`、`revenue`、`currency_id`、
|
|
125
129
|
`yoy_rate`、`mom_rate` 的 DataSet。`currency_id` 之所以在列里,是因为 revenue 列声明了币别
|
|
126
|
-
绑定;编译出的插件契约会把它列进 `dataSetColumns
|
|
130
|
+
绑定;编译出的插件契约会把它列进 `dataSetColumns`。在分页/导出前的最终 DataSet 中消费
|
|
131
|
+
`defaultSorts` 和 `defaultSortPolicy`,交互排序优先;分别验证默认排序和交互排序。
|
|
127
132
|
|
|
128
133
|
## 为什么没有 `dataSources` 区段
|
|
129
134
|
|
|
@@ -150,7 +155,7 @@
|
|
|
150
155
|
}
|
|
151
156
|
```
|
|
152
157
|
|
|
153
|
-
|
|
158
|
+
它永远不会发往平台。创建流水线拒绝该输入;只有原始/历史需求编译可将它保留到
|
|
154
159
|
`{appRoot}/_runtime/kdtest_kpi_analysis_rpt.report-plugin-contract.json`,再由
|
|
155
160
|
`prepare_plugin_handoff` 以 `handoff.reportContract` 转交:
|
|
156
161
|
|
|
@@ -173,26 +178,31 @@
|
|
|
173
178
|
"bindsTo": "currency_id",
|
|
174
179
|
"scale": 2,
|
|
175
180
|
"java": "ReportColumnFactory.createAmountColumn(new LocaleString(\"Revenue\"), \"revenue\", \"currency_id\")",
|
|
176
|
-
"javaFollowUp": ["setScale(2)"]
|
|
181
|
+
"javaFollowUp": ["setScale(2)"],
|
|
182
|
+
"precisionSource": {
|
|
183
|
+
"fieldKey": "currency_id",
|
|
184
|
+
"requiredRuntimeValueType": "DynamicObject",
|
|
185
|
+
"runtimeVerified": false,
|
|
186
|
+
"rawIdIsReference": false,
|
|
187
|
+
"metadataWriteBlocked": true
|
|
188
|
+
}
|
|
177
189
|
}
|
|
178
190
|
]
|
|
179
191
|
}
|
|
180
192
|
```
|
|
181
193
|
|
|
182
|
-
`currency_id`
|
|
183
|
-
`fieldKey
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
绑定目标列保持 `fieldKey` 等于 `dateIndex` 是刻意的:这样无论平台把 `currencyField` 读作列 key 还是
|
|
188
|
-
读作 DataSet 列名,同一份 Artifact 都成立。`R-presentation-binding` 会同时拒绝「目标不存在」和
|
|
189
|
-
「目标的两者不一致」。
|
|
194
|
+
`currency_id` 是已声明的 `bigint` + `hide: true` 列,值仍为 Long,不是格式化器所需的
|
|
195
|
+
DynamicObject。`requiredBy: ["revenue"]` 保留依赖,不证明成功。`fieldKey` 与 `dateIndex`
|
|
196
|
+
相同只满足 `R-presentation-binding` 的名称校验;`currencyField` 仍缺引用物化。
|
|
197
|
+
`precisionSource` 明确保持未验证和写入阻断。重新开放写入前须验证持久化引用、旧 BigInt 迁移和
|
|
198
|
+
批量运行行物化;不能取消绑定或把固定精度称作完成。
|
|
190
199
|
|
|
191
200
|
`period` 展示的是同一份契约的另一面:`date` 列必须是 `java.util.Date`,返回格式化后的字符串会在
|
|
192
201
|
渲染时抛 `setvalue fail, name: period, Unparseable date`。
|
|
193
202
|
|
|
194
|
-
|
|
195
|
-
`ReportColumn.TYPE_*`
|
|
203
|
+
以下 `getColumns()` 片段仅展示已记录签名及递归,不是可运行的动态精度修复;它不能升级已有
|
|
204
|
+
BigInt 属性或物化运行行引用。引用要求满足前禁止复制到交付中;多数 `ReportColumn.TYPE_*`
|
|
205
|
+
常量名缺少证据。`ReportColumnGroup` 是 `AbstractReportColumn` 但不是
|
|
196
206
|
`ReportColumn`,分组内的列在它的 `getChildren()` 里、从不出现在顶层列表中,因此带强转的扁平循环
|
|
197
207
|
既命中不到它们、又会抛异常:
|
|
198
208
|
|
|
@@ -227,8 +237,10 @@ private void bindPresentation(List<AbstractReportColumn> nodes) {
|
|
|
227
237
|
|
|
228
238
|
## 预期结果
|
|
229
239
|
|
|
240
|
+
当前结果是写前拒绝,不创建报表或写入元数据。以下只是将来验收目标,不是已达成结果:
|
|
241
|
+
|
|
230
242
|
- 报表表单 `kdtest_kpi_analysis_rpt` 由 `bos_rpttpl` 创建
|
|
231
243
|
- 6 个列,其中 2 个分组在 "Growth Indicators" 之下,1 个隐藏币别列
|
|
232
|
-
-
|
|
244
|
+
- 过滤面板包含销售组织选择和期间区间
|
|
233
245
|
- 默认排序 `period desc`、`org_name asc`
|
|
234
246
|
- `kd.kdtest.report.KpiAnalysisReportPlugin` 已注册到报表取数插件位
|