Просмотр исходного кода

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

vian 5 лет назад
Родитель
Сommit
a74124ae7c

+ 53 - 4
modules/reports/util/rpt_excel_util.js

@@ -310,6 +310,23 @@ function writeSharedString(sharedStrList){
     }
     return rst;
 }
+function _setupPgBrks(pageData) {
+    pageData.pageBreaks = [];
+    let pgBrkIdx = 0;
+    const pgBrk = [];
+    for (const page of pageData.items) {
+        const maxBottomArr = [];
+        for (const cell of page.cells) {
+            if (maxBottomArr.indexOf(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) < 0) {
+                maxBottomArr.push(cell[JV.PROP_AREA][JV.PROP_BOTTOM]);
+            }
+        }
+        pgBrkIdx += maxBottomArr.length;
+        pgBrk.push(pgBrkIdx);
+    }
+    pageData.pageBreaks.push(pgBrk);
+}
+
 function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage, custSheetMergeBands){
     let rst = [];
     let private_pushDftFont = function(){
@@ -352,19 +369,19 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
     private_pushDftFont();
     private_buildFirstDftStyle();
     if (isSinglePage) {
-        rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj, null, true));
+        rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj, null, true, -1));
     } else {
         for (let i = 0; i < pageData.items.length; i++) {
             let appointedMergeBand = null;
             if (custSheetMergeBands && custSheetMergeBands.length > i) {
                 appointedMergeBand = custSheetMergeBands[i];
             }
-            rst.push(writeSheet(pageData, pageData.items[i], paperSize, sharedStrList, stylesObj, appointedMergeBand, i === 0));
+            rst.push(writeSheet(pageData, pageData.items[i], paperSize, sharedStrList, stylesObj, appointedMergeBand, i === 0, i));
         }
     }
     return rst;
 }
-function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, appointedMergeBand, isFirstSheet){
+function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, appointedMergeBand, isFirstSheet, pgBrkIdx){
     let rst = [], xPos = [], yPos = [], yMultiPos = [], currentMergeBorder = null,
         headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let currentPageMergePos = null; //在 JV.PAGING_OPTION_INFINITY 场合应用
@@ -834,6 +851,23 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
     }
     rst.push('<pageSetup ' + pStr + ' fitToWidth="0" fitToHeight="0" orientation="' + orientationStr + '" />');
     rst.push('<headerFooter alignWithMargins="0"/>');
+    //插入分页符---------------------------
+    if (pageData.pageBreaks) {
+        let pgBrks = [];
+        if (sheetData !== null) {
+            pgBrks = pageData.pageBreaks[pgBrkIdx];
+        } else {
+            pgBrks = pageData.pageBreaks[0];
+        }
+        if (pgBrks.length > 1) {
+            rst.push('<rowBreaks count="' + pgBrks.length + '" manualBreakCount="' + pgBrks.length + '" >');
+            for (let pbi = 0; pbi < pgBrks.length; pbi++) {
+                rst.push('<brk id="' + pgBrks[pbi] + '" max="16383" man="1" />');
+            }
+            rst.push('</rowBreaks>');
+        }
+    }
+    //插入分页符结束---------------------------
     rst.push('</worksheet>');
     return rst;
 }
@@ -862,6 +896,9 @@ module.exports = {
         let isSinglePage = rptOptions.singlePage;
         let sheets = [];
         if (isSinglePage) {
+            //加分页符(分页符要在外部处理好)-------------------
+            _setupPgBrks(pageData);
+            //加分页符结束-------------------
             sheets.push({sheetName: '全部页'});
         } else {
             if (custSheetNames && custSheetNames.length === pageData.items.length) {
@@ -981,6 +1018,10 @@ module.exports = {
                 mergeBand[JV.PROP_RIGHT].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT]);
                 sheetNames.push(pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
 
+                //加分页符(分页符要在外部处理好)-------------------
+                _setupPgBrks(pageDataArray[i]);
+                //加分页符结束-------------------
+
                 for (let j = 0; j < pageDataArray[i].items.length; j++) {
                     let maxY = 0, minY = 100000;
                     if (pageDataArray[i].items[j][JV.PAGE_SPECIAL_MERGE_POS]) {
@@ -1014,8 +1055,9 @@ module.exports = {
                     }
                 }
             }
-            //2. newPageData的items属性
+            //2. newPageData的items属性及相关分页符
             newPageData.items = [];
+            newPageData.pageBreaks = [];
             for (let i = 0; i < pageDataArray.length; i++) {
                 let pageItem = {};
                 pageItem[JV.PROP_PAGE_SEQ] = i + 1;
@@ -1028,6 +1070,13 @@ module.exports = {
                 newPagePos[i][JV.NODE_PAGE_SIZE] = pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE];
                 pageItem[JV.PAGE_SPECIAL_MERGE_POS] = newPagePos[i];
                 newPageData.items.push(pageItem);
+                //重新分配分页符()------------------
+                if (pageDataArray[i].pageBreaks.length === 1) {
+                    newPageData.pageBreaks.push(pageDataArray[i].pageBreaks[0]);
+                } else {
+                    newPageData.pageBreaks.push([]);
+                }
+                //重新分配分页符结束------------------
             }
             //3. everything is ok, then call me
             me.exportExcel(newPageData, paperSize, fName, 'false', sheetNames, custMergeBands, callback);

+ 2 - 2
web/building_saas/main/js/models/cache_tree.js

@@ -480,11 +480,11 @@ var cacheTree = {
             this.sortTreeItems();
             return rst;
         };
-        Tree.prototype.delete = function (node) {
+        Tree.prototype.delete = function (node,resetPre=true) {
             var success = false;
             success=this.cascadeRemove(node);
             this.sortTreeItems();
-            this.preSelected = null;
+            if(resetPre) this.preSelected = null;
             return success;
         };
         Tree.prototype.cascadeRemove = function (node) {

+ 18 - 6
web/building_saas/main/js/models/project.js

@@ -523,12 +523,20 @@ var PROJECT = {
 
 
           function deleteTreeNodes(deleteNodes) {
-              let controller = projectObj.mainController, project = projectObj.project;
-              let Bill = project.Bills, Ration = project.Ration;
-              for(let rd of deleteNodes){
-                  controller.sheet.deleteRows(rd.serialNo(),1);
+            let controller = projectObj.mainController, project = projectObj.project;
+            let Bill = project.Bills, Ration = project.Ration;
+            let selected = controller.tree.selected;
+            let selected_serialNo = selected.serialNo();
+              for (let rd of deleteNodes) {
+                controller.sheet.deleteRows(rd.serialNo(), 1);
+                if (selected.data.ID == rd.data.ID) {
                   controller.tree.delete(rd);
-                  if(rd.sourceType == Bill.getSourceType()) Bill.tree.delete(rd.source);
+                  controller.setTreeSelected(controller.tree.items[selected_serialNo] ? controller.tree.items[selected_serialNo] : controller.tree.items[controller.tree.items.length - 1]);
+                } else {
+                  controller.tree.delete(rd, false);
+                }
+
+                if (rd.sourceType == Bill.getSourceType()) Bill.tree.delete(rd.source);
               }
           }
           function addNewNodes(newDatas,refreshNode) {
@@ -553,7 +561,11 @@ var PROJECT = {
                   newAddNode.push(newNode);
                   refreshNode.push(newNode);
               }
-              TREE_SHEET_HELPER.refreshTreeNodeData(controller.setting, controller.sheet, newAddNode, false);
+            if (newAddNode.length == 0) return;
+            let sels = controller.sheet.getSelections();
+            controller.setTreeSelected(newAddNode[newAddNode.length -1]);
+            controller.sheet.setSelection(newAddNode[newAddNode.length - 1].serialNo(), sels[0].col, 1, 1);
+            TREE_SHEET_HELPER.refreshTreeNodeData(controller.setting, controller.sheet, newAddNode, false);
           }
         };
         project.prototype.setValue=function (obj,key,value) {

+ 2 - 2
web/building_saas/main/js/models/project_glj.js

@@ -372,7 +372,7 @@ ProjectGLJ.prototype.calcAllMaterial = function (unitPriecs,needReCalc) {//当
             let fOrPDataMap = {};
             let tIndex = gljUtil.getIndex(g);
             //运费和原价中的工料机只要有一个包含该材料,就要重算
-            if(freightListMap[tIndex]){ //运费重算
+          if (freightListMap[tIndex]) { //运费重算
                 let freightUpdateMap = {};
                 for(let f of freightListMap[tIndex]){
                     if(f.conveyance != "自办运输") continue;//不是自办运输的不用管
@@ -388,7 +388,7 @@ ProjectGLJ.prototype.calcAllMaterial = function (unitPriecs,needReCalc) {//当
                 if(!_.isEmpty(freightUpdateMap)) fOrPDataMap["freight"] = {update:freightUpdateMap};
             }
             //原价重算
-            if(originalListMap[tIndex]){ //运费重算
+            if(originalListMap[tIndex]){ 
                 let originalUpdateMap = {};
                 for(let o of originalListMap[tIndex]){
                     let calo = ifNeedReCalc(o,priceMap,needReCalc);

+ 18 - 13
web/building_saas/main/js/views/material_calc_view.js

@@ -56,7 +56,7 @@ materialCalcObj = {
         },
          getText:{
           forExp:function (item) {
-             return item.exp&&item.exp!=""?item.exp:materialCalcObj.getFreightEXP(item);
+             return gljUtil.isDef(item.exp)?item.exp:materialCalcObj.getFreightEXP(item);
           }
       }
 
@@ -568,9 +568,10 @@ materialCalcObj = {
                 if (parseInt(row) >= me.freightDatas.length) {//新增
                     let tempFreight = null;
                     if (dataCode == "start") {
-                        tempFreight = me.getSavedFreight(value, material);
+                      tempFreight = me.getSavedFreight(value, material);
                     }
                     if (tempFreight) {
+                        if (tempFreight.conveyance == "自办运输") tempFreight.exp = "";
                         newData = tempFreight;
                     } else {
                         if(_.isEmpty(newData)) newData = me.getNewFreightData(material);
@@ -817,7 +818,7 @@ materialCalcObj = {
             for(let key in record){
                 if(key == "_id") continue;
                 f[key] = record[key];
-                if(key =="ration" || key == "ration_gljs")f[key] = [];//下面的定额和工料机不用保存
+                if(key =="rations" || key == "ration_gljs")f[key] = [];//下面的定额和工料机不用保存
             }
             user_freight.freight = f;
             projectObj.project.projectGLJ.updateUserFreight({freights:[user_freight],action:"add"});
@@ -825,22 +826,26 @@ materialCalcObj = {
     },
 
     updateUserFreight:function (record,userFreight) {
-        let t  = {};
-        for(let t_key in userFreight){
-            if(t_key == "ID") continue;
-            t[t_key] = userFreight[t_key];
+        let t = {};
+        for (let t_key in userFreight) {
+          if (t_key == "ID") continue;
+          t[t_key] = userFreight[t_key];
         }
 
         t.rootProjectID = projectObj.project.projectInfo.property.rootProjectID;
         let f = {};
-        for(let key in record){
-            if(key == "_id") continue;
-            f[key] = record[key];
-            if(key =="ration" || key == "ration_gljs")f[key] = [];//下面的定额和工料机不用保存
+        for (let key in record) {
+          if (key == "_id") continue;
+          f[key] = record[key];
+          if (key == "rations" || key == "ration_gljs") f[key] = []; //下面的定额和工料机不用保存
         }
+        if (record.conveyance == "自办运输") f.exp = '';
         t.freight = f;
-        projectObj.project.projectGLJ.updateUserFreight({ID:userFreight.ID,doc:t,action:"update"});
-
+        projectObj.project.projectGLJ.updateUserFreight({
+          ID: userFreight.ID,
+          doc: t,
+          action: "update"
+        });
     },
 
 

+ 159 - 3
web/building_saas/standard_interface/export/anhui_chizhou.js

@@ -39,7 +39,34 @@ INTERFACE_EXPORT = (() => {
         const isBidSubmission = exportKind === BID_SUBMISSION; // 是否是投标
         const isControl = exportKind === CONTROL; // 是否是控制价
 
-// 节点定义------------------------------------------------------------------------------------------------------------
+        let serialNo;
+        let vTree;
+// ------------------------------------------------------------------------------------------------------------
+        // 提取字符串中的数字
+        function getNum(str) {
+            let num = str.replace(/[^0-9]/ig, "");
+            return num;
+        }
+
+        function CheckNull(Value) {
+            if (!Value)
+                return 0
+            else
+                return Value;
+        }
+
+        function GetRationDataType(ration){
+            let dt;
+            if (calcTools.isRationItem(ration))
+               dt = 3
+            else if (calcTools.isGljRation(ration))
+                dt = 1
+            else if (calcTools.isVolumePrice(ration))
+                dt = 4;
+            return dt;
+        }
+// ------------------------------------------------------------------------------------------------------------
+
         function CreateNode(nodeName, attrArr = []) {
             Element.call(this, nodeName, attrArr);
         }
@@ -137,8 +164,132 @@ INTERFACE_EXPORT = (() => {
             Element.call(this, '投标信息', attrs);
         }
 
+        function addRationGLJs(rData, rationNode){
+            for (let i = 0; i < rData.rationGLJList.length; i++) {
+                let glj = rData.rationGLJList[i];
+                const attrs = [
+                    { name: '人材机标识', value: glj.GLJID},
+                    { name: '人材机含量', value: glj.tenderQuantity}
+                ];
+                let gljNode = new CreateNode('定额人材机含量明细', attrs);
+                rationNode.children.push(gljNode);
+            }
+        }
+
+        function addRations(ABillItem, ABillNode){
+            for (let i = 0; i < ABillItem.children.length; i++) {
+                let r = ABillItem.children[i].data;
+                const attrs = [
+                    { name: '序号', value: i + 1},
+                    { name: '定额编号', value: r.code},
+                    { name: '定额名称', value: r.name},
+                    { name: '单位', value: r.unit},
+                    { name: '数量', value: r.tenderQuantity},
+                    { name: '单价', value: r.feesIndex && r.feesIndex.common ? r.feesIndex.common.tenderUnitFee : 0},
+                    { name: '合价', value: r.feesIndex && r.feesIndex.common ? r.feesIndex.common.tenderTotalFee : 0},
+                    { name: '备注', value: ''},
+                    { name: '数据类型', value: GetRationDataType(ABillItem.children[i])},
+                    { name: '人工费', value: getFee(r.fees, 'marketLabour.tenderTotalFee'), type: TYPE.DECIMAL},
+                    { name: '主材费', value: getFee(r.fees, 'marketMaterial.tenderTotalFee'), type: TYPE.DECIMAL},
+                    { name: '辅材费', value: 0},
+                    { name: '机械使用费', value: getFee(r.fees, 'marketMachine.tenderTotalFee'), type: TYPE.DECIMAL},
+                    { name: '设备费', value: 0},
+                    { name: '措施费1', value: getFee(r.fees, 'measure.tenderTotalFee'), type: TYPE.DECIMAL},    // FQuery2.FieldByName('OtherDirectFee'},
+                    { name: '措施费2', value: 0}, //getFee(r.fees, 'measure.tenderTotalFee'), type: TYPE.DECIMAL
+                    { name: '企业管理费', value: getFee(r.fees, 'manage.tenderTotalFee'), type: TYPE.DECIMAL},
+                    { name: '规费', value: getFee(r.fees, 'force.tenderTotalFee'), type: TYPE.DECIMAL},
+                    { name: '利润', value: getFee(r.fees, 'profit.tenderTotalFee'), type: TYPE.DECIMAL},
+                    { name: '税金', value: getFee(r.fees, 'tax.tenderTotalFee'), type: TYPE.DECIMAL},
+                ];
+                let rationNode = new CreateNode('定额信息表', attrs);
+                ABillNode.children.push(rationNode);
+
+                addRationGLJs(r, rationNode);
+            }
+        }
+
+        function recursiveAddBills(AItem, AXMLParent) {
+            if (AItem == undefined || !calcTools.isBill(AItem)) return;
+
+            let vBillNode;
+            function addBillNode () {
+                serialNo++;
+                let zmh = (AItem.parent == vTree.roots[0]) ? getNum(AItem.data.name) : AItem.data.code;
+                const attrs = [
+                    {name: "序号", value: serialNo}, //AItem.data.ID
+                    {name: "清单章节号", value: zmh},
+                    {name: "子目号", value: zmh},
+                    {name: "子目名称", value: AItem.data.name},
+                    {name: "单位", value: AItem.data.unit},
+                    {name: "数量", value: AItem.data.quantity, type: TYPE.DECIMAL}
+                ];
+
+                let dj = 0, hj = 0;
+                if ((isBidSubmission || isControl) || (AItem.data.specialProvisional == '专业工程')){
+                    hj = CheckNull(AItem.data.feesIndex && AItem.data.feesIndex.common ? AItem.data.feesIndex.common.tenderTotalFee : 0);
+                    dj = hj;
+                }
+                attrs.push({name: "单价", value: dj}, {name: "合价", value: hj});
+                attrs.push({name: "备注", value: isBidInvitation ? '' : AItem.data.remark});
+
+                let sjlx;
+                if (AItem.data.specialProvisional == '专业工程')      // 专项暂定
+                   sjlx = 21;
+                else {
+                    if (calcTools.isLeafBill(AItem)) {
+                        if (AItem.data.code == '102-3')                       // 安全生产费
+                            sjlx = '22'
+                        else if ((AItem.data.code == '-a') && (AItem.parent && (AItem.parent.data.code == '101-1')))               // 工程一切险
+                            sjlx = '23'
+                        else if ((AItem.data.code == '-b') && (AItem.parent && (AItem.parent.data.code == '101-1')))                  // 第三者责任险
+                            sjlx = '24'
+                        else
+                            sjlx = '20';
+                    }
+                    else {
+                        sjlx = '1';            // 父清单
+                        attrs.find(function getE(e) {return e.name == '单位'}).value = '项';
+                    }
+                }
+                attrs.push({name: "数据类型", value: sjlx});
+
+                if (isBidSubmission || isControl){
+                    attrs.push(
+                        {name: "人工费", value: getFee(AItem.data.fees, 'marketLabour.tenderTotalFee'), type: TYPE.DECIMAL},
+                        {name: "主材费", value: getFee(AItem.data.fees, 'marketMaterial.tenderTotalFee'), type: TYPE.DECIMAL},
+                        {name: "辅材费", value: 0},
+                        {name: "机械使用费", value: getFee(AItem.data.fees, 'marketMachine.tenderTotalFee'), type: TYPE.DECIMAL},
+                        {name: "设备费", value: 0},
+                        {name: "措施费1", value: getFee(AItem.data.fees, 'measure.tenderTotalFee'), type: TYPE.DECIMAL},
+                        {name: "措施费2", value: 0}, // getFee(AItem.data.fees, 'measure.tenderTotalFee'), type: TYPE.DECIMAL},
+                        {name: "企业管理费", value: getFee(AItem.data.fees, 'manage.tenderTotalFee'), type: TYPE.DECIMAL},
+                        {name: "规费", value: getFee(AItem.data.fees, 'force.tenderTotalFee'), type: TYPE.DECIMAL},
+                        {name: "利润", value: getFee(AItem.data.fees, 'profit.tenderTotalFee'), type: TYPE.DECIMAL},
+                        {name: "税金", value: getFee(AItem.data.fees, 'tax.tenderTotalFee'), type: TYPE.DECIMAL}
+                    );
+                }
+
+                vBillNode = new CreateNode('工程量清单明细', attrs);
+                AXMLParent.children.push(vBillNode);
+
+                if (calcTools.isLeafBill(AItem))
+                    addRations(AItem, vBillNode)
+            }
+            addBillNode();
+
+            recursiveAddBills(AItem.children[0], vBillNode);
+            recursiveAddBills(AItem.nextSibling, AXMLParent);
+        }
+
+        // 清单表
+        function createGCLQDB(tenderData, gongCLQDB){
+            vTree = tenderDetailMap[tenderData.ID].mainTree;
+            serialNo = 0;
+            recursiveAddBills(vTree.roots[0].children[0], gongCLQDB);
+        };
+
         // 生成标段工程
-        function CreateGLBDGC(tenderData, gongLGCSJ, gongLGCHZ, Num){
+        function createGLBDGC(tenderData, gongLGCSJ, gongLGCHZ, Num){
             let attrs0 = [
                 { name: '序号', value: Num },
                 { name: '标段名称', value: tenderData.name },
@@ -154,6 +305,11 @@ INTERFACE_EXPORT = (() => {
             const RenCJHZ = new CreateNode('人材机汇总');
             gongLBDGC.children = [gongCLQDB, jiRGXXB, ZaoJHZB, RenCJHZ];
 
+            createGCLQDB(tenderData, gongCLQDB);
+            // createJiRGXXB(jiRGXXB);
+
+
+            // 同步生成 公路工程汇总明细 数据
             const attrs2 = [{ name: '备注', value: '' }];
             const gongLGCHZMX = new CreateNode('公路工程汇总明细', attrs0.concat(attrs2));
             gongLGCHZ.children.push(gongLGCHZMX);
@@ -183,7 +339,7 @@ INTERFACE_EXPORT = (() => {
             let n = 0;
             for (const tenderData of projectData.children) {
                 n++;
-                CreateGLBDGC(tenderData, gongLGCSJ, gongLGCHZ, n);
+                createGLBDGC(tenderData, gongLGCSJ, gongLGCHZ, n);
             }
             gongLGCSJ.children.push(gongLGCSJ.children.shift());