@agile-team/mach-report 2.16.0 → 2.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -12
- package/dist/{ExcelBindingWizard-CP6h2x1f.cjs → ExcelBindingWizard-Czn3C2yE.cjs} +1 -1
- package/dist/{ExcelBindingWizard-HhB3hAJE.js → ExcelBindingWizard-DMGZj6I6.js} +3 -3
- package/dist/ParamEditor-KzDQvbHY.js +732 -0
- package/dist/ParamEditor-oDfD8LgE.cjs +1 -0
- package/dist/{ReportBatchPanel-ruxcbfY6.js → ReportBatchPanel-BJK7PvZ4.js} +39 -39
- package/dist/ReportBatchPanel-DnmNRssu.cjs +1 -0
- package/dist/ReportParamPanel-mQkeN70Q.js +1020 -0
- package/dist/ReportParamPanel-sOANVRz-.cjs +1 -0
- package/dist/ReportPreview-BxWWTUL5.js +5583 -0
- package/dist/ReportPreview-Yf99omi3.cjs +6 -0
- package/dist/{ReportTemplateLibrary-DcwrH-63.js → ReportTemplateLibrary-BFjB08Wu.js} +1 -1
- package/dist/{ReportTemplateLibrary-BDlNT8JN.cjs → ReportTemplateLibrary-BO42QnWd.cjs} +1 -1
- package/dist/RuleEditor-CqxT1a-W.js +2337 -0
- package/dist/RuleEditor-D7YWigD9.cjs +1 -0
- package/dist/{TemplateOutlinePanel-CGrT5DFN.cjs → TemplateOutlinePanel-B0XX350V.cjs} +1 -1
- package/dist/{TemplateOutlinePanel-SXCjaPKR.js → TemplateOutlinePanel-zG0DrsIB.js} +2 -2
- package/dist/{TemplateReusePanel-6Z3wRFz8.cjs → TemplateReusePanel-BD0HSKp_.cjs} +1 -1
- package/dist/{TemplateReusePanel-lHLOS9Wn.js → TemplateReusePanel-Czwe5GbC.js} +2 -2
- package/dist/{TemplateReviewPanel-Dpk7sLcF.cjs → TemplateReviewPanel-CA5sdffM.cjs} +1 -1
- package/dist/{TemplateReviewPanel-CJ9PLc48.js → TemplateReviewPanel-NhmQI65C.js} +2 -2
- package/dist/analytics.cjs +1 -1
- package/dist/analytics.d.cts +163 -42
- package/dist/analytics.d.ts +163 -42
- package/dist/analytics.js +76 -141
- package/dist/artifact-integrity.json +110 -108
- package/dist/assets-2eC3mOcV.js +232 -0
- package/dist/assets-B0Hxn4l6.cjs +1 -0
- package/dist/{auto-uVBjX1j5.cjs → auto-B0EZFIK1.cjs} +1 -1
- package/dist/{auto-YR7a4BtF.js → auto-BlchZ1b8.js} +10 -10
- package/dist/{batch-WzDIXJAt.js → batch-DGCt44XM.js} +1 -1
- package/dist/{batch-z6Aw5GEY.cjs → batch-DYcokH4v.cjs} +1 -1
- package/dist/charts-Dlv8j2AG.js +141 -0
- package/dist/charts-aCtoswXq.cjs +1 -0
- package/dist/codes.cjs +9 -9
- package/dist/codes.d.cts +54 -0
- package/dist/codes.d.ts +54 -0
- package/dist/codes.js +12097 -13668
- package/dist/column-visual-BpgQVWwT.js +238 -0
- package/dist/column-visual-CtYxnBCP.cjs +1 -0
- package/dist/component-tree-6TV7W6Yj.cjs +1 -0
- package/dist/component-tree-CvW4lzpv.js +67 -0
- package/dist/computed-4TnxzgIh.cjs +1 -0
- package/dist/computed-C8NRZQss.js +739 -0
- package/dist/data-bar-Ce38juRZ.cjs +1 -0
- package/dist/data-bar-PtjXhMgN.js +9 -0
- package/dist/dataset-DL83majE.js +161 -0
- package/dist/dataset-IrlXbUvh.cjs +1 -0
- package/dist/designer--TKECSEc.cjs +2 -0
- package/dist/designer-d6hJS41w.js +5683 -0
- package/dist/designer.cjs +1 -1
- package/dist/designer.d.cts +835 -45
- package/dist/designer.d.ts +835 -45
- package/dist/designer.js +23 -20
- package/dist/{encoding-BYF9ZTl9.cjs → encoding-B--eZpp1.cjs} +1 -1
- package/dist/{encoding-BOGq4qYL.js → encoding-mctOLocI.js} +2 -2
- package/dist/{font-loader-EKLzOJxf.cjs → font-loader-DBBJ5KE9.cjs} +1 -1
- package/dist/{font-loader-CzI1GuBc.js → font-loader-DW8tIaNp.js} +1 -1
- package/dist/index-CPh6tqge.js +1575 -0
- package/dist/index-CUNw7dL9.cjs +1 -0
- package/dist/index.cjs +8 -8
- package/dist/index.d.cts +534 -16
- package/dist/index.d.ts +534 -16
- package/dist/index.js +1393 -955
- package/dist/json-snapshot-By4ZVVUt.js +1967 -0
- package/dist/json-snapshot-jiXff4lc.cjs +2 -0
- package/dist/matrix-0hywp0-F.cjs +1 -0
- package/dist/matrix-Dy-tyY7E.js +381 -0
- package/dist/param-validation-C-8sRJLq.cjs +1 -0
- package/dist/param-validation-CnDEd2l-.js +333 -0
- package/dist/{pdf-DJ5S6ukC.js → pdf-CKROKygt.js} +1845 -1845
- package/dist/{pdf-ByVCb1i6.cjs → pdf-DqyxJ96U.cjs} +47 -47
- package/dist/pdf.cjs +1 -1
- package/dist/pdf.d.cts +66 -0
- package/dist/pdf.d.ts +66 -0
- package/dist/pdf.js +2 -2
- package/dist/{plugin-C2j5_mhx.js → plugin-ByjF2kiV.js} +5 -5
- package/dist/{plugin-Dr39GBRG.cjs → plugin-DM1M2wlI.cjs} +1 -1
- package/dist/prefill-B8H9qwE4.js +371 -0
- package/dist/prefill-D7EswyTI.cjs +1 -0
- package/dist/{prepared-DqtpvRTn.js → prepared-BE-4jfX5.js} +2 -2
- package/dist/{prepared-DdrjLC7L.cjs → prepared-CGVphji3.cjs} +1 -1
- package/dist/{protocol-BzwMP4Vw.cjs → protocol-ByRVzzQG.cjs} +1 -1
- package/dist/{protocol-kt4Iy6-3.js → protocol-Cr81vFSQ.js} +3 -3
- package/dist/{record-bindings-CZWBJ1fU.js → record-bindings-DEJtmo3p.js} +67 -107
- package/dist/record-bindings-ehjnCDHt.cjs +1 -0
- package/dist/{region-binding-workflow-CWNvIjkV.js → region-binding-workflow-CBg0l_tj.js} +2 -2
- package/dist/{region-binding-workflow-CqSMxQ4p.cjs → region-binding-workflow-D05tOYn3.cjs} +1 -1
- package/dist/report-encoding-worker.cjs +1 -1
- package/dist/report-encoding-worker.js +1 -1
- package/dist/{report-params-B1RzkhJj.js → report-params-D9tBuM9B.js} +1 -1
- package/dist/{report-params-WDGrA4oP.cjs → report-params-VTg8MoCp.cjs} +1 -1
- package/dist/runtime-CDA6d263.cjs +1 -0
- package/dist/runtime-CEMvybO7.js +170 -0
- package/dist/sbom.cdx.json +1 -1
- package/dist/server/node.d.cts +121 -7
- package/dist/server/node.d.ts +121 -7
- package/dist/server-node.cjs +4 -4
- package/dist/server-node.js +3446 -2115
- package/dist/server.cjs +1 -1
- package/dist/server.d.cts +417 -29
- package/dist/server.d.ts +417 -29
- package/dist/server.js +787 -544
- package/dist/sha256-BDQ1Qk7A.js +158 -0
- package/dist/sha256-DgZAKXqI.cjs +1 -0
- package/dist/style.css +1 -1
- package/dist/template-bindings-Cg5oBLFT.cjs +1 -0
- package/dist/template-bindings-TKnXM7ll.js +62 -0
- package/dist/{template-catalog-BtR2JmCL.js → template-catalog-CmbWOJqy.js} +16 -16
- package/dist/template-catalog-Utu4GP09.cjs +1 -0
- package/dist/{template-fragments-BVsbxs4a.cjs → template-fragments-C_zSHJAa.cjs} +1 -1
- package/dist/{template-fragments-By0aZC1D.js → template-fragments-DWgo9tlZ.js} +2 -2
- package/dist/{template-outline-BwRV_eRo.cjs → template-outline-DWkzZXVC.cjs} +1 -1
- package/dist/{template-outline-cnWfT_LK.js → template-outline-DiADphlq.js} +1 -1
- package/dist/{template-registry-Cw3vRTX2.js → template-registry-BIhIHOab.js} +319 -314
- package/dist/template-registry-DzWswQI5.cjs +1 -0
- package/dist/vue/async.d.cts +636 -35
- package/dist/vue/async.d.ts +636 -35
- package/dist/vue/index.d.cts +746 -67
- package/dist/vue/index.d.ts +746 -67
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +3 -3
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +94 -89
- package/dist/{workbook-session-Cbts-22R.cjs → workbook-session-B94EwVa_.cjs} +1 -1
- package/dist/{workbook-session-BeSO8PFB.js → workbook-session-BoScoOg-.js} +2 -2
- package/dist/worker.cjs +1 -1
- package/dist/worker.d.cts +75 -7
- package/dist/worker.d.ts +75 -7
- package/dist/worker.js +4 -4
- package/dist/xlsx.cjs +4 -4
- package/dist/xlsx.d.cts +208 -15
- package/dist/xlsx.d.ts +208 -15
- package/dist/xlsx.js +288 -252
- package/package.json +1 -1
- package/dist/ParamEditor-CUQLgoxa.cjs +0 -1
- package/dist/ParamEditor-OKesP_nO.js +0 -594
- package/dist/ReportBatchPanel-cZCAMAwH.cjs +0 -1
- package/dist/ReportPreview-BcDKCLiK.js +0 -4834
- package/dist/ReportPreview-Bk9nLfO9.cjs +0 -6
- package/dist/RuleEditor-BX5S8RSF.cjs +0 -1
- package/dist/RuleEditor-CGl9XY2s.js +0 -2037
- package/dist/assets-CqIbfbTr.js +0 -126
- package/dist/assets-e4YSke8n.cjs +0 -1
- package/dist/capabilities-DDwXr_cA.js +0 -103
- package/dist/capabilities-DNLyZdNw.cjs +0 -1
- package/dist/component-tree-Ca6YYfHq.js +0 -61
- package/dist/component-tree-DkGLEfZC.cjs +0 -1
- package/dist/computed-C-4C2S5h.js +0 -521
- package/dist/computed-CGV2a809.cjs +0 -1
- package/dist/config-Dg_o8e7m.cjs +0 -1
- package/dist/config-XQ4qrQ7Q.js +0 -844
- package/dist/dataset-BkRmwgeJ.cjs +0 -1
- package/dist/dataset-H5pFuQGU.js +0 -121
- package/dist/designer-BfQSahxq.js +0 -5163
- package/dist/designer-CPPdeM5_.cjs +0 -2
- package/dist/diagnostic-notification-B9K9We3h.cjs +0 -1
- package/dist/diagnostic-notification-qGAYZdkB.js +0 -7
- package/dist/drill-CsdjgkRM.cjs +0 -1
- package/dist/drill-DIGsZfyB.js +0 -145
- package/dist/json-snapshot-D6ioHth9.js +0 -1702
- package/dist/json-snapshot-DknkjvxP.cjs +0 -2
- package/dist/matrix-CGRGkn5s.js +0 -112
- package/dist/matrix-gEO7ZM_u.cjs +0 -1
- package/dist/param-validation-C3HlcLLO.cjs +0 -1
- package/dist/param-validation-Do7Eg8Zv.js +0 -181
- package/dist/record-bindings-DUX1VMlR.cjs +0 -1
- package/dist/runtime-BjKBI530.js +0 -168
- package/dist/runtime-CBFEPKEs.cjs +0 -1
- package/dist/sha256-BshdOkCC.cjs +0 -1
- package/dist/sha256-DTG-Gq8i.js +0 -157
- package/dist/template-bindings-C2SpvsMU.js +0 -58
- package/dist/template-bindings-CEtWyiLX.cjs +0 -1
- package/dist/template-catalog-C2NLdrwB.cjs +0 -1
- package/dist/template-registry-C62vpv4a.cjs +0 -1
- package/dist/tree-BX380Rr7.cjs +0 -1
- package/dist/tree-CjVZLRw7.js +0 -172
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const re=require("./component-tree-6TV7W6Yj.cjs"),$=require("./style-C22Pbv3T.cjs"),j=require("./textwrap-BI-yJ6Wt.cjs"),P=require("./computed-4TnxzgIh.cjs"),E=require("./record-bindings-ehjnCDHt.cjs"),Be=require("./charts-aCtoswXq.cjs"),xe=require("./matrix-0hywp0-F.cjs"),oe=require("./grid-geometry-CZ_cYB6O.cjs"),V=require("./column-visual-CtYxnBCP.cjs"),K=require("./template-registry-DzWswQI5.cjs"),Bt=require("./report-params-VTg8MoCp.cjs"),He=require("./param-validation-C-8sRJLq.cjs"),Xe=require("./number-format-CZ2T_5kF.cjs"),Ee=require("./dataset-IrlXbUvh.cjs"),Ht=4096,Ve=128*1024;function Vt(e){const t=new Map;let r=0;return{measureMm(o,n){const a=JSON.stringify([o,n.fontSizePt,n.fontFamily,n.bold,n.italic,n.letterSpacingPt]),s=t.get(a);if(s!==void 0)return t.delete(a),t.set(a,s),s;const i=e.measureMm(o,n);if(Number.isFinite(i)&&a.length<=Ve){for(;t.size>=Ht||r+a.length>Ve;){const c=t.keys().next().value;r-=c.length,t.delete(c)}t.set(a,i),r+=a.length}return i}}}class H extends Error{constructor(t,r){super(`报表页数超出上限 ${t}(至少 ${r} 页)`),this.limit=t,this.actual=r,this.code="page-limit",this.name="PaginatePageLimitError"}}class J extends Error{constructor(t,r){super(`报表单元格数量超出上限 ${t}(至少 ${r} 格)`),this.limit=t,this.actual=r,this.code="cell-limit",this.name="PaginateCellLimitError"}}class q extends Error{constructor(t,r){super(`报表图表图元数量预计超出上限 ${t}(本次估算 ${r})`),this.limit=t,this.estimated=r,this.code="chart-component-limit",this.name="PaginateChartComponentLimitError"}}const Re=5e4;function ne(e=Re){if(!Number.isSafeInteger(e)||e<1||e>1e6)throw new RangeError("maxChartComponents 应为 1..1000000 的安全整数")}function Gt(e,t,r){const o=e.chartBinding;if(e.kind!=="chart"||e.grid||e.imageData||e.binding||e.pageAnchor)throw new TypeError("绑定图表不能同时设置图片、网格、记录绑定或页眉页脚");const n=Object.prototype.hasOwnProperty.call(t,o.dataset)?t[o.dataset]:void 0;if(!Array.isArray(n))throw new TypeError(`图表数据集 ${o.dataset} 未提供`);return{...xe.createReportChartData(n,o,r),type:o.type,leftMm:e.leftMm,topMm:e.topMm,widthMm:e.widthMm,heightMm:e.heightMm,title:o.title,showValues:o.showValues}}function _t(e,t,r=Re){ne(r);let o=0;return Object.assign(a=>{if(!a.chartBinding)return[a];const s=Gt(a,e,t),i=o+(s.categories.length?Be.chartComponentUpperBound(s):1);if(!Number.isSafeInteger(i))throw new RangeError("图表图元估算应为有限安全整数");if(i>r)throw new q(r,i);const c=s.categories.length?Be.createChartComponents(s):[{kind:"text",leftMm:a.leftMm,topMm:a.topMm,widthMm:a.widthMm,heightMm:a.heightMm,text:"—",style:{align:"center",verticalAlign:"middle",color:"#94a3b8",fontSize:10}}];return o+=c.length,c},{used:()=>o})}function Wt(e,t){return{member:"body",subtotal:"subtotal",total:"grand-total"}[e?.rows.get(t)?.kind??"member"]}function zt(e){const t=e.matrix;if(!t.hierarchy)return t;const r=new Map(e.columns.map(n=>[n.field,n.header])),o={sum:"求和",count:"计数",avg:"平均",min:"最小",max:"最大",weightedAvg:"加权平均"};return{...t,hierarchy:{...t.hierarchy,row:{...t.hierarchy.row,labels:t.hierarchy.row?.labels??t.rowFields.map(n=>r.get(n)??n)},column:{...t.hierarchy.column,labels:t.hierarchy.column?.labels??t.columnFields.map(n=>r.get(n)??n)}},measures:t.measures.map(n=>{const a=r.get(n.field)??r.get(n.valueField??n.field);return n.label===void 0&&a?{...n,label:`${a}(${o[n.op]})`}:n})}}function Jt(e,t){if(!e.matrix)return{list:e,rows:t};if(e.detail||e.groupBy||e.groups?.length||e.grandTotal)throw new Error("矩阵不能同时配置普通分组、总计或主从明细");const r=xe.createMatrixTable(t,zt(e)),o=r.columns.map(i=>({...i,widthMm:i.semanticRole==="dimension"?e.matrix.rowWidthMm??40:e.matrix.columnWidthMm??28,editable:!1,align:i.semanticRole==="dimension"?"center":"right"})),n={...e,columns:o,headerGrid:r.headerGrid,rowKey:void 0,revisionField:void 0,sourceTokenField:void 0};e.layout==="wide"&&(n.widthMm=o.reduce((i,c)=>i+c.widthMm,0));const a=r.metadata,s=a?{rows:new WeakMap(r.rows.map((i,c)=>[i,a.rows[c]])),header:{columns:a.columns,rowFields:a.rowFields,rowLabels:a.rowLabels,columnFields:a.columnFields,columnLabels:a.columnLabels}}:void 0;return{list:n,rows:r.rows,...s?{matrix:s}:{}}}function qt(e,t){if(!e.matrix?.hierarchy||!e.headerGrid)return e.headerGrid;const r=e.paddingMm??1,o=e.headerGrid.cells.map(()=>e.rowHeightMm??0),n=e.columns.map(c=>c.widthMm),a=oe.resolveGridLayout({...e.headerGrid,colWidthsMm:n},n.reduce((c,l)=>c+l,0),o.length),s=new WeakMap;for(const{cell:c,ci:l,ri:d,widthMm:f}of a.cells){const u={...E.resolveListHeaderStyle(e,e.columns[l]),...c.style},g=$.resolveFontSize(u).fontSizePt,v=(j.wrapText(c.text??"",Math.max(1,f-r*2),{fontSizePt:g,fontFamily:u.fontFamily,bold:u.bold,italic:u.italic,letterSpacingPt:u.letterSpacing},t).length*g*(u.lineHeight??$.LINE_HEIGHT)*25.4/72+r*2)/(c.rowSpan??1);for(let y=d;y<d+(c.rowSpan??1);y++)o[y]=Math.max(o[y]??0,v);s.set(c,u)}const i=e.headerGrid.cells.map(c=>c.map(l=>l?{...l,style:s.get(l)}:null));return{...e.headerGrid,cells:i,rowHeightsMm:o}}function Ut(e,t,r){const o=new Set,n=e.cells.map((a,s)=>{const i=[];let c=0;for(const l of a){for(;o.has(`${s}:${c}`);)c++;const d=l?.colSpan??1,f=l?.rowSpan??1;let u=0;for(let g=c;g<c+d;g++){t.has(g)&&u++;for(let m=s+1;m<s+f;m++)o.add(`${m}:${g}`)}u&&i.push(l?{...l,colSpan:u}:null),c+=d}return i});return{...e,cells:n,colWidthsMm:r}}function Ye(e){if(!e.columns.some(o=>o.hidden))return e;const t=new Set,r=e.columns.filter((o,n)=>o.hidden?!1:(t.add(n),!0));if(!r.length)throw new Error("列表至少需要一列可见列");return{...e,columns:r,...e.headerGrid?{headerGrid:Ut(e.headerGrid,t,r.map(o=>o.widthMm))}:{}}}function*Xt(e){const{page:t}=e;K.validateReportPageFlow(t.components,t.flow);let r=0,o=0;for(const n of K.reportFlowGroups(t.components,t.flow)){e.active();const a=n.band,s=n.components.some(d=>d.kind==="list"&&d.cardinality!=="record"),i=s?0:n.components.reduce((d,f)=>Math.max(d,f.topMm-a.topMm+(f.kind==="list"?e.height(f):f.heightMm)),a.heightMm);let c=Math.max(e.top(),o+a.topMm-r);if(!s&&i>e.bottom()-e.top()+.001)throw new Error(`静态区域 ${a.componentIds.join(",")} 高度超出单页可用范围`);!s&&c+i>e.bottom()+.001&&(e.nextPage(),yield*e.takePages(),e.active(),c=e.top());let l=c+i;for(const d of n.components){const f=c+d.topMm-a.topMm;d.kind==="list"?(yield*e.list(d,f,u=>{l=s?u:Math.max(l,u)}),e.active()):e.append({...d,topMm:f})}o=l,r=a.topMm+a.heightMm}}function Yt(e){return!!(e.computed?.length||e.groups?.length||e.groupBy||e.grandTotal||e.rowVisibleWhen||e.matrix||e.tree||e.detail||e.columns.some(t=>t.rules?.length||t.visibleWhen||t.visual))}function ae(e){return e.pages.some(t=>t.components.some(r=>r.kind==="list"?Yt(r):!!r.chartBinding))}const Qt=512,Ge=256*1024;function Zt(){const e=new Map;let t=0,r;return(o,n,a,s)=>{s!==r&&(e.clear(),t=0,r=s);const i=JSON.stringify([o,n,a.fontSizePt,a.fontFamily,a.bold,a.italic,a.letterSpacingPt]),c=e.get(i);if(c)return e.delete(i),e.set(i,c),c.lines.slice();const l=j.wrapText(o,n,a,s),d=i.length+l.reduce((f,u)=>f+u.length,0);if(d<=Ge){for(;e.size>=Qt||t+d>Ge;){const f=e.keys().next().value;t-=e.get(f).units,e.delete(f)}e.set(i,{lines:l.slice(),units:d}),t+=d}return l}}const Qe=1e4,_e=25e4;function Ce(e){if(e?.aborted)throw e.reason??new DOMException("标签生成已取消","AbortError")}function Ze(e,t,r){const o=typeof e.copies=="object"?E.readRecordScalar(t,e.copies.field,r):e.copies??1;if(typeof o!="number"||!Number.isSafeInteger(o)||o<1||o>1e3)throw new E.ReportBindingError(`$.datasets.${r.dataset}[${r.rowIndex}]`,"每条记录复制数必须是 1..1000 的数值型整数",r.rowIndex,typeof e.copies=="object"?e.copies.field:void 0);return o}function et(e,t,r){if(e.rowKey===void 0)return;const o=E.readRecordScalar(t,e.rowKey,r);if(typeof o=="string"&&o.trim()||typeof o=="number"&&Number.isFinite(o))return o;throw new E.ReportBindingError(`$.datasets.${r.dataset}[${r.rowIndex}].${e.rowKey}`,"业务主键必须是非空字符串或有限数字",r.rowIndex,e.rowKey)}function er(e){const t=r=>1+(r.grid?.cells.reduce((o,n)=>o+1+n.length+n.reduce((a,s)=>a+(s?.children?.reduce((i,c)=>i+t(c),0)??0),0),0)??0);return e.pages.reduce((r,o)=>r+o.components.reduce((n,a)=>n+t(a),0),0)}function tr(e,t,r){const o=e.repeat,n=Object.prototype.hasOwnProperty.call(t,o.dataset)?t[o.dataset]:void 0;if(!Array.isArray(n))throw new E.ReportBindingError(`$.datasets.${o.dataset}`,"逐记录标签数据集缺失,应提供对象数组(允许空数组)");const a=new Set,s=r.maxPages??Qe,i=er(e);let c=0,l=0;for(const[d,f]of n.entries()){if(Ce(r.signal),!f||typeof f!="object"||Array.isArray(f))throw new E.ReportBindingError(`$.datasets.${o.dataset}[${d}]`,"标签记录应为对象",d);const u={rowIndex:d,dataset:o.dataset},g=et(o,f,u);if(g!==void 0){const v=JSON.stringify([typeof g,g]);if(a.has(v))throw new E.ReportBindingError(`$.datasets.${o.dataset}[${d}].${o.rowKey}`,"业务主键重复;请先确认记录来源,避免重复打印标签",d,o.rowKey);a.add(v)}const m=Ze(o,f,u);if(c+=m*e.pages.length,l+=m*i,c>s)throw new H(s,c);if(l>_e)throw new E.ReportBindingError("$.repeat",`标签组件总量(含网格行、槽位及嵌套组件)超过安全预算 ${_e},请分批生成`,d)}return n}function rr(e,t,r){if(!e.binding)return e;const{binding:o,...n}=e,a=E.resolveComponentBinding(o,t.row,t);if(e.kind==="image"){if(!a)return;if(!E.isLabelImageData(a))throw new E.ReportBindingError(`${r}.binding`,"图片字段只接受 PNG/JPEG base64 data URL;业务 URL 应由宿主安全加载后转换",t.rowIndex,o.field);return{...n,imageData:a}}return e.kind==="barcode"||e.kind==="qrcode"?(delete n.imageData,{...n,code:{...n.code,value:a},fallbackText:a}):(delete n.lines,delete n.richParagraphs,{...n,text:a})}function or(e,t,r){if(e.kind!=="text"||e.grid||e.richParagraphs?.length)return e;const o=e.style??{},n=$.resolveFontSize(o).fontSizePt,a=e.text??e.lines?.join(`
|
|
2
|
+
`)??"";if(a.length>16384)throw new E.ReportBindingError(r,"标签文本超过 16384 字符预算,请缩小字段内容",t.rowIndex);const s=t.wrapText(a,e.widthMm,{fontSizePt:n,bold:o.bold,italic:o.italic,fontFamily:o.fontFamily,letterSpacingPt:o.letterSpacing},t.options.measurer??j.heuristicMeasurer),i=s.length*n*$.resolveLineHeight(o)*25.4/72;if(i>e.heightMm+.05)throw new E.ReportBindingError(r,`标签文字需要约 ${i.toFixed(2)}mm 高,超出 ${e.heightMm}mm;请增大文本区域、减少内容或调整字号`,t.rowIndex,e.binding?.field);return{...e,lines:s}}function tt(e,t,r){Ce(t.options.signal);const o=rr(e,t,r);if(!o)return;let n=o.grid;return n&&(n={...n,cells:n.cells.map((a,s)=>a.map((i,c)=>i?.children?.length?{...i,children:i.children.flatMap((l,d)=>{const f=tt(l,t,`${r}.grid.cells.${s}.${c}.children.${d}`);return f?[f]:[]})}:i))}),or(n===o.grid?o:{...o,grid:n},t,r)}function nr(e,t,r,o,n,a){return{...e,components:e.components.flatMap((s,i)=>{const c=tt(s,r,`$.pages.${t}.components.${i}`);return c?[{...c,meta:{...c.meta,labelSource:{pageIndex:t,componentIndex:i}}}]:[]}),meta:{...e.meta,record:{dataset:r.dataset,rowIndex:r.rowIndex,...a===void 0?{}:{rowKey:a},copyIndex:o,copyCount:n,templatePageIndex:t}}}}function*ar(e,t,r){const o=[];if(K.validateTemplateRepeat(e,o),o.length)throw new E.ReportBindingError(o[0].path,o[0].message);if(!e.repeat){for(const[i,c]of e.pages.entries())yield{page:c,pageIndex:i};return}const n=e.repeat,a=tr(e,t,r),s=Zt();for(const[i,c]of a.entries()){const l={row:c,rowIndex:i,dataset:n.dataset,options:r,wrapText:s},d=Ze(n,c,l),f=et(n,c,l);for(let u=0;u<d;u++)for(const[g,m]of e.pages.entries())Ce(r.signal),yield{page:nr(m,g,l,u,d,f),pageIndex:g}}}function sr(e){return{widthMm:e.widthMm,heightMm:e.heightMm,marginTopMm:e.marginTopMm??0,marginBottomMm:e.marginBottomMm??0,marginLeftMm:e.marginLeftMm??0,marginRightMm:e.marginRightMm??0,components:[]}}function Z(e,t){const r=t.heightMm-(e.layout==="wide"?t.marginBottomMm:e.marginBottomMm??t.marginBottomMm);return e.components.reduce((o,n)=>n.kind!=="list"&&n.pageAnchor==="footer"?Math.min(o,n.topMm):o,r)}function U(e){return e.components.reduce((t,r)=>r.kind!=="list"&&r.pageAnchor==="header"?Math.max(t,r.topMm+r.heightMm):t,0)}function rt(e,t){let r=e.textMetrics.get(t);if(!r){const o=$.resolveFontSize(t).fontSizePt;r={measureOptions:{fontSizePt:o,fontFamily:t.fontFamily??$.DEFAULT_FONT_FAMILY,italic:t.italic,bold:t.bold,letterSpacingPt:t.letterSpacing},lineMm:o*(t.lineHeight??$.LINE_HEIGHT)*25.4/72},e.textMetrics.set(t,r)}return r}function ir(e){if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e}function Te(e,t,r=[],o){const n=e.fontSizePt??$.DEFAULT_FONT_PT,a=e.paddingMm??1,s=e.columns.map(h=>h.align??h.style?.align??e.align??"left"),i=e.columns.map((h,w)=>({...$.mergeComponentStyles({fontSize:n,verticalAlign:"middle"},h.style),align:s[w]==="auto"?"left":s[w]})),c=i.map((h,w)=>s[w]==="auto"?{left:h,center:{...h,align:"center"},right:{...h,align:"right"}}:void 0),l=e.columns.map((h,w)=>h.rules?.map(x=>{const I=c[w];if(I)return{left:$.mergeComponentStyles(I.left,x.style),center:$.mergeComponentStyles(I.center,x.style),right:$.mergeComponentStyles(I.right,x.style)};const T=$.mergeComponentStyles(i[w],x.style);return{left:T,center:T,right:T}})),d=e.columns.map(h=>E.resolveListHeaderStyle(e,h)),f=e.columns.map(h=>h.header);let u=e.rowHeightMm??0;for(let h=0;h<f.length;h++){const w=d[h],x=$.resolveFontSize(w).fontSizePt,I=j.wrapText(f[h],e.columns[h].widthMm-a*2,{fontSizePt:x,fontFamily:w.fontFamily??$.DEFAULT_FONT_FAMILY,italic:w.italic,bold:w.bold,letterSpacingPt:w.letterSpacing},t),T=x*(w.lineHeight??$.LINE_HEIGHT)*25.4/72;u=Math.max(u,Math.max(I.length,1)*T+a*2)}const g=f.map((h,w)=>({text:h,style:d[w]})),m=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0},v=e.columns.map(h=>h.widthMm),y=cr(qt(e,t),v,{cells:[g],colWidthsMm:v,rowHeightsMm:[u],paddingMm:a});return{fontSizePt:n,paddingMm:a,visuals:V.createColumnVisualResolvers(e.columns,r,o),visibility:e.columns.map(h=>h.visibleWhen?P.compileReportPredicate(h.visibleWhen):void 0),ruleReaders:e.columns.map(h=>h.rules?.map(w=>P.compileReportPredicate(w.when))),cellStyles:i,autoStyles:c,ruleStyles:l,textMetrics:new WeakMap,numberFormats:e.columns.map(h=>E.toExcelNumberFormat(h.format)),derivedFields:new Set(e.computed?.map(h=>h.field)),borderStyle:m,headerHeightMm:y.rowHeightsMm.reduce((h,w)=>h+w,0),headerGrid:y,colWidthsMm:v,columns:e.columns}}function cr(e,t,r){if(!e)return r;if(!e.cells.length)throw new Error("自定义列表表头至少需要一行");const o=e.rowHeightsMm??e.cells.map(()=>r.rowHeightsMm[0]);if(o.length!==e.cells.length||o.some(n=>!Number.isFinite(n)||n<=0))throw new Error("自定义列表表头行高无效");return{...e,colWidthsMm:t,rowHeightsMm:o}}function lr(e,t,r){const o=t.format?.kind==="number"||t.format?.kind==="percent";t.valueType!==void 0?e.valueType=t.valueType:o&&(e.valueType="number"),t.editable!==void 0&&(e.editable=t.editable),(typeof e.value=="number"||e.value==null)&&r!==void 0&&(e.numberFormat=r)}function X(e,t,r){const o=e.columns,n=e.tree?.rows.get(t);let a=e.rowHeightFloorMm;const s=new Array(o.length);for(let i=0;i<o.length;i++){const c=o[i],l=e.visibility[i]?.(t)!==!1,d=l?t[c.field]:null,f=e.autoStyles[i]?E.resolveListAutoAlignment(d,c.format,c.semanticRole):"left";let u=e.autoStyles[i]?.[f]??e.cellStyles[i];if(c.rules){for(let x=0;x<c.rules.length;x++)if(e.ruleReaders[i][x](t)){u=e.ruleStyles[i][x][f];break}}const g=c.format?E.formatValue(d,c.format):E.listCellText(d),m=dr(e,c,n);u=ur(e,c,u,n);const v=rt(e,u),y=j.wrapText(g,Math.max(1,c.widthMm-e.paddingMm*2-m),v.measureOptions,r);a=Math.max(a,y.length*v.lineMm+e.paddingMm*2);const h=ir(d),w={text:g,style:u};d!=null&&e.visuals[i]?.apply(w,t),h!==void 0&&(w.value=h),lr(w,c,e.numberFormats[i]),fr(w,c,e,n,m),e.derivedFields.has(c.field)&&(w.derived=!0,w.editable=!1),l||(w.editable=!1),s[i]=w}return{grid:{cells:[s],colWidthsMm:e.colWidthsMm,rowHeightsMm:[a],paddingMm:e.paddingMm},heightMm:a,...e.matrix?{meta:{matrix:{row:e.matrix.rows.get(t)}}}:{}}}function dr(e,t,r){return!r||t.field!==e.tree.list.tree.labelField?0:E.listTreeIndent(e.tree.list,t,r,e.paddingMm)}function ur(e,t,r,o){return!o||t.field!==e.tree.list.tree.labelField||r.align==="left"?r:{...r,align:"left"}}function fr(e,t,r,o,n=0){o&&(n&&(e.indentMm=n),E.applyListTreeMetadata(e,t,o,r.tree.list))}function ot(e){if(e!=null&&typeof e!="string"&&typeof e!="boolean"&&!(typeof e=="number"&&Number.isFinite(e)))throw new Error("分组字段应为有限 JSON 标量");return JSON.stringify([typeof e,e??null])}function*nt(e,t,r=0){const o=t[r];if(!o){for(const a of e)yield{kind:"row",row:a};return}const n=new Map;for(const a of e){const s=ot(a[o.field]),i=n.get(s);i?i.push(a):n.set(s,[a])}for(const a of n.values())yield{kind:"groupHeader",label:(o.headerTemplate??"{value}").replace(/\{value\}/g,E.listCellText(a[0][o.field])),firstRow:a[0],group:o,depth:r,rows:a},yield*nt(a,t,r+1),(o.subtotal?.length||o.aggregates?.length)&&(yield{kind:"subtotal",label:o.subtotalLabel??"小计",rows:a,group:o,depth:r}),yield{kind:"groupEnd",depth:r}}function at(e,t,r,o=[]){const n=[...r.filter(a=>!o.some(s=>s.field===a)).map(a=>({field:a,op:"sum"})),...o];return new Map(n.map(a=>{const s=e.find(c=>c.field===a.field)?.format??{kind:"number",thousands:!0},i=P.aggregateRows(t,{...a,field:a.valueField??a.field});return[a.field,{text:E.formatValue(i,s),...i===null?{}:{value:i},...typeof i=="number"?{numberFormat:E.toExcelNumberFormat(s)}:{}}]}))}function st(e,t){const r=e.findIndex(o=>t.includes(o.field));return r<0?1:r}function z(e,t,r,o,n,a){const s=[],i=Math.max(0,Math.min(a,e.columns.length)),c=$.mergeComponentStyles({fontSize:e.fontSizePt},n);i&&s.push({text:r,colSpan:i,style:{bold:!0,...c}});for(let u=i;u<e.columns.length;u++){const g=e.columns[u],m=o.get(g.field),v=e.autoStyles[u]?.[E.resolveListAutoAlignment(m?.value,g.format)]??e.cellStyles[u];s.push({...m,text:m?.text??"",style:$.mergeComponentStyles(v,n)})}const l={text:r,colSpan:e.columns.length,style:{bold:!0,...c}},d=i?[s]:[[l],s],f=d.map(u=>mr(e,u,t));return{grid:{cells:d,colWidthsMm:e.colWidthsMm,rowHeightsMm:f,paddingMm:e.paddingMm},heightMm:f.reduce((u,g)=>u+g,0)}}function mr(e,t,r){let o=e.rowHeightFloorMm,n=0;for(const a of t){let s=0;const i=n+(a.colSpan??1);for(;n<i;n++)s+=e.colWidthsMm[n]??0;const c=rt(e,a.style),l=j.wrapText(a.text??"",s-e.paddingMm*2,c.measureOptions,r);o=Math.max(o,l.length*c.lineMm+e.paddingMm*2)}return o}function gr(e,t,r){const{templatePage:o,current:n,warnings:a,nextId:s,pushCurrent:i}=r,c=()=>Z(o,n),l=Math.max(n.marginTopMm,U(o)),d=o.layout==="wide"?U(o):l,f={id:r.tableId,columnKeys:e.columns.map(p=>p.field),...e.layout===void 0?{}:{layout:e.layout},...e.title===void 0?{}:{title:e.title}},u=new Map,g=new Map,m={kind:"rect",leftMm:e.leftMm,topMm:0,widthMm:e.widthMm,heightMm:t.headerHeightMm,grid:t.headerGrid,nid:s("listh"),table:{...f,role:"header",rowIndex:-1},style:t.borderStyle,...e.meta||t.matrix?{meta:{...e.meta,...t.matrix?{matrix:t.matrix.header}:{}}}:{}},v=p=>n.components.push({...m,topMm:p});if(r.flow&&e.header!==!1&&t.headerHeightMm>c()-l+.001)throw new Error(`流式列表 ${e.id??e.dataset} 的表头高度超出单页可用范围`);let y=Math.max(r.startTop??e.topMm,l);e.header!==!1&&(v(y),y+=t.headerHeightMm+r.mmPerRow);function h(){const p=Math.max(r.flow||o.layout==="wide"?0:e.topMm,d);return(e.header!==!1&&e.headerEveryPage!==!1?p+t.headerHeightMm:d)+[...g.values()].reduce((S,k)=>S+k.heightMm,0)}function w(){const p=o.layout==="wide"?0:n.marginBottomMm;return Math.min(o.heightMm-p,Z(o,n))-h()}function x(p){if(y+p<=c())return;i(),n.components=[],n.heightMm=o.heightMm,o.layout==="wide"&&(n.marginTopMm=0,n.marginBottomMm=0);const b=Math.max(r.flow||o.layout==="wide"?0:e.topMm,d);e.header!==!1&&e.headerEveryPage!==!1?(v(b),y=b+t.headerHeightMm):y=d;for(const S of g.values())T(S,"listgr","group-header")}function I(p,b,S,k){const C=w();if(r.flow&&p.heightMm>C+.001)throw new Error(`流式列表 ${e.id??e.dataset} 的单行高度超出单页可用范围`);p.heightMm>C&&a.push(`列表 ${e.id??e.dataset} 行高 ${p.heightMm.toFixed(2)}mm 超出单页可用高度 ${C.toFixed(2)}mm,预览与打印可能截断内容`),x(p.heightMm),T(p,b,S,k)}function T(p,b,S,k){const C=p.table?.id??f.id,F=S==="header"?-1:u.get(C)??0;S!=="header"&&u.set(C,F+p.grid.cells.length),n.components.push({kind:"rect",leftMm:e.leftMm,topMm:y,widthMm:e.widthMm,heightMm:p.heightMm,grid:p.grid,nid:s(b),table:{...f,...p.table,role:S,rowIndex:F,...k?{source:k}:{}},style:t.borderStyle,...e.meta||p.meta?{meta:{...e.meta,...p.meta}}:{}}),y+=p.heightMm}function N(p){p<=w()&&x(p)}return{keepTogether:N,placeGridRow:I,setGroupHeader:(p,b)=>{b?g.set(p,b):g.delete(p)},bottom:()=>y}}function hr(e,t){if(!e.rowKey)return;const r=t[e.rowKey];if((typeof r!="string"||!r.trim())&&!(typeof r=="number"&&Number.isFinite(r)))throw new Error(`数据集 ${e.dataset} 的 ${e.rowKey} 应为稳定的字符串或有限数字主键`);const o=e.revisionField?t[e.revisionField]:void 0,n=e.sourceTokenField?t[e.sourceTokenField]:void 0;if(o!==void 0&&typeof o!="string"&&!(typeof o=="number"&&Number.isFinite(o)))throw new Error("业务修订号应为字符串或有限数字");if(n!==void 0&&typeof n!="string")throw new Error("来源令牌应为字符串");return{datasetId:e.dataset,rowKey:r,...o===void 0?{}:{revision:o},...n===void 0?{}:{sourceToken:n}}}function se(e,t){const r=new Map;if(!e.rowKey)return r;const o=new Set;for(const n of t){const a=hr(e,n),s=JSON.stringify(a.rowKey);if(o.has(s))throw new Error(`数据集 ${e.dataset} 的业务主键重复:${String(a.rowKey)}`);o.add(s),r.set(n,a)}return r}function pr(e,t,r,o,n){if(!e.grandTotal)return;const a=typeof e.grandTotal=="object"?e.grandTotal:void 0,s=ie(e)[0],i=a?.fields??s?.subtotal??[],c=a?.aggregates??s?.aggregates??[];if(i.length===0&&c.length===0){o.warnings.push(`列表 ${e.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`);return}const l=z(r,o.measurer,a?.label??"合计",at(e.columns,t,i,c),a?.style??{},st(e.columns,[...i,...c.map(d=>d.field)]));n.placeGridRow(l,"listgt","grand-total")}function Y(e){if(e?.aborted){const t=new Error("报表排版已取消");throw t.name="AbortError",t}}function ie(e){const t=e.groups??(e.groupBy?[e.groupBy]:[]);if(t.length>16)throw new Error("列表最多支持 16 级分组");return t}function Pe(e){const t=Ye(e),r=t.columns.reduce((n,a)=>n+a.widthMm,0),o=r>t.widthMm?t.widthMm/r:1;return o===1?t:{...t,columns:t.columns.map(n=>({...n,widthMm:n.widthMm*o}))}}function wr(e,t,r){const o=e.detail;if(!o)return;const n=new Set;for(const l of t){const d=pe(l[o.parentKey]);if(n.has(d))throw new Error("主从明细的主表关联键重复");n.add(d)}const a=r.datasets[o.dataset]??[],s=new Map,i=[];for(const l of a){const d=l[o.foreignKey];if(!it(d)&&o.unmatched==="ignore")continue;const f=pe(d);if(!n.has(f)){if(o.unmatched!=="ignore")throw new Error(`明细数据集 ${o.dataset} 存在未关联的业务键`);continue}const u=s.get(f);u?u.push(l):s.set(f,[l]),i.push(l)}const c=Pe({...e,id:`${e.id??e.dataset}:detail`,dataset:o.dataset,rowKey:o.rowKey,revisionField:o.revisionField,sourceTokenField:o.sourceTokenField,computed:void 0,columns:o.columns,headerGrid:void 0,rowHeightMm:o.rowHeightMm??e.rowHeightMm,detail:void 0});return{list:c,inter:{...Te(c,r.measurer,i,r.signal),rowHeightFloorMm:c.rowHeightMm??0},rows:s,sources:se(c,i)}}function it(e){return typeof e=="string"&&!!e.trim()||typeof e=="number"&&Number.isFinite(e)}function pe(e){if(!it(e))throw new Error("主从关联键必须是非空字符串或有限数字");return ot(e)}function*yr(e,t,r,o,n){if(!r)return;const a=r.rows.get(pe(t[e.detail.parentKey]))??[];if(!a.length)return;const s={id:`${o.tableId}:detail`,columnKeys:r.list.columns.map(i=>i.field),title:e.detail.label};e.detail.label&&n.placeGridRow({...z(r.inter,o.measurer,e.detail.label,new Map,{},r.list.columns.length),table:s},"listdl","group-header"),e.detail.header!==!1&&n.placeGridRow({grid:r.inter.headerGrid,heightMm:r.inter.headerHeightMm,table:s},"listdh","header"),yield*o.takePages();for(const i of a)Y(o.signal),n.placeGridRow({...X(r.inter,i,o.measurer),table:s},"listdr","body",r.sources.get(i)),yield*o.takePages()}function ct(e){if(e.matrix||e.detail||e.groups?.length||e.groupBy||e.rowVisibleWhen)throw new Error("树形布局不能同时配置普通分组、矩阵、主从或行可见条件");if(e.rowKey&&e.rowKey!==e.tree.idField)throw new Error("树形布局的 rowKey 应与 idField 一致");if(!e.columns.some(t=>t.field===e.tree.labelField&&!t.hidden))throw new Error("树形布局需要可见的标签列");V.validateTreeComputed(e.tree,e.computed)}function br(e,t,r){ct(e);const o=V.createTreeTable(t,e.tree,{signal:r.signal,computed:e.computed?.length?{fields:e.computed,formula:r.formula}:void 0}),n={...e,rowKey:e.tree.idField},a=se(n,o.entries.map(c=>c.original)),s=new Map,i=new WeakMap;for(const c of o.entries)s.set(c.row,a.get(c.original)),i.set(c.row,c);return{list:n,rows:o.rows,sources:s,treeRows:i,totalRows:o.leaves}}function vr(e,t){if(e.cardinality==="record"){if(t.length>1)throw new Error(`单记录区域 ${e.id??e.dataset} 仅允许 0 或 1 行数据`);if(e.tree||e.matrix||e.detail||e.groups?.length||e.groupBy||e.grandTotal||e.rowVisibleWhen)throw new Error("单记录区域不能配置树、矩阵、主从、分组、总计或行过滤");if(!t.length)return{list:{...e,columns:e.columns.map(r=>({...r,editable:!1}))},rows:[{}],sources:new Map}}}function lt(e,t,r){const o=r.prepared.get(e);if(o)return o;const n=vr(e,t);if(n)return r.prepared.set(e,n),n;if(e.tree){const c=br(e,t,r);return r.prepared.set(e,c),c}let a=e.computed?.length?P.computeDataset(t,{fields:e.computed,signal:r.signal,formula:r.formula}).rows:t;const s=a===t?void 0:new Map(a.map((c,l)=>[c,t[l]]));e.rowVisibleWhen&&(a=a.filter(P.compileReportPredicate(e.rowVisibleWhen)));const i=Jt(e,a);if(!e.matrix){const c=se(e,s?a.map(l=>s.get(l)):a);i.sources=s?new Map(a.map(l=>[l,c.get(s.get(l))])):c}return r.prepared.set(e,i),i}function Mr(e,t,r,o){if(!o.flow)return;const{current:n,templatePage:a}=o,s=Math.max(n.marginTopMm,U(a)),i=Math.max(o.startTop??e.topMm,s),c=(e.header===!1?0:t.headerHeightMm)+(r[0]?X(t,r[0],o.measurer).heightMm:0);i+c<=Z(a,n)+.001||i<=s+.001||(o.pushCurrent(),n.components=[],n.heightMm=a.heightMm,a.layout==="wide"&&(n.marginTopMm=0,n.marginBottomMm=0),o.startTop=Math.max(n.marginTopMm,U(a)))}function*Sr(e,t,r){const o=lt(e,t,r),n=o.rows;e=o.list,e.layout==="wide"&&(r.current.widthMm=Math.max(r.current.widthMm,e.leftMm+e.widthMm+r.current.marginRightMm));const a=o.sources??se(e,n),s=Pe(e),i=ie(s),c={...Te(s,r.measurer,n,r.signal),rowHeightFloorMm:s.rowHeightMm??0,matrix:o.matrix,...o.treeRows?{tree:{list:s,rows:o.treeRows}}:{}};Mr(s,c,n,r);const l=gr(s,c,r),d=wr(s,n,r);let f;for(const u of nt(n,i)){if(Y(r.signal),u.kind==="row")l.placeGridRow(f??X(c,u.row,r.measurer),"listr",Wt(o.matrix,u.row),a.get(u.row)),f=void 0,yield*r.takePages(),yield*yr(s,u.row,d,r,l);else if(u.kind==="groupHeader"){const g=z(c,r.measurer,u.label,new Map,u.group.headerStyle??{},s.columns.length);f??=X(c,u.firstRow,r.measurer);const m=i.slice(u.depth+1).reduce((v,y)=>v+z(c,r.measurer,(y.headerTemplate??"{value}").replace(/\{value\}/g,E.listCellText(u.firstRow[y.field])),new Map,y.headerStyle??{},s.columns.length).heightMm,0);u.group.keepWithNext!==!1&&l.keepTogether(g.heightMm+m+f.heightMm),l.placeGridRow(g,"listg","group-header"),u.group.repeatHeader&&l.setGroupHeader(u.depth,g)}else if(u.kind==="subtotal"){const g=u.group.subtotal??[],m=u.group.aggregates??[],v=z(c,r.measurer,u.label,at(s.columns,u.rows,g,m),u.group.subtotalStyle??{},st(s.columns,[...g,...m.map(y=>y.field)]));l.placeGridRow(v,"listst","subtotal")}else l.setGroupHeader(u.depth);yield*r.takePages()}pr(s,o.totalRows??n,c,r,l),r.finished?.(l.bottom()),yield*r.takePages()}function ce(e){return e.kind!=="list"&&(e.pageAnchor!==void 0||e.kind==="text"&&typeof e.text=="string"&&(e.text.includes("{page}")||e.text.includes("{totalPages}")))}function le(e,t){return{...e,...e.text===void 0?{}:{text:t(e.text)},...e.lines?{lines:e.lines.map(t)}:{},...e.richParagraphs?{richParagraphs:e.richParagraphs.map(r=>({...r,segments:r.segments.map(o=>({...o,...o.text===void 0?{}:{text:t(o.text)}}))}))}:{},...e.grid?{grid:{...e.grid,cells:e.grid.cells.map(r=>r.map(o=>o?{...o,...o.text===void 0?{}:{text:t(o.text)},...o.children?{children:o.children.map(n=>le(n,t))}:{}}:null))}}:{}}}function xr(e){let t=!1;for(const r of e.pages)for(const o of r.components)ce(o)&&le(o,n=>(n.includes("{totalPages}")&&(t=!0),n));return t}function Er(e,t,r,o,n,a){const s={pageWidthMm:t.widthMm,pageHeightMm:t.heightMm,...e.layout===void 0?{}:{layout:e.layout},marginTopMm:t.marginTopMm,marginBottomMm:t.marginBottomMm,marginLeftMm:t.marginLeftMm,marginRightMm:t.marginRightMm,components:t.components,...e.meta?{meta:e.meta}:{}},i=c=>{const l=c.replace(/\{page\}/g,String(o));return a===void 0?l:l.replace(/\{totalPages\}/g,String(a))};for(const c of r)s.components.push(le(c,i));if(e.layout==="wide"){const c=s.components.reduce((l,d)=>Math.max(l,d.topMm+d.heightMm),0);s.marginBottomMm=n?e.marginBottomMm??0:0,s.pageHeightMm=Math.max(1,c+s.marginBottomMm)}return s}function ke(e){return e.cells.reduce((t,r)=>t+r.reduce((o,n)=>o+(n?1+(n.children?.reduce((a,s)=>a+dt(s),0)??0):0),0),0)}function dt(e){return e.grid?ke(e.grid):0}function Ie(e){for(const t of["maxPages","maxCells","knownTotalPages"])if(e[t]!==void 0&&(!Number.isSafeInteger(e[t])||e[t]<1))throw new RangeError(`${t} 应为正安全整数`);ne(e.maxChartComponents)}function Rr(e,t){const r=lt(e,t.datasets[e.dataset]??[],t),o=Pe(r.list),n={...Te(o,t.measurer,r.rows,t.signal),rowHeightFloorMm:o.rowHeightMm??0};return(o.header===!1?0:n.headerHeightMm)+r.rows.reduce((a,s)=>a+X(n,s,t.measurer).heightMm,0)}function*Cr(e){const{templatePage:t,current:r}=e,o=new Map(t.components.map((a,s)=>[a,s])),n=(a,s,i)=>{const c=e.datasets[a.dataset];return Array.isArray(c)||e.warnings.push(`数据集 ${a.dataset} 未提供数据,列表 ${a.id??""} 输出为空`),Sr(a,Array.isArray(c)?c:[],{...e,tableId:`${e.tableId}:${o.get(a)}`,startTop:s,finished:i,flow:!!t.flow})};if(t.flow){yield*Xt({page:t,active:()=>Y(e.signal),top:()=>Math.max(r.marginTopMm,U(t)),bottom:()=>Z(t,r),append:a=>{r.components.push(...e.resolveChart(a))},nextPage:()=>{e.pushCurrent(),r.components=[],r.heightMm=t.heightMm,t.layout==="wide"&&(r.marginTopMm=0,r.marginBottomMm=0)},takePages:e.takePages,height:a=>Rr(a,e),list:n});return}for(const a of t.components)ce(a)||(a.kind==="list"?yield*n(a):r.components.push(...e.resolveChart(a)))}function*ee(e,t,r,o,n,a=new WeakMap,s){let i=0,c=0,l=0;const d=Vt(r.measurer??j.heuristicMeasurer),f=_t(t,r.signal,r.maxChartComponents),u=g=>`${g}_${(++i).toString(36)}`;for(const{pageIndex:g,page:m}of ar(e,t,r)){Y(r.signal);const v=sr(m),y=m.components.filter(ce);let h=[];const w=(I=!1)=>{if(Y(r.signal),r.maxPages!==void 0&&c>=r.maxPages)throw new H(r.maxPages,c+1);if(r.maxCells!==void 0&&(l+=[...v.components,...y].reduce((T,N)=>T+dt(N),0),l>r.maxCells))throw new J(r.maxCells,l);h.push(Er(m,v,y,++c,I,n))},x=()=>{const I=h;return h=[],I};yield*Cr({templatePage:m,current:v,warnings:o,nextId:u,pushCurrent:w,takePages:x,datasets:t,resolveChart:f,signal:r.signal,formula:r.formula,prepared:a,measurer:d,mmPerRow:r.mmPerRow??0,tableId:`table:${g}`}),w(!0),yield*x()}s&&(s.chartComponents=f.used())}function Tr(e,t,r={}){Ie(r);let o=0;for(const n of ee(e,t,{...r,onWarning:void 0},[]))o++;return o}function*Pr(e,t,r={}){yield*ut(e,t,r)}function*ut(e,t,r,o){Ie(r);const n=xr(e),a=new WeakMap;let s=r.knownTotalPages;if(n&&s===void 0){s=0;for(const l of ee(e,t,r,[],void 0,a))s++}const i=[];let c=0;for(const l of ee(e,t,r,i,s,a,o)){for(;c<i.length;c++)r.onWarning?.(i[c]);yield l}}function $e(e,t,r={}){const o=typeof r=="number"?{mmPerRow:r}:r;Ie(o);const n=[],a={chartComponents:0},s=[...ee(e,t,o,n,o.knownTotalPages,void 0,a)];for(const i of s)i.components=i.components.map(c=>ce(c)?le(c,l=>l.replace(/\{totalPages\}/g,String(s.length))):c);return n.forEach(i=>o.onWarning?.(i)),{plan:{schemaVersion:re.RENDER_PLAN_SCHEMA_VERSION,...ae(e)?{requiresRecalculation:!0}:{},pages:s},warnings:n,...a}}function kr(e){const t=e.columns.find(a=>!a.hidden)?.field;if(!t)return{groups:0,total:0};const r=ie(e),o=(a=[],s=[])=>a.includes(t)||s.some(i=>i.field===t),n=typeof e.grandTotal=="object"?e.grandTotal:void 0;return{groups:r.filter(a=>o(a.subtotal,a.aggregates)).length,total:Number(o(n?.fields??r[0]?.subtotal,n?.aggregates??r[0]?.aggregates))}}function Ir(e,t,r){ct(e);const o=V.flattenTreeInput(t[e.dataset]??[],e.tree,r),n=e.columns.filter(s=>!s.hidden).length,a=e.header===!1?0:e.headerGrid?ke(e.headerGrid):n;return o.length*n+a+ +!!e.grandTotal*2*n}function $r(e,t,r={}){if(e.tree)return Ir(e,t,r.signal);if(e.matrix){let c=t[e.dataset]??[];e.computed?.length&&(c=P.computeDataset(c,{fields:e.computed,...r}).rows),e.rowVisibleWhen&&(c=c.filter(P.compileReportPredicate(e.rowVisibleWhen)));const l=xe.estimateMatrixTable(c,e.matrix);return l.cells+(e.header===!1?0:l.columnCount*(e.matrix.hierarchy?e.matrix.columnFields.length+1:1))}const o=t[e.dataset]?.length??0,n=e.columns.filter(c=>!c.hidden).length,a=ie(e).length,s=kr(e);let i=(o*(1+2*a+s.groups)+ +!!e.grandTotal*(1+s.total))*n;if(i+=e.header===!1?0:e.headerGrid?ke(e.headerGrid):n,e.cardinality==="record"&&o===0&&(i+=n),e.detail){const c=t[e.detail.dataset]?.length??0,l=e.detail.columns.filter(d=>!d.hidden).length;i+=(c+o*(+(e.detail.header!==!1)+ +!!e.detail.label))*l}if(!Number.isSafeInteger(i))throw new RangeError("报表单元格估算超出安全整数预算");return i}class ft extends Error{constructor(t){super(t.map(r=>r.message).join(";")),this.issues=t,this.name="ReportValidationError"}}function We(e,t,r){if(!Number.isSafeInteger(e)||e<1||e>r)throw new Error(`校验 ${t} 超出预算`);return e}function Fr(e){if(e.aggregates&&e.scope!=="dataset")throw new Error("仅数据集规则允许汇总");if(e.aggregates&&(!Array.isArray(e.aggregates)||e.aggregates.length>64))throw new Error("校验汇总最多 64 项");const t=new Set;for(const r of e.aggregates??[]){if(P.computationFieldName(r.field),t.has(r.field))throw new Error("校验汇总字段重复");t.add(r.field),r.valueField!==void 0&&P.computationFieldName(r.valueField),r.weightField!==void 0&&P.computationFieldName(r.weightField),P.aggregateRows([],{...r,field:r.valueField??r.field})}}function mt(e){if(!Array.isArray(e)||e.length>256||Object.keys(e).length!==e.length)throw new Error("校验规则最多 256 条且不允许空位");const t=new Set;return e.map(r=>{if(!r||typeof r!="object")throw new Error("校验规则应为声明式对象");if(P.computationFieldName(r.id),t.has(r.id))throw new Error("校验规则 id 重复");if(t.add(r.id),r.field!==void 0&&P.computationFieldName(r.field),r.dataset!==void 0&&P.computationFieldName(r.dataset),typeof r.message!="string"||!r.message.trim()||r.message.length>2048)throw new Error("校验规则需要有界提示文案");if(r.severity!==void 0&&!["error","warning"].includes(r.severity))throw new Error("未知校验严重程度");if(r.scope!==void 0&&!["row","dataset"].includes(r.scope))throw new Error("未知校验范围");Fr(r);const o={nodes:0},n=P.compileReportPredicate(r.assert,o),a=r.when?P.compileReportPredicate(r.when,o):void 0;return{rule:r,assert:n,when:a,checks:o.nodes}})}function ze(e){if(e?.aborted){const t=new Error("报表校验已取消");throw t.name="AbortError",t}}function Or(e,t,r,o){const n=o&&Object.prototype.hasOwnProperty.call(t,o)?t[o]:void 0;if(n!==void 0&&typeof n!="string"&&!(typeof n=="number"&&Number.isFinite(n)))throw new Error("校验定位需要稳定的文本或数值业务键");return{ruleId:e.id,rowIndex:r,...n===void 0?{}:{rowKey:n},field:e.field,severity:e.severity??"error",message:e.message}}function Ar(e,t){const r=t.computed?.length?{fields:t.computed,formula:t.formula,signal:t.signal}:void 0;if(t.tree){const n=V.createTreeTable(e,t.tree,{signal:t.signal,computed:r});if(n.rows.length>1e5)throw new Error("校验展开后数据最多 100000 行");return{rows:n.rows,summaryRows:n.leaves,rowKey:t.tree.idField}}const o=r?P.computeDataset(e,r).rows:e;return{rows:o,summaryRows:o,rowKey:t.rowKey}}function Nr(e,t){const r=new Set;e.forEach(o=>{if(!o||typeof o!="object"||Array.isArray(o))throw new Error("校验数据行应为对象");if(!t)return;const n=Object.prototype.hasOwnProperty.call(o,t)?o[t]:void 0;if(!(typeof n=="string"&&n.trim())&&!(typeof n=="number"&&Number.isFinite(n)))throw new Error("校验定位需要稳定业务键");if(r.has(n))throw new Error("校验业务键重复");r.add(n)})}function Lr(e,t){return gt(e,t,{checks:0})}function gt(e,t,r){if(!Array.isArray(e)||e.length>1e5)throw new Error("校验数据最多 100000 行");ze(t.signal);const o=We(t.maxChecks??2e6,"maxChecks",1e7),n=We(t.maxIssues??1e3,"maxIssues",1e4);t.rowKey!==void 0&&P.computationFieldName(t.rowKey);const a=Ar(e,t),{rows:s,summaryRows:i,rowKey:c}=a;Nr(s,c);const l=mt(t.rules),d=l.reduce((u,g)=>u+(g.rule.scope==="dataset"?g.checks+i.length*(g.rule.aggregates?.length??0):s.length*g.checks),0);if(r.checks+=d,r.checks>o)throw new Error("整批校验超出 maxChecks 预算");const f=[];for(const u of l)(u.rule.scope==="dataset"?[Object.fromEntries((u.rule.aggregates??[]).map(m=>[m.field,P.aggregateRows(i,{...m,field:m.valueField??m.field})]))]:s).forEach((m,v)=>{if(ze(t.signal),!m||typeof m!="object"||Array.isArray(m))throw new Error("校验数据行应为对象");if(!(u.when&&!u.when(m)||u.assert(m))){if(f.length>=n)throw new Error("校验问题超出 maxIssues 预算,请缩小范围");f.push(Or(u.rule,m,u.rule.scope==="dataset"?void 0:v,u.rule.scope==="dataset"?void 0:c))}});return f}function ht(e,t="allow"){if(!["allow","block"].includes(t))throw new Error("未知校验警告策略");if(!Array.isArray(e)||e.length>1e4||e.some(r=>!r||!["error","warning"].includes(r.severity)||typeof r.ruleId!="string"||!r.ruleId.trim()||typeof r.message!="string"||!r.message.trim()))throw new Error("校验问题结构无效");if(e.some(r=>r.severity==="error"||t==="block"))throw new ft(e)}function Je(e,t,r){const o=e.get(t);if(o&&JSON.stringify(o)!==JSON.stringify(r))throw new Error("同一数据集的校验计算/业务键存在歧义,请统一绑定");e.set(t,r)}function Kr(e,t,r,o=[]){mt(t.rules);const n=[],a={checks:0};for(const[i,c]of e.entries()){const l=new Map;for(const d of c.template.pages)for(const f of d.components)f.kind==="list"&&(Je(l,f.dataset,{rowKey:f.tree?.idField??f.rowKey,computed:f.computed,tree:f.tree}),f.detail&&Je(l,f.detail.dataset,{rowKey:f.detail.rowKey}));for(const[d,f]of l){const u=t.rules.filter(g=>!g.dataset||g.dataset===d);if(u.length&&(n.push(...gt(c.datasets[d]??[],{...t,rules:u,...f,formula:o[i],signal:r},a).map(g=>({...g,dataset:d,sourceScope:c.sourceScope}))),n.length>(t.maxIssues??1e3)))throw new Error("整批候选校验问题超出 maxIssues 预算")}}const s=new Set(e.flatMap(i=>i.template.pages.flatMap(c=>c.components.flatMap(l=>l.kind==="list"?[l.dataset,...l.detail?[l.detail.dataset]:[]]:[]))));if(t.rules.some(i=>i.dataset&&!s.has(i.dataset)))throw new Error("校验目标数据集不存在");return n}function pt(e){return!e||typeof e!="object"?!1:[e.pageIndex,e.componentIndex,e.rowIndex,e.columnIndex].every(t=>Number.isInteger(t)&&t>=0)}function wt(e,t,r){const o=e.grid;if(!o)return null;const n=o.cells[t];if(!n)return null;const s=oe.resolveGridLayout(o,e.widthMm,e.heightMm).cells.filter(c=>c.ri===t).findIndex(c=>c.ci===r),i=n[s];return i?{cell:i,sourceColumnIndex:s}:null}function jr(e){return e.value!==void 0?e.value:e.rawText??e.text??null}function Dr(e,t){return e.valueType?e.valueType:typeof t=="number"?"number":typeof t=="boolean"?"boolean":t===null&&e.numberFormat&&/[0#?]/.test(e.numberFormat)?"number":"text"}function Br(e,t){if(e.derived)return"derived";if(e.editable===!1)return"cell";if(e.formula!==void 0)return"formula";if(e.children?.length||e.richParagraphs?.length)return"complex";if(t.table&&t.table.role!=="body"&&e.editable!==!0)return"structure"}function Hr(e,t){const r=e.table;if(r)return{id:r.id,rowIndex:r.rowIndex+t.rowIndex,role:r.role,columnKey:r.columnKeys[t.columnIndex]}}function Vr(e,t,r){if(e.derived)return;if(e.source)return{...e.source};const o=t.table?.source,n=t.table?.columnKeys[r.columnIndex];if(!(!o||o.rowKey===void 0||n===void 0))return{...o,rowKey:o.rowKey,field:n}}function yt(e,t,r){const o=jr(r),n=Br(r,e);return{address:{...t},cell:r,component:e,value:o,valueType:Dr(r,o),table:Hr(e,t),source:Vr(r,e,t),editable:n===void 0,readOnlyReason:n}}function de(e,t){if(!pt(t))return null;const r=e.pages[t.pageIndex]?.components[t.componentIndex];if(!r)return null;const o=wt(r,t.rowIndex,t.columnIndex);return o?yt(r,t,o.cell):null}function D(e){const t=new Map;return r=>{if(!pt(r))return null;const o=e.pages[r.pageIndex]?.components[r.componentIndex];if(!o?.grid)return null;let n=t.get(o);if(!n){const s=new Map;n=new Map;for(const i of oe.resolveGridLayout(o.grid,o.widthMm,o.heightMm).cells){const c=s.get(i.ri)??0;s.set(i.ri,c+1);const l=o.grid.cells[i.ri]?.[c];l&&n.set(`${i.ri}:${i.ci}`,l)}t.set(o,n)}const a=n.get(`${r.rowIndex}:${r.columnIndex}`);return a?yt(o,r,a):null}}class M extends Error{constructor(t){super(`Invalid report cell edit: ${t}`),this.code=t,this.name="ReportCellEditError"}}function Gr(e,t){let r=e.trim();const o=t&&r.endsWith("%");if(o&&(r=r.slice(0,-1).trim()),/^[+-]?\d{1,3}(?:,\d{3})+(?:\.\d*)?(?:[eE][+-]?\d+)?$/.test(r)&&(r=r.replace(/,/g,"")),!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(r))throw new M("number");return Number(r)/(o?100:1)}function _r(e,t){if(e===null||typeof e=="string"&&e.trim()==="")return null;if(typeof e!="string"&&typeof e!="number")throw new M("number");const r=typeof e=="number"?e:Gr(e,Xe.isExcelPercentageFormat(t.cell.numberFormat));if(!Number.isFinite(r)||Number.isInteger(r)&&!Number.isSafeInteger(r))throw new M("number");return r}function Wr(e){if(e===null||typeof e=="string"&&e.trim()==="")return null;if(typeof e=="boolean")return e;const t=String(e).trim().toLowerCase();if(["true","yes","是","1"].includes(t))return!0;if(["false","no","否","0"].includes(t))return!1;throw new M("boolean")}function Fe(e,t){return e.valueType==="number"?_r(t,e):e.valueType==="boolean"?Wr(t):t===null?null:String(t)}function zr(e,t){const r=t.cell.text,n=[["是","否"],["TRUE","FALSE"],["True","False"],["true","false"],["1","0"]].find(a=>a.includes(r??""));return n?n[e?0:1]:String(e)}function G(e,t){return t===null?"":typeof t=="boolean"?zr(t,e):typeof t=="number"?Xe.formatExcelNumber(t,e.cell.numberFormat):String(t)}function Jr(e,t,r){const o=de(e,t);if(!o)throw new M("missing");return _(o,r)}function _(e,t){if(!e.editable)throw new M("readonly");const r=Fe(e,t);return{address:{...e.address},table:e.table,source:e.source,previousValue:e.value,previousText:e.cell.text??"",value:r,text:G(e,r)}}function qr(e,t){const r=e.table,o=t.table;return!r||!o||r.columnKey===void 0?!1:r.id===o.id&&r.rowIndex===o.rowIndex&&r.role===o.role&&r.columnKey===o.columnKey}function bt(e,t,r){const o=e.grid,{rowIndex:n,columnIndex:a}=t.address,s=wt(e,n,a),i=[...o.cells],c=[...i[n]],l=G(t,r.value),d={...s.cell,value:r.value,text:l,rawText:l};return c[s.sourceColumnIndex]=d,i[n]=c,{...e,grid:{...o,cells:i}}}function Ur(e,t){const r=e.table?.columnKeys,o=t.table?.columnKey;return r&&o!==void 0?r.flatMap((n,a)=>n===o?[a]:[]):[]}function Xr(e,t,r,o,n,a){const s=t.table,i=n.table;if(!s||!i||s.id!==i.id||s.role!==i.role||!t.grid)return t;const c=i.rowIndex-s.rowIndex;if(c<0||c>=t.grid.cells.length)return t;let l=t;for(const d of Ur(t,n)){const f=de(e,{pageIndex:r,componentIndex:o,rowIndex:c,columnIndex:d});f?.editable&&qr(n,f)&&(l=bt(l,f,a))}return l}function Yr(e,t,r,o,n,a){const s=n.address;return n.table?.columnKey!==void 0?Xr(e,t,r,o,n,a):s.pageIndex===r&&s.componentIndex===o?bt(t,n,a):t}function ue(e,t){const r=t.source;if(!r)return!1;const o=e.source;return!o||["sourceScope","datasetId","rowKey","field","revision","sourceToken"].some(n=>!Object.is(o[n],r[n]))}function Qr(e,t){const r=de(e,t.address);if(!r)throw new M("missing");if(!r.editable)throw new M("readonly");if(ue(r,t))throw new M("conflict");if(!Object.is(r.value,t.previousValue)||(r.cell.text??"")!==t.previousText)throw new M("conflict");const o=Fe(r,t.value),n={...t,value:o,text:G(r,o)};if(Object.is(o,r.value)&&n.text===r.cell.text)return e;const a=e.pages.map((s,i)=>{const c=s.components.map((l,d)=>Yr(e,l,i,d,r,n));return c.every((l,d)=>l===s.components[d])?s:{...s,components:c}});return{...e,pages:a}}function vt(e){const t=[];for(const r of e.template.pages)for(const o of r.components)o.kind==="list"&&(t.push(o.tree?{...o,rowKey:o.tree.idField}:o),o.detail&&t.push({...o.detail,relation:{detail:o.detail,parentRows:e.datasets[o.dataset]??[]}}));return t}function W(e){return JSON.stringify([e.sourceScope,e.datasetId])}function qe(e){return JSON.stringify([e.sourceScope,e.datasetId,e.rowKey])}function Mt(e){const t=new Map,r=new Set;return e.forEach((o,n)=>{for(const a of vt(o)){if(!a.rowKey)continue;const s=a.relation,i=s?new Set(s.parentRows.map(c=>JSON.stringify(c[s.detail.parentKey]))):void 0;(o.datasets[a.dataset]??[]).forEach((c,l)=>{if(s&&!i.has(JSON.stringify(c[s.detail.foreignKey])))return;const d=c[a.rowKey];if(typeof d!="string"&&typeof d!="number")return;const f=`${n}:${a.dataset}:${l}:${a.rowKey}`;if(r.has(f))return;r.add(f);const u=qe({sourceScope:o.sourceScope,datasetId:a.dataset,rowKey:d}),g=t.get(u)??[];g.push({partIndex:n,dataset:a.dataset,rowIndex:l,row:c,binding:a}),t.set(u,g)})}}),o=>{const n=t.get(qe(o));if(!n?.length)throw new M("missing");if(new Set(n.map(a=>`${a.partIndex}:${a.dataset}`)).size!==n.length)throw new M("conflict");return n}}function St(e,t){const r=e.map(n=>({...n,datasets:{...n.datasets}})),o=new Set;for(const{row:n,field:a,value:s}of t){const i=r[n.partIndex],c=JSON.stringify([n.partIndex,n.dataset]);o.has(c)||(i.datasets[n.dataset]=[...i.datasets[n.dataset]],o.add(c)),i.datasets[n.dataset][n.rowIndex]={...i.datasets[n.dataset][n.rowIndex],[a]:s}}for(const n of o){const[a,s]=JSON.parse(n);P.forkComputedDataset(e[a].datasets[s],r[a].datasets[s])}return r}function Zr(e,t,r){const o=[],n=new Set;return e.forEach((a,s)=>{for(const i of vt(a))t.has(W({sourceScope:a.sourceScope,datasetId:i.dataset}))&&(a.datasets[i.dataset]??[]).forEach((c,l)=>{const d={partIndex:s,dataset:i.dataset,rowIndex:l,row:c,binding:i};for(const[f,u]of[[i.revisionField,r.revision],[i.sourceTokenField,r.sourceToken]]){if(!f||u===void 0)continue;const g=`${s}:${i.dataset}:${l}:${f}`;n.has(g)||(n.add(g),o.push({row:d,field:f,value:u}))}})}),o}function xt(e,t,r){if(!r||r.revision===void 0&&r.sourceToken===void 0)return e;const o=new Set(t.edits.flatMap(n=>n.source?[W(n.source)]:[]));return Oe(e,new Map([...o].map(n=>[n,r])))}function Oe(e,t){if(!t.size)return e;function r(a){const s=a.datasetId&&t.get(W({...a,datasetId:a.datasetId}));return!s||(s.revision===void 0||Object.is(s.revision,a.revision))&&(s.sourceToken===void 0||s.sourceToken===a.sourceToken)?a:{...a,...s.revision!==void 0?{revision:s.revision}:{},...s.sourceToken!==void 0?{sourceToken:s.sourceToken}:{}}}function o(a){const s=a.map(i=>{const c=i.table?.source?r(i.table.source):void 0,l=i.table&&c!==i.table.source?{...i.table,source:c}:i.table,d=i.grid?.cells.map(u=>{const g=u.map(m=>{if(!m)return m;const v=m.source?r(m.source):void 0,y=m.children?o(m.children):void 0;return v===m.source&&y===m.children?m:{...m,source:v,children:y}});return g.some((m,v)=>m!==u[v])?g:u}),f=i.grid&&d?.some((u,g)=>u!==i.grid.cells[g])?{...i.grid,cells:d}:i.grid;return l!==i.table||f!==i.grid?{...i,table:l,grid:f}:i});return s.some((i,c)=>i!==a[c])?s:a}const n=e.pages.map(a=>{const s=o(a.components);return s!==a.components?{...a,components:s}:a});return n.some((a,s)=>a!==e.pages[s])?{...e,pages:n}:e}function eo(e){return JSON.stringify([e.pageIndex,e.componentIndex,e.rowIndex,e.columnIndex])}function Ue(e){const t=e.table;return t?.columnKey!==void 0?JSON.stringify([t.id,t.role,t.rowIndex,t.columnKey]):eo(e.address)}function to(e,t){if(!t.length)return e;const r=new Map(t.map(c=>[Ue(c),c])),o=new Set(t.flatMap(c=>c.table?[c.table.id]:[])),n=new Set(t.map(c=>`${c.address.pageIndex}:${c.address.componentIndex}`)),a=D(e);function s(c,l,d){const f=c.grid;if(!f||!n.has(`${l}:${d}`)&&!o.has(c.table?.id??""))return c;const u=new Map,g=new Map;for(const m of oe.resolveGridLayout(f,c.widthMm,c.heightMm).cells){const v=g.get(m.ri)??0;g.set(m.ri,v+1);const y=a({pageIndex:l,componentIndex:d,rowIndex:m.ri,columnIndex:m.ci}),h=y&&r.get(Ue(y));if(!h||!y.editable)continue;const w=u.get(m.ri)??[...f.cells[m.ri]],x=G(y,h.value);Object.is(y.value,h.value)&&x===y.cell.text||(w[v]={...m.cell,value:h.value,text:x,rawText:x},u.set(m.ri,w))}return u.size?{...c,grid:{...f,cells:f.cells.map((m,v)=>u.get(v)??m)}}:c}const i=e.pages.map((c,l)=>{const d=c.components.map((f,u)=>s(f,l,u));return d.every((f,u)=>f===c.components[u])?c:{...c,components:d}});return i.every((c,l)=>c===e.pages[l])?e:{...e,pages:i}}function A(e){const t=e.source;if(t)return JSON.stringify([t.sourceScope,t.datasetId,t.rowKey,t.field]);const r=e.table;if(r?.columnKey!==void 0)return JSON.stringify([r.id,r.role,r.rowIndex,r.columnKey]);const o=e.address;return JSON.stringify([o.pageIndex,o.componentIndex,o.rowIndex,o.columnIndex])}function ro(e,t,r){if(typeof r!="string"||!r.trim()||!Array.isArray(t))throw new M("missing");if(t.length>1e4)throw new M("limit");const o=new Set,n=D(e),a=t.map(({address:s,value:i})=>{const c=n(s);if(!c)throw new M("missing");const l=_(c,i),d=A(l);if(o.has(d))throw new M("duplicate");return o.add(d),l});return{requestId:r,edits:a}}function oo(e,t){if(t.edits.length>1e4)throw new M("limit");const r=D(e),o=new Set,n=t.edits.map(a=>{const s=r(a.address);if(!s)throw new M("missing");const i=A(a);if(o.has(i))throw new M("duplicate");if(o.add(i),ue(s,a)||!Object.is(s.value,a.previousValue)||(s.cell.text??"")!==a.previousText)throw new M("conflict");return _(s,a.value)});return to(e,n)}function no(e){const t=new Map;for(const r of e){const o=A(r),n=t.get(o),a=n?{...r,previousValue:n.previousValue,previousText:n.previousText}:{...r};Object.is(a.previousValue,a.value)?t.delete(o):t.set(o,a)}return[...t.values()]}function Et(e){const t=new Map,r=D(e);return e.pages.forEach((o,n)=>o.components.forEach((a,s)=>{if(!(!a.grid||a.table?.role!=="body"))for(let i=0;i<a.grid.cells.length;i++)for(let c=0;c<a.table.columnKeys.length;c++){const l=r({pageIndex:n,componentIndex:s,rowIndex:i,columnIndex:c});l?.source&&l.editable&&t.set(A(l),l)}})),t}function ao(e,t,r){const o=Et(e),n=D(e);return t.map(a=>{const s=a.source?o.get(A(a)):n(a.address);if(!s||A(s)!==A(a))throw new M("missing");return{address:{...s.address},value:a[r]}})}function Rt(e,t){if(++e.nodes>1e6||t>128)throw new M("limit")}function te(e,t){const r=Object.getOwnPropertyDescriptor(e,t);if(!r||r.get||r.set)throw new M("conflict");return r.value}function Ct(e){if(Object.getOwnPropertyDescriptor(e,"toJSON"))throw new M("conflict");const t=Object.getPrototypeOf(e);if(Array.isArray(e)&&(t!==Array.prototype||Object.keys(e).length!==e.length))throw new M("conflict");if(!(e instanceof Date)&&!Array.isArray(e)&&t!==Object.prototype&&t!==null)throw new M("conflict");for(const r of Reflect.ownKeys(e))if(!(Array.isArray(e)&&r==="length")){if(typeof r=="symbol"||!Object.getOwnPropertyDescriptor(e,r)?.enumerable)throw new M("conflict");if(e instanceof Date||Array.isArray(e)&&!/^(0|[1-9]\d*)$/.test(r))throw new M("conflict")}}function Tt(e,t,r,o,n){if(Rt(o,n),typeof e=="function"||typeof e=="symbol")throw new M("conflict");if(e===null||typeof e!="object")return;if(Ct(e),r.has(e))throw new M("conflict");r.add(e);const a=Object.keys(e),s=a.map(i=>te(e,i));t.push({object:e,prototype:Object.getPrototypeOf(e),keys:a,values:s,...e instanceof Date?{date:Date.prototype.getTime.call(e)}:{},...Array.isArray(e)?{length:e.length}:{}});for(const i of s)Tt(i,t,r,o,n+1);r.delete(e)}function so(e){const{object:t,keys:r,values:o}=e;if(Ct(t),Object.getPrototypeOf(t)!==e.prototype||Object.getOwnPropertyDescriptor(t,"toJSON")||e.date!==void 0&&!Object.is(Date.prototype.getTime.call(t),e.date)||e.length!==void 0&&t.length!==e.length)return!1;const n=Object.keys(t);return n.length===r.length&&r.every((a,s)=>n[s]===a&&Object.is(te(t,a),o[s]))}function io(e){const t=[];return Tt(e,t,new Set,{nodes:0},0),()=>{try{return t.every(so)}catch{return!1}}}function we(e,t,r){if(Rt(t,r),e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(Date.prototype.getTime.call(e));if(Array.isArray(e)){const o=[];for(let n=0;n<e.length;n++)o[n]=we(te(e,String(n)),t,r+1);return o}return Object.fromEntries(Object.keys(e).map(o=>[o,we(te(e,o),t,r+1)]))}function co(e){const t=we(e,{nodes:0},0);for(const r of t)for(const o of Object.values(r.datasets))P.registerComputedDataset(o);return t}async function lo(e,t,r={}){return(await Pt(e,t,r)).plan}async function Pt(e,t,r={}){const o=[],n={chartComponents:0},a={...r,knownTotalPages:void 0};for(const s of ut(e,t,a,n))o.push(s),o.length%8===0&&await new Promise(i=>setTimeout(i,0));if(r.signal?.aborted){const s=new Error("报表重算已取消");throw s.name="AbortError",s}return{plan:{schemaVersion:re.RENDER_PLAN_SCHEMA_VERSION,...ae(e)?{requiresRecalculation:!0}:{},pages:o},...n}}const ye=new WeakMap;function uo(e){return ye.get(e)}function Q(e){if(e?.aborted){const t=new Error("报表重算已取消");throw t.name="AbortError",t}}function kt(e,t){return e[t]===void 0?"":e[t]}function fo(e,t){if(t.edits.length>1e4)throw new M("limit");const r=D(e),o=new Set,n=[],a=t.edits.map(s=>{const i=r(s.address);if(!i?.source)throw new M("missing");const c=A(s);if(o.has(c))throw new M("duplicate");if(o.add(c),ue(i,s)||!Object.is(i.value,s.previousValue)||(i.cell.text??"")!==s.previousText)throw new M("conflict");return n.push(i),_(i,s.value)});return{batch:{requestId:t.requestId,edits:a},contexts:n}}function mo(e,t){const r=Mt(e);return t.flatMap(o=>{if(!o.source)throw new M("missing");return r(o.source).map(n=>{if(!Object.is(kt(n.row,o.source.field),o.previousValue))throw new M("conflict");if(n.binding.rowKey===o.source.field)throw new M("readonly");return{row:n,field:o.source.field,value:o.value}})})}function ge(e,t,r){const o={...e,value:t,source:{...e.source,...r?.revision===void 0?{}:{revision:r.revision},...r?.sourceToken===void 0?{}:{sourceToken:r.sourceToken}}};return o.cell={...e.cell,value:o.value,text:G(o,o.value)},o}function go(e,t,r){if(!r||r.revision===void 0&&r.sourceToken===void 0)return[...e];const o=new Set(t.edits.flatMap(n=>n.source?[W(n.source)]:[]));return St(e,Zr(e,o,r))}function ho(e,t,r){const o=new Set(t.edits.map(n=>W(n.source)));for(const n of o)e.set(n,{...e.get(n),...r.revision!==void 0?{revision:r.revision}:{},...r.sourceToken!==void 0?{sourceToken:r.sourceToken}:{}});return o}function Ae(e,t){let r=t.parts;const o=t.rebuild,n=[...t.validationFormulas??[]];let a=io(r),s=e,i;const c=new Map,l=new Map;function d(g){if(g!==s)throw new M("conflict");if(i)return i;if(!a?.())throw new M("conflict");return co(r)}async function f(g,m,v,y={}){Q(y.signal),m={requestId:m.requestId,edits:m.edits.map(b=>({...b,address:{...b.address},source:b.source?{...b.source}:void 0,table:b.table?{...b.table}:void 0}))},v=v.map(b=>({...b,address:{...b.address},source:b.source?{...b.source}:void 0,table:b.table?{...b.table}:void 0,cell:{...b.cell}})),await new Promise(b=>setTimeout(b,0)),Q(y.signal);const h=d(g),w=St(h,mo(h,m.edits)),x=Oe(await o(w,y.signal),l);Q(y.signal);let I=!1,T=[],N="allow",L=!1;function p(b){return L=!0,T=Object.freeze(Kr(w,b,y.signal,n).map(S=>Object.freeze({...S}))),L=!1,N=b.warningPolicy??"allow",T}return y.validation&&p(y.validation),{plan:x,get validationIssues(){return T},validate:p,commit(b){if(Q(y.signal),I||s!==g)throw new M("conflict");if(b?.conflicts?.length)throw new M("conflict");if(L)throw new Error("候选规则校验未完成,不能提交");ht(T,N);const S=go(w,m,b),k=xt(x,m,b);if(b){const C=ho(l,m,b);for(const[F,B]of c)C.has(W(B.source))&&c.set(F,ge(B,B.value,b))}return v.forEach((C,F)=>c.set(A(C),ge(C,m.edits[F].value,b))),I=!0,i=S,r=void 0,a=void 0,s=k,ye.set(s,u),s}}}const u={get plan(){return s},async prepare(g,m,v){const y=fo(g,m);return f(g,y.batch,y.contexts,v)},async prepareHistory(g,m,v,y,h){if(!y.trim()||m.length>1e4)throw new M("limit");const w=d(g),x=Mt(w),I=Et(g),T=new Set,L=m.map(S=>{if(!S.source)throw new M("missing");const k=A(S);if(T.has(k))throw new M("duplicate");T.add(k);const C=I.get(k)??c.get(k);if(!C?.source)throw new M("missing");const F=x(C.source)[0];return ge(C,kt(F.row,C.source.field))}).map((S,k)=>({context:S,edit:_(S,m[k][v])})).filter(({edit:S})=>!Object.is(S.previousValue,S.value)),p={requestId:y,edits:L.map(({edit:S})=>S)},b=L.map(({context:S})=>S);return{batch:p,contexts:b,prepared:await f(g,p,b,h)}}};return ye.set(e,u),u}function po(e){const t=$e(e.template,e.datasets,e.pagination).plan;return Ae(t,{validationFormulas:[e.pagination?.formula],parts:[{template:e.template,datasets:e.datasets}],rebuild:(r,o)=>lo(r[0].template,r[0].datasets,{...e.pagination,signal:o})})}let wo=0;function It(){return`report-${Date.now()}-${++wo}`}function be(e,t,r){if(!r?.aborted)try{const o=e?.({...t});o&&typeof o.then=="function"&&Promise.resolve(o).catch(()=>{})}catch{}}function $t(e){const t=e.taskId??It(),r=(o,n,a)=>{be(e.onEvent,{taskId:t,...e.correlationId===void 0?{}:{correlationId:e.correlationId},stage:o,status:n,...a===void 0?{}:{reportId:a}},e.signal)};return{taskId:t,progress(o,n,a){be(e.onEvent,{taskId:t,...e.correlationId===void 0?{}:{correlationId:e.correlationId},stage:o,status:"started",completed:n,total:a},e.signal)},async run(o,n,a){r(o,"started",a);try{const s=await n();return r(o,"completed",a),s}catch(s){throw r(o,"failed",a),s}},runSync(o,n,a){r(o,"started",a);try{const s=n();return r(o,"completed",a),s}catch(s){throw r(o,"failed",a),s}}}}function Ne(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;const t=e,r=o=>typeof o=="string"&&o.trim().length>0&&o.length<=256;return!r(t.datasetId)||!r(t.field)||t.tableId!==void 0&&!r(t.tableId)||t.reportScope!==void 0&&(typeof t.reportScope!="string"||!t.reportScope.trim()||t.reportScope.length>4096)?!1:t.rowKey===void 0?!0:typeof t.rowKey=="string"?t.rowKey.trim().length>0&&t.rowKey.length<=1024:typeof t.rowKey=="number"&&Number.isFinite(t.rowKey)}function Ft(e){return e==="missing-source"||e==="not-applicable"||e==="not-calculable"}function Ot(e){return e.target!==void 0&&!Ne(e.target)?!1:e.valueState===void 0||Ft(e.valueState)&&e.target!==void 0}function yo(e,t){if(Ee.validateDatasetRows([],e),!Ne(t))throw new Error("数据说明目标无效");const r=e.fields.find(n=>n.field===t.field);if(!r)throw new Error("数据说明字段未在契约中声明");const o=[];return r.description&&o.push({code:"field-definition",severity:"info",message:r.description,target:{...t}}),r.calculation&&o.push({code:"field-calculation",severity:"info",message:r.calculation.description,target:{...t}}),o}function Le(e,t,r={}){const o=new Map;for(const a of e.pages)for(const s of a.components){if(s.kind!=="list"||s.tree?.input!=="nested")continue;const i=o.get(s.dataset);if(i&&(i.childrenField??"children")!==(s.tree.childrenField??"children"))throw new Error("同一数据集的嵌套树应使用相同 childrenField");o.set(s.dataset,s.tree)}if(!o.size)return t;const n={...t};for(const[a,s]of o){const i=Math.min(s.maxRows??1e5,r.maxRows??1/0);n[a]=V.flattenTreeInput(t[a]??[],{...s,maxRows:i},r.signal)}return n}function bo(e,t,r={}){return Object.values(Le(e,t,r)).reduce((o,n)=>o+n.length,0)}function vo(e,t,r){const o=Ee.datasetJsonSchema(r),n=e?.pages.flatMap(i=>i.components).find(i=>i.kind==="list"&&i.dataset===t&&i.tree?.input==="nested");if(!n||n.kind!=="list"||!n.tree)return o;const a=o.items,s=n.tree.childrenField??"children";return{...o,items:{$ref:"#/$defs/treeNode"},$defs:{treeNode:{...a,properties:{...a.properties,[s]:{anyOf:[{type:"null"},{type:"array",items:{$ref:"#/$defs/treeNode"}}]}}}}}}function Ke(e,t){return JSON.stringify([e,t])}function je(e,t,r){return r===void 0?Ke(e,t):JSON.stringify(["shared",r])}function At(e,t,r){return e.map(o=>{const n=o.table?{...o.table,id:r(o.table.id),...o.table.source?{source:{...o.table.source,sourceScope:t}}:{}}:void 0,a=o.grid?.cells.map(s=>s.map(i=>!i||!i.source&&!i.children?i:{...i,...i.source?{source:{...i.source,sourceScope:t}}:{},...i.children?{children:At(i.children,t,r)}:{}}));return n||a?{...o,...n?{table:n}:{},...a?{grid:{...o.grid,cells:a}}:{}}:o})}function ve(e){return ne(e.maxChartComponents),{maxPages:e.maxPages,maxCells:e.maxCells,maxChartComponents:e.maxChartComponents??Re,usedPages:0,usedCells:0,usedChartComponents:0}}function Mo(e,t){if(!e.repeat)return!1;const r=Object.prototype.hasOwnProperty.call(t,e.repeat.dataset)?t[e.repeat.dataset]:void 0;return Array.isArray(r)&&r.length===0}function So(e){const t=r=>r.grid?.cells.reduce((o,n)=>o+n.reduce((a,s)=>a+(s?1+(s.children?.reduce((i,c)=>i+t(c),0)??0):0),0),0)??0;return e.pages.reduce((r,o)=>r+o.components.reduce((n,a)=>n+t(a),0),0)}function Me(e,t){return e===void 0?void 0:e-t}function he(e,t){return e===void 0?t:Math.max(1,Math.min(e,t??e))}function Nt(e,t,r,o,n){ne(e?.maxChartComponents);const a=Me(t.maxPages,t.usedPages),s=t.maxChartComponents-t.usedChartComponents;if(a!==void 0&&a<1&&r.pages.length&&!Mo(r,o))throw new H(0,1);if(s<1&&r.pages.some(i=>i.components.some(c=>c.kind!=="list"&&c.chartBinding)))throw new q(s,1);return{...e,signal:n??e?.signal,maxPages:he(a,e?.maxPages),maxCells:he(Me(t.maxCells,t.usedCells),e?.maxCells),maxChartComponents:he(s,e?.maxChartComponents)}}function Lt(e,t){const r=So(t.plan),o=Me(e.maxCells,e.usedCells);if(o!==void 0&&r>o)throw new J(o,r);e.usedPages+=t.plan.pages.length,e.usedCells+=r,e.usedChartComponents+=t.chartComponents}function Kt(e,t){return e instanceof H&&t.maxPages!==void 0&&(e.limit===t.maxPages-t.usedPages||e.limit===0)?new H(t.maxPages,t.usedPages+e.actual):e instanceof J&&t.maxCells!==void 0?new J(t.maxCells,t.usedCells+e.actual):e instanceof q&&e.limit===t.maxChartComponents-t.usedChartComponents?new q(t.maxChartComponents,t.usedChartComponents+e.estimated):e}function xo(e){if(!("mapData"in e))return e;const{load:t,mapData:r,...o}=e;return{...o,load:async n=>{const a=await t(n);O(n.signal);try{return r(a,n)}catch(s){throw new R("validate",`报表 ${n.reportId} 数据映射失败`,s)}}}}class R extends Error{constructor(t,r,o){super(r),this.name="ReportSourceError",this.code=t,this.cause=o}}function fe(e){const t=new Error("报表加载已取消");return t.name="AbortError",Object.defineProperty(t,"cause",{value:e.reason}),t}function O(e){if(e?.aborted)throw fe(e)}function Se(e,t){return t?new Promise((r,o)=>{const n=()=>t.removeEventListener("abort",a),a=()=>{n(),o(fe(t))};t.addEventListener("abort",a,{once:!0}),t.aborted&&a(),Promise.resolve(e).then(s=>{n(),r(s)},s=>{n(),o(s)})}):Promise.resolve(e)}function Eo(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new R("validate",`报表 ${t} 的数据集应为对象`);for(const[r,o]of Object.entries(e))if(!Array.isArray(o)||o.some(n=>!n||typeof n!="object"||Array.isArray(n)))throw new R("validate",`报表 ${t} 的数据集 ${r} 应为对象数组`)}async function Ro(e,t,r){const{reportId:o,signal:n}=t;try{const a=await Se(e(t),n);O(n);const s=K.validateReportTemplate(a);if(!s.ok)throw new R("validate",`报表 ${o} 模板校验失败:${s.errors.slice(0,3).map(i=>`${i.path}: ${i.message}`).join("; ")}`);return r.push(...s.warnings.map(i=>`${o}: ${i.path}: ${i.message}`)),a}catch(a){throw n?.aborted?fe(n):a instanceof R?a:a instanceof K.ReportTemplateError?new R("validate",`报表 ${o} 模板校验失败:${a.message}`,a):new R("fetch",`报表 ${o} 模板加载失败:${a instanceof Error?a.message:String(a)}`,a)}}async function Co(e,t,r,o){const n=t.signal;let a;try{if(e.load)a=await Se(e.load(t),n);else if(e.provider){const s=await Se(e.provider.query(t),n);O(n),To(s,r),a=s.datasets,o?.(r,s)}else a=e.datasets??{}}catch(s){throw n?.aborted?fe(n):s instanceof R?s:new R("fetch",`报表 ${r} 取数失败:${s instanceof Error?s.message:String(s)}`,s)}return O(n),a}function To(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new R("validate",`报表 ${t} Provider 应返回 datasets 结果对象`);for(const r of["revision","sourceToken"])if(e[r]!==void 0&&typeof e[r]!="string")throw new R("validate",`报表 ${t} Provider ${r} 应为字符串`);if(e.diagnostics!==void 0&&(!Array.isArray(e.diagnostics)||e.diagnostics.some(r=>!r||typeof r.code!="string"||typeof r.message!="string"||!["info","warning","error"].includes(r.severity))))throw new R("validate",`报表 ${t} Provider diagnostics 不符合结构化诊断契约`);if(e.diagnostics?.some(r=>!Ot(r)))throw new R("validate",`报表 ${t} Provider 数据说明缺少有效的字段身份或值状态`)}function Po(e,t,r,o,n){try{t=Le(o,t,{maxRows:e.dataValidation?.maxRows,signal:n})}catch(a){throw new R("validate",`报表 ${r} 树形数据无效:${a instanceof Error?a.message:String(a)}`,a)}for(const[a,s]of Object.entries(e.dataSchema??{})){let i;try{i=Ee.validateDatasetRows(Object.prototype.hasOwnProperty.call(t,a)?t[a]:void 0,s,{...e.dataValidation,path:`$.datasets.${a}`})}catch(c){throw new R("config",`报表 ${r} 数据集 ${a} 字段契约配置无效`,c)}if(!i.ok)throw new R("validate",`报表 ${r} 数据集 ${a} 不符合字段契约:${i.issues[0]?.message}`,{issues:i.issues})}}function ko(e,t,r,o,n,a){try{const s=Nt(r.pagination,n,e,t,a),i=$e(e,t,s);return Lt(n,i),i}catch(s){const i=Kt(s,n);throw new R("validate",`报表 ${o} 排版失败:${i instanceof Error?i.message:String(i)}`,i)}}function jt(e,t,r,o,n){const a=new Map,s=i=>{let c=a.get(i);return c===void 0&&(c=JSON.stringify([r,o,i]),a.set(i,c)),c};for(const i of t.pages)e.push({...i,meta:{...i.meta,reportScope:Ke(r,o)},components:At(i.components,n??je(r,o),s)})}async function Io(e,t,r,o,n){const a=[],s=ve(o);for(const[l,d]of e.entries()){O(n);try{const f=await Pt(d.template,d.datasets,Nt(t[l]?.pagination,s,d.template,d.datasets,n));Lt(s,f),jt(a,f.plan,l,r[l],d.sourceScope)}catch(f){throw Kt(f,s)}}const i={schemaVersion:re.RENDER_PLAN_SCHEMA_VERSION,...e.some(l=>ae(l.template))?{requiresRecalculation:!0}:{},pages:a},c=K.validateRenderPlan(i);if(!c.ok)throw new R("validate",`重算渲染计划校验失败:${c.errors[0]?.message}`);return i}function $o(e,t={}){if(t.maxPages!==void 0&&(!Number.isSafeInteger(t.maxPages)||t.maxPages<1))throw new R("config","maxPages 应为正安全整数");if(t.maxCells!==void 0&&(!Number.isSafeInteger(t.maxCells)||t.maxCells<1))throw new R("config","maxCells 应为正安全整数");try{ve(t)}catch(n){throw new R("config","maxChartComponents 应为 1..1000000 的安全整数",n)}function r(n){const a=Object.prototype.hasOwnProperty.call(e,n)?e[n]:void 0;if(!a)throw new R("config",`未注册报表 ${n}`);if(a.sourceScope!==void 0&&(typeof a.sourceScope!="string"||!a.sourceScope.trim()||a.sourceScope.length>512))throw new R("config","sourceScope 应为不超过 512 字符的非空字符串");return a}return Object.assign(async({reportIds:n,params:a,signal:s,onWarning:i,onQueryResult:c,...l})=>{O(s);const d=$t({...l,signal:s}),f=[...n],u={...a};if(f.length===0)throw new R("config","缺少报表 ID");const g=f.map(r),m=d.runSync("validate",()=>g.map(p=>He.assertReportParams(p.params??(typeof p.template=="function"?[]:p.template.params)??[],u))),v=[],y=[],h=ve(t),w=[];for(const[p,b]of g.entries()){O(s);const S=f[p],k={reportId:S,params:m[p],signal:s},C=typeof b.template=="function"?await d.run("query",()=>Ro(b.template,k,w),S):b.template;k.params=d.runSync("validate",()=>He.assertReportParams(b.params??C.params??[],k.params),S);const F=await d.run("query",()=>Co(b,k,S,(me,Dt)=>c?.(me,Dt,p)),S);d.runSync("validate",()=>{Eo(F,S),t.onDatasets?.(S,F,C),Po(b,F,S,C,s)},S),O(s);const B=d.runSync("layout",()=>ko(C,F,b,S,h,s),S),De=je(p,S,b.sourceScope);y.push({template:C,datasets:F,sourceScope:De}),jt(v,B.plan,p,S,De),w.push(...B.warnings.map(me=>`${S}: ${me}`))}O(s);const x={schemaVersion:re.RENDER_PLAN_SCHEMA_VERSION,...y.some(p=>ae(p.template))?{requiresRecalculation:!0}:{},pages:v},I=d.runSync("validate",()=>{const p=K.validateRenderPlan(x);if(!p.ok)throw new R("validate",`渲染计划校验失败:${p.errors.slice(0,3).map(b=>`${b.path}: ${b.message}`).join("; ")}`);return p});w.push(...I.warnings.map(p=>`${p.path}: ${p.message}`));const T=g.map(p=>({...p,pagination:{...p.pagination}})),N={maxPages:t.maxPages,maxCells:t.maxCells,maxChartComponents:t.maxChartComponents};try{Ae(x,{parts:y,validationFormulas:T.map(p=>p.pagination?.formula),rebuild:(p,b)=>Io(p,T,f,N,b)})}catch{w.push("来源数据无法建立本地重算口径;当前预览仅支持计划内编辑,请使用可序列化模板数据启用规则重算")}const L=i??t.onWarning??(p=>console.warn("[mach-report]",p));for(const p of w)O(s),L(p);return O(s),x},{getParamDefs:n=>Bt.getReportParamDefs(e,n)})}function Fo(e,t){const r=t.maxNodes??1e6;if(![t.maxBytes,r].every(d=>Number.isSafeInteger(d)&&d>0))throw t.error("budget","快照预算应为正安全整数");let o=0,n=0;const a=new Set;function s(d){if(n+=d,n>t.maxBytes)throw t.error("budget","快照超过字节预算")}function i(d,f){if(++o>r||f>64)throw t.error("budget","快照节点或深度超过预算");if(o%1024===0&&t.check?.(),typeof d=="string")return s(d.length+2),d;if(d===null||typeof d=="boolean"||typeof d=="number"&&Number.isFinite(d))return s(String(d).length),d;if(!d||typeof d!="object"||a.has(d))throw t.error("input","快照应为无循环的有限 JSON 值");return c(d,f)}function c(d,f){const u=Array.isArray(d),g=Object.getPrototypeOf(d);if(g!==(u?Array.prototype:Object.prototype)&&!(g===null&&!u)||Object.getOwnPropertySymbols(d).length)throw t.error("input","快照应为普通 JSON 对象");const m=Object.getOwnPropertyNames(d).filter(h=>!(u&&h==="length"));if(u&&(m.length!==d.length||m.some((h,w)=>h!==String(w))))throw t.error("input","快照数组应为连续数组");a.add(d),s(2);const v=Object.create(null);let y=0;for(const h of m){const w=Object.getOwnPropertyDescriptor(d,h);if(w.get||w.set||!w.enumerable||["__proto__","constructor","prototype"].includes(h))throw t.error("input","快照不允许访问器或危险键");w.value===void 0&&!u||(s((y++?1:0)+(u?0:h.length+3)),v[h]=i(w.value===void 0?null:w.value,f+1))}return a.delete(d),u?m.map(h=>v[h]):v}t.check?.();const l=JSON.stringify(i(e,0));if(new TextEncoder().encode(l).byteLength>t.maxBytes)throw t.error("budget","快照超过字节预算");return JSON.parse(l)}exports.DEFAULT_LABEL_PAGE_LIMIT=Qe;exports.PaginateCellLimitError=J;exports.PaginateChartComponentLimitError=q;exports.PaginatePageLimitError=H;exports.ReportCellEditError=M;exports.ReportSourceError=R;exports.ReportValidationError=ft;exports.applyReportCellEdit=Qr;exports.applyReportCellEditBatch=oo;exports.applyReportEditResult=xt;exports.applyReportSourceMetadata=Oe;exports.assertReportValidation=ht;exports.countTemplatePages=Tr;exports.createReportCellEdit=Jr;exports.createReportCellEditBatch=ro;exports.createReportCellResolver=D;exports.createReportEditSession=po;exports.createReportSource=$o;exports.createReportTaskReporter=$t;exports.defineReport=xo;exports.editFromContext=_;exports.estimateListLayoutCells=$r;exports.explainDatasetField=yo;exports.formatReportCellEdit=G;exports.getReportCellContext=de;exports.getReportEditSession=uo;exports.hasValidDataExplanation=Ot;exports.isReportDataTarget=Ne;exports.isReportValueState=Ft;exports.notifyReportTaskEvent=be;exports.paginateTemplate=$e;exports.paginateTemplatePages=Pr;exports.parseReportCellInput=Fe;exports.projectListColumns=Ye;exports.registerReportEditSession=Ae;exports.relocateReportCellEdits=ao;exports.reportCellEditKey=A;exports.reportOccurrenceScope=Ke;exports.reportSourceScope=je;exports.reportTaskId=It;exports.snapshotReportJson=Fo;exports.sourceChanged=ue;exports.summarizeReportCellEdits=no;exports.templateDatasetJsonSchema=vo;exports.templateDatasetRowCount=bo;exports.templateValidationDatasets=Le;exports.validateReportDataset=Lr;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const h=require("./computed-4TnxzgIh.cjs");function A(e,r,t){if(!Array.isArray(e)||Object.getPrototypeOf(e)!==Array.prototype||e.length>r)throw new TypeError(`${t}应为有界普通数组`);if(Reflect.ownKeys(e).length!==e.length+1)throw new TypeError(`${t}不支持自定义数组方法或迭代器`);const l=[];for(let a=0;a<e.length;a++){const n=Object.getOwnPropertyDescriptor(e,String(a));if(!n||!Object.prototype.hasOwnProperty.call(n,"value"))throw new TypeError(`${t}不支持空洞或访问器`);l.push(n.value)}return l}function m(e,r,t){if(e===void 0)return r;if(!Number.isSafeInteger(e)||Number(e)<1||Number(e)>t)throw new RangeError("图表预算超出允许范围");return Number(e)}function N(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("图表绑定应为对象");if(h.computationFieldName(e.dataset),h.computationFieldName(e.categoryField),!["bar","line","stackedBar","percentBar"].includes(e.type))throw new TypeError("图表类型无效");if(e.sort!==void 0&&!["asc","desc"].includes(e.sort))throw new TypeError("图表排序无效");if(e.title!==void 0&&(typeof e.title!="string"||e.title.length>512))throw new TypeError("图表标题过长");if(e.showValues!==void 0&&typeof e.showValues!="boolean")throw new TypeError("图表数值标签应为布尔值");if(!Array.isArray(e.measures)||!e.measures.length||e.measures.length>12)throw new RangeError("图表支持 1–12 个度量");for(const r of A(e.measures,12,"图表度量"))O(r);m(e.maxRows,1e5,1e5),m(e.maxCategories,200,200)}function O(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("图表度量应为对象");if(e.field!==void 0&&h.computationFieldName(e.field),e.weightField!==void 0&&h.computationFieldName(e.weightField),e.label!==void 0&&(typeof e.label!="string"||e.label.length>256))throw new TypeError("图表系列名称过长");if(e.color!==void 0&&!/^#[\da-f]{6}$/i.test(e.color))throw new TypeError("图表颜色应为 #RRGGBB");h.createAggregateAccumulator(e)}function T(e){if(e==null)return{key:"null",label:"—"};if(typeof e!="string"&&typeof e!="boolean"&&!(typeof e=="number"&&Number.isFinite(e)))throw new TypeError("图表分类应为文本、布尔或有限数字");const r=String(e);if(r.length>512)throw new RangeError("图表分类名称过长");return{key:JSON.stringify([typeof e,e]),label:r}}function j(e){if(e===null)return null;const r=Number(e);if(!Number.isFinite(r))throw new RangeError("聚合结果超出图表有限数值范围");return r}function L(e,r,t){if(t?.aborted){const s=new Error("图表数据处理已取消");throw s.name="AbortError",s}N(r);const l=A(r.measures,12,"图表度量");if(!Array.isArray(e)||e.length>m(r.maxRows,1e5,1e5))throw new RangeError("图表数据超出行数预算");const a=new Map,n=m(r.maxCategories,200,200);for(let s=0;s<e.length;s++){if(t?.aborted){const f=new Error("图表数据处理已取消");throw f.name="AbortError",f}const c=e[s];if(!c||typeof c!="object"||Array.isArray(c))throw new TypeError("图表数据行应为对象");const i=T(Object.prototype.hasOwnProperty.call(c,r.categoryField)?c[r.categoryField]:null);let u=a.get(i.key);if(!u){if(a.size>=n)throw new RangeError("图表分类超出预算,请明确筛选或聚合数据");u={label:i.label,accumulators:l.map(h.createAggregateAccumulator)},a.set(i.key,u)}u.accumulators.forEach(f=>f.add(c))}const o=[...a.values()];return r.sort&&o.sort((s,c)=>(r.sort==="desc"?-1:1)*(s.label<c.label?-1:s.label>c.label?1:0)),{categories:o.map(s=>s.label),series:l.map((s,c)=>({name:s.label??`${s.field??"记录"} · ${s.op}`,values:o.map(i=>j(i.accumulators[c].value())),...s.color?{color:s.color}:{}}))}}function $(e,r){const t=()=>r.measures.map(c=>h.createAggregateAccumulator(c)),l=new Map,a=new Map,n=new Map,o=r.totals?t():void 0,s=(c,i)=>c?.forEach(u=>u.add(i));for(const c of e){const i=r.row(c),u=r.column(c);a.has(u.key)||a.set(u.key,u.label);let f=l.get(i.key);f||(f={label:i.label,cells:new Map,...r.totals?{totals:t()}:{}},l.set(i.key,f)),r.check(l.size,a.size);let d=f.cells.get(u.key);if(d||(d=t(),f.cells.set(u.key,d)),s(d,c),!r.totals)continue;let y=n.get(u.key);y||(y=t(),n.set(u.key,y)),s(f.totals,c),s(y,c),s(o,c)}return{groups:l,columns:a,columnTotals:n,totals:o}}function w(e,r){return JSON.stringify([e.slice(0,r.length),r.map(t=>[t===null?"null":typeof t,t])])}function x(e,r){return r.map(t=>{const l=Object.prototype.hasOwnProperty.call(e,t)?e[t]:null;if(l==null)return null;if(typeof l=="string"||typeof l=="boolean"||typeof l=="number"&&Number.isFinite(l))return l;throw new Error("矩阵维度必须是有限 JSON 标量")})}function z(e,r,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("矩阵层级应为对象");for(const l of[e.emptyLabel,e.subtotalLabel,e.totalLabel])if(l!==void 0&&typeof l!="string")throw new Error("矩阵层级标签应为字符串");E(e.row,r.length),E(e.column,t.length)}function E(e,r){if(e!==void 0){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("矩阵轴配置应为对象");if(e.labels!==void 0&&(!Array.isArray(e.labels)||e.labels.length!==r||e.labels.some(t=>typeof t!="string")))throw new Error("矩阵维度标签必须与维度字段一一对应");if(e.sort!==void 0&&(!Array.isArray(e.sort)||e.sort.length>r||e.sort.some(t=>!["source","asc","desc"].includes(t))))throw new Error("矩阵维度排序应为 source、asc 或 desc");if(e.subtotals!==void 0&&(!Array.isArray(e.subtotals)||new Set(e.subtotals).size!==e.subtotals.length||e.subtotals.some(t=>!Number.isInteger(t)||t<1||t>=r)))throw new Error("矩阵小计深度应唯一且位于 1 至末级之前")}}function F(e,r,t){return{fields:e,options:r??{},hierarchy:t,root:{values:[],children:new Map},leaves:0,expanded:0}}function k(e,r){const t=x(r,e.fields);let l=e.root;for(let a=1;a<=t.length;a++){const n=t.slice(0,a),o=w(e.fields,n);let s=l.children.get(o);s||(s={values:n,children:new Map},l.children.set(o,s),a===t.length?(e.leaves++,e.expanded++):e.options.subtotals?.includes(a)&&e.expanded++),l=s}}function P(e,r){if(e===r)return 0;if(e===null)return-1;if(r===null)return 1;if(typeof e=="number"&&typeof r=="number")return e-r;const t=`${typeof e}:${e}`,l=`${typeof r}:${r}`;return t<l?-1:1}function B(e,r){const t=[...e.children.values()];return r&&r!=="source"&&t.sort((l,a)=>P(l.values[l.values.length-1],a.values[a.values.length-1])*(r==="desc"?-1:1)),t}function b(e,r,t){return{key:w(e.fields,r),kind:t,depth:r.length,fields:e.fields.slice(0,r.length),values:r,labels:r.map(l=>l===null?e.hierarchy.emptyLabel??"(空)":String(l))}}function M(e,r){const t=[];function l(a){for(const n of B(a,e.options.sort?.[a.values.length]))n.children.size?(l(n),e.options.subtotals?.includes(n.values.length)&&t.push(b(e,n.values,"subtotal"))):t.push(b(e,n.values,"member"))}return l(e.root),r&&e.leaves&&t.push(b(e,[],"total")),t}function R(e,r,t){const l=x(r,e.fields),a=[w(e.fields,l),...(e.options.subtotals??[]).map(n=>w(e.fields,l.slice(0,n)))];return t&&a.push(w(e.fields,[])),a}function I(e,r,t){if(!(e.kind!=="member"&&r>e.depth))return e.kind==="total"?{key:"total",text:t.totalLabel??"合计",rowSpan:0}:e.kind==="subtotal"&&r===e.depth?{key:e.key,text:t.subtotalLabel??"小计",rowSpan:0}:{key:JSON.stringify(e.values.slice(0,r+1).map(l=>[typeof l,l])),text:e.labels[r],rowSpan:1}}function K(e,r){const t=e.columnFields.length+1,l=e.rowFields.length,a=Array.from({length:t},()=>Array(l+r.length).fill(null));for(let n=0;n<e.columnFields.length;n++){let o;r.forEach((s,c)=>{const i=I(s,n,e.hierarchy);if(!i){o=void 0;return}if(o?.key===i.key){o.cell.colSpan=(o.cell.colSpan??1)+1;return}const u={text:i.text,rowSpan:i.rowSpan||e.columnFields.length-n,editable:!1,derived:!0};a[n][l+c]=u,o={key:i.key,cell:u}})}return e.rowFields.forEach((n,o)=>{a[0][o]={text:e.hierarchy.row?.labels?.[o]??n,rowSpan:t,editable:!1,derived:!0}}),r.forEach((n,o)=>{const s=e.measures[n.measure];a[t-1][l+o]={text:s.label??`${s.field} (${s.op})`,editable:!1,derived:!0}}),{cells:a.map(n=>n.filter(o=>o!==null)),colWidthsMm:[...e.rowFields.map(()=>e.rowWidthMm??40),...r.map(()=>e.columnWidthMm??28)]}}function v(e,r,t,l){const a=+(!!r.totals&&e>0),n=t.expanded+a,o=(l.expanded+a)*r.measures.length+r.rowFields.length;if(n>(r.maxRows??1e3)||l.expanded+a>(r.maxColumns??200))throw new Error("矩阵层级展开数量超出预算(包含小计/总计)");if(n*o>(r.maxCells??2e6))throw new Error("矩阵输出超出 maxCells 预算");return{rowCount:n,columnCount:o,cells:n*o}}function S(e,r){if(!Array.isArray(e)||e.length>(r.maxInputRows??1e5))throw new Error("矩阵输入超出预算");const t=F(r.rowFields,r.hierarchy.row,r.hierarchy),l=F(r.columnFields,r.hierarchy.column,r.hierarchy);if(e.length*(1+(t.options.subtotals?.length??0)+ +!!r.totals)*(1+(l.options.subtotals?.length??0)+ +!!r.totals)*r.measures.length>(r.maxAggregateUpdates??1e7))throw new Error("矩阵聚合更新超出 maxAggregateUpdates 预算");let n=v(0,r,t,l);for(const o of e){if(!o||typeof o!="object"||Array.isArray(o))throw new Error("矩阵数据行应为对象");k(t,o),k(l,o),n=v(e.length,r,t,l)}return{row:t,column:l,shape:n}}function H(e,r){return S(e,r).shape}function J(e,r,t){const l=new Map;for(const a of e){const n=R(t.row,a,!!r.totals),o=R(t.column,a,!!r.totals);for(const s of n){let c=l.get(s);c||(c=new Map,l.set(s,c));for(const i of o){let u=c.get(i);u||(u=r.measures.map(f=>h.createAggregateAccumulator({...f,field:f.valueField??f.field})),c.set(i,u)),u.forEach(f=>f.add(a))}}}return l}function _(e,r){return e.flatMap((t,l)=>r.measures.map((a,n)=>({...t,field:t.kind==="total"?`total_${n}`:`c${l}_${n}`,measure:n,measureField:a.field,valueField:a.valueField??a.field,operation:a.op})))}function D(e,r){return e.kind==="total"?r.hierarchy.totalLabel??"合计":[...e.labels,...e.kind==="subtotal"?[r.hierarchy.subtotalLabel??"小计"]:[]].join(" / ")}function V(e,r){return[...r.rowFields.map((t,l)=>({field:`r${l}`,header:r.hierarchy.row?.labels?.[l]??t,semanticRole:"dimension"})),...e.map(t=>{const l=r.measures[t.measure];return{field:t.field,header:`${D(t,r)} · ${l.label??`${l.field} (${l.op})`}`,semanticRole:"measure",...l.digits===void 0?{}:{format:{kind:"number",digits:l.digits}}}})]}function W(e,r,t,l){return e.map(a=>{const n={};t.rowFields.forEach((o,s)=>{n[`r${s}`]=a.kind==="total"?s===0?t.hierarchy.totalLabel??"合计":null:a.labels[s]??(s===a.depth?t.hierarchy.subtotalLabel??"小计":null)});for(const o of r)n[o.field]=l.get(a.key)?.get(o.key)?.[o.measure]?.value()??(t.measures[o.measure].op==="count"?0:null);return n})}function G(e,r){const t=S(e,r),l=M(t.row,!!r.totals),a=_(M(t.column,!!r.totals),r),n=J(e,r,t);return{columns:V(a,r),rows:W(l,a,r,n),headerGrid:K(r,a),metadata:{rowFields:[...r.rowFields],rowLabels:[...r.hierarchy.row?.labels??r.rowFields],columnFields:[...r.columnFields],columnLabels:[...r.hierarchy.column?.labels??r.columnFields],rows:l,columns:a}}}function g(e,r){const t=r.map(l=>Object.prototype.hasOwnProperty.call(e,l)?e[l]:null);if(t.some(l=>l!=null&&typeof l!="string"&&typeof l!="boolean"&&!(typeof l=="number"&&Number.isFinite(l))))throw new Error("矩阵维度必须是有限 JSON 标量");return{key:JSON.stringify(t.map(l=>[typeof l,l??null])),label:t.map(l=>l==null?"":String(l)).join(" / ")}}function U(e){for(const r of["maxRows","maxColumns","maxInputRows","maxCells","maxAggregateUpdates"])if(e[r]!==void 0&&(!Number.isSafeInteger(e[r])||e[r]<1))throw new Error("矩阵预算应为正安全整数");for(const r of["columnWidthMm","rowWidthMm"])if(e[r]!==void 0&&(!Number.isFinite(e[r])||e[r]<=0))throw new Error("矩阵列宽应为正数")}function p(e){if(!e||!Array.isArray(e.rowFields)||!Array.isArray(e.columnFields)||!Array.isArray(e.measures))throw new Error("矩阵需要行维度、列维度和度量数组");for(const t of[e.rowFields,e.columnFields])if(t.some(l=>typeof l!="string"||!l.trim())||new Set(t).size!==t.length)throw new Error("矩阵维度字段应非空且唯一");if(U(e),!e.rowFields.length||!e.columnFields.length||e.rowFields.length>16||e.columnFields.length>16)throw new Error("矩阵需要 1–16 个行/列维度");if(!e.measures.length||e.measures.length>32)throw new Error("矩阵需要 1–32 个度量");if(e.measures.map(t=>{if(!t||typeof t!="object")throw new Error("矩阵度量应为对象");if(h.createAggregateAccumulator({...t,field:t.valueField??t.field}),t.label!==void 0&&typeof t.label!="string")throw new Error("矩阵度量标签应为字符串");return t.field}).some(t=>typeof t!="string"||!t.trim()))throw new Error("矩阵度量字段应非空");e.hierarchy!==void 0&&z(e.hierarchy,e.rowFields,e.columnFields)}function C(e,r){if(p(r),r.hierarchy)return H(e,r);if(!Array.isArray(e)||e.length>(r.maxInputRows??1e5))throw new Error("矩阵输入超出预算");const t=new Set,l=new Set;for(const o of e){if(!o||typeof o!="object"||Array.isArray(o))throw new Error("矩阵数据行应为对象");if(t.add(g(o,r.rowFields).key),l.add(g(o,r.columnFields).key),t.size>(r.maxRows??1e3)||l.size>(r.maxColumns??200))throw new Error("矩阵维度数量超出预算");if((t.size+ +!!r.totals)*((l.size+ +!!r.totals)*r.measures.length+1)>(r.maxCells??2e6))throw new Error("矩阵输出超出 maxCells 预算")}const a=t.size+ +(!!r.totals&&e.length>0),n=(l.size+ +!!r.totals)*r.measures.length+1;return{rowCount:a,columnCount:n,cells:a*n}}function q(e,r){if(r?.hierarchy)return p(r),G(e,r);C(e,r);const t=$(e,{row:o=>g(o,r.rowFields),column:o=>g(o,r.columnFields),measures:r.measures.map(o=>({...o,field:o.valueField??o.field})),totals:r.totals,check:()=>{}}),l=[...t.groups.values()].map(o=>({rowLabel:o.label})),a=[{field:"rowLabel",header:r.rowHeader??r.rowFields.join(" / "),semanticRole:"dimension"}],n={rowLabel:"合计"};return r.measures.forEach((o,s)=>{const c=[...t.columns.entries()].map(([i,u],f)=>({key:i,label:u,field:`c${f}_${s}`}));r.totals&&c.push({key:"",label:"合计",field:`total_${s}`});for(const i of c){const u=i.field===`total_${s}`;a.push({field:i.field,header:`${i.label} · ${o.label??`${o.field} (${o.op})`}`,semanticRole:"measure",...o.digits===void 0?{}:{format:{kind:"number",digits:o.digits}}});let f=0;for(const d of t.groups.values())l[f++][i.field]=(u?d.totals?.[s]:d.cells.get(i.key)?.[s])?.value()??(o.op==="count"?0:null);n[i.field]=(u?t.totals?.[s]:t.columnTotals.get(i.key)?.[s])?.value()??(o.op==="count"?0:null)}}),r.totals&&e.length&&l.push(n),{rows:l,columns:a}}exports.accumulatePivotRows=$;exports.chartArray=A;exports.createMatrixTable=q;exports.createReportChartData=L;exports.estimateMatrixTable=C;exports.validateMatrixOptions=p;exports.validateReportChartBinding=N;
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
import { n as m, c as w } from "./computed-C8NRZQss.js";
|
|
2
|
+
function M(e, r, t) {
|
|
3
|
+
if (!Array.isArray(e) || Object.getPrototypeOf(e) !== Array.prototype || e.length > r) throw new TypeError(`${t}应为有界普通数组`);
|
|
4
|
+
if (Reflect.ownKeys(e).length !== e.length + 1) throw new TypeError(`${t}不支持自定义数组方法或迭代器`);
|
|
5
|
+
const l = [];
|
|
6
|
+
for (let a = 0; a < e.length; a++) {
|
|
7
|
+
const n = Object.getOwnPropertyDescriptor(e, String(a));
|
|
8
|
+
if (!n || !Object.prototype.hasOwnProperty.call(n, "value")) throw new TypeError(`${t}不支持空洞或访问器`);
|
|
9
|
+
l.push(n.value);
|
|
10
|
+
}
|
|
11
|
+
return l;
|
|
12
|
+
}
|
|
13
|
+
function g(e, r, t) {
|
|
14
|
+
if (e === void 0) return r;
|
|
15
|
+
if (!Number.isSafeInteger(e) || Number(e) < 1 || Number(e) > t) throw new RangeError("图表预算超出允许范围");
|
|
16
|
+
return Number(e);
|
|
17
|
+
}
|
|
18
|
+
function x(e) {
|
|
19
|
+
if (!e || typeof e != "object" || Array.isArray(e)) throw new TypeError("图表绑定应为对象");
|
|
20
|
+
if (m(e.dataset), m(e.categoryField), !["bar", "line", "stackedBar", "percentBar"].includes(e.type)) throw new TypeError("图表类型无效");
|
|
21
|
+
if (e.sort !== void 0 && !["asc", "desc"].includes(e.sort)) throw new TypeError("图表排序无效");
|
|
22
|
+
if (e.title !== void 0 && (typeof e.title != "string" || e.title.length > 512)) throw new TypeError("图表标题过长");
|
|
23
|
+
if (e.showValues !== void 0 && typeof e.showValues != "boolean") throw new TypeError("图表数值标签应为布尔值");
|
|
24
|
+
if (!Array.isArray(e.measures) || !e.measures.length || e.measures.length > 12) throw new RangeError("图表支持 1–12 个度量");
|
|
25
|
+
for (const r of M(e.measures, 12, "图表度量")) C(r);
|
|
26
|
+
g(e.maxRows, 1e5, 1e5), g(e.maxCategories, 200, 200);
|
|
27
|
+
}
|
|
28
|
+
function C(e) {
|
|
29
|
+
if (!e || typeof e != "object" || Array.isArray(e)) throw new TypeError("图表度量应为对象");
|
|
30
|
+
if (e.field !== void 0 && m(e.field), e.weightField !== void 0 && m(e.weightField), e.label !== void 0 && (typeof e.label != "string" || e.label.length > 256)) throw new TypeError("图表系列名称过长");
|
|
31
|
+
if (e.color !== void 0 && !/^#[\da-f]{6}$/i.test(e.color)) throw new TypeError("图表颜色应为 #RRGGBB");
|
|
32
|
+
w(e);
|
|
33
|
+
}
|
|
34
|
+
function O(e) {
|
|
35
|
+
if (e == null) return { key: "null", label: "—" };
|
|
36
|
+
if (typeof e != "string" && typeof e != "boolean" && !(typeof e == "number" && Number.isFinite(e))) throw new TypeError("图表分类应为文本、布尔或有限数字");
|
|
37
|
+
const r = String(e);
|
|
38
|
+
if (r.length > 512) throw new RangeError("图表分类名称过长");
|
|
39
|
+
return { key: JSON.stringify([typeof e, e]), label: r };
|
|
40
|
+
}
|
|
41
|
+
function j(e) {
|
|
42
|
+
if (e === null) return null;
|
|
43
|
+
const r = Number(e);
|
|
44
|
+
if (!Number.isFinite(r)) throw new RangeError("聚合结果超出图表有限数值范围");
|
|
45
|
+
return r;
|
|
46
|
+
}
|
|
47
|
+
function Q(e, r, t) {
|
|
48
|
+
if (t?.aborted) {
|
|
49
|
+
const s = new Error("图表数据处理已取消");
|
|
50
|
+
throw s.name = "AbortError", s;
|
|
51
|
+
}
|
|
52
|
+
x(r);
|
|
53
|
+
const l = M(r.measures, 12, "图表度量");
|
|
54
|
+
if (!Array.isArray(e) || e.length > g(r.maxRows, 1e5, 1e5)) throw new RangeError("图表数据超出行数预算");
|
|
55
|
+
const a = /* @__PURE__ */ new Map(), n = g(r.maxCategories, 200, 200);
|
|
56
|
+
for (let s = 0; s < e.length; s++) {
|
|
57
|
+
if (t?.aborted) {
|
|
58
|
+
const u = new Error("图表数据处理已取消");
|
|
59
|
+
throw u.name = "AbortError", u;
|
|
60
|
+
}
|
|
61
|
+
const c = e[s];
|
|
62
|
+
if (!c || typeof c != "object" || Array.isArray(c)) throw new TypeError("图表数据行应为对象");
|
|
63
|
+
const f = O(Object.prototype.hasOwnProperty.call(c, r.categoryField) ? c[r.categoryField] : null);
|
|
64
|
+
let i = a.get(f.key);
|
|
65
|
+
if (!i) {
|
|
66
|
+
if (a.size >= n) throw new RangeError("图表分类超出预算,请明确筛选或聚合数据");
|
|
67
|
+
i = { label: f.label, accumulators: l.map(w) }, a.set(f.key, i);
|
|
68
|
+
}
|
|
69
|
+
i.accumulators.forEach((u) => u.add(c));
|
|
70
|
+
}
|
|
71
|
+
const o = [...a.values()];
|
|
72
|
+
return r.sort && o.sort((s, c) => (r.sort === "desc" ? -1 : 1) * (s.label < c.label ? -1 : s.label > c.label ? 1 : 0)), { categories: o.map((s) => s.label), series: l.map((s, c) => ({
|
|
73
|
+
name: s.label ?? `${s.field ?? "记录"} · ${s.op}`,
|
|
74
|
+
values: o.map((f) => j(f.accumulators[c].value())),
|
|
75
|
+
...s.color ? { color: s.color } : {}
|
|
76
|
+
})) };
|
|
77
|
+
}
|
|
78
|
+
function T(e, r) {
|
|
79
|
+
const t = () => r.measures.map((c) => w(c)), l = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), o = r.totals ? t() : void 0, s = (c, f) => c?.forEach((i) => i.add(f));
|
|
80
|
+
for (const c of e) {
|
|
81
|
+
const f = r.row(c), i = r.column(c);
|
|
82
|
+
a.has(i.key) || a.set(i.key, i.label);
|
|
83
|
+
let u = l.get(f.key);
|
|
84
|
+
u || (u = { label: f.label, cells: /* @__PURE__ */ new Map(), ...r.totals ? { totals: t() } : {} }, l.set(f.key, u)), r.check(l.size, a.size);
|
|
85
|
+
let h = u.cells.get(i.key);
|
|
86
|
+
if (h || (h = t(), u.cells.set(i.key, h)), s(h, c), !r.totals) continue;
|
|
87
|
+
let y = n.get(i.key);
|
|
88
|
+
y || (y = t(), n.set(i.key, y)), s(u.totals, c), s(y, c), s(o, c);
|
|
89
|
+
}
|
|
90
|
+
return { groups: l, columns: a, columnTotals: n, totals: o };
|
|
91
|
+
}
|
|
92
|
+
function d(e, r) {
|
|
93
|
+
return JSON.stringify([e.slice(0, r.length), r.map((t) => [t === null ? "null" : typeof t, t])]);
|
|
94
|
+
}
|
|
95
|
+
function R(e, r) {
|
|
96
|
+
return r.map((t) => {
|
|
97
|
+
const l = Object.prototype.hasOwnProperty.call(e, t) ? e[t] : null;
|
|
98
|
+
if (l == null) return null;
|
|
99
|
+
if (typeof l == "string" || typeof l == "boolean" || typeof l == "number" && Number.isFinite(l)) return l;
|
|
100
|
+
throw new Error("矩阵维度必须是有限 JSON 标量");
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
function L(e, r, t) {
|
|
104
|
+
if (!e || typeof e != "object" || Array.isArray(e)) throw new Error("矩阵层级应为对象");
|
|
105
|
+
for (const l of [e.emptyLabel, e.subtotalLabel, e.totalLabel]) if (l !== void 0 && typeof l != "string") throw new Error("矩阵层级标签应为字符串");
|
|
106
|
+
p(e.row, r.length), p(e.column, t.length);
|
|
107
|
+
}
|
|
108
|
+
function p(e, r) {
|
|
109
|
+
if (e !== void 0) {
|
|
110
|
+
if (!e || typeof e != "object" || Array.isArray(e)) throw new Error("矩阵轴配置应为对象");
|
|
111
|
+
if (e.labels !== void 0 && (!Array.isArray(e.labels) || e.labels.length !== r || e.labels.some((t) => typeof t != "string"))) throw new Error("矩阵维度标签必须与维度字段一一对应");
|
|
112
|
+
if (e.sort !== void 0 && (!Array.isArray(e.sort) || e.sort.length > r || e.sort.some((t) => !["source", "asc", "desc"].includes(t)))) throw new Error("矩阵维度排序应为 source、asc 或 desc");
|
|
113
|
+
if (e.subtotals !== void 0 && (!Array.isArray(e.subtotals) || new Set(e.subtotals).size !== e.subtotals.length || e.subtotals.some((t) => !Number.isInteger(t) || t < 1 || t >= r))) throw new Error("矩阵小计深度应唯一且位于 1 至末级之前");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function A(e, r, t) {
|
|
117
|
+
return { fields: e, options: r ?? {}, hierarchy: t, root: { values: [], children: /* @__PURE__ */ new Map() }, leaves: 0, expanded: 0 };
|
|
118
|
+
}
|
|
119
|
+
function F(e, r) {
|
|
120
|
+
const t = R(r, e.fields);
|
|
121
|
+
let l = e.root;
|
|
122
|
+
for (let a = 1; a <= t.length; a++) {
|
|
123
|
+
const n = t.slice(0, a), o = d(e.fields, n);
|
|
124
|
+
let s = l.children.get(o);
|
|
125
|
+
s || (s = { values: n, children: /* @__PURE__ */ new Map() }, l.children.set(o, s), a === t.length ? (e.leaves++, e.expanded++) : e.options.subtotals?.includes(a) && e.expanded++), l = s;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function z(e, r) {
|
|
129
|
+
if (e === r) return 0;
|
|
130
|
+
if (e === null) return -1;
|
|
131
|
+
if (r === null) return 1;
|
|
132
|
+
if (typeof e == "number" && typeof r == "number") return e - r;
|
|
133
|
+
const t = `${typeof e}:${e}`, l = `${typeof r}:${r}`;
|
|
134
|
+
return t < l ? -1 : 1;
|
|
135
|
+
}
|
|
136
|
+
function P(e, r) {
|
|
137
|
+
const t = [...e.children.values()];
|
|
138
|
+
return r && r !== "source" && t.sort((l, a) => z(l.values[l.values.length - 1], a.values[a.values.length - 1]) * (r === "desc" ? -1 : 1)), t;
|
|
139
|
+
}
|
|
140
|
+
function E(e, r, t) {
|
|
141
|
+
return {
|
|
142
|
+
key: d(e.fields, r),
|
|
143
|
+
kind: t,
|
|
144
|
+
depth: r.length,
|
|
145
|
+
fields: e.fields.slice(0, r.length),
|
|
146
|
+
values: r,
|
|
147
|
+
labels: r.map((l) => l === null ? e.hierarchy.emptyLabel ?? "(空)" : String(l))
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function k(e, r) {
|
|
151
|
+
const t = [];
|
|
152
|
+
function l(a) {
|
|
153
|
+
for (const n of P(a, e.options.sort?.[a.values.length]))
|
|
154
|
+
n.children.size ? (l(n), e.options.subtotals?.includes(n.values.length) && t.push(E(e, n.values, "subtotal"))) : t.push(E(e, n.values, "member"));
|
|
155
|
+
}
|
|
156
|
+
return l(e.root), r && e.leaves && t.push(E(e, [], "total")), t;
|
|
157
|
+
}
|
|
158
|
+
function $(e, r, t) {
|
|
159
|
+
const l = R(r, e.fields), a = [d(e.fields, l), ...(e.options.subtotals ?? []).map((n) => d(e.fields, l.slice(0, n)))];
|
|
160
|
+
return t && a.push(d(e.fields, [])), a;
|
|
161
|
+
}
|
|
162
|
+
function I(e, r, t) {
|
|
163
|
+
if (!(e.kind !== "member" && r > e.depth))
|
|
164
|
+
return e.kind === "total" ? { key: "total", text: t.totalLabel ?? "合计", rowSpan: 0 } : e.kind === "subtotal" && r === e.depth ? { key: e.key, text: t.subtotalLabel ?? "小计", rowSpan: 0 } : { key: JSON.stringify(e.values.slice(0, r + 1).map((l) => [typeof l, l])), text: e.labels[r], rowSpan: 1 };
|
|
165
|
+
}
|
|
166
|
+
function K(e, r) {
|
|
167
|
+
const t = e.columnFields.length + 1, l = e.rowFields.length, a = Array.from({ length: t }, () => Array(l + r.length).fill(null));
|
|
168
|
+
for (let n = 0; n < e.columnFields.length; n++) {
|
|
169
|
+
let o;
|
|
170
|
+
r.forEach((s, c) => {
|
|
171
|
+
const f = I(s, n, e.hierarchy);
|
|
172
|
+
if (!f) {
|
|
173
|
+
o = void 0;
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (o?.key === f.key) {
|
|
177
|
+
o.cell.colSpan = (o.cell.colSpan ?? 1) + 1;
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const i = { text: f.text, rowSpan: f.rowSpan || e.columnFields.length - n, editable: !1, derived: !0 };
|
|
181
|
+
a[n][l + c] = i, o = { key: f.key, cell: i };
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return e.rowFields.forEach((n, o) => {
|
|
185
|
+
a[0][o] = { text: e.hierarchy.row?.labels?.[o] ?? n, rowSpan: t, editable: !1, derived: !0 };
|
|
186
|
+
}), r.forEach((n, o) => {
|
|
187
|
+
const s = e.measures[n.measure];
|
|
188
|
+
a[t - 1][l + o] = { text: s.label ?? `${s.field} (${s.op})`, editable: !1, derived: !0 };
|
|
189
|
+
}), {
|
|
190
|
+
cells: a.map((n) => n.filter((o) => o !== null)),
|
|
191
|
+
colWidthsMm: [...e.rowFields.map(() => e.rowWidthMm ?? 40), ...r.map(() => e.columnWidthMm ?? 28)]
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function v(e, r, t, l) {
|
|
195
|
+
const a = +(!!r.totals && e > 0), n = t.expanded + a, o = (l.expanded + a) * r.measures.length + r.rowFields.length;
|
|
196
|
+
if (n > (r.maxRows ?? 1e3) || l.expanded + a > (r.maxColumns ?? 200)) throw new Error("矩阵层级展开数量超出预算(包含小计/总计)");
|
|
197
|
+
if (n * o > (r.maxCells ?? 2e6)) throw new Error("矩阵输出超出 maxCells 预算");
|
|
198
|
+
return { rowCount: n, columnCount: o, cells: n * o };
|
|
199
|
+
}
|
|
200
|
+
function N(e, r) {
|
|
201
|
+
if (!Array.isArray(e) || e.length > (r.maxInputRows ?? 1e5)) throw new Error("矩阵输入超出预算");
|
|
202
|
+
const t = A(r.rowFields, r.hierarchy.row, r.hierarchy), l = A(r.columnFields, r.hierarchy.column, r.hierarchy);
|
|
203
|
+
if (e.length * (1 + (t.options.subtotals?.length ?? 0) + +!!r.totals) * (1 + (l.options.subtotals?.length ?? 0) + +!!r.totals) * r.measures.length > (r.maxAggregateUpdates ?? 1e7)) throw new Error("矩阵聚合更新超出 maxAggregateUpdates 预算");
|
|
204
|
+
let n = v(0, r, t, l);
|
|
205
|
+
for (const o of e) {
|
|
206
|
+
if (!o || typeof o != "object" || Array.isArray(o)) throw new Error("矩阵数据行应为对象");
|
|
207
|
+
F(t, o), F(l, o), n = v(e.length, r, t, l);
|
|
208
|
+
}
|
|
209
|
+
return { row: t, column: l, shape: n };
|
|
210
|
+
}
|
|
211
|
+
function B(e, r) {
|
|
212
|
+
return N(e, r).shape;
|
|
213
|
+
}
|
|
214
|
+
function H(e, r, t) {
|
|
215
|
+
const l = /* @__PURE__ */ new Map();
|
|
216
|
+
for (const a of e) {
|
|
217
|
+
const n = $(t.row, a, !!r.totals), o = $(t.column, a, !!r.totals);
|
|
218
|
+
for (const s of n) {
|
|
219
|
+
let c = l.get(s);
|
|
220
|
+
c || (c = /* @__PURE__ */ new Map(), l.set(s, c));
|
|
221
|
+
for (const f of o) {
|
|
222
|
+
let i = c.get(f);
|
|
223
|
+
i || (i = r.measures.map((u) => w({ ...u, field: u.valueField ?? u.field })), c.set(f, i)), i.forEach((u) => u.add(a));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return l;
|
|
228
|
+
}
|
|
229
|
+
function J(e, r) {
|
|
230
|
+
return e.flatMap((t, l) => r.measures.map((a, n) => ({
|
|
231
|
+
...t,
|
|
232
|
+
field: t.kind === "total" ? `total_${n}` : `c${l}_${n}`,
|
|
233
|
+
measure: n,
|
|
234
|
+
measureField: a.field,
|
|
235
|
+
valueField: a.valueField ?? a.field,
|
|
236
|
+
operation: a.op
|
|
237
|
+
})));
|
|
238
|
+
}
|
|
239
|
+
function _(e, r) {
|
|
240
|
+
return e.kind === "total" ? r.hierarchy.totalLabel ?? "合计" : [...e.labels, ...e.kind === "subtotal" ? [r.hierarchy.subtotalLabel ?? "小计"] : []].join(" / ");
|
|
241
|
+
}
|
|
242
|
+
function V(e, r) {
|
|
243
|
+
return [
|
|
244
|
+
...r.rowFields.map((t, l) => ({ field: `r${l}`, header: r.hierarchy.row?.labels?.[l] ?? t, semanticRole: "dimension" })),
|
|
245
|
+
...e.map((t) => {
|
|
246
|
+
const l = r.measures[t.measure];
|
|
247
|
+
return {
|
|
248
|
+
field: t.field,
|
|
249
|
+
header: `${_(t, r)} · ${l.label ?? `${l.field} (${l.op})`}`,
|
|
250
|
+
semanticRole: "measure",
|
|
251
|
+
...l.digits === void 0 ? {} : { format: { kind: "number", digits: l.digits } }
|
|
252
|
+
};
|
|
253
|
+
})
|
|
254
|
+
];
|
|
255
|
+
}
|
|
256
|
+
function W(e, r, t, l) {
|
|
257
|
+
return e.map((a) => {
|
|
258
|
+
const n = {};
|
|
259
|
+
t.rowFields.forEach((o, s) => {
|
|
260
|
+
n[`r${s}`] = a.kind === "total" ? s === 0 ? t.hierarchy.totalLabel ?? "合计" : null : a.labels[s] ?? (s === a.depth ? t.hierarchy.subtotalLabel ?? "小计" : null);
|
|
261
|
+
});
|
|
262
|
+
for (const o of r) n[o.field] = l.get(a.key)?.get(o.key)?.[o.measure]?.value() ?? (t.measures[o.measure].op === "count" ? 0 : null);
|
|
263
|
+
return n;
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
function D(e, r) {
|
|
267
|
+
const t = N(e, r), l = k(t.row, !!r.totals), a = J(k(t.column, !!r.totals), r), n = H(e, r, t);
|
|
268
|
+
return { columns: V(a, r), rows: W(l, a, r, n), headerGrid: K(r, a), metadata: {
|
|
269
|
+
rowFields: [...r.rowFields],
|
|
270
|
+
rowLabels: [...r.hierarchy.row?.labels ?? r.rowFields],
|
|
271
|
+
columnFields: [...r.columnFields],
|
|
272
|
+
columnLabels: [...r.hierarchy.column?.labels ?? r.columnFields],
|
|
273
|
+
rows: l,
|
|
274
|
+
columns: a
|
|
275
|
+
} };
|
|
276
|
+
}
|
|
277
|
+
function b(e, r) {
|
|
278
|
+
const t = r.map(
|
|
279
|
+
(l) => Object.prototype.hasOwnProperty.call(e, l) ? e[l] : null
|
|
280
|
+
);
|
|
281
|
+
if (t.some(
|
|
282
|
+
(l) => l != null && typeof l != "string" && typeof l != "boolean" && !(typeof l == "number" && Number.isFinite(l))
|
|
283
|
+
))
|
|
284
|
+
throw new Error("矩阵维度必须是有限 JSON 标量");
|
|
285
|
+
return {
|
|
286
|
+
key: JSON.stringify(t.map((l) => [typeof l, l ?? null])),
|
|
287
|
+
label: t.map((l) => l == null ? "" : String(l)).join(" / ")
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
function G(e) {
|
|
291
|
+
for (const r of [
|
|
292
|
+
"maxRows",
|
|
293
|
+
"maxColumns",
|
|
294
|
+
"maxInputRows",
|
|
295
|
+
"maxCells",
|
|
296
|
+
"maxAggregateUpdates"
|
|
297
|
+
])
|
|
298
|
+
if (e[r] !== void 0 && (!Number.isSafeInteger(e[r]) || e[r] < 1))
|
|
299
|
+
throw new Error("矩阵预算应为正安全整数");
|
|
300
|
+
for (const r of ["columnWidthMm", "rowWidthMm"])
|
|
301
|
+
if (e[r] !== void 0 && (!Number.isFinite(e[r]) || e[r] <= 0))
|
|
302
|
+
throw new Error("矩阵列宽应为正数");
|
|
303
|
+
}
|
|
304
|
+
function S(e) {
|
|
305
|
+
if (!e || !Array.isArray(e.rowFields) || !Array.isArray(e.columnFields) || !Array.isArray(e.measures))
|
|
306
|
+
throw new Error("矩阵需要行维度、列维度和度量数组");
|
|
307
|
+
for (const t of [e.rowFields, e.columnFields])
|
|
308
|
+
if (t.some((l) => typeof l != "string" || !l.trim()) || new Set(t).size !== t.length)
|
|
309
|
+
throw new Error("矩阵维度字段应非空且唯一");
|
|
310
|
+
if (G(e), !e.rowFields.length || !e.columnFields.length || e.rowFields.length > 16 || e.columnFields.length > 16)
|
|
311
|
+
throw new Error("矩阵需要 1–16 个行/列维度");
|
|
312
|
+
if (!e.measures.length || e.measures.length > 32)
|
|
313
|
+
throw new Error("矩阵需要 1–32 个度量");
|
|
314
|
+
if (e.measures.map((t) => {
|
|
315
|
+
if (!t || typeof t != "object") throw new Error("矩阵度量应为对象");
|
|
316
|
+
if (w({
|
|
317
|
+
...t,
|
|
318
|
+
field: t.valueField ?? t.field
|
|
319
|
+
}), t.label !== void 0 && typeof t.label != "string")
|
|
320
|
+
throw new Error("矩阵度量标签应为字符串");
|
|
321
|
+
return t.field;
|
|
322
|
+
}).some((t) => typeof t != "string" || !t.trim()))
|
|
323
|
+
throw new Error("矩阵度量字段应非空");
|
|
324
|
+
e.hierarchy !== void 0 && L(e.hierarchy, e.rowFields, e.columnFields);
|
|
325
|
+
}
|
|
326
|
+
function U(e, r) {
|
|
327
|
+
if (S(r), r.hierarchy) return B(e, r);
|
|
328
|
+
if (!Array.isArray(e) || e.length > (r.maxInputRows ?? 1e5))
|
|
329
|
+
throw new Error("矩阵输入超出预算");
|
|
330
|
+
const t = /* @__PURE__ */ new Set(), l = /* @__PURE__ */ new Set();
|
|
331
|
+
for (const o of e) {
|
|
332
|
+
if (!o || typeof o != "object" || Array.isArray(o))
|
|
333
|
+
throw new Error("矩阵数据行应为对象");
|
|
334
|
+
if (t.add(b(o, r.rowFields).key), l.add(b(o, r.columnFields).key), t.size > (r.maxRows ?? 1e3) || l.size > (r.maxColumns ?? 200))
|
|
335
|
+
throw new Error("矩阵维度数量超出预算");
|
|
336
|
+
if ((t.size + +!!r.totals) * ((l.size + +!!r.totals) * r.measures.length + 1) > (r.maxCells ?? 2e6))
|
|
337
|
+
throw new Error("矩阵输出超出 maxCells 预算");
|
|
338
|
+
}
|
|
339
|
+
const a = t.size + +(!!r.totals && e.length > 0), n = (l.size + +!!r.totals) * r.measures.length + 1;
|
|
340
|
+
return { rowCount: a, columnCount: n, cells: a * n };
|
|
341
|
+
}
|
|
342
|
+
function X(e, r) {
|
|
343
|
+
if (r?.hierarchy)
|
|
344
|
+
return S(r), D(e, r);
|
|
345
|
+
U(e, r);
|
|
346
|
+
const t = T(e, {
|
|
347
|
+
row: (o) => b(o, r.rowFields),
|
|
348
|
+
column: (o) => b(o, r.columnFields),
|
|
349
|
+
measures: r.measures.map((o) => ({ ...o, field: o.valueField ?? o.field })),
|
|
350
|
+
totals: r.totals,
|
|
351
|
+
check: () => {
|
|
352
|
+
}
|
|
353
|
+
// Cardinality/budgets were checked before allocating accumulators.
|
|
354
|
+
}), l = [...t.groups.values()].map((o) => ({ rowLabel: o.label })), a = [{ field: "rowLabel", header: r.rowHeader ?? r.rowFields.join(" / "), semanticRole: "dimension" }], n = { rowLabel: "合计" };
|
|
355
|
+
return r.measures.forEach((o, s) => {
|
|
356
|
+
const c = [...t.columns.entries()].map(([f, i], u) => ({ key: f, label: i, field: `c${u}_${s}` }));
|
|
357
|
+
r.totals && c.push({ key: "", label: "合计", field: `total_${s}` });
|
|
358
|
+
for (const f of c) {
|
|
359
|
+
const i = f.field === `total_${s}`;
|
|
360
|
+
a.push({
|
|
361
|
+
field: f.field,
|
|
362
|
+
header: `${f.label} · ${o.label ?? `${o.field} (${o.op})`}`,
|
|
363
|
+
semanticRole: "measure",
|
|
364
|
+
...o.digits === void 0 ? {} : { format: { kind: "number", digits: o.digits } }
|
|
365
|
+
});
|
|
366
|
+
let u = 0;
|
|
367
|
+
for (const h of t.groups.values())
|
|
368
|
+
l[u++][f.field] = (i ? h.totals?.[s] : h.cells.get(f.key)?.[s])?.value() ?? (o.op === "count" ? 0 : null);
|
|
369
|
+
n[f.field] = (i ? t.totals?.[s] : t.columnTotals.get(f.key)?.[s])?.value() ?? (o.op === "count" ? 0 : null);
|
|
370
|
+
}
|
|
371
|
+
}), r.totals && e.length && l.push(n), { rows: l, columns: a };
|
|
372
|
+
}
|
|
373
|
+
export {
|
|
374
|
+
T as a,
|
|
375
|
+
Q as b,
|
|
376
|
+
X as c,
|
|
377
|
+
x as d,
|
|
378
|
+
U as e,
|
|
379
|
+
M as f,
|
|
380
|
+
S as v
|
|
381
|
+
};
|