Explorar o código

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

zhangweicheng hai 1 ano
pai
achega
dc68a9e87c

+ 275 - 191
web/maintain/report/css/main.css

@@ -1,296 +1,380 @@
 /*building SAAS 0.1*/
 /*bootstrap 初始化*/
 body {
-    font-size: 0.9rem
+  font-size: 0.9rem;
 }
 .dropdown-menu {
-    font-size: 0.9rem
+  font-size: 0.9rem;
 }
 /*自定义css*/
 .header {
-    background: #e1e1e1
+  background: #e1e1e1;
 }
 .header .header-logo {
-    background: #ff6501;
-    color: #fff;
-    float: left;
-    padding-top: .25rem;
-    padding-bottom: .25rem;
-    margin-right: 1rem;
-    font-size: 1.25rem;
-    line-height: inherit
-}
-.top-msg{
+  background: #ff6501;
+  color: #fff;
+  float: left;
+  padding-top: 0.25rem;
+  padding-bottom: 0.25rem;
+  margin-right: 1rem;
+  font-size: 1.25rem;
+  line-height: inherit;
+}
+.top-msg {
   position: fixed;
-  top:0;
-  width:100%;
-  z-index: 999
-}
-.in-1{padding-left:0rem!important}
-.in-2{padding-left:1rem!important}
-.in-3{padding-left:1.5rem!important}
-.in-4{padding-left:2rem!important}
-.in-5{padding-left:2.5rem!important}
-.in-6{padding-left:3rem!important}
+  top: 0;
+  width: 100%;
+  z-index: 999;
+}
+.in-1 {
+  padding-left: 0rem !important;
+}
+.in-2 {
+  padding-left: 1rem !important;
+}
+.in-3 {
+  padding-left: 1.5rem !important;
+}
+.in-4 {
+  padding-left: 2rem !important;
+}
+.in-5 {
+  padding-left: 2.5rem !important;
+}
+.in-6 {
+  padding-left: 3rem !important;
+}
 .main {
-    position: relative;
-    background: #f7f7f9;
+  position: relative;
+  background: #f7f7f9;
 }
 .main-nav {
-    position: absolute;
-    text-align: center;
-    z-index: 999;
-    padding: 2px 0 0 2px
+  position: absolute;
+  text-align: center;
+  z-index: 999;
+  padding: 2px 0 0 2px;
 }
 .main-nav .nav a {
-    display: block;
-    width: 28px;
-    text-align: center;
-    line-height: 18px;
-    color: #999;
-    padding: 10px 0;
-    border-right: 1px solid #ccc;
+  display: block;
+  width: 28px;
+  text-align: center;
+  line-height: 18px;
+  color: #999;
+  padding: 10px 0;
+  border-right: 1px solid #ccc;
 }
 .main-nav .nav a:hover {
-    background: #fff;
-    color: #333;
-    text-decoration: none;
+  background: #fff;
+  color: #333;
+  text-decoration: none;
 }
 .main-nav .nav a.active {
-    border: 1px solid #ccc;
-    border-right: 1px solid #fff;
-    background: #fff;
-    color: #333
+  border: 1px solid #ccc;
+  border-right: 1px solid #fff;
+  background: #fff;
+  color: #333;
 }
 .content {
-    background: #fff
+  background: #fff;
 }
 .tools-btn {
-    height: 30px;
-    line-height: 30px;
+  height: 30px;
+  line-height: 30px;
 }
 .toolsbar .tools-btn.btn:hover {
-    background: #f7f7f9;
+  background: #f7f7f9;
 }
 .main-side {
-    border-right: 1px solid #ccc;
-    overflow-y: auto;
+  border-right: 1px solid #ccc;
+  overflow-y: auto;
 }
 .main-side .tab-bar {
-    padding:5px 10px;
-    height:38px;
-    position:fixed;
+  padding: 5px 10px;
+  height: 38px;
+  position: fixed;
 }
 .main-side .tab-content {
-    margin-top: 38px
+  margin-top: 38px;
 }
-.top-content, .fluid-content {
-    overflow: hidden;
-    border-bottom: 1px solid #ccc;
+.top-content,
+.fluid-content {
+  overflow: hidden;
+  border-bottom: 1px solid #ccc;
 }
 .warp-p2 {
-    padding: 2px
+  padding: 2px;
 }
-.bottom-content .nav,.top-content .nav {
-    background: #f7f7f9;
-    padding:0 0 0 2px
+.bottom-content .nav,
+.top-content .nav {
+  background: #f7f7f9;
+  padding: 0 0 0 2px;
 }
-.bottom-content .nav-tabs .nav-link, .side-tabs .nav-tabs .nav-link,.top-content .nav-tabs .nav-link {
-    border-radius: 0;
-    padding: 0.2em 0.5em
+.bottom-content .nav-tabs .nav-link,
+.side-tabs .nav-tabs .nav-link,
+.top-content .nav-tabs .nav-link {
+  border-radius: 0;
+  padding: 0.2em 0.5em;
 }
 .side-tabs .nav-tabs .nav-item {
-  z-index: 999
+  z-index: 999;
 }
 .side-tabs .nav-tabs {
-    border-bottom: none;
-    margin-bottom: -1px
+  border-bottom: none;
+  margin-bottom: -1px;
 }
 .side-tabs .nav-tabs .nav-link {
-    border-radius: 0;
-    padding: 0em 0.5em;
-    line-height: 30px;
-    z-index: 999
+  border-radius: 0;
+  padding: 0em 0.5em;
+  line-height: 30px;
+  z-index: 999;
 }
 .bottom-content .nav-tabs .nav-link.active {
-    border-top: 1px solid #f7f7f9
+  border-top: 1px solid #f7f7f9;
 }
 .side-tabs .nav-tabs .nav-link.active {
-    border-top: none;
-    border-bottom:1px solid #fff
+  border-top: none;
+  border-bottom: 1px solid #fff;
 }
-.side-tabs a.active, .sub-nav a.active {
-    background: #ccc
+.side-tabs a.active,
+.sub-nav a.active {
+  background: #ccc;
 }
 .poj-manage {
-    background: #fff
+  background: #fff;
 }
 .slide-sidebar {
-    border-left: 1px solid #E1E1E1;
-    box-shadow: 0px 15px 15px rgba(0, 0, 0, 0.1);
-    background: none repeat scroll 0% 0% #ffffff;
-    overflow: hidden;
-    position: absolute;
-    right: 0px;
-    top: 0;
-    z-index: 999;
-    width: 0px;
+  border-left: 1px solid #e1e1e1;
+  box-shadow: 0px 15px 15px rgba(0, 0, 0, 0.1);
+  background: none repeat scroll 0% 0% #ffffff;
+  overflow: hidden;
+  position: absolute;
+  right: 0px;
+  top: 0;
+  z-index: 999;
+  width: 0px;
 }
 .new-msg {
-    -webkit-animation: tada 1s infinite .2s ease both;
-    -moz-animation: tada 1s infinite .2s ease both;
+  -webkit-animation: tada 1s infinite 0.2s ease both;
+  -moz-animation: tada 1s infinite 0.2s ease both;
 }
 @-webkit-keyframes tada {
-    0% {
-        -webkit-transform: scale(1)
-    }
-    10%, 20% {
-        -webkit-transform: scale(0.9) rotate(-3deg)
-    }
-    30%, 50%, 70%, 90% {
-        -webkit-transform: scale(1.1) rotate(3deg)
-    }
-    40%, 60%, 80% {
-        -webkit-transform: scale(1.1) rotate(-3deg)
-    }
-    100% {
-        -webkit-transform: scale(1) rotate(0)
-    }
+  0% {
+    -webkit-transform: scale(1);
+  }
+  10%,
+  20% {
+    -webkit-transform: scale(0.9) rotate(-3deg);
+  }
+  30%,
+  50%,
+  70%,
+  90% {
+    -webkit-transform: scale(1.1) rotate(3deg);
+  }
+  40%,
+  60%,
+  80% {
+    -webkit-transform: scale(1.1) rotate(-3deg);
+  }
+  100% {
+    -webkit-transform: scale(1) rotate(0);
+  }
 }
 @-moz-keyframes tada {
-    0% {
-        -moz-transform: scale(1)
-    }
-    10%, 20% {
-        -moz-transform: scale(0.9) rotate(-3deg)
-    }
-    30%, 50%, 70%, 90% {
-        -moz-transform: scale(1.1) rotate(3deg)
-    }
-    40%, 60%, 80% {
-        -moz-transform: scale(1.1) rotate(-3deg)
-    }
-    100% {
-        -moz-transform: scale(1) rotate(0)
-    }
+  0% {
+    -moz-transform: scale(1);
+  }
+  10%,
+  20% {
+    -moz-transform: scale(0.9) rotate(-3deg);
+  }
+  30%,
+  50%,
+  70%,
+  90% {
+    -moz-transform: scale(1.1) rotate(3deg);
+  }
+  40%,
+  60%,
+  80% {
+    -moz-transform: scale(1.1) rotate(-3deg);
+  }
+  100% {
+    -moz-transform: scale(1) rotate(0);
+  }
 }
 .has-danger {
-    -webkit-animation: shake 1s .2s ease both;
-    -moz-animation: shake 1s .2s ease both;
-    animation: shake 1s .2s ease both;
+  -webkit-animation: shake 1s 0.2s ease both;
+  -moz-animation: shake 1s 0.2s ease both;
+  animation: shake 1s 0.2s ease both;
 }
 @-webkit-keyframes shake {
-    0%, 100% {
-        -webkit-transform: translateX(0);
-    }
-    10%, 30%, 50%, 70%, 90% {
-        -webkit-transform: translateX(-10px);
-    }
-    20%, 40%, 60%, 80% {
-        -webkit-transform: translateX(10px);
-    }
+  0%,
+  100% {
+    -webkit-transform: translateX(0);
+  }
+  10%,
+  30%,
+  50%,
+  70%,
+  90% {
+    -webkit-transform: translateX(-10px);
+  }
+  20%,
+  40%,
+  60%,
+  80% {
+    -webkit-transform: translateX(10px);
+  }
 }
 @-moz-keyframes shake {
-    0%, 100% {
-        -moz-transform: translateX(0);
-    }
-    10%, 30%, 50%, 70%, 90% {
-        -moz-transform: translateX(-10px);
-    }
-    20%, 40%, 60%, 80% {
-        -moz-transform: translateX(10px);
-    }
+  0%,
+  100% {
+    -moz-transform: translateX(0);
+  }
+  10%,
+  30%,
+  50%,
+  70%,
+  90% {
+    -moz-transform: translateX(-10px);
+  }
+  20%,
+  40%,
+  60%,
+  80% {
+    -moz-transform: translateX(10px);
+  }
 }
 @keyframes shake {
-    0%, 100% {
-        transform: translateX(0);
-    }
-    10%, 30%, 50%, 70%, 90% {
-        transform: translateX(-10px);
-    }
-    20%, 40%, 60%, 80% {
-        transform: translateX(10px);
-    }
+  0%,
+  100% {
+    transform: translateX(0);
+  }
+  10%,
+  30%,
+  50%,
+  70%,
+  90% {
+    transform: translateX(-10px);
+  }
+  20%,
+  40%,
+  60%,
+  80% {
+    transform: translateX(10px);
+  }
 }
 .bottom-content {
-    height: 370px;
-    overflow: hidden;
+  height: 370px;
+  overflow: hidden;
 }
-.bottom-content .tab-content .main-data-bottom{
-    height: 340px;
-    overflow: auto;
+.bottom-content .tab-content .main-data-bottom {
+  height: 340px;
+  overflow: auto;
 }
 .form-signin {
-    max-width: 500px;
-    margin: 150px auto;
+  max-width: 500px;
+  margin: 150px auto;
 }
-.poj-list, .side-content {
-    overflow: auto;
+.poj-list,
+.side-content {
+  overflow: auto;
 }
 .poj-list span.poj-icon {
-  padding-right:10px;
-  color:#ccc
+  padding-right: 10px;
+  color: #ccc;
 }
-.print-toolsbar{
-  padding:5px
+.print-toolsbar {
+  padding: 5px;
 }
 .print-toolsbar .panel {
-  display:inline-block;
-  vertical-align:top;
-  background:#f7f7f9
+  display: inline-block;
+  vertical-align: top;
+  background: #f7f7f9;
 }
-.print-toolsbar .panel .panel-foot{
+.print-toolsbar .panel .panel-foot {
   text-align: center;
-  font-size: 12px
+  font-size: 12px;
 }
 .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
+.print-list .list-tools {
+  height: 50px;
+  padding: 10px 0;
+  border-bottom: 1px solid #f2f2f2;
 }
 .pageContainer {
   background: #ededed;
-  text-align: center
+  text-align: center;
 }
-.pageContainer .page{
-  border:9px solid transparent;
+.pageContainer .page {
+  border: 9px solid transparent;
   display: inline-block;
 }
-.pageContainer .page img{
-  width:inherit;
+.pageContainer .page img {
+  width: inherit;
   height: inherit;
 }
-.codeList{
-    max-height: 200px;
-    overflow:auto;
+.codeList {
+  max-height: 200px;
+  overflow: auto;
 }
-.main-data-top,.main-data-bottom,.main-data,.main-data-h{
+.main-data-top,
+.main-data-bottom,
+.main-data,
+.main-data-h {
   overflow: auto;
 }
 .modal-fixed-height {
-    height:400px;
-    overflow-y:auto;
+  height: 400px;
+  overflow-y: auto;
 }
 .form-view {
-    border-left:1px solid #ccc;
+  border-left: 1px solid #ccc;
 }
 .ztree {
-  border-style:solid; 
-  border-width:1px; 
-  border-color:#000;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #000;
 }
 .ztree-warp {
-  height:200px;
+  height: 200px;
   overflow: auto;
 }
-.sub-button{
-  position:sticky;
-  bottom:0;
-  left:0
+.sub-button {
+  position: sticky;
+  bottom: 0;
+  left: 0;
+}
+
+.valuationSelector {
+  cursor: pointer;
+  position: absolute;
+  left: 105px;
+  top: 38px;
+  border: 1px solid #d9d9d9;
+  display: none;
+}
+.mutiSelector {
+  width: 130px;
+  margin: 0;
+  padding: 0 10px;
+}
+.mutiSelector li {
+  list-style: none;
+  font-size: 16px;
+}
+.mutiSelector .checked {
+  background-color: #0275d8;
+  color: #fff;
+}
+.mutiSelector li:hover {
+  background-color: #0275d8;
+  color: #fff;
+  cursor: pointer;
 }

+ 17 - 12
web/maintain/report/html/rpt_tpl_dtl_info.html

@@ -58,19 +58,24 @@
                     <div class="input-group-addon">额外标记</div>
                     <select class="form-control input-sm" id="element_flags_select" onchange="zTreeOprObj.onChangeFlag('taxType', this)"><option value ="NA">N/A</option><option value ="1">一般计税</option><option value ="2">简易计税</option></select>
                 </div>
-                <div class="input-group col-2">
+                <div class="input-group col-4">
                     <div class="input-group-addon">工程类型</div>
-                    <select class="form-control input-sm" id="element_prjFlags_select" onchange="zTreeOprObj.onChangeFlag('valuationType', this)">
-                        <option value ="NA">N/A</option>
-                        <option value ="suggestion">建议估算</option>
-                        <option value ="feasibility">可行性估算</option>
-                        <option value ="rough">概算</option>
-                        <option value ="bill">预算</option>
-                        <option value="three_bill_budget">三级清单预算</option>
-                        <option value ="ration">清单预算</option>
-                        <option value="changeBudget">变更预算</option>
-                        <option value="settlement">结算</option>
-                    </select>
+                    <input class="form-control input-sm" id="element_prjFlags_select"
+                        onchange="zTreeOprObj.onChangeFlag('valuationType', this)" style="display: none;">
+                    <input class="form-control input-sm" id="element_prjFlags_selectStr" readonly>
+                    <div id="valuationSelector" class="valuationSelector">
+                        <ul class="mutiSelector">
+                            <li id="valuationSelector_suggestion" value="suggestion">建议估算</li>
+                            <li id="valuationSelector_feasibility" value="feasibility">可行性估算</li>
+                            <li id="valuationSelector_rough" value="rough">概算</li>
+                            <li id="valuationSelector_bill" value="bill">预算</li>
+                            <li id="valuationSelector_three_bill_budget" value="three_bill_budget">三级清单预算</li>
+                            <li id="valuationSelector_ration" value="ration">清单预算</li>
+                            <li id="valuationSelector_changeBudget" value="changeBudget">变更预算</li>
+                            <li id="valuationSelector_settlement" value="settlement">结算</li>
+                        </ul>
+                    
+                    </div>
                 </div>
                 <div class="input-group col-3">
                     <div class="input-group-addon">报表汇总类型</div>

+ 238 - 143
web/maintain/report/js/rpt_tpl_main.js

@@ -15,8 +15,23 @@ const
     NODE_LEVEL_COMPILATION_NEW = 1,
     NODE_LEVEL_USER = 0;
 
+
+// 工程类型枚举值
+const valuationSelectorMap = {
+    valuationSelector_NA: 'N/A',
+    valuationSelector_suggestion: '建议估算',
+    valuationSelector_feasibility: '可行性估算',
+    valuationSelector_rough: '概算',
+    valuationSelector_bill: '预算',
+    valuationSelector_three_bill_budget: '三级清单预算',
+    valuationSelector_ration: '清单预算',
+    valuationSelector_changeBudget: '变更预算',
+    valuationSelector_settlement: '结算'
+}
+
+
 let rptTplObj = {
-    iniPage: function() {
+    iniPage: function () {
         zTreeOprObj.getCompilationList();
         rpt_tpl_cfg_helper.getReportTplCfg();
         selectableFiledTreeOprObj.iniTree();
@@ -33,23 +48,23 @@ let zTreeOprObj = {
     moveSrcTopNode: null,
     dupTplIds: null,
     hasRefreshedDupRefIds: false,
-    getCompilationList: function(){
+    getCompilationList: function () {
         let me = zTreeOprObj, params = {};
-        CommonAjax.postEx("report_tpl_api/getCompilationList", params, 20000, true, function(result){
-                //console.log(result);
-                for (let item of result) {
-                    // if (item.is_release) {
-                        $("#compilations").append("<option value='" + item._id + "'>" + item.name + "</option>");
-                    // }
-                }
-                // me.getReportTemplateTree($("#compilations").get(0));
-                me.getReportTemplateTreeEx($("#compilations").get(0));
-            }, null, null
+        CommonAjax.postEx("report_tpl_api/getCompilationList", params, 20000, true, function (result) {
+            //console.log(result);
+            for (let item of result) {
+                // if (item.is_release) {
+                $("#compilations").append("<option value='" + item._id + "'>" + item.name + "</option>");
+                // }
+            }
+            // me.getReportTemplateTree($("#compilations").get(0));
+            me.getReportTemplateTreeEx($("#compilations").get(0));
+        }, null, null
         );
     },
-    refreshNodes: function() {
+    refreshNodes: function () {
         let me = this;
-        let private_setupIsParent = function(node){
+        let private_setupIsParent = function (node) {
             // if (node.nodeType === RT.NodeType.NODE || node.level === 0) {
             if (node.nodeType === RT.NodeType.NODE || node.level <= NODE_LEVEL_COMPILATION_NEW) {
                 node.isParent = true;
@@ -68,7 +83,7 @@ let zTreeOprObj = {
         }
         me.treeObj.refresh();
     },
-    removeTreeRootNode: function(rawNode, isAsync, callback, failCallback) {
+    removeTreeRootNode: function (rawNode, isAsync, callback, failCallback) {
         let params = {};
         params.compilationId = rawNode.compilationId;
         params.engineerId = rawNode.engineerId;
@@ -76,13 +91,13 @@ let zTreeOprObj = {
         params.isPhysically = true;
         CommonAjax.postEx("report_tpl_api/removeTreeRootNode", params, 5000, isAsync, callback, failCallback, null);
     },
-    copyReportTemplate: function(orgID, newID, isAsync, callback, failCallback) {
+    copyReportTemplate: function (orgID, newID, isAsync, callback, failCallback) {
         let params = {};
         params.orgRptTplId = orgID;
         params.newRptTplId = newID;
         CommonAjax.postEx("report_tpl_api/copyRptTpl", params, 5000, isAsync, callback, failCallback, null);
     },
-    updateTreeRootNode: function(rawNode, isAsync, callback, failCallback) {
+    updateTreeRootNode: function (rawNode, isAsync, callback, failCallback) {
         let params = {};
         params.doc = rawNode;
         CommonAjax.postEx("report_tpl_api/updateTreeRootNode", params, 5000, isAsync, callback, failCallback, null);
@@ -103,7 +118,7 @@ let zTreeOprObj = {
         params.subNode = subNode;
         CommonAjax.postEx("report_tpl_api/updateSubLevelOneNode", params, 5000, isAsync, callback, failCallback, null);
     },
-    createIniNode: function() {
+    createIniNode: function () {
         return {
             nodeType: RT.NodeType.TEMPLATE,
             refId: -1,
@@ -112,7 +127,7 @@ let zTreeOprObj = {
             items: null
         };
     },
-    buildRootNodeDoc: function(topNode, excludeNode) {
+    buildRootNodeDoc: function (topNode, excludeNode) {
         let me = this, rst = null;
         if (topNode) {
             rst = {
@@ -128,7 +143,7 @@ let zTreeOprObj = {
         }
         return rst;
     },
-    buildSubRootNodeDoc: function(subNode) {
+    buildSubRootNodeDoc: function (subNode) {
         let me = this, rst = null;
         if (subNode) {
             let isReleased = false;
@@ -177,18 +192,18 @@ let zTreeOprObj = {
         return itemRst;
     },
 
-    addHoverDom: function(treeId, treeNode) {
+    addHoverDom: function (treeId, treeNode) {
         let me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
-        if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length > 0 || treeNode.nodeType === RT.NodeType.TEMPLATE) return;
+        if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0 || treeNode.nodeType === RT.NodeType.TEMPLATE) return;
         if (treeNode.level === 0) {
             let addStr = "<span class='button star' id='addBtn_" + treeNode.tId + "' title='新增编办类型' onfocus='this.blur();'></span>";
             sObj.after(addStr);
-            let btn = $("#addBtn_"+treeNode.tId);
-            if (btn) btn.bind("click", function(){
+            let btn = $("#addBtn_" + treeNode.tId);
+            if (btn) btn.bind("click", function () {
                 let rawNode = me.createIniComilationNode();
                 if (!me.chkIfDupCompilationNode(rawNode, treeNode)) {
                     rawNode.userId = treeNode.userId;
-                    me.addNewNodeEx(rawNode, function(rst){
+                    me.addNewNodeEx(rawNode, function (rst) {
                         if (rst) {
                             let newNodes = [], isSilent = false;
                             rawNode.isParent = true;
@@ -218,8 +233,8 @@ let zTreeOprObj = {
         } else {
             let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子目录' onfocus='this.blur();'></span>";
             sObj.after(addStr);
-            let btn = $("#addBtn_"+treeNode.tId);
-            if (btn) btn.bind("click", function(){
+            let btn = $("#addBtn_" + treeNode.tId);
+            if (btn) btn.bind("click", function () {
                 me.getNewNodeID(1, function (newNodeID) {
                     let rawNode = me.createIniNode();
                     rawNode.nodeType = RT.NodeType.NODE;
@@ -242,7 +257,7 @@ let zTreeOprObj = {
                         me.treeObj.addNodes(treeNode, insertIdx, newNodes, isSilent);
                         let tn = me.getParentNodeByNodeLevel(treeNode, NODE_LEVEL_COMPILATION_NEW);
                         let newTopNode = me.buildRootNodeDoc(tn);
-                        me.updateTreeRootNode(newTopNode, true, function(rst){
+                        me.updateTreeRootNode(newTopNode, true, function (rst) {
                             if (!(rst)) {
                                 alert("新增节点失败!");
                             }
@@ -253,8 +268,8 @@ let zTreeOprObj = {
             });
             addStr = "<span class='button blue_core' id='addBtn2_" + treeNode.tId + "' title='新增报表模板' onfocus='this.blur();'></span>";
             sObj.after(addStr);
-            btn = $("#addBtn2_"+treeNode.tId + "");
-            if (btn) btn.bind("click", function(){
+            btn = $("#addBtn2_" + treeNode.tId + "");
+            if (btn) btn.bind("click", function () {
                 // let me = zTreeOprObj;
                 if (treeNode.nodeType === RT.NodeType.NODE || treeNode.level === NODE_LEVEL_COMPILATION_NEW) {
                     me.getNewNodeID(1, function (newNodeID) {
@@ -268,7 +283,7 @@ let zTreeOprObj = {
                         me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
                         let tn = me.getParentNodeByNodeLevel(treeNode, NODE_LEVEL_COMPILATION_NEW);
                         let topNode = me.buildRootNodeDoc(tn);
-                        me.updateTreeRootNode(topNode, true, function(rst){
+                        me.updateTreeRootNode(topNode, true, function (rst) {
                             if (!(rst)) {
                                 alert("新增空白模板失败!");
                             }
@@ -279,11 +294,11 @@ let zTreeOprObj = {
             });
         }
     },
-    removeHoverDom: function(treeId, treeNode) {
-        $("#addBtn_"+treeNode.tId).unbind().remove();
-        $("#addBtn2_"+treeNode.tId).unbind().remove();
+    removeHoverDom: function (treeId, treeNode) {
+        $("#addBtn_" + treeNode.tId).unbind().remove();
+        $("#addBtn2_" + treeNode.tId).unbind().remove();
     },
-    addNewNodeEx: function(rawNode, callback, failCallback) {
+    addNewNodeEx: function (rawNode, callback, failCallback) {
         let params = {};
         params.doc = rawNode;
         CommonAjax.postEx("report_tpl_api/createTreeRootNode", params, 5000, true, callback, failCallback, null);
@@ -292,7 +307,7 @@ let zTreeOprObj = {
         let me = zTreeOprObj;
         let topPNode = me.getParentNodeByNodeLevel(treeNode, NODE_LEVEL_COMPILATION_NEW);
         let newTopNode = me.buildRootNodeDoc(topPNode);
-        me.updateTreeRootNode(newTopNode, true, function(rst){
+        me.updateTreeRootNode(newTopNode, true, function (rst) {
             if (!(rst)) {
                 alert("修改发布状态失败!");
             }
@@ -363,7 +378,7 @@ let zTreeOprObj = {
                 treeNodes[0].ID = newNodeID;
                 if (confirm("是否引用相同的报表模板?")) {
                     newTopNode = me.buildRootNodeDoc(targetTopNode);
-                    me.updateTreeRootNode(newTopNode, false, function(goodRst){
+                    me.updateTreeRootNode(newTopNode, false, function (goodRst) {
                         canContinue = true;
                         if (treeNodes[0].rptTpl) {
                             treeNodes[0].rptTpl.ID = newNodeID;
@@ -372,7 +387,7 @@ let zTreeOprObj = {
                         me.chkAndSetDupRefTplIds(me.treeObj.getNodes(), null);
                         me.treeObj.refresh();
                         me.chkAndRreshRefTpl();
-                    }, function(badRst){
+                    }, function (badRst) {
                         displayMessage("更新模板节点失败!", "red", 2000);
                         // console.log(badRst.toString());
                         console.log(badRst);
@@ -381,8 +396,8 @@ let zTreeOprObj = {
                     treeNodes[0].refId = newNodeID;
                     // targetNode.refId = newNodeID; //targetNode可以是父节点也可以是兄弟节点,没必要引用相同的tplID
                     newTopNode = me.buildRootNodeDoc(targetTopNode);
-                    me.copyReportTemplate(orgID, newNodeID, true, function(goodResult){
-                        me.updateTreeRootNode(newTopNode, true, function(goodRst){
+                    me.copyReportTemplate(orgID, newNodeID, true, function (goodResult) {
+                        me.updateTreeRootNode(newTopNode, true, function (goodRst) {
                             canContinue = true;
                             // treeObj.updateNode(nodes[0]);
                             zTreeOprObj.treeObj.updateNode(treeNodes[0]);
@@ -393,12 +408,12 @@ let zTreeOprObj = {
                             me.chkAndSetDupRefTplIds(me.treeObj.getNodes(), null);
                             me.treeObj.refresh();
                             me.chkAndRreshRefTpl();
-                        }, function(badRst){
+                        }, function (badRst) {
                             displayMessage("更新模板节点失败!", "red", 2000);
                             // console.log(badRst.toString());
                             console.log(badRst);
                         });
-                    }, function(badResult){
+                    }, function (badResult) {
                         displayMessage("Copy请求失败!", "red", 2000);
                         // console.log(badResult.toString());
                         console.log(badResult);
@@ -410,19 +425,19 @@ let zTreeOprObj = {
             // }
         } else {
             newTopNode = me.buildRootNodeDoc(targetTopNode);
-            me.updateTreeRootNode(newTopNode, false, function(rst){
+            me.updateTreeRootNode(newTopNode, false, function (rst) {
                 canContinue = true;
                 me.currentNode = treeNodes[0];
-            }, function(badResult){
+            }, function (badResult) {
                 displayMessage("移动请求失败!", "red", 2000);
                 console.log(badResult.toString());
                 canContinue = false;
             });
             if (canContinue && !isCopy && me.moveSrcTopNode) {
                 let newSrcTopNode = me.buildRootNodeDoc(me.moveSrcTopNode);
-                me.updateTreeRootNode(newSrcTopNode, true, function(rst){
+                me.updateTreeRootNode(newSrcTopNode, true, function (rst) {
                     // canContinue = true;
-                }, function(badResult){
+                }, function (badResult) {
                     displayMessage("移动请求失败!", "red", 2000);
                     canContinue = true;
                 });
@@ -430,7 +445,7 @@ let zTreeOprObj = {
             me.moveSrcTopNode = null;
         }
     },
-    addReportTemplate: function(newUsers) {
+    addReportTemplate: function (newUsers) {
         let me = zTreeOprObj, params = {};
         params.compilationId = $("#compilations").get(0).value;
         params.userId = [];
@@ -444,11 +459,11 @@ let zTreeOprObj = {
             allEngIds.push(item.value);
         }
         params.engineerId = allEngIds;
-        CommonAjax.postEx("report_tpl_api/getRptTplTree", params, 20000, true, function(result){
-            result.sort(function(item1, item2){
+        CommonAjax.postEx("report_tpl_api/getRptTplTree", params, 20000, true, function (result) {
+            result.sort(function (item1, item2) {
                 let rst = 0;
                 if (item1.userId === item2.userId) {
-                    rst = (item1.engineerId > item2.engineerId)?1:((item1.engineerId < item2.engineerId)?-1:0);
+                    rst = (item1.engineerId > item2.engineerId) ? 1 : ((item1.engineerId < item2.engineerId) ? -1 : 0);
                 } else {
                     if (item1.userId === "-100") {
                         rst = 1
@@ -462,7 +477,7 @@ let zTreeOprObj = {
                             if (idx1 >= 0 && idx2 >= 0) {
                                 break;
                             }
-                            rst = (idx1 > idx2)?1:((idx1 < idx2)?-1:0);
+                            rst = (idx1 > idx2) ? 1 : ((idx1 < idx2) ? -1 : 0);
                         }
                     }
                 }
@@ -472,7 +487,7 @@ let zTreeOprObj = {
             let allTopTplNodes = [];
             for (let user of newUsers) {
                 allTopUserIdNodes.push(user.userId);
-                allTopTplNodes.push({userId: user.userId, name: user.real_name, items: [], isParent: true});
+                allTopTplNodes.push({ userId: user.userId, name: user.real_name, items: [], isParent: true });
             }
             for (let item of result) {
                 let uidx = allTopUserIdNodes.indexOf(item.userId);
@@ -568,8 +583,8 @@ let zTreeOprObj = {
     getReportTemplateTreeEx: function (compilationSelect) {
         let me = zTreeOprObj, params = {};
         params.compilationId = compilationSelect.value;
-        CommonAjax.postEx("report_tpl_api/getTplTreeByCompilation", params, 20000, true, function(result){
-            result.sort(function(item1, item2){
+        CommonAjax.postEx("report_tpl_api/getTplTreeByCompilation", params, 20000, true, function (result) {
+            result.sort(function (item1, item2) {
                 let rst = 0;
                 if (item1.userId === "-100") {
                     rst = -1;
@@ -580,7 +595,7 @@ let zTreeOprObj = {
             });
             // me.chkAndSetDupRefTplIds(result);
             // console.log(dupRefIds);
-            let allTopTplNodes = [{userId: "-100", name: "公共模板", items:[], isParent: true, refId: ""}];
+            let allTopTplNodes = [{ userId: "-100", name: "公共模板", items: [], isParent: true, refId: "" }];
             if (result.length > 0) {
                 if (!result[0].hasOwnProperty("refId")) {
                     result[0].refId = "";
@@ -600,7 +615,7 @@ let zTreeOprObj = {
                     for (let itemIdx = 1; itemIdx < result.length; itemIdx++) {
                         let item = result[itemIdx];
                         if (item.userId === user._id) {
-                            allTopTplNodes.push({userId: user.userId, name: user.real_name, items: [], isParent: true, refId: ""});
+                            allTopTplNodes.push({ userId: user.userId, name: user.real_name, items: [], isParent: true, refId: "" });
                             allTopTplNodes[allTopTplNodes.length - 1].items.push(result[itemIdx]);
                             break;
                         }
@@ -653,11 +668,11 @@ let zTreeOprObj = {
         }
         return rst;
     },
-    createIniComilationNode: function() {
+    createIniComilationNode: function () {
         //在新的需求下,无需工程id
         let rst = {
             compilationId: $("#compilations").get(0).selectedOptions[0].value,
-            userId: (userAccount ===  'admin')?("-100"):userID,
+            userId: (userAccount === 'admin') ? ("-100") : userID,
             properties: [],
             released: true,
             isDeleted: false,
@@ -666,7 +681,7 @@ let zTreeOprObj = {
         };
         return rst;
     },
-    onBeforeRemove: function(treeId, treeNode){
+    onBeforeRemove: function (treeId, treeNode) {
         let canRemove = false;
         if (treeNode.level > NODE_LEVEL_USER) {
             if (!(treeNode.items) || treeNode.items.length < 1) {
@@ -679,19 +694,19 @@ let zTreeOprObj = {
         }
         return canRemove;
     },
-    onRemove: function(e, treeId, treeNode){
+    onRemove: function (e, treeId, treeNode) {
         if (treeNode.level > NODE_LEVEL_USER) {
             let me = zTreeOprObj,
                 topPNode = me.getParentNodeByNodeLevel(treeNode, NODE_LEVEL_COMPILATION_NEW);
             let rawNode = me.buildRootNodeDoc(topPNode, treeNode);
             if (treeNode.level === NODE_LEVEL_COMPILATION_NEW) {
-                me.removeTreeRootNode(rawNode, true, function(rst){
+                me.removeTreeRootNode(rawNode, true, function (rst) {
                     if (!(rst)) {
                         alert("删除请求失败!");
                     }
                 });
             } else {
-                me.updateTreeRootNode(rawNode, true, function(rst){
+                me.updateTreeRootNode(rawNode, true, function (rst) {
                     if (!(rst)) {
                         alert("删除请求失败!");
                     }
@@ -702,12 +717,12 @@ let zTreeOprObj = {
     },
     beforeEditName: function (treeId, treeNode) {
         if (treeNode.level > NODE_LEVEL_COMPILATION_NEW) {
-            setTimeout(function(){
+            setTimeout(function () {
                 let ip = $("#" + treeNode.tId + IDMark_Input);
                 if (ip.length > 0) {
                     ip[0].className = "individualRename";
                 } else {
-                    setTimeout(function(){
+                    setTimeout(function () {
                         let ip = $("#" + treeNode.tId + IDMark_Input);
                         if (ip.length > 0) {
                             ip[0].className = "individualRename";
@@ -722,13 +737,13 @@ let zTreeOprObj = {
             return false;
         }
     },
-    beforeRename: function(treeId, treeNode, newName, isCancel) {
+    beforeRename: function (treeId, treeNode, newName, isCancel) {
         if (newName.length === 0) {
             return false;
         }
         return true;
     },
-    onRename : function(e, treeId, treeNode, isCancel) {
+    onRename: function (e, treeId, treeNode, isCancel) {
         if (!isCancel) {
             let me = zTreeOprObj;
             if (treeNode.level === 0) {
@@ -737,7 +752,7 @@ let zTreeOprObj = {
                 let subTopNode = me.getParentNodeByNodeLevel(treeNode, NODE_LEVEL_COMPILATION_NEW + 1);
                 let topPNode = subTopNode.getParentNode();
                 let rawNode = me.buildSubRootNodeDoc(subTopNode);
-                me.updateSubNode(topPNode, rawNode, true, function(rst){
+                me.updateSubNode(topPNode, rawNode, true, function (rst) {
                     if (!(rst)) {
                         alert('修改名称请求失败!');
                     }
@@ -745,17 +760,17 @@ let zTreeOprObj = {
             }
         }
     },
-    onChangeFlag: function(flagProp, flagDom){
+    onChangeFlag: function (flagProp, flagDom) {
         let me = zTreeOprObj;
         if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE) {
             if (!me.currentNode.hasOwnProperty("flags")) {
                 me.currentNode.flags = {};
             }
-            me.currentNode.flags[flagProp] = (flagDom.selectedOptions[0].value === 'NA')?null:flagDom.selectedOptions[0].value;
+            me.currentNode.flags[flagProp] = (flagDom.selectedOptions[0].value === 'NA') ? null : flagDom.selectedOptions[0].value;
             let subTopNode = me.getParentNodeByNodeLevel(me.currentNode, NODE_LEVEL_COMPILATION_NEW + 1);
             let topPNode = subTopNode.getParentNode();
             let rawNode = me.buildSubRootNodeDoc(subTopNode);
-            me.updateSubNode(topPNode, rawNode, true, function(rst){
+            me.updateSubNode(topPNode, rawNode, true, function (rst) {
                 if (!(rst)) {
                     alert('修改标记:[' + flagProp + '] 失败!');
                 }
@@ -763,6 +778,23 @@ let zTreeOprObj = {
         }
     },
 
+    onMutiChangeFlag: function (flagProp, flagDom) {
+        let me = zTreeOprObj;
+        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE) {
+            if (!me.currentNode.hasOwnProperty("flags")) {
+                me.currentNode.flags = {};
+            }
+            me.currentNode.flags[flagProp] = flagDom[0].value.split(',');
+            let subTopNode = me.getParentNodeByNodeLevel(me.currentNode, NODE_LEVEL_COMPILATION_NEW + 1);
+            let topPNode = subTopNode.getParentNode();
+            let rawNode = me.buildSubRootNodeDoc(subTopNode);
+            me.updateSubNode(topPNode, rawNode, true, function (rst) {
+                if (!(rst)) {
+                    alert('修改标记:[' + flagProp + '] 失败!');
+                }
+            });
+        }
+    },
     createNewTpl: function () {
         let me = zTreeOprObj, params = {};
         if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE) {
@@ -781,14 +813,14 @@ let zTreeOprObj = {
             params.engineerId = topPNode.engineerId;
             params.userId = topPNode.userId;
             params.subNode = rawNode;
-            CommonAjax.postEx("report_tpl_api/createDftRptTpl", params, 10000, true, function(result){
-                    if (result) {
-                        me.currentNode.rptTpl = result;
-                        me.chkAndRreshRefTpl();
-                    } else {
-                        alert('update error!');
-                    }
-                }, null, null
+            CommonAjax.postEx("report_tpl_api/createDftRptTpl", params, 10000, true, function (result) {
+                if (result) {
+                    me.currentNode.rptTpl = result;
+                    me.chkAndRreshRefTpl();
+                } else {
+                    alert('update error!');
+                }
+            }, null, null
             );
         }
     },
@@ -805,7 +837,7 @@ let zTreeOprObj = {
         }
         return true;
     },
-    onClick: function(event,treeId,treeNode) {
+    onClick: function (event, treeId, treeNode) {
         let me = zTreeOprObj;
         me.currentNode = treeNode;
         bandTreeOprObj.currentNode = null;
@@ -859,77 +891,107 @@ let zTreeOprObj = {
         }
         return rst;
     },
-    chkAndRreshRefTpl: function(forceRefresh) {
+    chkAndRreshRefTpl: function (forceRefresh) {
         let me = zTreeOprObj, params = {};
         const valuationTypes = ['suggestion', 'feasibility', 'rough', 'bill', 'three_bill_budget', 'ration', 'changeBudget', 'settlement'];
         if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE && me.currentNode.refId > 0) {
             if (forceRefresh || !(me.currentNode.rptTpl)) {
                 params.rptTplId = me.currentNode.refId;
-                CommonAjax.postEx("report_tpl_api/getRefRptTpl", params, 20000, true, function(result){
-                        me.currentNode.rptTpl = result;
-                        me.currentNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = me.currentNode.name;
-                        if (me.currentNode.rptTpl["GROUP_KEY"]) {
-                            let grp_keys = me.currentNode.rptTpl["GROUP_KEY"].split('_');
-                            if (grp_keys.length > 0) {
-                                grp_keys[1] = me.currentNode.name;
-                            }
-                            me.currentNode.rptTpl["GROUP_KEY"] = grp_keys.join("_");
+                CommonAjax.postEx("report_tpl_api/getRefRptTpl", params, 20000, true, function (result) {
+                    me.currentNode.rptTpl = result;
+                    me.currentNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = me.currentNode.name;
+                    if (me.currentNode.rptTpl["GROUP_KEY"]) {
+                        let grp_keys = me.currentNode.rptTpl["GROUP_KEY"].split('_');
+                        if (grp_keys.length > 0) {
+                            grp_keys[1] = me.currentNode.name;
                         }
-                        tplHelper.refreshTplView(me.currentNode.rptTpl);
-                        if (me.currentNode.hasOwnProperty('flags')) {
-                            if (me.currentNode.flags.hasOwnProperty('taxType')) {
-                                let val = parseInt(me.currentNode.flags['taxType']);
-                                $("#element_flags_select")[0].selectedIndex = val;
-                            } else {
-                                $("#element_flags_select")[0].selectedIndex = 0;
-                            }
-                            if (me.currentNode.flags.hasOwnProperty('valuationType')) {
-                                let vType = me.currentNode.flags['valuationType'];
-                                let vtIdx = valuationTypes.indexOf(vType);
-                                $("#element_prjFlags_select")[0].selectedIndex = vtIdx + 1;
-                            } else {
-                                $("#element_prjFlags_select")[0].selectedIndex = 0;
-                            }
-                            if (me.currentNode.flags.hasOwnProperty('reportType')) {
-                                let rType = me.currentNode.flags['reportType'];
-                                if (rType === 'billSummary') $("#element_rptFlags_select")[0].selectedIndex = 1
-                                else if (rType === 'gljSummary') $("#element_rptFlags_select")[0].selectedIndex = 2
-                                else $("#element_rptFlags_select")[0].selectedIndex = 0;
-                            } else {
-                                $("#element_rptFlags_select")[0].selectedIndex = 0;
-                            }
-
-                            if (me.currentNode.flags.hasOwnProperty('sumLevelType')) {
-                                let sumLvType = me.currentNode.flags['sumLevelType'];
-                                if (sumLvType === 'construct') $("#element_sumLv_flags")[0].selectedIndex = 1
-                                else if (sumLvType === 'Single') $("#element_sumLv_flags")[0].selectedIndex = 2
-                                else if (sumLvType === 'custom') $("#element_sumLv_flags")[0].selectedIndex = 3
-                                else $("#element_sumLv_flags")[0].selectedIndex = 0;
-                            } else {
-                                $("#element_sumLv_flags")[0].selectedIndex = 0;
+                        me.currentNode.rptTpl["GROUP_KEY"] = grp_keys.join("_");
+                    }
+                    tplHelper.refreshTplView(me.currentNode.rptTpl);
+                    if (me.currentNode.hasOwnProperty('flags')) {
+                        if (me.currentNode.flags.hasOwnProperty('taxType')) {
+                            let val = parseInt(me.currentNode.flags['taxType']);
+                            $("#element_flags_select")[0].selectedIndex = val;
+                        } else {
+                            $("#element_flags_select")[0].selectedIndex = 0;
+                        }
+                        $("#valuationSelector").hide();
+                        if (me.currentNode.flags.hasOwnProperty('valuationType')) {
+                            $(".mutiSelector").find('li').removeClass('checked');
+                            let valuationTypeStr = '';
+                            let valuationTypeStrList = [];
+                            let vType = me.currentNode.flags['valuationType'];
+                            // let vtIdx = valuationTypes.indexOf(vType);
+                            // $("#element_prjFlags_select")[0].selectedIndex = vtIdx + 1;
+                            if (vType instanceof Array) {
+                                for (let i = 0; i < vType.length; i++) {
+                                    $("#valuationSelector_" + vType[i]).addClass('checked');
+                                    valuationTypeStrList.push(valuationSelectorMap["valuationSelector_" + vType[i]]);
+                                }
+                                valuationTypeStr = valuationTypeStrList.join(',');
+                            } else if (vType) {
+                                $("#valuationSelector_" + vType).addClass('checked');
+                                valuationTypeStr = valuationSelectorMap["valuationSelector_" + vType];
                             }
+                            $("#element_prjFlags_select")[0].value = vType;
+                            $("#element_prjFlags_selectStr")[0].value = valuationTypeStr;
+                        } else {
+                            $("#element_prjFlags_select")[0].value = '';
+                            $("#element_prjFlags_selectStr")[0].value = '';
+                            $('#valuationSelector .mutiSelector li').removeClass('checked');
+                        }
+                        if (me.currentNode.flags.hasOwnProperty('reportType')) {
+                            let rType = me.currentNode.flags['reportType'];
+                            if (rType === 'billSummary') $("#element_rptFlags_select")[0].selectedIndex = 1
+                            else if (rType === 'gljSummary') $("#element_rptFlags_select")[0].selectedIndex = 2
+                            else $("#element_rptFlags_select")[0].selectedIndex = 0;
+                        } else {
+                            $("#element_rptFlags_select")[0].selectedIndex = 0;
+                        }
 
+                        if (me.currentNode.flags.hasOwnProperty('sumLevelType')) {
+                            let sumLvType = me.currentNode.flags['sumLevelType'];
+                            if (sumLvType === 'construct') $("#element_sumLv_flags")[0].selectedIndex = 1
+                            else if (sumLvType === 'Single') $("#element_sumLv_flags")[0].selectedIndex = 2
+                            else if (sumLvType === 'custom') $("#element_sumLv_flags")[0].selectedIndex = 3
+                            else $("#element_sumLv_flags")[0].selectedIndex = 0;
                         } else {
-                            $("#element_flags_select")[0].selectedIndex = 0;
-                            $("#element_prjFlags_select")[0].selectedIndex = 0;
                             $("#element_sumLv_flags")[0].selectedIndex = 0;
                         }
 
-                        if ($("#rpt_tpl_visual_tab")[0].className === "nav-link p-1 active") {
-                            setTimeout(function(){visualJumbo.iniSpreadJs(); visualJumbo.setupTpl()}, 50)
+                        if (me.currentNode.flags.hasOwnProperty('contrastType')) {
+                            let contrastType = me.currentNode.flags['contrastType'];
+                            if (contrastType === 'chapter') $("#element_contrastType_select")[0].selectedIndex = 1
+                            else if (contrastType === 'bill') $("#element_contrastType_select")[0].selectedIndex = 2
+                            else if (contrastType === 'quantities') $("#element_contrastType_select")[0].selectedIndex = 3
+                            else $("#element_sumLv_flags")[0].selectedIndex = 0;
                         }
-                    }, null, null
+                    } else {
+                        $("#element_flags_select")[0].selectedIndex = 0;
+                        $("#element_prjFlags_select")[0].selectedIndex = 0;
+                        $("#element_sumLv_flags")[0].selectedIndex = 0;
+                        // 清空工程类型
+                        $("#valuationSelector").hide();
+                        $("#element_prjFlags_select")[0].value = '';
+                        $("#element_prjFlags_selectStr")[0].value = '';
+                        $('#valuationSelector .mutiSelector li').removeClass('checked');
+                    }
+
+                    if ($("#rpt_tpl_visual_tab")[0].className === "nav-link p-1 active") {
+                        setTimeout(function () { visualJumbo.iniSpreadJs(); visualJumbo.setupTpl() }, 50)
+                    }
+                }, null, null
                 );
             } else {
                 me.currentNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = me.currentNode.name;
                 tplHelper.refreshTplView(me.currentNode.rptTpl);
                 if ($("#rpt_tpl_visual_tab")[0].className === "nav-link p-1 active") {
-                    setTimeout(function(){visualJumbo.iniSpreadJs(); visualJumbo.setupTpl()}, 50)
+                    setTimeout(function () { visualJumbo.iniSpreadJs(); visualJumbo.setupTpl() }, 50)
                 }
             }
         }
     },
-    getRefTpl: function() {
+    getRefTpl: function () {
         let me = zTreeOprObj, rst = null;
         if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE && me.currentNode.refId > 0) {
             rst = me.currentNode.rptTpl
@@ -978,11 +1040,11 @@ let zTreeOprObj = {
 let userListObj = {
     foundedUserList: [],
     UserIdList: [],
-    pushUser: function(user, newUsers) {
+    pushUser: function (user, newUsers) {
         let me = userListObj;
         if (me.UserIdList.indexOf(user._id) < 0) {
             me.UserIdList.push(user._id);
-            let newUser = {userId: user._id, real_name: user.real_name, username: user.username, mobile: user.mobile};
+            let newUser = { userId: user._id, real_name: user.real_name, username: user.username, mobile: user.mobile };
             me.foundedUserList.push(newUser);
             if (newUsers) {
                 newUsers.push(newUser);
@@ -993,11 +1055,11 @@ let userListObj = {
         let key = $("#rpt_user_input1").get(0).value;
         let newUsers = [];
         $.ajax({
-            type:"GET",
+            type: "GET",
             url: "user/search?keyword=" + key,
             cache: false,
             timeout: 5000,
-            success: function(result){
+            success: function (result) {
                 if (result.data && result.data.length > 0) {
                     for (let user of result.data) {
                         userListObj.pushUser(user, newUsers);
@@ -1007,21 +1069,21 @@ let userListObj = {
                     }
                 }
             },
-            error: function(jqXHR, textStatus, errorThrown){
+            error: function (jqXHR, textStatus, errorThrown) {
             }
         });
     },
     findUsersByIds: function (userIds, cb) {
         let params = {};
         params.userIds = userIds;
-        CommonAjax.postEx("user/getUserList", params, 20000, true, function(result){
-                for (let user of result) {
-                    userListObj.pushUser(user, null);
-                }
-                if (cb) {
-                    cb(result);
-                }
-            }, null, null
+        CommonAjax.postEx("user/getUserList", params, 20000, true, function (result) {
+            for (let user of result) {
+                userListObj.pushUser(user, null);
+            }
+            if (cb) {
+                cb(result);
+            }
+        }, null, null
         );
     }
 };
@@ -1031,7 +1093,40 @@ function displayMessage(message, color, disappearTime, id) {
     if (!domId) domId = "id_after_saved_lbl";
     $("#" + domId)[0].style.color = color;
     $("#" + domId)[0].innerHTML = message;
-    setTimeout(function(){
+    setTimeout(function () {
         $("#" + domId)[0].innerHTML = "";
     }, disappearTime);
-}
+}
+
+$("#element_prjFlags_selectStr").on('click', function () {
+    if ($('#valuationSelector').visible) {
+        $('#valuationSelector').hide();
+    } else {
+        $('#valuationSelector').show();
+    }
+    return false;
+})
+
+$('#rpttplinfo').on('click', function () {
+    $('#valuationSelector').hide();
+})
+
+$('.mutiSelector').find('li').on('click', function (e) {
+    const hasChecked = $(this).hasClass('checked');
+    if (hasChecked) {
+        $(this).removeClass('checked');
+    } else {
+        $(this).addClass('checked');
+    }
+    const resultIDList = [];
+    const resultList = [];
+    $('.mutiSelector .checked').each(function (index, value) {
+        resultList.push(valuationSelectorMap[$(value).attr('id')]);
+        resultIDList.push($(value).attr('value'));
+    })
+    const result = resultList.join(',');
+    $('#element_prjFlags_selectStr').val(result);
+    $('#element_prjFlags_select').val(resultIDList);
+    zTreeOprObj.onMutiChangeFlag('valuationType', $('#element_prjFlags_select'));
+    return false;
+})