Bladeren bron

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

chenshilong 5 jaren geleden
bovenliggende
commit
e15cc2aab5

+ 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"
+        });
     },
 
 

+ 5 - 5
web/building_saas/standard_interface/export/anhui_maanshan.js

@@ -554,7 +554,7 @@ INTERFACE_EXPORT = (() => {
         if (!midLayerMap[midLayerKey]) {
           jingJiBiao.children.push(midLayerMap[midLayerKey] = new Dxgcxx(midLayerCode, midLayerName));
         }
-        midLayerMap[midLayerKey].children.push(setupTender(tenderData, information, feature));
+        midLayerMap[midLayerKey].children.push(setupTender(tenderData, feature));
       }
       // 校验信息
       const [cpuID, diskID, macID] = generateHardwareId().split(';');
@@ -578,7 +578,7 @@ INTERFACE_EXPORT = (() => {
     const projectGLJMap = {}; // 项目人材机与项目人材机数据映射
 
     // 组装单位工程数据
-    function setupTender(tenderData, information, feature) {
+    function setupTender(tenderData, feature) {
       curDetail = tenderDetailMap[tenderData.ID];
       curDetail.projectGLJ.datas.gljList.forEach((glj, index) => {
         projectGLJIDToRcjID[glj.id] = index + 1;
@@ -586,7 +586,7 @@ INTERFACE_EXPORT = (() => {
       });
       const dwgcxx = new Dwgcxx(tenderData.name, feature);
       dwgcxx.children.push(
-        setupFeeRate(curDetail.FeeRate, information),
+        setupFeeRate(curDetail.FeeRate, feature),
         setupBills(curDetail.mainTree),
         ...setupGLJList(curDetail)
       );
@@ -594,7 +594,7 @@ INTERFACE_EXPORT = (() => {
     }
 
     // 组装费率数据
-    function setupFeeRate(feeRateDetail, information) {
+    function setupFeeRate(feeRateDetail, feature) {
       const qfxx = new Qfxx();
       const jjflb = new JjFlb();
       // 费率界面左侧底层数据
@@ -610,7 +610,7 @@ INTERFACE_EXPORT = (() => {
       // 除右侧数据外,还应拼凑工程所在地、费率标准的数据。
       const jjflx = new JjFlx();
       // 工程所在地取建设项目-基本信息中的“工程所在地”;
-      const locationItem = { name: '工程所在地', value: getValueByKey(information, 'projLocation') };
+      const locationItem = { name: '工程所在地', value: getValueByKey(feature, 'projLocation') };
       jjflx.children.push(new JjFlxMx(locationItem));
       // 费率标准取,费率-重选标准中当前用的费率标准名称。
       const feeRateStandardItem = { name: '费率标准', value: feeRateDetail.datas.libName };

+ 100 - 1
web/building_saas/standard_interface/import/anhui_maanshan.js

@@ -58,18 +58,117 @@ INTERFACE_IMPORT = (() => {
 
     // 提取工程特征信息,xml中提取出来的工程特征,最终会与模板工程特征进行合并处理。(接口内不需要处理合并)
     function setupFeature(projectSrc, tenderSrc) {
-      return [
+      const feature = [
         { key: 'singleProjNo', value: getValue(projectSrc, ['Dxgcxx', '_Dxgcbh']) },
         { key: 'singleProjName', value: getValue(projectSrc, ['Dxgcxx', '_Dxgcmc']) },
         { key: 'unitProjNo', value: getValue(tenderSrc, ['_Dwgcbh']) },
       ];
+      // 工程所在地在费率项中
+      const feeRateItems = array(tenderSrc, ['Qfxx', 'JjFlx', 'JjFlxMx']);
+      const locationItem = feeRateItems.find(item => getValue(item, ['_Mc']) === '工程所在地');
+      if (locationItem) {
+        feature.push(locationItem);
+      }
+      return feature;
+    }
+
+    // 费率值映射表,“接口中可有效识别的费率值类型值,此接口是Bm”与“软件中对应费率标准的名称”映射。
+    const feeRateValueMap = {
+      'DJF': '冬季施工增加费',
+      'YJF': '雨季施工增加费',
+      'YEF': '夜间施工增加费',
+      'GYF': '高原地区施工增加费',
+      'FSF': '风沙地区施工增加费',
+      'YHF': '沿海地区施工增加费',
+      'XCF': '行车干扰施工增加费',
+      'ZYF': '工地转移费',
+      'SFF': '施工辅助费',
+      'JBF': '基本费用',
+      'YFF': '主副食运费补贴',
+      'TQF': '职工探亲路费',
+      'QNF': '职工取暖补贴',
+      'CWF': '财务费用',
+      'YLF': '养老保险费',
+      'SYF': '失业保险费',
+      'YBF': '医疗保险费',
+      'GSF': '工伤保险费',
+      'ZFF': '住房公积金',
+      'LR': '利润',
+      'SJ': '税金',
+    };
+
+    // 费率工程类型映射表, “接口中可有效识别的工程类型值,此接口是Qflb”与“袁建中对应费率标准的工程类型名称”映射
+    const feeRateParentTypeMap = {
+      1: '土方',
+      3: '石方',
+      2: '运输',
+      4: '路面',
+      11: '隧道',
+      5: '构造物Ⅰ',
+      16: '构造物Ⅰ(不计冬)',
+      6: '构造物Ⅱ',
+      9: '构造物Ⅲ(桥梁)',
+      8: '构造物Ⅲ(除桥以外不计雨夜)',
+      10: '技术复杂大桥',
+      12: '钢材及钢结构(桥梁)',
+      13: '钢材及钢结构(除桥以外不计夜)',
+      17: '费率为0',
+      4: '路面(不计雨)',
+      16: '构造物Ⅰ(不计雨)',
+      8: '构造物Ⅲ(除桥以外)',
+      13: '钢材及钢结构(除桥以外)',
+      15: '设备',
+      14: '量价',
+    };
+
+    const feeRateParamMap = {
+      djsg: '冬季施工',
+      yjsg: '雨季施工',
+      yjsg: '夜间施工',
+      gysg: '高原施工',
+      fssg: '风沙施工',
+      yhsg: '沿海施工',
+      hcgr: '行车干扰',
+      gdzy: '工地转移(km)',
+      sgfz: '施工辅助',
+      jbfy: '基本费用',
+      zhlc: '综合里程(km)',
+      zgtq: '职工探亲',
+      zgqn: '职工取暖',
+      cwfy: '财务费用',
+      ylbx: '养老保险(%)',
+      sybx: '失业保险(%)',
+      ylbx: '医疗保险(%)',
+      gsbx: '工伤保险(%)',
+      zfgj: '住房公积金(%)',
+    };
+
+    // 提取费率数据(费率值、费率参数),最终会与标准费率数据进行合并。(接口内不需要处理合并)
+    function setupFeeRate(feeRateSrc) {
+      // 提取费率值数据
+      const valuaItems = arrayValue(feeRateSrc, ['JjFlb', 'JjFlbMx'])
+        .map(item => ({
+          parentType: feeRateParentTypeMap[getValue(item, ['_Qflb'])] || '',
+          type: feeRateValueMap[getValue(item, ['_Bm'])] || '',
+          value: getValue(item, ['_Fl'])
+        }));
+      // 提取费率参数数据
+      const paramItems = arrayValue(feeRateSrc, ['JjFlx', '_JjFlxMx'])
+        .map(item => ({
+          
+        }));
+      return {
+
+      };
     }
 
     // 提取单位工程数据
     function setupTender(projectSrc, tenderSrc) {
+      const feeRateSrc = getValue(tenderSrc, ['Qfxx']);
       return {
         name: getValue(tenderSrc, ['_Dwgcmc']),
         feature: setupFeature(projectSrc, tenderSrc),
+        feeRate: setupFeeRate(feeRateSrc),
       }
     }
 

+ 2 - 0
web/building_saas/standard_interface/import/base.js

@@ -39,6 +39,8 @@ const INTERFACE_EXPORT_BASE = (() => {
 
   /*
    * 根据字段数组获得所要字段的值 eg: 要获取标段下的单项工程: ['标段', '单项工程'];
+   * 属性需要加前缀:“_”
+   * 节点的不需要加前缀
    * @param {Object}source 源数据
    *        {Array}fields 字段数组
    * @return {String}