Browse Source

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

zhangweicheng 7 years ago
parent
commit
0471bc5b14

+ 3 - 66
web/building_saas/main/html/calc_program_manage.html

@@ -8,9 +8,9 @@
 </head>
 
 <body>
-<div style="">
-    <img id="f_btn" src="/web/dest/css/img/feeRate_btn.jpg" alt="" style="display: none" />
-</div>
+    <div style="">
+        <img id="f_btn" src="/web/dest/css/img/feeRate_btn.jpg" alt="" style="display: none" />
+    </div>
     <div class="toolsbar px-1">
     </div>
     <div class="container-fluid">
@@ -25,69 +25,6 @@
             </div>
         </div>
     </div>
-
-    <!--弹出 计算基数-->
-<div class="modal fade" id="jsjs" data-backdrop="static">
-        <div class="modal-dialog" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                  <h5 class="modal-title">计算基础选择</h5>
-                  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                  </button>
-                </div>
-                <div class="modal-body">
-                  <div class="form-group">
-                    <input class="form-control" value="分部分项工程费+100">
-                    <p class="form-text">
-                      <button class="btn btn-secondary btn-sm">+</button>
-                      <button class="btn btn-secondary btn-sm">-</button>
-                      <button class="btn btn-secondary btn-sm">*</button>
-                      <button class="btn btn-secondary btn-sm">/</button>
-                      <button class="btn btn-secondary btn-sm">(</button>
-                      <button class="btn btn-secondary btn-sm">)</button>
-                    </p>
-                  </div>
-                  <div class=" modal-auto-height">
-                    <table class="table table-sm table-bordered">
-                      <thead>
-                        <tr><th></th><th>计算基础名称</th><th>金额</th></tr>
-                      </thead>
-                      <tbody>
-                        <tr>
-                          <td>1</td><td><button class="btn btn-secondary btn-sm">分部分项工程费</button></td><td>1000.16</td>
-                        </tr>
-                        <tr>
-                          <td>2</td><td><button class="btn btn-secondary btn-sm">分部分项基价直接工程费</button></td><td>600.16</td>
-                        </tr>
-                        <tr>
-                          <td>3</td><td><button class="btn btn-secondary btn-sm">分部分项基价人工费</button></td><td>100.16</td>
-                        </tr>
-                        <tr>
-                          <td>4</td><td><button class="btn btn-secondary btn-sm">分部分项基价材料费</button></td><td>200.16</td>
-                        </tr>
-                        <tr>
-                          <td>5</td><td><button class="btn btn-secondary btn-sm">分部分项基价机械费</button></td><td>300.16</td>
-                        </tr>
-                        <tr>
-                          <td>6</td><td><button class="btn btn-secondary btn-sm">分部分项调整人工费</button></td><td>100.16</td>
-                        </tr>
-                        <tr>
-                          <td>7</td><td><button class="btn btn-secondary btn-sm">分部分项调整机人工费</button></td><td>50.16</td>
-                        </tr>
-                      </tbody>
-                    </table>
-                    <p></p>
-                      <p></p>
-                  </div>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
-                    <a href="" class="btn btn-primary">确定</a>
-                </div>
-            </div>
-        </div>
-    </div>
 </body>
 
 

+ 1 - 0
web/building_saas/main/js/models/calc_base.js

@@ -1384,6 +1384,7 @@ let calcBase = {
             me.success = true;
             node.data.calcBase = exp;
             node.data.calcBaseValue = parseFloat(calcBaseValue).toDecimal(decimalObj.decimal('totalPrice', node));
+            node.changed = true;
         }
         catch (err){
             alert(me.errMsg);

+ 11 - 12
web/building_saas/main/js/models/calc_program.js

@@ -356,7 +356,9 @@ let calcTools = {
             if (treeNode.data.type == rationType.volumePrice)
                 result = treeNode.data.marketUnitFee ? parseFloat(treeNode.data.marketUnitFee).toDecimal(decimalObj.ration.unitPrice) : 0
             else if (treeNode.data.type == rationType.gljRation)
-                result = treeNode.data.basePrice ? parseFloat(treeNode.data.basePrice).toDecimal(decimalObj.ration.unitPrice) : 0;
+                // result = treeNode.data.basePrice ? parseFloat(treeNode.data.basePrice).toDecimal(decimalObj.ration.unitPrice) : 0;
+                // 这里因为是算基数所以要取基价,但不能直接取basePrice,受限于项目属性的三个选项。
+                result = gljOprObj.getBasePrice(treeNode);
         }
         else if (treeNode.data.subType === gljType.GENERAL_MACHINE && baseName === '定额基价机上人工费') {
             let glj = {
@@ -980,7 +982,7 @@ class CalcProgram {
             let nodes = (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees) ? treeNode.children : me.project.Ration.getRationNodes(treeNode);
             let rst = [];
             for (let ft of cpFeeTypes) {
-                let isEstimate = ft.name == '暂估费';
+                let isEstimate = ft.type == 'estimate';
                 let ftObj = {};
                 ftObj.fieldName = ft.type;
                 ftObj.name = ft.name;
@@ -1004,14 +1006,14 @@ class CalcProgram {
                         let rq = calcTools.uiNodeQty(node) ? calcTools.uiNodeQty(node) : 0;
                         let ruf = 0, rtuf = 0, rtf = 0, rttf = 0;
                         if (node.data.feesIndex && node.data.feesIndex[ft.type]) {
-                            ruf = parseFloat(node.data.feesIndex[ft.type].unitFee);
-                            rtuf = parseFloat(node.data.feesIndex[ft.type].tenderUnitFee);
-                            rtf = parseFloat(node.data.feesIndex[ft.type].totalFee);
-                            rttf = parseFloat(node.data.feesIndex[ft.type].tenderTotalFee);
+                            ruf = parseFloatPlus(node.data.feesIndex[ft.type].unitFee).toDecimal(decimalObj.bills.unitPrice);
+                            rtuf = parseFloatPlus(node.data.feesIndex[ft.type].tenderUnitFee).toDecimal(decimalObj.bills.unitPrice);
+                            rtf = parseFloatPlus(node.data.feesIndex[ft.type].totalFee).toDecimal(decimalObj.bills.totalPrice);
+                            rttf = parseFloatPlus(node.data.feesIndex[ft.type].tenderTotalFee).toDecimal(decimalObj.bills.totalPrice);
                         };
                         if (me.project.property.billsCalcMode === leafBillGetFeeType.rationContent) {
-                            buf = (buf + (ruf * rq / bq).toDecimal(decimalObj.bills.unitFee)).toDecimal(decimalObj.bills.unitFee);
-                            btuf = (btuf + (rtuf * rq / bq).toDecimal(decimalObj.bills.unitFee)).toDecimal(decimalObj.bills.unitFee);
+                            buf = (buf + (ruf * rq / bq).toDecimal(decimalObj.bills.unitPrice)).toDecimal(decimalObj.bills.unitPrice);
+                            btuf = (btuf + (rtuf * rq / bq).toDecimal(decimalObj.bills.unitPrice)).toDecimal(decimalObj.bills.unitPrice);
                         };
                         sum_rtf = (sum_rtf + rtf).toDecimal(decimalObj.process);
                         sum_rttf = (sum_rttf + rttf).toDecimal(decimalObj.process);
@@ -1119,15 +1121,12 @@ class CalcProgram {
         else{
             let fnArr = [];
             if (treeNode.calcType == treeNodeCalcType.ctRationCalcProgram) {
-                if (treeNode.data.type == rationType.volumePrice){
+                if (treeNode.data.type == rationType.volumePrice || treeNode.data.type == rationType.gljRation){
                     delete treeNode.data.gljList;
                     let muf = treeNode.data.marketUnitFee ? treeNode.data.marketUnitFee : 0;
                     let q = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 0;
                     treeNode.data.marketTotalFee = (muf * q).toDecimal(decimalObj.ration.totalPrice);
                 }
-                else if (treeNode.data.type == rationType.gljRation){
-
-                }
                 else{
                     treeNode.data.gljList = me.project.ration_glj.getGljArrByRation(treeNode.data.ID);
                     // 计算程序里没有暂估费的计算规则,会漏掉,所以这里要专门算。

+ 67 - 37
web/building_saas/main/js/views/calc_base_view.js

@@ -2,19 +2,24 @@
  * Created by Zhong on 2017/12/1.
  */
 /*
-* 清单计算基数
+* 计算基数,清单、定额统一ui
 * */
 let calcBaseView = {
     //可用计算基数的清单固定列映射(与fixedFlag)
     inputExpr: $('#calcBaseExp'),
     confirmBtn: $('#calcBaseConf'),
+    type: {bills: 'bills', ration: 'ration'},
+    curType: null,
     editingCell: null,
     workBook: null,
     setting:{
-        header: [
+        billsHeader: [
             {name: '计算基础名称', dataCode: 'base', width: 280, vAlign: 'center', hAlign: 'left'},
             {name: '金额', dataCode: 'price', width: 120, vAlign: 'center', hAlign: 'right'}
         ],
+        rationHeader: [
+            {name: '定额计算程序基数名称', dataCode: 'base', width: 400, vAlign: 'center', hAlign: 'left'}
+        ],
         options: {
             tabStripVisible:  false,
             allowCopyPasteExcelStyle : false,
@@ -25,7 +30,7 @@ let calcBaseView = {
         },
         locked: {
             rows: [],
-            cols: [0, 1]
+            cols: [0]
         }
     },
 
@@ -62,6 +67,14 @@ let calcBaseView = {
         if(!this.workBook){
             this.workBook = new GC.Spread.Sheets.Workbook($('#billsBaseSpread')[0], {sheetCount: 1});
             this.setOptions(this.workBook, this.setting.options);
+            //bills
+            if(this.curType === this.type.bills){
+                this.setting.header = this.setting.billsHeader;
+            }
+            //ration
+            else {
+                this.setting.header = this.setting.rationHeader;
+            }
             this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);
             this.bindEvent(this.workBook);
         }
@@ -79,7 +92,6 @@ let calcBaseView = {
         let cols = this.setting.header;
         let fuc = function () {
             sheet.setRowCount(datas.length);
-            //sheet.setFormatter(-1, 1, '@');
             let style = new GC.Spread.Sheets.Style();
             style.formatter = MainTreeCol.getNumberFormatter(decimalObj.bills.totalPrice, true);
             sheet.setStyle(-1, 1, style);
@@ -109,16 +121,10 @@ let calcBaseView = {
     isDef: function (v) {
         return v !== undefined && v !== null;
     },
-    isFlag: function (v) {
-        return this.isDef(v.flagsIndex) && this.isDef(v.flagsIndex.fixed);
-    },
     ifEdit: function () {
         var selected = projectObj.project.mainTree.selected;
         return MainTreeCol.readOnly.forCalcBase(selected)?false:true;
     },
-    canBase: function (node) {
-        return node.sourceType === projectObj.project.Bills.getSourceType() && node.children.length === 0;
-    },
     //计算基数转换为显示数据Obj to Array
     toViewData: function (obj) {
         let rst = [];
@@ -131,16 +137,30 @@ let calcBaseView = {
         return rst;
     },
 
-    initCalctor: function (node) {
+    initCalctor: function (type) {//type = bills、ration
         let me = calcBaseView;
-        //输入框显示原本的
-        if(me.isDef(node.data.calcBase)){
-            me.inputExpr.val(cbParser.toFExpr(node.data.calcBase));
+        let showDatas;
+        $('#qd-jsjs').modal('show');
+        me.curType = type;
+        if(type === me.type.bills){//bills
+            let node = projectObj.project.mainTree.selected;
+            //输入框显示原本的
+            if(me.isDef(node.data.calcBase)){
+                me.inputExpr.val(cbParser.toFExpr(node.data.calcBase));
+            }
+            let baseObj = projectObj.project.calcBase.getBaseByClass(node);
+            showDatas = me.toViewData(baseObj);
+        }
+        else{//ration
+            let bnArr = Object.keys(rationCalcBases);
+            let baseArr = [];
+            for (let bn of bnArr){
+                 baseArr.push({base: bn})
+            };
+            showDatas = baseArr;
         }
         me.buildSheet();
-        let baseObj = projectObj.project.calcBase.getBaseByClass(node);
-        // console.log(baseObj);
-        me.showData(me.toViewData(baseObj));
+        me.showData(showDatas);
 
     },
 
@@ -200,31 +220,38 @@ let calcBaseView = {
     calcBaseConf: function () {
         let me = calcBaseView;
         me.confirmBtn.bind('click', function () {
-            let selected = projectObj.project.mainTree.selected;
-            projectObj.updateCellValue(selected, me.getInputExpr(), {data: {field: 'calcBase'}});
-            if(projectObj.project.calcBase.success){
-                $('#qd-jsjs').modal('hide');
+            //bills
+            if(me.curType === me.type.bills){
+                let selected = projectObj.project.mainTree.selected;
+                projectObj.updateCellValue(selected, me.getInputExpr(), {data: {field: 'calcBase'}});
+                if(projectObj.project.calcBase.success){
+                    $('#qd-jsjs').modal('hide');
+                }
+            }
+            //ration
+            else{
+
             }
         });
     },
 
-    getCalcBaseCellType:function () {
+    getCalcBaseCellType:function (type) {
         var ns = GC.Spread.Sheets;
         function CalcBaseCellType() {
             var init=false;
         }
         CalcBaseCellType.prototype = new ns.CellTypes.Text();
         CalcBaseCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
-          //  if(value!=null){
-               // ctx.fillText(value,x+3+ctx.measureText(value).width,y+h-3);
-               // ctx.fillText(value,x+w-3,y+h-3);
-                GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
-           // }
+            //  if(value!=null){
+            // ctx.fillText(value,x+3+ctx.measureText(value).width,y+h-3);
+            // ctx.fillText(value,x+w-3,y+h-3);
+            GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
+            // }
             if(calcBaseView.editingCell){
                 if(calcBaseView.editingCell.row==options.row&&calcBaseView.editingCell.col==options.col){
                     var image = document.getElementById('f_btn'),imageMagin = 3;
                     var imageHeight = h-2*imageMagin;
-                    var imageWidth = w*2/7;
+                    var imageWidth = w*2/(type=='bills'?7:20);
                     var imageX = x + w - imageWidth- imageMagin, imageY = y + h / 2 - imageHeight / 2;
                     ctx.save();
                     ctx.drawImage(image, imageX, imageY,imageWidth,imageHeight);
@@ -252,6 +279,7 @@ let calcBaseView = {
         };
         CalcBaseCellType.prototype.processMouseDown = function (hitinfo) {
             let me=calcBaseView;
+            me.pmLeave = false;
             if(me.editingCell==null){
                 var showSelectBtn = true;
                 if(hitinfo.sheet.name()!='calc_detail'){
@@ -271,24 +299,26 @@ let calcBaseView = {
                 var imageHeight = hitinfo.cellRect.height-2*imageMagin;
                 var imageWidth = hitinfo.cellRect.width*2/7;
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    $('#qd-jsjs').modal({show: true});
+                    calcBaseView.initCalctor(type);
                 }
             }
         };
         CalcBaseCellType.prototype.processMouseLeave = function (hitinfo) {
-            calcBaseView.editingCell=null;
-            hitinfo.sheet.invalidateLayout();
-            hitinfo.sheet.repaint();
+            if(!calcBaseView.pmLeave){
+                calcBaseView.editingCell=null;
+                hitinfo.sheet.invalidateLayout();
+                hitinfo.sheet.repaint();
+                calcBaseView.pmLeave = true;
+            }
         }
         return new CalcBaseCellType();
     },
 };
 
 $(document).ready(function () {
-   $('#qd-jsjs').on('shown.bs.modal', function () {
-       calcBaseView.initCalctor(projectObj.project.mainTree.selected);
-       calcBaseView.workBook.refresh();
-   });
+    $('#qd-jsjs').on('shown.bs.modal', function () {
+        calcBaseView.workBook.refresh();
+    });
 
     $('#qd-jsjs').on('hidden.bs.modal', function () {
         //清空输入框
@@ -305,4 +335,4 @@ $(document).ready(function () {
 
     //confirmBtn
     calcBaseView.calcBaseConf();
-});
+});

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

@@ -66,6 +66,7 @@ let calcProgramManage = {
 
         let dSheet = me.detailSpread.getSheet(0);
         feeRateObject.setFeeRateCellCol(dSheet,_.findIndex(me.detailSetting.header,{'dataCode':'feeRate'}));
+        dSheet.getRange(-1, _.findIndex(me.detailSetting.header, {'dataCode': 'dispExprUser'}), -1, 1).cellType(calcBaseView.getCalcBaseCellType('ration'));
         dSheet.name('calc_detail');
         sheetCommonObj.showData(dSheet, me.detailSetting, me.datas[0].calcItems);
     },

+ 7 - 3
web/building_saas/main/js/views/fee_rate_view.js

@@ -287,6 +287,7 @@ var feeRateObject={
         };
         FeeRateEditCellType.prototype.processMouseDown = function (hitinfo) {
             var me=feeRateObject;
+            me.pmLeave = false;
             if(me.editingCell==null){
                 var showSelectBtn = true;
                 if(hitinfo.sheet.name()!='calc_detail'){
@@ -311,9 +312,12 @@ var feeRateObject={
             }
         };
         FeeRateEditCellType.prototype.processMouseLeave = function (hitinfo) {
-            feeRateObject.editingCell=null;
-            hitinfo.sheet.invalidateLayout();
-            hitinfo.sheet.repaint();
+            if(!feeRateObject.pmLeave){
+                feeRateObject.editingCell=null;
+                hitinfo.sheet.invalidateLayout();
+                hitinfo.sheet.repaint();
+                feeRateObject.pmLeave = true;
+            }
         }
         return new FeeRateEditCellType();
     },

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

@@ -205,7 +205,7 @@ let MainTreeCol = {
         },
 
         calcBase: function () {
-            return calcBaseView.getCalcBaseCellType();
+            return calcBaseView.getCalcBaseCellType('bills');
         },
 
         // CSL, 2017-11-28

+ 4 - 2
web/building_saas/main/js/views/project_view.js

@@ -317,7 +317,7 @@ var projectObj = {
                     }
                     // if (value) {value = parseFloat(value).toDecimal(decimalObj.decimal("totalPrice", node))};
                 };
-
+                //计算基数赋值要经过解析和标准化,已在calculate里赋值
                 if(fieldName !== 'calcBase'){
                     node.data[fieldName] = value;
                     node.changed = true;
@@ -359,9 +359,11 @@ var projectObj = {
         let colSetting = projectObj.mainController.setting.cols[info.col];
         projectObj.lastCol = colSetting;
     },
+    //repaint 动态下拉框
     mainSpreadEnterCell: function (sender, info) {
         let colSetting = projectObj.mainController.setting.cols[info.col];
-        if(colSetting.data.field === 'unit' || projectObj.lastCol.data.field === 'unit'||colSetting.data.field ==='subType'|| projectObj.lastCol.data.field === 'subType'){
+        if(colSetting.data.field === 'unit' || projectObj.lastCol.data.field === 'unit'||colSetting.data.field ==='subType'
+            || projectObj.lastCol.data.field === 'subType' || colSetting.data.field === 'programID' ||projectObj.lastCol.data.field === 'programID'){
             info.sheet.repaint();
         }
     },

+ 4 - 0
web/building_saas/pm/html/project-management.html

@@ -240,6 +240,7 @@
                     <div class="form-group">
                         <label>建设项目</label>
                         <input type="text" class="form-control" placeholder="输入建设项目名称" id="project-name">
+                        <span class="form-text text-danger" id="project-name-info" style="display: none;">已存在 “建筑工程1”</span>
                     </div>
                 </form>
             </div>
@@ -266,6 +267,7 @@
                     <div class="form-group">
                         <label>单项工程</label>
                         <input type="text" class="form-control" placeholder="输入单项工程名称" id="engineering-name">
+                        <span class="form-text text-danger" id="engineering-name-info" style="display: none;">已存在 “建筑工程1”</span>
                     </div>
                 </form>
             </div>
@@ -376,6 +378,7 @@
                     <div class="form-group">
                         <label>文件夹</label>
                         <input type="text" class="form-control" placeholder="输入文件夹名称" id="folder-name">
+                        <span class="form-text text-danger" id="folder-name-info" style="display: none;">已存在 “建筑工程1”</span>
                         <span class="form-text text-muted">Smartcost目前最多支持3层文件夹。</span>
                     </div>
                 </form>
@@ -401,6 +404,7 @@
                 <form>
                     <div class="form-group">
                         <input type="text" class="form-control" placeholder="输入名称" id="rename-name">
+                        <span class="form-text text-danger" id="rename-name-info" style="display: none;">已存在 “建筑工程1”</span>
                     </div>
                 </form>
             </div>

+ 142 - 35
web/building_saas/pm/js/pm_main.js

@@ -232,6 +232,11 @@ $(document).ready(function() {
             });
         }
     });
+    //绑定新建建设项目、新建单项工程、新建文件夹、重命名Enter键事件
+    bindInputs($('#project-name'), $('#engineering-name'), $('#folder-name'), $('#rename-name'));
+
+    //绑定新建建设项目、新建单项工程、新建文件夹、重命名弹窗隐藏事件
+    bindModalsHidden($('#add-project-dialog'), $('#add-engineering-dialog'), $('#add-folder-dialog'), $('#rename-dialog'));
 
     // 新增建设项目点击
     $('#add-project-btn').click(function () {
@@ -456,7 +461,8 @@ $(document).ready(function() {
         let newName = $('#rename-name').val();
         let dialog = $('#rename-dialog');
         if (newName === '') {
-            alert('请输入重命名的名称');
+            $('#rename-name-info').text('请输入重命名名称');
+            $('#rename-name-info').show();
             return false;
         }
 
@@ -465,6 +471,8 @@ $(document).ready(function() {
             return false;
         }
         RenameProject(select.id(), newName, select.data.ParentID, function () {
+            $('#rename-name-info').text('');
+            $('#rename-name-info').hide();
             dialog.modal('hide');
             select.data.name = newName;
             Tree.refreshNodesDom([select]);
@@ -681,12 +689,19 @@ function init() {
 function AddProject() {
     let name = $('#project-name').val().trim();
     if (name === '') {
-        alert('请填写建设项目名称');
+        $('#project-name-info').text('请填写建设项目名称');
+        $('#project-name-info').show();
         return false;
     }
-    let callback = function() {
-        $("#add-project-dialog").modal("hide");
-        $("#project-name").val('');
+    let existCallback = function () {
+        $('#project-name-info').text(`已存在“${$("#project-name").val()}”`);
+        $('#project-name-info').show();
+    };
+    let sucCallback = function () {
+        $('#add-project-dialog').modal('hide');
+        $('#project-name').val('');
+        $('#project-name-info').text('');
+        $('#project-name-info').hide();
     };
     let selectedItem = Tree.selected();
 
@@ -697,18 +712,93 @@ function AddProject() {
      (4)、当前定位在单项工程或单位工程,新建项目为当前所属建设项目的后兄弟。
     * */
     if(!selectedItem){
-        AddSiblingsItem(selectedItem, name, null, projectType.project, callback);
+        AddSiblingsItem(selectedItem, name, null, projectType.project, existCallback, sucCallback);
     }
     else {
         if(selectedItem.data.projType === projectType.project){
-            AddSiblingsItem(selectedItem, name, null, projectType.project, callback);
+            AddSiblingsItem(selectedItem, name, null, projectType.project, existCallback, sucCallback);
         }
         else if(selectedItem.data.projType === projectType.engineering || selectedItem.data.projType === projectType.tender){
             let proj = selectedItem.parent.data.projType === projectType.project ? selectedItem.parent : selectedItem.parent.parent;
-            AddSiblingsItem(proj, name, null, projectType.project, callback);
+            AddSiblingsItem(proj, name, null, projectType.project, existCallback, sucCallback);
         }
         else if(selectedItem.data.projType === projectType.folder){
-            AddChildrenItem(selectedItem, name, null, projectType.project, callback);
+            AddChildrenItem(selectedItem, name, null, projectType.project, existCallback, sucCallback);
+        }
+    }
+}
+
+//新建建设项目、新建单项工程、新建文件夹、重命名弹窗隐藏事件
+function bindModalsHidden(projDialog, engDialog, folderDialog, renameDialog){
+    projDialog.on('hidden.bs.modal', function () {
+        $('#project-name-info').text('');
+        $('#project-name-info').hide();
+        $('#project-name').val('');
+    });
+    engDialog.on('hidden.bs.modal', function () {
+        $('#engineering-name-info').text('');
+        $('#engineering-name-info').hide();
+        $('#engineering-name').val('');
+    });
+    folderDialog.on('hidden.bs.modal', function () {
+        $('#folder-name-info').text('');
+        $('#folder-name-info').hide();
+        $('#folder-name').val('');
+    });
+    renameDialog.on('hidden.bs.modal', function () {
+        $('#rename-name-info').text('');
+        $('#rename-name-info').hide();
+        $('#rename-name').val('');
+    });
+}
+
+//绑定新建建设项目、新建单项工程、新建文件夹、重命名回车键功能
+function bindInputs(projInput, engInput, foldInput, renameInput){
+    projInput.bind('keypress', function (event) {
+        if(event.keyCode === 13){
+            $('#addProjOk').click();
+            return false;
+        }
+    });
+    //projInput.bind('change', getChangedFunc(projInput, $('#project-name-info')));
+
+    engInput.bind('keypress', function (event) {
+        if(event.keyCode === 13){
+            $('#add-engineering-confirm').click();
+            return false;
+        }
+    });
+    //engInput.bind('change', getChangedFunc(engInput, $('#engineering-name-info')));
+
+    foldInput.bind('keypress', function (event) {
+        if(event.keyCode === 13){
+            $('#add-folder-confirm').click();
+            return false;
+        }
+    });
+   // foldInput.bind('change', getChangedFunc(foldInput, $('#folder-name-info')));
+
+    renameInput.bind('keypress', function (event) {
+        if(event.keyCode === 13){
+            $('#rename-confirm').click();
+            return false;
+        }
+    });
+    //renameInput.bind('change', getChangedFunc(renameInput, $('#rename-name-info')));
+}
+//新建建设项目、单项工程、文件夹、重命名提示(文本改变,暂时不需要)
+function getChangedFunc(input, nameInfo){
+    return function () {
+        let selected = Tree.selected();
+        let parent = selected ? selected.parent : Tree._root;
+        let name = input.val();
+        if(existName(name, parent.children)){
+            nameInfo.text(`已存在“${name}”`);
+            nameInfo.show();
+        }
+        else {
+            nameInfo.text('');
+            nameInfo.hide();
         }
     }
 }
@@ -846,15 +936,15 @@ function AddTenderItems(selected, projName, engName, tenderName, property, callb
  * @param {function} callback
  * @return {void}
  */
-function AddChildrenItem(selected, name, property, type, callback) {
+function AddChildrenItem(selected, name, property, type, existCallback, sucCallback) {
     if(!selected){
         selected = Tree.selected();
     }
     let parent = selected ? selected : Tree._root;
     let pre = selected ? selected.lastChild() : Tree.firstNode();
     if(existName(name, parent.children)){
-        alert('同级目录已存在相同名称数据.');
-        callback();
+        //alert('同级目录已存在相同名称数据.');
+        existCallback();
     }
     else {
         GetNewProjectId(1, function(IDs) {
@@ -870,7 +960,7 @@ function AddChildrenItem(selected, name, property, type, callback) {
                         Tree.addNodeData(data.updateData, parent, null);
                     }
                 });
-                callback();
+                sucCallback();
             });
         });
     }
@@ -884,15 +974,15 @@ function AddChildrenItem(selected, name, property, type, callback) {
  * @param {function} callback
  * @return {void}
  */
-function AddSiblingsItem(selected, name, property, type, callback) {
+function AddSiblingsItem(selected, name, property, type, existCallback, sucCallback) {
     if(!selected){
         selected = Tree.selected();
     }
     let parent = selected ? selected.parent : Tree._root;
     let next = selected ? selected.nextSibling : Tree.firstNode();
     if(existName(name, parent.children)){
-        alert('同级目录已存在相同名称数据.');
-        callback();
+        //alert('同级目录已存在相同名称数据.');
+        existCallback();
     }
     else {
         GetNewProjectId(1, function(IDs) {
@@ -908,7 +998,7 @@ function AddSiblingsItem(selected, name, property, type, callback) {
                         Tree.addNodeData(data.updateData, parent, next);
                     }
                 });
-                callback();
+                sucCallback();
             });
         });
     }
@@ -1120,25 +1210,32 @@ function hasTender(selected, pojName, engName, tenderName){
 function AddEngineering() {
     let name = $('#engineering-name').val().trim();
     if (name === '') {
-        alert('请填写单项工程名称');
+        $('#engineering-name-info').text('请填写单项工程名称');
+        $('#engineering-name-info').show();
         return false;
     }
-    let callback = function() {
-        $("#add-engineering-dialog").modal("hide");
-        $("#engineering-name").val('');
+    let existCallback = function () {
+        $('#engineering-name-info').text(`已存在“${$("#engineering-name").val()}”`);
+        $('#engineering-name-info').show();
+    };
+    let sucCallback = function () {
+        $('#add-engineering-dialog').modal('hide');
+        $('#engineering-name').val('');
+        $('#engineering-name-info').text('');
+        $('#engineering-name-info').hide();
     };
     let selectedItem = Tree.selected();
     // 如果选择的是单项工程则新增同级数据
     if(selectedItem){
         if(selectedItem.data.projType === projectType.project){
-            AddChildrenItem(selectedItem, name, null, projectType.engineering, callback);
+            AddChildrenItem(selectedItem, name, null, projectType.engineering, existCallback, sucCallback);
         }
         else if(selectedItem.data.projType === projectType.engineering){
-            AddSiblingsItem(selectedItem, name, null, projectType.engineering, callback);
+            AddSiblingsItem(selectedItem, name, null, projectType.engineering, existCallback, sucCallback);
         }
         else if(selectedItem.data.projType === projectType.tender){
             let proj = selectedItem.parent;
-            AddSiblingsItem(proj, name, null, projectType.engineering, callback);
+            AddSiblingsItem(proj, name, null, projectType.engineering, existCallback, sucCallback);
         }
     }
 }
@@ -1250,14 +1347,21 @@ function AddTender() {
 function AddFolder() {
     let name = $('#folder-name').val().trim();
     if (name === '') {
-        alert('请填写文件夹名称');
+        $('#folder-name-info').text('请填写文件夹名称');
+        $('#folder-name-info').show();
         return false;
     }
 
     let selectedItem = Tree.selected();
-    let callback = function() {
-        $("#add-folder-dialog").modal("hide");
-        $("#folder-name").val('');
+    let existCallback = function () {
+        $('#folder-name-info').text(`已存在“${$("#folder-name").val()}”`);
+        $('#folder-name-info').show();
+    };
+    let sucCallback = function () {
+        $('#add-folder-dialog').modal('hide');
+        $('#folder-name').val('');
+        $('#folder-name-info').text('');
+        $('#folder-name-info').hide();
     };
     if (selectedItem !== null) {
         // 判断是否超过3层
@@ -1266,14 +1370,14 @@ function AddFolder() {
             return false;
         }
         if(selectedItem.data.projType === projectType.folder || selectedItem.data.projType === projectType.project){
-            AddSiblingsItem(null, name, null, projectType.folder, callback);
+            AddSiblingsItem(null, name, null, projectType.folder, existCallback, sucCallback);
         }
         else if(selectedItem.data.projType === projectType.engineering || selectedItem.data.projType === projectType.tender){
             let proj = selectedItem.parent.data.projType === projectType.project ? selectedItem.parent : selectedItem.parent.parent;
-            AddSiblingsItem(proj, name, null, projectType.folder, callback);
+            AddSiblingsItem(proj, name, null, projectType.folder, existCallback, sucCallback);
         }
     } else {
-        AddSiblingsItem(null, name, null, projectType.folder, callback);
+        AddSiblingsItem(null, name, null, projectType.folder, existCallback, sucCallback);
     }
 }
 
@@ -1453,7 +1557,10 @@ function RenameProject(projectId, newName, parentID, callback) {
             if (result.error === 0) {
                 callback();
             } else {
-                alert('error' + result.message);
+                if(result.message === '同级目录已存在相同名称数据'){
+                    $('#rename-name-info').text(`已存在“${newName}”`);
+                    $('#rename-name-info').show();
+                }
             }
         },
         error: function(iqXHR, textStatus, errorThrown){
@@ -1654,6 +1761,7 @@ function setDataToSideBar() {
     /*if (selectedItem.children.length <= 0) {
         return;
     }*/
+    $(target + '-table tbody').empty();
     if(selectedItem.children.length > 0){
         // CSL, 2018-01-11 汇总单项工程、建设项目。
         function calcNode(node){
@@ -1679,15 +1787,14 @@ function setDataToSideBar() {
         };
 
         // 建设项目相关
-        let counter = 1;
+        let counter = 0;
         let html = '';
 
         calcNode(selectedItem);
         for(let tmp of selectedItem.children) {
-
+            counter ++;
             html += '<tr>' +
                 '<td>'+ counter +'</td>' +
-                '<td>'+ counter +'</td>' +
                 '<td>'+ tmp.data.name +'</td>' +
                 '<td style="text-align:right">'+ tmp.data.summaryFees.totalFee + '</td>' +
                 '<td style="text-align:right">'+ tmp.data.summaryFees.estimateFee + '</td>' +