Przeglądaj źródła

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/YangHuCost

# Conflicts:
#	web/building_saas/complementary_glj_lib/html/tools-gongliaoji.html
zhongzewei 6 lat temu
rodzic
commit
5bccad1057

+ 13 - 2
modules/reports/rpt_component/helper/jpc_helper_cross_tab.js

@@ -1,4 +1,5 @@
 let JV = require('../jpc_value_define');
+let JE = require('../jpc_rte');
 let JpcCommonHelper = require('./jpc_helper_common');
 
 let JpcCrossTabHelper = {
@@ -72,7 +73,7 @@ let JpcCrossTabHelper = {
         }
         return rst;
     },
-    sortTabFields: function(tabFields, fieldSeqs, data_details, dataSeq) {
+    sortTabFields: function(tabFields, fieldSeqs, data_details, dataSeq, $CURRENT_RPT) {
         let me = this;
         let sIDX = 0, eIDX = -1, isFirstSort = true;
         for (let i = 0; i < tabFields.length; i++) {
@@ -92,7 +93,17 @@ let JpcCrossTabHelper = {
                     for (let j = 0; j < dataSeq.length; j++) {
                         let chkFields = [];
                         for (let k = 0; k < i; k++) {
-                            chkFields.push(data_details[fieldSeqs[k]]);
+                            if (typeof(fieldSeqs[k]) === "object") {
+                                let exField = JE.F(fieldSeqs[k][JV.PROP_ID], $CURRENT_RPT);
+                                if (exField) {
+                                    chkFields.push(exField["data_field"]);
+                                } else {
+                                    chkFields.push(null);
+                                }
+                            } else {
+                                chkFields.push(data_details[fieldSeqs[k]]);
+                            }
+                            // chkFields.push(data_details[fieldSeqs[k]]);
                         }
                         sIDX = 0, eIDX = -1;
                         for (let m = 1; m < dataSeq[j].length; m++) {

+ 117 - 57
modules/reports/rpt_component/jpc_cross_tab.js

@@ -102,7 +102,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
             }
         }
     }
-    function private_SortAndOptimize(rptTpl, dataObj, dataSeq, sortTab, rstFieldsIdx) {
+    function private_SortAndOptimize(rptTpl, dataObj, dataSeq, sortTab, rstFieldsIdx, $CURRENT_RPT) {
         let result = [];
         let tab = rptTpl[JV.NODE_CROSS_INFO][sortTab];
         if (tab) {
@@ -111,7 +111,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
             let fields = [];
             JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab[JV.PROP_CROSS_FIELDS], fields, rstFieldsIdx);
             let data_details = dataObj[JV.DATA_DETAIL_DATA];
-            JpcCrossTabHelper.sortTabFields(fields, rstFieldsIdx, data_details, dataSeq);
+            JpcCrossTabHelper.sortTabFields(fields, rstFieldsIdx, data_details, dataSeq, $CURRENT_RPT);
             //2. distinguish sort tab fields value
             let b1 = false;
             for (let i = 0; i < dataSeq.length; i++) {
@@ -195,11 +195,11 @@ JpcCrossTabSrv.prototype.createNew = function(){
         me.pageStatusLst = [];
         me.paging_option = JV.PAGING_OPTION_NORMAL;
     };
-    JpcCrossTabResult.sorting = function(rptTpl, dataObj, dataSeq) {
+    JpcCrossTabResult.sorting = function(rptTpl, dataObj, dataSeq, $CURRENT_RPT) {
         let me = this;
         //IMPORTANT: the data should be sorted in SQL/NoSQL level!
-        me.sortedRowSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW, me.row_fields_idx);
-        me.sortedColSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_COL, me.col_fields_idx);
+        me.sortedRowSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW, me.row_fields_idx, $CURRENT_RPT);
+        me.sortedColSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_COL, me.col_fields_idx, $CURRENT_RPT);
         me.sortedContentSequence = private_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);
         //pre-sum the data(for col sum display)
@@ -244,25 +244,25 @@ JpcCrossTabSrv.prototype.createNew = function(){
         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);
         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;
-            pageStatus[JV.STATUS_CROSS_COL_END] = true;
-            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);
-            }
-            //*/
+             rst = segCnt;
+             pageStatus[JV.STATUS_SEGMENT_START] = true;
+             pageStatus[JV.STATUS_SEGMENT_END] = true;
+             pageStatus[JV.STATUS_CROSS_ROW_END] = true;
+             pageStatus[JV.STATUS_CROSS_COL_END] = true;
+             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
@@ -321,12 +321,78 @@ JpcCrossTabSrv.prototype.createNew = function(){
         bands = null;
         return rst;
     };
-    JpcCrossTabResult.outputAsPreviewPage = function (rptTpl, bands, controls, $CURRENT_RPT) {
+    JpcCrossTabResult.outputAsPreviewPage = function (rptTpl, bands, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [];
         let pageStatus = [true, true, true, true, true, true, true, true];
         me.pageStatusLst.push(pageStatus);
         // JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, false);
         JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, true, false);
+        let maxRowRec = JpcCrossTabHelper.getMaxRowsPerPage(bands, rptTpl);
+        let maxColRec = JpcCrossTabHelper.getMaxColsPerPage(bands, rptTpl);
+        let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
+        //1. 交叉行
+        rst = rst.concat(me.outputPreviewRowTab(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, unitFactor));
+        //2. 交叉列
+        rst = rst.concat(me.outputPreviewColTab(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxColRec, unitFactor));
+        //3. 交叉数据
+        rst = rst.concat(me.outputPreviewContent(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, maxColRec, unitFactor));
+        //4. 交叉行拓展
+        rst = rst.concat(me.outputPreviewTabExt(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, unitFactor));
+        //5. 交叉行拓展合计
+        rst = rst.concat(me.outputPreviewSumTabExt(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, unitFactor));
+        //6. 交叉列合计
+        rst = rst.concat(me.outputPreviewTabSum(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, JV.NODE_CROSS_COL_SUM, unitFactor));
+        //7. 离散
+        rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
+        return rst;
+    };
+    JpcCrossTabResult.outputPreviewRowTab = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, unitFactor) {
+        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW], unitFactor);
+    };
+    JpcCrossTabResult.outputPreviewColTab = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxColRec, unitFactor) {
+        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, 1, maxColRec, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL], unitFactor);
+    };
+    JpcCrossTabResult.outputPreviewContent = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, maxColRec, unitFactor) {
+        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, maxColRec, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT], unitFactor);
+    };
+    JpcCrossTabResult.outputPreviewTabSum = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, tabNodeName, unitFactor) {
+        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl[JV.NODE_CROSS_INFO][tabNodeName], unitFactor);
+    };
+    JpcCrossTabResult.outputPreviewTabExt = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, unitFactor) {
+        //交叉行拓展
+        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT], unitFactor);
+    };
+    JpcCrossTabResult.outputPreviewSumTabExt = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, unitFactor) {
+        //交叉行拓展合计
+        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT], unitFactor);
+    };
+    JpcCrossTabResult.private_OutputPreviewCommon = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, maxColRec, tab, unitFactor) {
+        let me = this, rst = [];
+        let band = bands[tab[JV.PROP_BAND_NAME]];
+        if (band) {
+            let tab_fields = tab[JV.PROP_CROSS_FIELDS];
+            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])) {
+                        for (let colIdx = 0; colIdx < maxColRec; colIdx++) {
+                            if (tab_field[JV.PROP_IS_SERIAL]) {
+                                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));
+                            }
+                        }
+                    }
+                }
+                if (tab[JV.PROP_TEXTS]) {
+                    for (let j = 0; j < tab[JV.PROP_TEXTS].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));
+                        }
+                    }
+                }
+            }
+        }
         return rst;
     };
     JpcCrossTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, $CURRENT_RPT, customizeCfg) {
@@ -334,33 +400,33 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         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);
+             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, customizeCfg));
-            //*/
+             //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, customizeCfg));
+             //*/
         } else {
             let segIdx = JpcCommonHelper.getSegIdxByPageIdx(page, me.page_seg_map);
             //1 calculate the band position
@@ -387,12 +453,6 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcCrossTabResult.outputPreviewRowTab = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg) {
-        //
-    };
-    JpcCrossTabResult.outputPreviewColTab = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg) {
-        //
-    };
     JpcCrossTabResult.outputRowTab = function(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW];

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

@@ -175,19 +175,19 @@ JpcExSrv.prototype.createNew = function(){
         if (me.flowTab) {
             me.flowTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
             if (me.flowTabEx) {
-                me.flowTabEx.sorting(rptTpl, dataObj, dataHelper.exDataSeq.slice(0));
+                me.flowTabEx.sorting(rptTpl, dataObj, dataHelper.exDataSeq.slice(0), me);
             }
         }
         if (me.billTab) {
             me.billTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
         }
-        if (me.crossTab) {
-            me.crossTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
-        }
         //let dt2 = new Date();
         //alert(dt2 - dt1);
         //3. formulas
         me.executeFormulas(JV.RUN_TYPE_BEFORE_PAGING, rptTpl, dataObj, me);
+        if (me.crossTab) {
+            me.crossTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
+        }
         //4. paging
         me.paging(rptTpl, dataObj, defProperties, dftPagingOption, outputType);
         //alert('analyzeData was completed!');

+ 93 - 30
modules/reports/util/rpt_yanghu_data_util.js

@@ -1238,6 +1238,10 @@ function setupFunc(obj, prop, ownRawObj) {
     obj[prop].getSubRateProperty = ext_getRateProperty;
     obj[prop].getRateProperty = ext_getRateProperty;
     obj[prop].getBlank = ext_getBlank;
+    obj[prop].getRatioDataProperty = ext_getRatioDataProperty;
+    obj[prop].getRatioDataParentProperty = ext_getRatioDataParentProperty;
+    obj[prop].getRatioDataPriceMapProperty = ext_getRatioDataPriceMapProperty;
+
     if (prop === projectConst.CALC_PROGRAM) obj[prop].getCalcProperty = ext_getCalcProperty;
     if (prop === projectConst.FEERATE) obj[prop].getFeeRate = ext_getFeeRate;
 }
@@ -1344,46 +1348,105 @@ function ext_getRateProperty(propKey) {
     return rst;
 }
 
-function ext_getPropety(propKey) {
+function ext_getRatioDataProperty(propKey) {
+    //获取工料机的组成物属性
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
     if (propKey && dtObj) {
         for (let dItem of getActDataArr(dtObj)) {
             let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
-            if (propKey instanceof Array) {
-                //备注:这里的key数组表示取value的优先级
-                for (let pi = 0; pi < propKey.length; pi++) {
-                    if (doc.hasOwnProperty("property")) {
-                        if (doc["property"].hasOwnProperty(propKey[pi])) {
-                            rst.push(doc["property"][propKey[pi]]);
-                            break;
-                        }
-                    } else if (doc.hasOwnProperty(propKey[pi])) {
-                        rst.push(doc[propKey[pi]]);
+            for (let ratioItem of doc.ratio_data) {
+                rst.push(ratioItem[propKey]);
+            }
+        }
+    }
+    return rst;
+}
+
+function pri_push_property(propKey, doc, rst) {
+    if (propKey instanceof Array) {
+        //备注:这里的key数组表示取value的优先级
+        for (let pi = 0; pi < propKey.length; pi++) {
+            if (doc.hasOwnProperty("property")) {
+                if (doc["property"].hasOwnProperty(propKey[pi])) {
+                    rst.push(doc["property"][propKey[pi]]);
+                    break;
+                }
+            } else if (doc.hasOwnProperty(propKey[pi])) {
+                rst.push(doc[propKey[pi]]);
+                break;
+            } else {
+                let lenBefore = rst.length;
+                getDeepProperty(propKey[pi], doc, rst);
+                if (rst.length === (lenBefore + 1)) {
+                    if (rst[lenBefore] !== null && rst[lenBefore] !== undefined && rst[lenBefore] !== "") {
                         break;
                     } else {
-                        let lenBefore = rst.length;
-                        getDeepProperty(propKey[pi], doc, rst);
-                        if (rst.length === (lenBefore + 1)) {
-                            if (rst[lenBefore] !== null && rst[lenBefore] !== undefined && rst[lenBefore] !== "") {
-                                break;
-                            } else {
-                                rst.splice(-1, 1); //删除末尾一条数据,给后面留空间
-                            }
-                        }
+                        rst.splice(-1, 1); //删除末尾一条数据,给后面留空间
                     }
-                    if (pi === propKey.length - 1) rst.push('');
-                }
-            } else {
-                if (doc.hasOwnProperty("property") && doc["property"].hasOwnProperty(propKey)) {
-                    rst.push(doc["property"][propKey]);
-                } else if (doc.hasOwnProperty(propKey)) {
-                    rst.push(doc[propKey]);
-                } else {
-                    // rst.push('');
-                    getDeepProperty(propKey, doc, rst);
                 }
             }
+            if (pi === propKey.length - 1) rst.push('');
+        }
+    } else {
+        if (doc.hasOwnProperty("property") && doc["property"].hasOwnProperty(propKey)) {
+            rst.push(doc["property"][propKey]);
+        } else if (doc.hasOwnProperty(propKey)) {
+            rst.push(doc[propKey]);
+        } else {
+            getDeepProperty(propKey, doc, rst);
+        }
+    }
+}
+
+function ext_getRatioDataParentProperty(propKey) {
+    //获取组成物的父项属性
+    let rst = [], parentObj = this;
+    let dtObj = parentObj["myOwnRawDataObj"];
+    if (propKey && dtObj) {
+        for (let dItem of getActDataArr(dtObj)) {
+            let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
+            for (let ratioItem of doc.ratio_data) {
+                pri_push_property(propKey, doc, rst);
+            }
+        }
+    }
+    return rst;
+}
+
+function ext_getRatioDataPriceMapProperty(propKey) {
+    //获取组成物的单价映射属性
+    let rst = [], parentObj = this;
+    let dtObj = parentObj["myOwnRawDataObj"];
+    if (propKey && dtObj) {
+        let unitPriceMap = dtObj.data.unitPriceMap;
+        let upmDoc = (unitPriceMap._doc === null || unitPriceMap._doc === undefined)?unitPriceMap:unitPriceMap._doc;
+        for (let dItem of getActDataArr(dtObj)) {
+            let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
+            for (let ratioItem of doc.ratio_data) {
+                let connectionKeys = [];
+                connectionKeys.push(ratioItem.code);
+                connectionKeys.push(ratioItem.name);
+                connectionKeys.push((ratioItem.specs === "")?"null":ratioItem.specs);
+                connectionKeys.push(ratioItem.unit);
+                connectionKeys.push(ratioItem.type);
+                connectionKeys.join("|-|");
+                let strPK = connectionKeys.join("|-|");
+                let dtlDoc = (upmDoc[strPK]._doc)?upmDoc[strPK]._doc:upmDoc[strPK];
+                rst.push(dtlDoc[propKey]);
+            }
+        }
+    }
+    return rst;
+}
+
+function ext_getPropety(propKey) {
+    let rst = [], parentObj = this;
+    let dtObj = parentObj["myOwnRawDataObj"];
+    if (propKey && dtObj) {
+        for (let dItem of getActDataArr(dtObj)) {
+            let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
+            pri_push_property(propKey, doc, rst);
         }
     }
     return rst;

+ 7 - 3
test/unit/reports/test_rpt_test_template.js

@@ -30,11 +30,14 @@ let demoPrjId = - 1;
 // let demoRptId = 6; //封面
 // let demoRptId = 22; //03
 // let demoRptId = 26; //07
-let demoRptId = 28; //09
+// let demoRptId = 28; //09
+// let demoRptId = 27; //08
 // let demoRptId = 24; //05
 // let demoRptId = 20; //01
 // let demoRptId = 23; //04 综合费率表
 
+let demoRptId = 56; //24
+
 let pagesize = "A4";
 //288: 11-2表(新)
 //279: 04
@@ -47,7 +50,8 @@ let userId_Leng = "5c3ffa9aa0a92732f41216e0"; //小冷User Id (养护的)
 // demoPrjId = 2260; //QA:
 // demoPrjId = 410; //QA:
 // demoPrjId = 313; //PROD:
-demoPrjId = 435; //PROD:
+demoPrjId = 455; //PROD:
+// demoPrjId = 618; //PROD:
 // demoPrjId = 4107; //UAT:
 //*/
 let userId_Dft = userId_Leng;
@@ -75,7 +79,7 @@ test('测试 - 测试模板啦: ', function (t) {
         rptDataUtil.initialize(rptTpl._doc);
         let filter = rptDataUtil.getDataRequestFilter();
         // filter.push('ration');  //临时用
-        filter.push('feeRate'); //临时用2
+        filter.push('ration_coe'); //临时用2
         // filter.push('projectGLJ'); //临时用3
         console.log(filter);
         //正常应该根据报表模板定义的数据类型来请求数据

+ 1 - 2
web/building_saas/complementary_glj_lib/html/tools-gongliaoji.html

@@ -5,8 +5,7 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>人材机库编辑-纵横公路养护造价</title>
-    <!--inject:css-->
+    <title>人材机库编辑-纵横公路养护造价</title>    <!--inject:css-->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css" type="text/css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css" type="text/css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css" type="text/css">

+ 2 - 2
web/building_saas/complementary_ration_lib/html/dinge.html

@@ -133,7 +133,7 @@
                                 <!-- 标签 -->
                                 <ul class="nav nav-tabs" role="tablist">
                                     <li class="nav-item">
-                                        <a class="nav-link active" id="linkGLJ" data-toggle="tab" href="#rDetail" role="tab">人材机</a>
+                                        <a class="nav-link active" id="linkGLJ" data-toggle="tab" href="#rDetail" role="tab">工料机</a>
                                     </li>
                                     <li class="nav-item">
                                         <a class="nav-link" id="linkFZDE" data-toggle="tab" href="#rDetail" role="tab">辅助定额调整</a>
@@ -511,7 +511,7 @@
     <div class="modal-dialog modal-lg" role="document" id="modalCon">
         <div class="modal-content" >
             <div class="modal-header">
-                <h5 class="modal-title">选择人材机</h5>
+                <h5 class="modal-title">选择工料机</h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                 </button>

+ 2 - 2
web/building_saas/complementary_ration_lib/html/gongliao.html

@@ -74,7 +74,7 @@
         <div class="modal-dialog" role="document">
             <div class="modal-content">
                 <div class="modal-header">
-                  <h5 class="modal-title">添加人材机</h5>
+                  <h5 class="modal-title">添加工料机</h5>
                   <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">×</span>
                   </button>
@@ -120,7 +120,7 @@
         <div class="modal-dialog" role="document">
             <div class="modal-content">
                 <div class="modal-header">
-                  <h5 class="modal-title">编辑人材机</h5>
+                  <h5 class="modal-title">编辑工料机</h5>
                   <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">×</span>
                   </button>

+ 2 - 2
web/building_saas/complementary_ration_lib/js/ration_glj.js

@@ -132,7 +132,7 @@ var rationGLJOprObj = {
                     return {
                         callback: function(){},
                         items: {
-                            "add": {name: "添加人材机", disabled: addDis, icon: "fa-plus", callback: function (key, opt) {
+                            "add": {name: "添加工料机", disabled: addDis, icon: "fa-plus", callback: function (key, opt) {
                                 //默认radio所有工料机
                                 gljSelOprObj.initRadio();
                                 gljSelOprObj.gljCurTypeId = null;
@@ -140,7 +140,7 @@ var rationGLJOprObj = {
                                 //弹出窗口
                                 $('#selGlj').modal('show');
                             }},
-                            "delete": {name: "删除人材机", disabled: delDis, icon: "fa-remove", callback: function (key, opt) {
+                            "delete": {name: "删除工料机", disabled: delDis, icon: "fa-remove", callback: function (key, opt) {
                                 rationGlj.splice(target.row, 1);
                                 me.updateRationItem(function(){
                                     me.sheet.getParent().focus();

+ 2 - 2
web/building_saas/glj/html/project_glj.html

@@ -8,12 +8,12 @@
         <label class="mx-2">使用单价文件:<span id="current-name"></span>(<label class="a_color" id="pop-used-list" data-original-title="" title="">与<span id="used-project-count">0</span>个单位工程同步</label>)
             <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#change-unitFile"><i class="fa fa-exchange"></i> 选择其他</a>
             <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#unitFile-save-as"><i class="fa fa-files-o"></i> 另存单独用</a></label>
-        <div class="input-group input-group-sm mr-2">
+        <!--<div class="input-group input-group-sm mr-2">
             <select class="form-control form-control-sm">
                 <option>车船税标准</option>
                 <option>福建车船税标准(2012)</option>
             </select>
-        </div>
+        </div>-->
     </div>
 
 </div>

+ 1 - 1
web/building_saas/glj/js/project_glj_spread.js

@@ -154,7 +154,7 @@ ProjectGLJSpread.prototype.init = function () {
         // 如果类型为混凝土、砂浆、配合比、机械,则提示
         if (field === 'unit_price.market_price' && canNotChangeTypeId.indexOf(type) >= 0) {
             if(ratioData&&ratioData.length>0){
-                alert('当前人材机的市场单价由组成物计算得出,不可直接修改');
+                alert('当前工料机的市场单价由组成物计算得出,不可直接修改');
             }
         }
     });

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

@@ -634,7 +634,7 @@
                                 <!--<li class="nav-item"><a class="nav-link active" data-toggle="pill" href="#poj-settings-basicInfo" role="tab" id="tab_poj-settings-basicInfo">建设项目基本信息</a></li>-->
                                 <li class="nav-item"><a class="nav-link active" data-toggle="pill" href="#poj-settings-projFeature" id="tab_poj-settings-projFeature" role="tab">工程特征</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-indicativeInfo" id="tab_poj-settings-indicativeInfo" role="tab">指标信息</a></li>
-                               <!-- <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-4" id="about-calc" role="tab">关于计算</a></li>-->
+                                <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-4" id="about-calc" role="tab">关于计算</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-billsQuanDecimal" id="tab_poj-settings-bqDecimal" role="tab">清单工程量精度</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-decimal" role="tab" id="tab_poj-settings-decimal">小数位数</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-6" role="tab" id="tab_poj-settings-6">人工单价调整</a></li>
@@ -662,9 +662,9 @@
                                 <!--关于计算-->
                                 <div class="tab-pane fade" id="poj-settings-4" role="tabpanel">
                                     <div class="modal-auto-height">
-                                        <fieldset class="form-group">
+                                        <fieldset class="form-group" style="display:none">
                                             <h5>取费方式</h5>
-                                            <div class="form-check" style="display:none">
+                                            <div class="form-check">
                                                 <label class="form-check-label">
                                                     <input class="form-check-input" name="calcFlag" id="rationContent" value="0" type="radio">
                                                     子目含量取费
@@ -677,12 +677,12 @@
                                                 </label>
                                             </div>
                                             <div class="form-check">
-                                                <label class="form-check-label">
+                                                <label class="form-check-label" >
                                                     <input class="form-check-input" name="calcFlag" id="rationPrice" value="2" type="radio">
                                                     子目单价取费(正算):清单综合合价=∑子目综合合价
                                                 </label>
                                             </div>
-                                            <div class="form-check" style="display:none">
+                                            <div class="form-check">
                                                 <label class="form-check-label">
                                                     <input class="form-check-input" name="calcFlag" id="billsPrice" value="3" type="radio">
                                                     清单单价取费
@@ -993,7 +993,7 @@
         <div class="modal-dialog modal-lg" role="document" id="modalCon">
             <div class="modal-content" style="width: 1020px; left:50%; transform: translate(-50%,0%);">
                 <div class="modal-header">
-                    <h5 class="modal-title">请选择人材机</h5>
+                    <h5 class="modal-title">请选择工料机</h5>
                     <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                         <span aria-hidden="true">&times;</span>
                     </button>

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

@@ -9,12 +9,12 @@
         </div>
         <div class="input-group input-group-sm mr-2" style="width:240px">
             <div class="input-group-prepend">
-                <span class="input-group-text" id="inputGroup-sizing-sm">人材机单价调整系数</span>
+                <span class="input-group-text" id="inputGroup-sizing-sm">工料机单价调整系数</span>
             </div>
             <input id = 'gljPriceTenderCoe' type="number" step="0.1" class="form-control" placeholder="请输入系数" value="1">
         </div>
         <div class="btn-group mr-2">
-            <button type="button" class="btn btn-outline-primary btn-sm" id = "tenderGLJQuantity">调整人材机消耗</button>
+            <button type="button" class="btn btn-outline-primary btn-sm" id = "tenderGLJQuantity">调整工料机消耗</button>
             <button type="button" class="btn btn-outline-primary btn-sm" id = "tenderRationQuantity">调整子目工程量</button>
            <!-- <button type="button" class="btn btn-outline-primary btn-sm">反调单价</button>-->
             <button type="button" class="btn btn-outline-primary btn-sm" id = "tenderPrice">调价计算</button>

+ 5 - 1
web/building_saas/main/js/main.js

@@ -6,8 +6,12 @@ $(function () {
 
     $("#header-menu").removeAttr('style');
 
-    if (projectInfoObj.projectInfo.property.valuationType == 'bill')
+    if (projectInfoObj.projectInfo.property.valuationType == 'bill'){
         $("#tab_tender_price").css('display', 'none');
+    }
+    else{
+        $("#about-calc").css('display', 'none');
+    };
 
     $('#tab_baobiao').on('shown.bs.tab', function (e) {
         $(e.relatedTarget.hash).removeClass('active');

+ 1 - 0
web/building_saas/main/js/models/calc_program.js

@@ -1733,6 +1733,7 @@ class CalcProgram {
             if (treeNode.data.feesIndex && treeNode.data.feesIndex.common){
                 let uf, tf;
                 let ftObj = {fieldName: 'common'};
+                if (!treeNode.modifyFlag) return;    // 没有改过单价、数量、金额,则不计算,保留上次的计算结果。
 
                 if (treeNode.modifyFlag == 2){    // 修改了清单单价:以单价为准,算金额
                     uf = parseFloatPlus(treeNode.data.feesIndex.common.unitFee);

+ 2 - 2
web/building_saas/main/js/views/fee_rate_view.js

@@ -554,7 +554,7 @@ var feeRateObject={
             subRateObject.initSubRateSpread(me.mainFeeRateData[row]);
         }
     },
-    setRateFromSub:function (subRate,value,subList) {
+    setRateFromSub:function (subRate,value,subList,editText) {//editText  下拉框选择的值,对于如“19.00”这样下拉选择项,value会变成19,所以在valueMap里找的时候要用editText去查找
          let me = feeRateObject,feeRate =  projectObj.project.FeeRate;
          let rates = feeRate.getActivateFeeRate().rates;
          let updateDatas = [];
@@ -575,7 +575,7 @@ var feeRateObject={
                          if(match == true) {//匹配上了,改对应的selected 为 true
                              if(o.name == value){
                                  o.selected = true;
-                                 valueArray.push(value);
+                                 valueArray.push(editText);//这里要用字符串去匹配而不是转换成数值的value
                                  setValue = true;
                              }else {
                                  o.selected = false;

+ 1 - 1
web/building_saas/main/js/views/main_tree_col.js

@@ -222,7 +222,7 @@ let MainTreeCol = {
             if(node.sourceType === projectObj.project.Bills.getSourceType()){
                 //如果是预算项目的,所有清单的数量1、数量2不做输入限制。
                 if(projectInfoObj.projectInfo.property && projectInfoObj.projectInfo.property.valuationType == "bill")  return false;
-                if(node.data.type==billType.FB||(node.data.type==billType.BILL&&MainTreeCol.readOnly.billsParent(node))){//大项费用、分部、清单父项行,工程量只读。
+                if(node.data.type==billType.DXFY||(node.data.type==billType.BILL&&MainTreeCol.readOnly.billsParent(node))){//大项费用、清单父项行,工程量只读。
                     return true;
                 }
             }else if(MainTreeCol.readOnly.glj(node)){

+ 3 - 3
web/building_saas/main/js/views/project_view.js

@@ -486,7 +486,7 @@ var projectObj = {
                         return
                     };
 
-                    if (value) {
+                    // if (value) {
                         if(fieldName === 'feesIndex.common.unitFee') {
                             value = parseFloat(value).toDecimal(decimalObj.decimal("unitPrice", node));
 
@@ -502,7 +502,7 @@ var projectObj = {
                             value = scMathUtil.roundForObj(value, getDecimal("totalPrice", node));
                             node.modifyFlag = 3;
                         }
-                    }
+                    // }
                 }
                 else if (fieldName === 'calcBase') {
                     //zhong
@@ -1356,7 +1356,7 @@ var projectObj = {
                     callback: function (key, opt) {
                         let selected = project.mainTree.selected;
                         if(selected.data.calcBase&&selected.data.calcBase!=""){
-                            alert("当前有基数计算,不能插入定额/量价/人材机。");
+                            alert("当前有基数计算,不能插入定额/量价/工料机。");
                             return;
                         }
                         getGLJData('insertEquipment');// ProjectController.addRation(project, controller, rationType.volumePrice);

+ 1 - 1
web/building_saas/main/js/views/sub_fee_rate_views.js

@@ -152,7 +152,7 @@ var subRateObject={
                 t.value = value
             }
         }
-        feeRateObject.setRateFromSub(subRate,value,subList);
+        feeRateObject.setRateFromSub(subRate,value,subList,info.newValue);
     },
 
     destorySpreadView:function () {

Plik diff jest za duży
+ 1 - 1
web/users/html/login.html