Bladeren bron

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

zhongzewei 7 jaren geleden
bovenliggende
commit
1290201a8a

+ 0 - 49
modules/reports/util/pdf_base_files/rpt_pdf_consts.js

@@ -1,49 +0,0 @@
-/**
- * Created by zhang on 2017/8/14.
- */
-module.exports={
-    JV:{
-        NODE_MAIN_INFO: "主信息",
-        NODE_PAGE_INFO: "打印页面_信息",
-        NODE_MARGINS: "页边距",
-
-        NODE_FONT_COLLECTION: "font_collection",
-        NODE_STYLE_COLLECTION: "style_collection",
-        NODE_CONTROL_COLLECTION: "control_collection",
-
-        BAND_PROP_MERGE_BAND: "MergeBand",
-
-        PROP_NAME: "Name",
-        PROP_VALUE: "Value",
-        PROP_FONT: "font",
-        PROP_CONTROL: "control",
-        PROP_STYLE: "style",
-        PROP_AREA: "area",
-        PROP_ID: "ID",
-        PROP_LEFT: "Left",
-        PROP_RIGHT: "Right",
-        PROP_TOP: "Top",
-        PROP_BOTTOM: "Bottom",
-
-        IDX_LEFT: 0,
-        IDX_TOP: 1,
-        IDX_RIGHT: 2,
-        IDX_BOTTOM: 3,
-
-        CONTROL_PROPS: ["Shrink", "ShowZero", "Horizon", "Vertical", "Wrap"],
-        BORDER_STYLE_PROPS: ["LineWeight", "DashStyle", "Color"],
-        PROP_LINE_WEIGHT: "LineWeight",
-        PROP_DASH_STYLE: "DashStyle",
-        PROP_COLOR: "Color",
-        FONT_PROPS: ["Name", "FontHeight", "FontColor", "FontBold", "FontItalic", "FontUnderline", "FontStrikeOut", "FontAngle"],
-
-        OUTPUT_OFFSET: [2,1,2,3],
-        OFFSET_IDX_LEFT: 0,
-        OFFSET_IDX_RIGHT: 1,
-        OFFSET_IDX_TOP: 2,
-        OFFSET_IDX_BOTTOM: 3,
-
-        VERTICAL_ANGLE: "90",
-        ANTI_VERTICAL_ANGLE: "-90"
-    }
-}

+ 5 - 2
modules/reports/util/rpt_pdf_util.js

@@ -5,14 +5,17 @@
  * Created by zhang on 2017/8/14.
  */
 
-const prf_cons = require('./pdf_base_files/rpt_pdf_consts');
 let pdf = require('pdfkit');
 let fs = require('fs');
 let jpcCmnHelper = require('../rpt_component/helper/jpc_helper_common');
 let DPI = jpcCmnHelper.getScreenDPI()[0];
-//let JV = prf_cons.JV;
 let JV = require('../rpt_component/jpc_value_define');
 
+// hwxsb.ttf: 华文中宋
+// Smart.ttf: 宋体(常规)
+// Smart-italic.ttf: 宋体(斜体)
+//目前不支持下划线
+
 module.exports ={
     export_pdf_file:export_pdf_file
 }

+ 7 - 5
web/building_saas/main/js/models/calc_program.js

@@ -112,6 +112,9 @@ let calcTools = {
             treeNode.source.children &&
             treeNode.source.children.length === 0;
     },
+    isbigBill: function(treeNode){
+        return this.isBill(treeNode) && treeNode.data.type == 1;
+    },
     isNullBill: function (treeNode) {
         return this.isLeafBill(treeNode) && (treeNode.children.length === 0) && (!treeNode.data.calcBase);
     },
@@ -733,7 +736,7 @@ let calcTools = {
     uiGLJPrice: function (price, glj){
         if (price){
             let projGLJ = glj ? calcTools.getProjectGLJ(glj) : null;
-            let d = (projGLJ&&projGLJ.ratio_data.length > 0) ? decimalObj.glj.unitPriceHasMix : decimalObj.glj.unitPrice;
+            let d = (projGLJ && projGLJ.ratio_data.length > 0) ? decimalObj.glj.unitPriceHasMix : decimalObj.glj.unitPrice;
             return parseFloat(price).toDecimal(d);
         }
         else return 0;
@@ -1801,10 +1804,9 @@ class CalcProgram {
             for (let node of treeNodes){delete node.changed};
             projectObj.mainController.refreshTreeNode(treeNodes);
 
-            // 批量树结点计算后,计算程序早已物是人非,所以这里要重新计算一下。
-            if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
-                calcProgramObj.refreshCurNodeCalcItems(me.project.mainTree.selected);
-            };
+            // 批量树结点计算后,计算程序早已物是人非,所以这里要重新计算一下。警告:第二个参数千万不能改成3,否则死循环!
+            if (activeSubSheetIsCalcProgram())
+                calcProgramObj.refreshCalcProgram(projectObj.project.mainTree.selected, 2);
             $.bootstrapLoading.end();
         });
     };

+ 12 - 15
web/building_saas/main/js/models/fee_rate.js

@@ -172,7 +172,7 @@ var FeeRate = {
             var node = project.mainTree.selected;
             if(node){
                 if (node.sourceType==='ration' && calcProgramObj.sheet) {
-                    calcProgramObj.showData(node);
+                    calcProgramObj.refreshCalcProgram(node, 3);
                 }
             }
         };
@@ -184,17 +184,6 @@ var FeeRate = {
             }
         };
         FeeRate.prototype.onFeeRateChange=function (rateID,value) {
-           /* var node = project.mainTree.selected;
-             this.refreshCalProgramByRateID(rateID,value);
-             this.refreshBillsByRateID(rateID,value);
-             if(node){
-             if (node.sourceType==='ration' && calcProgramObj.sheet) {
-             calcProgramObj.showData(node);
-             }
-             }
-             project.calcProgram.calcAllNodesAndSave(calcAllType.catAll);
-             project.markUpdateProject({projectID:project.ID(),feeRateID:this.getActivateFeeRateFileID()},"feeRate");
-             socket.emit('feeRateChangeNotify', this.getActivateFeeRateFileID());*/
            this.onFeeRatesChange([{rateID:rateID,value:value}]);
         };
 
@@ -206,7 +195,7 @@ var FeeRate = {
             }
             if(node){
                 if (node.sourceType==='ration' && calcProgramObj.sheet) {
-                    calcProgramObj.showData(node);
+                    calcProgramObj.refreshCalcProgram(node, 3);
                 }
             }
             project.calcProgram.calcAllNodesAndSave(calcAllType.catAll);
@@ -221,7 +210,7 @@ var FeeRate = {
             var node = project.mainTree.selected;
             if(node){
                 if (node.sourceType==='ration' && calcProgramObj.sheet) {
-                    calcProgramObj.showData(node);
+                    calcProgramObj.refreshCalcProgram(node, 3);
                 }
             }
             project.calcProgram.calcAllNodesAndSave(calcAllType.catAll);
@@ -419,12 +408,20 @@ var FeeRate = {
                     $.bootstrapLoading.end();
                 }
             }
-            if(editInfo.calcItem.feeRateID && value!= null){
+/*            if(editInfo.calcItem.feeRateID && value!= null){
                 var rate = this.getFeeRateByID(editInfo.calcItem.feeRateID);
                 if(rate!=undefined){
                     this.updateFeeRateByCalc(rate,value);
                     return;
                 }
+            }*/
+            if(editInfo.calcItem.feeRateID){
+                var rate = this.getFeeRateByID(editInfo.calcItem.feeRateID);
+                if(rate!=undefined){
+                    if (value == null) value = 0;
+                    this.updateFeeRateByCalc(rate,value);
+                    return;
+                }
             }
             editInfo.calcItem.feeRate=value;
             editInfo.calcItem.feeRateID=null;

+ 2 - 3
web/building_saas/main/js/models/ration_glj.js

@@ -166,9 +166,8 @@ var ration_glj = {
                 if(isDef(node)){
                     project.calcProgram.calcAndSave(node);
                 }
-                if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
-                    calcProgramObj.showData(node, false);
-                }
+                if (activeSubSheetIsCalcProgram())
+                    calcProgramObj.refreshCalcProgram(node, 1);
             });
         };
         ration_glj.prototype.getGljByRationID = function(rationID){

+ 2 - 0
web/building_saas/main/js/views/calc_program_manage.js

@@ -178,6 +178,8 @@ let calcProgramManage = {
                     $.bootstrapLoading.end();
                 }
             });
+            if (activeSubSheetIsCalcProgram())
+                calcProgramObj.refreshCalcProgram(projectObj.project.mainTree.selected, 1);
         }
         else{
             let data = {

+ 17 - 13
web/building_saas/main/js/views/calc_program_view.js

@@ -39,22 +39,26 @@ let calcProgramObj = {
         sheetCommonObj.initSheet(me.sheet, me.setting, 1);
     },
 
-    showData: function (treeNode, needCalc = true) {
+    // 刷新显示当前选中树结点的计算程序。
+    // treeNode:末指定时默认是造价书当前选中树结点
+    // refreshKind: 1 仅刷新 2 计算并刷新但无需保存 3 计算保存并刷新
+    refreshCalcProgram: function (treeNode, refreshKind = 1) {
         var me = this;
         me.treeNode = treeNode;
-        if (needCalc){
-            projectObj.project.calcProgram.calcAndSave(treeNode);
-        };
-        me.datas = treeNode.data.calcTemplate ? treeNode.data.calcTemplate.calcItems : [];
-        sheetCommonObj.initSheet(me.sheet, me.setting, me.datas.length);
-        sheetCommonObj.showData(me.sheet, me.setting, me.datas);
-    },
 
-    refreshCurNodeCalcItems: function (treeNode) {
-        var me = this;
-        me.treeNode = treeNode;
-        projectObj.project.calcProgram.innerCalc(treeNode, []);
-        delete treeNode.changed;
+        switch (refreshKind) {
+            case 1:
+                // doNothing
+                break;
+            case 2:
+                projectObj.project.calcProgram.innerCalc(treeNode, []);
+                delete treeNode.changed;
+                break;
+            case 3:
+                projectObj.project.calcProgram.calcAndSave(treeNode);
+                break;
+        }
+
         me.datas = treeNode.data.calcTemplate ? treeNode.data.calcTemplate.calcItems : [];
         sheetCommonObj.initSheet(me.sheet, me.setting, me.datas.length);
         sheetCommonObj.showData(me.sheet, me.setting, me.datas);

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

@@ -90,7 +90,7 @@ let MainTreeCol = {
             return node.data.subType != 201 && node.data.subType != 4 && node.data.subType != 5
         },
         commonUnitFee: function (node) {
-            return !(calcTools.isLeafBill(node) && !calcTools.isCalcBaseBill(node) && !calcTools.isInheritFrom(node, [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE]));
+            return !(calcTools.isLeafBill(node) && !calcTools.isbigBill(node) && !calcTools.isCalcBaseBill(node) && !calcTools.isInheritFrom(node, [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE]));
         },
         //根据节点、父节点类型判断是否可用计算基数
         calcBaseType: function (node) {

+ 9 - 10
web/building_saas/main/js/views/project_view.js

@@ -36,9 +36,9 @@ var projectObj = {
             subViewObj.loadComments(node);
         }
         gljOprObj.showDataIfRationSelect(node);
-        if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
-            calcProgramObj.showData(node);
-        }
+        if (activeSubSheetIsCalcProgram())
+            calcProgramObj.refreshCalcProgram(node, 3);
+
         //zhong 2017-9-1 特征及内容
         if(pageCCOprObj.active){
             pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];//mainSpread焦点单元格
@@ -399,10 +399,6 @@ var projectObj = {
             project.Ration.updateRationCodes([{'node':node,value:value}]);
           //  this.updateRationCode(node, value);  // 新套定额适合实时计算
             // 这里因异步问题暂时缺少工料机价格。该过程移到:ration_glj.js的refreshAfterSave方法中。
-            /*project.calcProgram.calcAndSave(node);
-            if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
-                calcProgramObj.showData(node, false);
-            };*/
         }
     },
     updateNodeField : function (node,value,filedID,callback) {
@@ -429,11 +425,14 @@ var projectObj = {
         let project = projectObj.project, fieldName = colSetting.data.field;
         if(node.sourceType==project.ration_glj.getSourceType()){
             project.ration_glj.updateFromMainSpread(value,node,fieldName);
-        }else if(fieldName === 'remark'){
+        }
+        else if(fieldName === 'remark'){
             projectObj.updateNodeField(node,value,'remark');
-        }  else if(calcTools.isGljRation(node)){
+        }
+        else if(calcTools.isGljRation(node)){
             gljOprObj.updateRationTypeGLJ(value,node,fieldName,editingText);
-        } else if (value !== calcFees.getFee(node.data, fieldName)||fieldName == 'quantity') {//工程量需要进行转换,所以做特殊处理
+        }
+        else if (value !== calcFees.getFee(node.data, fieldName)||fieldName == 'quantity') {//工程量需要进行转换,所以做特殊处理
             if (fieldName === 'code' && value != '' && !calcTools.isVolumePrice(node)) {
                 projectObj.updateCode(node, value);
             }

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

@@ -103,7 +103,7 @@ $("#linkJSCX").click(function(){        // 计算程序
     if (!projectObj.mainController.tree.selected)
         projectObj.mainController.tree.selected = projectObj.mainController.tree.firstNode();
     let sel = projectObj.mainController.tree.selected;
-    calcProgramObj.showData(sel);
+    calcProgramObj.refreshCalcProgram(sel, 3);
     gljOprObj.activeTab='#linkJSCX';
 });
 
@@ -378,6 +378,10 @@ function activeSubSheetIs(idx){
     return rst;
 }
 
+function activeSubSheetIsCalcProgram(){
+    return subSpread.getActiveSheetIndex() == subSheetIndex.ssiCalcProgram;
+}
+
 //弹出清单规则或定额库后导致subSpread和特征及内容spread显示出问题
 function refreshSubSpread(){
     if(pageCCOprObj.active){

+ 3 - 2
web/building_saas/report/html/rpt_content_format.html

@@ -2,7 +2,7 @@
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title">格式</h5><h6 id="update_msg_response"></h6>
+                <h5 class="modal-title">格式</h5><h5 class="modal-title" id="update_msg_response"></h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                 </button>
@@ -117,7 +117,8 @@
                 </div>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-link float-left" data-dismiss="modal" onclick="rptControlObj.saveCustCfg()">存为默认值</button>
+                <button type="button" class="btn btn-link float-left" onclick="rptControlObj.restoreCustCFG()">恢复默认值</button>
+                <button type="button" class="btn btn-link float-left" onclick="rptControlObj.saveCustCfg()">存为默认值</button>
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</button>
             </div>

+ 1 - 1
web/building_saas/report/html/rpt_export_excel.html

@@ -38,8 +38,8 @@
                 </div>
             </div>
             <div class="modal-footer">
+                <a onclick="rptControlObj.getExcel()" class="btn btn-primary" data-dismiss="modal">确定导出</a>
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a onclick="rptControlObj.getExcel()" class="btn btn-primary">确定导出</a>
             </div>
         </div>
     </div>

+ 2 - 1
web/building_saas/report/html/rpt_main.html

@@ -29,7 +29,8 @@
                     <div class="panel">
                         <div class="panel-body">
                             <div class="btn-group" role="group" aria-label="Button group with nested dropdown" id="export_div">
-                                <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#export_excel"><i class="fa fa-file-excel-o"></i> Excel <span class="badge badge-secondary">0</span></button>
+                                <button type="button" class="btn btn-outline-primary btn-sm" id="show_excel_output_cfg" data-toggle="modal" data-target="#export_excel" style="display:none"></button>
+                                <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.checkAndGetExcel()"><i class="fa fa-file-excel-o"></i> Excel <span class="badge badge-secondary">0</span></button>
                                 <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.getPDF()"><i class="fa fa-file-pdf-o"></i> PDF <span class="badge badge-secondary">0</span></button>
                             </div>
                         </div>

+ 63 - 16
web/building_saas/report/js/rpt_main.js

@@ -130,6 +130,35 @@ let zTreeOprObj = {
         document.getElementById("rpt_narrow").checked = cfg.isNarrow;
         document.getElementById("rpt_fill_zero").checked = cfg.fillZero;
     },
+    extractRptCfg: function (cfg) {
+        cfg.margins.Left = $("#elementMargin_Left").get(0).value;
+        cfg.margins.Right = $("#elementMargin_Right").get(0).value;
+        cfg.margins.Top = $("#elementMargin_Top").get(0).value;
+        cfg.margins.Bottom = $("#elementMargin_Bottom").get(0).value;
+
+        for (let font of cfg.fonts) {
+            let fontPropSuffix = "title";
+            if (font.CfgDispName === "表标题") {
+                fontPropSuffix = "title";
+            } else if (font.CfgDispName === "列标题") {
+                fontPropSuffix = "column";
+            } else if (font.CfgDispName === "正文内容") {
+                fontPropSuffix = "content";
+            } else if (font.CfgDispName === "合计") {
+                fontPropSuffix = "summary";
+            } else if (font.CfgDispName === "表眉/表脚") {
+                fontPropSuffix = "header_footer";
+            }
+            font.Name = document.getElementById("fontName_" + fontPropSuffix).value;
+            font.FontHeight = document.getElementById("fontHeight_" + fontPropSuffix).value;
+            font.FontBold = (document.getElementById("font_bold_" + fontPropSuffix).className === "btn btn-sm btn-outline-secondary active")?"T":"F";
+            font.FontItalic = (document.getElementById("font_italic_" + fontPropSuffix).className === "btn btn-sm btn-outline-secondary active")?"T":"F";
+            font.FontUnderline = (document.getElementById("font_underline_" + fontPropSuffix).className === "btn btn-sm btn-outline-secondary active")?"T":"F";
+        }
+        cfg.showVerticalLine = document.getElementById("rpt_vertical_line").checked;
+        cfg.isNarrow = document.getElementById("rpt_narrow").checked;
+        cfg.fillZero = document.getElementById("rpt_fill_zero").checked;
+    },
     refreshNodes: function() {
         let me = this;
         let private_setupIsParent = function(node){
@@ -320,16 +349,38 @@ let rptControlObj = {
         }
     },
     getAllInOneBook: function () {
-        let me = rptControlObj;
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
-            let orgRptName = zTreeOprObj.checkedRptTplNodes[0].name;
+            let orgRptName = projectInfoObj.projectInfo.name;
             let refRptTplIds = [];
             for (let node of zTreeOprObj.checkedRptTplNodes) {
                 refRptTplIds.push(node.refId);
             }
-            let url =  "/report_api/getExcelInOneBook/" + projectInfoObj.projectInfo.ID + "/" + refRptTplIds.join(",") + "/" +
-                me.getCurrentPageSize() + "/" + orgRptName + "/" + 'normal';
-            window.location = url;
+            window.location = "/report_api/getExcelInOneBook/" + projectInfoObj.projectInfo.ID + "/" + refRptTplIds.join(",") + "/" +
+                rptControlObj.getCurrentPageSize() + "/" + orgRptName + "/" + 'normal';
+        }
+    },
+    getAllIndividualExcelBook: function () {
+        let me = rptControlObj;
+        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+            let urls = [];
+            let orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
+            for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
+                let orgRptName = tplNode.name;
+                let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
+                    me.getCurrentPageSize() + "/" + orientation + "/" + orgRptName + "/" + true + "/" + 'normal';
+                urls.push(url);
+            }
+            downloadReport(urls);
+        }
+    },
+    checkAndGetExcel: function () {
+        if (zTreeOprObj.treeObj) {
+            let chkNodes = zTreeOprObj.treeObj.getCheckedNodes(true);
+            if (chkNodes.length > 0) {
+                $("#show_excel_output_cfg").trigger("click");
+            } else {
+                rptControlObj.getAllIndividualExcelBook();
+            }
         }
     },
     getExcel: function () {
@@ -337,17 +388,7 @@ let rptControlObj = {
         if ($("#excelExportType_AllInOneBook").get(0).checked) {
             me.getAllInOneBook();
         } else if ($("#excelExportType_IndividualBook").get(0).checked) {
-            if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
-                let urls = [];
-                let orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
-                for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
-                    let orgRptName = tplNode.name;
-                    let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
-                        me.getCurrentPageSize() + "/" + orientation + "/" + orgRptName + "/" + true + "/" + 'normal';
-                    urls.push(url);
-                }
-                downloadReport(urls);
-            }
+            me.getAllIndividualExcelBook();
         }
     },
     getPDF: function() {
@@ -433,6 +474,12 @@ let rptControlObj = {
             }
         }
     },
+    restoreCustCFG: function () {
+        let me = this;
+        zTreeOprObj.renderRptCfg(zTreeOprObj.defReportPageCfg);
+        zTreeOprObj.extractRptCfg(zTreeOprObj.reportPageCfg);
+        me.saveCustCfg();
+    },
     saveCustCfg: function() {
         let params = {};
         params.custCfg = zTreeOprObj.reportPageCfg;