Преглед на файлове

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

Conflicts:
	web/building_saas/css/custom.css
zhangweicheng преди 6 години
родител
ревизия
97954c6384

+ 16 - 25
modules/pm/controllers/new_proj_controller.js

@@ -15,30 +15,20 @@ import EngineeringLibModel from "../../users/models/engineering_lib_model";
 
 module.exports = {
     copyTemplateData: async function (property, newProjID, callback) {
-        //转换ID引用,原本@ID ID为原ID,需要替换为新的uuid
+        // 原ID引用更新成新ID引用
         function parseCalcBase(calcBase, uuidMapping) {
-            let rst = '';
-            let reg = /@\d+/g,
-                numberData = Array.from(new Set(calcBase.match(reg))); //eg: @1
-            let regForOpr = /[\+,\-,\*,\/]/g,
-                oprData = calcBase.match(regForOpr); //eg: +
-            let regForID = /\d+/g;
-            let uuidArr = [];
-            for (let data of numberData) {
-                let orgID = data.match(regForID);
-                if (orgID && orgID[0] && uuidMapping[orgID[0]]) {
-                    uuidArr.push(uuidMapping[orgID[0]]);
+            const orgIDRefs = [...new Set(calcBase.match(/@\d+/g))];
+            orgIDRefs.forEach(orgRef => {
+                const orgID = orgRef.match(/\d+/)[0];
+                const newID = uuidMapping[orgID] || null;
+                // ID匹配不上则不转换这个引用
+                if (!newID) {
+                    return;
                 }
-            }
-            for (let i = 0; i < uuidArr.length; i++) {
-                let uid = uuidArr[i],
-                    opr = oprData[i - 1];
-                if (opr) {
-                    rst += opr;
-                }
-                rst += `@${uid}`;
-            }
-            return rst;
+                const replaceStr = `@${newID}`;
+                calcBase = calcBase.replace(new RegExp(`${orgRef}\\b`, 'g'), replaceStr);
+            });
+            return calcBase;
         }
         async.parallel([
             async function (cb) {
@@ -52,14 +42,15 @@ module.exports = {
                 for(let bill of billsDatas){
                     uuidMaping[bill.ID] = uuidV1();
                 }
-                let needParseReg = /@/g;
+                const reg = /@\d+/;
                 billsDatas.forEach(function (template) {
                     template.projectID = newProjID;
                     template.ID = uuidMaping[template.ID] ? uuidMaping[template.ID] : -1;
                     template.ParentID = uuidMaping[template.ParentID] ? uuidMaping[template.ParentID] : -1;
                     template.NextSiblingID = uuidMaping[template.NextSiblingID] ? uuidMaping[template.NextSiblingID] : -1;
-                    //需要转换ID引用
-                    if (template.calcBase && needParseReg.test(template.calcBase)) {
+
+                    const needToParseCalcBase = template.calcBase && reg.test(template.calcBase);
+                    if (needToParseCalcBase) {
                         template.calcBase = parseCalcBase(template.calcBase, uuidMaping);
                     }
                 });

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

@@ -29,6 +29,7 @@ let demoPrjId = - 1;
 // let demoRptId = 38; //5.2.2表
 // let demoRptId = 6; //封面
 // let demoRptId = 22; //03
+let demoRptId = 23; //04
 // let demoRptId = 26; //07
 // let demoRptId = 28; //09
 // let demoRptId = 27; //08
@@ -39,7 +40,7 @@ let demoPrjId = - 1;
 // let demoRptId = 56; //24
 // let demoRptId = 36; //5.1
 // let demoRptId = 46; //5.5测试
-let demoRptId = 49; //5.5
+// let demoRptId = 49; //5.5
 // let demoRptId = 66; //5.4
 // let demoRptId = 67; //21-2
 // let demoRptId = 31; //21-1
@@ -71,7 +72,7 @@ let userId_Leng = "5c3ffa9aa0a92732f41216e0"; //小冷User Id (养护的)
 // demoPrjId = 618; //PROD:
 // demoPrjId = 2580; //PROD:
 // demoPrjId = 815; //PROD:
-demoPrjId = 5289; //UAT:
+demoPrjId = 9744; //UAT:
 // demoPrjId = 738; //UAT:
 // demoPrjId = 670; //UAT: 清单项目
 //*/

+ 31 - 0
web/building_saas/css/custom.css

@@ -326,6 +326,7 @@ input.text-right{
 .occupied {
     background: #f1f1f1;
 }
+<<<<<<< HEAD
 .material-ration-left{
     float:left;
     width: 90%;
@@ -333,4 +334,34 @@ input.text-right{
 .material-ass{
     width: 10%;
     background:#f7f7f9
+=======
+/*书签批注*/
+.annotate-color-1::before{
+    color: #E2F2C5 !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-2::before{
+    color: #F9E2CF !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-3::before{
+    color:#F2EFD9 !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-4::before{
+    color:#F5D1DA !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-5::before{
+    color:#E3E3E3 !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-6::before{
+    color:#B6F3F2 !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-7::before{
+    color:#ECE0F5 !important;
+    -webkit-text-stroke:.5px #ced4da;
+>>>>>>> 870a1904d6d548a3bbaf4bc0f0a266587825d2e9
 }

+ 267 - 212
web/building_saas/css/main.css

@@ -3,71 +3,88 @@
 body {
     font-size: 0.9rem;
     overflow: hidden;
+    font-family: "Helvetica Neue","Hiragino Sans GB",stheiti,"Microsoft Yahei","微软雅黑",tahoma,sans-serif
 }
 a{
-    outline: none
+  outline: none
 }
 .dropdown-menu {
     font-size: 0.9rem
 }
 .btn.disabled, .btn:disabled {
-    color:#999
+  color:#999
 }
 .btn-link:focus, .btn-link:hover{
-    text-decoration: none
+  text-decoration: none
 }
 .dropdown-menu {
-    padding:.2rem 0;
+  padding:.2rem 0;
 }
 .dropdown-item:focus, .dropdown-item:hover{
-    background-color: #f7f7f9
+  background-color: #f7f7f9
 }
 .text-indent {
-    text-indent:26px;
+  text-indent:26px;
 }
 .modal-header{
-    background:#f2f2f2;
-    border-bottom:1px solid #ccc;
-    padding:.8rem 1rem;
+  background:#f2f2f2;
+  border-bottom:1px solid #ccc;
+  padding:.8rem 1rem;
 }
 .modal-title{
-    font-size:1rem;
+  font-size:1rem;
 }
 .modal-footer{
-    padding:.8rem 1rem;
+  padding:.8rem 1rem;
 }
 .form-check .form-check-label,.form-radio .form-check-label{
-    cursor: pointer;
+  cursor: pointer;
+}
+.custom-file-sm,.custom-file-sm .custom-file-label{
+  height: calc(1.5em + .5rem + 2px);
+  padding-top: .25rem;
+  padding-bottom: .25rem;
+  padding-left: .5rem;
+}
+.custom-file-sm .custom-file-label:after{
+  height: calc(1.4em + .5rem + 2px);
+padding-top: .25rem;
+padding-bottom: .25rem;
+font-size: .875rem;
+}
+.custom-file-sm input{
+  height: calc(1.5em + .5rem + 2px);
+font-size: .875rem;
 }
 /*自定义css*/
 .login-body,.login-html{
-    height:100%;
+  height:100%;
 }
 .login-bg{
-    width: 100%;
-    height: 100%;
-    background: #f2f6f5 url("login-bg.jpg") bottom center no-repeat;
-    background-size: 100% auto;
-    display: inline-block;
-    position: absolute;
+  width: 100%;
+  height: 100%;
+  background: #f2f6f5 url("login-bg.jpg") bottom center no-repeat;
+  background-size: 100% auto;
+  display: inline-block;
+  position: absolute;
 }
 .login-panel {
-    width: 500px;
-    margin: 0 auto;
-    position: absolute;
-    left: 0;
-    right: 0;
-    top: 20%;
-    padding:30px;
-    background:#fff;
-    box-shadow:#333 1px 1px 5px
+  width: 500px;
+  margin: 0 auto;
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 20%;
+  padding:30px;
+  background:#fff;
+  box-shadow:#333 1px 1px 5px
 }
 .ver-panel {
-    width:100%;
-    top:10%;
+  width:100%;
+  top:10%;
 }
 .header {
-    border-bottom: 1px solid #ccc
+  border-bottom: 1px solid #ccc
 }
 .header .header-logo {
     background: #ff6501;
@@ -79,26 +96,26 @@ a{
     padding-left:50px;
 }
 .header-logo div.v-title{
-    font-size:11px;
-    color:#aeaeae;
-    line-height: 12px;
-    margin-top:3px;
+  font-size:11px;
+  color:#aeaeae;
+  line-height: 12px;
+  margin-top:3px;
 }
 .header-logo div.p-title{
-    font-size:16px;
-    color:#ff6501;
+  font-size:16px;
+  color:#ff6501;
 }
 .header-logo div.b-title{
-    font-size:24px;
-    color:#ff6501;
+  font-size:24px;
+  color:#ff6501;
 }
 .top-msg{
-    position: fixed;
-    top:10px;
-    width:900px;
-    z-index: 9999;
-    left:50%;
-    margin-left:-450px;
+  position: fixed;
+  top:10px;
+  width:900px;
+  z-index: 9999;
+  left:50%;
+  margin-left:-450px;
 }
 .main {
     position: relative;
@@ -130,45 +147,55 @@ a{
     color: #333
 }
 .main-nav .nav-tabs{
-    border-bottom: none
+  border-bottom: none
 }
 .poj-manage .col-auto{
-    background:#f7f7f9
+  background:#f7f7f9
 }
 .poj-cate {
-    width:58px;
-    margin-right:-1px;
-    margin-top:2px;
+  width:58px;
+  margin-right:-1px;
+  margin-top:2px;
 }
 .poj-cate .nav-pills .nav-link{
-    border-radius: 0;
-    font-size: 24px;
-    color: #007bff
+  border-radius: 0;
+  font-size: 24px;
+  color: #007bff
 }
 .poj-cate .nav-item{
-    position: relative;
+  position: relative;
 }
 .poj-cate .nav-pills .badge{
-    position: absolute;
-    right:5px;
-    top:5px;
+  position: absolute;
+  right:5px;
+  top:5px;
 }
 .poj-cate .nav-pills .nav-link:hover{
-    color:#0056b3
+  color:#0056b3
 }
 .poj-cate .nav-pills .nav-link.active, .nav-pills .show > .nav-link{
-    background-color: #6c757d;
-    color:#fff
+  background-color: #6c757d;
+  color:#fff
+}
+.gl-side.gl-side-lg{
+  width:200px;
+}
+.nav-side .nav-link{
+  padding:.5rem;
+}
+.nav-side .nav-link.active{
+  background:#ddd;
+  color:#333;
 }
 .pm-side{
-    position: fixed;
-    left:0;
-    height:100%;
-    border-right:1px solid #ccc;
-    background: #f7f7f9
+  position: fixed;
+  left:0;
+  height:100%;
+  border-right:1px solid #ccc;
+  background: #f7f7f9
 }
 .pm-content{
-    padding-left:58px
+  padding-left:58px
 }
 .content {
     border-left: 1px solid #ccc;
@@ -176,8 +203,8 @@ a{
     background: #fff
 }
 .toolsbar,.toolsbar-f {
-    background: #f7f7f9;
-    border-bottom: 1px solid #ccc
+  background: #f7f7f9;
+  border-bottom: 1px solid #ccc
 }
 .tools-btn {
     height: 30px;
@@ -187,40 +214,40 @@ a{
     background: #f7f7f9;
 }
 .toolsbar .btn-light {
-    color:#007bff;
-    min-width: 34px;
+  color:#007bff;
+  min-width: 34px;
 }
 .toolsbar .btn-light.disabled {
-    color:#999;
+  color:#999;
 }
 .main-side {
     border-left: 1px solid #ccc;
     overflow-y: hidden;
 }
 .main-data-top,.main-data-full{
-    overflow: hidden;
-    width:100%
+  overflow: hidden;
+  width:100%
 }
 .main-data-top-side{
-    overflow: hidden
+  overflow: hidden
 }
 .main-content.col-lg-8{
-    width:66.666667%
+  width:66.666667%
 }
 .main-content.col-lg-12{
-    width:100%
+  width:100%
 }
 .main-side.col-lg-4{
-    width: 33.333333%;
+  width: 33.333333%;
 }
 .main-side.col-lg-0{
-    width:0%;
+  width:0%;
 }
 .sidebar-middle{
-    height:80px;
+  height:80px;
 }
 .sidebar-bottom,.sidebar-bottom .col-lg-6,.sidebar-bottom .col-lg-12 {
-    height:300px
+  height:300px
 }
 .top-content, .fluid-content {
     overflow: auto;
@@ -244,7 +271,7 @@ a{
     z-index: 999
 }
 .side-tabs .nav-tabs .nav-item {
-    z-index: 999
+  z-index: 999
 }
 .side-tabs .nav-tabs {
     border-bottom: none;
@@ -357,19 +384,9 @@ a{
         transform: translateX(10px);
     }
 }
-.gl-side.gl-side-lg{
-    width:200px;
-}
-.nav-side .nav-link{
-    padding:.5rem;
-}
-.nav-side .nav-link.active{
-    background:#ddd;
-    color:#333;
-}
 .gl-side{
-    border-right:1px solid #ccc;
-    width:120px
+  border-right:1px solid #ccc;
+  width:120px
 }
 .bottom-content .tab-content .main-data-bottom{
     height: 300px;
@@ -383,141 +400,141 @@ a{
     overflow: hidden;
 }
 .tn-nav,.rn-nav{
-    width:30px;
-    height: 100%;
-    border-left:1px solid #dee2e6 ;
+  width:30px;
+  height: 100%;
+  border-left:1px solid #dee2e6 ;
 }
 .tn-nav,.cn-nav{
-    border-right:1px solid #dee2e6 ;
-    border-left:none;
+  border-right:1px solid #dee2e6 ;
+  border-left:none;
 }
 .tn-nav > span{
-    width:20px;
+  width:20px;
 }
 .tn-nav:hover{
-    background:#f7f7f9;
-    cursor: pointer;
+  background:#f7f7f9;
+  cursor: pointer;
 }
 .rn-nav {
-    background: #f7f7f9
+  background: #f7f7f9
 }
 .rn-nav .nav{
-    padding: 0
+  padding: 0
 }
 .rn-nav .nav-tabs {
-    border:none;
-    margin-top:2px;
+  border:none;
+  margin-top:2px;
 }
 .rn-nav .nav-tabs .nav-link{
-    padding:0.4em 0.4em;
-    line-height: 16px
+  padding:0.4em 0.4em;
+  line-height: 16px
 }
 .rn-nav .nav-tabs .nav-link.active {
-    border:none;
-    background-color: #fff;
-    border-left:1px solid #fff;
-    margin-left:-1px;
-    border-top:1px solid #ccc;
-    border-right:1px solid #ccc;
-    border-bottom:1px solid #ccc;
+  border:none;
+  background-color: #fff;
+  border-left:1px solid #fff;
+  margin-left:-1px;
+  border-top:1px solid #ccc;
+  border-right:1px solid #ccc;
+  border-bottom:1px solid #ccc;
 }
 .cn-nav .nav-tabs .nav-link.active {
-    border:none;
-    background-color: #fff;
-    border-right:1px solid #fff;
-    margin-right:-1px;
-    border-top:1px solid #ccc;
-    border-left:1px solid #ccc;
-    border-bottom:1px solid #ccc;
+  border:none;
+  background-color: #fff;
+  border-right:1px solid #fff;
+  margin-right:-1px;
+  border-top:1px solid #ccc;
+  border-left:1px solid #ccc;
+  border-bottom:1px solid #ccc;
 }
 .rn-nav .nav-tabs .nav-link span{
-    display:none;
+  display:none;
 }
 .rn-nav .nav-tabs .nav-link.active span{
-    display: inline-block;
+  display: inline-block;
 }
 .poj-list, .side-content ,.form-view{
     overflow: auto;
 }
 .print-toolsbar{
-    padding:5px
+  padding:5px
 }
 .print-toolsbar .panel {
-    display:inline-block;
-    vertical-align:top
+  display:inline-block;
+  vertical-align:top
 }
 .print-toolsbar .panel .panel-foot{
-    text-align: center;
-    font-size: 12px;
-    padding-bottom:3px;
-    background:#F2F2F2
+  text-align: center;
+  font-size: 12px;
+  padding-bottom:3px;
+  background:#F2F2F2
 }
 .print-list {
-    border-right:1px solid #ccc
+  border-right:1px solid #ccc
 }
 .print-list .form-list {
-    overflow: auto
+  overflow: auto
 }
 .print-list .list-tools{
-    height:50px;
-    padding:10px 0;
-    border-bottom:1px solid #f2f2f2
+  height:50px;
+  padding:10px 0;
+  border-bottom:1px solid #f2f2f2
 }
 .pageContainer {
-    text-align: center
+  text-align: center
 }
 .pageContainer .page{
-    border:9px solid transparent;
-    display: inline-block;
+  border:9px solid transparent;
+  display: inline-block;
 }
 .pageContainer .page img{
-    width:inherit;
-    height: inherit;
+  width:inherit;
+  height: inherit;
 }
 .modal-auto-height {
-    height: 400px;
-    overflow-y: auto;
+  height: 400px;
+  overflow-y: auto;
 }
 .modal-toolbar + .modal-auto-height{
-    height:369px
+  height:369px
 }
 .modal-fixed-height {
-    height: 400px;
-    overflow-y: hidden;
+  height: 400px;
+  overflow-y: hidden;
 }
 .sidebar-tools-bar {
-    background:#fff
+  background:#fff
 }
 .side-search-box{
-    background:#fff;
-    border-bottom:1px solid #ddd
+  background:#fff;
+  border-bottom:1px solid #ddd
 }
 .navbar-crumb span{
-    float:left;
+  float:left;
 }
 .navbar-crumb span.text-truncate{
-    max-width: 200px;
+  max-width: 200px;
 }
 .dropdown-item{
-    color:#007bff
+  color:#007bff
 }
 .dropdown-item:hover{
-    color:#0056b3
+  color:#0056b3
 }
 .dropdown-item.disabled, .dropdown-item:disabled{
-    pointer-events:none
+  pointer-events:none
 }
 .tools-symbol{
-    width:450px
+  width:450px
 }
 .tools-symbol p{
-    margin: 0
+  margin: 0
 }
 .tools-symbol a.btn{
-    font-size: .95rem;
-    width:26px;
-    padding: 0;
-    height:26px;
+  font-size: .95rem;
+  width:26px;
+  padding: 0;
+  height:26px;
 }
 .custom-file-input:lang(zh) ~ .custom-file-label::after {
     content: "浏览";
@@ -550,111 +567,149 @@ a{
     border-color:#000 transparent transparent transparent;
 }
 .box-text-style {
-    font-size: 12px;
-    font-family:"Microsoft YaHei"
+  font-size: 12px;
+  font-family:"Microsoft YaHei"
 }
 .box-text-style p{
-    margin:0 0 2px 0;
+  margin:0 0 2px 0;
 }
 .box-text-style table{
-    width: 100%;
-    text-align: center;
+  width: 100%;
+  text-align: center;
 }
 .box-text-style table th,.box-text-style table td{
-    border:1px solid #fff;
+  border:1px solid #fff;
 }
 
 .box-text-style table p{
-    text-align: left;
+  text-align: left;
 }
 .sys-setting-nav .nav-link{
-    padding:.3rem 1rem;
+  padding:.3rem 1rem;
 }
 /*快捷切换单位工程*/
 .navbar-crumb{
-    position: relative;
+  position: relative;
 }
 .navbar-crumb .f-nav,.navbar-crumb .s-nav{
-    position: absolute;
-    z-index: 999;
-    width: 200px;
-    background:#fff;
-    border: 1px solid rgba(0,0,0,.15);
-    padding: .5rem 0;
+  position: absolute;
+  z-index: 999;
+  width: 200px;
+  background:#fff;
+  border: 1px solid rgba(0,0,0,.15);
+  padding: .5rem 0;
 }
 .navbar-crumb .f-nav{
-    right:50px;
-    top:35px;
+  right:50px;
+  top:35px;
 }
 .navbar-crumb .s-nav{
-    left:200px
+  left:200px
 }
 .navbar-crumb .f-nav li{
-    padding: .25rem 1rem;
-    cursor: default;
+  padding: .25rem 1rem;
+  cursor: default;
 }
 .navbar-crumb .f-nav li.focus{
-    color: #16181b;
-    background-color: #f7f7f9;
+color: #16181b;
+background-color: #f7f7f9;
 }
 .navbar-crumb .f-nav li .s-nav{
-    display: none
+  display: none
 }
 .navbar-crumb .f-nav li.focus .s-nav{
-    display: block
+  display: block
 }
 /*书签颜色*/
 .annotate-color-1{
-    background: #E2F2C5
+  background: #E2F2C5;
+  color: #E2F2C5;
+}
+.annotate-color-1::before{
+  color: #E2F2C5;
+  -webkit-text-stroke:.5px #ced4da;
 }
 .annotate-color-2{
-    background: #F9E2CF
+  background: #F9E2CF;
+  color:#F9E2CF
+}
+.annotate-color-2::before{
+  color: #F9E2CF;
+  -webkit-text-stroke:.5px #ced4da;
 }
 .annotate-color-3{
-    background: #F2EFD9
+  background: #F2EFD9;
+  color:#F2EFD9
+}
+.annotate-color-3::before{
+  color:#F2EFD9;
+  -webkit-text-stroke:.5px #ced4da;
 }
 .annotate-color-4{
-    background: #F5D1DA
+  background: #F5D1DA;
+  color:#F5D1DA
+}
+.annotate-color-4::before{
+  color:#F5D1DA;
+  -webkit-text-stroke:.5px #ced4da;
 }
 .annotate-color-5{
-    background: #E3E3E3
+  background: #E3E3E3;
+  color:#E3E3E3
+}
+.annotate-color-5::before{
+  color:#E3E3E3;
+  -webkit-text-stroke:.5px #ced4da;
 }
 .annotate-color-6{
-    background: #B6F3F2
+  background: #B6F3F2;
+  color:#B6F3F2
+}
+.annotate-color-6::before{
+  color:#B6F3F2;
+  -webkit-text-stroke:.5px #ced4da;
 }
 .annotate-color-7{
-    background: #ECE0F5
+  background: #ECE0F5;
+  color:#ECE0F5
+}
+.annotate-color-7::before{
+  color:#ECE0F5;
+  -webkit-text-stroke:.5px #ced4da;
+}
+.input-group-text.active{
+  color:#666;
 }
 /*宽屏菜单*/
 @media screen and (min-width: 900px) {
-    #fluid-menu{
-    }
-    #min-menu{
-        display: none
-    }
+#fluid-menu{
+}
+#min-menu{
+  display: none
+}
 }
 @media screen and (min-width: 912px) {
-    #share-info{
-        overflow: auto;
-        text-overflow: ellipsis;
-        white-space: nowrap;
-        max-width:inherit;
-    }
+#share-info{
+  overflow: auto;
+text-overflow: ellipsis;
+white-space: nowrap;
+max-width:inherit;
+}
 }
 /*窄屏菜单*/
 @media screen and (max-width: 900px) {
-    #fluid-menu{
-        display: none
-    }
-    #min-menu{
+#fluid-menu{
+  display: none
+}
+#min-menu{
 
-    }
+}
 }
 @media screen and (max-width: 1018px) {
-    #share-info{
-        overflow: hidden;
-        text-overflow: ellipsis;
-        white-space: nowrap;
-        max-width:80px;
-    }
+#share-info{
+  overflow: hidden;
+text-overflow: ellipsis;
+white-space: nowrap;
+max-width:80px;
 }
+}

+ 8 - 4
web/building_saas/js/global.js

@@ -132,10 +132,14 @@ function getFeeIndex(fees) {
     let feesIndex = {};
     if (fees) {
         for(let fee of fees){
-            fee.unitFee = parseFloat(fee.unitFee);
-            fee.totalFee = parseFloat(fee.totalFee);
-            fee.tenderUnitFee = parseFloat(fee.tenderUnitFee);
-            fee.tenderTotalFee = parseFloat(fee.tenderTotalFee);
+            const parsedUnitFee = parseFloat(fee.unitFee);
+            const parsedTotalFee = parseFloat(fee.totalFee);
+            const parsedTenderUnitFee = parseFloat(fee.tenderUnitFee);
+            const parsedTenderTotalFee = parseFloat(fee.tenderTotalFee);
+            fee.unitFee = parsedUnitFee || 0;
+            fee.totalFee = parsedTotalFee || 0;
+            fee.tenderUnitFee = parsedTenderUnitFee || 0;
+            fee.tenderTotalFee = parsedTenderTotalFee || 0;
             feesIndex[fee.fieldName] = fee;
         }
     }

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

@@ -1757,9 +1757,6 @@
                         <li class="nav-item">
                             <a class="nav-link active px-3" data-toggle="tab" href="#m-explanation" id="questionTab1" role="tab">说明</a>
                         </li>
-                        <li class="nav-item">
-                            <a class="nav-link px-3" data-toggle="tab" href="#m-ruleText" id="questionTab2" role="tab">工程量计算规则</a>
-                        </li>
                     </ul>
                     <div class="tab-content">
                         <div class="tab-pane active" id="m-explanation" role="tabpanel">

+ 58 - 12
web/building_saas/main/js/controllers/block_controller.js

@@ -54,6 +54,28 @@ let BlockController = {
         }
         return false;
     },
+    // 恢复删除节点有效性
+    recoverBlockDisabled: function () {
+        if (projectReadOnly) {
+            return true;
+        }
+        const recycle = getLocalCache('project_recycle');
+        if (!recycle) {
+            return true;
+        }
+        const recycleObj = JSON.parse(recycle);
+        const firstData = recycleObj.datas.length ? recycleObj.datas[0] : null;
+        if (!firstData || firstData.projectID !== projectObj.project.ID()) {
+            return true;
+        }
+        const parentID = firstData.sourceType === projectObj.project.Bills.getSourceType() ? firstData.ParentID : firstData.billsItemID;
+        const parent = projectObj.project.mainTree.findNode(parentID);
+        // parentID为-1时,为大项费用
+        if (parentID !== -1 && !parent) {
+            return true;
+        }
+        return false;
+    },
     haveCalcBase : function (node) {
         if(node.data.calcBase ==null||node.data.calcBase ==undefined|| node.data.calcBase == ""){
             return false;
@@ -77,10 +99,9 @@ let BlockController = {
         }
         return null;
     },
-
-    copyBlock:function (selection) {
+    extractBlockData: function (selection) {
         let startTime = +new Date();
-        let blockOjb = {
+        let blockObj = {
             compilationID:projectObj.project.projectInfo.compilation,
             datas:[]
         };
@@ -95,21 +116,30 @@ let BlockController = {
             }
         }
         if(firstNode.sourceType == projectObj.project.Bills.getSourceType()){
-            blockOjb.firstNodeType = firstNode.data.type;
+            // 特殊处理大项费用,因为DXFY在billType中为1,与blockType中的RATION冲突了
+            blockObj.firstNodeType = firstNode.data.type === billType.DXFY ? blockType.DXFY : firstNode.data.type;
         }else if(firstNode.sourceType == projectObj.project.Ration.getSourceType()){
-            blockOjb.firstNodeType = blockType.RATION;
+            blockObj.firstNodeType = blockType.RATION;
         }
-        blockOjb.isFBFX = projectObj.project.Bills.isFBFX(firstNode);
+        blockObj.isFBFX = projectObj.project.Bills.isFBFX(firstNode);
         let ration_glj_Map = _.groupBy(projectObj.project.ration_glj.datas, 'rationID');
         for(let cNode of copyNodes){
-            blockOjb.datas.push(this.getNodeDatas(cNode,ration_glj_Map));
+            blockObj.datas.push(this.getNodeDatas(cNode,ration_glj_Map));
         }
         let getDataTime = +new Date();
         console.log(`复制所用时间——${getDataTime - startTime}`);
-        blockOjb.copyTime = +new Date();//设置复制时间,可以用来做过期处理
-        setLocalCache('project_block',JSON.stringify(blockOjb));
+        blockObj.copyTime = +new Date();//设置复制时间,可以用来做过期处理
         let endTime = +new Date();
         console.log(`复制所用时间——${endTime - startTime}`);
+        return blockObj;
+    },
+    copyBlock:function (selection) {
+        const block = this.extractBlockData(selection);
+        setLocalCache('project_block', JSON.stringify(block));
+    },
+    recycleBlock: function (selection) {
+        const block = this.extractBlockData(selection);
+        setLocalCache('project_recycle', JSON.stringify(block));
     },
     getNodeDatas : function (node,ration_glj_Map) {
         let data = node.data;
@@ -147,7 +177,21 @@ let BlockController = {
         this.confirmPaste(blockData,selected,position);
         //do paste
     },
-
+    // 恢复删除节点
+    recoverBlock: function () {
+        const recycle = JSON.parse(getLocalCache('project_recycle'));
+        const firstData = recycle.datas[0];
+        const parentID = firstData.sourceType === projectObj.project.Bills.getSourceType() ? firstData.ParentID : firstData.billsItemID;
+        // 恢复到父节点最末子项
+        if (parentID !== -1) {
+            const parent = projectObj.project.mainTree.findNode(parentID);
+            this.confirmPaste(recycle, parent, 'sub');
+        } else {
+            // 恢复到最末根节点后项
+            const lastRoot = projectObj.project.mainTree.roots[projectObj.project.mainTree.roots.length - 1];
+            this.confirmPaste(recycle, lastRoot, 'next');
+        }
+    },
     initOptionDiv:function (selected,blockData) {
         let Bills = projectObj.project.Bills;
         if( blockData.firstNodeType == blockType.RATION){//如果剪切板中是复制的定额块
@@ -344,7 +388,9 @@ let BlockController = {
         let sels = projectObj.mainController.sheet.getSelections();
         //设置选中并更新下方显示
         projectObj.mainController.setTreeSelected(firstNode);
-        projectObj.mainController.sheet.setSelection(firstNode.serialNo(), sels[0].col, 1, 1);
+        const serialNo = firstNode.serialNo();
+        projectObj.mainController.sheet.setSelection(serialNo, sels[0].col, 1, 1);
+        projectObj.mainController.sheet.showRow(serialNo, GC.Spread.Sheets.VerticalPosition.center);
         let bottomNodes = [];
         for (let node of newNodes){
             if ((!node.children) || (node.children && node.children.length == 0)){
@@ -563,7 +609,7 @@ let BlockController = {
             let newID = uuid.v1(); //新的清单ID
             billsIDMap[temData.ID] = newID;
             temData.ID = newID; //新的清单ID
-            if(temData.billsLibId && temData.billsLibId!="" && temData.code.length == 12){//是从清单库来的
+            if(temData.billsLibId && temData.billsLibId!="" && temData.code && temData.code.length == 12){//是从清单库来的
                 let value = temData.code.substr(0,9);
                 if (value&&value.length === 9) {//&& /^[\d]+$/.test(value) 去掉全数字判断    07-31 zhang
                     temData.code = me.newFormatCode(value);

+ 4 - 0
web/building_saas/main/js/models/bills.js

@@ -710,6 +710,8 @@ var Bills = {
             let includeRootNode=false;
             let parentNodes = [];
             let selection = projectObj.mainSpread.getActiveSheet().getSelections()[0];
+            console.log(`selection`);
+            console.log(selection);
             for(let i =0;i<selection.rowCount;i++){
                 let tem_node = controller.tree.items[selection.row+i];
                 //被行引用的清单(大项费用)不可删除
@@ -771,6 +773,8 @@ var Bills = {
             updateData.user_id = userID;
             $.bootstrapLoading.start();
             CommonAjax.post("/bills/multiDelete", updateData, function () {
+                // 回收删除节点
+                BlockController.recycleBlock(selection);
                 let quantity_detail_datas = project.quantity_detail.datas;
                 let ration_datas = project.Ration.datas;
                 let nodes = controller.tree.nodes;

+ 3 - 3
web/building_saas/main/js/models/calc_program.js

@@ -1192,8 +1192,8 @@ let analyzer = {
             for (let base of arrBase){
                 let baseName = base.slice(1, -1);
                 if (!rationCalcBases[baseName]){
-                    analyzer.error = `定额基数${hintBox.font('[' +baseName + ']')}定义!`;
-                    // hintBox.infoBox('错误提示', `定额基数${hintBox.font('[' +baseName + ']')}定义!`, 1);
+                    analyzer.error = `定额基数${hintBox.font('[' +baseName + ']')}定义!`;
+                    // hintBox.infoBox('错误提示', `定额基数${hintBox.font('[' +baseName + ']')}定义!`, 1);
                     return false;
                 }
             };
@@ -1407,7 +1407,7 @@ let executeObj = {
             return calcTools.marketPriceToBase(me.treeNode, baseName, isTender)
         else{
             if (!rationCalcBases[baseName]){
-                hintBox.infoBox('系统提示', '定额基数“' + baseName + '”定义,计算错误。 (模板 ' + me.template.ID + ',规则 ' + me.tempCalcItem.ID +')', 1);
+                hintBox.infoBox('系统提示', '定额基数“' + baseName + '”定义,计算错误。 (模板 ' + me.template.ID + ',规则 ' + me.tempCalcItem.ID +')', 1);
                 return 0;
             }
             else

+ 2 - 1
web/building_saas/main/js/models/main_consts.js

@@ -351,7 +351,8 @@ const blockType ={
     FB:2,//分部
     FX:3,//分项
     BILL:4,//清单
-    BX:5//补项
+    BX:5,//补项
+    DXFY:6//大项费用
 };
 
 const filterType = {

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

@@ -959,7 +959,7 @@ var gljOprObj = {
         }
     },
     showLibGLJSheetData: function () {
-        this.gljLibSheetData = _.sortBy(this.gljLibSheetData, 'code');
+        //this.gljLibSheetData = _.sortBy(this.gljLibSheetData, 'code');
         sheetCommonObj.showData(this.gljLibSheet, this.gljLibSheetSetting, this.gljLibSheetData, gljOprObj.distTypeTree);
         this.gljLibSheet.setRowCount(this.gljLibSheetData.length);
     },

+ 6 - 1
web/building_saas/main/js/views/glj_view_contextMenu.js

@@ -377,7 +377,12 @@ function getGLJData(actionType) {
     $('#actionType').val(actionType);
     $.bootstrapLoading.start();
     projectObj.project.ration_glj.getGLJData(function (result) {
-        gljOprObj.treeData =  result.datas.treeData;
+        // 目前只有浙江2015需要处理
+        if (gljOprObj.sortSelectViewGLJ) {
+            gljOprObj.sortSelectViewGLJ(result.datas.stdGLJ);
+            gljOprObj.sortSelectViewGLJ(result.datas.complementaryGLJs);
+        }
+        gljOprObj.treeData = result.datas.treeData;
         //zTreeHelper.createTree(result.datas.treeData, gljOprObj.gljTreeSetting, "gljTree", gljOprObj);
         gljOprObj.initClassTree('std', gljOprObj.treeData.std);
         gljOprObj.stdGLJ=result.datas.stdGLJ;

+ 17 - 9
web/building_saas/main/js/views/locate_view.js

@@ -67,6 +67,11 @@ let locateObject={
         ],
         selected:"E2F2C5"
     },
+    getDescribeByColor: function (color) {
+        const setting = projectObj.project.property.bookmarkSetting ? projectObj.project.property.bookmarkSetting : locateObject.bookmarkPropertySetting;
+        const item = setting.settingList.find(item => item.background === color);
+        return item && item.describe ? item.describe : '描述';
+    },
     initMainSpread:function(){
         if(!this.mainSpread){
             this.mainSpread = SheetDataHelper.createNewSpread($("#locate_result")[0],3);
@@ -174,10 +179,11 @@ let locateObject={
             focus = true;
         }
         sel.row = selectedID?_.findIndex(this.bookmarkDatas,{'ID':selectedID}):0;
-        sheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
+        const locatedRow = sel.row === -1 ? 0 : sel.row;
+        sheet.setSelection(locatedRow,sel.col,sel.rowCount,sel.colCount);
         sheet.setRowCount(this.bookmarkDatas.length);
-        if(sel.row!=-1) sheet.showRow(sel.row, GC.Spread.Sheets.VerticalPosition.bottom);
-        this.showAnnotation(sel.row,focus);
+        sheet.showRow(locatedRow, GC.Spread.Sheets.VerticalPosition.bottom)
+        this.showAnnotation(locatedRow,focus);
     },
     getBookmarkDatas:function(){
         let datas = [];
@@ -435,6 +441,8 @@ let locateObject={
             $("#bookmarkNodeID").val(recode.ID);
             $("#bookmarkNodeType").val(recode.type);
             if(focus) $("#annotationTextarea").focus();
+        } else {
+            $('#annotationTextarea').val('');
         }
     },
     locateNode:function (ID) {
@@ -462,13 +470,13 @@ let locateObject={
         setting.selected = $("#bookmarkSelected").val();
         this.updateProjectProperty("bookmarkSetting",setting);
     },
-    setOrCancelBookmark:function(node){
+    // background为null则为取消书签批注
+    setOrCancelBookmark:function(node, background){
         $("#bookmark").prop("checked", true);
-        let setting = projectObj.project.property.bookmarkSetting?projectObj.project.property.bookmarkSetting:locateObject.bookmarkPropertySetting;
-        let background = null;
-        if(_.isEmpty(node.data.bookmarkBackground)) background = setting.selected;
-        let updateData = {type:node.sourceType,data:{'ID' : node.data.ID,bookmarkBackground:background}};
-        if(background == null) updateData.data.bookmarkAnnotation = null;
+        const updateData = {type: node.sourceType, data: {ID: node.data.ID, bookmarkBackground: background}};
+        if(!background) {
+            updateData.data.bookmarkAnnotation = null;
+        }
         $.bootstrapLoading.start();
         projectObj.project.updateNodes([updateData],function () {
             $.bootstrapLoading.end();

+ 88 - 6
web/building_saas/main/js/views/project_view.js

@@ -1411,18 +1411,90 @@ var projectObj = {
                     },
                 },
                 "setBookMark": {
-                    name: '设置/取消书签批注',
+                    name: '设置书签批注',
                     icon: 'fa-flag',
                     disabled: function () {
-                        if (projectReadOnly || project.mainTree.selected.sourceType == ModuleNames.ration_glj) {
+                        if (projectReadOnly || !project.mainTree.selected || project.mainTree.selected.sourceType == ModuleNames.ration_glj) {
                             return true;
                         }
                         return false
                     },
-                    callback: function () {
-                        locateObject.setOrCancelBookmark(project.mainTree.selected)
+                    items: {
+                        cancelMark: {
+                            name: '取消书签批注',
+                            icon: 'fa-remove',
+                            disabled: function () {
+                                const selected = project.mainTree.selected;
+                                return !(selected && selected.data.bookmarkBackground);
+                            },
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, null);
+                            }
+                        },
+                        markE2F2C5: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('E2F2C5');
+                            },
+                            icon: 'fa-square annotate-color-1',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'E2F2C5');
+                            }
+                        },
+                        markF9E2CF: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('F9E2CF');
+                            },
+                            icon: 'fa-square annotate-color-2',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'F9E2CF');
+                            }
+                        },
+                        markF2EFD9: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('F2EFD9');
+                            },
+                            icon: 'fa-square annotate-color-3',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'F2EFD9');
+                            }
+                        },
+                        markF5D1DA: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('F5D1DA');
+                            },
+                            icon: 'fa-square annotate-color-4',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'F5D1DA');
+                            }
+                        },
+                        markE3E3E3: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('E3E3E3');
+                            },
+                            icon: 'fa-square annotate-color-5',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'E3E3E3');
+                            }
+                        },
+                        markB6F3F2: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('B6F3F2');
+                            },
+                            icon: 'fa-square annotate-color-6',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'B6F3F2');
+                            }
+                        },
+                        markECE0F5: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('ECE0F5');
+                            },
+                            icon: 'fa-square annotate-color-7',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'ECE0F5');
+                            }
+                        },
                     }
-
                 },
                 "delete": {
                     name: '删除',
@@ -1501,6 +1573,16 @@ var projectObj = {
                         BlockController.pasteBlock(project.mainTree.selected);
                     }
                 },
+                "recoverDeletedNodes": {
+                    name: '恢复删除节点',
+                    icon: 'fa-undo',
+                    disabled: function (){
+                        return BlockController.recoverBlockDisabled();
+                    },
+                    callback: function () {
+                        BlockController.recoverBlock();
+                    }
+                },
                 "editEngineer": {
                     name: '编辑工程内容',
                     icon: 'fa-edit',
@@ -3268,4 +3350,4 @@ $('#menu_calc_program_manage').click(function () {
 
 $("#mainNav").on("click"," li a",function(e){
     projectObj.project.projectMarkChecking();
-});
+});

+ 0 - 1
web/building_saas/main/js/views/std_billsGuidance_lib.js

@@ -762,7 +762,6 @@ const billsGuidance = (function () {
         let ruleText = node && node.data.ruleText ? node.data.ruleText : '无内容';
 
         $('#questionTab1').text('补注');
-        $('#questionTab2').text('工程量计算规则');
         $('#questionContent1').html(recharge);
         $('#questionContent2').html(ruleText);
         $('#questionModal').modal('show');

+ 0 - 1
web/building_saas/main/js/views/std_ration_lib.js

@@ -87,7 +87,6 @@ var rationLibObj = {
         }
         let ruleText = node && node.data.ruleText ? node.data.ruleText : '无内容';
         $('#questionTab1').text('说明');
-        $('#questionTab2').text('工程量计算规则');
         $('#questionContent2').html(ruleText);
         $('#questionModal').modal('show');
     },

+ 0 - 30
web/over_write/js/gansu_2013.js

@@ -1,30 +0,0 @@
-'use strict';
-
-/**
- *
- *
- * @author Zhong
- * @date 2018/10/11
- * @version
- */
-
-if(typeof region !== 'undefined') {
-    region = [
-        '兰州',
-        '定西',
-        '天水',
-        '平凉',
-        '庆阳',
-        '武威',
-        '金昌',
-        '张掖',
-        '酒泉',
-        '甘矿',
-        '嘉峪关',
-        '临夏',
-        '合作',
-        '武都',
-        '白银',
-    ];
-    console.log(region);
-}

+ 0 - 464
web/over_write/js/jiangxi_2017.js

@@ -1,464 +0,0 @@
-/**
- * Created by CSL on 2018/11/12.  江西计算程序、基数 等覆盖。
- */
-
-let isJX2017 = true;
-
-// 一般计税取不含税市场价、不含税定额价。简易计税取含税市场价、含税定额价。打开项目时,4个价格根据计税类型只载入其二,所以这里可不作区分。
-function overwriteRationCalcBases (taxType){
-    if (typeof rationCalcBases == 'undefined') return;
-    for (let key in rationCalcBases) delete rationCalcBases[key];
-    // let isJY = taxType == '2';
-
-    rationCalcBases['人工费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.LABOUR], 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.ptMarketPrice, isTender);
-    };
-    rationCalcBases['机械费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender);
-    };
-    rationCalcBases['定额机械费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptBasePrice, isTender);
-    };
-    rationCalcBases['主材费'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.MAIN_MATERIAL], priceTypes.ptMarketPrice, 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.ptDiffPrice, isTender);
-    };
-    rationCalcBases['材料费价差'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptDiffPrice, isTender);
-    };
-    rationCalcBases['机械费价差'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptDiffPrice, isTender);
-    };
-    rationCalcBases['主材费价差'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.MAIN_MATERIAL], priceTypes.ptDiffPrice, isTender);
-    };
-    rationCalcBases['设备费价差'] = function (node, isTender) {
-        return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptDiffPrice, isTender);
-    };
-    rationCalcBases['人工工日'] = function (node, isTender) {
-        return calcTools.labourDays(node, isTender);
-    };
-    rationCalcBases['甲供人工费'] = function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲供人工费', isTender, false);
-    };
-    rationCalcBases['甲供材料费'] = function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲供材料费', isTender, false);
-    };
-    rationCalcBases['甲供机械费'] = function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲供机械费', isTender, false);
-    };
-    rationCalcBases['甲供主材费'] = function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲供主材费', isTender, false);
-    };
-    rationCalcBases['甲供设备费'] = function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲供设备费', isTender, false);
-    };
-    rationCalcBases['甲定人工费'] = function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲定人工费', isTender, false);
-    };
-    rationCalcBases['甲定材料费'] = function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲定材料费', isTender, false);
-    };
-    rationCalcBases['甲定机械费'] = function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲定机械费', isTender, false);
-    };
-    rationCalcBases['甲定主材费'] = function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲定主材费', isTender, false);
-    };
-    rationCalcBases['甲定设备费'] = function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲定设备费', isTender, false);
-    };
-    rationCalcBases['暂估材料费'] = function (node, isTender) {
-        return calcTools.estimateFee(node, true, isTender);
-    };
-    rationCalcBases['分包人工费'] = function (node, isTender) {
-        if (node.data.isSubcontract)
-            return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptMarketPrice, isTender)
-        else
-            return 0;
-    };
-    rationCalcBases['分包材料费'] = function (node, isTender) {
-        if (node.data.isSubcontract)
-            return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptMarketPrice, isTender)
-        else
-            return 0;
-    };
-    rationCalcBases['分包机械费'] = function (node, isTender) {
-        if (node.data.isSubcontract)
-            return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender)
-        else
-            return 0;
-    };
-    rationCalcBases['分包主材费'] = function (node, isTender) {
-        if (node.data.isSubcontract)
-            return calcTools.rationBaseFee(node, [gljType.MAIN_MATERIAL], priceTypes.ptMarketPrice, isTender)
-        else
-            return 0;
-    };
-    rationCalcBases['分包设备费'] = function (node, isTender) {
-        if (node.data.isSubcontract)
-            return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice, isTender)
-        else
-            return 0;
-    };
-    rationCalcBases['分包人工工日'] = function (node, isTender) {
-        if (node.data.isSubcontract)
-            return calcTools.labourDays(node, isTender)
-        else
-            return 0;
-    };
-};
-
-(function overwriteFeeTypes() {
-    if (typeof cpFeeTypes == 'undefined') return;
-    cpFeeTypes = [
-        {type: 'direct', name: '直接费'},
-        {type: 'labour', name: '人工费'},
-        {type: 'marketLabour', name: '市场价人工费'},
-        {type: 'marketMaterial', name: '市场价材料费'},
-        {type: 'machine', name: '机械费'},
-        {type: 'marketMachine', name: '市场价机械费'},
-        {type: 'mainMaterial', name: '主材费'},
-        {type: 'equipment', name: '设备费'},
-        {type: 'manage', name: '企业管理费'},
-        {type: 'surtax', name: '附加税费'},
-        {type: 'profit', name: '利润'},
-        {type: 'safeMeasures', name: '安全文明施工措施费'},
-        {type: 'environment', name: '安全文明环保费'},
-        {type: 'tempFacility', name: '临时设施费'},
-        {type: 'otherTotalMeasures', name: '其他总价措施费'},
-        {type: 'dirtMeasures', name: '扬尘治理措施费'},
-        {type: 'forceFee', name: '规费'},
-        {type: 'tax', name: '税金'},
-        {type: 'common', name: '工程造价'}
-    ];
-})();
-
-
-//清单计算基数相关
-if(typeof baseFigureMap !== 'undefined'){
-    baseFigureMap = {
-        //与清单直接关联=======
-        '分部分项工程费': {base: 'FBFXGCF', fixedFlag: fixedFlag.SUB_ENGINERRING, class: 'FBFX'},
-        //'分部分项直接费': {base: 'FBFXZJF', fixedFlag: fixedFlag.SUB_ENGINERRING, class: 'FBFX'},
-        '分部分项定额人工费': {base: 'FBFXDEJJRGF', fixedFlag: fixedFlag.SUB_ENGINERRING, class: 'FBFX'},
-        '分部分项人工费': {base: 'FBFXRGF', fixedFlag: fixedFlag.SUB_ENGINERRING, class: 'FBFX'},
-        '分部分项材料费': {base: 'FBFXCLF', fixedFlag: fixedFlag.SUB_ENGINERRING, class: 'FBFX'},
-        '分部分项定额机械费': {base: 'FBFXDEJJJXF', fixedFlag: fixedFlag.SUB_ENGINERRING, class: 'FBFX'},
-        '分部分项机械费': {base: 'FBFXJXF', fixedFlag: fixedFlag.SUB_ENGINERRING, class: 'FBFX'},
-        '分部分项主材费': {base: 'FBFXZCF', fixedFlag: fixedFlag.SUB_ENGINERRING, class: 'FBFX'},
-        '分部分项设备费': {base: 'FBFXSBF', fixedFlag: fixedFlag.SUB_ENGINERRING, class: 'FBFX'},
-        '分部分项人工工日': {base: 'FBFXRGGR', fixedFlag: fixedFlag.SUB_ENGINERRING, class: 'FBFX'},
-        '措施项目费': {base: 'CSXMF', fixedFlag: fixedFlag.MEASURE, class: 'CSXM'},
-        '组织措施项目费': {base: 'ZZCSXMF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION, class: 'CSXM'},
-        '组织措施项目人工费': {base: 'ZZCSXMRGF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION, class: 'CSXM'},
-        '组织措施项目材料费': {base: 'ZZCSXMCLF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION, class: 'CSXM'},
-        '组织措施项目机械费': {base: 'ZZCSXMJXF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION, class: 'CSXM'},
-        '技术措施项目费': {base: 'JSCSXMF', fixedFlag: fixedFlag.CONSTRUCTION_TECH, class: 'CSXM'},
-        '技术措施项目定额人工费': {base: 'JSCSXMDEJJRGF', fixedFlag: fixedFlag.CONSTRUCTION_TECH, class: 'CSXM'},
-        '技术措施项目人工费': {base: 'JSCSXMRGF', fixedFlag: fixedFlag.CONSTRUCTION_TECH, class: 'CSXM'},
-        '技术措施项目材料费': {base: 'JSCSXMCLF', fixedFlag: fixedFlag.CONSTRUCTION_TECH, class: 'CSXM'},
-        '技术措施项目定额机械费': {base: 'JSCSXMDEJJJXF', fixedFlag: fixedFlag.CONSTRUCTION_TECH, class: 'CSXM'},
-        '技术措施项目机械费': {base: 'JSCSXMJXF', fixedFlag: fixedFlag.CONSTRUCTION_TECH, class: 'CSXM'},
-        '技术措施项目主材费': {base: 'JSCSXMZCF', fixedFlag: fixedFlag.CONSTRUCTION_TECH, class: 'CSXM'},
-        '技术措施项目设备费': {base: 'JSCSXMSBF', fixedFlag: fixedFlag.CONSTRUCTION_TECH, class: 'CSXM'},
-        '技术措施项目人工工日': {base: 'JSCSXMRGGR', fixedFlag: fixedFlag.CONSTRUCTION_TECH, class: 'CSXM'},
-        '其他项目费': {base: 'QTXMF',  fixedFlag: fixedFlag.OTHER, class: 'QTXM'},
-        '规费': {base: 'GF', fixedFlag: fixedFlag.CHARGE, class: 'GF'},
-        '税金': {base: 'SJ', fixedFlag: fixedFlag.TAX, class: 'SJ'},
-        //不于清单直接关联==========
-        '建筑面积': {base: 'JZMJ', class: 'FBFX'},
-        '人材机价差': {base: 'RCJJC', class: 'RCJ'},
-        '人工价差': {base: 'RGJC', class: 'RCJ'},
-        '材料价差': {base: 'CLJC', class: 'RCJ'},
-        '机械价差': {base: 'JXJC', class: 'RCJ'},
-        '甲供人工费': {base: 'JGRGF', class: 'RCJ'},
-        '甲供材料费': {base: 'JGCLF', class: 'RCJ'},
-        '甲供机械费': {base: 'JGJXF', class: 'RCJ'},
-        '甲供主材费': {base: 'JGZCF', class: 'RCJ'},
-        '甲供设备费': {base: 'JGSBF', class: 'RCJ'},
-        '甲定人工费': {base: 'JDRGF', class: 'RCJ'},
-        '甲定材料费': {base: 'JDCLF', class: 'RCJ'},
-        '甲定机械费': {base: 'JDJXF', class: 'RCJ'},
-        '甲定主材费': {base: 'JDZCF', class: 'RCJ'},
-        '甲定设备费': {base: 'JDSBF', class: 'RCJ'},
-        '暂估材料费(从子目汇总)': {base: 'ZGCLFFZM', class: 'RCJ'},
-        '分包费': {base: 'FBF', class: 'FBF'},
-        '分包人工费': {base: 'FBRGF', class: 'FBF'},
-        '分包材料费': {base: 'FBCLF', class: 'FBF'},
-        '分包机械费': {base: 'FBJXF', class: 'FBF'},
-        '分包主材费': {base: 'FBZCF', class: 'FBF'},
-        '分包设备费': {base: 'FBSBF', class: 'FBF'},
-        '分包人工工日': {base: 'FBRGGR', class: 'FBF'},
-        '估价项目定额人工费': {base: 'GJXMDERGF', class: 'GJXM'},
-        '估价项目定额机械费': {base: 'GJXMDEJXF', class: 'GJXM'},
-        //'估价项目直接费': {base: 'GJXMZJF', class: 'GJXM'},
-        '估价项目人工费': {base: 'GJXMRGF', class: 'GJXM'},
-        '估价项目材料费': {base: 'GJXMCLF', class: 'GJXM'},
-        '估价项目机械费': {base: 'GJXMJXF', class: 'GJXM'},
-        '估价项目主材费': {base: 'GJXMZCF', class: 'GJXM'},
-        '估价项目工日': {base: 'GJXMGR', class: 'GJXM'},
-    };
-}
-if(typeof baseFigureTemplate !== 'undefined'){
-    /*baseFigureTemplate['FBFXZJF'] =  function (tender) {//分部分项直接费
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.SUB_ENGINERRING]['bill'];
-        if(cbTools.isUnDef(bill)) return 0;
-        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
-        return cbTools.isDef(bill.feesIndex.direct) && cbTools.isDef(bill.feesIndex.direct[totalFeeType]) ? bill.feesIndex.direct[totalFeeType] : 0;
-    };*/
-    baseFigureTemplate['FBFXRGF'] =  function (tender) {//分部分项人工费(市场人工费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.SUB_ENGINERRING]['bill'];
-        if(cbTools.isUnDef(bill)) return 0;
-        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
-        return cbTools.isDef(bill.feesIndex.marketLabour) && cbTools.isDef(bill.feesIndex.marketLabour[totalFeeType]) ? bill.feesIndex.marketLabour[totalFeeType] : 0;
-    };
-    baseFigureTemplate['FBFXCLF'] =  function (tender) {//分部分项材料费(市场材料费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.SUB_ENGINERRING]['bill'];
-        if(cbTools.isUnDef(bill)) return 0;
-        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
-        return cbTools.isDef(bill.feesIndex.marketMaterial) && cbTools.isDef(bill.feesIndex.marketMaterial[totalFeeType]) ? bill.feesIndex.marketMaterial[totalFeeType] : 0;
-    };
-    baseFigureTemplate['FBFXJXF'] =  function (tender) {//分部分项机械费(市场机械费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.SUB_ENGINERRING]['bill'];
-        if(cbTools.isUnDef(bill)) return 0;
-        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
-        return cbTools.isDef(bill.feesIndex.marketMachine) && cbTools.isDef(bill.feesIndex.marketMachine[totalFeeType]) ? bill.feesIndex.marketMachine[totalFeeType] : 0;
-    };
-    baseFigureTemplate['ZZCSXMRGF'] =  function (tender) {//组织措施项目人工费(市场人工费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION]['bill'];
-        if(cbTools.isUnDef(bill)) return 0;
-        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
-        return cbTools.isDef(bill.feesIndex.marketLabour) && cbTools.isDef(bill.feesIndex.marketLabour[totalFeeType]) ? bill.feesIndex.marketLabour[totalFeeType] : 0;
-    };
-    baseFigureTemplate['ZZCSXMCLF'] =  function (tender) {//组织措施项目材料费(市场材料费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION]['bill'];
-        if(cbTools.isUnDef(bill)) return 0;
-        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
-        return cbTools.isDef(bill.feesIndex.marketMaterial) && cbTools.isDef(bill.feesIndex.marketMaterial[totalFeeType]) ? bill.feesIndex.marketMaterial[totalFeeType] : 0;
-    };
-    baseFigureTemplate['ZZCSXMJXF'] =  function (tender) {//组织措施项目机械费(市场机械费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION]['bill'];
-        if(cbTools.isUnDef(bill)) return 0;
-        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
-        return cbTools.isDef(bill.feesIndex.marketMachine) && cbTools.isDef(bill.feesIndex.marketMachine[totalFeeType]) ? bill.feesIndex.marketMachine[totalFeeType] : 0;
-    };
-    baseFigureTemplate['JSCSXMRGF'] =  function (tender) {//技术措施项目人工费(市场人工费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH]['bill'];
-        if(cbTools.isUnDef(bill)) return 0;
-        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
-        return cbTools.isDef(bill.feesIndex.marketLabour) && cbTools.isDef(bill.feesIndex.marketLabour[totalFeeType]) ? bill.feesIndex.marketLabour[totalFeeType] : 0;
-    };
-    baseFigureTemplate['JSCSXMCLF'] =  function (tender) {//技术措施项目材料费(市场材料费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH]['bill'];
-        if(cbTools.isUnDef(bill)) return 0;
-        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
-        return cbTools.isDef(bill.feesIndex.marketMaterial) && cbTools.isDef(bill.feesIndex.marketMaterial[totalFeeType]) ? bill.feesIndex.marketMaterial[totalFeeType] : 0;
-    };
-    baseFigureTemplate['JSCSXMJXF'] =  function (tender) {//技术措施项目机械费(市场机械费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH]['bill'];
-        if(cbTools.isUnDef(bill)) return 0;
-        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
-        return cbTools.isDef(bill.feesIndex.marketMachine) && cbTools.isDef(bill.feesIndex.marketMachine[totalFeeType]) ? bill.feesIndex.marketMachine[totalFeeType] : 0;
-    };
-    baseFigureTemplate['FBRGF'] =  function (tender) {//分包人工费(市场人工费)
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        for(let ration of rations){
-            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.marketLabour){
-                rst = parseFloat(rst + ration.feesIndex.marketLabour[totalFeeType]).toDecimal(decimalObj.ration.totalPrice)
-            }
-        }
-        return rst;
-    };
-    baseFigureTemplate['FBCLF'] =  function (tender) {//分包材料费(市场材料费)
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        for(let ration of rations){
-            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.marketMaterial){
-                rst = parseFloat(rst + ration.feesIndex.marketMaterial[totalFeeType]).toDecimal(decimalObj.ration.totalPrice)
-            }
-        }
-        return rst;
-    };
-    baseFigureTemplate['FBJXF'] =  function (tender) {//分包机械费(市场机械费)
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        for(let ration of rations){
-            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.marketMachine){
-                rst = parseFloat(rst + ration.feesIndex.marketMachine[totalFeeType]).toDecimal(decimalObj.ration.totalPrice)
-            }
-        }
-        return rst;
-    };
-    baseFigureTemplate['GJXMDERGF'] =  function (tender) {//估计项目定额人工费
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';//
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        for(let ration of rations){
-            if(ration.evaluationProject && ration.feesIndex && ration.feesIndex.labour){
-                rst = parseFloat(rst + ration.feesIndex.labour[totalFeeType]).toDecimal(decimalObj.ration.totalPrice)
-            }
-        }
-        return rst;
-    };
-    baseFigureTemplate['GJXMDEJXF'] =  function (tender) {//估计项目定额机械费
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        for(let ration of rations){
-            if(ration.evaluationProject && ration.feesIndex && ration.feesIndex.machine){
-                rst = parseFloat(rst + ration.feesIndex.machine[totalFeeType]).toDecimal(decimalObj.ration.totalPrice)
-            }
-        }
-        return rst;
-    };
-    /*baseFigureTemplate['GJXMZJF'] =  function (tender) {//估计项目直接费
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        for(let ration of rations){
-            if(ration.evaluationProject && ration.feesIndex && ration.feesIndex.direct){
-                rst = parseFloat(rst + ration.feesIndex.direct[totalFeeType]).toDecimal(decimalObj.ration.totalPrice)
-            }
-        }
-        return rst;
-    };*/
-    baseFigureTemplate['GJXMRGF'] =  function (tender) {//估计项目人工费(市场人工费)
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        for(let ration of rations){
-            if(ration.evaluationProject && ration.feesIndex && ration.feesIndex.marketLabour){
-                rst = parseFloat(rst + ration.feesIndex.marketLabour[totalFeeType]).toDecimal(decimalObj.ration.totalPrice)
-            }
-        }
-        return rst;
-    };
-    baseFigureTemplate['GJXMCLF'] =  function (tender) {//估计项目材料费(市场材料费)
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        for(let ration of rations){
-            if(ration.evaluationProject && ration.feesIndex && ration.feesIndex.marketMaterial){
-                rst = parseFloat(rst + ration.feesIndex.marketMaterial[totalFeeType]).toDecimal(decimalObj.ration.totalPrice)
-            }
-        }
-        return rst;
-    };
-    baseFigureTemplate['GJXMJXF'] =  function (tender) {//估计项目机械费(市场机械费)
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        for(let ration of rations){
-            if(ration.evaluationProject && ration.feesIndex && ration.feesIndex.marketMachine){
-                rst = parseFloat(rst + ration.feesIndex.marketMachine[totalFeeType]).toDecimal(decimalObj.ration.totalPrice)
-            }
-        }
-        return rst;
-    };
-    baseFigureTemplate['GJXMZCF'] =  function (tender) {//估计项目主材费
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        for(let ration of rations){
-            if(ration.evaluationProject && ration.feesIndex && ration.feesIndex.mainMaterial){
-                rst = parseFloat(rst + ration.feesIndex.mainMaterial[totalFeeType]).toDecimal(decimalObj.ration.totalPrice)
-            }
-        }
-        return rst;
-    };
-    baseFigureTemplate['GJXMGR'] =  function (tender) {//估计项目工日
-        const quantityType = tender ? 'tenderQuantity' : 'quantity';
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        let rationGljs = calcBase.project.ration_glj.datas;
-        for (let ration of rations) {
-            if (ration.evaluationProject && ration.type === rationType.ration) {
-                for(let glj of rationGljs){
-                    if(ration.ID === glj.rationID && glj.type === gljType.LABOUR){
-                        rst = parseFloat(rst + parseFloat(glj[quantityType] * ration[quantityType]).toDecimal(decimalObj.glj.quantity)).toDecimal(decimalObj.glj.quantity);
-                    }
-                }
-            }
-        }
-        return rst;
-    };
-}
-//增加清单基数分类估价项目、去除分类税前工程造价
-if(typeof $ !== 'undefined' && $('#cbClassList')){
-    $('#cbClassList').find('li:eq(8)').remove();
-    let $li = $('<li class="py-1"><a id="cb_GJXM" href="javascript:void(0);">估价项目</a></li>');
-    $li.insertAfter($('#cbClassList').find('li:eq(4)'));
-}
-if (typeof calcBaseView !== 'undefined') {
-    calcBaseView.billsCBClass = {ALL: [], FBFX: [], CSXM: [], QTXM: [], FBF: [], RCJ: [], GF: [], SJ: [], GJXM: []};
-}
-// (江西)项目属性-关于计算中的取费方式默认勾选子目单价取费(反算)方式。
-// 根据重写去给项目的billsCalcMode赋值比这种形式麻烦
-if (typeof leafBillGetFeeType !== 'undefined') {
-    leafBillGetFeeType = {
-        rationPriceConverse: 0,
-        rationContent: 1,
-        rationPrice: 2,
-        billsPrice: 3
-    };
-}
-
-
-
-

+ 28 - 5
web/over_write/js/neimeng_2019.js

@@ -17,6 +17,13 @@ function overwriteRationCalcBases (){
     rationCalcBases['施工机械使用费'] = function (node, isTender) {
         return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender);
     };
+    rationCalcBases['施工机械人工费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.MACHINE_LABOUR], priceTypes.ptDiffPrice, 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);
     };
@@ -26,27 +33,43 @@ function overwriteRationCalcBases (){
     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() {
     if (typeof cpFeeTypes == 'undefined') return;
     cpFeeTypes = [
-        {type: 'direct', name: '直接费'},
         {type: 'labour', name: '人工费'},
         {type: 'material', name: '材料费'},
         {type: 'machine', name: '施工机械使用费'},
-        {type: 'rDirect', name: '定额直接费'},
+        {type: 'equipment', name: '设备购置费'},
+        {type: 'direct', name: '直接费'},
+
         {type: 'rLabour', name: '定额人工费'},
         {type: 'rMaterial', name: '定额材料费'},
         {type: 'rMachine', name: '定额施工机械使用费'},
+        {type: 'rEquipment', name: '定额设备购置费'},
+        {type: 'rDirect', name: '定额直接费'},
+
         {type: 'measure', name: '措施费'},
         {type: 'manage', name: '企业管理费'},
         {type: 'force', name: '规费'},
         {type: 'profit', name: '利润'},
         {type: 'tax', name: '税金'},
-        {type: 'safeProduce', name: '安全生产费'},
-        {type: 'common', name: '建筑安装工程费'},
-        {type: 'rCommon', name: '定额建筑安装工程费'}
+        {type: 'common', name: '建安费'},
+        {type: 'rCommon', name: '定额建安费'},
+        {type: 'safeProduce', name: '安全生产费'}
     ];
 })();
 

+ 48 - 0
web/over_write/js/zhejiang_2005.js

@@ -138,6 +138,54 @@ if (typeof baseFigureTemplate !== 'undefined' && baseFigureTemplate.budget) {
     };
 }
 
+if (typeof gljOprObj !== 'undefined') {
+    // 添加、替换工料机界面工料机排序
+    gljOprObj.sortSelectViewGLJ = function (data) {
+        // 工料机编码:按“-”前的数值排序
+        const reg = /[^-]+/;
+        data.sort((a, b) => {
+            const orgCodeA = a.code;
+            const orgCodeB = b.code;
+            const regCodeA = orgCodeA.match(reg);
+            const regCodeB = orgCodeB.match(reg);
+            const compareCodeA = regCodeA
+                ? +regCodeA[0]
+                    ? +regCodeA[0]
+                    : regCodeA[0]
+                : orgCodeA;
+            const compareCodeB = regCodeB
+                ? +regCodeB[0]
+                    ? +regCodeB[0]
+                    : regCodeB
+                : orgCodeB;
+            return isNaN(compareCodeA) && isNaN(compareCodeB)
+                ? compareCodeA.localeCompare(compareCodeB)
+                : compareCodeA - compareCodeB;
+        });
+        // 工料机类型排序:人工、机上人工、混凝土、砂浆、配合比、普通材料、商品混凝土、商品砂浆、外购砼构件、绿化苗木、机械台班、机械组成物、设备。
+        const TypeMap = {
+            1: 1,
+            303: 2,
+            202: 3,
+            203: 4,
+            204: 5,
+            201: 6,
+            205: 7,
+            206: 8,
+            208: 9,
+            209: 10,
+            301: 11,
+            302: 12,
+            5: 13,
+        };
+        data.sort((a, b) => {
+            const typeA = TypeMap[a.gljType];
+            const typeB = TypeMap[b.gljType];
+            return typeA - typeB;
+        });
+    }
+
+}
 
 if(typeof gljUtil !== 'undefined'){
     gljUtil.getCodeSortMath = getCodeSortMath