@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
package/skills/cosmic-dev-best-practices/references/elements/common-field-property-conventions.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 📌 本文件为 **elements/ 元素文档的公共属性规范**(横切规则,适用于所有字段类型);元素专属最佳实践见各元素文档(索引 [elements/README.md](README.md))。
|
|
4
4
|
|
|
5
|
-
> 用途:苍穹开发**字段创建后的常规属性设置规范**——每个字段除了命名(见 [naming-convention.md](../naming-convention.md))与类型(见 cosmic-meta-knowledge `field-types.md`)外,还需设置哪些**常规属性**(必填/锁定/默认值/ViewDetail
|
|
5
|
+
> 用途:苍穹开发**字段创建后的常规属性设置规范**——每个字段除了命名(见 [naming-convention.md](../naming-convention.md))与类型(见 cosmic-meta-knowledge `field-types.md`)外,还需设置哪些**常规属性**(必填/锁定/默认值/ViewDetail/列表列/容量等)。
|
|
6
6
|
> 适用范围:**单据与基础资料通用**(开发任何业务对象)。
|
|
7
7
|
> 依据:2026-08-25 出口合同 `sd_excontract` 全字段属性走查实测 + 过磅单 `sd_weighingbill` 对照 + 既有最佳实践文档。
|
|
8
8
|
> 配套:[naming-convention.md](../naming-convention.md)(命名)、[bill-dev-convention.md](../bill-dev-convention.md)(单据流程)、[basedata-dev-convention.md](../basedata-dev-convention.md)(基础资料流程)、[cosmic-meta-api.md](../cosmic-meta-api.md)(API 写法)。
|
|
@@ -23,11 +23,28 @@
|
|
|
23
23
|
|---|------|---------|---------|
|
|
24
24
|
| A | 必填 MustInput | 业务关键字段 | buildMeta authoring `mustInput` / addField `--required` |
|
|
25
25
|
| B | 锁定 Lock(form 层) | **单据头 / 分录字段**(按类别) | `setProperties --policy`(form 层才生效) |
|
|
26
|
-
| C | ViewDetail(查看详情) | **用户字段**(创建/修改/审核/关闭/作废人等) | `setProperties
|
|
27
|
-
| D | 默认值 DefValue | 状态/数值/布尔字段 | `setProperties
|
|
26
|
+
| C | ViewDetail(查看详情) | **用户字段**(创建/修改/审核/关闭/作废人等) | `setProperties --policy`(兼容 `--elementKey --input`) |
|
|
27
|
+
| D | 默认值 DefValue | 状态/数值/布尔字段 | `setProperties --policy` 的 `defaultsByField`(兼容 `--elementKey --input`) |
|
|
28
28
|
| E | 列表列 | 列表视图 | `modifyMeta remove listcolumn`(移除审计/状态列) |
|
|
29
|
+
| G | 字段容量 MaxLength | 文本 / 多行 / 大文本字段 | `setProperties --policy`(或 `--elementKey/--input`),见 §G |
|
|
29
30
|
|
|
30
31
|
> 其余字段属性(样式/显隐/条件过滤/状态列表)见各流程文档:样式→cosmic-meta-api §2.2;状态列表→bill-dev §4.1(无 API 手工配置);条件必录→bill-dev §六(手工配置)。
|
|
32
|
+
>
|
|
33
|
+
> 📌 **按字段类型的必设属性索引**(值只维护在 `elements/<类型>.md` §一,此处仅索引):
|
|
34
|
+
>
|
|
35
|
+
> | 字段类型 | `OrgFieldId=MwLyMGIJQa` | `ViewDetail=false` | `QuickAddNew=false` | 其他必设项 |
|
|
36
|
+
> |---|:---:|:---:|:---:|---|
|
|
37
|
+
> | `BasedataField` | ✅ | ✅ | ✅ | — |
|
|
38
|
+
> | `CurrencyField` | ✅ | ✅ | ✅ | 必填 + 缺省=人民币 |
|
|
39
|
+
> | `CustomerField`/`SupplierField`/`MaterielField` | ✅ | ✅ | ✅ | — |
|
|
40
|
+
> | `UnitField` | ✅ | —(未要求) | ✅ | 同实体有物料字段时关联 `MaterielFieldId` |
|
|
41
|
+
> | `OrgField` | 自身即组织 | ✅ | ✅ | 「主业务组织」**无 CLI**,设计器指定;模板未设必填 |
|
|
42
|
+
> | `UserField` | — | ✅ | ✅ | 制单/审计类全锁 `new,edit,submit,audit` |
|
|
43
|
+
> | `AssistantField` | ✅ | ⚠️ **true(可保留)** | ✅ | 建模用 `assistantCategory`,禁 `basedataNumber` |
|
|
44
|
+
> | `FlexField` | — | —(未要求) | ✅ | `flexType` > 0,否则降级 TextField |
|
|
45
|
+
> | `BasedataPropField` | — | —(未要求) | ✅ | `RefBaseFieldId` + `RefDisplayProp`;全锁 |
|
|
46
|
+
>
|
|
47
|
+
> ⚠️ **不要概括成"引用类字段一律 false"**:`AssistantField` 的 ViewDetail 保留 `true`,`UnitField`/`FlexField`/`BasedataPropField` 的 ViewDetail 各文档**未要求**——以本表与元素文档为准;§C 只讲 ViewDetail 的通用判断。
|
|
31
48
|
|
|
32
49
|
---
|
|
33
50
|
|
|
@@ -87,7 +104,7 @@
|
|
|
87
104
|
| 制单字段(创建/修改人+时间) | `new,edit,submit,audit` | 同上 | creator/modifier/createtime/modifytime |
|
|
88
105
|
| 单据状态 billstatus | `new,edit,submit,audit` | 状态流转框架控制 | billstatus |
|
|
89
106
|
| 状态字段 closestatus/cancelstatus | `new,edit,submit,audit` | 状态列表自动写入 | closestatus/cancelstatus |
|
|
90
|
-
| **自动计算字段(金额族/带出字段)** | `submit,audit,new,edit` | 编辑期只读防篡改(金额族;**不含单价 price/priceandtax——单价是用户录入,锁 `submit,audit`,见
|
|
107
|
+
| **自动计算字段(金额族/带出字段)** | `submit,audit,new,edit` | 编辑期只读防篡改(金额族;**不含单价 price/priceandtax——单价是用户录入,锁 `submit,audit`,见 [PriceField.md](PriceField.md)**) | totalamount/totaltaxamount/totalallamount、amount/taxamount/amountandtax/curamount/curtaxamount/curamountandtax、materialname/model |
|
|
91
108
|
| 普通业务字段 | `submit,audit` | 编辑期可改,提交/审核后锁定 | customer/port_of_loading/qty/price/trade_terms 等 |
|
|
92
109
|
|
|
93
110
|
**命令**(form 层,单字段与整批同一形状):
|
|
@@ -101,7 +118,20 @@
|
|
|
101
118
|
> 写入**已生效**,但回执必报 `STATIC_FIELD_LOCK_READBACK_MISMATCH` / `outcome=unknown_after_write` / `actual:{"<字段>":""}`——
|
|
102
119
|
> 原因是平台元数据**省略"等于默认值"的 Lock 属性**,CLI 回读拿不到。**这不是失败**:用 `getFormSchema` 的 `formLayout.lock` 复核(会显示 `submit,audit`),**不要重试**。
|
|
103
120
|
> 其它任意取值(含 `new,edit,submit,audit`)回执均为 `status=true` / `verified=true`。
|
|
104
|
-
> 📌
|
|
121
|
+
> 📌 **字段(`FieldAp`)的 Lock 只走 `--policy`**:`setProperties --elementKey <字段key> --input '{"Lock":…}'` 恒报 `PROPERTY_READ_ONLY`(模板字段同样被拒)。
|
|
122
|
+
> **容器控件相反**——面板/单据体/附件面板仍走 `--elementKey <控件> --input`(见本节开头),**不能**把这两条互相套用。
|
|
123
|
+
|
|
124
|
+
**Lock 实测矩阵(2026-11-06,`sd_paymentbill3` 实测)**:
|
|
125
|
+
|
|
126
|
+
| 对象 | 路径 | 值 | 结果 |
|
|
127
|
+
|---|---|---|---|
|
|
128
|
+
| 字段 | `--policy` | `new,edit,submit,audit` | ✅ `verified=true`(批量 40 字段通过) |
|
|
129
|
+
| 字段 | `--policy` | 含 `view` | ❌ `PROPERTY_POLICY_ENUM_VALUE_INVALID`(allowed=`new/edit/submit/audit`) |
|
|
130
|
+
| 字段 | `--policy` | `submit,audit` | ⚠️ 回执 `STATIC_FIELD_LOCK_READBACK_MISMATCH` / `outcome=unknown_after_write`,但**写入真实生效**(`formLayout.lock` 回读已变)→ **不要重试** |
|
|
131
|
+
| 字段 | `--elementKey/--input` | 任意 | ❌ `PROPERTY_READ_ONLY` |
|
|
132
|
+
| 容器 | `--elementKey/--input` | `view,submit,audit` 或 4 值 | ✅ `verified=true`、`lock` 回读一致 |
|
|
133
|
+
|
|
134
|
+
> ⚠️ **`view` 只属于容器**:字段只认 4 个值。线上既有单据的**字段** `formLayout.lock` 常显示 `new,edit,view,submit,audit`(历史值),**照抄到新字段会被 CLI 拒绝**——这不是"线上能写所以技能写错了",而是历史数据不可作为取值依据。
|
|
105
135
|
|
|
106
136
|
> ⭐ **状态字段类型(closestatus/cancelstatus)——最终形态「单据状态」BillStatusField(2026-08-25 用户确认)**:
|
|
107
137
|
> - **标准类型 = BillStatusField(单据状态)**——khxty 现有单据 dym 实测全部如此:`sd_returnapp` 4 个、`sd_conord` 8 个、`sd_executeorder` 5 个、`sd_conpur` 7 个 `<BillStatusField>`(含 StatusItems 状态列表 + `DefValue=A`);
|
|
@@ -117,12 +147,18 @@
|
|
|
117
147
|
| 制单/审计面板的用户字段(创建/修改/审核/关闭/作废人) | **`ViewDetail=false`**(默认 true,F7 弹窗显示"查看详情"入口,系统审计字段无需) | creator/modifier/auditor/closer/canceler |
|
|
118
148
|
| 业务引用用户字段(如经办人) | 保持 true(可选) | — |
|
|
119
149
|
|
|
120
|
-
|
|
150
|
+
**命令**(新请求优先用 compact policy;`--elementKey/--input` 为兼容旧写法):
|
|
121
151
|
```bash
|
|
152
|
+
# ✅ 首选
|
|
153
|
+
{cosmic_api} setProperties --app-root <appRoot> --form-name <表单> \
|
|
154
|
+
--policy '{"targets":{"fields":["<用户字段>"],"entities":["header"]},"set":{"ViewDetail":false}}'
|
|
155
|
+
# 兼容旧写法(仍可用)
|
|
122
156
|
{cosmic_api} setProperties --app-root <appRoot> --formNumber <表单> \
|
|
123
157
|
--elementKey <用户字段key> --input '{"ViewDetail": false}'
|
|
124
158
|
```
|
|
125
159
|
|
|
160
|
+
> 📌 `QuickAddNew`(快速新增)与 ViewDetail **成对处理**:凡 §〇 索引表标 ✅ 的类型,同一批 policy 一起写(`"set":{"ViewDetail":false,"QuickAddNew":false}`);`AssistantField` 的 ViewDetail 保留 `true`,只关 `QuickAddNew`。
|
|
161
|
+
|
|
126
162
|
---
|
|
127
163
|
|
|
128
164
|
## D、默认值(DefValue)
|
|
@@ -134,8 +170,12 @@
|
|
|
134
170
|
| 布尔字段(含税等) | `false` | 框架默认 | ✅(istax) |
|
|
135
171
|
| 下拉字段(贸易术语/付款条件) | 无默认(用户必选) | 或按业务设常用值 | trade_terms/payment_terms |
|
|
136
172
|
|
|
137
|
-
|
|
173
|
+
**命令**(新请求优先用 compact policy 的 `defaultsByField`;`--elementKey/--input` 为兼容旧写法):
|
|
138
174
|
```bash
|
|
175
|
+
# ✅ 首选:静态值 / 设计缺省值(函数)/ 引用记录,一次批量
|
|
176
|
+
{cosmic_api} setProperties --app-root <appRoot> --form-name <表单> \
|
|
177
|
+
--policy '{"targets":{"fields":["<字段>"],"entities":["header"]},"defaultsByField":{"<字段>":"<静态值>","<日期字段>":{"kind":"design","input":{"FuncType":"getToday","FuncParameter":"#CurrentDate#"}},"<币别字段>":{"kind":"record","value":"人民币"}}}'
|
|
178
|
+
# 兼容旧写法(仍可用;`DefValueDesign` 不得编码静态标量)
|
|
139
179
|
{cosmic_api} setProperties --app-root <appRoot> --formNumber <表单> \
|
|
140
180
|
--elementKey <字段key> --input '{"DefValue": "A"}'
|
|
141
181
|
```
|
|
@@ -159,21 +199,77 @@
|
|
|
159
199
|
|
|
160
200
|
---
|
|
161
201
|
|
|
162
|
-
## G
|
|
202
|
+
## G、字段容量(MaxLength)
|
|
203
|
+
|
|
204
|
+
> ⭐ **取值优先级(总则,与 §〇 一致)**:
|
|
205
|
+
> 1. **设计文档指定了长度 → 按设计文档设置**——大于或小于类型默认都照设;设计若用列宽表达平台约束(如 `body` ≤127),不要擅自放宽成 255;
|
|
206
|
+
> 2. **设计文档未指定 → 用类型默认,不设**(本库约定「不做长度批次」)。
|
|
207
|
+
>
|
|
208
|
+
> 判据:`getFormSchema` **不返回** MaxLength。唯一权威是**导出 DYM 的 `<MaxLength>`**(= 建表列宽)。
|
|
209
|
+
> 下表为 **2026-11-06 建模路径新建表单的实测产出**(`sd_paymentbill3`),**仅在设计未指定时**作为缺省依据:
|
|
210
|
+
|
|
211
|
+
| 类型 | 建模产出(显式) | 平台内建默认(属性省略时) | 说明 |
|
|
212
|
+
|---|---|---|---|
|
|
213
|
+
| `TextField` | **255** | **50** | 建模路径显式写 255;显式设成 50 时属性被省略,有效值即 50 |
|
|
214
|
+
| `TextAreaField` | **500** | — | 多行文本的默认值 |
|
|
215
|
+
| `LargeTextField` | **2000** | — | 大文本;全文落库里的 **`_tag` 伴随列(NCLOB)**,主列只放摘要(本库 `notifyraw` 即此用法;DYM 里看不到伴随列属正常) |
|
|
216
|
+
|
|
217
|
+
- **可写(2026-11-06 实测)**:两条路径都生效、`verified=true`,导出 DYM 复核一致——
|
|
218
|
+
`setProperties --policy '{"targets":{"fields":["<字段>"],"entities":["header"]},"set":{"MaxLength":1000}}'`
|
|
219
|
+
或 `setProperties --elementKey <字段key> --input '{"MaxLength":1000}'`;
|
|
220
|
+
`describePropertyInput --propertyNames MaxLength` 报 `editable=true`、范围 **0–2000**。
|
|
221
|
+
⚠️ 旧记录「MaxLength 不在属性表 / 必报 `META_SAVE_FAIL` / 只能建表时定」**已过期**,不要再据此跳过长度设置。
|
|
222
|
+
- ⚠️ **DYM 缺 `<MaxLength>` ≠ 没写进去**(2026-11-06 实测):平台会**省略"等于内建默认"的属性**——`TextField` 显式设 **50** 后,导出 DYM 里该字段不再出现 `<MaxLength>`,但值确实生效(与 §B 里 Lock 写 `submit,audit` 的假阴性同源)。**验证时把"缺失"读成 50**,不要按"未生效"重试。
|
|
223
|
+
- ⚠️ **别拿既有单据反推类型默认**:`qrcodeurl` 在 `sd_paymentbill` 是 **1000**(曾显式设过),新建同名字段却得 **500**——默认值只能取「新建产出」。
|
|
224
|
+
- 📌 **例**:设计写 `body` ≤127 → **就设 127**(即便类型默认 255 装得下);设计没写 → 保持 255 不动。
|
|
225
|
+
- ⚠️ **列宽 ≠ 值上限**:平台对值的上限(如微信 `attach`/`body` ≤127)通常还应由**代码**校验兜住;列宽不足会**静默截断**(对账标识类字段尤其危险),故设计未指定的平台返回值类字段宁可给足 255。
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## H、走查顺序(字段属性核对清单)
|
|
163
230
|
|
|
164
231
|
新建/重建表单后,按此顺序逐字段核对:
|
|
165
232
|
|
|
166
233
|
1. **必填**:设计文档必填标注 → mustInput(authoring/addField)
|
|
167
234
|
2. **锁定**:按字段类别设 form 层 Lock(见 B 表)——审计/制单/状态全锁,自动计算含 new,edit,业务字段 submit,audit
|
|
168
|
-
3. **ViewDetail
|
|
235
|
+
3. **ViewDetail / QuickAddNew / OrgFieldId**:按 §〇 索引表逐类型处理(`AssistantField` 的 ViewDetail 保留 `true`)
|
|
169
236
|
4. **默认值**:billstatus='A',数值 0,布尔 false
|
|
170
|
-
5.
|
|
171
|
-
6.
|
|
172
|
-
7.
|
|
173
|
-
8.
|
|
237
|
+
5. **容量**:设计指定了长度 → 按设计设置;未指定 → 保持类型默认、不设(见 §G)
|
|
238
|
+
6. **列表列**:移除审计/状态族列
|
|
239
|
+
7. **面板归位**:字段移动到对应面板(见 bill-dev §二、basedata-dev §四)
|
|
240
|
+
8. **面板可折叠**:新建 FieldsetPanelAp 设 `Collapsible=true`(通用布局规范,bill-dev §2.1)
|
|
241
|
+
9. **引用/带出**:BasedataField 引用目标、带出字段 SrcField 路径(见 cosmic-meta-api §3.1.1、bill-dev §六)
|
|
174
242
|
|
|
175
243
|
---
|
|
176
244
|
|
|
245
|
+
## 附录:F 系列编号对照(历史引用可解析)
|
|
246
|
+
|
|
247
|
+
> 原「F.1–F.19 字段属性细则」已按元素类型迁入 `elements/`,本文档改为 〇/A–E/G 小节;
|
|
248
|
+
> 但本技能内(design-examples、bill-dev 等)与**外部项目设计文档**仍以 `F.x` 引用,按下表解析。
|
|
249
|
+
|
|
250
|
+
| 原编号 | 现位置 | 内容 |
|
|
251
|
+
|---|---|---|
|
|
252
|
+
| F.1 | [OrgField.md](OrgField.md) | 主业务组织(单据=`org`/基础资料=`createorg`) |
|
|
253
|
+
| F.2 | 本文 §〇·二 | 系统字段类型(`billtype`/`paystatus` 等 agent 不创建) |
|
|
254
|
+
| F.3 | [CustomerField.md](CustomerField.md) | 客户字段 |
|
|
255
|
+
| F.4 | [BasedataField.md](BasedataField.md) | 引用类字段(使用组织/查看详情/快速新增) |
|
|
256
|
+
| F.5 | [DateTimeField.md](DateTimeField.md) | 必录日期缺省=当天(`getToday`/`#CurrentDate#`) |
|
|
257
|
+
| F.6 | [SupplierField.md](SupplierField.md) | 供应商字段 |
|
|
258
|
+
| F.7 | [PriceField.md](PriceField.md) | 金额相关(现存文档无 F.7 引用、无迁移记录;金额族锁定见 §B) |
|
|
259
|
+
| F.8 | [BasedataPropField.md](BasedataPropField.md) | 基础资料属性字段(创建通道限制) |
|
|
260
|
+
| F.9 | [UnitField.md](UnitField.md) | 计量单位 |
|
|
261
|
+
| F.10/F.11 | [QtyField.md](QtyField.md) | 数量字段/基本单位数量 |
|
|
262
|
+
| F.12 | [CurrencyField.md](CurrencyField.md) | 币别(必录 + 缺省人民币) |
|
|
263
|
+
| F.13 | [PriceField.md](PriceField.md) | 单价(用户录入,锁 `submit,audit`,**不含**金额族) |
|
|
264
|
+
| F.14 | [ExchangeRateField.md](ExchangeRateField.md) | 汇率 5 项配套必录 |
|
|
265
|
+
| F.15 | [AssistantField.md](AssistantField.md) | 辅助资料 |
|
|
266
|
+
| F.16 | [DateTimeField.md](DateTimeField.md) | 长日期(`getNow`/`#CurrentDatetime#`) |
|
|
267
|
+
| F.17 | [UserField.md](UserField.md) | 用户字段(ViewDetail 等) |
|
|
268
|
+
| F.18 | [CreaterField.md](CreaterField.md) | 创建/修改人(框架写入 + 全状态锁定) |
|
|
269
|
+
| F.19 | [FlexField.md](FlexField.md) | 弹性域 |
|
|
270
|
+
|
|
271
|
+
> 📌 **新写的设计文档不要再引用 `F.x`**——改引现行锚点:必填 §A、锁定 §B、ViewDetail §C、默认值 §D、列表列 §E,类型专属规则见 `elements/<类型>.md`。
|
|
272
|
+
|
|
177
273
|
## 相关文档
|
|
178
274
|
|
|
179
275
|
- [naming-convention.md](../naming-convention.md):字段命名规范(fieldKey/列名/类型)
|
|
@@ -138,7 +138,7 @@ advconap(商品明细 高级容器)← contentpanel 子容器,带标题
|
|
|
138
138
|
|---|------|-----|------|
|
|
139
139
|
| 1 | **Lock** | 按字段类别(见 field-property §B)| **form 层才生效**(FieldAp/EntryFieldAp)|
|
|
140
140
|
| 2 | Visible | `init,new,edit,view,submit,audit` | 默认全状态可见 |
|
|
141
|
-
| 3 | **FireUpdEvt 即时触发值更新** | `true`(联动字段)| 汇率/币种等字段更新后联动(见
|
|
141
|
+
| 3 | **FireUpdEvt 即时触发值更新** | `true`(联动字段)| 汇率/币种等字段更新后联动(见 [ExchangeRateField.md](elements/ExchangeRateField.md) 汇率规范)|
|
|
142
142
|
| 4 | ~~Hidden~~ / **Invisible** | 只用 `Invisible` | ⚠️ **`Hidden` 已废弃**:设计器已移除该入口,它属历史内部属性「设计时隐藏」,**禁止写入或自动探测 `Hidden`**(0.0.299 口径,附工单 BT-02386052)。隐藏字段一律用 `invisible` |
|
|
143
143
|
|
|
144
144
|
**命令**:
|
|
@@ -64,7 +64,7 @@ present(files=[{path, description}])
|
|
|
64
64
|
|
|
65
65
|
## 四. 版本锚点与复验
|
|
66
66
|
|
|
67
|
-
- **依据版本**:`@deepseek-ai/dsh-desktop-runtime 0.2.
|
|
67
|
+
- **依据版本**:`@deepseek-ai/dsh-desktop-runtime 0.2.2-rc.1`(2026-11-06 复核)
|
|
68
68
|
- **复验触发**:DSH / preset 升级后
|
|
69
69
|
- **复验方法**:确认 `present` 工具仍在工具清单中、且调用后回复下方出现交付卡片。
|
|
70
70
|
两者任一不成立 → 按实际情况改版本文(判断依据见文末附录)。
|
|
@@ -76,6 +76,7 @@ present(files=[{path, description}])
|
|
|
76
76
|
| 2026-09-25 | 0.1.7-rc.2 | 新建。交付手段定为 `present`;移除了旧版「靠文件操作换取可点入口」的整套描述 |
|
|
77
77
|
| 2026-10-19 | 0.2.1-rc.2 | 复验:`present` 仍在官方 standard 组合中(29 行中的第 27 行)→ **契约内容不变**,仅前移版本锚点 |
|
|
78
78
|
| 2026-10-29 | 0.2.1-rc.3 | 复验:`@deepseek-ai/dsh-tool-present` 包仍在;`dsh-web-app/presets/standard.patch.yml` 仍挂载 `present`,**且 cosmic preset 自身另有一份显式声明**(`agent.cordis.yml` / `cordis.patch.yml`)→ 双保险,DSH 与 preset 任一侧改动都不会单独让它消失;本会话工具清单实测可用 → **契约内容不变**,仅前移版本锚点 |
|
|
79
|
+
| 2026-11-06 | 0.2.2-rc.1 | 复验:`standard.patch.yml` 已扩到 131 行,`- id: present` / `@deepseek-ai/dsh-tool-present` 仍在(L124–125);cosmic preset 自身仍显式声明(`agent.cordis.yml` L238 / `cordis.patch.yml` L251);本会话工具清单可用 → **契约内容不变**,仅前移版本锚点。同版还同步了 0.2.2 的组合调整(`applyPatch: false`、移除 `tool-subagent-list-agents`、`modelSelection`/`modelDiscovery` 取代 `modelSelectionSettings`) |
|
|
79
80
|
|
|
80
81
|
---
|
|
81
82
|
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
- macOS/Linux:`{VENV}/bin/python`
|
|
15
15
|
- Windows:`{VENV}/Scripts/python.exe`
|
|
16
16
|
|
|
17
|
+
> 📌 技能文本里的 `{python}` 即上述 `{VENV}` 解释器;技能若给出 `python3`/`python` 的探测顺序,不适用。
|
|
18
|
+
|
|
17
19
|
> 首次使用、或 `$DSH_HOME/cache/cosmic/venv` 被删后,需初始化:
|
|
18
20
|
> macOS/Linux `bash {PRESET}/skills/erp-analysis/scripts/init-python.sh`;
|
|
19
21
|
> Windows `pwsh {PRESET}/skills/erp-analysis/scripts/init-python.ps1`。
|
|
@@ -57,7 +59,7 @@
|
|
|
57
59
|
- 完整契约(降级链、判断依据、版本锚点):
|
|
58
60
|
`{PRESET}/skills/erp-analysis/references/delivery-contract.md`
|
|
59
61
|
|
|
60
|
-
> 版本锚点:`@deepseek-ai/dsh-desktop-runtime 0.2.
|
|
62
|
+
> 版本锚点:`@deepseek-ai/dsh-desktop-runtime 0.2.2-rc.1`(2026-11-06 复核)。
|
|
61
63
|
> DSH / preset 升级后若 `present` 消失或交付卡片不再出现,回到该契约文件复验。
|
|
62
64
|
|
|
63
65
|
<!-- 后续按需补充:元数据建模等约定 -->
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
package kd.bos.designer.property.setting;
|
|
2
|
-
|
|
3
|
-
import kd.bos.metadata.entity.commonfield.DecimalField;
|
|
4
|
-
import kd.bos.metadata.entity.commonfield.TextField;
|
|
5
|
-
import kd.bos.metadata.entity.commonfield.Field;
|
|
6
|
-
import kd.bos.metadata.entity.commonfield.DateTimeField;
|
|
7
|
-
import kd.bos.metadata.entity.commonfield.DateRangeField;
|
|
8
|
-
import kd.bos.metadata.entity.commonfield.ComboField;
|
|
9
|
-
import kd.bos.metadata.entity.commonfield.ComboItem;
|
|
10
|
-
import kd.bos.metadata.entity.businessfield.AbstractBasedataField;
|
|
11
|
-
import kd.bos.metadata.entity.EntityMetadata;
|
|
12
|
-
import kd.bos.metadata.form.FormMetadata;
|
|
13
|
-
import kd.bos.metadata.form.ControlAp;
|
|
14
|
-
import kd.bos.metadata.form.control.FieldAp;
|
|
15
|
-
|
|
16
|
-
import java.util.ArrayList;
|
|
17
|
-
import java.util.LinkedHashMap;
|
|
18
|
-
import java.util.List;
|
|
19
|
-
import java.util.Map;
|
|
20
|
-
import java.io.ByteArrayInputStream;
|
|
21
|
-
import java.io.ByteArrayOutputStream;
|
|
22
|
-
import java.io.ObjectInputStream;
|
|
23
|
-
import java.io.ObjectOutputStream;
|
|
24
|
-
|
|
25
|
-
/** Platform extension for ReportFilters.typed; no service writes or identity lookup here. */
|
|
26
|
-
public final class TypedReportFilterFields {
|
|
27
|
-
private TypedReportFilterFields() { }
|
|
28
|
-
|
|
29
|
-
public static Field<?> create(Field<?> source, String compare) {
|
|
30
|
-
if (source == null) throw new IllegalArgumentException("REPORT_FILTER_SOURCE_FIELD_NOT_FOUND");
|
|
31
|
-
if (!java.util.Arrays.asList("TextField", "DateField", "DateTimeField", "DateRangeField", "ComboField",
|
|
32
|
-
"MulComboField", "BasedataField", "MulBasedataField", "DecimalField").contains(source.getClass().getSimpleName()))
|
|
33
|
-
throw new IllegalArgumentException("REPORT_FILTER_SOURCE_TYPE_UNSUPPORTED: " + source.getClass().getSimpleName());
|
|
34
|
-
Field<?> result;
|
|
35
|
-
if ("13".equals(compare) && !(source instanceof DateRangeField)) {
|
|
36
|
-
if (!(source instanceof DateTimeField)) {
|
|
37
|
-
throw new IllegalArgumentException("REPORT_FILTER_RANGE_TYPE_UNSUPPORTED: " + source.getClass().getSimpleName());
|
|
38
|
-
}
|
|
39
|
-
DateRangeField range = new DateRangeField();
|
|
40
|
-
range.setRegionType(((DateTimeField) source).getRegionType());
|
|
41
|
-
range.setTimeZoneTransType(((DateTimeField) source).getTimeZoneTransType());
|
|
42
|
-
result = range;
|
|
43
|
-
} else {
|
|
44
|
-
try {
|
|
45
|
-
result = source.getClass().getDeclaredConstructor().newInstance();
|
|
46
|
-
} catch (ReflectiveOperationException error) {
|
|
47
|
-
throw new IllegalArgumentException("REPORT_FILTER_SOURCE_TYPE_UNSUPPORTED", error);
|
|
48
|
-
}
|
|
49
|
-
if (source instanceof AbstractBasedataField) {
|
|
50
|
-
AbstractBasedataField<?> from = (AbstractBasedataField<?>) source;
|
|
51
|
-
AbstractBasedataField<?> to = (AbstractBasedataField<?>) result;
|
|
52
|
-
to.setBaseEntityId(from.getBaseEntityId());
|
|
53
|
-
to.setDisplayProp(from.getDisplayProp());
|
|
54
|
-
to.setNumberProp(from.getNumberProp());
|
|
55
|
-
to.setEditSearchProp(from.getEditSearchProp());
|
|
56
|
-
to.setLayoutId(from.getLayoutId());
|
|
57
|
-
to.setDisplayStyle(from.getDisplayStyle());
|
|
58
|
-
to.setOrgFieldId(from.getOrgFieldId());
|
|
59
|
-
to.setFilter(copy(from.getFilter()));
|
|
60
|
-
if (from.getRefProps() != null && !from.getRefProps().isEmpty()) to.getRefProps().addAll(copy(from.getRefProps()));
|
|
61
|
-
if (from.getConditionalFilterRule() != null && !from.getConditionalFilterRule().isEmpty()) {
|
|
62
|
-
throw new IllegalArgumentException("REPORT_FILTER_CONDITIONAL_REFERENCE_UNSUPPORTED");
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
if (source instanceof ComboField) ((ComboField) result).setItems(copy(((ComboField) source).getItems()));
|
|
66
|
-
if (source instanceof DateTimeField) {
|
|
67
|
-
DateTimeField from = (DateTimeField) source, to = (DateTimeField) result;
|
|
68
|
-
to.setRegionType(from.getRegionType());
|
|
69
|
-
to.setTimeZoneTransType(from.getTimeZoneTransType());
|
|
70
|
-
to.setMinDate(from.getMinDate());
|
|
71
|
-
to.setMaxDate(from.getMaxDate());
|
|
72
|
-
}
|
|
73
|
-
if (source instanceof DateRangeField) {
|
|
74
|
-
((DateRangeField) result).setTimeZoneTransType(((DateRangeField) source).getTimeZoneTransType());
|
|
75
|
-
((DateRangeField) result).setRegionType(((DateRangeField) source).getRegionType());
|
|
76
|
-
((DateRangeField) result).setQuickOptions(((DateRangeField) source).getQuickOptions());
|
|
77
|
-
}
|
|
78
|
-
if (source instanceof DecimalField) {
|
|
79
|
-
((DecimalField) result).setPrecision(((DecimalField) source).getPrecision());
|
|
80
|
-
((DecimalField) result).setScale(((DecimalField) source).getScale());
|
|
81
|
-
}
|
|
82
|
-
if (source instanceof TextField) ((TextField) result).setMaxLength(((TextField) source).getMaxLength());
|
|
83
|
-
}
|
|
84
|
-
if (result == source || result == null) throw new IllegalArgumentException("REPORT_FILTER_SOURCE_CLONE_FAILED");
|
|
85
|
-
if (result instanceof AbstractBasedataField) {
|
|
86
|
-
AbstractBasedataField<?> basedata = (AbstractBasedataField<?>) result;
|
|
87
|
-
// Source form field IDs are not report field IDs. Keep this dependency explicit.
|
|
88
|
-
if (basedata.getOrgFieldId() != null && !basedata.getOrgFieldId().isEmpty()) {
|
|
89
|
-
throw new IllegalArgumentException("REPORT_FILTER_ORG_BINDING_REQUIRED: " + source.getKey());
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
result.setInherit(false);
|
|
93
|
-
result.setExt(false);
|
|
94
|
-
result.setFeatures(null);
|
|
95
|
-
result.setMustInputCondition(null);
|
|
96
|
-
if (result instanceof ComboField) ((ComboField) result).setChangeListeners(null);
|
|
97
|
-
return result;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
private static <T> T copy(T value) {
|
|
101
|
-
if (value == null) return null;
|
|
102
|
-
try {
|
|
103
|
-
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
|
|
104
|
-
try (ObjectOutputStream output = new ObjectOutputStream(bytes)) { output.writeObject(value); }
|
|
105
|
-
try (ObjectInputStream input = new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()))) {
|
|
106
|
-
return (T) input.readObject();
|
|
107
|
-
}
|
|
108
|
-
} catch (Exception error) {
|
|
109
|
-
throw new IllegalArgumentException("REPORT_FILTER_OPTION_COPY_FAILED", error);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
public static Map<String, Object> describe(Field<?> field) {
|
|
114
|
-
Map<String, Object> result = new LinkedHashMap<>();
|
|
115
|
-
result.put("fieldPath", field.getKey());
|
|
116
|
-
result.put("displayName", field.getName() == null ? "" : field.getName().toString());
|
|
117
|
-
result.put("fieldType", field.getClass().getSimpleName());
|
|
118
|
-
result.put("mustInput", field.isMustInput());
|
|
119
|
-
if (field instanceof AbstractBasedataField) {
|
|
120
|
-
AbstractBasedataField<?> basedata = (AbstractBasedataField<?>) field;
|
|
121
|
-
result.put("referenceEntityId", basedata.getBaseEntityId());
|
|
122
|
-
result.put("displayProp", basedata.getDisplayProp());
|
|
123
|
-
result.put("numberProp", basedata.getNumberProp());
|
|
124
|
-
result.put("editSearchProp", basedata.getEditSearchProp());
|
|
125
|
-
result.put("layoutId", basedata.getLayoutId());
|
|
126
|
-
result.put("displayStyle", basedata.getDisplayStyle());
|
|
127
|
-
}
|
|
128
|
-
if (field instanceof ComboField) {
|
|
129
|
-
List<Map<String, Object>> items = new ArrayList<>();
|
|
130
|
-
for (ComboItem item : ((ComboField) field).getItems()) {
|
|
131
|
-
Map<String, Object> option = new LinkedHashMap<>();
|
|
132
|
-
option.put("value", item.getValue());
|
|
133
|
-
option.put("caption", item.getCaption() == null ? "" : item.getCaption().toString());
|
|
134
|
-
items.add(option);
|
|
135
|
-
}
|
|
136
|
-
result.put("comboOptions", items);
|
|
137
|
-
}
|
|
138
|
-
if (field instanceof DateTimeField) result.put("timeZoneTransType", ((DateTimeField) field).getTimeZoneTransType());
|
|
139
|
-
if (field instanceof DateRangeField) result.put("timeZoneTransType", ((DateRangeField) field).getTimeZoneTransType());
|
|
140
|
-
if (field instanceof DecimalField) {
|
|
141
|
-
result.put("precision", ((DecimalField) field).getPrecision());
|
|
142
|
-
result.put("scale", ((DecimalField) field).getScale());
|
|
143
|
-
}
|
|
144
|
-
if (field instanceof TextField) result.put("maxLength", ((TextField)field).getMaxLength());
|
|
145
|
-
return result;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
public static Map<String, Object> read(FormMetadata form, EntityMetadata entity, String panelId) {
|
|
149
|
-
List<Map<String, Object>> filters = new ArrayList<>();
|
|
150
|
-
for (ControlAp<?> control : form.getItems()) {
|
|
151
|
-
if (!(control instanceof FieldAp) || !panelId.equals(control.getParentId())) continue;
|
|
152
|
-
Field<?> field = entity.getFieldById(((FieldAp) control).getFieldId());
|
|
153
|
-
if (field == null) throw new IllegalArgumentException("REPORT_FILTER_FIELD_BINDING_MISSING: " + control.getKey());
|
|
154
|
-
filters.add(describe(field));
|
|
155
|
-
}
|
|
156
|
-
Map<String, Object> result = new LinkedHashMap<>();
|
|
157
|
-
result.put("schemaVersion", "app-build-typed-report-filters/v1");
|
|
158
|
-
result.put("reportFilters", filters);
|
|
159
|
-
return result;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
public static List<Map<String, Object>> fields(EntityMetadata entity) {
|
|
163
|
-
List<Map<String, Object>> fields = new ArrayList<>();
|
|
164
|
-
for (kd.bos.metadata.entity.EntityItem<?> item : entity.getItems()) {
|
|
165
|
-
if (item instanceof Field) fields.add(describe((Field<?>) item));
|
|
166
|
-
}
|
|
167
|
-
return fields;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
--- a/src/main/java/kd/bos/designer/property/setting/ReportPropertyService.java
|
|
2
|
-
+++ b/src/main/java/kd/bos/designer/property/setting/ReportPropertyService.java
|
|
3
|
-
@@ -705,6 +705,29 @@
|
|
4
|
-
*/
|
|
5
|
-
@SuppressWarnings("unchecked")
|
|
6
|
-
public static PropertyResult setReportFilters(String formNumber, Map<String, Object> data) {
|
|
7
|
-
+ return setReportFilters(formNumber, data, false);
|
|
8
|
-
+ }
|
|
9
|
-
+
|
|
10
|
-
+ public static List<Map<String, Object>> readFieldSchemas(String formNumber) throws Exception {
|
|
11
|
-
+ MetaPropertyService.MetaContext ctx = MetaPropertyService.loadMetaContext(formNumber, null);
|
|
12
|
-
+ if (ctx == null || ctx.entityMetadata == null) throw new IllegalArgumentException("REPORT_FILTER_METADATA_UNAVAILABLE");
|
|
13
|
-
+ return TypedReportFilterFields.fields(ctx.entityMetadata);
|
|
14
|
-
+ }
|
|
15
|
-
+
|
|
16
|
-
+ /** Independent typed configuration read-back from persisted form/entity metadata. */
|
|
17
|
-
+ public static Map<String, Object> readTypedReportFilters(String formNumber) throws Exception {
|
|
18
|
-
+ MetaPropertyService.MetaContext ctx = MetaPropertyService.loadMetaContext(formNumber, null);
|
|
19
|
-
+ if (ctx == null || ctx.entityMetadata == null) throw new IllegalArgumentException("REPORT_FILTER_METADATA_UNAVAILABLE");
|
|
20
|
-
+ String panel = findControlIdByKey(ctx.formMetadata, "reportcommfilterpanelap");
|
|
21
|
-
+ if (StringUtils.isBlank(panel)) throw new IllegalArgumentException("REPORT_FILTER_PANEL_NOT_FOUND");
|
|
22
|
-
+ return TypedReportFilterFields.read(ctx.formMetadata, ctx.entityMetadata, panel);
|
|
23
|
-
+ }
|
|
24
|
-
+
|
|
25
|
-
+ public static PropertyResult setTypedReportFilters(String formNumber, Map<String, Object> data) {
|
|
26
|
-
+ return setReportFilters(formNumber, data, true);
|
|
27
|
-
+ }
|
|
28
|
-
+
|
|
29
|
-
+ private static PropertyResult setReportFilters(String formNumber, Map<String, Object> data, boolean typed) {
|
|
30
|
-
return withFormMetadata(formNumber, "ReportFilters", (ctx, formMetadata) -> {
|
|
31
|
-
ReportFilterAp filterAp = findReportFilterAp(formMetadata);
|
|
32
|
-
if (filterAp == null) {
|
|
33
|
-
@@ -717,6 +740,23 @@
|
|
34
|
-
"ReportPropertyService_FLT_1", BOS_DESIGNER_AI);
|
|
35
|
-
}
|
|
36
|
-
List<Map<String, Object>> filters = (List<Map<String, Object>>) filtersObj;
|
|
37
|
-
+ // Resolve every source and option before replacing any existing panel state.
|
|
38
|
-
+ Map<String, Field<?>> typedFields = new LinkedHashMap<>();
|
|
39
|
-
+ if (typed) {
|
|
40
|
-
+ if (StringUtils.isBlank(findControlIdByKey(formMetadata, "reportcommfilterpanelap")))
|
|
41
|
-
+ return "REPORT_FILTER_PANEL_NOT_FOUND";
|
|
42
|
-
+ for (Map<String, Object> filter : filters) {
|
|
43
|
-
+ if (!(filter.get("source") instanceof Map)) continue;
|
|
44
|
-
+ Map<String, Object> binding = (Map<String, Object>) filter.get("source");
|
|
45
|
-
+ MetaPropertyService.MetaContext source = MetaPropertyService.loadMetaContext(toStr(binding.get("formNumber")), null);
|
|
46
|
-
+ Field<?> field = source == null ? null : findEntityFieldByKey(source.entityMetadata, toStr(binding.get("fieldKey")));
|
|
47
|
-
+ typedFields.put(toStr(filter.get("fieldPath")), TypedReportFilterFields.create(field, toStr(filter.get("compare"))));
|
|
48
|
-
+ }
|
|
49
|
-
+ for (ControlAp<?> control : formMetadata.getItems()) {
|
|
50
|
-
+ if (typedFields.containsKey(control.getKey()) && !findControlIdByKey(formMetadata, "reportcommfilterpanelap").equals(control.getParentId()))
|
|
51
|
-
+ return "REPORT_FILTER_KEY_SHARED_OUTSIDE_PANEL: " + control.getKey();
|
|
52
|
-
+ }
|
|
53
|
-
+ }
|
|
54
|
-
|
|
55
|
-
// 面板级:显示字段列表。
|
|
56
|
-
// 必须序列化为 JSON 数组串(如 ["flt_a","flt_b"]):运行时
|
|
57
|
-
@@ -853,7 +893,15 @@
|
|
58
|
-
// 强建新 Field 会造成实体层 key 重复,代价更大。
|
|
59
|
-
Field<?> existing = findEntityFieldByKey(ctx.entityMetadata, fp);
|
|
60
|
-
Field<?> field;
|
|
61
|
-
- if (existing != null) {
|
|
62
|
-
+ if (typedFields.containsKey(fp)) {
|
|
63
|
-
+ field = typedFields.get(fp);
|
|
64
|
-
+ if (existing != null) {
|
|
65
|
-
+ String existingId = existing.getId();
|
|
66
|
-
+ ctx.entityMetadata.getItems().remove(existing);
|
|
67
|
-
+ field.setId(existingId);
|
|
68
|
-
+ }
|
|
69
|
-
+ if (rootEntity != null) field.setIsv(rootEntity.getIsv());
|
|
70
|
-
+ } else if (existing != null) {
|
|
71
|
-
field = existing;
|
|
72
|
-
if ("13".equals(compare) && !(existing instanceof DateRangeField)) {
|
|
73
|
-
warnLog("[setReportFilters] field [{}] compare=13(between) expects DateRangeField "
|
|
74
|
-
--- a/src/main/java/kd/bos/designer/property/setting/ComplexPropertyRouter.java
|
|
75
|
-
+++ b/src/main/java/kd/bos/designer/property/setting/ComplexPropertyRouter.java
|
|
76
|
-
@@ -413,6 +413,8 @@
|
|
77
|
-
return ReportPropertyService.replaceReportColumns(formNumber, toMap(data));
|
|
78
|
-
case "ReportFilters":
|
|
79
|
-
return ReportPropertyService.setReportFilters(formNumber, toMap(data));
|
|
80
|
-
+ case "ReportFilters.typed":
|
|
81
|
-
+ return ReportPropertyService.setTypedReportFilters(formNumber, toMap(data));
|
|
82
|
-
case "ReportSorts":
|
|
83
|
-
return ReportPropertyService.setReportSorts(formNumber, toMap(data));
|
|
84
|
-
case "ReportPlugin":
|
|
85
|
-
--- a/src/main/java/kd/bos/designer/ai/webapi/AIMetaBuilder.java
|
|
86
|
-
+++ b/src/main/java/kd/bos/designer/ai/webapi/AIMetaBuilder.java
|
|
87
|
-
@@ -766,9 +766,11 @@
|
|
88
|
-
if (formMeta != null && formMeta.getRootAp() != null) {
|
|
89
|
-
String formNumber = formMeta.getRootAp().getKey();
|
|
90
|
-
result.put("formNumber", formNumber);
|
|
91
|
-
+ result.put("fieldSchemas", kd.bos.designer.property.setting.ReportPropertyService.readFieldSchemas(formNumber));
|
|
92
|
-
String rootType = formMeta.getRootAp().getClass().getSimpleName();
|
|
93
|
-
if ("ReportFormAp".equals(rootType)) {
|
|
94
|
-
result.put("modelType", "ReportFormModel");
|
|
95
|
-
+ result.put("reportFilterSchema", kd.bos.designer.property.setting.ReportPropertyService.readTypedReportFilters(formNumber));
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
} catch (Exception e) {
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Apply the versioned typed report filter extension to an explicitly selected platform module."""
|
|
3
|
-
import argparse
|
|
4
|
-
import json
|
|
5
|
-
import subprocess
|
|
6
|
-
from pathlib import Path
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def main():
|
|
10
|
-
parser = argparse.ArgumentParser(description=__doc__)
|
|
11
|
-
parser.add_argument("--project-root", required=True)
|
|
12
|
-
parser.add_argument("--dry-run", action="store_true")
|
|
13
|
-
args = parser.parse_args()
|
|
14
|
-
project = Path(args.project_root).resolve()
|
|
15
|
-
asset = Path(__file__).resolve().parents[1] / "assets" / "platform-report-filters"
|
|
16
|
-
helper = project / "src" / "main" / "java" / "kd" / "bos" / "designer" / "property" / "setting" / "TypedReportFilterFields.java"
|
|
17
|
-
if helper.exists() and helper.read_bytes() != (asset / helper.name).read_bytes():
|
|
18
|
-
print(json.dumps({"status": False, "reason": "existing-helper-differs"})); return 2
|
|
19
|
-
repo = subprocess.run(["git", "rev-parse", "--show-toplevel"], cwd=project, capture_output=True, text=True, check=True).stdout.strip()
|
|
20
|
-
directory = project.relative_to(Path(repo).resolve()).as_posix()
|
|
21
|
-
command = ["git", "apply", "--ignore-whitespace", "--directory=" + directory, str(asset / "platform.patch")]
|
|
22
|
-
check = subprocess.run([*command[:2], "--check", *command[2:]], cwd=repo, capture_output=True, text=True)
|
|
23
|
-
if check.returncode:
|
|
24
|
-
reverse = subprocess.run([*command[:2], "--reverse", "--check", *command[2:]], cwd=repo, capture_output=True, text=True)
|
|
25
|
-
if reverse.returncode:
|
|
26
|
-
print(json.dumps({"status": False, "reason": "platform-source-version-mismatch", "diagnostics": check.stderr[-2000:]})); return 2
|
|
27
|
-
if not helper.exists() and not args.dry_run:
|
|
28
|
-
helper.write_bytes((asset / helper.name).read_bytes())
|
|
29
|
-
print(json.dumps({"status": True, "changed": False, "alreadyApplied": True, "dryRun": args.dry_run})); return 0
|
|
30
|
-
if not args.dry_run:
|
|
31
|
-
subprocess.run(command, cwd=repo, check=True)
|
|
32
|
-
helper.parent.mkdir(parents=True, exist_ok=True)
|
|
33
|
-
helper.write_bytes((asset / helper.name).read_bytes())
|
|
34
|
-
print(json.dumps({"status": True, "changed": not args.dry_run, "dryRun": args.dry_run, "projectRoot": str(project)}))
|
|
35
|
-
return 0
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if __name__ == "__main__":
|
|
39
|
-
raise SystemExit(main())
|