Przeglądaj źródła

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

vian 5 lat temu
rodzic
commit
edd84d3cda

+ 42 - 41
report/src/core/helper/jpc_helper_area.ts

@@ -1,93 +1,94 @@
 'use strict';
 
+import { IArea, IBandDetail } from '../../interface/basic';
 import JV from '../jpc_value_define';
 
 const JpcAreaHelper = {
-    outputArea: function(areaNode: any, band: any, unitFactor: number, rowAmount: number, rowIdx: number, colAmount: number, colIdx: number, 
+    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 = {
-            [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;
         if (multipleDispCol > 0 && multipleDispCol <= maxMultiColumns) {
             //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;
             let innerLeft = 0.0, innerRight = areaWidth;
             //
-            if (typeof areaNode[JV.PROP_H_CALCULATION]  === "string") {
-                switch (areaNode[JV.PROP_H_CALCULATION]) {
+            if (typeof areaNode.H_CalculationType  === "string") {
+                switch (areaNode.H_CalculationType) {
                     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);
+                        innerLeft = (1.0 * areaNode.Left * areaWidth / JV.HUNDRED_PERCENT);
+                        innerRight = (1.0 * areaNode.Right * areaWidth / JV.HUNDRED_PERCENT);
                         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;
+                        innerLeft = 1.0 * areaNode.Left * unitFactor;
+                        innerRight = 1.0 * areaNode.Right * unitFactor;
                         break;
                 }
             } 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 {
-                    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 {
-                    innerRight = 1.0 * areaNode[JV.PROP_RIGHT] * unitFactor;
+                    innerRight = 1.0 * areaNode.Right * unitFactor;
                 }
             }
             //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;
             let innerTop = 0.0, innerBottom = areaHeight;
-            if (typeof areaNode[JV.PROP_V_CALCULATION]  === "string") {
-                switch (areaNode[JV.PROP_V_CALCULATION]) {
+            if (typeof areaNode.V_CalculationType  === "string") {
+                switch (areaNode.V_CalculationType) {
                     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);
+                        innerTop = (1.0 * areaNode.Top * areaHeight / JV.HUNDRED_PERCENT);
+                        innerBottom = (1.0 * areaNode.Bottom * areaHeight / JV.HUNDRED_PERCENT);
                         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;
+                        innerTop = 1.0 * areaNode.Top * unitFactor;
+                        innerBottom = 1.0 * areaNode.Bottom * unitFactor;
                         break;
                 }
             } 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 {
-                    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 {
-                    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;
             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 {
-                rstBottom = Math.round(1.0 * band[JV.PROP_TOP] + areaHeight * rowIdx + innerBottom);
+                rstBottom = Math.round(1.0 * band.Top + areaHeight * rowIdx + innerBottom);
             }
             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 {
-                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;
     }

+ 36 - 35
report/src/core/helper/jpc_helper_band.ts

@@ -1,5 +1,6 @@
 'use strict';
 
+import { IBandDetail, IBands, IRptTpl } from '../../interface/basic';
 import JV from '../jpc_value_define';
 import JpcCommonHelper from './jpc_helper_common';
 
@@ -9,85 +10,85 @@ let JpcBandHelper = {
         if (rst < 0) rst = JV.STATUS_NORMAL;
         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;
-        if (rptTpl[JV.NODE_BAND_COLLECTION]) {
+        if (rptTpl.布局框_集合) {
             isOnlyNormalStatus = isOnlyNormalStatus||false;
             isOnlyExStatus = isOnlyExStatus||false;
 
             let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
             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: IBandDetail, orgArea: any, unitFactor: number, pageStatus: boolean[], isOnlyNormalStatus: boolean, isOnlyExStatus: boolean) {
+        let me = this, band = bands[bandNode.Name];
         //0. for multi flow purpose
         if (isOnlyNormalStatus) {
-            if (bandNode.hasOwnProperty(JV.PROP_BAND_EX_ONLY) && JpcCommonHelper.getBoolean(bandNode[JV.PROP_BAND_EX_ONLY])) {
+            if (bandNode.hasOwnProperty(JV.PROP_BAND_EX_ONLY) && JpcCommonHelper.getBoolean(bandNode.exOnly)) {
                 return;
             }
         }
         if (isOnlyExStatus) {
-            if (bandNode.hasOwnProperty(JV.PROP_BAND_NORMAL_ONLY) && !(JpcCommonHelper.getBoolean(bandNode[JV.PROP_BAND_NORMAL_ONLY]))) {
+            if (bandNode.hasOwnProperty(JV.PROP_BAND_NORMAL_ONLY) && !(JpcCommonHelper.getBoolean(bandNode.normalOnly))) {
                 return;
             }
         }
         //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[JV.IDX_LEFT];
+        band.Top = orgArea[JV.IDX_TOP];
+        band.Right = orgArea[JV.IDX_RIGHT];
+        band.Bottom = orgArea[JV.IDX_BOTTOM];
         //2. set this band
-        if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
-            switch (band[JV.BAND_PROP_ALIGNMENT]) {
+        if (pageStatus[(band.BDisplayType) as number]) {
+            switch (band.Alignment) {
                 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 {
-                        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;
                     break;
                 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 {
-                        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;
                     break;
                 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 {
-                        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;
                     break;
                 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 {
-                        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;
                     break;
             }
             //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];
-                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: IBandDetail[], bands: IBands, contentBand: IBandDetail, offsetX: number, offsetY: number) {
         let orgX = contentBand.Right, orgY = contentBand.Bottom;
-        function _chkAndResetPos(targetBand: any) {
+        function _chkAndResetPos(targetBand: IBandDetail) {
             let band = bands[targetBand.Name];
             if (band) {
                 if (band === contentBand) {
@@ -103,13 +104,13 @@ let JpcBandHelper = {
                     if (band.Left >= orgX) {
                         band.Left += 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;
                     }
                 }
-                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]);
                     }
                 }
             }

+ 32 - 27
report/src/core/helper/jpc_helper_common.ts

@@ -1,18 +1,19 @@
 'use strict';
 
+import { IArea, IControlCollection, IControlSubCollection, IRptTpl,IStyles } from '../../interface/basic';
 import JV from '../jpc_value_define';
 
 const RESOLUTION = [96, 96];
 
 const JpcCommonHelper = {
-    getResultByID(KeyID: string, collectionList: any[]) {
+    getResultByID(KeyID: string, collectionList: IStyles[][]|IControlCollection[]) {
         let rst = null;
         if (KeyID) {
             for (let i = 0; i < collectionList.length; i++) {
                 let collection = collectionList[i];
                 if (collection && collection instanceof Array) {
                     for (let j = 0; j < collection.length; j++) {
-                        if (collection[j][JV.PROP_ID] === KeyID) {
+                        if (collection[j].ID === KeyID) {
                             rst = collection[j];
                             break;
                         }
@@ -23,21 +24,25 @@ const JpcCommonHelper = {
         }
         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 = [];
-        if (rptTpl) list.push(rptTpl[JV.NODE_FONT_COLLECTION]);
+        // if (rptTpl) list.push(rptTpl.control_collection); //by lish ,多余参数,
         list.push(dftFonts);
         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 = [];
-        if (rptTpl) list.push(rptTpl[JV.NODE_STYLE_COLLECTION]);
+        // if (rptTpl) list.push(rptTpl.control_collection);   //by lish ,多余参数,
         list.push(dftStyles);
         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:IControlCollection, rptTpl?: IRptTpl) {
+        let me = this, list = [] as IControlCollection[];
+        if (rptTpl) list.push(rptTpl.control_collection);
         list.push(dftControls);
         return me.getResultByID(controlName, list);
     },
@@ -51,7 +56,7 @@ const JpcCommonHelper = {
         if (rst < 0) rst = JV.CAL_TYPE_ABSTRACT;
         return rst;
     },
-    getBoolean(bStr: any) {
+    getBoolean(bStr: any) {  //暂定
         let rst = false;
         if (bStr !== null && bStr !== undefined) {
             let valType = typeof(bStr);
@@ -59,9 +64,9 @@ const JpcCommonHelper = {
                 rst = bStr;
             } else if (valType === 'string') {
                 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') {
-                rst = (bStr === 1);
+                rst = (bStr === 1)   ;
             }
         }
         return rst;
@@ -69,9 +74,9 @@ const JpcCommonHelper = {
     getScreenDPI() {
         return RESOLUTION.slice(0);
     },
-    getUnitFactor(rptTpl: any) {
+    getUnitFactor(rptTpl: IRptTpl) {
         let me = this;
-        return me.translateUnit(rptTpl[JV.NODE_MAIN_INFO][JV.PROP_UNITS]);
+        return me.translateUnit(rptTpl.主信息.单位);
     },
     translateUnit(unitStr: string) {
         let me = this, rst = 1.0;
@@ -87,16 +92,16 @@ const JpcCommonHelper = {
         }
         return rst;
     },
-    getPageSize(rptTpl: any) {
+    getPageSize(rptTpl: IRptTpl) {
         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);
         if (sizeIdx >= 0) {
             size = JV.PAGES_SIZE[sizeIdx].slice(0);
         } else if (sizeStr === JV.PAGE_SELF_DEFINE) {
             //自定义规格,如实际业务需要则后期补充
         }
-        let page_orientation = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION];
+        let page_orientation = rptTpl.主信息.打印页面_信息.方向;
         if (page_orientation === JV.ORIENTATION_LANDSCAPE || page_orientation === JV.ORIENTATION_LANDSCAPE_CHN) {
             //swap x,y
             let tmp = size[0];
@@ -105,17 +110,17 @@ const JpcCommonHelper = {
         }
         return size;
     },
-    getReportArea(rptTpl: any, unitFactor: number) {
+    getReportArea(rptTpl: IRptTpl, unitFactor: number) {
         let me = this, sdpi = me.getScreenDPI(), rst = [], size = me.getPageSize(rptTpl);
         size[0] = sdpi[0] * size[0];
         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;
     },
-    getSegIdxByPageIdx(page: number, page_seg_map: any[]) {
+    getSegIdxByPageIdx(page: number, page_seg_map: number[][]) {
         let rst = -1;
         for (let pIdx = 0; pIdx < page_seg_map.length; pIdx++) {
             if (page_seg_map[pIdx][0] === page) {
@@ -125,13 +130,13 @@ const JpcCommonHelper = {
         }
         return rst;
     },
-    getStringLinesInArea(area: any, strVal: string, chnW: number, otherW: number) {
+    getStringLinesInArea(area: IArea, strVal: string, chnW: number, otherW: number) {
         //备注: 因后台的pdf kit判断字符串长度与前端的不一样,需要做些调整,不一次性地判断字符串长度。
         //      分2种字符:中文与非中文,按照各种字符的数量分别乘以相关一个字符的宽度再累计。
         //      另判断行数还不能直接用总长度除以宽度来计算,因每一行都会有不同的余量,所以得一行行走过来判断。
         let rst = 0;
         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;
             for (let sIdx = 0; sIdx < strVal.length; sIdx++) {
                 currentW = (strVal.charCodeAt(sIdx) > 127)?chnW:otherW;
@@ -148,10 +153,10 @@ const JpcCommonHelper = {
         if (rst === 0) rst = 1; //即使是空字符串,也得有一行啊
         return rst;
     },
-    splitString(area: any, strVal: string, chnW: number, otherW: number) {
+    splitString(area: IArea, strVal: string, chnW: number, otherW: number) {
         let rst = [];
         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 currentW = 0;
             for (let sIdx = 0; sIdx < strVal.length; sIdx++) {

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

@@ -1,58 +1,59 @@
 'use strict';
 
+import { Fields, ICell, IControlCollection, INode } from '../../interface/basic';
 import JV from '../jpc_value_define';
 import JpcFieldHelper from './jpc_helper_field';
 const OFFSET_FLOAT = 0.0000000001;
 
 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
-        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;
     },
-    createCommonOutput: function (node: any, value: any, controls: any) {
+    createCommonOutput: function (node: Fields, value: number | string | null, controls: IControlCollection | null) {
         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
         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;
     },
-    formatCell: function(formatStr: string, rstCell: any) {
+    formatCell: function (formatStr: string, rstCell: INode) {
         if (formatStr) {
-            const rstCellFloatVal = parseFloat(rstCell[JV.PROP_VALUE]);
+            const rstCellFloatVal = parseFloat(rstCell.Value as string);
             if (!(isNaN(rstCellFloatVal))) {
                 const dotIdx = formatStr.indexOf('.');
                 if (dotIdx >= 0) {
@@ -70,22 +71,22 @@ let JpcCommonOutputHelper = {
                         }
                     }
                     if (tmpStr[tmpStr.length - 1] === '.') tmpStr = tmpStr.substr(0, tmpStr.length - 1);
-                    rstCell[JV.PROP_VALUE] = tmpStr;
+                    rstCell.Value = tmpStr;
                 } else {
-                    rstCell[JV.PROP_VALUE] = (rstCellFloatVal + OFFSET_FLOAT).toFixed(0);
+                    rstCell.Value = (rstCellFloatVal + OFFSET_FLOAT).toFixed(0);
                 }
                 const commaIdx = formatStr.indexOf(',');
                 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;
-    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;

+ 45 - 43
report/src/core/helper/jpc_helper_cross_tab.ts

@@ -1,9 +1,10 @@
 import JV from '../jpc_value_define';
 import JE from '../jpc_rte';
 import JpcCommonHelper from './jpc_helper_common';
+import { Fields, IBands, ICurrent_RPT, IRptTpl } from '../../interface/basic';
 
 let JpcCrossTabHelper = {
-    getColIDX: function(cl: any[], val: any[]) {
+    getColIDX: function(cl: number[][], val: number) {
         let rst = -1;
         for (let i = 0; i < cl.length; i++) {
             let ca = cl[i];
@@ -19,14 +20,14 @@ let JpcCrossTabHelper = {
         }
         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 = [];
         for (let k = sIdx; k < eIdx; k++) {
             arrIdx.push(dataSeq[segIdx][k]);
         }
         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 = [];
         if ((sortOrder) && (sortOrder !== JV.TAB_FIELD_PROP_SORT_VAL_NOSORT)) {
             if (sIDX >= 0 && eIDX >= sIDX && dataValSeq.length > eIDX) {
@@ -64,7 +65,7 @@ let JpcCrossTabHelper = {
         }
         return tmpSeq;
     },
-    checkIfEqual: function(dataFields: any[], seq1: any, seq2: any) {
+    checkIfEqual: function(dataFields: number[][], seq1: number, seq2: number) {
         let rst = true;
         for (let i = 0; i < dataFields.length; i++) {
             if ((dataFields[i][seq1] !== dataFields[i][seq2])) {
@@ -74,12 +75,13 @@ let JpcCrossTabHelper = {
         }
         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 sIDX = 0, eIDX = -1, isFirstSort = true;
         for (let i = 0; i < tabFields.length; 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) {
                     isFirstSort = false;
                     //first field, should sort all data items
@@ -88,16 +90,16 @@ let JpcCrossTabHelper = {
                         eIDX = dataSeq[j].length - 1;
                         //sort the field value here
                         if (typeof(fieldSeqs[i]) === "object") {
-                            let exFirstField = JE.F(fieldSeqs[i][JV.PROP_ID], $CURRENT_RPT);
+                            let exFirstField = JE.F(fieldSeqs[i].ID, $CURRENT_RPT);
                             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 {
-                            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 {
                     //then sort the rest fields one by one
@@ -105,9 +107,9 @@ let JpcCrossTabHelper = {
                         let chkFields = [];
                         for (let k = 0; k < i; k++) {
                             if (typeof(fieldSeqs[k]) === "object") {
-                                let exField = JE.F(fieldSeqs[k][JV.PROP_ID], $CURRENT_RPT);
+                                let exField = JE.F(fieldSeqs[k].ID, $CURRENT_RPT);
                                 if (exField) {
-                                    chkFields.push(exField[JV.PROP_AD_HOC_DATA]);
+                                    chkFields.push(exField.data_field);
                                 } else {
                                     chkFields.push(null);
                                 }
@@ -126,16 +128,16 @@ let JpcCrossTabHelper = {
                             if (eIDX >= sIDX) {
                                 if (eIDX != sIDX) {
                                     if (typeof(fieldSeqs[i]) === "object") {
-                                        let exOtherField = JE.F(fieldSeqs[i][JV.PROP_ID], $CURRENT_RPT);
+                                        let exOtherField = JE.F(fieldSeqs[i].ID, $CURRENT_RPT);
                                         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 {
-                                        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;
                                 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 band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]];
+        let band = bands[rptTpl.交叉表_信息.交叉行.BandName];
         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;
     },
-    getMaxColsPerPage: function(bands: any, rptTpl: any) {
+    getMaxColsPerPage: function(bands: IBands, rptTpl: IRptTpl) {
         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) {
-            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;
     },
-    getActualRowsHeight: function(bands: any, rptTpl: any, segments: any[], page: number) {
+    getActualRowsHeight: function(bands: IBands, rptTpl: IRptTpl, segments: number[][], page: number) {
         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) {
-            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;
     },
-    getActualColsWidth: function(bands: any, rptTpl: any, segments: any[], page: number) {
+    getActualColsWidth: function(bands: IBands, rptTpl: IRptTpl, segments: number[][], page: number) {
         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) {
             rst =  getActualContentAreaMeasurement(rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left, segments, page);
         }
         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 remainAmt = preRec + nextRec - sortedSequence[segIdx].length;
         rst = me.hasEnoughSpace(tabType, rptTpl, bands, remainAmt);
         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;
         let rst = true, measurement = 1.0, douDiffForCompare = 0.00001;
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         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 (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 douH = 1.0 * (band.Bottom - band.Top);
                 rst = (spareHeight >= douH) || (spareHeight - douH <= douDiffForCompare);
             } 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 douW = 1.0 * (band.Right - band.Left);
                 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;
-    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;
         if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
             let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-            maxFieldMeasure = 1.0 * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] * unitFactor;
+            maxFieldMeasure = 1.0 * rptTpl.交叉表_信息[tabNodeName][tabMeasurePropName] * unitFactor;
         } 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);
     }
@@ -236,16 +238,16 @@ function getMaxTabCntPerPage(rptTpl: any, tabNodeName: string, tabMeasurePropNam
     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;
-    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;
         if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
             let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-            maxFieldMeasure = 1.0 * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] * unitFactor;
+            maxFieldMeasure = 1.0 * rptTpl.交叉表_信息[tabNodeName][tabMeasurePropName] * unitFactor;
         } 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) {
             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 JpcAreaHelper from './jpc_helper_area';
 import JpcFieldHelper from './jpc_helper_field';
+import { IBandDetail, IBands, ICell, ICurrent_RPT, ICustomizeCfg, IDataObj, IDiscrete } from '../../interface/basic';
 
 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 = [];
         if (discreteArray && dataObj) {
             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;
-                        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 = "";
-                            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);
-                                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];
                                     if (data && data.length > 0) {
                                         if (data.length > segIdx) {
@@ -38,7 +39,7 @@ const JpcDiscreteHelper = {
                                         }
                                     }
                                 } 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]
                                     } else value = "";
                                 }
@@ -47,7 +48,8 @@ const JpcDiscreteHelper = {
                                     if (flexiblePrecisionRefObj === null) {
                                         flexiblePrecisionRefObj = {};
                                         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) {
                                             flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                         }
@@ -56,13 +58,13 @@ const JpcDiscreteHelper = {
                                 } else {
                                     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);
                             //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);
                         }
                     }
@@ -71,29 +73,29 @@ const JpcDiscreteHelper = {
         }
         return rst;
     },
-    outputPreviewDiscreteInfo: function (discreteArray: any[], bands: any, unitFactor: number, pageStatus: boolean[]) {
+    outputPreviewDiscreteInfo: function (discreteArray: IDiscrete[], bands: IBands, unitFactor: number, pageStatus: boolean[]) {
         let rst = [];
         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 = "";
-                        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);
                         //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);
                     }
                 }
@@ -102,25 +104,25 @@ const JpcDiscreteHelper = {
         }
         return rst;
     },
-    outputPreviewSumInfoOutput: function (band: any, unitFactor: number, tab: any) {
+    outputPreviewSumInfoOutput: function (band: IBandDetail, unitFactor: number, tab: IDiscrete) {
         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));
                     let value = "";
                     let item = JpcCommonOutputHelper.createCommonOutputWithoutDecorate(tab_field, value, false);
                     //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);
                 }
             }

+ 35 - 34
report/src/core/helper/jpc_helper_field.ts

@@ -2,28 +2,29 @@
 
 import JV from '../jpc_value_define';
 import strUtil from '../../public/stringUtil';
+import { Fields, ICell, IControlCollection, ICustomizeCfg, IGroupField, INode, IOrgGroupField, IRptTpl } from '../../interface/basic';
 
 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)) {
             rst = dataField[valueIdx];
         }
         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)) {
             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;
         if (ref_tab_fields && ref_tab_fields.length > 0) {
             for (let tab_field of ref_tab_fields) {
                 if (tab_field[JV.PROP_FIELD_ID] === sum_tab_field[JV.PROP_FIELD_ID]) {
                     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;
                 }
@@ -31,9 +32,9 @@ let JpcFieldHelper = {
         }
         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;
-        if (map_field && map_field[JV.PROP_PRECISION] && map_field[JV.PROP_PRECISION].type === "fixed") {
+        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++) {
                 if (idx === 0) {
@@ -41,21 +42,21 @@ let JpcFieldHelper = {
                 }
                 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 {
-                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;
-        } 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;
         }
         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;
         if (ref_field_data && flexiblePrecisionRefObj && valueIdx >= 0) {
             precisionAmt = flexiblePrecisionRefObj["refUnit_" + ref_field_data[valueIdx]];
@@ -65,28 +66,28 @@ let JpcFieldHelper = {
         for (let idx = 0; idx < precisionAmt; idx++) {
             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 {
-            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) {
-            const showZero = controls[cell[JV.PROP_CONTROL]][JV.PROP_SHOW_ZERO];
+            const showZero = controls[cell.control].ShowZero;
             if (showZero && showZero === 'F') {
-                const val = parseFloat(cell[JV.PROP_VALUE]);
+                const val = parseFloat(cell.Value as string);
                 if (val === 0) {
-                    cell[JV.PROP_VALUE] = '';
+                    cell.Value = '';
                 }
             }
         }
     },
-    findAndPutDataFieldIdx: function (rptTpl: any, tab_fields: any[], rstFields: any, rstFieldsIdx: any, isEx: boolean) {
+    findAndPutDataFieldIdx: function (rptTpl: IRptTpl, tab_fields: {FieldID:number}[]|null, rstFields: {FieldID:number}[]|null, rstFieldsIdx: any[]|null, isEx: boolean) {
         //通过FieldID找到相关映射指标的位置IDX并记录下来,方便后续引用
         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++) {
                 let isFounded = false;
                 for (let j = 0; j < detail_fields.length; j++) {
@@ -100,9 +101,9 @@ let JpcFieldHelper = {
                 if (!isFounded) {
                     if (rstFields) rstFields.push(tab_fields[i]);
                     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);
                                     isFounded = true;
                                     break;
@@ -116,12 +117,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) {
             let DTL_STR = isEx?JV.NODE_DETAIL_FIELDS_EX:JV.NODE_DETAIL_FIELDS;
-            let detail_fields = rptTpl[JV.NODE_FIELD_MAP][DTL_STR];
+            let detail_fields = rptTpl.指标_数据_映射[DTL_STR];
             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++) {
                         if (tab_fields[i]["FieldID"] === detail_fields[j]["ID"]) {
                             let item = [];
@@ -134,9 +135,9 @@ let JpcFieldHelper = {
                 }
             }
             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++) {
-                    if (tab_fields[i][JV.PROP_IS_AUTO_HEIGHT]) {
+                    if (tab_fields[i].isAutoHeight) {
                         for (let j = 0; j < dis_detail_fields.length; j++) {
                             if (tab_fields[i]["FieldID"] === dis_detail_fields[j]["ID"]) {
                                 let item = [];

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

@@ -1,38 +1,39 @@
 'use strict';
 
+import { IBands, IRptTpl } from '../../interface/basic';
 import JV from '../jpc_value_define';
 import JpcCommonHelper from './jpc_helper_common';
 
 let JpcFlowTabHelper = {
-    getMaxRowsPerPage: function(bands: any, rptTpl: any, isEx: boolean) {
+    getMaxRowsPerPage: function(bands: IBands, rptTpl: IRptTpl, isEx: boolean) {
         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) {
             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);
-                maxFieldMeasure = 1.0 * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] * unitFactor;
+                maxFieldMeasure = 1.0 * tab.CommonHeight * unitFactor;
             } 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);
         }
         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 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) {
             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);
-                maxFieldMeasure = 1.0 * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] * unitFactor;
+                maxFieldMeasure = 1.0 * tab.CommonHeight * unitFactor;
             } 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) {
                 rst = rowAmt * maxFieldMeasure;
@@ -40,21 +41,22 @@ let JpcFlowTabHelper = {
         }
         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 remainAmt = preRec + pageRecAmt - segmentLength;
         rst = me.hasEnoughSpace(rptTpl, bands, remainAmt, isEx);
         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;
         let rst = true, measurement = 1.0, douDiffForCompare = 0.00001;
         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) {
-            measurement = 1.0 * tab[JV.PROP_CMN_HEIGHT] * unitFactor;
+            measurement = 1.0 * tab.CommonHeight * unitFactor;
             let spareHeight = measurement * remainAmt;
             let douH = band.Bottom - band.Top;
             rst = ((spareHeight >= douH) || ((spareHeight - douH) <= douDiffForCompare));

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

@@ -3,18 +3,20 @@
 import JV from '../jpc_value_define';
 import JpcCommonOutputHelper from './jpc_helper_common_output';
 import JpcAreaHelper from './jpc_helper_area';
+import { IBandDetail, Fields } from '../../interface/basic';
 
 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
-        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;
     },
-    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);
         //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;
     }
 };

+ 28 - 27
report/src/core/jpc_band.ts

@@ -2,53 +2,54 @@
 
 import JV from './jpc_value_define';
 import JpcCommonHelper from './helper/jpc_helper_common';
-let JpcBandHelper = require('./helper/jpc_helper_band');
+import { IBandDetail, IRptTpl, } from '../interface/basic';
+import JpcBandHelper from './helper/jpc_helper_band';
 
 const JpcBand = {
-    createNew(rptTpl: any, defProperties: any) {
+    createNew(rptTpl: IRptTpl, defProperties: any) {
         let me = this;
         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;
     },
     createSingle(bandNode: any, parentObj: any, rptTpl: any, defProperties: any) {
         let me = this;
-        if (bandNode && bandNode[JV.BAND_PROP_NAME]) {
+        if (bandNode && bandNode.Name) {
             let item = {
-                Left: 0, 
-                Right: 0, 
-                Top: 0, 
+                Left: 0,
+                Right: 0,
+                Top: 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]),
-            };
+                style: JpcCommonHelper.getStyle(bandNode.style, defProperties.styles),
+                control: JpcCommonHelper.getControl(bandNode.control, defProperties.ctrls),
+                Height: (bandNode.Height) ? (1.0 * bandNode.Height) : 0,
+                Width: (bandNode.Width) ? 1.0 * bandNode.Width : 0,
+                DisplayType: JpcBandHelper.getBandTypeValByString(bandNode.DisplayType),
+                Alignment: JpcCommonHelper.getLayoutAlignment(bandNode.Alignment),
+                CalculationType: JpcCommonHelper.getPosCalculationType(bandNode.CalculationType),
+            } as IBandDetail;
             if (bandNode.hasOwnProperty(JV.PROP_BAND_NORMAL_ONLY)) {
-                item[JV.PROP_BAND_NORMAL_ONLY] = JpcCommonHelper.getBoolean(bandNode[JV.PROP_BAND_NORMAL_ONLY]);
+                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]);
+                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;
             }
         }
     }

+ 65 - 56
report/src/core/jpc_bill_tab.ts

@@ -7,52 +7,60 @@ import JpcDiscreteHelper from './helper/jpc_helper_discrete';
 import JpcTextHelper from './helper/jpc_helper_text';
 import JpcCommonOutputHelper from './helper/jpc_helper_common_output';
 import JpcAreaHelper from './helper/jpc_helper_area';
-
-class JpcBillTabSrvClass{
+import {
+    ICurrent_RPT,
+    ICustomizeCfg,
+    IBands,
+    IControlCollection,
+    IRptTpl,
+    IDataObj,
+} from '../interface/basic';
+import { IDataObj_props } from '../interface/enum'
+class JpcBillTabSrvClass {
     disp_fields_idx: any[];
 
     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) {
+    paging(rptTpl: IRptTpl, dataObj: IDataObj) {
         let rst = 0;
-        function _getDataLength(fields_str: string) {
+        function _getDataLength(fields_str: IDataObj_props) {
             let dataFields = dataObj[fields_str];
             if (dataFields && dataFields.length > 0) {
                 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(IDataObj_props.detail_data);
+            } else if (rptTpl.指标_数据_映射.主数据指标_集合) {
+                _getDataLength(IDataObj_props.master_data);
+            } else if (rptTpl.指标_数据_映射.离散指标_集合) {
+                _getDataLength(IDataObj_props.discrete_data);
+            } else if (rptTpl.指标_数据_映射.离散参数_集合) {
                 rst = 1;
             }
         }
         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 pageStatus = [true, true, false, true, false, false, false, false];
         JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, true, false);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         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;
     };
 
-    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 = [];
         //1 calculate the band position
         let pageStatus: boolean[] = [true, false, false, false, false, false, false, false];
@@ -62,7 +70,7 @@ class JpcBillTabSrvClass{
         //2.1 output content
         tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, pageStatus, $CURRENT_RPT, customizeCfg));
         //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++) {
             rst = rst.concat(tabRstLst[i]);
             tabRstLst[i] = null;
@@ -70,66 +78,67 @@ class JpcBillTabSrvClass{
         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 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 (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++) {
                     let tab_field = tab_fields[i];
-                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                    if (!(tab_field.Hidden)) {
                         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);
                     }
                 }
-                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;
     };
 
-    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 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 (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[IDataObj_props.detail_data];
+                } else if (rptTpl.指标_数据_映射.主数据指标_集合) {
+                    data_details = dataObj[IDataObj_props.master_data];
                 }
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 for (let i = 0; i < tab_fields.length; 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')) {
                         data_field = data_details[me.disp_fields_idx[i]];
                     } else {
                         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) {
                             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) {
                                 flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                             }
@@ -138,23 +147,23 @@ class JpcBillTabSrvClass{
                     } else {
                         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 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);
                     }
                 }
-                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 JpcCommonOutputHelper from './helper/jpc_helper_common_output';
 import JpcAreaHelper from './helper/jpc_helper_area';
-
+import {
+    Fields,
+    IDefProperties,
+    ICurrent_RPT,
+    ICustomizeCfg,
+    IBands,
+    IBandDetail,
+    IControlCollection,
+    IRptTpl,
+    IDataObj,
+    ICrossTab,
+    IGroupField
+} from '../interface/basic';
+import { IDataObj_props } from '../interface/enum'
 class JpcCrossTabClass {
-    dispValueIdxLst_Row: any[];
+    dispValueIdxLst_Row: number[][];
     dispValueIdxLst_Col: any[];
-    dispValueIdxLst_Content: any[];
-    dispSerialIdxLst_Row: any[];
+    dispValueIdxLst_Content:  number[][][];
+    dispSerialIdxLst_Row: number[][];
     col_sum_fields_idx: any[];
-    col_sum_fields_value_total: any[];
+    col_sum_fields_value_total:any[][];
     dispSumValueLst_Col: any[];
-    page_seg_map: any[];
+    page_seg_map: any;
     row_fields_idx: any[];
     row_fields_adhoc_idx: any[];
     col_fields_idx: any[];
@@ -33,7 +46,7 @@ class JpcCrossTabClass {
     crsOrient: number;
     pageStatusLst: any[];
     paging_option: string;
-    
+
     constructor() {
         this.dispValueIdxLst_Row = [];
         this.dispValueIdxLst_Col = [];
@@ -56,23 +69,23 @@ class JpcCrossTabClass {
         this.pageStatusLst = [];
         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;
         //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);
         _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.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)
-        let data_details = dataObj[JV.DATA_DETAIL_DATA],
+        let data_details = dataObj.detail_data,
             data_fields = [];
         for (let i = 0; i < me.col_sum_fields_idx.length; i++) {
             let data_field = null;
             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) {
-                    data_field = exField[JV.PROP_AD_HOC_DATA];
+                    data_field = exField.data_field;
                 }
             } else {
                 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;
-        me.paging_option = option||JV.PAGING_OPTION_NORMAL;
+        me.paging_option = option || JV.PAGING_OPTION_NORMAL;
         //1. original initialize
         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];
@@ -114,8 +127,8 @@ class JpcCrossTabClass {
             maxRowRec = JpcCrossTabHelper.getMaxRowsPerPage(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) {
             // 交叉表暂时不支持无限拓展
         } else {
@@ -140,7 +153,7 @@ class JpcCrossTabClass {
                 if (hasAdHocRow) rowSplitCnt++;
                 if (hasAdHocCol) colSplitCnt++;
                 //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++) {
                         pageStatus[JV.STATUS_CROSS_ROW_END] = (rowIdx === (rowSplitCnt - 1));
                         private_resetBandArea();
@@ -207,7 +220,7 @@ class JpcCrossTabClass {
         // bands = null;
         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 pageStatus: boolean[] = [true, true, true, true, true, true, true, true];
         me.pageStatusLst.push(pageStatus);
@@ -227,44 +240,44 @@ class JpcCrossTabClass {
         //5. 交叉行拓展合计
         rst = rst.concat(me.outputPreviewSumTabExt(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, unitFactor));
         //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. 离散
-        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;
     };
-    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;
     };
-    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 band = (tab)?bands[tab[JV.PROP_BAND_NAME]]:null;
+        let band = (tab) ? bands[tab.BandName] : null;
         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 i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[i];
-                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                    if (!(tab_field.Hidden)) {
                         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));
                             } else {
                                 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++) {
-                            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;
     };
-    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 unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         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.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls, $CURRENT_RPT, customizeCfg));
             //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++) {
             rst = rst.concat(tabRstLst[i]);
@@ -316,18 +329,18 @@ class JpcCrossTabClass {
         }
         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 = [],
-            tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName],
-            band = bands[tab[JV.PROP_BAND_NAME]];
+            tab = rptTpl.交叉表_信息[tabNodeName],
+            band = bands[tab.BandName];
         if (band) {
             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++) {
                     if (i === 0) {
                         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);
                         }
                     }
@@ -336,7 +349,7 @@ class JpcCrossTabClass {
                             let tab_field = tab_fields[j];
                             let val = me.dispSumValueLst_Col[page - 1][i][j];
                             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);
                         }
                     } else {
@@ -351,7 +364,7 @@ class JpcCrossTabClass {
                             let tab_field = tab_fields[j];
                             let val = null;
                             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);
                         }
                     }
@@ -360,41 +373,41 @@ class JpcCrossTabClass {
         }
         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,
-            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) {
             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[IDataObj_props.detail_data],
                     valuesIdx = me.dispValueIdxLst_Col[page - 1];
                 for (let i = 0; i < me.row_extension_fields_idx.length; i++) {
                     let tab_field = tab_fields[i];
                     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') {
                         data_field = data_details[me.row_extension_fields_idx[i]];
                     } else {
                         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;
                         for (let colIdx = 0; colIdx < cols; colIdx++) {
                             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));
                             //2. output texts if has
                             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;
     };
-    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 = [],
-            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) {
             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[IDataObj_props.detail_data],
                     data_fields = [];
                 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 tab_field = tab_fields[i];
                     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') {
                         data_field = data_details[me.row_sum_extension_fields_idx[i]];
                     } else {
                         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);
@@ -444,58 +457,58 @@ class JpcCrossTabClass {
                 //4. output
                 for (let di = 0; di < tab_fields.length; di++) {
                     let tab_field = tab_fields[di];
-                    if (!tab_field[JV.PROP_HIDDEN]) {
+                    if (!tab_field.Hidden) {
                         let val = rowGrandTotal[di];
                         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);
                     }
                 }
                 //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;
     };
-    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 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) {
             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[IDataObj_props.detail_data];
                 let contentValuesIdx = me.dispValueIdxLst_Content[page - 1];
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 for (let i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[i];
                     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') {
                         data_field = data_details[me.content_fields_idx[i]];
                     } else {
                         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;
                         for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
                             let cols = contentValuesIdx[rowIdx].length;
                             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) {
                                         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) {
                                             flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                         }
@@ -513,37 +526,37 @@ class JpcCrossTabClass {
         }
         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 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) {
             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[IDataObj_props.detail_data];
                 let valuesIdx = me.dispValueIdxLst_Col[page - 1];
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 for (let i = 0; i < me.col_fields_idx.length; i++) {
                     let tab_field = tab_fields[i];
-                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                    if (!(tab_field.Hidden)) {
                         let mergedRst = [];
                         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') {
                             data_field = data_details[me.col_fields_idx[i]];
                         } else {
                             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;
                         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) {
                                     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) {
                                         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));
                             //2. output texts
                             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;
                         //判断是否需要合并
-                        if (tab_field[JV.PROP_IS_MERGE] && mergedRst.length > 1) {
+                        if (tab_field.isMerge && mergedRst.length > 1) {
                             let lastCell = mergedRst[mergedRst.length - 1];
                             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);
                                 }
                                 lastCell = mergedRst[mergeIdx];
@@ -587,37 +600,37 @@ class JpcCrossTabClass {
         }
         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 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) {
             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[IDataObj_props.detail_data];
                 let valuesIdx = me.dispValueIdxLst_Row[page - 1];
                 let serialsIdx = me.dispSerialIdxLst_Row[page - 1];
                 let flexiblePrecisionRefObj: any = null, flexibleRefField = null, precision_ref_data = null;
                 for (let i = 0; i < rowFieldsIdxArr.length; i++) {
                     let tab_field = tab_fields[i];
-                    if (!(tab_field[JV.PROP_HIDDEN])) {
+                    if (!(tab_field.Hidden)) {
                         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') {
                             data_field = data_details[rowFieldsIdxArr[i]];
                         } else {
                             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;
                         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) {
                                     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) {
                                         flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
                                     }
@@ -634,9 +647,10 @@ class JpcCrossTabClass {
         }
         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;
-        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) {
                 rst = JpcCommonOutputHelper.createCommonOutput(tab_field, serialIdx + 1, null);
             } else rst = JpcCommonOutputHelper.createCommonOutput(tab_field, "", controls);
@@ -645,14 +659,14 @@ class JpcCrossTabClass {
         }
         //position
         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 {
-            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;
     };
 };
-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) {
         let serial1stTier = null;
         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) {
-        page_seg_map.push([pageIdx,segIdx]);
+        page_seg_map.push([pageIdx, segIdx]);
         let arrContents: any[] = [];
         if (sortedContentSequence !== null) {
             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 tab = rptTpl[JV.NODE_CROSS_INFO][sortTab];
+    let tab = rptTpl.交叉表_信息[sortTab];
     if (tab) {
         let sIDX = 0;
         //1. prepare and sort by tab-field
         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[IDataObj_props.detail_data];
         JpcCrossTabHelper.sortTabFields(fields, rstFieldsIdx, data_details, dataSeq, $CURRENT_RPT);
         //2. distinguish sort tab fields value
         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++) {
                         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;
                                     break;
                                 }
@@ -798,15 +812,15 @@ function _SortAndOptimize(rptTpl: any, dataObj: any, dataSeq: any[], sortTab: st
     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 tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
+    let tab = rptTpl.交叉表_信息.交叉数据;
     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++) {
         let rl = rowSeq[i], cl = colSeq[i];
-        let ds: any[] = [];
+        let ds: number[][] = [];
         //1. initialize to blank value index
         for (let j = 0; j < rl.length; j++) {
             ds.push([]);

+ 16 - 14
report/src/core/jpc_data.ts

@@ -2,31 +2,33 @@
 
 import JV from './jpc_value_define';
 import jpc_common_helper from './helper/jpc_helper_common';
+import { IDataObj, IRptTpl } from '../interface/basic';
+import { IDataObj_props } from '../interface/enum';
 
 const JpcData = {
     createNew() {
         let JpcDataRst = {
             dataSeq: [],
             exDataSeq: [],
-            analyzeData(rptTpl: any, dataObj: any) {
+            analyzeData(rptTpl: IRptTpl, dataObj: IDataObj) {
                 let me = this;
                 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
                     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 = [];
-                    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});
                             }
                         }
                     }
@@ -102,9 +104,9 @@ const JpcData = {
                     }
                 };
                 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('主数据指标_集合', '从数据指标_集合', IDataObj_props.master_data, IDataObj_props.detail_data, me.dataSeq);
+                    if (rptTpl.流水式表_拓展信息) {
+                        _analyse('主数据指标_拓展集合', '从数据指标_拓展集合', IDataObj_props.master_data_ex,IDataObj_props.detail_data_ex, me.exDataSeq);
                     }
                 }
             }

+ 12 - 9
report/src/core/jpc_event.ts

@@ -3,27 +3,30 @@
  */
 'use strict';
 
+import { IRptTpl } from '../interface/basic';
+import { IEvent_type } from '../interface/enum';
 import JV from './jpc_value_define';
 
 const JpcEvent = {
-    createNew(rptTpl: any) {
+    createNew(rptTpl: IRptTpl) {
         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]);
                 // for (let key of propArr) {
                 //     item[key] = rptTpl[JV.NODE_EVENTS][i][key];
                 // }
-                switch (JV.EVENT_TYPE.indexOf(item.type)) {
+                const event_type=[IEvent_type.GRP_ON_CREATE,IEvent_type.FLOW_CONTENT_ON_CREATE]
+                switch (event_type.indexOf(item.type)) {
                     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;
                     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;
                     default :
                         break;

+ 140 - 136
report/src/core/jpc_ex.ts

@@ -13,37 +13,39 @@ import JpcEvent from './jpc_event';
 import JpcData from './jpc_data';
 import JpcCommonHelper from './helper/jpc_helper_common';
 import $JE from './jpc_rte'; //Important: for self-define function execution purpose
+import {IDefProperties,IFormula,IParams,ICurrent_RPT,ICurrent_DATA,ICustomizeCfg,ITargetFields,IRptTpl, IDataObj, IBands, IControlCollection, IStyles, BorderStyle, IFontSubCollection, IControlSubCollection, IPreviewPage} from '../interface/basic'
+import { IFlowTabClass ,IBillTabClass,ICostTabClass} from '../interface/classType';
 
 class JpcExClass{
-    flowTab: any;
-    flowTabEx: any;
-    billTab: any;
-    crossTab: any;
+    flowTab: IFlowTabClass = new IFlowTabClass;
+    flowTabEx:  IFlowTabClass = new IFlowTabClass;
+    billTab: IBillTabClass = new IBillTabClass;
+    crossTab: ICostTabClass = new ICostTabClass;
     isFollowMode: boolean = false;
     totalPages: number = 0;
     exTotalPages: number = 0;
-    runTimePageData: any;
-    fields: any;
-    params: any;
-    formulas: any;
+    runTimePageData: {currentPage?:number};
+    fields: ITargetFields;
+    params: IParams;
+    formulas: IFormula[];
     events: any;
 
-    constructor(rptTpl: any) {
-        if (rptTpl[JV.NODE_FLOW_INFO]) {
+    constructor(rptTpl: IRptTpl) {
+        if (rptTpl.流水式表_信息) {
             this.flowTab = new JpcFlowTab(false);
             this.isFollowMode = false;
         }
-        if (rptTpl[JV.NODE_FLOW_INFO_EX]) {
+        if (rptTpl.流水式表_拓展信息) {
             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;
             }
         }
-        if (rptTpl[JV.NODE_BILL_INFO]) {
+        if (rptTpl.账单式表_信息) {
             this.billTab = new JpcBillTab();
         }
         //let dt1 = new Date();
-        if (rptTpl[JV.NODE_CROSS_INFO]) {
+        if (rptTpl.交叉表_信息) {
             this.crossTab = new JpcCrossTab();
         }
         this.runTimePageData = {};
@@ -53,7 +55,7 @@ class JpcExClass{
         this.events = JpcEvent.createNew(rptTpl);
     };
 
-    analyzeData(rptTpl: any, dataObj: any, defProperties: any, option: string, outputType: any) {
+    analyzeData(rptTpl: IRptTpl, dataObj: IDataObj, defProperties: IDefProperties, option: string, outputType: string) {
         let me = this, dftPagingOption = option||JV.PAGING_OPTION_NORMAL;
         //1. data object
         let dataHelper: any = JpcData.createNew();
@@ -74,7 +76,8 @@ class JpcExClass{
                 }
             }
             if (me.billTab) {
-                me.billTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
+                // me.billTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
+                me.billTab.sorting(rptTpl);//edit by lish,方法中需要的参数只有一个,但是这里存入了4个
             }
             //let dt2 = new Date();
             //alert(dt2 - dt1);
@@ -88,7 +91,7 @@ class JpcExClass{
         // dataHelper = null;
     };
 
-    paging(rptTpl: any, dataObj: any, defProperties: any, option: string) {
+    paging(rptTpl: IRptTpl, dataObj: IDataObj, defProperties: IDefProperties, option: string) {
         let me = this, dftPagingOption = option||JV.PAGING_OPTION_NORMAL;
         if (me.flowTab) {
             if (me.isFollowMode) {
@@ -109,12 +112,12 @@ class JpcExClass{
         }
     };
 
-    executeFormulas(runType: string, $CURRENT_TEMPLATE: any, $CURRENT_DATA: any, $CURRENT_RPT: any) {
+    executeFormulas(runType: string, $CURRENT_TEMPLATE: any, $CURRENT_DATA: ICurrent_DATA, $CURRENT_RPT: any) {
         let execFmlMe = this;
         for (let execFmlIdx = 0; execFmlIdx < execFmlMe.formulas.length; execFmlIdx++) {
             //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) {
                     let $ME = execFmlMe.formulas[execFmlIdx];
                     // console.log("current expression idx: " + execFmlIdx);
@@ -129,54 +132,54 @@ class JpcExClass{
         }
     };
 
-    outputAsPreviewPage(rptTpl: any, defProperties: 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];
+    outputAsPreviewPage(rptTpl: IRptTpl, defProperties: IDefProperties) {
+        let me = this, rst :any= {};
+        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 = [];
         let bands = JpcBand.createNew(rptTpl, defProperties);
         try {
             function getPageMergeBorder() {
                 let mergeRst: any = null;
-                if (bands[JV.BAND_PROP_MERGE_BAND]) {
-                    let mergedBand = bands[JV.BAND_PROP_MERGE_BAND];
+                if (bands.MergeBand) {
+                    let mergedBand = bands.MergeBand;
                     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));
+                    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;
             }
             //1.
             let rstPage: any = {};
-            rstPage[JV.PROP_PAGE_SEQ] = 1;
+            rstPage.page_seq = 1;
             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) {
-                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) {
-                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();
             if (pageMergeBorder) {
-                rstPage[JV.PROP_PAGE_MERGE_BORDER] = pageMergeBorder;
+                rstPage.page_merge_border = pageMergeBorder;
             }
             rst.items.push(rstPage);
             //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 mergedBand: any = {}, band = bands.MergeBand;
+                mergedBand.Left = parseInt(band.Left.toFixed(0));
+                mergedBand.Right = parseInt(band.Right.toFixed(0));
+                mergedBand.Top = parseInt(band.Top.toFixed(0));
+                mergedBand.Bottom = parseInt(band.Bottom.toFixed(0));
+                mergedBand.style = band.style;
+                rst.MergeBand = mergedBand;
             }
         } catch(exception) {
             console.log(exception);
@@ -186,32 +189,32 @@ class JpcExClass{
         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 = {};
         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.control_collection = private_buildDftControls(rptTpl, (defProperties === null)?null:defProperties.ctrls);
+            rst.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.打印页面_信息 = {};
+            rst.打印页面_信息.报表名称 = rptTpl.主信息.报表名称;
+            rst.打印页面_信息.纸张宽高 = JpcCommonHelper.getPageSize(rptTpl);
+            rst.打印页面_信息.页边距 = rptTpl.主信息.页边距;
             rst.items = [];
             let bands = JpcBand.createNew(rptTpl, defProperties);
             try {
                 for (let page = startPage; page <= endPage; 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));
+                    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 mergedBand: any = {}, band = bands.MergeBand;
+                    mergedBand.Left = parseInt(band.Left.toFixed(0));
+                    mergedBand.Right = parseInt(band.Right.toFixed(0));
+                    mergedBand.Top = parseInt(band.Top.toFixed(0));
+                    mergedBand.Bottom = parseInt(band.Bottom.toFixed(0));
+                    mergedBand.style = band.style;
+                    rst.MergeBand = mergedBand;
                 }
             } catch(exception) {
                 console.log(exception);
@@ -222,23 +225,23 @@ class JpcExClass{
         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;
         function getPageMergeBorder() {
             let mergeRst: any = null;
-            if (bands[JV.BAND_PROP_MERGE_BAND]) {
-                let mergedBand = bands[JV.BAND_PROP_MERGE_BAND];
+            if (bands.MergeBand) {
+                let mergedBand = bands.MergeBand;
                 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));
+                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;
         }
         if (me.totalPages >= page) {
             rst = {};
-            rst[JV.PROP_PAGE_SEQ] = page;
+            rst.page_seq = page;
             //rst.cells = [];
             let adHocMergePos: any = null;
             if (me.flowTab) {
@@ -246,26 +249,26 @@ class JpcExClass{
                     if (me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY) {
                         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) {
-                        adHocMergePos[JV.NODE_PAGE_SIZE] = JpcCommonHelper.getPageSize(rptTpl);
+                        adHocMergePos.纸张宽高 = JpcCommonHelper.getPageSize(rptTpl);
                         rst[JV.PAGE_SPECIAL_MERGE_POS] = adHocMergePos;
                     }
 
                 } else {
                     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) {
-                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) {
-                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)) {
                 let pageMergeBorder = getPageMergeBorder();
                 if (pageMergeBorder) {
-                    rst[JV.PROP_PAGE_MERGE_BORDER] = pageMergeBorder;
+                    rst.page_merge_border = pageMergeBorder;
                 }
             }
         }
@@ -273,6 +276,7 @@ class JpcExClass{
     };
 }
 
+//暂定
 function private_buildDftItems(rptTpl: any, dftCollection: any, propArray: any, nodeName: any) {
     const rst: any = {};
     if (dftCollection) {
@@ -281,17 +285,17 @@ function private_buildDftItems(rptTpl: any, dftCollection: any, propArray: any,
             for (let j = 0; j < propArray.length; j++) {
                 item[propArray[j]] = dftCollection[i][propArray[j]];
             }
-            rst[dftCollection[i][JV.PROP_ID]] = item;
+            rst[dftCollection[i].ID] = item;
         }
         if (rptTpl && rptTpl[nodeName] && rptTpl[nodeName].length > 0) {
             for (let i = 0; i < rptTpl[nodeName].length; i++) {
                 const rptDftItem = rptTpl[nodeName][i];
-                if (rst[rptDftItem[JV.PROP_ID]] === undefined) {
+                if (rst[rptDftItem.ID] === undefined) {
                     const item: any = {};
                     for (let j = 0; j < propArray.length; j++) {
                         item[propArray[j]] = rptDftItem[propArray[j]];
                     }
-                    rst[rptDftItem[JV.PROP_ID]] = item;
+                    rst[rptDftItem.ID] = item;
                 }
             }
         }
@@ -299,95 +303,95 @@ function private_buildDftItems(rptTpl: any, dftCollection: any, propArray: any,
     return rst;
 }
 
-function private_buildDftControls(rptTpl: any, dftControlCollection: any) {
+function private_buildDftControls(rptTpl: IRptTpl, dftControlCollection: IControlSubCollection[]|null) {
     return private_buildDftItems(rptTpl, dftControlCollection, JV.CONTROL_PROPS, JV.NODE_CONTROL_COLLECTION);
 }
 
-function private_buildDftFonts(rptTpl: any, dftFontCollection: any) {
+function private_buildDftFonts(rptTpl: IRptTpl, dftFontCollection: IFontSubCollection[]|null) {
     return private_buildDftItems(rptTpl, dftFontCollection, JV.FONT_PROPS, JV.NODE_FONT_COLLECTION);
 }
 
-function private_buildDftStyles(rptTpl: any, dftStyleCollection: any) {
+function private_buildDftStyles(rptTpl: IRptTpl, dftStyleCollection: IStyles[]|null) {
     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) {
         for (let i = 0; i < dftStyleCollection.length; i++) {
             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]) {
                             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]) {
                             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]) {
                             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 {
                         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';
 
 import JV from './jpc_value_define';
-
+import {    IRptTpl,IGroupField,IOrgGroupField} from '../interface/basic'
+import {IDataObj_props} from '../interface/enum'
 const JpcField = {
-    createNew(rptTpl: any) {
+    createNew(rptTpl: IRptTpl) {
         let me = this;
         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.离散指标_集合, IDataObj_props.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.主数据指标_集合, IDataObj_props.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.从数据指标_集合,IDataObj_props.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.主数据指标_拓展集合, IDataObj_props.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.从数据指标_拓展集合, IDataObj_props.detail_data_ex, i);
             }
         }
         //NODE_MASTER_FIELDS_EX
         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: IDataObj_props|string, sequence: number) {
+        if (fieldNode && fieldNode.ID) {
             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 {
-                    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.DataNodeName = dataNodeName;
             item.DataSeq = sequence;
-            parentObj[JV.PROP_ID + "_" + fieldNode[JV.PROP_ID]] = item;
+            parentObj[ "ID_" + fieldNode.ID] = item;
         }
     }
 };

Plik diff jest za duży
+ 344 - 305
report/src/core/jpc_flow_tab.ts


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

@@ -1,13 +1,14 @@
 'use strict';
 
+import { IRptTpl } from '../interface/basic';
 import JV from './jpc_value_define';
 
 const JpcFunc = {
-    createNew(rptTpl: any) {
+    createNew(rptTpl: IRptTpl) {
         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]);
                 // for (let key of propArr) {
                 //     item[key] = rptTpl[JV.NODE_FORMULAS][i][key];

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

@@ -1,28 +1,29 @@
 'use strict';
 
+import { IRptTpl,IOrgGroupField } from '../interface/basic';
 import JV from './jpc_value_define';
 
 const JpcParam = {
-    createNew(rptTpl: any) {
+    createNew(rptTpl: IRptTpl) {
         let JpcParamResult = {};
         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;
     },
-    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 = {
-                [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,
+                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;
         }
     }
 };

+ 53 - 49
report/src/core/jpc_rte.ts

@@ -6,59 +6,63 @@
 import strUtil from '../public/stringUtil';
 import scMathUtil from '../public/scMathUtil';
 import JV from './jpc_value_define';
+import { Fields, ICurrent_RPT, IDataObj } from '../interface/basic';
+import { IDataObj_props } from '../interface/enum';
 
 const JE = {
     $STR_UTIL: strUtil,
     $SC_MATH_UTIL: scMathUtil,
-    F: function(fID: number, $CURRENT_RPT: any) {
+    F: function(fID: number, $CURRENT_RPT: ICurrent_RPT) {
         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 {
-            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;
     },
-    P: function(pID: number, $CURRENT_RPT: any) {
+    P: function(pID: number, $CURRENT_RPT: any) {//暂定
         let rst = null;
         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 = {msg: "the Param-ID is not valid, no result was found!"}; by lish
         }
         return rst;
     },
-    getCurrentPage: function ($CURRENT_RPT: any) {
+    getCurrentPage: function ($CURRENT_RPT: ICurrent_RPT) {
         let rst = 0;
-        if ($CURRENT_RPT) {
+        if ($CURRENT_RPT && $CURRENT_RPT.runTimePageData.currentPage) {
             rst = $CURRENT_RPT.runTimePageData.currentPage;
         }
         return rst;
     },
-    getTotalPage: function ($CURRENT_RPT: any) {
+    getTotalPage: function ($CURRENT_RPT: ICurrent_RPT) {
         let rst = 0;
         if ($CURRENT_RPT) {
             rst = $CURRENT_RPT.totalPages;
         }
         return rst;
     },
-    getFieldDataLen: function(field: any, dataObj: any) {
+    getFieldDataLen: function(field: Fields, dataObj: IDataObj) {
         let rst = 0;
         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 {
             if (!field.DataNodeName) {
                 // that means this is a self-defined discrete field!
@@ -70,15 +74,15 @@ const JE = {
         }
         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[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) {
             //that means this is a self-defined discrete field!
-            field.DataNodeName = JV.DATA_DISCRETE_DATA;
+            field.DataNodeName = IDataObj_props.discrete_data;
             field.DataSeq = dataObj[JV.DATA_DISCRETE_DATA].length;
             dataObj[JV.DATA_DISCRETE_DATA].push([]);
             dataObj[field.DataNodeName][field.DataSeq][valIdx] = newValue;
@@ -86,17 +90,17 @@ const JE = {
             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;
         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 {
-                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 {
@@ -117,13 +121,13 @@ const JE = {
         if (rst === null || rst === undefined) rst = newVal;
         return rst;
     },
-    getFieldValueArray: function(field: any, dataObj: any) {
+    getFieldValueArray: function(field: Fields, dataObj: IDataObj) {
         let rst = null;
         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 {
             if (!field.DataNodeName) {
                 // that means this is a self-defined discrete field!
@@ -136,10 +140,10 @@ const JE = {
         if (rst === null || rst === undefined) rst = [];
         return rst;
     },
-    setFieldValueArray: function(field: any, dataObj: any, newArr: any[]) {
+    setFieldValueArray: function(field: Fields, dataObj: IDataObj, newArr: number[]) {
         if (newArr instanceof Array) {
             if (field.DataNodeName === 'NA') {
-                field[JV.PROP_AD_HOC_DATA] = newArr;
+                field.data_field = newArr;
             } else {
                 if (!field.DataNodeName) {
                     // that means this is a self-defined discrete field!
@@ -151,10 +155,10 @@ const JE = {
             }
         }
     },
-    removeFieldValue: function (field: any, dataObj: any, valIdx: number) {
+    removeFieldValue: function (field: Fields, dataObj: IDataObj, valIdx: number) {
         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 {
             if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx && valIdx >= 0) {
@@ -162,12 +166,12 @@ const JE = {
             }
         }
     },
-    insertFieldValue: function (field: any, dataObj: any, valIdx: number, newValue: any) {
+    insertFieldValue: function (field: Fields, dataObj: IDataObj, valIdx: number, newValue: number) {
         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 {
             if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx && valIdx >= 0) {

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

@@ -0,0 +1,513 @@
+import { IDataObj_props, IEvent_type } 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 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: string;
+    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 IControlSubCollection {
+    ID: string;
+    CloseOutput: string;
+    Horizon: string;
+    ShowZero: string;
+    Shrink: string;
+    ShrinkFirst: string;
+    Vertical: string;
+    VerticalForExcel: string;
+    Wrap: string;
+}
+export interface IControlCollection {
+    [key: string]: IControlSubCollection;
+}
+export interface IFontSubCollection {
+    FontAngle: string;
+    FontBold: string;
+    FontColor: string;
+    FontHeight: string;
+    FontItalic: string;
+    FontStrikeOut: string;
+    FontUnderline: string;
+    Name: string;
+    ID: string;
+}
+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;
+}
+
+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;
+    style: string;
+    Value: number | string | null;
+    area: IPosition;
+    isAutoHeight?: boolean;
+    Format?: any;
+    Prefix?: string;
+    Suffix?: any;
+};
+
+export interface IPreviewPage {
+    打印页面_信息: {
+        报表名称: string;
+        纸张宽高: IPosition;
+        页边距: [number, number]
+    };
+    control_collection: IControlCollection;
+    font_collection: IFontCollection;
+    items: [{
+        page_seq: number;
+        cells: ICell[];
+        page_merge_border: IPosition;
+    }];
+    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: IDataObj_props;
+    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[]
+   
+}
+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: IFlowTab;
+    flowTabEx?: 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 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;
+    BDisplayType: number;
+    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;
+}
+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: IEvent_type
+    }[];
+    布局框_集合: IBandDetail[];
+    计算式_集合: 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;
+    }[];
+    指标_数据_映射: {
+        离散参数_集合: 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: IControlCollection
+}
+//以后会跟 IGroupField合并
+export interface IOrgGroupField {
+    DataType: string;
+    descr?: string;
+    ID: number;
+    mapExpression?: string;
+    Name: string;
+    Title?: string;
+    Precision?: {
+        type: string
+        flexibleRefFieldID?: number
+    }
+    fixedPrecisionNum?: number
+    flexiblePrecisionRefObj?: { [key: string]: number }[];
+    Default_Value?: string;
+    isID?: string;
+    IDSeq: number
+}
+
+export interface IDataObj {
+    DecimalObj: {
+        prjDecimal: undefined,
+        unitDecimal: {
+            default_decimal: 2
+        }
+    };
+    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[];
+};

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

@@ -0,0 +1,104 @@
+import { Fields, IBandDetail, IBands, ICell, IControlCollection, ICrossTab, ICurrent_DATA, ICustomizeCfg, IDataObj, IDefProperties, IGrpLine, IMergePos, INode, IPreviewPage, IRptTpl, ITab } from "./basic";
+
+export declare class 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: any) => void;
+    checkGrpTxtOutEvent: ($RUN_TYPE: String, $TEXT: any, $TIMES: any, $CURRENT_RPT: any) => 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: any, 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: any) => any;
+    outputAsSimpleJSONPage: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, controls: IControlCollection, adHocMergePos: IMergePos, $CURRENT_RPT: any, 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: any, 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: any, 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: any) => 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: any, 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: any, defProperties: IDefProperties) => void
+    setupGroupingData: (rptTpl: IRptTpl, dataObj: IDataObj, $CURRENT_RPT: any) => void
+    sorting: (rptTpl: IRptTpl, dataObj: IDataObj, dataSeq: number[][], $CURRENT_RPT: any) => void
+    sumSeg: (dataObj: IDataObj, $CURRENT_RPT: any) => void
+    sumUpGrp: (rptTpl: IRptTpl, $CURRENT_RPT: any, dataObj: IDataObj, segIdx: number, preGrpIdx: number, nexGrpIdx: number) => void
+}
+
+export declare class IBillTabClass {
+    disp_fields_idx: any[];
+    outputAsPreviewPage: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: any) => any
+    outputAsSimpleJSONPage: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg) => any;
+    outputContent: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, pageStatus: boolean[], $CURRENT_RPT: any, 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 declare class 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: any) => void;
+    preSetupPages: (rptTpl: IRptTpl, defProperties: IDefProperties, option: string) => number;
+    outputAsPreviewPage: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg) => any; //最后一个参数其实没作用,方法中定义了,但是在实际使用并没有传值
+    outputPreviewContent: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg, maxRowRec: number, maxColRec: number, unitFactor: number) => any;
+    outputPreviewRowTab: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg, maxRowRec: number, unitFactor: number) => INode[];
+    outputPreviewColTab: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg, maxColRec: number, unitFactor: number) => INode[];
+    outputPreviewTabExt: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg, maxColRec: number, unitFactor: number) => INode[];
+    outputPreviewSumTabExt: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg, unitFactor: number) => INode[];
+    outputPreviewTabSum: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg, maxRowRec: number, tabNodeName: string, unitFactor: number) => INode[];
+    private_OutputPreviewCommon: (rptTpl: IRptTpl, bands: IBands, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg, maxRowRec: number, maxColRec: number, tab: ICrossTab, unitFactor: number) => any
+    outputAsSimpleJSONPage: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg) => any;
+    outputTabSum: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, tabNodeName: string, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg) => any
+    outputTabExt: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg) => any;
+    outputSumTabExt: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, segIdx: number, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg) => any
+    outputContent: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg) => any;
+    outputColTab: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, unitFactor: number, controls: IControlCollection, $CURRENT_RPT: any, customizeCfg: ICustomizeCfg) => any
+    outputRowTabCommon: (rptTpl: IRptTpl, dataObj: IDataObj, page: number, bands: IBands, tabStr: string, rowFieldsIdxArr: any[], unitFactor: number, controls: IControlCollection, $CURRENT_RPT: any, 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 {}

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

@@ -0,0 +1,13 @@
+export declare enum IDataObj_props {
+    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 declare enum IEvent_type{
+    GRP_ON_CREATE='GRP_ON_CREATE', 
+    FLOW_CONTENT_ON_CREATE= 'FLOW_CONTENT_ON_CREATE'
+}
+export default {}