Browse Source

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

TonyKang 5 years ago
parent
commit
56f063be23

+ 5 - 1
config/gulpConfig.js

@@ -181,7 +181,11 @@ module.exports = {
         'web/building_saas/main/js/views/material_calc_view.js',
         'web/building_saas/main/js/views/material_calc_view.js',
         'web/building_saas/main/js/views/electrovalence_view.js',
         'web/building_saas/main/js/views/electrovalence_view.js',
         'web/building_saas/main/js/views/divide_view.js',
         'web/building_saas/main/js/views/divide_view.js',
-        'public/web/storageUtil.js'
+        'public/web/storageUtil.js',
+        'web/building_saas/standard_interface/config.js',
+        'web/building_saas/standard_interface/index.js',
+        'web/building_saas/standard_interface/export/base.js',
+        'web/building_saas/standard_interface/export/view.js'
     ],
     ],
     compleGlj_css: [
     compleGlj_css: [
         'lib/jquery-contextmenu/jquery.contextMenu.css',
         'lib/jquery-contextmenu/jquery.contextMenu.css',

File diff suppressed because it is too large
+ 2 - 0
lib/md5/md5.min.js


+ 3 - 3
modules/main/facade/project_facade.js

@@ -302,7 +302,7 @@ async function getBudgetSummayDatas(projectIDs, userID, compilationID, overWrite
     };
     };
     return result;
     return result;
   } catch (e) {
   } catch (e) {
-    console.log(e)
+    console.log(e.message)
   }
   }
 }
 }
 
 
@@ -316,8 +316,8 @@ function getReportData(nameList, items, prjTypeNames, compilationScopes, decimal
     overWrite = require("../../.." + overWriteUrl);
     overWrite = require("../../.." + overWriteUrl);
   }
   }
   setChildrenDatas(items, datas);
   setChildrenDatas(items, datas);
-  recalcTotalItem(one_to_four_Item, datas, isProgressiveType, progressiveInterval);
-  recalcTotalItem(totalItem, datas, isProgressiveType, progressiveInterval);
+  if (one_to_four_Item) recalcTotalItem(one_to_four_Item, datas, isProgressiveType, progressiveInterval);
+  if (totalItem) recalcTotalItem(totalItem, datas, isProgressiveType, progressiveInterval);
   for (let d of datas) {
   for (let d of datas) {
     if (d.billsTtlPrice && totalItem.billsTtlPrice) {
     if (d.billsTtlPrice && totalItem.billsTtlPrice) {
       d['各项费用比例'] = scMathUtil.roundForObj(d.billsTtlPrice / totalItem.billsTtlPrice * 100, 2)
       d['各项费用比例'] = scMathUtil.roundForObj(d.billsTtlPrice / totalItem.billsTtlPrice * 100, 2)

+ 1 - 0
modules/main/routes/main_route.js

@@ -42,6 +42,7 @@ module.exports =function (app) {
                     {
                     {
                         userAccount: req.session.userAccount,
                         userAccount: req.session.userAccount,
                         userID: req.session.sessionUser.id,
                         userID: req.session.sessionUser.id,
+                        userName: req.session.sessionUser.username,
                         projectData: projectData,
                         projectData: projectData,
                         compilationName: req.session.sessionCompilation.name,
                         compilationName: req.session.sessionCompilation.name,
                         versionName: req.session.compilationVersion,
                         versionName: req.session.compilationVersion,

File diff suppressed because it is too large
+ 1133 - 998
modules/ration_glj/facade/ration_glj_facade.js


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

@@ -39,6 +39,7 @@
         let lockBills = '<%- projectData.property.lockBills %>';
         let lockBills = '<%- projectData.property.lockBills %>';
         let userAccount = '<%- userAccount %>';
         let userAccount = '<%- userAccount %>';
         let userID = '<%- userID %>';
         let userID = '<%- userID %>';
+        const USER_NAME = '<%- userName %>';
         let projectReadOnly = JSON.parse('<%- projectReadOnly %>');
         let projectReadOnly = JSON.parse('<%- projectReadOnly %>');
         let projectCooperate = JSON.parse('<%- projectCooperate %>');
         let projectCooperate = JSON.parse('<%- projectCooperate %>');
         let projectOptins =  JSON.parse('<%- options %>');
         let projectOptins =  JSON.parse('<%- options %>');
@@ -2025,6 +2026,7 @@
     <script src="/lib/lz-string/lz-string.min.js"></script>
     <script src="/lib/lz-string/lz-string.min.js"></script>
     <script src="/lib/fileSaver/FileSaver.min.js"></script>
     <script src="/lib/fileSaver/FileSaver.min.js"></script>
     <script type="text/javascript" src="/lib/jspdf/jspdf.min.js"></script>
     <script type="text/javascript" src="/lib/jspdf/jspdf.min.js"></script>
+    <script src="/lib/md5/md5.min.js"></script>
     <!-- inject:js -->
     <!-- inject:js -->
     <!--<script type="text/javascript" src="/test/tmp_data/test_ration_calc/ration_calc_base.js"></script>-->
     <!--<script type="text/javascript" src="/test/tmp_data/test_ration_calc/ration_calc_base.js"></script>-->
     <script src="/lib/pinyinjs/pinyin_dict_firstletter.js"></script>
     <script src="/lib/pinyinjs/pinyin_dict_firstletter.js"></script>

File diff suppressed because it is too large
+ 687 - 643
web/building_saas/main/js/models/fee_rate.js


File diff suppressed because it is too large
+ 1485 - 993
web/building_saas/main/js/views/config_material_view.js


+ 68 - 15
web/building_saas/standard_interface/export/anhui_maanshan.js

@@ -23,6 +23,7 @@ INTERFACE_EXPORT = (() => {
                 getValueByKey,
                 getValueByKey,
                 getHan,
                 getHan,
                 getFee,
                 getFee,
+                generateHardwareId,
             },
             },
             Element,
             Element,
         } = INTERFACE_EXPORT_BASE;
         } = INTERFACE_EXPORT_BASE;
@@ -30,7 +31,6 @@ INTERFACE_EXPORT = (() => {
         const {
         const {
             EXPORT_KIND: { BID_INVITATION, BID_SUBMISSION, CONTROL },
             EXPORT_KIND: { BID_INVITATION, BID_SUBMISSION, CONTROL },
             fixedFlag,
             fixedFlag,
-            SourceType,
             RationType,
             RationType,
         } = window.commonConstants
         } = window.commonConstants
 
 
@@ -287,6 +287,7 @@ INTERFACE_EXPORT = (() => {
                 { name: 'Code', value: `F${row}` }, // 行引用
                 { name: 'Code', value: `F${row}` }, // 行引用
                 { name: 'Jsgs', value: node.data.calcBase }, // 计算基数
                 { name: 'Jsgs', value: node.data.calcBase }, // 计算基数
                 { name: 'Lb', value: BillsTitleType[node.getFlag()], type: TYPE.INT }, // 类别
                 { name: 'Lb', value: BillsTitleType[node.getFlag()], type: TYPE.INT }, // 类别
+                { name: 'Bz', value: node.data.remark }, // 备注
             ];
             ];
             Element.call(this, 'QdBt', attrs);
             Element.call(this, 'QdBt', attrs);
         }
         }
@@ -296,7 +297,7 @@ INTERFACE_EXPORT = (() => {
             const row = node.row();
             const row = node.row();
             const attrs = [
             const attrs = [
                 { name: 'Xh', value: row, type: TYPE.INT }, // 序号
                 { name: 'Xh', value: row, type: TYPE.INT }, // 序号
-                { name: 'Qdbm', value: node.data.code }, // 编码
+                { name: 'Qdbm', value: node.data.code, minLen: 1 }, // 编码
                 { name: 'Name', value: node.data.name }, // 名称
                 { name: 'Name', value: node.data.name }, // 名称
                 { name: 'Dw', value: node.data.unit }, // 单位
                 { name: 'Dw', value: node.data.unit }, // 单位
                 { name: 'Sl', value: node.data.quantity, type: TYPE.DECIMAL }, // 工程量
                 { name: 'Sl', value: node.data.quantity, type: TYPE.DECIMAL }, // 工程量
@@ -443,18 +444,23 @@ INTERFACE_EXPORT = (() => {
                 { name: 'Sl', value: BID_INVITATION ? '0' : glj.quantity, type: TYPE.DECIMAL }, // 工程量
                 { name: 'Sl', value: BID_INVITATION ? '0' : glj.quantity, type: TYPE.DECIMAL }, // 工程量
                 { name: 'Dj', value: glj.marketPrice, type: TYPE.DECIMAL }, // 暂定价、单价
                 { name: 'Dj', value: glj.marketPrice, type: TYPE.DECIMAL }, // 暂定价、单价
                 { name: 'Hj', value: BID_INVITATION ? '0' : glj.totalPrice, type: TYPE.DECIMAL }, // 合价
                 { name: 'Hj', value: BID_INVITATION ? '0' : glj.totalPrice, type: TYPE.DECIMAL }, // 合价
-                { name: 'Bz', value: glj.remark, type: TYPE.DECIMAL }, // 备注
+                { name: 'Bz', value: glj.remark }, // 备注
             ];
             ];
             Element.call(this, eleName, attrs);
             Element.call(this, eleName, attrs);
         }
         }
-        
+
         // 人材机汇总
         // 人材机汇总
         function Rcjhz() {
         function Rcjhz() {
             Element.call(this, 'Rcjhz');
             Element.call(this, 'Rcjhz');
         }
         }
-        
+
         // 人材机汇总明细
         // 人材机汇总明细
         function RcjhzMx(glj) {
         function RcjhzMx(glj) {
+            const rootTypeReg = /\d/;
+            let rootType = rootTypeReg.exec(glj.type)[0];
+            if (!['1', '2', '3'].includes(rootType)) {
+                rootType = '2'; 
+            }
             const attrs = [
             const attrs = [
                 { name: 'RcjId', value: projectGLJIDToRcjID[glj.id] }, // 资源ID
                 { name: 'RcjId', value: projectGLJIDToRcjID[glj.id] }, // 资源ID
                 { name: 'Bm', value: glj.code }, // 编码
                 { name: 'Bm', value: glj.code }, // 编码
@@ -466,14 +472,43 @@ INTERFACE_EXPORT = (() => {
                 { name: 'Hj', value: glj.totalPrice, type: TYPE.DECIMAL }, // 合价,人材料总消耗量*预算价
                 { name: 'Hj', value: glj.totalPrice, type: TYPE.DECIMAL }, // 合价,人材料总消耗量*预算价
                 { name: 'Cd', value: '' }, // 产地
                 { name: 'Cd', value: '' }, // 产地
                 { name: 'Gycs', value: '' }, // 厂商
                 { name: 'Gycs', value: '' }, // 厂商
-                { name: 'Rcjlb', value: '', type: TYPE.INT }, // 人材机类型 1=人工;2=材料;3=机械
+                { name: 'Rcjlb', value: rootType, type: TYPE.INT }, // 人材机类型 1=人工;2=材料;3=机械
                 { name: 'Jgbz', value: 'false', type: TYPE.BOOL }, // 供材方
                 { name: 'Jgbz', value: 'false', type: TYPE.BOOL }, // 供材方
                 { name: 'Zyclbj', value: !!glj.is_main_material, type: TYPE.BOOL }, // 主要材料
                 { name: 'Zyclbj', value: !!glj.is_main_material, type: TYPE.BOOL }, // 主要材料
                 { name: 'Zgjbz', value: !!glj.is_evaluate, type: TYPE.BOOL }, // 是否暂估
                 { name: 'Zgjbz', value: !!glj.is_evaluate, type: TYPE.BOOL }, // 是否暂估
                 { name: 'Zcbz', value: 'false', type: TYPE.BOOL }, // 主材标记
                 { name: 'Zcbz', value: 'false', type: TYPE.BOOL }, // 主材标记
-            ]
+            ];
             Element.call(this, 'RcjhzMx', attrs);
             Element.call(this, 'RcjhzMx', attrs);
         }
         }
+
+        // 配比组成
+        function PbZc() {
+            Element.call(this, 'PbZc');
+        }
+
+        // 配比明细
+        function PbZcMx(ratio) {
+            const attrs = [
+                { name: 'RcjId', value: projectGLJIDToRcjID[ratio.projectGLJID] }, // 组成物对应人材机汇总的资源ID
+                { name: 'Sl', value: ratio.consumption, type: TYPE.DECIMAL }, // 组成物消耗量
+            ];
+            Element.call(this, 'PbZcMx', attrs);
+        }
+        
+        // 校验信息
+        function Jyxx(cpuID, diskID, macID, toMD5Value) {
+            const attrs = [
+                { name: 'SoftName', value: '纵横创新软件有限公司' }, // 公司名
+                { name: 'SoftNum', value: md5(toMD5Value) }, // 校验数据
+                { name: 'MacAdress', value: macID }, // mac地址
+                { name: 'DogNum', value: userID }, // 加密锁号,取用户ID
+                { name: 'ComputerName', value: USER_NAME }, // 计算机名,取用户名称
+                { name: 'HDDSerial', value: diskID }, // 硬盘序列号
+                { name: 'CPUSerial', value: cpuID }, // CPU序列号
+            ];
+            Element.call(this, 'Jyxx', attrs);
+        }
+
         // 组装数据 --------------------------------------
         // 组装数据 --------------------------------------
 
 
         // 组装建设项目数据
         // 组装建设项目数据
@@ -500,7 +535,13 @@ INTERFACE_EXPORT = (() => {
                 }
                 }
                 midLayerMap[midLayerKey].children.push(setupTender(tenderData, feature));
                 midLayerMap[midLayerKey].children.push(setupTender(tenderData, feature));
             }
             }
+            // 校验信息
+            const [cpuID, diskID, macID] = generateHardwareId().split(';');
             const suffix = INTERFACE_CONFIG[areaKey]['fileSuffix'][exportKind];
             const suffix = INTERFACE_CONFIG[areaKey]['fileSuffix'][exportKind];
+            // 需要md5的值:MD5(“WHGLZTB”+项目名称+机器码+加密锁锁号)机器码取mac地址,加密锁锁号取用户账号id
+            const toMD5Suffix = suffix.split('.')[1];
+            const toMD5Value = `${toMD5Suffix}${constructionData.name}${macID}${userID}`;
+            jingJiBiao.children.push(new Jyxx(cpuID, diskID, macID, suffix, toMD5Value));
             return [{
             return [{
                 data: jingJiBiao,
                 data: jingJiBiao,
                 exportKind,
                 exportKind,
@@ -525,7 +566,8 @@ INTERFACE_EXPORT = (() => {
             const dwgcxx = new Dwgcxx(tenderData.name, feature);
             const dwgcxx = new Dwgcxx(tenderData.name, feature);
             dwgcxx.children.push(
             dwgcxx.children.push(
                 setupFeeRate(curDetail.FeeRate),
                 setupFeeRate(curDetail.FeeRate),
-                setupBills(curDetail.mainTree)
+                setupBills(curDetail.mainTree),
+                ...setupGLJList(curDetail)
             );
             );
             return dwgcxx;
             return dwgcxx;
         }
         }
@@ -667,21 +709,32 @@ INTERFACE_EXPORT = (() => {
         }
         }
 
 
         // 组装人材机汇总相关表数据
         // 组装人材机汇总相关表数据
-        function setupGLJList() {
+        function setupGLJList(tenderDetail) {
             // 暂估材料
             // 暂估材料
             const zgcl = new gljRefRoot('ZgCl');
             const zgcl = new gljRefRoot('ZgCl');
-            const zgclData = curDetail.evaluateMaterialData.map(glj => new gljRefElement('ZgClMx', glj));
-            zgcl.children.push(...zgclData);
-            
+            zgcl.children = tenderDetail.evaluateMaterialData.map(glj => new gljRefElement('ZgClMx', glj));
+
             // 评标材料
             // 评标材料
             const jpcl = new gljRefRoot('JpCl');
             const jpcl = new gljRefRoot('JpCl');
-            const jpclData = curDetail.bidMaterialData.map(glj => new gljRefElement('JpClMx', glj));
-            jpcl.children.push(...jpclData);
-            if (BID_INVITATION) {
+            jpcl.children = tenderDetail.bidMaterialData.map(glj => new gljRefElement('JpClMx', glj));
+            if (isBidInvitation) {
                 return [zgcl, jpcl];
                 return [zgcl, jpcl];
             }
             }
             // 人材机汇总 (招标不导出)
             // 人材机汇总 (招标不导出)
             const rcjhz = new Rcjhz();
             const rcjhz = new Rcjhz();
+            rcjhz.children = tenderDetail.projectGLJ.datas.gljList.map(pGLJ => {
+                const gljElement = new RcjhzMx(pGLJ);
+                // 组成物
+                const connectKey = gljUtil.getIndex(pGLJ, gljKeyArray);
+                const ratioData = tenderDetail.projectGLJ.datas.mixRatioMap[connectKey];
+                if (ratioData && ratioData.length) {
+                    const pbzc = new PbZc();
+                    pbzc.children = ratioData.map(ratio => new PbZcMx(ratio));
+                    gljElement.children.push(pbzc);
+                }
+                return gljElement;
+            });
+            return [zgcl, jpcl, rcjhz];
         }
         }
 
 
         return setupConstruction(projectData);
         return setupConstruction(projectData);

+ 22 - 2
web/building_saas/standard_interface/export/base.js

@@ -159,6 +159,14 @@ const INTERFACE_EXPORT_BASE = (() => {
                     ? DEFAULT_VALUE[data.type]
                     ? DEFAULT_VALUE[data.type]
                     : ''
                     : ''
                 : String(data.value);
                 : String(data.value);
+            // 如果有限定最少长度,则当长度不够时,自动凑
+            const autoStr = '1';
+            if (data.minLen && data.value.length < data.minLen) {
+                let diff = data.minLen - data.value.length;
+                while (diff--) {
+                    data.value += autoStr;
+                }
+            }
             if (data.whiteSpace && data.whiteSpace === WHITE_SPACE.COLLAPSE) {  //处理空格相关
             if (data.whiteSpace && data.whiteSpace === WHITE_SPACE.COLLAPSE) {  //处理空格相关
                 data.value = data.value.replace(/[\r\n\t]/g, ' ');
                 data.value = data.value.replace(/[\r\n\t]/g, ' ');
                 data.value = data.value.trim();
                 data.value = data.value.trim();
@@ -728,12 +736,24 @@ const INTERFACE_EXPORT_BASE = (() => {
             // 计算合价:人材料总消耗量*预算价
             // 计算合价:人材料总消耗量*预算价
             glj.priceInfo.totalPrice = scMathUtil.roundForObj(glj.priceInfo.tenderPrice * glj.tenderQuantity, 2);
             glj.priceInfo.totalPrice = scMathUtil.roundForObj(glj.priceInfo.tenderPrice * glj.tenderQuantity, 2);
         });
         });
+        // 为了方便后续导出处理,给组成物数据设置上对应项目人材机ID
+        const connectKeyMap = {};
+        projectGLJList.forEach(pGLJ => connectKeyMap[gljUtil.getIndex(pGLJ, gljKeyArray)] = pGLJ.id);
+        const ratiosArr = Object.values(tenderDetail.projectGLJ.datas.mixRatioMap);
+        ratiosArr.forEach(ratios => {
+            ratios.forEach(ratio => {
+                const ratioKey = gljUtil.getIndex(ratio, gljKeyArray);
+                const projectGLJID = connectKeyMap[ratioKey];
+                if (projectGLJID) {
+                    ratio.projectGLJID = projectGLJID;
+                }
+            });
+        });
+
         // 获取暂估价材料数据,getData原始数据evaluate_list.datas里的数据缺少一些价格数据,需要调用额外接口
         // 获取暂估价材料数据,getData原始数据evaluate_list.datas里的数据缺少一些价格数据,需要调用额外接口
         tenderDetail.evaluateMaterialData = configMaterialObj.getEvaluateMaterialDatas(projectGLJList, evaluateList, decimalInfo);
         tenderDetail.evaluateMaterialData = configMaterialObj.getEvaluateMaterialDatas(projectGLJList, evaluateList, decimalInfo);
         // 获取评标材料数据
         // 获取评标材料数据
         tenderDetail.bidMaterialData = configMaterialObj.getBidMaterialDatas(projectGLJList, bidEvaluationList, decimalInfo);
         tenderDetail.bidMaterialData = configMaterialObj.getBidMaterialDatas(projectGLJList, bidEvaluationList, decimalInfo);
-
-
     }
     }
 
 
     /**
     /**

+ 86 - 6
web/building_saas/standard_interface/export/guangdong_zhongshan.js

@@ -1,7 +1,44 @@
 // INTERFACE_EXPORT =,必须这么写,这样才能在导出时动态加载脚本后,覆盖前端代码
 // INTERFACE_EXPORT =,必须这么写,这样才能在导出时动态加载脚本后,覆盖前端代码
 INTERFACE_EXPORT = (() => {
 INTERFACE_EXPORT = (() => {
   'use strict';
   'use strict';
-
+  const feeRateMap = {
+    '冬季施工增加费': 'DJSGZJFFL',
+    '雨季施工增加费': 'YUJSGZJFFL',
+    '夜间施工增加费': 'YEJSGZJFFL',
+    '高原地区施工增加费': 'GYDQSGZJFFL',
+    '风沙地区施工增加费': 'FSDQSGZJFFL',
+    '沿海地区施工增加费': 'YHDQSGZJFFL',
+    '行车干扰施工增加费': 'XCGRGCSGZJFFL',
+    '工地转移费': 'GDZYFFL',
+    '施工辅助费': 'SGFZFFL',
+    '基本费用': 'JBFYFL',
+    '主副食运费补贴': 'ZFSYFBTFL',
+    '职工探亲费': 'ZGTQLFFL',
+    '职工取暖费': 'ZGQNBTFL',
+    '财务费用': 'CWFYFL',
+    '养老保险费': 'YANGLBXFFL',
+    '失业保险费': 'SYBXFFL',
+    '医疗保险费': 'YILBXFFL',
+    '工伤保险费': 'GSBXFL',
+    '住房公积金': 'ZFGJJFL',
+    '土方': 'TF',
+    '石方': 'SF',
+    '运输': 'YS',
+    '路面': 'LM',
+    '路面(不计雨)': 'LM',
+    '隧道': 'SD',
+    '构造物I': 'GZW1',
+    '构造物I(不计冬)': 'GZW1',
+    '构造物I(不计雨)': 'GZW1',
+    '构造物II': 'GZW2',
+    '构造物III(桥梁)': 'GZW3',
+    '构造物III(除桥以外)': 'GZW3',
+    '构造物III(除桥以外不计雨夜)': 'GZW3',
+    '技术复杂大桥': 'JSFZDQ',
+    '钢材及钢结构(桥梁)': 'GJG',
+    '钢材及钢结构(除桥以外)': 'GJG',
+    '钢材及钢结构(除桥以外不计夜)': 'GJG'
+  }
   /**
   /**
    * 
    * 
    * @param {String} areaKey - 地区标识,如:'安徽@马鞍山',有些地区的接口只是取值上有不同,共有一个接口脚本, 需要通过地区标识确定一些特殊处理
    * @param {String} areaKey - 地区标识,如:'安徽@马鞍山',有些地区的接口只是取值上有不同,共有一个接口脚本, 需要通过地区标识确定一些特殊处理
@@ -11,8 +48,6 @@ INTERFACE_EXPORT = (() => {
    * @return {Promise<Array>} - 返回的数据结构必须按照规定:[{ data, exportKind, fileName }],参考web\building_saas\standard_interface\index.js中的注释说明
    * @return {Promise<Array>} - 返回的数据结构必须按照规定:[{ data, exportKind, fileName }],参考web\building_saas\standard_interface\index.js中的注释说明
    */
    */
   async function entry(areaKey, exportKind, projectData, tenderDetailMap) {
   async function entry(areaKey, exportKind, projectData, tenderDetailMap) {
-    console.log(areaKey)
-    //<CprjInfo CprjName="中山接口报错" CprjType="QDYS">
     const {
     const {
       UTIL,
       UTIL,
       Element,
       Element,
@@ -158,17 +193,62 @@ INTERFACE_EXPORT = (() => {
         Element.call(this, 'RateParam', attrs);
         Element.call(this, 'RateParam', attrs);
       }
       }
 
 
+      let RateValues = {
+        name: 'RateValues',
+        attrs: [],
+        children: []
+      }
+
+      function RateValue(CostTypeNo, RateTypeNo) {
+        //<RateParam RateTypeNo="DJSGZJFFL" RateParamNo="0" Ratio="100"/>
+        const attrs = [{
+          name: 'CostTypeNo',
+          value: CostTypeNo
+        }, {
+          name: 'RateTypeNo',
+          value: RateTypeNo
+        }, {
+          name: 'RateValue',
+          value: '0'
+        }];
+        Element.call(this, 'RateValue', attrs);
+      }
 
 
 
 
+      let prefix = "";
+      for (let r of feeRateInfo.rates) {
+        if (!r.ParentID && feeRateMap[r.name]) prefix = feeRateMap[r.name];
+        if (feeRateMap[r.name] && r.ParentID) {
+          RateValues.children.push(new RateValue(prefix, feeRateMap[r.name]));
+        }
+      }
+
+      this.children.push(RateValues);
+
     }
     }
 
 
+    function Pract(fileName) {
+      //<RateParam RateTypeNo="DJSGZJFFL" RateParamNo="0" Ratio="100"/>
+      const attrs = [{
+        name: 'PractNo',
+        value: 1
+      }, {
+        name: 'Name',
+        value: fileName
+      }];
+      Element.call(this, 'Pract', attrs);
+
+
+
+    }
 
 
     let data = new CprjInfo(projectData.name);
     let data = new CprjInfo(projectData.name);
     data.children.push(new SystemInfo());
     data.children.push(new SystemInfo());
     data.children.push(new CostBasis());
     data.children.push(new CostBasis());
-    let feeRataDatas = tenderDetailMap[projectObj.project.ID()].FeeRate.datas;
+    let tenderProject = tenderDetailMap[projectObj.project.ID()];
+    let feeRataDatas = tenderProject.FeeRate.datas;
     data.children.push(new Rate(feeRataDatas));
     data.children.push(new Rate(feeRataDatas));
-
+    let property = tenderProject
 
 
 
 
 
 
@@ -180,6 +260,6 @@ INTERFACE_EXPORT = (() => {
 
 
   }
   }
   return {
   return {
-    entry,
+    entry
   };
   };
 })();
 })();

+ 143 - 64
web/over_write/js/quanguo_2018.js

@@ -1,79 +1,158 @@
 const progression = [];
 const progression = [];
 const deficiency = {};
 const deficiency = {};
 if (typeof module !== 'undefined' && !module.nodeType) {
 if (typeof module !== 'undefined' && !module.nodeType) {
-    module.exports = {
-        progression,
-        deficiency
-    };
+  module.exports = {
+    progression,
+    deficiency
+  };
 }
 }
 
 
 
 
 let isQG2018 = true;
 let isQG2018 = true;
+
 function overwriteRationCalcBases() {
 function overwriteRationCalcBases() {
-    if (typeof rationCalcBases == 'undefined') return;
-    for (let key in rationCalcBases) delete rationCalcBases[key];
+  if (typeof rationCalcBases == 'undefined') return;
+  for (let key in rationCalcBases) delete rationCalcBases[key];
 
 
-    rationCalcBases['人工费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptMarketPrice, isTender);
-    };
-    rationCalcBases['材料费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptMarketPrice, isTender);
-    };
-    rationCalcBases['施工机械使用费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender);
-    };
-    rationCalcBases['施工机械人工费'] = function (node, isTender) {
-        return calcTools.machineDetailFee(node, node.data.gljList, [], gljType.MACHINE_LABOUR, isTender);
-    };
-    rationCalcBases['设备购置费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice, isTender);
-    };
+  rationCalcBases['人工费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptMarketPrice, isTender);
+  };
+  rationCalcBases['材料费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptMarketPrice, isTender);
+  };
+  rationCalcBases['施工机械使用费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender);
+  };
+  rationCalcBases['施工机械人工费'] = function (node, isTender) {
+    return calcTools.machineDetailFee(node, node.data.gljList, [], gljType.MACHINE_LABOUR, isTender);
+  };
+  rationCalcBases['设备购置费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice, isTender);
+  };
 
 
-    rationCalcBases['定额人工费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice, isTender);
-    };
-    rationCalcBases['定额材料费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice, isTender);
-    };
-    rationCalcBases['定额施工机械使用费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptBasePrice, isTender);
-    };
-    rationCalcBases['定额商品砼费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR], priceTypes.ptBasePrice, isTender);
-    };
-    rationCalcBases['定额设备费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptBasePrice, isTender);
-    };
-    rationCalcBases['定额外购砼构件费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.PURCHASE_COMPONENT], priceTypes.ptBasePrice, isTender);
-    };
-    rationCalcBases['定额绿化苗木费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.GREEN_SEEDLING], priceTypes.ptBasePrice, isTender);
-    };
+  rationCalcBases['定额人工费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额材料费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额施工机械使用费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额商品砼费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR], priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额设备费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额外购砼构件费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.PURCHASE_COMPONENT], priceTypes.ptBasePrice, isTender);
+  };
+  rationCalcBases['定额绿化苗木费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.GREEN_SEEDLING], priceTypes.ptBasePrice, isTender);
+  };
 };
 };
 
 
 (function overwriteFeeTypes() {
 (function overwriteFeeTypes() {
-    if (typeof cpFeeTypes == 'undefined') return;
-    cpFeeTypes = [
-        { type: 'marketLabour', name: '人工费' },
-        { type: 'marketMaterial', name: '材料费' },
-        { type: 'marketMachine', name: '施工机械使用费' },
-        { type: 'marketMachineLabour', name: '施工机械人工费' },
-        { type: 'marketEquipment', name: '设备购置费' },
-        { type: 'marketDirect', name: '直接费' },
+  if (typeof cpFeeTypes == 'undefined') return;
+  cpFeeTypes = [{
+      type: 'marketLabour',
+      name: '人工费'
+    },
+    {
+      type: 'marketMaterial',
+      name: '材料费'
+    },
+    {
+      type: 'marketMachine',
+      name: '施工机械使用费'
+    },
+    {
+      type: 'marketMachineLabour',
+      name: '施工机械人工费'
+    },
+    {
+      type: 'marketEquipment',
+      name: '设备购置费'
+    },
+    {
+      type: 'marketDirect',
+      name: '直接费'
+    },
+
+    {
+      type: 'labour',
+      name: '定额人工费'
+    },
+    {
+      type: 'material',
+      name: '定额材料费'
+    },
+    {
+      type: 'machine',
+      name: '定额施工机械使用费'
+    },
+    {
+      type: 'equipment',
+      name: '定额设备费'
+    },
+    {
+      type: 'direct',
+      name: '定额直接费'
+    },
+
+    {
+      type: 'measure',
+      name: '措施费'
+    },
+    {
+      type: 'manage',
+      name: '企业管理费'
+    },
+    {
+      type: 'force',
+      name: '规费'
+    },
+    {
+      type: 'profit',
+      name: '利润'
+    },
+    {
+      type: 'tax',
+      name: '税金'
+    },
+    {
+      type: 'common',
+      name: '建安费'
+    },
+    {
+      type: 'rationCommon',
+      name: '定额建安费'
+    }
+  ];
+})();
+
+// 在新建分段的时候需要隐藏养护类别和费用标准
+if (typeof $ !== 'undefined') { // 后端也有引用这个文件,后端引用时$没有定义会报错
+  $(document).ready(function () {
+    $('#tender-engineering-group').hide();
+    $('#tender-feeStandard-group').hide();
+  });
+}
 
 
-        { type: 'labour', name: '定额人工费' },
-        { type: 'material', name: '定额材料费' },
-        { type: 'machine', name: '定额施工机械使用费' },
-        { type: 'equipment', name: '定额设备费' },
-        { type: 'direct', name: '定额直接费' },
 
 
-        { type: 'measure', name: '措施费' },
-        { type: 'manage', name: '企业管理费' },
-        { type: 'force', name: '规费' },
-        { type: 'profit', name: '利润' },
-        { type: 'tax', name: '税金' },
-        { type: 'common', name: '建安费' },
-        { type: 'rationCommon', name: '定额建安费' }
-    ];
-})();
+//全国工地转移、综合里程费率值修改特殊处理
+if (typeof feeRateObject !== 'undefined') {
+  feeRateObject.feeRateSpecialHandle = function (subRate, value) {
+    let result = {};
+    if (subRate.name == "工地转移(km)" && value && value < 50) { //工地转移50km以内按50km算
+      result.valueKey = "50";
+      result.value = scMathUtil.roundForObj(value, getDecimal("feeRate")); //设置显示的节点值
+    }
+    if (subRate.name == "综合里程(km)" && value && value < 3) { //综合里程3km以内按3km算
+      result.valueKey = "3";
+      result.value = scMathUtil.roundForObj(value, getDecimal("feeRate")); //设置显示的节点值
+    }
+    return result;
+  }
+}

+ 283 - 225
web/over_write/js/shandong_2016.js

@@ -1,248 +1,306 @@
 let isSD2016 = true;
 let isSD2016 = true;
+
 function overwriteRationCalcBases() {
 function overwriteRationCalcBases() {
-    if (typeof rationCalcBases == 'undefined') return;
-    for (let key in rationCalcBases) delete rationCalcBases[key];
+  if (typeof rationCalcBases == 'undefined') return;
+  for (let key in rationCalcBases) delete rationCalcBases[key];
 
 
-    rationCalcBases['人工费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptMarketPrice, isTender);
-    };
-    rationCalcBases['材料费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptMarketPrice, isTender);
-    };
-    rationCalcBases['施工机械使用费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender);
-    };
-    rationCalcBases['商品砼费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR], priceTypes.ptMarketPrice, isTender);
-    };
-    rationCalcBases['外购砼构件费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.PURCHASE_COMPONENT], priceTypes.ptMarketPrice, isTender);
-    };
+  rationCalcBases['人工费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptMarketPrice, isTender);
+  };
+  rationCalcBases['材料费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptMarketPrice, isTender);
+  };
+  rationCalcBases['施工机械使用费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender);
+  };
+  rationCalcBases['商品砼费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR], priceTypes.ptMarketPrice, isTender);
+  };
+  rationCalcBases['外购砼构件费'] = function (node, isTender) {
+    return calcTools.rationBaseFee(node, [gljType.PURCHASE_COMPONENT], priceTypes.ptMarketPrice, isTender);
+  };
 };
 };
 
 
 (function overwriteFeeTypes() {
 (function overwriteFeeTypes() {
-    if (typeof cpFeeTypes == 'undefined') return;
-    cpFeeTypes = [
-        { type: 'marketDirect', name: '直接费' },
-        { type: 'marketDirectWork', name: '直接工程费' },
-        { type: 'marketLabour', name: '人工费' },
-        { type: 'marketMaterial', name: '材料费' },
-        { type: 'marketMachine', name: '施工机械使用费' },
-        { type: 'otherFee', name: '其他工程费' },
-        { type: 'otherFee1', name: '其他工程费I' },
-        { type: 'otherFee2', name: '其他工程费II' },
-        { type: 'indirectFee', name: '间接费' },
-        { type: 'manage', name: '企业管理费' },
-        { type: 'force', name: '规费' },
-        { type: 'profit', name: '利润' },
-        { type: 'tax', name: '税金' },
-        { type: 'common', name: '建安费' }
-    ];
+  if (typeof cpFeeTypes == 'undefined') return;
+  cpFeeTypes = [{
+      type: 'marketDirect',
+      name: '直接费'
+    },
+    {
+      type: 'marketDirectWork',
+      name: '直接工程费'
+    }, {
+      type: 'marketLabour',
+      name: '人工费'
+    },
+    {
+      type: 'marketMaterial',
+      name: '材料费'
+    },
+    {
+      type: 'marketMachine',
+      name: '施工机械使用费'
+    },
+    {
+      type: 'otherFee',
+      name: '其他工程费'
+    },
+    {
+      type: 'otherFee1',
+      name: '其他工程费I'
+    },
+    {
+      type: 'otherFee2',
+      name: '其他工程费II'
+    },
+    {
+      type: 'indirectFee',
+      name: '间接费'
+    },
+    {
+      type: 'manage',
+      name: '企业管理费'
+    },
+    {
+      type: 'force',
+      name: '规费'
+    },
+    {
+      type: 'profit',
+      name: '利润'
+    },
+    {
+      type: 'tax',
+      name: '税金'
+    },
+    {
+      type: 'common',
+      name: '建安费'
+    }
+  ]
 })();
 })();
 
 
 // 清单基数
 // 清单基数
 const progression = ['养护工程管理费', '养护工程设计费'];
 const progression = ['养护工程管理费', '养护工程设计费'];
 const deficiency = {};
 const deficiency = {};
 if (typeof baseFigureMap !== 'undefined') {
 if (typeof baseFigureMap !== 'undefined') {
-    const { fixedFlag } = commonConstants;
-    const budgetMap = {
-        // 显示:除清单固定类别是“建筑安装工程费”的以外部分可显示。
-        '建筑安装工程费': {
-            base: 'JZAZGCF',
-            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
-            filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
-            pick: false,
-        },
-        // 显示:仅清单固定类别是“安全生产费”的可显示。
-        '建筑安装工程费(不含设备费)': {
-            base: 'JZAZGCFBHSB',
-            fixedFlag: null,
-            filter: [fixedFlag.SAFE_COST],
-            pick: true
-        },
-        // 显示:除清单固定类别是“建筑安装工程费”、“土地使用及拆迁补偿费”的以外部分可显示。
-        '土地使用及拆迁补偿费': {
-            base: 'TDSYJCQBCF',
-            fixedFlag: fixedFlag.LAND_USED_DEMOLITION,
-            filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION],
-            pick: false,
-        },
-        // 显示:除清单固定类别是“建筑安装工程费”、“土地使用及拆迁补偿费”、“工程建设其他费用”的以外部分可显示。
-        '工程建设其他费用': {
-            base: 'GCJSQTFY',
-            fixedFlag: fixedFlag.MAINTENANCE_EXPENSES,
-            filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION, fixedFlag.MAINTENANCE_EXPENSES],
-            pick: false,
-        },
-        // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
-        '养护工程管理费': {
-            isProgressive: true,
-            base: 'YHGCGLF',
-            fixedFlag: null,
-            filter: [fixedFlag.MAINTENANCE_EXPENSES],
-            pick: true,
-        },
-        // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
-        '养护工程设计费': {
-            isProgressive: true,
-            base: 'YHGCSJF',
-            fixedFlag: null,
-            filter: [fixedFlag.MAINTENANCE_EXPENSES],
-            pick: true,
-        },
-        // 显示:仅“价差预备费”可显示
-        '价差预备费': {
-            base: 'JCYBF',
-            fixedFlag: null,
-            filter: [fixedFlag.SPREAD_BUDGET_FEE],
-            pick: true,
-        },
-    };
-    const boqMap = {
-        //仅允许用于固定类别是“第100章至700章清单”以外的清单
-        '各章清单合计': {
-            base: 'GZQDHJ',
-            fixedFlag: fixedFlag.ONE_SEVEN_BILLS,
-            filter: [fixedFlag.ONE_SEVEN_BILLS],
-            pick: false
-        },
-        //仅允许用于固定类别是“第100章至700章清单”以外的清单
-        '专项暂定合计': {
-            base: 'ZXZDHJ',
-            fixedFlag: null,
-            filter: [fixedFlag.ONE_SEVEN_BILLS],
-            pick: false
-        },
-        /*
-        *  清单固定行[第100章至700章清单]下的[第100章清单]需要允许清单可使用基数{100章以外合计}
-        *  因此{100章以外合计}不设置关联的清单固定行
-        * */
-        //仅允许用于固定类别为“100章清单”引用
-        '100章以外清单合计': {
-            base: 'YBZYHQDHJ',
-            fixedFlag: null,
-            filter: [fixedFlag.ONE_HUNDRED_BILLS],
-            pick: true
-        }
-    };
-    baseFigureMap.budget = budgetMap;
-    baseFigureMap.boq = boqMap;
+  const {
+    fixedFlag
+  } = commonConstants;
+  const budgetMap = {
+    // 显示:除清单固定类别是“建筑安装工程费”的以外部分可显示。
+    '建筑安装工程费': {
+      base: 'JZAZGCF',
+      fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+      filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
+      pick: false,
+    },
+    // 显示:仅清单固定类别是“安全生产费”的可显示。
+    '建筑安装工程费(不含设备费)': {
+      base: 'JZAZGCFBHSB',
+      fixedFlag: null,
+      filter: [fixedFlag.SAFE_COST],
+      pick: true
+    },
+    // 显示:除清单固定类别是“建筑安装工程费”、“土地使用及拆迁补偿费”的以外部分可显示。
+    '土地使用及拆迁补偿费': {
+      base: 'TDSYJCQBCF',
+      fixedFlag: fixedFlag.LAND_USED_DEMOLITION,
+      filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION],
+      pick: false,
+    },
+    // 显示:除清单固定类别是“建筑安装工程费”、“土地使用及拆迁补偿费”、“工程建设其他费用”的以外部分可显示。
+    '工程建设其他费用': {
+      base: 'GCJSQTFY',
+      fixedFlag: fixedFlag.MAINTENANCE_EXPENSES,
+      filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION, fixedFlag.MAINTENANCE_EXPENSES],
+      pick: false,
+    },
+    // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
+    '养护工程管理费': {
+      isProgressive: true,
+      base: 'YHGCGLF',
+      fixedFlag: null,
+      filter: [fixedFlag.MAINTENANCE_EXPENSES],
+      pick: true,
+    },
+    // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
+    '养护工程设计费': {
+      isProgressive: true,
+      base: 'YHGCSJF',
+      fixedFlag: null,
+      filter: [fixedFlag.MAINTENANCE_EXPENSES],
+      pick: true,
+    },
+    // 显示:仅“价差预备费”可显示
+    '价差预备费': {
+      base: 'JCYBF',
+      fixedFlag: null,
+      filter: [fixedFlag.SPREAD_BUDGET_FEE],
+      pick: true,
+    },
+  };
+  const boqMap = {
+    //仅允许用于固定类别是“第100章至700章清单”以外的清单
+    '各章清单合计': {
+      base: 'GZQDHJ',
+      fixedFlag: fixedFlag.ONE_SEVEN_BILLS,
+      filter: [fixedFlag.ONE_SEVEN_BILLS],
+      pick: false
+    },
+    //仅允许用于固定类别是“第100章至700章清单”以外的清单
+    '专项暂定合计': {
+      base: 'ZXZDHJ',
+      fixedFlag: null,
+      filter: [fixedFlag.ONE_SEVEN_BILLS],
+      pick: false
+    },
+    /*
+     *  清单固定行[第100章至700章清单]下的[第100章清单]需要允许清单可使用基数{100章以外合计}
+     *  因此{100章以外合计}不设置关联的清单固定行
+     * */
+    //仅允许用于固定类别为“100章清单”引用
+    '100章以外清单合计': {
+      base: 'YBZYHQDHJ',
+      fixedFlag: null,
+      filter: [fixedFlag.ONE_HUNDRED_BILLS],
+      pick: true
+    }
+  };
+  baseFigureMap.budget = budgetMap;
+  baseFigureMap.boq = boqMap;
 }
 }
 
 
 if (typeof baseFigureTemplate !== 'undefined') {
 if (typeof baseFigureTemplate !== 'undefined') {
-    const { fixedFlag } = commonConstants;
-    baseFigureTemplate.budget = {
-        // 建筑安装工程费 算法:取清单固定类别是“建筑安装工程费”的金额。
-        JZAZGCF(tender) {
-            return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'common');
-        },
-        // 土地使用及拆迁补偿费 算法:取清单固定类别是“土地使用及拆迁补偿费”的金额。
-        TDSYJCQBCF(tender) {
-            return cbTools.getBaseFee(fixedFlag.LAND_USED_DEMOLITION, tender, 'common');
-        },
-        // 工程建设其他费用 算法:取清单固定类别是“养护工程其他费用”的金额。
-        GCJSQTFY(tender) {
-            return cbTools.getBaseFee(fixedFlag.MAINTENANCE_EXPENSES, tender, 'common');
-        },
-        // 养护工程管理费 算法:以{建筑安装工程费}为基数,采用累进办法计算
-        YHGCGLF(tender) {
-            const baseFee = this['JZAZGCF'](tender);
-            if (!tender) {
-                calcBase.baseProgressiveFee = baseFee;
-            }
-            return calculateUtil.getProgressiveFee(baseFee, '养护工程管理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
-        },
+  const {
+    fixedFlag
+  } = commonConstants;
+  baseFigureTemplate.budget = {
+    // 建筑安装工程费 算法:取清单固定类别是“建筑安装工程费”的金额。
+    JZAZGCF(tender) {
+      return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'common');
+    },
+    // 土地使用及拆迁补偿费 算法:取清单固定类别是“土地使用及拆迁补偿费”的金额。
+    TDSYJCQBCF(tender) {
+      return cbTools.getBaseFee(fixedFlag.LAND_USED_DEMOLITION, tender, 'common');
+    },
+    // 工程建设其他费用 算法:取清单固定类别是“养护工程其他费用”的金额。
+    GCJSQTFY(tender) {
+      return cbTools.getBaseFee(fixedFlag.MAINTENANCE_EXPENSES, tender, 'common');
+    },
+    // 养护工程管理费 算法:以{建筑安装工程费}为基数,采用累进办法计算
+    YHGCGLF(tender) {
+      const baseFee = this['JZAZGCF'](tender);
+      if (!tender) {
+        calcBase.baseProgressiveFee = baseFee;
+      }
+      return calculateUtil.getProgressiveFee(baseFee, '养护工程管理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
+    },
 
 
-        // 养护工程设计费 算法:以{建筑安装工程费}为基数,采用累进办法计算。
-        YHGCSJF(tender) {
-            const baseFee = this['JZAZGCF'](tender);
-            if (!tender) {
-                calcBase.baseProgressiveFee = baseFee;
-            }
-            return calculateUtil.getProgressiveFee(baseFee, '养护工程设计费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
-        },
-        /*  价差预备费 算法:以建筑安装工程费为基数,按设计文件编制年始至养护项目工程竣工年终的年数和年工程造价增涨率计算。
-            价差预备费 P * [(1+i)^(n-1) -1]
-            P——建筑安装工程费总额(元);
-            i——年工程造价增涨率(%);
-            n——设计文件编制年至养护项目开工年+养护项目建设期限(年)。
-        */
-        JCYBF(tender) {
-            //建筑安装工程费作为基数
-            const installFee = this['JZAZGCF'](tender);
-            //年造价增涨
-            const costGrowthRate = calcBase.project.property.costGrowthRate
-                ? calcBase.project.property.costGrowthRate
-                : 0;
-            //增涨计费年限
-            const growthPeriod = projectObj.project.property.growthPeriod
-                ? calcBase.project.property.growthPeriod
-                : 0;
-            //= P * [(1+i)^(n-1) -1]
-            return (installFee * (Math.pow(1 + costGrowthRate, growthPeriod - 1) - 1)).toDecimal(decimalObj.bills.totalPrice);
-        }
+    // 养护工程设计费 算法:以{建筑安装工程费}为基数,采用累进办法计算。
+    YHGCSJF(tender) {
+      const baseFee = this['JZAZGCF'](tender);
+      if (!tender) {
+        calcBase.baseProgressiveFee = baseFee;
+      }
+      return calculateUtil.getProgressiveFee(baseFee, '养护工程设计费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
+    },
+    /*  价差预备费 算法:以建筑安装工程费为基数,按设计文件编制年始至养护项目工程竣工年终的年数和年工程造价增涨率计算。
+        价差预备费 P * [(1+i)^(n-1) -1]
+        P——建筑安装工程费总额(元);
+        i——年工程造价增涨率(%);
+        n——设计文件编制年至养护项目开工年+养护项目建设期限(年)。
+    */
+    JCYBF(tender) {
+      //建筑安装工程费作为基数
+      const installFee = this['JZAZGCF'](tender);
+      //年造价增涨
+      const costGrowthRate = calcBase.project.property.costGrowthRate ?
+        calcBase.project.property.costGrowthRate :
+        0;
+      //增涨计费年限
+      const growthPeriod = projectObj.project.property.growthPeriod ?
+        calcBase.project.property.growthPeriod :
+        0;
+      //= P * [(1+i)^(n-1) -1]
+      return (installFee * (Math.pow(1 + costGrowthRate, growthPeriod - 1) - 1)).toDecimal(decimalObj.bills.totalPrice);
+    }
+
+  };
 
 
-    };
+  baseFigureTemplate.boq = {
+    //{各章清单合计}
+    // 取清单固定类别是“第100章至700章清单”的金额
+    'GZQDHJ': function (tender) {
+      return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'common');
+    },
+    //{专项暂定合计}
+    // 汇总专项暂定列有值的清单的金额
+    'ZXZDHJ': function (tender) {
+      let rst = 0,
+        feeField = 'common',
+        subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+      let billsData = calcBase.project.Bills.datas,
+        filterData = billsData.filter(function (data) {
+          return data.specialProvisional;
+        });
+      for (let data of filterData) {
+        if (cbTools.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
+          cbTools.isUnDef(data.feesIndex[feeField]) || cbTools.isUnDef(data.feesIndex[feeField][subFeeField])) {
+          continue;
+        }
+        rst += data.feesIndex[feeField][subFeeField];
+      }
+      return rst.toDecimal(decimalObj.bills.totalPrice);
+    },
+    //{100章以外清单合计}
+    // 取清单固定清单[第100章至700章清单]的金额,但扣除清单100章下的金额。
+    // 如果是固定清单[第100章至700章清单]下100章以外清单引用此基数,要排除自身(目前只允许100章的清单使用,所以暂时不需要此判断)
+    'YBZYHQDHJ': function (tender) {
+      let oneToSeven = cbTools.findNodeByFlag(fixedFlag.ONE_SEVEN_BILLS);
+      if (!oneToSeven) {
+        return 0;
+      }
+      //100-700章固定节点的所有子节点
+      let allChildren = [];
 
 
-    baseFigureTemplate.boq = {
-        //{各章清单合计}
-        // 取清单固定类别是“第100章至700章清单”的金额
-        'GZQDHJ': function (tender) {
-            return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'common');
-        },
-        //{专项暂定合计}
-        // 汇总专项暂定列有值的清单的金额
-        'ZXZDHJ': function (tender) {
-            let rst = 0,
-                feeField = 'common',
-                subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            let billsData = calcBase.project.Bills.datas,
-                filterData = billsData.filter(function (data) {
-                    return data.specialProvisional;
-                });
-            for (let data of filterData) {
-                if (cbTools.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
-                    cbTools.isUnDef(data.feesIndex[feeField]) || cbTools.isUnDef(data.feesIndex[feeField][subFeeField])) {
-                    continue;
-                }
-                rst += data.feesIndex[feeField][subFeeField];
-            }
-            return rst.toDecimal(decimalObj.bills.totalPrice);
-        },
-        //{100章以外清单合计}
-        // 取清单固定清单[第100章至700章清单]的金额,但扣除清单100章下的金额。
-        // 如果是固定清单[第100章至700章清单]下100章以外清单引用此基数,要排除自身(目前只允许100章的清单使用,所以暂时不需要此判断)
-        'YBZYHQDHJ': function (tender) {
-            let oneToSeven = cbTools.findNodeByFlag(fixedFlag.ONE_SEVEN_BILLS);
-            if (!oneToSeven) {
-                return 0;
-            }
-            //100-700章固定节点的所有子节点
-            let allChildren = [];
-            function getChildren(nodes) {
-                allChildren = allChildren.concat(nodes);
-                for (let node of nodes) {
-                    if (node.children.length > 0) {
-                        getChildren(node.children);
-                    }
-                }
-            }
-            getChildren(oneToSeven.children);
-            //扣除的节点:100章的节点[100-200)
-            let deductNodes = allChildren.filter(cbTools.withingOneHundred);
-            //计算金额
-            let fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
-            return projectObj.project.calcProgram.getTotalFee([oneToSeven], deductNodes, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
+      function getChildren(nodes) {
+        allChildren = allChildren.concat(nodes);
+        for (let node of nodes) {
+          if (node.children.length > 0) {
+            getChildren(node.children);
+          }
         }
         }
-    };
+      }
+      getChildren(oneToSeven.children);
+      //扣除的节点:100章的节点[100-200)
+      let deductNodes = allChildren.filter(cbTools.withingOneHundred);
+      //计算金额
+      let fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
+      return projectObj.project.calcProgram.getTotalFee([oneToSeven], deductNodes, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
+    }
+  };
+}
+
+//山东工地转移费率值修改特殊处理
+if (typeof feeRateObject !== 'undefined') {
+  feeRateObject.feeRateSpecialHandle = function (subRate, value) {
+    let result = {};
+    if (subRate.name == "工地转移(km)" && value && value < 50) { //工地转移50km以内按50km算
+      result.valueKey = "50";
+      result.value = scMathUtil.roundForObj(value, getDecimal("feeRate")); //设置显示的节点值
+    }
+    return result;
+  }
 }
 }
 
 
 if (typeof module !== 'undefined' && !module.nodeType) {
 if (typeof module !== 'undefined' && !module.nodeType) {
-    module.exports = {
-        progression,
-        deficiency,
-        getDefalutAssistProductionFeeRate: function () {
-            return 5
-        }
-    };
+  module.exports = {
+    progression,
+    deficiency,
+    getDefalutAssistProductionFeeRate: function () {
+      return 5
+    }
+  };
 }
 }