@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.
Files changed (218) hide show
  1. package/package.json +1 -1
  2. package/skills/cosmic-build/LOCAL-PATCHES.md +43 -14
  3. package/skills/cosmic-build/SKILL.md +24 -9
  4. package/skills/cosmic-build/examples/java-rules/CosmicReportAggregation.java +26 -17
  5. package/skills/cosmic-build/examples/java-rules/CosmicReportFilters.java +96 -2
  6. package/skills/cosmic-build/knowledge/cosmic/arch/security/security_standard.md +4 -4
  7. package/skills/cosmic-build/knowledge/cosmic/platform/allimport.md +2 -1
  8. package/skills/cosmic-build/knowledge/cosmic/platform/core/dynamic-object-collection.md +6 -4
  9. package/skills/cosmic-build/knowledge/cosmic/platform/core/model.md +9 -9
  10. package/skills/cosmic-build/knowledge/cosmic/platform/core/view.md +5 -5
  11. package/skills/cosmic-build/knowledge/cosmic/platform/form-plugin.md +8 -4
  12. package/skills/cosmic-build/knowledge/cosmic/platform/list-plugin.md +5 -3
  13. package/skills/cosmic-build/knowledge/cosmic/platform/print-plugin-guide.md +1 -0
  14. package/skills/cosmic-build/knowledge/cosmic/platform/report-plugin.md +269 -57
  15. package/skills/cosmic-build/knowledge/cosmic/platform/reportlistdata-plugin.md +130 -23
  16. package/skills/cosmic-build/knowledge/cosmic/platform/reporttreedata-plugin.md +48 -28
  17. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/_index.md +12 -3
  18. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/common/attachment-name-process.md +17 -13
  19. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/common/dynamic-update-field.md +4 -4
  20. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/filter-grid/filter-grid-set-value.md +1 -1
  21. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-basedatafield.md +2 -3
  22. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-container-init.md +0 -1
  23. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-popup.md +0 -1
  24. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-value-parse.md +5 -6
  25. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/list-show-form.md +1 -1
  26. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/query-field-dynamic.md +0 -7
  27. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/business-data/delete-service.md +24 -29
  28. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/ksql/db-batch.md +4 -0
  29. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/ksql/db-direct-access.md +4 -0
  30. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/qfilter/entity-object-access.md +8 -3
  31. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/qfilter/qfilter-compose.md +6 -5
  32. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/after-bind-data-set-visible.md +5 -1
  33. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/click-return-data.md +2 -2
  34. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/closed-call-back-set-value.md +2 -2
  35. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/register-listener.md +1 -1
  36. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/set-filter-tab-org.md +3 -0
  37. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/dispatch-service/microservice-dev.md +18 -11
  38. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/dist-lock/dist-lock-basic.md +3 -6
  39. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/mq/mq-subscribe.md +5 -1
  40. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/thread-pool/async-operation.md +10 -6
  41. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/thread-pool/big-task-async.md +4 -2
  42. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/thread-pool/schedule-task.md +9 -7
  43. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/operation-interactive.md +33 -34
  44. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/operation-plugin-events.md +30 -22
  45. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-async-query.md +133 -0
  46. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-batch-query.md +26 -22
  47. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-chart.md +112 -0
  48. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-dataset-assembly.md +200 -0
  49. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-head-filter.md +177 -0
  50. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-hyperlink-drill.md +216 -0
  51. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-list-data-query.md +12 -12
  52. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-merge-column.md +44 -6
  53. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-print-data.md +163 -0
  54. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-row-data-toolbar.md +188 -0
  55. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-subtotal-total.md +139 -0
  56. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-tree-data-query.md +108 -12
  57. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-tree-list.md +181 -0
  58. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/system-service/report-plugin-interface.md +3 -0
  59. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-basedata-cascade-confirm.md +14 -11
  60. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-before-item-validate.md +1 -1
  61. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-build-filter.md +1 -1
  62. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-multi-level-filter.md +11 -11
  63. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-refresh-node.md +22 -15
  64. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-algo.md +2 -2
  65. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-entity-model.md +3 -4
  66. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-exception.md +9 -5
  67. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-orm-access.md +4 -0
  68. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-request-context.md +7 -3
  69. package/skills/cosmic-build/knowledge/cosmic/platform/standards.md +28 -3
  70. package/skills/cosmic-build/references/compile-guide.md +36 -1
  71. package/skills/cosmic-build/references/dcs-code-rules.md +180 -0
  72. package/skills/cosmic-build/references/delivery.md +16 -2
  73. package/skills/cosmic-build/references/execution-contract.md +15 -3
  74. package/skills/cosmic-build/references/java-plugin-delivery.md +21 -11
  75. package/skills/cosmic-build/references/plugin-handoff-input.md +82 -24
  76. package/skills/cosmic-build/references/plugin-runtime-routing.md +23 -6
  77. package/skills/cosmic-build/references/report-filter-contract.md +53 -15
  78. package/skills/cosmic-build/references/sdk-inspection.md +4 -1
  79. package/skills/cosmic-build/references/type-registry.json +26 -17
  80. package/skills/cosmic-build/schemas/data-model-authoring.schema.json +1 -1
  81. package/skills/cosmic-build/scripts/_http_client.py +3 -0
  82. package/skills/cosmic-build/scripts/compile_plugin_source.py +251 -42
  83. package/skills/cosmic-build/scripts/configure_list.py +112 -0
  84. package/skills/cosmic-build/scripts/dcs-rule-catalog.json +799 -0
  85. package/skills/cosmic-build/scripts/dcs_code_gate.py +1976 -0
  86. package/skills/cosmic-build/scripts/execution_binding.py +25 -0
  87. package/skills/cosmic-build/scripts/platform_api_contract.py +352 -7
  88. package/skills/cosmic-build/scripts/plugin_source_gate.py +9 -1
  89. package/skills/cosmic-build/scripts/plugin_target_sdk.py +12 -8
  90. package/skills/cosmic-build/scripts/prepare_plugin_handoff.py +488 -88
  91. package/skills/cosmic-build/scripts/query_plugin_handoff.py +207 -20
  92. package/skills/cosmic-build/scripts/register_plugins.py +27 -10
  93. package/skills/cosmic-build/scripts/render_output_cards.py +57 -20
  94. package/skills/cosmic-build/scripts/resolve_output_path.py +60 -26
  95. package/skills/cosmic-build/scripts/run_java_tests.py +162 -0
  96. package/skills/cosmic-build/scripts/sync_generated_locale_assets.py +28 -0
  97. package/skills/cosmic-build/scripts/test/fixtures/ReportSdkCheck.java +1 -22
  98. package/skills/cosmic-build/scripts/test/fixtures/list_column_property_declarations.json +887 -0
  99. package/skills/cosmic-build/scripts/test/fixtures/operation-entry-field-prepare.java +78 -0
  100. package/skills/cosmic-build/scripts/test/test_add_field_required_contract.py +12 -0
  101. package/skills/cosmic-build/scripts/test/test_batch5_drift_governance.py +23 -2
  102. package/skills/cosmic-build/scripts/test/test_compile_plugin_source.py +287 -4
  103. package/skills/cosmic-build/scripts/test/test_configure_list_delivery.py +132 -0
  104. package/skills/cosmic-build/scripts/test/test_cosmic_sdk_examples.py +58 -1
  105. package/skills/cosmic-build/scripts/test/test_data_model_contract.py +19 -0
  106. package/skills/cosmic-build/scripts/test/test_dcs_code_gate.py +901 -0
  107. package/skills/cosmic-build/scripts/test/test_delivery_stage_boundary.py +1 -1
  108. package/skills/cosmic-build/scripts/test/test_direct_cli_architecture.py +2 -0
  109. package/skills/cosmic-build/scripts/test/test_http_client.py +6 -0
  110. package/skills/cosmic-build/scripts/test/test_java_toolchain_feedback.py +206 -0
  111. package/skills/cosmic-build/scripts/test/test_kd_api.py +21 -0
  112. package/skills/cosmic-build/scripts/test/test_list_configuration_closure.py +184 -0
  113. package/skills/cosmic-build/scripts/test/test_mcp_cli.py +139 -2
  114. package/skills/cosmic-build/scripts/test/test_menu_creation_closure.py +16 -0
  115. package/skills/cosmic-build/scripts/test/test_modeling_input_recovery.py +55 -1
  116. package/skills/cosmic-build/scripts/test/test_open_world_cli_catalog.py +1 -1
  117. package/skills/cosmic-build/scripts/test/test_operation_field_preparation.py +84 -0
  118. package/skills/cosmic-build/scripts/test/test_platform_api_contract.py +322 -1
  119. package/skills/cosmic-build/scripts/test/test_plugin_handoff.py +951 -4
  120. package/skills/cosmic-build/scripts/test/test_plugin_source_gate.py +30 -2
  121. package/skills/cosmic-build/scripts/test/test_plugin_target_sdk.py +21 -0
  122. package/skills/cosmic-build/scripts/test/test_property_reroute.py +165 -0
  123. package/skills/cosmic-build/scripts/test/test_property_schema_first.py +35 -0
  124. package/skills/cosmic-build/scripts/test/test_query_plugin_handoff.py +221 -0
  125. package/skills/cosmic-build/scripts/test/test_register_plugins.py +76 -4
  126. package/skills/cosmic-build/scripts/test/test_render_output_cards.py +75 -3
  127. package/skills/cosmic-build/scripts/test/test_report_business_contract.py +27 -5
  128. package/skills/cosmic-build/scripts/test/test_report_doc_contract_sync.py +103 -11
  129. package/skills/cosmic-build/scripts/test/test_report_plugin_source_gate.py +46 -16
  130. package/skills/cosmic-build/scripts/test/test_report_properties.py +74 -15
  131. package/skills/cosmic-build/scripts/test/test_report_query_data_source.py +3 -1
  132. package/skills/cosmic-build/scripts/test/test_report_sdk_optimization.py +1 -2
  133. package/skills/cosmic-build/scripts/test/test_test_environment.py +76 -1
  134. package/skills/cosmic-build/scripts/test_environment.py +67 -1
  135. package/skills/cosmic-build/skills/cosmic-coding-impl/SKILL.md +52 -10
  136. package/skills/cosmic-build/skills/cosmic-meta-api/apis/ai_meta.md +16 -3
  137. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/report-write-contracts.json +59 -26
  138. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/rule-domain.json +1 -1
  139. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/report-write.schema.json +75 -18
  140. package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/scripts/pdm_auto.py +39 -0
  141. package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/scripts/pdm_client.py +97 -10
  142. package/skills/cosmic-build/skills/cosmic-meta-api/modules/verify/SKILL.md +10 -12
  143. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_apps.py +3 -1
  144. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_formactions.py +38 -29
  145. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_listui.py +400 -233
  146. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_metaops.py +87 -45
  147. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_properties.py +42 -15
  148. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_rules.py +135 -5
  149. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/config.py +1 -1
  150. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/execution_errors.py +1 -1
  151. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/formatters.py +17 -11
  152. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/property_reroute.py +15 -5
  153. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/report_ops.py +1429 -238
  154. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/validators.py +56 -28
  155. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/cosmic_api.py +380 -134
  156. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/field_decorator.py +1 -1
  157. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/meta_export.py +12 -11
  158. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/meta_verifier.py +42 -0
  159. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_add_field_placement_closure.py +8 -8
  160. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_build_configuration_readback.py +94 -0
  161. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_build_receipt_resume.py +47 -1
  162. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_metadata_unchanged_fail_closed.py +87 -0
  163. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_dym_evidence.py +23 -23
  164. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_entity_integrity.py +279 -4
  165. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_field_guard.py +1 -1
  166. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_plugin_contract.py +509 -32
  167. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_readback_derivation.py +178 -1
  168. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_recreate_plan.py +125 -10
  169. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_serve_contract.py +208 -0
  170. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_typed_filters.py +259 -50
  171. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_rule_inventory_perf.py +29 -0
  172. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_rule_write_closure.py +20 -0
  173. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_post_build_recovery.py +18 -0
  174. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_verification_evidence.py +35 -0
  175. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_identity_guard.py +25 -0
  176. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_time_range_rule.py +98 -0
  177. package/skills/cosmic-build/skills/cosmic-meta-knowledge/domain-model/report-model.md +20 -9
  178. package/skills/cosmic-build/skills/cosmic-meta-knowledge/generation/report-modeling-guide.md +55 -25
  179. package/skills/cosmic-build/skills/cosmic-meta-knowledge/property-guides/report-column-properties.md +15 -39
  180. package/skills/cosmic-build/skills/cosmic-meta-modeling/SKILL.md +19 -17
  181. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/SKILL.md +82 -38
  182. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/examples/golden-example-report-batch.md +64 -19
  183. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/examples/golden-example-report-plugin.md +32 -20
  184. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/examples/golden-example-report-tree.md +78 -31
  185. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/report-artifact-schema.json +2 -1
  186. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-companion-fields.md +3 -0
  187. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-list-configuration.md +2 -0
  188. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_contract.py +3 -1
  189. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_emit.py +27 -4
  190. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/report_validator.py +99 -44
  191. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/test_report_examples.py +31 -4
  192. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/test_report_validator.py +129 -29
  193. package/skills/cosmic-build/skills/cosmic-meta-modifier/SKILL.md +6 -2
  194. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/validation.md +2 -0
  195. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/SKILL.md +1 -1
  196. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/report-op/SKILL.md +104 -25
  197. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/SKILL.md +9 -0
  198. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/verify/usage-guide.md +2 -2
  199. package/skills/cosmic-build/skills/cosmic-meta-modifier/references/list-filter-modification.md +39 -12
  200. package/skills/cosmic-build/skills/mcp-server/SKILL.md +39 -24
  201. package/skills/cosmic-build/skills/mcp-server/scripts/mcp_cli.py +20 -6
  202. package/skills/cosmic-dev-best-practices/SKILL.md +1 -1
  203. package/skills/cosmic-dev-best-practices/references/README.md +2 -2
  204. package/skills/cosmic-dev-best-practices/references/basedata-dev-convention.md +2 -2
  205. package/skills/cosmic-dev-best-practices/references/bill-dev-convention.md +4 -4
  206. package/skills/cosmic-dev-best-practices/references/design-document-convention.md +2 -2
  207. package/skills/cosmic-dev-best-practices/references/design-examples/basedata-design-example.md +4 -4
  208. package/skills/cosmic-dev-best-practices/references/design-examples/bill-design-example.md +13 -13
  209. package/skills/cosmic-dev-best-practices/references/elements/CustomerField.md +1 -1
  210. package/skills/cosmic-dev-best-practices/references/elements/README.md +1 -1
  211. package/skills/cosmic-dev-best-practices/references/elements/SupplierField.md +1 -1
  212. package/skills/cosmic-dev-best-practices/references/elements/common-field-property-conventions.md +109 -13
  213. package/skills/cosmic-dev-best-practices/references/layout-control-convention.md +1 -1
  214. package/skills/erp-analysis/references/delivery-contract.md +2 -1
  215. package/skills/erp-analysis/templates/AGENTS.template.md +3 -1
  216. package/skills/cosmic-build/assets/platform-report-filters/TypedReportFilterFields.java +0 -169
  217. package/skills/cosmic-build/assets/platform-report-filters/platform.patch +0 -98
  218. 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`,只有带左树的模板才有。普通报表上该写入会被拒绝、整次 run 失败,所以
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
- 这个段**最后**应用,在过滤条件之后。这个顺序正是要点:`setReportFilters` 把 `ShowFilterFields` 写成
127
- 运行时无法解析的逗号拼接串,因此在这里声明字段列表,才能让新建出来的报表带上 JSON 数组形态。不声明
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
- 报表,由 `skills/cosmic-meta-modifier/modules/report-op` 用 `planReportRecreate` 规划——不可逆且会丢掉
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.splitByGroup` + `topBy` + `union`,见
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
- - 报表列展现仍通过插件契约和已核验的 ReportColumnFactory 完成。
190
- - `reportFilters[].source = {formNumber, fieldKey}` 使用 `ReportFilters.typed` 从准确来源字段创建原生控件。
191
- CLI 读取来源类型、引用、枚举及数字/日期配置,保存后独立回读报表配置,并与重新读取的来源比较。
192
- 日期 `between` 使用 DateRangeField。此能力需要 `assets/platform-report-filters/` 中的平台扩展;
193
- 旧平台在类型化写入前拒绝,不静默回退成 TextField。未支持的专用类型、组织和条件引用依赖明确失败。
194
- 未声明 source 时,旧比较符驱动的控件行为仍按部署版本核验。控件类型不证明过滤生效,`compare` 仍是查询要求。
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` 绑定指向的是**另一个已声明列**的 `fieldKey`,所以那一列也要
205
- 声明出来 —— `fieldType: bigint`、`hide: true`、`fieldKey` 等于它自己的 `dateIndex`。平台按列清单
206
- 构建报表的运行期实体、并按 `fieldKey` 打包行数据,所以指向一个没有任何列拥有的名字什么都解析不到;
207
- `R-presentation-binding` 会直接拒绝该 Artifact,而不是交付一张没有币别的报表。让目标列的
208
- `fieldKey` 与 `dateIndex` 相等,可使同一份 Artifact 在该参数的两种读法下都成立 —— 这也是这件事
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
- `<InitField>` 证明 `reportSorts`,`<ReportQueryPlugin>` 证明 `reportPlugins`,
229
- `unverifiableSections` 相应缩小。它还能证明每个过滤控件上的 `mustInput` 与 `visible` —— 因为
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` 或 `reportProperties.pluginExts`),app-build
257
- 就无需询问地进入 `references/java-plugin-delivery.md`:把报表 Artifact 与 run 结果交给
258
- `prepare_plugin_handoff.py`,随后在回复结束前完成源码生成、窄编译、注册与插件读回。
259
- 编译器自己解析 Java 模块根;只有它返回 `PLUGIN_WORKSPACE_UNRESOLVED` 时才允许问一个
260
- 关于 Java 模块根的问题。禁止在 `run` 之后以「下一步:Java 源码」式的总结结束本轮,也
261
- 禁止凭自己对工作区的查看去询问 Java 项目或编译器位置;
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()` 覆写上。下面这份 Artifact 就是一份普通的报表 Artifact —— 这恰恰是重点。
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。日期过滤还声明了 `mustInput: true`,而被测部署不落地这一项 —— 见下面编译出的契约。
142
+ 列元素撞 key。仓库过滤声明了自己的控件 —— 基于 `bd_warehouse` 的仓库选择,用户选仓库而不是手输;
143
+ 未安装类型化报表过滤补丁的平台会改为渲染文本框,run 把该过滤报告为降级而不是失败。日期过滤还声明了
144
+ `mustInput: true`,只有已安装补丁的平台才会落地这一项 —— 见下面编译出的契约。
137
145
 
138
146
  ## 编译出的插件契约
139
147
 
140
- `run` 会写出 `{appRoot}/_runtime/kdtest_inv_ledger_rpt.report-plugin-contract.json`,再由
141
- `prepare_plugin_handoff` 以 `handoff.reportContract` 转交。以下为节选 —— 每种 kind 只留一条展现
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` 是一个隐藏列,被三个数量列共同绑定,所以它的类型条目会把三者都列在 `requiredBy` 里。一个
179
- 绑定目标可以服务任意多个格式化列,所以没有理由声明三次 —— 但也没有办法省掉它:绑定指向的是某个已声明
180
- 列的 `fieldKey`,而平台是按列清单构建运行期实体的。插件必须自己拒绝空的 `flt_biz_date`,因为元数据的
181
- `mustInput` 没有落地。
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` 返回分批键并配置批量大小;随后 `query` 会被逐批调用,并用当前批次的行收窄自己的
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 int COUNT_PER_BATCH = 10000;
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
- ORM orm = ORM.create();
205
- DataSet keys = orm.queryDataSet(ALGO_NAME, ENTITY_NUMBER, "billno",
206
- filtersOf(queryParam), queryParam.getSortInfo(), 100000000, null);
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("billno", QCP.in, billNos));
264
+ filters.add(new QFilter(BILL_NO, QCP.in, billNos));
223
265
  }
224
266
  // DataSet 列名必须与每个 dateIndex 相等,包括 unit_id。
225
- return ORM.create().queryDataSet(ALGO_NAME, ENTITY_NUMBER,
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[0]), queryParam.getSortInfo());
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
- > 每张报表都由插件驱动:报表元数据声明展现,取数插件返回数据行。本示例展示完整 Artifact,以及
4
- > 它的列标识如何与插件构建的 DataSet 挂接。
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` → 销售组织(`in`)和期间(`between`)两个控件。期间过滤的 key 是
120
- `flt_period` 而不是 `period`:控件以自己的 key 作为元素 key,而展示列已经占用了 `period`。
121
- 插件从 `ReportQueryParam.getFilter()` 读 `flt_period`,再作用到该列。
122
- 4. `setReportSorts` → 先 `period desc`,再 `org_name asc`
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` 是一个已声明的列,不是游离的 DataSet 列。币别绑定指向的是另一个报表列的
183
- `fieldKey`:平台按列清单构建运行期实体、并按 `fieldKey` 打包行数据,所以指向一个没有任何列拥有的
184
- 名字什么都解析不到。这就是它被声明为 `bigint` + `hide: true` 的原因 —— 对平台可见,对用户不可见 ——
185
- 也是契约把它标为 `requiredBy: ["revenue"]` 的原因。它看起来可以删,其实不能。
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
- 在 `getColumns()` 里用契约给出的工厂调用绑定展现 —— 这些签名有文档,而多数
195
- `ReportColumn.TYPE_*` 常量名没有。注意递归:`ReportColumnGroup` 是 `AbstractReportColumn` 但不是
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` 已注册到报表取数插件位