weaver-e10-builder 1.1.8 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/commands/actionflow.d.ts.map +1 -1
- package/dist/commands/actionflow.js +32 -0
- package/dist/commands/actionflow.js.map +1 -1
- package/dist/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +17 -5
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +9 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/designer.d.ts.map +1 -1
- package/dist/commands/designer.js +22 -1
- package/dist/commands/designer.js.map +1 -1
- package/dist/commands/form-field-props.d.ts +3 -0
- package/dist/commands/form-field-props.d.ts.map +1 -0
- package/dist/commands/form-field-props.js +242 -0
- package/dist/commands/form-field-props.js.map +1 -0
- package/dist/commands/form-layout-init.d.ts +0 -7
- package/dist/commands/form-layout-init.d.ts.map +1 -1
- package/dist/commands/form-layout-init.js +23 -39
- package/dist/commands/form-layout-init.js.map +1 -1
- package/dist/commands/form-serial-mark.d.ts.map +1 -1
- package/dist/commands/form-serial-mark.js +134 -42
- package/dist/commands/form-serial-mark.js.map +1 -1
- package/dist/commands/form-virtual.d.ts +3 -0
- package/dist/commands/form-virtual.d.ts.map +1 -0
- package/dist/commands/form-virtual.js +197 -0
- package/dist/commands/form-virtual.js.map +1 -0
- package/dist/commands/form.d.ts +3 -0
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +263 -57
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/interface.js +1 -1
- package/dist/commands/interface.js.map +1 -1
- package/dist/commands/report-admin.d.ts +5 -0
- package/dist/commands/report-admin.d.ts.map +1 -0
- package/dist/commands/report-admin.js +420 -0
- package/dist/commands/report-admin.js.map +1 -0
- package/dist/commands/report-query.d.ts +3 -0
- package/dist/commands/report-query.d.ts.map +1 -0
- package/dist/commands/report-query.js +314 -0
- package/dist/commands/report-query.js.map +1 -0
- package/dist/commands/report-validate.d.ts +3 -0
- package/dist/commands/report-validate.d.ts.map +1 -0
- package/dist/commands/report-validate.js +719 -0
- package/dist/commands/report-validate.js.map +1 -0
- package/dist/commands/report.d.ts +12 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +666 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/wf-form.d.ts +34 -0
- package/dist/commands/wf-form.d.ts.map +1 -1
- package/dist/commands/wf-form.js +303 -127
- package/dist/commands/wf-form.js.map +1 -1
- package/dist/commands/workflow-advanced.d.ts.map +1 -1
- package/dist/commands/workflow-advanced.js +109 -90
- package/dist/commands/workflow-advanced.js.map +1 -1
- package/dist/commands/workflow-auth-resp.d.ts +8 -0
- package/dist/commands/workflow-auth-resp.d.ts.map +1 -0
- package/dist/commands/workflow-auth-resp.js +568 -0
- package/dist/commands/workflow-auth-resp.js.map +1 -0
- package/dist/commands/workflow-condition.d.ts.map +1 -1
- package/dist/commands/workflow-condition.js +3 -1
- package/dist/commands/workflow-condition.js.map +1 -1
- package/dist/commands/workflow-create-auth-resp.d.ts +4 -0
- package/dist/commands/workflow-create-auth-resp.d.ts.map +1 -0
- package/dist/commands/workflow-create-auth-resp.js +204 -0
- package/dist/commands/workflow-create-auth-resp.js.map +1 -0
- package/dist/commands/workflow-node-overtime.d.ts.map +1 -1
- package/dist/commands/workflow-node-overtime.js +125 -92
- package/dist/commands/workflow-node-overtime.js.map +1 -1
- package/dist/commands/workflow-node-reject.d.ts +52 -0
- package/dist/commands/workflow-node-reject.d.ts.map +1 -1
- package/dist/commands/workflow-node-reject.js +134 -63
- package/dist/commands/workflow-node-reject.js.map +1 -1
- package/dist/commands/workflow-node-sign.d.ts.map +1 -1
- package/dist/commands/workflow-node-sign.js +14 -7
- package/dist/commands/workflow-node-sign.js.map +1 -1
- package/dist/commands/workflow-node-validate.d.ts +6 -0
- package/dist/commands/workflow-node-validate.d.ts.map +1 -1
- package/dist/commands/workflow-node-validate.js +143 -21
- package/dist/commands/workflow-node-validate.js.map +1 -1
- package/dist/commands/workflow-node.d.ts.map +1 -1
- package/dist/commands/workflow-node.js +359 -116
- package/dist/commands/workflow-node.js.map +1 -1
- package/dist/commands/workflow-numbering.d.ts.map +1 -1
- package/dist/commands/workflow-numbering.js +73 -34
- package/dist/commands/workflow-numbering.js.map +1 -1
- package/dist/commands/workflow-operator-sign.d.ts +10 -0
- package/dist/commands/workflow-operator-sign.d.ts.map +1 -1
- package/dist/commands/workflow-operator-sign.js +40 -53
- package/dist/commands/workflow-operator-sign.js.map +1 -1
- package/dist/commands/workflow-plan-range.d.ts +10 -0
- package/dist/commands/workflow-plan-range.d.ts.map +1 -1
- package/dist/commands/workflow-plan-range.js +15 -54
- package/dist/commands/workflow-plan-range.js.map +1 -1
- package/dist/commands/workflow-segment.d.ts.map +1 -1
- package/dist/commands/workflow-segment.js +22 -14
- package/dist/commands/workflow-segment.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +13 -69
- package/dist/commands/workflow.js.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/services/actionflow/build_workflow_draft.d.ts +6 -0
- package/dist/services/actionflow/build_workflow_draft.d.ts.map +1 -1
- package/dist/services/actionflow/build_workflow_draft.js +63 -4
- package/dist/services/actionflow/build_workflow_draft.js.map +1 -1
- package/dist/services/actionflow/calendar_mapper.d.ts +2 -2
- package/dist/services/actionflow/calendar_mapper.d.ts.map +1 -1
- package/dist/services/actionflow/calendar_mapper.js +33 -13
- package/dist/services/actionflow/calendar_mapper.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_add.js +13 -1
- package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_delete.js +2 -2
- package/dist/services/actionflow/components/action_eb_delete.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_recover.js +2 -2
- package/dist/services/actionflow/components/action_eb_recover.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_save_version.js +2 -2
- package/dist/services/actionflow/components/action_eb_save_version.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_update.js +15 -3
- package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.js +5 -5
- package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
- package/dist/services/actionflow/components/approve_create.d.ts.map +1 -1
- package/dist/services/actionflow/components/approve_create.js +5 -2
- package/dist/services/actionflow/components/approve_create.js.map +1 -1
- package/dist/services/actionflow/components/approve_trigger.d.ts.map +1 -1
- package/dist/services/actionflow/components/approve_trigger.js +5 -0
- package/dist/services/actionflow/components/approve_trigger.js.map +1 -1
- package/dist/services/actionflow/components/date_trigger.d.ts.map +1 -1
- package/dist/services/actionflow/components/date_trigger.js +14 -1
- package/dist/services/actionflow/components/date_trigger.js.map +1 -1
- package/dist/services/actionflow/components/dml_execute.d.ts.map +1 -1
- package/dist/services/actionflow/components/dml_execute.js +18 -10
- package/dist/services/actionflow/components/dml_execute.js.map +1 -1
- package/dist/services/actionflow/components/document_actions.js +5 -5
- package/dist/services/actionflow/components/document_actions.js.map +1 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.d.ts.map +1 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.js +8 -6
- package/dist/services/actionflow/components/eb_get_data_by_id.js.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.js +28 -9
- package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
- package/dist/services/actionflow/components/hrm_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/hrm_actions.js +34 -13
- package/dist/services/actionflow/components/hrm_actions.js.map +1 -1
- package/dist/services/actionflow/components/index.js +3 -3
- package/dist/services/actionflow/components/index.js.map +1 -1
- package/dist/services/actionflow/components/inner_mq_send.d.ts.map +1 -1
- package/dist/services/actionflow/components/inner_mq_send.js +43 -4
- package/dist/services/actionflow/components/inner_mq_send.js.map +1 -1
- package/dist/services/actionflow/components/meeting_create.js +9 -9
- package/dist/services/actionflow/components/meeting_create.js.map +1 -1
- package/dist/services/actionflow/components/multiple_execution.d.ts.map +1 -1
- package/dist/services/actionflow/components/multiple_execution.js +83 -4
- package/dist/services/actionflow/components/multiple_execution.js.map +1 -1
- package/dist/services/actionflow/components/output.d.ts +3 -2
- package/dist/services/actionflow/components/output.d.ts.map +1 -1
- package/dist/services/actionflow/components/output.js +33 -0
- package/dist/services/actionflow/components/output.js.map +1 -1
- package/dist/services/actionflow/components/schedule_create.js +10 -10
- package/dist/services/actionflow/components/schedule_create.js.map +1 -1
- package/dist/services/actionflow/components/send_message.js +1 -1
- package/dist/services/actionflow/components/send_message.js.map +1 -1
- package/dist/services/actionflow/components/simple_scheduler.d.ts.map +1 -1
- package/dist/services/actionflow/components/simple_scheduler.js +42 -9
- package/dist/services/actionflow/components/simple_scheduler.js.map +1 -1
- package/dist/services/actionflow/components/time_batch_trigger.d.ts.map +1 -1
- package/dist/services/actionflow/components/time_batch_trigger.js +43 -13
- package/dist/services/actionflow/components/time_batch_trigger.js.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.d.ts +0 -1
- package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.js +21 -27
- package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
- package/dist/services/actionflow/context_preflight.d.ts +31 -2
- package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
- package/dist/services/actionflow/context_preflight.js +179 -4
- package/dist/services/actionflow/context_preflight.js.map +1 -1
- package/dist/services/actionflow/design_client.d.ts +4 -0
- package/dist/services/actionflow/design_client.d.ts.map +1 -1
- package/dist/services/actionflow/design_client.js +10 -0
- package/dist/services/actionflow/design_client.js.map +1 -1
- package/dist/services/actionflow/dynamic_resources.d.ts.map +1 -1
- package/dist/services/actionflow/dynamic_resources.js +10 -3
- package/dist/services/actionflow/dynamic_resources.js.map +1 -1
- package/dist/services/actionflow/enrich_approve_trigger.d.ts.map +1 -1
- package/dist/services/actionflow/enrich_approve_trigger.js +18 -3
- package/dist/services/actionflow/enrich_approve_trigger.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts +1 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +135 -12
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/generation_service.d.ts.map +1 -1
- package/dist/services/actionflow/generation_service.js +18 -2
- package/dist/services/actionflow/generation_service.js.map +1 -1
- package/dist/services/actionflow/preflight_service.d.ts +1 -1
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +194 -6
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/save_workflow_draft.d.ts +8 -0
- package/dist/services/actionflow/save_workflow_draft.d.ts.map +1 -1
- package/dist/services/actionflow/save_workflow_draft.js +6 -2
- package/dist/services/actionflow/save_workflow_draft.js.map +1 -1
- package/dist/services/actionflow/update_service.d.ts +6 -0
- package/dist/services/actionflow/update_service.d.ts.map +1 -1
- package/dist/services/actionflow/update_service.js +125 -7
- package/dist/services/actionflow/update_service.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +17 -9
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/browser.d.ts +34 -0
- package/dist/services/browser.d.ts.map +1 -0
- package/dist/services/browser.js +57 -0
- package/dist/services/browser.js.map +1 -0
- package/dist/services/esb-interface/document-parser.d.ts +5 -0
- package/dist/services/esb-interface/document-parser.d.ts.map +1 -1
- package/dist/services/esb-interface/document-parser.js +117 -1
- package/dist/services/esb-interface/document-parser.js.map +1 -1
- package/dist/services/esb-interface/importer.d.ts.map +1 -1
- package/dist/services/esb-interface/importer.js +7 -2
- package/dist/services/esb-interface/importer.js.map +1 -1
- package/dist/services/field-props-data.d.ts +56 -0
- package/dist/services/field-props-data.d.ts.map +1 -0
- package/dist/services/field-props-data.js +732 -0
- package/dist/services/field-props-data.js.map +1 -0
- package/dist/services/form-edit-base.d.ts +45 -0
- package/dist/services/form-edit-base.d.ts.map +1 -0
- package/dist/services/form-edit-base.js +76 -0
- package/dist/services/form-edit-base.js.map +1 -0
- package/dist/services/form-field-drop.d.ts +41 -0
- package/dist/services/form-field-drop.d.ts.map +1 -0
- package/dist/services/form-field-drop.js +58 -0
- package/dist/services/form-field-drop.js.map +1 -0
- package/dist/services/form-style-template.d.ts +17 -0
- package/dist/services/form-style-template.d.ts.map +1 -0
- package/dist/services/form-style-template.js +102 -0
- package/dist/services/form-style-template.js.map +1 -0
- package/dist/services/form-virtual.d.ts +60 -0
- package/dist/services/form-virtual.d.ts.map +1 -0
- package/dist/services/form-virtual.js +331 -0
- package/dist/services/form-virtual.js.map +1 -0
- package/dist/services/report/analyze.d.ts +67 -0
- package/dist/services/report/analyze.d.ts.map +1 -0
- package/dist/services/report/analyze.js +173 -0
- package/dist/services/report/analyze.js.map +1 -0
- package/dist/services/report/build.d.ts +166 -0
- package/dist/services/report/build.d.ts.map +1 -0
- package/dist/services/report/build.js +520 -0
- package/dist/services/report/build.js.map +1 -0
- package/dist/services/report/constants.d.ts +145 -0
- package/dist/services/report/constants.d.ts.map +1 -0
- package/dist/services/report/constants.js +250 -0
- package/dist/services/report/constants.js.map +1 -0
- package/dist/services/report/dataset.d.ts +73 -0
- package/dist/services/report/dataset.d.ts.map +1 -0
- package/dist/services/report/dataset.js +185 -0
- package/dist/services/report/dataset.js.map +1 -0
- package/dist/services/report/fields.d.ts +80 -0
- package/dist/services/report/fields.d.ts.map +1 -0
- package/dist/services/report/fields.js +245 -0
- package/dist/services/report/fields.js.map +1 -0
- package/dist/services/report/forms.d.ts +70 -0
- package/dist/services/report/forms.d.ts.map +1 -0
- package/dist/services/report/forms.js +237 -0
- package/dist/services/report/forms.js.map +1 -0
- package/dist/services/report/guard.d.ts +73 -0
- package/dist/services/report/guard.d.ts.map +1 -0
- package/dist/services/report/guard.js +262 -0
- package/dist/services/report/guard.js.map +1 -0
- package/dist/services/report/http.d.ts +118 -0
- package/dist/services/report/http.d.ts.map +1 -0
- package/dist/services/report/http.js +159 -0
- package/dist/services/report/http.js.map +1 -0
- package/dist/services/report/lifecycle.d.ts +107 -0
- package/dist/services/report/lifecycle.d.ts.map +1 -0
- package/dist/services/report/lifecycle.js +323 -0
- package/dist/services/report/lifecycle.js.map +1 -0
- package/dist/services/report/permission.d.ts +59 -0
- package/dist/services/report/permission.d.ts.map +1 -0
- package/dist/services/report/permission.js +286 -0
- package/dist/services/report/permission.js.map +1 -0
- package/dist/services/report/query-checks.d.ts +124 -0
- package/dist/services/report/query-checks.d.ts.map +1 -0
- package/dist/services/report/query-checks.js +374 -0
- package/dist/services/report/query-checks.js.map +1 -0
- package/dist/services/report/query.d.ts +106 -0
- package/dist/services/report/query.d.ts.map +1 -0
- package/dist/services/report/query.js +278 -0
- package/dist/services/report/query.js.map +1 -0
- package/dist/services/report/render.d.ts +52 -0
- package/dist/services/report/render.d.ts.map +1 -0
- package/dist/services/report/render.js +138 -0
- package/dist/services/report/render.js.map +1 -0
- package/dist/services/report/reports.d.ts +110 -0
- package/dist/services/report/reports.d.ts.map +1 -0
- package/dist/services/report/reports.js +179 -0
- package/dist/services/report/reports.js.map +1 -0
- package/dist/services/report/safe-save.d.ts +57 -0
- package/dist/services/report/safe-save.d.ts.map +1 -0
- package/dist/services/report/safe-save.js +325 -0
- package/dist/services/report/safe-save.js.map +1 -0
- package/dist/services/report/sources.d.ts +48 -0
- package/dist/services/report/sources.d.ts.map +1 -0
- package/dist/services/report/sources.js +147 -0
- package/dist/services/report/sources.js.map +1 -0
- package/dist/services/report/types.d.ts +312 -0
- package/dist/services/report/types.d.ts.map +1 -0
- package/dist/services/report/types.js +2 -0
- package/dist/services/report/types.js.map +1 -0
- package/dist/services/report/validate.d.ts +169 -0
- package/dist/services/report/validate.d.ts.map +1 -0
- package/dist/services/report/validate.js +685 -0
- package/dist/services/report/validate.js.map +1 -0
- package/dist/services/report/verify.d.ts +72 -0
- package/dist/services/report/verify.d.ts.map +1 -0
- package/dist/services/report/verify.js +441 -0
- package/dist/services/report/verify.js.map +1 -0
- package/dist/services/report/workbook.d.ts +108 -0
- package/dist/services/report/workbook.d.ts.map +1 -0
- package/dist/services/report/workbook.js +471 -0
- package/dist/services/report/workbook.js.map +1 -0
- package/dist/services/rich-types.d.ts +39 -0
- package/dist/services/rich-types.d.ts.map +1 -1
- package/dist/services/rich-types.js +78 -30
- package/dist/services/rich-types.js.map +1 -1
- package/dist/services/workflow-node-layout.d.ts +214 -0
- package/dist/services/workflow-node-layout.d.ts.map +1 -0
- package/dist/services/workflow-node-layout.js +338 -0
- package/dist/services/workflow-node-layout.js.map +1 -0
- package/dist/services/workflow-operator.d.ts +47 -2
- package/dist/services/workflow-operator.d.ts.map +1 -1
- package/dist/services/workflow-operator.js +102 -5
- package/dist/services/workflow-operator.js.map +1 -1
- package/dist/services/workflow-overtime.d.ts +95 -0
- package/dist/services/workflow-overtime.d.ts.map +1 -0
- package/dist/services/workflow-overtime.js +207 -0
- package/dist/services/workflow-overtime.js.map +1 -0
- package/dist/services/workflow-plan-range.d.ts +18 -0
- package/dist/services/workflow-plan-range.d.ts.map +1 -0
- package/dist/services/workflow-plan-range.js +72 -0
- package/dist/services/workflow-plan-range.js.map +1 -0
- package/package.json +3 -2
- package/skill-docs/SKILL.md +277 -261
- package/skill-docs/_catalog.md +77 -66
- package/skill-docs/actionflows/SKILL.md +22 -14
- package/skill-docs/actionflows/references/components/calendar/MeetingCreate.md +17 -17
- package/skill-docs/actionflows/references/components/calendar/ScheduleCreate.md +17 -17
- package/skill-docs/actionflows/references/components/database/DMLExecute.md +3 -3
- package/skill-docs/actionflows/references/components/ebuilder/DateTrigger.md +32 -17
- package/skill-docs/actionflows/references/components/ebuilder/EbGetDataById.md +17 -17
- package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +6 -0
- package/skill-docs/actionflows/references/components/ebuilder/EventFormData.md +2 -0
- package/skill-docs/actionflows/references/components/ebuilder/TimeBatchTrigger.md +19 -17
- package/skill-docs/actionflows/references/components/logic/Output.md +28 -17
- package/skill-docs/actionflows/references/components/message/InnerMQSend.md +6 -2
- package/skill-docs/actionflows/references/components/personnel/AlterPersonStatus.md +30 -30
- package/skill-docs/actionflows/references/components/personnel/HrmEmployeeUpdate.md +32 -32
- package/skill-docs/actionflows/references/components/trigger/InnerMQListener.md +41 -40
- package/skill-docs/actionflows/references/components/trigger/SimpleScheduler.md +19 -17
- package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +17 -17
- package/skill-docs/actionflows/references/components/workflow/ApproveDelete.md +19 -17
- package/skill-docs/actionflows/references/components/workflow/ApproveEntrust.md +19 -17
- package/skill-docs/actionflows/references/components/workflow/ApproveSave.md +17 -17
- package/skill-docs/actionflows/references/components/workflow/ApproveTrigger.md +99 -84
- package/skill-docs/actionflows/references/dynamic_capability_matrix.md +39 -0
- package/skill-docs/references/common/guide-plan-template.md +251 -233
- package/skill-docs/references/common/ref-cli-commands.md +519 -373
- package/skill-docs/references/ebuilder-designer/guide-designer-components.md +1 -1
- package/skill-docs/references/ebuilder-designer/guide-designer-factory.md +460 -460
- package/skill-docs/references/ebuilder-designer/guide-designer.md +4 -4
- package/skill-docs/references/form/guide-create-form.md +232 -214
- package/skill-docs/references/form/guide-form-association.md +1 -1
- package/skill-docs/references/form/guide-form-view.md +318 -318
- package/skill-docs/references/form/guide-virtual-form.md +156 -0
- package/skill-docs/references/form/ref-form-fields.md +239 -99
- package/skill-docs/references/form/style-templates.md +80 -27
- package/skill-docs/references/report/add-dataset-registration-guide.md +139 -0
- package/skill-docs/references/report/ai-report-workflow.md +412 -0
- package/skill-docs/references/report/api-report-build-fast-path.md +275 -0
- package/skill-docs/references/report/app-datasource-lookup-guide.md +230 -0
- package/skill-docs/references/report/cell-config-echo-guide.md +163 -0
- package/skill-docs/references/report/cell-transform-guide.md +147 -0
- package/skill-docs/references/report/condition-format-guide.md +140 -0
- package/skill-docs/references/report/cross-dataset-filter-guide.md +304 -0
- package/skill-docs/references/report/dataset-query-filter-guide.md +235 -0
- package/skill-docs/references/report/dataset-sidebar-ops-guide.md +280 -0
- package/skill-docs/references/report/dataset-table-field-contract-guide.md +339 -0
- package/skill-docs/references/report/datasource-metadata-guide.md +365 -0
- package/skill-docs/references/report/datasource-selection-and-parent-filter-guide.md +148 -0
- package/skill-docs/references/report/date-range-query-reference.md +102 -0
- package/skill-docs/references/report/default-header-style-guide.md +70 -0
- package/skill-docs/references/report/designer-blank-prevention-guide.md +111 -0
- package/skill-docs/references/report/event-hreflink-guide.md +184 -0
- package/skill-docs/references/report/field-bind-exact-match-guide.md +208 -0
- package/skill-docs/references/report/formula-cell-api-guide.md +258 -0
- package/skill-docs/references/report/guide-report-build.md +131 -0
- package/skill-docs/references/report/guide-report-modify.md +100 -0
- package/skill-docs/references/report/guide-report-multisource.md +143 -0
- package/skill-docs/references/report/guide-report-query.md +98 -0
- package/skill-docs/references/report/hidden-row-and-header-merge-guide.md +100 -0
- package/skill-docs/references/report/layout-showlocation-freeze-guide.md +167 -0
- package/skill-docs/references/report/preaggregate-auto-disable-guide.md +107 -0
- package/skill-docs/references/report/query-condition-api-guide.md +890 -0
- package/skill-docs/references/report/ref-report-commands.md +122 -0
- package/skill-docs/references/report/ref-report-pitfalls.md +226 -0
- package/skill-docs/references/report/report-baseinfo-defaults-guide.md +117 -0
- package/skill-docs/references/report/report-building-guide.md +511 -0
- package/skill-docs/references/report/report-config-schema.md +445 -0
- package/skill-docs/references/report/report-create-modes-guide.md +182 -0
- package/skill-docs/references/report/report-data-model.md +447 -0
- package/skill-docs/references/report/report-delivery-contract.md +101 -0
- package/skill-docs/references/report/report-designer-feature-map.md +500 -0
- package/skill-docs/references/report/report-internal-error-guide.md +78 -0
- package/skill-docs/references/report/report-knowledge-base.md +389 -0
- package/skill-docs/references/report/report-lifecycle-api-guide.md +392 -0
- package/skill-docs/references/report/report-list-page-ops-guide.md +191 -0
- package/skill-docs/references/report/report-permission-guide.md +365 -0
- package/skill-docs/references/report/report-requirement-analysis-template.md +202 -0
- package/skill-docs/references/report/report-self-check-guide.md +164 -0
- package/skill-docs/references/report/safe-partial-save-guide.md +151 -0
- package/skill-docs/references/report/snowflake-id-precision-guide.md +84 -0
- package/skill-docs/references/report/spec-build-schema.md +291 -0
- package/skill-docs/references/report/targeted-fix-guide.md +97 -0
- package/skill-docs/references/report/user-request-scope-only-guide.md +82 -0
- package/skill-docs/references/workflow/guide-workflow-auth-resp.md +190 -0
- package/skill-docs/references/workflow/guide-workflow-node-layout.md +181 -0
- package/skill-docs/references/workflow/guide-workflow.md +7 -3
- package/skill-docs/actionflows/references/components/workflow/ApproveCompletelyDelete.md +0 -17
|
@@ -0,0 +1,719 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { withReport } from './report.js';
|
|
3
|
+
import { getBaseInfo, getReportDevInfo, saveReportDevInfo } from '../services/report/reports.js';
|
|
4
|
+
import { listDatasets, fieldsKeyOf } from '../services/report/dataset.js';
|
|
5
|
+
import { checkCellLimit, validateScrollPage, validateShowLocation, validateSnapshotPatch, validateWorkbookGridline, validateSheetPropGridLine, } from '../services/report/guard.js';
|
|
6
|
+
import { mergeWorkbookSafe, fieldToCell, fieldStyle } from '../services/report/safe-save.js';
|
|
7
|
+
import { checkCrossFilters, checkTableNameContract, readCrossFilters, verifyAll, verifyFieldBind, } from '../services/report/verify.js';
|
|
8
|
+
import { hrefCatalog, mapNaturalPhrase, normalizeFont, normalizeGroupType, normalizeHref, normalizeNumberFormat, normalizeTransform, styleCatalog, validateBaseMeta, validateCellPatch, validateConditionRule, FORMAT_CATALOG, GROUP_TYPE_ALIAS, } from '../services/report/validate.js';
|
|
9
|
+
function readInput(raw) {
|
|
10
|
+
if (raw.inline)
|
|
11
|
+
return JSON.parse(raw.inline);
|
|
12
|
+
if (raw.file)
|
|
13
|
+
return JSON.parse(readFileSync(raw.file, 'utf-8').replace(/^/, ''));
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
function printValidation(r, json, payload) {
|
|
17
|
+
if (json) {
|
|
18
|
+
console.log(JSON.stringify(payload ?? r, null, 2));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
r.errors.forEach((e) => console.log(`[错误] ${e.message}`));
|
|
22
|
+
r.warnings.forEach((e) => console.log(`[警告] ${e.message}`));
|
|
23
|
+
r.infos.forEach((e) => console.log(`[提示] ${e.message}`));
|
|
24
|
+
if (r.ok && !r.warnings.length)
|
|
25
|
+
console.log('通过。');
|
|
26
|
+
if (!r.ok)
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
}
|
|
29
|
+
/** 取报表的字段记录 + 应用 id。 */
|
|
30
|
+
async function loadDev(http, reportId, appIdArg) {
|
|
31
|
+
const base = await getBaseInfo(http, reportId);
|
|
32
|
+
const appId = appIdArg || String(base.appId || base.appid || '');
|
|
33
|
+
const dev = await getReportDevInfo(http, reportId);
|
|
34
|
+
return { base, appId, dev, fields: (dev.fields || []) };
|
|
35
|
+
}
|
|
36
|
+
export function registerReportValidateCommands(report, program) {
|
|
37
|
+
const validate = report.command('validate').description('写入前校验(本地规则,不落库)');
|
|
38
|
+
validate
|
|
39
|
+
.command('base')
|
|
40
|
+
.requiredOption('--name <name>', '报表名')
|
|
41
|
+
.option('--name-label-id <id>', '多语言 ID', '-1')
|
|
42
|
+
.option('--group-id <id>', '分组 ID', '0')
|
|
43
|
+
.option('--show-order <n>', '排序', '1')
|
|
44
|
+
.description('校验报表名/分组等基础字段的写入规范')
|
|
45
|
+
.action(async (raw) => {
|
|
46
|
+
const r = validateBaseMeta({
|
|
47
|
+
name: raw.name,
|
|
48
|
+
nameLabelId: raw.nameLabelId,
|
|
49
|
+
groupId: raw.groupId,
|
|
50
|
+
showOrder: raw.showOrder,
|
|
51
|
+
});
|
|
52
|
+
printValidation(r, false, r.normalized);
|
|
53
|
+
});
|
|
54
|
+
validate
|
|
55
|
+
.command('condition')
|
|
56
|
+
.option('--file <file>', '规则 JSON 文件')
|
|
57
|
+
.option('--inline <json>', '规则 JSON 字符串')
|
|
58
|
+
.option('--map <phrase>', '自然语言,如 "介于 1 5" / "数据条" / "图标集"')
|
|
59
|
+
.option('--report-id <id>', '按线上报表的实际条件格式校验')
|
|
60
|
+
.option('--app-id <id>', '应用 ID')
|
|
61
|
+
.description('校验条件格式规则(白名单 / 冲突)')
|
|
62
|
+
.action(async (raw) => {
|
|
63
|
+
if (raw.map) {
|
|
64
|
+
const r = mapNaturalPhrase(raw.map);
|
|
65
|
+
printValidation(r, false, r.normalized);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (raw.reportId) {
|
|
69
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
70
|
+
const dev = await getReportDevInfo(http, raw.reportId);
|
|
71
|
+
const r = { ok: true, errors: [], warnings: [], infos: [] };
|
|
72
|
+
(dev.fields || []).forEach((f) => {
|
|
73
|
+
const rule = fieldStyle(f).cellType?.conditionRule || f.conditionRule;
|
|
74
|
+
if (!rule || !Object.keys(rule).length)
|
|
75
|
+
return;
|
|
76
|
+
const sub = validateConditionRule(rule, `(${f.x},${f.y}) ${f.text ?? ''}`);
|
|
77
|
+
r.errors.push(...sub.errors);
|
|
78
|
+
r.warnings.push(...sub.warnings);
|
|
79
|
+
});
|
|
80
|
+
if (r.errors.length)
|
|
81
|
+
r.ok = false;
|
|
82
|
+
printValidation(r, json);
|
|
83
|
+
});
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const input = readInput(raw);
|
|
87
|
+
if (!input) {
|
|
88
|
+
console.error('需要 --file / --inline / --map / --report-id 之一');
|
|
89
|
+
process.exitCode = 2;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const r = validateConditionRule(input);
|
|
93
|
+
printValidation(r, false, r.normalized);
|
|
94
|
+
});
|
|
95
|
+
validate
|
|
96
|
+
.command('format')
|
|
97
|
+
.option('--list', '列出数字格式目录')
|
|
98
|
+
.option('--map <label>', '中文名,如 货币 / 短日期')
|
|
99
|
+
.option('--file <file>', '单元格配置 JSON')
|
|
100
|
+
.option('--inline <json>', '单元格配置 JSON 字符串')
|
|
101
|
+
.description('校验数字格式 / 日期分组 / 字号字体')
|
|
102
|
+
.action(async (raw) => {
|
|
103
|
+
if (raw.list) {
|
|
104
|
+
console.log(JSON.stringify(FORMAT_CATALOG, null, 2));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const r = { ok: true, errors: [], warnings: [], infos: [] };
|
|
108
|
+
const norm = {};
|
|
109
|
+
if (raw.map) {
|
|
110
|
+
const f = normalizeNumberFormat({ map: raw.map });
|
|
111
|
+
const g = normalizeGroupType(raw.map);
|
|
112
|
+
Object.assign(r, {
|
|
113
|
+
errors: [...f.errors, ...g.errors],
|
|
114
|
+
warnings: [...f.warnings, ...g.warnings],
|
|
115
|
+
});
|
|
116
|
+
norm.format = f.normalized;
|
|
117
|
+
if (g.normalized)
|
|
118
|
+
norm.groupType = g.normalized;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
const input = readInput(raw);
|
|
122
|
+
if (!input) {
|
|
123
|
+
console.error('需要 --map / --file / --inline / --list 之一');
|
|
124
|
+
process.exitCode = 2;
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const patchChk = validateCellPatch(input);
|
|
128
|
+
r.errors.push(...patchChk.errors);
|
|
129
|
+
const f = normalizeNumberFormat(input);
|
|
130
|
+
const g = normalizeGroupType(input.groupType);
|
|
131
|
+
const font = normalizeFont(input.font);
|
|
132
|
+
r.errors.push(...f.errors, ...g.errors, ...font.errors);
|
|
133
|
+
r.warnings.push(...f.warnings, ...g.warnings, ...font.warnings);
|
|
134
|
+
norm.format = f.normalized;
|
|
135
|
+
norm.groupType = g.normalized;
|
|
136
|
+
norm.font = font.normalized;
|
|
137
|
+
}
|
|
138
|
+
if (r.errors.length)
|
|
139
|
+
r.ok = false;
|
|
140
|
+
printValidation(r, false, norm);
|
|
141
|
+
});
|
|
142
|
+
validate
|
|
143
|
+
.command('transform')
|
|
144
|
+
.option('--list', '列出转换类型速查')
|
|
145
|
+
.option('--map <label>', '中文名,如 人员 / 部门全路径 / 二维码')
|
|
146
|
+
.option('--file <file>', '单元格配置 JSON')
|
|
147
|
+
.option('--inline <json>', '单元格配置 JSON 字符串')
|
|
148
|
+
.description('校验转换面板设置')
|
|
149
|
+
.action(async (raw) => {
|
|
150
|
+
if (raw.list) {
|
|
151
|
+
const { TRANS_MAP, QR_MAP, DIR_MAP } = await import('../services/report/validate.js');
|
|
152
|
+
console.log(JSON.stringify({ TRANS_MAP, QR_MAP, DIR_MAP }, null, 2));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const input = raw.map ? { transType: String(raw.map) } : readInput(raw);
|
|
156
|
+
if (!input) {
|
|
157
|
+
console.error('需要 --map / --file / --inline / --list 之一');
|
|
158
|
+
process.exitCode = 2;
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const r = normalizeTransform(input);
|
|
162
|
+
printValidation(r, false, r.normalized);
|
|
163
|
+
});
|
|
164
|
+
validate
|
|
165
|
+
.command('href')
|
|
166
|
+
.option('--list', '列出打开方式与写法规则')
|
|
167
|
+
.option('--map <label>', '中文名,如 弹出页 / 当前页 / 执行js代码')
|
|
168
|
+
.option('--file <file>', '单元格配置 JSON')
|
|
169
|
+
.option('--inline <json>', '单元格配置 JSON 字符串')
|
|
170
|
+
.option('--fix', '把全角 ?/& 自动替换为 ASCII')
|
|
171
|
+
.description('校验事件超链接写法')
|
|
172
|
+
.action(async (raw) => {
|
|
173
|
+
if (raw.list) {
|
|
174
|
+
console.log(JSON.stringify(hrefCatalog(), null, 2));
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const input = raw.map ? { map: String(raw.map) } : readInput(raw);
|
|
178
|
+
if (!input) {
|
|
179
|
+
console.error('需要 --map / --file / --inline / --list 之一');
|
|
180
|
+
process.exitCode = 2;
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const r = normalizeHref(input, { fix: !!raw.fix });
|
|
184
|
+
printValidation(r, false, r.normalized);
|
|
185
|
+
});
|
|
186
|
+
validate
|
|
187
|
+
.command('gridline')
|
|
188
|
+
.option('--file <file>', 'workbook 或补丁 JSON')
|
|
189
|
+
.option('--inline <json>', 'workbook 或补丁 JSON 字符串')
|
|
190
|
+
.description('校验网格线(workbook 里出现 gridline 键会让保存 500)')
|
|
191
|
+
.action(async (raw) => {
|
|
192
|
+
const input = readInput(raw);
|
|
193
|
+
if (!input) {
|
|
194
|
+
console.error('需要 --file 或 --inline');
|
|
195
|
+
process.exitCode = 2;
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const r = { ok: true, errors: [], warnings: [], infos: [] };
|
|
199
|
+
const wbChk = validateWorkbookGridline(input);
|
|
200
|
+
r.errors.push(...wbChk.errors);
|
|
201
|
+
for (const [i, sp] of (input.sheetProps || []).entries()) {
|
|
202
|
+
const g = validateSheetPropGridLine(`sheetProps[${i}].gridLine`, sp?.gridLine);
|
|
203
|
+
r.errors.push(...g.errors);
|
|
204
|
+
r.warnings.push(...g.warnings);
|
|
205
|
+
if (g.normalized === 1) {
|
|
206
|
+
r.warnings.push({ message: `sheetProps[${i}].gridLine=1:网格线默认关闭,未点名开启时请写 0` });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (r.errors.length)
|
|
210
|
+
r.ok = false;
|
|
211
|
+
printValidation(r, false);
|
|
212
|
+
});
|
|
213
|
+
validate
|
|
214
|
+
.command('blank')
|
|
215
|
+
.option('--file <file>', '补丁 JSON')
|
|
216
|
+
.option('--inline <json>', '补丁 JSON 字符串')
|
|
217
|
+
.description('校验会导致设计区空白的写法')
|
|
218
|
+
.action(async (raw) => {
|
|
219
|
+
const input = readInput(raw);
|
|
220
|
+
if (!input) {
|
|
221
|
+
console.error('需要 --file 或 --inline');
|
|
222
|
+
process.exitCode = 2;
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const r = { ok: true, errors: [], warnings: [], infos: [] };
|
|
226
|
+
const loc = validateShowLocation(input.showLocation ?? input.sheetProps?.[0]?.showLocation);
|
|
227
|
+
r.errors.push(...loc.errors);
|
|
228
|
+
const scroll = validateScrollPage(input.split ?? input.pageSetting?.[0]?.split);
|
|
229
|
+
r.errors.push(...scroll.errors);
|
|
230
|
+
if (input.snapshot?.enableSnapshot) {
|
|
231
|
+
const snap = validateSnapshotPatch(input.snapshot, String(input.reportId || ''), input.name);
|
|
232
|
+
r.errors.push(...snap.errors);
|
|
233
|
+
r.warnings.push(...snap.warnings);
|
|
234
|
+
}
|
|
235
|
+
if (r.errors.length)
|
|
236
|
+
r.ok = false;
|
|
237
|
+
printValidation(r, false);
|
|
238
|
+
});
|
|
239
|
+
validate
|
|
240
|
+
.command('query')
|
|
241
|
+
.option('--map-show-where <phrase>', '把「顶部筛选」这类说法映射成内部值')
|
|
242
|
+
.option('--file <file>', '带 showWhere 的条件 JSON')
|
|
243
|
+
.option('--inline <json>', '带 showWhere 的条件 JSON 字符串')
|
|
244
|
+
.description('显示方式说法映射 / 条件显示方式规范化')
|
|
245
|
+
.action(async (raw) => {
|
|
246
|
+
const { resolveShowWhere, normalizeShowWhere, resolveQueryType } = await import('../services/report/query.js');
|
|
247
|
+
if (raw.mapShowWhere) {
|
|
248
|
+
const v = resolveShowWhere(raw.mapShowWhere);
|
|
249
|
+
if (!v) {
|
|
250
|
+
console.error(`无法映射显示方式「${raw.mapShowWhere}」。支持:高级搜索 / 筛选(advancedSearch / filter)`);
|
|
251
|
+
process.exitCode = 1;
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
console.log(`${raw.mapShowWhere} → ${v} (落库 queryType = ${resolveQueryType(v)})`);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const input = readInput(raw);
|
|
258
|
+
if (!input) {
|
|
259
|
+
console.error('需要 --map-show-where 或 --file / --inline');
|
|
260
|
+
process.exitCode = 2;
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const r = normalizeShowWhere(input, raw.showWhere);
|
|
264
|
+
if (!r.ok) {
|
|
265
|
+
console.error(r.error);
|
|
266
|
+
process.exitCode = 1;
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
console.log(`显示方式 = ${r.showWhere} (落库 queryType = ${resolveQueryType(r.showWhere)})`);
|
|
270
|
+
});
|
|
271
|
+
validate
|
|
272
|
+
.command('style')
|
|
273
|
+
.option('--list', '列出默认分层样式与目录')
|
|
274
|
+
.option('--inline <json>', 'spec 片段,看会解析出哪层样式')
|
|
275
|
+
.description('默认表头样式(标题蓝底 + 表头灰底)')
|
|
276
|
+
.action(async (raw) => {
|
|
277
|
+
if (raw.inline) {
|
|
278
|
+
const { resolveLayerStyles } = await import('../services/report/constants.js');
|
|
279
|
+
console.log(JSON.stringify(resolveLayerStyles(JSON.parse(raw.inline)), null, 2));
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
console.log(JSON.stringify(styleCatalog(), null, 2));
|
|
283
|
+
});
|
|
284
|
+
// ── 体检 ──────────────────────────────────────────────────
|
|
285
|
+
const verify = report.command('verify').description('落库自检(读回真实数据再断言)');
|
|
286
|
+
verify
|
|
287
|
+
.command('bind')
|
|
288
|
+
.argument('<reportId>', '报表 ID')
|
|
289
|
+
.option('--app-id <id>', '应用 ID')
|
|
290
|
+
.option('--strict', '把「需用户确认」也当作失败(退出码 2)')
|
|
291
|
+
.description('字段绑定体检')
|
|
292
|
+
.action(async (reportId, raw) => {
|
|
293
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
294
|
+
const r = await verifyFieldBind(http, reportId, raw.appId, { strict: !!raw.strict });
|
|
295
|
+
if (json) {
|
|
296
|
+
console.log(JSON.stringify(r, null, 2));
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
r.errors.forEach((e) => console.log(`[FAIL] ${e.message}`));
|
|
300
|
+
r.warnings.forEach((e) => console.log(`[WARN] ${e.message}`));
|
|
301
|
+
r.confirmations.forEach((e) => console.log(`[待确认] ${e.message}`));
|
|
302
|
+
console.log(r.summary);
|
|
303
|
+
}
|
|
304
|
+
if (r.exitCode)
|
|
305
|
+
process.exitCode = r.exitCode;
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
verify
|
|
309
|
+
.command('all')
|
|
310
|
+
.argument('<reportId>', '报表 ID')
|
|
311
|
+
.option('--app-id <id>', '应用 ID')
|
|
312
|
+
.option('--strict', '把「需用户确认」也当作失败')
|
|
313
|
+
.description('综合自检:绑定 + 单元格结构 + tableName 契约')
|
|
314
|
+
.action(async (reportId, raw) => {
|
|
315
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
316
|
+
const r = await verifyAll(http, reportId, raw.appId, { strict: !!raw.strict });
|
|
317
|
+
if (json) {
|
|
318
|
+
console.log(JSON.stringify(r, null, 2));
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
r.errors.forEach((e) => console.log(`[FAIL] ${e.message}`));
|
|
322
|
+
r.warnings.forEach((e) => console.log(`[WARN] ${e.message}`));
|
|
323
|
+
r.confirmations.forEach((e) => console.log(`[待确认] ${e.message}`));
|
|
324
|
+
console.log(r.summary);
|
|
325
|
+
}
|
|
326
|
+
if (r.exitCode)
|
|
327
|
+
process.exitCode = r.exitCode;
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
verify
|
|
331
|
+
.command('contract')
|
|
332
|
+
.argument('<reportId>', '报表 ID')
|
|
333
|
+
.option('--app-id <id>', '应用 ID')
|
|
334
|
+
.description('tableName 契约体检(只读)')
|
|
335
|
+
.action(async (reportId, raw) => {
|
|
336
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
337
|
+
const { fields } = await loadDev(http, reportId, raw.appId);
|
|
338
|
+
const r = checkTableNameContract(fields);
|
|
339
|
+
if (json)
|
|
340
|
+
console.log(JSON.stringify({ ...r, ...r.stats }, null, 2));
|
|
341
|
+
else {
|
|
342
|
+
r.warnings.forEach((w) => console.log(`[WARN] ${w.message}`));
|
|
343
|
+
if (r.ok)
|
|
344
|
+
console.log(`PASS — ${r.stats.fieldCells} 个字段格的 tableName 齐全`);
|
|
345
|
+
}
|
|
346
|
+
if (!r.ok)
|
|
347
|
+
process.exitCode = 1;
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
verify
|
|
351
|
+
.command('parents')
|
|
352
|
+
.argument('<reportId>', '报表 ID')
|
|
353
|
+
.option('--app-id <id>', '应用 ID')
|
|
354
|
+
.description('跨数据源父格体检:区域入口格唯一、fieldKey 三段式、id=currentField、算子白名单、锚点落在真实父格')
|
|
355
|
+
.action(async (reportId, raw) => {
|
|
356
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
357
|
+
const { fields } = await loadDev(http, reportId, raw.appId);
|
|
358
|
+
const items = checkCrossFilters(fields);
|
|
359
|
+
const errors = items.filter((x) => x.level === 'error');
|
|
360
|
+
const warnings = items.filter((x) => x.level !== 'error');
|
|
361
|
+
const sources = new Set(fields.filter((f) => f.cellType === 'Field').map((f) => String(f.dataSetId || '')));
|
|
362
|
+
const cross = fields.filter((f) => f.cellType === 'Field' && (readCrossFilters(f).leftFilterField?.length || 0) > 0).length;
|
|
363
|
+
if (json) {
|
|
364
|
+
console.log(JSON.stringify({ datasets: sources.size, crossFilters: cross, items }, null, 2));
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
console.log(`数据集 ${sources.size} 个 · 跨源父格筛选 ${cross} 处`);
|
|
368
|
+
errors.forEach((e) => console.log(`[FAIL] ${e.message}`));
|
|
369
|
+
warnings.forEach((w) => console.log(`[WARN] ${w.message}`));
|
|
370
|
+
if (!errors.length) {
|
|
371
|
+
console.log(sources.size > 1
|
|
372
|
+
? 'PASS — 跨源父格配置合规'
|
|
373
|
+
: 'PASS — 单数据集,无跨源父格配置');
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
if (errors.length)
|
|
377
|
+
process.exitCode = 1;
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
verify
|
|
381
|
+
.command('meta')
|
|
382
|
+
.argument('<reportId>', '报表 ID')
|
|
383
|
+
.option('--app-id <id>', '应用 ID')
|
|
384
|
+
.description('报表基础信息体检(防列表页 500)')
|
|
385
|
+
.action(async (reportId, raw) => {
|
|
386
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
387
|
+
const { base } = await loadDev(http, reportId, raw.appId);
|
|
388
|
+
const r = validateBaseMeta({
|
|
389
|
+
name: String(base.name ?? ''),
|
|
390
|
+
nameLabelId: String(base.nameLabelId ?? ''),
|
|
391
|
+
groupId: String(base.groupId ?? ''),
|
|
392
|
+
showOrder: String(base.showOrder ?? ''),
|
|
393
|
+
});
|
|
394
|
+
if (json)
|
|
395
|
+
console.log(JSON.stringify({ base, ...r }, null, 2));
|
|
396
|
+
else
|
|
397
|
+
printValidation(r, false, r.normalized);
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
verify
|
|
401
|
+
.command('condition')
|
|
402
|
+
.argument('<reportId>', '报表 ID')
|
|
403
|
+
.option('--app-id <id>', '应用 ID')
|
|
404
|
+
.description('线上条件格式体检(非法算子会静默不生成规则)')
|
|
405
|
+
.action(async (reportId, raw) => {
|
|
406
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
407
|
+
const { fields } = await loadDev(http, reportId, raw.appId);
|
|
408
|
+
const r = { ok: true, errors: [], warnings: [], infos: [] };
|
|
409
|
+
fields.forEach((f) => {
|
|
410
|
+
const rule = fieldStyle(f).cellType?.conditionRule || f.conditionRule;
|
|
411
|
+
if (!rule || !Object.keys(rule).length)
|
|
412
|
+
return;
|
|
413
|
+
const sub = validateConditionRule(rule, `(${f.x},${f.y}) ${f.text ?? ''}`);
|
|
414
|
+
r.errors.push(...sub.errors);
|
|
415
|
+
r.warnings.push(...sub.warnings);
|
|
416
|
+
});
|
|
417
|
+
if (r.errors.length)
|
|
418
|
+
r.ok = false;
|
|
419
|
+
printValidation(r, json);
|
|
420
|
+
});
|
|
421
|
+
});
|
|
422
|
+
verify
|
|
423
|
+
.command('format')
|
|
424
|
+
.argument('<reportId>', '报表 ID')
|
|
425
|
+
.option('--app-id <id>', '应用 ID')
|
|
426
|
+
.description('线上单元格格式体检(回显断裂 / 错误货币串)')
|
|
427
|
+
.action(async (reportId, raw) => {
|
|
428
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
429
|
+
const { fields } = await loadDev(http, reportId, raw.appId);
|
|
430
|
+
const r = { ok: true, errors: [], warnings: [], infos: [] };
|
|
431
|
+
fields.forEach((f) => {
|
|
432
|
+
const cellType = fieldStyle(f).cellType || {};
|
|
433
|
+
const fmtr = fieldStyle(f).formatter;
|
|
434
|
+
if (fmtr && !FORMAT_CATALOG.some((c) => c.formatter === fmtr)) {
|
|
435
|
+
r.warnings.push({
|
|
436
|
+
message: `(${f.x},${f.y}) formatter 非目录全等值「${fmtr}」→ 设计器工具栏可能显示「其他/常规」`,
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
if (/^[¥¥]#,##0/.test(String(fmtr))) {
|
|
440
|
+
r.errors.push({ message: `(${f.x},${f.y}) 疑似错误货币串 ${fmtr},应使用目录货币 formatter` });
|
|
441
|
+
}
|
|
442
|
+
const g = cellType.groupType;
|
|
443
|
+
if (g && g !== 'none' && !Object.values(GROUP_TYPE_ALIAS).includes(g)) {
|
|
444
|
+
r.errors.push({ message: `(${f.x},${f.y}) 未知 groupType=${g}` });
|
|
445
|
+
}
|
|
446
|
+
if (g === 'yearAndMonth') {
|
|
447
|
+
r.errors.push({ message: `(${f.x},${f.y}) groupType=yearAndMonth 应为落库值 yearmonth` });
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
if (r.errors.length)
|
|
451
|
+
r.ok = false;
|
|
452
|
+
printValidation(r, json);
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
verify
|
|
456
|
+
.command('blank')
|
|
457
|
+
.argument('<reportId>', '报表 ID')
|
|
458
|
+
.option('--app-id <id>', '应用 ID')
|
|
459
|
+
.description('线上设计区空白体检')
|
|
460
|
+
.action(async (reportId, raw) => {
|
|
461
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
462
|
+
const { dev, fields } = await loadDev(http, reportId, raw.appId);
|
|
463
|
+
const r = { ok: true, errors: [], warnings: [], infos: [] };
|
|
464
|
+
if (!fields.length) {
|
|
465
|
+
r.errors.push({ message: '字段记录为 0:设计区没有单元格(真清空),优先用历史版本回滚恢复' });
|
|
466
|
+
}
|
|
467
|
+
for (const [i, sp] of (dev.sheetProps || []).entries()) {
|
|
468
|
+
const loc = validateShowLocation(sp?.showLocation);
|
|
469
|
+
if (!loc.ok)
|
|
470
|
+
r.errors.push({ message: `sheetProps[${i}] ${loc.errors[0].message}` });
|
|
471
|
+
const scroll = validateScrollPage(sp);
|
|
472
|
+
r.errors.push(...scroll.errors);
|
|
473
|
+
}
|
|
474
|
+
const snap = dev.snapshot;
|
|
475
|
+
if (snap?.enableSnapshot) {
|
|
476
|
+
if (typeof snap.sheetId === 'number') {
|
|
477
|
+
r.errors.push({
|
|
478
|
+
message: `线上 snapshot.sheetId 是 number:疑似曾被 Number() 写入,易致设计区空白。请改成字符串重配`,
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
else if (String(snap.sheetId) !== String(reportId)) {
|
|
482
|
+
r.errors.push({ message: `snapshot.sheetId=${snap.sheetId} 与 reportId=${reportId} 不一致` });
|
|
483
|
+
}
|
|
484
|
+
if (!String(snap.snapshotName || '').trim()) {
|
|
485
|
+
r.warnings.push({ message: `snapshotName 为空,建议用默认值` });
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
if (r.errors.length)
|
|
489
|
+
r.ok = false;
|
|
490
|
+
printValidation(r, json);
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
verify
|
|
494
|
+
.command('gridline')
|
|
495
|
+
.argument('<reportId>', '报表 ID')
|
|
496
|
+
.option('--app-id <id>', '应用 ID')
|
|
497
|
+
.description('线上网格线体检(workbook 里出现 gridline 键会让保存 500)')
|
|
498
|
+
.action(async (reportId, raw) => {
|
|
499
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
500
|
+
const { dev } = await loadDev(http, reportId, raw.appId);
|
|
501
|
+
const wbChk = validateWorkbookGridline({ sheets: dev.workbookProps?.sheets });
|
|
502
|
+
printValidation(wbChk, json);
|
|
503
|
+
});
|
|
504
|
+
});
|
|
505
|
+
verify
|
|
506
|
+
.command('limit')
|
|
507
|
+
.argument('<reportId>', '报表 ID')
|
|
508
|
+
.option('--app-id <id>', '应用 ID')
|
|
509
|
+
.option('--rows <n>', '显式指定行数')
|
|
510
|
+
.option('--cols <n>', '显式指定列数')
|
|
511
|
+
.option('--date-values <n>', '日期展开的取值个数')
|
|
512
|
+
.description('渲染规模预检(只算不渲染)')
|
|
513
|
+
.action(async (reportId, raw) => {
|
|
514
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
515
|
+
const { appId, fields } = await loadDev(http, reportId, raw.appId);
|
|
516
|
+
const r = await checkCellLimit(http, reportId, appId, {
|
|
517
|
+
rows: raw.rows ? Number(raw.rows) : undefined,
|
|
518
|
+
cols: raw.cols ? Number(raw.cols) : undefined,
|
|
519
|
+
dateValues: raw.dateValues ? Number(raw.dateValues) : undefined,
|
|
520
|
+
fields,
|
|
521
|
+
});
|
|
522
|
+
if (json) {
|
|
523
|
+
console.log(JSON.stringify(r, null, 2));
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
console.log(`设计期 ${r.designedColumns} 列 / ${r.fieldCells} 个字段格`);
|
|
527
|
+
r.advice.forEach((a) => console.log(` ${a}`));
|
|
528
|
+
}
|
|
529
|
+
if (r.verdict === 'over_limit')
|
|
530
|
+
process.exitCode = 1;
|
|
531
|
+
});
|
|
532
|
+
});
|
|
533
|
+
// ── 定点修复 ──────────────────────────────────────────────
|
|
534
|
+
const fix = report.command('fix').description('定点修复(默认只读预演,需 --apply 才落库)');
|
|
535
|
+
fix
|
|
536
|
+
.command('echo')
|
|
537
|
+
.argument('<reportId>', '报表 ID')
|
|
538
|
+
.requiredOption('--app-id <id>', '应用 ID')
|
|
539
|
+
.description('同 query fix-echo:把显示方式恢复成设计器认的数组短码')
|
|
540
|
+
.action(async (reportId, raw) => {
|
|
541
|
+
await withReport(program, raw.appId, async (http, json) => {
|
|
542
|
+
const { fixQueryItems } = await import('../services/report/query-checks.js');
|
|
543
|
+
const r = await fixQueryItems(http, reportId);
|
|
544
|
+
if (json) {
|
|
545
|
+
console.log(JSON.stringify(r, null, 2));
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
r.changed.forEach((c) => console.log(`已修 ${c.itemText || c.itemId}:${c.actions.join('、')}`));
|
|
549
|
+
r.skipped.forEach((s) => console.log(`跳过 ${s.itemText || s.itemId}:${s.reason}`));
|
|
550
|
+
if (!r.changed.length)
|
|
551
|
+
console.log('没有需要修的条件。');
|
|
552
|
+
});
|
|
553
|
+
});
|
|
554
|
+
fix
|
|
555
|
+
.command('table-name')
|
|
556
|
+
.argument('<reportId>', '报表 ID')
|
|
557
|
+
.option('--app-id <id>', '应用 ID')
|
|
558
|
+
.option('--apply', '真的落库')
|
|
559
|
+
.description('补齐 Field 单元格的 tableName(数据源不显示模块类型后缀时用)')
|
|
560
|
+
.action(async (reportId, raw) => {
|
|
561
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
562
|
+
const { base, appId, dev, fields } = await loadDev(http, reportId, raw.appId);
|
|
563
|
+
const datasets = await listDatasets(http, reportId, appId);
|
|
564
|
+
const main = datasets.find((d) => d.sourceId && !d.sourceId.startsWith(reportId.slice(0, 6)));
|
|
565
|
+
const label = main?.name || datasets[0]?.name || '';
|
|
566
|
+
let tableName = label;
|
|
567
|
+
if (main) {
|
|
568
|
+
try {
|
|
569
|
+
const fk = await fieldsKeyOf(http, main.id, reportId, appId, { label, sourceType: main.sourceType });
|
|
570
|
+
tableName = String(fk[0]?.datasetName || label);
|
|
571
|
+
}
|
|
572
|
+
catch {
|
|
573
|
+
/* 用 label 兜底 */
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
const before = fields.map((f) => ({ x: f.x, y: f.y, tableName: f.tableName }));
|
|
577
|
+
const patched = fields.map((f) => {
|
|
578
|
+
if (f.cellType !== 'Field' || f.tableName)
|
|
579
|
+
return f;
|
|
580
|
+
const cell = fieldToCell(f);
|
|
581
|
+
cell.style.cellType.tableName = tableName;
|
|
582
|
+
return { ...f, tableName };
|
|
583
|
+
});
|
|
584
|
+
const missingBefore = before.filter((b) => !b.tableName).length;
|
|
585
|
+
if (json) {
|
|
586
|
+
console.log(JSON.stringify({ applied: !!raw.apply, missingBefore, tableName, fields: patched.length }, null, 2));
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
console.log(`缺 tableName 的字段格:${missingBefore} 个;将写为「${tableName}」`);
|
|
590
|
+
}
|
|
591
|
+
if (!raw.apply) {
|
|
592
|
+
if (!json)
|
|
593
|
+
console.log('(预演,未落库。加 --apply 执行)');
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
const wb = mergeWorkbookSafe({ ...dev, fields: patched }, {
|
|
597
|
+
patchFn: (w) => {
|
|
598
|
+
for (const sheet of Object.values(w.sheets || {})) {
|
|
599
|
+
const dt = sheet?.data?.dataTable || {};
|
|
600
|
+
for (const f of patched) {
|
|
601
|
+
const ct = dt[String(f.x)]?.[String(f.y)]?.style?.cellType;
|
|
602
|
+
if (ct && ct.cellType === 'Field')
|
|
603
|
+
ct.tableName = tableName;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
},
|
|
607
|
+
});
|
|
608
|
+
const fresh = await getReportDevInfo(http, reportId);
|
|
609
|
+
await saveReportDevInfo(http, {
|
|
610
|
+
appId,
|
|
611
|
+
reportId,
|
|
612
|
+
name: String(base.name || ''),
|
|
613
|
+
workbook: wb,
|
|
614
|
+
designKey: String(fresh.designKey || ''),
|
|
615
|
+
groupId: String(base.groupId ?? '0'),
|
|
616
|
+
nameLabelId: String(base.nameLabelId ?? '-1'),
|
|
617
|
+
});
|
|
618
|
+
const after = await getReportDevInfo(http, reportId);
|
|
619
|
+
const stillMissing = checkTableNameContract(after.fields || []).stats.missingTableName;
|
|
620
|
+
console.log(`已落库。剩余缺 tableName:${stillMissing} 个`);
|
|
621
|
+
if (stillMissing)
|
|
622
|
+
process.exitCode = 2;
|
|
623
|
+
});
|
|
624
|
+
});
|
|
625
|
+
fix
|
|
626
|
+
.command('freeze')
|
|
627
|
+
.argument('<reportId>', '报表 ID')
|
|
628
|
+
.option('--app-id <id>', '应用 ID')
|
|
629
|
+
.option('--anchor <x,y>', '冻结锚点(0 基);默认首个数据行 + 第 0 列,即只冻结表头')
|
|
630
|
+
.option('--apply', '真的落库')
|
|
631
|
+
.description('冻结单元格(锚点上方的行 + 左侧的列)')
|
|
632
|
+
.action(async (reportId, raw) => {
|
|
633
|
+
await withReport(program, raw.appId || '', async (http, json) => {
|
|
634
|
+
const { base, appId, dev, fields } = await loadDev(http, reportId, raw.appId);
|
|
635
|
+
// 重复坐标会让重建悄悄丢格 —— 先拦(退出码 3)
|
|
636
|
+
const seen = new Map();
|
|
637
|
+
for (const f of fields) {
|
|
638
|
+
const k = `${f.x},${f.y}`;
|
|
639
|
+
seen.set(k, (seen.get(k) || 0) + 1);
|
|
640
|
+
}
|
|
641
|
+
const dup = [...seen.entries()].filter(([, n]) => n > 1);
|
|
642
|
+
if (dup.length) {
|
|
643
|
+
console.error(`存在重复坐标,重建会丢格,已拒绝:${dup.map(([k, n]) => `${k}×${n}`).join(' ')}`);
|
|
644
|
+
process.exitCode = 3;
|
|
645
|
+
return;
|
|
646
|
+
}
|
|
647
|
+
let ax;
|
|
648
|
+
let ay;
|
|
649
|
+
if (raw.anchor) {
|
|
650
|
+
const [x, y] = String(raw.anchor).split(',').map((s) => Number(s.trim()));
|
|
651
|
+
ax = x;
|
|
652
|
+
ay = y;
|
|
653
|
+
}
|
|
654
|
+
else {
|
|
655
|
+
const vertical = fields.filter((f) => f.expandType === 'Vertical');
|
|
656
|
+
ax = vertical.length
|
|
657
|
+
? Math.min(...vertical.map((f) => Number(f.x)))
|
|
658
|
+
: Math.max(...fields.map((f) => Number(f.x)));
|
|
659
|
+
ay = 0;
|
|
660
|
+
}
|
|
661
|
+
if (!Number.isFinite(ax) || !Number.isFinite(ay)) {
|
|
662
|
+
throw new Error('--anchor 需为 x,y 形式,例如 --anchor 1,0');
|
|
663
|
+
}
|
|
664
|
+
const target = fields.find((f) => Number(f.x) === ax && Number(f.y) === ay);
|
|
665
|
+
if (!target) {
|
|
666
|
+
console.error(`锚点格 (${ax},${ay}) 上没有单元格,无法冻结。`);
|
|
667
|
+
process.exitCode = 1;
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
const prev = fields.filter((f) => f.fixed === 1 || f.tag?.fixed).map((f) => `(${f.x},${f.y})`);
|
|
671
|
+
console.log(`冻结锚点 (${ax},${ay});原有锚点:${prev.length ? prev.join(' ') : '无'}`);
|
|
672
|
+
if (!raw.apply) {
|
|
673
|
+
console.log('(预演,未落库。加 --apply 执行)');
|
|
674
|
+
return;
|
|
675
|
+
}
|
|
676
|
+
// 重建工作簿:先清掉所有旧 fixed,再打新锚点
|
|
677
|
+
const patched = fields.map((f) => ({ ...f, fixed: 0 }));
|
|
678
|
+
const wb = mergeWorkbookSafe({ ...dev, fields: patched }, {
|
|
679
|
+
patchFn: (w) => {
|
|
680
|
+
for (const sheet of Object.values(w.sheets || {})) {
|
|
681
|
+
const dt = sheet?.data?.dataTable || {};
|
|
682
|
+
for (const row of Object.values(dt)) {
|
|
683
|
+
for (const cell of Object.values(row)) {
|
|
684
|
+
if (cell?.tag)
|
|
685
|
+
cell.tag.fixed = false;
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
const cell = dt[String(ax)]?.[String(ay)];
|
|
689
|
+
if (cell?.tag)
|
|
690
|
+
cell.tag.fixed = true;
|
|
691
|
+
// 下面两个只影响设计器显示,真正持久化的只有 cell.tag.fixed
|
|
692
|
+
sheet.frozenRowCount = ax;
|
|
693
|
+
sheet.frozenColCount = ay;
|
|
694
|
+
sheet.tag = { ...(sheet.tag || {}), fixedCell: { x: ax, y: ay } };
|
|
695
|
+
}
|
|
696
|
+
},
|
|
697
|
+
});
|
|
698
|
+
const fresh = await getReportDevInfo(http, reportId);
|
|
699
|
+
await saveReportDevInfo(http, {
|
|
700
|
+
appId,
|
|
701
|
+
reportId,
|
|
702
|
+
name: String(base.name || ''),
|
|
703
|
+
workbook: wb,
|
|
704
|
+
designKey: String(fresh.designKey || ''),
|
|
705
|
+
groupId: String(base.groupId ?? '0'),
|
|
706
|
+
nameLabelId: String(base.nameLabelId ?? '-1'),
|
|
707
|
+
});
|
|
708
|
+
const after = await getReportDevInfo(http, reportId);
|
|
709
|
+
const fixedNow = (after.fields || []).filter((f) => Number(f.fixed) === 1);
|
|
710
|
+
const ok = fixedNow.length === 1 && Number(fixedNow[0].x) === ax && Number(fixedNow[0].y) === ay;
|
|
711
|
+
console.log(ok
|
|
712
|
+
? `已冻结:锚点 (${ax},${ay}) 生效`
|
|
713
|
+
: `⚠️ 回读校验不通过:当前 fixed 格 ${fixedNow.map((f) => `(${f.x},${f.y})`).join(' ') || '无'}`);
|
|
714
|
+
if (!ok)
|
|
715
|
+
process.exitCode = 2;
|
|
716
|
+
});
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
//# sourceMappingURL=report-validate.js.map
|