Selaa lähdekoodia

Merge branch 'master' into olym

olym 8 vuotta sitten
vanhempi
commit
98c417c9be

+ 1 - 1
Dockerfile

@@ -1,4 +1,4 @@
-FROM server:2.0
+FROM server:3.0
 
 COPY . ConstructionCost
 

+ 1 - 1
Dockerfile_qa

@@ -1,4 +1,4 @@
-FROM server:2.0
+FROM server:3.0
 
 COPY . ConstructionCost
 

+ 1 - 1
config/config.js

@@ -19,7 +19,7 @@ module.exports = {
             },
             "server": {
                  "socketOptions": {
-                 "connectTimeoutMS": 10000
+                 "connectTimeoutMS": 20000
                 }
             }
         }

+ 7 - 10
config/db/db_manager.js

@@ -49,16 +49,13 @@ module.exports = {
     connect:function () {
         var config = require("../config.js");
         var dbURL = 'mongodb://' + config.current.server + ":" + config.current.port + '/scConstruct';
-
-        var db = mg.connect(dbURL, config.options, function(err) {
-            if (err) {
-                console.log('Could not connect to MongoDB!');
-                console.log(err);
-            }
-        });
-        mg.connection.on('error', function(err) {
-            console.log('MongoDB connection error:', err);
+        mg.connect(dbURL, config.options);
+        var db = mg.connection;
+        db.on("error",function (err) {
+            console.log('Could not connect to MongoDB!');
+            console.log(err);
             process.exit(-1);
-        });
+        })
+        return mg;
     }
 };

+ 16 - 7
modules/reports/rpt_component/helper/jpc_helper_band.js

@@ -39,10 +39,10 @@ let JpcBandHelper = {
         band[JV.PROP_RIGHT] = orgArea[JV.IDX_RIGHT];
         band[JV.PROP_BOTTOM] = orgArea[JV.IDX_BOTTOM];
         //2. set this band
-        if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+        if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
             switch (band[JV.BAND_PROP_ALIGNMENT]) {
                 case JV.LAYOUT_TOP:
-                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
+                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
                         band.Bottom = band.Top + unitFactor * band[JV.BAND_PROP_HEIGHT];
                     } else {
                         band.Bottom = band.Top + (band.Bottom - band.Top) * band[JV.BAND_PROP_HEIGHT] / 100;
@@ -50,7 +50,7 @@ let JpcBandHelper = {
                     orgArea[JV.IDX_TOP] = band.Bottom;
                     break;
                 case JV.LAYOUT_BOTTOM:
-                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
+                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
                         band.Top = band.Bottom - unitFactor * band[JV.BAND_PROP_HEIGHT];
                     } else {
                         band.Top = band.Bottom - (band.Bottom - band.Top) * band[JV.BAND_PROP_HEIGHT] / 100;
@@ -58,7 +58,7 @@ let JpcBandHelper = {
                     orgArea[JV.IDX_BOTTOM] = band.Top;
                     break;
                 case JV.LAYOUT_LEFT:
-                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
+                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
                         band.Right = band.Left + unitFactor * band[JV.BAND_PROP_WIDTH];
                     } else {
                         band.Right = band.Left + (band.Right - band.Left) * band[JV.BAND_PROP_WIDTH] / 100;
@@ -66,7 +66,7 @@ let JpcBandHelper = {
                     orgArea[JV.IDX_LEFT] = band.Right;
                     break;
                 case JV.LAYOUT_RIGHT:
-                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
+                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
                         band.Left = band.Right - unitFactor * band[JV.BAND_PROP_WIDTH];
                     } else {
                         band.Left = band.Right - (band.Right - band.Left) * band[JV.BAND_PROP_WIDTH] / 100;
@@ -83,17 +83,26 @@ let JpcBandHelper = {
             }
         }
     },
-    resetBandPos: function (bandCollection, bands, contentBand, offsetY) {
-        let orgY = contentBand.Bottom;
+    resetBandPos: function (bandCollection, bands, contentBand, offsetX, offsetY) {
+        let orgX = contentBand.Right, orgY = contentBand.Bottom;
         function chkAndResetPos(targetBand) {
             let band = bands[targetBand.Name];
             if (band) {
                 if (band === contentBand) {
                     band.Bottom += offsetY;
+                    band.Right += offsetX;
                 } else {
                     if (band.Top >= orgY) {
                         band.Top += offsetY;
                         band.Bottom += offsetY;
+                    } else if (band.Bottom >= orgY && band.Top < orgY) {
+                        band.Bottom += offsetY;
+                    }
+                    if (band.Left >= orgX) {
+                        band.Left += offsetX;
+                        band.Right += offsetX;
+                    } else if (band.Right >= orgX && band.Le < orgX) {
+                        band.Right += offsetX;
                     }
                 }
                 if (targetBand[JV.BAND_PROP_SUB_BANDS]) {

+ 52 - 17
modules/reports/rpt_component/helper/jpc_helper_cross_tab.js

@@ -114,34 +114,35 @@ let JpcCrossTabHelper = {
             }
         }
     },
-    getMaxTabCntPerPage: function(bands, rptTpl, tabNodeName, tabMeasurePropName, measureForCal) {
+    getMaxRowsPerPage: function(bands, rptTpl) {
         let rst = 1;
-        if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
-            let tab = rptTpl[JV.NODE_CROSS_INFO][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;
-            } else {
-                maxFieldMeasure = measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
-            }
-            rst = Math.floor(measureForCal / maxFieldMeasure);
+        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]];
+        if (band) {
+            rst =  getMaxTabCntPerPage(rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top);
         }
         return rst;
     },
-    getMaxRowsPerPage: function(bands, rptTpl) {
-        let me = this, rst = 1;
+    getMaxColsPerPage: function(bands, rptTpl) {
+        let rst = 1;
+        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]];
+        if (band) {
+            rst =  getMaxTabCntPerPage(rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left);
+        }
+        return rst;
+    },
+    getActualRowsHeight: function(bands, rptTpl, segments, page) {
+        let rst = 1;
         let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]];
         if (band) {
-            rst =  me.getMaxTabCntPerPage(bands, rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top);
+            rst =  getActualContentAreaMeasurement(rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top, segments, page);
         }
         return rst;
     },
-    getMaxColsPerPage: function(bands, rptTpl) {
-        let me = this, rst = 1;
+    getActualColsWidth: function(bands, rptTpl, segments, page) {
+        let rst = 1;
         let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]];
         if (band) {
-            rst =  me.getMaxTabCntPerPage(bands, rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left);
+            rst =  getActualContentAreaMeasurement(rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left, segments, page);
         }
         return rst;
     },
@@ -186,4 +187,38 @@ let JpcCrossTabHelper = {
     }
 };
 
+function getMaxTabCntPerPage(rptTpl, tabNodeName, tabMeasurePropName, measureForCal) {
+    let rst = 1;
+    if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
+        let tab = rptTpl[JV.NODE_CROSS_INFO][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;
+        } else {
+            maxFieldMeasure = measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
+        }
+        rst = Math.floor(measureForCal / maxFieldMeasure);
+    }
+    return rst;
+};
+
+function getActualContentAreaMeasurement(rptTpl, tabNodeName, tabMeasurePropName, measureForCal, segments, page) {
+    let rst = 1;
+    if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
+        let tab = rptTpl[JV.NODE_CROSS_INFO][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;
+        } else {
+            maxFieldMeasure = measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
+        }
+        if (segments.length >= page) {
+            rst = segments[page - 1].length * maxFieldMeasure;
+        }
+    }
+    return rst;
+};
+
 module.exports = JpcCrossTabHelper;

+ 3 - 3
modules/reports/rpt_component/helper/jpc_helper_field.js

@@ -12,8 +12,8 @@ let JpcFieldHelper = {
         if (controls) {
             let val = cell[JV.PROP_VALUE];
             let showZero = controls[cell[JV.PROP_CONTROL]][JV.PROP_SHOW_ZERO];
-            if (showZero && showZero == 'F' ) {
-                if (0.0 == 1.0 * (0 + val)) {
+            if (showZero && showZero === 'F' ) {
+                if (0.0 === 1.0 * (0 + val)) {
                     cell[JV.PROP_VALUE] = "";
                 }
             }
@@ -26,7 +26,7 @@ let JpcFieldHelper = {
             for (let i = 0; i < tab_fields.length; i++) {
                 let isFounded = false;
                 for (let j = 0; j < detail_fields.length; j++) {
-                    if (tab_fields[i]["FieldID"] == detail_fields[j]["ID"]) {
+                    if (tab_fields[i]["FieldID"] === detail_fields[j]["ID"]) {
                         isFounded = true;
                         if (rstFields) rstFields.push(tab_fields[i]);
                         if (rstFieldsIdx) rstFieldsIdx.push(j);

+ 0 - 1
modules/reports/rpt_component/helper/jpc_helper_flow_tab.js

@@ -30,7 +30,6 @@ let JpcFlowTabHelper = {
             } else {
                 maxFieldMeasure = (band.Bottom - band.Top) * rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] / JV.HUNDRED_PERCENT;
             }
-            //rst = Math.floor((band.Bottom - band.Top) / maxFieldMeasure);
             if (segments.length >= page) {
                 rst = segments[page - 1].length * maxFieldMeasure;
             }

+ 150 - 93
modules/reports/rpt_component/jpc_cross_tab.js

@@ -2,7 +2,6 @@ let JV = require('./jpc_value_define');
 let JpcFieldHelper = require('./helper/jpc_helper_field');
 let JpcBandHelper = require('./helper/jpc_helper_band');
 let JpcBand = require('./jpc_band');
-let JpcFlowTabHelper = require('./helper/jpc_helper_flow_tab');
 let JpcCrossTabHelper = require('./helper/jpc_helper_cross_tab');
 let JpcCommonHelper = require('./helper/jpc_helper_common');
 let JpcDiscreteHelper = require('./helper/jpc_helper_discrete');
@@ -22,7 +21,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
             if (sortedSequence) {
                 let arrDupVals = sortedSequence[segIdx];
                 let arrDupSumVals = null;
-                if (sorted_sum_value_Lst != null) {
+                if (sorted_sum_value_Lst !== null) {
                     arrDupSumVals = sorted_sum_value_Lst[segIdx];
                     sumValL = arrDupSumVals[0].length;
                 }
@@ -34,24 +33,24 @@ JpcCrossTabSrv.prototype.createNew = function(){
                         for (let ei = 0; ei < sumValL; ei++) {
                             sumVal[i][ei] = null;
                         }
-                        if (serial1stTier != null) {
+                        if (serial1stTier !== null) {
                             serial1stTier[i] = JV.BLANK_VALUE_INDEX;
                         }
                         continue;
                     }
                     let duplicateValueArr = arrDupVals[preRec + i];
                     pgseg1stTier[i] = duplicateValueArr[0];
-                    if (arrDupSumVals != null) sumVal[i] = arrDupSumVals[preRec + i];
+                    if (arrDupSumVals !== null) sumVal[i] = arrDupSumVals[preRec + i];
 
-                    if (serial1stTier != null) {
+                    if (serial1stTier !== null) {
                         serial1stTier[i] = preRec + i;
                     }
                 }
                 tabValuedIdxLst.push(pgseg1stTier);
-                if (dispSerialIdxLst != null) {
+                if (dispSerialIdxLst !== null) {
                     dispSerialIdxLst.push(serial1stTier);
                 }
-                if (sorted_sum_value_Lst != null && rst_sum_value_Lst != null) {
+                if (sorted_sum_value_Lst !== null && rst_sum_value_Lst !== null) {
                     rst_sum_value_Lst.push(sumVal);
                 }
             } else {
@@ -59,25 +58,25 @@ JpcCrossTabSrv.prototype.createNew = function(){
                 for (let i = 0; i < nextRec; i++) {
                     pgseg1stTier[i] = JV.BLANK_VALUE_INDEX;
                     sumVal[i] = null;
-                    if (serial1stTier != null) {
+                    if (serial1stTier !== null) {
                         serial1stTier[i] = JV.BLANK_VALUE_INDEX;
                     }
                 }
                 tabValuedIdxLst.push(pgseg1stTier);
-                if (dispSerialIdxLst != null) {
+                if (dispSerialIdxLst !== null) {
                     dispSerialIdxLst.push(serial1stTier);
                 }
-                if (sorted_sum_value_Lst != null && rst_sum_value_Lst != null) {
+                if (sorted_sum_value_Lst !== null && rst_sum_value_Lst !== null) {
                     rst_sum_value_Lst.push(sumVal);
                 }
             }
         }
     }
     function private_addContentValue(dispValueIdxLst_Content, sortedContentSequence, segIdx, counterRowRec, maxRowRec, counterColRec, maxColRec, page_seg_map, pageIdx) {
-        if (dispValueIdxLst_Content != null) {
+        if (dispValueIdxLst_Content !== null) {
             page_seg_map.push([pageIdx,segIdx]);
             let arrContents = [];
-            if (sortedContentSequence != null) {
+            if (sortedContentSequence !== null) {
                 let arrAllContent = sortedContentSequence[segIdx];
                 for (let i = 0; i < maxRowRec; i++) {
                     arrContents.push([]);
@@ -117,13 +116,13 @@ JpcCrossTabSrv.prototype.createNew = function(){
             for (let i = 0; i < dataSeq.length; i++) {
                 sIDX = 0;
                 let segArr = [];
-                if (dataSeq[i].length == 1) {
+                if (dataSeq[i].length === 1) {
                     JpcCrossTabHelper.pushToSeg(segArr, dataSeq, i, 0, 1);
                 } else {
                     for (let j = 1; j < dataSeq[i].length; j++) {
                         b1 = false;
                         for (let k = 0; k < rstFieldsIdx.length; k++) {
-                            if (data_details[rstFieldsIdx[k]][dataSeq[i][j - 1]] != data_details[rstFieldsIdx[k]][dataSeq[i][j]]) {
+                            if (data_details[rstFieldsIdx[k]][dataSeq[i][j - 1]] !== data_details[rstFieldsIdx[k]][dataSeq[i][j]]) {
                                 b1 = true;
                                 break;
                             }
@@ -131,10 +130,10 @@ JpcCrossTabSrv.prototype.createNew = function(){
                         if (b1) {
                             JpcCrossTabHelper.pushToSeg(segArr, dataSeq, i, sIDX, j);
                             sIDX = j;
-                            if (j == dataSeq[i].length - 1) {
+                            if (j === dataSeq[i].length - 1) {
                                 JpcCrossTabHelper.pushToSeg(segArr, dataSeq, i, j, dataSeq[i].length);
                             }
-                        } else if (j == dataSeq[i].length - 1) {
+                        } else if (j === dataSeq[i].length - 1) {
                             JpcCrossTabHelper.pushToSeg(segArr, dataSeq, i, sIDX, dataSeq[i].length);
                         }
                     }
@@ -193,6 +192,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         me.row_sum_extension_fields_idx = [];
         me.crsOrient = JV.PAGE_ORIENTATION_V_FIRST;
         me.pageStatusLst = [];
+        me.paging_option = JV.PAGING_OPTION_NORMAL;
     };
     JpcCrossTabResult.sorting = function(rptTpl, dataObj, dataSeq) {
         let me = this;
@@ -227,7 +227,8 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
     };
     JpcCrossTabResult.preSetupPages = function(rptTpl, defProperties, option) {
-        let rst = 0, me = this, dftPagingOption = option||JV.PAGING_OPTION_NORMAL;
+        let me = this, rst = 0;
+        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 = [true, true, false, true, false, false, false, false];
@@ -240,83 +241,137 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.TAB_CROSS_FIELDS], null, me.row_extension_fields_idx);
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][JV.TAB_CROSS_FIELDS], null, me.row_sum_extension_fields_idx);
-        for (let segIdx = 0; segIdx < segCnt; segIdx++) {
-            //2.1. seg level initialize
-            private_resetBandArea();
-            let orgMaxRowRec = maxRowRec, orgMaxColRec = maxColRec;
-            let rowSplitCnt = Math.ceil(1.0 * me.sortedRowSequence[segIdx].length / maxRowRec);
-            let colSplitCnt = Math.ceil(1.0 * me.sortedColSequence[segIdx].length / maxColRec);
+        if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
+            /*
+            rst = segCnt;
+            pageStatus[JV.STATUS_SEGMENT_START] = true;
+            pageStatus[JV.STATUS_SEGMENT_END] = true;
             pageStatus[JV.STATUS_CROSS_ROW_END] = true;
-            private_resetBandArea();
-            let hasAdHocRow = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_SUM, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
-            if (hasAdHocRow) {
-                hasAdHocRow = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_EXT, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
-            }
-            pageStatus[JV.STATUS_CROSS_ROW_END] = false;
             pageStatus[JV.STATUS_CROSS_COL_END] = true;
-            private_resetBandArea();
-            let hasAdHocCol = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_COL_SUM, rptTpl, bands, me.sortedColSequence, segIdx, (colSplitCnt - 1) * orgMaxColRec, maxColRec);
-            pageStatus[JV.STATUS_CROSS_COL_END] = false;
-            private_resetBandArea();
-            if (hasAdHocRow) rowSplitCnt++;
-            if (hasAdHocCol) colSplitCnt++;
-            //2.2
-            for (let colIdx = 0; colIdx < colSplitCnt; colIdx++) {
-                pageStatus[JV.STATUS_CROSS_COL_END] = colIdx == (colSplitCnt - 1)?true:false;
+            for (let segIdx = 0; segIdx < segCnt; segIdx++) {
+                if (segIdx === segCnt - 1) {
+                    pageStatus[JV.STATUS_REPORT_END] = true;
+                }
+                if (segIdx > 0) {
+                    pageStatus[JV.STATUS_REPORT_START] = false;
+                }
+                me.pageStatusLst.push(pageStatus.slice(0));
+                pageIdx++;
+                private_addTabValue(me.dispValueIdxLst_Row, me.sortedRowSequence, segIdx, 0, me.sortedRowSequence[segIdx].length, me.dispSerialIdxLst_Row, me.col_sum_fields_value_total, me.dispSumValueLst_Col);
+                private_addTabValue(me.dispValueIdxLst_Col, me.sortedColSequence, segIdx, 0, me.sortedColSequence[segIdx].length, null, null, null);
+                private_addContentValue(me.dispValueIdxLst_Content, me.sortedContentSequence, segIdx, 0, me.sortedRowSequence[segIdx].length, 0, me.sortedColSequence[segIdx].length, me.page_seg_map, pageIdx);
+            }
+            //*/
+        } else {
+            for (let segIdx = 0; segIdx < segCnt; segIdx++) {
+                //2.1. seg level initialize
+                private_resetBandArea();
+                let orgMaxRowRec = maxRowRec, orgMaxColRec = maxColRec;
+                let rowSplitCnt = Math.ceil(1.0 * me.sortedRowSequence[segIdx].length / maxRowRec);
+                let colSplitCnt = Math.ceil(1.0 * me.sortedColSequence[segIdx].length / maxColRec);
+                pageStatus[JV.STATUS_CROSS_ROW_END] = true;
                 private_resetBandArea();
-                counterColRec = orgMaxColRec * colIdx;
-                let currentSortedContentSequence = me.sortedContentSequence;
-                let currentSortedColSequence = me.sortedColSequence;
-                if (hasAdHocCol && colIdx == (colSplitCnt - 1)) {
-                    currentSortedColSequence = null;
-                    currentSortedContentSequence = null;
-                    counterColRec = 0;
+                let hasAdHocRow = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_SUM, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
+                if (hasAdHocRow) {
+                    hasAdHocRow = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_EXT, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
                 }
-                for (let rowIdx = 0; rowIdx < rowSplitCnt; rowIdx++) {
-                    pageStatus[JV.STATUS_CROSS_ROW_END] = rowIdx == (rowSplitCnt - 1)?true:false;
+                pageStatus[JV.STATUS_CROSS_ROW_END] = false;
+                pageStatus[JV.STATUS_CROSS_COL_END] = true;
+                private_resetBandArea();
+                let hasAdHocCol = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_COL_SUM, rptTpl, bands, me.sortedColSequence, segIdx, (colSplitCnt - 1) * orgMaxColRec, maxColRec);
+                pageStatus[JV.STATUS_CROSS_COL_END] = false;
+                private_resetBandArea();
+                if (hasAdHocRow) rowSplitCnt++;
+                if (hasAdHocCol) colSplitCnt++;
+                //2.2
+                for (let colIdx = 0; colIdx < colSplitCnt; colIdx++) {
+                    pageStatus[JV.STATUS_CROSS_COL_END] = (colIdx === (colSplitCnt - 1));
                     private_resetBandArea();
-                    me.pageStatusLst.push(pageStatus.slice(0));
-                    pageIdx++;
-                    counterRowRec = orgMaxRowRec * rowIdx;
-                    let currentSortedRowSequence = me.sortedRowSequence;
-                    if (hasAdHocRow && rowIdx == (rowSplitCnt - 1)) {
-                        currentSortedRowSequence = null;
+                    counterColRec = orgMaxColRec * colIdx;
+                    let currentSortedContentSequence = me.sortedContentSequence;
+                    let currentSortedColSequence = me.sortedColSequence;
+                    if (hasAdHocCol && colIdx === (colSplitCnt - 1)) {
+                        currentSortedColSequence = null;
                         currentSortedContentSequence = null;
-                        counterRowRec = 0;
+                        counterColRec = 0;
+                    }
+                    for (let rowIdx = 0; rowIdx < rowSplitCnt; rowIdx++) {
+                        pageStatus[JV.STATUS_CROSS_ROW_END] = (rowIdx === (rowSplitCnt - 1));
+                        private_resetBandArea();
+                        me.pageStatusLst.push(pageStatus.slice(0));
+                        pageIdx++;
+                        counterRowRec = orgMaxRowRec * rowIdx;
+                        let currentSortedRowSequence = me.sortedRowSequence;
+                        if (hasAdHocRow && rowIdx === (rowSplitCnt - 1)) {
+                            currentSortedRowSequence = null;
+                            currentSortedContentSequence = null;
+                            counterRowRec = 0;
+                        }
+                        private_addTabValue(me.dispValueIdxLst_Row, currentSortedRowSequence, segIdx, counterRowRec, maxRowRec, me.dispSerialIdxLst_Row, me.col_sum_fields_value_total, me.dispSumValueLst_Col);
+                        private_addTabValue(me.dispValueIdxLst_Col, currentSortedColSequence, segIdx, counterColRec, maxColRec, null, null, null);
+                        private_addContentValue(me.dispValueIdxLst_Content, currentSortedContentSequence, segIdx, counterRowRec, maxRowRec, counterColRec, maxColRec, me.page_seg_map, pageIdx);
                     }
-                    private_addTabValue(me.dispValueIdxLst_Row, currentSortedRowSequence, segIdx, counterRowRec, maxRowRec, me.dispSerialIdxLst_Row, me.col_sum_fields_value_total, me.dispSumValueLst_Col);
-                    private_addTabValue(me.dispValueIdxLst_Col, currentSortedColSequence, segIdx, counterColRec, maxColRec, null, null, null);
-                    private_addContentValue(me.dispValueIdxLst_Content, currentSortedContentSequence, segIdx, counterRowRec, maxRowRec, counterColRec, maxColRec, me.page_seg_map, pageIdx);
                 }
+                JpcCrossTabHelper.initialPageStatus(pageStatus);
             }
-            JpcCrossTabHelper.initialPageStatus(pageStatus);
+            //3. set pageSeq and return the result
+            rst = pageIdx;
         }
         bands = null;
-        //3. set pageSeq and return the result
-        rst = pageIdx;
         return rst;
     };
     JpcCrossTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, $CURRENT_RPT) {
         let me = this, rst = [], tabRstLst = [];
-        let segIdx = JpcCommonHelper.getSegIdxByPageIdx(page, me.page_seg_map);
-        //1 calculate the band position
-        JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
-        //2. start to output detail-part
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-        //2.1 Row-Tab
-        tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls));
-        //2.2 Col-Tab
-        tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls));
-        //2.3 Content-Tab
-        tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls));
-        //2.4 Sum-Tab Row
-        //2.4 Sum-tab Col
-        tabRstLst.push(me.outputTabSum(rptTpl, dataObj, page, bands, unitFactor, JV.NODE_CROSS_COL_SUM, controls));
-        //2.x row tab ext
-        tabRstLst.push(me.outputTabExt(rptTpl, dataObj, page, bands, unitFactor, controls));
-        tabRstLst.push(me.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls));
-        //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));
+        if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
+            /*
+            let segIdx = page - 1;
+            //1 calculate the band position
+            JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
+            //2. then reset the band height
+            let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
+            let crossContentBand = bands[tab[JV.PROP_BAND_NAME]];
+            let actH = JpcCrossTabHelper.getActualRowsHeight(bands, rptTpl, me.sortedRowSequence, page);
+            let actW = JpcCrossTabHelper.getActualColsWidth(bands, rptTpl, me.sortedColSequence, page);
+            let offsetY = actH - (crossContentBand.Bottom - crossContentBand.Top);
+            let offsetX = actW - (crossContentBand.Right - crossContentBand.Left);
+            JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, crossContentBand, offsetX, offsetY);
+
+            //2.1 Row-Tab
+            tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.2 Col-Tab
+            tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.3 Content-Tab
+            tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.4 Sum-Tab Row
+            //2.4 Sum-tab Col
+            tabRstLst.push(me.outputTabSum(rptTpl, dataObj, page, bands, unitFactor, JV.NODE_CROSS_COL_SUM, controls));
+            //2.x row tab ext
+            tabRstLst.push(me.outputTabExt(rptTpl, dataObj, page, bands, unitFactor, controls));
+            tabRstLst.push(me.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls));
+            //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));
+            //*/
+        } else {
+            let segIdx = JpcCommonHelper.getSegIdxByPageIdx(page, me.page_seg_map);
+            //1 calculate the band position
+            JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
+            //2. start to output detail-part
+            //2.1 Row-Tab
+            tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.2 Col-Tab
+            tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.3 Content-Tab
+            tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.4 Sum-Tab Row
+            //2.4 Sum-tab Col
+            tabRstLst.push(me.outputTabSum(rptTpl, dataObj, page, bands, unitFactor, JV.NODE_CROSS_COL_SUM, controls));
+            //2.x row tab ext
+            tabRstLst.push(me.outputTabExt(rptTpl, dataObj, page, bands, unitFactor, controls));
+            tabRstLst.push(me.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls));
+            //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));
+        }
         for (let i = 0; i < tabRstLst.length; i++) {
             rst = rst.concat(tabRstLst[i]);
             tabRstLst[i] = null;
@@ -329,7 +384,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Row[page - 1];
@@ -354,7 +409,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Col[page - 1];
@@ -390,7 +445,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let contentValuesIdx = me.dispValueIdxLst_Content[page - 1];
@@ -417,10 +472,10 @@ JpcCrossTabSrv.prototype.createNew = function(){
             band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 for (let i = 0; i < me.dispSumValueLst_Col[page - 1].length; i++) {
-                    if (me.dispSumValueLst_Col[page - 1][i] != null) {
+                    if (me.dispSumValueLst_Col[page - 1][i] !== null) {
                         for (let j = 0; j < me.dispSumValueLst_Col[page - 1][i].length; j++) {
                             let tab_field = tab_fields[j];
                             let val = me.dispSumValueLst_Col[page - 1][i][j];
@@ -431,7 +486,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
                     } else {
                         let sumL = 1;
                         for (let si = 0; si < me.dispSumValueLst_Col.length; si++) {
-                            if (me.dispSumValueLst_Col[si][0] != null) {
+                            if (me.dispSumValueLst_Col[si][0] !== null) {
                                 sumL = me.dispSumValueLst_Col[si][0].length;
                                 break;
                             }
@@ -455,7 +510,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS],
                     data_details = dataObj[JV.DATA_DETAIL_DATA],
                     valuesIdx = me.dispValueIdxLst_Col[page - 1];
@@ -491,7 +546,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true && pageStatus[JV.STATUS_CROSS_ROW_END] === true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true && pageStatus[JV.STATUS_CROSS_ROW_END] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS],
                     data_details = dataObj[JV.DATA_DETAIL_DATA],
                     data_fields = [];
@@ -533,22 +588,24 @@ JpcCrossTabSrv.prototype.createNew = function(){
         return rst;
     };
     JpcCrossTabResult.outputTabField = function (band, tab_field, data_field, valueIdx, serialIdx, rows, rowIdx, cols, colIdx, unitFactor, isRow, controls) {
-        let me = this, rst = null;
-        if (isRow == true && tab_field[JV.PROP_IS_SERIAL] && tab_field[JV.PROP_IS_SERIAL] == true) {
-            if (serialIdx >= 0) rst = JpcCommonOutputHelper.createCommonOutput(tab_field, serialIdx + 1)
-            else rst = JpcCommonOutputHelper.createCommonOutput(tab_field, "", controls);
+        let rst = null;
+        if (isRow === true && tab_field[JV.PROP_IS_SERIAL] && tab_field[JV.PROP_IS_SERIAL] === true) {
+            if (serialIdx >= 0) {
+                rst = JpcCommonOutputHelper.createCommonOutput(tab_field, serialIdx + 1)
+            } else rst = JpcCommonOutputHelper.createCommonOutput(tab_field, "", controls);
         } else {
             rst = JpcCommonOutputHelper.createCommonOutput(tab_field, JpcFieldHelper.getValue(data_field, valueIdx), controls);
         }
         //position
-        if (isRow == true) {
+        if (isRow === true) {
             rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, 1, 0, true, false);
         } else {
             rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, 1, 0, false, false);
         }
         return rst;
-    }
+    };
+
     return JpcCrossTabResult;
-}
+};
 
 module.exports = new JpcCrossTabSrv();

+ 3 - 2
modules/reports/rpt_component/jpc_ex.js

@@ -146,7 +146,8 @@ JpcExSrv.prototype.createNew = function(){
             }
             me.totalPages += me.exTotalPages;
         } else if (me.crossTab) {
-            me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties);
+            //me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties, dftPagingOption);
+            me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties, JV.PAGING_OPTION_NORMAL); //infinity对交叉表来说无意义
         } else if (me.billTab) {
             me.totalPages = me.billTab.paging();
         }
@@ -207,7 +208,7 @@ JpcExSrv.prototype.createNew = function(){
             let adHocMergePos = null;
             if (me.flowTab) {
                 if (me.totalPages - me.exTotalPages >= page) {
-                    if (me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY_VERTICAL) {
+                    if (me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY) {
                         adHocMergePos = {};
                     }
                     rst.cells = me.flowTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, adHocMergePos, me);

+ 4 - 4
modules/reports/rpt_component/jpc_flow_tab.js

@@ -79,7 +79,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         me.paging_option = option||JV.PAGING_OPTION_NORMAL;
         let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, me.isEx);
-        if (me.paging_option === JV.PAGING_OPTION_INFINITY_VERTICAL) {
+        if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
             rst = me.segments.length;
             let pageStatus = [true, true, false, true, true, true, false, false];
             for (let segIdx = 0; segIdx < me.segments.length; segIdx++) {
@@ -138,7 +138,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         let me = this, rst = [], tabRstLst = [];
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-        if (me.paging_option === JV.PAGING_OPTION_INFINITY_VERTICAL) {
+        if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
             let segIdx = page - 1;
             //1 calculate the band position
             JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1], !me.isEx, me.isEx);
@@ -147,7 +147,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             let flowContentBand = bands[tab[JV.PROP_BAND_NAME]];
             let actH = JpcFlowTabHelper.getActualContentAreaHeight(bands, rptTpl, me.segments, page);
             let offsetY = actH - (flowContentBand.Bottom - flowContentBand.Top);
-            JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, offsetY);
+            JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, 0, offsetY);
 
             tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, 0, $CURRENT_RPT));
             // 2.2 Column tab
@@ -170,7 +170,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 arr.push(parseInt(mergedBand[JV.PROP_TOP].toFixed(0)));
                 adHocMergePos[JV.PROP_TOP] = arr;
                 arr = [];
-                arr.push(parseInt((mergedBand[JV.PROP_BOTTOM] + offsetY).toFixed(0)));
+                arr.push(parseInt((mergedBand[JV.PROP_BOTTOM]).toFixed(0)));
                 adHocMergePos[JV.PROP_BOTTOM] = arr;
             }
         } else {

+ 1 - 3
public/web/rpt_value_define.js

@@ -196,9 +196,7 @@ let JV = {
     PROP_CELLS: "cells",
 
     PAGING_OPTION_NORMAL: 'normal',
-    PAGING_OPTION_INFINITY_HORIZON: 'infinity_horizon',
-    PAGING_OPTION_INFINITY_VERTICAL: 'infinity_vertical',
-    PAGING_OPTION_INFINITY_BOTH: 'infinity_both',
+    PAGING_OPTION_INFINITY: 'infinity',
 
     PAGE_SELF_DEFINE: "自定义",
     PAGE_SPECIAL_MERGE_POS: "page_merge_pos",

+ 2 - 2
public/web/sheet/sheet_common.js

@@ -9,7 +9,7 @@ var sheetCommonObj = {
         var me = this;
         var spreadBook = new GC.Spread.Sheets.Workbook(container, { sheetCount: SheetCount });
         spreadBook.options.tabStripVisible = false;
-        spreadBook.options.showHorizontalScrollbar = false;
+         spreadBook.options.showHorizontalScrollbar = true;
         spreadBook.options.allowCopyPasteExcelStyle = false;
         spreadBook.options.allowUserDragDrop = true;
         return spreadBook;
@@ -35,7 +35,7 @@ var sheetCommonObj = {
         var me = this;
         var spreadBook = new GC.Spread.Sheets.Workbook(container, { sheetCount: 1 });
         spreadBook.options.tabStripVisible = false;
-        spreadBook.options.showHorizontalScrollbar = false;
+        spreadBook.options.showHorizontalScrollbar = true;
         var spreadNS = GC.Spread.Sheets;
         var sheet = spreadBook.getSheet(0);
         sheet.suspendPaint();

+ 7 - 5
test/tmp_data/bills_grid_setting.js

@@ -138,7 +138,7 @@ var BillsGridSetting ={
         },
         {
             "width":180,
-            "readOnly":'readOnly.volumePrice',
+            "readOnly": true,
             "head":{
                 "titleNames":[
                     "项目特征"
@@ -163,12 +163,13 @@ var BillsGridSetting ={
                 "field":"itemCharacterText",
                 "vAlign":1,
                 "hAlign":0,
-                "font":"Arial"
+                "font":"Arial",
+                "wordWrap": true
             }
         },
         {
-            "width":80,
-            "readOnly":'readOnly.volumePrice',
+            "width":180,
+            "readOnly": true,
             "head":{
                 "titleNames":[
                     "工作内容"
@@ -193,7 +194,8 @@ var BillsGridSetting ={
                 "field":"jobContentText",
                 "vAlign":1,
                 "hAlign":0,
-                "font":"Arial"
+                "font":"Arial",
+                "wordWrap": true
             }
         },
         {

+ 2 - 2
web/building_saas/main/html/main.html

@@ -62,7 +62,7 @@
                     <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-wrench"></i> 工具</a>
                     <div class="dropdown-menu">
                         <a class="dropdown-item" href="#">定额库编辑器</a>
-                        <a class="dropdown-item" href="#">工料机库编辑器</a>
+                        <a class="dropdown-item" href="/complementaryGlj">工料机库编辑器</a>
                     </div>
                 </li>
                 <li class="nav-item dropdown">
@@ -157,7 +157,7 @@
                                   </li>
                               </ul>
                               <!-- Tab panes -->
-                              <div class="tab-content">
+                              <div class="tab-content" id="tabCon">
                                   <div class="tab-pane active" id="gl" role="tabpanel">
                                       <div class="main-data-bottom ovf-hidden" id="subSpread" style="display: none">
                                       </div>

+ 6 - 0
web/building_saas/main/js/models/bills.js

@@ -149,6 +149,12 @@ var Bills = {
                     data.data.code = stdBillsData.code;
                     data.data.name = stdBillsData.name;
                     data.data.unit = stdBillsData.unit;
+                    //zhong 特征及内容
+                    data.data.jobContent = stdBillsData.jobContent;
+                    data.data.itemCharacter = stdBillsData.itemCharacter;
+                    data.data.jobContentText = stdBillsData.jobContentText;
+                    data.data.itemCharacterText = stdBillsData.itemCharacterText;
+                    //zhong
                     newData = data.data;
                 }
             });

+ 82 - 30
web/building_saas/main/js/views/character_content_view.js

@@ -29,8 +29,13 @@ let contentOprObj = {
         sheet.bind(EVENTS.ClipboardPasted, me.onClipboardPasted);
     },
     //将从清单库中添加的清单,把标准清单的工作内容转化成清单的工作内容
-    buildJobContent: function () {
-
+    buildJobContent: function (jobs) {
+        let jobContent = [];
+        for(let i = 0, len = jobs.length; i < len; i++){
+            let newJob = {serialNo: i + 1, content: jobs[i].content, isChecked: true};//从清单库添加过来的默认输出
+            jobContent.push(newJob);
+        }
+        return jobContent;
     },
     //显示在jobSpread的数据
     showContentData: function (sheet, setting, datas) {
@@ -196,15 +201,10 @@ let contentOprObj = {
             selector: '#jobSpread',
             build: function($triggerElement, e){
                 //控制允许右键菜单在哪个位置出现
-                let clientX = e.originalEvent.clientX,
-                 clientY = e.originalEvent.clientY;
-                 let sheet = me.workBook.getSheet(0);
-                 let offset = $("#jobSpread").offset(),
-                 x = clientX - offset.left,
-                 y = clientY - offset.top;
-                 let target = sheet.hitTest(x, y);
+                let target = SheetDataHelper.safeRightClickSelection($triggerElement, e, me.workBook);
+                let sheet = me.workBook.getSheet(0);
                 if(target.hitTestType === 3){//在表格内&& typeof target.row !== 'undefined' && typeof target.col !== 'undefined'
-                    let insertDis = false, delDis = false, upDis = false, downDis = false;
+                    let insertDis = pageCCOprObj.isBillsType() ? false : true, delDis = false, upDis = false, downDis = false;
                     if(typeof target.row !== 'undefined'){
                         //控制按钮是否可用
                         sheet.setActiveCell(target.row, target.col);
@@ -214,11 +214,18 @@ let contentOprObj = {
                             upDis = true;
                         }
                         else{//有数据
-                            if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                            if(typeof target.col === 'undefined'){//定位不在表格内
                                 downDis = true;
-                            }
-                            if(target.row === 0){//定位在第一行,不可上移
                                 upDis = true;
+                                delDis = true;
+                            }
+                            else{//定位在表格内
+                                if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                                    downDis = true;
+                                }
+                                if(target.row === 0){//定位在第一行,不可上移
+                                    upDis = true;
+                                }
                             }
                         }
                     }
@@ -230,7 +237,7 @@ let contentOprObj = {
                     return {
                         callback: function(){},
                         items: {
-                            "insert": {name: "插入", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
+                            "insert": {name: "添加", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
                                 //插入空行
                                 me.addRow(sheet);
                             }},
@@ -283,6 +290,20 @@ let characterOprObj = {
         sheet.bind(EVENTS.ClipboardPasting, me.onClipboardPasting);
         sheet.bind(EVENTS.ClipboardPasted, me.onClipboardPasted);
     },
+    //将从清单库中添加的清单,把标准清单的项目特征转化成清单的项目特征
+    buildItemCharactet: function (items) {//从清单库过来的默认不输出
+        let itemCharacter = [];
+        for(let i = 0, len = items.length; i < len; i++){
+            let newItem = {serialNo: i + 1, character: items[i].content, eigenvalue: [], isChecked: false};
+            let eigenvalues = items[i].itemValue;
+            for(let j = 0, len = eigenvalues.length; j < len; j++){
+                let newValue = {value: eigenvalues[j].value, isSelected: false};
+                newItem.eigenvalue.push(newValue);
+            }
+            itemCharacter.push(newItem);
+        }
+        return itemCharacter;
+    },
     //显示在itemSpread的数据
     showCharacterData: function (sheet, setting, datas) {
         let me = characterOprObj;
@@ -414,6 +435,7 @@ let characterOprObj = {
         let me = characterOprObj;
         me.unsetSelected(item);
         me.setSelected(item, value);
+
     },
     insertValue: function (item, value) {
         let me = characterOprObj;
@@ -434,14 +456,16 @@ let characterOprObj = {
                     break;
                 }
             }
-            //不存在,新增进eigenvalue
+            //不存在,新增进eigenvalue,自动打勾输出
             if(!isExist){
                 //更新selected
                 me.insertValue(item, value);
+                item.isChecked = true;
             }
-            //存在,选择特征值
+            //存在,选择特征值,自动打勾输出
             else{
                 me.changeSelected(item, value);
+                item.isChecked = true;
             }
         }
     },
@@ -457,9 +481,9 @@ let characterOprObj = {
             let newCharacter = {character: '', eigenvalue: [newValue], isChecked: false, serialNo: preObj? preObj.serialNo + 1 : 1};
             me.currentCache.push(newCharacter);
         }
-        else if(character && value){
+        else if(character && value){//有了特征值自动打勾输出
             let newValue = {value: value, isSelected: true};
-            let newCharacter = {character:character , eigenvalue: [newValue], isChecked: false, serialNo: preObj? preObj.serialNo + 1 : 1};
+            let newCharacter = {character:character , eigenvalue: [newValue], isChecked: true, serialNo: preObj? preObj.serialNo + 1 : 1};
             me.currentCache.push(newCharacter);
         }
     },
@@ -539,7 +563,6 @@ let characterOprObj = {
         }
         let isChecked = args.sheet.getValue(args.row, args.col);
         if(me.currentCache.length > args.row){
-            me.refreshColData = true;
             me.currentCache[args.row].isChecked = isChecked;
             me.save();
         }
@@ -554,15 +577,10 @@ let characterOprObj = {
             selector: '#itemSpread',
             build: function($triggerElement, e){
                 //控制允许右键菜单在哪个位置出现
-                let clientX = e.originalEvent.clientX,
-                    clientY = e.originalEvent.clientY;
+                let target = SheetDataHelper.safeRightClickSelection($triggerElement, e, me.workBook);
                 let sheet = me.workBook.getSheet(0);
-                let offset = $("#itemSpread").offset(),
-                    x = clientX - offset.left,
-                    y = clientY - offset.top;
-                let target = sheet.hitTest(x, y);
                 if(target.hitTestType === 3){//在表格内 && typeof target.row !== 'undefined' && typeof target.col !== 'undefined'
-                    let insertDis = false, delDis = false, upDis = false, downDis = false;
+                    let insertDis = pageCCOprObj.isBillsType() ? false : true, delDis = false, upDis = false, downDis = false;
                     if(typeof target.row !== 'undefined'){
                         //控制按钮是否可用
                         sheet.setActiveCell(target.row, target.col);
@@ -572,11 +590,18 @@ let characterOprObj = {
                             upDis = true;
                         }
                         else{//有数据
-                            if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                            if(typeof target.col === 'undefined'){//定位在表格外
                                 downDis = true;
-                            }
-                            if(target.row === 0){//定位在第一行,不可上移
                                 upDis = true;
+                                delDis = true;
+                            }
+                            else{
+                                if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                                    downDis = true;
+                                }
+                                if(target.row === 0){//定位在第一行,不可上移
+                                    upDis = true;
+                                }
                             }
                         }
                     }
@@ -588,7 +613,7 @@ let characterOprObj = {
                     return {
                         callback: function(){},
                         items: {
-                            "insert": {name: "插入", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
+                            "insert": {name: "添加", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
                                 me.addRow(sheet);
                             }},
                             "delete": {name: "删除", disabled: delDis, icon: "fa-remove", callback: function (key, opt) {
@@ -614,6 +639,30 @@ let characterOprObj = {
 let pageCCOprObj = {
     currentFindSet: null,
     mainActiveCell: null,//mainSpread焦点单元格
+    //获得造价书当前焦点行的类型:清单、定额
+    isBillsType: function () {
+        let rst = false;
+        let selectedNode = projectObj.mainController.tree.selected;
+        if(selectedNode && selectedNode.sourceType === projectObj.project.Bills.getSourceType()){//为清单
+            rst = true
+        }
+        return rst;
+
+    },
+    setItemContentNode: function (node, jobs, items) {
+        let theCont = contentOprObj, theCha = characterOprObj,
+            jobContent, itemCharacter, contentTxt, characterTxt;
+        jobContent = theCont.buildJobContent(jobs);
+        itemCharacter = theCha.buildItemCharactet(items);
+        contentTxt = theCont.getColData(jobContent);
+        characterTxt = theCha.getColData(itemCharacter);
+        node.data.jobContent = jobContent;
+        node.data.itemCharacter = itemCharacter;
+        node.data.jobContentText = contentTxt ? contentTxt : '';
+        node.data.itemCharacterText = characterTxt ? characterTxt : '';
+
+
+    },
     //设置特征及内容currentCache
     setCacheAndShow: function (node) {
         let theCont = contentOprObj, theCha = characterOprObj;
@@ -665,6 +714,8 @@ let pageCCOprObj = {
     },
     clearData: function () {
         let theCon = contentOprObj, theCha = characterOprObj;
+        theCon.workBook.getSheet(0).setRowCount(0);
+        theCha.workBook.getSheet(0).setRowCount(0);
         sheetCommonObj.cleanSheet(theCon.workBook.getSheet(0), theCon.setting, -1);
         sheetCommonObj.cleanSheet(theCha.workBook.getSheet(0), theCha.setting, -1);
     },
@@ -691,6 +742,7 @@ let pageCCOprObj = {
                     me.showData(oprObj.workBook.getSheet(0), oprObj.setting, oprObj.currentCache);//刷新特征及内容Spread
                     if(updateCol){
                         projectObj.mainSpread.getActiveSheet().setValue(me.mainActiveCell.row, updateCol, txtObj.text + ''); //刷新输出显示
+                        projectObj.mainSpread.getActiveSheet().autoFitRow(me.mainActiveCell.row);
                     }
                 }
             }

+ 5 - 2
web/building_saas/main/js/views/std_bills_lib.js

@@ -63,7 +63,7 @@ var billsLibObj = {
         var getBillsJobs = function (node) {
             var jobs = [], i, jobData = null;
             if (stdBillsJobData && node && node.data.jobs) {
-                for (i = 0; i < node.data.jobs.length - 1; i++) {
+                for (i = 0; i < node.data.jobs.length; i++) {
                     jobData = findData(node.data.jobs[i], 'id', stdBillsJobData);
                     if (jobData) {
                         jobs.push(jobData);
@@ -75,7 +75,7 @@ var billsLibObj = {
         var getBillsFeatures = function (node) {
             var features = [], i, featureData = null;
             if (stdBillsFeatureData && node && node.data.items) {
-                for (i = 0; i < node.data.items.length - 1; i++) {
+                for (i = 0; i < node.data.items.length; i++) {
                     featureData = findData(node.data.items[i], 'id', stdBillsFeatureData);
                     if (featureData) {
                         features.push(featureData);
@@ -131,6 +131,8 @@ var billsLibObj = {
             stdBillsTreeController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, showBillsRela);
             that.stdBillsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, function (sender, args) {
                 if (stdBillsTree.items[args.row].children.length === 0) {
+                    //特征及内容转化
+                    pageCCOprObj.setItemContentNode(stdBillsTree.items[args.row], getBillsJobs(stdBillsTree.items[args.row]), getBillsFeatures(stdBillsTree.items[args.row]));
                     ProjectController.addBills(projectObj.project, projectObj.mainController, stdBillsTree.items[args.row]);
                 }
             });
@@ -304,6 +306,7 @@ var billsLibObj = {
 };
 
 $('#stdBillsTab').bind('click', function () {
+    refreshSubSpread();//subSpread、jobSpread、itemSpread显示问题
     $(".main-data-side-q").height($(window).height() - $(".header").height() - $(".toolsbar").height() -  $(".tools-bar-height-q").height() - 202);
     var select = $('#stdBillsLibSelect');
     billsLibObj.refreshBillsSpread();

+ 1 - 0
web/building_saas/main/js/views/std_ration_lib.js

@@ -188,6 +188,7 @@ var rationLibObj = {
     }
 };
 $('#stdRationTab').bind('click', function () {
+    refreshSubSpread();//subSpread、jobSpread、itemSpread显示问题
     var select = $('#stdRationLibSelect');
     $(".main-data-side-d").height($(window).height() - $(".header").height() - $(".toolsbar").height() -  $(".tools-bar-height-d").height() - 202);
     rationLibObj.refreshSpread();

+ 23 - 8
web/building_saas/main/js/views/sub_view.js

@@ -8,11 +8,9 @@ contentOprObj.buildSheet($("#jobSpread")[0]);
 characterOprObj.buildSheet($("#itemSpread")[0]);
 $("#tzjnrCon").hide();
 $("#subSpread").show();
-
 var subSpread = sheetCommonObj.createSpread($("#subSpread")[0], 7);
 subSpread.getSheet(4).name('JSCX');
 
-
 pageCCOprObj.active = false;
 
 // 工料机
@@ -38,6 +36,7 @@ $("#linkGLJ").click(function(){
     $("#tzjnrCon").hide();//控制显示subSpread,隐藏特征及内容spread
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(0);
     $.contextMenu( 'destroy', "#subSpread" );
     gljContextMenu.loadGLJSpreadContextMenu();
@@ -49,16 +48,17 @@ $("#linkFZDE").click(function(){
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(1);
     $.contextMenu( 'destroy', "#subSpread" );
     // for test
   //  subSpread.getActiveSheet().setValue(0, 0, "辅助定额");
 });
-
 $("#linkFZTJ").click(function(){
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(2);
     $.contextMenu( 'destroy', "#subSpread" );
     // for test
@@ -69,6 +69,7 @@ $("#linkGCLMX").click(function(){
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(3);
     $.contextMenu( 'destroy', "#subSpread" );
     gljContextMenu.loadQuantityDetailMenu();
@@ -80,6 +81,7 @@ $("#linkJSCX").click(function(){        // 计算程序
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(4);
     calcProgramObj.initSheet(subSpread.getSheet(4));
     let sel = projectObj.mainController.tree.selected;
@@ -95,6 +97,7 @@ $("#linkFXSM").click(function(){
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(5);
     // for test
     subSpread.getActiveSheet().setValue(0, 0, "分项说明");
@@ -104,6 +107,7 @@ $("#linkDESM").click(function(){
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(6);
     // for test
     subSpread.getActiveSheet().setValue(0, 0, "定额说明");
@@ -114,16 +118,27 @@ $("#linkTZJNR").click(function () {
     $("#subSpread").hide();
     $("#tzjnrCon").show();
     pageCCOprObj.active = true;
+    refreshSubSpread();
     let selectedNode = projectObj.mainController.tree.selected;
     pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
-   // if(selectedNode && selectedNode.sourceType === projectObj.project.Bills.getSourceType()){
+    if(selectedNode && selectedNode.sourceType === projectObj.project.Bills.getSourceType()){
         pageCCOprObj.setCacheAndShow(selectedNode);
-   // }
-    //else{
-       // pageCCOprObj.clearData();
-    //}
+    }
+    else{
+        pageCCOprObj.clearData();
+    }
 });
 function SubActiveSheetNameIs(sheetName){
     let rst = subSpread.getActiveSheet().name() == sheetName;
     return rst;
+}
+//弹出清单规则或定额库后导致subSpread和特征及内容spread显示出问题
+function refreshSubSpread(){
+    if(pageCCOprObj.active){
+        contentOprObj.workBook.refresh();
+        characterOprObj.workBook.refresh();
+    }
+    else{
+        subSpread.refresh();
+    }
 }