Sfoglia il codice sorgente

Merge branch 'master' of http://192.168.1.41:3000/SmartCost/SCCommon

qinlaiqiao 5 anni fa
parent
commit
9b92c172a6
63 ha cambiato i file con 10605 aggiunte e 1708 eliminazioni
  1. 3 0
      handsontable/handsontable.d.ts
  2. 1 1
      handsontable/package.json
  3. 1 1
      handsontable/src/helpers/dom/element.js
  4. 2 0
      report/.eslintrc.js
  5. 6973 9
      report/dist/index.cjs.js
  6. 2 1
      report/dist/index.d.ts
  7. 3 1
      report/package.json
  8. 10 0
      report/src/core/helper/index.ts
  9. 48 47
      report/src/core/helper/jpc_helper_area.ts
  10. 44 41
      report/src/core/helper/jpc_helper_band.ts
  11. 39 33
      report/src/core/helper/jpc_helper_common.ts
  12. 41 40
      report/src/core/helper/jpc_helper_common_output.ts
  13. 51 49
      report/src/core/helper/jpc_helper_cross_tab.ts
  14. 47 45
      report/src/core/helper/jpc_helper_discrete.ts
  15. 46 38
      report/src/core/helper/jpc_helper_field.ts
  16. 22 20
      report/src/core/helper/jpc_helper_flow_tab.ts
  17. 1 1
      report/src/core/helper/jpc_helper_font_width.ts
  18. 7 5
      report/src/core/helper/jpc_helper_text.ts
  19. 12 0
      report/src/core/index.ts
  20. 32 30
      report/src/core/jpc_band.ts
  21. 70 59
      report/src/core/jpc_bill_tab.ts
  22. 158 144
      report/src/core/jpc_cross_tab.ts
  23. 21 19
      report/src/core/jpc_data.ts
  24. 13 10
      report/src/core/jpc_event.ts
  25. 204 170
      report/src/core/jpc_ex.ts
  26. 42 40
      report/src/core/jpc_field.ts
  27. 372 329
      report/src/core/jpc_flow_tab.ts
  28. 5 4
      report/src/core/jpc_function.ts
  29. 13 12
      report/src/core/jpc_param.ts
  30. 68 59
      report/src/core/jpc_rte.ts
  31. 72 29
      report/src/core/jpc_value_define.ts
  32. 766 396
      report/src/excel_util/rpt_excel_util.ts
  33. 5 3
      report/src/index.ts
  34. 611 0
      report/src/interface/basic.ts
  35. 104 0
      report/src/interface/classType.ts
  36. 58 0
      report/src/interface/enum.ts
  37. 4 0
      report/src/interface/index.ts
  38. 87 0
      report/src/interface/projectConstsEnum.ts
  39. 30 0
      report/src/public/ReportDate.ts
  40. 5 0
      report/src/public/index.ts
  41. 1 1
      tree/package.json
  42. 6 6
      tree/src/nodeCtx.ts
  43. 19 11
      tree/src/tree.ts
  44. 1 1
      tree/tests/tree.ts
  45. 1 1
      types/package.json
  46. 30 2
      types/src/interface/User.ts
  47. 60 2
      types/src/interface/base.ts
  48. 44 5
      types/src/interface/bill.ts
  49. 67 0
      types/src/interface/billGuide.ts
  50. 1 1
      types/src/interface/calculation.ts
  51. 77 0
      types/src/interface/configMaterial.ts
  52. 0 1
      types/src/interface/feeRate.ts
  53. 31 10
      types/src/interface/glj.ts
  54. 5 0
      types/src/interface/index.ts
  55. 32 10
      types/src/interface/project.ts
  56. 7 0
      types/src/interface/quantityDetail.ts
  57. 18 10
      types/src/interface/ration.ts
  58. 16 0
      types/src/interface/report.ts
  59. 29 8
      types/src/interface/share.ts
  60. 5 0
      types/src/interface/socket.ts
  61. 2 2
      util/package.json
  62. 59 1
      util/src/bill.ts
  63. 1 0
      util/src/index.ts

+ 3 - 0
handsontable/handsontable.d.ts

@@ -2332,6 +2332,9 @@ declare namespace Handsontable {
     password: cellTypes.Password;
     password: cellTypes.Password;
     text: cellTypes.Text;
     text: cellTypes.Text;
     time: cellTypes.Time;
     time: cellTypes.Time;
+
+    // 自定义添加
+    registerCellType:(name:string, type:{editor: any; renderer: Handsontable.renderers.Base})=> void
   }
   }
 
 
   interface Editors {
   interface Editors {

+ 1 - 1
handsontable/package.json

@@ -10,7 +10,7 @@
     "url": "https://github.com/handsontable/handsontable/issues"
     "url": "https://github.com/handsontable/handsontable/issues"
   },
   },
   "author": "Handsoncode <hello@handsontable.com>",
   "author": "Handsoncode <hello@handsontable.com>",
-  "version": "6.3.5",
+  "version": "6.3.7",
   "browser": "dist/handsontable.js",
   "browser": "dist/handsontable.js",
   "main": "commonjs/index.js",
   "main": "commonjs/index.js",
   "module": "es/index.js",
   "module": "es/index.js",

+ 1 - 1
handsontable/src/helpers/dom/element.js

@@ -475,7 +475,7 @@ export function isVisible(elem) {
       } else {
       } else {
         return false; // this is a node detached from document in IE8
         return false; // this is a node detached from document in IE8
       }
       }
-    } else if (next.style.display === 'none') {
+    } else if ( window.getComputedStyle(next).getPropertyValue('display') === 'none') {
       return false;
       return false;
     }
     }
     next = next.parentNode;
     next = next.parentNode;

+ 2 - 0
report/.eslintrc.js

@@ -11,6 +11,7 @@ module.exports = {
     sourceType: 'module',
     sourceType: 'module',
   },
   },
   plugins: ['@typescript-eslint', 'prettier'],
   plugins: ['@typescript-eslint', 'prettier'],
+  camelcase: ['error', { properties: 'never' }],//去除驼峰验证
   rules: {
   rules: {
     'prettier/prettier': 'error',
     'prettier/prettier': 'error',
     'import/extensions': [
     'import/extensions': [
@@ -23,6 +24,7 @@ module.exports = {
         json: 'always',
         json: 'always',
       },
       },
     ],
     ],
+
     'import/no-unresolved': 'off',
     'import/no-unresolved': 'off',
     'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
     'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
   },
   },

File diff suppressed because it is too large
+ 6973 - 9
report/dist/index.cjs.js


+ 2 - 1
report/dist/index.d.ts

@@ -1 +1,2 @@
-export default function justTest(): string;
+export { default as core } from './core/jpc_ex';
+export { default as excel_util } from './excel_util/rpt_excel_util';

+ 3 - 1
report/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "@sc/report",
   "name": "@sc/report",
-  "version": "3.0.0",
+  "version": "3.0.1",
   "description": "Smartcost Report Relative Module",
   "description": "Smartcost Report Relative Module",
   "main": "./dist/index.cjs.js",
   "main": "./dist/index.cjs.js",
   "module": "./dist/index.esm.js",
   "module": "./dist/index.esm.js",
@@ -14,12 +14,14 @@
   "author": "Tony Kang",
   "author": "Tony Kang",
   "license": "ISC",
   "license": "ISC",
   "devDependencies": {
   "devDependencies": {
+    "lodash": "^4.17.21",
     "@types/chai": "^4.2.14",
     "@types/chai": "^4.2.14",
     "@types/jszip": "^3.4.1",
     "@types/jszip": "^3.4.1",
     "@types/mocha": "^8.0.4",
     "@types/mocha": "^8.0.4",
     "@types/ms": "^0.7.31",
     "@types/ms": "^0.7.31",
     "@types/node": "^14.14.8",
     "@types/node": "^14.14.8",
     "@types/uuid": "^8.3.0",
     "@types/uuid": "^8.3.0",
+    "@types/lodash": "^4.14.168",
     "@typescript-eslint/eslint-plugin": "^4.4.1",
     "@typescript-eslint/eslint-plugin": "^4.4.1",
     "@typescript-eslint/parser": "^4.4.1",
     "@typescript-eslint/parser": "^4.4.1",
     "chai": "^4.2.0",
     "chai": "^4.2.0",

+ 10 - 0
report/src/core/helper/index.ts

@@ -0,0 +1,10 @@
+export * from './jpc_helper_area';
+export * from './jpc_helper_band';
+export * from './jpc_helper_common';
+export * from './jpc_helper_common_output';
+export * from './jpc_helper_cross_tab';
+export * from './jpc_helper_discrete';
+export * from './jpc_helper_field';
+export * from './jpc_helper_flow_tab';
+export * from './jpc_helper_font_width';
+export * from './jpc_helper_text';

+ 48 - 47
report/src/core/helper/jpc_helper_area.ts

@@ -1,93 +1,94 @@
 'use strict';
 'use strict';
 
 
+import { IArea, IBandDetail } from '../../interface/basic';
 import JV from '../jpc_value_define';
 import JV from '../jpc_value_define';
 
 
 const JpcAreaHelper = {
 const JpcAreaHelper = {
-    outputArea: function(areaNode: any, band: any, unitFactor: number, rowAmount: number, rowIdx: number, colAmount: number, colIdx: number, 
-                        multipleDispCol: number, multipleColIdx: number, syncHeight: boolean, syncWidth: boolean) {
+    outputArea: function (areaNode: IArea, band: IBandDetail, unitFactor: number, rowAmount: number, rowIdx: number, colAmount: number, colIdx: number,
+        multipleDispCol: number, multipleColIdx: number, syncHeight: boolean, syncWidth: boolean) {
         let rst = {
         let rst = {
-            [JV.PROP_LEFT]: 0,
-            [JV.PROP_RIGHT]: 0,
-            [JV.PROP_TOP]: 0,
-            [JV.PROP_BOTTOM]: 0
-        }, 
+            Left: 0,
+            Right: 0,
+            Top: 0,
+            Bottom: 0
+        },
             maxMultiColumns = 3;
             maxMultiColumns = 3;
         if (multipleDispCol > 0 && multipleDispCol <= maxMultiColumns) {
         if (multipleDispCol > 0 && multipleDispCol <= maxMultiColumns) {
             //1. calculate left/right
             //1. calculate left/right
-            let areaWidth = 1.0 * (band[JV.PROP_RIGHT] - band[JV.PROP_LEFT]) / multipleDispCol;
+            let areaWidth = 1.0 * (band.Right - band.Left) / multipleDispCol;
             areaWidth = areaWidth / colAmount;
             areaWidth = areaWidth / colAmount;
             let innerLeft = 0.0, innerRight = areaWidth;
             let innerLeft = 0.0, innerRight = areaWidth;
             //
             //
-            if (typeof areaNode[JV.PROP_H_CALCULATION]  === "string") {
-                switch (areaNode[JV.PROP_H_CALCULATION]) {
-                    case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE] :
-                        innerLeft = (1.0 * areaNode[JV.PROP_LEFT] * areaWidth / JV.HUNDRED_PERCENT);
-                        innerRight = (1.0 * areaNode[JV.PROP_RIGHT] * areaWidth / JV.HUNDRED_PERCENT);
+            if (typeof areaNode.H_CalculationType === "string") {
+                switch (areaNode.H_CalculationType) {
+                    case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]:
+                        innerLeft = (1.0 * areaNode.Left * areaWidth / JV.HUNDRED_PERCENT);
+                        innerRight = (1.0 * areaNode.Right * areaWidth / JV.HUNDRED_PERCENT);
                         break;
                         break;
-                    case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT] :
-                        innerLeft = 1.0 * areaNode[JV.PROP_LEFT] * unitFactor;
-                        innerRight = 1.0 * areaNode[JV.PROP_RIGHT] * unitFactor;
+                    case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT]:
+                        innerLeft = 1.0 * areaNode.Left * unitFactor;
+                        innerRight = 1.0 * areaNode.Right * unitFactor;
                         break;
                         break;
                 }
                 }
             } else {
             } else {
                 //颗粒度更加细化的控制,可能左右两边的计算坐标方式都不同
                 //颗粒度更加细化的控制,可能左右两边的计算坐标方式都不同
-                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_LEFT] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
-                    innerLeft = (1.0 * areaNode[JV.PROP_LEFT] * areaWidth / JV.HUNDRED_PERCENT);
+                if (areaNode.H_CalculationType && areaNode.H_CalculationType.Left === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
+                    innerLeft = (1.0 * areaNode.Left * areaWidth / JV.HUNDRED_PERCENT);
                 } else {
                 } else {
-                    innerLeft = 1.0 * areaNode[JV.PROP_LEFT] * unitFactor;
+                    innerLeft = 1.0 * areaNode.Left * unitFactor;
                 }
                 }
-                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_RIGHT] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
-                    innerRight = (1.0 * areaNode[JV.PROP_RIGHT] * areaWidth / JV.HUNDRED_PERCENT);
+                if (areaNode.H_CalculationType && areaNode.H_CalculationType.Right === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
+                    innerRight = (1.0 * areaNode.Right * areaWidth / JV.HUNDRED_PERCENT);
                 } else {
                 } else {
-                    innerRight = 1.0 * areaNode[JV.PROP_RIGHT] * unitFactor;
+                    innerRight = 1.0 * areaNode.Right * unitFactor;
                 }
                 }
             }
             }
             //2. calculate top/bottom
             //2. calculate top/bottom
-            let  areaHeight = 1.0 * (band[JV.PROP_BOTTOM] - band[JV.PROP_TOP]);
+            let areaHeight = 1.0 * (band.Bottom - band.Top);
             areaHeight = areaHeight / rowAmount;
             areaHeight = areaHeight / rowAmount;
             let innerTop = 0.0, innerBottom = areaHeight;
             let innerTop = 0.0, innerBottom = areaHeight;
-            if (typeof areaNode[JV.PROP_V_CALCULATION]  === "string") {
-                switch (areaNode[JV.PROP_V_CALCULATION]) {
-                    case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE] :
-                        innerTop = (1.0 * areaNode[JV.PROP_TOP] * areaHeight / JV.HUNDRED_PERCENT);
-                        innerBottom = (1.0 * areaNode[JV.PROP_BOTTOM] * areaHeight / JV.HUNDRED_PERCENT);
+            if (typeof areaNode.V_CalculationType === "string") {
+                switch (areaNode.V_CalculationType) {
+                    case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]:
+                        innerTop = (1.0 * areaNode.Top * areaHeight / JV.HUNDRED_PERCENT);
+                        innerBottom = (1.0 * areaNode.Bottom * areaHeight / JV.HUNDRED_PERCENT);
                         break;
                         break;
-                    case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT] :
-                        innerTop = 1.0 * areaNode[JV.PROP_TOP] * unitFactor;
-                        innerBottom = 1.0 * areaNode[JV.PROP_BOTTOM] * unitFactor;
+                    case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT]:
+                        innerTop = 1.0 * areaNode.Top * unitFactor;
+                        innerBottom = 1.0 * areaNode.Bottom * unitFactor;
                         break;
                         break;
                 }
                 }
             } else {
             } else {
                 //颗粒度更加细化的控制,可能上下两边的计算坐标方式都不同
                 //颗粒度更加细化的控制,可能上下两边的计算坐标方式都不同
-                if (areaNode[JV.PROP_V_CALCULATION][JV.PROP_TOP] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
-                    innerTop = (1.0 * areaNode[JV.PROP_TOP] * areaHeight / JV.HUNDRED_PERCENT);
+                if (areaNode.V_CalculationType && areaNode.V_CalculationType.Top === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
+                    innerTop = (1.0 * areaNode.Top * areaHeight / JV.HUNDRED_PERCENT);
                 } else {
                 } else {
-                    innerTop = 1.0 * areaNode[JV.PROP_TOP] * unitFactor;
+                    innerTop = 1.0 * areaNode.Top * unitFactor;
                 }
                 }
-                if (areaNode[JV.PROP_V_CALCULATION][JV.PROP_BOTTOM] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
-                    innerBottom = (1.0 * areaNode[JV.PROP_BOTTOM] * areaHeight / JV.HUNDRED_PERCENT);
+                if (areaNode.V_CalculationType && areaNode.V_CalculationType.Bottom === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
+                    innerBottom = (1.0 * areaNode.Bottom * areaHeight / JV.HUNDRED_PERCENT);
                 } else {
                 } else {
-                    innerBottom = 1.0 * areaNode[JV.PROP_BOTTOM] * unitFactor;
+                    innerBottom = 1.0 * areaNode.Bottom * unitFactor;
                 }
                 }
             }
             }
             //
             //
             let rstLeft = 0.0, rstRight = 0.0, rstTop = 0.0, rstBottom = 0.0;
             let rstLeft = 0.0, rstRight = 0.0, rstTop = 0.0, rstBottom = 0.0;
             if (syncHeight) {
             if (syncHeight) {
-                rstBottom = Math.round(1.0 * band[JV.PROP_TOP] + areaHeight * (rowIdx + 1) + innerTop);
+                rstBottom = Math.round(1.0 * band.Top + areaHeight * (rowIdx + 1) + innerTop);
             } else {
             } else {
-                rstBottom = Math.round(1.0 * band[JV.PROP_TOP] + areaHeight * rowIdx + innerBottom);
+                rstBottom = Math.round(1.0 * band.Top + areaHeight * rowIdx + innerBottom);
             }
             }
             if (syncWidth) {
             if (syncWidth) {
-                rstRight = Math.round(1.0 * band[JV.PROP_LEFT] + areaWidth * (colIdx + 1) + innerLeft + multipleColIdx * areaWidth);
+                rstRight = Math.round(1.0 * band.Left + areaWidth * (colIdx + 1) + innerLeft + multipleColIdx * areaWidth);
             } else {
             } else {
-                rstRight = Math.round(1.0 * band[JV.PROP_LEFT] + areaWidth * colIdx + innerRight + multipleColIdx * areaWidth);
+                rstRight = Math.round(1.0 * band.Left + areaWidth * colIdx + innerRight + multipleColIdx * areaWidth);
             }
             }
-            rstLeft = Math.round(1.0 * band[JV.PROP_LEFT] + areaWidth * colIdx + innerLeft + multipleColIdx * areaWidth);
-            rstTop = Math.round(1.0 * band[JV.PROP_TOP] + areaHeight * rowIdx + innerTop);
-            rst[JV.PROP_LEFT] = rstLeft;
-            rst[JV.PROP_RIGHT] = rstRight;
-            rst[JV.PROP_TOP] = rstTop;
-            rst[JV.PROP_BOTTOM] = rstBottom;
+            rstLeft = Math.round(1.0 * band.Left + areaWidth * colIdx + innerLeft + multipleColIdx * areaWidth);
+            rstTop = Math.round(1.0 * band.Top + areaHeight * rowIdx + innerTop);
+            rst.Left = rstLeft;
+            rst.Right = rstRight;
+            rst.Top = rstTop;
+            rst.Bottom = rstBottom;
         }
         }
         return rst;
         return rst;
     }
     }

+ 44 - 41
report/src/core/helper/jpc_helper_band.ts

@@ -1,93 +1,96 @@
 'use strict';
 'use strict';
 
 
+import { IBandDetail, IBands, IOrgBandDetail, IRptTpl } from '../../interface/basic';
 import JV from '../jpc_value_define';
 import JV from '../jpc_value_define';
 import JpcCommonHelper from './jpc_helper_common';
 import JpcCommonHelper from './jpc_helper_common';
 
 
 let JpcBandHelper = {
 let JpcBandHelper = {
-    getBandTypeValByString: function(bandType: string) {
+    getBandTypeValByString: function (bandType: string) {
         let rst = JV.PAGE_STATUS.indexOf(bandType);
         let rst = JV.PAGE_STATUS.indexOf(bandType);
         if (rst < 0) rst = JV.STATUS_NORMAL;
         if (rst < 0) rst = JV.STATUS_NORMAL;
         return rst;
         return rst;
     },
     },
-    setBandArea: function(bands: any, rptTpl: any, pageStatus: boolean[], isOnlyNormalStatus: boolean, isOnlyExStatus: boolean) {
+    //
+    setBandArea: function (bands: IBands, rptTpl: IRptTpl, pageStatus: boolean[], isOnlyNormalStatus: boolean, isOnlyExStatus: boolean) {
         let me = this;
         let me = this;
-        if (rptTpl[JV.NODE_BAND_COLLECTION]) {
-            isOnlyNormalStatus = isOnlyNormalStatus||false;
-            isOnlyExStatus = isOnlyExStatus||false;
-
+        if (rptTpl.布局框_集合) {
+            isOnlyNormalStatus = isOnlyNormalStatus || false;
+            isOnlyExStatus = isOnlyExStatus || false;
+            // 把模板中的单位转化为px数值
             let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
             let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
+            // 用上面求出的单位重新计算位置
             let orgArea = JpcCommonHelper.getReportArea(rptTpl, unitFactor);
             let orgArea = JpcCommonHelper.getReportArea(rptTpl, unitFactor);
-            for (let i = 0; i < rptTpl[JV.NODE_BAND_COLLECTION].length; i++) {
-                me.setBandPos(bands, rptTpl[JV.NODE_BAND_COLLECTION][i], orgArea, unitFactor, pageStatus, isOnlyNormalStatus, isOnlyExStatus);
+            for (let i = 0; i < rptTpl.布局框_集合.length; i++) {
+                me.setBandPos(bands, rptTpl.布局框_集合[i], orgArea, unitFactor, pageStatus, isOnlyNormalStatus, isOnlyExStatus);
             }
             }
         }
         }
     },
     },
-    setBandPos: function(bands: any, bandNode: any, orgArea: any, unitFactor: number, pageStatus: boolean[], isOnlyNormalStatus: boolean, isOnlyExStatus: boolean) {
-        let me = this, band = bands[bandNode[JV.BAND_PROP_NAME]];
+    setBandPos: function (bands: IBands, bandNode: IOrgBandDetail, orgArea: number[], unitFactor: number, pageStatus: boolean[], isOnlyNormalStatus: boolean, isOnlyExStatus: boolean) {
+        let me = this, band = bands[bandNode.Name];
         //0. for multi flow purpose
         //0. for multi flow purpose
-        if (isOnlyNormalStatus) {
-            if (bandNode.hasOwnProperty(JV.PROP_BAND_EX_ONLY) && JpcCommonHelper.getBoolean(bandNode[JV.PROP_BAND_EX_ONLY])) {
+        if (isOnlyNormalStatus) {    //??
+            if (bandNode.exOnly && JpcCommonHelper.getBoolean(bandNode.exOnly)) {
                 return;
                 return;
             }
             }
         }
         }
-        if (isOnlyExStatus) {
-            if (bandNode.hasOwnProperty(JV.PROP_BAND_NORMAL_ONLY) && !(JpcCommonHelper.getBoolean(bandNode[JV.PROP_BAND_NORMAL_ONLY]))) {
+        if (isOnlyExStatus) {    //??
+            if (bandNode.normalOnly && !(JpcCommonHelper.getBoolean(bandNode.normalOnly))) {
                 return;
                 return;
             }
             }
         }
         }
         //1. initialize
         //1. initialize
-        band[JV.PROP_LEFT] = orgArea[JV.IDX_LEFT];
-        band[JV.PROP_TOP] = orgArea[JV.IDX_TOP];
-        band[JV.PROP_RIGHT] = orgArea[JV.IDX_RIGHT];
-        band[JV.PROP_BOTTOM] = orgArea[JV.IDX_BOTTOM];
+        band.Left = orgArea[0];
+        band.Top = orgArea[1];
+        band.Right = orgArea[2];
+        band.Bottom = orgArea[3];
         //2. set this band
         //2. set this band
-        if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
-            switch (band[JV.BAND_PROP_ALIGNMENT]) {
+        if (pageStatus[(band.DisplayType) as number]) {
+            switch (band.Alignment) {
                 case JV.LAYOUT_TOP:
                 case JV.LAYOUT_TOP:
-                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
-                        band.Bottom = band.Top + unitFactor * band[JV.BAND_PROP_HEIGHT];
+                    if (band.CalculationType === JV.CAL_TYPE_ABSTRACT) {
+                        band.Bottom = band.Top + unitFactor * band.Height;
                     } else {
                     } else {
-                        band.Bottom = band.Top + (band.Bottom - band.Top) * band[JV.BAND_PROP_HEIGHT] / 100;
+                        band.Bottom = band.Top + (band.Bottom - band.Top) * band.Height / 100;
                     }
                     }
                     orgArea[JV.IDX_TOP] = band.Bottom;
                     orgArea[JV.IDX_TOP] = band.Bottom;
                     break;
                     break;
                 case JV.LAYOUT_BOTTOM:
                 case JV.LAYOUT_BOTTOM:
-                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
-                        band.Top = band.Bottom - unitFactor * band[JV.BAND_PROP_HEIGHT];
+                    if (band.CalculationType === JV.CAL_TYPE_ABSTRACT) {
+                        band.Top = band.Bottom - unitFactor * band.Height;
                     } else {
                     } else {
-                        band.Top = band.Bottom - (band.Bottom - band.Top) * band[JV.BAND_PROP_HEIGHT] / 100;
+                        band.Top = band.Bottom - (band.Bottom - band.Top) * band.Height / 100;
                     }
                     }
                     orgArea[JV.IDX_BOTTOM] = band.Top;
                     orgArea[JV.IDX_BOTTOM] = band.Top;
                     break;
                     break;
                 case JV.LAYOUT_LEFT:
                 case JV.LAYOUT_LEFT:
-                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
-                        band.Right = band.Left + unitFactor * band[JV.BAND_PROP_WIDTH];
+                    if (band.CalculationType === JV.CAL_TYPE_ABSTRACT) {
+                        band.Right = band.Left + unitFactor * band.Width;
                     } else {
                     } else {
-                        band.Right = band.Left + (band.Right - band.Left) * band[JV.BAND_PROP_WIDTH] / 100;
+                        band.Right = band.Left + (band.Right - band.Left) * band.Width / 100;
                     }
                     }
                     orgArea[JV.IDX_LEFT] = band.Right;
                     orgArea[JV.IDX_LEFT] = band.Right;
                     break;
                     break;
                 case JV.LAYOUT_RIGHT:
                 case JV.LAYOUT_RIGHT:
-                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
-                        band.Left = band.Right - unitFactor * band[JV.BAND_PROP_WIDTH];
+                    if (band.CalculationType === JV.CAL_TYPE_ABSTRACT) {
+                        band.Left = band.Right - unitFactor * band.Width;
                     } else {
                     } else {
-                        band.Left = band.Right - (band.Right - band.Left) * band[JV.BAND_PROP_WIDTH] / 100;
+                        band.Left = band.Right - (band.Right - band.Left) * band.Width / 100;
                     }
                     }
                     orgArea[JV.IDX_RIGHT] = band.Left;
                     orgArea[JV.IDX_RIGHT] = band.Left;
                     break;
                     break;
             }
             }
             //3. set sub-bands
             //3. set sub-bands
-            if (bandNode[JV.BAND_PROP_SUB_BANDS]) {
+            if (bandNode.band_s) {
                 let bandArea = [band.Left, band.Top, band.Right, band.Bottom];
                 let bandArea = [band.Left, band.Top, band.Right, band.Bottom];
-                for (let i = 0; i < bandNode[JV.BAND_PROP_SUB_BANDS].length; i++) {
-                    me.setBandPos(bands, bandNode[JV.BAND_PROP_SUB_BANDS][i], bandArea, unitFactor, pageStatus, isOnlyNormalStatus, isOnlyExStatus);
+                for (let i = 0; i < bandNode.band_s.length; i++) {
+                    me.setBandPos(bands, bandNode.band_s[i], bandArea, unitFactor, pageStatus, isOnlyNormalStatus, isOnlyExStatus);
                 }
                 }
             }
             }
         }
         }
     },
     },
-    resetBandPos: function (bandCollection: any[], bands: any, contentBand: any, offsetX: number, offsetY: number) {
+    resetBandPos: function (bandCollection: IOrgBandDetail[], bands: IBands, contentBand: IBandDetail, offsetX: number, offsetY: number) {
         let orgX = contentBand.Right, orgY = contentBand.Bottom;
         let orgX = contentBand.Right, orgY = contentBand.Bottom;
-        function _chkAndResetPos(targetBand: any) {
+        function _chkAndResetPos(targetBand: IOrgBandDetail) {
             let band = bands[targetBand.Name];
             let band = bands[targetBand.Name];
             if (band) {
             if (band) {
                 if (band === contentBand) {
                 if (band === contentBand) {
@@ -103,13 +106,13 @@ let JpcBandHelper = {
                     if (band.Left >= orgX) {
                     if (band.Left >= orgX) {
                         band.Left += offsetX;
                         band.Left += offsetX;
                         band.Right += offsetX;
                         band.Right += offsetX;
-                    } else if (band.Right >= orgX && band.Le < orgX) {
+                    } else if (band.Le && band.Right >= orgX && band.Le < orgX) {
                         band.Right += offsetX;
                         band.Right += offsetX;
                     }
                     }
                 }
                 }
-                if (targetBand[JV.BAND_PROP_SUB_BANDS]) {
-                    for (let i = 0; i < targetBand[JV.BAND_PROP_SUB_BANDS].length; i++) {
-                        _chkAndResetPos(targetBand[JV.BAND_PROP_SUB_BANDS][i]);
+                if (targetBand.band_s) {
+                    for (let i = 0; i < targetBand.band_s.length; i++) {
+                        _chkAndResetPos(targetBand.band_s[i]);
                     }
                     }
                 }
                 }
             }
             }

+ 39 - 33
report/src/core/helper/jpc_helper_common.ts

@@ -1,18 +1,19 @@
 'use strict';
 'use strict';
 
 
+import { IArea, IControlCollection, IControlSubCollection, IRptTpl, IStyles } from '../../interface/basic';
 import JV from '../jpc_value_define';
 import JV from '../jpc_value_define';
 
 
 const RESOLUTION = [96, 96];
 const RESOLUTION = [96, 96];
 
 
 const JpcCommonHelper = {
 const JpcCommonHelper = {
-    getResultByID(KeyID: string, collectionList: any[]) {
+    getResultByID(KeyID: string, collectionList: IStyles[][] | IControlSubCollection[][]) {
         let rst = null;
         let rst = null;
         if (KeyID) {
         if (KeyID) {
             for (let i = 0; i < collectionList.length; i++) {
             for (let i = 0; i < collectionList.length; i++) {
                 let collection = collectionList[i];
                 let collection = collectionList[i];
                 if (collection && collection instanceof Array) {
                 if (collection && collection instanceof Array) {
                     for (let j = 0; j < collection.length; j++) {
                     for (let j = 0; j < collection.length; j++) {
-                        if (collection[j][JV.PROP_ID] === KeyID) {
+                        if (collection[j].ID === KeyID) {
                             rst = collection[j];
                             rst = collection[j];
                             break;
                             break;
                         }
                         }
@@ -23,43 +24,48 @@ const JpcCommonHelper = {
         }
         }
         return rst;
         return rst;
     },
     },
-    getFont(fontName: string, dftFonts: any[], rptTpl: any) {
+    //by lish ,多余参数,
+    // getFont(fontName: string, dftFonts: any[], rptTpl: IRptTpl) {
+    getFont(fontName: string, dftFonts: any[]) {    //暂定
         let me = this, list = [];
         let me = this, list = [];
-        if (rptTpl) list.push(rptTpl[JV.NODE_FONT_COLLECTION]);
+        // if (rptTpl) list.push(rptTpl.control_collection); //by lish ,多余参数,
         list.push(dftFonts);
         list.push(dftFonts);
         return me.getResultByID(fontName, list);
         return me.getResultByID(fontName, list);
     },
     },
-    getStyle(styleName: string, dftStyles: any[], rptTpl: any) {
+    //by lish ,多余参数,
+    // getStyle(styleName: string, dftStyles: IStyles[], rptTpl?: IRptTpl) {
+    getStyle(styleName: string, dftStyles: IStyles[]) {
         let me = this, list = [];
         let me = this, list = [];
-        if (rptTpl) list.push(rptTpl[JV.NODE_STYLE_COLLECTION]);
+        // if (rptTpl) list.push(rptTpl.control_collection);   //by lish ,多余参数,
         list.push(dftStyles);
         list.push(dftStyles);
         return me.getResultByID(styleName, list);
         return me.getResultByID(styleName, list);
     },
     },
-    getControl(controlName: string, dftControls: any[], rptTpl: any) {
-        let me = this, list = [];
-        if (rptTpl) list.push(rptTpl[JV.NODE_CONTROL_COLLECTION]);
+    getControl(controlName: string, dftControls: IControlSubCollection[], rptTpl?: IRptTpl) {
+        let me = this, list: IControlSubCollection[][] = [];
+        if (rptTpl) debugger;
+        //  list.push(rptTpl.control_collection);
         list.push(dftControls);
         list.push(dftControls);
         return me.getResultByID(controlName, list);
         return me.getResultByID(controlName, list);
     },
     },
     getLayoutAlignment(alignStr: string) {
     getLayoutAlignment(alignStr: string) {
         let rst = JV.LAYOUT.indexOf(alignStr);
         let rst = JV.LAYOUT.indexOf(alignStr);
-        if (rst < 0) rst = JV.LAYOUT_FULFILL;
+        if (rst < 0) rst = 4; //JV.LAYOUT_FULFILL;
         return rst;
         return rst;
     },
     },
     getPosCalculationType(typeStr: string) {
     getPosCalculationType(typeStr: string) {
         let rst = JV.CAL_TYPE.indexOf(typeStr);
         let rst = JV.CAL_TYPE.indexOf(typeStr);
-        if (rst < 0) rst = JV.CAL_TYPE_ABSTRACT;
+        if (rst < 0) rst = 1;// JV.CAL_TYPE_ABSTRACT;
         return rst;
         return rst;
     },
     },
-    getBoolean(bStr: any) {
+    getBoolean(bStr: any) {  //暂定
         let rst = false;
         let rst = false;
         if (bStr !== null && bStr !== undefined) {
         if (bStr !== null && bStr !== undefined) {
-            let valType = typeof(bStr);
+            let valType = typeof (bStr);
             if (valType === 'boolean') {
             if (valType === 'boolean') {
                 rst = bStr;
                 rst = bStr;
             } else if (valType === 'string') {
             } else if (valType === 'string') {
                 let tS = bStr.toUpperCase();
                 let tS = bStr.toUpperCase();
-                rst = (tS === 'T' || tS === 'TRUE' || tS === 'YES' || tS === 'Y');
+                rst = (tS === 'T' || tS === 'TRUE' || tS === 'YES' || tS === 'Y') as boolean;;
             } else if (valType === 'number') {
             } else if (valType === 'number') {
                 rst = (bStr === 1);
                 rst = (bStr === 1);
             }
             }
@@ -69,9 +75,9 @@ const JpcCommonHelper = {
     getScreenDPI() {
     getScreenDPI() {
         return RESOLUTION.slice(0);
         return RESOLUTION.slice(0);
     },
     },
-    getUnitFactor(rptTpl: any) {
+    getUnitFactor(rptTpl: IRptTpl) {
         let me = this;
         let me = this;
-        return me.translateUnit(rptTpl[JV.NODE_MAIN_INFO][JV.PROP_UNITS]);
+        return me.translateUnit(rptTpl.主信息.单位);
     },
     },
     translateUnit(unitStr: string) {
     translateUnit(unitStr: string) {
         let me = this, rst = 1.0;
         let me = this, rst = 1.0;
@@ -87,17 +93,17 @@ const JpcCommonHelper = {
         }
         }
         return rst;
         return rst;
     },
     },
-    getPageSize(rptTpl: any) {
+    getPageSize(rptTpl: IRptTpl) {
         let size = JV.SIZE_A4.slice(0);
         let size = JV.SIZE_A4.slice(0);
-        let sizeStr = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE];
+        let sizeStr = rptTpl.主信息.打印页面_信息.页规格;
         let sizeIdx = JV.PAGES_SIZE_STR.indexOf(sizeStr);
         let sizeIdx = JV.PAGES_SIZE_STR.indexOf(sizeStr);
         if (sizeIdx >= 0) {
         if (sizeIdx >= 0) {
             size = JV.PAGES_SIZE[sizeIdx].slice(0);
             size = JV.PAGES_SIZE[sizeIdx].slice(0);
-        } else if (sizeStr === JV.PAGE_SELF_DEFINE) {
+        } else if (sizeStr === '自定义') {
             //自定义规格,如实际业务需要则后期补充
             //自定义规格,如实际业务需要则后期补充
         }
         }
-        let page_orientation = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION];
-        if (page_orientation === JV.ORIENTATION_LANDSCAPE || page_orientation === JV.ORIENTATION_LANDSCAPE_CHN) {
+        let page_orientation = rptTpl.主信息.打印页面_信息.方向;
+        if (page_orientation === 'LANDSCAPE' || page_orientation === '横向') {
             //swap x,y
             //swap x,y
             let tmp = size[0];
             let tmp = size[0];
             size[0] = size[1];
             size[0] = size[1];
@@ -105,17 +111,17 @@ const JpcCommonHelper = {
         }
         }
         return size;
         return size;
     },
     },
-    getReportArea(rptTpl: any, unitFactor: number) {
+    getReportArea(rptTpl: IRptTpl, unitFactor: number) {
         let me = this, sdpi = me.getScreenDPI(), rst = [], size = me.getPageSize(rptTpl);
         let me = this, sdpi = me.getScreenDPI(), rst = [], size = me.getPageSize(rptTpl);
         size[0] = sdpi[0] * size[0];
         size[0] = sdpi[0] * size[0];
         size[1] = sdpi[0] * size[1];
         size[1] = sdpi[0] * size[1];
-        rst.push(unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]);
-        rst.push(unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP]);
-        rst.push(size[0] - unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT]);
-        rst.push(size[1] - unitFactor * rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM]);
+        rst.push(unitFactor * rptTpl.主信息.页边距.Left);
+        rst.push(unitFactor * rptTpl.主信息.页边距.Top);
+        rst.push(size[0] - unitFactor * rptTpl.主信息.页边距.Right);
+        rst.push(size[1] - unitFactor * rptTpl.主信息.页边距.Bottom);
         return rst;
         return rst;
     },
     },
-    getSegIdxByPageIdx(page: number, page_seg_map: any[]) {
+    getSegIdxByPageIdx(page: number, page_seg_map: number[][]) {
         let rst = -1;
         let rst = -1;
         for (let pIdx = 0; pIdx < page_seg_map.length; pIdx++) {
         for (let pIdx = 0; pIdx < page_seg_map.length; pIdx++) {
             if (page_seg_map[pIdx][0] === page) {
             if (page_seg_map[pIdx][0] === page) {
@@ -125,16 +131,16 @@ const JpcCommonHelper = {
         }
         }
         return rst;
         return rst;
     },
     },
-    getStringLinesInArea(area: any, strVal: string, chnW: number, otherW: number) {
+    getStringLinesInArea(area: IArea, strVal: string, chnW: number, otherW: number) {
         //备注: 因后台的pdf kit判断字符串长度与前端的不一样,需要做些调整,不一次性地判断字符串长度。
         //备注: 因后台的pdf kit判断字符串长度与前端的不一样,需要做些调整,不一次性地判断字符串长度。
         //      分2种字符:中文与非中文,按照各种字符的数量分别乘以相关一个字符的宽度再累计。
         //      分2种字符:中文与非中文,按照各种字符的数量分别乘以相关一个字符的宽度再累计。
         //      另判断行数还不能直接用总长度除以宽度来计算,因每一行都会有不同的余量,所以得一行行走过来判断。
         //      另判断行数还不能直接用总长度除以宽度来计算,因每一行都会有不同的余量,所以得一行行走过来判断。
         let rst = 0;
         let rst = 0;
         if (strVal) {
         if (strVal) {
-            let areaWidth = area[JV.PROP_RIGHT] - area[JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] - 1;
+            let areaWidth = area.Right - area.Left - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] - 1;
             let txtWidth = 0, currentW = 0;
             let txtWidth = 0, currentW = 0;
             for (let sIdx = 0; sIdx < strVal.length; sIdx++) {
             for (let sIdx = 0; sIdx < strVal.length; sIdx++) {
-                currentW = (strVal.charCodeAt(sIdx) > 127)?chnW:otherW;
+                currentW = (strVal.charCodeAt(sIdx) > 127) ? chnW : otherW;
                 txtWidth += currentW;
                 txtWidth += currentW;
                 if (txtWidth > areaWidth) {
                 if (txtWidth > areaWidth) {
                     rst++;
                     rst++;
@@ -148,14 +154,14 @@ const JpcCommonHelper = {
         if (rst === 0) rst = 1; //即使是空字符串,也得有一行啊
         if (rst === 0) rst = 1; //即使是空字符串,也得有一行啊
         return rst;
         return rst;
     },
     },
-    splitString(area: any, strVal: string, chnW: number, otherW: number) {
+    splitString(area: IArea, strVal: string, chnW: number, otherW: number) {
         let rst = [];
         let rst = [];
         if (strVal) {
         if (strVal) {
-            let areaWidth = area[JV.PROP_RIGHT] - area[JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] - 1;
+            let areaWidth = area.Right - area.Left - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] - 1;
             let preSIdx = 0, txtWidth = 0;
             let preSIdx = 0, txtWidth = 0;
             let currentW = 0;
             let currentW = 0;
             for (let sIdx = 0; sIdx < strVal.length; sIdx++) {
             for (let sIdx = 0; sIdx < strVal.length; sIdx++) {
-                currentW = (strVal.charCodeAt(sIdx) > 127)?chnW:otherW;
+                currentW = (strVal.charCodeAt(sIdx) > 127) ? chnW : otherW;
                 txtWidth += currentW;
                 txtWidth += currentW;
                 if (txtWidth > areaWidth) {
                 if (txtWidth > areaWidth) {
                     if (preSIdx < sIdx) {
                     if (preSIdx < sIdx) {

+ 41 - 40
report/src/core/helper/jpc_helper_common_output.ts

@@ -1,58 +1,59 @@
 'use strict';
 'use strict';
 
 
+import { Fields, ICell, IControlCollection, INode } from '../../interface/basic';
 import JV from '../jpc_value_define';
 import JV from '../jpc_value_define';
 import JpcFieldHelper from './jpc_helper_field';
 import JpcFieldHelper from './jpc_helper_field';
 const OFFSET_FLOAT = 0.0000000001;
 const OFFSET_FLOAT = 0.0000000001;
 
 
 let JpcCommonOutputHelper = {
 let JpcCommonOutputHelper = {
-    createCommonOutputWithoutDecorate: function (node: any, value: any, forceCombine: boolean) {
-        let me = this, 
-        //1. font/style/control
-        rst = {
-            [JV.PROP_FONT]: node[JV.PROP_FONT],
-            [JV.PROP_CONTROL]: node[JV.PROP_CONTROL],
-            [JV.PROP_STYLE]: node[JV.PROP_STYLE],
-            [JV.PROP_VALUE]: value
-        };
+    createCommonOutputWithoutDecorate: function (node: Fields, value: number | string, forceCombine: boolean) {
+        let me = this,
+            //1. font/style/control
+            rst = {
+                font: node.font,
+                control: node.control as string,
+                style: node.style,
+                Value: value
+            } as INode;
         //2. value
         //2. value
-        me.formatCell(node[JV.PROP_FORMAT], rst);
-        // innerFormat(node[JV.PROP_FORMAT], rst);
-        if (node[JV.PROP_PREFIX] && rst[JV.PROP_VALUE] !== null) {
-            rst[JV.PROP_VALUE] = node[JV.PROP_PREFIX] + rst[JV.PROP_VALUE];
-        } else if (node[JV.PROP_PREFIX] && forceCombine) {
-            rst[JV.PROP_VALUE] = node[JV.PROP_PREFIX];
+        me.formatCell(node.Format, rst);
+        // innerFormat(node.Format, rst);
+        if (node.Prefix && rst.Value !== null) {
+            rst.Value = node.Prefix + rst.Value;
+        } else if (node.Prefix && forceCombine) {
+            rst.Value = node.Prefix;
         }
         }
-        if (node[JV.PROP_SUFFIX] && rst[JV.PROP_VALUE] !== null) {
-            rst[JV.PROP_VALUE] = rst[JV.PROP_VALUE] + node[JV.PROP_SUFFIX];
-        } else if (node[JV.PROP_SUFFIX] && forceCombine) {
-            rst[JV.PROP_VALUE] = node[JV.PROP_SUFFIX];
+        if (node.Suffix && rst.Value !== null) {
+            rst.Value = rst.Value + node.Suffix;
+        } else if (node.Suffix && forceCombine) {
+            rst.Value = node.Suffix;
         }
         }
         return rst;
         return rst;
     },
     },
-    createCommonOutput: function (node: any, value: any, controls: any) {
+    createCommonOutput: function (node: Fields, value: number | string | null, controls: IControlCollection | null) {
         let me = this,
         let me = this,
-        //1. font/style/control
-        rst = {
-            [JV.PROP_FONT]: node[JV.PROP_FONT],
-            [JV.PROP_CONTROL]: node[JV.PROP_CONTROL],
-            [JV.PROP_STYLE]: node[JV.PROP_STYLE],
-            [JV.PROP_VALUE]: value
-        };
+            //1. font/style/control
+            rst: INode = {
+                font: node.font,
+                control: node.control as string,
+                style: node.style,
+                Value: value
+            } as INode;
         //2. value
         //2. value
         JpcFieldHelper.decorateValue(rst, controls);
         JpcFieldHelper.decorateValue(rst, controls);
-        me.formatCell(node[JV.PROP_FORMAT], rst);
-        // innerFormat(node[JV.PROP_FORMAT], rst);
-        if (node[JV.PROP_PREFIX] && rst[JV.PROP_VALUE] !== null && rst[JV.PROP_VALUE] !== '') {
-            rst[JV.PROP_VALUE] = node[JV.PROP_PREFIX] + rst[JV.PROP_VALUE];
+        me.formatCell(node.Format, rst);
+        // innerFormat(node.Format, rst);
+        if (node.Prefix && rst.Value !== null && rst.Value !== '') {
+            rst.Value = node.Prefix + rst.Value;
         }
         }
-        if (node[JV.PROP_SUFFIX] && rst[JV.PROP_VALUE] !== null && rst[JV.PROP_VALUE] !== '') {
-            rst[JV.PROP_VALUE] = rst[JV.PROP_VALUE] + node[JV.PROP_SUFFIX];
+        if (node.Suffix && rst.Value !== null && rst.Value !== '') {
+            rst.Value = rst.Value + node.Suffix;
         }
         }
         return rst;
         return rst;
     },
     },
-    formatCell: function(formatStr: string, rstCell: any) {
+    formatCell: function (formatStr: string, rstCell: INode) {
         if (formatStr) {
         if (formatStr) {
-            const rstCellFloatVal = parseFloat(rstCell[JV.PROP_VALUE]);
+            const rstCellFloatVal = parseFloat(rstCell.Value as string);
             if (!(isNaN(rstCellFloatVal))) {
             if (!(isNaN(rstCellFloatVal))) {
                 const dotIdx = formatStr.indexOf('.');
                 const dotIdx = formatStr.indexOf('.');
                 if (dotIdx >= 0) {
                 if (dotIdx >= 0) {
@@ -70,22 +71,22 @@ let JpcCommonOutputHelper = {
                         }
                         }
                     }
                     }
                     if (tmpStr[tmpStr.length - 1] === '.') tmpStr = tmpStr.substr(0, tmpStr.length - 1);
                     if (tmpStr[tmpStr.length - 1] === '.') tmpStr = tmpStr.substr(0, tmpStr.length - 1);
-                    rstCell[JV.PROP_VALUE] = tmpStr;
+                    rstCell.Value = tmpStr;
                 } else {
                 } else {
-                    rstCell[JV.PROP_VALUE] = (rstCellFloatVal + OFFSET_FLOAT).toFixed(0);
+                    rstCell.Value = (rstCellFloatVal + OFFSET_FLOAT).toFixed(0);
                 }
                 }
                 const commaIdx = formatStr.indexOf(',');
                 const commaIdx = formatStr.indexOf(',');
                 if (commaIdx >= 0) {
                 if (commaIdx >= 0) {
-                    rstCell[JV.PROP_VALUE] = comdify(rstCell[JV.PROP_VALUE].toString());
+                    rstCell.Value = comdify(rstCell.Value.toString());
                 }
                 }
             }
             }
         }
         }
     }
     }
 };
 };
 
 
-function comdify(numStr: string){
+function comdify(numStr: string) {
     let re = /\d{1,3}(?=(\d{3})+$)/g;
     let re = /\d{1,3}(?=(\d{3})+$)/g;
-    return numStr.replace(/^(\d+)((\.\d+)?)$/,function(s,s1,s2){return s1.replace(re,'$&,')+s2;});
+    return numStr.replace(/^(\d+)((\.\d+)?)$/, function (s, s1, s2) { return s1.replace(re, '$&,') + s2; });
 }
 }
 
 
 export default JpcCommonOutputHelper;
 export default JpcCommonOutputHelper;

+ 51 - 49
report/src/core/helper/jpc_helper_cross_tab.ts

@@ -1,9 +1,10 @@
 import JV from '../jpc_value_define';
 import JV from '../jpc_value_define';
 import JE from '../jpc_rte';
 import JE from '../jpc_rte';
 import JpcCommonHelper from './jpc_helper_common';
 import JpcCommonHelper from './jpc_helper_common';
+import { Fields, IBands, ICurrent_RPT, IRptTpl } from '../../interface/basic';
 
 
 let JpcCrossTabHelper = {
 let JpcCrossTabHelper = {
-    getColIDX: function(cl: any[], val: any[]) {
+    getColIDX: function (cl: number[][], val: number) {
         let rst = -1;
         let rst = -1;
         for (let i = 0; i < cl.length; i++) {
         for (let i = 0; i < cl.length; i++) {
             let ca = cl[i];
             let ca = cl[i];
@@ -19,14 +20,14 @@ let JpcCrossTabHelper = {
         }
         }
         return rst;
         return rst;
     },
     },
-    pushToSeg: function(segArr: any[], dataSeq: any[], segIdx: number, sIdx: number, eIdx: number) {
+    pushToSeg: function (segArr: number[][], dataSeq: number[][], segIdx: number, sIdx: number, eIdx: number) {
         let arrIdx = [];
         let arrIdx = [];
         for (let k = sIdx; k < eIdx; k++) {
         for (let k = sIdx; k < eIdx; k++) {
             arrIdx.push(dataSeq[segIdx][k]);
             arrIdx.push(dataSeq[segIdx][k]);
         }
         }
         segArr.push(arrIdx);
         segArr.push(arrIdx);
     },
     },
-    sortFieldValue: function(sIDX: number, eIDX: number, sortOrder: any, dataField: any, dataValSeq: any[]) {
+    sortFieldValue: function (sIDX: number, eIDX: number, sortOrder: string, dataField: number[], dataValSeq: number[]) {
         let tmpSeq = [];
         let tmpSeq = [];
         if ((sortOrder) && (sortOrder !== JV.TAB_FIELD_PROP_SORT_VAL_NOSORT)) {
         if ((sortOrder) && (sortOrder !== JV.TAB_FIELD_PROP_SORT_VAL_NOSORT)) {
             if (sIDX >= 0 && eIDX >= sIDX && dataValSeq.length > eIDX) {
             if (sIDX >= 0 && eIDX >= sIDX && dataValSeq.length > eIDX) {
@@ -37,10 +38,10 @@ let JpcCrossTabHelper = {
                 for (let i = sIDX; i <= eIDX; i++) {
                 for (let i = sIDX; i <= eIDX; i++) {
                     tmpSeq.push(dataValSeq[i]);
                     tmpSeq.push(dataValSeq[i]);
                 }
                 }
-                tmpSeq.sort(function(idx1, idx2) {
+                tmpSeq.sort(function (idx1, idx2) {
                     let rst = 0;
                     let rst = 0;
                     // if (isNaN(parseFloat(dataField[idx1])) || isNaN(parseFloat(dataField[idx1]))) {
                     // if (isNaN(parseFloat(dataField[idx1])) || isNaN(parseFloat(dataField[idx1]))) {
-                    if (typeof (dataField[idx1]) === 'string' || typeof (dataField[idx1]) === 'string' ) {
+                    if (typeof (dataField[idx1]) === 'string' || typeof (dataField[idx1]) === 'string') {
                         if (dataField[idx1] > dataField[idx2]) {
                         if (dataField[idx1] > dataField[idx2]) {
                             rst = reversed;
                             rst = reversed;
                         } else if (dataField[idx1] < dataField[idx2]) {
                         } else if (dataField[idx1] < dataField[idx2]) {
@@ -64,7 +65,7 @@ let JpcCrossTabHelper = {
         }
         }
         return tmpSeq;
         return tmpSeq;
     },
     },
-    checkIfEqual: function(dataFields: any[], seq1: any, seq2: any) {
+    checkIfEqual: function (dataFields: number[][], seq1: number, seq2: number) {
         let rst = true;
         let rst = true;
         for (let i = 0; i < dataFields.length; i++) {
         for (let i = 0; i < dataFields.length; i++) {
             if ((dataFields[i][seq1] !== dataFields[i][seq2])) {
             if ((dataFields[i][seq1] !== dataFields[i][seq2])) {
@@ -74,12 +75,13 @@ let JpcCrossTabHelper = {
         }
         }
         return rst;
         return rst;
     },
     },
-    sortTabFields: function(tabFields: any[], fieldSeqs: any[], data_details: any[], dataSeq: any[], $CURRENT_RPT: any) {
+    //暂定
+    sortTabFields: function (tabFields: Fields[], fieldSeqs: any[], data_details: any[], dataSeq: number[][], $CURRENT_RPT: ICurrent_RPT) {
         let me = this;
         let me = this;
         let sIDX = 0, eIDX = -1, isFirstSort = true;
         let sIDX = 0, eIDX = -1, isFirstSort = true;
         for (let i = 0; i < tabFields.length; i++) {
         for (let i = 0; i < tabFields.length; i++) {
             let tabField = tabFields[i];
             let tabField = tabFields[i];
-            if (tabField[JV.TAB_FIELD_PROP_SORT] !== JV.TAB_FIELD_PROP_SORT_VAL_NOSORT) {
+            if (tabField.Sort !== JV.TAB_FIELD_PROP_SORT_VAL_NOSORT) {
                 if (isFirstSort) {
                 if (isFirstSort) {
                     isFirstSort = false;
                     isFirstSort = false;
                     //first field, should sort all data items
                     //first field, should sort all data items
@@ -87,27 +89,27 @@ let JpcCrossTabHelper = {
                         sIDX = 0;
                         sIDX = 0;
                         eIDX = dataSeq[j].length - 1;
                         eIDX = dataSeq[j].length - 1;
                         //sort the field value here
                         //sort the field value here
-                        if (typeof(fieldSeqs[i]) === "object") {
-                            let exFirstField = JE.F(fieldSeqs[i][JV.PROP_ID], $CURRENT_RPT);
+                        if (typeof (fieldSeqs[i]) === "object") {
+                            let exFirstField = JE.F(fieldSeqs[i].ID, $CURRENT_RPT);
                             if (exFirstField) {
                             if (exFirstField) {
-                                me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT], exFirstField[JV.PROP_AD_HOC_DATA], dataSeq[j]);
+                                me.sortFieldValue(sIDX, eIDX, tabField.Sort, exFirstField.data_field, dataSeq[j]);
                             } else {
                             } else {
                                 //不排序(健壮性)
                                 //不排序(健壮性)
                             }
                             }
                         } else {
                         } else {
-                            me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]);
+                            me.sortFieldValue(sIDX, eIDX, tabField.Sort, data_details[fieldSeqs[i]], dataSeq[j]);
                         }
                         }
-                        // me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]);
+                        // me.sortFieldValue(sIDX, eIDX, tabField.Sort,data_details[fieldSeqs[i]], dataSeq[j]);
                     }
                     }
                 } else {
                 } else {
                     //then sort the rest fields one by one
                     //then sort the rest fields one by one
                     for (let j = 0; j < dataSeq.length; j++) {
                     for (let j = 0; j < dataSeq.length; j++) {
                         let chkFields = [];
                         let chkFields = [];
                         for (let k = 0; k < i; k++) {
                         for (let k = 0; k < i; k++) {
-                            if (typeof(fieldSeqs[k]) === "object") {
-                                let exField = JE.F(fieldSeqs[k][JV.PROP_ID], $CURRENT_RPT);
+                            if (typeof (fieldSeqs[k]) === "object") {
+                                let exField = JE.F(fieldSeqs[k].ID, $CURRENT_RPT);
                                 if (exField) {
                                 if (exField) {
-                                    chkFields.push(exField[JV.PROP_AD_HOC_DATA]);
+                                    chkFields.push(exField.data_field);
                                 } else {
                                 } else {
                                     chkFields.push(null);
                                     chkFields.push(null);
                                 }
                                 }
@@ -125,17 +127,17 @@ let JpcCrossTabHelper = {
                             };
                             };
                             if (eIDX >= sIDX) {
                             if (eIDX >= sIDX) {
                                 if (eIDX != sIDX) {
                                 if (eIDX != sIDX) {
-                                    if (typeof(fieldSeqs[i]) === "object") {
-                                        let exOtherField = JE.F(fieldSeqs[i][JV.PROP_ID], $CURRENT_RPT);
+                                    if (typeof (fieldSeqs[i]) === "object") {
+                                        let exOtherField = JE.F(fieldSeqs[i].ID, $CURRENT_RPT);
                                         if (exOtherField) {
                                         if (exOtherField) {
-                                            me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT], exOtherField[JV.PROP_AD_HOC_DATA], dataSeq[j]);
+                                            me.sortFieldValue(sIDX, eIDX, tabField.Sort, exOtherField.data_field, dataSeq[j]);
                                         } else {
                                         } else {
                                             //不排序(健壮性)
                                             //不排序(健壮性)
                                         }
                                         }
                                     } else {
                                     } else {
-                                        me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]);
+                                        me.sortFieldValue(sIDX, eIDX, tabField.Sort, data_details[fieldSeqs[i]], dataSeq[j]);
                                     }
                                     }
-                                    // me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]);
+                                    // me.sortFieldValue(sIDX, eIDX, tabField.Sort,data_details[fieldSeqs[i]], dataSeq[j]);
                                 }
                                 }
                                 sIDX = m;
                                 sIDX = m;
                                 eIDX = m - 1; //for protection purpose
                                 eIDX = m - 1; //for protection purpose
@@ -146,60 +148,60 @@ let JpcCrossTabHelper = {
             }
             }
         }
         }
     },
     },
-    getMaxRowsPerPage: function(bands: any, rptTpl: any) {
+    getMaxRowsPerPage: function (bands: IBands, rptTpl: IRptTpl) {
         let rst = 1;
         let rst = 1;
-        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]];
+        let band = bands[rptTpl.交叉表_信息.交叉行.BandName];
         if (band) {
         if (band) {
-            rst =  getMaxTabCntPerPage(rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top);
+            rst = getMaxTabCntPerPage(rptTpl, '交叉行', 'CommonHeight', band.Bottom - band.Top);
         }
         }
         return rst;
         return rst;
     },
     },
-    getMaxColsPerPage: function(bands: any, rptTpl: any) {
+    getMaxColsPerPage: function (bands: IBands, rptTpl: IRptTpl) {
         let rst = 1;
         let rst = 1;
-        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]];
+        let band = bands[rptTpl.交叉表_信息.交叉列.BandName];
         if (band) {
         if (band) {
-            rst =  getMaxTabCntPerPage(rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left);
+            rst = getMaxTabCntPerPage(rptTpl, '交叉列', 'CommonWidth', band.Right - band.Left);
         }
         }
         return rst;
         return rst;
     },
     },
-    getActualRowsHeight: function(bands: any, rptTpl: any, segments: any[], page: number) {
+    getActualRowsHeight: function (bands: IBands, rptTpl: IRptTpl, segments: number[][], page: number) {
         let rst = 1;
         let rst = 1;
-        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]];
+        let band = bands[rptTpl.交叉表_信息.交叉行.BandName];
         if (band) {
         if (band) {
-            rst =  getActualContentAreaMeasurement(rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top, segments, page);
+            rst = getActualContentAreaMeasurement(rptTpl, '交叉行', 'CommonHeight', band.Bottom - band.Top, segments, page);
         }
         }
         return rst;
         return rst;
     },
     },
-    getActualColsWidth: function(bands: any, rptTpl: any, segments: any[], page: number) {
+    getActualColsWidth: function (bands: IBands, rptTpl: IRptTpl, segments: number[][], page: number) {
         let rst = 1;
         let rst = 1;
-        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]];
+        let band = bands[rptTpl.交叉表_信息.交叉列.BandName];
         if (band) {
         if (band) {
-            rst =  getActualContentAreaMeasurement(rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left, segments, page);
+            rst = getActualContentAreaMeasurement(rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left, segments, page);
         }
         }
         return rst;
         return rst;
     },
     },
-    chkTabEnd: function(tabType: string, rptTpl: any, bands: any, sortedSequence: any[], segIdx: number, preRec: number, nextRec: number) {
+    chkTabEnd: function (tabType: string, rptTpl: IRptTpl, bands: IBands, sortedSequence: number[][], segIdx: number, preRec: number, nextRec: number) {
         let me = this, rst = true;
         let me = this, rst = true;
         let remainAmt = preRec + nextRec - sortedSequence[segIdx].length;
         let remainAmt = preRec + nextRec - sortedSequence[segIdx].length;
         rst = me.hasEnoughSpace(tabType, rptTpl, bands, remainAmt);
         rst = me.hasEnoughSpace(tabType, rptTpl, bands, remainAmt);
         return rst;
         return rst;
     },
     },
-    hasEnoughSpace: function (tabType: string, rptTpl: any, bands: any, remainAmt: number) {
+    hasEnoughSpace: function (tabType: string, rptTpl: IRptTpl, bands: IBands, remainAmt: number) {
         if (remainAmt < 0) return false;
         if (remainAmt < 0) return false;
         let rst = true, measurement = 1.0, douDiffForCompare = 0.00001;
         let rst = true, measurement = 1.0, douDiffForCompare = 0.00001;
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         let band = null;
         let band = null;
-        if (rptTpl[JV.NODE_CROSS_INFO][tabType]) {
-            band = bands[rptTpl[JV.NODE_CROSS_INFO][tabType][JV.PROP_BAND_NAME]];
+        if (rptTpl.交叉表_信息[tabType]) {
+            band = bands[rptTpl.交叉表_信息[tabType].BandName];
         }
         }
         if (band != null && band != undefined) {
         if (band != null && band != undefined) {
             if (tabType === JV.NODE_CROSS_ROW_SUM || tabType === JV.NODE_CROSS_ROW_EXT) {
             if (tabType === JV.NODE_CROSS_ROW_SUM || tabType === JV.NODE_CROSS_ROW_EXT) {
-                measurement = 1.0 * rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_CMN_HEIGHT] * unitFactor;
+                measurement = 1.0 * rptTpl.交叉表_信息.交叉行.CommonHeight * unitFactor;
                 let spareHeight = measurement * remainAmt;
                 let spareHeight = measurement * remainAmt;
                 let douH = 1.0 * (band.Bottom - band.Top);
                 let douH = 1.0 * (band.Bottom - band.Top);
                 rst = (spareHeight >= douH) || (spareHeight - douH <= douDiffForCompare);
                 rst = (spareHeight >= douH) || (spareHeight - douH <= douDiffForCompare);
             } else if (tabType === JV.NODE_CROSS_COL_SUM) {
             } else if (tabType === JV.NODE_CROSS_COL_SUM) {
-                measurement = 1.0 * rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_CMN_WIDTH] * unitFactor;
+                measurement = 1.0 * rptTpl.交叉表_信息.交叉列.CommonWidth * unitFactor;
                 let spareWidth = measurement * remainAmt;
                 let spareWidth = measurement * remainAmt;
                 let douW = 1.0 * (band.Right - band.Left);
                 let douW = 1.0 * (band.Right - band.Left);
                 rst = (spareWidth >= douW) || (spareWidth - douW <= douDiffForCompare);
                 rst = (spareWidth >= douW) || (spareWidth - douW <= douDiffForCompare);
@@ -219,16 +221,16 @@ let JpcCrossTabHelper = {
     }
     }
 };
 };
 
 
-function getMaxTabCntPerPage(rptTpl: any, tabNodeName: string, tabMeasurePropName: string, measureForCal: number) {
+function getMaxTabCntPerPage(rptTpl: IRptTpl, tabNodeName: string, tabMeasurePropName: string, measureForCal: number) {
     let rst = 1;
     let rst = 1;
-    if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
-        let tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName];
+    if (rptTpl.交叉表_信息[tabNodeName]) {
+        let tab = rptTpl.交叉表_信息[tabNodeName];
         let maxFieldMeasure = 1.0;
         let maxFieldMeasure = 1.0;
         if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
         if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
             let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
             let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-            maxFieldMeasure = 1.0 * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] * unitFactor;
+            maxFieldMeasure = 1.0 * rptTpl.交叉表_信息[tabNodeName][tabMeasurePropName] * unitFactor;
         } else {
         } else {
-            maxFieldMeasure = measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
+            maxFieldMeasure = measureForCal * rptTpl.交叉表_信息[tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
         }
         }
         rst = Math.floor(measureForCal / maxFieldMeasure);
         rst = Math.floor(measureForCal / maxFieldMeasure);
     }
     }
@@ -236,16 +238,16 @@ function getMaxTabCntPerPage(rptTpl: any, tabNodeName: string, tabMeasurePropNam
     return rst;
     return rst;
 };
 };
 
 
-function getActualContentAreaMeasurement(rptTpl: any, tabNodeName: string, tabMeasurePropName: string, measureForCal: number, segments: any[], page: number) {
+function getActualContentAreaMeasurement(rptTpl: IRptTpl, tabNodeName: string, tabMeasurePropName: string, measureForCal: number, segments: number[][], page: number) {
     let rst = 1;
     let rst = 1;
-    if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
-        let tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName];
+    if (rptTpl.交叉表_信息[tabNodeName]) {
+        let tab = rptTpl.交叉表_信息[tabNodeName];
         let maxFieldMeasure = 1.0;
         let maxFieldMeasure = 1.0;
         if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
         if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
             let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
             let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-            maxFieldMeasure = 1.0 * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] * unitFactor;
+            maxFieldMeasure = 1.0 * rptTpl.交叉表_信息[tabNodeName][tabMeasurePropName] * unitFactor;
         } else {
         } else {
-            maxFieldMeasure = measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
+            maxFieldMeasure = measureForCal * rptTpl.交叉表_信息[tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
         }
         }
         if (segments.length >= page) {
         if (segments.length >= page) {
             rst = segments[page - 1].length * maxFieldMeasure;
             rst = segments[page - 1].length * maxFieldMeasure;

+ 47 - 45
report/src/core/helper/jpc_helper_discrete.ts

@@ -4,31 +4,32 @@ import JpcTextHelper from './jpc_helper_text';
 import JpcCommonOutputHelper from './jpc_helper_common_output';
 import JpcCommonOutputHelper from './jpc_helper_common_output';
 import JpcAreaHelper from './jpc_helper_area';
 import JpcAreaHelper from './jpc_helper_area';
 import JpcFieldHelper from './jpc_helper_field';
 import JpcFieldHelper from './jpc_helper_field';
+import { IBandDetail, IBands, ICell, ICurrent_RPT, ICustomizeCfg, IDataObj, IDiscrete } from '../../interface/basic';
 
 
 const JpcDiscreteHelper = {
 const JpcDiscreteHelper = {
-    outputDiscreteInfo: function (discreteArray: any[], bands: any, dataObj: any, unitFactor: number, pageStatus: boolean[], segIdx: number, multiCols: number, multiColIdx: number, $CURRENT_RPT: any, customizeCfg: any) {
+    outputDiscreteInfo: function (discreteArray: IDiscrete[], bands: IBands, dataObj: IDataObj | null, unitFactor: number, pageStatus: boolean[], segIdx: number, multiCols: number, multiColIdx: number, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg | null) {
         let rst = [];
         let rst = [];
         if (discreteArray && dataObj) {
         if (discreteArray && dataObj) {
             for (let i = 0; i < discreteArray.length; i++) {
             for (let i = 0; i < discreteArray.length; i++) {
-                let band = bands[discreteArray[i][JV.PROP_BAND_NAME]];
-                if (band && pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                    if (discreteArray[i][JV.PROP_TEXT]) {
-                        rst.push(JpcTextHelper.outputText(discreteArray[i][JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, multiCols, multiColIdx));
+                let band = bands[discreteArray[i].BandName];
+                if (band && pageStatus[(band.DisplayType) as number] === true) {
+                    if (discreteArray[i].text) {
+                        rst.push(JpcTextHelper.outputText(discreteArray[i].text, band, unitFactor, 1, 0, 1, 0, multiCols, multiColIdx));
                     }
                     }
-                    if (discreteArray[i][JV.PROP_TEXTS]) {
-                        for (let j = 0; j < discreteArray[i][JV.PROP_TEXTS].length; j++) {
-                            rst.push(JpcTextHelper.outputText(discreteArray[i][JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, multiCols, multiColIdx));
+                    if (discreteArray[i].text_s) {
+                        for (let j = 0; j < discreteArray[i].text_s.length; j++) {
+                            rst.push(JpcTextHelper.outputText(discreteArray[i].text_s[j], band, unitFactor, 1, 0, 1, 0, multiCols, multiColIdx));
                         }
                         }
                     }
                     }
-                    if (discreteArray[i][JV.PROP_DISCRETE_FIELDS]) {
+                    if (discreteArray[i].discrete_field_s) {
                         let flexiblePrecisionRefObj: any = null, flexibleRefField = null;
                         let flexiblePrecisionRefObj: any = null, flexibleRefField = null;
-                        for (let j = 0; j < discreteArray[i][JV.PROP_DISCRETE_FIELDS].length; j++) {
-                            let df = discreteArray[i][JV.PROP_DISCRETE_FIELDS][j];
+                        for (let j = 0; j < discreteArray[i].discrete_field_s.length; j++) {
+                            let df = discreteArray[i].discrete_field_s[j];
                             let value = "";
                             let value = "";
-                            if (df[JV.PROP_FIELD_ID]) {
+                            if (df.FieldID) {
                                 // let map_data_field = JE.F(df[JV.PROP_FIELD_ID], $CURRENT_RPT);
                                 // let map_data_field = JE.F(df[JV.PROP_FIELD_ID], $CURRENT_RPT);
-                                let map_data_field = JE.F(df[JV.PROP_FIELD_ID], $CURRENT_RPT);
-                                if (map_data_field.DataSeq !== JV.BLANK_FIELD_INDEX) {
+                                let map_data_field = JE.F(df.FieldID, $CURRENT_RPT);
+                                if (map_data_field && map_data_field.DataSeq !== JV.BLANK_FIELD_INDEX) {
                                     let data = dataObj[map_data_field.DataNodeName][map_data_field.DataSeq];
                                     let data = dataObj[map_data_field.DataNodeName][map_data_field.DataSeq];
                                     if (data && data.length > 0) {
                                     if (data && data.length > 0) {
                                         if (data.length > segIdx) {
                                         if (data.length > segIdx) {
@@ -38,7 +39,7 @@ const JpcDiscreteHelper = {
                                         }
                                         }
                                     }
                                     }
                                 } else {
                                 } else {
-                                    if (map_data_field[JV.PROP_AD_HOC_DATA] && map_data_field[JV.PROP_AD_HOC_DATA].length > 0) {
+                                    if (map_data_field && map_data_field[JV.PROP_AD_HOC_DATA] && map_data_field[JV.PROP_AD_HOC_DATA].length > 0) {
                                         value = map_data_field[JV.PROP_AD_HOC_DATA][0]
                                         value = map_data_field[JV.PROP_AD_HOC_DATA][0]
                                     } else value = "";
                                     } else value = "";
                                 }
                                 }
@@ -47,7 +48,8 @@ const JpcDiscreteHelper = {
                                     if (flexiblePrecisionRefObj === null) {
                                     if (flexiblePrecisionRefObj === null) {
                                         flexiblePrecisionRefObj = {};
                                         flexiblePrecisionRefObj = {};
                                         flexibleRefField = JE.F(map_data_field[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
                                         flexibleRefField = JE.F(map_data_field[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
-                                        pre_ref_data = dataObj[map_data_field.DataNodeName][flexibleRefField.DataSeq]; //这里的引用指标必须得存在,哪怕不显示,也要存放在指标集合中!
+                                        if (flexibleRefField)
+                                            pre_ref_data = dataObj[map_data_field.DataNodeName][flexibleRefField.DataSeq]; //这里的引用指标必须得存在,哪怕不显示,也要存放在指标集合中!
                                         for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
                                         for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
                                             flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                             flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                         }
                                         }
@@ -56,13 +58,13 @@ const JpcDiscreteHelper = {
                                 } else {
                                 } else {
                                     JpcFieldHelper.resetFormat(df, map_data_field, customizeCfg);
                                     JpcFieldHelper.resetFormat(df, map_data_field, customizeCfg);
                                 }
                                 }
-                            } else if (df[JV.PROP_PARAM_ID]) {
-                                let param = JE.P(df[JV.PROP_PARAM_ID], $CURRENT_RPT);
-                                value = param[JV.PROP_DFT_VALUE];
+                            } else if (df.ParamID) {
+                                let param = JE.P(df.ParamID, $CURRENT_RPT);
+                                if (param && param.Default_Value) value = param.Default_Value;
                             }
                             }
                             let item = JpcCommonOutputHelper.createCommonOutputWithoutDecorate(df, value, true);
                             let item = JpcCommonOutputHelper.createCommonOutputWithoutDecorate(df, value, true);
                             //position
                             //position
-                            item[JV.PROP_AREA] = JpcAreaHelper.outputArea(df[JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, multiCols, multiColIdx, false, false);
+                            item.area = JpcAreaHelper.outputArea(df.area, band, unitFactor, 1, 0, 1, 0, multiCols, multiColIdx, false, false);
                             rst.push(item);
                             rst.push(item);
                         }
                         }
                     }
                     }
@@ -71,29 +73,29 @@ const JpcDiscreteHelper = {
         }
         }
         return rst;
         return rst;
     },
     },
-    outputPreviewDiscreteInfo: function (discreteArray: any[], bands: any, unitFactor: number, pageStatus: boolean[]) {
+    outputPreviewDiscreteInfo: function (discreteArray: IDiscrete[], bands: IBands, unitFactor: number, pageStatus: boolean[]) {
         let rst = [];
         let rst = [];
         for (let i = 0; i < discreteArray.length; i++) {
         for (let i = 0; i < discreteArray.length; i++) {
-            let band = bands[discreteArray[i][JV.PROP_BAND_NAME]];
-            if (band && pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
-                if (discreteArray[i][JV.PROP_TEXT]) {
-                    rst.push(JpcTextHelper.outputText(discreteArray[i][JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, 1, 0));
+            let band = bands[discreteArray[i].BandName];
+            if (band && pageStatus[(band.DisplayType) as number]) {
+                if (discreteArray[i].text) {
+                    rst.push(JpcTextHelper.outputText(discreteArray[i].text, band, unitFactor, 1, 0, 1, 0, 1, 0));
                 }
                 }
-                if (discreteArray[i][JV.PROP_TEXTS]) {
-                    for (let j = 0; j < discreteArray[i][JV.PROP_TEXTS].length; j++) {
-                        rst.push(JpcTextHelper.outputText(discreteArray[i][JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, 1, 0));
+                if (discreteArray[i].text_s) {
+                    for (let j = 0; j < discreteArray[i].text_s.length; j++) {
+                        rst.push(JpcTextHelper.outputText(discreteArray[i].text_s[j], band, unitFactor, 1, 0, 1, 0, 1, 0));
                     }
                     }
                 }
                 }
-                if (discreteArray[i][JV.PROP_DISCRETE_FIELDS]) {
-                    for (let j = 0; j < discreteArray[i][JV.PROP_DISCRETE_FIELDS].length; j++) {
-                        let df = discreteArray[i][JV.PROP_DISCRETE_FIELDS][j];
+                if (discreteArray[i].discrete_field_s) {
+                    for (let j = 0; j < discreteArray[i].discrete_field_s.length; j++) {
+                        let df = discreteArray[i].discrete_field_s[j];
                         let value = "";
                         let value = "";
-                        if (df[JV.PROP_DFT_VALUE]) {
-                            value = df[JV.PROP_DFT_VALUE];
+                        if (df.Default_Value) {
+                            value = df.Default_Value;
                         }
                         }
                         let item = JpcCommonOutputHelper.createCommonOutputWithoutDecorate(df, value, false);
                         let item = JpcCommonOutputHelper.createCommonOutputWithoutDecorate(df, value, false);
                         //position
                         //position
-                        item[JV.PROP_AREA] = JpcAreaHelper.outputArea(df[JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
+                        item.area = JpcAreaHelper.outputArea(df.area, band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
                         rst.push(item);
                         rst.push(item);
                     }
                     }
                 }
                 }
@@ -102,25 +104,25 @@ const JpcDiscreteHelper = {
         }
         }
         return rst;
         return rst;
     },
     },
-    outputPreviewSumInfoOutput: function (band: any, unitFactor: number, tab: any) {
+    outputPreviewSumInfoOutput: function (band: IBandDetail, unitFactor: number, tab: IDiscrete) {
         let rst = [];
         let rst = [];
-        if (tab[JV.PROP_TEXT]) {
-            rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, 1, 0));
+        if (tab.text) {
+            rst.push(JpcTextHelper.outputText(tab.text, band, unitFactor, 1, 0, 1, 0, 1, 0));
         }
         }
-        if (tab[JV.PROP_TEXTS]) {
-            for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
-                rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, 1, 0));
+        if (tab.text_s) {
+            for (let j = 0; j < tab.text_s.length; j++) {
+                rst.push(JpcTextHelper.outputText(tab.text_s[j], band, unitFactor, 1, 0, 1, 0, 1, 0));
             }
             }
         }
         }
-        if (tab[JV.PROP_SUM_FIELDS]) {
-            for (let i = 0; i < tab[JV.PROP_SUM_FIELDS].length; i++) {
-                let tab_field = tab[JV.PROP_SUM_FIELDS][i];
-                if (!(tab_field[JV.PROP_HIDDEN])) {
+        if (tab.sum_field_s) {
+            for (let i = 0; i < tab.sum_field_s.length; i++) {
+                let tab_field = tab.sum_field_s[i];
+                if (!(tab_field.Hidden)) {
                     // rst.push(me.outputTabField(band, tab_field, null, -1, -1, 1, 0, 1, 0, unitFactor, true, controls, 0));
                     // rst.push(me.outputTabField(band, tab_field, null, -1, -1, 1, 0, 1, 0, unitFactor, true, controls, 0));
                     let value = "";
                     let value = "";
                     let item = JpcCommonOutputHelper.createCommonOutputWithoutDecorate(tab_field, value, false);
                     let item = JpcCommonOutputHelper.createCommonOutputWithoutDecorate(tab_field, value, false);
                     //position
                     //position
-                    item[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
+                    item.area = JpcAreaHelper.outputArea(tab_field.area, band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
                     rst.push(item);
                     rst.push(item);
                 }
                 }
             }
             }

+ 46 - 38
report/src/core/helper/jpc_helper_field.ts

@@ -2,28 +2,29 @@
 
 
 import JV from '../jpc_value_define';
 import JV from '../jpc_value_define';
 import strUtil from '../../public/stringUtil';
 import strUtil from '../../public/stringUtil';
+import { Fields, ICell, IControlCollection, ICustomizeCfg, IGroupField, INode, IOrgGroupField, IRptTpl } from '../../interface/basic';
 
 
 let JpcFieldHelper = {
 let JpcFieldHelper = {
-    getValue: function(dataField: any, valueIdx: number) {
-        let rst = "";
+    getValue: function (dataField: string[] | null, valueIdx: number) {
+        let rst = '';
         if (dataField && (dataField.length > valueIdx) && (valueIdx >= 0)) {
         if (dataField && (dataField.length > valueIdx) && (valueIdx >= 0)) {
             rst = dataField[valueIdx];
             rst = dataField[valueIdx];
         }
         }
         return rst;
         return rst;
     },
     },
-    setValue: function(dataField: any, valueIdx: number, newValue: any) {
+    setValue: function (dataField: string[], valueIdx: number, newValue: string) {
         if (dataField && (dataField.length > valueIdx) && (valueIdx >= 0)) {
         if (dataField && (dataField.length > valueIdx) && (valueIdx >= 0)) {
             dataField[valueIdx] = newValue;
             dataField[valueIdx] = newValue;
         }
         }
     },
     },
-    resetSumFormat: function(ref_tab_fields: any[], sum_tab_field: any) {
+    resetSumFormat: function (ref_tab_fields: Fields[], sum_tab_field: Fields) {
         let rst = false;
         let rst = false;
         if (ref_tab_fields && ref_tab_fields.length > 0) {
         if (ref_tab_fields && ref_tab_fields.length > 0) {
             for (let tab_field of ref_tab_fields) {
             for (let tab_field of ref_tab_fields) {
                 if (tab_field[JV.PROP_FIELD_ID] === sum_tab_field[JV.PROP_FIELD_ID]) {
                 if (tab_field[JV.PROP_FIELD_ID] === sum_tab_field[JV.PROP_FIELD_ID]) {
                     rst = true;
                     rst = true;
-                    if (tab_field[JV.PROP_FORMAT]) {
-                        sum_tab_field[JV.PROP_FORMAT] = tab_field[JV.PROP_FORMAT];
+                    if (tab_field.Format) {
+                        sum_tab_field.Format = tab_field.Format;
                     }
                     }
                     break;
                     break;
                 }
                 }
@@ -31,66 +32,73 @@ let JpcFieldHelper = {
         }
         }
         return rst;
         return rst;
     },
     },
-    resetFormat: function (tab_field: any, map_field: any, customizeCfg: any) {
+    resetFormat: function (tab_field: Fields, map_field: IGroupField | null, customizeCfg: ICustomizeCfg | null) {
         let rst = false;
         let rst = false;
-        if (map_field && map_field[JV.PROP_PRECISION] && map_field[JV.PROP_PRECISION].type === "fixed") {
-            let formatStrs = ["#"], ffStr = (customizeCfg && customizeCfg.fillZero)?"0":"#";
+        if (map_field && map_field.Precision && map_field.Precision.type === "fixed") {
+            let formatStrs = ["#"], ffStr = (customizeCfg && customizeCfg.fillZero) ? "0" : "#";
             for (let idx = 0; idx < parseInt(map_field[JV.PROP_FIXED_PRECISION_AMT]); idx++) {
             for (let idx = 0; idx < parseInt(map_field[JV.PROP_FIXED_PRECISION_AMT]); idx++) {
                 if (idx === 0) {
                 if (idx === 0) {
                     formatStrs.push(".");
                     formatStrs.push(".");
                 }
                 }
                 formatStrs.push(ffStr);
                 formatStrs.push(ffStr);
             }
             }
-            if (tab_field[JV.PROP_FORMAT] && tab_field[JV.PROP_FORMAT].indexOf(",") >= 0) {
-                tab_field[JV.PROP_FORMAT] = "," + formatStrs.join("");
+            if (tab_field.Format && tab_field.Format.indexOf(",") >= 0) {
+                tab_field.Format = "," + formatStrs.join("");
             } else {
             } else {
-                tab_field[JV.PROP_FORMAT] = formatStrs.join("");
+                tab_field.Format = formatStrs.join("");
             }
             }
-            map_field[JV.PROP_FORMAT] = tab_field[JV.PROP_FORMAT]; //这里顺手把format也赋给map_field,后期统计用得着
+            map_field.Format = tab_field.Format; //这里顺手把format也赋给map_field,后期统计用得着
             rst = true;
             rst = true;
-        } else if (tab_field[JV.PROP_FORMAT] && tab_field[JV.PROP_FORMAT].indexOf("#") >= 0 && (customizeCfg && customizeCfg.fillZero)) {
-            tab_field[JV.PROP_FORMAT] = strUtil.replaceAll(tab_field[JV.PROP_FORMAT], '#', '0');
-            map_field[JV.PROP_FORMAT] = tab_field[JV.PROP_FORMAT];
+        } else if (map_field && tab_field.Format && tab_field.Format.indexOf("#") >= 0 && (customizeCfg && customizeCfg.fillZero)) {
+            tab_field.Format = strUtil.replaceAll(tab_field.Format, '#', '0');
+            map_field.Format = tab_field.Format;
             rst = true;
             rst = true;
         }
         }
         return rst;
         return rst;
     },
     },
-    resetFlexibleFormat: function (tab_field: any, ref_field_data: any, flexiblePrecisionRefObj: any, valueIdx: number, customizeCfg: any) {
+    resetFlexibleFormat: function (tab_field: Fields, ref_field_data: IGroupField | null, flexiblePrecisionRefObj: Record<string, number>, valueIdx: number, customizeCfg: ICustomizeCfg | null) {
         let precisionAmt = 2;
         let precisionAmt = 2;
         if (ref_field_data && flexiblePrecisionRefObj && valueIdx >= 0) {
         if (ref_field_data && flexiblePrecisionRefObj && valueIdx >= 0) {
             precisionAmt = flexiblePrecisionRefObj["refUnit_" + ref_field_data[valueIdx]];
             precisionAmt = flexiblePrecisionRefObj["refUnit_" + ref_field_data[valueIdx]];
             if (precisionAmt === null || precisionAmt === undefined) precisionAmt = flexiblePrecisionRefObj["refUnit_其他未列单位"];
             if (precisionAmt === null || precisionAmt === undefined) precisionAmt = flexiblePrecisionRefObj["refUnit_其他未列单位"];
         }
         }
-        let formatStrs = ["#."], ffStr = (customizeCfg && customizeCfg.fillZero)?"0":"#";
+        let formatStrs = ["#."], ffStr = (customizeCfg && customizeCfg.fillZero) ? "0" : "#";
         for (let idx = 0; idx < precisionAmt; idx++) {
         for (let idx = 0; idx < precisionAmt; idx++) {
             formatStrs.push(ffStr);
             formatStrs.push(ffStr);
         }
         }
-        if (tab_field[JV.PROP_FORMAT] && tab_field[JV.PROP_FORMAT].indexOf(",") >= 0) {
-            tab_field[JV.PROP_FORMAT] = "," + formatStrs.join("");
+        if (tab_field.Format && tab_field.Format.indexOf(",") >= 0) {
+            tab_field.Format = "," + formatStrs.join("");
         } else {
         } else {
-            tab_field[JV.PROP_FORMAT] = formatStrs.join("");
+            tab_field.Format = formatStrs.join("");
         }
         }
     },
     },
-    decorateValue: function (cell: any, controls: any) {
+    decorateValue: function (cell: INode, controls: IControlCollection | null) {
         if (controls) {
         if (controls) {
-            const showZero = controls[cell[JV.PROP_CONTROL]][JV.PROP_SHOW_ZERO];
+            const showZero = controls[cell.control].ShowZero;
             if (showZero && showZero === 'F') {
             if (showZero && showZero === 'F') {
-                const val = parseFloat(cell[JV.PROP_VALUE]);
+                const val = parseFloat(cell.Value as string);
                 if (val === 0) {
                 if (val === 0) {
-                    cell[JV.PROP_VALUE] = '';
+                    cell.Value = '';
                 }
                 }
             }
             }
         }
         }
     },
     },
-    findAndPutDataFieldIdx: function (rptTpl: any, tab_fields: any[], rstFields: any, rstFieldsIdx: any, isEx: boolean) {
+
+    findAndPutDataFieldIdx: (
+        rptTpl: IRptTpl,
+        tab_fields: { FieldID: number }[] | null,
+        rstFields: { FieldID: number }[] | null,
+        rstFieldsIdx: (number | IOrgGroupField)[] | null,
+        isEx: boolean
+    ) => {
         //通过FieldID找到相关映射指标的位置IDX并记录下来,方便后续引用
         //通过FieldID找到相关映射指标的位置IDX并记录下来,方便后续引用
         if (tab_fields) {
         if (tab_fields) {
-            let DTL_STR = isEx?JV.NODE_DETAIL_FIELDS_EX:JV.NODE_DETAIL_FIELDS;
-            let detail_fields = rptTpl[JV.NODE_FIELD_MAP][DTL_STR];
+            let DTL_STR = isEx ? '从数据指标_拓展集合' : '从数据指标_集合';
+            let detail_fields = rptTpl.指标_数据_映射[DTL_STR];
             for (let i = 0; i < tab_fields.length; i++) {
             for (let i = 0; i < tab_fields.length; i++) {
                 let isFounded = false;
                 let isFounded = false;
                 for (let j = 0; j < detail_fields.length; j++) {
                 for (let j = 0; j < detail_fields.length; j++) {
-                    if (tab_fields[i]["FieldID"] === detail_fields[j]["ID"]) {
+                    if (tab_fields[i].FieldID === detail_fields[j].ID) {
                         isFounded = true;
                         isFounded = true;
                         if (rstFields) rstFields.push(tab_fields[i]);
                         if (rstFields) rstFields.push(tab_fields[i]);
                         if (rstFieldsIdx) rstFieldsIdx.push(j);
                         if (rstFieldsIdx) rstFieldsIdx.push(j);
@@ -100,9 +108,9 @@ let JpcFieldHelper = {
                 if (!isFounded) {
                 if (!isFounded) {
                     if (rstFields) rstFields.push(tab_fields[i]);
                     if (rstFields) rstFields.push(tab_fields[i]);
                     if (rstFieldsIdx) {
                     if (rstFieldsIdx) {
-                        if (rptTpl[JV.NODE_NO_MAPPING_FIELDS] && rptTpl[JV.NODE_NO_MAPPING_FIELDS].length > 0) {
-                            for (let discretField of rptTpl[JV.NODE_NO_MAPPING_FIELDS]) {
-                                if (discretField[JV.PROP_ID] === tab_fields[i]["FieldID"]) {
+                        if (rptTpl.无映射离散指标_集合 && rptTpl.无映射离散指标_集合.length > 0) {
+                            for (let discretField of rptTpl.无映射离散指标_集合) {
+                                if (discretField.ID === tab_fields[i].FieldID) {
                                     rstFieldsIdx.push(discretField);
                                     rstFieldsIdx.push(discretField);
                                     isFounded = true;
                                     isFounded = true;
                                     break;
                                     break;
@@ -116,12 +124,12 @@ let JpcFieldHelper = {
             }
             }
         }
         }
     },
     },
-    findAutoHeightFieldIdx: function(rptTpl: any, tab_fields: any[], rstFieldsIdx: any[], isEx: boolean) {
+    findAutoHeightFieldIdx: function (rptTpl: IRptTpl, tab_fields: Fields[], rstFieldsIdx: any[], isEx: boolean) {
         if (tab_fields) {
         if (tab_fields) {
-            let DTL_STR = isEx?JV.NODE_DETAIL_FIELDS_EX:JV.NODE_DETAIL_FIELDS;
-            let detail_fields = rptTpl[JV.NODE_FIELD_MAP][DTL_STR];
+            let DTL_STR = isEx ? JV.NODE_DETAIL_FIELDS_EX : JV.NODE_DETAIL_FIELDS;
+            let detail_fields = rptTpl.指标_数据_映射[DTL_STR];
             for (let i = 0; i < tab_fields.length; i++) {
             for (let i = 0; i < tab_fields.length; i++) {
-                if (tab_fields[i][JV.PROP_IS_AUTO_HEIGHT]) {
+                if (tab_fields[i].isAutoHeight) {
                     for (let j = 0; j < detail_fields.length; j++) {
                     for (let j = 0; j < detail_fields.length; j++) {
                         if (tab_fields[i]["FieldID"] === detail_fields[j]["ID"]) {
                         if (tab_fields[i]["FieldID"] === detail_fields[j]["ID"]) {
                             let item = [];
                             let item = [];
@@ -134,9 +142,9 @@ let JpcFieldHelper = {
                 }
                 }
             }
             }
             if (!isEx) {
             if (!isEx) {
-                let dis_detail_fields = rptTpl[JV.NODE_NO_MAPPING_FIELDS];
+                let dis_detail_fields = rptTpl.无映射离散指标_集合;
                 for (let i = 0; i < tab_fields.length; i++) {
                 for (let i = 0; i < tab_fields.length; i++) {
-                    if (tab_fields[i][JV.PROP_IS_AUTO_HEIGHT]) {
+                    if (tab_fields[i].isAutoHeight) {
                         for (let j = 0; j < dis_detail_fields.length; j++) {
                         for (let j = 0; j < dis_detail_fields.length; j++) {
                             if (tab_fields[i]["FieldID"] === dis_detail_fields[j]["ID"]) {
                             if (tab_fields[i]["FieldID"] === dis_detail_fields[j]["ID"]) {
                                 let item = [];
                                 let item = [];

+ 22 - 20
report/src/core/helper/jpc_helper_flow_tab.ts

@@ -1,38 +1,39 @@
 'use strict';
 'use strict';
 
 
+import { IBands, IRptTpl } from '../../interface/basic';
 import JV from '../jpc_value_define';
 import JV from '../jpc_value_define';
 import JpcCommonHelper from './jpc_helper_common';
 import JpcCommonHelper from './jpc_helper_common';
 
 
 let JpcFlowTabHelper = {
 let JpcFlowTabHelper = {
-    getMaxRowsPerPage: function(bands: any, rptTpl: any, isEx: boolean) {
+    getMaxRowsPerPage: function (bands: IBands, rptTpl: IRptTpl, isEx: boolean) {
         let rst = 1;
         let rst = 1;
-        let FLOW_INFO_STR = (!isEx)?JV.NODE_FLOW_INFO:JV.NODE_FLOW_INFO_EX;
-        let tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        let tab;
+        (!isEx) ? tab = rptTpl.流水式表_信息.流水式表_数据 : tab = rptTpl.流水式表_拓展信息.流水式表_数据;
+        let band = bands[tab.BandName];
         if (band) {
         if (band) {
             let maxFieldMeasure = 1.0;
             let maxFieldMeasure = 1.0;
-            if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
+            if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab.CalculationType)) {
                 let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
                 let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-                maxFieldMeasure = 1.0 * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] * unitFactor;
+                maxFieldMeasure = 1.0 * tab.CommonHeight * unitFactor;
             } else {
             } else {
-                maxFieldMeasure = (band.Bottom - band.Top) * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] / JV.HUNDRED_PERCENT;
+                maxFieldMeasure = (band.Bottom - band.Top) * tab.CommonHeight / JV.HUNDRED_PERCENT;
             }
             }
             rst = Math.floor((band.Bottom - band.Top) / maxFieldMeasure);
             rst = Math.floor((band.Bottom - band.Top) / maxFieldMeasure);
         }
         }
         return rst;
         return rst;
     },
     },
-    getActualContentAreaHeight: function(bands: any, rptTpl: any, segments: any[], rowAmt: number, page: number, isEx: boolean) {
+    getActualContentAreaHeight: function (bands: IBands, rptTpl: IRptTpl, segments: number[][], rowAmt: number, page: number, isEx: boolean) {
         let rst = 1;
         let rst = 1;
-        let FLOW_INFO_STR = (!isEx)?JV.NODE_FLOW_INFO:JV.NODE_FLOW_INFO_EX;
-        let tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        let tab;
+        (!isEx) ? tab = rptTpl.流水式表_信息.流水式表_数据 : tab = rptTpl.流水式表_拓展信息.流水式表_数据;
+        let band = bands[tab.BandName];
         if (band) {
         if (band) {
             let maxFieldMeasure = 1.0;
             let maxFieldMeasure = 1.0;
-            if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
+            if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab.CalculationType)) {
                 let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
                 let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-                maxFieldMeasure = 1.0 * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] * unitFactor;
+                maxFieldMeasure = 1.0 * tab.CommonHeight * unitFactor;
             } else {
             } else {
-                maxFieldMeasure = (band.Bottom - band.Top) * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] / JV.HUNDRED_PERCENT;
+                maxFieldMeasure = (band.Bottom - band.Top) * tab.CommonHeight / JV.HUNDRED_PERCENT;
             }
             }
             if (segments.length >= page) {
             if (segments.length >= page) {
                 rst = rowAmt * maxFieldMeasure;
                 rst = rowAmt * maxFieldMeasure;
@@ -40,21 +41,22 @@ let JpcFlowTabHelper = {
         }
         }
         return rst;
         return rst;
     },
     },
-    chkSegEnd: function (bands: any, rptTpl: any, segmentLength: number, preRec: number, pageRecAmt: number, isEx: boolean) {
+    chkSegEnd: function (bands: IBands, rptTpl: IRptTpl, segmentLength: number, preRec: number, pageRecAmt: number, isEx: boolean) {
         let me = this, rst = false;
         let me = this, rst = false;
         let remainAmt = preRec + pageRecAmt - segmentLength;
         let remainAmt = preRec + pageRecAmt - segmentLength;
         rst = me.hasEnoughSpace(rptTpl, bands, remainAmt, isEx);
         rst = me.hasEnoughSpace(rptTpl, bands, remainAmt, isEx);
         return rst;
         return rst;
     },
     },
-    hasEnoughSpace: function (rptTpl: any, bands: any, remainAmt: number, isEx: boolean) {
+    hasEnoughSpace: function (rptTpl: IRptTpl, bands: IBands, remainAmt: number, isEx: boolean) {
         if (remainAmt < 0) return false;
         if (remainAmt < 0) return false;
         let rst = true, measurement = 1.0, douDiffForCompare = 0.00001;
         let rst = true, measurement = 1.0, douDiffForCompare = 0.00001;
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-        let FLOW_INFO_STR = (!isEx)?JV.NODE_FLOW_INFO:JV.NODE_FLOW_INFO_EX;
-        let tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        let FLOW_INFO_STR = (!isEx) ? '流水式表_信息' : '流水式表_拓展信息';
+        let tab;
+        (!isEx) ? tab = rptTpl.流水式表_信息.流水式表_数据 : tab = rptTpl.流水式表_拓展信息.流水式表_数据;
+        let band = bands[tab.BandName];
         if (band !== null && band !== undefined) {
         if (band !== null && band !== undefined) {
-            measurement = 1.0 * tab[JV.PROP_CMN_HEIGHT] * unitFactor;
+            measurement = 1.0 * tab.CommonHeight * unitFactor;
             let spareHeight = measurement * remainAmt;
             let spareHeight = measurement * remainAmt;
             let douH = band.Bottom - band.Top;
             let douH = band.Bottom - band.Top;
             rst = ((spareHeight >= douH) || ((spareHeight - douH) <= douDiffForCompare));
             rst = ((spareHeight >= douH) || ((spareHeight - douH) <= douDiffForCompare));

+ 1 - 1
report/src/core/helper/jpc_helper_font_width.ts

@@ -499,7 +499,7 @@ const fontWidthMap = {
             '_64': 35.59000015258789
             '_64': 35.59000015258789
         }
         }
     },
     },
-    getFontWidth: function(fontName: string, fontHeight: number, typeStr: string) {
+    getFontWidth: function (fontName: string, fontHeight: number, typeStr: string) {
         let rst = 12;
         let rst = 12;
         if ((fontWidthMap as any)[fontName]) {
         if ((fontWidthMap as any)[fontName]) {
             rst = (fontWidthMap as any)[fontName][typeStr]['_' + fontHeight];
             rst = (fontWidthMap as any)[fontName][typeStr]['_' + fontHeight];

+ 7 - 5
report/src/core/helper/jpc_helper_text.ts

@@ -3,18 +3,20 @@
 import JV from '../jpc_value_define';
 import JV from '../jpc_value_define';
 import JpcCommonOutputHelper from './jpc_helper_common_output';
 import JpcCommonOutputHelper from './jpc_helper_common_output';
 import JpcAreaHelper from './jpc_helper_area';
 import JpcAreaHelper from './jpc_helper_area';
+import { IBandDetail, Fields } from '../../interface/basic';
 
 
 let JpcTextHelper = {
 let JpcTextHelper = {
-    outputText: function (textNode: any, band: any, unitFactor: number, rows: number, rowIdx: number, cols: number, colIdx: number, multiCols: number, multiColIdx: number) {
-        let rst = JpcCommonOutputHelper.createCommonOutput(textNode, textNode[JV.PROP_LABEL], null);
+    //暂定
+    outputText: function (textNode: any, band: IBandDetail, unitFactor: number, rows: number, rowIdx: number, cols: number, colIdx: number, multiCols: number, multiColIdx: number) {
+        let rst = JpcCommonOutputHelper.createCommonOutput(textNode, textNode.Label, null);
         //position
         //position
-        rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(textNode[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, multiCols, multiColIdx, false, false);
+        rst.area = JpcAreaHelper.outputArea(textNode.area, band, unitFactor, rows, rowIdx, cols, colIdx, multiCols, multiColIdx, false, false);
         return rst;
         return rst;
     },
     },
-    outputDirectValue: function (textNode: any, value: any, band: any, unitFactor: number, rows: number, rowIdx: number, cols: number, colIdx: number, multiCols: number, multiColIdx: number) {
+    outputDirectValue: function (textNode: Fields, value: string, band: IBandDetail, unitFactor: number, rows: number, rowIdx: number, cols: number, colIdx: number, multiCols: number, multiColIdx: number) {
         let rst = JpcCommonOutputHelper.createCommonOutput(textNode, value, null);
         let rst = JpcCommonOutputHelper.createCommonOutput(textNode, value, null);
         //position
         //position
-        rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(textNode[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, multiCols, multiColIdx, false, false);
+        rst.area = JpcAreaHelper.outputArea(textNode.area, band, unitFactor, rows, rowIdx, cols, colIdx, multiCols, multiColIdx, false, false);
         return rst;
         return rst;
     }
     }
 };
 };

+ 12 - 0
report/src/core/index.ts

@@ -0,0 +1,12 @@
+export * from './jpc_band';
+export * from './jpc_bill_tab';
+export * from './jpc_cross_tab';
+export * from './jpc_data';
+export * from './jpc_event';
+export * from './jpc_ex';
+export * from './jpc_field';
+export * from './jpc_flow_tab';
+export * from './jpc_function';
+export * from './jpc_param';
+export * from './jpc_rte';
+export * from './jpc_value_define';

+ 32 - 30
report/src/core/jpc_band.ts

@@ -2,53 +2,55 @@
 
 
 import JV from './jpc_value_define';
 import JV from './jpc_value_define';
 import JpcCommonHelper from './helper/jpc_helper_common';
 import JpcCommonHelper from './helper/jpc_helper_common';
-let JpcBandHelper = require('./helper/jpc_helper_band');
+import { IBandDetail, IBands, IDefProperties, IOrgBandDetail, IRptTpl, } from '../interface/basic';
+import JpcBandHelper from './helper/jpc_helper_band';
 
 
 const JpcBand = {
 const JpcBand = {
-    createNew(rptTpl: any, defProperties: any) {
+    createNew(rptTpl: IRptTpl, defProperties: IDefProperties) {
         let me = this;
         let me = this;
         let JpcBandResult: any = {};
         let JpcBandResult: any = {};
-        if (rptTpl[JV.NODE_BAND_COLLECTION]) {
-            for (let i = 0; i < rptTpl[JV.NODE_BAND_COLLECTION].length; i++) {
-                me.createSingle(rptTpl[JV.NODE_BAND_COLLECTION][i], JpcBandResult, rptTpl, defProperties);
+        if (rptTpl.布局框_集合) {
+            for (let i = 0; i < rptTpl.布局框_集合.length; i++) {
+                me.createSingle(rptTpl.布局框_集合[i], JpcBandResult, rptTpl, defProperties);
             }
             }
         }
         }
         return JpcBandResult;
         return JpcBandResult;
     },
     },
-    createSingle(bandNode: any, parentObj: any, rptTpl: any, defProperties: any) {
+    //根据模板信息生成大板块的数据
+    createSingle(bandNode: IOrgBandDetail, parentObj: IBands, rptTpl: IRptTpl, defProperties: IDefProperties) {
         let me = this;
         let me = this;
-        if (bandNode && bandNode[JV.BAND_PROP_NAME]) {
+        if (bandNode && bandNode.Name) {
             let item = {
             let item = {
-                Left: 0, 
-                Right: 0, 
-                Top: 0, 
+                Left: 0,
+                Right: 0,
+                Top: 0,
                 Bottom: 0,
                 Bottom: 0,
-                [JV.BAND_PROP_STYLE]: JpcCommonHelper.getStyle(bandNode[JV.BAND_PROP_STYLE], defProperties.styles, null),
-                [JV.BAND_PROP_CONTROL]: JpcCommonHelper.getControl(bandNode[JV.BAND_PROP_CONTROL], defProperties.ctrls, null),
-                [JV.BAND_PROP_HEIGHT]: (bandNode[JV.BAND_PROP_HEIGHT]) ? (1.0 * bandNode[JV.BAND_PROP_HEIGHT]) : 0,
-                [JV.BAND_PROP_WIDTH]: (bandNode[JV.BAND_PROP_WIDTH]) ? 1.0 * bandNode[JV.BAND_PROP_WIDTH] : 0,
-                [JV.BAND_PROP_DISPLAY_TYPE]: JpcBandHelper.getBandTypeValByString(bandNode[JV.BAND_PROP_DISPLAY_TYPE]),
-                [JV.BAND_PROP_ALIGNMENT]: JpcCommonHelper.getLayoutAlignment(bandNode[JV.BAND_PROP_ALIGNMENT]),
-                [JV.PROP_CALCULATION]: JpcCommonHelper.getPosCalculationType(bandNode[JV.PROP_CALCULATION]),
-            };
-            if (bandNode.hasOwnProperty(JV.PROP_BAND_NORMAL_ONLY)) {
-                item[JV.PROP_BAND_NORMAL_ONLY] = JpcCommonHelper.getBoolean(bandNode[JV.PROP_BAND_NORMAL_ONLY]);
+                style: JpcCommonHelper.getStyle(bandNode.style, defProperties.styles),
+                control: JpcCommonHelper.getControl(bandNode.control, defProperties.ctrls),
+                Height: (bandNode.Height) ? parseFloat(bandNode.Height) : 0,
+                Width: (bandNode.Width) ? parseFloat(bandNode.Width) : 0,
+                DisplayType: JpcBandHelper.getBandTypeValByString(bandNode.DisplayType),
+                Alignment: JpcCommonHelper.getLayoutAlignment(bandNode.Alignment),
+                CalculationType: JpcCommonHelper.getPosCalculationType(bandNode.CalculationType),
+            } as IBandDetail;
+            if (bandNode.normalOnly) {
+                item.normalOnly = JpcCommonHelper.getBoolean(bandNode.normalOnly);
             }
             }
-            if (bandNode.hasOwnProperty(JV.PROP_BAND_EX_ONLY)) {
-                item[JV.PROP_BAND_EX_ONLY] = JpcCommonHelper.getBoolean(bandNode[JV.PROP_BAND_EX_ONLY]);
+            if (bandNode.exOnly) {
+                item.exOnly = JpcCommonHelper.getBoolean(bandNode.exOnly);
             }
             }
 
 
-            if (bandNode[JV.BAND_PROP_MERGE_BORDER]) {
-                item[JV.BAND_PROP_MERGE_BORDER] = bandNode[JV.BAND_PROP_MERGE_BORDER];
+            if (bandNode.MergeBorder) {
+                item.MergeBorder = bandNode.MergeBorder;
             }
             }
-            if (bandNode[JV.BAND_PROP_SUB_BANDS]) {
-                for (let i = 0; i < bandNode[JV.BAND_PROP_SUB_BANDS].length; i++) {
-                    me.createSingle(bandNode[JV.BAND_PROP_SUB_BANDS][i], parentObj, rptTpl, defProperties);
+            if (bandNode.band_s) {
+                for (let i = 0; i < bandNode.band_s.length; i++) {
+                    me.createSingle(bandNode.band_s[i], parentObj, rptTpl, defProperties);
                 }
                 }
             }
             }
-            parentObj[bandNode[JV.BAND_PROP_NAME]] = item;
-            if (item[JV.BAND_PROP_MERGE_BORDER] !== null && item[JV.BAND_PROP_MERGE_BORDER] !== undefined && item[JV.BAND_PROP_MERGE_BORDER] === 'T') {
-                parentObj[JV.BAND_PROP_MERGE_BAND] = item;
+            parentObj[bandNode.Name] = item;
+            if (item.MergeBorder !== null && item.MergeBorder !== undefined && item.MergeBorder === 'T') {
+                parentObj.MergeBand = item;
             }
             }
         }
         }
     }
     }

+ 70 - 59
report/src/core/jpc_bill_tab.ts

@@ -7,52 +7,62 @@ import JpcDiscreteHelper from './helper/jpc_helper_discrete';
 import JpcTextHelper from './helper/jpc_helper_text';
 import JpcTextHelper from './helper/jpc_helper_text';
 import JpcCommonOutputHelper from './helper/jpc_helper_common_output';
 import JpcCommonOutputHelper from './helper/jpc_helper_common_output';
 import JpcAreaHelper from './helper/jpc_helper_area';
 import JpcAreaHelper from './helper/jpc_helper_area';
-
-class JpcBillTabSrvClass{
-    disp_fields_idx: any[];
+import {
+    ICurrent_RPT,
+    ICustomizeCfg,
+    IBands,
+    IControlCollection,
+    IRptTpl,
+    IDataObj,
+} from '../interface/basic';
+import { IDataObjProps } from '../interface/enum'
+class JpcBillTabSrvClass {
+    disp_fields_idx: number[];
 
 
     constructor() {
     constructor() {
         this.disp_fields_idx = []; // typescript的class属性初始化都要放constructor里,不然总报错
         this.disp_fields_idx = []; // typescript的class属性初始化都要放constructor里,不然总报错
     };
     };
 
 
-    sorting(rptTpl: any){
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT][JV.PROP_BILL_FIELDS], [], this.disp_fields_idx, false);
+    // 该方法主要是通过账单报表的信息,获取相对应于报表模板信息中的数据信息的数组的序号,以便后面取值计算
+    sorting(rptTpl: IRptTpl) {
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl.账单式表_信息.账单式表_数据.bill_field_s, [], this.disp_fields_idx, false);
     };
     };
-
-    paging(rptTpl: any, dataObj: any) {
+    // 获取总页数
+    //问题:为什么dataFields第一个元素就可以确定总页数
+    paging(rptTpl: IRptTpl, dataObj: IDataObj) {
         let rst = 0;
         let rst = 0;
-        function _getDataLength(fields_str: string) {
+        function _getDataLength(fields_str: IDataObjProps) {
             let dataFields = dataObj[fields_str];
             let dataFields = dataObj[fields_str];
             if (dataFields && dataFields.length > 0) {
             if (dataFields && dataFields.length > 0) {
                 rst = dataFields[0].length;
                 rst = dataFields[0].length;
             }
             }
         }
         }
-        if (rptTpl[JV.NODE_FIELD_MAP]) {
-            if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
-                _getDataLength(JV.DATA_DETAIL_DATA);
-            } else if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
-                _getDataLength(JV.DATA_MASTER_DATA);
-            } else if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]) {
-                _getDataLength(JV.DATA_DISCRETE_DATA);
-            } else if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_PARAMS]) {
+        if (rptTpl.指标_数据_映射) {
+            if (rptTpl.指标_数据_映射.从数据指标_集合) {
+                _getDataLength(IDataObjProps.detail_data);
+            } else if (rptTpl.指标_数据_映射.主数据指标_集合) {
+                _getDataLength(IDataObjProps.master_data);
+            } else if (rptTpl.指标_数据_映射.离散指标_集合) {
+                _getDataLength(IDataObjProps.discrete_data);
+            } else if (rptTpl.指标_数据_映射.离散参数_集合) {
                 rst = 1;
                 rst = 1;
             }
             }
         }
         }
         return rst;
         return rst;
     };
     };
 
 
-    outputAsPreviewPage(rptTpl: any, bands: any, controls: any, $CURRENT_RPT: any) {
+    outputAsPreviewPage(rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT) {
         let me = this, rst: any[] = [], vIdx = [];
         let me = this, rst: any[] = [], vIdx = [];
         //只预览第一页的数据
         //只预览第一页的数据
-        let pageStatus = [true, true, false, true, false, false, false, false];
+        let pageStatus = [true, true, false, true, false, false, false, false];//??
         JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, true, false);
         JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, true, false);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         rst = rst.concat(me.outputPreviewContent(rptTpl, bands, unitFactor, controls, pageStatus));
         rst = rst.concat(me.outputPreviewContent(rptTpl, bands, unitFactor, controls, pageStatus));
-        rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
+        rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl.账单式表_信息.离散信息, bands, unitFactor, pageStatus));
         return rst;
         return rst;
     };
     };
 
 
-    outputAsSimpleJSONPage(rptTpl: any, dataObj: any, page: number, bands: any, controls: any, $CURRENT_RPT: any, customizeCfg: any) {
+    outputAsSimpleJSONPage(rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) {
         let me = this, rst: any[] = [], tabRstLst = [];
         let me = this, rst: any[] = [], tabRstLst = [];
         //1 calculate the band position
         //1 calculate the band position
         let pageStatus: boolean[] = [true, false, false, false, false, false, false, false];
         let pageStatus: boolean[] = [true, false, false, false, false, false, false, false];
@@ -62,7 +72,7 @@ class JpcBillTabSrvClass{
         //2.1 output content
         //2.1 output content
         tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, pageStatus, $CURRENT_RPT, customizeCfg));
         tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, pageStatus, $CURRENT_RPT, customizeCfg));
         //2.2 output discrete
         //2.2 output discrete
-        tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, pageStatus, page - 1, 1, 0, $CURRENT_RPT, customizeCfg));
+        tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl.账单式表_信息.离散信息, bands, dataObj, unitFactor, pageStatus, page - 1, 1, 0, $CURRENT_RPT, customizeCfg));
         for (let i = 0; i < tabRstLst.length; i++) {
         for (let i = 0; i < tabRstLst.length; i++) {
             rst = rst.concat(tabRstLst[i]);
             rst = rst.concat(tabRstLst[i]);
             tabRstLst[i] = null;
             tabRstLst[i] = null;
@@ -70,66 +80,67 @@ class JpcBillTabSrvClass{
         return rst;
         return rst;
     };
     };
 
 
-    outputPreviewContent(rptTpl: any, bands: any, unitFactor: number, controls: any, pageStatus: boolean[]) {
+    outputPreviewContent(rptTpl: IRptTpl, bands: IBands, unitFactor: number, controls: IControlCollection, pageStatus: boolean[]) {
         let rst: any[] = [];
         let rst: any[] = [];
-        let tab = rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        let tab = rptTpl.账单式表_信息.账单式表_数据;
+        let band = bands[tab.BandName];
         if (band) {
         if (band) {
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
-                let tab_fields = tab[JV.PROP_BILL_FIELDS];
+            if (pageStatus[(band.DisplayType) as number]) {
+                let tab_fields = tab.bill_field_s;
                 for (let i = 0; i < tab_fields.length; i++) {
                 for (let i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[i];
                     let tab_field = tab_fields[i];
-                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                    if (!(tab_field.Hidden)) {
                         let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, "", controls);
                         let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, "", controls);
-                        cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
+                        cellItem.area = JpcAreaHelper.outputArea(tab_field.area, band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
                         rst.push(cellItem);
                         rst.push(cellItem);
                     }
                     }
                 }
                 }
-                if (tab[JV.PROP_TEXT]) {
-                    rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, 1, 0));
+                if (tab.text) {
+                    rst.push(JpcTextHelper.outputText(tab.text, band, unitFactor, 1, 0, 1, 0, 1, 0));
                 }
                 }
-                if (tab[JV.PROP_TEXTS]) {
-                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
-                        rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, 1, 0));
+                if (tab.text_s) {
+                    for (let j = 0; j < tab.text_s.length; j++) {
+                        rst.push(JpcTextHelper.outputText(tab.text_s[j], band, unitFactor, 1, 0, 1, 0, 1, 0));
                     }
                     }
                 }
                 }
-                if (tab[JV.NODE_DISCRETE_INFO]) {
-                    rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
+                if (tab.离散信息) {
+                    rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(tab.离散信息, bands, unitFactor, pageStatus));
                 }
                 }
             }
             }
         }
         }
         return rst;
         return rst;
     };
     };
 
 
-    outputContent(rptTpl: any, dataObj: any, page: number, bands: any, unitFactor: number, controls: any, pageStatus: boolean[], $CURRENT_RPT: any, customizeCfg: any) {
+    outputContent(rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, pageStatus: boolean[], $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) {
         let me = this, rst: any[] = [];
         let me = this, rst: any[] = [];
-        let tab = rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        let tab = rptTpl.账单式表_信息.账单式表_数据;
+        let band = bands[tab.BandName];
         if (band) {
         if (band) {
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
-                let tab_fields = tab[JV.PROP_BILL_FIELDS];
-                let data_details = null;
-                if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
-                    data_details = dataObj[JV.DATA_DETAIL_DATA];
-                } else if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
-                    data_details = dataObj[JV.DATA_MASTER_DATA];
+            if (pageStatus[(band.DisplayType) as number]) {
+                let tab_fields = tab.bill_field_s;
+                // let data_details = null;//bylish
+                let data_details = [];
+                if (rptTpl.指标_数据_映射.从数据指标_集合) {
+                    data_details = dataObj[IDataObjProps.detail_data];
+                } else if (rptTpl.指标_数据_映射.主数据指标_集合) {
+                    data_details = dataObj[IDataObjProps.master_data];
                 }
                 }
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 for (let i = 0; i < tab_fields.length; i++) {
                 for (let i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[i];
                     let tab_field = tab_fields[i];
-                    let data_field = null, map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                    let data_field = null, map_data_field = JE.F(tab_field.FieldID, $CURRENT_RPT);
                     if (me.disp_fields_idx.length > i && me.disp_fields_idx[i] !== JV.BLANK_FIELD_INDEX && (typeof me.disp_fields_idx[i] !== 'object')) {
                     if (me.disp_fields_idx.length > i && me.disp_fields_idx[i] !== JV.BLANK_FIELD_INDEX && (typeof me.disp_fields_idx[i] !== 'object')) {
                         data_field = data_details[me.disp_fields_idx[i]];
                         data_field = data_details[me.disp_fields_idx[i]];
                     } else {
                     } else {
                         if (map_data_field) {
                         if (map_data_field) {
-                            data_field = map_data_field[JV.PROP_AD_HOC_DATA];
+                            data_field = map_data_field.data_field;
                         }
                         }
                     }
                     }
-                    if (map_data_field && map_data_field[JV.PROP_PRECISION] && map_data_field.flexiblePrecisionRefObj) {
+                    if (map_data_field && map_data_field.Precision && map_data_field.flexiblePrecisionRefObj && map_data_field.Precision.flexibleRefFieldID) {//加了最后一个判断  by lish
                         if (flexiblePrecisionRefObj === null) {
                         if (flexiblePrecisionRefObj === null) {
                             flexiblePrecisionRefObj = {};
                             flexiblePrecisionRefObj = {};
-                            flexibleRefField = JE.F(map_data_field[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
-                            precision_ref_data = dataObj[map_data_field.DataNodeName][flexibleRefField.DataSeq];
+                            flexibleRefField = JE.F(map_data_field.Precision.flexibleRefFieldID, $CURRENT_RPT);
+                            if (flexibleRefField) precision_ref_data = dataObj[map_data_field.DataNodeName][flexibleRefField.DataSeq];
                             for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
                             for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
                                 flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                 flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                             }
                             }
@@ -138,23 +149,23 @@ class JpcBillTabSrvClass{
                     } else {
                     } else {
                         if (page === 1) JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
                         if (page === 1) JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
                     }
                     }
-                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                    if (!(tab_field.Hidden)) {
                         let val = JpcFieldHelper.getValue(data_field, page - 1);
                         let val = JpcFieldHelper.getValue(data_field, page - 1);
                         let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, val, controls);
                         let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, val, controls);
-                        cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
+                        cellItem.area = JpcAreaHelper.outputArea(tab_field.area, band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
                         rst.push(cellItem);
                         rst.push(cellItem);
                     }
                     }
                 }
                 }
-                if (tab[JV.PROP_TEXT]) {
-                    rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, 1, 0));
+                if (tab.text) {
+                    rst.push(JpcTextHelper.outputText(tab.text, band, unitFactor, 1, 0, 1, 0, 1, 0));
                 }
                 }
-                if (tab[JV.PROP_TEXTS]) {
-                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
-                        rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, 1, 0));
+                if (tab.text_s) {
+                    for (let j = 0; j < tab.text_s.length; j++) {
+                        rst.push(JpcTextHelper.outputText(tab.text_s[j], band, unitFactor, 1, 0, 1, 0, 1, 0));
                     }
                     }
                 }
                 }
-                if (tab[JV.NODE_DISCRETE_INFO]) {
-                    rst = rst.concat(JpcDiscreteHelper.outputDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, pageStatus, page - 1, 1, 0, $CURRENT_RPT, customizeCfg));
+                if (tab.离散信息) {
+                    rst = rst.concat(JpcDiscreteHelper.outputDiscreteInfo(tab.离散信息, bands, dataObj, unitFactor, pageStatus, page - 1, 1, 0, $CURRENT_RPT, customizeCfg));
                 }
                 }
             }
             }
         }
         }

+ 158 - 144
report/src/core/jpc_cross_tab.ts

@@ -11,16 +11,29 @@ import JpcDiscreteHelper from './helper/jpc_helper_discrete';
 import JpcTextHelper from './helper/jpc_helper_text';
 import JpcTextHelper from './helper/jpc_helper_text';
 import JpcCommonOutputHelper from './helper/jpc_helper_common_output';
 import JpcCommonOutputHelper from './helper/jpc_helper_common_output';
 import JpcAreaHelper from './helper/jpc_helper_area';
 import JpcAreaHelper from './helper/jpc_helper_area';
-
+import {
+    Fields,
+    IDefProperties,
+    ICurrent_RPT,
+    ICustomizeCfg,
+    IBands,
+    IBandDetail,
+    IControlCollection,
+    IRptTpl,
+    IDataObj,
+    ICrossTab,
+    IGroupField
+} from '../interface/basic';
+import { IDataObjProps } from '../interface/enum'
 class JpcCrossTabClass {
 class JpcCrossTabClass {
-    dispValueIdxLst_Row: any[];
+    dispValueIdxLst_Row: number[][];
     dispValueIdxLst_Col: any[];
     dispValueIdxLst_Col: any[];
-    dispValueIdxLst_Content: any[];
-    dispSerialIdxLst_Row: any[];
+    dispValueIdxLst_Content: number[][][];
+    dispSerialIdxLst_Row: number[][];
     col_sum_fields_idx: any[];
     col_sum_fields_idx: any[];
-    col_sum_fields_value_total: any[];
+    col_sum_fields_value_total: any[][];
     dispSumValueLst_Col: any[];
     dispSumValueLst_Col: any[];
-    page_seg_map: any[];
+    page_seg_map: any;
     row_fields_idx: any[];
     row_fields_idx: any[];
     row_fields_adhoc_idx: any[];
     row_fields_adhoc_idx: any[];
     col_fields_idx: any[];
     col_fields_idx: any[];
@@ -33,7 +46,7 @@ class JpcCrossTabClass {
     crsOrient: number;
     crsOrient: number;
     pageStatusLst: any[];
     pageStatusLst: any[];
     paging_option: string;
     paging_option: string;
-    
+
     constructor() {
     constructor() {
         this.dispValueIdxLst_Row = [];
         this.dispValueIdxLst_Row = [];
         this.dispValueIdxLst_Col = [];
         this.dispValueIdxLst_Col = [];
@@ -56,23 +69,23 @@ class JpcCrossTabClass {
         this.pageStatusLst = [];
         this.pageStatusLst = [];
         this.paging_option = JV.PAGING_OPTION_NORMAL;
         this.paging_option = JV.PAGING_OPTION_NORMAL;
     };
     };
-    sorting(rptTpl: any, dataObj: any, dataSeq: any[], $CURRENT_RPT: any) {
+    sorting(rptTpl: IRptTpl, dataObj: IDataObj, dataSeq: number[][], $CURRENT_RPT: ICurrent_RPT) {
         let me = this;
         let me = this;
         //IMPORTANT: the data should be sorted in SQL/NoSQL level!
         //IMPORTANT: the data should be sorted in SQL/NoSQL level!
         me.sortedRowSequence = _SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW, me.row_fields_idx, $CURRENT_RPT);
         me.sortedRowSequence = _SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW, me.row_fields_idx, $CURRENT_RPT);
         _SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW_AD_HOC, me.row_fields_adhoc_idx, $CURRENT_RPT);
         _SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW_AD_HOC, me.row_fields_adhoc_idx, $CURRENT_RPT);
         me.sortedColSequence = _SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_COL, me.col_fields_idx, $CURRENT_RPT);
         me.sortedColSequence = _SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_COL, me.col_fields_idx, $CURRENT_RPT);
         me.sortedContentSequence = _SortForDisplayContent(rptTpl, me.sortedRowSequence, me.sortedColSequence, me.content_fields_idx);
         me.sortedContentSequence = _SortForDisplayContent(rptTpl, me.sortedRowSequence, me.sortedColSequence, me.content_fields_idx);
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.PROP_CROSS_FIELDS], null, me.col_sum_fields_idx, false);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl.交叉表_信息.交叉列合计.cross_field_s, null, me.col_sum_fields_idx, false);
         //pre-sum the data(for col sum display)
         //pre-sum the data(for col sum display)
-        let data_details = dataObj[JV.DATA_DETAIL_DATA],
+        let data_details = dataObj.detail_data,
             data_fields = [];
             data_fields = [];
         for (let i = 0; i < me.col_sum_fields_idx.length; i++) {
         for (let i = 0; i < me.col_sum_fields_idx.length; i++) {
             let data_field = null;
             let data_field = null;
             if (typeof me.col_sum_fields_idx[i] === 'object') {
             if (typeof me.col_sum_fields_idx[i] === 'object') {
-                let exField = JE.F(me.col_sum_fields_idx[i][JV.PROP_ID], $CURRENT_RPT);
+                let exField = JE.F(me.col_sum_fields_idx[i].ID, $CURRENT_RPT);
                 if (exField) {
                 if (exField) {
-                    data_field = exField[JV.PROP_AD_HOC_DATA];
+                    data_field = exField.data_field;
                 }
                 }
             } else {
             } else {
                 data_field = data_details[me.col_sum_fields_idx[i]];
                 data_field = data_details[me.col_sum_fields_idx[i]];
@@ -101,9 +114,9 @@ class JpcCrossTabClass {
 
 
         }
         }
     };
     };
-    preSetupPages(rptTpl: any, defProperties: any, option: any) {
+    preSetupPages(rptTpl: IRptTpl, defProperties: IDefProperties, option: string) {
         let me = this, rst = 0;
         let me = this, rst = 0;
-        me.paging_option = option||JV.PAGING_OPTION_NORMAL;
+        me.paging_option = option || JV.PAGING_OPTION_NORMAL;
         //1. original initialize
         //1. original initialize
         let maxRowRec = 1, maxColRec = 1, counterRowRec = 0, counterColRec = 0, pageIdx = 0, segCnt = me.sortedContentSequence.length;
         let maxRowRec = 1, maxColRec = 1, counterRowRec = 0, counterColRec = 0, pageIdx = 0, segCnt = me.sortedContentSequence.length;
         let pageStatus: boolean[] = [true, true, false, true, false, false, false, false];
         let pageStatus: boolean[] = [true, true, false, true, false, false, false, false];
@@ -114,8 +127,8 @@ class JpcCrossTabClass {
             maxRowRec = JpcCrossTabHelper.getMaxRowsPerPage(bands, rptTpl);
             maxRowRec = JpcCrossTabHelper.getMaxRowsPerPage(bands, rptTpl);
             maxColRec = JpcCrossTabHelper.getMaxColsPerPage(bands, rptTpl);
             maxColRec = JpcCrossTabHelper.getMaxColsPerPage(bands, rptTpl);
         }
         }
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.PROP_CROSS_FIELDS], null, me.row_extension_fields_idx, false);
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][JV.PROP_CROSS_FIELDS], null, me.row_sum_extension_fields_idx, false);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl.交叉表_信息.交叉行拓展.cross_field_s, null, me.row_extension_fields_idx, false);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl.交叉表_信息.交叉行拓展合计.cross_field_s, null, me.row_sum_extension_fields_idx, false);
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
             // 交叉表暂时不支持无限拓展
             // 交叉表暂时不支持无限拓展
         } else {
         } else {
@@ -140,7 +153,7 @@ class JpcCrossTabClass {
                 if (hasAdHocRow) rowSplitCnt++;
                 if (hasAdHocRow) rowSplitCnt++;
                 if (hasAdHocCol) colSplitCnt++;
                 if (hasAdHocCol) colSplitCnt++;
                 //2.2
                 //2.2
-                if (rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_CROSS_DISPLAY_ORDER] === JV.PAGE_ORIENTATION_H_FIRST) {
+                if (rptTpl.主信息.打印页面_信息.cross_display_order === JV.PAGE_ORIENTATION_H_FIRST) {
                     for (let rowIdx = 0; rowIdx < rowSplitCnt; rowIdx++) {
                     for (let rowIdx = 0; rowIdx < rowSplitCnt; rowIdx++) {
                         pageStatus[JV.STATUS_CROSS_ROW_END] = (rowIdx === (rowSplitCnt - 1));
                         pageStatus[JV.STATUS_CROSS_ROW_END] = (rowIdx === (rowSplitCnt - 1));
                         private_resetBandArea();
                         private_resetBandArea();
@@ -207,7 +220,7 @@ class JpcCrossTabClass {
         // bands = null;
         // bands = null;
         return rst;
         return rst;
     };
     };
-    outputAsPreviewPage(rptTpl: any, bands: any, controls: any, $CURRENT_RPT: any, customizeCfg: any) {
+    outputAsPreviewPage(rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) {
         let me = this, rst: any[] = [];
         let me = this, rst: any[] = [];
         let pageStatus: boolean[] = [true, true, true, true, true, true, true, true];
         let pageStatus: boolean[] = [true, true, true, true, true, true, true, true];
         me.pageStatusLst.push(pageStatus);
         me.pageStatusLst.push(pageStatus);
@@ -227,44 +240,44 @@ class JpcCrossTabClass {
         //5. 交叉行拓展合计
         //5. 交叉行拓展合计
         rst = rst.concat(me.outputPreviewSumTabExt(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, unitFactor));
         rst = rst.concat(me.outputPreviewSumTabExt(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, unitFactor));
         //6. 交叉列合计
         //6. 交叉列合计
-        rst = rst.concat(me.outputPreviewTabSum(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, JV.NODE_CROSS_COL_SUM, unitFactor));
+        rst = rst.concat(me.outputPreviewTabSum(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, '交叉列合计', unitFactor));
         //7. 离散
         //7. 离散
-        rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
+        rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl.交叉表_信息.离散信息, bands, unitFactor, pageStatus));
         return rst;
         return rst;
     };
     };
-    outputPreviewContent(rptTpl: any, bands: any, controls: any, $CURRENT_RPT: any, customizeCfg: any, maxRowRec: number, maxColRec: number, unitFactor: number) {
-        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, maxColRec, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT], unitFactor);
+    outputPreviewContent(rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxRowRec: number, maxColRec: number, unitFactor: number) {
+        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, maxColRec, rptTpl.交叉表_信息.交叉数据, unitFactor);
     };
     };
-    outputPreviewRowTab(rptTpl: any, bands: any, controls: any, $CURRENT_RPT: any, customizeCfg: any, maxRowRec: number, unitFactor: number) {
-        let rst = this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW], unitFactor);
-        rst = rst.concat(this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_AD_HOC], unitFactor));
+    outputPreviewRowTab(rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxRowRec: number, unitFactor: number) {
+        let rst = this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl.交叉表_信息.交叉行, unitFactor);
+        rst = rst.concat(this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl.交叉表_信息.交叉行AD_HOC, unitFactor));
         return rst;
         return rst;
     };
     };
-    outputPreviewColTab(rptTpl: any, bands: any, controls: any, $CURRENT_RPT: any, customizeCfg: any, maxColRec: number, unitFactor: number) {
-        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, 1, maxColRec, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL], unitFactor);
+    outputPreviewColTab(rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxColRec: number, unitFactor: number) {
+        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, 1, maxColRec, rptTpl.交叉表_信息.交叉列, unitFactor);
     };
     };
-    outputPreviewTabExt(rptTpl: any, bands: any, controls: any, $CURRENT_RPT: any, customizeCfg: any, maxColRec: number, unitFactor: number) {
+    outputPreviewTabExt(rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxColRec: number, unitFactor: number) {
         //交叉行拓展
         //交叉行拓展
-        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, 1, maxColRec, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT], unitFactor);
+        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, 1, maxColRec, rptTpl.交叉表_信息.交叉行拓展, unitFactor);
     };
     };
-    outputPreviewSumTabExt(rptTpl: any, bands: any, controls: any, $CURRENT_RPT: any, customizeCfg: any, unitFactor: number) {
+    outputPreviewSumTabExt(rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, unitFactor: number) {
         //交叉行拓展合计
         //交叉行拓展合计
-        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, 1, 1, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT], unitFactor);
+        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, 1, 1, rptTpl.交叉表_信息.交叉行拓展合计, unitFactor);
     };
     };
-    outputPreviewTabSum(rptTpl: any, bands: any, controls: any, $CURRENT_RPT: any, customizeCfg: any, maxRowRec: number, tabNodeName: string, unitFactor: number) {
-        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl[JV.NODE_CROSS_INFO][tabNodeName], unitFactor);
+    outputPreviewTabSum(rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxRowRec: number, tabNodeName: string, unitFactor: number) {
+        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl.交叉表_信息[tabNodeName], unitFactor);
     };
     };
-    private_OutputPreviewCommon(rptTpl: any, bands: any, controls: any, $CURRENT_RPT: any, customizeCfg: any, maxRowRec: number, maxColRec: number, tab: any, unitFactor: number) {
+    private_OutputPreviewCommon(rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxRowRec: number, maxColRec: number, tab: ICrossTab, unitFactor: number) {
         let me = this, rst = [];
         let me = this, rst = [];
-        let band = (tab)?bands[tab[JV.PROP_BAND_NAME]]:null;
+        let band = (tab) ? bands[tab.BandName] : null;
         if (band) {
         if (band) {
-            let tab_fields = tab[JV.PROP_CROSS_FIELDS];
+            let tab_fields = tab.cross_field_s;
             for (let rowIdx = 0; rowIdx < maxRowRec; rowIdx++) {
             for (let rowIdx = 0; rowIdx < maxRowRec; rowIdx++) {
                 for (let i = 0; i < tab_fields.length; i++) {
                 for (let i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[i];
                     let tab_field = tab_fields[i];
-                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                    if (!(tab_field.Hidden)) {
                         for (let colIdx = 0; colIdx < maxColRec; colIdx++) {
                         for (let colIdx = 0; colIdx < maxColRec; colIdx++) {
-                            if (tab_field[JV.PROP_IS_SERIAL]) {
+                            if (tab_field.isSerial) {
                                 rst.push(me.outputTabField(band, tab_field, [rowIdx + 1], 0, -1, maxRowRec, rowIdx, maxColRec, colIdx, unitFactor, false, controls));
                                 rst.push(me.outputTabField(band, tab_field, [rowIdx + 1], 0, -1, maxRowRec, rowIdx, maxColRec, colIdx, unitFactor, false, controls));
                             } else {
                             } else {
                                 rst.push(me.outputTabField(band, tab_field, null, -1, -1, maxRowRec, rowIdx, maxColRec, colIdx, unitFactor, false, controls));
                                 rst.push(me.outputTabField(band, tab_field, null, -1, -1, maxRowRec, rowIdx, maxColRec, colIdx, unitFactor, false, controls));
@@ -272,10 +285,10 @@ class JpcCrossTabClass {
                         }
                         }
                     }
                     }
                 }
                 }
-                if (tab[JV.PROP_TEXTS]) {
-                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
+                if (tab.text_s) {
+                    for (let j = 0; j < tab.text_s.length; j++) {
                         for (let colIdx = 0; colIdx < maxColRec; colIdx++) {
                         for (let colIdx = 0; colIdx < maxColRec; colIdx++) {
-                            rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, maxRowRec, rowIdx, maxColRec, colIdx, 1, 0));
+                            rst.push(JpcTextHelper.outputText(tab.text_s[j], band, unitFactor, maxRowRec, rowIdx, maxColRec, colIdx, 1, 0));
                         }
                         }
                     }
                     }
                 }
                 }
@@ -283,7 +296,7 @@ class JpcCrossTabClass {
         }
         }
         return rst;
         return rst;
     };
     };
-    outputAsSimpleJSONPage(rptTpl: any, dataObj: any, page: number, bands: any, controls: any, $CURRENT_RPT: any, customizeCfg: any) {
+    outputAsSimpleJSONPage(rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) {
         let me = this, rst: any = [], tabRstLst = [];
         let me = this, rst: any = [], tabRstLst = [];
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
@@ -308,7 +321,7 @@ class JpcCrossTabClass {
             tabRstLst.push(me.outputTabExt(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
             tabRstLst.push(me.outputTabExt(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
             tabRstLst.push(me.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls, $CURRENT_RPT, customizeCfg));
             tabRstLst.push(me.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls, $CURRENT_RPT, customizeCfg));
             //2.5 Discrete
             //2.5 Discrete
-            tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT, customizeCfg));
+            tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl.交叉表_信息.离散信息, bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT, customizeCfg));
         }
         }
         for (let i = 0; i < tabRstLst.length; i++) {
         for (let i = 0; i < tabRstLst.length; i++) {
             rst = rst.concat(tabRstLst[i]);
             rst = rst.concat(tabRstLst[i]);
@@ -316,18 +329,18 @@ class JpcCrossTabClass {
         }
         }
         return rst;
         return rst;
     };
     };
-    outputTabSum(rptTpl: any, dataObj: any, page: number, bands: any, unitFactor: number, tabNodeName: string, controls: any, $CURRENT_RPT: any, customizeCfg: any) {
+    outputTabSum(rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, tabNodeName: string, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) {
         let me = this, rst: any = [],
         let me = this, rst: any = [],
-            tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName],
-            band = bands[tab[JV.PROP_BAND_NAME]];
+            tab = rptTpl.交叉表_信息[tabNodeName],
+            band = bands[tab.BandName];
         if (band) {
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
+            if (pageStatus[(band.DisplayType) as number] === true) {
+                let tab_fields = tab.cross_field_s;
                 for (let i = 0; i < me.dispSumValueLst_Col[page - 1].length; i++) {
                 for (let i = 0; i < me.dispSumValueLst_Col[page - 1].length; i++) {
                     if (i === 0) {
                     if (i === 0) {
                         for (let tfIdx = 0; tfIdx < tab_fields.length; tfIdx++) {
                         for (let tfIdx = 0; tfIdx < tab_fields.length; tfIdx++) {
-                            let map_data_field = JE.F(tab_fields[tfIdx][JV.PROP_FIELD_ID], $CURRENT_RPT);
+                            let map_data_field = JE.F(tab_fields[tfIdx].FieldID, $CURRENT_RPT);
                             JpcFieldHelper.resetFormat(tab_fields[tfIdx], map_data_field, customizeCfg);
                             JpcFieldHelper.resetFormat(tab_fields[tfIdx], map_data_field, customizeCfg);
                         }
                         }
                     }
                     }
@@ -336,7 +349,7 @@ class JpcCrossTabClass {
                             let tab_field = tab_fields[j];
                             let tab_field = tab_fields[j];
                             let val = me.dispSumValueLst_Col[page - 1][i][j];
                             let val = me.dispSumValueLst_Col[page - 1][i][j];
                             let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, val, controls);
                             let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, val, controls);
-                            cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, me.dispSumValueLst_Col[page - 1].length, i, 1, 0, 1, 0, true, false);
+                            cellItem.area = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, me.dispSumValueLst_Col[page - 1].length, i, 1, 0, 1, 0, true, false);
                             rst.push(cellItem);
                             rst.push(cellItem);
                         }
                         }
                     } else {
                     } else {
@@ -351,7 +364,7 @@ class JpcCrossTabClass {
                             let tab_field = tab_fields[j];
                             let tab_field = tab_fields[j];
                             let val = null;
                             let val = null;
                             let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, val, controls);
                             let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, val, controls);
-                            cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, me.dispSumValueLst_Col[page - 1].length, i, 1, 0, 1, 0, true, false);
+                            cellItem.area = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, me.dispSumValueLst_Col[page - 1].length, i, 1, 0, 1, 0, true, false);
                             rst.push(cellItem);
                             rst.push(cellItem);
                         }
                         }
                     }
                     }
@@ -360,41 +373,41 @@ class JpcCrossTabClass {
         }
         }
         return rst;
         return rst;
     };
     };
-    outputTabExt(rptTpl: any, dataObj: any, page: number, bands: any, unitFactor: number, controls: any, $CURRENT_RPT: any, customizeCfg: any) {
+    outputTabExt(rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) {
         let me = this, rst: any = [], firstTextOutput = true,
         let me = this, rst: any = [], firstTextOutput = true,
-            tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+            tab = rptTpl.交叉表_信息.交叉行拓展;
+        let band = bands[tab.BandName];
         if (band) {
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.PROP_CROSS_FIELDS],
-                    data_details = dataObj[JV.DATA_DETAIL_DATA],
+            if (pageStatus[(band.DisplayType) as number] === true) {
+                let tab_fields = tab.cross_field_s,
+                    data_details = dataObj[IDataObjProps.detail_data],
                     valuesIdx = me.dispValueIdxLst_Col[page - 1];
                     valuesIdx = me.dispValueIdxLst_Col[page - 1];
                 for (let i = 0; i < me.row_extension_fields_idx.length; i++) {
                 for (let i = 0; i < me.row_extension_fields_idx.length; i++) {
                     let tab_field = tab_fields[i];
                     let tab_field = tab_fields[i];
                     let data_field = null;
                     let data_field = null;
-                    let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                    let map_data_field = JE.F(tab_field.FieldID, $CURRENT_RPT);
                     if (typeof me.row_extension_fields_idx[i] !== 'object') {
                     if (typeof me.row_extension_fields_idx[i] !== 'object') {
                         data_field = data_details[me.row_extension_fields_idx[i]];
                         data_field = data_details[me.row_extension_fields_idx[i]];
                     } else {
                     } else {
                         if (map_data_field) {
                         if (map_data_field) {
-                            data_field = map_data_field[JV.PROP_AD_HOC_DATA];
+                            data_field = map_data_field.data_field;
                         }
                         }
                     }
                     }
 
 
-                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                    if (!(tab_field.Hidden)) {
                         let cols = valuesIdx.length;
                         let cols = valuesIdx.length;
                         for (let colIdx = 0; colIdx < cols; colIdx++) {
                         for (let colIdx = 0; colIdx < cols; colIdx++) {
                             if (colIdx === 0) JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
                             if (colIdx === 0) JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
                             rst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[colIdx], -1, 1, 0, cols, colIdx, unitFactor, false, controls));
                             rst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[colIdx], -1, 1, 0, cols, colIdx, unitFactor, false, controls));
                             //2. output texts if has
                             //2. output texts if has
                             if (firstTextOutput) {
                             if (firstTextOutput) {
-                                if (tab[JV.PROP_TEXT]) {
-                                    rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
+                                if (tab.text) {
+                                    rst.push(JpcTextHelper.outputText(tab.text, band, unitFactor, 1, 0, cols, colIdx, 1, 0));
                                 }
                                 }
-                                if (tab[JV.PROP_TEXTS]) {
-                                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
-                                        rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
+                                if (tab.text_s) {
+                                    for (let j = 0; j < tab.text_s.length; j++) {
+                                        rst.push(JpcTextHelper.outputText(tab.text_s[j], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
                                     }
                                     }
                                 }
                                 }
                             }
                             }
@@ -406,26 +419,26 @@ class JpcCrossTabClass {
         }
         }
         return rst;
         return rst;
     };
     };
-    outputSumTabExt(rptTpl: any, dataObj: any, page: number, bands: any, unitFactor: number, segIdx: number, controls: any, $CURRENT_RPT: any, customizeCfg: any) {
+    outputSumTabExt(rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, segIdx: number, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) {
         let me = this, rst = [],
         let me = this, rst = [],
-            tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+            tab = rptTpl.交叉表_信息.交叉行拓展合计;
+        let band = bands[tab.BandName];
         if (band) {
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true && pageStatus[JV.STATUS_CROSS_ROW_END] === true) {
-                let tab_fields = tab[JV.PROP_CROSS_FIELDS],
-                    data_details = dataObj[JV.DATA_DETAIL_DATA],
+            if (pageStatus[(band.DisplayType) as number] === true && pageStatus[6] === true) {
+                let tab_fields = tab.cross_field_s,
+                    data_details = dataObj[IDataObjProps.detail_data],
                     data_fields = [];
                     data_fields = [];
                 for (let i = 0; i < me.row_sum_extension_fields_idx.length; i++) {
                 for (let i = 0; i < me.row_sum_extension_fields_idx.length; i++) {
                     // let data_field = data_details[me.row_sum_extension_fields_idx[i]];
                     // let data_field = data_details[me.row_sum_extension_fields_idx[i]];
                     let tab_field = tab_fields[i];
                     let tab_field = tab_fields[i];
                     let data_field = null;
                     let data_field = null;
-                    let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                    let map_data_field = JE.F(tab_field.FieldID, $CURRENT_RPT);
                     if (typeof me.row_sum_extension_fields_idx[i] !== 'object') {
                     if (typeof me.row_sum_extension_fields_idx[i] !== 'object') {
                         data_field = data_details[me.row_sum_extension_fields_idx[i]];
                         data_field = data_details[me.row_sum_extension_fields_idx[i]];
                     } else {
                     } else {
                         if (map_data_field) {
                         if (map_data_field) {
-                            data_field = map_data_field[JV.PROP_AD_HOC_DATA];
+                            data_field = map_data_field.data_field;
                         }
                         }
                     }
                     }
                     JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
                     JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
@@ -444,58 +457,58 @@ class JpcCrossTabClass {
                 //4. output
                 //4. output
                 for (let di = 0; di < tab_fields.length; di++) {
                 for (let di = 0; di < tab_fields.length; di++) {
                     let tab_field = tab_fields[di];
                     let tab_field = tab_fields[di];
-                    if (!tab_field[JV.PROP_HIDDEN]) {
+                    if (!tab_field.Hidden) {
                         let val = rowGrandTotal[di];
                         let val = rowGrandTotal[di];
                         let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, val, controls);
                         let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, val, controls);
-                        cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
+                        cellItem.area = JpcAreaHelper.outputArea(tab_field.area, band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
                         rst.push(cellItem);
                         rst.push(cellItem);
                     }
                     }
                 }
                 }
                 //output texts if has
                 //output texts if has
-                if (tab[JV.PROP_TEXT]) {
-                    rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, 1, 0));
+                if (tab.text) {
+                    rst.push(JpcTextHelper.outputText(tab.text, band, unitFactor, 1, 0, 1, 0, 1, 0));
                 }
                 }
-                if (tab[JV.PROP_TEXTS]) {
-                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
-                        rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, 1, 0));
+                if (tab.text_s) {
+                    for (let j = 0; j < tab.text_s.length; j++) {
+                        rst.push(JpcTextHelper.outputText(tab.text_s[j], band, unitFactor, 1, 0, 1, 0, 1, 0));
                     }
                     }
                 }
                 }
             }
             }
         }
         }
         return rst;
         return rst;
     };
     };
-    outputContent(rptTpl: any, dataObj: any, page: number, bands: any, unitFactor: number, controls: any, $CURRENT_RPT: any, customizeCfg: any) {
+    outputContent(rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) {
         let me = this, rst: any = [];
         let me = this, rst: any = [];
-        let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        let tab = rptTpl.交叉表_信息.交叉数据;
+        let band = bands[tab.BandName];
         if (band) {
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
-                let data_details = dataObj[JV.DATA_DETAIL_DATA];
+            if (pageStatus[(band.DisplayType) as number] === true) {
+                let tab_fields = tab.cross_field_s;
+                let data_details = dataObj[IDataObjProps.detail_data];
                 let contentValuesIdx = me.dispValueIdxLst_Content[page - 1];
                 let contentValuesIdx = me.dispValueIdxLst_Content[page - 1];
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 for (let i = 0; i < tab_fields.length; i++) {
                 for (let i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[i];
                     let tab_field = tab_fields[i];
                     let data_field = null;
                     let data_field = null;
-                    let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                    let map_data_field = JE.F(tab_field.FieldID, $CURRENT_RPT);
                     if (typeof me.content_fields_idx[i] !== 'object') {
                     if (typeof me.content_fields_idx[i] !== 'object') {
                         data_field = data_details[me.content_fields_idx[i]];
                         data_field = data_details[me.content_fields_idx[i]];
                     } else {
                     } else {
                         if (map_data_field) {
                         if (map_data_field) {
-                            data_field = map_data_field[JV.PROP_AD_HOC_DATA];
+                            data_field = map_data_field.data_field;
                         }
                         }
                     }
                     }
-                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                    if (!(tab_field.Hidden)) {
                         let rows = contentValuesIdx.length;
                         let rows = contentValuesIdx.length;
                         for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
                         for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
                             let cols = contentValuesIdx[rowIdx].length;
                             let cols = contentValuesIdx[rowIdx].length;
                             for (let colIdx = 0; colIdx < cols; colIdx++) {
                             for (let colIdx = 0; colIdx < cols; colIdx++) {
-                                if (map_data_field && map_data_field[JV.PROP_PRECISION] && map_data_field.flexiblePrecisionRefObj) {
+                                if (map_data_field && map_data_field.Precision && map_data_field.flexiblePrecisionRefObj && map_data_field.Precision.flexibleRefFieldID) {
                                     if (flexiblePrecisionRefObj === null) {
                                     if (flexiblePrecisionRefObj === null) {
                                         flexiblePrecisionRefObj = {};
                                         flexiblePrecisionRefObj = {};
-                                        flexibleRefField = JE.F(map_data_field[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
-                                        precision_ref_data = dataObj[map_data_field.DataNodeName][flexibleRefField.DataSeq];
+                                        flexibleRefField = JE.F(map_data_field.Precision.flexibleRefFieldID, $CURRENT_RPT);
+                                        if (flexibleRefField && flexibleRefField.DataSeq) precision_ref_data = dataObj[map_data_field.DataNodeName][flexibleRefField.DataSeq];
                                         for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
                                         for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
                                             flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                             flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                         }
                                         }
@@ -513,37 +526,37 @@ class JpcCrossTabClass {
         }
         }
         return rst;
         return rst;
     };
     };
-    outputColTab(rptTpl: any, dataObj: any, page: number, bands: any, unitFactor: number, controls: any, $CURRENT_RPT: any, customizeCfg: any) {
+    outputColTab(rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) {
         let me = this, rst: any = [], firstTextOutput = true;
         let me = this, rst: any = [], firstTextOutput = true;
-        let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        let tab = rptTpl.交叉表_信息.交叉列;
+        let band = bands[tab.BandName];
         if (band) {
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
-                let data_details = dataObj[JV.DATA_DETAIL_DATA];
+            if (pageStatus[(band.DisplayType) as number] === true) {
+                let tab_fields = tab.cross_field_s;
+                let data_details = dataObj[IDataObjProps.detail_data];
                 let valuesIdx = me.dispValueIdxLst_Col[page - 1];
                 let valuesIdx = me.dispValueIdxLst_Col[page - 1];
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 for (let i = 0; i < me.col_fields_idx.length; i++) {
                 for (let i = 0; i < me.col_fields_idx.length; i++) {
                     let tab_field = tab_fields[i];
                     let tab_field = tab_fields[i];
-                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                    if (!(tab_field.Hidden)) {
                         let mergedRst = [];
                         let mergedRst = [];
                         let data_field = null;
                         let data_field = null;
-                        let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                        let map_data_field = JE.F(tab_field.FieldID, $CURRENT_RPT);
                         if (typeof me.col_fields_idx[i] !== 'object') {
                         if (typeof me.col_fields_idx[i] !== 'object') {
                             data_field = data_details[me.col_fields_idx[i]];
                             data_field = data_details[me.col_fields_idx[i]];
                         } else {
                         } else {
                             if (map_data_field) {
                             if (map_data_field) {
-                                data_field = map_data_field[JV.PROP_AD_HOC_DATA];
+                                data_field = map_data_field.data_field;
                             }
                             }
                         }
                         }
                         let cols = valuesIdx.length;
                         let cols = valuesIdx.length;
                         for (let colIdx = 0; colIdx < cols; colIdx++) {
                         for (let colIdx = 0; colIdx < cols; colIdx++) {
-                            if (map_data_field && map_data_field[JV.PROP_PRECISION] && map_data_field.flexiblePrecisionRefObj) {
+                            if (map_data_field && map_data_field.Precision && map_data_field.flexiblePrecisionRefObj && map_data_field.Precision.flexibleRefFieldID) {
                                 if (flexiblePrecisionRefObj === null) {
                                 if (flexiblePrecisionRefObj === null) {
                                     flexiblePrecisionRefObj = {};
                                     flexiblePrecisionRefObj = {};
-                                    flexibleRefField = JE.F(map_data_field[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
-                                    precision_ref_data = dataObj[map_data_field.DataNodeName][flexibleRefField.DataSeq];
+                                    flexibleRefField = JE.F(map_data_field.Precision.flexibleRefFieldID, $CURRENT_RPT);
+                                    if (flexibleRefField && flexibleRefField.DataSeq) precision_ref_data = dataObj[map_data_field.DataNodeName][flexibleRefField.DataSeq];
                                     for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
                                     for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
                                         flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                         flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                     }
                                     }
@@ -556,25 +569,25 @@ class JpcCrossTabClass {
                             //rst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[colIdx], -1, 1, 0, cols, colIdx, unitFactor, false, controls));
                             //rst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[colIdx], -1, 1, 0, cols, colIdx, unitFactor, false, controls));
                             //2. output texts
                             //2. output texts
                             if (firstTextOutput) {
                             if (firstTextOutput) {
-                                if (tab[JV.PROP_TEXT]) {
-                                    // mergedRst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
-                                    rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
+                                if (tab.text) {
+                                    // mergedRst.push(JpcTextHelper.outputText(tab.text, band, unitFactor, 1, 0, cols, colIdx, 1, 0));
+                                    rst.push(JpcTextHelper.outputText(tab.text, band, unitFactor, 1, 0, cols, colIdx, 1, 0));
                                 }
                                 }
-                                if (tab[JV.PROP_TEXTS]) {
-                                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
-                                        // mergedRst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
-                                        rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
+                                if (tab.text_s) {
+                                    for (let j = 0; j < tab.text_s.length; j++) {
+                                        // mergedRst.push(JpcTextHelper.outputText(tab.text_s[j], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
+                                        rst.push(JpcTextHelper.outputText(tab.text_s[j], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
                                     }
                                     }
                                 }
                                 }
                             }
                             }
                         }
                         }
                         firstTextOutput = false;
                         firstTextOutput = false;
                         //判断是否需要合并
                         //判断是否需要合并
-                        if (tab_field[JV.PROP_IS_MERGE] && mergedRst.length > 1) {
+                        if (tab_field.isMerge && mergedRst.length > 1) {
                             let lastCell = mergedRst[mergedRst.length - 1];
                             let lastCell = mergedRst[mergedRst.length - 1];
                             for (let mergeIdx = mergedRst.length - 2; mergeIdx >= 0; mergeIdx--) {
                             for (let mergeIdx = mergedRst.length - 2; mergeIdx >= 0; mergeIdx--) {
-                                if (lastCell[JV.PROP_VALUE] === mergedRst[mergeIdx][JV.PROP_VALUE]) {
-                                    mergedRst[mergeIdx][JV.PROP_AREA][JV.PROP_RIGHT] = lastCell[JV.PROP_AREA][JV.PROP_RIGHT];
+                                if (lastCell.Value === mergedRst[mergeIdx].Value) {
+                                    mergedRst[mergeIdx].area.Right = lastCell.area.Right;
                                     mergedRst.splice(mergeIdx + 1, 1);
                                     mergedRst.splice(mergeIdx + 1, 1);
                                 }
                                 }
                                 lastCell = mergedRst[mergeIdx];
                                 lastCell = mergedRst[mergeIdx];
@@ -587,37 +600,37 @@ class JpcCrossTabClass {
         }
         }
         return rst;
         return rst;
     };
     };
-    outputRowTabCommon(rptTpl: any, dataObj: any, page: number, bands: any, tabStr: string, rowFieldsIdxArr: any[], unitFactor: number, controls: any, $CURRENT_RPT: any, customizeCfg: any) {
+    outputRowTabCommon(rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, tabStr: string, rowFieldsIdxArr: any[], unitFactor: number, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) {
         let me = this, rst = [];
         let me = this, rst = [];
-        let tab = rptTpl[JV.NODE_CROSS_INFO][tabStr];
-        let band = (tab)?bands[tab[JV.PROP_BAND_NAME]]:null;
+        let tab = rptTpl.交叉表_信息[tabStr];
+        let band = (tab) ? bands[tab.BandName] : null;
         if (band) {
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
-                let data_details = dataObj[JV.DATA_DETAIL_DATA];
+            if (pageStatus[(band.DisplayType) as number] === true) {
+                let tab_fields = tab.cross_field_s;
+                let data_details = dataObj[IDataObjProps.detail_data];
                 let valuesIdx = me.dispValueIdxLst_Row[page - 1];
                 let valuesIdx = me.dispValueIdxLst_Row[page - 1];
                 let serialsIdx = me.dispSerialIdxLst_Row[page - 1];
                 let serialsIdx = me.dispSerialIdxLst_Row[page - 1];
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 for (let i = 0; i < rowFieldsIdxArr.length; i++) {
                 for (let i = 0; i < rowFieldsIdxArr.length; i++) {
                     let tab_field = tab_fields[i];
                     let tab_field = tab_fields[i];
-                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                    if (!(tab_field.Hidden)) {
                         let data_field = null;
                         let data_field = null;
-                        let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                        let map_data_field = JE.F(tab_field.FieldID, $CURRENT_RPT);
                         if (typeof rowFieldsIdxArr[i] !== 'object') {
                         if (typeof rowFieldsIdxArr[i] !== 'object') {
                             data_field = data_details[rowFieldsIdxArr[i]];
                             data_field = data_details[rowFieldsIdxArr[i]];
                         } else {
                         } else {
                             if (map_data_field) {
                             if (map_data_field) {
-                                data_field = map_data_field[JV.PROP_AD_HOC_DATA];
+                                data_field = map_data_field.data_field;
                             }
                             }
                         }
                         }
                         let rows = valuesIdx.length;
                         let rows = valuesIdx.length;
                         for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
                         for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
-                            if (map_data_field && map_data_field[JV.PROP_PRECISION] && map_data_field.flexiblePrecisionRefObj) {
+                            if (map_data_field && map_data_field.Precision && map_data_field.flexiblePrecisionRefObj && map_data_field.Precision.flexibleRefFieldID) {
                                 if (flexiblePrecisionRefObj === null) {
                                 if (flexiblePrecisionRefObj === null) {
                                     flexiblePrecisionRefObj = {};
                                     flexiblePrecisionRefObj = {};
-                                    flexibleRefField = JE.F(map_data_field[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
-                                    precision_ref_data = dataObj[map_data_field.DataNodeName][flexibleRefField.DataSeq];
+                                    flexibleRefField = JE.F(map_data_field.Precision.flexibleRefFieldID, $CURRENT_RPT);
+                                    if (flexibleRefField && flexibleRefField.DataSeq) precision_ref_data = dataObj[map_data_field.DataNodeName][flexibleRefField.DataSeq];
                                     for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
                                     for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
                                         flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                         flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                     }
                                     }
@@ -634,9 +647,10 @@ class JpcCrossTabClass {
         }
         }
         return rst;
         return rst;
     };
     };
-    outputTabField(band: any, tab_field: any, data_field: any, valueIdx: number, serialIdx: number, rows: number, rowIdx: number, cols: number, colIdx: number, unitFactor: number, isRow: boolean, controls: any) {
+    //暂定
+    outputTabField(band: IBandDetail, tab_field: Fields, data_field: any, valueIdx: number, serialIdx: number, rows: number, rowIdx: number, cols: number, colIdx: number, unitFactor: number, isRow: boolean, controls: IControlCollection) {
         let rst = null;
         let rst = null;
-        if (isRow === true && tab_field[JV.PROP_IS_SERIAL] && tab_field[JV.PROP_IS_SERIAL] === true) {
+        if (isRow === true && tab_field.isSerial && tab_field.isSerial === true) {
             if (serialIdx >= 0) {
             if (serialIdx >= 0) {
                 rst = JpcCommonOutputHelper.createCommonOutput(tab_field, serialIdx + 1, null);
                 rst = JpcCommonOutputHelper.createCommonOutput(tab_field, serialIdx + 1, null);
             } else rst = JpcCommonOutputHelper.createCommonOutput(tab_field, "", controls);
             } else rst = JpcCommonOutputHelper.createCommonOutput(tab_field, "", controls);
@@ -645,14 +659,14 @@ class JpcCrossTabClass {
         }
         }
         //position
         //position
         if (isRow === true) {
         if (isRow === true) {
-            rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, 1, 0, true, false);
+            rst.area = JpcAreaHelper.outputArea(tab_field.area, band, unitFactor, rows, rowIdx, cols, colIdx, 1, 0, true, false);
         } else {
         } else {
-            rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, 1, 0, false, false);
+            rst.area = JpcAreaHelper.outputArea(tab_field.area, band, unitFactor, rows, rowIdx, cols, colIdx, 1, 0, false, false);
         }
         }
         return rst;
         return rst;
     };
     };
 };
 };
-function _addTabValue(tabValuedIdxLst: any[], sortedSequence: any[], segIdx: number, preRec: number, nextRec: number, dispSerialIdxLst: any, sorted_sum_value_Lst: any, rst_sum_value_Lst: any) {
+function _addTabValue(tabValuedIdxLst: number[][], sortedSequence: number[][][], segIdx: number, preRec: number, nextRec: number, dispSerialIdxLst: any, sorted_sum_value_Lst: any, rst_sum_value_Lst: any) {
     if (tabValuedIdxLst) {
     if (tabValuedIdxLst) {
         let serial1stTier = null;
         let serial1stTier = null;
         if (dispSerialIdxLst) serial1stTier = [];
         if (dispSerialIdxLst) serial1stTier = [];
@@ -714,9 +728,9 @@ function _addTabValue(tabValuedIdxLst: any[], sortedSequence: any[], segIdx: num
     }
     }
 };
 };
 
 
-function _addContentValue(dispValueIdxLst_Content: any[], sortedContentSequence: any, segIdx: number, counterRowRec: number, maxRowRec: number, counterColRec: number, maxColRec: number, page_seg_map: any[], pageIdx: number) {
+function _addContentValue(dispValueIdxLst_Content: number[][][], sortedContentSequence: string[][], segIdx: number, counterRowRec: number, maxRowRec: number, counterColRec: number, maxColRec: number, page_seg_map: [number, number][], pageIdx: number) {
     if (dispValueIdxLst_Content !== null) {
     if (dispValueIdxLst_Content !== null) {
-        page_seg_map.push([pageIdx,segIdx]);
+        page_seg_map.push([pageIdx, segIdx]);
         let arrContents: any[] = [];
         let arrContents: any[] = [];
         if (sortedContentSequence !== null) {
         if (sortedContentSequence !== null) {
             let arrAllContent = sortedContentSequence[segIdx];
             let arrAllContent = sortedContentSequence[segIdx];
@@ -744,15 +758,15 @@ function _addContentValue(dispValueIdxLst_Content: any[], sortedContentSequence:
     }
     }
 };
 };
 
 
-function _SortAndOptimize(rptTpl: any, dataObj: any, dataSeq: any[], sortTab: string, rstFieldsIdx: any[], $CURRENT_RPT: any) {
+function _SortAndOptimize(rptTpl: IRptTpl, dataObj: IDataObj, dataSeq: number[][], sortTab: string, rstFieldsIdx: any[], $CURRENT_RPT: ICurrent_RPT) {
     let result = [];
     let result = [];
-    let tab = rptTpl[JV.NODE_CROSS_INFO][sortTab];
+    let tab = rptTpl.交叉表_信息[sortTab];
     if (tab) {
     if (tab) {
         let sIDX = 0;
         let sIDX = 0;
         //1. prepare and sort by tab-field
         //1. prepare and sort by tab-field
         let fields: any[] = [];
         let fields: any[] = [];
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab[JV.PROP_CROSS_FIELDS], fields, rstFieldsIdx, false);
-        let data_details = dataObj[JV.DATA_DETAIL_DATA];
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab.cross_field_s, fields, rstFieldsIdx, false);
+        let data_details = dataObj[IDataObjProps.detail_data];
         JpcCrossTabHelper.sortTabFields(fields, rstFieldsIdx, data_details, dataSeq, $CURRENT_RPT);
         JpcCrossTabHelper.sortTabFields(fields, rstFieldsIdx, data_details, dataSeq, $CURRENT_RPT);
         //2. distinguish sort tab fields value
         //2. distinguish sort tab fields value
         let b1 = false;
         let b1 = false;
@@ -767,9 +781,9 @@ function _SortAndOptimize(rptTpl: any, dataObj: any, dataSeq: any[], sortTab: st
                     for (let k = 0; k < rstFieldsIdx.length; k++) {
                     for (let k = 0; k < rstFieldsIdx.length; k++) {
                         if (fields[k].hasOwnProperty(JV.TAB_FIELD_PROP_SORT)) {
                         if (fields[k].hasOwnProperty(JV.TAB_FIELD_PROP_SORT)) {
                             //只有被选择了作为排序字段的才进入排序及优化
                             //只有被选择了作为排序字段的才进入排序及优化
-                            if (typeof(rstFieldsIdx[k]) === 'object') {
-                                let map_data_field = JE.F(rstFieldsIdx[k][JV.PROP_ID], $CURRENT_RPT);
-                                if (map_data_field[JV.PROP_AD_HOC_DATA][dataSeq[i][j - 1]] !== map_data_field[JV.PROP_AD_HOC_DATA][dataSeq[i][j]]) {
+                            if (typeof (rstFieldsIdx[k]) === 'object') {
+                                let map_data_field = JE.F(rstFieldsIdx[k].ID, $CURRENT_RPT);
+                                if (map_data_field && map_data_field.data_field[dataSeq[i][j - 1]] !== map_data_field.data_field[dataSeq[i][j]]) {
                                     b1 = true;
                                     b1 = true;
                                     break;
                                     break;
                                 }
                                 }
@@ -798,15 +812,15 @@ function _SortAndOptimize(rptTpl: any, dataObj: any, dataSeq: any[], sortTab: st
     return result;
     return result;
 }
 }
 
 
-function _SortForDisplayContent(rptTpl: any, rowSeq: any[], colSeq: any[], rstFieldsIdx: any[]){
+function _SortForDisplayContent(rptTpl: IRptTpl, rowSeq: number[][][], colSeq: number[][][], rstFieldsIdx: any[]) {
     let result = [];
     let result = [];
-    let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
+    let tab = rptTpl.交叉表_信息.交叉数据;
     if (tab) {
     if (tab) {
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab[JV.PROP_CROSS_FIELDS], [], rstFieldsIdx, false);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab.cross_field_s, [], rstFieldsIdx, false);
     }
     }
     for (let i = 0; i < rowSeq.length; i++) {
     for (let i = 0; i < rowSeq.length; i++) {
         let rl = rowSeq[i], cl = colSeq[i];
         let rl = rowSeq[i], cl = colSeq[i];
-        let ds: any[] = [];
+        let ds: number[][] = [];
         //1. initialize to blank value index
         //1. initialize to blank value index
         for (let j = 0; j < rl.length; j++) {
         for (let j = 0; j < rl.length; j++) {
             ds.push([]);
             ds.push([]);

+ 21 - 19
report/src/core/jpc_data.ts

@@ -2,43 +2,45 @@
 
 
 import JV from './jpc_value_define';
 import JV from './jpc_value_define';
 import jpc_common_helper from './helper/jpc_helper_common';
 import jpc_common_helper from './helper/jpc_helper_common';
+import { IDataObj, IRptTpl } from '../interface/basic';
+import { IDataObjProps } from '../interface/enum';
 
 
 const JpcData = {
 const JpcData = {
     createNew() {
     createNew() {
         let JpcDataRst = {
         let JpcDataRst = {
             dataSeq: [],
             dataSeq: [],
             exDataSeq: [],
             exDataSeq: [],
-            analyzeData(rptTpl: any, dataObj: any) {
+            analyzeData(rptTpl: IRptTpl, dataObj: IDataObj) {
                 let me = this;
                 let me = this;
-                let _analyse = function(MASTER_FIELD_STR: string, DETAIL_FIELD_STR: string, MASTER_DATA_STR: string, DETAIL_DATA_STR: string, dataSeqArr: any) {
+                let _analyse = function (MASTER_FIELD_STR: string, DETAIL_FIELD_STR: string, MASTER_DATA_STR: string, DETAIL_DATA_STR: string, dataSeqArr: any) {
                     //1. get ID fields
                     //1. get ID fields
                     let masterIDs = [];
                     let masterIDs = [];
-                    if (rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR]) {
-                        for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR].length; i++) {
-                            let mstFieldObj = rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR][i];
-                            if (jpc_common_helper.getBoolean(mstFieldObj[JV.PROP_IS_ID])) {
-                                masterIDs.push({"idx": i, "seq": mstFieldObj[JV.PROP_ID_SEQ]});
+                    if (rptTpl.指标_数据_映射[MASTER_FIELD_STR]) {
+                        for (let i = 0; i < rptTpl.指标_数据_映射[MASTER_FIELD_STR].length; i++) {
+                            let mstFieldObj = rptTpl.指标_数据_映射[MASTER_FIELD_STR][i];
+                            if (jpc_common_helper.getBoolean(mstFieldObj.isID)) {
+                                masterIDs.push({ "idx": i, "seq": mstFieldObj.IDSeq });
                             }
                             }
                         }
                         }
                     }
                     }
                     let detailIDs = [];
                     let detailIDs = [];
-                    if (rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR]) {
-                        for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR].length; i++) {
-                            let dtlFieldObj = rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR][i];
-                            if (jpc_common_helper.getBoolean(dtlFieldObj[JV.PROP_IS_ID])) {
-                                detailIDs.push({"idx": i, "seq": dtlFieldObj[JV.PROP_ID_SEQ]});
+                    if (rptTpl.指标_数据_映射[DETAIL_FIELD_STR]) {
+                        for (let i = 0; i < rptTpl.指标_数据_映射[DETAIL_FIELD_STR].length; i++) {
+                            let dtlFieldObj = rptTpl.指标_数据_映射[DETAIL_FIELD_STR][i];
+                            if (jpc_common_helper.getBoolean(dtlFieldObj.isID)) {
+                                detailIDs.push({ "idx": i, "seq": dtlFieldObj.IDSeq });
                             }
                             }
                         }
                         }
                     }
                     }
                     //2. sort the ID fields
                     //2. sort the ID fields
                     if (masterIDs.length > 1) {
                     if (masterIDs.length > 1) {
-                        masterIDs.sort(function(a, b) {
-                            return 1*a["seq"] - 1*b["seq"];
+                        masterIDs.sort(function (a, b) {
+                            return 1 * a["seq"] - 1 * b["seq"];
                         })
                         })
                     }
                     }
                     if (detailIDs.length > 1) {
                     if (detailIDs.length > 1) {
-                        detailIDs.sort(function(a, b) {
-                            return 1*a["seq"] - 1*b["seq"];
+                        detailIDs.sort(function (a, b) {
+                            return 1 * a["seq"] - 1 * b["seq"];
                         })
                         })
                     }
                     }
                     //3. prepare data sequence
                     //3. prepare data sequence
@@ -102,9 +104,9 @@ const JpcData = {
                     }
                     }
                 };
                 };
                 if ((rptTpl) && (dataObj)) {
                 if ((rptTpl) && (dataObj)) {
-                    _analyse(JV.NODE_MASTER_FIELDS, JV.NODE_DETAIL_FIELDS, JV.DATA_MASTER_DATA, JV.DATA_DETAIL_DATA, me.dataSeq);
-                    if (rptTpl[JV.NODE_FLOW_INFO_EX]) {
-                        _analyse(JV.NODE_MASTER_FIELDS_EX, JV.NODE_DETAIL_FIELDS_EX, JV.DATA_MASTER_DATA_EX, JV.DATA_DETAIL_DATA_EX, me.exDataSeq);
+                    _analyse('主数据指标_集合', '从数据指标_集合', IDataObjProps.master_data, IDataObjProps.detail_data, me.dataSeq);
+                    if (rptTpl.流水式表_拓展信息) {
+                        _analyse('主数据指标_拓展集合', '从数据指标_拓展集合', IDataObjProps.master_data_ex, IDataObjProps.detail_data_ex, me.exDataSeq);
                     }
                     }
                 }
                 }
             }
             }

+ 13 - 10
report/src/core/jpc_event.ts

@@ -3,29 +3,32 @@
  */
  */
 'use strict';
 'use strict';
 
 
+import { IRptTpl } from '../interface/basic';
+import { IEventType } from '../interface/enum';
 import JV from './jpc_value_define';
 import JV from './jpc_value_define';
 
 
 const JpcEvent = {
 const JpcEvent = {
-    createNew(rptTpl: any) {
+    createNew(rptTpl: IRptTpl) {
         let rst = {
         let rst = {
-            [JV.EVENT_TYPE[JV.EVENT_IDX_GRP_ON_CREATE]]: null,
-            [JV.EVENT_TYPE[JV.EVENT_IDX_FLOW_CONTENT_ON_CREATE]]: null
+            GRP_ON_CREATE: {},          //bylish
+            FLOW_CONTENT_ON_CREATE: {}  //bylish
         };
         };
-        if (rptTpl[JV.NODE_EVENTS]) {
-            for (let i = 0; i < rptTpl[JV.NODE_EVENTS].length; i++) {
-                let item = {...rptTpl[JV.NODE_EVENTS][i]};
+        if (rptTpl.事件_集合) {
+            for (let i = 0; i < rptTpl.事件_集合.length; i++) {
+                let item = { ...rptTpl.事件_集合[i] };
                 // let propArr = Object.getOwnPropertyNames(rptTpl[JV.NODE_EVENTS][i]);
                 // let propArr = Object.getOwnPropertyNames(rptTpl[JV.NODE_EVENTS][i]);
                 // for (let key of propArr) {
                 // for (let key of propArr) {
                 //     item[key] = rptTpl[JV.NODE_EVENTS][i][key];
                 //     item[key] = rptTpl[JV.NODE_EVENTS][i][key];
                 // }
                 // }
-                switch (JV.EVENT_TYPE.indexOf(item.type)) {
+                const event_type = [IEventType.GRP_ON_CREATE, IEventType.FLOW_CONTENT_ON_CREATE]
+                switch (event_type.indexOf(item.type)) {
                     case JV.EVENT_IDX_GRP_ON_CREATE:
                     case JV.EVENT_IDX_GRP_ON_CREATE:
-                        rst[JV.EVENT_TYPE[JV.EVENT_IDX_GRP_ON_CREATE]] = item;
+                        rst.FLOW_CONTENT_ON_CREATE = item;
                         break;
                         break;
                     case JV.EVENT_IDX_FLOW_CONTENT_ON_CREATE:
                     case JV.EVENT_IDX_FLOW_CONTENT_ON_CREATE:
-                        rst[JV.EVENT_TYPE[JV.EVENT_IDX_FLOW_CONTENT_ON_CREATE]] = item;
+                        rst.FLOW_CONTENT_ON_CREATE = item;
                         break;
                         break;
-                    default :
+                    default:
                         break;
                         break;
                 }
                 }
                 //rst.push(item);
                 //rst.push(item);

+ 204 - 170
report/src/core/jpc_ex.ts

@@ -1,5 +1,5 @@
-'use strict';
 
 
+import JE from './jpc_rte'; //Important: for self-define function execution purpose
 import JV from './jpc_value_define';
 import JV from './jpc_value_define';
 import JpcBand from './jpc_band';
 import JpcBand from './jpc_band';
 import JpcFlowTab from './jpc_flow_tab';
 import JpcFlowTab from './jpc_flow_tab';
@@ -12,38 +12,43 @@ import JpcFunc from './jpc_function';
 import JpcEvent from './jpc_event';
 import JpcEvent from './jpc_event';
 import JpcData from './jpc_data';
 import JpcData from './jpc_data';
 import JpcCommonHelper from './helper/jpc_helper_common';
 import JpcCommonHelper from './helper/jpc_helper_common';
-import $JE from './jpc_rte'; //Important: for self-define function execution purpose
+import useReportDate from '../public/ReportDate'
 
 
-class JpcExClass{
-    flowTab: any;
-    flowTabEx: any;
-    billTab: any;
-    crossTab: any;
+import { IDefProperties, IFormula, IParams, ICurrent_RPT, ICurrent_DATA, ICustomizeCfg, ITargetFields, IRptTpl, IDataObj, IBands, IControlCollection, IStyles, BorderStyle, IFontSubCollection, IControlSubCollection, IPreviewPage, IRstPage, IMergeBand } from '../interface/basic'
+import { IFlowTabClass, IBillTabClass, ICostTabClass } from '../interface/classType';
+import { IControlProps, IFontProps, IPagingOption } from '../interface/enum';
+import { Key } from 'readline';
+
+class JpcExClass {
+    flowTab!: IFlowTabClass;
+    flowTabEx!: IFlowTabClass;
+    billTab!: IBillTabClass;
+    crossTab!: ICostTabClass;
     isFollowMode: boolean = false;
     isFollowMode: boolean = false;
     totalPages: number = 0;
     totalPages: number = 0;
     exTotalPages: number = 0;
     exTotalPages: number = 0;
-    runTimePageData: any;
-    fields: any;
-    params: any;
-    formulas: any;
+    runTimePageData: { currentPage?: number };
+    fields: ITargetFields;
+    params: IParams;
+    formulas: IFormula[];
     events: any;
     events: any;
 
 
-    constructor(rptTpl: any) {
-        if (rptTpl[JV.NODE_FLOW_INFO]) {
+    constructor(rptTpl: IRptTpl) {
+        if (rptTpl.流水式表_信息) {
             this.flowTab = new JpcFlowTab(false);
             this.flowTab = new JpcFlowTab(false);
             this.isFollowMode = false;
             this.isFollowMode = false;
         }
         }
-        if (rptTpl[JV.NODE_FLOW_INFO_EX]) {
+        if (rptTpl.流水式表_拓展信息) {
             this.flowTabEx = new JpcFlowTab(true);
             this.flowTabEx = new JpcFlowTab(true);
-            if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.PROP_FLOW_EX_DISPLAY_MODE] === JV.DISPLAY_MODE_FOLLOW) {
+            if (rptTpl.流水式表_拓展信息.流水拓展显示模式 === '紧随模式') {
                 this.isFollowMode = true;
                 this.isFollowMode = true;
             }
             }
         }
         }
-        if (rptTpl[JV.NODE_BILL_INFO]) {
+        if (rptTpl.账单式表_信息) {
             this.billTab = new JpcBillTab();
             this.billTab = new JpcBillTab();
         }
         }
         //let dt1 = new Date();
         //let dt1 = new Date();
-        if (rptTpl[JV.NODE_CROSS_INFO]) {
+        if (rptTpl.交叉表_信息) {
             this.crossTab = new JpcCrossTab();
             this.crossTab = new JpcCrossTab();
         }
         }
         this.runTimePageData = {};
         this.runTimePageData = {};
@@ -53,13 +58,15 @@ class JpcExClass{
         this.events = JpcEvent.createNew(rptTpl);
         this.events = JpcEvent.createNew(rptTpl);
     };
     };
 
 
-    analyzeData(rptTpl: any, dataObj: any, defProperties: any, option: string, outputType: any) {
-        let me = this, dftPagingOption = option||JV.PAGING_OPTION_NORMAL;
+    analyzeData(rptTpl: IRptTpl, dataObj: IDataObj, defProperties: IDefProperties, option: string, outputType: string) {
+        let me = this, dftPagingOption = option || IPagingOption.normal;
         //1. data object
         //1. data object
         let dataHelper: any = JpcData.createNew();
         let dataHelper: any = JpcData.createNew();
-        me.executeFormulas(JV.RUN_TYPE_BEFORE_ANALYZING, rptTpl, dataObj, me); //在分析前运行,主要是增加灵活性,比如:重新编排数据的主从关系
+
+        // 主要是通过计算rptTpl参数里面的 指标_数据_映射 属性中的公式,赋值于dataObj中的相对应(根据)的属性
+        me.executeFormulas('before_analyzing', rptTpl, dataObj, me); //在分析前运行,主要是增加灵活性,比如:重新编排数据的主从关系
         if (me.crossTab) {
         if (me.crossTab) {
-            me.executeFormulas(JV.RUN_TYPE_BEFORE_PAGING, rptTpl, dataObj, me);
+            me.executeFormulas('before_paging', rptTpl, dataObj, me);
             dataHelper.analyzeData(rptTpl, dataObj);
             dataHelper.analyzeData(rptTpl, dataObj);
             me.crossTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
             me.crossTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
         } else {
         } else {
@@ -73,23 +80,28 @@ class JpcExClass{
                     me.flowTabEx.sorting(rptTpl, dataObj, dataHelper.exDataSeq.slice(0), me);
                     me.flowTabEx.sorting(rptTpl, dataObj, dataHelper.exDataSeq.slice(0), me);
                 }
                 }
             }
             }
+
             if (me.billTab) {
             if (me.billTab) {
-                me.billTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
+                // 先记录下账单式表_信息.账单式表_数据中的数据相对应于从 数据指标_集合 中的相对应的数组序号,后面便于计算
+                // me.billTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
+                //edit by lish,方法中需要的参数只有一个,但是这里存入了4个
+                me.billTab.sorting(rptTpl);
+
             }
             }
-            //let dt2 = new Date();
-            //alert(dt2 - dt1);
             //3. formulas
             //3. formulas
-            me.executeFormulas(JV.RUN_TYPE_BEFORE_PAGING, rptTpl, dataObj, me);
+            // 主要是通过计算rptTpl参数里面的 指标_数据_映射 属性中的公式,赋值于dataObj中的相对应(根据)的属性
+            me.executeFormulas('before_paging', rptTpl, dataObj, me);
         }
         }
         //4. paging
         //4. paging
+        //获取总页数
         me.paging(rptTpl, dataObj, defProperties, dftPagingOption);
         me.paging(rptTpl, dataObj, defProperties, dftPagingOption);
         //alert('analyzeData was completed!');
         //alert('analyzeData was completed!');
         //for garbage collection:
         //for garbage collection:
-        // dataHelper = null;
+        dataHelper = null;
     };
     };
-
-    paging(rptTpl: any, dataObj: any, defProperties: any, option: string) {
-        let me = this, dftPagingOption = option||JV.PAGING_OPTION_NORMAL;
+    //获取总页数
+    paging(rptTpl: IRptTpl, dataObj: IDataObj, defProperties: IDefProperties, option: string) {
+        let me = this, dftPagingOption = option || IPagingOption.normal;
         if (me.flowTab) {
         if (me.flowTab) {
             if (me.isFollowMode) {
             if (me.isFollowMode) {
                 me.totalPages = me.flowTab.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption, me, me.flowTabEx);
                 me.totalPages = me.flowTab.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption, me, me.flowTabEx);
@@ -103,24 +115,36 @@ class JpcExClass{
             }
             }
         } else if (me.crossTab) {
         } else if (me.crossTab) {
             //me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties, dftPagingOption);
             //me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties, dftPagingOption);
-            me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties, JV.PAGING_OPTION_NORMAL); //infinity对交叉表来说无意义
+            me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties, IPagingOption.normal); //infinity对交叉表来说无意义
         } else if (me.billTab) {
         } else if (me.billTab) {
             me.totalPages = me.billTab.paging(rptTpl, dataObj);
             me.totalPages = me.billTab.paging(rptTpl, dataObj);
         }
         }
     };
     };
 
 
-    executeFormulas(runType: string, $CURRENT_TEMPLATE: any, $CURRENT_DATA: any, $CURRENT_RPT: any) {
+    //根据步骤,对formulas中的计算式进行处理,并赋值到相应属性中
+    executeFormulas(runType: string, $CURRENT_TEMPLATE: IRptTpl, $CURRENT_DATA: IDataObj, $CURRENT_RPT: ICurrent_RPT) {
         let execFmlMe = this;
         let execFmlMe = this;
         for (let execFmlIdx = 0; execFmlIdx < execFmlMe.formulas.length; execFmlIdx++) {
         for (let execFmlIdx = 0; execFmlIdx < execFmlMe.formulas.length; execFmlIdx++) {
             //remark: 搞这么复杂的变量名是为了防止与表达式起冲突(如循环变量i,j,k,容易造成变量冲突且不容易看出问题)
             //remark: 搞这么复杂的变量名是为了防止与表达式起冲突(如循环变量i,j,k,容易造成变量冲突且不容易看出问题)
-            if (execFmlMe.formulas[execFmlIdx][JV.PROP_RUN_TYPE] === runType) {
-                let expression = execFmlMe.formulas[execFmlIdx][JV.PROP_EXPRESSION];
+            if (execFmlMe.formulas[execFmlIdx].run_type === runType) {
+                let expression = execFmlMe.formulas[execFmlIdx].expression;
                 if (expression) {
                 if (expression) {
+                    // 计算式集合,目前是放置打印信息的,用于配置属性的计算
                     let $ME = execFmlMe.formulas[execFmlIdx];
                     let $ME = execFmlMe.formulas[execFmlIdx];
                     // console.log("current expression idx: " + execFmlIdx);
                     // console.log("current expression idx: " + execFmlIdx);
                     // console.log(expression);
                     // console.log(expression);
+
                     try {
                     try {
-                        eval(expression);
+                        const $JE = JE;
+                        const ReportDate = useReportDate;
+                        console.log(expression);
+                        //临时处理
+                        if (expression.indexOf('Date()') > -1) {
+                            eval(expression.replace('Date()', 'ReportDate()'));
+                        } else {
+                            eval(expression);
+                        }
+
                     } catch (ex) {
                     } catch (ex) {
                         console.log(ex);
                         console.log(ex);
                     }
                     }
@@ -129,56 +153,57 @@ class JpcExClass{
         }
         }
     };
     };
 
 
-    outputAsPreviewPage(rptTpl: any, defProperties: any) {
+    outputAsPreviewPage(rptTpl: IRptTpl, defProperties: IDefProperties) {
         let me = this, rst: any = {};
         let me = this, rst: any = {};
-        rst[JV.NODE_CONTROL_COLLECTION] = private_buildDftControls(rptTpl, (defProperties === null)?null:defProperties.ctrls);
-        rst[JV.NODE_STYLE_COLLECTION] = private_buildDftStyles(rptTpl, (defProperties === null)?null:defProperties.styles);
-        rst[JV.NODE_FONT_COLLECTION] = private_buildDftFonts(rptTpl, (defProperties === null)?null:defProperties.fonts);
-        rst[JV.NODE_PAGE_INFO] = {};
-        rst[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME];
-        rst[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE] = JpcCommonHelper.getPageSize(rptTpl);
-        rst[JV.NODE_PAGE_INFO][JV.NODE_MARGINS] = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS];
+        rst.control_collection = private_buildDftControls(rptTpl, (defProperties === null) ? null : defProperties.ctrls);
+        rst.style_collection = private_buildDftStyles(rptTpl, (defProperties === null) ? null : defProperties.styles);
+        rst.font_collection = private_buildDftFonts(rptTpl, (defProperties === null) ? null : defProperties.fonts);
+        rst.打印页面_信息 = {};
+        rst.打印页面_信息.报表名称 = rptTpl.主信息.报表名称;
+        rst.打印页面_信息.纸张宽高 = JpcCommonHelper.getPageSize(rptTpl);
+        rst.打印页面_信息.页边距 = rptTpl.主信息.页边距;
         rst.items = [];
         rst.items = [];
         let bands = JpcBand.createNew(rptTpl, defProperties);
         let bands = JpcBand.createNew(rptTpl, defProperties);
         try {
         try {
             function getPageMergeBorder() {
             function getPageMergeBorder() {
-                let mergeRst: any = null;
-                if (bands[JV.BAND_PROP_MERGE_BAND]) {
-                    let mergedBand = bands[JV.BAND_PROP_MERGE_BAND];
-                    mergeRst = {};
-                    mergeRst[JV.PROP_LEFT] = parseInt(mergedBand[JV.PROP_LEFT].toFixed(0));
-                    mergeRst[JV.PROP_RIGHT] = parseInt(mergedBand[JV.PROP_RIGHT].toFixed(0));
-                    mergeRst[JV.PROP_TOP] = parseInt(mergedBand[JV.PROP_TOP].toFixed(0));
-                    mergeRst[JV.PROP_BOTTOM] = parseInt(mergedBand[JV.PROP_BOTTOM].toFixed(0));
+                let mergeRst = {} as IMergeBand;
+                if (bands.MergeBand) {
+                    let mergedBand = bands.MergeBand;
+                    mergeRst.Left = parseInt(mergedBand.Left.toFixed(0));
+                    mergeRst.Right = parseInt(mergedBand.Right.toFixed(0));
+                    mergeRst.Top = parseInt(mergedBand.Top.toFixed(0));
+                    mergeRst.Bottom = parseInt(mergedBand.Bottom.toFixed(0));
                 }
                 }
-                return mergeRst;
+                return null;
             }
             }
             //1.
             //1.
-            let rstPage: any = {};
-            rstPage[JV.PROP_PAGE_SEQ] = 1;
+            let rstPage: IRstPage = {};
+            rstPage.page_seq = 1;
             if (me.flowTab) {
             if (me.flowTab) {
-                rstPage[JV.PROP_CELLS] = me.flowTab.outputAsPreviewPage(rptTpl, bands, rst[JV.NODE_CONTROL_COLLECTION], me);
+                rstPage.cells = me.flowTab.outputAsPreviewPage(rptTpl, bands, rst.control_collection, me);
             } else if (me.crossTab) {
             } else if (me.crossTab) {
-                rstPage[JV.PROP_CELLS] = me.crossTab.outputAsPreviewPage(rptTpl, bands, rst[JV.NODE_CONTROL_COLLECTION], me);
+                rstPage.cells = me.crossTab.outputAsPreviewPage(rptTpl, bands, rst.control_collection, me, null as unknown as ICustomizeCfg);//方法中定义了5个参数,这里只传进去了4个参数,故加一个参数,by lish
             } else if (me.billTab) {
             } else if (me.billTab) {
-                rstPage[JV.PROP_CELLS] = me.billTab.outputAsPreviewPage(rptTpl, bands, rst[JV.NODE_CONTROL_COLLECTION], me);
+                rstPage.cells = me.billTab.outputAsPreviewPage(rptTpl, bands, rst.control_collection, me);
             }
             }
             let pageMergeBorder = getPageMergeBorder();
             let pageMergeBorder = getPageMergeBorder();
             if (pageMergeBorder) {
             if (pageMergeBorder) {
-                rstPage[JV.PROP_PAGE_MERGE_BORDER] = pageMergeBorder;
+                rstPage.page_merge_border = pageMergeBorder;
             }
             }
             rst.items.push(rstPage);
             rst.items.push(rstPage);
             //2.
             //2.
-            if (bands[JV.BAND_PROP_MERGE_BAND]) {
-                let mergedBand: any = {}, band = bands[JV.BAND_PROP_MERGE_BAND];
-                mergedBand[JV.PROP_LEFT] = parseInt(band[JV.PROP_LEFT].toFixed(0));
-                mergedBand[JV.PROP_RIGHT] = parseInt(band[JV.PROP_RIGHT].toFixed(0));
-                mergedBand[JV.PROP_TOP] = parseInt(band[JV.PROP_TOP].toFixed(0));
-                mergedBand[JV.PROP_BOTTOM] = parseInt(band[JV.PROP_BOTTOM].toFixed(0));
-                mergedBand[JV.BAND_PROP_STYLE] = band[JV.BAND_PROP_STYLE];
-                rst[JV.BAND_PROP_MERGE_BAND] = mergedBand;
+            if (bands.MergeBand) {
+                let band = bands.MergeBand;
+                let mergedBand :IMergeBand= {
+                    Left : parseInt(band.Left.toFixed(0)),
+                    Right: parseInt(band.Right.toFixed(0)),
+                    Top : parseInt(band.Top.toFixed(0)),
+                    Bottom :parseInt(band.Bottom.toFixed(0)),
+                    style: band.style,
+                } ;
+                rst.MergeBand = mergedBand;
             }
             }
-        } catch(exception) {
+        } catch (exception) {
             console.log(exception);
             console.log(exception);
         } finally {
         } finally {
             bands = null;
             bands = null;
@@ -186,34 +211,39 @@ class JpcExClass{
         return rst;
         return rst;
     };
     };
 
 
-    outputAsSimpleJSONPageArray(rptTpl: any, dataObj: any, startPage: number, endPage: number, defProperties: any, customizeCfg: any) {
+    outputAsSimpleJSONPageArray(rptTpl: IRptTpl, dataObj: IDataObj, startPage: number, endPage: number, defProperties: IDefProperties, customizeCfg: ICustomizeCfg) {
         let me = this, rst: any = {};
         let me = this, rst: any = {};
         if ((startPage > 0) && (startPage <= endPage) && (endPage <= me.totalPages)) {
         if ((startPage > 0) && (startPage <= endPage) && (endPage <= me.totalPages)) {
-            rst[JV.NODE_CONTROL_COLLECTION] = private_buildDftControls(rptTpl, (defProperties === null)?null:defProperties.ctrls);
-            rst[JV.NODE_STYLE_COLLECTION] = private_buildDftStyles(rptTpl, (defProperties === null)?null:defProperties.styles);
-            rst[JV.NODE_FONT_COLLECTION] = private_buildDftFonts(rptTpl, (defProperties === null)?null:defProperties.fonts);
-            rst[JV.NODE_PAGE_INFO] = {};
-            rst[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME];
-            rst[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE] = JpcCommonHelper.getPageSize(rptTpl);
-            rst[JV.NODE_PAGE_INFO][JV.NODE_MARGINS] = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS];
+            rst.control_collection = private_buildDftControls(rptTpl, (defProperties === null) ? null : defProperties.ctrls);
+            rst.style_collection = private_buildDftStyles(rptTpl, (defProperties === null) ? null : defProperties.styles);
+            rst.font_collection = private_buildDftFonts(rptTpl, (defProperties === null) ? null : defProperties.fonts);
+            rst.打印页面_信息 = {};
+            rst.打印页面_信息.报表名称 = rptTpl.主信息.报表名称;
+            rst.打印页面_信息.纸张宽高 = JpcCommonHelper.getPageSize(rptTpl);
+            rst.打印页面_信息.页边距 = rptTpl.主信息.页边距;
             rst.items = [];
             rst.items = [];
+            //初始化band(每个大板块的属性)
             let bands = JpcBand.createNew(rptTpl, defProperties);
             let bands = JpcBand.createNew(rptTpl, defProperties);
             try {
             try {
                 for (let page = startPage; page <= endPage; page++) {
                 for (let page = startPage; page <= endPage; page++) {
                     me.runTimePageData.currentPage = page;
                     me.runTimePageData.currentPage = page;
-                    me.executeFormulas(JV.RUN_TYPE_BEFORE_OUTPUT, rptTpl, dataObj, me);
-                    rst.items.push(me.outputAsSimpleJSONPage(rptTpl, dataObj, bands, page, rst[JV.NODE_CONTROL_COLLECTION], customizeCfg));
+                    me.executeFormulas('before_output', rptTpl, dataObj, me);
+                    console.log('=======================');
+                    rst.items.push(me.outputAsSimpleJSONPage(rptTpl, dataObj, bands, page, rst.control_collection, customizeCfg));
                 }
                 }
-                if (bands[JV.BAND_PROP_MERGE_BAND]) {
-                    let mergedBand: any = {}, band = bands[JV.BAND_PROP_MERGE_BAND];
-                    mergedBand[JV.PROP_LEFT] = parseInt(band[JV.PROP_LEFT].toFixed(0));
-                    mergedBand[JV.PROP_RIGHT] = parseInt(band[JV.PROP_RIGHT].toFixed(0));
-                    mergedBand[JV.PROP_TOP] = parseInt(band[JV.PROP_TOP].toFixed(0));
-                    mergedBand[JV.PROP_BOTTOM] = parseInt(band[JV.PROP_BOTTOM].toFixed(0));
-                    mergedBand[JV.BAND_PROP_STYLE] = band[JV.BAND_PROP_STYLE];
-                    rst[JV.BAND_PROP_MERGE_BAND] = mergedBand;
+                if (bands.MergeBand) {
+                    let band = bands.MergeBand;
+                    let mergedBand: IMergeBand = {
+                        Left : parseInt(band.Left.toFixed(0)),
+                        Right: parseInt(band.Right.toFixed(0)),
+                        Top : parseInt(band.Top.toFixed(0)),
+                        Bottom : parseInt(band.Bottom.toFixed(0)),
+                        style : band.style,
+                    };
+                   
+                    rst.MergeBand = mergedBand;
                 }
                 }
-            } catch(exception) {
+            } catch (exception) {
                 console.log(exception);
                 console.log(exception);
             } finally {
             } finally {
                 bands = null;
                 bands = null;
@@ -222,23 +252,24 @@ class JpcExClass{
         return rst;
         return rst;
     };
     };
 
 
-    outputAsSimpleJSONPage(rptTpl: any, dataObj: any, bands: any, page: number, controls: any, customizeCfg: any) {
+    outputAsSimpleJSONPage(rptTpl: IRptTpl, dataObj: IDataObj, bands: IBands, page: number, controls: IControlCollection, customizeCfg: ICustomizeCfg) {
         let me = this, rst: any = null;
         let me = this, rst: any = null;
         function getPageMergeBorder() {
         function getPageMergeBorder() {
-            let mergeRst: any = null;
-            if (bands[JV.BAND_PROP_MERGE_BAND]) {
-                let mergedBand = bands[JV.BAND_PROP_MERGE_BAND];
-                mergeRst = {};
-                mergeRst[JV.PROP_LEFT] = parseInt(mergedBand[JV.PROP_LEFT].toFixed(0));
-                mergeRst[JV.PROP_RIGHT] = parseInt(mergedBand[JV.PROP_RIGHT].toFixed(0));
-                mergeRst[JV.PROP_TOP] = parseInt(mergedBand[JV.PROP_TOP].toFixed(0));
-                mergeRst[JV.PROP_BOTTOM] = parseInt(mergedBand[JV.PROP_BOTTOM].toFixed(0));
+            // let mergeRst = null;
+            let mergeRst  = {} as IMergeBand;
+            if (bands.MergeBand) {
+                let mergedBand = bands.MergeBand;
+                mergeRst.Left = parseInt(mergedBand.Left.toFixed(0));
+                mergeRst.Right = parseInt(mergedBand.Right.toFixed(0));
+                mergeRst.Top = parseInt(mergedBand.Top.toFixed(0));
+                mergeRst.Bottom = parseInt(mergedBand.Bottom.toFixed(0));
             }
             }
-            return mergeRst;
+            // return mergeRst;
+            return false;
         }
         }
         if (me.totalPages >= page) {
         if (me.totalPages >= page) {
             rst = {};
             rst = {};
-            rst[JV.PROP_PAGE_SEQ] = page;
+            rst.page_seq = page;
             //rst.cells = [];
             //rst.cells = [];
             let adHocMergePos: any = null;
             let adHocMergePos: any = null;
             if (me.flowTab) {
             if (me.flowTab) {
@@ -246,26 +277,26 @@ class JpcExClass{
                     if (me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY) {
                     if (me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY) {
                         adHocMergePos = {};
                         adHocMergePos = {};
                     }
                     }
-                    rst[JV.PROP_CELLS] = me.flowTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, adHocMergePos, me, customizeCfg);
+                    rst.cells = me.flowTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, adHocMergePos, me, customizeCfg);
                     if (adHocMergePos) {
                     if (adHocMergePos) {
-                        adHocMergePos[JV.NODE_PAGE_SIZE] = JpcCommonHelper.getPageSize(rptTpl);
-                        rst[JV.PAGE_SPECIAL_MERGE_POS] = adHocMergePos;
+                        adHocMergePos.纸张宽高 = JpcCommonHelper.getPageSize(rptTpl);
+                        rst.page_merge_pos = adHocMergePos;
                     }
                     }
 
 
                 } else {
                 } else {
                     if (!me.isFollowMode) {
                     if (!me.isFollowMode) {
-                        rst[JV.PROP_CELLS] = me.flowTabEx.outputAsSimpleJSONPage(rptTpl, dataObj, page - (me.totalPages - me.exTotalPages), bands, controls, adHocMergePos, me, customizeCfg);
+                        rst.cells = me.flowTabEx.outputAsSimpleJSONPage(rptTpl, dataObj, page - (me.totalPages - me.exTotalPages), bands, controls, adHocMergePos, me, customizeCfg);
                     }
                     }
                 }
                 }
             } else if (me.crossTab) {
             } else if (me.crossTab) {
-                rst[JV.PROP_CELLS] = me.crossTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me, customizeCfg);
+                rst.cells = me.crossTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me, customizeCfg);
             } else if (me.billTab) {
             } else if (me.billTab) {
-                rst[JV.PROP_CELLS] = me.billTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me, customizeCfg);
+                rst.cells = me.billTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me, customizeCfg);
             }
             }
-            if (!(me.flowTab && me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY)) {
+            if (!(me.flowTab && me.flowTab.paging_option === IPagingOption.infinity)) {
                 let pageMergeBorder = getPageMergeBorder();
                 let pageMergeBorder = getPageMergeBorder();
                 if (pageMergeBorder) {
                 if (pageMergeBorder) {
-                    rst[JV.PROP_PAGE_MERGE_BORDER] = pageMergeBorder;
+                    rst.page_merge_border = pageMergeBorder;
                 }
                 }
             }
             }
         }
         }
@@ -273,25 +304,28 @@ class JpcExClass{
     };
     };
 }
 }
 
 
-function private_buildDftItems(rptTpl: any, dftCollection: any, propArray: any, nodeName: any) {
+//暂定
+const private_buildDftItems = (
+    rptTpl: any,
+    dftCollection: IControlSubCollection[] | IFontSubCollection[] | null,
+    nodeName: string
+) => {
     const rst: any = {};
     const rst: any = {};
     if (dftCollection) {
     if (dftCollection) {
         for (let i = 0; i < dftCollection.length; i++) {
         for (let i = 0; i < dftCollection.length; i++) {
-            const item: any = {};
-            for (let j = 0; j < propArray.length; j++) {
-                item[propArray[j]] = dftCollection[i][propArray[j]];
-            }
-            rst[dftCollection[i][JV.PROP_ID]] = item;
+            const { ID, ...dftCollectionProps } = dftCollection[i];
+            rst[dftCollection[i].ID] = { ...dftCollectionProps };
         }
         }
-        if (rptTpl && rptTpl[nodeName] && rptTpl[nodeName].length > 0) {
+        const propArray = (nodeName === 'control_collection') ? JV.CONTROL_PROPS : JV.FONT_PROPS;
+        if (rptTpl && rptTpl[nodeName] && rptTpl[nodeName].length) {
             for (let i = 0; i < rptTpl[nodeName].length; i++) {
             for (let i = 0; i < rptTpl[nodeName].length; i++) {
                 const rptDftItem = rptTpl[nodeName][i];
                 const rptDftItem = rptTpl[nodeName][i];
-                if (rst[rptDftItem[JV.PROP_ID]] === undefined) {
+                if (rst[rptDftItem.ID] === undefined) {
                     const item: any = {};
                     const item: any = {};
                     for (let j = 0; j < propArray.length; j++) {
                     for (let j = 0; j < propArray.length; j++) {
                         item[propArray[j]] = rptDftItem[propArray[j]];
                         item[propArray[j]] = rptDftItem[propArray[j]];
                     }
                     }
-                    rst[rptDftItem[JV.PROP_ID]] = item;
+                    rst[rptDftItem.ID] = item;
                 }
                 }
             }
             }
         }
         }
@@ -299,95 +333,95 @@ function private_buildDftItems(rptTpl: any, dftCollection: any, propArray: any,
     return rst;
     return rst;
 }
 }
 
 
-function private_buildDftControls(rptTpl: any, dftControlCollection: any) {
-    return private_buildDftItems(rptTpl, dftControlCollection, JV.CONTROL_PROPS, JV.NODE_CONTROL_COLLECTION);
+function private_buildDftControls(rptTpl: IRptTpl, dftControlCollection: IControlSubCollection[] | null) {
+    return private_buildDftItems(rptTpl, dftControlCollection, 'control_collection');
 }
 }
 
 
-function private_buildDftFonts(rptTpl: any, dftFontCollection: any) {
-    return private_buildDftItems(rptTpl, dftFontCollection, JV.FONT_PROPS, JV.NODE_FONT_COLLECTION);
+function private_buildDftFonts(rptTpl: IRptTpl, dftFontCollection: IFontSubCollection[] | null) {
+    return private_buildDftItems(rptTpl, dftFontCollection, 'font_collection');
 }
 }
 
 
-function private_buildDftStyles(rptTpl: any, dftStyleCollection: any) {
+function private_buildDftStyles(rptTpl: IRptTpl, dftStyleCollection: IStyles[] | null) {
     const rst: any = {};
     const rst: any = {};
-    function private_CopyBorder(destItem: any, srcItem: any) {
-        destItem[JV.PROP_LINE_WEIGHT] = srcItem[JV.PROP_LINE_WEIGHT];
-        destItem[JV.PROP_DASH_STYLE] = srcItem[JV.PROP_DASH_STYLE];
-        destItem[JV.PROP_COLOR] = srcItem[JV.PROP_COLOR];
+    function private_CopyBorder(destItem: BorderStyle, srcItem: BorderStyle) {
+        destItem.LineWeight = srcItem.LineWeight;
+        destItem.DashStyle = srcItem.DashStyle;
+        destItem.Color = srcItem.Color;
     }
     }
     if (dftStyleCollection) {
     if (dftStyleCollection) {
         for (let i = 0; i < dftStyleCollection.length; i++) {
         for (let i = 0; i < dftStyleCollection.length; i++) {
             const item: any = {};
             const item: any = {};
-            if (dftStyleCollection[i][JV.PROP_BORDER_STYLE] && dftStyleCollection[i][JV.PROP_BORDER_STYLE].length > 0) {
-                for (let j = 0; j < dftStyleCollection[i][JV.PROP_BORDER_STYLE].length; j++) {
-                    const borderItem = {};
-                    private_CopyBorder(borderItem, dftStyleCollection[i][JV.PROP_BORDER_STYLE][j]);
-                    item[dftStyleCollection[i][JV.PROP_BORDER_STYLE][j][JV.PROP_POSITION]] = borderItem;
+            if (dftStyleCollection[i].border_style && dftStyleCollection[i].border_style.length > 0) {
+                for (let j = 0; j < dftStyleCollection[i].border_style.length; j++) {
+                    const borderItem = {} as BorderStyle;
+                    private_CopyBorder(borderItem, dftStyleCollection[i].border_style[j]);
+                    item[dftStyleCollection[i].border_style[j].Position] = borderItem;
                 }
                 }
             }
             }
-            rst[dftStyleCollection[i][JV.PROP_ID]] = item;
+            rst[dftStyleCollection[i].ID] = item;
         }
         }
-        if (rptTpl && rptTpl[JV.NODE_STYLE_COLLECTION] && rptTpl[JV.NODE_STYLE_COLLECTION].length > 0) {
-            for (let i = 0; i < rptTpl[JV.NODE_STYLE_COLLECTION].length; i++) {
-                const rptDftItem = rptTpl[JV.NODE_STYLE_COLLECTION][i];
-                if (rst[rptDftItem[JV.PROP_ID]] === undefined) {
-                    if (rptDftItem[JV.PROP_ID].indexOf('_AutoHeightMerge_Top') > 0) {
-                        const key = rptDftItem[JV.PROP_ID].substr(0, rptDftItem[JV.PROP_ID].indexOf('_AutoHeightMerge_Top'));
+        if (rptTpl && rptTpl.style_collection && rptTpl.style_collection.length > 0) {
+            for (let i = 0; i < rptTpl.style_collection.length; i++) {
+                const rptDftItem = rptTpl.style_collection[i];
+                if (rst[rptDftItem.ID] === undefined) {
+                    if (rptDftItem.ID.indexOf('_AutoHeightMerge_Top') > 0) {
+                        const key = rptDftItem.ID.substr(0, rptDftItem.ID.indexOf('_AutoHeightMerge_Top'));
                         if (rst[key]) {
                         if (rst[key]) {
                             const item: any = {};
                             const item: any = {};
-                            if (rst[key][JV.PROP_LEFT]) {
-                                item[JV.PROP_LEFT] = {};
-                                private_CopyBorder(item[JV.PROP_LEFT], rst[key][JV.PROP_LEFT]);
+                            if (rst[key].Left) {
+                                item.Left = {};
+                                private_CopyBorder(item.Left, rst[key].Left);
                             }
                             }
-                            if (rst[key][JV.PROP_RIGHT]) {
-                                item[JV.PROP_RIGHT] = {};
-                                private_CopyBorder(item[JV.PROP_RIGHT], rst[key][JV.PROP_RIGHT]);
+                            if (rst[key].Right) {
+                                item.Right = {};
+                                private_CopyBorder(item.Right, rst[key].Right);
                             }
                             }
-                            if (rst[key][JV.PROP_TOP]) {
-                                item[JV.PROP_TOP] = {};
-                                private_CopyBorder(item[JV.PROP_TOP], rst[key][JV.PROP_TOP]);
+                            if (rst[key].Top) {
+                                item.Top = {};
+                                private_CopyBorder(item.Top, rst[key].Top);
                             }
                             }
-                            rst[rptDftItem[JV.PROP_ID]] = item;
+                            rst[rptDftItem.ID] = item;
                         }
                         }
-                    } else if (rptDftItem[JV.PROP_ID].indexOf('_AutoHeightMerge_Middle') > 0) {
-                        const key = rptDftItem[JV.PROP_ID].substr(0, rptDftItem[JV.PROP_ID].indexOf('_AutoHeightMerge_Middle'));
+                    } else if (rptDftItem.ID.indexOf('_AutoHeightMerge_Middle') > 0) {
+                        const key = rptDftItem.ID.substr(0, rptDftItem.ID.indexOf('_AutoHeightMerge_Middle'));
                         if (rst[key]) {
                         if (rst[key]) {
                             const item: any = {};
                             const item: any = {};
-                            if (rst[key][JV.PROP_LEFT]) {
-                                item[JV.PROP_LEFT] = {};
-                                private_CopyBorder(item[JV.PROP_LEFT], rst[key][JV.PROP_LEFT]);
+                            if (rst[key].Left) {
+                                item.Left = {};
+                                private_CopyBorder(item.Left, rst[key].Left);
                             }
                             }
-                            if (rst[key][JV.PROP_RIGHT]) {
-                                item[JV.PROP_RIGHT] = {};
-                                private_CopyBorder(item[JV.PROP_RIGHT], rst[key][JV.PROP_RIGHT]);
+                            if (rst[key].Right) {
+                                item.Right = {};
+                                private_CopyBorder(item.Right, rst[key].Right);
                             }
                             }
-                            rst[rptDftItem[JV.PROP_ID]] = item;
+                            rst[rptDftItem.ID] = item;
                         }
                         }
-                    } else if (rptDftItem[JV.PROP_ID].indexOf('_AutoHeightMerge_Bottom') > 0) {
-                        const key = rptDftItem[JV.PROP_ID].substr(0, rptDftItem[JV.PROP_ID].indexOf('_AutoHeightMerge_Bottom'));
+                    } else if (rptDftItem.ID.indexOf('_AutoHeightMerge_Bottom') > 0) {
+                        const key = rptDftItem.ID.substr(0, rptDftItem.ID.indexOf('_AutoHeightMerge_Bottom'));
                         if (rst[key]) {
                         if (rst[key]) {
                             const item: any = {};
                             const item: any = {};
-                            if (rst[key][JV.PROP_LEFT]) {
-                                item[JV.PROP_LEFT] = {};
-                                private_CopyBorder(item[JV.PROP_LEFT], rst[key][JV.PROP_LEFT]);
+                            if (rst[key].Left) {
+                                item.Left = {};
+                                private_CopyBorder(item.Left, rst[key].Left);
                             }
                             }
-                            if (rst[key][JV.PROP_RIGHT]) {
-                                item[JV.PROP_RIGHT] = {};
-                                private_CopyBorder(item[JV.PROP_RIGHT], rst[key][JV.PROP_RIGHT]);
+                            if (rst[key].Right) {
+                                item.Right = {};
+                                private_CopyBorder(item.Right, rst[key].Right);
                             }
                             }
-                            if (rst[key][JV.PROP_BOTTOM]) {
-                                item[JV.PROP_BOTTOM] = {};
-                                private_CopyBorder(item[JV.PROP_BOTTOM], rst[key][JV.PROP_BOTTOM]);
+                            if (rst[key].Bottom) {
+                                item.Bottom = {};
+                                private_CopyBorder(item.Bottom, rst[key].Bottom);
                             }
                             }
-                            rst[rptDftItem[JV.PROP_ID]] = item;
+                            rst[rptDftItem.ID] = item;
                         }
                         }
                     } else {
                     } else {
                         const item: any = {};
                         const item: any = {};
-                        for (let j = 0; j < rptDftItem[JV.PROP_BORDER_STYLE].length; j++) {
-                            const borderItem = {};
-                            private_CopyBorder(borderItem, rptDftItem[JV.PROP_BORDER_STYLE][j]);
-                            item[rptDftItem[JV.PROP_BORDER_STYLE][j][JV.PROP_POSITION]] = borderItem;
+                        for (let j = 0; j < rptDftItem.border_style.length; j++) {
+                            const borderItem = {} as BorderStyle;
+                            private_CopyBorder(borderItem, rptDftItem.border_style[j]);
+                            item[rptDftItem.border_style[j].Position] = borderItem;
                         }
                         }
-                        rst[rptDftItem[JV.PROP_ID]] = item;
+                        rst[rptDftItem.ID] = item;
                     }
                     }
                 }
                 }
             }
             }

+ 42 - 40
report/src/core/jpc_field.ts

@@ -1,72 +1,74 @@
 'use strict';
 'use strict';
 
 
 import JV from './jpc_value_define';
 import JV from './jpc_value_define';
-
+import { IRptTpl, IGroupField, IOrgGroupField } from '../interface/basic'
+import { IDataObjProps } from '../interface/enum'
 const JpcField = {
 const JpcField = {
-    createNew(rptTpl: any) {
+    createNew(rptTpl: IRptTpl) {
         let me = this;
         let me = this;
         let JpcFieldResult = {
         let JpcFieldResult = {
-            [JV.NODE_DISCRETE_FIELDS] : {},
-            [JV.NODE_MASTER_FIELDS] : {},
-            [JV.NODE_DETAIL_FIELDS] : {},
-            [JV.NODE_NO_MAPPING_FIELDS] : {},
-            [JV.NODE_MASTER_FIELDS_EX] : {},
-            [JV.NODE_DETAIL_FIELDS_EX] : {}
+            离散指标_集合: {},
+            主数据指标_集合: {},
+            从数据指标_集合: {},
+            无映射离散指标_集合: {},
+            主数据指标_拓展集合: {},
+            从数据指标_拓展集合: {}
         };
         };
-        if (rptTpl[JV.NODE_FIELD_MAP] && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]) {
-            for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS].length; i++) {
-                me.createSingle(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS][i], JpcFieldResult[JV.NODE_DISCRETE_FIELDS], JV.DATA_DISCRETE_DATA, i);
+        if (rptTpl.指标_数据_映射 && rptTpl.指标_数据_映射.离散指标_集合) {
+            for (let i = 0; i < rptTpl.指标_数据_映射.离散指标_集合.length; i++) {
+                me.createSingle(rptTpl.指标_数据_映射.离散指标_集合[i], JpcFieldResult.离散指标_集合, IDataObjProps.discrete_data, i);
             }
             }
         }
         }
-        if (rptTpl[JV.NODE_FIELD_MAP] && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
-            for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS].length; i++) {
-                me.createSingle(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS][i], JpcFieldResult[JV.NODE_MASTER_FIELDS], JV.DATA_MASTER_DATA, i);
+        if (rptTpl.指标_数据_映射 && rptTpl.指标_数据_映射.主数据指标_集合) {
+            for (let i = 0; i < rptTpl.指标_数据_映射.主数据指标_集合.length; i++) {
+                me.createSingle(rptTpl.指标_数据_映射.主数据指标_集合[i], JpcFieldResult.主数据指标_集合, IDataObjProps.master_data, i);
             }
             }
         }
         }
-        if (rptTpl[JV.NODE_FIELD_MAP] && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
-            for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS].length; i++) {
-                me.createSingle(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS][i], JpcFieldResult[JV.NODE_DETAIL_FIELDS], JV.DATA_DETAIL_DATA, i);
+        if (rptTpl.指标_数据_映射 && rptTpl.指标_数据_映射.从数据指标_集合) {
+            for (let i = 0; i < rptTpl.指标_数据_映射.从数据指标_集合.length; i++) {
+                me.createSingle(rptTpl.指标_数据_映射.从数据指标_集合[i], JpcFieldResult.从数据指标_集合, IDataObjProps.detail_data, i);
             }
             }
         }
         }
-        if (rptTpl[JV.NODE_NO_MAPPING_FIELDS]) {
-            for (let i = 0; i < rptTpl[JV.NODE_NO_MAPPING_FIELDS].length; i++) {
-                me.createSingle(rptTpl[JV.NODE_NO_MAPPING_FIELDS][i], JpcFieldResult[JV.NODE_NO_MAPPING_FIELDS], "NA", JV.BLANK_FIELD_INDEX);
+        if (rptTpl.无映射离散指标_集合) {
+            for (let i = 0; i < rptTpl.无映射离散指标_集合.length; i++) {
+                me.createSingle(rptTpl.无映射离散指标_集合[i], JpcFieldResult.无映射离散指标_集合, "NA", -10);
             }
             }
         }
         }
-        if (rptTpl[JV.NODE_FIELD_MAP] && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS_EX]) {
-            for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS_EX].length; i++) {
-                me.createSingle(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS_EX][i], JpcFieldResult[JV.NODE_MASTER_FIELDS_EX], JV.DATA_MASTER_DATA_EX, i);
+        if (rptTpl.指标_数据_映射 && rptTpl.指标_数据_映射.主数据指标_拓展集合) {
+            for (let i = 0; i < rptTpl.指标_数据_映射.主数据指标_拓展集合.length; i++) {
+                me.createSingle(rptTpl.指标_数据_映射.主数据指标_拓展集合[i], JpcFieldResult.主数据指标_拓展集合, IDataObjProps.master_data_ex, i);
             }
             }
         }
         }
-        if (rptTpl[JV.NODE_FIELD_MAP] && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX]) {
-            for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX].length; i++) {
-                me.createSingle(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX][i], JpcFieldResult[JV.NODE_DETAIL_FIELDS_EX], JV.DATA_DETAIL_DATA_EX, i);
+        if (rptTpl.指标_数据_映射 && rptTpl.指标_数据_映射.从数据指标_拓展集合) {
+            for (let i = 0; i < rptTpl.指标_数据_映射.从数据指标_拓展集合.length; i++) {
+                me.createSingle(rptTpl.指标_数据_映射.从数据指标_拓展集合[i], JpcFieldResult.从数据指标_拓展集合, IDataObjProps.detail_data_ex, i);
             }
             }
         }
         }
         //NODE_MASTER_FIELDS_EX
         //NODE_MASTER_FIELDS_EX
         return JpcFieldResult;
         return JpcFieldResult;
     },
     },
-    createSingle(fieldNode: any, parentObj: any, dataNodeName: string, sequence: number) {
-        if (fieldNode && fieldNode[JV.PROP_ID]) {
+    createSingle(fieldNode: IOrgGroupField, parentObj: Record<string, IOrgGroupField>, dataNodeName: IDataObjProps | string, sequence: number) {
+        if (fieldNode && fieldNode.ID) {
             let item = {
             let item = {
-                [JV.PROP_ID] : fieldNode[JV.PROP_ID],
-                [JV.PROP_NAME] : fieldNode[JV.PROP_NAME],
-                [JV.PROP_DATA_TYPE] : fieldNode[JV.PROP_DATA_TYPE],
-                [JV.PROP_PRECISION] : null
-            };
-            if (fieldNode[JV.PROP_PRECISION]) {
-                item[JV.PROP_PRECISION] = {};
-                item[JV.PROP_PRECISION].type = fieldNode[JV.PROP_PRECISION].type;
-                if (fieldNode[JV.PROP_PRECISION].type === 'fixed') {
-                    item[JV.PROP_FIXED_PRECISION_AMT] = fieldNode[JV.PROP_FIXED_PRECISION_AMT];
+                ID: fieldNode.ID,
+                Name: fieldNode.Name,
+                DataType: fieldNode.DataType,
+                // Precision : null//  edit by lish
+                Precision: {}
+            } as any;
+            if (fieldNode.Precision) {
+                item.Precision = {};
+                item.Precision.type = fieldNode.Precision.type;
+                if (fieldNode.Precision.type === 'fixed') {
+                    item.fixedPrecisionNum = fieldNode.fixedPrecisionNum;
                 } else {
                 } else {
-                    item[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID] = fieldNode[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID];
+                    item.Precision.flexibleRefFieldID = fieldNode.Precision.flexibleRefFieldID;
                     item.flexiblePrecisionRefObj = fieldNode.flexiblePrecisionRefObj;
                     item.flexiblePrecisionRefObj = fieldNode.flexiblePrecisionRefObj;
                 }
                 }
             }
             }
             item.DataNodeName = dataNodeName;
             item.DataNodeName = dataNodeName;
             item.DataSeq = sequence;
             item.DataSeq = sequence;
-            parentObj[JV.PROP_ID + "_" + fieldNode[JV.PROP_ID]] = item;
+            parentObj["ID_" + fieldNode.ID] = item;
         }
         }
     }
     }
 };
 };

File diff suppressed because it is too large
+ 372 - 329
report/src/core/jpc_flow_tab.ts


+ 5 - 4
report/src/core/jpc_function.ts

@@ -1,13 +1,14 @@
 'use strict';
 'use strict';
 
 
+import { IRptTpl } from '../interface/basic';
 import JV from './jpc_value_define';
 import JV from './jpc_value_define';
 
 
 const JpcFunc = {
 const JpcFunc = {
-    createNew(rptTpl: any) {
+    createNew(rptTpl: IRptTpl) {
         let rst = [];
         let rst = [];
-        if (rptTpl[JV.NODE_FORMULAS]) {
-            for (let i = 0; i < rptTpl[JV.NODE_FORMULAS].length; i++) {
-                let item = {...rptTpl[JV.NODE_FORMULAS][i]}; // 新的copy规范
+        if (rptTpl.计算式_集合) {
+            for (let i = 0; i < rptTpl.计算式_集合.length; i++) {
+                let item = { ...rptTpl.计算式_集合[i] }; // 新的copy规范
                 // let propArr = Object.getOwnPropertyNames(rptTpl[JV.NODE_FORMULAS][i]);
                 // let propArr = Object.getOwnPropertyNames(rptTpl[JV.NODE_FORMULAS][i]);
                 // for (let key of propArr) {
                 // for (let key of propArr) {
                 //     item[key] = rptTpl[JV.NODE_FORMULAS][i][key];
                 //     item[key] = rptTpl[JV.NODE_FORMULAS][i][key];

+ 13 - 12
report/src/core/jpc_param.ts

@@ -1,28 +1,29 @@
 'use strict';
 'use strict';
 
 
+import { IRptTpl, IOrgGroupField } from '../interface/basic';
 import JV from './jpc_value_define';
 import JV from './jpc_value_define';
 
 
 const JpcParam = {
 const JpcParam = {
-    createNew(rptTpl: any) {
+    createNew(rptTpl: IRptTpl) {
         let JpcParamResult = {};
         let JpcParamResult = {};
         let me = this;
         let me = this;
-        if (rptTpl[JV.NODE_DISCRETE_PARAMS]) {
-            for (let i = 0; i < rptTpl[JV.NODE_DISCRETE_PARAMS].length; i++) {
-                me.createSingle(rptTpl[JV.NODE_DISCRETE_PARAMS][i], JpcParamResult, i);
+        if (rptTpl.离散参数_集合) {
+            for (let i = 0; i < rptTpl.离散参数_集合.length; i++) {
+                me.createSingle(rptTpl.离散参数_集合[i], JpcParamResult, i);
             }
             }
         }
         }
         return JpcParamResult;
         return JpcParamResult;
     },
     },
-    createSingle(paramNode: any, parentObj: any, sequence: number) {
-        if (paramNode && paramNode[JV.PROP_ID]) {
+    createSingle(paramNode: IOrgGroupField, parentObj: Record<string, IOrgGroupField | {}>, sequence: number) {
+        if (paramNode && paramNode.ID) {
             const item = {
             const item = {
-                [JV.PROP_ID] : paramNode[JV.PROP_ID],
-                [JV.PROP_NAME] : paramNode[JV.PROP_NAME],
-                [JV.PROP_DATA_TYPE] : paramNode[JV.PROP_DATA_TYPE],
-                [JV.PROP_DFT_VALUE] : (paramNode[JV.PROP_DFT_VALUE]) ? paramNode[JV.PROP_DFT_VALUE] : null,
-                DataSeq : sequence
+                ID: paramNode.ID,
+                Name: paramNode.Name,
+                DataType: paramNode.DataType,
+                Default_Value: (paramNode.Default_Value) ? paramNode.Default_Value : null,
+                DataSeq: sequence
             };
             };
-            parentObj[JV.PROP_ID + '_' + paramNode[JV.PROP_ID]] = item;
+            parentObj[JV.PROP_ID + '_' + paramNode.ID] = item;
         }
         }
     }
     }
 };
 };

+ 68 - 59
report/src/core/jpc_rte.ts

@@ -1,64 +1,68 @@
 /**
 /**
  * Created by Tony on 2016/12/28.
  * Created by Tony on 2016/12/28.
  */
  */
-'use strict';
+
 
 
 import strUtil from '../public/stringUtil';
 import strUtil from '../public/stringUtil';
 import scMathUtil from '../public/scMathUtil';
 import scMathUtil from '../public/scMathUtil';
 import JV from './jpc_value_define';
 import JV from './jpc_value_define';
-
+import { Fields, ICurrent_RPT, IDataObj } from '../interface/basic';
+import { IDataObjProps } from '../interface/enum';
 const JE = {
 const JE = {
     $STR_UTIL: strUtil,
     $STR_UTIL: strUtil,
     $SC_MATH_UTIL: scMathUtil,
     $SC_MATH_UTIL: scMathUtil,
-    F: function(fID: number, $CURRENT_RPT: any) {
+     //获取把数据中fields的相关对象,并准备赋值到该对象中的某个属性
+    F:  (fID: number, $CURRENT_RPT: ICurrent_RPT)=> {
         let rst = null;
         let rst = null;
-        if ($CURRENT_RPT && ($CURRENT_RPT.fields[JV.NODE_DETAIL_FIELDS][JV.PROP_ID + "_" + fID])) {
-            rst = $CURRENT_RPT.fields[JV.NODE_DETAIL_FIELDS][JV.PROP_ID + "_" + fID];
-        } else if ($CURRENT_RPT && ($CURRENT_RPT.fields[JV.NODE_MASTER_FIELDS][JV.PROP_ID + "_" + fID])) {
-            rst = $CURRENT_RPT.fields[JV.NODE_MASTER_FIELDS][JV.PROP_ID + "_" + fID];
-        } else if ($CURRENT_RPT && ($CURRENT_RPT.fields[JV.NODE_MASTER_FIELDS_EX][JV.PROP_ID + "_" + fID])) {
-            rst = $CURRENT_RPT.fields[JV.NODE_MASTER_FIELDS_EX][JV.PROP_ID + "_" + fID];
-        } else if ($CURRENT_RPT && ($CURRENT_RPT.fields[JV.NODE_DETAIL_FIELDS_EX][JV.PROP_ID + "_" + fID])) {
-            rst = $CURRENT_RPT.fields[JV.NODE_DETAIL_FIELDS_EX][JV.PROP_ID + "_" + fID];
-        } else if ($CURRENT_RPT && ($CURRENT_RPT.fields[JV.NODE_DISCRETE_FIELDS][JV.PROP_ID + "_" + fID])) {
-            rst = $CURRENT_RPT.fields[JV.NODE_DISCRETE_FIELDS][JV.PROP_ID + "_" + fID];
-        } else if ($CURRENT_RPT && ($CURRENT_RPT.fields[JV.NODE_NO_MAPPING_FIELDS][JV.PROP_ID + "_" + fID])) {
-            rst = $CURRENT_RPT.fields[JV.NODE_NO_MAPPING_FIELDS][JV.PROP_ID + "_" + fID];
+        if ($CURRENT_RPT && ($CURRENT_RPT.fields.从数据指标_集合[JV.PROP_ID + "_" + fID])) {
+            rst = $CURRENT_RPT.fields.从数据指标_集合[JV.PROP_ID + "_" + fID];
+        } else if ($CURRENT_RPT && ($CURRENT_RPT.fields.主数据指标_集合[JV.PROP_ID + "_" + fID])) {
+            rst = $CURRENT_RPT.fields.主数据指标_集合[JV.PROP_ID + "_" + fID];
+        } else if ($CURRENT_RPT && ($CURRENT_RPT.fields.主数据指标_拓展集合[JV.PROP_ID + "_" + fID])) {
+            rst = $CURRENT_RPT.fields.主数据指标_拓展集合[JV.PROP_ID + "_" + fID];
+        } else if ($CURRENT_RPT && ($CURRENT_RPT.fields.从数据指标_拓展集合[JV.PROP_ID + "_" + fID])) {
+            rst = $CURRENT_RPT.fields.从数据指标_拓展集合[JV.PROP_ID + "_" + fID];
+        } else if ($CURRENT_RPT && ($CURRENT_RPT.fields.离散指标_集合[JV.PROP_ID + "_" + fID])) {
+            rst = $CURRENT_RPT.fields.离散指标_集合[JV.PROP_ID + "_" + fID];
+        } else if ($CURRENT_RPT && ($CURRENT_RPT.fields.无映射离散指标_集合[JV.PROP_ID + "_" + fID])) {
+            rst = $CURRENT_RPT.fields.无映射离散指标_集合[JV.PROP_ID + "_" + fID];
         } else {
         } else {
-            rst = {msg: "the Field-ID is not valid, no result could be found!"};
+            //该方法返回对象可能会导致jpc_flow_tab.ts 的130行 报错, ,by lish
+            rst = null;
+            // rst = {msg: "the Field-ID is not valid, no result could be found!"};
         }
         }
         return rst;
         return rst;
     },
     },
-    P: function(pID: number, $CURRENT_RPT: any) {
+       //获取把数据中params的相关对象,并准备赋值到该对象中的某个属性
+    P:  (pID: number, $CURRENT_RPT: ICurrent_RPT)=> {
         let rst = null;
         let rst = null;
         if ($CURRENT_RPT && ($CURRENT_RPT.params[JV.PROP_ID + "_" + pID])) {
         if ($CURRENT_RPT && ($CURRENT_RPT.params[JV.PROP_ID + "_" + pID])) {
-            rst = $CURRENT_RPT.params[JV.PROP_ID + "_" + pID];
-        } else {
-            rst = {msg: "the Param-ID is not valid, no result was found!"};
-        }
+            rst = $CURRENT_RPT.params["ID_" + pID];
+        } 
+            // rst = {msg: "the Param-ID is not valid, no result was found!"}; by lish
         return rst;
         return rst;
     },
     },
-    getCurrentPage: function ($CURRENT_RPT: any) {
+    getCurrentPage: function ($CURRENT_RPT: ICurrent_RPT) {
         let rst = 0;
         let rst = 0;
-        if ($CURRENT_RPT) {
+        if ($CURRENT_RPT && $CURRENT_RPT.runTimePageData.currentPage) {
             rst = $CURRENT_RPT.runTimePageData.currentPage;
             rst = $CURRENT_RPT.runTimePageData.currentPage;
         }
         }
         return rst;
         return rst;
     },
     },
-    getTotalPage: function ($CURRENT_RPT: any) {
+    getTotalPage: function ($CURRENT_RPT: ICurrent_RPT) {
         let rst = 0;
         let rst = 0;
         if ($CURRENT_RPT) {
         if ($CURRENT_RPT) {
             rst = $CURRENT_RPT.totalPages;
             rst = $CURRENT_RPT.totalPages;
         }
         }
         return rst;
         return rst;
     },
     },
-    getFieldDataLen: function(field: any, dataObj: any) {
+    getFieldDataLen: function (field: Fields, dataObj: IDataObj) {
         let rst = 0;
         let rst = 0;
         if (field.DataNodeName === 'NA') {
         if (field.DataNodeName === 'NA') {
-            if (!field[JV.PROP_AD_HOC_DATA]) {
-                field[JV.PROP_AD_HOC_DATA] = [];
+            if (!field.data_field) {
+                field.data_field = [];
             }
             }
-            rst = field[JV.PROP_AD_HOC_DATA].length;
+            rst = field.data_field.length;
         } else {
         } else {
             if (!field.DataNodeName) {
             if (!field.DataNodeName) {
                 // that means this is a self-defined discrete field!
                 // that means this is a self-defined discrete field!
@@ -70,41 +74,42 @@ const JE = {
         }
         }
         return rst;
         return rst;
     },
     },
-    setFieldValue: function (field: any, dataObj: any, valIdx: number, newValue: any) {
+    //向目标对象赋值
+    setFieldValue: function (field: Fields, dataObj: IDataObj, valIdx: number, newValue: number) {
         if (field.DataNodeName === "NA") {
         if (field.DataNodeName === "NA") {
-            if (!field[JV.PROP_AD_HOC_DATA]) {
-                field[JV.PROP_AD_HOC_DATA] = [];
+            if (!field.data_field) {
+                field.data_field = [];
             }
             }
-            field[JV.PROP_AD_HOC_DATA][valIdx] = newValue;
+            field.data_field[valIdx] = newValue;
         } else if (!field.DataNodeName) {
         } else if (!field.DataNodeName) {
             //that means this is a self-defined discrete field!
             //that means this is a self-defined discrete field!
-            field.DataNodeName = JV.DATA_DISCRETE_DATA;
-            field.DataSeq = dataObj[JV.DATA_DISCRETE_DATA].length;
-            dataObj[JV.DATA_DISCRETE_DATA].push([]);
+            field.DataNodeName = IDataObjProps.discrete_data;
+            field.DataSeq = dataObj[IDataObjProps.discrete_data].length;
+            dataObj[IDataObjProps.discrete_data].push([]);
             dataObj[field.DataNodeName][field.DataSeq][valIdx] = newValue;
             dataObj[field.DataNodeName][field.DataSeq][valIdx] = newValue;
         } else {
         } else {
             dataObj[field.DataNodeName][field.DataSeq][valIdx] = newValue;
             dataObj[field.DataNodeName][field.DataSeq][valIdx] = newValue;
         }
         }
     },
     },
-    getFieldValue: function (field: any, dataObj: any, valIdx: number, newVal: any) {
+    getFieldValue: function (field: Fields, dataObj: IDataObj, valIdx: number, newVal: number) {
         let rst = null;
         let rst = null;
         if (field.DataNodeName === "NA") {
         if (field.DataNodeName === "NA") {
-            if (!field[JV.PROP_AD_HOC_DATA]) {
-                field[JV.PROP_AD_HOC_DATA] = [];
+            if (!field.data_field) {
+                field.data_field = [];
             }
             }
-            if (field[JV.PROP_AD_HOC_DATA].length > valIdx) {
-                rst = field[JV.PROP_AD_HOC_DATA][valIdx];
+            if (field.data_field.length > valIdx) {
+                rst = field.data_field[valIdx];
             } else {
             } else {
-                if (newVal === null && field[JV.PROP_AD_HOC_DATA].length > 0) {
-                    rst = field[JV.PROP_AD_HOC_DATA][field[JV.PROP_AD_HOC_DATA].length - 1];
+                if (newVal === null && field.data_field.length > 0) {
+                    rst = field.data_field[field.data_field.length - 1];
                 }
                 }
             }
             }
         } else {
         } else {
             if (!field.DataNodeName) {
             if (!field.DataNodeName) {
                 //that means this is a self-defined discrete field!
                 //that means this is a self-defined discrete field!
-                field.DataNodeName = JV.DATA_DISCRETE_DATA;
-                field.DataSeq = dataObj[JV.DATA_DISCRETE_DATA];
-                dataObj[JV.DATA_DISCRETE_DATA].push([]);
+                field.DataNodeName = IDataObjProps.discrete_data;
+                field.DataSeq = dataObj[IDataObjProps.discrete_data];
+                dataObj[IDataObjProps.discrete_data].push([]);
             }
             }
             if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx) {
             if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx) {
                 rst = dataObj[field.DataNodeName][field.DataSeq][valIdx];
                 rst = dataObj[field.DataNodeName][field.DataSeq][valIdx];
@@ -117,13 +122,14 @@ const JE = {
         if (rst === null || rst === undefined) rst = newVal;
         if (rst === null || rst === undefined) rst = newVal;
         return rst;
         return rst;
     },
     },
-    getFieldValueArray: function(field: any, dataObj: any) {
+    getFieldValueArray: function (field: Fields, dataObj: IDataObj) {
+        console.log('===================getFieldValueArray')
         let rst = null;
         let rst = null;
         if (field.DataNodeName === 'NA') {
         if (field.DataNodeName === 'NA') {
-            if (!field[JV.PROP_AD_HOC_DATA]) {
-                field[JV.PROP_AD_HOC_DATA] = [];
+            if (!field.data_field) {
+                field.data_field = [];
             }
             }
-            rst = field[JV.PROP_AD_HOC_DATA];
+            rst = field.data_field;
         } else {
         } else {
             if (!field.DataNodeName) {
             if (!field.DataNodeName) {
                 // that means this is a self-defined discrete field!
                 // that means this is a self-defined discrete field!
@@ -136,10 +142,11 @@ const JE = {
         if (rst === null || rst === undefined) rst = [];
         if (rst === null || rst === undefined) rst = [];
         return rst;
         return rst;
     },
     },
-    setFieldValueArray: function(field: any, dataObj: any, newArr: any[]) {
+    setFieldValueArray: function (field: Fields, dataObj: IDataObj, newArr: number[]) {
+        console.log('===================setFieldValueArray')
         if (newArr instanceof Array) {
         if (newArr instanceof Array) {
             if (field.DataNodeName === 'NA') {
             if (field.DataNodeName === 'NA') {
-                field[JV.PROP_AD_HOC_DATA] = newArr;
+                field.data_field = newArr;
             } else {
             } else {
                 if (!field.DataNodeName) {
                 if (!field.DataNodeName) {
                     // that means this is a self-defined discrete field!
                     // that means this is a self-defined discrete field!
@@ -151,10 +158,11 @@ const JE = {
             }
             }
         }
         }
     },
     },
-    removeFieldValue: function (field: any, dataObj: any, valIdx: number) {
+    removeFieldValue: function (field: Fields, dataObj: IDataObj, valIdx: number) {
+        console.log('===================removeFieldValue')
         if (field.DataNodeName === "NA") {
         if (field.DataNodeName === "NA") {
-            if (field[JV.PROP_AD_HOC_DATA].length > valIdx && valIdx >= 0) {
-                field[JV.PROP_AD_HOC_DATA].splice(valIdx, 1);
+            if (field.data_field.length > valIdx && valIdx >= 0) {
+                field.data_field.splice(valIdx, 1);
             }
             }
         } else {
         } else {
             if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx && valIdx >= 0) {
             if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx && valIdx >= 0) {
@@ -162,12 +170,13 @@ const JE = {
             }
             }
         }
         }
     },
     },
-    insertFieldValue: function (field: any, dataObj: any, valIdx: number, newValue: any) {
+    insertFieldValue: function (field: Fields, dataObj: IDataObj, valIdx: number, newValue: number) {
+        console.log('===================insertFieldValue')
         if (field.DataNodeName === "NA") {
         if (field.DataNodeName === "NA") {
-            if (field[JV.PROP_AD_HOC_DATA].length > valIdx && valIdx >= 0) {
-                field[JV.PROP_AD_HOC_DATA].splice(valIdx, 0, newValue);
-            } else if (field[JV.PROP_AD_HOC_DATA].length <= valIdx) {
-                field[JV.PROP_AD_HOC_DATA][field[JV.PROP_AD_HOC_DATA].length] = newValue;
+            if (field.data_field.length > valIdx && valIdx >= 0) {
+                field.data_field.splice(valIdx, 0, newValue);
+            } else if (field.data_field.length <= valIdx) {
+                field.data_field[field.data_field.length] = newValue;
             }
             }
         } else {
         } else {
             if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx && valIdx >= 0) {
             if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx && valIdx >= 0) {

+ 72 - 29
report/src/core/jpc_value_define.ts

@@ -1,5 +1,3 @@
-'use strict';
-
 const VAL_DEF = {
 const VAL_DEF = {
     NODE_CROSS_INFO: '交叉表_信息',
     NODE_CROSS_INFO: '交叉表_信息',
     NODE_CROSS_ROW: '交叉行',
     NODE_CROSS_ROW: '交叉行',
@@ -23,14 +21,14 @@ const VAL_DEF = {
     NODE_EVENTS: '事件_集合',
     NODE_EVENTS: '事件_集合',
     NODE_DISCRETE_INFO: '离散信息',
     NODE_DISCRETE_INFO: '离散信息',
     NODE_BILL_INFO: '账单式表_信息',
     NODE_BILL_INFO: '账单式表_信息',
-    NODE_BILL_CONTENT : '账单式表_数据',
+    NODE_BILL_CONTENT: '账单式表_数据',
     NODE_FLOW_INFO: '流水式表_信息',
     NODE_FLOW_INFO: '流水式表_信息',
     NODE_FLOW_INFO_EX: '流水式表_拓展信息',
     NODE_FLOW_INFO_EX: '流水式表_拓展信息',
     NODE_FLOW_GROUP: '流水式表_分组信息',
     NODE_FLOW_GROUP: '流水式表_分组信息',
     NODE_FLOW_SEG_SUM: '流水式表_段统计信息',
     NODE_FLOW_SEG_SUM: '流水式表_段统计信息',
     NODE_FLOW_PAGE_SUM: '流水式表_页统计信息',
     NODE_FLOW_PAGE_SUM: '流水式表_页统计信息',
-    NODE_FLOW_COLUMN : '流水式表_列',
-    NODE_FLOW_CONTENT : '流水式表_数据',
+    NODE_FLOW_COLUMN: '流水式表_列',
+    NODE_FLOW_CONTENT: '流水式表_数据',
     PROP_MULTI_COLUMN: '多列显示数量',
     PROP_MULTI_COLUMN: '多列显示数量',
     PROP_FLOW_EX_DISPLAY_MODE: '流水拓展显示模式',
     PROP_FLOW_EX_DISPLAY_MODE: '流水拓展显示模式',
     DISPLAY_MODE_INDEPENDENT: '单独模式',
     DISPLAY_MODE_INDEPENDENT: '单独模式',
@@ -136,8 +134,8 @@ const VAL_DEF = {
     PROP_BILL_FIELDS: 'bill_field_s',
     PROP_BILL_FIELDS: 'bill_field_s',
     PROP_CROSS_FIELDS: 'cross_field_s',
     PROP_CROSS_FIELDS: 'cross_field_s',
     PROP_CROSS_DISPLAY_ORDER: 'cross_display_order',
     PROP_CROSS_DISPLAY_ORDER: 'cross_display_order',
-    PROP_GROUP_FIELDS: 'group_field_s', //用来分组的指标(如按清单、定额etc...)
-    PROP_GROUP_LINES: 'group_lines',    //显示分组行,因分组的特殊性,分组的数据当成流水数据一样(行高相同),group_lines里的每一条数据占用流水的一整行,里面再细分(指标/text)
+    PROP_GROUP_FIELDS: 'group_field_s', // 用来分组的指标(如按清单、定额etc...)
+    PROP_GROUP_LINES: 'group_lines', // 显示分组行,因分组的特殊性,分组的数据当成流水数据一样(行高相同),group_lines里的每一条数据占用流水的一整行,里面再细分(指标/text)
     PROP_GROUP_SUM_KEYS: 'SumKey_S',
     PROP_GROUP_SUM_KEYS: 'SumKey_S',
     PROP_SUM_KEY: 'SumKey',
     PROP_SUM_KEY: 'SumKey',
     PROP_SUM_FIELDS: 'sum_field_s',
     PROP_SUM_FIELDS: 'sum_field_s',
@@ -175,9 +173,9 @@ const VAL_DEF = {
     BAND_PROP_SUB_BANDS: 'band_s',
     BAND_PROP_SUB_BANDS: 'band_s',
 
 
     MEASUREMENT: {
     MEASUREMENT: {
-        PIXEL:['像素点', '象素点', 'PIXEL'],
+        PIXEL: ['像素点', '象素点', 'PIXEL'],
         CM: ['厘米', 'CM'],
         CM: ['厘米', 'CM'],
-        INCH: ['英寸','INCH']
+        INCH: ['英寸', 'INCH'],
     },
     },
 
 
     PROP_IS_ID: 'isID',
     PROP_IS_ID: 'isID',
@@ -211,9 +209,27 @@ const VAL_DEF = {
 
 
     RUN_TYPE_BEFORE_GROUP_TEXT_OUT: 'before_group_text_output',
     RUN_TYPE_BEFORE_GROUP_TEXT_OUT: 'before_group_text_output',
 
 
-    PAGE_STATUS: ['EveryPage','FirstPage', 'LastPage', 'SegmentStart', 'SegmentEnd', 'Group', 'CrossRowEnd', 'CrossColEnd'],
-
-    CONTROL_PROPS: ['Shrink', 'ShowZero', 'Horizon', 'Vertical', 'Wrap', 'VerticalForExcel', 'ShrinkFirst', 'CloseOutput'],
+    PAGE_STATUS: [
+        'EveryPage',
+        'FirstPage',
+        'LastPage',
+        'SegmentStart',
+        'SegmentEnd',
+        'Group',
+        'CrossRowEnd',
+        'CrossColEnd',
+    ],
+
+    CONTROL_PROPS: [
+        'Shrink',
+        'ShowZero',
+        'Horizon',
+        'Vertical',
+        'Wrap',
+        'VerticalForExcel',
+        'ShrinkFirst',
+        'CloseOutput',
+    ],
     CONTROL_PROP_IDX_SHRINK: 0,
     CONTROL_PROP_IDX_SHRINK: 0,
     CONTROL_PROP_IDX_SHOW_ZERO: 1,
     CONTROL_PROP_IDX_SHOW_ZERO: 1,
     CONTROL_PROP_IDX_HORIZON: 2,
     CONTROL_PROP_IDX_HORIZON: 2,
@@ -226,7 +242,16 @@ const VAL_DEF = {
     PROP_LINE_WEIGHT: 'LineWeight',
     PROP_LINE_WEIGHT: 'LineWeight',
     PROP_DASH_STYLE: 'DashStyle',
     PROP_DASH_STYLE: 'DashStyle',
     PROP_COLOR: 'Color',
     PROP_COLOR: 'Color',
-    FONT_PROPS: ['Name', 'FontHeight', 'FontColor', 'FontBold', 'FontItalic', 'FontUnderline', 'FontStrikeOut', 'FontAngle'],
+    FONT_PROPS: [
+        'Name',
+        'FontHeight',
+        'FontColor',
+        'FontBold',
+        'FontItalic',
+        'FontUnderline',
+        'FontStrikeOut',
+        'FontAngle',
+    ],
     FONT_PROP_IDX_NAME: 0,
     FONT_PROP_IDX_NAME: 0,
     FONT_PROP_IDX_HEIGHT: 1,
     FONT_PROP_IDX_HEIGHT: 1,
     FONT_PROP_IDX_COLOR: 2,
     FONT_PROP_IDX_COLOR: 2,
@@ -245,7 +270,7 @@ const VAL_DEF = {
     STATUS_CROSS_ROW_END: 6,
     STATUS_CROSS_ROW_END: 6,
     STATUS_CROSS_COL_END: 7,
     STATUS_CROSS_COL_END: 7,
 
 
-    LAYOUT: ['Top','Bottom', 'Left', 'Right', 'Fulfill'],
+    LAYOUT: ['Top', 'Bottom', 'Left', 'Right', 'Fulfill'],
     LAYOUT_TOP: 0,
     LAYOUT_TOP: 0,
     LAYOUT_BOTTOM: 1,
     LAYOUT_BOTTOM: 1,
     LAYOUT_LEFT: 2,
     LAYOUT_LEFT: 2,
@@ -254,16 +279,16 @@ const VAL_DEF = {
 
 
     OUTPUT_ALIGN: {
     OUTPUT_ALIGN: {
         H: ['left', 'center', 'right'],
         H: ['left', 'center', 'right'],
-        V: ['top', 'center', 'bottom']
+        V: ['top', 'center', 'bottom'],
     },
     },
-    H_ALIGN_IDX_LEFT : 0,
-    H_ALIGN_IDX_CENTER : 1,
-    H_ALIGN_IDX_RIGHT : 2,
-    V_ALIGN_IDX_TOP : 0,
-    V_ALIGN_IDX_CENTER : 1,
-    V_ALIGN_IDX_BOTTOM : 2,
-
-    CAL_TYPE:['percentage','abstract'],
+    H_ALIGN_IDX_LEFT: 0,
+    H_ALIGN_IDX_CENTER: 1,
+    H_ALIGN_IDX_RIGHT: 2,
+    V_ALIGN_IDX_TOP: 0,
+    V_ALIGN_IDX_CENTER: 1,
+    V_ALIGN_IDX_BOTTOM: 2,
+
+    CAL_TYPE: ['percentage', 'abstract'],
     CAL_TYPE_PERCENTAGE: 0,
     CAL_TYPE_PERCENTAGE: 0,
     CAL_TYPE_ABSTRACT: 1,
     CAL_TYPE_ABSTRACT: 1,
 
 
@@ -287,7 +312,7 @@ const VAL_DEF = {
     SIZE_16K: [7.75, 10.75],
     SIZE_16K: [7.75, 10.75],
     SIZE_EXECUTIVE: [7.25, 10.5],
     SIZE_EXECUTIVE: [7.25, 10.5],
 
 
-    OUTPUT_OFFSET: [2,2,1,3],
+    OUTPUT_OFFSET: [2, 2, 1, 3],
     OFFSET_IDX_LEFT: 0,
     OFFSET_IDX_LEFT: 0,
     OFFSET_IDX_RIGHT: 1,
     OFFSET_IDX_RIGHT: 1,
     OFFSET_IDX_TOP: 2,
     OFFSET_IDX_TOP: 2,
@@ -314,18 +339,36 @@ const VAL_DEF = {
     PAGE_SELF_DEFINE: '自定义',
     PAGE_SELF_DEFINE: '自定义',
     PAGE_SPECIAL_MERGE_POS: 'page_merge_pos',
     PAGE_SPECIAL_MERGE_POS: 'page_merge_pos',
 
 
-    PAGES_SIZE_STR: ['A3', 'A4', 'A5', 'B5', 'LETTER', 'LEGAL', 'EXECUTIVE', '16K'],
+    PAGES_SIZE_STR: [
+        'A3',
+        'A4',
+        'A5',
+        'B5',
+        'LETTER',
+        'LEGAL',
+        'EXECUTIVE',
+        '16K',
+    ],
     PAGES_SIZE_IDX: [8, 9, 11, 13, 1, 5, 7, 93],
     PAGES_SIZE_IDX: [8, 9, 11, 13, 1, 5, 7, 93],
-    PAGES_SIZE: [[11.69, 16.54], [8.27, 11.69], [5.83, 8.27], [6.93, 9.84], [8.5, 11.0], [8.5, 14.0], [7.25, 10.5], [7.25, 10.5]],
-
-    HUNDRED_PERCENT : 100.0,
+    PAGES_SIZE: [
+        [11.69, 16.54],
+        [8.27, 11.69],
+        [5.83, 8.27],
+        [6.93, 9.84],
+        [8.5, 11.0],
+        [8.5, 14.0],
+        [7.25, 10.5],
+        [7.25, 10.5],
+    ],
+
+    HUNDRED_PERCENT: 100.0,
 
 
     VERTICAL_ANGLE: '90',
     VERTICAL_ANGLE: '90',
     ANTI_VERTICAL_ANGLE: '-90',
     ANTI_VERTICAL_ANGLE: '-90',
     VERTICAL_ANGLE_INT: 90,
     VERTICAL_ANGLE_INT: 90,
     ANTI_VERTICAL_ANGLE_INT: -90,
     ANTI_VERTICAL_ANGLE_INT: -90,
 
 
-    LAST_DEF: ''
+    LAST_DEF: '',
 };
 };
 
 
 export default VAL_DEF;
 export default VAL_DEF;

File diff suppressed because it is too large
+ 766 - 396
report/src/excel_util/rpt_excel_util.ts


+ 5 - 3
report/src/index.ts

@@ -1,4 +1,6 @@
+// export { default as core } from './core/jpc_ex';
 
 
-export { default as core } from './core/jpc_ex';
-
-export { default as excel_util } from './excel_util/rpt_excel_util';
+// export { default as excel_util } from './excel_util/rpt_excel_util';
+export * from './core/index';
+export * from './interface/index';
+export * from './public/index';

+ 611 - 0
report/src/interface/basic.ts

@@ -0,0 +1,611 @@
+// import { IFlowTabClass, IBillTabClass, ICostTabClass } from './classType';
+// eslint-disable-next-line camelcase
+import { IDataObjProps, IEventType } from './enum';
+
+export interface IArea {
+    Left: number;
+    Right: number;
+    Top: number;
+    Bottom: number;
+    H_CalculationType?: {
+        Left: string;
+        Right: string;
+        Top: string;
+        Bottom: string;
+    };
+    V_CalculationType?: {
+        Left: string;
+        Right: string;
+        Top: string;
+        Bottom: string;
+    };
+}
+export interface IControlSubCollection {
+    ID: string;
+    CloseOutput: string;
+    Horizon: string;
+    ShowZero: string;
+    Shrink: string;
+    ShrinkFirst: string;
+    Vertical: string;
+    VerticalForExcel: string;
+    Wrap: string;
+}
+export interface Fields {
+    area: IArea;
+    control: string | IControlSubCollection;
+    FieldID: number;
+    font: string;
+    isAutoHeight: boolean;
+    style: string;
+    Hidden?: boolean; // 暂定
+    isSerial: boolean; // 暂定
+    Format: string;
+    SumKey: string;
+    combineType?: string;
+    isMerge?: boolean;
+    Default_Value?: string;
+    Label: string;
+    Title: string;
+    [key: string]: any; // 剩下的之后补充
+}
+
+export interface IFormula {
+    expression: string;
+    format: string;
+    Name: string;
+    run_type: string;
+}
+
+export interface BorderStyle {
+    Position: string;
+    LineWeight: number;
+    DashStyle: string;
+    Color: string;
+}
+
+export interface IStyles {
+    ID: string;
+    CfgDispName: string;
+    border_style: BorderStyle[];
+    // [key: string]: any; // 剩下的之后补充
+}
+
+export interface IDefProperties {
+    ctrls: IControlSubCollection[];
+    fonts: IFontSubCollection[];
+    styles: IStyles[];
+}
+
+export interface IControlCollection {
+    [key: string]: IControlSubCollection;
+}
+export interface IFontSubCollection {
+    CfgDispName: string
+    FontAngle?: string;
+    FontBold?: string;
+    FontColor?: string;
+    FontHeight: number;
+    FontItalic: string;
+    FontStrikeOut?: string;
+    FontUnderline: string;
+    Name: string;
+    ID: string;
+    [key: string]: string | number | undefined
+}
+export interface IFontCollection {
+    [key: string]: IFontSubCollection;
+}
+
+export interface IPosition {
+    Bottom: number;
+    Left: number;
+    Right: number;
+    Top: number;
+}
+
+export interface IMergePos {
+    Bottom: number[];
+    Left: number[];
+    Right: number[];
+    Top: number[];
+}
+
+interface IPositionExtentDetail {
+    Color: string;
+    DashStyle: string;
+    LineWeight: string;
+}
+
+export interface IPositionExtent {
+    Bottom: IPositionExtentDetail;
+    Left: IPositionExtentDetail;
+    Right: IPositionExtentDetail;
+    Top: IPositionExtentDetail;
+}
+
+export interface INode {
+    font: string;
+    control: string;
+    style: string;
+    Value: number | string | null;
+    area: IArea;
+    isAutoHeight: boolean;
+}
+export interface IPageAreaObj {
+    cellsArr: ICell[];
+    pageCellObj: IPageCellObj;
+}
+
+export interface IPageCellObj {
+    [key: string]: {
+        cellIdx: number;
+        cell: INode;
+    }[];
+}
+export interface ICell {
+    font: string;
+    control: IControlSubCollection|string;
+    style: string;
+    Value: number | string | null;
+    area: IPosition;
+    isAutoHeight?: boolean;
+    Format?: any;
+    Prefix?: string;
+    Suffix?: any;
+}
+
+export interface IPreviewPage {
+    打印页面_信息: {
+        报表名称: string;
+        纸张宽高: number[];
+        页边距: [number, number];
+    };
+    control_collection: IControlCollection;
+    font_collection: IFontCollection;
+    items: [
+        {
+            page_seq: number;
+            cells: ICell[];
+            page_merge_border: IPosition;
+            page_merge_pos:{
+                纸张宽高:number[]
+            }
+        }
+    ];
+    MergeBand: {
+        Bottom: number;
+        Left: number;
+        Right: number;
+        Top: number;
+        style: any;
+    };
+    style_collection: {
+        BORDER_ALL_AROUND: IPositionExtent;
+        Default: IPositionExtent;
+        Default_None: IPositionExtent;
+        Default_Normal: IPositionExtent;
+        Label_Topline: IPositionExtent;
+        Label_Underline: IPositionExtent;
+    };
+}
+
+interface ISimpleJSONPage {
+    cells: ICell[];
+    page_merge_border: IPosition;
+    page_seq: number;
+}
+
+export interface IGroupField {
+    Name: string;
+    fixedPrecisionNum: number;
+    ID: number;
+    DataType: string;
+    DataSeq: number;
+    DataNodeName: IDataObjProps;
+    data_field: number | any; // 暂定
+    Precision?: {
+        type?: string;
+        flexibleRefFieldID?: number;
+    };
+    flexiblePrecisionRefObj?: { [key: string]: number }[];
+    [key: string]: any;
+}
+
+export interface ITargetDataSet {
+    [key: string]: IGroupField;
+}
+
+export interface ITargetFields {
+    从数据指标_集合: ITargetDataSet;
+    主数据指标_集合: ITargetDataSet;
+    主数据指标_拓展集合: ITargetDataSet;
+    从数据指标_拓展集合: ITargetDataSet;
+    离散指标_集合: ITargetDataSet;
+    无映射离散指标_集合: ITargetDataSet;
+}
+
+interface IOutputAsPreviewPage {
+    (rptTpl: IRptTpl, defProperties: IDefProperties): IPreviewPage;
+}
+interface IOutputAsSimpleJSONPageArray {
+    (
+        rptTpl: IRptTpl,
+        dataObj: IDataObj,
+        startPage: number,
+        endPage: number,
+        defProperties: IDefProperties,
+        customizeCfg: ICustomizeCfg
+    ): IPreviewPage;
+}
+interface IOutputAsSimpleJSONPage {
+    (
+        rptTpl: IRptTpl,
+        dataObj: IDataObj,
+        bands: IBands,
+        page: number,
+        controls: IControlCollection,
+        customizeCfg: ICustomizeCfg
+    ): ISimpleJSONPage;
+}
+
+export interface IFlowTab {
+    dispValueIdxLst: number[][];
+    group_lines_amt: number;
+    group_node_info: number[][] | null;
+    group_sum_fields: Fields[] | null;
+    group_sum_values: { [key: string]: number }[] | null;
+    isEx: boolean;
+    multiCols: number;
+    groupSumValLst: any[];
+    group_check_fields: any[];
+    auto_height_fields_idx: any[];
+    auto_height_info: any[];
+    disp_fields_ex_idx: any[];
+    disp_fields_idx: any[];
+    outputAsPreviewPage: IOutputAsPreviewPage;
+    outputAsSimpleJSONPage: IOutputAsSimpleJSONPage;
+    outputAsSimpleJSONPageArray: IOutputAsSimpleJSONPageArray;
+    checkCombineEvent: (
+        $RUN_TYPE: string,
+        $VER_COMB_ARRAY: any[],
+        $HOR_COMB_ARRAY: any[],
+        $CURRENT_CELL_ITEMS: Fields,
+        $CURRENT_RPT: ICurrent_RPT
+    ) => void;
+    checkGrpTxtOutEvent: (
+        $RUN_TYPE: string,
+        $TEXT: Fields,
+        $TIMES: number,
+        $CURRENT_RPT: ICurrent_RPT
+    ) => void;
+    combinePageCells: (
+        rstPageCells: ICell[],
+        verticalCombinePos: any[],
+        horizonCombinePos: any[]
+    ) => void;
+    commonTabRestOutput: (
+        dataObj: IDataObj,
+        page: number,
+        segIdx: number,
+        bands: IBands,
+        band: IBandDetail,
+        unitFactor: number,
+        tab: { BandName: string; text_s?: Fields[]; text?: string },
+        multiColIdx: number
+    ) => Fields[];
+}
+export interface IParam {
+    DataSeq: number;
+    DataType: string;
+    ID: string;
+    Name: string;
+    Default_Value: string;
+}
+export interface IParams {
+    [key: string]: IParam;
+}
+export interface ICurrent_RPT {
+    exTotalPages: number;
+    formulas: IFormula[];
+    isFollowMode: boolean;
+    totalPages: number;
+    params: IParams;
+    analyzeData: (
+        rptTpl: IRptTpl,
+        dataObj: IDataObj,
+        defProperties: IDefProperties,
+        option: string,
+        outputType: string
+    ) => void;
+    executeFormulas: (
+        runType: string,
+        $CURRENT_TEMPLATE: any,
+        $CURRENT_DATA: any,
+        $CURRENT_RPT: ICurrent_RPT
+    ) => void;
+    initialize?: (rptTpl: IRptTpl) => void;
+    outputAsPreviewPage: IOutputAsPreviewPage;
+    outputAsSimpleJSONPage: IOutputAsSimpleJSONPage;
+    outputAsSimpleJSONPageArray: IOutputAsSimpleJSONPageArray;
+    paging: (
+        rptTpl: IRptTpl,
+        dataObj: IDataObj,
+        defProperties: IDefProperties,
+        option: string,
+        outputType: string
+    ) => void;
+    fields: ITargetFields;
+    // flowTab: IFlowTabClass;
+    // flowTabEx: IFlowTabClass;
+    // billTab: IBillTabClass;
+    // crossTab: ICostTabClass;
+    flowTab: any;
+    flowTabEx: any;
+    billTab: any;
+    crossTab: any;
+    runTimePageData: { currentPage?: number };
+}
+
+export interface ICurrent_DATA {
+    discrete_data: any[];
+    detail_data_ex: any[];
+    detail_data: any[];
+    DecimalObj: {
+        prjDecimal: any;
+        unitDecimal: {
+            default_decimal: number;
+        };
+    };
+    master_data: any[];
+    master_data_ex: any[];
+}
+
+export interface ICustomizeCfg {
+    fillZero: boolean;
+    fonts: {
+        CfgDispName: string;
+        FontBold: string;
+        FontHeight: number;
+        FontItalic: string;
+        FontUnderline: string;
+        ID: string;
+        Name: string;
+    }[];
+    isNarrow: boolean;
+    margins: IPosition;
+    showVerticalLine: boolean;
+}
+export interface IOrgBandDetail {
+    Alignment: string;
+    DisplayType:  string;
+    Height:  string;
+    MergeBorder:  string;
+    Name:  string;
+    control: string;
+    style:  string;
+    Width?:string;
+    CalculationType:string;
+    normalOnly?:boolean;
+    exOnly?:boolean;
+    band_s?:IOrgBandDetail[]
+}
+
+export interface IBandDetail {
+    Alignment: number;
+    Bottom: number;
+    CalculationType: number;
+    control: any;
+    Width: number;
+    Top: number;
+    style: any;
+    Right: number;
+    MergeBorder: string;
+    Left: number;
+    Height: number;
+    DisplayType: number;
+    Name: string;
+    exOnly?: boolean;
+    normalOnly?: boolean;
+    band_s?: any[];
+    Le?: number;
+}
+export interface IBands {
+    [key: string]: IBandDetail; // 剩下的之后补充
+}
+export interface IGrpLine {
+    SumKey_S: Fields[];
+    text_s: any[];
+    discrete_field_s: any[];
+    param_s: any;
+    sum_field_s: any;
+}
+export interface ITab {
+    text?: string;
+    text_s: Fields[]; // 剩下的之后补充   textNode
+    离散信息?: any;
+}
+export interface IGrpPageInfo {
+    segGrpRecStartIdx: number;
+    preAddPageGrpInfo: number[];
+    insertedGrpRecAmt: number;
+    group_lines_amt: number;
+}
+
+//模板信息
+export interface IRptTpl {
+    事件_集合: {
+        type: IEventType;
+    }[];
+    布局框_集合: IOrgBandDetail[];
+    计算式_集合: IFormula[];
+    离散参数_集合: IOrgGroupField[];
+    账单式表_信息: {
+        离散信息: IDiscrete[];
+        账单式表_数据: {
+            BandName: string;
+            bill_field_s: Fields[]; // 暂定
+            text: string;
+            text_s: string[]; // 暂定
+            离散信息: IDiscrete[];
+        };
+    };
+    交叉表_信息: {
+        交叉列合计: ICrossTab;
+        交叉行拓展: ICrossTab;
+        交叉行拓展合计: ICrossTab;
+        交叉数据: ICrossTab; // 暂定
+        交叉行: ICrossTab;
+        交叉列: ICrossTab;
+        交叉行AD_HOC: ICrossTab; // 暂定
+        离散信息: IDiscrete[];
+        [key: string]: any; // 暂定tabNodeName     jpc_cross_tab   line270
+    };
+    流水式表_信息: {
+        多列显示数量: number;
+        离散信息: IDiscrete[];
+        流水式表_段统计信息: IDiscrete;
+        流水式表_分组信息: IFlowGroup;
+        流水式表_列: IDiscrete;
+        流水式表_数据: IFlowData;
+        流水式表_页统计信息: IDiscrete;
+    };
+    流水式表_拓展信息: {
+        多列显示数量: number;
+        流水拓展显示模式: string;
+        离散信息: IDiscrete[];
+        流水式表_段统计信息: IDiscrete;
+        流水式表_分组信息: IFlowGroup;
+        流水式表_列: IDiscrete;
+        流水式表_数据: IFlowData;
+        流水式表_页统计信息: IDiscrete;
+    };
+    无映射离散指标_集合: IOrgGroupField[];
+    映射数据预处理: {
+        排序方式: string;
+        排序键值集: any[];
+        映射数据对象: string;
+        预处理类型: string;
+        过滤键值集: {
+            compareObjKey: string
+        }[];
+        分组键值集: {
+            seeking_parent: string
+        }[];
+        父子排序键: {
+            父映射数据对象: string
+        }[]
+    }[];
+    指标_数据_映射: {
+        离散参数_集合: IOrgGroupField[];
+        离散指标_集合: IOrgGroupField[];
+        主数据指标_集合: IOrgGroupField[];
+        从数据指标_集合: IOrgGroupField[];
+        主数据指标_拓展集合: IOrgGroupField[];
+        从数据指标_拓展集合: IOrgGroupField[];
+        [key: string]: IOrgGroupField[];
+    };
+    主信息: {
+        版本: {
+            功能版本: string;
+            主版本: string;
+        };
+        报表名称: string;
+        打印页面_信息: {
+            方向: string;
+            页规格: string;
+            cross_display_order: number;
+        };
+        单位: string;
+        页边距: IPosition;
+    };
+
+    GROUP_KEY: string;
+    ID: number;
+    ID_KEY: string;
+    style_collection?: any[];
+    control_collection: any;
+}
+// 以后会跟 IGroupField合并
+export interface IOrgGroupField {
+    DataType: string;
+    descr?: string;
+    ID: number;
+    mapExpression: string;
+    Name: string;
+    Title?: string;
+    Precision?: {
+        type?: string;
+        flexibleRefFieldID?: number;
+        fixedMapExpression?: string;
+        flexibleMapExpression?: string;
+    };
+    fixedPrecisionNum?: number;
+    flexiblePrecisionRefObj?: { [key: string]: number }[];
+    Default_Value?: string;
+    isID?: string;
+    IDSeq: number;
+}
+
+export interface IDataObj {
+    DecimalObj: {
+        prjDecimal: number;
+        unitDecimal: {
+            default_decimal?: number;
+            unitDecimal?: any
+        };
+    };
+    detail_data: (number | string)[][];
+    detail_data_ex: any[];
+    discrete_data: string[][];
+    master_data: any[];
+    master_data_ex: any[];
+    [key: string]: any;
+}
+
+// 离散信息
+export interface IDiscrete {
+    BandName: string;
+    discrete_field_s: Fields[];
+    text_s: Fields[];
+    CommonHeight: number;
+    text: string;
+    sum_field_s: Fields[];
+    CommonWidth: number;
+}
+// 交叉表
+export interface ICrossTab {
+    BandName: string;
+    cross_field_s: Fields[];
+    text_s: Fields[];
+    CommonHeight: number;
+    text: string;
+    CommonWidth: number;
+}
+// 流水式表_数据
+interface IFlowData {
+    BandName: string;
+    CommonHeight: number;
+    flow_field_s: Fields[];
+    CalculationType: string;
+}
+// 流水式表_分组信息:
+interface IFlowGroup {
+    group_field_s: { FieldID: number }[];
+    group_lines: IGrpLine[];
+    sum_field_s: Fields[];
+}
+
+export interface IRstPage {
+    page_seq?: number;
+    cells?: INode[];
+    page_merge_border?: IMergeBand;
+}
+
+export interface IMergeBand {
+    Bottom: number;
+    Left: number;
+    Right: number;
+    Top: number;
+    style?: any;
+}

+ 104 - 0
report/src/interface/classType.ts

@@ -0,0 +1,104 @@
+import { Fields, IBandDetail, IBands, ICell, IControlCollection, ICrossTab, ICurrent_DATA, ICurrent_RPT, ICustomizeCfg, IDataObj, IDefProperties, IGrpLine, IMergePos, INode, IPreviewPage, IRptTpl, ITab } from "./basic";
+
+export interface IFlowTabClass {
+    auto_height_fields_idx: [number, Fields][];
+    auto_height_info: number[][];
+    checkCombineEvent: ($RUN_TYPE: String, $VER_COMB_ARRAY: number[][], $HOR_COMB_ARRAY: any[], $CURRENT_CELL_ITEMS: ICell[], $CURRENT_RPT: ICurrent_RPT) => void;
+    checkGrpTxtOutEvent: ($RUN_TYPE: String, $TEXT: any, $TIMES: any, $CURRENT_RPT: ICurrent_RPT) => void;
+    combinePageCells: (rstPageCells: ICell[], verticalCombinePos: number[][], horizonCombinePos: number[][]) => void;
+    commonTabRestOutput: (dataObj: IDataObj | null, page: number, segIdx: number, bands: IBands, band: IBandDetail, unitFactor: number, tab: ITab, multiColIdx: number, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg | null) => void;
+    disp_fields_ex_idx: any[];
+    disp_fields_idx: any[];
+    dispValueIdxLst: any[];
+    group_check_fields: any[];
+    group_lines_amt: number;
+    group_node_info: number[][];
+    group_sum_fields: any[]
+    group_sum_values: Fields[]
+    groupSumValLst: any[]
+    isEx: boolean;
+    multiCols: number;
+    outputAsPreviewPage: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT) => any;
+    outputAsSimpleJSONPage: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, controls: IControlCollection, adHocMergePos: IMergePos, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => any[];
+    outputAutoHeightTabField: (band: IBandDetail, tab_field: Fields, data_field: string[], contentValInfo: number[], rows: number, rowIdx: number, cols: number, colIdx: number, unitFactor: number, isRow: boolean, controls: IControlCollection, multiColIdx: number) => any;
+    outputColumn: (rptTpl: IRptTpl, dataObj: IDataObj | null, page: number, segIdx: number, bands: IBands, unitFactor: number, multiColIdx: number, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg | null) => any[]
+    outputAsSimpleJSONPageArray?: (rptTpl: IRptTpl, dataObj: IDataObj, startPage: number, endPage: number, defProperties: IDefProperties, customizeCfg: ICustomizeCfg) => any;
+    outputSegSum: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, segIdx: number, bands: IBands, unitFactor: number, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => any
+    outputTabField: (band: IBandDetail, tab_field: Fields, data_field: string[] | null, valueIdx: number, serialIdx: number, rows: number, rowIdx: number, cols: number, colIdx: number, unitFactor: number, isRow: boolean, controls: IControlCollection, multiColIdx: number) => any
+    outputTabGrpLine: (band: IBandDetail, grp_line: IGrpLine, page: number, grpValueIdx: number[], rows: number, rowIdx: number, cols: number, colIdx: number, unitFactor: number, isRow: boolean, controls: IControlCollection, multiColIdx: number, grpCntIdx: number, $CURRENT_RPT: ICurrent_RPT) => any
+    page_seg_map: number[][];
+    page_sum_fields_idx: any[][]
+    page_sum_tab_fields: any[]
+    pagesAmt: number
+    pageStatusLst: boolean[][];
+    pageSumValLst: any[];
+    paging_option: string
+    preSetupPages: (rptTpl: IRptTpl, dataObj: IDataObj, defProperties: IDefProperties, option: string, $CURRENT_RPT: ICurrent_RPT, followTabEx: any) => any
+    seg_sum_fields_idx: any[];
+    seg_sum_tab_fields: any[];
+    segments: number[][];
+    segSumValLst: any[];
+    setupAutoHeightData: (bands: IBands, segIdx: number, rptTpl: IRptTpl, dataObj: IDataObj, $CURRENT_RPT: ICurrent_RPT, defProperties: IDefProperties) => void
+    setupGroupingData: (rptTpl: IRptTpl, dataObj: IDataObj, $CURRENT_RPT: ICurrent_RPT) => void
+    sorting: (rptTpl: IRptTpl, dataObj: IDataObj, dataSeq: number[][], $CURRENT_RPT: ICurrent_RPT) => void
+    sumSeg: (dataObj: IDataObj, $CURRENT_RPT: ICurrent_RPT) => void
+    sumUpGrp: (rptTpl: IRptTpl, $CURRENT_RPT: ICurrent_RPT, dataObj: IDataObj, segIdx: number, preGrpIdx: number, nexGrpIdx: number) => void
+}
+
+export interface IBillTabClass {
+    disp_fields_idx: any[];
+    outputAsPreviewPage: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT) => any
+    outputAsSimpleJSONPage: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => any;
+    outputContent: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, pageStatus: boolean[], $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => any
+    outputPreviewContent: (rptTpl: IRptTpl, bands: IBands, unitFactor: number, controls: IControlCollection, pageStatus: boolean[]) => any;
+    paging: (rptTpl: IRptTpl, dataObj: IDataObj) => number
+    sorting: (rptTpl: IRptTpl) => void
+}
+
+export interface ICostTabClass {
+    dispValueIdxLst_Row: number[][];
+    dispValueIdxLst_Col: any[];
+    dispValueIdxLst_Content: number[][][];
+    dispSerialIdxLst_Row: number[][];
+    col_sum_fields_idx: any[];
+    col_sum_fields_value_total: any[][];
+    dispSumValueLst_Col: any[];
+    page_seg_map: any;
+    row_fields_idx: any[];
+    row_fields_adhoc_idx: any[];
+    col_fields_idx: any[];
+    content_fields_idx: any[];
+    row_extension_fields_idx: any[];
+    row_sum_extension_fields_idx: any[];
+    sortedRowSequence: any[];
+    sortedColSequence: any[];
+    sortedContentSequence: any[];
+    crsOrient: number;
+    pageStatusLst: any[];
+    paging_option: string;
+    sorting: (rptTpl: IRptTpl, dataObj: IDataObj, dataSeq: number[][], $CURRENT_RPT: ICurrent_RPT) => void;
+    preSetupPages: (rptTpl: IRptTpl, defProperties: IDefProperties, option: string) => number;
+    outputAsPreviewPage: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => any; //最后一个参数其实没作用,方法中定义了,但是在实际使用并没有传值
+    outputPreviewContent: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxRowRec: number, maxColRec: number, unitFactor: number) => any;
+    outputPreviewRowTab: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxRowRec: number, unitFactor: number) => INode[];
+    outputPreviewColTab: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxColRec: number, unitFactor: number) => INode[];
+    outputPreviewTabExt: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxColRec: number, unitFactor: number) => INode[];
+    outputPreviewSumTabExt: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, unitFactor: number) => INode[];
+    outputPreviewTabSum: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxRowRec: number, tabNodeName: string, unitFactor: number) => INode[];
+    private_OutputPreviewCommon: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg, maxRowRec: number, maxColRec: number, tab: ICrossTab, unitFactor: number) => any
+    outputAsSimpleJSONPage: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => any;
+    outputTabSum: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, tabNodeName: string, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => any
+    outputTabExt: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => any;
+    outputSumTabExt: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, segIdx: number, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => any
+    outputContent: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => any;
+    outputColTab: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => any
+    outputRowTabCommon: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, tabStr: string, rowFieldsIdxArr: any[], unitFactor: number, controls: IControlCollection, $CURRENT_RPT: ICurrent_RPT, customizeCfg: ICustomizeCfg) => INode[];
+    outputTabField: (band: IBandDetail, tab_field: Fields, data_field: any, valueIdx: number, serialIdx: number, rows: number, rowIdx: number, cols: number, colIdx: number, unitFactor: number, isRow: boolean, controls: IControlCollection) => INode;
+
+
+}
+
+
+
+
+export default {}

+ 58 - 0
report/src/interface/enum.ts

@@ -0,0 +1,58 @@
+//数据类型
+export enum IDataObjProps {
+    detail_data = 'detail_data',         //从数据指标_集合
+    detail_data_ex = 'detail_data_ex',   //从数据指标_拓展集合
+    discrete_data = 'discrete_data',    // 离散指标_集合
+    master_data = 'master_data',        //主数据指标_集合
+    master_data_ex = 'master_data_ex',  //主数据指标_拓展集合
+}
+
+export enum IEventType {
+    GRP_ON_CREATE = 'GRP_ON_CREATE',
+    FLOW_CONTENT_ON_CREATE = 'FLOW_CONTENT_ON_CREATE',
+}
+
+//操作的步骤
+export enum IRunType {
+    beforeAnalyzing = 'before_analyzing',
+    beforePaging = 'before_paging',
+    beforeOutput = 'before_output',
+    beforeCombine = 'before_combine',
+    afterCombine = 'after_combine',
+}
+
+export enum IPagingOption {
+    normal = 'normal',
+    infinity = 'infinity'
+}
+
+export enum IControlProps {
+    Shrink,
+    ShowZero,
+    Horizon,
+    Vertical,
+    Wrap,
+    VerticalForExcel,
+    ShrinkFirst,
+    CloseOutput
+}
+export enum IFontProps {
+    Name,
+    FontHeight,
+    FontColor,
+    FontBold,
+    FontItalic,
+    FontUnderline,
+    FontStrikeOut,
+    FontAngle
+}
+
+export enum IPositionProps {
+   TOP,
+   Bottom,
+   Left,
+   Right
+}
+
+
+export default {};

+ 4 - 0
report/src/interface/index.ts

@@ -0,0 +1,4 @@
+export * from './basic';
+export * from './classType';
+export * from './enum';
+export * from './projectConstsEnum';

+ 87 - 0
report/src/interface/projectConstsEnum.ts

@@ -0,0 +1,87 @@
+let projectConst = {
+    PROJECT: 'project',
+    BILLS: 'bills',
+    RATION: 'ration',
+    GLJ: 'GLJ',
+    RATION_GLJ:'ration_glj',
+    RATION_COE:'ration_coe',
+    RATION_ASS:'ration_ass',
+    RATION_INSTALLATION:'ration_installation',
+    RATION_TEMPLATE:'ration_template',
+    QUANTITY_DETAIL:'quantity_detail',
+    PROJECTGLJ: 'projectGLJ',
+    GLJLIST: 'GLJList',
+    UNITPRICEFILE: 'unitPriceFile',
+    PROPERTIES: 'properties',
+    // VOLUMEPRICE: 'volume_price',
+    FEERATE:'feeRate',
+    LABOUR_COE:'labour_coe',
+    CALC_PROGRAM:'calc_program',
+    INSTALLATION_FEE:'installation_fee',
+    PROJECT_INFO: 'project_info',
+    EVALUATE_LIST:'evaluate_list',
+    CONTRACTOR_LIST:'contractor_list',
+    BID_EVALUATION_LIST:'bid_evaluation_list'
+};
+
+let projectConstList = [
+    'bills',
+    'ration',
+    'GLJ',
+    'ration_glj',
+    'ration_coe',
+    'ration_ass',
+    'quantity_detail',
+    'projectGLJ',
+    'GLJList',
+    'unitPriceFile',
+    'properties',
+    // 'volume_price',
+    'feeRate',
+    'labour_coe',
+    'contractor_list',
+    'calc_program'
+];
+
+let summaryConstList = [
+    `Construct`,
+    `ConstructDetail`,
+    `Segment`,
+    `SegmentDetail`
+];
+
+let projectFieldConstList = [
+    `ProjectInfoFields`,        //工程信息指标
+    `ProjectFeatureFields`,     //工程特征指标
+    `ProjectCostFields`,        //工程造价指标
+    `ProjectEcoFields`,         //工程(主要)经济指标
+    `ProjectLabMaterialFields`, //主要工料指标
+    `ProjectQtyFields`          //主要工程量指标
+];
+
+let commonConst = {
+    UT_UPDATE: 'ut_update',
+    UT_CREATE: 'ut_create',
+    UT_DELETE: 'ut_delete'
+};
+
+const gljKeyArray =['code','name','specs','unit','type'];
+const rationKeyArray =['code','name','specs','unit','subType'];
+const rationType = {
+    ration: 1,
+    volumePrice: 2,
+    gljRation: 3,
+    install:4,
+    overHeight: 5, // 超高子目
+    itemIncrease: 6//子目增加
+};
+export default {
+    projectConst,
+    commonConst,
+    projectConstList,
+    gljKeyArray,
+    rationKeyArray,
+    rationType,
+    summaryConstList,
+    projectFieldConstList
+};

+ 30 - 0
report/src/public/ReportDate.ts

@@ -0,0 +1,30 @@
+import { set } from 'lodash';
+
+export default class ReportDate extends Date {
+ 
+  prototype: any;
+
+  constructor() {
+    super();
+   
+    set(this.prototype, 'Format', this.Format);
+    Object.assign(Date, this);
+  }
+
+  Format = (fmt: string) => {
+    const o: Record<string, any> = {
+      'M+': this.getMonth() + 1, // 月份
+      'd+': this.getDate(), // 日
+      'h+': this.getHours(), // 小时
+      'm+': this.getMinutes(), // 分
+      's+': this.getSeconds(), // 秒
+      'q+': Math.floor((this.getMonth() + 3) / 3), // 季度
+      S: this.getMilliseconds(), // 毫秒
+    };
+    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, `${this.getFullYear()}`.substr(4 - RegExp.$1.length));
+    for (const k in o)
+      if (new RegExp(`(${k})`).test(fmt))
+        fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : `00${o[k]}`.substr(`${o[k]}`.length));
+    return fmt;
+  };
+}

+ 5 - 0
report/src/public/index.ts

@@ -0,0 +1,5 @@
+export * from './ReportDate';
+export * from './fsUtil';
+export * from './scMathUtil';
+export * from './stringUtil';
+// export * from './treeUtil';

+ 1 - 1
tree/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "@sc/tree",
   "name": "@sc/tree",
-  "version": "1.0.10",
+  "version": "1.0.12",
   "description": "a template for npm package coding",
   "description": "a template for npm package coding",
   "main": "./dist/index.cjs.js",
   "main": "./dist/index.cjs.js",
   "module": "./dist/index.esm.js",
   "module": "./dist/index.esm.js",

+ 6 - 6
tree/src/nodeCtx.ts

@@ -1,4 +1,4 @@
-import { TreeNode, Tree, None } from './tree';
+import { TreeNode, Tree } from './tree';
 
 
 export class NodeContext {
 export class NodeContext {
   // 对树节点数据的引用
   // 对树节点数据的引用
@@ -67,15 +67,15 @@ export class NodeContext {
     return true;
     return true;
   }
   }
 
 
-  parent(): TreeNode | None {
+  parent(): TreeNode | null {
     return this.tree.findParent(this.ID());
     return this.tree.findParent(this.ID());
   }
   }
 
 
-  next(): TreeNode | None {
+  next(): TreeNode | null {
     return this.tree.findNext(this.ID());
     return this.tree.findNext(this.ID());
   }
   }
 
 
-  prev(): TreeNode | None {
+  prev(): TreeNode | null {
     return this.tree.findPrev(this.ID());
     return this.tree.findPrev(this.ID());
   }
   }
 
 
@@ -84,11 +84,11 @@ export class NodeContext {
     return this.tree.parentMap[this.ID()] || [];
     return this.tree.parentMap[this.ID()] || [];
   }
   }
 
 
-  firstChild(): TreeNode | None {
+  firstChild(): TreeNode | null {
     return this.children()[0] || null;
     return this.children()[0] || null;
   }
   }
 
 
-  lastChild(): TreeNode | None {
+  lastChild(): TreeNode | null {
     const children = this.children();
     const children = this.children();
     return children[children.length - 1] || null;
     return children[children.length - 1] || null;
   }
   }

+ 19 - 11
tree/src/tree.ts

@@ -153,12 +153,12 @@ export class Tree {
   }
   }
 
 
   // 查找ID节点
   // 查找ID节点
-  find(ID: string): TreeNode | None {
-    return this.IDMap[ID];
+  find(ID: string): TreeNode | null {
+    return this.IDMap[ID] || null;
   }
   }
 
 
   // 查找ID节点的父节点
   // 查找ID节点的父节点
-  findParent(ID: string): TreeNode | None {
+  findParent(ID: string): TreeNode | null {
     const node = this.find(ID);
     const node = this.find(ID);
     if (!node) {
     if (!node) {
       return null;
       return null;
@@ -167,7 +167,7 @@ export class Tree {
   }
   }
 
 
   // 查找ID节点的下一个节点
   // 查找ID节点的下一个节点
-  findNext(ID: string): TreeNode | None {
+  findNext(ID: string): TreeNode | null {
     const node = this.find(ID);
     const node = this.find(ID);
     if (!node) {
     if (!node) {
       return null;
       return null;
@@ -177,11 +177,11 @@ export class Tree {
     if (nodeIndex < 0) {
     if (nodeIndex < 0) {
       return null;
       return null;
     }
     }
-    return nodes[nodeIndex + 1];
+    return nodes[nodeIndex + 1] || null;
   }
   }
 
 
   // 查找ID节点的上一个节点
   // 查找ID节点的上一个节点
-  findPrev(ID: string): TreeNode | None {
+  findPrev(ID: string): TreeNode | null {
     const node = this.find(ID);
     const node = this.find(ID);
     if (!node) {
     if (!node) {
       return null;
       return null;
@@ -191,7 +191,7 @@ export class Tree {
     if (nodeIndex < 0) {
     if (nodeIndex < 0) {
       return null;
       return null;
     }
     }
-    return nodes[nodeIndex - 1];
+    return nodes[nodeIndex - 1] || null;
   }
   }
 
 
   // 查询ID节点的子节点
   // 查询ID节点的子节点
@@ -250,7 +250,7 @@ export class Tree {
   }
   }
 
 
   // 从节点块中获取相同深度的节点
   // 从节点块中获取相同深度的节点
-  sameDepthNodes(nodes: TreeNode[], depth: number | None): TreeNode[] {
+  sameDepthNodes(nodes: TreeNode[], depth?: number): TreeNode[] {
     if (!depth) {
     if (!depth) {
       depth = nodes[0].getCtx().depth();
       depth = nodes[0].getCtx().depth();
     }
     }
@@ -557,11 +557,14 @@ export class Tree {
     next: TreeNode | None
     next: TreeNode | None
   ): UpdateData[] {
   ): UpdateData[] {
     const updateData: UpdateData[] = [];
     const updateData: UpdateData[] = [];
-    let prev: TreeNode | None;
+    let prev: TreeNode | null;
     if (next) {
     if (next) {
       prev = next.getCtx().prev();
       prev = next.getCtx().prev();
     } else {
     } else {
-      prev = parent ? parent.getCtx().lastChild() : null;
+      const roots = this.getRoots();
+      prev = parent
+        ? parent.getCtx().lastChild()
+        : roots[roots.length - 1] || null;
     }
     }
     const baseSeq = prev ? prev.seq + 1 : this.seqStartIndex;
     const baseSeq = prev ? prev.seq + 1 : this.seqStartIndex;
     updateData.push(
     updateData.push(
@@ -574,7 +577,12 @@ export class Tree {
       }))
       }))
     );
     );
     const curBaseSeq = baseSeq + nodes.length;
     const curBaseSeq = baseSeq + nodes.length;
-    const nextBrothers = prev ? prev.getCtx().nextBrothers() : [];
+    // eslint-disable-next-line no-nested-ternary
+    const nextBrothers = prev
+      ? prev.getCtx().nextBrothers()
+      : next
+      ? [next, ...next.getCtx().nextBrothers()]
+      : [];
     updateData.push(
     updateData.push(
       ...nextBrothers.map((node, index) => ({
       ...nextBrothers.map((node, index) => ({
         ID: node.ID,
         ID: node.ID,

+ 1 - 1
tree/tests/tree.ts

@@ -104,7 +104,7 @@ describe('Tree', () => {
   });
   });
 
 
   it('sameDepthNodes-empty-depth', () => {
   it('sameDepthNodes-empty-depth', () => {
-    const nodes = tree.sameDepthNodes(tree.data, null);
+    const nodes = tree.sameDepthNodes(tree.data);
     const IDList = getIDList(nodes);
     const IDList = getIDList(nodes);
     expect(IDList).to.have.ordered.members(['1', '3', '2', '4', '5']);
     expect(IDList).to.have.ordered.members(['1', '3', '2', '4', '5']);
   });
   });

+ 1 - 1
types/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "@sc/types",
   "name": "@sc/types",
-  "version": "1.0.16",
+  "version": "1.0.25",
   "description": "共用类型文件",
   "description": "共用类型文件",
   "main": "./dist/index.cjs.js",
   "main": "./dist/index.cjs.js",
   "module": "./dist/index.esm.js",
   "module": "./dist/index.esm.js",

+ 30 - 2
types/src/interface/User.ts

@@ -1,16 +1,25 @@
+import { ICompilation, ICptItem } from './compilation';
 /* eslint-disable camelcase */
 /* eslint-disable camelcase */
 export enum ELockInfo {
 export enum ELockInfo {
   BORROW = 1, // 借用
   BORROW = 1, // 借用
   BUY = 2, // 销售
   BUY = 2, // 销售
 }
 }
 
 
-export interface IupgradeInfo {
+export interface IUpgradeInfo {
   compilationID: string;
   compilationID: string;
   isUpgrade: boolean;
   isUpgrade: boolean;
   lock?: ELockInfo;
   lock?: ELockInfo;
   [key: string]: any;
   [key: string]: any;
 }
 }
 
 
+// 实体类型
+export enum EntityType {
+  // 个人
+  PERSON = 1,
+  // 企业
+  ENTERPRISE,
+}
+
 export enum UserType {
 export enum UserType {
   NORMAL = 'normal',
   NORMAL = 'normal',
   PROFESSIONAL = 'professional',
   PROFESSIONAL = 'professional',
@@ -27,7 +36,7 @@ export interface IUserResult {
   email?: string;
   email?: string;
   mobile?: string;
   mobile?: string;
   qq?: string;
   qq?: string;
-  upgrade_list?: IupgradeInfo[]; // 升级购买信息
+  upgrade_list?: IUpgradeInfo[]; // 升级购买信息
   // eslint-disable-next-line camelcase
   // eslint-disable-next-line camelcase
   real_name?: string;
   real_name?: string;
   company?: string;
   company?: string;
@@ -60,3 +69,22 @@ export interface IUser {
   contacts?: IContact[];
   contacts?: IContact[];
   [key: string]: any;
   [key: string]: any;
 }
 }
+
+export interface IUserSession extends IUser {
+  enterpriseID: string; // 企业ID
+}
+
+// 最近联系人
+export interface IRecentUser extends IUser {
+  recentDate: number;
+}
+
+export interface IBootResult {
+  compilation: ICompilation;
+  path: string;
+}
+
+export interface ILoginResult {
+  userInfo: IUser;
+  cptList: ICptItem;
+}

+ 60 - 2
types/src/interface/base.ts

@@ -1,3 +1,11 @@
+import { IProjectGlj } from './glj';
+import { IBill } from './bill';
+import { IProject, IProjectPermission } from './project';
+import { IRation } from './ration';
+import { IFeeRateFile } from './feeRate';
+import { ICalcProgramFile } from './calculation';
+import { IConfigMaterial } from './configMaterial';
+
 export interface IAny {
 export interface IAny {
   [prop: string]: any;
   [prop: string]: any;
 }
 }
@@ -25,6 +33,13 @@ export enum DeleteEnum {
   COMPLETEDELETED,
   COMPLETEDELETED,
 }
 }
 
 
+// 返回数据接口
+export interface IResult<T = any> {
+  errno: number;
+  message: string;
+  data: T;
+}
+
 export enum fromType {
 export enum fromType {
   STD = 'std',
   STD = 'std',
   CPT = 'cpt',
   CPT = 'cpt',
@@ -115,6 +130,12 @@ export enum CptModelName {
   installationFee = 'installationFee',
   installationFee = 'installationFee',
 }
 }
 
 
+// 无数据表的模块名称的枚举
+export enum SubModelName {
+  bookmarks = 'bookmarks', // 书签批注
+  components = 'components', // 组成物
+}
+
 export enum ActionType {
 export enum ActionType {
   ADD = 'add',
   ADD = 'add',
   UPDATE = 'update',
   UPDATE = 'update',
@@ -122,12 +143,29 @@ export enum ActionType {
   DELETE = 'delete',
   DELETE = 'delete',
 }
 }
 
 
+// 特殊的action
+export enum ActionName {
+  // ration相关
+  addStdRations = 'addStdRations', // 添加标准定额
+  resetColMetas = 'resetColMetas', // 重置默认列设置
+}
+
+export interface IBaseFilter {
+  ID: string;
+  prop?: string;
+}
+
+export interface IFilter {
+  ID: string;
+  [key: string]: string;
+}
 // 统一subject更新提交数据入口,为撤销功能做准备
 // 统一subject更新提交数据入口,为撤销功能做准备
 export interface ISetData<T = any> {
 export interface ISetData<T = any> {
   projectID: string; // 考虑到可能会跨项目更新,提高一层
   projectID: string; // 考虑到可能会跨项目更新,提高一层
-  module: CptModelName;
+  module: CptModelName | SubModelName;
   action: ActionType;
   action: ActionType;
-  actionName?: string; // 除了增删改查,还会有更复杂的操作,用这个来区分
+  prop?: string; // 用来指表中的数组属性名,针对如configMaterial里,一个collections 里有多个数组数据的情况
+  actionName?: ActionName; // 除了增删改查,还会有更复杂的操作,用这个来区分
   filter?: any; // 查询条件
   filter?: any; // 查询条件
   update?: any; // 和update类型对应,
   update?: any; // 和update类型对应,
   documents?: T[]; // add 类型对应,批量插入
   documents?: T[]; // add 类型对应,批量插入
@@ -147,3 +185,23 @@ export interface IColumnMeta {
   visible?: boolean;
   visible?: boolean;
   source?: string[];
   source?: string[];
 }
 }
+
+// subject getData数据接口
+export interface ISubjectGetData {
+  project: IProject;
+  [CptModelName.bills]: IBill[];
+  [CptModelName.rations]: IRation[];
+  [CptModelName.projectGljs]: IProjectGlj[];
+  [CptModelName.feeRateFile]: IFeeRateFile;
+  [CptModelName.calcProgramFile]: ICalcProgramFile;
+  [CptModelName.configMaterials]: IConfigMaterial;
+}
+
+// getData数据接口
+export interface IGetData {
+  subject: ISubjectGetData;
+  construction: { project?: IProject };
+  treeData: IProject[];
+  isOwner: boolean;
+  projectsPermission: IProjectPermission[];
+}

+ 44 - 5
types/src/interface/bill.ts

@@ -1,4 +1,5 @@
-import { BRType } from './base';
+import { BRType, ITreeScm } from './base';
+import { IQuantityDetail } from './quantityDetail';
 
 
 export interface IJobContent {
 export interface IJobContent {
   serialNo: number;
   serialNo: number;
@@ -15,6 +16,21 @@ export interface IItemCharacter {
   eigenvalue: IEigenvalue[];
   eigenvalue: IEigenvalue[];
   isChecked: boolean;
   isChecked: boolean;
 }
 }
+// 书签
+export interface IBookmark {
+  ID: string;
+  type: string;
+  content: string;
+  creatorName: string;
+  creatorID: string;
+  createTime: number;
+  telNo: string;
+}
+// 修改书签
+export interface ISetBookmark {
+  ID: string;
+  content: string;
+}
 export interface IBill {
 export interface IBill {
   ID: string;
   ID: string;
   parentID: string;
   parentID: string;
@@ -26,6 +42,7 @@ export interface IBill {
   name?: string;
   name?: string;
   flag?: number; // 清单固定类别
   flag?: number; // 清单固定类别
   quantity?: number;
   quantity?: number;
+  quantityDetails?: IQuantityDetail[]; // 工程量明细 -- 原先保存在另外的表中
   recharge?: string; // 补注
   recharge?: string; // 补注
   ruleText?: string; // 工程量计算规则
   ruleText?: string; // 工程量计算规则
   jobContent?: IJobContent[]; // 工作内容
   jobContent?: IJobContent[]; // 工作内容
@@ -35,6 +52,7 @@ export interface IBill {
   formula?: string; // 基数计算
   formula?: string; // 基数计算
   formulaValue?: number; // 基数计算的值
   formulaValue?: number; // 基数计算的值
   tenderFormulaValue?: number; // 调价基数计算的值
   tenderFormulaValue?: number; // 调价基数计算的值
+  bookMark?: IBookmark; // 书签批注
   [key: string]: any; // 剩下的之后补充
   [key: string]: any; // 剩下的之后补充
 }
 }
 
 
@@ -65,10 +83,11 @@ export interface IJobOrItem {
   serialNo: number;
   serialNo: number;
 }
 }
 
 
-export interface IStdBill {
+// 标准清单原始数据
+export interface IStdBillResult {
   ID: string;
   ID: string;
-  parentID: string;
-  seq: number;
+  ParentID: string;
+  NextSiblingID: string;
   code: string;
   code: string;
   name: string;
   name: string;
   unit: string;
   unit: string;
@@ -85,7 +104,27 @@ export interface IStdBill {
   quantityIndexType: string; // 工程量指标类别
   quantityIndexType: string; // 工程量指标类别
   quantityIndexUnit: string; // 工程量指标单位
   quantityIndexUnit: string; // 工程量指标单位
   quantityIndexCoe: number; // 单位转换系数
   quantityIndexCoe: number; // 单位转换系数
-  deleted: boolean;
+  deleted?: boolean;
+}
+
+// 标准清单(更正属性命名规范)
+export interface IStdBill extends ITreeScm {
+  code: string;
+  name: string;
+  unit: string;
+  ruleText: string;
+  engineering: number; // 工程专业,填计算程序工程专业ID
+  expression: string;
+  comment: string; // 备注,后台清单精灵录入
+  jobs: IJobOrItem[];
+  items: IJobOrItem[];
+  recharge: string;
+  billLibID: number;
+  // 经济指标属性
+  economicType: string; // 工程经济指标类别
+  quantityIndexType: string; // 工程量指标类别
+  quantityIndexUnit: string; // 工程量指标单位
+  quantityIndexCoe: number; // 单位转换系数
 }
 }
 
 
 // 清单固定类别
 // 清单固定类别

+ 67 - 0
types/src/interface/billGuide.ts

@@ -0,0 +1,67 @@
+import { ITreeScm } from './base';
+
+// 指引库类型
+export enum BillGuideLibType {
+  // 清单指引
+  GUIDE = 1,
+  // 清单精灵
+  ELF,
+}
+
+// 标准指引库
+export interface IBillGuideLibResult {
+  type: BillGuideLibType;
+  ID: string;
+  compilationId: string;
+  compilationName: string;
+  billsLibId: number;
+  billsLibName: string;
+  name: string;
+  creator: string;
+  createDate: string;
+  deleted?: boolean;
+}
+
+// 标准指引库(更正命名)
+export interface IBillGuideLib {
+  type: BillGuideLibType;
+  ID: string;
+  compilationID: string;
+  compilationName: string;
+  billsLibID: number;
+  billLibName: string;
+  name: string;
+  creator: string;
+  createDate: string;
+}
+
+// 指引项类型
+export enum BillGuideItemType {
+  // 工作内容
+  CONTENT = 0,
+  // 定额
+  RATION,
+}
+
+// 指引原数据
+export interface IBillGuideItemResult {
+  libID: string;
+  ID: string;
+  ParentID: string;
+  NextSiblingID: string;
+  billsID: string;
+  name: string;
+  type: BillGuideItemType;
+  rationID?: number;
+  deleted?: boolean;
+}
+
+// 指引数据
+export interface IBillGuideItem extends ITreeScm {
+  libID: string;
+  ID: string;
+  billID: string;
+  name: string;
+  type: BillGuideItemType;
+  rationID?: number;
+}

+ 1 - 1
types/src/interface/calculation.ts

@@ -57,5 +57,5 @@ export interface ICalcProgramFile {
   name: string;
   name: string;
   libID: number;
   libID: number;
   libName: string;
   libName: string;
-  templates: ICalcTemplate[];
+  programs: ICalcTemplate[];
 }
 }

+ 77 - 0
types/src/interface/configMaterial.ts

@@ -0,0 +1,77 @@
+// 暂估材料
+export interface IEvaluateMaterial {
+  ID: string;
+  isRelated: boolean; // 关联,true 关,false不关
+  projectGljID?: string; // 关联工料机ID
+  seq?: string; // 序号
+  code?: string;
+  name?: string;
+  specs?: string;
+  unit?: string;
+  type?: number;
+  marketPrice?: number;
+  quantity?: number;
+  totalPrice?: number; // 合价
+  locked: boolean; // 锁定,true 锁,false 不锁 默认false
+  remark?: string;
+  originPlace?: string; // 产地
+  vender?: string; // 厂家
+}
+
+// 评标材料
+export interface IBidEvaluationMaterial {
+  ID: string;
+  isRelated: boolean; // 关联,true 关,false不关
+  projectGljID?: string; // 关联工料机ID
+  seq?: string; // 序号
+  code?: string;
+  name?: string;
+  specs?: string;
+  unit?: string;
+  type?: number;
+  marketPrice?: number;
+  quantity?: number;
+  totalPrice?: number; // 合价
+  remark?: string;
+  originPlace?: string; // 产地
+  vender?: string; // 厂家
+}
+
+// 承包人主要材料
+export interface IContractorMaterial {
+  ID: string;
+  isRelated: boolean; // 关联,true 关,false不关
+  projectGljID?: string; // 关联工料机ID
+  seq?: string; // 序号
+  code?: string;
+  name?: string;
+  specs?: string;
+  unit?: string;
+  type?: number;
+  riskCoe?: string; // 风险系数
+  standardPrice?: string; // 基准单价
+  FO?: string; // 基本价格指数
+  FI?: string; // 现行价格指数
+  marketPrice?: number;
+  quantity?: number;
+  totalPrice?: number; // 合价
+  remark?: string;
+  supply?: number;
+  originPlace?: string; // 产地
+  vender?: string; // 厂家
+}
+
+// 配置材料的几个属性
+export enum ConfigMaterialKey {
+  EVALUATE = 'evaluateMaterials',
+  BID = 'bidEvaluateMaterials',
+  CONTRACTOR = 'contractorMaterials',
+}
+
+// 设置材料
+export interface IConfigMaterial {
+  projectID: string;
+  [ConfigMaterialKey.EVALUATE]: IEvaluateMaterial[];
+  [ConfigMaterialKey.BID]: IBidEvaluationMaterial[];
+  [ConfigMaterialKey.CONTRACTOR]: IContractorMaterial[];
+}

+ 0 - 1
types/src/interface/feeRate.ts

@@ -33,7 +33,6 @@ export interface IFeeRate extends ITreeScm {
 export interface IFeeRateFile {
 export interface IFeeRateFile {
   ID: string;
   ID: string;
   projectID: string;
   projectID: string;
-  userID: string;
   name: string;
   name: string;
   libID: string;
   libID: string;
   libName: string;
   libName: string;

+ 31 - 10
types/src/interface/glj.ts

@@ -4,6 +4,7 @@ import { fromType, supplyType } from './base';
 export enum GljType {
 export enum GljType {
   LABOUR = 1, // 人工
   LABOUR = 1, // 人工
   // ==============材料类型 ↓=================
   // ==============材料类型 ↓=================
+  MATERIAL = 2, // 材料
   GENERAL_MATERIAL = 201, // 普通材料
   GENERAL_MATERIAL = 201, // 普通材料
   CONCRETE = 202, // 混凝土
   CONCRETE = 202, // 混凝土
   MORTAR = 203, // 砂浆
   MORTAR = 203, // 砂浆
@@ -37,7 +38,7 @@ export interface IBaseGlj {
   code: string;
   code: string;
   name: string;
   name: string;
   specs?: string;
   specs?: string;
-  type: number;
+  type: GljType;
   unit: string;
   unit: string;
   [key: string]: any;
   [key: string]: any;
 }
 }
@@ -84,27 +85,44 @@ export interface IComponent {
   unit: string; // 单位
   unit: string; // 单位
   name: string; // 名称
   name: string; // 名称
   code: string; // 对应工料机code
   code: string; // 对应工料机code
-  type: number; // 工料机类型
+  type: GljType; // 工料机类型
   model?: number; // 机型
   model?: number; // 机型
   from: fromType; // std, cpt  来自标准工料机库、补充工料机库
   from: fromType; // std, cpt  来自标准工料机库、补充工料机库
 }
 }
 
 
+export enum MaterialType {
+  GC = 1,
+  GJ = 2,
+  MC = 3,
+  SN = 4,
+  SPT = 5,
+  SPSJ = 6,
+}
+
+export const MaterialDisplay = {
+  1: '钢材',
+  2: '钢筋',
+  3: '木材',
+  4: '水泥',
+  5: '商品砼',
+  6: '商品砂浆',
+};
+
 export interface IProjectGlj {
 export interface IProjectGlj {
   ID: string;
   ID: string;
   gljID: string; // 工料机ID
   gljID: string; // 工料机ID
   code: string; // 编码
   code: string; // 编码
   originalCode: string; // 原始的编码
   originalCode: string; // 原始的编码
   name: string; // 名称
   name: string; // 名称
-  isEvaluate?: boolean; // 是否暂估 (false为否 true为是) //这个属性考虑放弃
   supply: supplyType; // 供货方式
   supply: supplyType; // 供货方式
   supplyQuantity?: number; // 甲供数量
   supplyQuantity?: number; // 甲供数量
   delivery?: string; // 交货方式
   delivery?: string; // 交货方式
   deliveryAddress?: string; // 送达地点
   deliveryAddress?: string; // 送达地点
   noAdjustPrice: boolean; // 不调价  { type: boolean; default: false }
   noAdjustPrice: boolean; // 不调价  { type: boolean; default: false }
-  nTaxEqp: boolean; // 不计税设备  { type: boolean; default: false }
+  noTaxEqp?: boolean; // 不计税设备  { type: boolean; default: false }
   adjCoe?: number; // 调整系数ID
   adjCoe?: number; // 调整系数ID
   specs: string; // 规格型号
   specs: string; // 规格型号
-  type: number; // 类型
+  type: GljType; // 类型
   model?: number; // 机型
   model?: number; // 机型
   unit: string; // 单位
   unit: string; // 单位
   isAdd: boolean; // 是否新增
   isAdd: boolean; // 是否新增
@@ -114,11 +132,13 @@ export interface IProjectGlj {
   taxRate?: number; // 税率
   taxRate?: number; // 税率
   adjustPrice?: string; // 显示调整基价
   adjustPrice?: string; // 显示调整基价
   quantity?: number; // 显示关联的消耗量
   quantity?: number; // 显示关联的消耗量
-  techQuantity?: string; // 技术措施项目消耗量
-  subdivisionQuantity?: string; // 分部分项消耗量
-  tenderPrice?: string; // 调整后价格
-  materialType?: number; // 三材类别
+  tenderQuantity?: number; // 调整后消耗量
+  techQuantity?: number; // 技术措施项目消耗量
+  subdivisionQuantity?: number; // 分部分项消耗量
+  tenderPrice?: number; // 调整后价格
+  materialType?: MaterialType; // 三材类别
   materialCoe?: number; // 三材系数
   materialCoe?: number; // 三材系数
+  materialQuantity?: number; // 三材量
   // 经济指标数据
   // 经济指标数据
   materialIndexType?: string; // 工料指标类别
   materialIndexType?: string; // 工料指标类别
   materialIndexUnit?: string; // 工料指标单位
   materialIndexUnit?: string; // 工料指标单位
@@ -127,8 +147,9 @@ export interface IProjectGlj {
   remark?: string;
   remark?: string;
   originPlace?: string; // 产地
   originPlace?: string; // 产地
   vender?: string; // 厂家
   vender?: string; // 厂家
-  qualityGrace?: string; // 质量等级
+  qualityGrade?: string; // 质量等级
   brand?: string; // 品牌
   brand?: string; // 品牌
+  priceFrom?: string; // 价格来源
   from: fromType; // std, cpt  来自标准工料机库、补充工料机库
   from: fromType; // std, cpt  来自标准工料机库、补充工料机库
 }
 }
 
 

+ 5 - 0
types/src/interface/index.ts

@@ -10,5 +10,10 @@ export * from './feeRate';
 export * from './share';
 export * from './share';
 export * from './ration';
 export * from './ration';
 export * from './bill';
 export * from './bill';
+export * from './billGuide';
 export * from './glj';
 export * from './glj';
 export * from './option';
 export * from './option';
+export * from './quantityDetail';
+export * from './report';
+export * from './configMaterial';
+export * from './socket';

+ 32 - 10
types/src/interface/project.ts

@@ -1,15 +1,11 @@
+import { EntityType } from './User';
 import { ValuationType } from './compilation';
 import { ValuationType } from './compilation';
-import { ILabourCoeFile } from './labourCoe';
 import { IIncreaseSetting } from './increaseFee';
 import { IIncreaseSetting } from './increaseFee';
-import {
-  ITreeScm,
-  IFileRef,
-  DeleteEnum,
-  INumFileRef,
-  IColumnMeta,
-} from './base';
+import { ITreeScm, DeleteEnum, INumFileRef, IColumnMeta } from './base';
 import { ICalcOption, ITenderSetting } from './calculation';
 import { ICalcOption, ITenderSetting } from './calculation';
+import { ISharePermission } from './share';
 
 
+// 项目类型
 export enum ProjectType {
 export enum ProjectType {
   FOLDER = 1,
   FOLDER = 1,
   CONSTRUCTION, // 建设项目
   CONSTRUCTION, // 建设项目
@@ -17,6 +13,13 @@ export enum ProjectType {
   UNIT, // 单位工程
   UNIT, // 单位工程
 }
 }
 
 
+export const projectTextMap = {
+  [ProjectType.FOLDER]: '文件夹',
+  [ProjectType.CONSTRUCTION]: '建设项目',
+  [ProjectType.SINGLE]: '单项工程',
+  [ProjectType.UNIT]: '单位工程',
+};
+
 export interface IGLJCol {
 export interface IGLJCol {
   showAdjustPrice?: boolean;
   showAdjustPrice?: boolean;
 }
 }
@@ -212,7 +215,9 @@ export enum ImportType {
 export interface IProject extends ITreeScm {
 export interface IProject extends ITreeScm {
   type: ProjectType;
   type: ProjectType;
   compilationID: string;
   compilationID: string;
-  userID: string;
+  ownerID: string;
+  ownerType: EntityType;
+  creator: string;
   name: string;
   name: string;
   code?: string;
   code?: string;
   createDate: number;
   createDate: number;
@@ -228,7 +233,12 @@ export interface IProject extends ITreeScm {
   deleteBy?: string;
   deleteBy?: string;
   // 只是为了显示,不是自身的正在数据,比如汇总信息等
   // 只是为了显示,不是自身的正在数据,比如汇总信息等
   external?: {
   external?: {
-    cost: number; // 工程造价
+    cost?: number; // 工程造价
+    // 有时候为了显示,需要一些特殊处理日期。如:项目管理-回收站,建设项目、单项工程的删除日期和创建日期需要显示为空
+    deleteDateForView?: number;
+    createDateForView?: number;
+    actualTreeData?: ITreeScm; // 真正的树结构数据。有时候可能需要暂时变更project的树结构数据,在这种时候需要存储原本的真实树结构数据
+    from?: string; // 来自于某用户名称
   };
   };
 }
 }
 
 
@@ -247,3 +257,15 @@ export interface IConstructionDefaultSetting {
   calcOption: IProperty['calcOption'];
   calcOption: IProperty['calcOption'];
   colMetas: IProject['colMetas'];
   colMetas: IProject['colMetas'];
 }
 }
+
+// 项目权限
+export interface IProjectPermission {
+  projectID: string;
+  share: ISharePermission;
+}
+
+// constructionTreeData接口
+export interface IConstructionTreeData {
+  construction: { project: IProject };
+  treeData: IProject[];
+}

+ 7 - 0
types/src/interface/quantityDetail.ts

@@ -0,0 +1,7 @@
+export interface IQuantityDetail {
+  ID: string;
+  name?: string;
+  regex?: string;
+  result?: number;
+  isSummation: boolean; // 0:false 1:true
+}

+ 18 - 10
types/src/interface/ration.ts

@@ -3,10 +3,12 @@ import {
   prefix,
   prefix,
   fromType,
   fromType,
   gljCreateType,
   gljCreateType,
-  supplyType,
   createLocation,
   createLocation,
   BRType,
   BRType,
 } from './base';
 } from './base';
+import { IBookmark } from './bill';
+import { GljType, MaterialType } from './glj';
+import { IQuantityDetail } from './quantityDetail';
 
 
 export interface IStdRationChapter {
 export interface IStdRationChapter {
   rationRepId: number; // 标准库的属性
   rationRepId: number; // 标准库的属性
@@ -184,7 +186,7 @@ export interface IBaseRationGlj {
   shortName: string;
   shortName: string;
   unit: string;
   unit: string;
   adjCoe: number;
   adjCoe: number;
-  materialType: number; // 三材类别
+  materialType: MaterialType; // 三材类别
   materialCoe: number; // 三材系数
   materialCoe: number; // 三材系数
   // 经济指标数据
   // 经济指标数据
   materialIndexType: string; // 工料指标类别
   materialIndexType: string; // 工料指标类别
@@ -204,7 +206,7 @@ export interface IRationGlj {
   rcode?: string; // 替换工料机后记录原来的工料机编码,要做判断
   rcode?: string; // 替换工料机后记录原来的工料机编码,要做判断
   specs?: string;
   specs?: string;
   unit: string;
   unit: string;
-  type: number;
+  type: GljType;
   model?: number; // 机型
   model?: number; // 机型
   adjCoe?: number; // 调整系数ID
   adjCoe?: number; // 调整系数ID
   quantity: number;
   quantity: number;
@@ -231,11 +233,11 @@ export interface ICptRationGlj extends IBaseRationGlj {
 }
 }
 
 
 export interface IGljQtyCoe {
 export interface IGljQtyCoe {
-  labour: string; // 人工
-  material: string; // 材料
-  machine: string; // 机械
-  main: string; // 主材
-  equipment: string; // 设备
+  labour: number; // 人工
+  material: number; // 材料
+  machine: number; // 机械
+  main: number; // 主材
+  equipment: number; // 设备
 }
 }
 
 
 // 实际保存到项目中的辅助定额数据
 // 实际保存到项目中的辅助定额数据
@@ -291,7 +293,7 @@ export interface IRation {
   programID?: number;
   programID?: number;
   fees?: any; // 费用字段
   fees?: any; // 费用字段
   gljQtyCoe?: IGljQtyCoe; // 工料机消耗量调整系数字段
   gljQtyCoe?: IGljQtyCoe; // 工料机消耗量调整系数字段
-  rationQtyCoe?: string; // 子目工程量调整系数
+  rationQtyCoe?: number; // 子目工程量调整系数
   tenderQuantity?: string; // 调整后工程量
   tenderQuantity?: string; // 调整后工程量
   noAdjustPrice?: boolean; // { type: boolean; default: false }; // 不调价
   noAdjustPrice?: boolean; // { type: boolean; default: false }; // 不调价
   targetUnitFee?: string; // 目标单价
   targetUnitFee?: string; // 目标单价
@@ -331,10 +333,11 @@ export interface IRation {
   // 定额子项
   // 定额子项
   rationGljList?: IRationGlj[]; // 定额工料机
   rationGljList?: IRationGlj[]; // 定额工料机
   rationAssList?: IRationAss[]; // 辅助定额
   rationAssList?: IRationAss[]; // 辅助定额
-  quantityDetails?: any; // 工程量明细 -- 原先保存在另外的表中
+  quantityDetails?: IQuantityDetail[]; // 工程量明细 -- 原先保存在另外的表中
   rationCoeList?: IRationCoe[]; // 定额调整系数
   rationCoeList?: IRationCoe[]; // 定额调整系数
   rationTemplate?: IRationTemplate; // 定额模板
   rationTemplate?: IRationTemplate; // 定额模板
   rationInstallList?: IRationInstall[]; // 定额安装增加
   rationInstallList?: IRationInstall[]; // 定额安装增加
+  bookmarks?: IBookmark[];
 }
 }
 
 
 export interface IRations {
 export interface IRations {
@@ -342,3 +345,8 @@ export interface IRations {
   index: number;
   index: number;
   rations: IRation[];
   rations: IRation[];
 }
 }
+
+export interface IStdRationsAndGljs {
+  rations: (IStdRation | ICptRation)[];
+  rationGljs: (IStdRationGlj | ICptRationGlj)[];
+}

+ 16 - 0
types/src/interface/report.ts

@@ -0,0 +1,16 @@
+export interface ReportSubTree {
+  nodeType: number;
+  refId: number;
+  name: string;
+  ID: number;
+  released: boolean;
+  items: ReportSubTree[] | null;
+}
+export interface ReportTree {
+  compilationId: string;
+  userId: string;
+  released: boolean;
+  isDeleted: boolean;
+  name: string;
+  items: ReportSubTree[] | null;
+}

+ 29 - 8
types/src/interface/share.ts

@@ -1,3 +1,5 @@
+import { IUser } from './User';
+
 export enum ShareType {
 export enum ShareType {
   PROJECT = 1, // 项目
   PROJECT = 1, // 项目
   RATION_LIB, // 定额库
   RATION_LIB, // 定额库
@@ -5,21 +7,24 @@ export enum ShareType {
   PRICE_TEMPLATE, // 租价模板
   PRICE_TEMPLATE, // 租价模板
 }
 }
 
 
-export interface IShareProject {
+// 分享权限
+export interface ISharePermission {
+  allowCopy: boolean;
+  allowCooperate: boolean;
+}
+
+export interface IShareProject extends ISharePermission {
   shareDate?: number;
   shareDate?: number;
   updateDate?: number;
   updateDate?: number;
   projectID: string; // 项目ID
   projectID: string; // 项目ID
+  compilationID: string;
   isRead?: boolean;
   isRead?: boolean;
-  allowCopy: boolean;
-  allowCooperate: boolean;
 }
 }
 
 
-export interface IShareLib {
+export interface IShareLib extends ISharePermission {
   shareDate?: number;
   shareDate?: number;
   updateDate?: number;
   updateDate?: number;
   compilationID: string;
   compilationID: string;
-  allowCopy: boolean;
-  allowCooperate: boolean;
 }
 }
 
 
 export interface IShare {
 export interface IShare {
@@ -35,13 +40,23 @@ export interface IShare {
 
 
 export type ShareItem = IShareProject | IShareLib;
 export type ShareItem = IShareProject | IShareLib;
 
 
+// 分享历史
+export interface IShareHistory extends ISharePermission {
+  ID: string; // 分享ID
+  user: IUser;
+  shareType: ShareType;
+  projectID?: string;
+  compilationID?: string;
+}
+
 export interface ICreatShare {
 export interface ICreatShare {
+  receiver: string;
   doc: ShareItem;
   doc: ShareItem;
   type: ShareType;
   type: ShareType;
 }
 }
 
 
 export interface IUpdateShare {
 export interface IUpdateShare {
-  filter: { projectID?: string; compilationID?: string };
+  filter: { ID: string; projectID?: string; compilationID?: string };
   update: {
   update: {
     updateDate?: number;
     updateDate?: number;
     isRead?: boolean;
     isRead?: boolean;
@@ -52,6 +67,12 @@ export interface IUpdateShare {
 }
 }
 
 
 export interface IDelShare {
 export interface IDelShare {
-  filter: { projectID?: string; compilationID?: string };
+  filter: { ID: string; projectID?: string; compilationID?: string };
   type: ShareType;
   type: ShareType;
 }
 }
+
+export interface IBulkShare {
+  update?: IUpdateShare[];
+  create?: ICreatShare[];
+  remove?: IDelShare[];
+}

+ 5 - 0
types/src/interface/socket.ts

@@ -0,0 +1,5 @@
+/* eslint-disable import/prefer-default-export */
+export enum SocketEvent {
+  TEST = 'test',
+  JOIN = 'join',
+}

+ 2 - 2
util/package.json

@@ -1,7 +1,7 @@
 {
 {
   "name": "@sc/util",
   "name": "@sc/util",
-  "version": "1.0.0",
-  "description": "4舍5入算法,防止浮点数计算不精确问题",
+  "version": "1.0.1",
+  "description": "共用的工具包",
   "main": "./dist/index.cjs.js",
   "main": "./dist/index.cjs.js",
   "module": "./dist/index.esm.js",
   "module": "./dist/index.esm.js",
   "browser": "./dist/index.min.js",
   "browser": "./dist/index.min.js",

+ 59 - 1
util/src/bill.ts

@@ -1,10 +1,23 @@
-import { IJobContent, IItemCharacter } from '@sc/types';
+import {
+  IJobContent,
+  IItemCharacter,
+  IStdBill,
+  IStdJobContent,
+  IStdItemCharacter,
+} from '@sc/types';
 
 
 interface IJobsAndCharacterText {
 interface IJobsAndCharacterText {
   jobContentText: string;
   jobContentText: string;
   itemCharacterText: string;
   itemCharacterText: string;
 }
 }
 
 
+interface IJobContentMap {
+  [id: string]: IStdJobContent;
+}
+interface IItemCharacterMap {
+  [id: string]: IStdItemCharacter;
+}
+
 export interface IJobAndCharacter extends IJobsAndCharacterText {
 export interface IJobAndCharacter extends IJobsAndCharacterText {
   jobContents: IJobContent[];
   jobContents: IJobContent[];
   itemCharacters: IItemCharacter[];
   itemCharacters: IItemCharacter[];
@@ -32,3 +45,48 @@ export const getJobsAndCharacterText = (
   itemCharacterText = textArray.join('\n');
   itemCharacterText = textArray.join('\n');
   return { jobContentText, itemCharacterText };
   return { jobContentText, itemCharacterText };
 };
 };
+
+export const getJobContents = (
+  stdBill: IStdBill,
+  stdJobContenMap: IJobContentMap
+): IJobContent[] => {
+  const jobs: IJobContent[] = [];
+  let i = 1;
+  for (const j of stdBill.jobs) {
+    const job = stdJobContenMap[j.id];
+    if (job) {
+      jobs.push({ serialNo: i + 1, content: job.content, isChecked: true });
+      i += 1;
+    }
+  }
+
+  return jobs;
+};
+
+export const getItemCharacters = (
+  stdBill: IStdBill,
+  itemCharacterMap: IItemCharacterMap
+): IItemCharacter[] => {
+  const characters: IItemCharacter[] = [];
+  let i = 1;
+  for (const item of stdBill.items) {
+    const character = itemCharacterMap[item.id];
+    if (character) {
+      const newItem: IItemCharacter = {
+        serialNo: i + 1,
+        character: character.content,
+        eigenvalue: [],
+        isChecked: false,
+      };
+      const eigenvalues = character.itemValue;
+      for (let j = 0; j < eigenvalues.length; j += 1) {
+        const newValue = { value: eigenvalues[j].value, isSelected: false };
+        newItem.eigenvalue.push(newValue);
+      }
+      characters.push(newItem);
+      i += 1;
+    }
+  }
+
+  return characters;
+};

+ 1 - 0
util/src/index.ts

@@ -1 +1,2 @@
 export * from './math';
 export * from './math';
+export * from './bill';