ソースを参照

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

zhangweicheng 7 年 前
コミット
74fb577a4b

+ 25 - 0
modules/reports/controllers/rpt_tpl_controller.js

@@ -345,6 +345,31 @@ let mExport = {
                 callback(req, res, false, 'The report template was updated successfully!', true);
             }
         });
+    },
+    copyRptTpl: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            orgRptTplId = params.orgRptTplId,
+            newID = params.newRptTplId;
+        let filter = {"ID": orgRptTplId};
+        RptTplModel.findOne(filter, '-_id').exec().then(function(baseTplRst) {
+            if (baseTplRst) {
+                let _doc = baseTplRst["_doc"];
+                _doc["ID"] = newID;
+                if (_doc["GROUP_KEY"].indexOf("(Copy)") < 0) {
+                    _doc["GROUP_KEY"] = _doc["GROUP_KEY"] + "(Copy)";
+                }
+                let rptTpl = new RptTplModel(_doc);
+                rptTpl.save(function (err, actTplRst) {
+                    if (err) {
+                        callback(req,res, "报表模板创建错误", "", null);
+                    } else {
+                        callback(req,res, false, "", newID);
+                    }
+                });
+            } else {
+                callback(req, res, 'Create report template failed!', null);
+            }
+        });
     }
 };
 

+ 1 - 0
modules/reports/routes/rpt_tpl_router.js

@@ -27,6 +27,7 @@ module.exports = function (app) {
     rptTplRouter.post('/createDftRptTpl', reportTplController.createDftRptTpl);
     rptTplRouter.post('/getRefRptTpl', reportTplController.getRefRptTpl);
     rptTplRouter.post('/updateRptTpl', reportTplController.updateRptTpl);
+    rptTplRouter.post('/copyRptTpl', reportTplController.copyRptTpl);
     rptTplRouter.post('/getCompilationList', reportTplController.getCompilationList);
     rptTplRouter.post('/getCustomizeCfg', reportTplController.getCustomerCfg);
     rptTplRouter.post('/saveCustomerCfg', reportTplController.saveCustomerCfg);

+ 4 - 1
modules/users/controllers/user_controller.js

@@ -62,7 +62,10 @@ class UserController extends BaseController {
             let condition = {ssoId: sessionUser.ssoId};
             userModel.setScene('saveInfo');
             let result = await userModel.updateUser(condition, updateData);
-
+            //更新session
+            for(let attr in sessionUser){
+                sessionUser[attr] = updateData[attr] ? updateData[attr] : sessionUser[attr];
+            }
             if (result.ok !== 1) {
                 throw '用户数据保存失败';
             }

+ 11 - 0
modules/users/models/user_model.js

@@ -151,6 +151,17 @@ class UserModel extends BaseModel {
     }
 
     /**
+     * 根据userId查找数据
+     *
+     * @param {string} ssoId
+     * @return {object}
+     */
+    async findDataById(id) {
+        let objId = mongoose.Types.ObjectId(id);
+        return await this.db.findOne({_id: objId});
+    }
+
+    /**
      * 新增用户
      *
      * @param {object} userData

+ 1 - 0
public/web/sheet/sheet_common.js

@@ -193,6 +193,7 @@ var sheetCommonObj = {
             sheet.autoFitRow(row);
         }
     },
+    //todo
     analyzePasteData: function(setting, pastedInfo) {
         var rst = [], propId = pastedInfo.cellRange.col, preStrIdx = 0, itemObj = {};//propId = 0 to proId = pastedInfo.cellRange.col, update by zhong
         for (var i = 0; i < pastedInfo.pasteData.text.length; i++) {

+ 1 - 2
web/building_saas/css/main.css

@@ -151,8 +151,7 @@ body {
     line-height: 30px;
     background:#F1F1F1;
     bottom:30px;
-    left:30px;
-    z-index: 999
+    left:5px;
 }
 .side-tabs .nav-tabs .nav-item {
     z-index: 999

+ 19 - 19
web/building_saas/main/html/main.html

@@ -66,7 +66,7 @@
                     <a href="javascript:void(0)" class="btn btn-sm" id="downMove" title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="upMove" title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
                     <span>
-                      <a href="" class="btn btn-sm" data-toggle="dropdown"><b data-toggle="tooltip" data-placement="bottom">显示至...</b></a>
+                      <a href="" data-toggle="dropdown"><span data-toggle="tooltip" data-placement="bottom" title="显示至...">显示至...</span></a>
                       <div class="dropdown-menu dropdown-menu-left" style="min-width: 6.5rem">
                       <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayDXFY">大项费用</a>
                       <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayFB1">一级分部</a>
@@ -141,32 +141,32 @@
                                       <div class="main-data-bottom ovf-hidden" style="display: none" id="comments">
                                           <textarea class="form-control" rows="8" readonly=""></textarea>
                                       </div>
-                                      <div id="tzjnrCon" class="main-data-bottom">
-                                          <div style="width: 33%; float: left;">
+                                      <div id="tzjnrCon" class="main-data-bottom" style="background: #F1F1F1">
+                                          <div class="col-4" style="width: 33%; float: left; margin: 0; padding:0;">
                                               <div class="main-data-bottom ovf-hidden" id="jobSpread">
                                               </div>
                                               <!--工具栏-->
-                                            <!--  <div class="bottom-tools btn-group position-absolute">
-                                                  <a href="javascript:void(0);" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
-                                              </div>-->
+                                              <div class="bottom-tools btn-group position-absolute">
+                                                  <a href="javascript:void(0);" id="jobInsert" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
+                                                  <a href="javascript:void(0);" id="jobAdd" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
+                                                  <a href="javascript:void(0);" id="jobDel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
+                                                  <a href="javascript:void(0);" id="jobDown" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
+                                                  <a href="javascript:void(0);" id="jobUp" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
+                                              </div>
                                           </div>
-                                          <div style="width: 33%; float: left;">
+                                          <div class="col-4" style="width: 33%; float: left; margin: 0; padding:0;">
                                               <div class="main-data-bottom ovf-hidden"  id="itemSpread">
                                               </div>
                                               <!--工具栏-->
-                                             <!-- <div class="bottom-tools btn-group position-absolute">
-                                                  <a href="javascript:void(0);" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
-                                              </div>-->
+                                              <div class="bottom-tools btn-group position-absolute">
+                                                  <a href="javascript:void(0);" id="itemInsert" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
+                                                  <a href="javascript:void(0);" id="itemAdd" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
+                                                  <a href="javascript:void(0);" id="itemDel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
+                                                  <a href="javascript:void(0);" id="itemDown" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
+                                                  <a href="javascript:void(0);" id="itemUp" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
+                                              </div>
                                           </div>
-                                          <div id="add-rule" style="width: 33%;float: left;background: #EFEFEF; height: 100%;display: none; padding-left: 8px;">
+                                          <div id="add-rule" style="width: 34%;float: left;background: #EFEFEF; height: 100%;display: none; padding-left: 8px;">
                                               <p style="text-align: center">添加规则</p>
                                               <p>
                                                   <label class="title">添加位置:</label>

+ 217 - 68
web/building_saas/main/js/views/character_content_view.js

@@ -27,6 +27,32 @@ let contentOprObj = {
         sheet.bind(EVENTS.EditEnded, me.onEditEnded);
         sheet.bind(EVENTS.ClipboardPasting, me.onClipboardPasting);
         sheet.bind(EVENTS.ClipboardPasted, me.onClipboardPasted);
+        sheet.bind(EVENTS.SelectionChanged, me.onSelectionChanged);
+        me.bindTools();
+    },
+    bindTools: function () {
+        let me = contentOprObj;
+        let sheet = me.workBook.getActiveSheet();
+        $('#jobAdd').click(function () {
+            me.insertContent(sheet, me.currentCache.length, '');
+            me.workBook.focus();
+        });
+        $('#jobInsert').click(function(){
+            me.insertContent(sheet, sheet.getActiveRowIndex(), '');
+            me.workBook.focus();
+        });
+        $('#jobDel').click(function(){
+            me.deleteContent(sheet.getActiveRowIndex());
+            me.workBook.focus();
+        });
+        $('#jobUp').click(function(){
+            me.upMove({row: sheet.getActiveRowIndex(), col: sheet.getActiveColumnIndex()});
+            me.workBook.focus();
+        });
+        $('#jobDown').click(function(){
+            me.downMove({row: sheet.getActiveRowIndex(), col: sheet.getActiveColumnIndex()});
+            me.workBook.focus();
+        });
     },
     //将从清单库中添加的清单,把标准清单的工作内容转化成清单的工作内容
     buildJobContent: function (jobs) {
@@ -72,11 +98,11 @@ let contentOprObj = {
         return null;
     },
     //新增行
-    addRow: function (sheet) {
+    addRow: function (idx, sheet) {
         let checkBox = new GC.Spread.Sheets.CellTypes.CheckBox();
         checkBox.isThreeState = false;
-        sheet.addRows(sheet.getRowCount(), 1);
-        sheet.getCell(sheet.getRowCount() - 1, 1).cellType(checkBox);
+        sheet.addRows(idx, 1);
+        sheet.getCell(idx - 1, 1).cellType(checkBox);
     },
     upMove: function (cell) {
         let me = contentOprObj;
@@ -88,6 +114,7 @@ let contentOprObj = {
         preObj.serialNo = temp;
         me.sortCache(me.currentCache);
         me.save(function () {
+            me.workBook.focus();
             me.workBook.getSheet(0).setActiveCell(cell.row - 1, cell.col);
         });
     },
@@ -101,6 +128,7 @@ let contentOprObj = {
         nextObj.serialNo = temp;
         me.sortCache(me.currentCache);
         me.save(function () {
+            me.workBook.focus();
             me.workBook.getSheet(0).setActiveCell(cell.row + 1, cell.col);
         });
     },
@@ -108,18 +136,24 @@ let contentOprObj = {
         let me = contentOprObj;
         me.currentCache.splice(rowIdx, 1);
         me.save();
+        me.workBook.focus();
     },
     //更新
     updateContent: function (job, newContent) {
+        let me = contentOprObj;
         job.content = newContent;
+        me.save();
     },
     //新增
-    insertContent: function (content) {
+    insertContent: function (sheet, idx, content) {
         let me = contentOprObj;
-        let preObj = me.currentCache.length > 0 ?  me.currentCache[me.currentCache.length - 1] : null;
-        let newObj = {content: content, isCheceked: false, serialNo: preObj ? preObj.serialNo + 1 : 1};
-        me.currentCache.push(newObj);
-
+        me.addRow(idx, sheet);
+        let newObj = {content: content, isChecked: true};
+        me.currentCache.splice(idx, 0, newObj);
+        //重新排序赋值
+        pageCCOprObj.resortNo(me.currentCache);
+        me.save();
+        me.workBook.focus();
     },
     save: function (callback) {
         let selectedNode = projectObj.mainController.tree.selected;
@@ -128,24 +162,15 @@ let contentOprObj = {
     },
     onEditEnded: function (sender, args) {
         let me = contentOprObj;
-        let preObj = me.currentCache.length > 0 ?  me.currentCache[me.currentCache.length - 1] : null;
-        let contentTxt;
-        if(args.editingText && args.editingText.toString().trim().length > 0){
-            //更新
-            if(args.row < me.currentCache.length ){
-                me.updateContent(me.currentCache[args.row], args.editingText);
-            }
-            //新增
-            else{
-                me.insertContent(args.editingText);
-            }
-            //保存
-            me.save();
+        if(me.setting.header[args.col].dataCode === 'isChecked'){
+            return;
         }
-        else{
-            //恢复
-            args.sheet.setValue(args.row, args.col, me.currentCache.length > args.row ? me.currentCache[args.row].content + '' : '');
+        args.editingText = args.editingText ? args.editingText : '';
+        //更新
+        if(args.row < me.currentCache.length ){
+            me.updateContent(me.currentCache[args.row], args.editingText);
         }
+
     },
     //复选框控制输出
     onButtonClicked: function (sender, args) {
@@ -179,12 +204,42 @@ let contentOprObj = {
             if(rowIdx < me.currentCache.length){
                 me.updateContent(me.currentCache[rowIdx], items[i].content);
             }
-            //新增
-            else{
-                me.insertContent(items[i].content);
+        }
+    },
+    onSelectionChanged: function (sender, args) {
+        let me = contentOprObj;
+        if(args.newSelections && args.newSelections.length > 0){
+            me.initSelection(args.newSelections[0].row);
+        }
+        me.initSelection(args.newSelections[0].row);
+    },
+    initSelection: function (row) {
+        let me = contentOprObj;
+        let disObj = {jobAdd: false, jobInsert: true, jobDel: true, jobUp: true, jobDown: true};
+        if(row !== -1){
+            //在表内
+            if(row < me.currentCache.length){
+                disObj.jobDel = false;
+                disObj.jobInsert = false;
+                if(row !== 0){
+                    disObj.jobUp = false;
+                }
+                if(row !== me.currentCache.length - 1){
+                    disObj.jobDown = false;
+                }
+            }
+        }
+        me.refreshTools(disObj);
+    },
+    //刷新工具条
+    refreshTools: function (disObj) {
+        for(let o in disObj){
+            let jqSel = $(`#${o}`);
+            jqSel.removeClass('disabled');
+            if(disObj[o]){
+                jqSel.addClass('disabled');
             }
         }
-        me.save();
     },
     sortCache: function (cacheArr) {
         cacheArr.sort(function (a, b) {
@@ -206,18 +261,20 @@ let contentOprObj = {
                 //控制允许右键菜单在哪个位置出现
                 let target = SheetDataHelper.safeRightClickSelection($triggerElement, e, me.workBook);
                 let sheet = me.workBook.getSheet(0);
+                let addDis = pageCCOprObj.isBillsType() ? false : true,  insertDis = false, delDis = false, upDis = false, downDis = false;
                 if(target.hitTestType === 3){//在表格内&& typeof target.row !== 'undefined' && typeof target.col !== 'undefined'
-                    let insertDis = pageCCOprObj.isBillsType() ? false : true, delDis = false, upDis = false, downDis = false;
                     if(typeof target.row !== 'undefined'){
                         //控制按钮是否可用
                         sheet.setActiveCell(target.row, target.col);
                         if(!me.currentCache ||target.row >= me.currentCache.length){//右键定位在有数据的行,删除键才显示可用
+                            insertDis = true;
                             delDis = true;
                             downDis = true;
                             upDis = true;
                         }
                         else{//有数据
                             if(typeof target.col === 'undefined'){//定位不在表格内
+                                insertDis = true;
                                 downDis = true;
                                 upDis = true;
                                 delDis = true;
@@ -233,16 +290,20 @@ let contentOprObj = {
                         }
                     }
                     else{
+                        insertDis = true;
                         delDis = true;
                         downDis = true;
                         upDis = true;
                     }
+                    me.refreshTools({jobAdd: addDis, jobInsert: insertDis, jobDel: delDis, jobUp: upDis, jobDown: downDis});
                     return {
                         callback: function(){},
                         items: {
-                            "insert": {name: "添加", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
-                                //插入空行
-                                me.addRow(sheet);
+                            "insert": {name: "插入", disabled: insertDis, icon: "context-menu-icon context-menu-icon-add", callback: function (key, opt) {
+                                me.insertContent(sheet, sheet.getActiveRowIndex(), '');
+                            }},
+                            "add": {name: "添加", disabled: addDis, icon: "fa-sign-in", callback: function (key, opt) {
+                                me.insertContent(sheet, me.currentCache.length, '');
                             }},
                             "delete": {name: "删除", disabled: delDis, icon: "fa-remove", callback: function (key, opt) {
                                 me.deleteContent(target.row);
@@ -258,6 +319,7 @@ let contentOprObj = {
                     };
                 }
                 else{
+                    me.refreshTools({jobAdd: addDis, jobInsert: insertDis, jobDel: delDis, jobUp: upDis, jobDown: downDis});
                     return false;
                 }
             }
@@ -293,7 +355,33 @@ let characterOprObj = {
         sheet.bind(EVENTS.EditStarting, me.onEditStart);
         sheet.bind(EVENTS.ClipboardPasting, me.onClipboardPasting);
         sheet.bind(EVENTS.ClipboardPasted, me.onClipboardPasted);
+        sheet.bind(EVENTS.SelectionChanged, me.onSelectionChanged);
         workBook.bind(EVENTS.RangeChanged, me.onRangeChanged);
+        me.bindTools();
+    },
+    bindTools: function () {
+        let me = characterOprObj;
+        let sheet = me.workBook.getActiveSheet();
+        $('#itemAdd').click(function () {
+            me.insertCharacter(sheet, me.currentCache.length, '');
+            me.workBook.focus();
+        });
+        $('#itemInsert').click(function(){
+            me.insertCharacter(sheet, sheet.getActiveRowIndex(), '');
+            me.workBook.focus();
+        });
+        $('#itemDel').click(function(){
+            me.deleteCharacter(sheet.getActiveRowIndex());
+            me.workBook.focus();
+        });
+        $('#itemUp').click(function(){
+            me.upMove({row: sheet.getActiveRowIndex(), col: sheet.getActiveColumnIndex()});
+            me.workBook.focus();
+        });
+        $('#itemDown').click(function(){
+            me.downMove({row: sheet.getActiveRowIndex(), col: sheet.getActiveColumnIndex()});
+            me.workBook.focus();
+        });
     },
     //将从清单库中添加的清单,把标准清单的项目特征转化成清单的项目特征
     buildItemCharactet: function (items) {//从清单库过来的默认不输出
@@ -382,15 +470,14 @@ let characterOprObj = {
         }
         return null;
     },
-    addRow: function (sheet) {
+    addRow: function (idx, sheet) {
         let checkBox = new GC.Spread.Sheets.CellTypes.CheckBox(),
             combo = new GC.Spread.Sheets.CellTypes.ComboBox();
         checkBox.isThreeState = false;
         combo.editable(true);
-        let rowIdx = sheet.getRowCount();
-        sheet.addRows(rowIdx, 1);
-        sheet.getCell(rowIdx, 1).cellType(combo);
-        sheet.getCell(rowIdx, 2).cellType(checkBox);
+        sheet.addRows(idx, 1);
+        sheet.getCell(idx, 1).cellType(combo);
+        sheet.getCell(idx, 2).cellType(checkBox);
     },
     upMove: function (cell) {
         let me = characterOprObj;
@@ -403,6 +490,7 @@ let characterOprObj = {
         contentOprObj.sortCache(me.currentCache);
         me.save(function () {
             me.workBook.getSheet(0).setActiveCell(cell.row - 1, cell.col);
+            me.workBook.focus();
         });
     },
     downMove: function (cell) {
@@ -416,12 +504,14 @@ let characterOprObj = {
         contentOprObj.sortCache(me.currentCache);
         me.save(function () {
             me.workBook.getSheet(0).setActiveCell(cell.row + 1, cell.col);
+            me.workBook.focus();
         });
     },
     deleteCharacter: function (rowIdx) {
         let me = characterOprObj;
         me.currentCache.splice(rowIdx, 1);
         me.save();
+        me.workBook.focus();
     },
     //取消选择的特征值
     unsetSelected: function (item) {
@@ -477,24 +567,16 @@ let characterOprObj = {
                 item.isChecked = true;
             }
         }
+        me.save();
     },
-    insertCharacter: function (character, value) {
+    insertCharacter: function (sheet, idx, character) {
         let me = characterOprObj;
-        let preObj = me.currentCache.length > 0 ?  me.currentCache[me.currentCache.length - 1] : null;
-        if(character && !value){
-            let newCharacter = {character: character, eigenvalue: [], isChecked: false, serialNo: preObj ? preObj.serialNo + 1 : 1};
-            me.currentCache.push(newCharacter);
-        }
-        else if(!character && value){
-            let newValue = {value: value, isSelected: true};
-            let newCharacter = {character: '', eigenvalue: [newValue], isChecked: false, serialNo: preObj? preObj.serialNo + 1 : 1};
-            me.currentCache.push(newCharacter);
-        }
-        else if(character && value){//有了特征值自动打勾输出
-            let newValue = {value: value, isSelected: true};
-            let newCharacter = {character:character , eigenvalue: [newValue], isChecked: true, serialNo: preObj? preObj.serialNo + 1 : 1};
-            me.currentCache.push(newCharacter);
-        }
+        me.addRow(idx, sheet);
+        let newObj = {character: character, eigenvalue: [], isChecked: false};
+        me.currentCache.splice(idx, 0, newObj);
+        pageCCOprObj.resortNo(me.currentCache);
+        me.save();
+        me.workBook.focus();
     },
     save: function (callback) {
         let selectedNode = projectObj.mainController.tree.selected;
@@ -521,7 +603,7 @@ let characterOprObj = {
                     me.updateCharacter(thisCha, null, args.editingText);
                 }
             }
-            //新增
+            /*//新增
             else{
                 if(args.col === 0){//特征
                     me.insertCharacter(args.editingText, null);
@@ -529,9 +611,7 @@ let characterOprObj = {
                 else if(args.col === 1){//特征值
                     me.insertCharacter(null, args.editingText);
                 }
-            }
-            //保存
-            me.save();
+            }*/
         }
         else{//恢复
             if(args.col === 0){
@@ -556,12 +636,11 @@ let characterOprObj = {
             if(me.currentCache.length > rowIdx){
                me.updateCharacter(me.currentCache[rowIdx], items[i].character, items[i].eigenvalue);
             }
-            //新增
+           /* //新增
             else{
                 me.insertCharacter(items[i].character, items[i].eigenvalue);
-            }
+            }*/
         }
-        me.save();
     },
     onRangeChanged: function (sender, args) {
         let me = characterOprObj;
@@ -597,6 +676,40 @@ let characterOprObj = {
             args.sheet.setValue(args.row, args.col, 0);
         }
     },
+    onSelectionChanged: function (sender, args) {
+        let me = characterOprObj;
+        if(args.newSelections && args.newSelections.length > 0){
+            me.initSelection(args.newSelections[0].row);
+        }
+    },
+    initSelection: function (row) {
+        let me = characterOprObj;
+        let disObj = {itemAdd: false, itemInsert: true, itemDel: true, itemUp: true, itemDown: true};
+        if(row !== -1){
+            //在表内
+            if(row < me.currentCache.length){
+                disObj.itemDel = false;
+                disObj.itemInsert = false;
+                if(row !== 0){
+                    disObj.itemUp = false;
+                }
+                if(row !== me.currentCache.length - 1){
+                    disObj.itemDown = false;
+                }
+            }
+        }
+        me.refreshTools(disObj);
+    },
+    //刷新工具条
+    refreshTools: function (disObj) {
+        for(let o in disObj){
+            let jqSel = $(`#${o}`);
+            jqSel.removeClass('disabled');
+            if(disObj[o]){
+                jqSel.addClass('disabled');
+            }
+        }
+    },
     onContextmenuOpr: function () {//右键菜单
         let me = characterOprObj;
         $.contextMenu({
@@ -605,18 +718,20 @@ let characterOprObj = {
                 //控制允许右键菜单在哪个位置出现
                 let target = SheetDataHelper.safeRightClickSelection($triggerElement, e, me.workBook);
                 let sheet = me.workBook.getSheet(0);
+                let addDis = pageCCOprObj.isBillsType() ? false : true, insertDis = false, delDis = false, upDis = false, downDis = false;
                 if(target.hitTestType === 3){//在表格内 && typeof target.row !== 'undefined' && typeof target.col !== 'undefined'
-                    let insertDis = pageCCOprObj.isBillsType() ? false : true, delDis = false, upDis = false, downDis = false;
                     if(typeof target.row !== 'undefined'){
                         //控制按钮是否可用
                         sheet.setActiveCell(target.row, target.col);
                         if(!me.currentCache ||target.row >= me.currentCache.length){//右键定位在有数据的行,删除键才显示可用
+                            insertDis = true;
                             delDis = true;
                             downDis = true;
                             upDis = true;
                         }
                         else{//有数据
                             if(typeof target.col === 'undefined'){//定位在表格外
+                                insertDis = true;
                                 downDis = true;
                                 upDis = true;
                                 delDis = true;
@@ -632,15 +747,20 @@ let characterOprObj = {
                         }
                     }
                     else{
+                        insertDis = true;
                         delDis = true;
                         downDis = true;
                         upDis = true;
                     }
+                    me.refreshTools({itemAdd: addDis, itemInsert: insertDis, itemDel: delDis, itemUp: upDis, itemDown: downDis});
                     return {
                         callback: function(){},
                         items: {
-                            "insert": {name: "添加", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
-                                me.addRow(sheet);
+                            "insert": {name: "插入", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
+                                me.insertCharacter(sheet, sheet.getActiveRowIndex(), '');
+                            }},
+                            "add": {name: "添加", disabled: addDis, icon: "context-menu-icon context-menu-icon-add", callback: function (key, opt) {
+                                me.insertCharacter(sheet, me.currentCache.length, '');
                             }},
                             "delete": {name: "删除", disabled: delDis, icon: "fa-remove", callback: function (key, opt) {
                                 me.deleteCharacter(target.row);
@@ -655,6 +775,7 @@ let characterOprObj = {
                     };
                 }
                 else{
+                    me.refreshTools({jobAdd: addDis, jobInsert: insertDis, jobDel: delDis, jobUp: upDis, jobDown: downDis});
                     return false;
                 }
             }
@@ -666,6 +787,13 @@ let pageCCOprObj = {
     currentFindSet: null,
     mainActiveCell: null,//mainSpread焦点单元格
     nameCache: '',
+    //重新赋serialNo
+    resortNo: function (items) {
+        let count = 1;
+        for(let item of items){
+            item.serialNo = count++;
+        }
+    },
     //获得造价书当前焦点行的类型:清单、定额
     isBillsType: function () {
         let rst = false;
@@ -699,8 +827,10 @@ let pageCCOprObj = {
     //设置特征及内容currentCache
     setCacheAndShow: function (node) {
         let theCont = contentOprObj, theCha = characterOprObj;
-        theCont.currentCache = node && typeof node.data.jobContent !== 'undefined' ? node.data.jobContent : [];
-        theCha.currentCache = node && typeof node.data.itemCharacter !== 'undefined' ? node.data.itemCharacter : [];
+        node.data.jobContent = node && typeof node.data.jobContent !== 'undefined' ? node.data.jobContent : [];
+        node.data.itemCharacter = node && typeof node.data.itemCharacter !== 'undefined' ? node.data.itemCharacter : [];
+        theCont.currentCache =  node.data.jobContent;
+        theCha.currentCache = node.data.itemCharacter;
         this.currentFindSet = node && typeof node.data.ID !== 'undefined' && typeof node.data.projectID ? {ID: node.data.ID, projectID: node.data.projectID} : null;
         this.showData(theCont.workBook.getSheet(0), theCont.setting, theCont.currentCache);
         this.showData(theCha.workBook.getSheet(0), theCha.setting, theCha.currentCache);
@@ -744,6 +874,8 @@ let pageCCOprObj = {
                 sheet.autoFitRow(row);
             }
         }
+        contentOprObj.initSelection(0);
+        characterOprObj.initSelection(0);
         sheet.resumeEvent();
         sheet.resumePaint();
     },
@@ -842,6 +974,9 @@ let pageCCOprObj = {
      * @return {void}
      */
     setCharacterBySetting: function(node, setting, callback = null, oprObj = null) {
+        if(!node){
+            return;
+        }
         let self = this;
         // 保存的条件数据
         const findSet = { ID: node.data.ID, projectID: node.data.projectID };
@@ -941,7 +1076,10 @@ let pageCCOprObj = {
             }
             const itemCharacter = node.data.itemCharacter;
             const itemJob = node.data.jobContent;
-            if (itemCharacter === undefined || itemCharacter.length <= 0 || itemJob === undefined || itemJob.length <= 0) {
+         /*   if (itemCharacter === undefined || itemCharacter.length <= 0 || itemJob === undefined || itemJob.length <= 0) {
+                throw '内部数据错误';
+            }*/
+            if (itemCharacter === undefined || itemJob === undefined) {
                 throw '内部数据错误';
             }
             // 默认名称
@@ -1011,9 +1149,20 @@ let pageCCOprObj = {
         let updateData = {
             itemCharacterText: '',
             jobContentText: '',
-            name: '',
+            name: node.data.name ? node.data.name : '',
         };
-        if (node.data.name === undefined || node.data.itemCharacter.length <= 0 || node.data.jobContent.length <= 0) {
+        /* let updateData = {
+            itemCharacterText: '',
+            jobContentText: '',
+            name: '',
+        };*/
+        if(!node.data.itemCharacter){
+            node.data.itemCharacter = [];
+        }
+        if(!node.data.jobContent){
+            node.data.jobContent = [];
+        }
+        if (node.data.name === undefined || (node.data.itemCharacter.length <= 0 && node.data.jobContent.length <= 0)) {
             return updateData;
         }
         // 获取原名称

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

@@ -483,7 +483,9 @@ var gljOprObj = {
         } else if (args.sheetName == 'quantity_detail') {
             projectObj.project.quantity_detail.isSummationUpdate(args, gljOprObj.detailData, newval);
         } else if (args.sheetName == 'glj_lib') {
-            gljOprObj.setGLJSelection(args, newval);
+            if(gljOprObj.gljLibSheetSetting.header[args.col].dataCode === 'select'){
+                gljOprObj.setGLJSelection(args, newval);
+            }
         }else if(args.sheetName == 'rationInstallSheet'){
             args.newValue = newval;
             installationFeeObj.onRationInstallValueChange(sender,args);

+ 9 - 1
web/building_saas/main/js/views/project_view.js

@@ -40,7 +40,7 @@ var projectObj = {
         //zhong 2017-9-1 特征及内容
         if(pageCCOprObj.active){
             pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];//mainSpread焦点单元格
-            if(node.sourceType === project.Bills.getSourceType()){
+            if(node && node.sourceType === project.Bills.getSourceType()){
                 pageCCOprObj.setCacheAndShow(node);
             }
             else{
@@ -484,6 +484,9 @@ var projectObj = {
         let colSetting = projectObj.mainController.setting.cols[info.col];
         if(colSetting.data.field === 'unit' || (projectObj.lastCol&&projectObj.lastCol.data.field === 'unit')||colSetting.data.field ==='subType'
             || (projectObj.lastCol&&projectObj.lastCol.data.field === 'subType') || colSetting.data.field === 'programID' ||(projectObj.lastCol&&projectObj.lastCol.data.field === 'programID')){
+            /*let hideRowFilter =new GC.Spread.Sheets.Filter.HideRowFilter(info.sheet.getRange(-1, info.col, -1, 1));
+            info.sheet.rowFilter(hideRowFilter);
+            info.sheet.resumePaint();*/
             info.sheet.repaint();
         }
     },
@@ -1881,6 +1884,11 @@ function doAfterImport(resData){
 
 
 $(function () {
+    //清空导入清单选择文件
+    $('#import').on('show.bs.modal', function(){
+        $('#customFile').val('');
+        $('#uploadAlert').hide();
+    });
 
     $("#billsSpread").mouseover(function(){
         spreadAutoFocus(projectObj.mainSpread,subSpread);

+ 4 - 7
web/building_saas/main/js/views/side_tools.js

@@ -59,18 +59,12 @@ var sideToolsObj = {
             $('.main-side .tab-pane').hide();
             tabPanel.show();
             loadSize(sideResizeEles, 'width', function(){
-                refreshSubSpread();
                 if(id === 'stdRationTab'){//定额库
-                    //autoFlashHeight();
                     loadSize(rationLibResizeEles, 'height', function(){
-                        rationLibObj.refreshSpread();;//subSpread、jobSpread、itemSpread显示问题
                     });
                 }
                 else{//清单库
                     loadSize(billsLibResizeEles, 'height', function(){
-                        //autoFlashHeight();
-                        billsLibObj.refreshBillsSpread();
-                        billsLibObj.refreshBillsRelaSpread();
                     });
                 }
             });
@@ -79,9 +73,12 @@ var sideToolsObj = {
             sideResizeEles.nearElement.css('width', '100%');
             sideResizeEles.farElement.css('width', '0%');
             tabPanel.hide();
-            refreshSubSpread();
         }
         autoFlashHeight();
+        billsLibObj.refreshBillsSpread();
+        refreshSubSpread();
+        billsLibObj.refreshBillsRelaSpread();
+        rationLibObj.refreshSpread();;//subSpread、jobSpread、itemSpread显示问题
     }
 };
 

+ 8 - 1
web/building_saas/main/js/views/sub_view.js

@@ -132,8 +132,15 @@ $("#use-to-current").click(function() {
     const self = $(this);
     self.attr('disabled', 'disabled');
     let selectedNode = projectObj.mainController.tree.selected;
+    function findBill(node){
+        while(node && node.sourceType !== projectObj.project.Bills.getSourceType()){
+            node = node.parent;
+        }
+        return node;
+    }
+    let billsNode = findBill(selectedNode);
     // 操作内容
-    pageCCOprObj.setCharacterBySetting(selectedNode, setting);
+    pageCCOprObj.setCharacterBySetting(billsNode, setting);
 
     // 防止连续点击1秒后才能再次发起请求
     setTimeout(function() {

+ 2 - 2
web/building_saas/pm/js/pm_gc.js

@@ -21,7 +21,7 @@ const gcTreeObj = {
             {name: '删除日期', dataCode: 'deleteDateTime', width: 170, vAlign: 'center', hAlign: 'left'},
             {name: '创建日期', dataCode: 'createDateTime', width: 170, vAlign: 'center', hAlign: 'left'},
             {name: '恢复', dataCode: 'recovery', width: 100, vAlign: 'center', hAlign: 'left'},
-            {name: '除', dataCode: 'delete', width: 100, vAlign: 'center', hAlign: 'left'},
+            {name: '彻底删除', dataCode: 'delete', width: 100, vAlign: 'center', hAlign: 'left'},
             {name: '单价文件', dataCode: 'unitPriceFile', width: 100, vAlign: 'center', hAlign: 'left'},
             {name: '单价文件-清除', dataCode: 'unitPriceFile_delete', width: 100, vAlign: 'center', hAlign: 'left'},
             {name: '费率文件', dataCode: 'feeRateFile', width: 100, vAlign: 'center', hAlign: 'left'},
@@ -633,7 +633,7 @@ function v_getMoBody(type, oprNode, nodes){
         html += ('<p>点“确定”按钮,确认从回收站中恢复</p>');
     }
     else{
-        html += ('<p>点“确定”按钮,确认除数据</p>');
+        html += ('<p>点“确定”按钮,确认彻底删除数据</p>');
     }
     return html;
 }

+ 48 - 8
web/building_saas/pm/js/pm_newMain.js

@@ -870,6 +870,9 @@ $(document).ready(function() {
     $('#add-project-btn').click(function () {
         let selectedItem = projTreeObj.tree.selected;
         $('#add-project-dialog').modal('show');
+        setTimeout(function () {
+            $('#project-name')[0].focus();
+        }, 300);
     });
 
     // 新增建设项目操作
@@ -906,6 +909,9 @@ $(document).ready(function() {
         try {
             if(selectedItem !== null  && selectedItem.data.projType !== projectType.folder){
                 $("#add-engineering-dialog").modal("show");
+                setTimeout(function () {
+                    $('#engineering-name')[0].focus();
+                }, 300);
             }
 
         } catch (error) {
@@ -1007,6 +1013,9 @@ $(document).ready(function() {
         let projs = getProjs(selected);
         setProjOptions(projs, selected);
         $($("input[name='valuation_type']")[0]).click();
+        setTimeout(function () {
+            $('#tender-name')[0].focus();
+        }, 300);
     });
 
     // 新增单位工程
@@ -1017,6 +1026,9 @@ $(document).ready(function() {
     // 新增文件夹按钮点击
     $("#add-folder-btn").click(function() {
         $("#add-folder-dialog").modal("show");
+        setTimeout(function () {
+            $('#folder-name')[0].focus();
+        }, 300);
     });
 
     // 新增文件夹操作
@@ -1101,6 +1113,9 @@ $(document).ready(function() {
         }
         $('#rename-name').val(projTreeObj.tree.selected.data.name ? projTreeObj.tree.selected.data.name : '');
         $('#rename-dialog').modal('show');
+        setTimeout(function () {
+            $('#rename-name')[0].focus();
+        }, 300);
     });
 
     // 重命名操作
@@ -1343,7 +1358,7 @@ function getChangedFunc(input, nameInfo){
             nameInfo.show();
         }
         else {
-            nameInfo.text('');
+            nameInfo.text('');N
             nameInfo.hide();
         }
     }
@@ -1829,11 +1844,8 @@ function AddTender() {
             return false;
         }
 
-        let unitPriceFile = $("#unit-price").val();
-        let unitPriceName = unitPriceFile !== '' ? $("#unit-price").children("option:selected").text() : tenderName;
-
-        let feeFile = $("#tender-fee-rate").val();
-        let feeFileName = $("#tender-fee-rate").children("option:selected").text();
+        let unitPriceFileObj = getAddTenderFile(tenderName, $('#unit-price'), $("#unit-price").children());
+        let feeFileObj = getAddTenderFile(tenderName, $('#tender-fee-rate'), $("#tender-fee-rate").children());
 
         let valuation = $("#valuation").val();
         if(valuation === ''){
@@ -1892,8 +1904,8 @@ function AddTender() {
             engineering: engineering,
             engineering_id: engineering_id,
             engineeringName: engineeringName,
-            unitPriceFile: {name: unitPriceName, id: unitPriceFile},
-            feeFile: {name: feeFileName, id: feeFile}
+            unitPriceFile: {name: unitPriceFileObj.name, id: unitPriceFileObj.id},
+            feeFile: {name: feeFileObj.name, id: feeFileObj.id}
         };
         AddTenderItems(selectedItem, projName, engName, tenderName, tenderInfo, callback);
 
@@ -1901,6 +1913,34 @@ function AddTender() {
         alert(error);
     }
 }
+/*
+* 新增单位工程时选择的文件
+* @tenderName {String}
+* @selValue {String}
+* @options {Array}
+* */
+function getAddTenderFile(tenderName, selected, options){
+    let rst = {name: '', id: ''};
+    let selValue = selected.val();
+    //选择的是新建单价/费率文件
+    if(selValue === ''){
+        //若新建的单位工程名称与建设项目下文件重名,则引用该文件
+        for(let option of options){
+            if($(option).text() === tenderName){
+                rst.id = $(option).val();
+                break;
+            }
+        }
+        rst.name = tenderName;
+    }
+    //非新建
+    else{
+        rst.id = selected.val();
+        rst.name =  selected.text();
+    }
+    return rst;
+}
+
 
 /**
  * 新增文件夹